@rebasepro/app 0.0.1-canary.4829d6e
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 +21 -0
- package/README.md +174 -0
- package/dist/auth/api.d.ts +66 -0
- package/dist/auth/index.d.ts +13 -0
- package/dist/auth/types.d.ts +127 -0
- package/dist/auth/useRebaseAuthController.d.ts +13 -0
- package/dist/components/AIIcon.d.ts +17 -0
- package/dist/components/AuthSimulationMenu.d.ts +0 -0
- package/dist/components/ConfirmationDialog.d.ts +9 -0
- package/dist/components/Debug/UIReferenceView.d.ts +13 -0
- package/dist/components/Debug/UIStyleGuide.d.ts +2 -0
- package/dist/components/Debug/collection-views/CardViewDemo.d.ts +2 -0
- package/dist/components/Debug/collection-views/CollectionTableDemo.d.ts +2 -0
- package/dist/components/Debug/collection-views/KanbanBoardDemo.d.ts +2 -0
- package/dist/components/Debug/collection-views/index.d.ts +3 -0
- package/dist/components/Debug/collection-views/sample_data.d.ts +23 -0
- package/dist/components/Debug/crm-dashboard/CalendarWidget.d.ts +22 -0
- package/dist/components/Debug/crm-dashboard/CrmDashboardDemo.d.ts +2 -0
- package/dist/components/Debug/crm-dashboard/DashboardMetrics.d.ts +15 -0
- package/dist/components/Debug/crm-dashboard/PipelineOverview.d.ts +34 -0
- package/dist/components/Debug/crm-dashboard/RecentActivity.d.ts +19 -0
- package/dist/components/Debug/crm-dashboard/TaskFilters.d.ts +30 -0
- package/dist/components/Debug/crm-dashboard/TaskTable.d.ts +50 -0
- package/dist/components/Debug/crm-dashboard/TasksView.d.ts +41 -0
- package/dist/components/ErrorTooltip.d.ts +3 -0
- package/dist/components/ErrorView.d.ts +21 -0
- package/dist/components/LanguageToggle.d.ts +2 -0
- package/dist/components/LoginView/LoginView.d.ts +113 -0
- package/dist/components/LoginView/index.d.ts +2 -0
- package/dist/components/NotFoundPage.d.ts +2 -0
- package/dist/components/RebaseAuth.d.ts +10 -0
- package/dist/components/RebaseLogo.d.ts +7 -0
- package/dist/components/SchemaDriftBanner.d.ts +27 -0
- package/dist/components/UnsavedChangesDialog.d.ts +9 -0
- package/dist/components/UserDisplay.d.ts +7 -0
- package/dist/components/UserSelectPopover.d.ts +63 -0
- package/dist/components/UserSettingsView.d.ts +2 -0
- package/dist/components/common/index.d.ts +6 -0
- package/dist/components/common/table_height.d.ts +5 -0
- package/dist/components/common/types.d.ts +66 -0
- package/dist/components/common/useColumnsIds.d.ts +9 -0
- package/dist/components/common/useDataTableController.d.ts +45 -0
- package/dist/components/common/useDebouncedData.d.ts +9 -0
- package/dist/components/common/useScrollRestoration.d.ts +14 -0
- package/dist/components/index.d.ts +18 -0
- package/dist/contexts/AdminModeController.d.ts +4 -0
- package/dist/contexts/AnalyticsContext.d.ts +3 -0
- package/dist/contexts/AuthControllerContext.d.ts +3 -0
- package/dist/contexts/CollectionScopeContext.d.ts +50 -0
- package/dist/contexts/ComponentOverrideContext.d.ts +42 -0
- package/dist/contexts/CustomizationControllerContext.d.ts +3 -0
- package/dist/contexts/DataDriverContext.d.ts +3 -0
- package/dist/contexts/DataSourcesContext.d.ts +31 -0
- package/dist/contexts/DatabaseAdminContext.d.ts +3 -0
- package/dist/contexts/DialogsProvider.d.ts +4 -0
- package/dist/contexts/EffectiveRoleController.d.ts +4 -0
- package/dist/contexts/ModeController.d.ts +4 -0
- package/dist/contexts/RebaseClientInstanceContext.d.ts +6 -0
- package/dist/contexts/RebaseDataContext.d.ts +3 -0
- package/dist/contexts/SnackbarProvider.d.ts +2 -0
- package/dist/contexts/StorageSourceContext.d.ts +3 -0
- package/dist/contexts/StorageSourcesContext.d.ts +25 -0
- package/dist/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
- package/dist/contexts/index.d.ts +17 -0
- package/dist/core/PluginLifecycleManager.d.ts +17 -0
- package/dist/core/PluginProviderStack.d.ts +21 -0
- package/dist/core/Rebase.d.ts +15 -0
- package/dist/core/RebaseProps.d.ts +291 -0
- package/dist/core/RebaseRouter.d.ts +4 -0
- package/dist/core/RebaseRoutes.d.ts +17 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/hooks/ApiConfigContext.d.ts +24 -0
- package/dist/hooks/data/delete.d.ts +33 -0
- package/dist/hooks/data/save.d.ts +40 -0
- package/dist/hooks/data/useCollection.d.ts +62 -0
- package/dist/hooks/data/useData.d.ts +13 -0
- package/dist/hooks/data/useDataOrder.d.ts +12 -0
- package/dist/hooks/data/useFetch.d.ts +43 -0
- package/dist/hooks/data/useRelationSelector.d.ts +52 -0
- package/dist/hooks/index.d.ts +36 -0
- package/dist/hooks/useAdminModeController.d.ts +19 -0
- package/dist/hooks/useAnalyticsController.d.ts +5 -0
- package/dist/hooks/useAuthController.d.ts +11 -0
- package/dist/hooks/useAuthSubscription.d.ts +2 -0
- package/dist/hooks/useBackendStorageSource.d.ts +30 -0
- package/dist/hooks/useBridgeRegistration.d.ts +18 -0
- package/dist/hooks/useBrowserTitleAndIcon.d.ts +6 -0
- package/dist/hooks/useBuildAdminModeController.d.ts +6 -0
- package/dist/hooks/useBuildEffectiveRoleController.d.ts +8 -0
- package/dist/hooks/useBuildLocalConfigurationPersistence.d.ts +2 -0
- package/dist/hooks/useBuildModeController.d.ts +6 -0
- package/dist/hooks/useClipboard.d.ts +57 -0
- package/dist/hooks/useCollapsedGroups.d.ts +27 -0
- package/dist/hooks/useComponentOverride.d.ts +32 -0
- package/dist/hooks/useCustomizationController.d.ts +11 -0
- package/dist/hooks/useDialogsController.d.ts +11 -0
- package/dist/hooks/useEffectiveRoleController.d.ts +7 -0
- package/dist/hooks/useLargeLayout.d.ts +1 -0
- package/dist/hooks/useModeController.d.ts +19 -0
- package/dist/hooks/usePermissions.d.ts +12 -0
- package/dist/hooks/useRebaseClient.d.ts +5 -0
- package/dist/hooks/useRebaseContext.d.ts +11 -0
- package/dist/hooks/useRebaseRegistry.d.ts +34 -0
- package/dist/hooks/useResolvedComponent.d.ts +47 -0
- package/dist/hooks/useSlot.d.ts +18 -0
- package/dist/hooks/useSnackbarController.d.ts +20 -0
- package/dist/hooks/useStorageSource.d.ts +6 -0
- package/dist/hooks/useStudioBridge.d.ts +79 -0
- package/dist/hooks/useTranslation.d.ts +17 -0
- package/dist/hooks/useUnsavedChangesDialog.d.ts +12 -0
- package/dist/hooks/useUserConfigurationPersistence.d.ts +8 -0
- package/dist/i18n/RebaseI18nProvider.d.ts +33 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.es.js +16843 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +17021 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/internal/common.d.ts +14 -0
- package/dist/internal/useRestoreScroll.d.ts +15 -0
- package/dist/locales/de.d.ts +2 -0
- package/dist/locales/en.d.ts +10 -0
- package/dist/locales/es.d.ts +10 -0
- package/dist/locales/fr.d.ts +2 -0
- package/dist/locales/hi.d.ts +2 -0
- package/dist/locales/it.d.ts +2 -0
- package/dist/locales/pt.d.ts +7 -0
- package/dist/util/constants.d.ts +1 -0
- package/dist/util/createFormexStub.d.ts +2 -0
- package/dist/util/entity_cache.d.ts +22 -0
- package/dist/util/enums.d.ts +5 -0
- package/dist/util/icon_list.d.ts +5 -0
- package/dist/util/icons.d.ts +20 -0
- package/dist/util/index.d.ts +8 -0
- package/dist/util/previews.d.ts +4 -0
- package/dist/util/useStorageUploadController.d.ts +44 -0
- package/dist/vitePlugin.d.ts +60 -0
- package/dist/vitePlugin.js +113 -0
- package/package.json +145 -0
- package/src/auth/api.ts +148 -0
- package/src/auth/index.ts +25 -0
- package/src/auth/types.ts +115 -0
- package/src/auth/useRebaseAuthController.ts +328 -0
- package/src/components/AIIcon.tsx +47 -0
- package/src/components/AuthSimulationMenu.tsx +0 -0
- package/src/components/ConfirmationDialog.tsx +48 -0
- package/src/components/Debug/UIReferenceView.tsx +958 -0
- package/src/components/Debug/UIStyleGuide.tsx +156 -0
- package/src/components/Debug/collection-views/CardViewDemo.tsx +85 -0
- package/src/components/Debug/collection-views/CollectionTableDemo.tsx +107 -0
- package/src/components/Debug/collection-views/KanbanBoardDemo.tsx +90 -0
- package/src/components/Debug/collection-views/index.ts +3 -0
- package/src/components/Debug/collection-views/sample_data.ts +42 -0
- package/src/components/Debug/crm-dashboard/CalendarWidget.tsx +389 -0
- package/src/components/Debug/crm-dashboard/CrmDashboardDemo.tsx +1102 -0
- package/src/components/Debug/crm-dashboard/DashboardMetrics.tsx +133 -0
- package/src/components/Debug/crm-dashboard/PipelineOverview.tsx +290 -0
- package/src/components/Debug/crm-dashboard/RecentActivity.tsx +215 -0
- package/src/components/Debug/crm-dashboard/TaskFilters.tsx +184 -0
- package/src/components/Debug/crm-dashboard/TaskTable.tsx +427 -0
- package/src/components/Debug/crm-dashboard/TasksView.tsx +234 -0
- package/src/components/ErrorTooltip.tsx +12 -0
- package/src/components/ErrorView.tsx +94 -0
- package/src/components/LanguageToggle.tsx +59 -0
- package/src/components/LoginView/LoginView.tsx +932 -0
- package/src/components/LoginView/index.ts +2 -0
- package/src/components/NotFoundPage.tsx +27 -0
- package/src/components/RebaseAuth.tsx +27 -0
- package/src/components/RebaseLogo.tsx +29 -0
- package/src/components/SchemaDriftBanner.tsx +102 -0
- package/src/components/UnsavedChangesDialog.tsx +46 -0
- package/src/components/UserDisplay.tsx +54 -0
- package/src/components/UserSelectPopover.tsx +399 -0
- package/src/components/UserSettingsView.tsx +318 -0
- package/src/components/common/index.ts +6 -0
- package/src/components/common/table_height.tsx +21 -0
- package/src/components/common/types.tsx +66 -0
- package/src/components/common/useColumnsIds.tsx +222 -0
- package/src/components/common/useDataTableController.tsx +514 -0
- package/src/components/common/useDebouncedData.ts +49 -0
- package/src/components/common/useScrollRestoration.tsx +68 -0
- package/src/components/index.tsx +26 -0
- package/src/contexts/AdminModeController.tsx +11 -0
- package/src/contexts/AnalyticsContext.tsx +4 -0
- package/src/contexts/AuthControllerContext.tsx +4 -0
- package/src/contexts/CollectionScopeContext.tsx +67 -0
- package/src/contexts/ComponentOverrideContext.tsx +81 -0
- package/src/contexts/CustomizationControllerContext.tsx +4 -0
- package/src/contexts/DataDriverContext.tsx +4 -0
- package/src/contexts/DataSourcesContext.tsx +36 -0
- package/src/contexts/DatabaseAdminContext.tsx +4 -0
- package/src/contexts/DialogsProvider.tsx +56 -0
- package/src/contexts/EffectiveRoleController.tsx +12 -0
- package/src/contexts/ModeController.tsx +11 -0
- package/src/contexts/RebaseClientInstanceContext.tsx +7 -0
- package/src/contexts/RebaseDataContext.tsx +4 -0
- package/src/contexts/SnackbarProvider.tsx +15 -0
- package/src/contexts/StorageSourceContext.tsx +4 -0
- package/src/contexts/StorageSourcesContext.tsx +30 -0
- package/src/contexts/UserConfigurationPersistenceContext.tsx +4 -0
- package/src/contexts/index.ts +17 -0
- package/src/core/PluginLifecycleManager.tsx +95 -0
- package/src/core/PluginProviderStack.tsx +40 -0
- package/src/core/Rebase.tsx +439 -0
- package/src/core/RebaseProps.tsx +320 -0
- package/src/core/RebaseRouter.tsx +17 -0
- package/src/core/RebaseRoutes.tsx +24 -0
- package/src/core/index.tsx +5 -0
- package/src/hooks/ApiConfigContext.tsx +41 -0
- package/src/hooks/data/delete.ts +55 -0
- package/src/hooks/data/save.ts +77 -0
- package/src/hooks/data/useCollection.tsx +176 -0
- package/src/hooks/data/useData.tsx +18 -0
- package/src/hooks/data/useDataOrder.ts +26 -0
- package/src/hooks/data/useFetch.tsx +140 -0
- package/src/hooks/data/useRelationSelector.tsx +234 -0
- package/src/hooks/index.tsx +45 -0
- package/src/hooks/useAdminModeController.tsx +23 -0
- package/src/hooks/useAnalyticsController.tsx +8 -0
- package/src/hooks/useAuthController.tsx +14 -0
- package/src/hooks/useAuthSubscription.ts +87 -0
- package/src/hooks/useBackendStorageSource.ts +288 -0
- package/src/hooks/useBridgeRegistration.tsx +32 -0
- package/src/hooks/useBrowserTitleAndIcon.tsx +23 -0
- package/src/hooks/useBuildAdminModeController.tsx +24 -0
- package/src/hooks/useBuildEffectiveRoleController.tsx +31 -0
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +75 -0
- package/src/hooks/useBuildModeController.tsx +71 -0
- package/src/hooks/useClipboard.tsx +158 -0
- package/src/hooks/useCollapsedGroups.ts +116 -0
- package/src/hooks/useComponentOverride.tsx +59 -0
- package/src/hooks/useCustomizationController.tsx +14 -0
- package/src/hooks/useDialogsController.tsx +15 -0
- package/src/hooks/useEffectiveRoleController.tsx +10 -0
- package/src/hooks/useLargeLayout.tsx +65 -0
- package/src/hooks/useModeController.tsx +23 -0
- package/src/hooks/usePermissions.ts +44 -0
- package/src/hooks/useRebaseClient.tsx +10 -0
- package/src/hooks/useRebaseContext.tsx +83 -0
- package/src/hooks/useRebaseRegistry.tsx +91 -0
- package/src/hooks/useResolvedComponent.tsx +159 -0
- package/src/hooks/useSlot.tsx +64 -0
- package/src/hooks/useSnackbarController.tsx +52 -0
- package/src/hooks/useStorageSource.tsx +11 -0
- package/src/hooks/useStudioBridge.tsx +209 -0
- package/src/hooks/useTranslation.ts +33 -0
- package/src/hooks/useUnsavedChangesDialog.tsx +64 -0
- package/src/hooks/useUserConfigurationPersistence.tsx +11 -0
- package/src/i18n/RebaseI18nProvider.tsx +160 -0
- package/src/index.ts +25 -0
- package/src/internal/common.tsx +16 -0
- package/src/internal/useRestoreScroll.tsx +69 -0
- package/src/locales/de.ts +902 -0
- package/src/locales/en.ts +980 -0
- package/src/locales/es.ts +922 -0
- package/src/locales/fr.ts +901 -0
- package/src/locales/hi.ts +901 -0
- package/src/locales/it.ts +901 -0
- package/src/locales/pt.ts +909 -0
- package/src/util/constants.ts +7 -0
- package/src/util/createFormexStub.tsx +66 -0
- package/src/util/entity_cache.ts +239 -0
- package/src/util/enums.ts +32 -0
- package/src/util/icon_list.ts +22 -0
- package/src/util/icons.tsx +149 -0
- package/src/util/index.ts +12 -0
- package/src/util/previews.ts +105 -0
- package/src/util/useStorageUploadController.tsx +350 -0
- package/src/vitePlugin.ts +196 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.es.js","names":[],"sources":["../src/core/PluginProviderStack.tsx","../src/core/PluginLifecycleManager.tsx","../src/contexts/SnackbarProvider.tsx","../src/contexts/ModeController.tsx","../src/contexts/AdminModeController.tsx","../src/contexts/EffectiveRoleController.tsx","../src/contexts/AuthControllerContext.tsx","../src/contexts/DataDriverContext.tsx","../src/contexts/DataSourcesContext.tsx","../src/contexts/RebaseDataContext.tsx","../src/contexts/AnalyticsContext.tsx","../src/contexts/StorageSourceContext.tsx","../src/contexts/StorageSourcesContext.tsx","../src/contexts/UserConfigurationPersistenceContext.tsx","../src/contexts/DialogsProvider.tsx","../src/contexts/RebaseClientInstanceContext.tsx","../src/contexts/CustomizationControllerContext.tsx","../src/contexts/ComponentOverrideContext.tsx","../src/contexts/CollectionScopeContext.tsx","../src/hooks/data/useData.tsx","../src/components/SchemaDriftBanner.tsx","../src/hooks/data/useCollection.tsx","../src/hooks/useAuthController.tsx","../src/hooks/useRebaseClient.tsx","../src/hooks/useStorageSource.tsx","../src/hooks/useSnackbarController.tsx","../src/hooks/useUserConfigurationPersistence.tsx","../src/hooks/useDialogsController.tsx","../src/hooks/useCustomizationController.tsx","../src/hooks/useAnalyticsController.tsx","../src/hooks/useEffectiveRoleController.tsx","../src/contexts/DatabaseAdminContext.tsx","../src/hooks/useRebaseContext.tsx","../src/hooks/data/useFetch.tsx","../src/hooks/data/useRelationSelector.tsx","../src/hooks/data/save.ts","../src/hooks/data/delete.ts","../src/hooks/useUnsavedChangesDialog.tsx","../src/hooks/useAuthSubscription.ts","../src/hooks/useAdminModeController.tsx","../src/hooks/useBuildAdminModeController.tsx","../src/hooks/useBuildEffectiveRoleController.tsx","../src/hooks/useModeController.tsx","../src/hooks/useClipboard.tsx","../src/hooks/useLargeLayout.tsx","../src/hooks/useCollapsedGroups.ts","../src/hooks/useBrowserTitleAndIcon.tsx","../src/hooks/useSlot.tsx","../src/hooks/useBuildLocalConfigurationPersistence.tsx","../src/hooks/useBuildModeController.tsx","../src/hooks/useRebaseRegistry.tsx","../src/hooks/useBackendStorageSource.ts","../src/hooks/usePermissions.ts","../src/hooks/ApiConfigContext.tsx","../src/hooks/useTranslation.ts","../src/hooks/useResolvedComponent.tsx","../src/hooks/useComponentOverride.tsx","../src/components/ErrorTooltip.tsx","../src/components/ErrorView.tsx","../src/components/common/useDebouncedData.ts","../src/components/common/useColumnsIds.tsx","../src/hooks/data/useDataOrder.ts","../src/components/common/useDataTableController.tsx","../src/components/common/useScrollRestoration.tsx","../src/components/common/table_height.tsx","../src/components/NotFoundPage.tsx","../src/components/ConfirmationDialog.tsx","../src/components/RebaseLogo.tsx","../src/components/AIIcon.tsx","../src/components/Debug/UIStyleGuide.tsx","../src/components/Debug/crm-dashboard/DashboardMetrics.tsx","../src/components/Debug/crm-dashboard/PipelineOverview.tsx","../src/components/Debug/crm-dashboard/RecentActivity.tsx","../src/components/Debug/crm-dashboard/TaskFilters.tsx","../src/components/Debug/crm-dashboard/TaskTable.tsx","../src/components/Debug/crm-dashboard/TasksView.tsx","../src/components/Debug/crm-dashboard/CalendarWidget.tsx","../src/components/Debug/crm-dashboard/CrmDashboardDemo.tsx","../src/components/Debug/collection-views/sample_data.ts","../src/components/Debug/collection-views/CollectionTableDemo.tsx","../src/components/Debug/collection-views/CardViewDemo.tsx","../src/components/Debug/collection-views/KanbanBoardDemo.tsx","../src/components/Debug/UIReferenceView.tsx","../src/components/UserSettingsView.tsx","../src/components/LanguageToggle.tsx","../src/components/UserSelectPopover.tsx","../src/components/UserDisplay.tsx","../src/components/LoginView/LoginView.tsx","../src/components/RebaseAuth.tsx","../src/locales/en.ts","../src/locales/es.ts","../src/locales/de.ts","../src/locales/fr.ts","../src/locales/it.ts","../src/locales/hi.ts","../src/locales/pt.ts","../src/i18n/RebaseI18nProvider.tsx","../src/core/Rebase.tsx","../src/core/RebaseRouter.tsx","../src/core/RebaseRoutes.tsx","../src/auth/useRebaseAuthController.ts","../src/auth/api.ts","../src/util/icon_list.ts","../src/util/icons.tsx","../src/util/createFormexStub.tsx","../src/util/entity_cache.ts","../src/util/useStorageUploadController.tsx","../src/util/previews.ts","../src/util/enums.ts","../src/util/constants.ts","../src/internal/common.tsx","../src/internal/useRestoreScroll.tsx","../src/components/UnsavedChangesDialog.tsx","../src/hooks/useStudioBridge.tsx","../src/hooks/useBridgeRegistration.tsx"],"sourcesContent":["import type { RebasePlugin } from \"@rebasepro/types\";\nimport React from \"react\";\n;\n\n/**\n * Wraps children with all provider components from plugins that match the given scope.\n *\n * Replaces the 3 copy-pasted `plugins.forEach(plugin => { if (plugin.form?.provider) ... })` patterns\n * in Rebase.tsx, EditViewBinding.tsx, and PopupFormField.tsx.\n *\n * @param plugins - Array of plugins to extract providers from.\n * @param scope - `\"root\"` or `\"form\"` — which providers to apply.\n * @param scopeProps - Additional props passed to each provider component.\n * @param children - The content to wrap.\n *\n * @group Core\n */\nexport function PluginProviderStack({\n plugins,\n scope,\n scopeProps,\n children\n}: {\n plugins: RebasePlugin[];\n scope: \"root\" | \"form\";\n scopeProps?: Record<string, unknown>;\n children: React.ReactNode;\n}) {\n const providers = plugins.flatMap(p => p.providers ?? [])\n .filter(p => p.scope === scope);\n\n return providers.reduceRight<React.ReactNode>(\n (acc, provider) => (\n <provider.Component {...provider.props} {...scopeProps}>\n {acc}\n </provider.Component>\n ),\n children\n );\n}\n","\nimport { useEffect, useRef } from \"react\";\nimport type { RebasePlugin, RebaseContext, User } from \"@rebasepro/types\";\n\n/**\n * Render-less component that manages plugin lifecycle hooks.\n *\n * - Calls `lifecycle.onMount(context)` when plugins mount.\n * - Calls `lifecycle.onUnmount()` when plugins unmount.\n * - Subscribes to auth state changes and calls `lifecycle.onAuthStateChange`.\n *\n * Mount this component inside the Rebase tree, below PluginProviderStack,\n * so that the RebaseContext is fully available.\n *\n * @internal\n */\nexport function PluginLifecycleManager({\n plugins,\n context\n}: {\n plugins: RebasePlugin[];\n context: RebaseContext;\n}) {\n const mountedRef = useRef(false);\n const prevUserRef = useRef<User | null | undefined>(undefined);\n\n // ── Mount / Unmount lifecycle ────────────────────────────────────\n useEffect(() => {\n // Prevent double-fire in StrictMode\n if (mountedRef.current) return;\n mountedRef.current = true;\n\n for (const plugin of plugins) {\n if (plugin.lifecycle?.onMount) {\n try {\n const result = plugin.lifecycle.onMount(context);\n if (result instanceof Promise) {\n result.catch((err) =>\n console.error(`[Rebase] Plugin \"${plugin.key}\" onMount error:`, err)\n );\n }\n } catch (err) {\n console.error(`[Rebase] Plugin \"${plugin.key}\" onMount error:`, err);\n }\n }\n }\n\n return () => {\n mountedRef.current = false;\n for (const plugin of plugins) {\n if (plugin.lifecycle?.onUnmount) {\n try {\n plugin.lifecycle.onUnmount();\n } catch (err) {\n console.error(`[Rebase] Plugin \"${plugin.key}\" onUnmount error:`, err);\n }\n }\n }\n };\n // Only run on mount/unmount — plugins array identity should be stable\n }, []);\n\n // ── Auth state change lifecycle ──────────────────────────────────\n const currentUser = context.authController?.user ?? null;\n\n useEffect(() => {\n // Skip the initial call — onMount handles that\n if (prevUserRef.current === undefined) {\n prevUserRef.current = currentUser;\n return;\n }\n\n // Only fire when the user identity actually changes\n const prevUid = prevUserRef.current?.uid;\n const currUid = currentUser?.uid;\n if (prevUid === currUid) return;\n\n prevUserRef.current = currentUser;\n\n for (const plugin of plugins) {\n if (plugin.lifecycle?.onAuthStateChange) {\n try {\n plugin.lifecycle.onAuthStateChange(currentUser);\n } catch (err) {\n console.error(\n `[Rebase] Plugin \"${plugin.key}\" onAuthStateChange error:`,\n err\n );\n }\n }\n }\n }, [currentUser, plugins]);\n\n return null;\n}\n","\"use client\";\n\nimport React, { PropsWithChildren } from \"react\";\nimport { SnackbarProvider as NotistackSnackbarProvider } from \"notistack\";\n\nexport const SnackbarProvider: React.FC<PropsWithChildren> = ({ children }) => {\n\n return (\n <NotistackSnackbarProvider maxSnack={3}\n preventDuplicate={true}\n autoHideDuration={3500}>\n {children}\n </NotistackSnackbarProvider>\n );\n};\n","import React from \"react\";\nimport { ModeController } from \"../hooks\";\n\nconst DEFAULT_MODE_STATE: ModeController = {\n mode: \"light\",\n setMode: (mode: \"light\" | \"dark\" | \"system\") => {\n }\n};\nexport const ModeControllerContext = React.createContext<ModeController>(DEFAULT_MODE_STATE);\n\nexport const ModeControllerProvider = ModeControllerContext.Provider;\n","import React from \"react\";\nimport { AdminModeController } from \"../hooks\";\n\nconst DEFAULT_ADMIN_MODE_STATE: AdminModeController = {\n mode: \"content\",\n setMode: (mode: \"content\" | \"studio\" | \"settings\") => {\n }\n};\nexport const AdminModeControllerContext = React.createContext<AdminModeController>(DEFAULT_ADMIN_MODE_STATE);\n\nexport const AdminModeControllerProvider = AdminModeControllerContext.Provider;\n","import type { EffectiveRoleController } from \"@rebasepro/types\";\nimport React from \"react\";\n;\n\nconst DEFAULT_EFFECTIVE_ROLE_STATE: EffectiveRoleController = {\n effectiveRole: null,\n setEffectiveRole: (_role: string | null) => {\n }\n};\nexport const EffectiveRoleControllerContext = React.createContext<EffectiveRoleController>(DEFAULT_EFFECTIVE_ROLE_STATE);\n\nexport const EffectiveRoleControllerProvider = EffectiveRoleControllerContext.Provider;\n","import React from \"react\";\nimport { AuthController } from \"@rebasepro/types\";\n\nexport const AuthControllerContext = React.createContext<AuthController<any, any>>({} as AuthController<any, any>);\n","import React from \"react\";\nimport { DataDriver } from \"@rebasepro/types\";\n\nexport const DataDriverContext = React.createContext<DataDriver>({} as DataDriver);\n","import React from \"react\";\nimport { DataSourceDefinition, RebaseData } from \"@rebasepro/types\";\n\n/**\n * The data-source configuration provided to `<Rebase>`: the declared\n * definitions plus the built {@link RebaseData} instances for direct/custom\n * transports.\n *\n * The actual path-based routing is assembled by the navigation layer (which\n * has the collection registry) via `resolveDataSource` + `buildRoutedRebaseData`\n * and re-provided through `RebaseDataContext`.\n *\n * @internal\n */\nexport interface DataSourcesContextValue {\n /** All declared data sources, keyed by data-source key. */\n registry: Record<string, DataSourceDefinition>;\n /**\n * Built {@link RebaseData} for direct/custom data sources, keyed by\n * data-source key. Server-mediated sources are absent (they ride the\n * default client).\n */\n sources: Record<string, RebaseData>;\n}\n\nconst EMPTY: DataSourcesContextValue = { registry: {}, sources: {} };\n\n/** @internal */\nexport const DataSourcesContext = React.createContext<DataSourcesContextValue>(EMPTY);\n\n/**\n * Access the data-source configuration provided to `<Rebase>` via the\n * `dataSources` prop.\n * @internal\n */\nexport const useDataSources = (): DataSourcesContextValue => React.useContext(DataSourcesContext);\n","import React from \"react\";\nimport { RebaseData } from \"@rebasepro/types\";\n\nexport const RebaseDataContext = React.createContext<RebaseData>({} as RebaseData);\n","import React from \"react\";\nimport { AnalyticsController } from \"@rebasepro/types\";\n\nexport const AnalyticsContext = React.createContext<AnalyticsController>({} as AnalyticsController);\n","import React from \"react\";\nimport { StorageSource } from \"@rebasepro/types\";\n\nexport const StorageSourceContext = React.createContext<StorageSource>({} as StorageSource);\n","import React from \"react\";\nimport type { StorageSource, StorageSourceDefinition, StorageSourceRegistry } from \"@rebasepro/types\";\n\n/**\n * The storage-source configuration provided to `<Rebase>`: the declared\n * definitions and the built {@link StorageSource} instances, wrapped in a\n * {@link StorageSourceRegistry} for fast key-based lookup.\n *\n * Mirrors the {@link DataSourcesContext} pattern used for databases.\n *\n * @internal\n */\nexport interface StorageSourcesContextValue {\n /** All declared storage sources, keyed by storage-source key. */\n registry: Record<string, StorageSourceDefinition>;\n /** Built {@link StorageSource} for direct sources, keyed by key. */\n sources: Record<string, StorageSource>;\n}\n\nconst EMPTY: StorageSourcesContextValue = { registry: {}, sources: {} };\n\n/** @internal */\nexport const StorageSourcesContext = React.createContext<StorageSourcesContextValue>(EMPTY);\n\n/**\n * Access the storage-source configuration provided to `<Rebase>` via the\n * `storageSources` prop.\n * @internal\n */\nexport const useStorageSources = (): StorageSourcesContextValue => React.useContext(StorageSourcesContext);\n","import React from \"react\";\nimport { UserConfigurationPersistence } from \"@rebasepro/types\";\n\nexport const UserConfigurationPersistenceContext = React.createContext<UserConfigurationPersistence | undefined>(undefined);\n","import type { DialogControllerEntryProps, DialogsController } from \"@rebasepro/types\";\nimport React, { PropsWithChildren, useCallback, useRef, useState, useMemo } from \"react\";\n;\n\nexport const DialogsControllerContext = React.createContext<DialogsController>({} as DialogsController);\n\nexport const DialogsProvider: React.FC<PropsWithChildren> = ({ children }) => {\n\n const [dialogEntries, setDialogEntries] = useState<DialogControllerEntryProps[]>([]);\n const dialogEntriesRef = useRef<DialogControllerEntryProps[]>(dialogEntries);\n\n const updateDialogEntries = (newPanels: DialogControllerEntryProps<any>[]) => {\n dialogEntriesRef.current = newPanels;\n setDialogEntries(newPanels);\n };\n\n const close = useCallback(() => {\n\n if (dialogEntries.length === 0)\n return;\n\n const updatedPanels = [...dialogEntriesRef.current.slice(0, -1)];\n updateDialogEntries(updatedPanels);\n\n }, [dialogEntries]);\n\n const open = useCallback(<T extends object = object>(dialogEntry: DialogControllerEntryProps<T>) => {\n\n const updatedPanels = [...dialogEntriesRef.current, dialogEntry];\n updateDialogEntries(updatedPanels);\n\n return {\n closeDialog: () => {\n const updatedPanels = dialogEntriesRef.current.filter(e => e.key !== dialogEntry.key);\n updateDialogEntries(updatedPanels);\n }\n }\n }, [dialogEntries]);\n\n const dialogsController = useMemo(() => ({\n open,\n close\n }), [open, close]);\n\n return (\n <DialogsControllerContext.Provider value={dialogsController}>\n {children}\n {dialogEntries.map((entry, i) => <entry.Component\n key={`dialog_${i}`}\n open={true}\n closeDialog={close}\n {...entry.props}\n />)}\n </DialogsControllerContext.Provider>\n );\n};\n","import React from \"react\";\n\n/**\n * Context that exposes the full RebaseClient instance.\n * Used by the JS Editor to give developer scripts access to `client.data`, `client.auth`, etc.\n */\nexport const RebaseClientInstanceContext = React.createContext<any>(undefined);\n","import type { CustomizationController } from \"@rebasepro/types\";\nimport React from \"react\";\n\nexport const CustomizationControllerContext = React.createContext<CustomizationController>({} as CustomizationController);\n","import React, { createContext, useContext, useMemo } from \"react\";\nimport type { ComponentOverrideMap } from \"@rebasepro/types\";\n\n/** Stable empty reference to avoid re-creating context values on every render. */\nconst EMPTY_OVERRIDES: ComponentOverrideMap = {};\n\n/**\n * Internal state for the component override resolution chain.\n * Holds both global overrides (set on `<Rebase>`) and collection-scoped\n * overrides (set on individual collections).\n *\n * Resolution priority: collection > global > default.\n *\n * @internal\n */\ninterface ComponentOverrideState {\n globalOverrides: ComponentOverrideMap;\n collectionOverrides: ComponentOverrideMap;\n}\n\nexport const ComponentOverrideContext = createContext<ComponentOverrideState>({\n globalOverrides: EMPTY_OVERRIDES,\n collectionOverrides: EMPTY_OVERRIDES\n});\n\n/**\n * Provider set at the `<Rebase>` root level to supply global component overrides.\n *\n * @internal — Used by the Rebase component. End users set overrides via\n * the `components` prop on `<Rebase>`.\n */\nexport function GlobalComponentOverrideProvider({\n overrides,\n children\n}: {\n overrides?: ComponentOverrideMap;\n children: React.ReactNode;\n}) {\n const value = useMemo<ComponentOverrideState>(() => ({\n globalOverrides: overrides ?? EMPTY_OVERRIDES,\n collectionOverrides: EMPTY_OVERRIDES\n }), [overrides]);\n\n return (\n <ComponentOverrideContext.Provider value={value}>\n {children}\n </ComponentOverrideContext.Provider>\n );\n}\n\n/**\n * Provider set at the collection level to layer collection-scoped overrides\n * on top of global overrides.\n *\n * When a collection defines `components`, this provider is mounted\n * around the collection's view subtree. Components within the subtree\n * will resolve overrides in order: collection → global → default.\n *\n * @internal — Used by DataCollectionView when a collection has\n * `components` defined.\n */\nexport function CollectionComponentOverrideProvider({\n overrides,\n children\n}: {\n overrides?: ComponentOverrideMap;\n children: React.ReactNode;\n}) {\n const parent = useContext(ComponentOverrideContext);\n\n const value = useMemo<ComponentOverrideState>(() => ({\n globalOverrides: parent.globalOverrides,\n collectionOverrides: overrides ?? EMPTY_OVERRIDES\n }), [parent.globalOverrides, overrides]);\n\n return (\n <ComponentOverrideContext.Provider value={value}>\n {children}\n </ComponentOverrideContext.Provider>\n );\n}\n","import React, { createContext, useContext } from \"react\";\nimport type { CollectionConfig } from \"@rebasepro/types\";\nimport { CollectionComponentOverrideProvider } from \"./ComponentOverrideContext\";\n\n/**\n * Carries the collection a UI subtree is currently bound to.\n *\n * Mounted by every collection binding (main collection views, entity\n * edit/detail views, side panels, reference-selection dialogs, import\n * previews) via {@link CollectionScopeProvider}. Leaf components read it with\n * {@link useCollectionScope} to derive collection-dependent behavior — e.g.\n * filter fields resolve the engine's supported operators from\n * `collection.engine` — without every intermediate component threading\n * collection props.\n *\n * @internal\n */\nexport const CollectionScopeContext = createContext<CollectionConfig | undefined>(undefined);\n\n/**\n * Read the collection the current subtree is bound to, or `undefined` when\n * rendered outside any collection scope (e.g. a fully standalone table).\n *\n * @group Hooks\n */\nexport function useCollectionScope(): CollectionConfig | undefined {\n return useContext(CollectionScopeContext);\n}\n\n/**\n * Scopes a UI subtree to a collection.\n *\n * Provides two things at once:\n * 1. The collection itself — readable via {@link useCollectionScope} —\n * so leaf components (filter fields, previews, …) can derive\n * collection-dependent behavior such as engine capabilities.\n * 2. The collection's component overrides (`collection.components`),\n * by mounting {@link CollectionComponentOverrideProvider}.\n *\n * Mount this wherever a subtree is bound to a specific collection. If you\n * build a custom view around `SelectableTable` / `CollectionTableBinding`,\n * wrap it in this provider to get engine-aware filters and collection-scoped\n * component overrides for free:\n *\n * ```tsx\n * <CollectionScopeProvider collection={myCollection}>\n * <CollectionTableBinding ... />\n * </CollectionScopeProvider>\n * ```\n *\n * @group Components\n */\nexport function CollectionScopeProvider({\n collection,\n children\n}: {\n collection: CollectionConfig<any> | undefined;\n children: React.ReactNode;\n}) {\n return (\n <CollectionScopeContext.Provider value={collection as CollectionConfig | undefined}>\n <CollectionComponentOverrideProvider overrides={collection?.components}>\n {children}\n </CollectionComponentOverrideProvider>\n </CollectionScopeContext.Provider>\n );\n}\n","import { useContext } from \"react\";\nimport { RebaseData } from \"@rebasepro/types\";\nimport { RebaseDataContext } from \"../../contexts/RebaseDataContext\";\n\n/**\n * Use this hook to access the unified data API.\n *\n * ```ts\n * const data = useData();\n * const { data: products } = await data.products.find({ where: { status: [\"==\", \"published\"] } });\n * await data.products.create({ name: \"Camera\", price: 299 });\n * ```\n *\n * @group Hooks and utilities\n */\nexport const useData = (): RebaseData => {\n return useContext(RebaseDataContext);\n};\n","import React, { createContext, useCallback, useContext, useMemo, useState } from \"react\";\nimport { Alert, Typography } from \"@rebasepro/ui\";\n\n// ── Schema Drift Context ────────────────────────────────────────────────\n\ninterface SchemaDriftContextValue {\n /** Report a schema drift error (call from any data-loading hook). */\n reportSchemaDrift: (message: string) => void;\n /** The most recent schema drift message, or null. */\n schemaDriftMessage: string | null;\n /** Dismiss the banner for this session. */\n dismiss: () => void;\n}\n\nconst SchemaDriftContext = createContext<SchemaDriftContextValue>({\n reportSchemaDrift: () => {},\n schemaDriftMessage: null,\n dismiss: () => {}\n});\n\nexport function useSchemaDriftContext(): SchemaDriftContextValue {\n return useContext(SchemaDriftContext);\n}\n\n/**\n * Detects schema drift from an error object.\n * Checks both the error code (from `RebaseApiError`) and the message\n * for schema drift indicators.\n */\nexport function isSchemaDriftError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n // RebaseApiError from the SDK has a `code` property\n if (\"code\" in error && (error as { code?: string }).code === \"SCHEMA_DRIFT\") {\n return true;\n }\n // Fallback: check the message for the telltale phrase\n if (error instanceof Error && error.message.includes(\"Schema drift:\")) {\n return true;\n }\n return false;\n}\n\n// ── Provider ─────────────────────────────────────────────────────────────\n\nexport function SchemaDriftProvider({ children }: { children: React.ReactNode }) {\n const [schemaDriftMessage, setSchemaDriftMessage] = useState<string | null>(null);\n const [dismissed, setDismissed] = useState(false);\n\n const reportSchemaDrift = useCallback((message: string) => {\n setSchemaDriftMessage(prev => prev ?? message);\n }, []);\n\n const dismiss = useCallback(() => {\n setDismissed(true);\n }, []);\n\n const value = useMemo<SchemaDriftContextValue>(() => ({\n reportSchemaDrift,\n schemaDriftMessage: dismissed ? null : schemaDriftMessage,\n dismiss\n }), [reportSchemaDrift, schemaDriftMessage, dismissed, dismiss]);\n\n return (\n <SchemaDriftContext.Provider value={value}>\n {children}\n </SchemaDriftContext.Provider>\n );\n}\n\n// ── Banner Component ─────────────────────────────────────────────────────\n\nexport interface SchemaDriftBannerProps {\n className?: string;\n}\n\n/**\n * Persistent banner shown when a schema drift error is detected.\n */\nexport function SchemaDriftBanner({ className }: SchemaDriftBannerProps) {\n const { schemaDriftMessage, dismiss } = useSchemaDriftContext();\n\n if (!schemaDriftMessage) return null;\n\n return (\n <Alert\n color=\"warning\"\n size=\"small\"\n onDismiss={dismiss}\n className={className}\n >\n <div className=\"flex flex-col gap-1\">\n <Typography variant=\"label\" className=\"text-amber-800 dark:text-amber-200\">\n Schema drift detected\n </Typography>\n <Typography variant=\"body2\" className=\"text-amber-700 dark:text-amber-300\">\n {schemaDriftMessage}{\" \"}\n Run <code className=\"bg-amber-200 dark:bg-amber-800 px-1 rounded text-xs\">pnpm db:push</code> in your backend terminal to sync.\n </Typography>\n </div>\n </Alert>\n );\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport { useEffect, useState, useMemo } from \"react\";\nimport { Entity, FilterValues, User } from \"@rebasepro/types\";\nimport { useData } from \"./useData\";\nimport { isSchemaDriftError, useSchemaDriftContext } from \"../../components/SchemaDriftBanner\";\n/**\n * @group Hooks and utilities\n */\nexport interface CollectionProps<M extends Record<string, any>> {\n\n /**\n * Absolute collection path\n */\n path: string;\n\n /**\n * collection of the entity displayed by this collection\n */\n collection: CollectionConfig<M>\n\n /**\n * Number of entities to fetch\n */\n itemCount?: number;\n\n /**\n * Number of items to skip\n */\n offset?: number;\n\n /**\n * Page number (1-indexed), alternative to offset\n */\n page?: number;\n\n /**\n * Filter the fetched data by the property\n */\n filterValues?: FilterValues<Extract<keyof M, string>>;\n\n /**\n * Sort the results by\n */\n sortBy?: [Extract<keyof M, string>, \"asc\" | \"desc\"];\n\n /**\n * Search string\n */\n searchString?: string;\n}\n\n/**\n * @group Hooks and utilities\n */\nexport interface CollectionResult<M extends Record<string, any>> {\n data: Entity<M>[];\n dataLoading: boolean;\n noMoreToLoad: boolean;\n dataLoadingError?: Error;\n totalCount?: number;\n}\n\n/**\n * This hook is used to fetch collections using a given collection\n * @param path\n * @param collection\n * @param filterValues\n * @param sortBy\n * @param itemCount\n * @param offset\n * @param page\n * @param searchString\n * @group Hooks and utilities\n */\nexport function useCollection<M extends Record<string, any>, USER extends User>(\n {\n path,\n collection,\n filterValues,\n sortBy,\n itemCount,\n offset,\n page,\n searchString\n }: CollectionProps<M>): CollectionResult<M> {\n const dataClient = useData();\n const { reportSchemaDrift } = useSchemaDriftContext();\n\n const sortByProperty = sortBy ? sortBy[0] : undefined;\n const currentSort = sortBy ? sortBy[1] : undefined;\n // Map to PostgREST format for orderBy\n const orderByParams: [string, \"asc\" | \"desc\"] | undefined = sortBy ? [String(sortBy[0]), sortBy[1]] : undefined;\n\n // filterValues is already FilterValues — pass directly\n const whereParams = filterValues && Object.keys(filterValues).length > 0 ? filterValues : undefined;\n\n const [data, setData] = useState<Entity<M>[]>([]);\n\n const [dataLoading, setDataLoading] = useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();\n const [noMoreToLoad, setNoMoreToLoad] = useState<boolean>(false);\n const [totalCount, setTotalCount] = useState<number | undefined>();\n\n useEffect(() => {\n\n setDataLoading(true);\n\n const onEntitiesUpdate = async (res: { data: Entity<M>[], meta: { hasMore: boolean; total?: number } }) => {\n const entities = res.data;\n setDataLoading(false);\n setDataLoadingError(undefined);\n setData(entities.map(e => ({\n ...e\n })));\n setNoMoreToLoad(!res.meta.hasMore);\n setTotalCount(res.meta.total);\n };\n\n const onError = (error: Error) => {\n console.error(\"ERROR\", error);\n setDataLoading(false);\n setData([]);\n setDataLoadingError(error);\n setTotalCount(undefined);\n // Report schema drift to the global banner context\n if (isSchemaDriftError(error)) {\n reportSchemaDrift(error.message);\n }\n };\n\n const accessor = dataClient.collection(path);\n\n // Eagerly include relations to avoid N+1 fetches.\n const hasRelations = collection.properties && Object.values(collection.properties).some(\n (p) => p.type === \"relation\" || p.type === \"reference\"\n );\n const includeParams = hasRelations ? [\"*\"] : undefined;\n\n if (accessor.listen) {\n return accessor.listen({\n where: whereParams,\n limit: itemCount,\n offset,\n page,\n orderBy: orderByParams,\n searchString,\n include: includeParams\n }, (res) => onEntitiesUpdate({ data: res.data as Entity<M>[],\nmeta: res.meta }), onError);\n } else {\n accessor.find({\n where: whereParams,\n limit: itemCount,\n offset,\n page,\n orderBy: orderByParams,\n searchString,\n include: includeParams\n })\n .then((res) => onEntitiesUpdate({ data: res.data as Entity<M>[],\nmeta: res.meta }))\n .catch(onError);\n return () => {\n };\n }\n }, [path, itemCount, offset, page, currentSort, sortByProperty, filterValues, searchString, dataClient, collection]);\n\n return useMemo(() => ({\n data,\n dataLoading,\n dataLoadingError,\n noMoreToLoad,\n totalCount\n }), [data, dataLoading, dataLoadingError, noMoreToLoad, totalCount]);\n\n}\n","import { AuthController, User } from \"@rebasepro/types\";\nimport { useContext } from \"react\";\nimport { AuthControllerContext } from \"../contexts/AuthControllerContext\";\n\n/**\n * Hook to retrieve the AuthContext.\n *\n * Consider that in order to use this hook you need to have a parent\n * `Rebase`\n *\n * @see AuthController\n * @group Hooks and utilities\n */\nexport const useAuthController = <USER extends User = User, AuthControllerType extends AuthController<USER> = AuthController<USER>>(): AuthControllerType => useContext(AuthControllerContext) as AuthControllerType;\n","import { useContext } from \"react\";\nimport { RebaseClientInstanceContext } from \"../contexts/RebaseClientInstanceContext\";\n\n/**\n * Hook to retrieve the full RebaseClient instance from context.\n * Returns `undefined` if no client was provided to `<Rebase>`.\n */\nexport function useRebaseClient<T = any>(): T | undefined {\n return useContext(RebaseClientInstanceContext) as T | undefined;\n}\n","import { StorageSource } from \"@rebasepro/types\";\nimport { StorageSourceContext } from \"../contexts/StorageSourceContext\";\nimport { useContext } from \"react\";\n\n/**\n * Use this hook to get the storage source being used\n * @group Hooks and utilities\n */\nexport const useStorageSource = (): StorageSource => {\n return useContext(StorageSourceContext);\n};\n","import type { SnackbarMessageType } from \"@rebasepro/types\";\nimport React, { useCallback, useMemo } from \"react\";\nimport { useSnackbar } from \"notistack\";\n;\n\n/**\n * Hook to retrieve the SnackbarContext.\n *\n * Consider that in order to use this hook you need to have a parent\n * `Rebase`\n *\n * @see SnackbarController\n * @group Hooks and utilities\n */\nexport const useSnackbarController = () => {\n\n const {\n enqueueSnackbar,\n closeSnackbar\n } = useSnackbar();\n\n const open = useCallback((props: {\n type: SnackbarMessageType;\n title?: string;\n message: React.ReactNode;\n autoHideDuration?: number;\n }) => {\n const {\n type,\n message,\n autoHideDuration\n } = props;\n enqueueSnackbar({\n message: props.title ? <div className={\"flex flex-col\"}>\n <strong>{props.title}</strong>\n {message}\n </div> : message,\n variant: type,\n autoHideDuration\n })\n }, []);\n\n const close = useCallback(() => {\n closeSnackbar();\n }, []);\n\n return useMemo(() => ({\n open,\n close\n }), [open, close]);\n\n};\n","import { UserConfigurationPersistence } from \"@rebasepro/types\";\nimport { useContext } from \"react\";\nimport { UserConfigurationPersistenceContext } from \"../contexts/UserConfigurationPersistenceContext\";\n\n/**\n * Use this controller to access the configuration that is stored externally,\n * and not defined in code\n *\n * @group Hooks and utilities\n */\nexport const useUserConfigurationPersistence = (): UserConfigurationPersistence | undefined => useContext(UserConfigurationPersistenceContext);\n","import type { DialogsController } from \"@rebasepro/types\";\nimport { useContext } from \"react\";\nimport { DialogsControllerContext } from \"../contexts/DialogsProvider\";\n;\n\n/**\n * Use this hook to open a dialog imperatively.\n * Alternatively, you can use dialogs declaratively using the `Dialog` component.\n *\n * Consider that in order to use this hook you need to have a parent\n * `Rebase`\n *\n * @group Hooks and utilities\n */\nexport const useDialogsController = (): DialogsController => useContext(DialogsControllerContext);\n","import type { CustomizationController } from \"@rebasepro/types\";\nimport { useContext } from \"react\";\nimport { CustomizationControllerContext } from \"../contexts/CustomizationControllerContext\";\n\n/**\n * Use this hook to retrieve the customization controller.\n * This hook includes all the customization options that can be used\n * to customize the CMS.\n *\n * You will likely not need to use this hook directly.\n *\n * @group Hooks and utilities\n */\nexport const useCustomizationController = (): CustomizationController => useContext(CustomizationControllerContext);\n","import { useContext } from \"react\";\nimport { AnalyticsController } from \"@rebasepro/types\";\nimport { AnalyticsContext } from \"../contexts/AnalyticsContext\";\n\n/**\n * @group Hooks and utilities\n */\nexport const useAnalyticsController = (): AnalyticsController => useContext(AnalyticsContext);\n","import { useContext } from \"react\";\nimport { EffectiveRoleControllerContext } from \"../contexts/EffectiveRoleController\";\n\n/**\n * Hook to retrieve the {@link EffectiveRoleController}\n *\n * @see EffectiveRoleController\n * @category Hooks and utilities\n */\nexport const useEffectiveRoleController = () => useContext(EffectiveRoleControllerContext);\n","import React from \"react\";\nimport { DatabaseAdmin } from \"@rebasepro/types\";\n\nexport const DatabaseAdminContext = React.createContext<DatabaseAdmin | undefined>(undefined);\n","import { AuthController, RebaseContext, User } from \"@rebasepro/types\";\nimport { wrapAsSdkData } from \"@rebasepro/common\";\nimport { useAuthController } from \"./useAuthController\";\nimport { useRebaseClient } from \"./useRebaseClient\";\nimport { useData } from \"./data/useData\";\nimport { useStorageSource } from \"./useStorageSource\";\nimport { useSnackbarController } from \"./useSnackbarController\";\nimport { useUserConfigurationPersistence } from \"./useUserConfigurationPersistence\";\nimport { useDialogsController } from \"./useDialogsController\";\nimport { useCustomizationController } from \"./useCustomizationController\";\nimport { useAnalyticsController } from \"./useAnalyticsController\";\nimport { useEffectiveRoleController } from \"./useEffectiveRoleController\";\nimport React, { useEffect, useContext } from \"react\";\n\n\n// DatabaseAdmin is provided by <Rebase> via DatabaseAdminContext.\nimport { DatabaseAdminContext } from \"../contexts/DatabaseAdminContext\";\n\n/**\n * Hook to retrieve the {@link RebaseContext}.\n *\n * Consider that in order to use this hook you need to have a parent\n * `Rebase` component.\n *\n * @see RebaseContext\n * @group Hooks and utilities\n */\nexport const useRebaseContext = <USER extends User = User, AuthControllerType extends AuthController<USER> = AuthController<USER>>(): RebaseContext<USER, AuthControllerType> => {\n\n const client = useRebaseClient<any>();\n\n const authController = useAuthController<USER, AuthControllerType>();\n // `context.data` is the flat SDK view — identical in shape to the backend\n // `context.data` and the frontend SDK client, so callbacks behave the same\n // everywhere. The admin CMS reads Entities via `useData()` directly.\n const entityData = useData();\n const data = React.useMemo(() => wrapAsSdkData(entityData), [entityData]);\n const storageSource = useStorageSource();\n const snackbarController = useSnackbarController();\n const userConfigPersistence = useUserConfigurationPersistence();\n const dialogsController = useDialogsController();\n const customizationController = useCustomizationController();\n const analyticsController = useAnalyticsController();\n const effectiveRoleController = useEffectiveRoleController();\n\n\n // Will get `databaseAdmin` from context\n const databaseAdmin = useContext(DatabaseAdminContext);\n\n const rebaseContextRef = React.useRef<RebaseContext<USER, AuthControllerType>>({\n authController,\n data,\n storageSource,\n snackbarController,\n userConfigPersistence,\n dialogsController,\n customizationController,\n analyticsController,\n effectiveRoleController,\n databaseAdmin,\n client: client! // Client should be provided\n });\n\n React.useEffect(() => {\n rebaseContextRef.current = {\n authController,\n data,\n storageSource,\n snackbarController,\n userConfigPersistence,\n dialogsController,\n customizationController,\n analyticsController,\n effectiveRoleController,\n databaseAdmin,\n client: client!\n };\n }, [authController, data, storageSource, snackbarController, userConfigPersistence,\n dialogsController, customizationController, analyticsController,\n effectiveRoleController, databaseAdmin, client]);\n\n return rebaseContextRef.current;\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport { useEffect, useState, useMemo } from \"react\";\nimport { Entity, RebaseContext, User } from \"@rebasepro/types\";\nimport { useData } from \"./useData\";\nimport { useRebaseContext } from \"../useRebaseContext\";\n\n/**\n * @group Hooks and utilities\n */\nexport interface FetchProps<M extends Record<string, any>, USER extends User = User> {\n path: string;\n entityId?: string | number;\n databaseId?: string;\n collection: CollectionConfig<M, USER>;\n useCache?: boolean;\n}\n\n/**\n * @group Hooks and utilities\n */\nexport interface FetchResult<M extends Record<string, any>> {\n entity?: Entity<M>,\n dataLoading: boolean,\n dataLoadingError?: Error\n}\n\nconst CACHE: Record<string, Entity<any> | undefined> = {};\n\n/**\n * Pre-populate the entity fetch cache with entities loaded from a collection.\n * This allows entity detail views to render instantly using cached data,\n * while the background fetch/listener brings in fresh data.\n * @param path - The collection path (e.g. \"products\")\n * @param entities - Array of entities to cache\n */\nexport function populateFetchCache<M extends Record<string, any>>(path: string, entities: Entity<M>[]): void {\n for (const entity of entities) {\n CACHE[`${path}/${entity.id}`] = entity;\n }\n}\n\n/**\n * Clear the entity fetch cache. Call this on auth state changes (e.g. logout)\n * to prevent stale data from a previous session leaking into the next.\n */\nexport function clearFetchCache(): void {\n for (const key of Object.keys(CACHE)) {\n delete CACHE[key];\n }\n}\n\n/**\n * This hook is used to fetch a entity.\n * It gives real time updates if the driver supports it.\n * @param path\n * @param collection\n * @param entityId\n * @param useCache\n * @group Hooks and utilities\n */\n\nexport function useFetch<M extends Record<string, any>, USER extends User = User>(\n {\n path,\n entityId,\n collection,\n databaseId,\n useCache = false\n }: FetchProps<M, USER>): FetchResult<M> {\n\n const dataClient = useData();\n\n const context: RebaseContext<USER> = useRebaseContext();\n\n // Seed initial state from the cache to avoid skeleton flashes.\n // Even when useCache is false, we show cached data instantly while\n // the background fetch/listener brings in fresh data.\n const cacheKey = entityId ? `${path}/${entityId}` : undefined;\n const cachedEntity = cacheKey ? CACHE[cacheKey] as Entity<M> | undefined : undefined;\n\n const [entity, setEntity] = useState<Entity<M> | undefined>(cachedEntity);\n const [dataLoading, setDataLoading] = useState<boolean>(!cachedEntity);\n const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();\n\n useEffect(() => {\n\n // Only show loading state if we have no cached entity to display\n if (!CACHE[`${path}/${entityId}`]) {\n setDataLoading(true);\n }\n\n const onEntityUpdate = async (updatedEntity?: Entity<M> | null) => {\n CACHE[`${path}/${entityId}`] = updatedEntity ?? undefined;\n setEntity(updatedEntity ?? undefined);\n setDataLoading(false);\n setDataLoadingError(undefined);\n };\n\n const onError = (error: Error) => {\n console.error(\"ERROR fetching entity\", error);\n setDataLoading(false);\n setEntity(undefined);\n setDataLoadingError(error);\n };\n\n if (entityId && useCache && CACHE[`${path}/${entityId}`]) {\n setEntity(CACHE[`${path}/${entityId}`]);\n setDataLoading(false);\n setDataLoadingError(undefined);\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n return () => {\n };\n } else if (entityId && path && collection) {\n const accessor = dataClient.collection(path);\n\n if (accessor.listenById) {\n return accessor.listenById(entityId, (entity) => onEntityUpdate(entity as Entity<M> | undefined), onError);\n } else {\n accessor.findById(entityId)\n .then((entity) => onEntityUpdate(entity as Entity<M> | undefined))\n .catch(onError);\n return () => {\n };\n }\n }\n // if no entityId is provided we do nothing\n else {\n onEntityUpdate(undefined);\n return () => {\n };\n }\n }, [entityId, path, dataClient, collection, useCache, databaseId]);\n\n return useMemo(() => ({\n entity,\n dataLoading,\n dataLoadingError\n }), [entity, dataLoading, dataLoadingError]);\n\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport { useCallback, useEffect, useRef, useState, useMemo } from \"react\";\nimport { useData } from \"./useData\";\nimport { Entity, EntityRelation, FilterValues } from \"@rebasepro/types\";\nexport interface RelationItem {\n id: string | number;\n label: string;\n description?: string;\n data: Entity<any>;\n relation: EntityRelation;\n}\n\nexport interface UseRelationSelectorProps<M extends Record<string, any> = any> {\n /**\n * Full path where the relation data is located\n */\n path: string;\n /**\n * The collection that represents the relation entities\n */\n collection: CollectionConfig<M>;\n /**\n * Force filter to be applied to the relation search\n */\n fixedFilter?: FilterValues<string>;\n /**\n * Page size for pagination\n */\n pageSize?: number;\n /**\n * Function to extract the label from a entity\n */\n getLabelFromEntity?: (entity: Entity<M>) => string;\n /**\n * Function to extract the description from a entity\n */\n getDescriptionFromEntity?: (entity: Entity<M>) => string | undefined;\n /**\n * Property name to use as the secondary display field\n */\n descriptionProperty?: keyof M;\n}\n\nexport interface RelationSelectorController {\n items: RelationItem[];\n isLoading: boolean;\n error: Error | undefined;\n search: (searchString: string) => void;\n loadMore: () => void;\n hasMore: boolean;\n entityToRelationItem: (entity: Entity<any>, relation: EntityRelation) => RelationItem;\n}\n\nconst DEFAULT_PAGE_SIZE = 10;\n\n/**\n * Hook to manage relation selection with data fetching from Rebase data source\n */\nexport function useRelationSelector<M extends Record<string, any> = any>(\n {\n path,\n collection,\n fixedFilter,\n pageSize = DEFAULT_PAGE_SIZE,\n getLabelFromEntity,\n getDescriptionFromEntity,\n descriptionProperty\n }: UseRelationSelectorProps<M>\n): RelationSelectorController {\n\n const dataClient = useData();\n\n const [items, setItems] = useState<RelationItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const isLoadingRef = useRef(false);\n const [error, setError] = useState<Error | undefined>();\n const [hasMore, setHasMore] = useState(true);\n const [currentSearch, setCurrentSearch] = useState<string>(\"\");\n const [limit, setLimit] = useState<number>(pageSize);\n\n const unsubscribeRef = useRef<(() => void) | null>(null);\n const searchTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const setLoading = useCallback((loading: boolean) => {\n isLoadingRef.current = loading;\n setIsLoading(loading);\n }, []);\n\n // Function to convert entity to RelationItem\n const entityToRelationItem = useCallback((entity: Entity<M>, relation?: EntityRelation): RelationItem => {\n let label: string;\n let description: string | undefined;\n\n if (getLabelFromEntity) {\n label = getLabelFromEntity(entity);\n } else {\n // Fallback: try common label properties\n const commonLabelProps = [\"name\", \"title\", \"label\", \"displayName\"];\n let foundProp: string | undefined;\n\n if (entity.values) {\n foundProp = commonLabelProps.find(prop => entity.values[prop] != null && entity.values[prop] !== \"\");\n }\n\n if (foundProp && entity.values[foundProp]) {\n label = String(entity.values[foundProp]);\n } else {\n // Ultimate fallback: use entity ID\n label = String(entity.id);\n }\n }\n\n if (getDescriptionFromEntity) {\n description = getDescriptionFromEntity(entity);\n } else if (descriptionProperty && entity.values && entity.values[descriptionProperty]) {\n description = String(entity.values[descriptionProperty]);\n }\n\n return {\n id: entity.id,\n label,\n description,\n data: entity,\n relation: relation ? relation : new EntityRelation(entity.id, path)\n };\n }, [getLabelFromEntity, getDescriptionFromEntity, descriptionProperty]);\n\n // Clean up any existing subscription\n const cleanupSubscription = useCallback(() => {\n if (unsubscribeRef.current) {\n unsubscribeRef.current();\n unsubscribeRef.current = null;\n }\n }, []);\n\n const fetchData = useCallback(() => {\n cleanupSubscription();\n setError(undefined);\n setLoading(true);\n\n // fixedFilter is already FilterValues — pass directly\n const whereParams = fixedFilter && Object.keys(fixedFilter).length > 0 ? fixedFilter : undefined;\n\n const onEntitiesUpdate = (res: { data: Entity<M>[], meta: { hasMore: boolean } }) => {\n const newItems = res.data.map((e) => entityToRelationItem(e));\n setItems(newItems);\n setHasMore(res.meta.hasMore);\n setLoading(false);\n };\n\n const onErrorUpdate = (fetchError: Error) => {\n console.error(\"useRelationSelector: Error fetching data:\", fetchError);\n setError(fetchError);\n setLoading(false);\n };\n\n const accessor = dataClient.collection(path);\n\n let unsubscribe: (() => void) | undefined;\n\n if (accessor.listen) {\n unsubscribe = accessor.listen({\n where: whereParams,\n limit: limit,\n orderBy: undefined,\n searchString: currentSearch\n }, (res) => onEntitiesUpdate({ data: res.data as Entity<M>[],\nmeta: res.meta }), onErrorUpdate);\n } else {\n accessor.find({\n where: whereParams,\n limit: limit,\n offset: 0,\n orderBy: undefined,\n searchString: currentSearch\n })\n .then((res) => onEntitiesUpdate({ data: res.data as Entity<M>[],\nmeta: res.meta }))\n .catch(onErrorUpdate);\n unsubscribe = () => {};\n }\n\n unsubscribeRef.current = unsubscribe || null;\n }, [dataClient, path, fixedFilter, limit, currentSearch, entityToRelationItem, cleanupSubscription, setLoading]);\n\n // Search function with debouncing\n const search = useCallback((searchString: string) => {\n // Clear existing timeout\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n // Debounce search\n searchTimeoutRef.current = setTimeout(() => {\n setLimit(pageSize);\n setCurrentSearch(searchString);\n }, searchString.trim() ? 300 : 0);\n }, [pageSize]);\n\n // Load more function\n const loadMore = useCallback(() => {\n if (!isLoadingRef.current && hasMore && items.length > 0) {\n setLoading(true);\n setLimit(prev => prev + pageSize);\n }\n }, [hasMore, items.length, pageSize, setLoading]);\n\n // Load initial data and update upon changes\n useEffect(() => {\n fetchData();\n\n return () => {\n cleanupSubscription();\n };\n }, [fetchData]);\n\n useEffect(() => {\n return () => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n };\n }, []);\n\n return useMemo(() => ({\n items,\n isLoading,\n error,\n search,\n loadMore,\n hasMore,\n entityToRelationItem\n }), [items, isLoading, error, search, loadMore, hasMore, entityToRelationItem]);\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport { Entity, EntityStatus, EntityValues, RebaseContext } from \"@rebasepro/types\";\nimport { RebaseData } from \"@rebasepro/types\";\n\n/**\n * @group Hooks and utilities\n */\nexport type SaveEntityWithCallbacksProps<M extends Record<string, unknown>> = {\n path: string;\n values: Partial<EntityValues<M>>;\n entityId?: string | number;\n previousValues?: Partial<EntityValues<M>>;\n collection?: CollectionConfig<M>;\n status: EntityStatus;\n afterSave?: (updatedEntity: Entity<M>) => void,\n afterSaveError?: (e: Error) => void\n}\n\n/**\n * This function is in charge of saving a entity.\n * It will run all the save callbacks specified in the collection.\n * It is also possible to attach callbacks on save success or error, and callback\n * errors.\n *\n * @param collection\n * @param path\n * @param entityId\n * @param callbacks\n * @param values\n * @param previousValues\n * @param status\n * @param data\n * @param context\n * @param afterSave\n * @param afterSaveError\n * @group Hooks and utilities\n */\nexport async function saveEntityWithCallbacks<M extends Record<string, unknown>>({\n collection,\n path,\n entityId,\n values,\n previousValues,\n status,\n data,\n context,\n afterSave,\n afterSaveError\n}: SaveEntityWithCallbacksProps<M> & {\n collection: CollectionConfig,\n data: RebaseData,\n context: RebaseContext,\n}\n): Promise<Entity<M>> {\n\n if (status !== \"new\" && status !== \"copy\" && !entityId) {\n throw new Error(\"Entity id must be specified when updating an existing entity\");\n }\n\n const accessor = data.collection(path);\n\n let savePromise: Promise<Entity<M>>;\n if (status === \"new\" || status === \"copy\") {\n savePromise = accessor.create(values, entityId) as Promise<Entity<M>>;\n } else {\n savePromise = accessor.update(entityId!, values) as Promise<Entity<M>>;\n }\n\n return savePromise.then((entity) => {\n if (afterSave)\n afterSave(entity);\n return entity as Entity<M>;\n }).catch((e) => {\n if (afterSaveError) afterSaveError(e);\n throw e;\n });\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport { Entity, CollectionCallbacks, RebaseContext, User } from \"@rebasepro/types\";\nimport { RebaseData } from \"@rebasepro/types\";\n\n/**\n * @group Hooks and utilities\n */\nexport type DeleteEntityWithCallbacksProps<M extends Record<string, any>, USER extends User = User> = {\n entity: Entity<M>;\n collection?: CollectionConfig<M>;\n callbacks?: CollectionCallbacks<M, USER>;\n onDeleteSuccess?: (entity: Entity<M>) => void;\n onDeleteFailure?: (entity: Entity<M>, e: Error) => void;\n}\n\n/**\n * This function is in charge of deleting a entity.\n * It will run all the delete callbacks specified in the collection.\n * It is also possible to attach callbacks on save success or error, and callback\n * errors.\n *\n * @param data\n * @param entity\n * @param collection\n * @param callbacks\n * @param onDeleteSuccess\n * @param onDeleteFailure\n * @param context\n * @group Hooks and utilities\n */\nexport async function deleteEntityWithCallbacks<M extends Record<string, any>, USER extends User>({\n data,\n entity,\n collection,\n callbacks,\n onDeleteSuccess,\n onDeleteFailure,\n context\n}: DeleteEntityWithCallbacksProps<M> & {\n collection: CollectionConfig<M>,\n data: RebaseData,\n context: RebaseContext<USER>\n}\n): Promise<boolean> {\n\n console.debug(\"Deleting entity\", entity.path, entity.id);\n\n return data.collection(entity.path).delete(entity.id).then(() => {\n if (onDeleteSuccess) onDeleteSuccess(entity);\n return true;\n }).catch((e) => {\n if (onDeleteFailure) onDeleteFailure(entity, e);\n return false;\n });\n}\n","import { useCallback, useEffect, useState, useMemo } from \"react\";\nimport { useBlocker } from \"react-router-dom\";\nimport { UnsavedChangesDialogProps } from \"../components/UnsavedChangesDialog\";\n\n/**\n * A single, unified hook to prevent navigation when there are unsaved changes.\n *\n * It automatically handles:\n * 1. Internal React Router navigation using `useBlocker`.\n * 2. External browser navigation (page refresh, tab close) using `beforeunload`.\n */\nexport function useUnsavedChangesDialog(\n when: boolean,\n onOk: () => void\n): {\n dialogProps: UnsavedChangesDialogProps;\n triggerDialog: () => void;\n} {\n const [manualDialogOpen, setManualDialogOpen] = useState(false);\n\n const blocker = useBlocker(\n ({ currentLocation, nextLocation }) =>\n when && currentLocation.pathname !== nextLocation.pathname\n );\n\n useEffect(() => {\n if (!when) return;\n\n const handleBeforeUnload = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n e.returnValue = \"\";\n };\n\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n return () => window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n }, [when]);\n\n const handleOk = useCallback(() => {\n onOk();\n if (blocker.state === \"blocked\") {\n blocker.proceed();\n }\n setManualDialogOpen(false);\n }, [blocker, onOk]);\n\n const handleCancel = useCallback(() => {\n if (blocker.state === \"blocked\") {\n blocker.reset();\n }\n setManualDialogOpen(false);\n }, [blocker]);\n\n const triggerDialog = useCallback(() => setManualDialogOpen(true), []);\n\n return useMemo(() => ({\n dialogProps: {\n open: manualDialogOpen || blocker.state === \"blocked\",\n handleOk,\n handleCancel,\n body: \"There are unsaved changes in this collection\"\n },\n triggerDialog\n }), [manualDialogOpen, blocker.state, handleOk, handleCancel, triggerDialog]);\n}\n","import { useState, useEffect, useMemo, useCallback } from \"react\";\nimport { AuthClient, AuthController, User } from \"@rebasepro/types\";\n\nexport function useAuthSubscription(authClient?: AuthClient): AuthController {\n\n // Check initial state\n const currentSession = authClient?.getSession();\n const [user, setUser] = useState<User | null>(currentSession?.user ?? null);\n\n const [initialLoading, setInitialLoading] = useState(!currentSession);\n const [authLoading, setAuthLoading] = useState(false);\n const [authError, setAuthError] = useState<Error>();\n const [loginSkipped, setLoginSkipped] = useState(false);\n const [extra, setExtra] = useState<any>();\n\n useEffect(() => {\n if (!authClient) return;\n // If we don't have a session initially, try to get user which restores session if a persistent token exists\n if (!currentSession) {\n setInitialLoading(true);\n authClient.getUser()\n .then(user => {\n if (user) {\n setUser(user);\n }\n })\n .catch(e => {\n // Ignore, user just isn't logged in\n })\n .finally(() => {\n setInitialLoading(false);\n });\n }\n }, [authClient, currentSession]);\n\n useEffect(() => {\n if (!authClient) return;\n const unsubscribe = authClient.onAuthStateChange((event, session) => {\n if (event === \"SIGNED_IN\" || event === \"USER_UPDATED\" || event === \"TOKEN_REFRESHED\") {\n setUser(session?.user ?? null);\n } else if (event === \"SIGNED_OUT\") {\n setUser(null);\n }\n });\n return unsubscribe;\n }, [authClient]);\n\n const signOut = useCallback(async () => {\n if (!authClient) return;\n setAuthLoading(true);\n try {\n await authClient.signOut();\n } finally {\n setAuthLoading(false);\n }\n }, [authClient]);\n\n const getAuthToken = useCallback(async () => {\n if (!authClient) return \"\";\n const session = authClient.getSession();\n if (!session) return \"\";\n if (session.expiresAt < Date.now()) {\n try {\n const refreshed = await authClient.refreshSession();\n return refreshed.accessToken;\n } catch (e) {\n return \"\";\n }\n }\n return session.accessToken;\n }, [authClient]);\n\n return useMemo(() => ({\n user,\n initialLoading: authClient ? initialLoading : false,\n authLoading,\n signOut,\n authError,\n getAuthToken,\n loginSkipped,\n extra,\n setExtra\n } as AuthController), [\n user, initialLoading, authLoading, signOut, authError,\n getAuthToken, loginSkipped, extra, setExtra, authClient\n ]);\n}\n","import { AdminModeControllerContext } from \"../contexts/AdminModeController\";\nimport { useContext } from \"react\";\n\n/**\n * Use this controller to change the admin mode (developer vs editor)\n * @group Hooks and utilities\n */\nexport interface AdminModeController {\n mode: \"content\" | \"studio\" | \"settings\";\n setMode: (mode: \"content\" | \"studio\" | \"settings\") => void;\n}\n\n/**\n * Hook to retrieve the current admin mode (\"developer\" | \"editor\"), and `setMode`\n * to change it.\n *\n * Consider that in order to use this hook you need to have a parent\n * `Rebase`\n *\n * @see AdminModeController\n * @group Hooks and utilities\n */\nexport const useAdminModeController = () => useContext(AdminModeControllerContext);\n","import { useCallback, useMemo, useState } from \"react\";\nimport { AdminModeController } from \"./index\";\n\n/**\n * Use this hook to build an admin mode controller that determines\n * whether the UI shows Developer or Editor tools.\n */\nexport function useBuildAdminModeController(): AdminModeController {\n\n const savedMode = typeof window !== \"undefined\" ? localStorage.getItem(\"rebase-admin-mode\") as \"content\" | \"studio\" | \"settings\" | null : null;\n const [mode, setMode] = useState<\"content\" | \"studio\" | \"settings\">(savedMode ?? \"content\");\n\n const setModeInternal = useCallback((newMode: \"content\" | \"studio\" | \"settings\") => {\n if (typeof window !== \"undefined\") {\n localStorage.setItem(\"rebase-admin-mode\", newMode);\n }\n setMode(newMode);\n }, []);\n\n return useMemo(() => ({\n mode,\n setMode: setModeInternal\n }), [mode, setModeInternal]);\n}\n","import type { EffectiveRoleController } from \"@rebasepro/types\";\nimport { useCallback, useState, useMemo } from \"react\";\n;\n\n/**\n * Use this hook to build an effective role controller that determines\n * what role is simulated in Editor mode when Dev mode is active.\n *\n * It uses localStorage to persist the simulated role across reloads.\n */\nexport function useBuildEffectiveRoleController(): EffectiveRoleController {\n\n const savedRole = typeof window !== \"undefined\" ? localStorage.getItem(\"rebase-effective-role\") : null;\n const [effectiveRole, setEffectiveRole] = useState<string | null>(savedRole ?? null);\n\n const setRoleInternal = useCallback((newRole: string | null) => {\n if (typeof window !== \"undefined\") {\n if (newRole) {\n localStorage.setItem(\"rebase-effective-role\", newRole);\n } else {\n localStorage.removeItem(\"rebase-effective-role\");\n }\n }\n setEffectiveRole(newRole);\n }, []);\n\n return useMemo(() => ({\n effectiveRole,\n setEffectiveRole: setRoleInternal\n }), [effectiveRole, setRoleInternal]);\n}\n","import { ModeControllerContext } from \"../contexts/ModeController\";\nimport { useContext } from \"react\";\n\n/**\n * Use this controller to change color mode\n * @group Hooks and utilities\n */\nexport interface ModeController {\n mode: \"light\" | \"dark\";\n setMode: (mode: \"light\" | \"dark\" | \"system\") => void;\n}\n\n/**\n * Hook to retrieve the current mode (\"light\" | \"dark\"), and `setMode`\n * or `toggle` functions to change it.\n *\n * Consider that in order to use this hook you need to have a parent\n * `Rebase`\n *\n * @see ModeController\n * @group Hooks and utilities\n */\nexport const useModeController = () => useContext(ModeControllerContext);\n","// FORKED FROM https://github.com/fayeed/use-clipboard\n\nimport { MutableRefObject, useCallback, useEffect, useRef, useState, useMemo } from \"react\";\n\nexport interface UseClipboardProps {\n /**\n * It's callback function that is called after the `copy` command\n * is executed.\n *\n * @param text: The selected clipboard text.\n */\n onSuccess?: (text: string) => void;\n\n /**\n * Triggers when the hook encounters an error.\n * If passed hook won't throw an error.\n *\n * @param error: cause of the error\n */\n onError?: (error: string) => void;\n\n /**\n * Disables the new clipboard API `navigator.clipboard` even if\n * it is supported.\n */\n disableClipboardAPI?: boolean;\n\n /**\n * revert back the isCopied flag to false again if a value is set.\n */\n copiedDuration?: number;\n}\n\nexport interface useClipboardReturnType {\n /**\n * Use ref to pull the text content from.\n */\n ref: MutableRefObject<any>;\n\n /**\n * Use it to perform the copy operation\n */\n copy: (text?: string) => void;\n\n /**\n * Use it to perform the cut operation\n */\n cut: () => void;\n\n /**\n * Indicates wheater the content was successfully copied or not.\n */\n isCoppied: boolean;\n\n /**\n * Current selected clipboard content.\n */\n clipboard: string;\n\n /**\n * Clears the user clipboard.\n */\n clearClipboard: () => void;\n\n /**\n * Check to see if the browser supports the new `navigator.clipboard` API.\n */\n isSupported: () => boolean;\n}\n\nexport const useClipboard = (\n options?: UseClipboardProps\n): useClipboardReturnType => {\n const { onSuccess, onError, disableClipboardAPI = false, copiedDuration } =\n options || {};\n const ref = useRef<any>(null);\n const [isCoppied, setIsCoppied] = useState(false);\n const [clipboard, setClipbaord] = useState(\"\");\n\n useEffect(() => {\n if (copiedDuration) setTimeout(() => setIsCoppied(false), copiedDuration);\n }, [isCoppied]);\n\n const isSupported = useCallback(() => navigator.clipboard !== undefined, []);\n\n const handleError = useCallback((error: string) => {\n if (onError) onError(error);\n else throw new Error(error);\n }, [onError]);\n\n const handleSuccess = useCallback((text: string) => {\n if (onSuccess) onSuccess(text);\n setIsCoppied(true);\n setClipbaord(text);\n }, [onSuccess]);\n\n const copyToClipboard = useCallback((text: string) => {\n navigator.clipboard\n .writeText(text)\n .then(() => handleSuccess(text))\n .catch((err) => {\n handleError(err);\n setIsCoppied(false);\n });\n }, [handleError, handleSuccess]);\n\n const clearClipboard = useCallback(() => {\n if (isSupported()) {\n navigator.clipboard.writeText(\"\");\n }\n }, [isSupported]);\n\n const action = useCallback(\n (operation = \"copy\", text?: string) => {\n const element = ref.current as HTMLElement;\n\n const isInput =\n element &&\n (element.tagName === \"INPUT\" || element.tagName === \"TEXTAREA\");\n\n const input = ref.current as HTMLInputElement;\n\n if (isSupported() && !disableClipboardAPI) {\n if (text) {\n copyToClipboard(text);\n } else if (element) {\n if (isInput) {\n copyToClipboard(input.value);\n\n if (operation === \"cut\") {\n input.value = \"\";\n }\n } else {\n copyToClipboard(element.innerText);\n }\n } else {\n handleError(\"Both the ref & text were undefined\");\n }\n }\n },\n [disableClipboardAPI, copyToClipboard, handleError]\n );\n\n const copy = useCallback((text?: string) =>\n action(\"copy\", typeof text === \"object\" ? undefined : text), [action]);\n\n const cut = useCallback(() => action(\"cut\"), [action]);\n\n return useMemo(() => ({\n ref,\n isCoppied,\n clipboard,\n clearClipboard,\n isSupported,\n copy,\n cut\n }), [isCoppied, clipboard, clearClipboard, isSupported, copy, cut]);\n};\n","import { useEffect, useState } from \"react\";\n\ntype LayoutListener = (isLargeLayout: boolean) => void;\n\nconst breakpoints = {\n xs: 0,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n \"3xl\": 1920\n}\n\n// Global state and listeners array\nlet isLargeLayoutGlobal = checkLargeLayout(\"lg\"); // Default value\nconst listeners: LayoutListener[] = [];\n\n// Utility to notify all listeners\nconst notifyListeners = () => {\n listeners.forEach(listener => listener(isLargeLayoutGlobal));\n};\n\n// Listen to resize events once, at a global level\nif (typeof window !== \"undefined\")\n window.addEventListener(\"resize\", () => {\n const newIsLargeLayout = checkLargeLayout(\"lg\");\n if (newIsLargeLayout !== isLargeLayoutGlobal) {\n isLargeLayoutGlobal = newIsLargeLayout;\n notifyListeners();\n }\n });\n\nexport const useLargeLayout = () => {\n const [isLargeLayout, setIsLargeLayout] = useState(isLargeLayoutGlobal);\n\n useEffect(() => {\n // Listener function to update component state\n const listener: LayoutListener = (newIsLargeLayout) => {\n setIsLargeLayout(newIsLargeLayout);\n };\n\n // Register listener\n listeners.push(listener);\n\n // Initial state\n setIsLargeLayout(isLargeLayoutGlobal);\n\n // Clean up by removing the listener\n return () => {\n const index = listeners.indexOf(listener);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, []);\n\n return isLargeLayout;\n};\n\nfunction checkLargeLayout(breakpoint: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" = \"lg\"): boolean {\n if (typeof window === \"undefined\")\n return false;\n return window.matchMedia(`(min-width: ${breakpoints[breakpoint] + 1}px)`).matches;\n}\n","import { useCallback, useEffect, useState, useMemo } from \"react\";\n\nconst STORAGE_KEY_PREFIX = \"rebase-collapsed-groups\";\n\n/**\n * Custom hook for managing collapsed/expanded state of navigation groups\n * with localStorage persistence. Automatically cleans up stale group entries\n * when groups are removed from the navigation.\n *\n * Groups that have never been toggled by the user fall back to\n * `defaults[groupName]` (driven by `collapsedByDefault` in config).\n *\n * @param groupNames - Array of group names to track\n * @param namespace - Namespace for localStorage key (e.g., \"home\", \"drawer\") to allow independent state\n * @param defaults - Optional map of group name → collapsed boolean from config\n */\nexport function useCollapsedGroups(\n groupNames: string[],\n namespace = \"default\",\n defaults?: Record<string, boolean>\n) {\n const storageKey = `${STORAGE_KEY_PREFIX}-${namespace}`;\n\n // Load collapsed groups from localStorage on mount\n const [collapsedGroups, setCollapsedGroups] = useState<Record<string, boolean>>(() => {\n try {\n const stored = localStorage.getItem(storageKey);\n return stored ? JSON.parse(stored) : {};\n } catch {\n return {};\n }\n });\n\n // Save to localStorage whenever collapsedGroups changes\n useEffect(() => {\n try {\n localStorage.setItem(storageKey, JSON.stringify(collapsedGroups));\n } catch {\n // Silently fail if localStorage is not available\n }\n }, [collapsedGroups, storageKey]);\n\n // Clean up collapsed groups state when groups change - remove entries for groups that no longer exist\n useEffect(() => {\n // Only clean up if we have actual groups loaded (avoid cleaning up during initial load)\n if (groupNames.length === 0) return;\n\n const currentGroupNames = new Set(groupNames);\n\n setCollapsedGroups(prev => {\n const cleaned = Object.fromEntries(\n Object.entries(prev).filter(([groupName]) => currentGroupNames.has(groupName))\n );\n\n // Only update if something actually changed\n const prevKeys = Object.keys(prev);\n const cleanedKeys = Object.keys(cleaned);\n\n if (prevKeys.length === cleanedKeys.length && prevKeys.every(key => cleanedKeys.includes(key))) {\n return prev;\n }\n\n return cleaned;\n });\n }, [groupNames]);\n\n const isGroupCollapsed = useCallback((name: string) => {\n // If the user has explicitly toggled this group, use that value\n if (name in collapsedGroups) {\n return collapsedGroups[name];\n }\n // Otherwise fall back to the config default\n return defaults?.[name] ?? false;\n }, [collapsedGroups, defaults]);\n\n const toggleGroupCollapsed = useCallback((name: string) => {\n setCollapsedGroups(prev => {\n // Resolve current effective state (explicit or default)\n const currentlyCollapsed = name in prev\n ? prev[name]\n : (defaults?.[name] ?? false);\n return { ...prev,\n[name]: !currentlyCollapsed };\n });\n }, [defaults]);\n\n return useMemo(() => ({\n isGroupCollapsed,\n toggleGroupCollapsed\n }), [isGroupCollapsed, toggleGroupCollapsed]);\n}\n\n/**\n * Build a defaults map from navigationGroupMappings for a given namespace.\n * Returns a Record<groupName, collapsed> that can be passed to useCollapsedGroups.\n */\nexport function buildCollapsedDefaults(\n mappings: Array<{ name: string; collapsedByDefault?: boolean | { drawer?: boolean; home?: boolean } }> | undefined,\n namespace: \"drawer\" | \"home\"\n): Record<string, boolean> {\n if (!mappings) return {};\n const result: Record<string, boolean> = {};\n for (const mapping of mappings) {\n const val = mapping.collapsedByDefault;\n if (val === undefined) continue;\n if (typeof val === \"boolean\") {\n result[mapping.name] = val;\n } else {\n const ns = val[namespace];\n if (ns !== undefined) {\n result[mapping.name] = ns;\n }\n }\n }\n return result;\n}\n","import { useEffect } from \"react\";\n\nconst rebaseLogo = \"data:image/png;base64,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\";\n\n/**\n * Internal hook to handle the browser title and icon\n * @param name\n * @param logo\n */\nexport function useBrowserTitleAndIcon(name: string, logo?: string) {\n useEffect(() => {\n if (document) {\n document.title = `${name} - Rebase`;\n let link = document.querySelector(\"link[rel~='icon']\") as HTMLLinkElement | null;\n if (!link) {\n link = document.createElement(\"link\");\n link.rel = \"icon\";\n document.getElementsByTagName(\"head\")[0].appendChild(link);\n }\n link.href = logo ?? rebaseLogo;\n }\n }, [name, logo]);\n}\n","import type { SlotName, SlotRegistry } from \"@rebasepro/types\";\nimport React, { useMemo } from \"react\";\n;\nimport { useCustomizationController } from \"./useCustomizationController\";\nimport { ErrorBoundary } from \"@rebasepro/ui\";\n\n/**\n * Hook that retrieves and renders all slot contributions for a given slot name.\n *\n * @param slot - The slot name to render contributions for.\n * @param props - Props passed to each slot component.\n * @returns An array of rendered React nodes, each wrapped in an ErrorBoundary.\n *\n * @example\n * ```tsx\n * const actions = useSlot(\"home.actions\", { context });\n * return <div>{actions}</div>;\n * ```\n *\n * @group Hooks\n */\nexport function useSlot<K extends SlotName>(\n slot: K,\n props: SlotRegistry[K]\n): React.ReactNode[] {\n const { resolvedSlots } = useCustomizationController();\n\n const propsRef = React.useRef(props);\n const currentProps = props as unknown as Record<string, unknown>;\n const prevProps = propsRef.current as unknown as Record<string, unknown>;\n\n let changed = false;\n if (currentProps !== prevProps) {\n const keys = Object.keys(currentProps);\n const prevKeys = Object.keys(prevProps);\n if (keys.length !== prevKeys.length) {\n changed = true;\n } else {\n for (let i = 0; i < keys.length; i++) {\n if (currentProps[keys[i]] !== prevProps[keys[i]]) {\n changed = true;\n break;\n }\n }\n }\n }\n\n if (changed) {\n propsRef.current = props;\n }\n\n const stableProps = propsRef.current;\n\n return useMemo(() => {\n return resolvedSlots\n .filter(s => s.slot === slot)\n .sort((a, b) => (a.order ?? 50) - (b.order ?? 50))\n .map((s, i) => (\n <ErrorBoundary key={`${slot}_${i}`}>\n <s.Component {...(stableProps as unknown as Record<string, unknown>)} {...(s.props ?? {})}/>\n </ErrorBoundary>\n ));\n }, [resolvedSlots, slot, stableProps]);\n}\n","import { useCallback, useEffect, useRef, useState, useMemo } from \"react\";\nimport { PartialCollectionConfig, UserConfigurationPersistence } from \"@rebasepro/types\";\nimport { stripCollectionPath } from \"@rebasepro/common\";\nimport { mergeDeep } from \"@rebasepro/utils\";\n\nexport function useBuildLocalConfigurationPersistence(): UserConfigurationPersistence {\n\n const configCache = useRef<Record<string, PartialCollectionConfig>>({});\n\n const getCollectionFromStorage = useCallback((storageKey: string) => {\n const item = localStorage.getItem(storageKey);\n return item ? JSON.parse(item) : {};\n }, []);\n\n const getCollectionConfig = useCallback(<M extends Record<string, any>>(path: string): PartialCollectionConfig<M> => {\n const storageKey = `collection_config::${stripCollectionPath(path)}`;\n if (configCache.current[storageKey]) {\n return configCache.current[storageKey] as PartialCollectionConfig<M>;\n }\n return getCollectionFromStorage(storageKey);\n }, [getCollectionFromStorage]);\n\n const onCollectionModified = useCallback(<M extends Record<string, any>>(path: string, data: PartialCollectionConfig<M>) => {\n const storageKey = `collection_config::${stripCollectionPath(path)}`;\n localStorage.setItem(storageKey, JSON.stringify(data));\n const cachedConfig = configCache.current[storageKey];\n const newConfig = mergeDeep(cachedConfig ?? getCollectionFromStorage(path), data);\n configCache.current[storageKey] = mergeDeep(configCache.current[storageKey], newConfig);\n }, [getCollectionFromStorage]);\n\n const [recentlyVisitedPaths, _setRecentlyVisitedPaths] = useState<string[]>([]);\n const [favouritePaths, _setFavouritePaths] = useState<string[]>([]);\n const [collapsedGroups, _setCollapsedGroups] = useState<string[]>([]);\n\n useEffect(() => {\n _setRecentlyVisitedPaths(localStorage.getItem(\"recently_visited_paths\") ? JSON.parse(localStorage.getItem(\"recently_visited_paths\")!) : []);\n _setFavouritePaths(localStorage.getItem(\"favourite_paths\") ? JSON.parse(localStorage.getItem(\"favourite_paths\")!) : []);\n _setCollapsedGroups(localStorage.getItem(\"collapsed_groups\") ? JSON.parse(localStorage.getItem(\"collapsed_groups\")!) : []);\n }, []);\n\n const setRecentlyVisitedPaths = useCallback((paths: string[]) => {\n localStorage.setItem(\"recently_visited_paths\", JSON.stringify(paths));\n _setRecentlyVisitedPaths(paths);\n }, []);\n\n const setFavouritePaths = useCallback((paths: string[]) => {\n localStorage.setItem(\"favourite_paths\", JSON.stringify(paths));\n _setFavouritePaths(paths);\n }, []);\n\n const setCollapsedGroups = useCallback((paths: string[]) => {\n localStorage.setItem(\"collapsed_groups\", JSON.stringify(paths));\n _setCollapsedGroups(paths);\n }, []);\n\n return useMemo(() => ({\n onCollectionModified,\n getCollectionConfig,\n recentlyVisitedPaths,\n setRecentlyVisitedPaths,\n favouritePaths,\n setFavouritePaths,\n collapsedGroups,\n setCollapsedGroups\n }), [\n onCollectionModified,\n getCollectionConfig,\n recentlyVisitedPaths,\n setRecentlyVisitedPaths,\n favouritePaths,\n setFavouritePaths,\n collapsedGroups,\n setCollapsedGroups\n ]);\n}\n","import { useCallback, useEffect, useState, useMemo } from \"react\";\n\nimport { ModeController } from \"./index\";\n\n/**\n * Use this hook to build a color mode controller that determines\n * the theme of the CMS\n */\nexport function useBuildModeController(): ModeController {\n\n const prefersDarkModeQuery = useCallback((): boolean => {\n if (typeof window === \"undefined\")\n return false;\n const mediaQueryList = window.matchMedia(\"(prefers-color-scheme: dark)\");\n return mediaQueryList.matches;\n }, []);\n\n const [mode, setMode] = useState<\"light\" | \"dark\">(() => {\n const prefersDarkModeStorage = typeof window !== \"undefined\" && localStorage.getItem(\"prefers-dark-mode\") != null\n ? localStorage.getItem(\"prefers-dark-mode\") === \"true\"\n : null;\n const prefersDarkMode = prefersDarkModeStorage ?? prefersDarkModeQuery();\n return prefersDarkMode ? \"dark\" : \"light\";\n });\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handleChange = (e: MediaQueryListEvent) => {\n if (localStorage.getItem(\"prefers-dark-mode\") == null) {\n setMode(e.matches ? \"dark\" : \"light\");\n setDocumentMode(e.matches ? \"dark\" : \"light\");\n }\n };\n\n // Initial setup\n setDocumentMode(mode);\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n const setDocumentMode = (mode: \"light\" | \"dark\") => {\n if (mode === \"dark\") {\n document.documentElement.classList.add(\"dark\");\n } else {\n document.documentElement.classList.remove(\"dark\");\n }\n };\n\n const setModeInternal = useCallback((mode: \"light\" | \"dark\" | \"system\") => {\n if (mode === \"light\") {\n setDocumentMode(\"light\");\n localStorage.setItem(\"prefers-dark-mode\", \"false\");\n setMode(\"light\");\n } else if (mode === \"dark\") {\n setDocumentMode(\"dark\");\n localStorage.setItem(\"prefers-dark-mode\", \"true\");\n setMode(\"dark\");\n } else {\n const preferredMode = prefersDarkModeQuery() ? \"dark\" : \"light\";\n setDocumentMode(preferredMode);\n localStorage.removeItem(\"prefers-dark-mode\");\n setMode(preferredMode);\n }\n }, [prefersDarkModeQuery]);\n\n return useMemo(() => ({\n mode,\n setMode: setModeInternal\n }), [mode, setModeInternal]);\n}\n","import React, { createContext, useContext, useState, useCallback, useMemo, useRef } from \"react\";\nimport type { RebaseRegistryController, RebaseAdminConfig, RebaseStudioConfig, RebaseAuthConfig } from \"@rebasepro/types\";\n\n/**\n * Split into two contexts to prevent infinite re-render loops:\n * - DispatchContext: stable register/unregister functions (never changes identity)\n * - StateContext: the current config values (changes when modules register)\n *\n * Feature components (RebaseAuth, RebaseAdmin, RebaseStudio) only consume\n * the dispatch context, so registering does NOT cause them to re-render.\n * RebaseShell consumes state context to read the collected configs.\n */\n\ninterface RegistryDispatch {\n registerCMS: (config: RebaseAdminConfig) => void;\n unregisterCMS: () => void;\n registerStudio: (config: RebaseStudioConfig) => void;\n unregisterStudio: () => void;\n registerAuth: (config: RebaseAuthConfig) => void;\n unregisterAuth: () => void;\n}\n\ninterface RegistryState {\n cmsConfig: RebaseAdminConfig | null;\n studioConfig: RebaseStudioConfig | null;\n authConfig: RebaseAuthConfig | null;\n}\n\nconst RegistryDispatchContext = createContext<RegistryDispatch | undefined>(undefined);\nconst RegistryStateContext = createContext<RegistryState>({\n cmsConfig: null,\n studioConfig: null,\n authConfig: null\n});\n\nexport function RebaseRegistryProvider({ children }: { children: React.ReactNode }) {\n const [cmsConfig, setCmsConfig] = useState<RebaseAdminConfig | null>(null);\n const [studioConfig, setStudioConfig] = useState<RebaseStudioConfig | null>(null);\n const [authConfig, setAuthConfig] = useState<RebaseAuthConfig | null>(null);\n\n // Dispatch functions are stable — never change identity\n const dispatch = useMemo<RegistryDispatch>(() => ({\n registerCMS: (config: RebaseAdminConfig) => setCmsConfig(config),\n unregisterCMS: () => setCmsConfig(null),\n registerStudio: (config: RebaseStudioConfig) => setStudioConfig(config),\n unregisterStudio: () => setStudioConfig(null),\n registerAuth: (config: RebaseAuthConfig) => setAuthConfig(config),\n unregisterAuth: () => setAuthConfig(null)\n }), []);\n\n const state = useMemo<RegistryState>(() => ({\n cmsConfig,\nstudioConfig,\nauthConfig\n }), [cmsConfig, studioConfig, authConfig]);\n\n return (\n <RegistryDispatchContext.Provider value={dispatch}>\n <RegistryStateContext.Provider value={state}>\n {children}\n </RegistryStateContext.Provider>\n </RegistryDispatchContext.Provider>\n );\n}\n\n/**\n * Returns the full registry (state + dispatch).\n * Use this in RebaseShell where you need to read configs.\n */\nexport function useRebaseRegistry(): RebaseRegistryController {\n const dispatch = useContext(RegistryDispatchContext);\n const state = useContext(RegistryStateContext);\n if (!dispatch) {\n throw new Error(\"useRebaseRegistry must be used within RebaseRegistryProvider\");\n }\n return useMemo(() => ({ ...state,\n...dispatch }), [state, dispatch]);\n}\n\n/**\n * Returns only the stable dispatch functions.\n * Use this in feature components (RebaseAuth, RebaseAdmin, RebaseStudio)\n * to avoid re-render loops.\n */\nexport function useRebaseRegistryDispatch(): RegistryDispatch {\n const dispatch = useContext(RegistryDispatchContext);\n if (!dispatch) {\n throw new Error(\"useRebaseRegistryDispatch must be used within RebaseRegistryProvider\");\n }\n return dispatch;\n}\n","/**\n * React hook for using backend storage API as a StorageSource\n */\n\nimport { useMemo, useCallback } from \"react\";\nimport {\n StorageSource,\n UploadFileProps,\n UploadFileResult,\n DownloadConfig,\n StorageListResult\n} from \"@rebasepro/types\";\n\nexport interface BackendStorageSourceProps {\n /**\n * Backend API URL (e.g., 'http://localhost:3001')\n */\n apiUrl: string;\n /**\n * Function to get the current auth token\n */\n getAuthToken: () => Promise<string>;\n}\n\n/**\n * Hook to create a StorageSource that uses the backend storage REST API.\n * Use this for self-hosted Rebase with local or S3 storage.\n *\n * @example\n * ```tsx\n * const storageSource = useBackendStorageSource({\n * apiUrl: 'http://localhost:3001',\n * getAuthToken: authController.getAuthToken\n * });\n *\n * // Then pass to Rebase:\n * <Rebase storageSource={storageSource} ... />\n * ```\n */\nexport function useBackendStorageSource({\n apiUrl,\n getAuthToken\n}: BackendStorageSourceProps): StorageSource {\n\n const storageBasePath = `${apiUrl}/api/storage`;\n\n // Cache for download URLs to avoid redundant API calls\n const urlsCache = useMemo(() => new Map<string, DownloadConfig>(), []);\n\n /**\n * Make an authenticated request to the storage API\n */\n const fetchWithAuth = useCallback(async (\n url: string,\n options: RequestInit = {}\n ): Promise<Response> => {\n const token = await getAuthToken();\n return fetch(url, {\n ...options,\n headers: {\n ...options.headers,\n \"Authorization\": `Bearer ${token}`\n }\n });\n }, [getAuthToken]);\n\n /**\n * Upload a file to storage\n */\n const putObject = useCallback(async ({\n file,\n key,\n metadata,\n bucket\n }: UploadFileProps): Promise<UploadFileResult> => {\n const formData = new FormData();\n formData.append(\"file\", file);\n\n if (key) {\n formData.append(\"key\", key);\n }\n if (bucket) {\n formData.append(\"bucket\", bucket);\n }\n\n // Add metadata fields with prefix\n if (metadata) {\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== undefined && value !== null) {\n formData.append(\n `metadata_${key}`,\n typeof value === \"string\" ? value : JSON.stringify(value)\n );\n }\n }\n }\n\n const response = await fetchWithAuth(`${storageBasePath}/upload`, {\n method: \"POST\",\n body: formData\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Upload failed\" }));\n throw new Error(error.error || \"Upload failed\");\n }\n\n const result = await response.json();\n return result.data;\n }, [fetchWithAuth, storageBasePath]);\n\n /**\n * Get download URL for a file\n */\n const getSignedUrl = useCallback(async (\n keyOrUrl: string,\n bucket?: string\n ): Promise<DownloadConfig> => {\n // Check cache first\n const cacheKey = bucket ? `${bucket}/${keyOrUrl}` : keyOrUrl;\n const cached = urlsCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n // Build the file path for the API\n let filePath = keyOrUrl;\n\n // Handle local:// and s3:// URLs\n if (filePath && (filePath.startsWith(\"local://\") || filePath.startsWith(\"s3://\"))) {\n const withoutProtocol = filePath.substring(filePath.indexOf(\"://\") + 3);\n filePath = withoutProtocol;\n }\n\n // If bucket is provided separately, prepend it\n if (bucket && filePath && !filePath.startsWith(bucket)) {\n filePath = `${bucket}/${filePath}`;\n }\n\n if (!filePath || filePath.trim() === \"\" || filePath === \"/\") {\n return { url: null,\nfileNotFound: true };\n }\n\n const response = await fetchWithAuth(`${storageBasePath}/metadata/${filePath}`);\n\n if (response.status === 404) {\n return {\n url: null,\n fileNotFound: true\n };\n }\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Failed to get download URL\" }));\n throw new Error(error.error || \"Failed to get download URL\");\n }\n\n const result = await response.json();\n\n const token = await getAuthToken();\n const tokenQuery = token ? `?token=${token}` : \"\";\n\n // The URL should point to the storage file endpoint\n const downloadConfig: DownloadConfig = {\n url: `${storageBasePath}/file/${filePath}${tokenQuery}`,\n metadata: result.data\n };\n\n // Cache the result\n urlsCache.set(cacheKey, downloadConfig);\n\n return downloadConfig;\n }, [fetchWithAuth, storageBasePath, urlsCache]);\n\n /**\n * Get file as a File object\n */\n const getObject = useCallback(async (\n key: string,\n bucket?: string\n ): Promise<File | null> => {\n let filePath = key;\n\n // Handle protocol URLs\n if (filePath && (filePath.startsWith(\"local://\") || filePath.startsWith(\"s3://\"))) {\n const withoutProtocol = filePath.substring(filePath.indexOf(\"://\") + 3);\n filePath = withoutProtocol;\n }\n\n if (bucket && filePath && !filePath.startsWith(bucket)) {\n filePath = `${bucket}/${filePath}`;\n }\n\n if (!filePath || filePath.trim() === \"\" || filePath === \"/\") {\n return null;\n }\n\n const response = await fetchWithAuth(`${storageBasePath}/file/${filePath}`);\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n throw new Error(\"Failed to get file\");\n }\n\n const blob = await response.blob();\n const fileName = filePath.split(\"/\").pop() || \"file\";\n return new File([blob], fileName, { type: blob.type });\n }, [fetchWithAuth, storageBasePath]);\n\n /**\n * Delete a file\n */\n const deleteObject = useCallback(async (\n key: string,\n bucket?: string\n ): Promise<void> => {\n let filePath = key;\n\n // Handle protocol URLs\n if (filePath && (filePath.startsWith(\"local://\") || filePath.startsWith(\"s3://\"))) {\n const withoutProtocol = filePath.substring(filePath.indexOf(\"://\") + 3);\n filePath = withoutProtocol;\n }\n\n if (bucket && filePath && !filePath.startsWith(bucket)) {\n filePath = `${bucket}/${filePath}`;\n }\n\n if (!filePath || filePath.trim() === \"\" || filePath === \"/\") {\n return;\n }\n\n const response = await fetchWithAuth(`${storageBasePath}/file/${filePath}`, {\n method: \"DELETE\"\n });\n\n if (!response.ok && response.status !== 404) {\n const error = await response.json().catch(() => ({ error: \"Failed to delete file\" }));\n throw new Error(error.error || \"Failed to delete file\");\n }\n\n // Clear from cache\n urlsCache.delete(bucket ? `${bucket}/${key}` : key);\n }, [fetchWithAuth, storageBasePath, urlsCache]);\n\n /**\n * List files in a path\n */\n const listObjects = useCallback(async (\n prefix: string,\n options?: {\n bucket?: string;\n maxResults?: number;\n pageToken?: string;\n }\n ): Promise<StorageListResult> => {\n const params = new URLSearchParams();\n if (prefix) params.set(\"prefix\", prefix);\n if (options?.bucket) params.set(\"bucket\", options.bucket);\n if (options?.maxResults) params.set(\"maxResults\", String(options.maxResults));\n if (options?.pageToken) params.set(\"pageToken\", options.pageToken);\n\n const response = await fetchWithAuth(\n `${storageBasePath}/list?${params.toString()}`\n );\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Failed to list files\" }));\n throw new Error(error.error || \"Failed to list files\");\n }\n\n const result = await response.json();\n return result.data;\n }, [fetchWithAuth, storageBasePath]);\n\n // Return memoized StorageSource\n return useMemo<StorageSource>(() => ({\n putObject,\n getSignedUrl,\n getObject,\n deleteObject,\n listObjects\n }), [putObject, getSignedUrl, getObject, deleteObject, listObjects]);\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport { useAuthController } from \"./useAuthController\";\nimport { Entity } from \"@rebasepro/types\";\nimport { canCreateEntity, canEditEntity, canDeleteEntity, canReadCollection } from \"@rebasepro/common\";\nimport { useCallback, useMemo } from \"react\";\n\n/**\n * Hook to evaluate roles and permissions for the current user.\n * It abstracts away the need to pass `authController` to permission evaluation functions.\n */\nexport function usePermissions() {\n const authController = useAuthController();\n\n const canCreate = useCallback(\n (collection: CollectionConfig<any>, path: string) =>\n canCreateEntity(collection, authController, path, null),\n [authController]\n );\n\n const canEdit = useCallback(\n (collection: CollectionConfig<any>, path: string, entity: Entity<any> | null) =>\n canEditEntity(collection, authController, path, entity),\n [authController]\n );\n\n const canDelete = useCallback(\n (collection: CollectionConfig<any>, path: string, entity: Entity<any> | null) =>\n canDeleteEntity(collection, authController, path, entity),\n [authController]\n );\n\n const canRead = useCallback(\n (collection: CollectionConfig<any>) =>\n canReadCollection(collection, authController),\n [authController]\n );\n\n return useMemo(() => ({\n canCreate,\n canEdit,\n canDelete,\n canRead\n }), [canCreate, canEdit, canDelete, canRead]);\n}\n","import React, { useContext } from \"react\";\n\n/**\n * Configuration for API connectivity. Passed once at the top level\n * and available to any hook that needs `apiUrl` or `getAuthToken`.\n *\n * Individual hooks can still accept explicit overrides — this context\n * serves as a fallback to eliminate repetitive threading.\n */\nexport interface ApiConfig {\n apiUrl: string;\n getAuthToken?: () => Promise<string | null>;\n}\n\nconst ApiConfigContext = React.createContext<ApiConfig | undefined>(undefined);\n\n/**\n * Read the API config from context. Returns `undefined` if no provider is present,\n * allowing hooks to fall back to their own props.\n */\nexport function useApiConfig(): ApiConfig | undefined {\n return useContext(ApiConfigContext);\n}\n\n/**\n * Provide API configuration (apiUrl, getAuthToken) to the entire subtree.\n * Typically rendered inside `<Rebase>` or at the app root.\n */\nexport function ApiConfigProvider({\n apiUrl,\n getAuthToken,\n children\n}: ApiConfig & { children: React.ReactNode }) {\n const value = React.useMemo(() => ({ apiUrl,\ngetAuthToken }), [apiUrl, getAuthToken]);\n return (\n <ApiConfigContext.Provider value={value}>\n {children}\n </ApiConfigContext.Provider>\n );\n}\n","import { useTranslation as useI18nTranslation } from \"react-i18next\";\nimport { useCallback, useMemo } from \"react\";\n\nconst REBASE_NS = \"rebase_core\";\n\n/**\n * Internal hook for translating Rebase UI strings.\n *\n * Uses the `rebase_core` i18next namespace that is initialised by\n * `RebaseI18nProvider`. Do NOT use `react-i18next` directly in internal\n * components — always go through this hook so the namespace is consistent.\n *\n * @example\n * const { t } = useTranslation();\n * <Button>{t(\"save\")}</Button>\n *\n * @internal\n */\nexport function useTranslation() {\n const { t, i18n } = useI18nTranslation(REBASE_NS);\n\n /**\n * Typed translation function scoped to RebaseTranslations keys.\n * Also supports i18next interpolation variables, e.g.\n * t(\"add_to_field\", { fieldName: \"Tags\" })\n * t(\"error_deleting\", { message: err.message })\n */\n const typedT = useCallback((key: string, vars?: Record<string, string>): string =>\n t(key, vars) as string, [t]);\n\n return useMemo(() => ({ t: typedT,\ni18n }), [typedT, i18n]);\n}\n","import React, { lazy, useMemo } from \"react\";\nimport type { ComponentRef, LazyComponentRef } from \"@rebasepro/types\";\nimport { isLazyComponentRef } from \"@rebasepro/types\";\n\n/**\n * Internal cache for resolved lazy components.\n *\n * `React.lazy()` must return the SAME wrapper across renders — if we call\n * `lazy(loader)` on every render, React will treat each result as a new\n * component type and unmount/remount on each render cycle.\n *\n * This WeakMap keeps a stable mapping from a `ComponentRef` (object/function)\n * to the `React.lazy()` wrapper it produced. Strings are keyed by a separate\n * plain Map since they can't be WeakMap keys.\n */\n\nconst lazyCache = new WeakMap<object | ((...args: any[]) => any), React.ComponentType<any>>();\n\n/**\n * Resolves a `ComponentRef` into a renderable `React.ComponentType`.\n *\n * This hook handles all three forms of `ComponentRef`:\n *\n * 1. **`LazyComponentRef`** (produced by the Vite plugin from string paths):\n * Wraps the lazy loader with `React.lazy()` for automatic code-splitting.\n *\n * 2. **`() => Promise<{ default: ComponentType }>`** (manual lazy import):\n * Also wraps with `React.lazy()`. Distinguished from regular components\n * by checking that the function has no parameters and is not a known\n * React internal (no `$$typeof`).\n *\n * 3. **Direct `React.ComponentType`**:\n * Returned as-is.\n *\n * If the ref is `undefined` or a raw string (which should never happen at\n * runtime in the browser since the Vite plugin transforms strings), returns `undefined`.\n *\n * The returned component is stable across re-renders as long as the `ref`\n * is referentially stable.\n *\n * **Usage:** Wrap the rendered component in `<Suspense>` to handle the\n * loading state of lazy components.\n *\n * @example\n * ```tsx\n * const ResolvedField = useResolvedComponent(property.ui?.Field);\n * if (!ResolvedField) return null;\n * return (\n * <Suspense fallback={<CircularProgress />}>\n * <ResolvedField {...fieldProps} />\n * </Suspense>\n * );\n * ```\n * */\nexport function useResolvedComponent<P = unknown>(\n ref: ComponentRef<P> | undefined\n): React.ComponentType<P> | undefined {\n return useMemo(() => resolveComponentRef(ref), [ref]);\n}\n\n/**\n * Wraps a loader function with `React.lazy()`, caching the result so the\n * same loader always returns the same lazy component identity.\n */\nfunction getOrCreateLazy<P>(\n key: object | ((...args: any[]) => any),\n loader: () => Promise<{ default: React.ComponentType<P> }>\n): React.ComponentType<P> {\n const cached = lazyCache.get(key);\n if (cached) return cached as React.ComponentType<P>;\n\n // SAFETY: React.lazy returns LazyExoticComponent which is structurally compatible with ComponentType<P>\n const LazyComponent = lazy(loader) as React.ComponentType<P>;\n lazyCache.set(key, LazyComponent);\n return LazyComponent;\n}\n\n/**\n * Pure function version of the resolver, for use outside React components.\n * Same resolution logic as `useResolvedComponent`.\n *\n * Results are cached per reference identity — calling this multiple times\n * with the same `ref` object returns the same `React.ComponentType`.\n */\nexport function resolveComponentRef<P = unknown>(\n ref: ComponentRef<P> | undefined\n): React.ComponentType<P> | undefined {\n if (ref == null) return undefined;\n\n // 1. String — should not happen at runtime (Vite transforms them).\n // Log a warning and bail out.\n if (typeof ref === \"string\") {\n console.warn(\n `[Rebase] Encountered a raw string ComponentRef (\"${ref}\") at runtime. ` +\n \"This usually means the Vite transform plugin did not process this file. \" +\n \"Ensure the file is inside the configured collectionsDir.\"\n );\n return undefined;\n }\n\n // 2. LazyComponentRef — produced by the Vite plugin from string paths.\n // The object has { __rebaseLazy: true, load: () => import(...) }.\n if (isLazyComponentRef(ref)) {\n return getOrCreateLazy<P>(\n ref as object,\n () => (ref as LazyComponentRef<P>).load()\n );\n }\n\n // 3. Function — either a React component or a lazy import loader.\n if (typeof ref === \"function\") {\n const fn = ref as (...args: any[]) => any;\n\n // Class components (React.Component / PureComponent) have this flag\n if (fn.prototype?.isReactComponent) {\n return ref as React.ComponentType<P>;\n }\n\n // React internals (forwardRef, memo, etc.) carry $$typeof\n if (\"$$typeof\" in fn) {\n return ref as React.ComponentType<P>;\n }\n\n // A function with declared parameters (fn.length > 0) is a regular\n // component that accepts props — return as-is.\n if (fn.length > 0) {\n return ref as React.ComponentType<P>;\n }\n\n // Zero-parameter function — could be a React component with no props\n // OR a lazy loader `() => import(...)`. We distinguish by checking\n // if `fn.name` looks like a component (starts with uppercase) or is\n // an anonymous arrow.\n //\n // Convention: named function components always start with an\n // uppercase letter. Dynamic import wrappers are typically anonymous\n // arrows or have lowercase names.\n const name = fn.name;\n if (name && /^[A-Z]/.test(name)) {\n // Named component (e.g. `function MyField() { ... }`) — return as-is\n return ref as React.ComponentType<P>;\n }\n\n // Treat as a lazy loader — wrap with React.lazy, cached by identity.\n return getOrCreateLazy<P>(\n fn,\n ref as () => Promise<{ default: React.ComponentType<P> }>\n );\n }\n\n // 4. React wrapper objects (React.forwardRef, React.memo) —\n // These are objects with $$typeof but are not functions.\n if (typeof ref === \"object\" && \"$$typeof\" in (ref as object)) {\n return ref as unknown as React.ComponentType<P>;\n }\n\n // 5. Unknown shape — return undefined to be safe\n return undefined;\n}\n","import React, { useContext, useMemo } from \"react\";\nimport type { OverridableComponentName } from \"@rebasepro/types\";\nimport { ComponentOverrideContext } from \"../contexts/ComponentOverrideContext\";\n\n/**\n * Resolves a potentially overridden component.\n *\n * Resolution order:\n * 1. Collection-scoped override (highest priority)\n * 2. Global override\n * 3. Default component (fallback)\n *\n * Supports two override modes:\n * - **Eject** (default): The override component fully replaces the default.\n * - **Wrap** (`wrap: true`): The override component wraps the default.\n * The default is passed as `OriginalComponent` in props.\n *\n * @param name - The overridable component name (e.g. `\"Entity.Form\"`)\n * @param DefaultComponent - The built-in default component\n * @returns The resolved component — either the default, a full replacement, or a wrapper\n *\n * @example\n * ```tsx\n * import { useComponentOverride } from \"@rebasepro/app\";\n *\n * function EntityFormWrapper(props: EntityFormProps) {\n * const ResolvedForm = useComponentOverride(\"Entity.Form\", DefaultEntityForm);\n * return <ResolvedForm {...props} />;\n * }\n * ```\n *\n * @group Hooks\n */\nexport function useComponentOverride<P>(\n name: OverridableComponentName,\n DefaultComponent: React.ComponentType<P>\n): React.ComponentType<P> {\n const { globalOverrides, collectionOverrides } = useContext(ComponentOverrideContext);\n\n return useMemo(() => {\n // Collection-level overrides have highest priority\n const override = collectionOverrides[name] ?? globalOverrides[name];\n\n if (!override) return DefaultComponent;\n\n if (override.wrap) {\n // Wrapping mode: inject OriginalComponent as a prop\n const UserComponent = override.Component;\n const Wrapper = (props: P) => (\n <UserComponent {...(props as Record<string, unknown>)} OriginalComponent={DefaultComponent} />\n );\n Wrapper.displayName = `Wrapped(${name})`;\n return Wrapper as React.ComponentType<P>;\n }\n\n // Eject mode: full replacement\n return override.Component as React.ComponentType<P>;\n }, [collectionOverrides, globalOverrides, name, DefaultComponent]);\n}\n","import React from \"react\";\nimport { Tooltip, TooltipProps } from \"@rebasepro/ui\";\n\nexport function ErrorTooltip(props: TooltipProps) {\n return (\n <Tooltip {...props}\n className={props.className}\n tooltipClassName={\"text-red-500! bg-red-50\"}>\n {props.children}\n </Tooltip>\n );\n}\n","import React from \"react\";\nimport { ErrorTooltip } from \"./ErrorTooltip\";\nimport { AlertTriangleIcon, Button, Typography, iconSize } from \"@rebasepro/ui\";\n\n/**\n * @group Components\n */\nexport interface ErrorViewProps {\n title?: string;\n error: Error | React.ReactElement | string,\n tooltip?: string,\n onRetry?: () => void;\n}\n\n/**\n * Generic error view. Displayed for example when an unexpected value comes\n * from the driver in a collection view.\n * @param title\n * @param error\n * @param tooltip\n * @param onRetry\n\n * @group Components\n */\nexport function ErrorView({\n title,\n error,\n tooltip,\n onRetry\n}: ErrorViewProps): React.ReactElement {\n const message = error instanceof Error ? error.message : error;\n // Extract error code from ApiError instances (e.g. PG error codes like \"42P01\")\n const errorCode = error instanceof Error && \"code\" in error\n ? (error as Error & { code?: string }).code\n : undefined;\n\n const body = (\n <div className=\"flex flex-col m-2\">\n <div className=\"flex items-start gap-2.5\">\n <AlertTriangleIcon\n size={iconSize.smallest}\n className=\"shrink-0 text-red-500 dark:text-red-400 mt-0.5\"\n />\n <div className=\"flex-1 min-w-0\">\n {title && (\n <Typography\n variant=\"body2\"\n color=\"primary\"\n className=\"font-semibold mb-0.5\"\n >\n {title}\n </Typography>\n )}\n <Typography\n variant=\"body2\"\n color=\"secondary\"\n className=\"leading-relaxed\"\n >\n {message}\n </Typography>\n {errorCode && (\n <span\n className=\"inline-block mt-1 px-1.5 py-0.5 text-[10px] font-mono rounded bg-surface-200 dark:bg-surface-700 text-text-secondary\"\n >\n {errorCode}\n </span>\n )}\n {onRetry && (\n <div className=\"mt-3\">\n <Button\n variant=\"outlined\"\n color=\"neutral\"\n size=\"small\"\n onClick={onRetry}\n className=\"font-semibold\"\n >\n Try again\n </Button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n\n if (tooltip) {\n return (\n <ErrorTooltip title={tooltip}>\n {body}\n </ErrorTooltip>\n );\n }\n return body;\n}\n","import React from \"react\";\nimport { deepEqual as equal } from \"fast-equals\";\n\n/**\n * Hack to prevent data updates for incomplete callbacks from Firestore\n * triggers.\n * If any deps change, the update is immediate\n * @param data\n * @param deps\n * @param timeoutMs\n */\nexport function useDebouncedData<T>(data: T[], deps: unknown, timeoutMs = 5000) {\n\n const [deferredData, setDeferredData] = React.useState(data);\n const dataLength = React.useRef(deferredData.length ?? 0);\n const pendingUpdate = React.useRef(false);\n const currentDeps = React.useRef(deps);\n\n const haveDepsChanged = !equal(currentDeps.current, deps);\n const immediateUpdate = data.length >= dataLength.current || haveDepsChanged;\n\n React.useEffect(() => {\n\n const performUpdate = () => {\n if (!equal(deferredData, data)) {\n currentDeps.current = deps;\n dataLength.current = data.length;\n setDeferredData(data);\n }\n pendingUpdate.current = false;\n };\n\n pendingUpdate.current = true;\n\n let handler: ReturnType<typeof setTimeout> | undefined;\n if (immediateUpdate)\n performUpdate()\n else\n handler = setTimeout(performUpdate, timeoutMs);\n\n return () => {\n clearTimeout(handler);\n if (pendingUpdate.current && immediateUpdate)\n performUpdate();\n };\n }, [data, timeoutMs, deps, immediateUpdate]);\n\n return immediateUpdate ? data : deferredData;\n}\n","import type { CollectionConfig, Property, MapProperty, Properties } from \"@rebasepro/types\";\nimport { useMemo } from \"react\";\n;\nimport { getSubcollections } from \"@rebasepro/common\";\n\n/**\n * Get a property in a property tree from a dot-path like `address.street`.\n * Inlined here to avoid importing property-aware utilities from the CMS layer.\n */\nfunction getPropertyInPath(properties: Properties, path: string): Property | undefined {\n if (typeof properties === \"object\") {\n if (path in properties) {\n return (properties as Record<string, Property>)[path];\n }\n if (path.includes(\".\")) {\n const pathSegments = path.split(\".\");\n const childProperty = (properties as Record<string, Property>)[pathSegments[0]];\n if (typeof childProperty === \"object\" && childProperty.type === \"map\" && childProperty.properties) {\n return getPropertyInPath(childProperty.properties, pathSegments.slice(1).join(\".\"));\n }\n }\n }\n return undefined;\n}\n\nexport type PropertyColumnConfig = {\n key: string;\n disabled: boolean;\n};\n\nexport function getSubcollectionColumnId(collection: CollectionConfig<any>) {\n return `subcollection:${collection.slug}`;\n}\nexport function useColumnIds<M extends Record<string, any>>(collection: CollectionConfig<M>, includeSubcollections: boolean): PropertyColumnConfig[] {\n return useMemo(() => {\n if (collection.propertiesOrder) {\n return hideAndExpandKeys(collection, collection.propertiesOrder);\n }\n return getDefaultColumnKeys(collection, includeSubcollections);\n }, [collection, includeSubcollections]);\n}\n\nfunction hideAndExpandKeys<M extends Record<string, any>>(collection: CollectionConfig<M>, keys: string[]): PropertyColumnConfig[] {\n\n // First, figure out which spread map roots have individual child keys in the order\n // If so, we should NOT auto-expand them - just use the explicit child keys\n const rootsWithExplicitChildren = new Set<string>();\n for (const key of keys) {\n if (key.includes(\".\")) {\n const rootKey = key.split(\".\")[0];\n const rootProperty = collection.properties[rootKey];\n if (rootProperty && rootProperty.type === \"map\" && rootProperty.ui?.spreadChildren && rootProperty.properties) {\n rootsWithExplicitChildren.add(rootKey);\n }\n }\n }\n\n // Track processed keys to avoid duplicates\n const processedPropertyKeys = new Set<string>();\n\n const result = keys.flatMap((key) => {\n // Skip if already processed (handles duplicates in propertiesOrder)\n if (processedPropertyKeys.has(key)) return [null];\n\n // Check if it's a top-level property\n const property = collection.properties[key];\n if (property) {\n processedPropertyKeys.add(key);\n if (property.ui?.hideFromCollection)\n return [null];\n if (property.ui?.disabled && typeof property.ui?.disabled === \"object\" && property.ui?.disabled.hidden)\n return [null];\n\n if (property.type === \"map\" && property.ui?.spreadChildren && property.properties) {\n // Check if this spread map has explicit child keys in propertiesOrder\n if (rootsWithExplicitChildren.has(key)) {\n // DON'T auto-expand - the children are explicitly listed elsewhere\n return [null];\n }\n // Auto-expand all children\n const childConfigs = getColumnKeysForProperty(property, key);\n childConfigs.forEach(c => processedPropertyKeys.add(c.key));\n return childConfigs;\n }\n return [{\n key,\n disabled: Boolean(property.ui?.disabled) || Boolean(property.ui?.readOnly)\n }];\n }\n\n // Check if it's a nested key like \"data.mode\" (for spread map properties)\n if (key.includes(\".\")) {\n const rootKey = key.split(\".\")[0];\n const rootProperty = collection.properties[rootKey];\n\n if (rootProperty && rootProperty.type === \"map\" && rootProperty.properties) {\n const nestedProperty = getPropertyInPath(collection.properties, key) as Property | undefined;\n if (nestedProperty) {\n processedPropertyKeys.add(key);\n // Mark root as seen\n processedPropertyKeys.add(rootKey);\n\n if (nestedProperty.ui?.hideFromCollection)\n return [null];\n if (nestedProperty.ui?.disabled && typeof nestedProperty.ui?.disabled === \"object\" && nestedProperty.ui?.disabled.hidden)\n return [null];\n\n return [{\n key,\n disabled: Boolean(rootProperty.ui?.disabled) || Boolean(rootProperty.ui?.readOnly) ||\n Boolean(nestedProperty.ui?.disabled) || Boolean(nestedProperty.ui?.readOnly)\n }];\n }\n }\n }\n\n // Check additional fields\n const additionalField = collection.additionalFields?.find(field => field.key === key);\n if (additionalField) {\n return [{\n key,\n disabled: true\n }];\n }\n\n // Check subcollections\n const subcollections = getSubcollections(collection);\n if (subcollections) {\n const subCollection = subcollections\n .find(subCol => getSubcollectionColumnId(subCol) === key);\n if (subCollection) {\n return [{\n key,\n disabled: true\n }];\n }\n }\n\n return [null];\n }).filter(Boolean) as PropertyColumnConfig[];\n\n // Add any missing properties that weren't in propertiesOrder\n // This ensures properties NEVER disappear\n for (const propKey of Object.keys(collection.properties)) {\n // Skip if already processed\n if (processedPropertyKeys.has(propKey)) continue;\n\n const property = collection.properties[propKey];\n if (!property) continue;\n if (property.ui?.hideFromCollection) continue;\n if (property.ui?.disabled && typeof property.ui?.disabled === \"object\" && property.ui?.disabled.hidden) continue;\n\n if (property.type === \"map\" && property.ui?.spreadChildren && property.properties) {\n // For spread maps, add all children that weren't already added\n const allChildConfigs = getColumnKeysForProperty(property as MapProperty, propKey);\n for (const childConfig of allChildConfigs) {\n if (!processedPropertyKeys.has(childConfig.key)) {\n result.push(childConfig);\n processedPropertyKeys.add(childConfig.key);\n }\n }\n } else {\n result.push({\n key: propKey,\n disabled: Boolean(property.ui?.disabled) || Boolean(property.ui?.readOnly)\n });\n processedPropertyKeys.add(propKey);\n }\n }\n\n return result;\n}\n\nfunction getDefaultColumnKeys<M extends Record<string, any> = any>(collection: CollectionConfig<M>, includeSubCollections: boolean) {\n const propertyKeys = Object.keys(collection.properties);\n\n const additionalFields = collection.additionalFields ?? [];\n const subCollections: CollectionConfig[] = getSubcollections(collection) ?? [];\n\n const columnIds: string[] = [\n ...propertyKeys,\n // Filter out additional fields whose key already exists in propertyKeys to avoid duplicate column keys\n ...additionalFields.filter((field) => !propertyKeys.includes(field.key)).map((field) => field.key)\n ];\n\n if (includeSubCollections) {\n const subCollectionIds = subCollections\n .map((collection) => getSubcollectionColumnId(collection));\n columnIds.push(...subCollectionIds.filter((subColId) => !columnIds.includes(subColId)));\n }\n\n return hideAndExpandKeys(collection, columnIds);\n}\n\nexport function getColumnKeysForProperty(property: Property, key: string, disabled?: boolean): PropertyColumnConfig[] {\n if (property.type === \"map\" && property.ui?.spreadChildren && property.properties) {\n return Object.entries(property.properties)\n .flatMap(([childKey, childProperty]) => getColumnKeysForProperty(\n childProperty as Readonly<Property>,\n `${key}.${childKey}`,\n disabled || Boolean(property.ui?.disabled) || Boolean(property.ui?.readOnly))\n );\n }\n return [{\n key,\n disabled: disabled || Boolean(property.ui?.disabled) || Boolean(property.ui?.readOnly)\n }];\n}\n\nexport function getFormFieldKeys(collection: CollectionConfig): string[] {\n const propertyKeys = collection.properties ? Object.keys(collection.properties) : [];\n const additionalFields = collection.additionalFields ?? [];\n const allKeys = [\n ...propertyKeys,\n ...additionalFields.map((field) => field.key)\n ];\n\n if (collection.propertiesOrder) {\n return collection.propertiesOrder.filter(key => allKeys.includes(key));\n }\n return allKeys;\n}\n","import { Entity } from \"@rebasepro/types\";\n\nexport interface DataOrderProps<M extends Record<string, any>> {\n data: Entity<M>[];\n entitiesDisplayedFirst?: Entity<M>[];\n}\n\n/**\n * This hook is used to have some entities at the beginning of data.\n * @param path\n * @param entitiesDisplayedFirst\n * @group Hooks and utilities\n */\nexport function useDataOrder<M extends Record<string, any>>(\n {\n data,\n entitiesDisplayedFirst\n }: DataOrderProps<M>): Entity<M>[] {\n\n if (!entitiesDisplayedFirst)\n return data;\n\n const displayedFirstId = new Set(entitiesDisplayedFirst.map((e) => e.id));\n return [...entitiesDisplayedFirst, ...data.filter((e) => !displayedFirstId.has(e.id))];\n\n}\n","import type { CollectionConfig } from \"@rebasepro/types\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nimport { useData, useRebaseContext } from \"../../hooks\";\nimport { useDataOrder } from \"../../hooks/data/useDataOrder\";\nimport { populateFetchCache } from \"../../hooks/data/useFetch\";\nimport { Entity, EntityReference, EntityRelation, EntityTableController, FilterValues, RebaseContext, SelectedCellProps, User, WhereFilterOp, FindResponse } from \"@rebasepro/types\";\nimport { ScrollRestorationController } from \"./useScrollRestoration\";\n\nexport const DEFAULT_PAGE_SIZE = 50;\n\nexport type DataTableControllerProps<M extends Record<string, any> = any> = {\n /**\n * Full path where the data of this table is located\n */\n path: string;\n /**\n * The collection that is represented by this config.\n */\n collection: CollectionConfig<M>;\n /**\n * List of entities that will be displayed on top, no matter the ordering.\n * This is used for reference fields selection\n */\n entitiesDisplayedFirst?: Entity<M>[];\n\n lastDeleteTimestamp?: number;\n\n /**\n * Force filter to be applied to the table.\n */\n fixedFilter?: FilterValues<string>;\n\n scrollRestoration?: ScrollRestorationController;\n\n /**\n * When set to true the filters and sort will be updated in the URL\n */\n updateUrl?: boolean;\n\n}\n\n/**\n * Use this hook to build a controller for the {@link DataCollectionTable}.\n * This controller is bound to data in a path in your specified driver.\n *\n * Note that you can build your own hook returning a {@link EntityTableController}\n * if you would like to display different data.\n *\n * @param path\n * @param collection\n * @param scrollRestoration\n * @param entitiesDisplayedFirst\n * @param lastDeleteTimestamp\n * @param fixedFilterFromProps\n * @param updateUrl\n */\nexport function useDataTableController<M extends Record<string, any> = any, USER extends User = User>(\n {\n path,\n collection,\n scrollRestoration,\n entitiesDisplayedFirst,\n lastDeleteTimestamp: _lastDeleteTimestamp,\n fixedFilter: fixedFilterFromProps,\n updateUrl\n }: DataTableControllerProps<M>)\n : EntityTableController<M> {\n\n const {\n defaultFilter,\n sort,\n fixedFilter: fixedFilterFromCollection\n } = collection;\n\n const [popupCell, setPopupCell] = React.useState<SelectedCellProps<M> | undefined>(undefined);\n const dataClient = useData();\n\n const fixedFilter = fixedFilterFromProps ?? fixedFilterFromCollection;\n const paginationEnabled = collection.pagination === undefined || Boolean(collection.pagination);\n const pageSize = typeof collection.pagination === \"number\" ? collection.pagination : DEFAULT_PAGE_SIZE;\n\n const location = useLocation();\n\n const [searchString, setSearchString] = React.useState<string | undefined>(() => {\n if (updateUrl) {\n const params = new URLSearchParams(location.search);\n const urlSearch = params.get(\"search\");\n return urlSearch ? decodeURIComponent(urlSearch) : undefined;\n }\n return undefined;\n });\n\n const checkFilterCombination = useCallback((filterValues: FilterValues<any>,\n sortBy?: [string, \"asc\" | \"desc\"]) => {\n // PostgREST/SQL can handle arbitrary filter/sort combinations natively.\n return true;\n }, []);\n\n const sortInternal = useMemo(() => {\n if (sort && fixedFilter && !checkFilterCombination(fixedFilter, sort)) {\n console.warn(\"Initial sort is not compatible with the force filter. Ignoring initial sort\");\n return undefined;\n }\n return sort;\n }, [sort, fixedFilter]);\n\n const {\n filterValues: filterUrl,\n sortBy: sortUrl\n } = parseFilterAndSort(location.search);\n\n const [filterValues, setFilterValues] = React.useState<FilterValues<Extract<keyof M, string> | (string & {})> | undefined>(fixedFilter ?? (updateUrl ? filterUrl : undefined) ?? defaultFilter ?? undefined);\n const [sortBy, setSortBy] = React.useState<[Extract<keyof M, string> | (string & {}), \"asc\" | \"desc\"] | undefined>((updateUrl ? sortUrl : undefined) ?? sortInternal);\n\n // Sync filter/sort state from URL on browser navigation (back/forward).\n // Skip initial mount since useState initializers already handle URL params + collection defaults.\n const initialSearchRef = React.useRef<string | null>(location.search);\n useEffect(() => {\n if (!updateUrl) return;\n // Skip the initial mount - useState already set the correct values\n if (initialSearchRef.current !== null && initialSearchRef.current === location.search) {\n initialSearchRef.current = null;\n return;\n }\n initialSearchRef.current = null;\n\n const { filterValues: urlFilterValues, sortBy: urlSortBy } = parseFilterAndSort(location.search);\n if (!fixedFilter) {\n setFilterValues((urlFilterValues ?? defaultFilter) as FilterValues<Extract<keyof M, string> | (string & {})> | undefined);\n }\n if (urlSortBy && fixedFilter && !checkFilterCombination(fixedFilter, urlSortBy)) {\n console.warn(\"URL sort is not compatible with the force filter.\");\n } else {\n setSortBy(urlSortBy as [Extract<keyof M, string> | (string & {}), \"asc\" | \"desc\"] | undefined);\n }\n\n // Sync search string from URL\n const urlParams = new URLSearchParams(location.search);\n const urlSearch = urlParams.get(\"search\");\n setSearchString(urlSearch ? decodeURIComponent(urlSearch) : undefined);\n }, [location.search, updateUrl, fixedFilter, checkFilterCombination]);\n\n useUpdateUrl(filterValues, sortBy, searchString, updateUrl);\n\n const collectionScroll = scrollRestoration?.getCollectionScroll(path, filterValues);\n const initialItemCount = collectionScroll?.data.length ?? pageSize;\n\n useEffect(() => {\n if (scrollRestoration) {\n scrollRestoration.updateCollectionScroll({\n path,\n scrollOffset: collectionScroll?.scrollOffset ?? 0,\n data: rawData,\n filters: filterValues\n });\n }\n }, []);\n\n const [itemCount, setItemCount] = React.useState<number | undefined>(paginationEnabled ? initialItemCount : undefined);\n\n const sortByProperty = sortBy ? sortBy[0] : undefined;\n const currentSort = sortBy ? sortBy[1] : undefined;\n\n const context: RebaseContext<USER> = useRebaseContext();\n\n const [rawData, setRawData] = useState<Entity<M>[]>(collectionScroll?.data ?? []);\n\n const onScroll = useCallback(({\n scrollOffset\n }: {\n scrollOffset: number\n }) => {\n if (scrollRestoration) {\n scrollRestoration.updateCollectionScroll({\n path,\n scrollOffset,\n data: rawData,\n filters: filterValues\n });\n }\n }, [scrollRestoration, path, rawData, filterValues]);\n\n const [dataLoading, setDataLoading] = useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();\n const [noMoreToLoad, setNoMoreToLoad] = useState<boolean>(false);\n\n const clearFilter = useCallback(() => setFilterValues(fixedFilter ?? defaultFilter ?? undefined), [fixedFilter, defaultFilter]);\n\n const updateFilterValues = useCallback((updatedFilter: FilterValues<Extract<keyof M, string> | (string & {})> | undefined) => {\n if (fixedFilter) {\n console.warn(\"Filter is not compatible with the force filter. Ignoring filter\");\n return;\n }\n if (updatedFilter && Object.keys(updatedFilter).length === 0) {\n setFilterValues(undefined);\n } else {\n setFilterValues(updatedFilter);\n }\n }, [fixedFilter]);\n\n useEffect(() => {\n\n setDataLoading(true);\n\n const onEntitiesUpdate = async (entities: Entity<M>[]) => {\n if (collection.callbacks?.afterRead) {\n try {\n // afterRead operates on flat rows; unwrap the Entity view-model\n // before invoking and re-wrap the processed row after.\n entities = await Promise.all(\n entities.map(async (entity) => {\n const processedRow = await collection.callbacks!.afterRead!({\n collection,\n path,\n row: { id: entity.id, ...entity.values },\n context\n });\n return {\n ...entity,\n values: processedRow as M\n };\n }));\n } catch (_e: unknown) {\n console.error(_e);\n }\n }\n setDataLoading(false);\n setDataLoadingError(undefined);\n setRawData(entities.map(e => ({\n ...e\n // values: sanitizeData(e.values, resolvedCollection.properties)\n })));\n setNoMoreToLoad(!itemCount || entities.length < itemCount);\n\n // Pre-populate the entity fetch cache so that navigating to an\n // entity detail view renders instantly with cached data.\n populateFetchCache(path, entities);\n };\n\n const onError = (error: Error) => {\n console.error(\"ERROR\", error);\n setDataLoading(false);\n setRawData((prev) => prev && prev.length > 0 ? prev : []);\n setDataLoadingError(error);\n };\n\n const accessor = dataClient.collection(path);\n\n // filterValues is already FilterValues — pass directly to the accessor\n const whereParams = filterValues && Object.keys(filterValues).length > 0 ? filterValues : undefined;\n const orderByParams: [string, \"asc\" | \"desc\"] | undefined = sortBy ? [String(sortBy[0]), sortBy[1]] : undefined;\n\n let unsubscribe: (() => void) | undefined;\n\n if (accessor.listen) {\n unsubscribe = accessor.listen({\n where: whereParams,\n limit: itemCount,\n orderBy: orderByParams,\n searchString\n }, (res) => onEntitiesUpdate(res.data as Entity<M>[]), onError);\n } else {\n accessor.find({\n where: whereParams,\n limit: itemCount,\n orderBy: orderByParams,\n searchString\n })\n .then((res) => onEntitiesUpdate(res.data as Entity<M>[]))\n .catch(onError);\n unsubscribe = () => undefined;\n }\n\n return unsubscribe;\n }, [dataClient, path, itemCount, currentSort, sortByProperty, filterValues, searchString]);\n\n\n const orderedData = useDataOrder({\n data: rawData,\n entitiesDisplayedFirst\n });\n\n // hack to fix Firestore listeners firing with incomplete data\n // const data = useDebouncedData(orderedData, {\n // filterValues,\n // sortBy,\n // searchString,\n // lastDeleteTimestamp\n // });\n const data = orderedData;\n\n return useMemo(() => ({\n data,\n dataLoading,\n noMoreToLoad,\n dataLoadingError,\n filterValues,\n setFilterValues: updateFilterValues,\n sortBy,\n setSortBy,\n searchString,\n setSearchString,\n clearFilter,\n itemCount,\n setItemCount,\n initialScroll: collectionScroll?.scrollOffset,\n onScroll,\n paginationEnabled,\n pageSize,\n checkFilterCombination,\n popupCell,\n setPopupCell\n }), [\n data,\n dataLoading,\n noMoreToLoad,\n dataLoadingError,\n filterValues,\n updateFilterValues,\n sortBy,\n searchString,\n clearFilter,\n itemCount,\n collectionScroll?.scrollOffset,\n onScroll,\n paginationEnabled,\n pageSize,\n checkFilterCombination,\n popupCell\n ]);\n}\n\nfunction useUpdateUrl<M extends Record<string, any> = any>(\n filterValues: FilterValues<Extract<keyof M, string>> | undefined,\n sortBy: [Extract<keyof M, string>, \"asc\" | \"desc\"] | undefined,\n searchString: string | undefined,\n updateUrl: boolean | undefined\n) {\n\n useEffect(() => {\n if (updateUrl) {\n // Parse existing URL params to preserve non-filter/sort params like __view\n const existingParams = new URLSearchParams(window.location.search);\n const preservedParams = new URLSearchParams();\n\n // Preserve params that are not filter/sort related\n existingParams.forEach((value, key) => {\n if (key.startsWith(\"__\") && key !== \"__sort\" && key !== \"__sort_order\") {\n preservedParams.set(key, value);\n }\n });\n\n const filterSortState = encodeFilterAndSort(filterValues, sortBy);\n const search = searchString ? `search=${encodeURIComponent(searchString)}` : \"\";\n\n // Combine preserved params with filter/sort state\n const preservedString = preservedParams.toString();\n const parts = [preservedString, filterSortState, search].filter(Boolean);\n const state = parts.join(\"&\");\n\n const hash = window.location.hash;\n if (state === \"\")\n window.history.replaceState({}, \"\", `${window.location.pathname}${hash}`);\n else\n window.history.replaceState({}, \"\", `?${state}${hash}`);\n }\n }, [filterValues, sortBy, searchString, updateUrl]);\n}\n\nfunction encodeFilterAndSort(filterValues?: FilterValues<string>, sortBy?: [string, \"asc\" | \"desc\"] | undefined) {\n const entries: Record<string, string> = {};\n if (sortBy) {\n entries[\"__sort\"] = encodeURIComponent(sortBy[0]);\n entries[\"__sort_order\"] = encodeURIComponent(sortBy[1]);\n }\n if (filterValues) {\n Object.entries(filterValues).forEach(([key, value]) => {\n if (value) {\n const conditions: [WhereFilterOp, unknown][] = Array.isArray(value[0])\n ? (value as [WhereFilterOp, unknown][])\n : [value as [WhereFilterOp, unknown]];\n\n const [op, val] = conditions[0] || [];\n if (op) {\n let encodedValue: unknown = val;\n try {\n if (typeof val === \"object\") {\n if (val instanceof Date) {\n encodedValue = val.toISOString();\n } else if (Array.isArray(val)) {\n encodedValue = JSON.stringify(val, (k, v) => {\n if (v instanceof EntityRelation) {\n return encodeRelation(v);\n }\n if (v instanceof EntityReference) {\n return encodeReference(v);\n }\n return v;\n });\n } else if (val instanceof EntityRelation) {\n encodedValue = encodeRelation(val);\n } else if (val instanceof EntityReference) {\n encodedValue = encodeReference(val);\n }\n }\n } catch (e) {\n encodedValue = val;\n }\n if (encodedValue !== undefined) {\n entries[encodeURIComponent(`${key}_op`)] = encodeURIComponent(op);\n entries[encodeURIComponent(`${key}_value`)] = encodedValue ? encodeURIComponent(String(encodedValue)) : \"null\";\n }\n }\n }\n });\n }\n if (!Object.keys(entries).length) {\n return \"\";\n }\n return Object.entries(entries).map(([key, value]) => `${key}=${value}`).join(\"&\");\n}\n\nfunction parseFilterAndSort<M>(search: string): {\n filterValues: FilterValues<string> | undefined,\n sortBy?: [Extract<keyof M, string>, \"asc\" | \"desc\"]\n} {\n const entries = new URLSearchParams(search);\n const filterValues: FilterValues<string> = {};\n let sortBy: [string, \"asc\" | \"desc\"] | undefined = undefined;\n entries.forEach((value, key) => {\n if (key === \"__sort\") {\n sortBy = [decodeURIComponent(value), entries.get(\"__sort_order\") as \"asc\" | \"desc\"];\n } else if (key.endsWith(\"_op\")) {\n const field = key.replace(\"_op\", \"\");\n const filterOp = decodeURIComponent(value) as WhereFilterOp;\n const filterValStr = entries.get(`${field}_value`);\n if (filterValStr !== null) {\n filterValues[field] = [filterOp, decodeString(filterValStr)];\n }\n }\n });\n\n return {\n filterValues: Object.keys(filterValues).length ? filterValues : undefined,\n sortBy\n }\n}\n\nfunction isDate(dateString: string): boolean {\n // Define a regex pattern that matches the exact date format: 2025-01-07T23:00:00.000Z\n const regexPattern = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n\n // Test the dateString against the regex pattern\n if (!regexPattern.test(dateString)) {\n return false;\n }\n\n // If the regex matches, further validate if it is a valid UTC date\n const date = new Date(dateString);\n return date.toISOString() === dateString;\n}\n\nfunction encodeReference(val: EntityReference) {\n return `ref::${val.path}/${val.id}`;\n}\nfunction encodeRelation(val: EntityRelation) {\n return `rel::${val.path}/${val.id}`;\n}\n\nfunction decodeString(val: string): EntityReference | EntityRelation | Date | string {\n let parsedFilterVal: EntityReference | EntityRelation | Date | string = val;\n if (isDate(val)) {\n try {\n parsedFilterVal = new Date(val);\n } catch (_e) {\n // ignore\n }\n }\n if (typeof parsedFilterVal === \"string\") {\n try {\n parsedFilterVal = JSON.parse(parsedFilterVal, (key, value) => {\n if (typeof value === \"string\") {\n if (value.startsWith(\"ref::\")) {\n const [path, id] = value.substring(5).split(\"/\");\n return new EntityReference({ id,\npath });\n }\n if (value.startsWith(\"rel::\")) {\n const [path, id] = value.substring(5).split(\"/\");\n return new EntityRelation(id, path);\n }\n }\n return value;\n });\n } catch (_e) {\n // ignore\n }\n }\n\n if (typeof parsedFilterVal === \"string\") {\n if (parsedFilterVal.startsWith(\"ref::\")) {\n const [path, id] = parsedFilterVal.substring(5).split(\"/\");\n return new EntityReference({ id,\npath });\n }\n if (parsedFilterVal.startsWith(\"rel::\")) {\n const [path, id] = parsedFilterVal.substring(5).split(\"/\");\n return new EntityRelation(id, path);\n }\n }\n return parsedFilterVal;\n}\n","import { Entity, FilterValues } from \"@rebasepro/types\";\n\nconst collectionScrollCache = new Map<string, { scrollOffset: number, data: Entity<any>[] }>();\n\nexport type ScrollRestorationController = {\n\n getCollectionScroll: (path: string,\n filters?: FilterValues<any>) => {\n scrollOffset: number,\n data: Entity<any>[]\n } | undefined;\n\n updateCollectionScroll: (props: {\n path: string,\n scrollOffset: number,\n filters?: FilterValues<any>;\n data: Entity<any>[]\n }) => void;\n\n}\n\nexport function useScrollRestoration(): ScrollRestorationController {\n\n const updateCollectionScroll = ({\n path,\n filters,\n scrollOffset,\n data\n }: {\n path: string;\n filters?: FilterValues<any>;\n sort?: [string, \"asc\" | \"desc\"];\n scrollOffset: number;\n data: Entity<any>[]\n }) => {\n collectionScrollCache.set(\n createCacheKey(path, filters),\n {\n scrollOffset,\n data\n })\n }\n\n const getCollectionScroll = (path: string,\n filters?: FilterValues<any>) => {\n return collectionScrollCache.get(createCacheKey(path, filters));\n }\n\n return {\n getCollectionScroll,\n updateCollectionScroll\n }\n}\n\nfunction createCacheKey(path: string, filters?: FilterValues<any>) {\n\n if (!filters) {\n return path;\n }\n\n // codify the filters into a url friendly string\n const filtersString = filters ? Object.keys(filters).map(key => {\n const value = JSON.stringify(filters[key]);\n return `${key}=${value}`;\n }).join(\"&\") : \"\";\n\n return `${path}?${filtersString}`;\n}\n","/**\n * @group Components\n */\nexport type TableSize = \"xs\" | \"s\" | \"m\" | \"l\" | \"xl\";\n\nexport function getRowHeight(size: TableSize): number {\n switch (size) {\n case \"xl\":\n return 400;\n case \"l\":\n return 280;\n case \"m\":\n return 140;\n case \"s\":\n return 80;\n case \"xs\":\n return 54;\n default:\n throw Error(\"Missing mapping for collection size -> height\");\n }\n}\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Button, Typography } from \"@rebasepro/ui\";\nimport { useTranslation } from \"../hooks\";\n\nexport function NotFoundPage() {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex w-full h-full\">\n <div className=\"m-auto flex items-center flex-col\"\n >\n <Typography variant={\"h4\"} align={\"center\"}\n gutterBottom={true}>\n {t(\"page_not_found\")}\n </Typography>\n <Typography align={\"center\"} gutterBottom={true}>\n {t(\"page_not_found_body\")}\n </Typography>\n <Button\n variant={\"text\"}\n component={Link}\n to={\"/\"}>{t(\"back_to_home\")}</Button>\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, LoadingButton } from \"@rebasepro/ui\";\nimport { useTranslation } from \"../hooks\";\n\nexport function ConfirmationDialog({\n open,\n onAccept,\n onCancel,\n title,\n loading,\n body\n}: {\n open: boolean,\n onAccept: () => void,\n onCancel: () => void,\n loading?: boolean,\n title: React.ReactNode,\n body?: React.ReactNode,\n}) {\n const { t } = useTranslation();\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => !open ? onCancel() : undefined}\n >\n <DialogTitle variant={\"h6\"} className={\"mb-2\"}>{title}</DialogTitle>\n <DialogContent>\n {body}\n </DialogContent>\n\n <DialogActions>\n <Button\n variant={\"text\"}\n onClick={onCancel}\n autoFocus>{t(\"cancel\")}</Button>\n\n <LoadingButton\n type=\"submit\"\n loading={loading}\n onClick={onAccept}\n autoFocus>\n {t(\"ok\")}\n </LoadingButton>\n </DialogActions>\n </Dialog>\n );\n}\n","import React from \"react\";\n\nexport function RebaseLogo({\n width,\n height,\n className,\n style\n}: {\n width?: string,\n height?: string,\n className?: string,\n style?: React.CSSProperties\n}) {\n return (\n <svg\n width={width ?? \"100%\"} height={height ?? \"100%\"}\n version=\"1.1\"\n style={style}\n className={className}\n viewBox=\"0 0 583 583\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"291.5\" cy=\"291.5\" r=\"291.5\" fill=\"#0070F4\"/>\n <ellipse cx=\"292\" cy=\"291.5\" rx=\"173\" ry=\"173.5\" fill=\"#FF3773\"/>\n <path\n d=\"M465 291.5C465 268.847 460.525 246.416 451.831 225.487C443.137 204.558 430.394 185.542 414.329 169.524C398.265 153.506 379.194 140.8 358.204 132.131C337.215 123.462 314.719 119 292 119C269.281 119 246.785 123.462 225.796 132.131C204.806 140.8 185.735 153.506 169.671 169.524C153.606 185.542 140.863 204.558 132.169 225.487C123.475 246.416 119 268.847 119 291.5L292 291.5H465Z\"\n fill=\"#FFA400\"/>\n </svg>\n );\n\n}\n","import { Wand2Icon } from \"@rebasepro/ui\";\nimport React from \"react\";\n\nexport interface AIIconProps {\n size?: \"smallest\" | \"small\" | \"medium\" | \"large\";\n className?: string;\n}\n\n/**\n * AI-styled AutoAwesome icon with gradient coloring.\n * Used consistently across AI features for visual identification.\n */\nexport function AIIcon({ size = \"small\", className }: AIIconProps) {\n const sizeMap: Record<string, number> = {\n smallest: 16,\n small: 20,\n medium: 24,\n large: 28\n };\n const numericSize = typeof size === \"string\" ? sizeMap[size] || 20 : size;\n\n return (\n <Wand2Icon\n size={numericSize}\n className={className}\n style={{\n background: \"linear-gradient(to right, var(--color-primary), var(--color-secondary))\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\"\n }}\n />\n );\n}\n\n/**\n * Small animated dot indicator for AI-modified elements.\n * Shows a pulsing gradient dot.\n */\nexport function AIModifiedIndicator({ className }: { className?: string }) {\n return (\n <div\n className={`w-2 h-2 rounded-full bg-gradient-to-r from-primary to-secondary animate-pulse ${className ?? \"\"}`}\n title=\"AI modified\"\n />\n );\n}\n","\nimport React from \"react\";\nimport { Button, cls, Container, IconButton, Paper, Separator, Trash2Icon, Typography } from \"@rebasepro/ui\";\n\nexport const UIStyleGuide = () => {\n const typographyVariants = [\n \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"subtitle1\", \"subtitle2\",\n \"body1\", \"body2\",\n \"caption\", \"label\", \"button\"\n ] as const;\n\n const colors = [\"primary\", \"secondary\", \"disabled\", \"error\"] as const;\n const buttonVariants = [\"filled\", \"text\"] as const;\n const buttonColors = [\"primary\", \"secondary\", \"text\", \"error\", \"neutral\"] as const;\n const buttonSizes = [\"small\", \"medium\", \"large\", \"xl\", \"2xl\"] as const;\n\n const IconExample = () => (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 6v6m0 0v6m0-6h6m-6 0H6\"/>\n </svg>\n );\n\n return (\n <Container className=\"py-10 max-w-5xl\">\n <Typography variant=\"h2\" gutterBottom>Rebase UI Style Guide</Typography>\n <Typography variant=\"body1\" color=\"secondary\" className=\"mb-8\">\n A showcase of all typography and button variants available in the @rebasepro/ui library.\n </Typography>\n\n <section className=\"mb-12\">\n <Typography variant=\"h4\" gutterBottom className=\"border-b pb-2 mb-6\">Typography Variants</Typography>\n <Paper className=\"p-6 space-y-6\">\n {typographyVariants.map(variant => (\n <div key={variant} className=\"flex items-center gap-4 border-b border-surface-100 dark:border-surface-950 pb-4 last:border-0\">\n <span className=\"w-24 text-[10px] uppercase tracking-wider text-text-disabled font-mono\">{variant}</span>\n <Typography variant={variant}>\n The quick brown fox jumps over the lazy dog ({variant})\n </Typography>\n </div>\n ))}\n </Paper>\n </section>\n\n <section className=\"mb-12\">\n <Typography variant=\"h4\" gutterBottom className=\"border-b pb-2 mb-6\">Typography Colors</Typography>\n <Paper className=\"p-6 space-y-4\">\n {colors.map(color => (\n <div key={color} className=\"flex items-center gap-4\">\n <span className=\"w-24 text-[10px] uppercase tracking-wider text-text-disabled font-mono\">{color}</span>\n <Typography color={color}>\n This text is rendered with color="{color}"\n </Typography>\n </div>\n ))}\n </Paper>\n </section>\n\n <section className=\"mb-12\">\n <Typography variant=\"h4\" gutterBottom className=\"border-b pb-2 mb-6\">Button Discovery</Typography>\n\n <div className=\"space-y-8\">\n {buttonVariants.map(variant => (\n <div key={variant}>\n <Typography variant=\"h6\" gutterBottom className=\"capitalize mb-4\">{variant} Buttons</Typography>\n <Paper className=\"p-6\">\n <div className=\"flex flex-wrap gap-4\">\n {buttonColors.map(color => (\n <div key={color} className=\"flex flex-col items-center gap-2\">\n <Button variant={variant} color={color}>\n {color}\n </Button>\n <span className=\"text-[10px] text-text-disabled font-mono\">{color}</span>\n </div>\n ))}\n <div className=\"flex flex-col items-center gap-2\">\n <Button variant={variant} color=\"primary\" disabled>\n Disabled\n </Button>\n <span className=\"text-[10px] text-text-disabled font-mono\">disabled</span>\n </div>\n </div>\n </Paper>\n </div>\n ))}\n </div>\n </section>\n\n <section className=\"mb-12\">\n <Typography variant=\"h4\" gutterBottom className=\"border-b pb-2 mb-6\">Button Sizes</Typography>\n <Paper className=\"p-6\">\n <div className=\"flex flex-wrap items-end gap-6 text-center\">\n {buttonSizes.map(size => (\n <div key={size} className=\"flex flex-col items-center gap-4\">\n <Button size={size} color=\"primary\">\n {size}\n </Button>\n <span className=\"text-[10px] text-text-disabled font-mono\">{size}</span>\n </div>\n ))}\n </div>\n </Paper>\n </section>\n\n <section className=\"mb-12\">\n <Typography variant=\"h4\" gutterBottom className=\"border-b pb-2 mb-6\">Icon Buttons</Typography>\n <Paper className=\"p-6\">\n <div className=\"flex flex-wrap gap-8 items-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <IconButton color=\"primary\">\n <IconExample/>\n </IconButton>\n <span className=\"text-[10px] text-text-disabled font-mono\">primary</span>\n </div>\n <div className=\"flex flex-col items-center gap-2\">\n <IconButton color=\"secondary\">\n <IconExample/>\n </IconButton>\n <span className=\"text-[10px] text-text-disabled font-mono\">secondary</span>\n </div>\n <div className=\"flex flex-col items-center gap-2\">\n <IconButton size=\"small\">\n <IconExample/>\n </IconButton>\n <span className=\"text-[10px] text-text-disabled font-mono\">small</span>\n </div>\n <div className=\"flex flex-col items-center gap-2\">\n <IconButton disabled>\n <IconExample/>\n </IconButton>\n <span className=\"text-[10px] text-text-disabled font-mono\">disabled</span>\n </div>\n <div className=\"flex flex-col items-center gap-2\">\n <IconButton size=\"small\" color=\"error\">\n <Trash2Icon/>\n </IconButton>\n <span className=\"text-[10px] text-text-disabled font-mono\">delete</span>\n </div>\n </div>\n </Paper>\n </section>\n\n <section className=\"mb-12\">\n <div className=\"flex justify-between items-center bg-surface-100 dark:bg-surface-950 p-8 rounded-xl border border-dashed border-surface-400\">\n <div>\n <Typography variant=\"h5\">Dark Mode Check</Typography>\n <Typography variant=\"body2\" color=\"secondary\">Typography and buttons should adapt automatically.</Typography>\n </div>\n <Button variant=\"filled\" color=\"neutral\" startIcon={<IconExample/>}>\n Sample Action\n </Button>\n </div>\n </section>\n </Container>\n );\n};\n","import React from \"react\";\nimport {\n Typography,\n cls,\n Card,\n Skeleton\n} from \"@rebasepro/ui\";\nimport {\n Users as UsersIcon,\n DollarSign as DollarSignIcon,\n AlertTriangle,\n TrendingUp\n} from \"lucide-react\";\n\n/* ── Types ────────────────────────────────────────────── */\n\ninterface InsightsData {\n activeClients: number;\n potentialRevenue: number;\n contractedRevenue: number;\n overdueTaskCount: number;\n}\n\nexport interface DashboardMetricsProps {\n loading: boolean;\n insights: InsightsData | null;\n totalInPipeline: number;\n totalRevenue: number;\n}\n\n/* ── Component ────────────────────────────────────────── */\n\nexport function DashboardMetrics({\n loading,\n insights,\n totalInPipeline,\n totalRevenue\n}: DashboardMetricsProps) {\n return (\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-4 mb-6\">\n {/* In Pipeline */}\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center w-5 h-5 text-surface-400 dark:text-surface-500\">\n <UsersIcon className=\"h-4 w-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase tracking-[0.05em] text-[10px]\">In Pipeline</Typography>\n {loading ? (\n <Skeleton className=\"h-7 w-12 mt-0.5\" />\n ) : (\n <Typography variant=\"h5\" className=\"tabular-nums mt-0.5\">\n {totalInPipeline}\n </Typography>\n )}\n </div>\n </div>\n </Card>\n\n {/* Active Clients */}\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center w-5 h-5 text-surface-400 dark:text-surface-500\">\n <TrendingUp className=\"h-4 w-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase tracking-[0.05em] text-[10px]\">Active Clients</Typography>\n {loading ? (\n <Skeleton className=\"h-7 w-12 mt-0.5\" />\n ) : (\n <Typography variant=\"h5\" className=\"tabular-nums mt-0.5\">\n {insights?.activeClients ?? 0}\n </Typography>\n )}\n </div>\n </div>\n </Card>\n\n {/* Total Revenue */}\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center w-5 h-5 text-surface-400 dark:text-surface-500\">\n <DollarSignIcon className=\"h-4 w-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase tracking-[0.05em] text-[10px]\">Revenue</Typography>\n {loading ? (\n <Skeleton className=\"h-7 w-20 mt-0.5\" />\n ) : (\n <div className=\"flex flex-col sm:flex-row sm:items-baseline gap-1 sm:gap-2 mt-0.5\">\n <Typography variant=\"h5\" className=\"tabular-nums\">\n ${totalRevenue.toLocaleString()}\n </Typography>\n {insights && insights.contractedRevenue > 0 && (\n <Typography variant=\"caption\" color=\"secondary\" className=\"text-[10px]\">\n (${insights.contractedRevenue.toLocaleString()} confirmed)\n </Typography>\n )}\n </div>\n )}\n </div>\n </div>\n </Card>\n\n {/* Overdue Tasks */}\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-3\">\n <div className={cls(\n \"flex items-center justify-center w-5 h-5\",\n insights && insights.overdueTaskCount > 0\n ? \"text-red-500\"\n : \"text-surface-400 dark:text-surface-500\"\n )}>\n <AlertTriangle className=\"h-4 w-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase tracking-[0.05em] text-[10px]\">Overdue Tasks</Typography>\n {loading ? (\n <Skeleton className=\"h-7 w-8 mt-0.5\" />\n ) : (\n <Typography variant=\"h5\" className={cls(\n \"tabular-nums mt-0.5\",\n insights && insights.overdueTaskCount > 0 && \"text-red-600 dark:text-red-400\"\n )}>\n {insights?.overdueTaskCount ?? 0}\n </Typography>\n )}\n </div>\n </div>\n </Card>\n </div>\n );\n}\n","import React from \"react\";\nimport {\n Typography,\n cls,\n Card,\n Button,\n Skeleton,\n Tooltip,\n Select,\n SelectItem\n} from \"@rebasepro/ui\";\nimport {\n Users as UsersIcon,\n ChevronRight,\n Settings\n} from \"lucide-react\";\n\n/* ── Types ────────────────────────────────────────────── */\n\ninterface PipelineStage {\n stageKey: string;\n label: string;\n shortLabel: string;\n color: string;\n icon: string;\n sortOrder: number;\n isTerminal: boolean;\n isLostStage: boolean;\n count: number;\n}\n\ninterface PipelineOption {\n id: string;\n name: string;\n isDefault: boolean;\n color: string;\n}\n\nexport interface PipelineOverviewProps {\n loading: boolean;\n insights: {\n pipelines: PipelineOption[];\n } | null;\n selectedPipelineId: string | null;\n onPipelineChange: (newPipelineId: string) => void;\n onNavigate: (path: string) => void;\n sortedStages: PipelineStage[];\n activeStages: PipelineStage[];\n closedStages: PipelineStage[];\n totalInPipeline: number;\n resolveColor: (colorName: string) => string;\n}\n\n/* ── Component ────────────────────────────────────────── */\n\nexport function PipelineOverview({\n loading,\n insights,\n selectedPipelineId,\n onPipelineChange,\n onNavigate,\n sortedStages,\n activeStages,\n closedStages,\n totalInPipeline,\n resolveColor\n}: PipelineOverviewProps) {\n const useShortLabels = sortedStages.length > 6;\n const needsScroll = sortedStages.length > 10;\n\n return (\n <Card className=\"p-4 mb-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-3\">\n <Typography variant=\"subtitle1\">\n Pipeline{!loading && totalInPipeline > 0 ? ` (${totalInPipeline} clients)` : \"\"}\n </Typography>\n\n {/* Pipeline selector — using @rebasepro/ui Select */}\n {insights && insights.pipelines.length > 1 && (\n <Select\n value={selectedPipelineId ?? \"\"}\n onValueChange={(v) => onPipelineChange(v as string)}\n size=\"smallest\"\n renderValue={(v) => {\n const selected = insights.pipelines.find(p => p.id === v);\n return selected ? selected.name : \"Pipeline\";\n }}\n position=\"popper\"\n >\n {insights.pipelines.map(p => (\n <SelectItem key={p.id} value={p.id}>\n {p.name}\n </SelectItem>\n ))}\n </Select>\n )}\n </div>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={() => { onNavigate('/c/engagements'); }}\n endIcon={<ChevronRight className=\"h-4 w-4\" />}\n >\n View All\n </Button>\n </div>\n\n {loading ? (\n <Skeleton className=\"h-20 w-full rounded-lg\" />\n ) : insights && sortedStages.length === 0 ? (\n /* No stages configured */\n <div className=\"flex flex-col items-center justify-center py-8\">\n <div className=\"flex items-center justify-center w-5 h-5 text-surface-400 dark:text-surface-500 mb-3\">\n <Settings className=\"h-4 w-4\" />\n </div>\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-1\">\n No pipeline stages configured\n </Typography>\n <Typography variant=\"caption\" color=\"disabled\" className=\"mb-4 text-center\">\n Set up your pipeline stages in Settings → Pipeline Stages\n </Typography>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => onNavigate('/pipeline-builder')}\n >\n Configure Stages\n </Button>\n </div>\n ) : insights && totalInPipeline === 0 ? (\n /* No clients in pipeline */\n <div className=\"flex flex-col items-center justify-center py-8\">\n <div className=\"flex items-center justify-center w-5 h-5 text-surface-400 dark:text-surface-500 mb-3\">\n <UsersIcon className=\"h-4 w-4\" />\n </div>\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-1\">\n No clients in pipeline yet\n </Typography>\n <Typography variant=\"caption\" color=\"disabled\" className=\"mb-4\">\n Create your first client to get started.\n </Typography>\n </div>\n ) : insights ? (\n /* Pipeline bar */\n <div className=\"relative\">\n {needsScroll && (\n <>\n <div className=\"absolute left-0 top-0 bottom-0 w-6 bg-gradient-to-r from-white dark:from-surface-900 to-transparent z-10 pointer-events-none rounded-l-lg\" />\n <div className=\"absolute right-0 top-0 bottom-0 w-6 bg-gradient-to-l from-white dark:from-surface-900 to-transparent z-10 pointer-events-none rounded-r-lg\" />\n </>\n )}\n <div className={cls(\n \"flex items-stretch gap-0\",\n needsScroll && \"overflow-x-auto\"\n )}>\n {/* Active stages */}\n {activeStages.map((stage, idx) => {\n const isEmpty = stage.count === 0;\n const widthPercent = totalInPipeline > 0\n ? Math.max(8, (stage.count / totalInPipeline) * 100)\n : 100 / Math.max(activeStages.length, 1);\n const stageColor = resolveColor(stage.color);\n const displayLabel = useShortLabels ? stage.shortLabel : stage.label;\n\n return (\n <React.Fragment key={stage.stageKey}>\n {idx > 0 && (\n <div className=\"flex items-center shrink-0 text-surface-300 dark:text-surface-600 -mx-0.5\">\n <ChevronRight className=\"h-4 w-4\" />\n </div>\n )}\n <Tooltip title={`${stage.label} — ${stage.count} client${stage.count !== 1 ? \"s\" : \"\"}`}>\n <div\n className={cls(\n \"flex flex-col items-center justify-center rounded-lg px-3 py-3 min-w-[72px] transition-colors duration-150 cursor-pointer\",\n \"hover:bg-surface-accent-100 dark:hover:bg-surface-800\",\n isEmpty\n ? \"bg-surface-50 dark:bg-surface-900/20\"\n : \"bg-surface-100/50 dark:bg-surface-900/60\"\n )}\n style={{ flex: `${widthPercent} 1 0%` }}\n onClick={() => onNavigate(`/c/engagements?stage=${stage.stageKey}`)}\n >\n <Typography\n variant=\"h6\"\n className={cls(\n \"tabular-nums leading-none font-semibold\",\n isEmpty && \"opacity-25\"\n )}\n >\n {stage.count}\n </Typography>\n <div className=\"flex items-center gap-1.5 mt-1.5\">\n <span\n className=\"w-1.5 h-1.5 rounded-full shrink-0\"\n style={{\n backgroundColor: stageColor,\n opacity: isEmpty ? 0.25 : 1\n }}\n />\n <Typography\n variant=\"caption\"\n color=\"secondary\"\n className={cls(\n \"whitespace-nowrap text-[11px]\",\n isEmpty && \"opacity-35\"\n )}\n >\n {displayLabel}\n </Typography>\n </div>\n </div>\n </Tooltip>\n </React.Fragment>\n );\n })}\n\n {/* Separator between active and closed stages */}\n {activeStages.length > 0 && closedStages.length > 0 && (\n <div className=\"flex items-center shrink-0 mx-2\">\n <div className=\"w-px h-8 bg-surface-200 dark:bg-surface-700\" />\n </div>\n )}\n\n {/* Closed / terminal stages — muted styling */}\n {closedStages.map((stage, idx) => {\n const isEmpty = stage.count === 0;\n const stageColor = resolveColor(stage.color);\n const displayLabel = useShortLabels ? stage.shortLabel : stage.label;\n\n return (\n <React.Fragment key={stage.stageKey}>\n {idx > 0 && (\n <div className=\"flex items-center shrink-0 text-surface-300 dark:text-surface-600 -mx-0.5\">\n <ChevronRight className=\"h-4 w-4\" />\n </div>\n )}\n <Tooltip title={`${stage.label} — ${stage.count} client${stage.count !== 1 ? \"s\" : \"\"}`}>\n <div\n className={cls(\n \"flex flex-col items-center justify-center rounded-lg px-3 py-3 min-w-[72px] transition-colors duration-150 cursor-pointer\",\n \"hover:bg-surface-accent-100 dark:hover:bg-surface-800\",\n \"opacity-60\",\n isEmpty\n ? \"bg-surface-50 dark:bg-surface-900/10\"\n : \"bg-surface-100/30 dark:bg-surface-900/30\"\n )}\n style={{ flex: \"0 0 auto\" }}\n onClick={() => onNavigate(`/c/engagements?stage=${stage.stageKey}`)}\n >\n <Typography\n variant=\"h6\"\n className={cls(\n \"tabular-nums leading-none font-semibold\",\n isEmpty && \"opacity-25\"\n )}\n >\n {stage.count}\n </Typography>\n <div className=\"flex items-center gap-1.5 mt-1.5\">\n <span\n className=\"w-1.5 h-1.5 rounded-full shrink-0\"\n style={{\n backgroundColor: stageColor,\n opacity: isEmpty ? 0.25 : 1\n }}\n />\n <Typography\n variant=\"caption\"\n color=\"secondary\"\n className={cls(\n \"whitespace-nowrap text-[11px]\",\n isEmpty && \"opacity-35\"\n )}\n >\n {displayLabel}\n </Typography>\n </div>\n </div>\n </Tooltip>\n </React.Fragment>\n );\n })}\n </div>\n </div>\n ) : null}\n </Card>\n );\n}\n","import React from \"react\";\nimport {\n Typography,\n Card,\n Skeleton,\n Separator,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button\n} from \"@rebasepro/ui\";\nimport {\n CircleDot,\n ArrowRightLeft,\n Mail,\n FileText,\n PenLine,\n Video,\n MessageCircle,\n StickyNote,\n ListPlus,\n CheckCircle2,\n Wrench,\n Pin\n} from \"lucide-react\";\n\n/* ── Activity type → icon mapping ─────────────────── */\nconst ACTIVITY_ICONS: Record<string, React.ReactNode> = {\n incoming: <CircleDot className=\"h-4 w-4 text-blue-500\" />,\n status_changed: <ArrowRightLeft className=\"h-4 w-4 text-violet-500\" />,\n email_sent: <Mail className=\"h-4 w-4 text-sky-500\" />,\n agreements_sent: <FileText className=\"h-4 w-4 text-amber-500\" />,\n agreements_signed: <PenLine className=\"h-4 w-4 text-emerald-500\" />,\n zoom_setup: <Video className=\"h-4 w-4 text-blue-600\" />,\n whatsapp_setup: <MessageCircle className=\"h-4 w-4 text-green-500\" />,\n note: <StickyNote className=\"h-4 w-4 text-yellow-500\" />,\n task_created: <ListPlus className=\"h-4 w-4 text-teal-500\" />,\n task_completed: <CheckCircle2 className=\"h-4 w-4 text-emerald-500\" />,\n manual_action: <Wrench className=\"h-4 w-4 text-orange-500\" />\n};\n\n/* ── Relative time helper ──────────────────────────── */\nfunction relativeTime(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffSec = Math.round((now - then) / 1000);\n if (diffSec < 60) return 'just now';\n const diffMin = Math.floor(diffSec / 60);\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return `${diffHr}h ago`;\n const diffDay = Math.floor(diffHr / 24);\n if (diffDay < 7) return `${diffDay}d ago`;\n return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n}\n\n/* ── Types ────────────────────────────────────────────── */\n\nexport interface RecentActivityProps {\n activities: any[];\n activitiesLoading: boolean;\n tasksMap: Map<string, any>;\n onCompleteTask: (activity: any) => void;\n onViewEmail: (activity: any) => void;\n onOpenTask: (activity: any) => void;\n emailViewerOpen: boolean;\n onEmailViewerOpenChange: (open: boolean) => void;\n selectedEmail: { to: string; subject: string; body: string; html?: string; mode?: string } | null;\n}\n\n/* ── Component ────────────────────────────────────────── */\n\nexport function RecentActivity({\n activities,\n activitiesLoading,\n tasksMap,\n onCompleteTask,\n onViewEmail,\n onOpenTask,\n emailViewerOpen,\n onEmailViewerOpenChange,\n selectedEmail\n}: RecentActivityProps) {\n return (\n <>\n <Card className=\"p-4 flex-1\">\n <Typography variant=\"subtitle1\" className=\"mb-3\">Recent Activity</Typography>\n\n {activitiesLoading ? (\n <div className=\"flex flex-col gap-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3\">\n <Skeleton className=\"h-5 w-5 rounded-full shrink-0\" />\n <Skeleton className=\"h-4 flex-1\" />\n </div>\n ))}\n </div>\n ) : activities.length === 0 ? (\n <div className=\"flex flex-col items-center py-6\">\n <Typography variant=\"body2\" color=\"secondary\">\n No recent activity\n </Typography>\n </div>\n ) : (\n <div className=\"flex flex-col\">\n {activities.map((activity: any, idx: number) => {\n const actType = activity.values?.type;\n const taskId = activity.values?.metadata?.taskId;\n const relatedTask = taskId ? tasksMap.get(taskId) : null;\n const isTaskActivity = actType === \"task_created\" || actType === \"task_completed\";\n const isEmailActivity = actType === \"email_sent\";\n\n return (\n <React.Fragment key={activity.id}>\n {idx > 0 && <Separator orientation=\"horizontal\" className=\"my-0\" />}\n <div className=\"flex items-start gap-2.5 py-2.5\">\n <span className=\"shrink-0 mt-0.5 flex items-center\">\n {ACTIVITY_ICONS[actType] ?? <Pin className=\"h-4 w-4 text-surface-400 dark:text-surface-500\" />}\n </span>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"body2\" className=\"truncate leading-snug\">\n {activity.values?.description || actType || \"Activity\"}\n </Typography>\n {activity.values?.createdAt && (\n <Typography variant=\"caption\" color=\"secondary\" className=\"text-[10px]\">\n {relativeTime(activity.values.createdAt)}\n </Typography>\n )}\n {/* Action buttons using @rebasepro/ui Buttons */}\n <div className=\"flex items-center gap-3 mt-1 flex-wrap\">\n {/* Complete Task — only for task_created with a pending task */}\n {isTaskActivity && relatedTask && relatedTask.values?.status !== \"completed\" && (\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"primary\"\n className=\"text-emerald-600 dark:text-emerald-400 font-medium hover:underline p-0 h-auto min-w-0\"\n onClick={() => onCompleteTask(activity)}\n >\n Complete Task\n </Button>\n )}\n {/* View Sent Email */}\n {isEmailActivity && (\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"primary\"\n className=\"font-medium hover:underline p-0 h-auto min-w-0\"\n onClick={() => onViewEmail(activity)}\n >\n View Sent Email\n </Button>\n )}\n {/* Open task in side panel */}\n {isTaskActivity && taskId && (\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"neutral\"\n className=\"font-medium hover:underline p-0 h-auto min-w-0 text-surface-500 hover:text-surface-700 dark:text-surface-400 dark:hover:text-surface-300\"\n onClick={() => onOpenTask(activity)}\n >\n Open Task\n </Button>\n )}\n </div>\n </div>\n </div>\n </React.Fragment>\n );\n })}\n </div>\n )}\n </Card>\n\n {/* ── Email Viewer Dialog ── */}\n <Dialog\n open={emailViewerOpen}\n onOpenChange={onEmailViewerOpenChange}\n maxWidth=\"xl\"\n >\n <DialogTitle>{selectedEmail?.subject || \"Email\"}</DialogTitle>\n <DialogContent>\n {selectedEmail && (\n <div className=\"space-y-3\">\n <Typography variant=\"caption\" color=\"secondary\">\n To: {selectedEmail.to}\n </Typography>\n {selectedEmail.html ? (\n <div\n className=\"prose prose-sm dark:prose-invert max-w-none text-text-primary dark:text-text-primary-dark\"\n dangerouslySetInnerHTML={{ __html: selectedEmail.html }}\n />\n ) : (\n <Typography variant=\"body2\" className=\"whitespace-pre-wrap\">\n {selectedEmail.body}\n </Typography>\n )}\n {selectedEmail.mode === \"simulated\" && (\n <Typography variant=\"caption\" color=\"secondary\" className=\"italic mt-2 block\">\n Simulated — email was not actually sent.\n </Typography>\n )}\n </div>\n )}\n </DialogContent>\n <DialogActions>\n <Button variant=\"text\" onClick={() => onEmailViewerOpenChange(false)}>Close</Button>\n </DialogActions>\n </Dialog>\n </>\n );\n}\n","import React from \"react\";\nimport {\n Chip,\n FilterChip,\n SearchBar,\n Select,\n SelectItem,\n Typography,\n Button\n} from \"@rebasepro/ui\";\nimport {\n AlertTriangle,\n ListTodo,\n X\n} from \"lucide-react\";\n\n/* ── Types ──────────────────────────────────────────────────── */\n\ntype QuickFilter = \"all\" | \"overdue\";\n\nexport interface TaskFiltersProps {\n quickFilter: QuickFilter;\n onQuickFilterChange: (filter: QuickFilter) => void;\n stageFilter: string | null;\n onStageFilterChange: (stage: string | null) => void;\n clientFilter: string | null;\n onClientFilterChange: (clientId: string | null) => void;\n searchText: string;\n onSearchTextChange: (text: string) => void;\n hasActiveFilter: boolean;\n onClearAllFilters: () => void;\n overdueTasks: { length: number };\n pendingTasks: { length: number };\n stageLabels: Record<string, string>;\n stageFilterOrder: string[];\n stageCounts: Record<string, number>;\n activeClientIds: string[];\n clientsMap: Map<string, { name: string; picture?: string }>;\n}\n\n/* ── Component ──────────────────────────────────────────────── */\n\nexport function TaskFilters({\n quickFilter,\n onQuickFilterChange,\n stageFilter,\n onStageFilterChange,\n clientFilter,\n onClientFilterChange,\n searchText,\n onSearchTextChange,\n hasActiveFilter,\n onClearAllFilters,\n overdueTasks,\n pendingTasks,\n stageLabels,\n stageFilterOrder,\n stageCounts,\n activeClientIds,\n clientsMap\n}: TaskFiltersProps) {\n return (\n <>\n {/* Header */}\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center justify-center w-5 h-5 text-surface-400 dark:text-surface-500\">\n <ListTodo className=\"h-4 w-4\" />\n </div>\n <Typography variant=\"subtitle1\">Tasks</Typography>\n {pendingTasks.length > 0 && (\n <Chip size=\"smallest\" colorScheme=\"blue\">\n {pendingTasks.length}{hasActiveFilter ? \" shown\" : \" pending\"}\n </Chip>\n )}\n </div>\n {overdueTasks.length > 0 && (\n <Chip size=\"smallest\" colorScheme=\"red\">\n {overdueTasks.length} overdue\n </Chip>\n )}\n </div>\n\n {/* ── Filter bar ── */}\n <div className=\"flex flex-col gap-2 mb-3\">\n {/* Quick filter chips row */}\n <div className=\"flex items-center gap-1.5\">\n <FilterChip\n active={quickFilter === \"all\" && !stageFilter && !clientFilter}\n onClick={() => { onQuickFilterChange(\"all\"); onStageFilterChange(null); onClientFilterChange(null); }}\n size=\"small\"\n >\n All\n </FilterChip>\n <FilterChip\n active={quickFilter === \"overdue\"}\n onClick={() => { onQuickFilterChange(quickFilter === \"overdue\" ? \"all\" : \"overdue\"); }}\n size=\"small\"\n icon={<AlertTriangle className=\"h-3 w-3\" />}\n >\n Overdue{overdueTasks.length > 0 ? ` (${overdueTasks.length})` : \"\"}\n </FilterChip>\n\n {/* Clear all filters using @rebasepro/ui Button */}\n {hasActiveFilter && (\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"neutral\"\n className=\"p-0 h-auto min-w-0 text-xs text-text-secondary dark:text-text-secondary-dark hover:text-primary dark:hover:text-primary-light\"\n onClick={onClearAllFilters}\n startIcon={<X className=\"h-3 w-3\" />}\n >\n Clear\n </Button>\n )}\n </div>\n\n {/* Stage select + Client select + Search row */}\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <SearchBar\n onTextSearch={(v) => { onSearchTextChange(v || \"\"); }}\n placeholder=\"Search tasks...\"\n size=\"smallest\"\n className=\"w-full\"\n />\n </div>\n\n {/* Stage filter dropdown */}\n <Select\n value={stageFilter || \"__all__\"}\n onValueChange={(v) => { onStageFilterChange(v === \"__all__\" ? null : v as string); }}\n placeholder=\"Stage\"\n size=\"smallest\"\n renderValue={(v) => {\n if (!v || v === \"__all__\") return \"Stage\";\n return stageLabels[v as string] || \"Stage\";\n }}\n position=\"popper\"\n >\n <SelectItem value={\"__all__\"}>All stages</SelectItem>\n {stageFilterOrder\n .filter(stageId => stageCounts[stageId] > 0)\n .map(stageId => (\n <SelectItem key={stageId} value={stageId}>\n {stageLabels[stageId] || stageId}\n {stageCounts[stageId] > 0 ? ` (${stageCounts[stageId]})` : \"\"}\n </SelectItem>\n ))\n }\n </Select>\n\n {/* Client filter dropdown */}\n {activeClientIds.length > 1 && (\n <Select\n value={clientFilter || \"__all__\"}\n onValueChange={(v) => { onClientFilterChange(v === \"__all__\" ? null : v as string); }}\n placeholder=\"All clients\"\n size=\"smallest\"\n renderValue={(v) => {\n if (!v || v === \"__all__\") return \"Client\";\n const info = clientsMap.get(v as string);\n return info?.name || \"Client\";\n }}\n position=\"popper\"\n >\n <SelectItem value={\"__all__\"}>All clients</SelectItem>\n {activeClientIds.map(cId => {\n const info = clientsMap.get(cId);\n if (!info) return null;\n return (\n <SelectItem key={cId} value={cId}>\n {info.name}\n </SelectItem>\n );\n })}\n </Select>\n )}\n </div>\n </div>\n </>\n );\n}\n","import React, { useState, useCallback } from \"react\";\nimport {\n Typography,\n cls,\n Card,\n Chip,\n Skeleton,\n Checkbox,\n Button\n} from \"@rebasepro/ui\";\nimport {\n Calendar,\n AlertTriangle,\n ListTodo,\n CheckCircle2\n} from \"lucide-react\";\n\n/* ── Types ──────────────────────────────────────────────────── */\n\ninterface TaskEntity {\n id: string;\n values: {\n title: string;\n status: string;\n resolution: string | null;\n dueDate: string | null;\n stageId: string | null;\n description: string | null;\n notes: string | null;\n clientId: string | null;\n client?: { name?: string } | null;\n priority?: string | null;\n createdAt: string | null;\n };\n}\n\nexport interface TaskTableProps {\n tasks: TaskEntity[];\n loading: boolean;\n pendingTasks: TaskEntity[];\n visiblePendingTasks: TaskEntity[];\n hasMorePending: boolean;\n onLoadMorePending: () => void;\n pendingCount: number;\n togglingIds: Set<string>;\n onToggleTask: (taskId: string, currentStatus: string) => void;\n onOpenTask: (taskId: string) => void;\n onOpenClient: (clientId: string) => void;\n clientsMap: Map<string, { name: string; picture?: string }>;\n stageLabels: Record<string, string>;\n recentlyToggledIds: Set<string>;\n /* Completed section */\n completedTasks: TaskEntity[];\n completedLoaded: boolean;\n loadingCompleted: boolean;\n completedHasMore: boolean;\n onExpandCompleted: () => void;\n onLoadMoreCompleted: () => void;\n}\n\nexport const resolutionDisplay: Record<string, { label: string; colorScheme: string }> = {\n verified: { label: \"Verified\", colorScheme: \"green\" },\n needs_followup: { label: \"Needs Follow-up\", colorScheme: \"amber\" },\n suitable: { label: \"Suitable\", colorScheme: \"green\" },\n not_a_fit: { label: \"Not a Fit\", colorScheme: \"red\" },\n response_received: { label: \"Response Received\", colorScheme: \"green\" },\n followup_sent: { label: \"Follow-up Sent\", colorScheme: \"blue\" },\n prepared: { label: \"Prepared\", colorScheme: \"green\" },\n invite_sent: { label: \"Invite Sent\", colorScheme: \"green\" },\n agreement_ready: { label: \"Agreement Ready\", colorScheme: \"green\" },\n signed: { label: \"Signed\", colorScheme: \"green\" },\n reminder_sent: { label: \"Reminder Sent\", colorScheme: \"blue\" },\n payment_confirmed: { label: \"Payment Confirmed\", colorScheme: \"green\" },\n not_yet_received: { label: \"Not Yet Received\", colorScheme: \"amber\" },\n sent: { label: \"Sent\", colorScheme: \"green\" },\n confirmed: { label: \"Confirmed\", colorScheme: \"green\" },\n not_yet: { label: \"Not Yet\", colorScheme: \"amber\" },\n scheduled: { label: \"Scheduled\", colorScheme: \"green\" },\n feedback_received: { label: \"Feedback Received\", colorScheme: \"green\" },\n awaiting_response: { label: \"Awaiting Response\", colorScheme: \"amber\" },\n archived: { label: \"Archived\", colorScheme: \"green\" },\n done: { label: \"Done\", colorScheme: \"green\" },\n};\n\n/* ── Helpers ────────────────────────────────────────────────── */\n\nfunction formatDueDate(dateStr: string | null): string | null {\n if (!dateStr) return null;\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return null;\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const target = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n const diffMs = target.getTime() - today.getTime();\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return \"Today\";\n if (diffDays === 1) return \"Tomorrow\";\n if (diffDays === -1) return \"Yesterday\";\n if (diffDays < 0) return `${Math.abs(diffDays)}d overdue`;\n if (diffDays <= 7) return `In ${diffDays}d`;\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nfunction isDueDateOverdue(dateStr: string | null): boolean {\n if (!dateStr) return false;\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return false;\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n return d < today;\n}\n\nfunction isDueDateSoon(dateStr: string | null): boolean {\n if (!dateStr) return false;\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return false;\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const diffMs = d.getTime() - today.getTime();\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24));\n return diffDays >= 0 && diffDays <= 2;\n}\n\n/* ── Component ──────────────────────────────────────────────── */\n\nexport function TaskTable({\n tasks,\n loading,\n pendingTasks,\n visiblePendingTasks,\n hasMorePending,\n onLoadMorePending,\n pendingCount,\n togglingIds,\n onToggleTask,\n onOpenTask,\n onOpenClient,\n clientsMap,\n stageLabels,\n recentlyToggledIds,\n completedTasks,\n completedLoaded,\n loadingCompleted,\n completedHasMore,\n onExpandCompleted,\n onLoadMoreCompleted\n}: TaskTableProps) {\n\n /* ── Task Row Renderer ── */\n const renderTaskRow = useCallback((task: TaskEntity) => {\n const isCompleted = task.values?.status === \"completed\";\n const isToggling = togglingIds.has(task.id);\n const dueLabel = formatDueDate(task.values?.dueDate);\n const overdue = !isCompleted && isDueDateOverdue(task.values?.dueDate);\n const soon = !isCompleted && isDueDateSoon(task.values?.dueDate);\n const stageName = task.values?.stageId ? stageLabels[task.values.stageId] : null;\n const clientInfo = task.values?.clientId ? clientsMap.get(task.values.clientId) : null;\n const clientName = clientInfo?.name || null;\n\n return (\n <div\n key={task.id}\n className={cls(\n \"group flex items-start gap-3 py-2.5 px-3 rounded-md transition-colors duration-150 cursor-pointer\",\n \"hover:bg-surface-accent-100 dark:hover:bg-surface-800\",\n isCompleted && \"opacity-60\",\n overdue && \"border-l-2 border-l-red-500 rounded-l-none\",\n soon && !overdue && \"border-l-2 border-l-amber-450 rounded-l-none\"\n )}\n onClick={() => onOpenTask(task.id)}\n >\n {/* Checkbox */}\n <div\n className=\"pt-0.5 shrink-0\"\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={isCompleted}\n size=\"small\"\n onCheckedChange={() => {\n if (!isToggling) onToggleTask(task.id, task.values?.status);\n }}\n />\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n <Typography\n variant=\"body2\"\n className={cls(\n \"leading-snug\",\n isCompleted && \"line-through text-text-disabled dark:text-text-disabled-dark\"\n )}\n >\n {task.values?.title || \"Untitled Task\"}\n </Typography>\n {task.values?.priority === \"high\" && (\n <Chip colorScheme=\"red\" size=\"smallest\">High</Chip>\n )}\n </div>\n\n {/* Meta row */}\n <div className=\"flex items-center gap-2 mt-1 flex-wrap\">\n {dueLabel && (\n <span className={cls(\n \"inline-flex items-center gap-1 text-[11px]\",\n overdue && \"text-red-600 dark:text-red-400 font-medium\",\n soon && !overdue && \"text-amber-600 dark:text-amber-400 font-medium\",\n !overdue && !soon && \"text-text-secondary dark:text-text-secondary-dark\"\n )}>\n {overdue ? (\n <AlertTriangle className=\"h-3 w-3\" />\n ) : (\n <Calendar className=\"h-3 w-3\" />\n )}\n {dueLabel}\n </span>\n )}\n\n {clientName && task.values?.clientId && (\n <Typography\n variant=\"body2\"\n className={cls(\n \"inline-flex items-center gap-1 text-primary hover:text-primary-dark\",\n \"dark:text-primary-light dark:hover:text-primary\",\n \"hover:underline cursor-pointer text-[11px]\"\n )}\n onClick={(e) => {\n e.stopPropagation();\n onOpenClient(task.values.clientId!);\n }}\n >\n {(() => {\n const clientPic = clientInfo?.picture;\n const clientInitial = (clientName || \"?\")[0].toUpperCase();\n return clientPic ? (\n <img src={clientPic} alt=\"\" className=\"w-4 h-4 rounded-full object-cover shrink-0\" />\n ) : (\n <div className=\"w-4 h-4 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 dark:text-surface-400 flex items-center justify-center shrink-0\">\n <span className=\"text-[9px] font-semibold\">{clientInitial}</span>\n </div>\n );\n })()}\n {clientName}\n </Typography>\n )}\n\n {stageName && (\n <Chip size=\"smallest\" colorScheme=\"cyan\" outlined>\n {stageName}\n </Chip>\n )}\n\n {/* Resolution chip for completed tasks */}\n {isCompleted && task.values?.resolution && resolutionDisplay[task.values.resolution] && (\n <Chip\n size=\"smallest\"\n colorScheme={resolutionDisplay[task.values.resolution].colorScheme as any}\n >\n {resolutionDisplay[task.values.resolution].label}\n </Chip>\n )}\n </div>\n </div>\n </div>\n );\n }, [togglingIds, onToggleTask, onOpenTask, onOpenClient, clientsMap, recentlyToggledIds, stageLabels]);\n\n /* ── Skeleton loader ── */\n if (loading) {\n return (\n <div className=\"flex flex-col gap-3\">\n {[1, 2, 3, 4].map(i => (\n <div key={i} className=\"flex items-center gap-3 py-2 px-3\">\n <Skeleton width={18} height={18} />\n <div className=\"flex-1 space-y-1\">\n <Skeleton width={200} height={16} />\n <Skeleton width={120} height={12} />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"flex-1 overflow-y-auto\">\n {tasks.length === 0 ? (\n <Card className=\"flex flex-col items-center justify-center py-10 px-6 text-center mt-2 border-dashed\">\n <div className=\"flex items-center justify-center w-5 h-5 text-surface-400 dark:text-surface-500 mb-3\">\n <CheckCircle2 className=\"h-4 w-4\" />\n </div>\n <Typography variant=\"subtitle2\" className=\"mb-1\">\n All clear!\n </Typography>\n <Typography variant=\"body2\" color=\"secondary\">\n No tasks at the moment. New tasks will show up here automatically.\n </Typography>\n </Card>\n ) : (\n <div className=\"space-y-4\">\n {/* Pending tasks */}\n {pendingTasks.length > 0 && (\n <div className=\"space-y-0.5\">\n {visiblePendingTasks.map(renderTaskRow)}\n {hasMorePending && (\n <div className=\"pt-2\">\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"primary\"\n className=\"w-full justify-center\"\n onClick={onLoadMorePending}\n >\n Load more ({pendingCount - visiblePendingTasks.length} remaining)\n </Button>\n </div>\n )}\n </div>\n )}\n\n {/* Completed tasks - lazy loaded collapsed section */}\n <CompletedSection\n tasks={completedTasks}\n renderTaskRow={renderTaskRow}\n onExpand={onExpandCompleted}\n onLoadMore={onLoadMoreCompleted}\n loading={loadingCompleted}\n hasMore={completedHasMore}\n />\n </div>\n )}\n </div>\n );\n}\n\n/* ── Completed Section (collapsible, lazy-loaded) ─────────── */\n\nfunction CompletedSection({\n tasks,\n renderTaskRow,\n onExpand,\n onLoadMore,\n loading,\n hasMore\n}: {\n tasks: TaskEntity[];\n renderTaskRow: (task: TaskEntity) => React.ReactNode;\n onExpand: () => void;\n onLoadMore: () => void;\n loading: boolean;\n hasMore: boolean;\n}) {\n const [expanded, setExpanded] = useState(false);\n\n const handleToggle = () => {\n const willExpand = !expanded;\n setExpanded(willExpand);\n if (willExpand) onExpand();\n };\n\n return (\n <div>\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"neutral\"\n className=\"w-full justify-between hover:bg-surface-accent-100 dark:hover:bg-surface-800 px-3 py-1.5 h-auto text-left\"\n onClick={handleToggle}\n endIcon={\n <svg\n className={cls(\n \"h-3 w-3 text-text-secondary dark:text-text-secondary-dark transition-transform duration-150\",\n expanded && \"rotate-90\"\n )}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n }\n >\n <Typography\n variant=\"caption\"\n color=\"secondary\"\n className=\"font-semibold uppercase tracking-wider text-[10px]\"\n >\n Completed{tasks.length > 0 ? ` (${tasks.length}${hasMore ? \"+\" : \"\"})` : \"\"}\n </Typography>\n </Button>\n {expanded && (\n <div className=\"mt-1 space-y-0.5\">\n {loading && tasks.length === 0 ? (\n <div className=\"flex items-center gap-2 px-3 py-3\">\n <Skeleton width={18} height={18} />\n <Skeleton width={200} height={16} />\n </div>\n ) : (\n <>\n {tasks.map(renderTaskRow)}\n {hasMore && (\n <div className=\"pt-2\">\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"primary\"\n className=\"w-full justify-center\"\n onClick={onLoadMore}\n disabled={loading}\n >\n {loading ? \"Loading...\" : \"Load more completed\"}\n </Button>\n </div>\n )}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useMemo, useCallback } from \"react\";\nimport { TaskFilters } from \"./TaskFilters\";\nimport { TaskTable } from \"./TaskTable\";\n\n/* ── Types ──────────────────────────────────────────────────── */\n\ninterface TaskEntity {\n id: string;\n values: {\n title: string;\n status: string;\n resolution: string | null;\n dueDate: string | null;\n stageId: string | null;\n description: string | null;\n notes: string | null;\n clientId: string | null;\n client?: { name?: string } | null;\n priority?: string | null;\n createdAt: string | null;\n };\n}\n\ntype QuickFilter = \"all\" | \"overdue\";\n\nconst PENDING_PAGE_SIZE = 50;\n\nfunction isDueDateOverdue(dateStr: string | null): boolean {\n if (!dateStr) return false;\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return false;\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n return d < today;\n}\n\nexport interface TasksViewProps {\n loading: boolean;\n tasks: TaskEntity[];\n togglingIds: Set<string>;\n onToggleTask: (taskId: string, currentStatus: string) => void;\n onOpenTask: (taskId: string) => void;\n onOpenClient: (clientId: string) => void;\n clientsMap: Map<string, { name: string; picture?: string }>;\n pipelineStages: any[];\n recentlyToggledIds: Set<string>;\n completedTasks: TaskEntity[];\n completedLoaded: boolean;\n loadingCompleted: boolean;\n completedHasMore: boolean;\n onExpandCompleted: () => void;\n onLoadMoreCompleted: () => void;\n}\n\n/* ── Component ──────────────────────────────────────────────── */\n\nexport function TasksView({\n loading,\n tasks,\n togglingIds,\n onToggleTask,\n onOpenTask,\n onOpenClient,\n clientsMap,\n pipelineStages,\n recentlyToggledIds,\n completedTasks,\n completedLoaded,\n loadingCompleted,\n completedHasMore,\n onExpandCompleted,\n onLoadMoreCompleted\n}: TasksViewProps) {\n const stageLabels: Record<string, string> = useMemo(\n () => Object.fromEntries(\n pipelineStages.map(s => [s.values?.stageKey, s.values?.label])\n ),\n [pipelineStages]\n );\n\n const stageFilterOrder: string[] = useMemo(\n () => pipelineStages.map(s => s.values?.stageKey).filter(Boolean),\n [pipelineStages]\n );\n\n // ── Filtering state ──\n const [quickFilter, setQuickFilter] = useState<QuickFilter>(\"all\");\n const [stageFilter, setStageFilter] = useState<string | null>(null);\n const [clientFilter, setClientFilter] = useState<string | null>(null);\n const [searchText, setSearchText] = useState<string>(\"\");\n const [visiblePendingCount, setVisiblePendingCount] = useState(PENDING_PAGE_SIZE);\n\n /* ── Derived data ── */\n const overdueTasks = useMemo(\n () => tasks.filter(t =>\n t.values?.status === \"pending\" &&\n !recentlyToggledIds.has(t.id) &&\n isDueDateOverdue(t.values?.dueDate)\n ),\n [tasks, recentlyToggledIds]\n );\n\n // Unique client IDs in current pending tasks\n const activeClientIds = useMemo(() => {\n const ids = new Set<string>();\n tasks.forEach(t => {\n if (t.values?.clientId) ids.add(t.values.clientId);\n });\n return Array.from(ids).sort((a, b) => {\n const na = clientsMap.get(a)?.name || \"\";\n const nb = clientsMap.get(b)?.name || \"\";\n return na.localeCompare(nb);\n });\n }, [tasks, clientsMap]);\n\n // Stage counts for badge display\n const stageCounts = useMemo(() => {\n const counts: Record<string, number> = {};\n tasks.forEach(t => {\n if (t.values?.status === \"pending\" && t.values?.stageId) {\n counts[t.values.stageId] = (counts[t.values.stageId] || 0) + 1;\n }\n });\n return counts;\n }, [tasks]);\n\n // Apply filters to pending tasks\n const filteredPendingTasks = useMemo(() => {\n let filtered = tasks.filter(t =>\n t.values?.status === \"pending\" ||\n (t.values?.status === \"completed\" && recentlyToggledIds.has(t.id))\n );\n\n if (quickFilter === \"overdue\") {\n filtered = filtered.filter(t =>\n isDueDateOverdue(t.values?.dueDate) ||\n recentlyToggledIds.has(t.id)\n );\n }\n\n if (stageFilter) {\n filtered = filtered.filter(t =>\n t.values?.stageId === stageFilter ||\n recentlyToggledIds.has(t.id)\n );\n }\n\n if (clientFilter) {\n filtered = filtered.filter(t =>\n t.values?.clientId === clientFilter ||\n recentlyToggledIds.has(t.id)\n );\n }\n\n if (searchText.trim()) {\n const q = searchText.trim().toLowerCase();\n filtered = filtered.filter(t => {\n const title = (t.values?.title || \"\").toLowerCase();\n const desc = (t.values?.description || \"\").toLowerCase();\n const clientName = t.values?.clientId\n ? (clientsMap.get(t.values.clientId)?.name || \"\").toLowerCase()\n : \"\";\n return title.includes(q) || desc.includes(q) || clientName.includes(q);\n });\n }\n\n return filtered;\n }, [tasks, recentlyToggledIds, quickFilter, stageFilter, clientFilter, searchText, clientsMap]);\n\n const visiblePendingTasks = useMemo(() =>\n filteredPendingTasks.slice(0, visiblePendingCount),\n [filteredPendingTasks, visiblePendingCount]\n );\n const hasMorePending = filteredPendingTasks.length > visiblePendingCount;\n const pendingCount = filteredPendingTasks.length;\n\n const handleClearAllFilters = useCallback(() => {\n setQuickFilter(\"all\");\n setStageFilter(null);\n setClientFilter(null);\n setSearchText(\"\");\n }, []);\n\n const hasActiveFilter = quickFilter !== \"all\" || stageFilter !== null || clientFilter !== null || searchText !== \"\";\n\n return (\n <div className=\"flex flex-col h-full bg-white dark:bg-surface-900\">\n <div className=\"flex flex-col gap-4 overflow-y-auto flex-1\">\n <TaskFilters\n quickFilter={quickFilter}\n onQuickFilterChange={setQuickFilter}\n stageFilter={stageFilter}\n onStageFilterChange={setStageFilter}\n clientFilter={clientFilter}\n onClientFilterChange={setClientFilter}\n searchText={searchText}\n onSearchTextChange={setSearchText}\n hasActiveFilter={hasActiveFilter}\n onClearAllFilters={handleClearAllFilters}\n overdueTasks={overdueTasks}\n pendingTasks={tasks.filter(t => t.values?.status === \"pending\" && !recentlyToggledIds.has(t.id))}\n stageLabels={stageLabels}\n stageFilterOrder={stageFilterOrder}\n stageCounts={stageCounts}\n activeClientIds={activeClientIds}\n clientsMap={clientsMap}\n />\n\n <TaskTable\n tasks={tasks}\n loading={loading}\n pendingTasks={filteredPendingTasks}\n visiblePendingTasks={visiblePendingTasks}\n hasMorePending={hasMorePending}\n onLoadMorePending={() => setVisiblePendingCount(prev => prev + PENDING_PAGE_SIZE)}\n pendingCount={pendingCount}\n togglingIds={togglingIds}\n onToggleTask={onToggleTask}\n onOpenTask={onOpenTask}\n onOpenClient={onOpenClient}\n clientsMap={clientsMap}\n stageLabels={stageLabels}\n recentlyToggledIds={recentlyToggledIds}\n completedTasks={completedTasks}\n completedLoaded={completedLoaded}\n loadingCompleted={loadingCompleted}\n completedHasMore={completedHasMore}\n onExpandCompleted={onExpandCompleted}\n onLoadMoreCompleted={onLoadMoreCompleted}\n />\n </div>\n </div>\n );\n}\n","import React, { useState, useMemo, useCallback } from \"react\";\nimport {\n Typography,\n cls,\n Chip,\n Skeleton,\n IconButton,\n Separator,\n Button\n} from \"@rebasepro/ui\";\nimport {\n ChevronLeft,\n ChevronRight\n} from \"lucide-react\";\n\n/* ── Types ─────────────────────────────────────────────── */\n\ninterface TaskEntity {\n id: string;\n values: {\n title: string;\n status: string;\n dueDate: string | null;\n stageId: string | null;\n priority?: string | null;\n clientId: string | null;\n client?: { name?: string } | null;\n };\n}\n\nexport interface CalendarWidgetProps {\n loading: boolean;\n tasks: TaskEntity[];\n onOpenTask: (taskId: string) => void;\n}\n\n/* ── Date helpers ──────────────────────────────────────── */\n\nfunction startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n}\n\nfunction endOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction toDateKey(date: Date): string {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}-${String(date.getDate()).padStart(2, \"0\")}`;\n}\n\nfunction isBeforeToday(date: Date): boolean {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n return d < today;\n}\n\n/* ── Stage label map ───────────────────────────────────── */\n\nconst stageLabels: Record<string, string> = {\n incoming: \"Incoming\",\n email_sent: \"Intro Email\",\n discovery_call: \"Discovery\",\n agreements: \"Agreements\",\n onboarding: \"Onboarding\",\n active: \"Active\",\n delivered: \"Delivered\",\n completed: \"Done\"\n};\n\n/* ── Calendar grid builder ─────────────────────────────── */\n\ninterface CalendarDay {\n date: Date;\n isCurrentMonth: boolean;\n isToday: boolean;\n dateKey: string;\n}\n\nfunction buildCalendarGrid(viewDate: Date): CalendarDay[] {\n const today = new Date();\n const first = startOfMonth(viewDate);\n const last = endOfMonth(viewDate);\n\n // Monday = 0 ... Sunday = 6\n let startDay = first.getDay() - 1;\n if (startDay < 0) startDay = 6;\n\n const days: CalendarDay[] = [];\n\n // Fill leading days from previous month\n for (let i = startDay - 1; i >= 0; i--) {\n const d = new Date(first);\n d.setDate(d.getDate() - (i + 1));\n days.push({\n date: d,\n isCurrentMonth: false,\n isToday: isSameDay(d, today),\n dateKey: toDateKey(d)\n });\n }\n\n // Current month days\n for (let d = 1; d <= last.getDate(); d++) {\n const date = new Date(viewDate.getFullYear(), viewDate.getMonth(), d);\n days.push({\n date,\n isCurrentMonth: true,\n isToday: isSameDay(date, today),\n dateKey: toDateKey(date)\n });\n }\n\n // Fill trailing days to complete the last week\n while (days.length % 7 !== 0) {\n const d = new Date(last);\n d.setDate(d.getDate() + (days.length - (startDay + last.getDate())) + 1);\n days.push({\n date: d,\n isCurrentMonth: false,\n isToday: isSameDay(d, today),\n dateKey: toDateKey(d)\n });\n }\n\n return days;\n}\n\n/* ── Component ─────────────────────────────────────────── */\n\nconst DAY_HEADERS = [\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"];\n\nconst MONTH_NAMES = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n];\n\nexport function CalendarWidget({ loading, tasks, onOpenTask }: CalendarWidgetProps) {\n const [viewDate, setViewDate] = useState(() => new Date());\n const [selectedDay, setSelectedDay] = useState<string | null>(null);\n\n /* ── Group tasks by date key ── */\n const tasksByDate = useMemo(() => {\n const map = new Map<string, TaskEntity[]>();\n for (const task of tasks) {\n if (!task.values?.dueDate) continue;\n const d = new Date(task.values.dueDate);\n const key = toDateKey(d);\n if (!map.has(key)) map.set(key, []);\n map.get(key)!.push(task);\n }\n return map;\n }, [tasks]);\n\n /* ── Calendar grid ── */\n const calendarDays = useMemo(() => buildCalendarGrid(viewDate), [viewDate]);\n\n /* ── Month navigation ── */\n const goToPrevMonth = useCallback(() => {\n setViewDate(prev => new Date(prev.getFullYear(), prev.getMonth() - 1, 1));\n setSelectedDay(null);\n }, []);\n\n const goToNextMonth = useCallback(() => {\n setViewDate(prev => new Date(prev.getFullYear(), prev.getMonth() + 1, 1));\n setSelectedDay(null);\n }, []);\n\n const goToToday = useCallback(() => {\n const today = new Date();\n setViewDate(new Date(today.getFullYear(), today.getMonth(), 1));\n setSelectedDay(toDateKey(today));\n }, []);\n\n /* ── Selected day tasks ── */\n const selectedDayTasks = useMemo(() => {\n if (!selectedDay) return [];\n return tasksByDate.get(selectedDay) || [];\n }, [selectedDay, tasksByDate]);\n\n return (\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between mb-3\">\n <Typography variant=\"subtitle1\">Calendar</Typography>\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"primary\"\n className=\"p-0 h-auto min-w-0\"\n onClick={goToToday}\n >\n Today\n </Button>\n </div>\n\n {/* Month nav */}\n <div className=\"flex items-center justify-between mb-2\">\n <IconButton\n size=\"smallest\"\n aria-label=\"Previous month\"\n onClick={goToPrevMonth}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </IconButton>\n <Typography variant=\"body2\" className=\"font-semibold\">\n {MONTH_NAMES[viewDate.getMonth()]} {viewDate.getFullYear()}\n </Typography>\n <IconButton\n size=\"smallest\"\n aria-label=\"Next month\"\n onClick={goToNextMonth}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </IconButton>\n </div>\n\n {loading ? (\n <Skeleton className=\"h-48 w-full rounded-lg\" />\n ) : (\n <>\n {/* Day headers */}\n <div className=\"grid grid-cols-7 mb-1\">\n {DAY_HEADERS.map(d => (\n <div key={d} className=\"text-center py-1\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"text-[10px] font-semibold uppercase tracking-wider\">\n {d}\n </Typography>\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-0.5\">\n {calendarDays.map((day) => {\n const dayTasks = tasksByDate.get(day.dateKey) || [];\n const hasTasks = dayTasks.length > 0;\n const isSelected = selectedDay === day.dateKey;\n\n // Count tasks by status\n const pendingCount = dayTasks.filter(t => t.values.status === \"pending\").length;\n const completedCount = dayTasks.filter(t => t.values.status === \"completed\").length;\n const hasOverdue = dayTasks.some(\n t => t.values.status === \"pending\" && isBeforeToday(new Date(t.values.dueDate!))\n );\n\n return (\n <button\n key={day.dateKey}\n onClick={() => setSelectedDay(isSelected ? null : day.dateKey)}\n className={cls(\n \"flex flex-col items-center justify-center py-1.5 rounded-md transition-colors duration-100 focus:outline-none\",\n day.isCurrentMonth\n ? \"text-text-primary dark:text-text-primary-dark\"\n : \"text-surface-300 dark:text-surface-650\",\n day.isToday && !isSelected && \"ring-1 ring-primary/50\",\n isSelected\n ? \"bg-primary/10 dark:bg-primary/15 ring-1 ring-primary/60\"\n : \"hover:bg-surface-100 dark:hover:bg-surface-800\",\n hasTasks && \"cursor-pointer\"\n )}\n >\n <Typography\n variant=\"caption\"\n color=\"inherit\"\n className={cls(\n \"leading-none tabular-nums text-[11px]\",\n day.isToday && \"font-semibold text-primary dark:text-primary-light\"\n )}\n >\n {day.date.getDate()}\n </Typography>\n\n {/* Task dots */}\n {hasTasks ? (\n <div className=\"flex items-center gap-0.5 mt-1 h-[5px]\">\n {hasOverdue && (\n <span className=\"w-[5px] h-[5px] rounded-full bg-red-500\" />\n )}\n {pendingCount > 0 && !hasOverdue && (\n <span className=\"w-[5px] h-[5px] rounded-full bg-primary\" />\n )}\n {completedCount > 0 && (\n <span className=\"w-[5px] h-[5px] rounded-full bg-emerald-500\" />\n )}\n </div>\n ) : (\n <div className=\"h-[5px] mt-1\" />\n )}\n </button>\n );\n })}\n </div>\n\n {/* Dot legend */}\n <div className=\"flex items-center gap-3 mt-3 mb-1 px-1\">\n <div className=\"flex items-center gap-1\">\n <span className=\"w-[5px] h-[5px] rounded-full bg-primary\" />\n <Typography variant=\"caption\" color=\"secondary\" className=\"text-[10px]\">Pending</Typography>\n </div>\n <div className=\"flex items-center gap-1\">\n <span className=\"w-[5px] h-[5px] rounded-full bg-red-500\" />\n <Typography variant=\"caption\" color=\"secondary\" className=\"text-[10px]\">Overdue</Typography>\n </div>\n <div className=\"flex items-center gap-1\">\n <span className=\"w-[5px] h-[5px] rounded-full bg-emerald-500\" />\n <Typography variant=\"caption\" color=\"secondary\" className=\"text-[10px]\">Done</Typography>\n </div>\n </div>\n\n {/* Selected day task list */}\n {selectedDay && (\n <div className=\"mt-2\">\n <Separator orientation=\"horizontal\" className=\"mb-2\" />\n {selectedDayTasks.length === 0 ? (\n <div className=\"py-3 text-center\">\n <Typography variant=\"caption\" color=\"secondary\">\n No tasks on this day\n </Typography>\n </div>\n ) : (\n <div className=\"flex flex-col gap-0.5\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"mb-1 px-1\">\n {selectedDayTasks.length} task{selectedDayTasks.length !== 1 ? \"s\" : \"\"} — {new Date(selectedDay + \"T00:00:00\").toLocaleDateString(\"en-US\", { weekday: \"short\", month: \"short\", day: \"numeric\" })}\n </Typography>\n {selectedDayTasks.map((task) => {\n const isPending = task.values.status === \"pending\";\n const isOverdue = isPending && isBeforeToday(new Date(task.values.dueDate!));\n return (\n <button\n key={task.id}\n onClick={() => onOpenTask(task.id)}\n className={cls(\n \"flex items-start gap-2 px-2 py-1.5 rounded-md text-left w-full\",\n \"hover:bg-surface-100 dark:hover:bg-surface-800 transition-colors duration-100 focus:outline-none\"\n )}\n >\n {/* Status dot */}\n <span\n className={cls(\n \"w-1.5 h-1.5 rounded-full mt-1.5 shrink-0\",\n isOverdue\n ? \"bg-red-500\"\n : isPending\n ? \"bg-primary\"\n : \"bg-emerald-500\"\n )}\n />\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"body2\" className=\"truncate leading-snug\">\n {task.values.title}\n </Typography>\n <div className=\"flex items-center gap-2\">\n {task.values.client?.name && (\n <Typography variant=\"caption\" color=\"secondary\" className=\"truncate text-[10px]\">\n {task.values.client.name}\n </Typography>\n )}\n {task.values.stageId && (\n <Typography variant=\"caption\" color=\"disabled\" className=\"truncate text-[10px]\">\n {stageLabels[task.values.stageId] || task.values.stageId}\n </Typography>\n )}\n </div>\n </div>\n {task.values.priority === \"high\" && (\n <Chip colorScheme=\"red\" size=\"smallest\">High</Chip>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","import React, { useState, useEffect, useMemo, useCallback } from \"react\";\nimport {\n Typography,\n Button,\n cls,\n Container,\n Card,\n Alert,\n defaultBorderMixin,\n Separator,\n TextField,\n Select,\n SelectItem\n} from \"@rebasepro/ui\";\nimport {\n RefreshCw,\n UserPlus,\n X,\n Check,\n Briefcase,\n Mail,\n Phone,\n User,\n Calendar,\n AlertTriangle,\n Plus\n} from \"lucide-react\";\n\nimport { DashboardMetrics } from \"./DashboardMetrics\";\nimport { PipelineOverview } from \"./PipelineOverview\";\nimport { RecentActivity } from \"./RecentActivity\";\nimport { TasksView } from \"./TasksView\";\nimport { CalendarWidget } from \"./CalendarWidget\";\n\n/* ── Types ────────────────────────────────────────────── */\n\ninterface Client {\n id: string;\n name: string;\n email: string;\n phone: string;\n stage: string;\n picture?: string;\n}\n\ninterface Task {\n id: string;\n values: {\n title: string;\n status: string;\n resolution: string | null;\n dueDate: string | null;\n stageId: string | null;\n description: string | null;\n notes: string | null;\n clientId: string | null;\n client?: { name?: string } | null;\n priority?: string | null;\n createdAt: string | null;\n };\n}\n\ninterface Activity {\n id: string;\n values: {\n type: string;\n description: string;\n createdAt: string;\n metadata?: {\n taskId?: string;\n taskTitle?: string;\n subject?: string;\n body?: string;\n to?: string;\n mode?: string;\n };\n };\n}\n\ninterface PipelineOption {\n id: string;\n name: string;\n isDefault: boolean;\n color: string;\n}\n\ninterface PipelineStage {\n stageKey: string;\n label: string;\n shortLabel: string;\n color: string;\n icon: string;\n sortOrder: number;\n isTerminal: boolean;\n isLostStage: boolean;\n count: number;\n}\n\n/* ── Color map ────────────────────────────────────────── */\n\nconst COLOR_MAP: Record<string, string> = {\n blue: \"#3b82f6\",\n indigo: \"#6366f1\",\n purple: \"#8b5cf6\",\n yellow: \"#eab308\",\n teal: \"#14b8a6\",\n green: \"#22c55e\",\n orange: \"#f97316\",\n gray: \"#6b7280\",\n red: \"#ef4444\",\n pink: \"#ec4899\",\n sky: \"#0ea5e9\",\n amber: \"#f59e0b\"\n};\n\nfunction resolveColor(colorName: string): string {\n return COLOR_MAP[colorName] ?? COLOR_MAP.gray;\n}\n\n/* ── Stage Labels ──────────────────────────────────────── */\n\nconst STAGE_LABELS: Record<string, string> = {\n incoming: \"Incoming\",\n email_sent: \"Intro Email\",\n discovery_call: \"Discovery\",\n agreements: \"Agreements\",\n onboarding: \"Onboarding\",\n active: \"Active\",\n delivered: \"Delivered\",\n completed: \"Done\"\n};\n\nconst PIPELINES: PipelineOption[] = [\n { id: \"main\", name: \"Main Sales Pipeline\", isDefault: true, color: \"blue\" },\n { id: \"partnerships\", name: \"Partnerships Funnel\", isDefault: false, color: \"indigo\" }\n];\n\nconst INITIAL_STAGES: Record<string, Omit<PipelineStage, \"count\">[]> = {\n main: [\n { stageKey: \"incoming\", label: \"Incoming\", shortLabel: \"Inbound\", color: \"blue\", icon: \"inbox\", sortOrder: 1, isTerminal: false, isLostStage: false },\n { stageKey: \"email_sent\", label: \"Intro Email\", shortLabel: \"Intro\", color: \"indigo\", icon: \"mail\", sortOrder: 2, isTerminal: false, isLostStage: false },\n { stageKey: \"discovery_call\", label: \"Discovery\", shortLabel: \"Disco\", color: \"purple\", icon: \"phone\", sortOrder: 3, isTerminal: false, isLostStage: false },\n { stageKey: \"agreements\", label: \"Agreements\", shortLabel: \"Contracts\", color: \"yellow\", icon: \"file-text\", sortOrder: 4, isTerminal: false, isLostStage: false },\n { stageKey: \"onboarding\", label: \"Onboarding\", shortLabel: \"Onboard\", color: \"teal\", icon: \"user-check\", sortOrder: 5, isTerminal: false, isLostStage: false },\n { stageKey: \"active\", label: \"Active\", shortLabel: \"Active\", color: \"green\", icon: \"activity\", sortOrder: 6, isTerminal: false, isLostStage: false },\n { stageKey: \"delivered\", label: \"Delivered\", shortLabel: \"Done\", color: \"orange\", icon: \"check-circle\", sortOrder: 7, isTerminal: true, isLostStage: false },\n { stageKey: \"completed\", label: \"Done\", shortLabel: \"Closed\", color: \"red\", icon: \"archive\", sortOrder: 8, isTerminal: true, isLostStage: true }\n ],\n partnerships: [\n { stageKey: \"incoming\", label: \"Outreach\", shortLabel: \"Outbound\", color: \"blue\", icon: \"send\", sortOrder: 1, isTerminal: false, isLostStage: false },\n { stageKey: \"discovery_call\", label: \"First Meeting\", shortLabel: \"Meet\", color: \"purple\", icon: \"users\", sortOrder: 2, isTerminal: false, isLostStage: false },\n { stageKey: \"agreements\", label: \"Proposal\", shortLabel: \"Prop\", color: \"yellow\", icon: \"file\", sortOrder: 3, isTerminal: false, isLostStage: false },\n { stageKey: \"active\", label: \"Partnered\", shortLabel: \"Live\", color: \"green\", icon: \"handshake\", sortOrder: 4, isTerminal: true, isLostStage: false }\n ]\n};\n\nconst INITIAL_CLIENTS: Client[] = [\n { id: \"client-1\", name: \"Alice Johnson\", email: \"alice@johnson.com\", phone: \"+1 (555) 0192\", stage: \"discovery_call\" },\n { id: \"client-2\", name: \"Bob Smith\", email: \"bob@smith.co\", phone: \"+1 (555) 0143\", stage: \"email_sent\" },\n { id: \"client-3\", name: \"Carol White\", email: \"carol@whitecorp.com\", phone: \"+1 (555) 0188\", stage: \"agreements\" },\n { id: \"client-4\", name: \"David Brown\", email: \"david.b@brown.net\", phone: \"+1 (555) 0177\", stage: \"onboarding\" },\n { id: \"client-5\", name: \"Eva Green\", email: \"eva@greenllc.com\", phone: \"+1 (555) 0165\", stage: \"active\" },\n { id: \"client-6\", name: \"Frank Miller\", email: \"frank@miller.org\", phone: \"+1 (555) 0112\", stage: \"completed\" },\n];\n\nconst INITIAL_TASKS: Task[] = [\n {\n id: \"task-1\",\n values: {\n title: \"Schedule discovery call\",\n status: \"pending\",\n resolution: null,\n dueDate: new Date(Date.now() + 86400000).toISOString().split('T')[0],\n stageId: \"discovery_call\",\n clientId: \"client-1\",\n priority: \"high\",\n description: \"Set up a 30-min Zoom call to discuss requirements and partnership scope.\",\n notes: \"Alice is in EST timezone, prefers morning slots.\",\n createdAt: new Date(Date.now() - 172800000).toISOString()\n }\n },\n {\n id: \"task-2\",\n values: {\n title: \"Draft partnership agreement\",\n status: \"pending\",\n resolution: null,\n dueDate: new Date(Date.now() - 172800000).toISOString().split('T')[0], // overdue\n stageId: \"agreements\",\n clientId: \"client-3\",\n priority: \"high\",\n description: \"Draft enterprise contract incorporating customized SLA definitions.\",\n notes: \"Carol requested special uptime guarantees in Appendix A.\",\n createdAt: new Date(Date.now() - 345600000).toISOString()\n }\n },\n {\n id: \"task-3\",\n values: {\n title: \"Send onboarding checklist\",\n status: \"pending\",\n resolution: null,\n dueDate: new Date(Date.now() + 172800000).toISOString().split('T')[0],\n stageId: \"onboarding\",\n clientId: \"client-4\",\n priority: \"medium\",\n description: \"Assemble welcome packet, Slack community invite link, and environment setup guidelines.\",\n notes: \"Must carbon copy David's CTO on all setup emails.\",\n createdAt: new Date(Date.now() - 86400000).toISOString()\n }\n },\n {\n id: \"task-4\",\n values: {\n title: \"Follow up on intro email\",\n status: \"pending\",\n resolution: null,\n dueDate: new Date(Date.now() - 86400000).toISOString().split('T')[0], // overdue\n stageId: \"email_sent\",\n clientId: \"client-2\",\n priority: \"medium\",\n description: \"Check if Bob had time to review the technical proposal sent last week.\",\n notes: \"Call if no email response by Friday.\",\n createdAt: new Date(Date.now() - 259200000).toISOString()\n }\n },\n {\n id: \"task-5\",\n values: {\n title: \"Review deliverables and request feedback\",\n status: \"pending\",\n resolution: null,\n dueDate: new Date(Date.now() + 432000000).toISOString().split('T')[0],\n stageId: \"active\",\n clientId: \"client-5\",\n priority: \"low\",\n description: \"Schedule final demo review, submit deliverables reports, and email feedback questionnaire.\",\n notes: \"\",\n createdAt: new Date(Date.now() - 86400000).toISOString()\n }\n }\n];\n\nconst INITIAL_COMPLETED_TASKS: Task[] = [\n {\n id: \"task-comp-1\",\n values: {\n title: \"Review inbound request form\",\n status: \"completed\",\n resolution: \"verified\",\n dueDate: new Date(Date.now() - 259200000).toISOString().split('T')[0],\n stageId: \"incoming\",\n clientId: \"client-1\",\n priority: \"medium\",\n description: \"Analyze initial request details submitted via web form.\",\n notes: \"\",\n createdAt: new Date(Date.now() - 345600000).toISOString()\n }\n },\n {\n id: \"task-comp-2\",\n values: {\n title: \"Send pricing brochure\",\n status: \"completed\",\n resolution: \"sent\",\n dueDate: new Date(Date.now() - 172800000).toISOString().split('T')[0],\n stageId: \"email_sent\",\n clientId: \"client-2\",\n priority: \"medium\",\n description: \"Send standard PDF booklet outlining custom packages and service tiers.\",\n notes: \"\",\n createdAt: new Date(Date.now() - 259200000).toISOString()\n }\n }\n];\n\nconst INITIAL_ACTIVITIES: Activity[] = [\n {\n id: \"act-1\",\n values: {\n type: \"email_sent\",\n description: \"Intro Email sent to Bob Smith\",\n createdAt: new Date(Date.now() - 3600000).toISOString(),\n metadata: {\n subject: \"Welcome to Rebase — Pricing Tiers & Guidelines\",\n body: \"Hi Bob,\\n\\nThanks for your interest in Rebase! I have attached our standard pricing sheet and product documentation for your review.\\n\\nLet's schedule a brief 15-minute call next week to answer any questions you might have.\\n\\nBest regards,\\nFrancesco\",\n to: \"bob@smith.co\",\n mode: \"simulated\"\n }\n }\n },\n {\n id: \"act-2\",\n values: {\n type: \"agreements_sent\",\n description: \"Agreements sent to Carol White\",\n createdAt: new Date(Date.now() - 14400000).toISOString(),\n metadata: {\n taskId: \"task-2\",\n taskTitle: \"Draft partnership agreement\"\n }\n }\n },\n {\n id: \"act-3\",\n values: {\n type: \"incoming\",\n description: \"Incoming lead Alice Johnson created\",\n createdAt: new Date(Date.now() - 86400000).toISOString()\n }\n },\n {\n id: \"act-4\",\n values: {\n type: \"note\",\n description: \"Added a note for David Brown: 'Prefers Slack for communications'\",\n createdAt: new Date(Date.now() - 172800000).toISOString()\n }\n }\n];\n\n/* ── Helpers ────────────────────────────────────────────── */\n\nfunction getGreeting(): string {\n const hour = new Date().getHours();\n if (hour < 12) return \"Good morning\";\n if (hour < 18) return \"Good afternoon\";\n return \"Good evening\";\n}\n\nfunction getFormattedDate(): string {\n return new Date().toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\"\n });\n}\n\n/* ── Main Component ─────────────────────────────────────── */\n\nexport function CrmDashboardDemo() {\n const [loading, setLoading] = useState(true);\n const [activitiesLoading, setActivitiesLoading] = useState(true);\n\n // Persisted states for mock DB\n const [clients, setClients] = useState<Client[]>(INITIAL_CLIENTS);\n const [tasks, setTasks] = useState<Task[]>(INITIAL_TASKS);\n const [completedTasks, setCompletedTasks] = useState<Task[]>(INITIAL_COMPLETED_TASKS);\n const [activities, setActivities] = useState<Activity[]>(INITIAL_ACTIVITIES);\n\n const [selectedPipelineId, setSelectedPipelineId] = useState<string>(\"main\");\n\n // Local Toast/Notifications\n const [toastMessage, setToastMessage] = useState<string | null>(null);\n\n // Drawer state (Mock side panel)\n const [activeSideEntity, setActiveSideEntity] = useState<{\n type: \"task\" | \"client\" | \"new_client\";\n id?: string;\n } | null>(null);\n\n // Email viewer state\n const [emailViewerOpen, setEmailViewerOpen] = useState(false);\n const [selectedEmail, setSelectedEmail] = useState<{ to: string; subject: string; body: string; html?: string; mode?: string } | null>(null);\n\n // Form states for adding new client\n const [newClientName, setNewClientName] = useState(\"\");\n const [newClientEmail, setNewClientEmail] = useState(\"\");\n const [newClientPhone, setNewClientPhone] = useState(\"\");\n const [newClientStage, setNewClientStage] = useState(\"incoming\");\n\n // Toggling tasks loading animation state\n const [togglingIds, setTogglingIds] = useState<Set<string>>(new Set());\n const [recentlyToggledIds, setRecentlyToggledIds] = useState<Set<string>>(new Set());\n\n // Completed section pagination\n const [completedLoaded, setCompletedLoaded] = useState(false);\n const [loadingCompleted, setLoadingCompleted] = useState(false);\n\n // Trigger initial load skeletons\n useEffect(() => {\n const timer1 = setTimeout(() => setLoading(false), 450);\n const timer2 = setTimeout(() => setActivitiesLoading(false), 600);\n return () => {\n clearTimeout(timer1);\n clearTimeout(timer2);\n };\n }, []);\n\n // Show custom toast alert\n const showToast = useCallback((msg: string) => {\n setToastMessage(msg);\n const timer = setTimeout(() => setToastMessage(null), 3000);\n return () => clearTimeout(timer);\n }, []);\n\n // Load completed tasks simulation\n const handleExpandCompleted = useCallback(() => {\n if (completedLoaded) return;\n setLoadingCompleted(true);\n setTimeout(() => {\n setCompletedLoaded(true);\n setLoadingCompleted(false);\n }, 300);\n }, [completedLoaded]);\n\n const handleLoadMoreCompleted = useCallback(() => {\n setLoadingCompleted(true);\n setTimeout(() => {\n setLoadingCompleted(false);\n showToast(\"Loaded additional completed tasks.\");\n }, 300);\n }, [showToast]);\n\n // Handle pipeline change\n const handlePipelineChange = useCallback((pipelineId: string) => {\n setSelectedPipelineId(pipelineId);\n setLoading(true);\n setTimeout(() => {\n setLoading(false);\n showToast(`Switched to ${PIPELINES.find(p => p.id === pipelineId)?.name}`);\n }, 200);\n }, [showToast]);\n\n // Derived maps\n const clientsMap = useMemo(() => {\n const map = new Map<string, { name: string; picture?: string }>();\n clients.forEach(c => map.set(c.id, { name: c.name }));\n return map;\n }, [clients]);\n\n const tasksMap = useMemo(() => {\n const map = new Map<string, any>();\n tasks.forEach(t => map.set(t.id, t));\n completedTasks.forEach(t => map.set(t.id, t));\n return map;\n }, [tasks, completedTasks]);\n\n // Task status toggling logic\n const handleToggleTask = useCallback((taskId: string, currentStatus: string) => {\n setTogglingIds(prev => new Set(prev).add(taskId));\n\n setTimeout(() => {\n if (currentStatus === \"pending\") {\n // Complete task\n const task = tasks.find(t => t.id === taskId);\n if (task) {\n setTasks(prev => prev.filter(t => t.id !== taskId));\n const completedTask: Task = {\n ...task,\n values: { ...task.values, status: \"completed\", resolution: \"done\" }\n };\n setCompletedTasks(prev => [completedTask, ...prev]);\n\n // Add activity\n const newAct: Activity = {\n id: `act-${Date.now()}`,\n values: {\n type: \"task_completed\",\n description: `Task completed: \"${task.values.title}\"`,\n createdAt: new Date().toISOString(),\n metadata: {\n taskId: task.id,\n taskTitle: task.values.title\n }\n }\n };\n setActivities(prev => [newAct, ...prev]);\n showToast(`Completed task: \"${task.values.title}\"`);\n }\n } else {\n // Re-open task\n const task = completedTasks.find(t => t.id === taskId);\n if (task) {\n setCompletedTasks(prev => prev.filter(t => t.id !== taskId));\n const pendingTask: Task = {\n ...task,\n values: { ...task.values, status: \"pending\", resolution: null }\n };\n setTasks(prev => [pendingTask, ...prev]);\n\n // Add activity\n const newAct: Activity = {\n id: `act-${Date.now()}`,\n values: {\n type: \"task_created\",\n description: `Task re-opened: \"${task.values.title}\"`,\n createdAt: new Date().toISOString(),\n metadata: {\n taskId: task.id,\n taskTitle: task.values.title\n }\n }\n };\n setActivities(prev => [newAct, ...prev]);\n showToast(`Re-opened task: \"${task.values.title}\"`);\n }\n }\n setTogglingIds(prev => {\n const next = new Set(prev);\n next.delete(taskId);\n return next;\n });\n }, 200);\n }, [tasks, completedTasks, showToast]);\n\n // Activity specific handlers\n const handleCompleteTaskFromActivity = useCallback((activity: any) => {\n const taskId = activity.values?.metadata?.taskId;\n if (taskId) {\n handleToggleTask(taskId, \"pending\");\n }\n }, [handleToggleTask]);\n\n const handleViewEmail = useCallback((activity: any) => {\n if (activity.values?.metadata?.subject) {\n setSelectedEmail({\n to: activity.values.metadata.to || \"\",\n subject: activity.values.metadata.subject,\n body: activity.values.metadata.body || \"\",\n html: activity.values.metadata.html || \"\",\n mode: activity.values.metadata.mode || \"simulated\"\n });\n setEmailViewerOpen(true);\n }\n }, []);\n\n const handleOpenTask = useCallback((activity: any) => {\n const taskId = activity.values?.metadata?.taskId;\n if (taskId) {\n setActiveSideEntity({ type: \"task\", id: taskId });\n }\n }, []);\n\n // Side panel open helpers\n const openTaskDrawer = useCallback((taskId: string) => {\n setActiveSideEntity({ type: \"task\", id: taskId });\n }, []);\n\n const openClientDrawer = useCallback((clientId: string) => {\n setActiveSideEntity({ type: \"client\", id: clientId });\n }, []);\n\n const openNewClientDrawer = useCallback(() => {\n setActiveSideEntity({ type: \"new_client\" });\n }, []);\n\n // Create client simulation\n const handleCreateClient = () => {\n if (!newClientName.trim()) return;\n\n const newId = `client-${Date.now()}`;\n const newClient: Client = {\n id: newId,\n name: newClientName,\n email: newClientEmail || `${newClientName.toLowerCase().replace(/\\s+/g, \".\")}@example.com`,\n phone: newClientPhone || \"+1 (555) 0100\",\n stage: newClientStage\n };\n\n setClients(prev => [...prev, newClient]);\n\n // Add auto task\n const newTask: Task = {\n id: `task-${Date.now()}`,\n values: {\n title: `Complete discovery onboarding for ${newClientName}`,\n status: \"pending\",\n resolution: null,\n dueDate: new Date(Date.now() + 259200000).toISOString().split('T')[0], // 3 days from now\n stageId: newClientStage,\n clientId: newId,\n priority: \"medium\",\n description: `Initial welcome packet and service review task for ${newClientName}.`,\n notes: \"\",\n createdAt: new Date().toISOString()\n }\n };\n setTasks(prev => [newTask, ...prev]);\n\n // Add activity\n const newAct: Activity = {\n id: `act-${Date.now()}`,\n values: {\n type: \"incoming\",\n description: `New client \"${newClientName}\" registered in \"${STAGE_LABELS[newClientStage] || newClientStage}\"`,\n createdAt: new Date().toISOString()\n }\n };\n setActivities(prev => [newAct, ...prev]);\n\n showToast(`Created client \"${newClientName}\"`);\n\n // Reset inputs\n setNewClientName(\"\");\n setNewClientEmail(\"\");\n setNewClientPhone(\"\");\n setNewClientStage(\"incoming\");\n setActiveSideEntity(null);\n };\n\n // Simulated navigation / pipeline filtering\n const handleNavigate = useCallback((path: string) => {\n if (path.includes(\"stage=\")) {\n // Simulated stage click filtering\n showToast(`Stage link clicked: simulated filtering.`);\n } else {\n showToast(`Simulated navigation to: ${path}`);\n }\n }, [showToast]);\n\n // Derived counts/funnel overview data\n const activeStagesData = useMemo(() => {\n const stagesList = INITIAL_STAGES[selectedPipelineId] || [];\n return stagesList.map(s => {\n const count = clients.filter(c => c.stage === s.stageKey).length;\n return { ...s, count } as PipelineStage;\n });\n }, [clients, selectedPipelineId]);\n\n const sortedStages = useMemo(() => {\n return [...activeStagesData].sort((a, b) => a.sortOrder - b.sortOrder);\n }, [activeStagesData]);\n\n const activeStagesList = useMemo(() =>\n sortedStages.filter(s => !s.isTerminal && !s.isLostStage),\n [sortedStages]\n );\n\n const closedStagesList = useMemo(() =>\n sortedStages.filter(s => s.isTerminal || s.isLostStage),\n [sortedStages]\n );\n\n const totalInPipeline = useMemo(() => {\n return clients.filter(c => c.stage !== \"completed\").length;\n }, [clients]);\n\n const insights = useMemo(() => {\n const activeClients = clients.filter(c => c.stage !== \"completed\" && c.stage !== \"delivered\").length;\n const overdueTaskCount = tasks.filter(t => {\n if (t.values.status !== \"pending\") return false;\n if (!t.values.dueDate) return false;\n return new Date(t.values.dueDate) < new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate());\n }).length;\n\n return {\n pipelines: PIPELINES,\n activeClients,\n potentialRevenue: activeClients * 2500,\n contractedRevenue: clients.filter(c => c.stage === \"completed\" || c.stage === \"active\").length * 8000,\n overdueTaskCount\n };\n }, [clients, tasks]);\n\n const totalRevenue = insights.contractedRevenue + insights.potentialRevenue;\n\n /* ── Render Drawer Sub-panels ──────────────────────────── */\n\n const renderDrawerTask = (taskId?: string) => {\n const task = tasksMap.get(taskId || \"\");\n if (!task) return <Typography variant=\"body2\" color=\"secondary\">Task not found.</Typography>;\n\n const isCompleted = task.values.status === \"completed\";\n const clientInfo = task.values.clientId ? clients.find(c => c.id === task.values.clientId) : null;\n const stageName = task.values.stageId ? STAGE_LABELS[task.values.stageId] : \"None\";\n\n return (\n <div className=\"flex-1 space-y-4\">\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase text-[9px] tracking-wider font-semibold block mb-1\">Task Title</Typography>\n <div className=\"flex items-start gap-2.5\">\n <span className=\"pt-1\">\n <input\n type=\"checkbox\"\n checked={isCompleted}\n onChange={() => handleToggleTask(task.id, task.values.status)}\n className=\"h-4 w-4 rounded border-surface-300 text-primary focus:ring-primary\"\n />\n </span>\n <Typography variant=\"h6\" className={isCompleted ? \"line-through text-text-disabled dark:text-text-disabled-dark\" : \"text-text-primary dark:text-text-primary-dark\"}>\n {task.values.title}\n </Typography>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4 py-2 border-y border-surface-200 dark:border-surface-700\">\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase text-[9px] tracking-wider block\">Due Date</Typography>\n <Typography variant=\"body2\" className=\"font-medium mt-0.5 inline-flex items-center gap-1\">\n <Calendar className=\"h-3.5 w-3.5 text-surface-400\" />\n {task.values.dueDate || \"No due date\"}\n </Typography>\n </div>\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase text-[9px] tracking-wider block\">Priority</Typography>\n <Typography variant=\"body2\" className=\"font-medium mt-0.5\">\n {task.values.priority === \"high\" ? (\n <span className=\"text-red-500 font-semibold uppercase text-xs\">High</span>\n ) : task.values.priority === \"medium\" ? (\n <span className=\"text-amber-500 font-semibold uppercase text-xs\">Medium</span>\n ) : (\n <span className=\"text-surface-450 dark:text-surface-500 uppercase text-xs\">Low</span>\n )}\n </Typography>\n </div>\n </div>\n\n {clientInfo && (\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase text-[9px] tracking-wider font-semibold block mb-1\">Related Client</Typography>\n <Card\n className=\"p-3 hover:bg-surface-accent-100 dark:hover:bg-surface-800 cursor-pointer transition-colors duration-150\"\n onClick={() => openClientDrawer(clientInfo.id)}\n >\n <div className=\"flex items-center gap-2.5\">\n <div className=\"w-8 h-8 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 flex items-center justify-center font-bold\">\n {clientInfo.name[0].toUpperCase()}\n </div>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"body2\" className=\"font-medium truncate\">{clientInfo.name}</Typography>\n <Typography variant=\"caption\" color=\"secondary\" className=\"truncate text-[11px] block\">{clientInfo.email}</Typography>\n </div>\n </div>\n </Card>\n </div>\n )}\n\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase text-[9px] tracking-wider block mb-0.5\">Pipeline Stage</Typography>\n <Typography variant=\"body2\" className=\"font-medium\">{stageName}</Typography>\n </div>\n\n {task.values.description && (\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase text-[9px] tracking-wider block mb-0.5\">Description</Typography>\n <div className=\"p-3 bg-surface-50 dark:bg-surface-900 rounded-md border border-surface-200 dark:border-surface-700\">\n <Typography variant=\"body2\" className=\"whitespace-pre-wrap text-text-primary dark:text-text-primary-dark\">\n {task.values.description}\n </Typography>\n </div>\n </div>\n )}\n\n {task.values.notes && (\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase text-[9px] tracking-wider block mb-0.5\">Notes</Typography>\n <Typography variant=\"body2\" color=\"secondary\" className=\"italic whitespace-pre-wrap\">\n “{task.values.notes}”\n </Typography>\n </div>\n )}\n </div>\n );\n };\n\n const renderDrawerClient = (clientId?: string) => {\n const client = clients.find(c => c.id === clientId);\n if (!client) return <Typography variant=\"body2\" color=\"secondary\">Client not found.</Typography>;\n\n const clientTasks = tasks.filter(t => t.values.clientId === client.id);\n const stageName = STAGE_LABELS[client.stage] || client.stage;\n\n return (\n <div className=\"flex-1 space-y-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-12 h-12 rounded-full bg-primary/10 text-primary dark:text-primary-light flex items-center justify-center text-xl font-bold\">\n {client.name[0].toUpperCase()}\n </div>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"h6\" className=\"truncate\">{client.name}</Typography>\n <div className=\"flex items-center gap-1.5 mt-0.5\">\n <span className=\"w-2 h-2 rounded-full bg-green-500\" />\n <Typography variant=\"caption\" color=\"secondary\">{stageName}</Typography>\n </div>\n </div>\n </div>\n\n <div className=\"space-y-2.5 py-3 border-y border-surface-200 dark:border-surface-700\">\n <div className=\"flex items-center gap-2 text-surface-600 dark:text-surface-300\">\n <Mail className=\"h-4 w-4 text-surface-400\" />\n <Typography variant=\"body2\">{client.email}</Typography>\n </div>\n <div className=\"flex items-center gap-2 text-surface-600 dark:text-surface-300\">\n <Phone className=\"h-4 w-4 text-surface-400\" />\n <Typography variant=\"body2\">{client.phone}</Typography>\n </div>\n </div>\n\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase text-[9px] tracking-wider font-semibold block mb-2\">Pending Client Tasks</Typography>\n {clientTasks.length === 0 ? (\n <Typography variant=\"body2\" color=\"secondary\" className=\"italic\">No pending tasks for this client.</Typography>\n ) : (\n <div className=\"space-y-1.5\">\n {clientTasks.map(t => (\n <Card\n key={t.id}\n className=\"p-2.5 hover:bg-surface-accent-100 dark:hover:bg-surface-800 cursor-pointer transition-colors duration-150\"\n onClick={() => openTaskDrawer(t.id)}\n >\n <div className=\"flex items-start gap-2\">\n <input\n type=\"checkbox\"\n checked={t.values.status === \"completed\"}\n onChange={(e) => {\n e.stopPropagation();\n handleToggleTask(t.id, t.values.status);\n }}\n className=\"h-3.5 w-3.5 mt-0.5 rounded border-surface-300 text-primary\"\n />\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"body2\" className=\"truncate font-medium leading-snug\">{t.values.title}</Typography>\n {t.values.dueDate && (\n <Typography variant=\"caption\" color=\"secondary\" className=\"text-[10px] block mt-0.5\">Due: {t.values.dueDate}</Typography>\n )}\n </div>\n </div>\n </Card>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"pt-2\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase text-[9px] tracking-wider font-semibold block mb-2\">Quick Actions</Typography>\n <div className=\"grid grid-cols-2 gap-2\">\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => {\n // Add simulated call note\n const newAct: Activity = {\n id: `act-${Date.now()}`,\n values: {\n type: \"zoom_setup\",\n description: `Scheduled discovery meeting with ${client.name}`,\n createdAt: new Date().toISOString()\n }\n };\n setActivities(prev => [newAct, ...prev]);\n showToast(\"Simulated action: Call scheduled\");\n }}\n >\n Schedule Call\n </Button>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => {\n // Add simulated email note\n const newAct: Activity = {\n id: `act-${Date.now()}`,\n values: {\n type: \"email_sent\",\n description: `Email sent to ${client.name}`,\n createdAt: new Date().toISOString(),\n metadata: {\n subject: \"Following up on discovery call\",\n body: `Hi ${client.name.split(\" \")[0]},\\n\\nJust wanted to follow up and see if you had any questions on the brochure.\\n\\nBest,\\nFrancesco`,\n to: client.email,\n mode: \"simulated\"\n }\n }\n };\n setActivities(prev => [newAct, ...prev]);\n showToast(\"Simulated action: Email sent\");\n }}\n >\n Send Email\n </Button>\n </div>\n </div>\n </div>\n );\n };\n\n const renderDrawerNewClient = () => {\n return (\n <div className=\"flex-1 flex flex-col justify-between\">\n <div className=\"space-y-4\">\n <Typography variant=\"subtitle1\" className=\"mb-2\">New Lead Details</Typography>\n\n <TextField\n label=\"Client Name\"\n required\n value={newClientName}\n onChange={e => setNewClientName(e.target.value)}\n placeholder=\"e.g. George Clark\"\n />\n\n <TextField\n label=\"Email Address\"\n value={newClientEmail}\n onChange={e => setNewClientEmail(e.target.value)}\n placeholder=\"e.g. george@clark.com\"\n />\n\n <TextField\n label=\"Phone Number\"\n value={newClientPhone}\n onChange={e => setNewClientPhone(e.target.value)}\n placeholder=\"e.g. +1 (555) 0122\"\n />\n\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"uppercase text-[9px] tracking-wider block mb-1\">Pipeline Stage</Typography>\n <Select\n value={newClientStage}\n onValueChange={(v) => setNewClientStage(v as string)}\n size=\"small\"\n renderValue={(v) => STAGE_LABELS[v as string] || v as string}\n position=\"popper\"\n >\n {Object.entries(STAGE_LABELS).map(([key, val]) => (\n <SelectItem key={key} value={key}>{val}</SelectItem>\n ))}\n </Select>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 pt-6 border-t border-surface-200 dark:border-surface-700 mt-6\">\n <Button\n variant=\"outlined\"\n color=\"neutral\"\n className=\"flex-1\"\n onClick={() => setActiveSideEntity(null)}\n >\n Cancel\n </Button>\n <Button\n variant=\"filled\"\n color=\"primary\"\n className=\"flex-1\"\n onClick={handleCreateClient}\n disabled={!newClientName.trim()}\n >\n Create\n </Button>\n </div>\n </div>\n );\n };\n\n return (\n <div className=\"relative w-full border rounded-xl bg-surface-50 dark:bg-surface-800 border-surface-200 dark:border-surface-700 shadow-sm flex flex-row\">\n {/* Dashboard main workspace */}\n <div className=\"flex-1 flex flex-col p-4 md:p-6 transition-all duration-300\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-end justify-between mb-6 gap-4\">\n <div>\n <Typography variant=\"h4\" className=\"tracking-tight\">\n {getGreeting()} 👋\n </Typography>\n <Typography variant=\"body2\" color=\"secondary\" className=\"mt-0.5\">\n {getFormattedDate()} — here's your crm overview.\n </Typography>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"text\"\n color=\"primary\"\n size=\"small\"\n onClick={() => {\n setLoading(true);\n setActivitiesLoading(true);\n setTimeout(() => {\n setLoading(false);\n setActivitiesLoading(false);\n showToast(\"Data refreshed.\");\n }, 300);\n }}\n disabled={loading}\n startIcon={<RefreshCw className={cls(\"h-4 w-4\", loading && \"animate-spin\")} />}\n >\n Refresh\n </Button>\n <Button\n variant=\"filled\"\n color=\"primary\"\n size=\"small\"\n onClick={openNewClientDrawer}\n startIcon={<UserPlus className=\"h-4 w-4\" />}\n >\n New Client\n </Button>\n </div>\n </div>\n\n {/* KPI metrics row */}\n <DashboardMetrics\n loading={loading}\n insights={insights}\n totalInPipeline={totalInPipeline}\n totalRevenue={totalRevenue}\n />\n\n {/* Pipeline visualizer */}\n <PipelineOverview\n loading={loading}\n insights={insights}\n selectedPipelineId={selectedPipelineId}\n onPipelineChange={handlePipelineChange}\n onNavigate={handleNavigate}\n sortedStages={sortedStages}\n activeStages={activeStagesList}\n closedStages={closedStagesList}\n totalInPipeline={totalInPipeline}\n resolveColor={resolveColor}\n />\n\n {/* Combined Tasks, Calendar, and RecentActivity */}\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6 mt-2\">\n <Card className=\"p-4 flex flex-col h-[400px]\">\n <TasksView\n loading={loading}\n tasks={tasks}\n togglingIds={togglingIds}\n onToggleTask={handleToggleTask}\n onOpenTask={openTaskDrawer}\n onOpenClient={openClientDrawer}\n clientsMap={clientsMap}\n pipelineStages={sortedStages}\n recentlyToggledIds={recentlyToggledIds}\n completedTasks={completedTasks}\n completedLoaded={completedLoaded}\n loadingCompleted={loadingCompleted}\n completedHasMore={false}\n onExpandCompleted={handleExpandCompleted}\n onLoadMoreCompleted={handleLoadMoreCompleted}\n />\n </Card>\n\n <div className=\"flex flex-col gap-6\">\n <Card className=\"p-4 h-auto\">\n <CalendarWidget\n loading={loading}\n tasks={tasks.concat(completedTasks)}\n onOpenTask={openTaskDrawer}\n />\n </Card>\n <RecentActivity\n activities={activities}\n activitiesLoading={activitiesLoading}\n tasksMap={tasksMap}\n onCompleteTask={handleCompleteTaskFromActivity}\n onViewEmail={handleViewEmail}\n onOpenTask={handleOpenTask}\n emailViewerOpen={emailViewerOpen}\n onEmailViewerOpenChange={setEmailViewerOpen}\n selectedEmail={selectedEmail}\n />\n </div>\n </div>\n </div>\n\n {/* Custom Mock Side panel sliding in */}\n <div className={cls(\n \"fixed top-0 right-0 bottom-0 w-full sm:w-[420px] bg-white dark:bg-surface-900 border-l border-surface-200 dark:border-surface-700 shadow-2xl z-40 transition-transform duration-300 ease-in-out flex flex-col\",\n activeSideEntity ? \"translate-x-0\" : \"translate-x-full\"\n )}>\n <div className=\"p-4 flex items-center justify-between border-b border-surface-200 dark:border-surface-800\">\n <Typography variant=\"subtitle1\" className=\"font-semibold uppercase tracking-wider text-[10px] color-secondary\">\n {activeSideEntity?.type === \"task\" ? \"Task Details\" : activeSideEntity?.type === \"client\" ? \"Client profile\" : \"Create Lead\"}\n </Typography>\n <button\n onClick={() => setActiveSideEntity(null)}\n className=\"p-1 rounded-md text-surface-400 hover:text-surface-700 hover:bg-surface-100 dark:hover:bg-surface-800 focus:outline-none\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n <div className=\"flex-1 overflow-y-auto p-5 flex flex-col\">\n {activeSideEntity?.type === \"task\" && renderDrawerTask(activeSideEntity.id)}\n {activeSideEntity?.type === \"client\" && renderDrawerClient(activeSideEntity.id)}\n {activeSideEntity?.type === \"new_client\" && renderDrawerNewClient()}\n </div>\n </div>\n\n {/* Backdrop click to close drawer */}\n {activeSideEntity && (\n <div\n onClick={() => setActiveSideEntity(null)}\n className=\"fixed inset-0 bg-black/20 dark:bg-black/50 z-30 transition-opacity duration-300\"\n />\n )}\n\n {/* Custom interactive toast popup */}\n <div className={cls(\n \"absolute bottom-4 left-4 z-50 transition-all duration-300 transform\",\n toastMessage ? \"translate-y-0 opacity-100\" : \"translate-y-2 opacity-0 pointer-events-none\"\n )}>\n {toastMessage && (\n <div className=\"px-4 py-3 bg-surface-900 dark:bg-surface-50 text-white dark:text-surface-900 text-xs font-medium rounded-lg shadow-lg flex items-center gap-2 border border-surface-800 dark:border-surface-200\">\n <Check className=\"h-4 w-4 text-green-500\" />\n <span>{toastMessage}</span>\n </div>\n )}\n </div>\n </div>\n );\n}\n","export type ProjectStatus = \"backlog\" | \"in_progress\" | \"in_review\" | \"done\";\nexport type ProjectPriority = \"low\" | \"medium\" | \"high\" | \"critical\";\n\nexport interface SampleProject {\n id: string;\n name: string;\n description: string;\n status: ProjectStatus;\n priority: ProjectPriority;\n assignee: string;\n tags: string[];\n dueDate: string;\n progress: number;\n createdAt: string;\n}\n\nexport const STATUS_CONFIG: Record<ProjectStatus, { label: string; color: string }> = {\n backlog: { label: \"Backlog\", color: \"gray\" },\n in_progress: { label: \"In Progress\", color: \"blue\" },\n in_review: { label: \"In Review\", color: \"purple\" },\n done: { label: \"Done\", color: \"green\" }\n};\n\nexport const PRIORITY_CONFIG: Record<ProjectPriority, { label: string; color: string }> = {\n low: { label: \"Low\", color: \"gray\" },\n medium: { label: \"Medium\", color: \"yellow\" },\n high: { label: \"High\", color: \"orange\" },\n critical: { label: \"Critical\", color: \"red\" }\n};\n\nexport const SAMPLE_PROJECTS: SampleProject[] = [\n { id: \"proj-1\", name: \"Website Redesign\", description: \"Complete overhaul of the marketing website with new brand guidelines\", status: \"in_progress\", priority: \"high\", assignee: \"Alice Johnson\", tags: [\"frontend\", \"design\"], dueDate: new Date(Date.now() + 7 * 86400000).toISOString().split(\"T\")[0], progress: 65, createdAt: new Date(Date.now() - 14 * 86400000).toISOString() },\n { id: \"proj-2\", name: \"API Rate Limiting\", description: \"Implement token-bucket rate limiting across all public endpoints\", status: \"in_review\", priority: \"critical\", assignee: \"Bob Smith\", tags: [\"backend\", \"security\"], dueDate: new Date(Date.now() + 2 * 86400000).toISOString().split(\"T\")[0], progress: 90, createdAt: new Date(Date.now() - 10 * 86400000).toISOString() },\n { id: \"proj-3\", name: \"Mobile Push Notifications\", description: \"Add support for push notifications on iOS and Android clients\", status: \"backlog\", priority: \"medium\", assignee: \"Carol White\", tags: [\"mobile\", \"backend\"], dueDate: new Date(Date.now() + 21 * 86400000).toISOString().split(\"T\")[0], progress: 0, createdAt: new Date(Date.now() - 3 * 86400000).toISOString() },\n { id: \"proj-4\", name: \"Dashboard Analytics\", description: \"Build real-time analytics dashboard with charts and KPI widgets\", status: \"in_progress\", priority: \"high\", assignee: \"David Brown\", tags: [\"frontend\", \"data\"], dueDate: new Date(Date.now() + 5 * 86400000).toISOString().split(\"T\")[0], progress: 40, createdAt: new Date(Date.now() - 7 * 86400000).toISOString() },\n { id: \"proj-5\", name: \"User Onboarding Flow\", description: \"Multi-step onboarding wizard with progress tracking and email triggers\", status: \"done\", priority: \"medium\", assignee: \"Eva Green\", tags: [\"frontend\", \"ux\"], dueDate: new Date(Date.now() - 2 * 86400000).toISOString().split(\"T\")[0], progress: 100, createdAt: new Date(Date.now() - 21 * 86400000).toISOString() },\n { id: \"proj-6\", name: \"Database Migration v3\", description: \"Migrate from PostgreSQL 14 to 16 with zero-downtime strategy\", status: \"backlog\", priority: \"low\", assignee: \"Frank Miller\", tags: [\"backend\", \"infrastructure\"], dueDate: new Date(Date.now() + 30 * 86400000).toISOString().split(\"T\")[0], progress: 0, createdAt: new Date(Date.now() - 1 * 86400000).toISOString() },\n { id: \"proj-7\", name: \"SSO Integration\", description: \"SAML 2.0 and OIDC single sign-on for enterprise customers\", status: \"in_progress\", priority: \"critical\", assignee: \"Alice Johnson\", tags: [\"backend\", \"security\", \"enterprise\"], dueDate: new Date(Date.now() + 3 * 86400000).toISOString().split(\"T\")[0], progress: 75, createdAt: new Date(Date.now() - 12 * 86400000).toISOString() },\n { id: \"proj-8\", name: \"E2E Test Suite\", description: \"Playwright-based end-to-end tests covering critical user journeys\", status: \"in_review\", priority: \"medium\", assignee: \"Bob Smith\", tags: [\"testing\", \"devops\"], dueDate: new Date(Date.now() + 1 * 86400000).toISOString().split(\"T\")[0], progress: 85, createdAt: new Date(Date.now() - 8 * 86400000).toISOString() },\n { id: \"proj-9\", name: \"Billing System Upgrade\", description: \"Stripe integration upgrade with metered billing and invoice PDF generation\", status: \"done\", priority: \"high\", assignee: \"Carol White\", tags: [\"backend\", \"payments\"], dueDate: new Date(Date.now() - 5 * 86400000).toISOString().split(\"T\")[0], progress: 100, createdAt: new Date(Date.now() - 28 * 86400000).toISOString() },\n { id: \"proj-10\", name: \"Dark Mode Polish\", description: \"Audit and fix all remaining dark mode inconsistencies across the app\", status: \"backlog\", priority: \"low\", assignee: \"David Brown\", tags: [\"frontend\", \"design\"], dueDate: new Date(Date.now() + 14 * 86400000).toISOString().split(\"T\")[0], progress: 0, createdAt: new Date(Date.now() - 2 * 86400000).toISOString() }\n];\n","import React, { useState, useMemo } from \"react\";\nimport {\n Typography, Chip, cls, defaultBorderMixin,\n Table, TableHeader, TableBody, TableRow, TableCell,\n SearchBar, IconButton, Tooltip, Checkbox, iconSize,\n Select, SelectItem\n} from \"@rebasepro/ui\";\nimport { Trash2Icon, PencilIcon, ArrowUpDownIcon, ArrowUpIcon, ArrowDownIcon } from \"lucide-react\";\nimport { SAMPLE_PROJECTS, STATUS_CONFIG, PRIORITY_CONFIG } from \"./sample_data\";\nimport type { ProjectStatus } from \"./sample_data\";\n\ntype SortField = \"name\" | \"status\" | \"priority\" | \"dueDate\";\ntype SortDirection = \"asc\" | \"desc\";\n\nexport function CollectionTableDemo() {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [sortField, setSortField] = useState<SortField>(\"name\");\n const [sortDirection, setSortDirection] = useState<SortDirection>(\"asc\");\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [statusFilter, setStatusFilter] = useState<string>(\"all\");\n\n const filteredAndSorted = useMemo(() => {\n let results = SAMPLE_PROJECTS.filter(p => {\n const matchesSearch = !searchTerm ||\n p.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n p.assignee.toLowerCase().includes(searchTerm.toLowerCase());\n const matchesStatus = statusFilter === \"all\" || p.status === statusFilter;\n return matchesSearch && matchesStatus;\n });\n results = [...results].sort((a, b) => {\n const cmp = String(a[sortField]).localeCompare(String(b[sortField]));\n return sortDirection === \"asc\" ? cmp : -cmp;\n });\n return results;\n }, [searchTerm, sortField, sortDirection, statusFilter]);\n\n const toggleSort = (field: SortField) => {\n if (sortField === field) setSortDirection(d => d === \"asc\" ? \"desc\" : \"asc\");\n else { setSortField(field); setSortDirection(\"asc\"); }\n };\n\n const toggleSelect = (id: string) => {\n setSelectedIds(prev => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id); else next.add(id);\n return next;\n });\n };\n\n const toggleSelectAll = (checked: boolean) => {\n setSelectedIds(checked ? new Set(filteredAndSorted.map(p => p.id)) : new Set());\n };\n\n const allSelected = filteredAndSorted.length > 0 && filteredAndSorted.every(p => selectedIds.has(p.id));\n\n const SortIcon = ({ field }: { field: SortField }) => {\n if (sortField !== field) return <ArrowUpDownIcon size={12} className=\"text-surface-400\" />;\n return sortDirection === \"asc\"\n ? <ArrowUpIcon size={12} className=\"text-primary\" />\n : <ArrowDownIcon size={12} className=\"text-primary\" />;\n };\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <SearchBar onTextSearch={(term) => setSearchTerm(term ?? \"\")} placeholder=\"Search projects…\" size=\"small\" />\n <Select value={statusFilter} onValueChange={setStatusFilter} size=\"small\" placeholder=\"Status\">\n <SelectItem value=\"all\">All Statuses</SelectItem>\n {(Object.entries(STATUS_CONFIG) as [ProjectStatus, { label: string }][]).map(([key, { label }]) => (\n <SelectItem key={key} value={key}>{label}</SelectItem>\n ))}\n </Select>\n {selectedIds.size > 0 && <Typography variant=\"caption\" color=\"secondary\">{selectedIds.size} selected</Typography>}\n </div>\n <div className={cls(\"rounded-lg border overflow-hidden\", defaultBorderMixin)}>\n <Table className=\"w-full\">\n <TableHeader>\n <TableCell header style={{ width: \"40px\" }}><Checkbox checked={allSelected} onCheckedChange={toggleSelectAll} size=\"small\" /></TableCell>\n <TableCell header><button onClick={() => toggleSort(\"name\")} className=\"flex items-center gap-1 cursor-pointer\"><Typography variant=\"caption\" className=\"font-semibold\">Name</Typography><SortIcon field=\"name\" /></button></TableCell>\n <TableCell header><button onClick={() => toggleSort(\"status\")} className=\"flex items-center gap-1 cursor-pointer\"><Typography variant=\"caption\" className=\"font-semibold\">Status</Typography><SortIcon field=\"status\" /></button></TableCell>\n <TableCell header><button onClick={() => toggleSort(\"priority\")} className=\"flex items-center gap-1 cursor-pointer\"><Typography variant=\"caption\" className=\"font-semibold\">Priority</Typography><SortIcon field=\"priority\" /></button></TableCell>\n <TableCell header><Typography variant=\"caption\" className=\"font-semibold\">Assignee</Typography></TableCell>\n <TableCell header><Typography variant=\"caption\" className=\"font-semibold\">Tags</Typography></TableCell>\n <TableCell header><button onClick={() => toggleSort(\"dueDate\")} className=\"flex items-center gap-1 cursor-pointer\"><Typography variant=\"caption\" className=\"font-semibold\">Due Date</Typography><SortIcon field=\"dueDate\" /></button></TableCell>\n <TableCell header style={{ width: \"80px\" }}><Typography variant=\"caption\" className=\"font-semibold\">Actions</Typography></TableCell>\n </TableHeader>\n <TableBody>\n {filteredAndSorted.map(project => (\n <TableRow key={project.id} className={cls(selectedIds.has(project.id) && \"bg-primary/[0.03] dark:bg-primary/[0.06]\")}>\n <TableCell style={{ width: \"40px\" }}><Checkbox checked={selectedIds.has(project.id)} onCheckedChange={() => toggleSelect(project.id)} size=\"small\" /></TableCell>\n <TableCell><div><Typography variant=\"body2\" className=\"font-medium\">{project.name}</Typography><Typography variant=\"caption\" color=\"secondary\" className=\"line-clamp-1\">{project.description}</Typography></div></TableCell>\n <TableCell><Chip colorScheme={STATUS_CONFIG[project.status].color} size=\"small\">{STATUS_CONFIG[project.status].label}</Chip></TableCell>\n <TableCell><Chip colorScheme={PRIORITY_CONFIG[project.priority].color} size=\"smallest\" outlined>{PRIORITY_CONFIG[project.priority].label}</Chip></TableCell>\n <TableCell><div className=\"flex items-center gap-2\"><div className=\"w-6 h-6 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 flex items-center justify-center text-[10px] font-bold shrink-0\">{project.assignee[0]}</div><Typography variant=\"body2\" className=\"truncate\">{project.assignee}</Typography></div></TableCell>\n <TableCell><div className=\"flex flex-wrap gap-1\">{project.tags.map(tag => (<Chip key={tag} size=\"smallest\" colorScheme=\"cyan\">{tag}</Chip>))}</div></TableCell>\n <TableCell><Typography variant=\"body2\" className=\"font-mono text-xs\">{project.dueDate}</Typography></TableCell>\n <TableCell style={{ width: \"80px\" }}><div className=\"flex gap-1\"><Tooltip title=\"Edit\" asChild><IconButton size=\"smallest\"><PencilIcon size={iconSize.smallest} /></IconButton></Tooltip><Tooltip title=\"Delete\" asChild><IconButton size=\"smallest\"><Trash2Icon size={iconSize.smallest} /></IconButton></Tooltip></div></TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n {filteredAndSorted.length === 0 && <div className=\"flex items-center justify-center py-8\"><Typography variant=\"label\" color=\"secondary\">No projects match your filters</Typography></div>}\n </div>\n <Typography variant=\"caption\" color=\"secondary\">{filteredAndSorted.length} of {SAMPLE_PROJECTS.length} projects</Typography>\n </div>\n );\n}\n","import React, { useState, useMemo } from \"react\";\nimport { Card, Typography, Chip, cls, defaultBorderMixin, SearchBar, ToggleButtonGroup } from \"@rebasepro/ui\";\nimport { LayoutGridIcon, ListIcon, FolderKanbanIcon } from \"lucide-react\";\nimport { SAMPLE_PROJECTS, STATUS_CONFIG, PRIORITY_CONFIG } from \"./sample_data\";\nimport type { SampleProject } from \"./sample_data\";\n\ntype CardSize = \"sm\" | \"md\" | \"lg\";\n\nexport function CardViewDemo() {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [cardSize, setCardSize] = useState<CardSize>(\"md\");\n\n const filtered = useMemo(() => {\n if (!searchTerm) return SAMPLE_PROJECTS;\n const lower = searchTerm.toLowerCase();\n return SAMPLE_PROJECTS.filter(p =>\n p.name.toLowerCase().includes(lower) || p.assignee.toLowerCase().includes(lower) || p.tags.some(t => t.toLowerCase().includes(lower))\n );\n }, [searchTerm]);\n\n const gridClass = useMemo(() => {\n switch (cardSize) {\n case \"sm\": return \"grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5\";\n case \"md\": return \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4\";\n case \"lg\": return \"grid-cols-1 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3\";\n }\n }, [cardSize]);\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <SearchBar onTextSearch={(term) => setSearchTerm(term ?? \"\")} placeholder=\"Search cards…\" size=\"small\" />\n <ToggleButtonGroup value={cardSize} onValueChange={setCardSize} options={[\n { value: \"sm\" as const, label: \"Small\", icon: <LayoutGridIcon size={14} /> },\n { value: \"md\" as const, label: \"Medium\", icon: <ListIcon size={14} /> },\n { value: \"lg\" as const, label: \"Large\", icon: <FolderKanbanIcon size={14} /> }\n ]} />\n <Typography variant=\"caption\" color=\"secondary\" className=\"ml-auto\">{filtered.length} projects</Typography>\n </div>\n <div className={cls(\"grid gap-4\", gridClass)}>\n {filtered.map(project => <ProjectCard key={project.id} project={project} compact={cardSize === \"sm\"} />)}\n </div>\n {filtered.length === 0 && <div className=\"flex items-center justify-center py-8\"><Typography variant=\"label\" color=\"secondary\">No projects match your search</Typography></div>}\n </div>\n );\n}\n\nfunction ProjectCard({ project, compact }: { project: SampleProject; compact?: boolean }) {\n const statusCfg = STATUS_CONFIG[project.status];\n const priorityCfg = PRIORITY_CONFIG[project.priority];\n const isOverdue = new Date(project.dueDate) < new Date() && project.status !== \"done\";\n\n return (\n <Card className={cls(\"cursor-pointer overflow-hidden group relative\", \"transition-all duration-200\", \"hover:shadow-lg hover:-translate-y-0.5\")}>\n <div className={cls(\"relative overflow-hidden bg-surface-100 dark:bg-surface-900\", compact ? \"h-20\" : \"aspect-[5/2]\")}>\n <div className=\"absolute inset-0 opacity-20 transition-all duration-300\" style={{ background: `linear-gradient(90deg, var(--color-primary) ${project.progress}%, transparent ${project.progress}%)` }} />\n <div className=\"absolute inset-0 flex flex-col items-center justify-center gap-1\">\n <FolderKanbanIcon size={compact ? 20 : 28} className=\"text-surface-400 dark:text-surface-500\" />\n {!compact && <Typography variant=\"caption\" color=\"secondary\" className=\"font-mono text-[10px]\">{project.progress}% complete</Typography>}\n </div>\n <div className=\"absolute inset-0 bg-black/0 group-hover:bg-black/10 transition-colors duration-200\" />\n <div className=\"absolute top-2 right-2\"><Chip colorScheme={priorityCfg.color} size=\"smallest\" outlined>{priorityCfg.label}</Chip></div>\n </div>\n <div className={compact ? \"p-2\" : \"p-3\"}>\n <Typography variant=\"caption\" color=\"disabled\" className=\"font-mono truncate block text-[10px]\">{project.id}</Typography>\n <div className=\"truncate my-1\"><Typography variant={compact ? \"caption\" : \"body2\"} className=\"font-medium\">{project.name}</Typography></div>\n {!compact && <Typography variant=\"caption\" color=\"secondary\" className=\"line-clamp-2 mb-2\">{project.description}</Typography>}\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n <Chip colorScheme={statusCfg.color} size=\"smallest\">{statusCfg.label}</Chip>\n {!compact && project.tags.slice(0, 2).map(tag => <Chip key={tag} size=\"smallest\" colorScheme=\"cyan\" className=\"!text-[10px]\">{tag}</Chip>)}\n {!compact && project.tags.length > 2 && <span className=\"text-[10px] text-surface-400\">+{project.tags.length - 2}</span>}\n </div>\n {!compact && (\n <div className={cls(\"flex items-center justify-between mt-2 pt-2 border-t\", defaultBorderMixin)}>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-5 h-5 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 flex items-center justify-center text-[9px] font-bold\">{project.assignee[0]}</div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"truncate max-w-[100px]\">{project.assignee}</Typography>\n </div>\n <Typography variant=\"caption\" className={cls(\"font-mono text-[10px]\", isOverdue ? \"text-red-500 font-semibold\" : \"text-surface-400\")}>{project.dueDate}</Typography>\n </div>\n )}\n </div>\n </Card>\n );\n}\n","import React, { useState, useCallback, useMemo } from \"react\";\nimport { Typography, Chip, cls, defaultBorderMixin, KanbanView, Alert } from \"@rebasepro/ui\";\nimport type { BoardItem, BoardItemViewProps } from \"@rebasepro/ui\";\nimport { FolderKanbanIcon } from \"lucide-react\";\nimport { SAMPLE_PROJECTS, PRIORITY_CONFIG } from \"./sample_data\";\nimport type { SampleProject, ProjectStatus } from \"./sample_data\";\n\nconst STATUS_COLUMNS: ProjectStatus[] = [\"backlog\", \"in_progress\", \"in_review\", \"done\"];\nconst COLUMN_LABELS: Record<ProjectStatus, string> = { backlog: \"Backlog\", in_progress: \"In Progress\", in_review: \"In Review\", done: \"Done\" };\nconst COLUMN_COLORS: Record<ProjectStatus, string> = { backlog: \"#6b7280\", in_progress: \"#3b82f6\", in_review: \"#8b5cf6\", done: \"#22c55e\" };\n\nfunction KanbanProjectCard({ item, isDragging, isGroupedOver, style }: BoardItemViewProps<SampleProject>) {\n const project = item.data;\n const priorityCfg = PRIORITY_CONFIG[project.priority];\n const isOverdue = new Date(project.dueDate) < new Date() && project.status !== \"done\";\n\n const backgroundColor = useMemo((): string => {\n if (isDragging) return \"bg-surface-100 dark:bg-surface-800\";\n if (isGroupedOver) return \"bg-surface-200 dark:bg-surface-700\";\n return \"bg-white dark:bg-surface-800 hover:bg-surface-50 dark:hover:bg-surface-700\";\n }, [isDragging, isGroupedOver]);\n\n const borderColor = useMemo((): string => isDragging ? \"ring-2 ring-primary\" : \"\", [isDragging]);\n\n return (\n <div style={style} className=\"py-1\" data-testid={item.id}>\n <div className={cls(\"group/card p-2 flex items-start border rounded-lg cursor-pointer transition-all duration-200\", defaultBorderMixin, borderColor, backgroundColor, \"hover:shadow-sm\")}>\n <div className=\"w-10 h-10 rounded-md shrink-0 mr-2 bg-surface-100 dark:bg-surface-900 flex items-center justify-center\">\n <FolderKanbanIcon size={16} className=\"text-surface-400\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"line-clamp-2 text-sm font-medium\">{project.name}</div>\n <div className=\"text-xs text-surface-500 mt-1 line-clamp-2 opacity-80\">{project.description}</div>\n <div className=\"flex items-center gap-1 mt-1.5 flex-wrap\">\n <Chip colorScheme={priorityCfg.color} size=\"smallest\" outlined className=\"!text-[10px] !leading-tight !py-0\">{priorityCfg.label}</Chip>\n {project.tags.slice(0, 2).map(tag => <Chip key={tag} size=\"smallest\" colorScheme=\"cyan\" className=\"!text-[10px] !leading-tight !py-0 max-w-[80px] truncate\">{tag}</Chip>)}\n </div>\n <div className=\"flex items-center justify-between mt-1.5\">\n <div className=\"flex items-center gap-1\">\n <div className=\"w-4 h-4 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 flex items-center justify-center text-[8px] font-bold\">{project.assignee[0]}</div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"truncate max-w-[80px] text-[10px]\">{project.assignee}</Typography>\n </div>\n <Typography variant=\"caption\" className={cls(\"font-mono text-[10px]\", isOverdue ? \"text-red-500 font-semibold\" : \"text-surface-400\")}>{project.dueDate}</Typography>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport function KanbanBoardDemo() {\n const [boardData, setBoardData] = useState<BoardItem<SampleProject>[]>(() => SAMPLE_PROJECTS.map(p => ({ id: p.id, data: p })));\n const [columns, setColumns] = useState<ProjectStatus[]>(STATUS_COLUMNS);\n\n const assignColumn = useCallback((item: BoardItem<SampleProject>): ProjectStatus => item.data.status, []);\n\n const handleItemsReorder = useCallback((items: BoardItem<SampleProject>[], moveInfo?: { itemId: string; sourceColumn: ProjectStatus; targetColumn: ProjectStatus }) => {\n const updatedItems = items.map(item => {\n if (moveInfo && item.id === moveInfo.itemId && moveInfo.sourceColumn !== moveInfo.targetColumn) {\n return { ...item, data: { ...item.data, status: moveInfo.targetColumn, progress: moveInfo.targetColumn === \"done\" ? 100 : item.data.progress } };\n }\n return item;\n });\n setBoardData(updatedItems);\n }, []);\n\n const handleColumnReorder = useCallback((reordered: ProjectStatus[]) => setColumns(reordered), []);\n\n const columnLoadingState = useMemo(() => {\n const state: Record<string, { loading: boolean; hasMore: boolean; itemCount: number; totalCount: number }> = {};\n for (const col of columns) {\n const count = boardData.filter(item => item.data.status === col).length;\n state[col] = { loading: false, hasMore: false, itemCount: count, totalCount: count };\n }\n return state;\n }, [boardData, columns]);\n\n return (\n <div className=\"space-y-3\">\n <Alert color=\"info\" size=\"small\">Drag and drop cards between columns to change status. Columns are also reorderable.</Alert>\n <div className={cls(\"rounded-lg border overflow-hidden\", defaultBorderMixin)} style={{ height: 520 }}>\n <KanbanView<SampleProject, ProjectStatus>\n data={boardData} columns={columns} columnLabels={COLUMN_LABELS} columnColors={COLUMN_COLORS}\n assignColumn={assignColumn} allowColumnReorder={true} onColumnReorder={handleColumnReorder}\n onItemsReorder={handleItemsReorder} ItemComponent={KanbanProjectCard} columnLoadingState={columnLoadingState}\n />\n </div>\n </div>\n );\n}\n","\n/**\n * UIReferenceView — hidden debug route at /debug/ui\n *\n * This file is a STATIC reference of the real UI patterns used across the app.\n * All markup / styles are copied verbatim from source files.\n * DO NOT add invented styles. Only copy from actual source files.\n *\n * Sources:\n * DefaultDrawer.tsx, DefaultAppBar.tsx, DrawerNavigationItem.tsx,\n * DrawerNavigationGroup.tsx, UsersView.tsx, RolesView.tsx\n */\nimport React, { useState } from \"react\";\nimport {\n Alert,\n AlertCircleIcon,\n Avatar,\n AppWindow,\n BooleanSwitch,\n Button,\n Checkbox,\n ChevronDownIcon,\n ChevronsLeftIcon,\n ChevronsRightIcon,\n Chip,\n CircleUserIcon,\n CircularProgress,\n cls,\n ColumnsIcon,\n defaultBorderMixin,\n FileIcon,\n FileTextIcon,\n FilterChip,\n FilterIcon,\n FolderIcon,\n IconButton,\n iconSize,\n KanbanIcon,\n LayoutGridIcon,\n ListIcon,\n LoadingButton,\n LogOutIcon,\n Menu,\n MenuItem,\n MoonIcon,\n MultiSelect,\n MultiSelectItem,\n PanelLeftIcon,\n PencilIcon,\n PlusIcon,\n SearchBar,\n Select,\n SelectItem,\n Separator,\n SettingsIcon,\n Skeleton,\n SunIcon,\n SunMoonIcon,\n Tab,\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n Tabs,\n TagIcon,\n TextField,\n Tooltip,\n Trash2Icon,\n TypeIcon,\n Typography,\n UserIcon\n} from \"@rebasepro/ui\";\nimport { RebaseLogo } from \"../RebaseLogo\";\nimport { CrmDashboardDemo } from \"./crm-dashboard/CrmDashboardDemo\";\nimport { CollectionTableDemo, CardViewDemo, KanbanBoardDemo } from \"./collection-views\";\n\nconst SECTIONS = [\n { id: \"drawer\", label: \"Drawer\", icon: PanelLeftIcon },\n { id: \"appbar\", label: \"App Bar\", icon: AppWindow },\n { id: \"tabs\", label: \"Tabs\", icon: ListIcon },\n { id: \"editor-sidebar\", label: \"Editor Sidebar\", icon: ColumnsIcon },\n { id: \"empty-states\", label: \"Empty States\", icon: FileIcon },\n { id: \"typography\", label: \"Typography\", icon: TypeIcon },\n { id: \"buttons\", label: \"Buttons\", icon: PlusIcon },\n { id: \"inputs\", label: \"Form Inputs\", icon: FileTextIcon },\n { id: \"chips-alerts\", label: \"Chips & Alerts\", icon: AlertCircleIcon },\n { id: \"users\", label: \"Users View\", icon: UserIcon },\n { id: \"user-dialog\", label: \"User Dialog\", icon: CircleUserIcon },\n { id: \"crm-dashboard\", label: \"CRM Dashboard\", icon: LayoutGridIcon },\n { id: \"collection-table\", label: \"Collection Table\", icon: ListIcon },\n { id: \"card-view\", label: \"Card View\", icon: LayoutGridIcon },\n { id: \"kanban-board\", label: \"Kanban Board\", icon: KanbanIcon }\n];\n\nexport function UIReferenceView() {\n const [activeSection, setActiveSection] = useState(\"drawer\");\n const scrollContainerRef = React.useRef<HTMLDivElement>(null);\n\n const scrollTo = (id: string) => {\n const el = document.getElementById(id);\n const container = scrollContainerRef.current;\n if (el && container) {\n const offsetTop = el.offsetTop - container.offsetTop;\n container.scrollTo({ top: offsetTop, behavior: \"smooth\" });\n }\n setActiveSection(id);\n };\n\n return (\n <div className=\"flex w-full\">\n\n {/* ── Sidebar nav (same structure as DefaultDrawer) ─────────────── */}\n <div className={cls(\"flex flex-col sticky top-0 h-screen grow-0 shrink-0 w-[200px] border-r\", defaultBorderMixin)}>\n {/* DrawerLogo */}\n <div className=\"flex flex-row items-center shrink-0 pt-4 pb-2 px-2\">\n <div className=\"shrink-0 flex items-center justify-center w-[56px] h-[40px]\">\n <RebaseLogo width=\"28px\" height=\"28px\"/>\n </div>\n <Typography variant=\"subtitle1\" noWrap className=\"truncate\">UI Ref</Typography>\n </div>\n\n {/* Nav entries */}\n <div className=\"mt-3 flex-grow overflow-scroll no-scrollbar\">\n <div className=\"my-2 mx-2 flex flex-col\">\n {/* Group header — from DrawerNavigationGroup */}\n <div className={cls(\"pl-4 pr-2 py-1 flex flex-row items-center transition-colors cursor-pointer hover:bg-surface-100 dark:hover:bg-surface-700/50 rounded-t-lg bg-surface-50 dark:bg-surface-950/30\")}>\n <ChevronDownIcon size={iconSize.smallest} className=\"text-surface-500 dark:text-surface-400 transition-transform duration-200 mr-1\"/>\n <Typography variant=\"caption\" color=\"secondary\" className=\"font-medium flex-grow line-clamp-1\">\n SECTIONS\n </Typography>\n </div>\n {/* Nav items — from DrawerNavigationItem */}\n <div className=\"overflow-hidden bg-surface-50 dark:bg-surface-950/30 rounded-b-lg\">\n {SECTIONS.map(s => {\n const IconComponent = s.icon;\n return (\n <div key={s.id}>\n <div\n onClick={() => scrollTo(s.id)}\n className={cls(\n \"rounded-lg truncate group/nav\",\n \"hover:bg-primary/5 dark:hover:bg-primary/5 text-text-primary dark:text-surface-200 hover:text-surface-900 dark:hover:text-white\",\n \"flex flex-row items-center\",\n \"pr-4 h-10\",\n \"font-medium text-xs cursor-pointer\",\n activeSection === s.id ? \"bg-primary/8 dark:bg-primary/10 text-primary dark:text-primary\" : \"\"\n )}\n >\n <div className={cls(\"shrink-0 flex items-center justify-center w-[56px] h-[40px] text-surface-500 dark:text-text-secondary-dark transition-colors duration-150 group-hover/nav:text-primary\", activeSection === s.id && \"text-primary dark:text-primary\")}>\n <IconComponent size={iconSize.small}/>\n </div>\n <div className=\"text-text-primary dark:text-surface-200 opacity-100 font-inherit truncate space-x-2\">\n {s.label.toUpperCase()}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* DrawerToggle — from DefaultDrawer */}\n <div className={cls(\"shrink-0 mt-auto border-t px-2 py-2\", defaultBorderMixin)}>\n <div className={cls(\n \"flex flex-row items-center rounded-lg cursor-pointer\",\n \"hover:bg-surface-accent-100 dark:hover:bg-surface-800\",\n \"transition-colors duration-150\",\n \"py-2\"\n )}>\n <div className=\"shrink-0 flex items-center justify-center w-[56px] h-[24px] text-surface-500 dark:text-surface-400\">\n <ChevronsLeftIcon size={iconSize.small}/>\n </div>\n <Typography variant=\"body2\" className=\"text-surface-500 dark:text-surface-400 select-none whitespace-nowrap\">\n Collapse\n </Typography>\n </div>\n </div>\n </div>\n\n {/* ── Main content area ───────────────────────────────────────────── */}\n <div ref={scrollContainerRef} className=\"flex-1\">\n\n {/* ═══════════════════════════════════════════════\n SECTION: Drawer\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"drawer\" title=\"Drawer — DefaultDrawer.tsx\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n The drawer wraps <code className=\"font-mono text-xs\">DrawerLogo</code>, scrollable <code className=\"font-mono text-xs\">DrawerNavigationGroup</code>s,\n and <code className=\"font-mono text-xs\">DrawerToggle</code>. Two visual states: collapsed (icon only, 72px) and expanded (280px).\n </Typography>\n <div className=\"flex gap-6 flex-wrap\">\n\n {/* Collapsed — exact markup from DefaultDrawer + DrawerNavigationItem */}\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-1\">Collapsed (72px)</Typography>\n <div className={cls(\"flex flex-col h-72 relative w-[72px] border rounded-lg overflow-hidden bg-white dark:bg-surface-900\", defaultBorderMixin)}>\n <div className=\"flex flex-row items-center shrink-0 pt-4 pb-2 px-2\">\n <div className=\"shrink-0 flex items-center justify-center w-[56px] h-[40px]\">\n <RebaseLogo width=\"28px\" height=\"28px\"/>\n </div>\n </div>\n <div className=\"mt-3 flex-grow overflow-hidden\">\n <div className=\"my-2 mx-2 flex flex-col\">\n <div className=\"overflow-hidden rounded-lg bg-surface-50 dark:bg-surface-950/30\">\n {[<FolderIcon key=\"folder\" size={iconSize.small}/>, <UserIcon key=\"user\" size={iconSize.small}/>, <TagIcon key=\"tag\" size={iconSize.small}/>].map((icon, i) => (\n <div key={i} className=\"rounded-lg truncate hover:bg-primary/5 dark:hover:bg-primary/5 flex flex-row items-center h-10\">\n <div className=\"shrink-0 flex items-center justify-center w-[56px] h-[40px] text-text-secondary dark:text-text-secondary-dark\">\n {icon}\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n <div className={cls(\"shrink-0 mt-auto border-t px-2 py-2\", defaultBorderMixin)}>\n <div className=\"flex flex-row items-center rounded-lg cursor-pointer hover:bg-surface-accent-100 dark:hover:bg-surface-800 transition-colors duration-150 py-2\">\n <div className=\"shrink-0 flex items-center justify-center w-[56px] h-[24px] text-surface-500 dark:text-surface-400\">\n <ChevronsRightIcon size={iconSize.small}/>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Expanded — exact markup from DefaultDrawer + DrawerNavigationGroup + DrawerNavigationItem */}\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-1\">Expanded (280px)</Typography>\n <div className={cls(\"flex flex-col h-72 relative w-[280px] border rounded-lg overflow-hidden bg-white dark:bg-surface-900\", defaultBorderMixin)}>\n {/* DrawerLogo */}\n <div className=\"flex flex-row items-center shrink-0 pt-4 pb-2 px-2\">\n <div className=\"shrink-0 flex items-center justify-center w-[56px] h-[40px]\">\n <RebaseLogo width=\"28px\" height=\"28px\"/>\n </div>\n <div className=\"flex flex-row items-center overflow-hidden transition-all duration-200 ease-in-out opacity-100 w-full ml-1\">\n <Typography variant=\"subtitle1\" noWrap className=\"truncate\">Rebase</Typography>\n </div>\n </div>\n {/* DrawerNavigationGroup */}\n <div className=\"mt-3 flex-grow overflow-hidden\">\n <div className=\"my-2 mx-2 flex flex-col\">\n <div className=\"pl-4 pr-2 py-1 flex flex-row items-center transition-colors cursor-pointer hover:bg-surface-100 dark:hover:bg-surface-700/50 rounded-t-lg bg-surface-50 dark:bg-surface-950/30\">\n <ChevronDownIcon size={iconSize.smallest} className=\"text-surface-500 dark:text-surface-400 mr-1\"/>\n <Typography variant=\"caption\" color=\"secondary\" className=\"font-medium flex-grow line-clamp-1\">CONTENT</Typography>\n </div>\n <div className=\"overflow-hidden bg-surface-50 dark:bg-surface-950/30 rounded-b-lg\">\n {[\n { label: \"Posts\",\nicon: <FolderIcon size={iconSize.small}/>,\nactive: true },\n { label: \"Authors\",\nicon: <UserIcon size={iconSize.small}/>,\nactive: false },\n { label: \"Tags\",\nicon: <TagIcon size={iconSize.small}/>,\nactive: false }\n ].map(({ label, icon, active }) => (\n <div key={label} className={cls(\n \"rounded-lg truncate hover:bg-primary/5 dark:hover:bg-primary/5 text-text-primary dark:text-surface-200 hover:text-surface-900 dark:hover:text-white flex flex-row items-center pr-4 h-10 font-medium text-xs cursor-pointer\",\n active ? \"bg-primary/8 dark:bg-primary/10 text-primary dark:text-primary\" : \"\"\n )}>\n <div className={cls(\"shrink-0 flex items-center justify-center w-[56px] h-[40px] transition-colors duration-150\", active ? \"text-primary dark:text-primary\" : \"text-surface-500 dark:text-text-secondary-dark\")}>\n {icon}\n </div>\n <div className=\"text-text-primary dark:text-surface-200 font-inherit truncate\">\n {label.toUpperCase()}\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n {/* DrawerToggle */}\n <div className={cls(\"shrink-0 mt-auto border-t px-2 py-2\", defaultBorderMixin)}>\n <div className=\"flex flex-row items-center rounded-lg cursor-pointer hover:bg-surface-accent-100 dark:hover:bg-surface-800 transition-colors duration-150 py-2\">\n <div className=\"shrink-0 flex items-center justify-center w-[56px] h-[24px] text-surface-500 dark:text-surface-400\">\n <ChevronsLeftIcon size={iconSize.small}/>\n </div>\n <div className=\"overflow-hidden transition-all duration-200 ease-in-out opacity-100 w-auto\">\n <Typography variant=\"body2\" className=\"text-surface-500 dark:text-surface-400 select-none whitespace-nowrap\">\n Collapse\n </Typography>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: AppBar\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"appbar\" title=\"App Bar — DefaultAppBar.tsx\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n Fixed at top (<code className=\"font-mono text-xs\">h-16 absolute top-0</code>). Contains breadcrumbs (caption + body2), Content/Studio pill toggle,\n theme menu, and user avatar menu via <code className=\"font-mono text-xs\">Menu</code>.\n </Typography>\n {/* Exact classes from DefaultAppBar line 121-130 */}\n <div className={cls(\"w-full h-16 flex flex-row gap-2 px-4 items-center border rounded-lg relative\", defaultBorderMixin)}>\n {/* Breadcrumbs — from DefaultAppBar line 157-188 */}\n <div className=\"mr-8 hidden lg:block\">\n <div className=\"flex flex-row gap-2 items-center\">\n <Typography variant=\"caption\" color=\"secondary\">/</Typography>\n <div className=\"flex flex-row items-center gap-2 whitespace-nowrap\">\n <Typography variant=\"body2\">Posts</Typography>\n <span className=\"text-xs text-surface-accent-500 dark:text-surface-accent-400 bg-surface-100 dark:bg-surface-700 px-1 py-0 rounded\">42</span>\n </div>\n <Typography variant=\"caption\" color=\"secondary\">/</Typography>\n <div className=\"flex flex-row items-center gap-2 whitespace-nowrap\">\n <Typography variant=\"body2\">My Post</Typography>\n </div>\n </div>\n </div>\n <div className=\"grow\"/>\n {/* Content/Studio toggle — from DefaultAppBar line 204-225 */}\n <div className={cls(\"mr-2 hidden sm:flex bg-surface-100 dark:bg-surface-950 rounded-lg p-0.5 border\", defaultBorderMixin)}>\n <button className={cls(\"px-3 py-1 text-xs font-semibold rounded-md transition-all\", \"bg-white dark:bg-surface-900 shadow-sm text-primary dark:text-primary-400\")}>\n Content\n </button>\n <button className={cls(\"px-3 py-1 text-xs font-semibold rounded-md transition-all\", \"text-surface-500 hover:text-surface-900 dark:hover:text-white\")}>\n Studio\n </button>\n </div>\n {/* Theme menu — from DefaultAppBar line 227-241 */}\n <Menu trigger={\n <IconButton color=\"inherit\">\n <MoonIcon/>\n </IconButton>\n }>\n <MenuItem><MoonIcon size={iconSize.smallest}/> Dark</MenuItem>\n <MenuItem><SunIcon size={iconSize.smallest}/> Light</MenuItem>\n <MenuItem><SunMoonIcon size={iconSize.smallest}/> System</MenuItem>\n </Menu>\n {/* Avatar menu — from DefaultAppBar line 243-270 */}\n <Menu trigger={<Avatar>A</Avatar>}>\n <div className=\"px-4 py-2 mb-2\">\n <Typography variant=\"body1\" color=\"secondary\">Alice Johnson</Typography>\n <Typography variant=\"body2\" color=\"secondary\">alice@example.com</Typography>\n </div>\n <MenuItem><SettingsIcon/> Account Settings</MenuItem>\n <MenuItem><LogOutIcon/> Log Out</MenuItem>\n </Menu>\n </div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: Tabs\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"tabs\" title=\"Tabs — Tabs.tsx\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n All editor components use <code className=\"font-mono text-xs\">variant="boxy"</code> tabs for sidebar navigation.\n The boxy variant provides a segmented, flat tab bar that integrates tightly with editor chrome.\n </Typography>\n\n <div className=\"flex flex-col gap-6\">\n {/* Default variant */}\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">variant="default"</Typography>\n <Tabs value=\"tab1\" onValueChange={() => {}}>\n <Tab value=\"tab1\">Schema</Tab>\n <Tab value=\"tab2\">Snippets</Tab>\n <Tab value=\"tab3\">History</Tab>\n </Tabs>\n </div>\n\n {/* Boxy variant — exact pattern from SQLEditorSidebar, JSEditorSidebar, RLSEditor */}\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">variant="boxy" (Editor Standard)</Typography>\n <div className={cls(\"border rounded-lg overflow-hidden w-[320px]\", defaultBorderMixin)}>\n <Tabs value=\"schema\" onValueChange={() => {}} variant=\"boxy\" className=\"border-b border-surface-200 dark:border-surface-950\">\n <Tab value=\"schema\">Schema</Tab>\n <Tab value=\"snippets\">Snippets</Tab>\n <Tab value=\"history\">History</Tab>\n </Tabs>\n {/* Section header pattern — used in all editor sidebars */}\n <div className={cls(\"p-3 border-b flex justify-between items-center bg-surface-50 dark:bg-surface-900\", defaultBorderMixin)}>\n <Typography variant=\"caption\" className=\"font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark\">TABLES</Typography>\n <IconButton size=\"small\">\n <SettingsIcon size={iconSize.smallest}/>\n </IconButton>\n </div>\n <div className=\"p-2 h-24\">\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark italic p-2\">Tab content area…</Typography>\n </div>\n </div>\n </div>\n\n {/* Toolbar tabs — from SQLEditor/JSEditor main toolbar */}\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">Toolbar Tabs (boxy, inline with controls)</Typography>\n <div className={cls(\"border rounded-lg overflow-hidden flex items-center justify-between pr-2 bg-white dark:bg-surface-950\", defaultBorderMixin)}>\n <div className=\"flex items-center\">\n <Tabs value=\"query1\" onValueChange={() => {}} variant=\"boxy\" className=\"w-[unset] flex-shrink-0\">\n <Tab value=\"query1\" className=\"flex items-center gap-1.5\">\n <svg className=\"w-3.5 h-3.5 text-blue-500\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4\"/></svg>\n Query 1\n </Tab>\n <Tab value=\"query2\" className=\"flex items-center gap-1.5\">\n <svg className=\"w-3.5 h-3.5 text-blue-500\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4\"/></svg>\n Query 2\n </Tab>\n </Tabs>\n <IconButton size=\"small\" className=\"ml-2 flex-shrink-0\">\n <PlusIcon/>\n </IconButton>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Button variant=\"text\" size=\"small\">Explain</Button>\n <div className=\"h-4 w-px bg-surface-200 dark:bg-surface-950\"/>\n <Button size=\"small\" color=\"primary\">Run</Button>\n </div>\n </div>\n </div>\n </div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: Editor Sidebar\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"editor-sidebar\" title=\"Editor Sidebar — Harmonized Pattern\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n All studio editor components (SQL, JS, RLS, Collection) share the same underlying sidebar foundation:\n <code className=\"font-mono text-xs\">Tabs variant="boxy"</code> at top (optional) → section header with uppercase label → scrollable list.\n While SQL/JS/RLS use dense tree entries, the Collection Schema Editor uses larger items (<code className=\"font-mono text-xs\">px-3 py-2</code>, <code className=\"font-mono text-xs\">text-sm</code>) suitable for primary navigation.\n </Typography>\n\n <div className=\"flex gap-6 flex-wrap\">\n {/* SQL Editor Sidebar replica */}\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-1\">SQL Editor Sidebar</Typography>\n <div className={cls(\"flex flex-col h-72 w-[240px] border rounded-lg overflow-hidden\", defaultBorderMixin)}>\n <Tabs value=\"schema\" onValueChange={() => {}} variant=\"boxy\" className=\"border-b border-surface-200 dark:border-surface-950\">\n <Tab value=\"schema\">Schema</Tab>\n <Tab value=\"snippets\">Snippets</Tab>\n <Tab value=\"history\">History</Tab>\n </Tabs>\n <div className={cls(\"p-3 border-b flex justify-between items-center bg-surface-50 dark:bg-surface-900\", defaultBorderMixin)}>\n <Typography variant=\"caption\" className=\"font-bold uppercase tracking-wider text-text-secondary dark:text-text-secondary-dark\">TABLES</Typography>\n <IconButton size=\"small\">\n <SettingsIcon size={iconSize.smallest}/>\n </IconButton>\n </div>\n <div className=\"flex-grow overflow-y-auto no-scrollbar p-1\">\n {/* Schema tree items — from SchemaBrowser */}\n <div className=\"mb-2\">\n <div className=\"flex items-center p-1 cursor-pointer hover:bg-surface-100 dark:hover:bg-surface-900 rounded transition-colors\">\n <svg className=\"w-3 h-3 mr-1 rotate-90\" fill=\"currentColor\" viewBox=\"0 0 20 20\"><path d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"/></svg>\n <Typography variant=\"body2\" className=\"text-text-primary dark:text-text-primary-dark font-medium text-xs\">public</Typography>\n </div>\n <div className=\"ml-3 mt-1 space-y-1\">\n {[\"users\", \"posts\", \"comments\"].map(t => (\n <div key={t} className=\"flex items-center p-1 cursor-pointer hover:bg-surface-100 dark:hover:bg-surface-900 rounded transition-colors group\">\n <svg className=\"w-3.5 h-3.5 mr-1 shrink-0 text-text-disabled dark:text-text-disabled-dark\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 10h18M3 14h18m-9-4v8m-7 0h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"/></svg>\n <Typography variant=\"body2\" className=\"text-text-secondary dark:text-text-secondary-dark text-xs truncate\">{t}</Typography>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* RLS Editor Sidebar replica */}\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-1\">RLS Editor Sidebar</Typography>\n <div className={cls(\"flex flex-col h-72 w-[240px] border rounded-lg overflow-hidden\", defaultBorderMixin)}>\n <Tabs value=\"tables\" onValueChange={() => {}} variant=\"boxy\" className=\"border-b border-surface-200 dark:border-surface-950\">\n <Tab value=\"tables\">Tables</Tab>\n <Tab value=\"info\">Info</Tab>\n </Tabs>\n <div className={cls(\"p-3 border-b flex justify-between items-center bg-surface-50 dark:bg-surface-900\", defaultBorderMixin)}>\n <Typography variant=\"caption\" className=\"font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark\">RLS</Typography>\n <IconButton size=\"small\">\n <SettingsIcon size={iconSize.smallest}/>\n </IconButton>\n </div>\n <div className=\"flex-grow overflow-y-auto no-scrollbar p-1\">\n <div className=\"mb-2\">\n <div className=\"flex items-center p-1 cursor-pointer hover:bg-surface-100 dark:hover:bg-surface-900 rounded transition-colors\">\n <svg className=\"w-3 h-3 mr-1 rotate-90\" fill=\"currentColor\" viewBox=\"0 0 20 20\"><path d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"/></svg>\n <Typography variant=\"body2\" className=\"text-text-primary dark:text-text-primary-dark font-medium text-xs\">public</Typography>\n </div>\n <div className=\"ml-3 mt-1 space-y-0.5\">\n {[{ name: \"users\",\nenabled: true }, { name: \"posts\",\nenabled: true }, { name: \"sessions\",\nenabled: false }].map(t => (\n <div key={t.name} className={cls(\"flex items-center p-1 cursor-pointer rounded transition-colors\", t.name === \"users\" ? \"bg-primary/10 text-primary dark:bg-primary/20\" : \"hover:bg-surface-100 dark:hover:bg-surface-900 text-text-secondary\")}>\n <svg className=\"w-3.5 h-3.5 mr-1 shrink-0 text-text-disabled\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 10h18M3 14h18m-9-4v8m-7 0h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"/></svg>\n <Typography variant=\"body2\" className=\"text-xs truncate flex-1\">{t.name}</Typography>\n <div className={cls(\"w-1.5 h-1.5 rounded-full shrink-0\", t.enabled ? \"bg-green-500\" : \"bg-orange-400 opacity-50\")}/>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Collection Editor Sidebar replica */}\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-1\">Collection Editor Sidebar</Typography>\n <div className={cls(\"flex flex-col h-72 w-[240px] border rounded-lg overflow-hidden bg-white dark:bg-surface-950\", defaultBorderMixin)}>\n <div className={cls(\"p-3 border-b flex justify-between items-center bg-surface-50 dark:bg-surface-900\", defaultBorderMixin)}>\n <Typography variant=\"caption\" className=\"font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark\">COLLECTIONS</Typography>\n <IconButton size=\"small\">\n <PlusIcon size={iconSize.smallest}/>\n </IconButton>\n </div>\n <div className=\"flex-grow overflow-y-auto no-scrollbar p-2 space-y-0.5\">\n {[{ name: \"Authors\" }, { name: \"Posts\",\nselected: true }, { name: \"Tags\" }].map(c => (\n <div key={c.name} className={cls(\"flex items-center gap-3 px-3 py-2 cursor-pointer rounded-md text-sm transition-colors\", c.selected ? \"bg-primary/10 text-primary dark:bg-primary/20 dark:text-primary-light\" : \"hover:bg-surface-100 dark:hover:bg-surface-900 text-text-secondary dark:text-text-secondary-dark\")}>\n <FolderIcon size={iconSize.small} className={cls(c.selected ? \"text-primary dark:text-primary-light\" : \"text-text-secondary dark:text-text-secondary-dark\")}/>\n <span className=\"truncate flex-1\">{c.name}</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: Empty States\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"empty-states\" title=\"Empty States — Canonical Pattern\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n All empty / placeholder states share the same layout: a centered <code className=\"font-mono text-xs\">flex-col</code> container\n with <code className=\"font-mono text-xs\">Typography variant="label"</code> for the message and a <code className=\"font-mono text-xs\">Button</code> with <code className=\"font-mono text-xs\">AddIcon</code> for the primary action.\n Sources: <code className=\"font-mono text-xs\">CollectionPropertiesEditorForm</code>, <code className=\"font-mono text-xs\">CollectionsStudioView</code>, <code className=\"font-mono text-xs\">CollectionStudioView</code>.\n </Typography>\n\n <div className=\"flex gap-6 flex-wrap\">\n {/* Property editor empty state */}\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-1\">Property Editor (no selection)</Typography>\n <div className={cls(\"flex flex-col items-center justify-center h-48 w-[320px] border rounded-lg\", defaultBorderMixin)}>\n <div className=\"flex flex-col items-center justify-center h-full gap-4\">\n <Typography variant=\"label\">\n Select a property to edit it\n </Typography>\n <Button>\n <PlusIcon/>\n Add new property\n </Button>\n </div>\n </div>\n </div>\n\n {/* Property editor empty collection state */}\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-1\">Property Editor (empty collection)</Typography>\n <div className={cls(\"flex flex-col items-center justify-center h-48 w-[320px] border rounded-lg\", defaultBorderMixin)}>\n <div className=\"flex flex-col items-center justify-center h-full gap-4\">\n <Typography variant=\"label\">\n Now you can add your first property\n </Typography>\n <Button>\n <PlusIcon/>\n Add new property\n </Button>\n </div>\n </div>\n </div>\n\n {/* Collection list empty state */}\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-1\">Collection ListIcon (no selection)</Typography>\n <div className={cls(\"flex flex-col items-center justify-center h-48 w-[320px] border rounded-lg\", defaultBorderMixin)}>\n <div className=\"flex flex-col items-center justify-center h-full gap-4\">\n <Typography variant=\"label\">\n Select a collection or create a new one to start editing\n </Typography>\n <Button>\n <PlusIcon/>\n Add new collection\n </Button>\n </div>\n </div>\n </div>\n </div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: Typography\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"typography\" title=\"Typography\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n All variants from <code className=\"font-mono text-xs\">Typography</code>. Colors: primary (default), secondary, disabled, error.\n </Typography>\n <div className=\"flex flex-col gap-3\">\n {([\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"subtitle1\", \"subtitle2\", \"body1\", \"body2\", \"caption\", \"label\", \"button\"] as const).map(v => (\n <div key={v} className={cls(\"flex items-baseline gap-4 border-b pb-3 last:border-0\", defaultBorderMixin)}>\n <span className=\"w-24 shrink-0 text-xs text-surface-400 font-mono\">{v}</span>\n <Typography variant={v}>The quick brown fox jumps over the lazy dog</Typography>\n </div>\n ))}\n </div>\n <div className=\"flex gap-4 flex-wrap mt-4\">\n {([\"primary\", \"secondary\", \"disabled\", \"error\"] as const).map(c => (\n <Typography key={c} color={c}>color="{c}"</Typography>\n ))}\n </div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: Buttons\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"buttons\" title=\"Buttons\">\n <div className=\"flex flex-col gap-6\">\n {([\"filled\", \"text\"] as const).map(variant => (\n <div key={variant}>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">variant="{variant}"</Typography>\n <div className=\"flex flex-wrap gap-3 items-center\">\n {([\"primary\", \"secondary\", \"text\", \"error\", \"neutral\"] as const).map(color => (\n <Button key={color} variant={variant} color={color}>{color.charAt(0).toUpperCase() + color.slice(1)}</Button>\n ))}\n <Button variant={variant} disabled>Disabled</Button>\n </div>\n </div>\n ))}\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">sizes</Typography>\n <div className=\"flex flex-wrap items-end gap-3\">\n {([\"small\", \"medium\", \"large\", \"xl\", \"2xl\"] as const).map(s => (\n <Button key={s} size={s}>{s.charAt(0).toUpperCase() + s.slice(1)}</Button>\n ))}\n </div>\n </div>\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">IconButton — sizes</Typography>\n <div className=\"flex flex-wrap gap-3 items-center\">\n {([\n { s: \"smallest\" as const, icon: <PencilIcon size={14}/> },\n { s: \"small\" as const, icon: <PencilIcon size={16}/> },\n { s: \"medium\" as const, icon: <PencilIcon size={20}/> },\n { s: \"large\" as const, icon: <PencilIcon size={24}/> }\n ]).map(({ s, icon }) => (\n <div key={s} className=\"flex flex-col items-center gap-1\">\n <IconButton size={s}>{icon}</IconButton>\n <Typography variant=\"caption\" color=\"secondary\">{s.charAt(0).toUpperCase() + s.slice(1)}</Typography>\n </div>\n ))}\n <div className=\"flex flex-col items-center gap-1\">\n <IconButton disabled><Trash2Icon size={20}/></IconButton>\n <Typography variant=\"caption\" color=\"secondary\">Disabled</Typography>\n </div>\n <div className=\"flex flex-col items-center gap-1\">\n <IconButton variant=\"filled\"><PlusIcon size={20}/></IconButton>\n <Typography variant=\"caption\" color=\"secondary\">Filled</Typography>\n </div>\n <div className=\"flex flex-col items-center gap-1\">\n <IconButton shape=\"square\"><SettingsIcon size={20}/></IconButton>\n <Typography variant=\"caption\" color=\"secondary\">Square</Typography>\n </div>\n </div>\n </div>\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">LoadingButton</Typography>\n <div className=\"flex flex-wrap gap-3\">\n <LoadingButton loading={true}>Saving…</LoadingButton>\n <LoadingButton loading={false}>Idle</LoadingButton>\n </div>\n </div>\n </div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: Form Inputs\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"inputs\" title=\"Form Inputs\">\n <div className=\"grid grid-cols-12 gap-4\">\n <div className=\"col-span-12 sm:col-span-6\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">TextField</Typography>\n <div className=\"flex flex-col gap-3\">\n <TextField label=\"Default\" placeholder=\"Type something…\"/>\n <TextField label=\"With value\" value=\"Filled value\" onChange={() => {}}/>\n <TextField label=\"Error state\" error value=\"Bad value\" onChange={() => {}}/>\n <TextField label=\"Disabled\" disabled value=\"Read only\" onChange={() => {}}/>\n </div>\n </div>\n <div className=\"col-span-12 sm:col-span-6 flex flex-col gap-4\">\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">Select</Typography>\n <Select label=\"Status\" value=\"published\" onValueChange={() => {}}>\n <SelectItem value=\"draft\">Draft</SelectItem>\n <SelectItem value=\"published\">Published</SelectItem>\n <SelectItem value=\"archived\">Archived</SelectItem>\n </Select>\n </div>\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">MultiSelect</Typography>\n <MultiSelect label=\"Roles\" value={[\"admin\", \"editor\"]} onValueChange={() => {}}>\n <MultiSelectItem value=\"admin\">Admin</MultiSelectItem>\n <MultiSelectItem value=\"editor\">Editor</MultiSelectItem>\n <MultiSelectItem value=\"viewer\">Viewer</MultiSelectItem>\n </MultiSelect>\n </div>\n </div>\n <div className=\"col-span-12 sm:col-span-6 flex flex-col gap-3\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"block font-mono\">Checkbox</Typography>\n <label className=\"flex items-center gap-2 cursor-pointer\"><Checkbox checked={true} onCheckedChange={() => {}}/><span>Checked</span></label>\n <label className=\"flex items-center gap-2 cursor-pointer\"><Checkbox checked={false} onCheckedChange={() => {}}/><span>Unchecked</span></label>\n <label className=\"flex items-center gap-2\"><Checkbox checked={true} disabled/><span>Disabled</span></label>\n </div>\n <div className=\"col-span-12 sm:col-span-6 flex flex-col gap-3\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"block font-mono\">BooleanSwitch</Typography>\n <div className=\"flex items-center gap-2\"><BooleanSwitch value={true} onValueChange={() => {}}/><span>On</span></div>\n <div className=\"flex items-center gap-2\"><BooleanSwitch value={false} onValueChange={() => {}}/><span>Off</span></div>\n </div>\n <div className=\"col-span-12\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">SearchBar</Typography>\n <SearchBar placeholder=\"Search entities…\"/>\n </div>\n <div className=\"col-span-12\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">Skeleton</Typography>\n <div className=\"flex gap-4 items-center flex-wrap\">\n <Skeleton className=\"w-10 h-10 rounded-full\"/>\n <Skeleton className=\"w-48 h-4 rounded\"/>\n <Skeleton className=\"w-32 h-8 rounded-md\"/>\n </div>\n </div>\n </div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: Chips & Alerts\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"chips-alerts\" title=\"Chips & Alerts\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">Chip — colorScheme</Typography>\n <div className=\"flex flex-wrap gap-2 mb-4\">\n {([\"blue\", \"teal\", \"red\", \"green\", \"yellow\", \"orange\", \"purple\", \"pink\", \"cyan\", \"indigo\", \"violet\", \"fuchsia\", \"rose\", \"emerald\", \"gray\"] as const).map(s => (\n <Chip key={s} colorScheme={s}>{s}</Chip>\n ))}\n </div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">Chip — sizes</Typography>\n <div className=\"flex flex-wrap gap-2 items-center mb-4\">\n {([\"smallest\", \"small\", \"medium\", \"large\"] as const).map(sz => (\n <Chip key={sz} colorScheme=\"blue\" size={sz}>{sz}</Chip>\n ))}\n </div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">Chip — outlined, error, clickable, icon</Typography>\n <div className=\"flex flex-wrap gap-2 items-center mb-4\">\n <Chip colorScheme=\"red\" outlined>Outlined Red</Chip>\n <Chip colorScheme=\"blue\" outlined>Outlined Blue</Chip>\n <Chip error>Error</Chip>\n <Chip error outlined>Error Outlined</Chip>\n <Chip onClick={() => {}}>Clickable</Chip>\n <Chip icon={<TagIcon size={12}/>} colorScheme=\"teal\">With Icon</Chip>\n <Chip>Default (no scheme)</Chip>\n <Chip outlined>Default Outlined</Chip>\n </div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">FilterChip</Typography>\n <div className=\"flex flex-wrap gap-2 items-center mb-6\">\n <FilterChip active>Active</FilterChip>\n <FilterChip>Inactive</FilterChip>\n <FilterChip icon={<FilterIcon size={12}/>} active>With Icon</FilterChip>\n <FilterChip size=\"small\">Small</FilterChip>\n <FilterChip disabled>Disabled</FilterChip>\n </div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">Alert — color variants</Typography>\n <div className=\"flex flex-col gap-2\">\n <Alert color=\"info\">Info — informational message</Alert>\n <Alert color=\"success\">Success — operation completed</Alert>\n <Alert color=\"warning\">Warning — attention required</Alert>\n <Alert color=\"error\">Error — something went wrong</Alert>\n </div>\n <div className=\"mt-4\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">Separator</Typography>\n <div>Above</div>\n <Separator orientation=\"horizontal\"/>\n <div>Below</div>\n </div>\n <div className=\"mt-4\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"block mb-2 font-mono\">CircularProgress</Typography>\n <div className=\"flex gap-6 items-center\">\n {([\"small\", \"medium\", \"large\"] as const).map(s => (\n <div key={s} className=\"flex flex-col items-center gap-1\">\n <CircularProgress size={s}/>\n <Typography variant=\"caption\" color=\"secondary\">{s}</Typography>\n </div>\n ))}\n </div>\n </div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: Users View\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"users\" title=\"Users View — UsersView.tsx\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n Layout from <code className=\"font-mono text-xs\">UsersView</code>: <code className=\"font-mono text-xs\">Container maxWidth="6xl"</code>, header row, and table with <code className=\"font-mono text-xs\">RoleChip</code>s.\n </Typography>\n {/* Bootstrap warning — from UsersView line 105-119 */}\n <div className=\"bg-yellow-100 dark:bg-yellow-900 border border-yellow-400 dark:border-yellow-700 rounded p-4 flex items-center justify-between mb-4\">\n <div>\n <Typography variant=\"label\" className=\"text-yellow-800 dark:text-yellow-200\">\n No admin users exist. You can make yourself an admin.\n </Typography>\n </div>\n <Button>Make me admin</Button>\n </div>\n {/* Header — from UsersView line 121-128 */}\n <div className=\"flex items-center mt-12\">\n <Typography gutterBottom variant=\"h4\" className=\"grow\" component=\"h4\">Users</Typography>\n <Button startIcon={<PlusIcon/>}>Add user</Button>\n </div>\n {/* Table — from UsersView line 130-182 */}\n <div className=\"overflow-auto\">\n <Table className=\"w-full\">\n <TableHeader>\n <TableCell header className=\"truncate w-16\"></TableCell>\n <TableCell header>Email</TableCell>\n <TableCell header>Name</TableCell>\n <TableCell header>Roles</TableCell>\n </TableHeader>\n <TableBody>\n {[\n { uid: \"1\",\nemail: \"alice@example.com\",\ndisplayName: \"Alice Johnson\",\nroles: [{ id: \"admin\",\nname: \"Admin\",\nisAdmin: true }] },\n { uid: \"2\",\nemail: \"bob@example.com\",\ndisplayName: \"Bob Smith\",\nroles: [{ id: \"editor\",\nname: \"Editor\",\nisAdmin: false }] },\n { uid: \"3\",\nemail: \"carol@example.com\",\ndisplayName: \"Carol White\",\nroles: [] }\n ].map(user => (\n <TableRow key={user.uid}>\n <TableCell style={{ width: \"64px\" }}>\n <Tooltip asChild title=\"Delete this user\">\n <IconButton size=\"small\"><Trash2Icon/></IconButton>\n </Tooltip>\n </TableCell>\n <TableCell>{user.email}</TableCell>\n <TableCell className=\"font-medium\">{user.displayName}</TableCell>\n <TableCell>\n <div className=\"flex flex-wrap gap-2\">\n {user.roles.map(role => (\n <Chip key={role.id} colorScheme={role.isAdmin ? \"purpleDark\" : \"blueDark\"} size=\"small\">\n {role.name}\n </Chip>\n ))}\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: User Dialog\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"user-dialog\" title=\"User Dialog — UserDetailsForm\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n Exact structure of <code className=\"font-mono text-xs\">UserDetailsForm</code>: <code className=\"font-mono text-xs\">grid grid-cols-12 gap-4</code>, <code className=\"font-mono text-xs\">MultiSelect</code> for roles, <code className=\"font-mono text-xs\">LoadingButton</code> to submit.\n </Typography>\n <div className={`rounded-lg border w-full max-w-xl ${defaultBorderMixin}`}>\n <div className=\"px-6 pt-6 pb-2\">\n <Typography variant=\"h4\">User</Typography>\n </div>\n <div className=\"px-6 py-4\">\n <div className=\"grid grid-cols-12 gap-4\">\n <div className=\"col-span-12\">\n <TextField name=\"displayName\" required value=\"Alice Johnson\" onChange={() => {}} label=\"Name\"/>\n </div>\n <div className=\"col-span-12\">\n <TextField required name=\"email\" value=\"alice@example.com\" onChange={() => {}} label=\"Email\" disabled/>\n </div>\n <div className=\"col-span-12\">\n <MultiSelect className=\"w-full\" label=\"Roles\" value={[\"admin\"]} onValueChange={() => {}}>\n <MultiSelectItem value=\"admin\">Admin</MultiSelectItem>\n <MultiSelectItem value=\"editor\">Editor</MultiSelectItem>\n <MultiSelectItem value=\"viewer\">Viewer</MultiSelectItem>\n </MultiSelect>\n </div>\n </div>\n </div>\n <div className=\"flex items-center justify-end gap-2 px-6 pb-6\">\n <Button variant=\"text\">Cancel</Button>\n <LoadingButton variant=\"filled\" loading={false}>Update</LoadingButton>\n </div>\n </div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: CRM Dashboard\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"crm-dashboard\" title=\"CRM Dashboard — CrmDashboardDemo\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n A real-world showcase of a complex dashboard home page incorporating Rebase design language.\n </Typography>\n <div className=\"w-full\">\n <CrmDashboardDemo />\n </div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: Collection Table\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"collection-table\" title=\"Collection Table\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n Sample data collection rendered as a sortable, searchable, filterable table with row selection.\n Uses <code className=\"font-mono text-xs\">Table</code>, <code className=\"font-mono text-xs\">Chip</code>,{\" \"}\n <code className=\"font-mono text-xs\">SearchBar</code>, <code className=\"font-mono text-xs\">Select</code>,{\" \"}\n <code className=\"font-mono text-xs\">Checkbox</code>.\n </Typography>\n <div className=\"w-full\"><CollectionTableDemo /></div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: Card View\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"card-view\" title=\"Card View\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n Grid of entity cards with thumbnail area, progress bar, status/priority chips, and assignee.\n Uses <code className=\"font-mono text-xs\">Card</code>, <code className=\"font-mono text-xs\">Chip</code>,{\" \"}\n <code className=\"font-mono text-xs\">ToggleButtonGroup</code>, <code className=\"font-mono text-xs\">SearchBar</code>.\n </Typography>\n <div className=\"w-full\"><CardViewDemo /></div>\n </SectionBlock>\n\n {/* ═══════════════════════════════════════════════\n SECTION: Kanban Board\n ═══════════════════════════════════════════════ */}\n <SectionBlock id=\"kanban-board\" title=\"Kanban Board\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n Drag-and-drop kanban board with four status columns.\n Uses <code className=\"font-mono text-xs\">KanbanView</code>, <code className=\"font-mono text-xs\">BoardItem</code>,{\" \"}\n <code className=\"font-mono text-xs\">BoardItemViewProps</code>.\n </Typography>\n <div className=\"w-full\"><KanbanBoardDemo /></div>\n </SectionBlock>\n </div>\n </div>\n );\n}\n\nfunction SectionBlock({ id, title, children }: { id: string; title: string; children: React.ReactNode }) {\n return (\n <section id={id} className={cls(\"px-6 py-8 border-b scroll-mt-0 max-w-5xl\", defaultBorderMixin)}>\n <Typography variant=\"h5\" className=\"mb-1\">{title}</Typography>\n <div className=\"mt-4\">{children}</div>\n </section>\n );\n}\n","\nimport React, { useEffect, useState } from \"react\";\nimport {\n Avatar,\n Button,\n Card,\n Chip,\n CircularProgress,\n cls,\n IconButton,\n Tab,\n Tabs,\n TextField,\n Trash2Icon,\n Typography\n} from \"@rebasepro/ui\";\nimport { useAuthController, useTranslation } from \"../hooks\";\n\ninterface SessionInfo {\n id: string;\n userAgent?: string;\n ipAddress?: string;\n createdAt: string;\n isCurrentSession?: boolean;\n}\n\ninterface ExtendedAuthController {\n user: { displayName?: string | null; photoURL?: string | null; email?: string | null } | null;\n updateProfile?: (displayName: string, photoURL: string) => Promise<void>;\n changePassword?: (oldPassword: string, newPassword: string) => Promise<void>;\n fetchSessions?: () => Promise<SessionInfo[]>;\n revokeSession?: (id: string) => Promise<void>;\n revokeAllSessions?: () => Promise<void>;\n signOut: () => Promise<void>;\n}\n\ntype ActiveTab = \"profile\" | \"security\" | \"sessions\";\n\nexport function UserSettingsView() {\n const authController = useAuthController() as ExtendedAuthController;\n const user = authController.user;\n const { t } = useTranslation();\n\n const hasPasswordChange = !!authController.changePassword;\n const [activeTab, setActiveTab] = useState<ActiveTab>(\"profile\");\n\n // Profile state\n const [displayName, setDisplayName] = useState(user?.displayName || \"\");\n const [photoURL, setPhotoURL] = useState(user?.photoURL || \"\");\n const [savingProfile, setSavingProfile] = useState(false);\n const [profileError, setProfileError] = useState<string | null>(null);\n\n // Password change state\n const [currentPassword, setCurrentPassword] = useState(\"\");\n const [newPassword, setNewPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [changingPassword, setChangingPassword] = useState(false);\n const [passwordError, setPasswordError] = useState<string | null>(null);\n const [passwordSuccess, setPasswordSuccess] = useState<string | null>(null);\n\n // Sessions state\n const [sessions, setSessions] = useState<SessionInfo[]>([]);\n const [loadingSessions, setLoadingSessions] = useState(false);\n const [sessionsError, setSessionsError] = useState<string | null>(null);\n const [revokingSessionId, setRevokingSessionId] = useState<string | null>(null);\n const [revokingAll, setRevokingAll] = useState(false);\n\n useEffect(() => {\n setDisplayName(user?.displayName || \"\");\n setPhotoURL(user?.photoURL || \"\");\n if (activeTab === \"sessions\") {\n loadSessions();\n }\n }, [activeTab, user]);\n\n const handleSaveProfile = async () => {\n setSavingProfile(true);\n setProfileError(null);\n try {\n if (authController.updateProfile) {\n await authController.updateProfile(displayName, photoURL);\n } else {\n throw new Error(\"updateProfile not implemented in this auth controller.\");\n }\n } catch (e: unknown) {\n setProfileError(e instanceof Error ? e.message : String(e));\n } finally {\n setSavingProfile(false);\n }\n };\n\n const handleChangePassword = async () => {\n setPasswordError(null);\n setPasswordSuccess(null);\n\n // Validate\n if (newPassword.length < 8) {\n setPasswordError(t(\"password_too_short\"));\n return;\n }\n if (newPassword !== confirmPassword) {\n setPasswordError(t(\"passwords_dont_match\"));\n return;\n }\n\n setChangingPassword(true);\n try {\n if (authController.changePassword) {\n await authController.changePassword(currentPassword, newPassword);\n setPasswordSuccess(t(\"password_changed\"));\n setCurrentPassword(\"\");\n setNewPassword(\"\");\n setConfirmPassword(\"\");\n // Backend invalidates all sessions on password change,\n // so the user will be logged out shortly\n setTimeout(() => {\n authController.signOut();\n }, 2000);\n }\n } catch (e: unknown) {\n setPasswordError(e instanceof Error ? e.message : String(e));\n } finally {\n setChangingPassword(false);\n }\n };\n\n const loadSessions = async () => {\n setLoadingSessions(true);\n setSessionsError(null);\n try {\n if (authController.fetchSessions) {\n const fetchedSessions = await authController.fetchSessions();\n const sortedSessions = (fetchedSessions || []).sort((a: SessionInfo, b: SessionInfo) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n );\n setSessions(sortedSessions);\n } else {\n throw new Error(\"fetchSessions not implemented in this auth controller.\");\n }\n } catch (e: unknown) {\n setSessionsError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoadingSessions(false);\n }\n };\n\n const handleRevokeSession = async (id: string, isCurrentSession?: boolean) => {\n setRevokingSessionId(id);\n try {\n if (authController.revokeSession) {\n await authController.revokeSession(id);\n setSessions(sessions.filter(s => s.id !== id));\n if (isCurrentSession) {\n await authController.signOut();\n }\n } else {\n throw new Error(\"revokeSession not implemented in this auth controller.\");\n }\n } catch (e: unknown) {\n setSessionsError(e instanceof Error ? e.message : String(e));\n } finally {\n setRevokingSessionId(null);\n }\n };\n\n const handleRevokeAll = async () => {\n setRevokingAll(true);\n try {\n if (authController.revokeAllSessions) {\n await authController.revokeAllSessions();\n } else {\n throw new Error(\"revokeAllSessions not implemented in this auth controller.\");\n }\n } catch (e: unknown) {\n setSessionsError(e instanceof Error ? e.message : String(e));\n } finally {\n setRevokingAll(false);\n }\n };\n\n if (!user) return null;\n\n return (\n <div className=\"flex-grow max-w-4xl w-full mx-auto p-4 sm:p-6 md:p-12\">\n <Typography variant=\"h4\" className=\"mb-8\">{t(\"account_settings\")}</Typography>\n\n <Tabs value={activeTab} onValueChange={(v) => setActiveTab(v as ActiveTab)} className=\"mb-8\">\n <Tab value=\"profile\">{t(\"profile\")}</Tab>\n {hasPasswordChange && <Tab value=\"security\">{t(\"security\")}</Tab>}\n <Tab value=\"sessions\">{t(\"sessions\")}</Tab>\n </Tabs>\n\n {activeTab === \"profile\" && (\n <div className=\"flex flex-col gap-6 max-w-xl\">\n <div className=\"flex items-center gap-6 mb-2\">\n <Avatar src={photoURL || undefined} className=\"w-24 h-24 text-3xl\">\n {displayName ? displayName[0].toUpperCase() : (user.email ? user.email[0].toUpperCase() : \"A\")}\n </Avatar>\n </div>\n <TextField\n label={t(\"display_name\")}\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n />\n <TextField\n label={t(\"photo_url\")}\n value={photoURL}\n onChange={(e) => setPhotoURL(e.target.value)}\n />\n {profileError && <Typography color=\"error\">{profileError}</Typography>}\n <div className=\"mt-4\">\n <Button variant=\"filled\" onClick={handleSaveProfile} disabled={savingProfile}>\n {savingProfile ? t(\"saving\") : t(\"save_profile\")}\n </Button>\n </div>\n </div>\n )}\n\n {activeTab === \"security\" && hasPasswordChange && (\n <div className=\"flex flex-col gap-6 max-w-xl\">\n <Typography variant=\"h6\" className=\"mb-2\">{t(\"change_password\")}</Typography>\n\n <TextField\n label={t(\"current_password\")}\n type=\"password\"\n value={currentPassword}\n onChange={(e) => setCurrentPassword(e.target.value)}\n autoComplete=\"current-password\"\n />\n <TextField\n label={t(\"new_password\")}\n type=\"password\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n autoComplete=\"new-password\"\n />\n <TextField\n label={t(\"confirm_password\")}\n type=\"password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n autoComplete=\"new-password\"\n />\n\n {passwordError && (\n <Typography color=\"error\">{passwordError}</Typography>\n )}\n {passwordSuccess && (\n <Typography className=\"text-emerald-600 dark:text-emerald-400\">{passwordSuccess}</Typography>\n )}\n\n <div className=\"mt-4\">\n <Button\n variant=\"filled\"\n onClick={handleChangePassword}\n disabled={changingPassword || !currentPassword || !newPassword || !confirmPassword}\n >\n {changingPassword ? t(\"changing_password\") : t(\"change_password\")}\n </Button>\n </div>\n </div>\n )}\n\n {activeTab === \"sessions\" && (\n <div className=\"flex flex-col gap-4 max-w-3xl\">\n {loadingSessions ? (\n <div className=\"flex justify-center p-8\"><CircularProgress/></div>\n ) : sessionsError ? (\n <Typography color=\"error\">{sessionsError}</Typography>\n ) : sessions.length === 0 ? (\n <Typography>{t(\"no_active_sessions\")}</Typography>\n ) : (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-end mb-2\">\n <Button\n variant=\"text\"\n color=\"error\"\n onClick={handleRevokeAll}\n disabled={revokingAll}\n >\n {revokingAll ? t(\"revoking\") : t(\"revoke_all_sessions\")}\n </Button>\n </div>\n {sessions.map(session => (\n <Card key={session.id} className=\"flex justify-between items-center p-4\">\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-2 mb-1\">\n <Typography variant=\"body1\">\n {session.userAgent || t(\"unknown_device\")}\n </Typography>\n {session.isCurrentSession && (\n <Chip colorScheme=\"blue\" size=\"small\">\n {t(\"current\")}\n </Chip>\n )}\n </div>\n <Typography variant=\"caption\" color=\"secondary\">\n IP: {session.ipAddress || \"Unknown\"} • Created: {new Date(session.createdAt).toLocaleString()}\n </Typography>\n </div>\n <div className=\"ml-4\">\n {revokingSessionId === session.id ? (\n <CircularProgress size=\"small\"/>\n ) : (\n <IconButton onClick={() => handleRevokeSession(session.id, session.isCurrentSession)} aria-label=\"Revoke Session\">\n <Trash2Icon/>\n </IconButton>\n )}\n </div>\n </Card>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { CheckIcon, IconButton, iconSize, LanguagesIcon, Menu, MenuItem, Typography } from \"@rebasepro/ui\";\nimport { useTranslation } from \"../hooks\";\n\nexport function LanguageToggle() {\n const { i18n } = useTranslation();\n\n return (\n <Menu\n trigger={<IconButton\n color=\"inherit\"\n aria-label=\"Change language\">\n <LanguagesIcon size={iconSize.small}/>\n </IconButton>}>\n <MenuItem onClick={() => i18n.changeLanguage(\"en\")}>\n <div className=\"flex w-full items-center justify-between gap-4\">\n <Typography variant=\"body2\" className={i18n.language === \"en\" ? \"font-bold\" : \"\"}>English</Typography>\n {i18n.language === \"en\" && <CheckIcon size={iconSize.small}/>}\n </div>\n </MenuItem>\n <MenuItem onClick={() => i18n.changeLanguage(\"es\")}>\n <div className=\"flex w-full items-center justify-between gap-4\">\n <Typography variant=\"body2\" className={i18n.language === \"es\" ? \"font-bold\" : \"\"}>Español</Typography>\n {i18n.language === \"es\" && <CheckIcon size={iconSize.small}/>}\n </div>\n </MenuItem>\n <MenuItem onClick={() => i18n.changeLanguage(\"de\")}>\n <div className=\"flex w-full items-center justify-between gap-4\">\n <Typography variant=\"body2\" className={i18n.language === \"de\" ? \"font-bold\" : \"\"}>Deutsch</Typography>\n {i18n.language === \"de\" && <CheckIcon size={iconSize.small}/>}\n </div>\n </MenuItem>\n <MenuItem onClick={() => i18n.changeLanguage(\"fr\")}>\n <div className=\"flex w-full items-center justify-between gap-4\">\n <Typography variant=\"body2\" className={i18n.language === \"fr\" ? \"font-bold\" : \"\"}>Français</Typography>\n {i18n.language === \"fr\" && <CheckIcon size={iconSize.small}/>}\n </div>\n </MenuItem>\n <MenuItem onClick={() => i18n.changeLanguage(\"it\")}>\n <div className=\"flex w-full items-center justify-between gap-4\">\n <Typography variant=\"body2\" className={i18n.language === \"it\" ? \"font-bold\" : \"\"}>Italiano</Typography>\n {i18n.language === \"it\" && <CheckIcon size={iconSize.small}/>}\n </div>\n </MenuItem>\n <MenuItem onClick={() => i18n.changeLanguage(\"hi\")}>\n <div className=\"flex w-full items-center justify-between gap-4\">\n <Typography variant=\"body2\" className={i18n.language === \"hi\" ? \"font-bold\" : \"\"}>हिन्दी</Typography>\n {i18n.language === \"hi\" && <CheckIcon size={iconSize.small}/>}\n </div>\n </MenuItem>\n <MenuItem onClick={() => i18n.changeLanguage(\"pt\")}>\n <div className=\"flex w-full items-center justify-between gap-4\">\n <Typography variant=\"body2\" className={i18n.language === \"pt\" ? \"font-bold\" : \"\"}>Português</Typography>\n {i18n.language === \"pt\" && <CheckIcon size={iconSize.small}/>}\n </div>\n </MenuItem>\n </Menu>\n );\n}\n","\nimport React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n CircleUserIcon,\n CircularProgress,\n cls,\n defaultBorderMixin,\n IconButton,\n iconSize,\n Popover,\n SearchBar,\n SearchIcon,\n Typography,\n XIcon\n} from \"@rebasepro/ui\";\nimport { User } from \"@rebasepro/types\";\n\n/**\n * Represents a selectable user item with optional role information.\n */\nexport interface SelectableUser {\n uid: string;\n displayName?: string | null;\n email?: string | null;\n photoURL?: string | null;\n roles?: string[];\n}\n\nexport interface UserSelectPopoverProps {\n /**\n * The currently selected user, or `null` for \"self\"/default.\n */\n selectedUser: SelectableUser | null;\n /**\n * Called when the user selection changes.\n * `null` means \"reset to self/default\".\n */\n onUserSelected: (user: SelectableUser | null) => void;\n /**\n * Full list of users to display.\n * The component handles client-side search/filter internally.\n */\n users: SelectableUser[];\n /**\n * Whether users are currently loading.\n */\n loading?: boolean;\n /**\n * The current user (displayed as the \"self\" option at the top).\n */\n currentUser?: SelectableUser | null;\n /**\n * Label to display when no user is selected.\n * @default \"Current user\"\n */\n defaultLabel?: string;\n /**\n * Maximum number of users to render at a time (for performance).\n * Users can still be found via search.\n * @default 100\n */\n renderLimit?: number;\n /**\n * Additional class name for the trigger button.\n */\n className?: string;\n /**\n * Size variant.\n * @default \"small\"\n */\n size?: \"small\" | \"medium\";\n}\n\nconst ITEM_HEIGHT = 44;\nconst MAX_VISIBLE_ITEMS = 7;\n\n/**\n * A reusable user picker popover with search support.\n * Designed to handle very large user lists (100k+) by filtering\n * client-side and limiting the rendered set.\n *\n * @group Components\n */\nexport function UserSelectPopover({\n selectedUser,\n onUserSelected,\n users,\n loading = false,\n currentUser,\n defaultLabel = \"Current user\",\n renderLimit = 100,\n className,\n size = \"small\"\n}: UserSelectPopoverProps) {\n const [open, setOpen] = useState(false);\n const [searchText, setSearchText] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n // Effective user label for the trigger\n const effectiveUserLabel = selectedUser\n ? (selectedUser.displayName || selectedUser.email || selectedUser.uid)\n : (currentUser?.displayName || currentUser?.email || defaultLabel);\n\n // Filter users based on search text\n const filteredUsers = useMemo(() => {\n const query = searchText.trim().toLowerCase();\n const base = users.filter(u => u.uid !== currentUser?.uid);\n\n if (!query) return base.slice(0, renderLimit);\n\n const matched = base.filter(u => {\n const name = (u.displayName || \"\").toLowerCase();\n const email = (u.email || \"\").toLowerCase();\n const uid = u.uid.toLowerCase();\n const roles = (u.roles || []).join(\" \").toLowerCase();\n return (\n name.includes(query) ||\n email.includes(query) ||\n uid.includes(query) ||\n roles.includes(query)\n );\n });\n\n return matched.slice(0, renderLimit);\n }, [users, currentUser?.uid, searchText, renderLimit]);\n\n const totalFilterable = useMemo(() => {\n const query = searchText.trim().toLowerCase();\n const base = users.filter(u => u.uid !== currentUser?.uid);\n if (!query) return base.length;\n return base.filter(u => {\n const name = (u.displayName || \"\").toLowerCase();\n const email = (u.email || \"\").toLowerCase();\n const uid = u.uid.toLowerCase();\n const roles = (u.roles || []).join(\" \").toLowerCase();\n return name.includes(query) || email.includes(query) || uid.includes(query) || roles.includes(query);\n }).length;\n }, [users, currentUser?.uid, searchText]);\n\n const handleSelect = useCallback((user: SelectableUser | null) => {\n onUserSelected(user);\n setOpen(false);\n setSearchText(\"\");\n }, [onUserSelected]);\n\n const handleOpenChange = useCallback((isOpen: boolean) => {\n setOpen(isOpen);\n if (isOpen) {\n // Auto-focus the search input when opening\n setTimeout(() => inputRef.current?.focus(), 50);\n } else {\n setSearchText(\"\");\n }\n }, []);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setOpen(false);\n setSearchText(\"\");\n }\n }, []);\n\n const listHeight = Math.min(\n (filteredUsers.length + 1) * ITEM_HEIGHT, // +1 for the \"self\" option\n MAX_VISIBLE_ITEMS * ITEM_HEIGHT\n );\n\n return (\n <Popover\n open={open}\n onOpenChange={handleOpenChange}\n side=\"bottom\"\n align=\"end\"\n sideOffset={4}\n trigger={\n <button\n className={cls(\n \"flex items-center gap-1.5 text-xs font-medium transition-colors rounded border border-transparent\",\n \"text-text-secondary dark:text-text-secondary-dark\",\n \"hover:text-text-primary dark:hover:text-text-primary-dark\",\n \"bg-surface-100 hover:bg-surface-200 dark:bg-surface-950 dark:hover:bg-surface-700\",\n size === \"small\" ? \"px-2 py-1\" : \"px-3 py-1.5\",\n className\n )}\n >\n {selectedUser?.photoURL ? (\n <img\n src={selectedUser.photoURL}\n alt=\"\"\n className=\"w-4 h-4 rounded-full object-cover\"\n />\n ) : (\n <svg\n className=\"w-3.5 h-3.5 text-text-disabled dark:text-text-disabled-dark\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\"\n />\n </svg>\n )}\n <span className=\"max-w-[120px] truncate\">{effectiveUserLabel}</span>\n {selectedUser && (\n <span className=\"text-[9px] text-amber-600 dark:text-amber-400 font-bold uppercase\">\n impersonating\n </span>\n )}\n <svg className=\"w-3 h-3 opacity-50 ml-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\"/>\n </svg>\n </button>\n }\n >\n <div\n className=\"flex flex-col w-[320px] max-w-[90vw] overflow-hidden\"\n onKeyDown={handleKeyDown}\n >\n {/* Header */}\n <div className={cls(\"px-3 py-2 border-b flex items-center justify-between shrink-0\", defaultBorderMixin)}>\n <Typography\n variant=\"caption\"\n className=\"font-bold uppercase tracking-wider text-[9px] text-text-disabled dark:text-text-disabled-dark\"\n >\n Run as user\n </Typography>\n {users.length > 0 && (\n <Typography\n variant=\"caption\"\n className=\"text-[9px] text-text-disabled dark:text-text-disabled-dark tabular-nums\"\n >\n {totalFilterable} user{totalFilterable !== 1 ? \"s\" : \"\"}\n </Typography>\n )}\n </div>\n\n {/* Search input */}\n <div className={cls(\"px-2 py-1.5 border-b shrink-0\", defaultBorderMixin)}>\n <SearchBar\n inputRef={inputRef}\n size=\"smallest\"\n placeholder=\"Search by name, email, or role…\"\n onTextSearch={(val) => setSearchText(val ?? \"\")}\n />\n </div>\n\n {/* User list */}\n <div\n ref={listRef}\n className=\"overflow-y-auto overscroll-contain\"\n style={{ maxHeight: MAX_VISIBLE_ITEMS * ITEM_HEIGHT }}\n >\n {/* Self (default) option — always shown unless search hides it */}\n {currentUser && (!searchText.trim() || matchesSearch(currentUser, searchText)) && (\n <UserRow\n user={currentUser}\n isSelected={!selectedUser}\n isSelf\n onClick={() => handleSelect(null)}\n />\n )}\n\n {/* Loading state */}\n {loading && (\n <div className=\"flex items-center justify-center py-6\">\n <CircularProgress size=\"small\"/>\n </div>\n )}\n\n {/* Empty state */}\n {!loading && filteredUsers.length === 0 && searchText.trim() && (\n <div className=\"flex flex-col items-center justify-center py-6 px-4\">\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark text-center\">\n No users matching “{searchText}”\n </Typography>\n </div>\n )}\n\n {/* User items */}\n {!loading && filteredUsers.map(user => (\n <UserRow\n key={user.uid}\n user={user}\n isSelected={selectedUser?.uid === user.uid}\n onClick={() => handleSelect(user)}\n />\n ))}\n\n {/* Truncation notice */}\n {!loading && totalFilterable > renderLimit && (\n <div className={cls(\"px-3 py-2 border-t text-center\", defaultBorderMixin)}>\n <Typography\n variant=\"caption\"\n className=\"text-[10px] text-text-disabled dark:text-text-disabled-dark\"\n >\n Showing {renderLimit} of {totalFilterable} results. Use search to narrow down.\n </Typography>\n </div>\n )}\n </div>\n </div>\n </Popover>\n );\n}\n\n// ─── Internal Components ─────────────────────────────────────────────\n\ninterface UserRowProps {\n user: SelectableUser;\n isSelected: boolean;\n isSelf?: boolean;\n onClick: () => void;\n}\n\nfunction UserRow({ user, isSelected, isSelf, onClick }: UserRowProps) {\n return (\n <button\n onClick={onClick}\n className={cls(\n \"w-full flex items-center gap-2.5 px-3 py-2 text-left transition-colors\",\n \"hover:bg-surface-accent-100 dark:hover:bg-surface-accent-900\",\n isSelected && \"bg-primary/5 dark:bg-primary-dark/10\"\n )}\n style={{ minHeight: ITEM_HEIGHT }}\n >\n {/* Avatar */}\n {user.photoURL ? (\n <img\n src={user.photoURL}\n alt=\"\"\n className=\"w-7 h-7 rounded-full object-cover shrink-0\"\n />\n ) : (\n <div className=\"w-7 h-7 rounded-full bg-surface-200 dark:bg-surface-700 flex items-center justify-center shrink-0\">\n <CircleUserIcon\n size={\"smallest\"}\n className=\"text-text-disabled dark:text-text-disabled-dark\"\n />\n </div>\n )}\n\n {/* User info */}\n <div className=\"flex flex-col min-w-0 flex-grow\">\n <div className=\"flex items-center gap-1.5\">\n <span\n className={cls(\n \"text-xs font-medium truncate\",\n isSelected\n ? \"text-primary dark:text-primary-dark\"\n : \"text-text-primary dark:text-text-primary-dark\"\n )}\n >\n {user.displayName || user.email || user.uid}\n </span>\n {isSelf && (\n <span className=\"text-[9px] text-text-disabled dark:text-text-disabled-dark font-medium shrink-0\">\n (you)\n </span>\n )}\n </div>\n {(user.email || user.roles?.length) && (\n <span className=\"text-[10px] text-text-disabled dark:text-text-disabled-dark truncate\">\n {user.email && user.displayName ? user.email : \"\"}\n {user.email && user.displayName && user.roles?.length ? \" · \" : \"\"}\n {user.roles?.length ? user.roles.join(\", \") : \"\"}\n </span>\n )}\n </div>\n\n {/* Selection indicator */}\n {isSelected && (\n <svg\n className=\"w-4 h-4 text-primary dark:text-primary-dark shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\"/>\n </svg>\n )}\n </button>\n );\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────\n\nfunction matchesSearch(user: SelectableUser, searchText: string): boolean {\n const query = searchText.trim().toLowerCase();\n if (!query) return true;\n const name = (user.displayName || \"\").toLowerCase();\n const email = (user.email || \"\").toLowerCase();\n const uid = user.uid.toLowerCase();\n return name.includes(query) || email.includes(query) || uid.includes(query);\n}\n","import { CircleUserIcon, cls, defaultBorderMixin } from \"@rebasepro/ui\";\nimport { User } from \"@rebasepro/types\";\n\n/**\n * Component to render a single user with name and email\n */\nexport function UserDisplay({\n user\n}: { user: User | null }) {\n if (!user) {\n return <span className={cls(\"italic\", \"text-text-disabled dark:text-text-disabled-dark\", \"text-sm\")}>Not set</span>;\n }\n\n const avatarSizeClass = \"w-6 h-6\";\n\n return (\n <div className={cls(\n \"inline-flex items-center gap-4 px-2 py-1 rounded-xl text-left max-w-full overflow-hidden\",\n \"bg-surface-accent-100 dark:bg-surface-accent-800\",\n \"border\",\n defaultBorderMixin\n )}>\n {user.photoURL ? (\n <img\n src={user.photoURL}\n alt={user.displayName || user.email || \"User\"}\n className={cls(\n \"rounded-full object-cover\",\n avatarSizeClass\n )}\n />\n ) : (\n <CircleUserIcon\n className={cls(\n \"text-text-secondary dark:text-text-secondary-dark\",\n avatarSizeClass\n )}\n />\n )}\n <div className=\"flex flex-col min-w-0\">\n <span className={cls(\"font-regular truncate\", \"text-sm\")}>\n {user.displayName || user.email || \"-\"}\n </span>\n {user.displayName && user.email && (\n <span className={cls(\"text-text-secondary dark:text-text-secondary-dark truncate\",\n \"text-xs\"\n )}>\n {user.email}\n </span>\n )}\n </div>\n </div>\n );\n}\n","import React, { ReactNode, useEffect, useRef, useState } from \"react\";\n\n/** Google Identity Services SDK — injected by the GIS <script> tag. */\ndeclare global {\n interface Window {\n google?: {\n accounts: {\n oauth2: {\n initCodeClient(config: {\n client_id: string;\n scope: string;\n ux_mode: \"popup\" | \"redirect\";\n callback: (response: { code?: string; error?: string }) => void;\n }): { requestCode(): void };\n };\n };\n };\n }\n}\n\nimport {\n ArrowLeftIcon,\n Button,\n cls,\n IconButton,\n iconSize,\n LoadingButton,\n MailIcon,\n Menu,\n MenuItem,\n MoonIcon,\n SunIcon,\n SunMoonIcon,\n TextField,\n Typography\n} from \"@rebasepro/ui\";\nimport { AuthControllerExtended, User } from \"@rebasepro/types\";\nimport { ErrorView } from \"../ErrorView\";\nimport { RebaseLogo } from \"../RebaseLogo\";\nimport { LanguageToggle } from \"../LanguageToggle\";\nimport { useModeController, useTranslation } from \"../../hooks\";\n\n/**\n * Props for the generic LoginView.\n * Consumes {@link AuthControllerExtended} — works with any backend\n * (Rebase custom backend, Firebase, etc.)\n */\nexport interface LoginViewProps {\n /**\n * Auth controller — must implement AuthControllerExtended.\n */\n authController: AuthControllerExtended;\n\n /**\n * Path to the logo displayed in the login screen\n */\n logo?: string;\n\n /**\n * Enable the skip login button\n */\n allowSkipLogin?: boolean;\n\n /**\n * Disable the login buttons\n */\n disabled?: boolean;\n\n /**\n * Prevent users from creating new accounts.\n * If not set, checks `authController.capabilities.registration`.\n */\n disableSignupScreen?: boolean;\n\n /**\n * Display this component when no user is found\n */\n noUserComponent?: ReactNode;\n\n /**\n * Display this component below the sign-in buttons\n */\n additionalComponent?: ReactNode;\n\n /**\n * Display this component above the sign-in buttons\n */\n topComponent?: ReactNode;\n\n /**\n * Error message when user is not allowed access\n */\n notAllowedError?: string | Error;\n\n\n /**\n * Google client ID for Google OAuth.\n * Required when Google login is enabled via ID token flow.\n */\n googleClientId?: string;\n\n /**\n * GitHub client ID for GitHub OAuth.\n */\n githubClientId?: string;\n\n /**\n * LinkedIn client ID for LinkedIn OAuth.\n */\n linkedinClientId?: string;\n\n /**\n * Optional custom title shown above options\n */\n title?: string;\n\n /**\n * Optional custom subtitle shown above options\n */\n subtitle?: string;\n\n /**\n * When true, shows bootstrap/setup UI (first-user creation).\n * If not set, derived from `authController` if it exposes `needsSetup`.\n */\n needsSetup?: boolean;\n\n /**\n * Whether registration is enabled.\n * If not set, derived from `authController.capabilities.registration`.\n */\n registrationEnabled?: boolean;\n\n /**\n * Pre-fill the email field (e.g. for demo or testing environments).\n */\n defaultEmail?: string;\n\n /**\n * Pre-fill the password field (e.g. for demo or testing environments).\n */\n defaultPassword?: string;\n}\n\ntype AuthMode = \"buttons\" | \"login\" | \"register\" | \"forgot\";\n\n/**\n * The shared field background mixin (`dark:bg-black/30`) is invisible on the\n * near-black login card, so login inputs get an explicit border in dark mode.\n */\nconst loginFieldClasses = \"w-full dark:border dark:border-surface-700/70 dark:hover:border-surface-600\";\n\n/**\n * Generic login view component that works with any AuthControllerExtended.\n * Feature-detects capabilities to show/hide login methods.\n * @group Core\n */\nexport function LoginView({\n logo,\n authController,\n noUserComponent,\n disableSignupScreen = false,\n disabled = false,\n notAllowedError,\n googleClientId,\n githubClientId,\n linkedinClientId,\n title,\n subtitle,\n needsSetup,\n registrationEnabled,\n additionalComponent,\n topComponent,\n defaultEmail,\n defaultPassword\n}: LoginViewProps) {\n\n const modeState = useModeController();\n const { mode: colorMode, setMode: setColorMode } = modeState;\n const { t } = useTranslation();\n\n const [mode, setMode] = useState<AuthMode>(\"buttons\");\n const [fadeIn, setFadeIn] = useState(false);\n const [viewVisible, setViewVisible] = useState(true);\n\n const switchMode = (newMode: AuthMode) => {\n setViewVisible(false);\n setTimeout(() => {\n setMode(newMode);\n setViewVisible(true);\n }, 150);\n };\n\n // Resolve capabilities — explicit props override authController.capabilities\n const caps = authController.capabilities ?? {};\n const isBootstrapMode = needsSetup\n ?? (\"needsSetup\" in authController && !!(authController as { needsSetup?: boolean }).needsSetup)\n ?? false;\n const canRegister = registrationEnabled ?? caps.registration ?? false;\n const hasGoogleLogin = googleClientId && (caps.enabledProviders?.includes(\"google\") ?? caps.googleLogin ?? false);\n const hasGitHubLogin = githubClientId && (caps.enabledProviders?.includes(\"github\") ?? false);\n const hasLinkedinLogin = linkedinClientId && (caps.enabledProviders?.includes(\"linkedin\") ?? false);\n const hasPasswordReset = caps.passwordReset ?? !!authController.forgotPassword;\n\n const showRegistration = !disableSignupScreen && canRegister;\n\n useEffect(() => {\n const timer = setTimeout(() => setFadeIn(true), 50);\n return () => clearTimeout(timer);\n }, []);\n\n // Effect to handle incoming redirect OAuth codes (GitHub, LinkedIn, etc.)\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const code = params.get(\"code\");\n const provider = localStorage.getItem(\"rebase_oauth_provider\");\n if (code && provider) {\n localStorage.removeItem(\"rebase_oauth_provider\");\n // Clear URL search params without page reload\n const cleanUrl = window.location.origin + window.location.pathname;\n window.history.replaceState({}, document.title, cleanUrl);\n\n if (authController.oauthLogin) {\n authController.oauthLogin(provider, {\n code,\n redirectUri: cleanUrl\n }).catch((err) => {\n console.error(`${provider} login failed:`, err);\n });\n }\n }\n }, [authController]);\n\n\n\n let logoComponent;\n if (logo) {\n logoComponent = <img src={logo}\n style={{\n height: \"100%\",\n width: \"100%\",\n objectFit: \"cover\"\n }}\n alt={\"Logo\"}/>;\n } else {\n logoComponent = <RebaseLogo/>;\n }\n\n let notAllowedMessage: string | undefined;\n if (notAllowedError) {\n if (typeof notAllowedError === \"string\") {\n notAllowedMessage = notAllowedError;\n } else if (notAllowedError instanceof Error) {\n notAllowedMessage = notAllowedError.message;\n } else {\n notAllowedMessage = \"It looks like you don't have access, based on the specified access configuration\";\n }\n }\n\n return (\n <div\n className={cls(\n \"relative flex items-center justify-center h-screen w-screen p-4 transition-opacity duration-500 bg-surface-50 dark:bg-surface-900 overflow-hidden\",\n fadeIn ? \"opacity-100\" : \"opacity-0\"\n )}>\n\n {/* Top-right controls */}\n <div className=\"absolute top-4 right-4 flex items-center gap-1 z-10\">\n <LanguageToggle/>\n <Menu\n trigger={<IconButton\n color=\"inherit\"\n aria-label=\"Toggle theme\">\n {colorMode === \"dark\"\n ? <MoonIcon size={iconSize.small}/>\n : <SunIcon size={iconSize.small}/>}\n </IconButton>}>\n <MenuItem onClick={() => setColorMode(\"dark\")}><MoonIcon size={iconSize.smallest}/> {t(\"dark_mode\")}</MenuItem>\n <MenuItem onClick={() => setColorMode(\"light\")}><SunIcon size={iconSize.smallest}/> {t(\"light_mode\")}</MenuItem>\n <MenuItem onClick={() => setColorMode(\"system\")}><SunMoonIcon size={iconSize.smallest}/> {t(\"system_mode\")}</MenuItem>\n </Menu>\n </div>\n\n <div className=\"relative flex flex-col items-center w-[440px] max-w-full p-8 sm:p-10 bg-white/70 dark:bg-surface-800/70 backdrop-blur-xl border border-surface-200/50 dark:border-surface-700/50 rounded-2xl shadow-2xl z-10 transition-all duration-300 hover:shadow-primary-500/5\">\n {/* Logo */}\n <div className=\"w-24 h-24 m-2 mb-4 drop-shadow-md\">\n {logoComponent}\n </div>\n\n {notAllowedMessage && (\n <div className=\"p-4 w-full\">\n <ErrorView error={notAllowedMessage}/>\n </div>\n )}\n\n <div className={cls(\n \"w-full transition-opacity duration-150\",\n viewVisible ? \"opacity-100\" : \"opacity-0\"\n )}>\n\n {/* Bootstrap mode: show setup form directly */}\n {isBootstrapMode && !authController.user && (\n <LoginForm\n authController={authController}\n registrationMode={true}\n onClose={() => {}}\n onForgotPassword={() => {}}\n disableSignupScreen={false}\n bootstrapMode={true}\n defaultEmail={defaultEmail}\n defaultPassword={defaultPassword}\n />\n )}\n\n {/* Normal mode */}\n {!isBootstrapMode && (\n <>\n {/* Provider buttons screen */}\n {mode === \"buttons\" && (\n <div className=\"w-full flex flex-col gap-3 mt-2\">\n {(title || subtitle) && (\n <div className=\"text-center mb-2\">\n {title && (\n <Typography variant=\"h6\" className=\"mb-0.5 font-bold\">\n {title}\n </Typography>\n )}\n {subtitle && (\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-4\">\n {subtitle}\n </Typography>\n )}\n </div>\n )}\n {topComponent && (\n <div className=\"w-full\">\n {topComponent}\n </div>\n )}\n <LoginButton\n disabled={disabled}\n text={\"Sign in with email\"}\n icon={<MailIcon/>}\n onClick={() => switchMode(\"login\")}\n />\n {hasGoogleLogin && googleClientId && (\n <GoogleLoginButton\n disabled={disabled}\n googleClientId={googleClientId}\n authController={authController}\n />\n )}\n {hasGitHubLogin && githubClientId && (\n <GitHubLoginButton\n disabled={disabled}\n githubClientId={githubClientId}\n />\n )}\n {hasLinkedinLogin && linkedinClientId && (\n <LinkedInLoginButton\n disabled={disabled}\n linkedinClientId={linkedinClientId}\n />\n )}\n {showRegistration && (\n <div className=\"mt-2 text-center\">\n <Typography variant=\"body2\" color=\"secondary\">\n Don't have an account?{\" \"}\n <button\n type=\"button\"\n className=\"font-semibold hover:underline cursor-pointer text-primary-600 dark:text-primary-400\"\n onClick={() => switchMode(\"register\")}\n >\n Create one\n </button>\n </Typography>\n </div>\n )}\n </div>\n )}\n\n {/* Login form */}\n {mode === \"login\" && (\n <LoginForm\n authController={authController}\n registrationMode={false}\n onClose={() => switchMode(\"buttons\")}\n onForgotPassword={hasPasswordReset ? () => switchMode(\"forgot\") : undefined}\n noUserComponent={noUserComponent}\n disableSignupScreen={disableSignupScreen}\n switchToRegister={showRegistration ? () => switchMode(\"register\") : undefined}\n defaultEmail={defaultEmail}\n defaultPassword={defaultPassword}\n />\n )}\n\n {/* Registration form */}\n {mode === \"register\" && (\n <LoginForm\n authController={authController}\n registrationMode={true}\n onClose={() => switchMode(\"buttons\")}\n onForgotPassword={hasPasswordReset ? () => switchMode(\"forgot\") : undefined}\n noUserComponent={noUserComponent}\n disableSignupScreen={disableSignupScreen}\n switchToLogin={() => switchMode(\"login\")}\n defaultEmail={defaultEmail}\n defaultPassword={defaultPassword}\n />\n )}\n\n {/* Forgot password form */}\n {mode === \"forgot\" && authController.forgotPassword && (\n <ForgotPasswordForm\n authController={authController}\n onClose={() => switchMode(\"login\")}\n />\n )}\n </>\n )}\n </div>\n\n {additionalComponent && !isBootstrapMode && mode === \"buttons\" && (\n <div className=\"w-full\">\n {additionalComponent}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction LoginButton({\n icon,\n onClick,\n text,\n disabled\n}: { icon: React.ReactNode, onClick: () => void, text: string, disabled?: boolean }) {\n return (\n <Button\n disabled={disabled}\n className=\"w-full transition-transform duration-200 active:scale-[0.98]\"\n variant=\"outlined\"\n size=\"large\"\n onClick={onClick}>\n <div className=\"flex items-center justify-center w-full gap-3 py-1\">\n <span className=\"flex items-center justify-center w-5 h-5\">\n {icon}\n </span>\n <Typography variant=\"button\">{text}</Typography>\n </div>\n </Button>\n );\n}\n\nconst GoogleIcon = () => (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"/>\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"/>\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"/>\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"/>\n </svg>\n);\n\nfunction GoogleLoginButton({\n disabled,\n googleClientId,\n authController\n}: {\n disabled?: boolean,\n googleClientId: string,\n authController: AuthControllerExtended\n}) {\n const codeClientRef = useRef<{ requestCode(): void } | null>(null);\n\n useEffect(() => {\n if (!authController.googleLogin) return;\n\n const google = window.google;\n if (!google || codeClientRef.current) return;\n\n codeClientRef.current = google.accounts.oauth2.initCodeClient({\n client_id: googleClientId,\n scope: \"openid email profile\",\n ux_mode: \"popup\",\n callback: async (response: { code?: string; error?: string }) => {\n if (response.error || !response.code) {\n console.error(\"Google login error:\", response.error);\n return;\n }\n try {\n // Send the authorization code to the backend.\n // redirectUri \"postmessage\" is required when using popup ux_mode.\n await authController.googleLogin!({\n code: response.code,\n redirectUri: \"postmessage\"\n });\n } catch (err: unknown) {\n console.error(\"Google login error:\", err);\n }\n }\n });\n }, [googleClientId, authController]);\n\n const handleClick = () => {\n if (!codeClientRef.current) {\n console.error(\"Google Sign-In not loaded\");\n return;\n }\n codeClientRef.current.requestCode();\n };\n\n return (\n <LoginButton\n disabled={disabled}\n text=\"Sign in with Google\"\n icon={<GoogleIcon/>}\n onClick={handleClick}\n />\n );\n}\n\nconst GitHubIcon = () => (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d=\"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.166 6.839 9.489.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.464-1.11-1.464-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.579.688.481C19.137 20.162 22 16.418 22 12c0-5.523-4.477-10-10-10z\"/>\n </svg>\n);\n\nfunction GitHubLoginButton({\n disabled,\n githubClientId\n}: {\n disabled?: boolean,\n githubClientId: string\n}) {\n const handleClick = () => {\n localStorage.setItem(\"rebase_oauth_provider\", \"github\");\n const redirectUri = encodeURIComponent(window.location.origin + window.location.pathname);\n const scope = \"read:user,user:email\";\n window.location.href = `https://github.com/login/oauth/authorize?client_id=${githubClientId}&redirect_uri=${redirectUri}&scope=${scope}`;\n };\n\n return (\n <LoginButton\n disabled={disabled}\n text=\"Sign in with GitHub\"\n icon={<GitHubIcon/>}\n onClick={handleClick}\n />\n );\n}\n\nconst LinkedInIcon = () => (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d=\"M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z\"/>\n </svg>\n);\n\nfunction LinkedInLoginButton({\n disabled,\n linkedinClientId\n}: {\n disabled?: boolean,\n linkedinClientId: string\n}) {\n const handleClick = () => {\n localStorage.setItem(\"rebase_oauth_provider\", \"linkedin\");\n const redirectUri = encodeURIComponent(window.location.origin + window.location.pathname);\n const scope = \"openid profile email\";\n window.location.href = `https://www.linkedin.com/oauth/v2/authorization?response_type=code&client_id=${linkedinClientId}&redirect_uri=${redirectUri}&scope=${scope}`;\n };\n\n return (\n <LoginButton\n disabled={disabled}\n text=\"Sign in with LinkedIn\"\n icon={<LinkedInIcon/>}\n onClick={handleClick}\n />\n );\n}\n\nfunction LoginForm({\n onClose,\n onForgotPassword,\n authController,\n registrationMode,\n noUserComponent,\n disableSignupScreen,\n bootstrapMode = false,\n switchToRegister,\n switchToLogin,\n defaultEmail,\n defaultPassword\n}: {\n onClose: () => void,\n onForgotPassword?: () => void,\n authController: AuthControllerExtended,\n registrationMode: boolean,\n noUserComponent?: ReactNode,\n disableSignupScreen: boolean,\n bootstrapMode?: boolean,\n switchToRegister?: () => void,\n switchToLogin?: () => void,\n defaultEmail?: string,\n defaultPassword?: string\n}) {\n const passwordRef = useRef<HTMLInputElement | null>(null);\n\n const [email, setEmail] = useState<string | undefined>(defaultEmail);\n const [password, setPassword] = useState<string | undefined>(defaultPassword);\n const [displayName, setDisplayName] = useState<string>();\n\n useEffect(() => {\n if (!document) return;\n const escFunction = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n document.addEventListener(\"keydown\", escFunction, false);\n return () => {\n document.removeEventListener(\"keydown\", escFunction, false);\n };\n }, [onClose]);\n\n function handleEnterPassword() {\n if (email && password && authController.emailPasswordLogin) {\n authController.emailPasswordLogin(email, password);\n }\n }\n\n function handleRegistration() {\n if (email && password && authController.register) {\n authController.register(email, password, displayName);\n }\n }\n\n const handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n if (registrationMode)\n handleRegistration();\n else\n handleEnterPassword();\n };\n\n const title = bootstrapMode\n ? \"Welcome!\"\n : registrationMode\n ? \"Create account\"\n : \"Sign in\";\n\n const subtitle = bootstrapMode\n ? \"Create your admin account to get started. This account will have admin privileges.\"\n : registrationMode\n ? \"Fill in your details to create a new account\"\n : \"Enter your credentials to continue\";\n\n const buttonLabel = registrationMode ? \"Create account\" : \"Sign in\";\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col w-full gap-1 mt-2\">\n {!bootstrapMode && (\n <div className=\"w-full mb-2 -ml-2.5\">\n <IconButton onClick={onClose}>\n <ArrowLeftIcon/>\n </IconButton>\n </div>\n )}\n\n {(() => {\n const err = authController.authProviderError;\n if (!err || authController.user) return null;\n const msg: string = err instanceof Error ? err.message : String(err);\n return (\n <div className=\"w-full mb-2\">\n <ErrorView error={msg}/>\n </div>\n );\n })()}\n\n <Typography variant=\"h6\" className=\"mb-0.5\">\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-5\">\n {subtitle}\n </Typography>\n\n {registrationMode && !bootstrapMode && noUserComponent && (\n <div className=\"w-full mb-2\">\n {noUserComponent}\n </div>\n )}\n\n {registrationMode && (\n <div className=\"w-full mb-3\">\n <Typography variant=\"label\" color=\"secondary\" className=\"mb-1\">\n Display Name\n </Typography>\n <TextField placeholder=\"Jane Doe (optional)\"\n className={loginFieldClasses}\n value={displayName ?? \"\"}\n disabled={authController.initialLoading}\n type=\"text\"\n size=\"medium\"\n onChange={(event) => setDisplayName(event.target.value)}/>\n </div>\n )}\n\n <div className=\"w-full mb-3\">\n <Typography variant=\"label\" color=\"secondary\" className=\"mb-1\">\n Email\n </Typography>\n <TextField placeholder=\"you@example.com\"\n className={loginFieldClasses}\n autoFocus\n value={email ?? \"\"}\n disabled={authController.initialLoading}\n type=\"email\"\n size=\"medium\"\n onChange={(event) => setEmail(event.target.value)}/>\n </div>\n\n <div className=\"w-full mb-1\">\n <Typography variant=\"label\" color=\"secondary\" className=\"mb-1\">\n Password\n </Typography>\n <TextField placeholder=\"••••••••\"\n className={loginFieldClasses}\n value={password ?? \"\"}\n disabled={authController.initialLoading}\n inputRef={passwordRef}\n type=\"password\"\n size=\"medium\"\n onChange={(event) => setPassword(event.target.value)}/>\n </div>\n\n {registrationMode && (\n <Typography variant=\"caption\" color=\"secondary\" className=\"mb-3\">\n Password must be 8+ characters with uppercase, lowercase, and a number\n </Typography>\n )}\n\n {!registrationMode && onForgotPassword && (\n <div className=\"w-full text-right mb-3\">\n <button\n type=\"button\"\n className=\"text-xs font-medium hover:underline cursor-pointer text-primary-600 dark:text-primary-400\"\n onClick={onForgotPassword}\n >\n Forgot password?\n </button>\n </div>\n )}\n\n <LoadingButton\n type=\"submit\"\n variant=\"filled\"\n color=\"primary\"\n className=\"w-full mt-1\"\n size=\"large\"\n loading={authController.authLoading}\n disabled={authController.authLoading || !email || !password}\n >\n {buttonLabel}\n </LoadingButton>\n\n {/* Switch between login/register */}\n {switchToRegister && (\n <div className=\"mt-4 text-center\">\n <Typography variant=\"body2\" color=\"secondary\">\n Don't have an account?{\" \"}\n <button\n type=\"button\"\n className=\"font-semibold hover:underline cursor-pointer text-primary-600 dark:text-primary-400\"\n onClick={switchToRegister}\n >\n Create one\n </button>\n </Typography>\n </div>\n )}\n\n {switchToLogin && (\n <div className=\"mt-4 text-center\">\n <Typography variant=\"body2\" color=\"secondary\">\n Already have an account?{\" \"}\n <button\n type=\"button\"\n className=\"font-semibold hover:underline cursor-pointer text-primary-600 dark:text-primary-400\"\n onClick={switchToLogin}\n >\n Sign in\n </button>\n </Typography>\n </div>\n )}\n </form>\n );\n}\n\nfunction ForgotPasswordForm({\n onClose,\n authController\n}: {\n onClose: () => void,\n authController: AuthControllerExtended\n}) {\n const [email, setEmail] = useState<string>(\"\");\n const [submitted, setSubmitted] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!document) return;\n const escFunction = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n document.addEventListener(\"keydown\", escFunction, false);\n return () => {\n document.removeEventListener(\"keydown\", escFunction, false);\n };\n }, [onClose]);\n\n const handleSubmit = async (event: React.FormEvent) => {\n event.preventDefault();\n setError(null);\n\n if (!email) {\n setError(\"Please enter your email address\");\n return;\n }\n\n if (!authController.forgotPassword) {\n setError(\"Password reset is not available with this auth provider.\");\n return;\n }\n\n try {\n await authController.forgotPassword(email);\n setSubmitted(true);\n } catch (err: unknown) {\n // Check for EMAIL_NOT_CONFIGURED error\n if (err instanceof Error && (err as { code?: string }).code === \"EMAIL_NOT_CONFIGURED\") {\n setError(\"Password reset is not available. Please contact your administrator.\");\n } else {\n // Still show success (security: don't reveal if email exists)\n setSubmitted(true);\n }\n }\n };\n\n if (submitted) {\n return (\n <div className=\"flex flex-col w-full gap-4 mt-2\">\n <div className=\"w-full -ml-2.5\">\n <IconButton onClick={onClose}>\n <ArrowLeftIcon/>\n </IconButton>\n </div>\n\n <div className=\"text-center rounded-xl p-6 bg-surface-50 dark:bg-surface-900/60 dark:border dark:border-surface-700/50\">\n <div className=\"text-3xl mb-3\">📧</div>\n <Typography variant=\"subtitle1\" className=\"mb-2\">\n Check your email\n </Typography>\n <Typography variant=\"body2\" color=\"secondary\">\n If an account exists for <strong>{email}</strong>, you'll receive a password reset link shortly.\n </Typography>\n </div>\n\n <Button onClick={onClose} variant=\"text\" className=\"mt-2\">\n Back to sign in\n </Button>\n </div>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col w-full gap-1 mt-2\">\n <div className=\"w-full mb-2 -ml-2.5\">\n <IconButton onClick={onClose}>\n <ArrowLeftIcon/>\n </IconButton>\n </div>\n\n <Typography variant=\"h6\" className=\"mb-0.5\">\n Reset password\n </Typography>\n <Typography variant=\"body2\" color=\"secondary\" className=\"mb-5\">\n Enter your email and we'll send you a reset link.\n </Typography>\n\n {error && (\n <div className=\"w-full mb-3\">\n <ErrorView error={error}/>\n </div>\n )}\n\n <div className=\"w-full mb-3\">\n <Typography variant=\"label\" color=\"secondary\" className=\"mb-1\">\n Email\n </Typography>\n <TextField\n placeholder=\"you@example.com\"\n className={loginFieldClasses}\n autoFocus\n value={email}\n type=\"email\"\n size=\"medium\"\n onChange={(event) => setEmail(event.target.value)}\n />\n </div>\n\n <LoadingButton\n type=\"submit\"\n variant=\"filled\"\n className=\"w-full\"\n size=\"large\"\n loading={authController.authLoading}\n disabled={authController.authLoading || !email}\n >\n Send reset link\n </LoadingButton>\n </form>\n );\n}\n","import React, { useLayoutEffect, useRef } from \"react\";\nimport { useRebaseRegistryDispatch } from \"../hooks\";\nimport type { RebaseAuthConfig } from \"@rebasepro/types\";\n\n/**\n * Declarative component to configure authentication in Rebase.\n * Renders nothing — purely registers config into the RebaseRegistry.\n *\n * This is a framework-level component that lives in core since\n * authentication is cross-cutting (CMS, Studio, any app area).\n * @group Core\n */\nexport function RebaseAuth({ loginView }: RebaseAuthConfig) {\n const dispatch = useRebaseRegistryDispatch();\n const registeredRef = useRef(false);\n\n useLayoutEffect(() => {\n dispatch.registerAuth({ loginView });\n registeredRef.current = true;\n return () => {\n registeredRef.current = false;\n dispatch.unregisterAuth();\n };\n }, [dispatch, loginView]);\n\n return null;\n}\n","import { RebaseTranslations } from \"@rebasepro/types\";\n\n/**\n * English baseline translations for @rebasepro/app.\n *\n * This is the single source of truth for all default UI strings.\n * Override any key via the `translations` prop on Rebase entry-point components.\n *\n * @group Core\n */\nexport const en: RebaseTranslations = {\n // ─── Form actions ────────────────────────────────────────────\n save: \"Save\",\n create: \"Create\",\n create_copy: \"Create copy\",\n save_and_close: \"Save and close\",\n create_copy_and_close: \"Create copy and close\",\n create_and_close: \"Create and close\",\n discard: \"Discard\",\n clear: \"Clear\",\n cancel: \"Cancel\",\n\n // ─── Entity actions ──────────────────────────────────────────\n edit: \"Edit\",\n copy: \"Copy\",\n delete: \"Delete\",\n delete_not_allowed: \"You have selected at least one entity you cannot delete\",\n edit_entity: \"Edit\",\n back_to_detail: \"Back to details\",\n\n // ─── Delete dialog ───────────────────────────────────────────\n delete_confirmation_title: \"Delete?\",\n delete_confirmation_body: \"This will delete the entity. Are you sure?\",\n delete_multiple_confirmation_body: \"This will delete the selected entities. Are you sure?\",\n\n // ─── Unsaved-changes dialog ───────────────────────────────────\n unsaved_changes_title: \"Unsaved changes\",\n unsaved_changes_body: \"You have unsaved changes. Do you want to discard them?\",\n discard_changes: \"Discard changes\",\n keep_editing: \"Keep editing\",\n clear_form: \"Clear form?\",\n discard_changes_confirmation: \"All unsaved changes will be lost. This cannot be undone.\",\n clear_form_confirmation: \"All entered values will be cleared. This cannot be undone.\",\n\n // ─── Collection table / toolbar ──────────────────────────────\n search: \"Search\",\n find_by_id: \"Find by ID\",\n find_entity_by_id: \"Find entity by ID\",\n filter: \"Filter\",\n filters: \"Filters\",\n clear_filter: \"Clear filter\",\n clear_filter_sort: \"Clear filter/sort\",\n clear_sort: \"Clear sort\",\n clear_all: \"Clear all\",\n no_items: \"No items\",\n no_entries_found: \"No entries found\",\n all_entries_loaded: \"All {{count}} entries loaded\",\n create_your_first_entry: \"Create your first entry\",\n no_results_filter_sort: \"No results with the applied filter/sort\",\n no_results_search: \"No results found for \\\"{{search}}\\\"\",\n add: \"Add\",\n remove: \"Remove\",\n multiple_entities: \"Multiple entities\",\n unsaved_changes: \"You have unsaved changes in this {{collectionName}}.\",\n so_empty: \"So empty...\",\n no_results: \"No results with the applied filter/sort\",\n refresh_data: \"Refresh data\",\n dark_mode: \"Dark\",\n light_mode: \"Light\",\n system_mode: \"System\",\n ok: \"Ok\",\n save_collection_config: \"Save collection structure\",\n search_for_more_icons: \"Search for more icons…\",\n ai_modified: \"AI modified\",\n size_label: \"Size\",\n group_by: \"Group by\",\n initialize_kanban_order: \"Initialize Kanban Order\",\n copy_id: \"Copy ID\",\n add_specific: \"Add {{name}}\",\n select_specific: \"Select {{name}}\",\n select_from: \"Select from {{name}}\",\n done: \"Done\",\n log_out: \"Log out\",\n column_cannot_be_edited: \"This column can't be edited directly\",\n close: \"Close\",\n unsaved_local_changes: \"Unsaved Local changes\",\n unsaved_local_changes_description: \"This document was edited locally and has unsaved changes. These local changes will be lost if you don't apply them.\",\n preview_changes: \"Preview Changes\",\n apply_changes: \"Apply Changes\",\n discard_local_changes: \"Discard Local Changes\",\n preview_local_changes: \"Preview Local Changes\",\n preview_local_changes_description: \"These are the local changes that will be applied to the form.\",\n type: \"Type\",\n string: \"string\",\n number: \"number\",\n boolean: \"boolean\",\n date: \"date\",\n map: \"map\",\n array: \"array\",\n arrays_of_arrays_not_supported: \"Arrays of arrays are not supported.\",\n data_type_not_supported: \"Data type {{dataType}} not supported yet\",\n passkey_error_unsupported: \"Your device or browser doesn't support passkeys.\",\n\n // ─── Entity form feedback ─────────────────────────────────────\n saved_correctly: \"Saved successfully\",\n error_before_saving: \"Error preparing data\",\n error_after_saving: \"Error in post-save hook\",\n error_saving_entity: \"Error saving entity\",\n entity_does_not_exist: \"This entity does not exist in the database\",\n form_modified: \"This form has been modified\",\n form_in_sync: \"The current form is in sync with the database\",\n fix_errors_before_saving: \"Fix highlighted errors before saving\",\n\n admin: \"Admin\",\n home: \"Home\",\n this_form_has_errors: \"This form has errors\",\n error_loading_navigation: \"Error loading navigation\",\n error_loading_auth: \"Error loading auth\",\n this_form_has_been_modified: \"This form has been modified\",\n current_form_in_sync: \"The current form is in sync with the database\",\n open_in_console: \"Open in the console\",\n collection_does_not_exist: \"The specified collection does not exist. Check console\",\n unexpected_value: \"Unexpected value\",\n unexpected_value_click_to_edit: \"Unexpected value. Click to edit\",\n unexpected_reference_value: \"Unexpected reference value. Click to edit\",\n copy_url_to_clipboard: \"Copy url to clipboard\",\n open_image_in_new_tab: \"Open image in new tab\",\n reference_not_set: \"Reference not set\",\n reference_does_not_exist: \"Reference does not exist\",\n entity_not_found: \"Entity not found\",\n file_not_found: \"File not found\",\n unsaved_changes_in_entity: \"You have unsaved changes in this entity.\",\n delete_this_role: \"Delete this role\",\n no_roles_yet: \"You don't have any roles yet.\",\n create_default_roles: \"Create default roles\",\n delete_role_confirmation: \"Are you sure you want to delete this role?\",\n delete_this_user: \"Delete this user\",\n no_users_yet: \"There are no users yet\",\n add_logged_user_as_admin: \"Add the logged user as an admin\",\n add_current_user_as_admin: \"Add current user as admin\",\n create_default_roles_and_add_admin: \"Create default roles and add current user as admin\",\n delete_user_confirmation: \"Are you sure you want to delete this user?\",\n create_your_users_and_roles: \"Create your users and roles\",\n no_users_or_roles_defined: \"You have no users or roles defined. You can create default roles and add the current user as admin.\",\n save_before_changing_schema: \"You need to save the document before changing the schema\",\n edit_schema_for_this_form: \"Edit schema for this form\",\n no_permissions_to_edit_collection: \"You don't have permissions to edit this collection\",\n browser_does_not_support_audio: \"Your browser does not support the audio element.\",\n user_not_found: \"User not found: {{value}}\",\n\n // ─── Collection view actions ──────────────────────────────────\n delete_selected: \"Delete\",\n cannot_delete_selected: \"You have selected at least one entity you cannot delete\",\n\n // ─── Array / field containers ─────────────────────────────────\n add_entry: \"Add\",\n add_on_top: \"Add on top\",\n add_below: \"Add below\",\n add_to_field: \"Add to {{fieldName}}\",\n value: \"Value\",\n key: \"Key\",\n drag_drop_multiple: \"Drag 'n' drop some files here, or click to select files. Drag to reorder.\",\n drag_drop_single: \"Drag 'n' drop a file here, or click to select one\",\n\n // ─── Navigation / scaffold ────────────────────────────────────\n open_menu: \"Open menu\",\n close_drawer: \"Close drawer\",\n navigation_drawer: \"Navigation drawer\",\n collapse: \"Collapse\",\n expand: \"Expand\",\n change_language: \"Change language\",\n toggle_theme: \"Toggle theme\",\n user_menu: \"User menu\",\n\n // ─── Error states ─────────────────────────────────────────────\n error: \"Error\",\n error_loading_data: \"Could not load data\",\n error_check_server_logs: \"Check server logs for details.\",\n error_technical_details: \"Technical details\",\n error_uploading_file: \"Error uploading file\",\n error_deleting: \"Error deleting\",\n error_before_delete: \"Error before delete\",\n error_updating_asset: \"Error updating asset\",\n error_deleting_asset: \"Error deleting asset\",\n error_firestore_index: \"A Firestore index is required for this query.\",\n create_index: \"Create Index\",\n value_is_not_reference: \"Value is not a reference.\",\n click_to_edit: \"Click to edit\",\n data_is_not_array_of_references: \"Data is not an array of references\",\n\n // ─── Misc ─────────────────────────────────────────────────────\n loading: \"Loading\",\n local_changes_applied: \"Local changes applied to the form\",\n local_changes_discarded: \"Local changes discarded\",\n are_you_sure_leave: \"Are you sure you want to leave this page?\",\n see_console_details: \"See console for more details.\",\n drop_here_create_group: \"Drop here to create a new group\",\n filter_for_null_values: \"Filter for null values\",\n value_updated_elsewhere: \"This value has been updated elsewhere\",\n add_property: \"Add property\",\n edit_name: \"Edit {{name}}\",\n this_entity_not_exist: \"This entity does not exist in the database\",\n internal_error: \"Internal ERROR\",\n\n // ─── Rename group dialog ──────────────────────────────────────\n rename_group: \"Rename Group\",\n group_name_label: \"Group Name\",\n group_name_empty_error: \"Group name cannot be empty.\",\n group_name_exists_error: \"This group name already exists.\",\n\n // ─── Search ───────────────────────────────────────────────────\n search_collections: \"Search collections\",\n\n // ─── Navigation groups ────────────────────────────────────────\n views_group: \"Views\",\n\n // ─── Entity Edit View ─────────────────────────────────────────\n youd_need_to_save_before_additional_collections: \"You need to save your entity before adding additional collections\",\n\n // ─── Not Found Page ───────────────────────────────────────────\n page_not_found: \"Page not found\",\n page_not_found_body: \"This page does not exist or you may not have access to it\",\n back_to_home: \"Back to home\",\n\n // ─── Collection Editor ─────────────────────────────────────────\n default_collection_view: \"Default collection view\",\n table_view: \"Table\",\n cards_view: \"Cards\",\n kanban_view: \"Kanban\",\n choose_how_entities_displayed_default: \"Choose how entities should be displayed by default\",\n\n document_view: \"Document view\",\n side_panel: \"Side panel\",\n full_screen: \"Full screen\",\n should_documents_opened_full_screen: \"Should documents be opened full screen or in an inline side dialog\",\n\n select_custom_view: \"Select custom view\",\n no_custom_views_defined: \"No custom views defined. Define your custom views in the customization settings, before using this dialog.\",\n\n select_custom_action: \"Select custom action\",\n no_custom_actions_defined: \"No custom actions defined. Define your custom actions in the customization settings, before using this dialog.\",\n\n no_collections_found: \"No collections found\",\n start_building_collections: \"Start building collections in Rebase easily. Map them to your existing database data, import from files, or use our templates.\",\n create_first_collection: \"Create your first collection\",\n define_collections_programmatically: \"You can also define collections programmatically.\",\n edit_collection: \"Edit collection\",\n no_permissions_edit_collection: \"You don't have permissions to edit this collection\",\n no_permissions_create_collection: \"You don't have permissions to create collections\",\n create_collection: \"Create collection\",\n update_collection: \"Update collection\",\n\n new_collection: \"New collection\",\n add_new_collection: \"Add new collection\",\n collection_with_name: \"{{name}} collection\",\n change_icon: \"Change icon\",\n is_subcollection_of: \"This is a subcollection of\",\n name: \"Name\",\n collection_name_description: \"Name of this collection, usually a plural name (e.g. Products)\",\n path: \"Path\",\n relative_path_to_parent: \"Relative path to the parent (no need to include the parent path)\",\n path_in_database: \"Path or table name where this collection is stored in the database\",\n singular_name: \"Singular name\",\n singular_name_description: \"Optionally define a singular name for your entities\",\n description: \"Description\",\n description_of_collection: \"Description of the collection, you can use markdown\",\n collection_id: \"Collection ID\",\n collection_id_description: \"This ID identifies this collection. Typically the same as the path or table name.\",\n collection_group: \"Collection group\",\n collection_group_description: \"A collection group consists of all collections with the same path. This allows you to query over multiple collections at once.\",\n advanced_settings: \"Advanced settings\",\n doc_history_global: \"Document history revisions enabled if enabled globally\",\n doc_history_enabled: \"Document history revisions ENABLED\",\n doc_history_not_enabled: \"Document history revisions NOT enabled\",\n doc_history_description: \"When enabled, each document in this collection will have a history of changes. This is useful for auditing purposes. The data is stored in a subcollection of the document in your database, called __history.\",\n document_id_generation: \"Document IDs generation\",\n code_defined: \"Code defined\",\n users_must_define_id: \"Users must define an ID\",\n users_can_define_id: \"Users can define an ID, but it is not required\",\n doc_id_auto_generated: \"Document ID is generated automatically\",\n config_doc_id_generation: \"Configure how document IDs are generated when creating new entities.\",\n enable_text_search: \"Enable text search for this collection\",\n text_search_description: \"Allow text search for this collection. If you have not specified a text search delegate, this will use the built-in local text search. This is not recommended for large collections, as it may incur in performance and cost issues.\",\n database_id: \"Database ID\",\n default_text: \"(default)\",\n\n custom_actions: \"Custom actions\",\n more_info: \"More info\",\n define_custom_actions_cli: \"Define your own custom actions by uploading them with the CLI.\",\n action_defined_in_code: \"This action is defined in code with key\",\n add_custom_entity_action: \"Add custom entity action\",\n remove_this_action: \"Remove this action?\",\n remove_action_warning: \"This will not delete any data, only the action in the CMS\",\n\n subcollections_of: \"Subcollections of\",\n add_subcollection: \"Add subcollection\",\n custom_views: \"Custom views\",\n define_custom_views_cli: \"Define your own custom views by uploading them with the CLI.\",\n view_defined_in_code: \"This view is defined in code with key\",\n add_custom_entity_view: \"Add custom entity view\",\n delete_this_subcollection: \"Delete this subcollection?\",\n remove_collection_warning: \"This will not delete any data, only the collection in the CMS\",\n remove_this_view: \"Remove this view?\",\n remove_view_warning: \"This will not delete any data, only the view in the CMS\",\n\n no_collection_selected: \"No collection selected\",\n code_for_collection: \"Code for\",\n use_config_define_json: \"Use this config to define the collection in JSON format.\",\n customise_collection_code: \"If you want to customise the collection in code, you can add this collection code to your CMS app configuration.\",\n copied: \"Copied\",\n\n property_cant_be_edited: \"This property can't be edited\",\n property_not_editable_description: \"You may not have permission to edit it or it is defined in code and cannot be modified.\",\n delete_this_property: \"Delete this property?\",\n delete_property_warning: \"This will not delete any data, only modify the collection.\",\n error_must_specify_id: \"You must specify an id for the field\",\n error_id_format: \"The id can only contain letters, numbers and underscores (_), and not start with a number\",\n error_id_already_exists: \"There is another field with this ID already\",\n error_must_specify_title: \"You must specify a title for the field\",\n custom_or_other: \"Custom/Other\",\n select_property_widget: \"Select a property widget\",\n error_changing_data_type: \"This widget uses a different data type than the initially selected widget. This can cause errors with existing data.\",\n required: \"Required\",\n\n enum_form_dialog: \"Enum form dialog\",\n imported_data_preview: \"Imported data preview\",\n entities_with_same_id_overwritten: \"Entities with the same id will be overwritten\",\n collection_editor: \"Collection editor\",\n properties_in_this_group: \"Properties in this group\",\n data_property_mapping: \"Data property mapping\",\n property_edit_view: \"Property edit view\",\n all_of_these: \"All of these\",\n any_of_these: \"Any of these\",\n\n only_admins_edit_roles: \"Only admins can edit roles\",\n error_user_not_found: \"User not found\",\n all_roles: \"All Roles\",\n role: \"Role\",\n name_of_this_role: \"Name of this role\",\n id_of_this_role: \"ID of this role\",\n create_entities: \"Create entities\",\n read_entities: \"Read entities\",\n update_entities: \"Update entities\",\n delete_entities: \"Delete entities\",\n all_collections: \"All collections\",\n create_entities_in_collections: \"Create entities in collections\",\n access_all_data_in_every_collection: \"Access all data in every collection\",\n update_data_in_any_collection: \"Update data in any collection\",\n delete_data_in_any_collection: \"Delete data in any collection\",\n allow_all_permissions_in_this_collections: \"Allow all permissions in this collections\",\n all: \"All\",\n customise_permissions_description: \"You can customise the permissions that the users related to this role can perform in the entities of each collection\",\n create_collections: \"Create collections\",\n yes: \"Yes\",\n no: \"No\",\n can_user_create_collections: \"Can the user create collections\",\n edit_collections: \"Edit collections\",\n only_own_collections: \"Only his/her own\",\n own: \"Own\",\n can_user_edit_collections: \"Can the user edit collections\",\n delete_collections: \"Delete collections\",\n can_user_delete_collections: \"Can the user delete collections\",\n error_saving_role: \"There was an error saving this role\",\n create_role: \"Create role\",\n update: \"Update\",\n\n only_admins_change_roles: \"Only admins can change roles\",\n must_be_at_least_one_admin: \"There must be at least one admin\",\n logged_user_not_found: \"Logged user not found\",\n user: \"User\",\n user_id: \"User ID\",\n name_of_this_user: \"Name of this user\",\n email_of_this_user: \"Email of this user\",\n roles: \"Roles\",\n create_user: \"Create user\",\n\n users: \"Users\",\n add_user: \"Add user\",\n add_role: \"Add role\",\n is_admin: \"Is Admin\",\n default_permissions: \"Default permissions\",\n created_on: \"Created on\",\n email: \"Email\",\n id: \"ID\",\n read: \"Read\",\n\n column_in_file: \"Column in file\",\n map_to_property: \"Map to Property\",\n default_values: \"Default values\",\n default_values_description: \"You can select a default value for unmapped columns and empty values:\",\n property: \"Property\",\n default_value: \"Default value\",\n autogenerate_id: \"Autogenerate ID\",\n id_column_description: \"Column that will be used as ID for each document\",\n do_not_set_value: \"Do not set value\",\n set_value_to_true: \"Set value to true\",\n set_value_to_false: \"Set value to false\",\n drag_and_drop_file: \"Drag and drop a file here or click to upload\",\n error_saving_data: \"Error saving data\",\n retry: \"Retry\",\n saving_data: \"Saving data\",\n entities_saved: \"entities saved\",\n do_not_close_tab: \"Do not close this tab or the import will be interrupted\",\n import: \"Import\",\n import_data: \"Import data\",\n upload_file_description: \"Upload a CSV, Excel or JSON file and map it to your existing schema\",\n back: \"Back\",\n next: \"Next\",\n save_data: \"Save data\",\n use_column_as_id: \"Use this column as ID\",\n do_not_import_property: \"Do not import this property\",\n entities_will_be_overwritten: \"Entities with the same id will be overwritten\",\n data_imported_successfully: \"Data imported successfully\",\n export: \"Export\",\n export_data: \"Export data\",\n download_table_csv: \"Download the content of this table as a CSV\",\n csv: \"CSV\",\n json: \"JSON\",\n dates_as_timestamps: \"Dates as timestamps\",\n dates_as_strings: \"Dates as strings\",\n flatten_arrays: \"Flatten arrays\",\n download: \"Download\",\n large_number_of_documents: \"This collection has a large number of documents ({{count}}).\",\n include_undefined_values: \"Include undefined values\",\n submit: \"Submit\",\n\n no_filterable_properties: \"No filterable properties available\",\n apply_filters: \"Apply filters\",\n\n // ─── Filter Presets ──────────────────────────────────────────\n filter_presets: \"Presets\",\n filter_preset_apply: \"Apply preset\",\n filter_preset_active: \"Active: {{label}}\",\n\n list: \"List\",\n table_view_mode: \"Table\",\n cards: \"Cards\",\n board: \"Board\",\n initialize_kanban_order_desc: \"This will assign sequential order values to all items that don't have one. Items will maintain their current order within each column.\",\n kanban_view_not_available: \"Kanban view is not available\",\n kanban_view_requires_enum: \"Kanban view requires a string property with enum values to group entities into columns. Please add an enum property to your collection schema to use this view.\",\n no_enum_values_configured: 'No enum values configured for property \"{{property}}\"',\n items_need_backfill: \"Some items don't have order values. Initialize to enable drag-and-drop reordering.\",\n kanban_order_not_configured: \"Drag-and-drop ordering is not configured. Set an order property in the collection settings to persist card positions.\",\n initialize: \"Initialize\",\n confirm_multiple_delete: \"Confirm multiple delete?\",\n delete_entity_confirm_title: \"Would you like to delete this {{entityName}}?\",\n no_filter: \"No filter\",\n is_true: \"is true\",\n is_false: \"is false\",\n error_uploading_file_size: \"Error uploading file: File is larger than {{maxSize}} bytes\",\n error_uploading_file_type: \"Error uploading file: File type is not supported\",\n drag_drop_files: \"Drag 'n' drop some files here, or click here to edit\",\n drag_drop_file: \"Drag 'n' drop a file here, or click here to edit\",\n multiple_deleted: \"Multiple deleted\",\n some_entities_deleted: \"Some of the entities have been deleted, but not all\",\n error_deleting_entities: \"Error deleting entities\",\n deleted: \"Deleted\",\n\n select_reference: \"Select reference\",\n select_references: \"Select references\",\n account_settings: \"Account Settings\",\n profile: \"Profile\",\n security: \"Security\",\n sessions: \"Sessions\",\n change_password: \"Change Password\",\n current_password: \"Current Password\",\n new_password: \"New Password\",\n confirm_password: \"Confirm New Password\",\n password_changed: \"Password changed successfully. You will be logged out.\",\n passwords_dont_match: \"Passwords don't match\",\n password_too_short: \"Password must be at least 8 characters\",\n password_change_not_available: \"Password change is not available for accounts using external sign-in providers.\",\n changing_password: \"Changing...\",\n display_name: \"Display Name\",\n photo_url: \"Photo URL\",\n save_profile: \"Save Profile\",\n saving: \"Saving...\",\n no_active_sessions: \"No active sessions found.\",\n revoking: \"Revoking...\",\n revoke_all_sessions: \"Revoke All Sessions\",\n unknown_device: \"Unknown Device\",\n current: \"Current\",\n role_id: \"Role ID\",\n role_name: \"Role Name\",\n add_reference: \"Add reference\",\n add_reference_to: \"Add reference to {{name}}\",\n\n /** RolesView — table & permissions */\n role_deleted_successfully: \"Role deleted successfully\",\n error_deleting_role: \"Error deleting role\",\n collection_permissions: \"Collection permissions\",\n collection: \"Collection\",\n no_collections_configured: \"No collections configured\",\n no_security_rules_defined: \"No security rules defined — all operations unrestricted\",\n no_rules: \"no rules\",\n\n /** UsersView — snackbar */\n bootstrap_admin_success: \"You are now an admin! Refreshing...\",\n failed_to_bootstrap_admin: \"Failed to bootstrap admin\",\n user_deleted_successfully: \"User deleted successfully\",\n error_deleting_user: \"Error deleting user\",\n user_created_successfully: \"User created successfully\",\n invitation_sent: \"An invitation email has been sent to {{email}}. They can use the link to set their password.\",\n invitation_sent_title: \"Invitation Sent\",\n temporary_password: \"Temporary Password\",\n temporary_password_description: \"Email is not configured. Share this temporary password with the user securely. It will not be shown again.\",\n temporary_password_email_failed_description: \"The email could not be delivered. Share this temporary password with the user securely. It will not be shown again.\",\n copy_password: \"Copy password\",\n password_copied: \"Password copied to clipboard\",\n\n /** UsersView — pagination & search */\n search_users: \"Search users\",\n created: \"Created\",\n actions: \"Actions\",\n no_users_found: \"No users found\",\n reset_password: \"Reset Password\",\n reset_password_success: \"Password reset successfully\",\n reset_password_confirmation: \"Are you sure you want to reset this user's password?\",\n reset_password_send_email: \"Send a password reset email\",\n reset_password_set_manually: \"Set a password manually\",\n reset_password_set_manually_description: \"The password is updated immediately and no email is sent. Share it with the user securely.\",\n\n /** Permission-denied empty states */\n no_permission_to_view_users: \"You don't have permission to view users\",\n no_permission_to_view_roles: \"You don't have permission to view roles\",\n no_permission_description: \"Contact an administrator if you need access to this section.\",\n error_resetting_password: \"Error resetting password\",\n\n /** Editor table-bubble */\n add_row_before: \"Add row before\",\n add_row_after: \"Add row after\",\n delete_row: \"Delete row\",\n add_column_before: \"Add column before\",\n add_column_after: \"Add column after\",\n delete_column: \"Delete column\",\n delete_table: \"Delete table\",\n\n /** Editor image-bubble */\n alt_text: \"Alt text\",\n title: \"Title\",\n\n /** MapFieldBinding */\n a_property_of_this_map_has_error: \"A property of this map has an error\",\n\n /** AI Collection Generator Popover */\n generate_collection_with_ai: \"Generate Collection with AI\",\n modify_collection_with_ai: \"Modify Collection with AI\",\n describe_collection_to_create: \"Describe the collection you want to create.\",\n describe_changes_to_make: \"Describe the changes you want to make to this collection.\",\n ai_placeholder_create: \"e.g., Create a products collection with name, price, description, and category...\",\n ai_placeholder_modify: \"e.g., Add a thumbnail image field with storage, make price required...\",\n ai_assist: \"AI Assist\",\n generating: \"Generating...\",\n\n /** Recently extracted strings for collection editor */\n this_is_subcollection_of: \"This is a subcollection of\",\n use_existing_paths_database: \"Use one of the existing paths in your database:\",\n describe_collection_ai: \"Describe your collection to AI:\",\n generate_with_ai: \"Generate with AI\",\n create_from_json_config: \"Create from JSON configuration:\",\n paste_json_config: \"Paste JSON Configuration\",\n create_collection_from_file_formats: \"Create a collection from a file (csv, json, xls, xslx...)\",\n select_template: \"Select a template:\",\n products: \"Products\",\n collection_products_subtitle: \"A collection of products with images, prices and stock\",\n collection_users_subtitle: \"A collection of users with emails, names and roles\",\n blog_posts: \"Blog posts\",\n collection_blog_posts_subtitle: \"A collection of blog posts with images, authors and complex content\",\n pages: \"Pages\",\n collection_pages_subtitle: \"A collection of pages with images, authors and complex content\",\n continue_from_scratch: \"Continue from scratch\",\n\n /** Admin views config */\n cms_users: \"CMS Users\",\n roles_menu: \"Roles\",\n project_settings: \"Project settings\",\n\n by_signing_in_you_agree_to_our: \"By signing in you agree to our\",\n terms_and_conditions: \"Terms and Conditions\",\n and_our: \"and our\",\n privacy_policy: \"Privacy policy\",\n email_password: \"Email/password\",\n sign_in_with_google: \"Sign in with Google\",\n\n // --- Auth error messages ---\n auth_user_not_found: \"User not found\",\n auth_wrong_password: \"Wrong password. Please try again.\",\n auth_user_disabled: \"User disabled. Please contact support.\",\n auth_account_exists_with_different_credential: \"Account exists with different sign in method\",\n auth_email_already_in_use: \"The email is already in use\",\n auth_google_permissions_required: \"You need to grant additional permissions in order to manage your Google Cloud projects\",\n auth_invalid_email_password: \"Please enter both email and password\",\n auth_enter_email_first: \"Please enter your email first\",\n auth_password_reset_sent: \"Password reset email sent\",\n auth_sign_in_account: \"Sign in to your account\",\n auth_create_new_account: \"Create a new account\",\n auth_password: \"Password\",\n auth_reset_password: \"Reset password\",\n auth_new_user: \"New user?\",\n auth_have_account: \"Have an account?\",\n auth_sign_in: \"Sign In\",\n auth_sign_up: \"Sign Up\",\n\n\n auto_setup_collections_button: \"Automatically set up collections\",\n auto_setup_collections_title: \"Automatically set up collections?\",\n auto_setup_collections_desc: \"This will automatically create collection configs for collections that are <b>NOT</b> already mapped\",\n this_can_take_a_minute: \"This can take a minute or two\",\n no_collections_found_to_setup: \"No collections found to setup.\",\n collections_have_been_setup: \"Collections have been automatically setup.\",\n error_setting_up_collections: \"Error automatically setting up collections\",\n\n // --- Home Suggestions ---\n add_your: \"Add your\",\n database_collections: \"database collections\",\n no_unmapped_collections: \"No unmapped collections in the database\",\n query_and_update_with_datatalk: \"Query and update your data in natural language with\",\n\n welcome_to_rebase: \"Welcome to Rebase Cloud\",\n admin_panel_ready_bring_data: \"Your admin panel is ready. Let's bring in your data.\",\n admin_panel_ready_get_started: \"Your admin panel is ready. Here's how to get started.\",\n auto_detect_collections: \"Auto-detect collections\",\n auto_detect_collections_desc: \"Let AI scan your database and automatically generate collection schemas.\",\n create_a_collection: \"Create a collection\",\n create_collection_desc: \"Manually define your first collection from scratch using the visual editor.\",\n read_the_docs: \"Read the docs\",\n read_the_docs_desc: \"Learn how to customize fields, views, actions and more.\",\n explore_docs: \"Explore docs\",\n want_to_customize_with_code: \"Want to customize with code? Run\",\n to_scaffold_a_local_project: \"to scaffold a local project.\",\n\n // ─── Collection Editor — Validation ──────────────────────────\n validation: \"Validation\",\n unique: \"Unique\",\n required_message: \"Required message\",\n required_tooltip: \"You won't be able to save this entity if this value is not set\",\n unique_tooltip: \"There cannot be multiple entities with the same value\",\n lowercase: \"Lowercase\",\n uppercase: \"Uppercase\",\n trim: \"Trim\",\n exact_length: \"Exact length\",\n min_length: \"Min length\",\n max_length: \"Max length\",\n matches_regex: \"Matches regex\",\n not_valid_regexp: \"Not a valid regexp\",\n regex_helper: \"e.g. /^\\\\d+$/ for digits only\",\n min_value: \"Min value\",\n max_value: \"Max value\",\n less_than: \"Less than\",\n more_than: \"More than\",\n positive_value: \"Positive value\",\n negative_value: \"Negative value\",\n integer_value: \"Integer value\",\n\n // ─── Collection Editor — Property Edit ───────────────────────\n invalid_regular_expression: \"Invalid regular expression\",\n must_specify_target_collection: \"You must specify a target collection for the field\",\n need_specify_repeat_field: \"You need to specify a repeat field\",\n need_specify_block_properties: \"You need to specify the properties of this block\",\n incomplete_condition: \"Incomplete condition - please select a field\",\n field_name: \"Field name\",\n\n // ─── Collection Editor — Display & Config ────────────────────\n kanban_column_property: \"Kanban Column Property\",\n select_a_property: \"Select a property\",\n kanban_property_not_found: \"Property \\\"{{property}}\\\" does not exist or is not an enum string property. Please select a valid property or clear the selection.\",\n no_enum_string_properties: \"No enum string properties found. Add a string property with enumValues to use Kanban view.\",\n kanban_column_description: \"Select a string property with enum values to group entities into columns\",\n create_property: \"+ Create \\\"{{property}}\\\" property\",\n order_property: \"Order Property\",\n order_property_not_found: \"Property \\\"{{property}}\\\" does not exist or is not a text property. Please select a valid property or clear the selection.\",\n no_number_properties: \"No text properties found. Add a text property to enable ordering.\",\n order_property_description: \"Select a text property to persist the order of items\",\n display_settings: \"Display settings\",\n default_row_size: \"Default row size\",\n side_dialog_width: \"Side dialog width\",\n side_dialog_width_description: \"Optionally define the width (in pixels) of entities side dialog. Default is 768px\",\n inline_editing_enabled: \"Data can be edited directly in the table view\",\n inline_editing_disabled: \"Data can be edited only in the form view\",\n inline_editing_description: \"Allow editing data directly in the table view, without opening the form view.\",\n include_json_view: \"Include JSON view\",\n no_json_view: \"Do not include JSON view\",\n json_view_description: \"Include the JSON representation of the document.\",\n not_found_suffix: \"not found\",\n\n // ─── Editor ─────────────────────────────────────────────────\n editor_text: \"Text\",\n editor_text_description: \"Just start typing with plain text.\",\n editor_heading_1: \"Heading 1\",\n editor_heading_1_description: \"Big section heading.\",\n editor_heading_2: \"Heading 2\",\n editor_heading_2_description: \"Medium section heading.\",\n editor_heading_3: \"Heading 3\",\n editor_heading_3_description: \"Small section heading.\",\n editor_todo_list: \"To-do List\",\n editor_todo_list_description: \"Track tasks with a to-do list.\",\n editor_bullet_list: \"Bullet List\",\n editor_bullet_list_description: \"Create a simple bulleted list.\",\n editor_numbered_list: \"Numbered List\",\n editor_numbered_list_description: \"Create a list with numbering.\",\n editor_quote: \"Quote\",\n editor_quote_description: \"Capture a quote.\",\n editor_code: \"Code\",\n editor_code_description: \"Capture a code snippet.\",\n editor_image: \"Image\",\n editor_image_description: \"Upload an image from your computer.\",\n editor_multiple: \"Multiple\",\n editor_link: \"Link\",\n editor_save: \"Save\",\n editor_cancel: \"Cancel\",\n editor_remove_link: \"Remove link\",\n editor_paste_or_type_link: \"Paste or type link\",\n editor_open_in_new_window: \"Open in new window\",\n editor_bold: \"Bold\",\n editor_italic: \"Italic\",\n editor_underline: \"Underline\",\n editor_strikethrough: \"Strikethrough\",\n editor_autocomplete: \"Autocomplete\",\n editor_autocomplete_description: \"Add text based on the context.\",\n\n // ─── Text Search Dialog ─────────────────────────────────────\n text_search_dialog_title: \"Enable text search\",\n text_search_local_not_recommended: \"Local text search is not recommended for large collections.\",\n text_search_local_fetch_warning: \"Note that enabling local text search will need to fetch all documents from your collection and store them in the browser. This can be inefficient for large collections. It can also incur in additional costs.\",\n text_search_external_suggestion: \"For larger collections, you are encouraged to use an external search engine such as Algolia or Elastic Search, and assign a search delegate to your config.\",\n text_search_local_description: \"Local text search is the simplest way to enable text search in your collection. It loads all documents in the collection in the browser and performs the search locally. This is the recommended option for small collections.\",\n text_search_own_implementation: \"You have implemented your own text search controller. You enable text search for your collection.\",\n text_search_enable_for_collection: \"Enable for this collection\",\n text_search_enable_for_project: \"Enable for project\",\n text_search_enabled_snackbar: \"Local text search enabled\",\n\n settings_heading: \"Settings\",\n settings_project_name: \"Project name\",\n settings_default_language: \"Default language\",\n settings_default_language_caption: \"Select the base language for this project. Users can override this preference in their personal settings.\",\n settings_enable_local_text_search: \"Enable local text search\",\n settings_local_text_search_caption: \"Enable local text search for all collections. This will allow you to search text fields in your collections using the Rebase search bar. Note that this feature can incur in higher read counts, as it will index all text fields in your collections.\",\n settings_doc_history_all_collections: \"Document history enabled for all collections\",\n settings_doc_history_caption: \"When true, all collections will have the history enabled by default. You can override this setting in each collection. History will be saved in the __history subcollection of each document.\",\n settings_theme: \"Theme\",\n settings_primary_color: \"Primary color\",\n settings_secondary_color: \"Secondary color\",\n settings_sample_theme_components: \"Sample theme components\",\n settings_drag_drop_logo: \"Drag and drop your logo here\",\n settings_security_rules: \"Security rules\",\n settings_security_rules_description: \"Rebase uses granular security rules to restrict access to data. When creating a new user through Rebase, custom claims are added to the user. By adding the following security rules to your project, you ensure Rebase users can access data securely.\",\n settings_security_rules_add_domain: \"Remember to add the domain {{domain}} to your provider allowed domains\",\n settings_security_rules_caption: \"These rules restrict access to data to Rebase users only, but do not enforce the permissions at the database level. The permissions are enforced in the frontend though, which will work fine for most projects. If you need to enforce the permissions at the database level, you can modify these security rules yourself to suit your needs. The roles assigned to a user are set as custom claims in the auth token, so you can use them in your security rules.\",\n\n // ─── Studio: SQL Editor ─────────────────────────────────────\n studio_sql_executing_query: \"EXECUTING QUERY...\",\n studio_sql_query_error: \"Query Error\",\n studio_sql_run_query_placeholder: \"Run a query to see results\",\n studio_sql_visual_execution_plan: \"Visual Execution Plan\",\n studio_sql_success: \"SUCCESS\",\n studio_sql_no_results: \"Query executed successfully but returned no results.\",\n studio_sql_rows: \"Rows:\",\n studio_sql_time: \"Time:\",\n studio_sql_copy_markdown: \"Copy Markdown\",\n studio_sql_export_json: \"Export JSON\",\n studio_sql_export_csv: \"Export CSV\",\n studio_sql_format_sql: \"Format SQL\",\n studio_sql_explain: \"Explain\",\n studio_sql_limit_1000: \"Limit 1000\",\n studio_sql_remove_from_favorites: \"Remove from Favorites\",\n studio_sql_add_to_favorites: \"Add to Favorites\",\n studio_sql_save: \"Save\",\n studio_sql_run: \"Run\",\n studio_sql_database: \"Database\",\n studio_sql_role: \"Role\",\n studio_sql_admin: \"(Admin)\",\n studio_sql_select_db: \"Select DB\",\n studio_sql_query_results: \"Query Results\",\n studio_sql_save_snippet: \"Save SQL Snippet\",\n studio_sql_snippet_name: \"Snippet Name\",\n studio_sql_snippet_name_placeholder: \"e.g., Get All Users\",\n studio_sql_snippet_saved_local: \"This will be saved to your local storage.\",\n studio_sql_cancel: \"Cancel\",\n studio_sql_dangerous_operation: \"Dangerous Operation Detected\",\n studio_sql_dangerous_operation_body: \"The query you are about to run contains potentially destructive operations (DELETE, DROP, TRUNCATE, or UPDATE without WHERE). Are you sure you want to proceed?\",\n studio_sql_snippet_saved: \"Snippet \\\"{{name}}\\\" saved.\",\n studio_sql_markdown_copied: \"Results copied as Markdown!\",\n studio_sql_markdown_copy_failed: \"Failed to copy Markdown to clipboard.\",\n studio_sql_row_updated: \"Row updated successfully.\",\n studio_sql_cannot_edit_missing_query: \"Cannot edit rows: The underlying query is missing.\",\n studio_sql_cannot_resolve_table: \"Could not resolve table/primary key\",\n studio_sql_missing_pk: \"Row is missing primary key column(s): {{columns}}. Cannot safely update.\",\n studio_sql_update_failed: \"Failed to update: {{message}}\",\n studio_sql_execution_not_supported: \"SQL execution is not supported by the current data source.\",\n studio_sql_error_executing: \"An error occurred while executing the query.\",\n studio_sql_error_explaining: \"An error occurred while explaining the query.\",\n studio_sql_save_first_to_favorite: \"Please save the snippet first before favoriting.\",\n studio_sql_cms: \"Collections:\",\n studio_sql_cms_collections_tooltip: \"Tables in this query that are mapped to collections\",\n studio_sql_edit_entity: \"Open {{name}} #{{id}}\",\n studio_sql_sql_not_supported: \"SQL execution not supported by this data source\",\n studio_sql_fetch_error: \"Failed to fetch connection options: {{message}}\",\n studio_sql_unexpected_format: \"Unexpected data format: {{type}}\",\n studio_sql_no_tables: \"No tables found in this database.\",\n studio_sql_schema_fetch_error: \"Failed to fetch schema: {{message}}\",\n\n // ─── Studio: SQL Editor Sidebar ──────────────────────────────\n studio_sql_sidebar_snippets: \"Snippets\",\n studio_sql_sidebar_history: \"History\",\n studio_sql_sidebar_schema: \"Schema\",\n studio_sql_sidebar_no_snippets: \"No saved snippets\",\n studio_sql_sidebar_save_snippet_hint: \"Save a query to access it here.\",\n studio_sql_sidebar_no_history: \"No history\",\n studio_sql_sidebar_history_hint: \"Executed queries will appear here.\",\n studio_sql_sidebar_delete_snippet: \"Delete snippet\",\n\n // ─── Studio: Schema Browser ──────────────────────────────────\n studio_schema_tables: \"Tables\",\n studio_schema_loading: \"Loading schema...\",\n studio_schema_no_tables: \"No tables found\",\n studio_schema_retry: \"Retry\",\n studio_schema_primary_key: \"Primary Key\",\n studio_schema_select_all: \"SELECT * FROM\",\n studio_schema_insert_into: \"INSERT INTO\",\n studio_schema_update: \"UPDATE\",\n studio_schema_delete_from: \"DELETE FROM\",\n studio_schema_columns: \"{{count}} columns\",\n\n // ─── Studio: RLS Editor ──────────────────────────────────────\n studio_rls_title: \"Row Level Security\",\n studio_rls_description: \"Manage RLS policies for your tables\",\n studio_rls_enabled: \"RLS Enabled\",\n studio_rls_disabled: \"RLS Disabled\",\n studio_rls_no_rls: \"No RLS\",\n studio_rls_enable_rls: \"Enable RLS\",\n studio_rls_disable_rls: \"Disable RLS\",\n studio_rls_create_policy: \"Create Policy\",\n studio_rls_policies: \"Policies\",\n studio_rls_no_policies: \"No policies defined\",\n studio_rls_no_policies_desc: \"This table has no RLS policies. All rows are accessible based on the RLS status.\",\n studio_rls_add_first_policy: \"Add your first policy\",\n studio_rls_force_rls: \"Force RLS\",\n studio_rls_force_rls_desc: \"When enabled, RLS policies apply to the table owner as well.\",\n studio_rls_enable_force_rls: \"Enable Force RLS\",\n studio_rls_disable_force_rls: \"Disable Force RLS\",\n studio_rls_edit: \"Edit\",\n studio_rls_delete: \"Delete\",\n studio_rls_confirm_delete_title: \"Delete Policy\",\n studio_rls_confirm_delete_body: \"Are you sure you want to delete this policy? This action cannot be undone.\",\n studio_rls_confirm_enable_title: \"Enable Row Level Security\",\n studio_rls_confirm_enable_body: \"Enabling RLS will restrict access to rows in this table based on your policies. Make sure you have appropriate policies in place.\",\n studio_rls_confirm_disable_title: \"Disable Row Level Security\",\n studio_rls_confirm_disable_body: \"Disabling RLS will make all rows accessible to all roles. Are you sure you want to continue?\",\n studio_rls_select_table: \"Select a table\",\n studio_rls_no_tables: \"No tables available\",\n studio_rls_error: \"Error loading policies\",\n studio_rls_retry: \"Retry\",\n studio_rls_loading: \"Loading policies...\",\n\n // ─── Studio: Policy Editor ───────────────────────────────────\n studio_policy_edit: \"Edit Policy\",\n studio_policy_create: \"Create New Policy\",\n studio_policy_defining_rules: \"Defining access rules for\",\n studio_policy_cancel: \"Cancel\",\n studio_policy_save: \"Save Policy\",\n studio_policy_template: \"Start from a template (Optional)\",\n studio_policy_select_template: \"Select a template...\",\n studio_policy_name: \"Policy Name\",\n studio_policy_name_placeholder: \"Give your policy a descriptive name\",\n studio_policy_behavior: \"Policy Behavior\",\n studio_policy_permissive: \"Permissive\",\n studio_policy_permissive_desc: \"Combined using \\\"OR\\\"\",\n studio_policy_restrictive: \"Restrictive\",\n studio_policy_restrictive_desc: \"Combined using \\\"AND\\\"\",\n studio_policy_command: \"Policy Command\",\n studio_policy_target_roles: \"Target Roles\",\n studio_policy_roles_placeholder: \"Select roles (defaults to public)\",\n studio_policy_using_expr: \"USING expression\",\n studio_policy_using_expr_desc: \"Applies to existing rows (SELECT, UPDATE, DELETE)\",\n studio_policy_check_expr: \"WITH CHECK expression\",\n studio_policy_check_expr_desc: \"Applies to new or modified rows (INSERT, UPDATE)\",\n studio_policy_help_title: \"Row Level Security (RLS) Guide\",\n studio_policy_help_intro: \"Row Level Security (RLS) allows you to restrict which rows a user can access or modify based on their authentication status or roles.\",\n studio_policy_help_step1_title: \"1. Select a Template\",\n studio_policy_help_step1_desc: \"If you're new to RLS, the easiest way to start is by selecting a predefined template from the dropdown. It will automatically configure the policy for common use cases like \\\"Users can update their own rows\\\".\",\n studio_policy_help_step2_title: \"2. Target Roles\",\n studio_policy_help_step2_desc: \"Choose which users the policy applies to:\",\n studio_policy_help_role_public: \"Applies to everyone (logged in or not).\",\n studio_policy_help_role_authenticated: \"Only applies to users who are logged in.\",\n studio_policy_help_role_anon: \"Only applies to users who are NOT logged in.\",\n studio_policy_help_step3_title: \"3. USING Expression\",\n studio_policy_help_step3_desc: \"A SQL condition that must evaluate to true for existing rows to be visible or updatable (SELECT, UPDATE, DELETE).\",\n studio_policy_help_step3_example: \"Ensures users can only see rows where they are the owner.\",\n studio_policy_help_step4_title: \"4. WITH CHECK Expression\",\n studio_policy_help_step4_desc: \"A SQL condition that must evaluate to true for new or modified rows to be saved (INSERT, UPDATE).\",\n studio_policy_help_step4_example: \"Usually the same as the USING expression when users are only allowed to insert/edit their own data.\",\n studio_policy_help_auth_vars_title: \"Rebase Auth Variables\",\n studio_policy_help_auth_vars_desc: \"Rebase provides native helper functions that you can use in your expressions:\",\n studio_policy_help_auth_uid: \"Returns the current user's ID as text. Example:\",\n studio_policy_help_auth_jwt: \"Returns the full JWT payload as JSONB so you can check custom claims. Example:\",\n studio_policy_help_auth_roles: \"Returns the user's role IDs as a comma-separated string. Best used with:\",\n studio_policy_help_docs_cta: \"To learn more about Postgres policies, check out the official documentation.\",\n studio_policy_help_read_docs: \"Read Docs\",\n studio_policy_help_got_it: \"Got it!\",\n\n // ─── Studio: UI Actions ──────────────────────────────────────\n studio_add_kanban_column: \"Add column\",\n studio_add_kanban_column_title: \"Add Kanban Column\",\n studio_add_kanban_column_name: \"Column name\",\n studio_add_kanban_column_name_placeholder: \"New column name\",\n studio_add_kanban_column_add: \"Add\",\n studio_add_kanban_column_cancel: \"Cancel\",\n studio_collection_view_sql: \"SQL Editor\",\n studio_collection_view_cms: \"CMS View\",\n studio_editor_collection_tooltip: \"Edit collection schema\",\n studio_editor_collection_no_permission: \"You don't have permission to edit this collection\",\n studio_editor_collection_start_tooltip: \"Copy path or edit schema\",\n studio_editor_collection_start_no_permission: \"You don't have permission to modify this collection\",\n studio_editor_collection_start_copied: \"Copied!\",\n studio_editor_entity_tooltip: \"Edit entity schema\",\n studio_editor_entity_no_permission: \"You don't have permission to edit this entity\",\n studio_home_edit_collection: \"Edit collection\",\n studio_home_delete_collection: \"Delete collection\",\n studio_home_confirm_delete_title: \"Delete collection?\",\n studio_home_confirm_delete_body: \"Are you sure you want to delete the collection \\\"{{name}}\\\"? This action cannot be undone.\",\n studio_kanban_setup: \"Kanban Setup\",\n studio_missing_reference: \"Missing reference: {{path}}\",\n studio_missing_reference_create: \"Create\",\n studio_new_collection: \"New collection\",\n studio_new_collection_card: \"New collection\",\n studio_new_collection_no_permission: \"You don't have permissions to create collections\",\n studio_property_add_column: \"Add new property\",\n studio_property_add_column_no_permission: \"You don't have permission to add new properties\",\n studio_add_kanban_column_desc: \"Add a new option to the \\\"{{property}}\\\" property. This will create a new column in the Kanban board.\",\n studio_add_kanban_column_adding: \"Adding...\",\n studio_collection_view_edit: \"Edit\",\n studio_editor_collection_disabled: \"Collection editing is disabled\",\n studio_editor_collection_edit: \"Edit collection\",\n studio_editor_entity_save_first: \"You need to save the document before changing the schema\",\n studio_editor_entity_edit_schema: \"Edit schema for this form\",\n studio_editor_collection_start_save_filter: \"Save default filter and sort\",\n studio_editor_collection_start_clear_filter: \"Clear default filter and sort\",\n studio_editor_collection_start_reset_filter: \"Reset to default filter and sort\",\n studio_editor_collection_start_saved: \"Default config saved\",\n studio_home_duplicate_collection: \"Duplicate\",\n studio_home_delete: \"Delete\",\n studio_home_confirm_delete_no_data: \"This will not delete any data, only the collection in the CMS\",\n studio_home_collection_deleted: \"Collection deleted\",\n studio_kanban_configure: \"Configure Kanban\",\n studio_missing_reference_error: \"No collection for path: {{path}}\",\n studio_new_collection_add: \"Add new collection\",\n\n // ─── Property field labels ──────────────────────────────────\n db_column_type: \"Database Column Type\",\n primary_key_unique_id: \"Primary Key / Unique ID\",\n spread_children_as_columns: \"Spread children as columns\",\n mode: \"Mode\",\n timezone: \"Timezone\",\n target_collection: \"Target collection\",\n\n // ─── Storage property ───────────────────────────────────────\n storage_file_name: \"File name\",\n storage_path: \"Storage path\",\n storage_max_size: \"Max size (in bytes)\",\n storage_resize_mode: \"Resize mode\",\n storage_output_format: \"Output format\",\n storage_max_width: \"Max width (px)\",\n storage_max_height: \"Max height (px)\",\n storage_quality: \"Quality (0-100)\",\n storage_file_upload_config: \"File upload config\",\n storage_image_resize_config: \"Image Resize Configuration\",\n storage_all_file_types: \"All file types allowed\",\n storage_allowed_file_types: \"Allowed file types\",\n storage_include_bucket_url: \"Include bucket URL (s3://...) in saved value\",\n storage_save_url: \"Save URL instead of storage path\",\n\n // ─── DateTime property ──────────────────────────────────────\n datetime_automatic_value: \"Automatic value\",\n\n // ─── Markdown property ──────────────────────────────────────\n markdown_paste_behavior: \"Paste behavior\",\n markdown_strip_html: \"Strip HTML on paste\",\n markdown_convert_pasted: \"Convert pasted text to markdown\"\n};\n","import { RebaseTranslations } from \"@rebasepro/types\";\n\n/**\n * Spanish baseline translations for @rebasepro/app.\n *\n * This is the single source of truth for all default UI strings in Spanish.\n * Override any key via the `translations` prop on Rebase entry-point components.\n *\n * @group Core\n */\nexport const es: RebaseTranslations = {\n // ─── Form actions ────────────────────────────────────────────\n save: \"Guardar\",\n create: \"Crear\",\n create_copy: \"Crear copia\",\n save_and_close: \"Guardar y cerrar\",\n create_copy_and_close: \"Crear copia y cerrar\",\n create_and_close: \"Crear y cerrar\",\n discard: \"Descartar\",\n clear: \"Limpiar\",\n cancel: \"Cancelar\",\n\n // ─── Entity actions ──────────────────────────────────────────\n edit: \"Editar\",\n copy: \"Copiar\",\n delete: \"Eliminar\",\n delete_not_allowed: \"Has seleccionado al menos una entidad que no puedes eliminar\",\n\n // ─── Delete dialog ───────────────────────────────────────────\n delete_confirmation_title: \"¿Eliminar?\",\n delete_confirmation_body: \"Esto eliminará la entidad. ¿Estás seguro?\",\n delete_multiple_confirmation_body: \"Esto eliminará las entidades seleccionadas. ¿Estás seguro?\",\n\n // ─── Unsaved-changes dialog ───────────────────────────────────\n unsaved_changes_title: \"Cambios sin guardar\",\n unsaved_changes_body: \"Tienes cambios sin guardar. ¿Quieres descartarlos?\",\n discard_changes: \"Descartar cambios\",\n keep_editing: \"Seguir editando\",\n clear_form: \"¿Vaciar formulario?\",\n discard_changes_confirmation: \"Todos los cambios no guardados se perderán. Esta acción no se puede deshacer.\",\n clear_form_confirmation: \"Todos los valores introducidos se borrarán. Esta acción no se puede deshacer.\",\n\n // ─── Collection table / toolbar ──────────────────────────────\n search: \"Buscar\",\n find_by_id: \"Buscar por ID\",\n find_entity_by_id: \"Buscar entidad por ID\",\n filter: \"Filtrar\",\n filters: \"Filtros\",\n clear_filter: \"Borrar filtro\",\n clear_filter_sort: \"Borrar filtro/orden\",\n clear_sort: \"Borrar orden\",\n clear_all: \"Borrar todo\",\n no_items: \"Sin elementos\",\n no_entries_found: \"No se encontraron entradas\",\n all_entries_loaded: \"Todas las {{count}} entradas cargadas\",\n create_your_first_entry: \"Crea tu primera entrada\",\n no_results_filter_sort: \"No hay resultados con el filtro/orden aplicado\",\n no_results_search: \"No se encontraron resultados para \\\"{{search}}\\\"\",\n add: \"Añadir\",\n remove: \"Quitar\",\n multiple_entities: \"Múltiples entidades\",\n unsaved_changes: \"Tienes cambios sin guardar en esta colección {{collectionName}}.\",\n so_empty: \"Tan vacío...\",\n no_results: \"No hay resultados con el filtro/orden aplicado\",\n refresh_data: \"Actualizar datos\",\n dark_mode: \"Oscuro\",\n light_mode: \"Claro\",\n system_mode: \"Sistema\",\n ok: \"Aceptar\",\n save_collection_config: \"Guardar la estructura de la colección\",\n search_for_more_icons: \"Buscar más iconos…\",\n ai_modified: \"Modificado por IA\",\n size_label: \"Tamaño\",\n group_by: \"Agrupar por\",\n initialize_kanban_order: \"Inicializar el orden para Kanban\",\n copy_id: \"Copiar ID\",\n add_specific: \"Añadir {{name}}\",\n select_specific: \"Seleccionar {{name}}\",\n select_from: \"Seleccionar de {{name}}\",\n done: \"Hecho\",\n log_out: \"Cerrar sesión\",\n column_cannot_be_edited: \"Esta columna no se puede editar directamente\",\n close: \"Cerrar\",\n unsaved_local_changes: \"Cambios locales sin guardar\",\n unsaved_local_changes_description: \"Este documento ha sido editado localmente y tiene cambios sin guardar. Estos cambios locales se perderán si no los aplicas.\",\n preview_changes: \"Previsualizar cambios\",\n apply_changes: \"Aplicar cambios\",\n discard_local_changes: \"Descartar cambios locales\",\n preview_local_changes: \"Previsualizar cambios locales\",\n preview_local_changes_description: \"Estos son los cambios locales que se aplicarán al formulario.\",\n type: \"Tipo\",\n string: \"cadena\",\n number: \"número\",\n boolean: \"booleano\",\n date: \"fecha\",\n map: \"mapa\",\n array: \"lista\",\n arrays_of_arrays_not_supported: \"Las listas de listas no están soportadas.\",\n data_type_not_supported: \"Tipo de datos {{dataType}} no soportado aún\",\n passkey_error_unsupported: \"Tu dispositivo o navegador no soporta passkeys.\",\n\n // ─── Entity form feedback ─────────────────────────────────────\n saved_correctly: \"Guardado correctamente\",\n error_before_saving: \"Error al preparar los datos\",\n error_after_saving: \"Error en el proceso posterior al guardado\",\n error_saving_entity: \"Error al guardar la entidad\",\n entity_does_not_exist: \"Esta entidad no existe en la base de datos\",\n form_modified: \"Este formulario ha sido modificado\",\n form_in_sync: \"El formulario actual está sincronizado con la base de datos\",\n fix_errors_before_saving: \"Corrija los errores resaltados antes de guardar\",\n\n admin: \"Admin\",\n home: \"Inicio\",\n this_form_has_errors: \"Este formulario tiene errores\",\n error_loading_navigation: \"Error cargando la navegación\",\n error_loading_auth: \"Error cargando la autenticación\",\n this_form_has_been_modified: \"Este formulario ha sido modificado\",\n current_form_in_sync: \"El formulario actual está sincronizado con la base de datos\",\n unexpected_value: \"Valor inesperado\",\n unexpected_value_click_to_edit: \"Valor inesperado. Haz clic para editar\",\n unexpected_reference_value: \"Valor de referencia inesperado. Haz clic para editar\",\n copy_url_to_clipboard: \"Copiar URL al portapapeles\",\n open_image_in_new_tab: \"Abrir imagen en una nueva pestaña\",\n reference_not_set: \"Referencia no establecida\",\n reference_does_not_exist: \"La referencia no existe\",\n entity_not_found: \"Entidad no encontrada\",\n file_not_found: \"Archivo no encontrado\",\n unsaved_changes_in_entity: \"Tienes cambios sin guardar en esta entidad.\",\n delete_this_role: \"Eliminar este rol\",\n no_roles_yet: \"Aún no tienes roles.\",\n create_default_roles: \"Crear roles por defecto\",\n delete_role_confirmation: \"¿Estás seguro de que quieres eliminar este rol?\",\n delete_this_user: \"Eliminar este usuario\",\n no_users_yet: \"Aún no hay usuarios\",\n add_logged_user_as_admin: \"Añadir al usuario autenticado como administrador\",\n add_current_user_as_admin: \"Añadir usuario actual como administrador\",\n create_default_roles_and_add_admin: \"Crear roles por defecto y añadir usuario actual como administrador\",\n delete_user_confirmation: \"¿Estás seguro de que quieres eliminar a este usuario?\",\n create_your_users_and_roles: \"Crea tus usuarios y roles\",\n no_users_or_roles_defined: \"No tienes usuarios ni roles. Puedes crear los roles por defecto y añadirte a ti mismo como administrador.\",\n no_permission_to_view_users: \"No tienes permisos para ver los usuarios\",\n no_permission_to_view_roles: \"No tienes permisos para ver los roles\",\n no_permission_description: \"Contacta a un administrador si necesitas acceso a esta sección.\",\n save_before_changing_schema: \"Debes guardar el documento antes de cambiar el esquema\",\n edit_schema_for_this_form: \"Editar esquema para este formulario\",\n no_permissions_to_edit_collection: \"No tienes permisos para editar esta colección\",\n browser_does_not_support_audio: \"Tu navegador no soporta el elemento de audio.\",\n user_not_found: \"Usuario no encontrado: {{value}}\",\n\n // ─── Collection view actions ──────────────────────────────────\n delete_selected: \"Eliminar\",\n cannot_delete_selected: \"Has seleccionado al menos una entidad que no puedes eliminar\",\n\n // ─── Array / field containers ─────────────────────────────────\n add_entry: \"Añadir\",\n add_on_top: \"Añadir arriba\",\n add_below: \"Añadir debajo\",\n add_to_field: \"Añadir a {{fieldName}}\",\n value: \"Valor\",\n key: \"Clave\",\n drag_drop_multiple: \"Arrastra y suelta algunos archivos aquí, o haz clic para seleccionar archivos. Arrastra para reordenar.\",\n drag_drop_single: \"Arrastra y suelta un archivo aquí, o haz clic para seleccionar uno\",\n\n // ─── Navigation / scaffold ────────────────────────────────────\n open_menu: \"Abrir menú\",\n close_drawer: \"Cerrar panel\",\n navigation_drawer: \"Panel de navegación\",\n collapse: \"Contraer\",\n expand: \"Expandir\",\n\n // ─── Error states ─────────────────────────────────────────────\n error: \"Error\",\n error_uploading_file: \"Error al subir archivo\",\n error_deleting: \"Error al eliminar\",\n error_before_delete: \"Error antes de eliminar\",\n error_updating_asset: \"Error al actualizar recurso\",\n error_deleting_asset: \"Error al eliminar recurso\",\n error_firestore_index: \"Se requiere un índice de Firestore para esta consulta.\",\n create_index: \"Crear índice\",\n value_is_not_reference: \"El valor no es una referencia.\",\n click_to_edit: \"Haz clic para editar\",\n data_is_not_array_of_references: \"Los datos no son un array de referencias\",\n collection_does_not_exist: \"La colección especificada no existe. Revisa la consola\",\n\n // ─── Misc ─────────────────────────────────────────────────────\n loading: \"Cargando\",\n local_changes_applied: \"Cambios locales aplicados al formulario\",\n local_changes_discarded: \"Cambios locales descartados\",\n open_in_console: \"Abrir en consola\",\n see_console_details: \"Consulta la consola para más detalles.\",\n drop_here_create_group: \"Suelta aquí para crear un nuevo grupo\",\n filter_for_null_values: \"Filtrar por valores nulos\",\n value_updated_elsewhere: \"Este valor ha sido actualizado en otro lugar\",\n add_property: \"Añadir propiedad\",\n edit_name: \"Editar {{name}}\",\n this_entity_not_exist: \"Esta entidad no existe en la base de datos\",\n internal_error: \"ERROR Interno\",\n are_you_sure_leave: \"¿Estás seguro de que quieres salir de esta página?\",\n\n // ─── Rename group dialog ──────────────────────────────────────\n rename_group: \"Renombrar grupo\",\n group_name_label: \"Nombre del grupo\",\n group_name_empty_error: \"El nombre del grupo no puede estar vacío.\",\n group_name_exists_error: \"Este nombre de grupo ya existe.\",\n\n // ─── Search ───────────────────────────────────────────────────\n search_collections: \"Buscar colecciones\",\n\n // ─── Navigation groups ────────────────────────────────────────\n views_group: \"Vistas\",\n\n // ─── Entity Edit View ─────────────────────────────────────────\n youd_need_to_save_before_additional_collections: \"Debes guardar la entidad antes de añadir colecciones adicionales\",\n\n // ─── Not Found Page ───────────────────────────────────────────\n page_not_found: \"Página no encontrada\",\n page_not_found_body: \"Esta página no existe o podrías no tener acceso a ella\",\n back_to_home: \"Volver al inicio\",\n\n // ─── Collection Editor ─────────────────────────────────────────\n default_collection_view: \"Vista por defecto de la colección\",\n table_view: \"Tabla\",\n cards_view: \"Tarjetas\",\n kanban_view: \"Kanban\",\n choose_how_entities_displayed_default: \"Elige cómo se deben mostrar por defecto las entidades\",\n\n document_view: \"Vista de documento\",\n side_panel: \"Panel lateral\",\n full_screen: \"Pantalla completa\",\n should_documents_opened_full_screen: \"¿Quieres que los documentos se abran en pantalla completa o en un panel lateral?\",\n\n select_custom_view: \"Seleccionar vista personalizada\",\n no_custom_views_defined: \"No hay vistas personalizadas definidas. Define tus vistas en los ajustes de personalización, antes de usar este diálogo.\",\n\n select_custom_action: \"Seleccionar acción personalizada\",\n no_custom_actions_defined: \"No hay acciones personalizadas definidas. Define tus acciones en los ajustes de personalización, antes de usar este diálogo.\",\n\n no_collections_found: \"No se encontraron colecciones\",\n start_building_collections: \"Empieza a crear colecciones en Rebase fácilmente. Mapea la información a tu base de datos existente, importa desde archivos o utiliza nuestras plantillas.\",\n create_first_collection: \"Crea tu primera colección\",\n define_collections_programmatically: \"También puedes definir colecciones programáticamente.\",\n edit_collection: \"Editar colección\",\n no_permissions_edit_collection: \"No tienes permisos para editar esta colección\",\n no_permissions_create_collection: \"No tienes permisos para crear colecciones\",\n create_collection: \"Crear colección\",\n update_collection: \"Actualizar colección\",\n\n new_collection: \"Nueva colección\",\n add_new_collection: \"Añadir nueva colección\",\n collection_with_name: \"Colección {{name}}\",\n change_icon: \"Cambiar icono\",\n is_subcollection_of: \"Esta es una subcolección de\",\n name: \"Nombre\",\n collection_name_description: \"Nombre de esta colección (usualmente un nombre en plural, ej. 'Productos')\",\n path: \"Ruta\",\n relative_path_to_parent: \"Ruta relativa al nivel superior (no es necesario incluir la ruta padre)\",\n path_in_database: \"La ruta donde está almacenada esta colección en la base de datos\",\n singular_name: \"Nombre en singular\",\n singular_name_description: \"Opcionalmente define un nombre en singular para tus entidades\",\n description: \"Descripción\",\n description_of_collection: \"Descripción de la colección, puedes usar markdown\",\n collection_id: \"ID de la Colección\",\n collection_id_description: \"Este ID identifica a esta colección. Típicamente es el mismo que la ruta.\",\n collection_group: \"Grupo de colección\",\n collection_group_description: \"Un grupo de colección consiste en todas las colecciones con la misma ruta. Esto te permite realizar consultas sobre múltiples colecciones a la vez.\",\n advanced_settings: \"Ajustes avanzados\",\n doc_history_global: \"Historial de revisiones de documentos habilitado si está activado globalmente\",\n doc_history_enabled: \"Historial de revisiones de documentos HABILITADO\",\n doc_history_not_enabled: \"Historial de revisiones de documentos NO habilitado\",\n doc_history_description: \"Al estar habilitado, cada documento de esta colección tendrá un registro de cambios. Esto es útil para fines de auditoría. Los datos se almacenan en una subcolección del documento en tu base de datos __history.\",\n document_id_generation: \"Generación de IDs de documentos\",\n code_defined: \"Definido por código\",\n users_must_define_id: \"Los usuarios deben definir un ID\",\n users_can_define_id: \"Los usuarios pueden definir un ID, pero no es obligatorio\",\n doc_id_auto_generated: \"El ID del documento se genera automáticamente\",\n config_doc_id_generation: \"Configura cómo se generan los IDs de los documentos al crear nuevas entidades.\",\n enable_text_search: \"Habilitar búsqueda de texto para esta colección\",\n text_search_description: \"Permite buscar texto en esta colección. Si no has especificado un mecanismo de búsqueda de texto, utilizará la búsqueda local incorporada. Esto no se recomienda para colecciones grandes, ya que puede incidir en el rendimiento.\",\n database_id: \"ID de la base de datos\",\n default_text: \"(por defecto)\",\n\n custom_actions: \"Acciones personalizadas\",\n more_info: \"Más información\",\n define_custom_actions_cli: \"Define tus propias acciones personalizadas subiéndolas con la CLI.\",\n action_defined_in_code: \"Esta acción está definida en el código con la clave\",\n add_custom_entity_action: \"Añadir acción personalizada de entidad\",\n remove_this_action: \"¿Eliminar esta acción?\",\n remove_action_warning: \"Esto no eliminará ningún dato, sólo se retirará del CMS\",\n\n subcollections_of: \"Subcolecciones de\",\n add_subcollection: \"Añadir subcolección\",\n custom_views: \"Vistas personalizadas\",\n define_custom_views_cli: \"Define tus propias vistas personalizadas subiéndolas con la CLI.\",\n view_defined_in_code: \"Esta vista se define en el código con la clave\",\n add_custom_entity_view: \"Añadir vista de entidad personalizada\",\n delete_this_subcollection: \"¿Eliminar esta subcolección?\",\n remove_collection_warning: \"Esto no eliminará ningún dato, sólo la colección en el CMS\",\n remove_this_view: \"¿Eliminar esta vista?\",\n remove_view_warning: \"Esto no eliminará ningún dato, sólo la vista en el CMS\",\n\n no_collection_selected: \"Ninguna colección seleccionada\",\n code_for_collection: \"Código para\",\n use_config_define_json: \"Usa esta configuración para definir la colección en formato JSON.\",\n customise_collection_code: \"Si deseas personalizar la colección en código, puedes añadir este código a la configuración de tu aplicación de CMS.\",\n copied: \"Copiado\",\n\n property_cant_be_edited: \"Esta propiedad no se puede editar\",\n property_not_editable_description: \"Puede que no tengas permisos para editarla o que esté definida en código y no se pueda modificar.\",\n delete_this_property: \"¿Eliminar esta propiedad?\",\n delete_property_warning: \"Esto no eliminará datos, sólo modificará la configuración de la colección.\",\n error_must_specify_id: \"Debes especificar un id para el campo\",\n error_id_format: \"El id sólo puede contener letras, números y guiones bajos (_), y no puede empezar con un número\",\n error_id_already_exists: \"Ya existe otro campo con este ID\",\n error_must_specify_title: \"Debes especificar un título para el campo\",\n custom_or_other: \"Personalizado/Otro\",\n select_property_widget: \"Selecciona un widget de propiedad\",\n error_changing_data_type: \"Este widget utiliza un tipo de dato diferente al seleccionado inicialmente. Esto puede generar errores con los datos existentes.\",\n required: \"Requerido\",\n\n enum_form_dialog: \"Diálogo de formulario Enum\",\n imported_data_preview: \"Vista previa de datos importados\",\n entities_with_same_id_overwritten: \"Las entidades con el mismo id se sobrescribirán\",\n collection_editor: \"Editor de colecciones\",\n properties_in_this_group: \"Propiedades en este grupo\",\n data_property_mapping: \"Mapeo de propiedades\",\n property_edit_view: \"Vista de edición de propiedad\",\n all_of_these: \"Todos estos\",\n any_of_these: \"Cualquiera de estos\",\n\n only_admins_edit_roles: \"Sólo los administradores pueden editar roles\",\n error_user_not_found: \"Usuario no encontrado\",\n all_roles: \"Todos los roles\",\n role: \"Rol\",\n name_of_this_role: \"Nombre del rol\",\n id_of_this_role: \"ID del rol\",\n create_entities: \"Crear entidades\",\n read_entities: \"Leer entidades\",\n update_entities: \"Actualizar entidades\",\n delete_entities: \"Eliminar entidades\",\n all_collections: \"Todas las colecciones\",\n create_entities_in_collections: \"Crear entidades en colecciones\",\n access_all_data_in_every_collection: \"Acceder a todos los datos en cada colección\",\n update_data_in_any_collection: \"Actualizar datos en cualquier colección\",\n delete_data_in_any_collection: \"Eliminar datos en cualquier colección\",\n allow_all_permissions_in_this_collections: \"Permitir todos los permisos en estas colecciones\",\n all: \"Todo\",\n customise_permissions_description: \"Puedes personalizar los permisos de los usuarios para este rol en cada colección\",\n create_collections: \"Crear colecciones\",\n yes: \"Sí\",\n no: \"No\",\n can_user_create_collections: \"¿Puede el usuario crear colecciones?\",\n edit_collections: \"Editar colecciones\",\n only_own_collections: \"Sólo las propias\",\n own: \"Propias\",\n can_user_edit_collections: \"¿Puede el usuario editar colecciones?\",\n delete_collections: \"Eliminar colecciones\",\n can_user_delete_collections: \"¿Puede el usuario eliminar colecciones?\",\n error_saving_role: \"Hubo un error al guardar este rol\",\n create_role: \"Crear rol\",\n update: \"Actualizar\",\n\n only_admins_change_roles: \"Sólo los administradores pueden cambiar roles\",\n must_be_at_least_one_admin: \"Tiene que haber al menos un administrador\",\n logged_user_not_found: \"Usuario autenticado no encontrado\",\n user: \"Usuario\",\n user_id: \"ID del usuario\",\n name_of_this_user: \"Nombre de este usuario\",\n email_of_this_user: \"Correo electrónico de este usuario\",\n roles: \"Roles\",\n create_user: \"Crear usuario\",\n\n users: \"Usuarios\",\n add_user: \"Añadir usuario\",\n add_role: \"Añadir rol\",\n is_admin: \"Es Administrador\",\n default_permissions: \"Permisos predeterminados\",\n created_on: \"Creado en\",\n email: \"Email\",\n id: \"ID\",\n read: \"Leer\",\n\n column_in_file: \"Columna en el archivo\",\n map_to_property: \"Mapear a Propiedad\",\n default_values: \"Valores por defecto\",\n default_values_description: \"Puedes seleccionar un valor por defecto para columnas no mapeadas o valores en blanco:\",\n property: \"Propiedad\",\n default_value: \"Valor predeterminado\",\n autogenerate_id: \"Autogenerar ID\",\n id_column_description: \"Columna que se utilizará como ID de cada documento\",\n do_not_set_value: \"No asignar valor\",\n set_value_to_true: \"Asignar valor verdadero (true)\",\n set_value_to_false: \"Asignar valor falso (false)\",\n drag_and_drop_file: \"Arrastra y suelta un archivo aquí, o haz clic para subirlo\",\n error_saving_data: \"Error al guardar los datos\",\n retry: \"Reintentar\",\n saving_data: \"Guardando datos\",\n entities_saved: \"entidades guardadas\",\n do_not_close_tab: \"No cierres esta pestaña o se interrumpirá la importación\",\n import: \"Importar\",\n import_data: \"Importar datos\",\n upload_file_description: \"Sube un archivo CSV, Excel o JSON y mapéalo a tu esquema actual\",\n back: \"Atrás\",\n next: \"Siguiente\",\n save_data: \"Guardar datos\",\n use_column_as_id: \"Usar esta columna como ID\",\n do_not_import_property: \"No importar esta propiedad\",\n entities_will_be_overwritten: \"Las entidades con el mismo ID se sobrescribirán\",\n data_imported_successfully: \"Datos importados correctamente\",\n export: \"Exportar\",\n export_data: \"Exportar datos\",\n download_table_csv: \"Descargar el contenido de esta tabla como CSV\",\n csv: \"CSV\",\n json: \"JSON\",\n dates_as_timestamps: \"Fechas como marcas de tiempo (timestamps)\",\n dates_as_strings: \"Fechas como cadenas (strings)\",\n flatten_arrays: \"Aplanar arrays\",\n download: \"Descargar\",\n large_number_of_documents: \"Esta colección posee un gran número de documentos ({{count}}).\",\n include_undefined_values: \"Incluir valores omitidos (undefined)\",\n submit: \"Enviar\",\n\n no_filterable_properties: \"No hay propiedades filtrables disponibles\",\n apply_filters: \"Aplicar filtros\",\n list: \"Lista\",\n table_view_mode: \"Tabla\",\n cards: \"Tarjetas\",\n board: \"Tablero\",\n initialize_kanban_order_desc: \"Esto asignará valores secuenciales para todos los elementos sin ordenación. Los elementos mantendrán su orden actual en cada columna.\",\n kanban_view_not_available: \"La vista Kanban no está disponible\",\n kanban_view_requires_enum: \"La vista Kanban requiere una propiedad de tipo texto con opciones (enum) para poder agrupar. Por favor, asegúrate de añadir una propiedad de este tipo a la colección para utilizar esta vista.\",\n no_enum_values_configured: 'No hay opciones (enum) configuradas para la propiedad \"{{property}}\"',\n items_need_backfill: \"Existen elementos sin valores de ordenación. Inicialízalos para habilitar la reorganización con arrastrar y soltar.\",\n kanban_order_not_configured: \"El ordenamiento por arrastrar y soltar no está configurado. Establece una propiedad de orden en la configuración de la colección para persistir las posiciones de las tarjetas.\",\n initialize: \"Inicializar\",\n confirm_multiple_delete: \"¿Confirmar eliminación múltiple?\",\n delete_entity_confirm_title: \"¿Confirmas que quieres borrar el elemento '{{entityName}}'?\",\n multiple_deleted: \"Múltiples eliminados\",\n some_entities_deleted: \"Algunas entidades han sido eliminadas, pero no todas\",\n error_deleting_entities: \"Error al eliminar entidades\",\n deleted: \"eliminado\",\n\n /** Recently extracted strings for collection editor */\n /** AI Collection Generator Popover */\n generate_collection_with_ai: \"Generar colección con IA\",\n modify_collection_with_ai: \"Modificar colección con IA\",\n describe_collection_to_create: \"Describe la colección que quieres crear.\",\n describe_changes_to_make: \"Describe los cambios que quieres hacer en esta colección.\",\n ai_placeholder_create: \"p. ej., Crear una colección de productos con nombre, precio, descripción y categoría...\",\n ai_placeholder_modify: \"p. ej., Agregar un campo de imagen en miniatura con almacenamiento, hacer el precio obligatorio...\",\n ai_assist: \"Asistente IA\",\n generating: \"Generando...\",\n\n this_is_subcollection_of: \"Esta es una subcolección de\",\n use_existing_paths_database: \"Usa una de las rutas existentes en tu base de datos:\",\n describe_collection_ai: \"Describe tu colección a la IA:\",\n generate_with_ai: \"Generar con IA\",\n create_from_json_config: \"Crear desde configuración JSON:\",\n paste_json_config: \"Pegar configuración JSON\",\n create_collection_from_file_formats: \"Crear una colección desde un archivo (csv, json, xls, xslx...)\",\n select_template: \"Seleccionar una plantilla:\",\n products: \"Productos\",\n collection_products_subtitle: \"Una colección de productos con imágenes, precios y existencias\",\n collection_users_subtitle: \"Una colección de usuarios con correos electrónicos, nombres y roles\",\n blog_posts: \"Entradas de blog\",\n collection_blog_posts_subtitle: \"Una colección de artículos con imágenes, autores y contenido complejo\",\n pages: \"Páginas\",\n collection_pages_subtitle: \"Una colección de páginas con imágenes, autores y contenido complejo\",\n continue_from_scratch: \"Continuar desde cero\",\n\n /** Admin views config */\n cms_users: \"Usuarios del CMS\",\n roles_menu: \"Roles\",\n project_settings: \"Ajustes del proyecto\",\n\n by_signing_in_you_agree_to_our: \"Al iniciar sesión aceptas nuestros\",\n terms_and_conditions: \"Términos y Condiciones\",\n and_our: \"y nuestra\",\n privacy_policy: \"Política de Privacidad\",\n email_password: \"Email/Contraseña\",\n sign_in_with_google: \"Iniciar sesión con Google\",\n\n // --- Auth error messages ---\n auth_user_not_found: \"Usuario no encontrado\",\n auth_wrong_password: \"Contraseña incorrecta. Por favor, inténtalo de nuevo.\",\n auth_user_disabled: \"Usuario deshabilitado. Por favor, contacta con soporte.\",\n auth_account_exists_with_different_credential: \"Ya existe una cuenta con un método de inicio de sesión diferente\",\n auth_email_already_in_use: \"El correo electrónico ya está en uso\",\n auth_google_permissions_required: \"Necesitas conceder permisos adicionales para gestionar tus proyectos de Google Cloud\",\n auth_invalid_email_password: \"Por favor introduce tanto el correo electrónico como la contraseña\",\n auth_enter_email_first: \"Por favor introduce tu correo electrónico primero\",\n auth_password_reset_sent: \"Correo electrónico de restablecimiento de contraseña enviado\",\n auth_sign_in_account: \"Inicia sesión en tu cuenta\",\n auth_create_new_account: \"Crea una cuenta nueva\",\n auth_password: \"Contraseña\",\n auth_reset_password: \"Restablecer contraseña\",\n auth_new_user: \"¿Usuario nuevo?\",\n auth_have_account: \"¿Tienes una cuenta?\",\n auth_sign_in: \"Iniciar Sesión\",\n auth_sign_up: \"Regístrate\",\n\n\n auto_setup_collections_button: \"Configurar colecciones automáticamente\",\n auto_setup_collections_title: \"¿Configurar colecciones automáticamente?\",\n auto_setup_collections_desc: \"Esto creará automáticamente la configuración de las colecciones que <b>NO</b> estén mapeadas\",\n this_can_take_a_minute: \"Esto puede tardar un minuto o dos\",\n no_collections_found_to_setup: \"No se encontraron colecciones para configurar\",\n collections_have_been_setup: \"¡Tus colecciones han sido configuradas!\",\n error_setting_up_collections: \"Error al configurar colecciones\",\n\n // --- Home Suggestions ---\n add_your: \"Añade tus\",\n database_collections: \"colecciones de base de datos\",\n no_unmapped_collections: \"No hay colecciones sin mapear en la base de datos\",\n query_and_update_with_datatalk: \"Consulta y actualiza tus datos en lenguaje natural con\",\n\n welcome_to_rebase: \"Bienvenido a Rebase Cloud\",\n admin_panel_ready_bring_data: \"Tu panel de administración está listo. Traigamos tus datos.\",\n admin_panel_ready_get_started: \"Tu panel de administración está listo. Así es como puedes empezar.\",\n auto_detect_collections: \"Autodetectar colecciones\",\n auto_detect_collections_desc: \"Deja que la IA escanee tu base de datos y genere esquemas de colección automáticamente.\",\n create_a_collection: \"Crear una colección\",\n create_collection_desc: \"Define manualmente tu primera colección desde cero usando el editor visual.\",\n read_the_docs: \"Consulta la documentación\",\n read_the_docs_desc: \"Aprende cómo personalizar campos, vistas, acciones y más.\",\n explore_docs: \"Explorar la documentación\",\n want_to_customize_with_code: \"¿Quieres personalizar con código? Ejecuta\",\n to_scaffold_a_local_project: \"para crear un proyecto local.\",\n\n // ─── Collection Editor — Validation ──────────────────────────\n validation: \"Validación\",\n unique: \"Único\",\n required_message: \"Mensaje de campo obligatorio\",\n required_tooltip: \"No podrás guardar esta entidad si este valor no está establecido\",\n unique_tooltip: \"No puede haber múltiples entidades con el mismo valor\",\n lowercase: \"Minúsculas\",\n uppercase: \"Mayúsculas\",\n trim: \"Recortar espacios\",\n exact_length: \"Longitud exacta\",\n min_length: \"Longitud mínima\",\n max_length: \"Longitud máxima\",\n matches_regex: \"Coincide con regex\",\n not_valid_regexp: \"No es una expresión regular válida\",\n regex_helper: \"ej. /^\\\\d+$/ solo para dígitos\",\n min_value: \"Valor mínimo\",\n max_value: \"Valor máximo\",\n less_than: \"Menor que\",\n more_than: \"Mayor que\",\n positive_value: \"Valor positivo\",\n negative_value: \"Valor negativo\",\n integer_value: \"Valor entero\",\n\n // ─── Collection Editor — Property Edit ───────────────────────\n invalid_regular_expression: \"Expresión regular no válida\",\n must_specify_target_collection: \"Debes especificar una colección de destino para el campo\",\n need_specify_repeat_field: \"Debes especificar un campo de repetición\",\n need_specify_block_properties: \"Debes especificar las propiedades de este bloque\",\n incomplete_condition: \"Condición incompleta - por favor selecciona un campo\",\n field_name: \"Nombre del campo\",\n\n // ─── Collection Editor — Display & Config ────────────────────\n kanban_column_property: \"Propiedad de columna Kanban\",\n select_a_property: \"Seleccionar una propiedad\",\n kanban_property_not_found: \"La propiedad \\\"{{property}}\\\" no existe o no es una propiedad de tipo string con enum. Selecciona una propiedad válida o borra la selección.\",\n no_enum_string_properties: \"No se encontraron propiedades de tipo string con enum. Agrega una propiedad string con enumValues para usar la vista Kanban.\",\n kanban_column_description: \"Selecciona una propiedad de tipo string con valores enum para agrupar entidades en columnas\",\n create_property: \"+ Crear propiedad \\\"{{property}}\\\"\",\n order_property: \"Propiedad de orden\",\n order_property_not_found: \"La propiedad \\\"{{property}}\\\" no existe o no es una propiedad numérica. Selecciona una propiedad válida o borra la selección.\",\n no_number_properties: \"No se encontraron propiedades numéricas. Agrega una propiedad numérica para habilitar el ordenamiento.\",\n order_property_description: \"Selecciona una propiedad numérica para mantener el orden de los elementos\",\n display_settings: \"Configuración de visualización\",\n default_row_size: \"Tamaño de fila predeterminado\",\n side_dialog_width: \"Ancho del diálogo lateral\",\n side_dialog_width_description: \"Opcionalmente define el ancho (en píxeles) del diálogo lateral de entidades. El valor predeterminado es 768px\",\n inline_editing_enabled: \"Los datos se pueden editar directamente en la vista de tabla\",\n inline_editing_disabled: \"Los datos solo se pueden editar en la vista de formulario\",\n inline_editing_description: \"Permitir editar datos directamente en la vista de tabla, sin abrir la vista de formulario.\",\n include_json_view: \"Incluir vista JSON\",\n no_json_view: \"No incluir vista JSON\",\n json_view_description: \"Incluir la representación JSON del documento.\",\n not_found_suffix: \"no encontrado\",\n\n // ─── Editor ─────────────────────────────────────────────────\n editor_text: \"Texto\",\n editor_text_description: \"Empieza a escribir con texto plano.\",\n editor_heading_1: \"Encabezado 1\",\n editor_heading_1_description: \"Encabezado de sección grande.\",\n editor_heading_2: \"Encabezado 2\",\n editor_heading_2_description: \"Encabezado de sección mediano.\",\n editor_heading_3: \"Encabezado 3\",\n editor_heading_3_description: \"Encabezado de sección pequeño.\",\n editor_todo_list: \"Lista de tareas\",\n editor_todo_list_description: \"Sigue tus tareas con una lista de tareas.\",\n editor_bullet_list: \"Lista con viñetas\",\n editor_bullet_list_description: \"Crea una lista simple con viñetas.\",\n editor_numbered_list: \"Lista numerada\",\n editor_numbered_list_description: \"Crea una lista con numeración.\",\n editor_quote: \"Cita\",\n editor_quote_description: \"Captura una cita.\",\n editor_code: \"Código\",\n editor_code_description: \"Captura un fragmento de código.\",\n editor_image: \"Imagen\",\n editor_image_description: \"Sube una imagen desde tu ordenador.\",\n editor_multiple: \"Múltiple\",\n editor_link: \"Enlace\",\n editor_save: \"Guardar\",\n editor_cancel: \"Cancelar\",\n editor_remove_link: \"Eliminar enlace\",\n editor_paste_or_type_link: \"Pega o escribe el enlace\",\n editor_open_in_new_window: \"Abrir en una ventana nueva\",\n editor_bold: \"Negrita\",\n editor_italic: \"Cursiva\",\n editor_underline: \"Subrayado\",\n editor_strikethrough: \"Tachado\",\n editor_autocomplete: \"Autocompletar\",\n editor_autocomplete_description: \"Añade texto basado en el contexto.\",\n\n settings_heading: \"Ajustes\",\n settings_project_name: \"Nombre del proyecto\",\n settings_default_language: \"Idioma predeterminado\",\n settings_default_language_caption: \"Selecciona el idioma base para este proyecto. Los usuarios pueden modificar esta preferencia en sus ajustes personales.\",\n settings_enable_local_text_search: \"Habilitar búsqueda de texto local\",\n settings_local_text_search_caption: \"Habilita la búsqueda de texto local para todas las colecciones. Esto te permitirá buscar campos de texto en tus colecciones usando la barra de búsqueda de Rebase. Ten en cuenta que esta función puede implicar un mayor número de lecturas, ya que indexará todos los campos de texto de tus colecciones.\",\n settings_doc_history_all_collections: \"Historial de documentos habilitado para todas las colecciones\",\n settings_doc_history_caption: \"Cuando está activado, todas las colecciones tendrán el historial habilitado por defecto. Puedes cambiar este ajuste en cada colección. El historial se guardará en la subcolección __history de cada documento.\",\n settings_theme: \"Tema\",\n settings_primary_color: \"Color primario\",\n settings_secondary_color: \"Color secundario\",\n settings_sample_theme_components: \"Componentes de ejemplo del tema\",\n settings_drag_drop_logo: \"Arrastra y suelta tu logotipo aquí\",\n settings_security_rules: \"Reglas de seguridad\",\n settings_security_rules_description: \"Rebase utiliza las reglas de seguridad de Firebase para restringir el acceso a los datos. Al crear un nuevo usuario a través de Rebase, se añade el atributo personalizado rebaseUser al usuario en el proyecto cliente. Al añadir las siguientes reglas de seguridad a tu proyecto, te aseguras de que los usuarios de Rebase puedan acceder a los datos a través de Rebase.\",\n settings_security_rules_add_domain: \"Recuerda añadir el dominio {{domain}} a los dominios permitidos de tu proveedor\",\n settings_security_rules_caption: \"Estas reglas restringen el acceso a los datos solo para usuarios de Rebase, pero no aplican los permisos a nivel de base de datos. Los permisos se aplican en el frontend, lo que funciona bien en la mayoría de los proyectos. Si necesitas aplicar los permisos a nivel de base de datos, puedes modificar estas reglas de seguridad. Los roles asignados a un usuario se configuran como atributos personalizados en el token de autenticación de Firebase, por lo que puedes usarlos en tus reglas de seguridad.\",\n\n // ─── Text Search Dialog ─────────────────────────────────────\n text_search_dialog_title: \"Activar búsqueda de texto\",\n text_search_local_not_recommended: \"La búsqueda de texto local no es recomendable para colecciones grandes.\",\n text_search_local_fetch_warning: \"Ten en cuenta que activar la búsqueda de texto local requiere descargar todos los documentos de la colección y almacenarlos en el navegador. Esto puede ser ineficiente para colecciones grandes y generar costes adicionales.\",\n text_search_external_suggestion: \"Para colecciones más grandes, te recomendamos usar un motor de búsqueda externo como Algolia o Elastic Search, y asignar un delegado de búsqueda a tu configuración.\",\n text_search_local_description: \"La búsqueda de texto local es la forma más sencilla de activar la búsqueda de texto en tu colección. Carga todos los documentos de la colección en el navegador y realiza la búsqueda de forma local. Es la opción recomendada para colecciones pequeñas.\",\n text_search_own_implementation: \"Has implementado tu propio controlador de búsqueda de texto. Puedes activar la búsqueda de texto para tu colección.\",\n text_search_enable_for_collection: \"Activar para esta colección\",\n text_search_enable_for_project: \"Activar para el proyecto\",\n text_search_enabled_snackbar: \"Búsqueda de texto local activada\",\n\n // ─── Missing keys (English placeholders — translate) ───\nno_filter: \"No filter\",\n is_true: \"is true\",\n is_false: \"is false\",\n error_uploading_file_size: \"Error uploading file: File is larger than {{maxSize}} bytes\",\n error_uploading_file_type: \"Error uploading file: File type is not supported\",\n drag_drop_files: \"Drag 'n' drop some files here, or click here to edit\",\n drag_drop_file: \"Drag 'n' drop a file here, or click here to edit\",\n select_reference: \"Select reference\",\n select_references: \"Select references\",\n account_settings: \"Account Settings\",\n profile: \"Profile\",\n sessions: \"Sesiones\",\n security: \"Seguridad\",\n change_password: \"Cambiar Contraseña\",\n current_password: \"Contraseña Actual\",\n new_password: \"Nueva Contraseña\",\n confirm_password: \"Confirmar Nueva Contraseña\",\n password_changed: \"Contraseña cambiada con éxito. Se cerrará tu sesión.\",\n passwords_dont_match: \"Las contraseñas no coinciden\",\n password_too_short: \"La contraseña debe tener al menos 8 caracteres\",\n password_change_not_available: \"El cambio de contraseña no está disponible para cuentas que usan proveedores de inicio de sesión externos.\",\n changing_password: \"Cambiando...\",\n display_name: \"Display Name\",\n photo_url: \"Photo URL\",\n save_profile: \"Save Profile\",\n saving: \"Saving...\",\n no_active_sessions: \"No active sessions found.\",\n revoking: \"Revoking...\",\n revoke_all_sessions: \"Revoke All Sessions\",\n unknown_device: \"Unknown Device\",\n current: \"Current\",\n role_id: \"Role ID\",\n role_name: \"Role Name\",\n add_reference: \"Add reference\",\n add_reference_to: \"Add reference to {{name}}\",\n role_deleted_successfully: \"Role deleted successfully\",\n error_deleting_role: \"Error deleting role\",\n collection_permissions: \"Collection permissions\",\n collection: \"Collection\",\n no_collections_configured: \"No collections configured\",\n no_security_rules_defined: \"No security rules defined — all operations unrestricted\",\n no_rules: \"no rules\",\n bootstrap_admin_success: \"You are now an admin! Refreshing...\",\n failed_to_bootstrap_admin: \"Failed to bootstrap admin\",\n user_deleted_successfully: \"User deleted successfully\",\n error_deleting_user: \"Error deleting user\",\n add_row_before: \"Add row before\",\n add_row_after: \"Add row after\",\n delete_row: \"Delete row\",\n add_column_before: \"Add column before\",\n add_column_after: \"Add column after\",\n delete_column: \"Delete column\",\n delete_table: \"Delete table\",\n alt_text: \"Alt text\",\n title: \"Title\",\n a_property_of_this_map_has_error: \"A property of this map has an error\",\n studio_sql_executing_query: \"EXECUTING QUERY...\",\n studio_sql_query_error: \"Query Error\",\n studio_sql_run_query_placeholder: \"Run a query to see results\",\n studio_sql_visual_execution_plan: \"Visual Execution Plan\",\n studio_sql_success: \"SUCCESS\",\n studio_sql_no_results: \"Query executed successfully but returned no results.\",\n studio_sql_rows: \"Rows:\",\n studio_sql_time: \"Time:\",\n studio_sql_copy_markdown: \"Copy Markdown\",\n studio_sql_export_json: \"Export JSON\",\n studio_sql_export_csv: \"Export CSV\",\n studio_sql_format_sql: \"Format SQL\",\n studio_sql_explain: \"Explain\",\n studio_sql_limit_1000: \"Limit 1000\",\n studio_sql_remove_from_favorites: \"Remove from Favorites\",\n studio_sql_add_to_favorites: \"Add to Favorites\",\n studio_sql_save: \"Save\",\n studio_sql_run: \"Run\",\n studio_sql_database: \"Database\",\n studio_sql_role: \"Role\",\n studio_sql_admin: \"(Admin)\",\n studio_sql_select_db: \"Select DB\",\n studio_sql_query_results: \"Query Results\",\n studio_sql_save_snippet: \"Save SQL Snippet\",\n studio_sql_snippet_name: \"Snippet Name\",\n studio_sql_snippet_name_placeholder: \"e.g., Get All Users\",\n studio_sql_snippet_saved_local: \"This will be saved to your local storage.\",\n studio_sql_cancel: \"Cancel\",\n studio_sql_dangerous_operation: \"Dangerous Operation Detected\",\n studio_sql_dangerous_operation_body: \"The query you are about to run contains potentially destructive operations (DELETE, DROP, TRUNCATE, or UPDATE without WHERE). Are you sure you want to proceed?\",\n studio_sql_snippet_saved: \"Snippet \\\"{{name}}\\\" saved.\",\n studio_sql_markdown_copied: \"Results copied as Markdown!\",\n studio_sql_markdown_copy_failed: \"Failed to copy Markdown to clipboard.\",\n studio_sql_row_updated: \"Row updated successfully.\",\n studio_sql_cannot_edit_missing_query: \"Cannot edit rows: The underlying query is missing.\",\n studio_sql_cannot_resolve_table: \"Could not resolve table/primary key\",\n studio_sql_missing_pk: \"Row is missing primary key column(s): {{columns}}. Cannot safely update.\",\n studio_sql_update_failed: \"Failed to update: {{message}}\",\n studio_sql_execution_not_supported: \"SQL execution is not supported by the current data source.\",\n studio_sql_error_executing: \"An error occurred while executing the query.\",\n studio_sql_error_explaining: \"An error occurred while explaining the query.\",\n studio_sql_save_first_to_favorite: \"Please save the snippet first before favoriting.\",\n studio_sql_cms: \"Collections:\",\n studio_sql_cms_collections_tooltip: \"Tables in this query that are mapped as CMS collections\",\n studio_sql_edit_entity: \"Edit {{name}} #{{id}}\",\n studio_sql_sql_not_supported: \"SQL execution not supported by this data source\",\n studio_sql_fetch_error: \"Failed to fetch connection options: {{message}}\",\n studio_sql_unexpected_format: \"Unexpected data format: {{type}}\",\n studio_sql_no_tables: \"No tables found in this database.\",\n studio_sql_schema_fetch_error: \"Failed to fetch schema: {{message}}\",\n studio_sql_sidebar_snippets: \"Snippets\",\n studio_sql_sidebar_history: \"History\",\n studio_sql_sidebar_schema: \"Schema\",\n studio_sql_sidebar_no_snippets: \"No saved snippets\",\n studio_sql_sidebar_save_snippet_hint: \"Save a query to access it here.\",\n studio_sql_sidebar_no_history: \"No history\",\n studio_sql_sidebar_history_hint: \"Executed queries will appear here.\",\n studio_sql_sidebar_delete_snippet: \"Delete snippet\",\n studio_schema_tables: \"Tables\",\n studio_schema_loading: \"Loading schema...\",\n studio_schema_no_tables: \"No tables found\",\n studio_schema_retry: \"Retry\",\n studio_schema_primary_key: \"Primary Key\",\n studio_schema_select_all: \"SELECT * FROM\",\n studio_schema_insert_into: \"INSERT INTO\",\n studio_schema_update: \"UPDATE\",\n studio_schema_delete_from: \"DELETE FROM\",\n studio_schema_columns: \"{{count}} columns\",\n studio_rls_title: \"Row Level Security\",\n studio_rls_description: \"Manage RLS policies for your tables\",\n studio_rls_enabled: \"RLS Enabled\",\n studio_rls_disabled: \"RLS Disabled\",\n studio_rls_no_rls: \"No RLS\",\n studio_rls_enable_rls: \"Enable RLS\",\n studio_rls_disable_rls: \"Disable RLS\",\n studio_rls_create_policy: \"Create Policy\",\n studio_rls_policies: \"Policies\",\n studio_rls_no_policies: \"No policies defined\",\n studio_rls_no_policies_desc: \"This table has no RLS policies. All rows are accessible based on the RLS status.\",\n studio_rls_add_first_policy: \"Add your first policy\",\n studio_rls_force_rls: \"Force RLS\",\n studio_rls_force_rls_desc: \"When enabled, RLS policies apply to the table owner as well.\",\n studio_rls_enable_force_rls: \"Enable Force RLS\",\n studio_rls_disable_force_rls: \"Disable Force RLS\",\n studio_rls_edit: \"Edit\",\n studio_rls_delete: \"Delete\",\n studio_rls_confirm_delete_title: \"Delete Policy\",\n studio_rls_confirm_delete_body: \"Are you sure you want to delete this policy? This action cannot be undone.\",\n studio_rls_confirm_enable_title: \"Enable Row Level Security\",\n studio_rls_confirm_enable_body: \"Enabling RLS will restrict access to rows in this table based on your policies. Make sure you have appropriate policies in place.\",\n studio_rls_confirm_disable_title: \"Disable Row Level Security\",\n studio_rls_confirm_disable_body: \"Disabling RLS will make all rows accessible to all roles. Are you sure you want to continue?\",\n studio_rls_select_table: \"Select a table\",\n studio_rls_no_tables: \"No tables available\",\n studio_rls_error: \"Error loading policies\",\n studio_rls_retry: \"Retry\",\n studio_rls_loading: \"Loading policies...\",\n studio_policy_edit: \"Edit Policy\",\n studio_policy_create: \"Create New Policy\",\n studio_policy_defining_rules: \"Defining access rules for\",\n studio_policy_cancel: \"Cancel\",\n studio_policy_save: \"Save Policy\",\n studio_policy_template: \"Start from a template (Optional)\",\n studio_policy_select_template: \"Select a template...\",\n studio_policy_name: \"Policy Name\",\n studio_policy_name_placeholder: \"Give your policy a descriptive name\",\n studio_policy_behavior: \"Policy Behavior\",\n studio_policy_permissive: \"Permissive\",\n studio_policy_permissive_desc: \"Combined using \\\"OR\\\"\",\n studio_policy_restrictive: \"Restrictive\",\n studio_policy_restrictive_desc: \"Combined using \\\"AND\\\"\",\n studio_policy_command: \"Policy Command\",\n studio_policy_target_roles: \"Target Roles\",\n studio_policy_roles_placeholder: \"Select roles (defaults to public)\",\n studio_policy_using_expr: \"USING expression\",\n studio_policy_using_expr_desc: \"Applies to existing rows (SELECT, UPDATE, DELETE)\",\n studio_policy_check_expr: \"WITH CHECK expression\",\n studio_policy_check_expr_desc: \"Applies to new or modified rows (INSERT, UPDATE)\",\n studio_policy_help_title: \"Row Level Security (RLS) Guide\",\n studio_policy_help_intro: \"Row Level Security (RLS) allows you to restrict which rows a user can access or modify based on their authentication status or roles.\",\n studio_policy_help_step1_title: \"1. Select a Template\",\n studio_policy_help_step1_desc: \"If you're new to RLS, the easiest way to start is by selecting a predefined template from the dropdown. It will automatically configure the policy for common use cases like \\\"Users can update their own rows\\\".\",\n studio_policy_help_step2_title: \"2. Target Roles\",\n studio_policy_help_step2_desc: \"Choose which users the policy applies to:\",\n studio_policy_help_role_public: \"Applies to everyone (logged in or not).\",\n studio_policy_help_role_authenticated: \"Only applies to users who are logged in.\",\n studio_policy_help_role_anon: \"Only applies to users who are NOT logged in.\",\n studio_policy_help_step3_title: \"3. USING Expression\",\n studio_policy_help_step3_desc: \"A SQL condition that must evaluate to true for existing rows to be visible or updatable (SELECT, UPDATE, DELETE).\",\n studio_policy_help_step3_example: \"Ensures users can only see rows where they are the owner.\",\n studio_policy_help_step4_title: \"4. WITH CHECK Expression\",\n studio_policy_help_step4_desc: \"A SQL condition that must evaluate to true for new or modified rows to be saved (INSERT, UPDATE).\",\n studio_policy_help_step4_example: \"Usually the same as the USING expression when users are only allowed to insert/edit their own data.\",\n studio_policy_help_auth_vars_title: \"Rebase Auth Variables\",\n studio_policy_help_auth_vars_desc: \"Rebase provides native helper functions that you can use in your expressions:\",\n studio_policy_help_auth_uid: \"Returns the current user's ID as text. Example:\",\n studio_policy_help_auth_jwt: \"Returns the full JWT payload as JSONB so you can check custom claims. Example:\",\n studio_policy_help_auth_roles: \"Returns the user's role IDs as a comma-separated string. Best used with:\",\n studio_policy_help_docs_cta: \"To learn more about Postgres policies, check out the official documentation.\",\n studio_policy_help_read_docs: \"Read Docs\",\n studio_policy_help_got_it: \"Got it!\",\n studio_add_kanban_column: \"Add column\",\n studio_add_kanban_column_title: \"Add Kanban Column\",\n studio_add_kanban_column_name: \"Column name\",\n studio_add_kanban_column_name_placeholder: \"New column name\",\n studio_add_kanban_column_add: \"Add\",\n studio_add_kanban_column_cancel: \"Cancel\",\n studio_collection_view_sql: \"SQL Editor\",\n studio_collection_view_cms: \"CMS View\",\n studio_editor_collection_tooltip: \"Edit collection schema\",\n studio_editor_collection_no_permission: \"You don't have permission to edit this collection\",\n studio_editor_collection_start_tooltip: \"Copy path or edit schema\",\n studio_editor_collection_start_no_permission: \"You don't have permission to modify this collection\",\n studio_editor_collection_start_copied: \"Copied!\",\n studio_editor_entity_tooltip: \"Edit entity schema\",\n studio_editor_entity_no_permission: \"You don't have permission to edit this entity\",\n studio_home_edit_collection: \"Edit collection\",\n studio_home_delete_collection: \"Delete collection\",\n studio_home_confirm_delete_title: \"Delete collection?\",\n studio_home_confirm_delete_body: \"Are you sure you want to delete the collection \\\"{{name}}\\\"? This action cannot be undone.\",\n studio_kanban_setup: \"Kanban Setup\",\n studio_missing_reference: \"Missing reference: {{path}}\",\n studio_missing_reference_create: \"Create\",\n studio_new_collection: \"New collection\",\n studio_new_collection_card: \"New collection\",\n studio_new_collection_no_permission: \"You don't have permissions to create collections\",\n studio_property_add_column: \"Add new property\",\n studio_property_add_column_no_permission: \"You don't have permission to add new properties\",\n studio_add_kanban_column_desc: \"Add a new option to the \\\"{{property}}\\\" property. This will create a new column in the Kanban board.\",\n studio_add_kanban_column_adding: \"Adding...\",\n studio_collection_view_edit: \"Edit\",\n studio_editor_collection_disabled: \"Collection editing is disabled\",\n studio_editor_collection_edit: \"Edit collection\",\n studio_editor_entity_save_first: \"You need to save the document before changing the schema\",\n studio_editor_entity_edit_schema: \"Edit schema for this form\",\n studio_editor_collection_start_save_filter: \"Save default filter and sort\",\n studio_editor_collection_start_clear_filter: \"Clear default filter and sort\",\n studio_editor_collection_start_reset_filter: \"Reset to default filter and sort\",\n studio_editor_collection_start_saved: \"Default config saved\",\n studio_home_duplicate_collection: \"Duplicate\",\n studio_home_delete: \"Delete\",\n studio_home_confirm_delete_no_data: \"This will not delete any data, only the collection in the CMS\",\n studio_home_collection_deleted: \"Collection deleted\",\n studio_kanban_configure: \"Configure Kanban\",\n studio_missing_reference_error: \"No collection for path: {{path}}\",\n studio_new_collection_add: \"Añadir nueva colección\",\n\n // ─── Property field labels ──────────────────────────────────\n db_column_type: \"Tipo de columna de base de datos\",\n primary_key_unique_id: \"Clave primaria / ID único\",\n spread_children_as_columns: \"Expandir hijos como columnas\",\n mode: \"Modo\",\n timezone: \"Zona horaria\",\n target_collection: \"Colección destino\",\n\n // ─── Storage property ───────────────────────────────────────\n storage_file_name: \"Nombre del archivo\",\n storage_path: \"Ruta de almacenamiento\",\n storage_max_size: \"Tamaño máximo (en bytes)\",\n storage_resize_mode: \"Modo de redimensionamiento\",\n storage_output_format: \"Formato de salida\",\n storage_max_width: \"Ancho máximo (px)\",\n storage_max_height: \"Alto máximo (px)\",\n storage_quality: \"Calidad (0-100)\",\n storage_file_upload_config: \"Configuración de subida de archivos\",\n storage_image_resize_config: \"Configuración de redimensionamiento de imagen\",\n storage_all_file_types: \"Todos los tipos de archivo permitidos\",\n storage_allowed_file_types: \"Tipos de archivo permitidos\",\n storage_include_bucket_url: \"Incluir URL del bucket (s3://...) en el valor guardado\",\n storage_save_url: \"Guardar URL en lugar de la ruta de almacenamiento\",\n\n // ─── DateTime property ──────────────────────────────────────\n datetime_automatic_value: \"Valor automático\",\n\n // ─── Markdown property ──────────────────────────────────────\n markdown_paste_behavior: \"Comportamiento al pegar\",\n markdown_strip_html: \"Eliminar HTML al pegar\",\n markdown_convert_pasted: \"Convertir texto pegado a markdown\"\n};\n","import { RebaseTranslations } from \"@rebasepro/types\";\n\nexport const de: RebaseTranslations = {\n // ─── Form actions ────────────────────────────────────────────\n save: \"Speichern\",\n create: \"Erstellen\",\n create_copy: \"Kopie erstellen\",\n save_and_close: \"Speichern und schließen\",\n create_copy_and_close: \"Kopie erstellen und schließen\",\n create_and_close: \"Erstellen und schließen\",\n discard: \"Verwerfen\",\n clear: \"Löschen\",\n cancel: \"Abbrechen\",\n\n // ─── Entity actions ──────────────────────────────────────────\n edit: \"Bearbeiten\",\n copy: \"Kopieren\",\n delete: \"Löschen\",\n delete_not_allowed: \"Sie haben mindestens eine Entität ausgewählt, die Sie nicht löschen können\",\n\n // ─── Delete dialog ───────────────────────────────────────────\n delete_confirmation_title: \"Löschen?\",\n delete_confirmation_body: \"Dadurch wird die Entität gelöscht. Sind Sie sicher?\",\n delete_multiple_confirmation_body: \"Dadurch werden die ausgewählten Entitäten gelöscht. Sind Sie sicher?\",\n\n // ─── Unsaved-changes dialog ───────────────────────────────────\n unsaved_changes_title: \"Ungespeicherte Änderungen\",\n unsaved_changes_body: \"Sie haben ungespeicherte Änderungen. Möchten Sie diese verwerfen?\",\n discard_changes: \"Änderungen verwerfen\",\n keep_editing: \"Weiter bearbeiten\",\n clear_form: \"Formular leeren?\",\n discard_changes_confirmation: \"Alle nicht gespeicherten Änderungen gehen verloren. Dies kann nicht rückgängig gemacht werden.\",\n clear_form_confirmation: \"Alle eingegebenen Werte werden gelöscht. Dies kann nicht rückgängig gemacht werden.\",\n\n // ─── Collection table / toolbar ──────────────────────────────\n search: \"Suchen\",\n find_by_id: \"Nach ID suchen\",\n find_entity_by_id: \"Entität nach ID suchen\",\n filter: \"Filter\",\n filters: \"Filter\",\n clear_filter: \"Filter löschen\",\n clear_filter_sort: \"Filter/Sortierung löschen\",\n clear_sort: \"Sortierung löschen\",\n clear_all: \"Alle löschen\",\n no_items: \"Keine Elemente\",\n no_entries_found: \"Keine Einträge gefunden\",\n all_entries_loaded: \"Alle {{count}} Einträge geladen\",\n create_your_first_entry: \"Erstellen Sie Ihren ersten Eintrag\",\n no_results_filter_sort: \"Keine Ergebnisse mit angewendetem Filter/Sortierung\",\n no_results_search: \"Keine Ergebnisse gefunden für \\\"{{search}}\\\"\",\n add: \"Hinzufügen\",\n remove: \"Entfernen\",\n multiple_entities: \"Mehrere Entitäten\",\n unsaved_changes: \"Sie haben ungespeicherte Änderungen in {{collectionName}}.\",\n so_empty: \"So leer...\",\n no_results: \"Keine Ergebnisse mit angewendetem Filter/Sortierung\",\n refresh_data: \"Daten aktualisieren\",\n dark_mode: \"Dunkel\",\n light_mode: \"Hell\",\n system_mode: \"System\",\n ok: \"Ok\",\n save_collection_config: \"Sammlungsstruktur speichern\",\n search_for_more_icons: \"Nach weiteren Symbolen suchen…\",\n ai_modified: \"KI-modifiziert\",\n size_label: \"Größe\",\n group_by: \"Gruppieren nach\",\n initialize_kanban_order: \"Kanban-Reihenfolge initialisieren\",\n copy_id: \"ID kopieren\",\n add_specific: \"{{name}} hinzufügen\",\n select_specific: \"{{name}} auswählen\",\n select_from: \"Aus {{name}} auswählen\",\n done: \"Fertig\",\n log_out: \"Abmelden\",\n column_cannot_be_edited: \"Diese Spalte kann nicht direkt bearbeitet werden\",\n close: \"Schließen\",\n unsaved_local_changes: \"Ungespeicherte lokale Änderungen\",\n unsaved_local_changes_description: \"Dieses Dokument wurde lokal bearbeitet und weist ungespeicherte Änderungen auf. Diese lokalen Änderungen gehen verloren, wenn Sie sie nicht anwenden.\",\n preview_changes: \"Änderungen in der Vorschau anzeigen\",\n apply_changes: \"Änderungen anwenden\",\n discard_local_changes: \"Lokale Änderungen verwerfen\",\n preview_local_changes: \"Lokale Änderungen in der Vorschau anzeigen\",\n preview_local_changes_description: \"Dies sind die lokalen Änderungen, die auf das Formular angewendet werden.\",\n type: \"Typ\",\n string: \"Zeichenfolge\",\n number: \"Zahl\",\n boolean: \"Boolescher Wert\",\n date: \"Datum\",\n map: \"Karte\",\n array: \"Array\",\n arrays_of_arrays_not_supported: \"Arrays von Arrays werden nicht unterstützt.\",\n data_type_not_supported: \"Datentyp {{dataType}} wird noch nicht unterstützt\",\n passkey_error_unsupported: \"Ihr Gerät oder Browser unterstützt keine Passkeys.\",\n\n // ─── Entity form feedback ─────────────────────────────────────\n saved_correctly: \"Erfolgreich gespeichert\",\n error_before_saving: \"Fehler bei der Datenvorbereitung\",\n error_after_saving: \"Fehler im Nachspeichervorgang\",\n error_saving_entity: \"Fehler beim Speichern des Eintrags\",\n entity_does_not_exist: \"Dieser Eintrag existiert nicht in der Datenbank\",\n form_modified: \"Dieses Formular wurde geändert\",\n form_in_sync: \"Das aktuelle Formular ist mit der Datenbank synchron\",\n fix_errors_before_saving: \"Markierte Fehler vor dem Speichern beheben\",\n\n admin: \"Admin\",\n home: \"Startseite\",\n this_form_has_errors: \"Dieses Formular enthält Fehler\",\n error_loading_navigation: \"Fehler beim Laden der Navigation\",\n error_loading_auth: \"Fehler beim Laden der Authentifizierung\",\n this_form_has_been_modified: \"Dieses Formular wurde geändert\",\n current_form_in_sync: \"Das aktuelle Formular ist mit der Datenbank synchron\",\n open_in_console: \"In der Konsole öffnen\",\n collection_does_not_exist: \"Die angegebene Sammlung existiert nicht. Überprüfen Sie die Konsole\",\n unexpected_value: \"Unerwarteter Wert\",\n unexpected_value_click_to_edit: \"Unerwarteter Wert. Klicken zum Bearbeiten\",\n unexpected_reference_value: \"Unerwarteter Referenzwert. Klicken zum Bearbeiten\",\n copy_url_to_clipboard: \"URL in Zwischenablage kopieren\",\n open_image_in_new_tab: \"Bild in neuem Tab öffnen\",\n reference_not_set: \"Referenz nicht gesetzt\",\n reference_does_not_exist: \"Referenz existiert nicht\",\n entity_not_found: \"Entität nicht gefunden\",\n file_not_found: \"Datei nicht gefunden\",\n unsaved_changes_in_entity: \"Sie haben ungespeicherte Änderungen in dieser Entität.\",\n delete_this_role: \"Diese Rolle löschen\",\n no_roles_yet: \"Sie haben noch keine Rollen.\",\n create_default_roles: \"Standardrollen erstellen\",\n delete_role_confirmation: \"Sind Sie sicher, dass Sie diese Rolle löschen möchten?\",\n delete_this_user: \"Diesen Benutzer löschen\",\n no_users_yet: \"Es gibt noch keine Benutzer\",\n add_logged_user_as_admin: \"Den angemeldeten Benutzer als Administrator hinzufügen\",\n add_current_user_as_admin: \"Aktuellen Benutzer als Administrator hinzufügen\",\n create_default_roles_and_add_admin: \"Standardrollen erstellen und aktuellen Benutzer als Administrator hinzufügen\",\n delete_user_confirmation: \"Sind Sie sicher, dass Sie diesen Benutzer löschen möchten?\",\n create_your_users_and_roles: \"Erstellen Sie Ihre Benutzer und Rollen\",\n no_users_or_roles_defined: \"Sie haben keine Benutzer oder Rollen definiert. Sie können Standardrollen erstellen und den aktuellen Benutzer als Administrator hinzufügen.\",\n no_permission_to_view_users: \"Sie haben keine Berechtigung, Benutzer anzuzeigen\",\n no_permission_to_view_roles: \"Sie haben keine Berechtigung, Rollen anzuzeigen\",\n no_permission_description: \"Wenden Sie sich an einen Administrator, wenn Sie Zugang zu diesem Bereich benötigen.\",\n save_before_changing_schema: \"Sie müssen das Dokument speichern, bevor Sie das Schema ändern können\",\n edit_schema_for_this_form: \"Schema für dieses Formular bearbeiten\",\n no_permissions_to_edit_collection: \"Sie haben keine Berechtigung, diese Sammlung zu bearbeiten\",\n browser_does_not_support_audio: \"Ihr Browser unterstützt das Audioelement nicht.\",\n user_not_found: \"Benutzer nicht gefunden: {{value}}\",\n\n // ─── Collection view actions ──────────────────────────────────\n delete_selected: \"Löschen\",\n cannot_delete_selected: \"Sie haben mindestens eine Entität ausgewählt, die Sie nicht löschen können\",\n\n // ─── Array / field containers ─────────────────────────────────\n add_entry: \"Hinzufügen\",\n add_on_top: \"Oben hinzufügen\",\n add_below: \"Unten hinzufügen\",\n add_to_field: \"Zu {{fieldName}} hinzufügen\",\n value: \"Wert\",\n key: \"Schlüssel\",\n drag_drop_multiple: \"Ziehen Sie einige Dateien hierher oder klicken Sie, um Dateien auszuwählen. Ziehen zum Neuordnen.\",\n drag_drop_single: \"Ziehen Sie eine Datei hierher oder klicken Sie, um eine auszuwählen\",\n\n // ─── Navigation / scaffold ────────────────────────────────────\n open_menu: \"Menü öffnen\",\n close_drawer: \"Schublade schließen\",\n navigation_drawer: \"Navigationsschublade\",\n collapse: \"Einklappen\",\n expand: \"Ausklappen\",\n\n // ─── Error states ─────────────────────────────────────────────\n error: \"Fehler\",\n error_uploading_file: \"Fehler beim Hochladen der Datei\",\n error_deleting: \"Fehler beim Löschen\",\n error_before_delete: \"Fehler vor dem Löschen\",\n error_updating_asset: \"Fehler beim Aktualisieren des Assets\",\n error_deleting_asset: \"Fehler beim Löschen des Assets\",\n error_firestore_index: \"Für diese Abfrage ist ein Firestore-Index erforderlich.\",\n create_index: \"Index erstellen\",\n value_is_not_reference: \"Wert ist keine Referenz.\",\n click_to_edit: \"Klicken zum Bearbeiten\",\n data_is_not_array_of_references: \"Daten sind kein Array von Referenzen\",\n\n // ─── Misc ─────────────────────────────────────────────────────\n loading: \"Wird geladen\",\n local_changes_applied: \"Lokale Änderungen auf das Formular angewendet\",\n local_changes_discarded: \"Lokale Änderungen verworfen\",\n are_you_sure_leave: \"Sind Sie sicher, dass Sie diese Seite verlassen möchten?\",\n see_console_details: \"Weitere Details siehe Konsole.\",\n drop_here_create_group: \"Hier ablegen, um eine neue Gruppe zu erstellen\",\n filter_for_null_values: \"Nach Nullwerten filtern\",\n value_updated_elsewhere: \"Dieser Wert wurde anderswo aktualisiert\",\n add_property: \"Eigenschaft hinzufügen\",\n edit_name: \"Bearbeiten {{name}}\",\n this_entity_not_exist: \"Diese Entität existiert nicht in der Datenbank\",\n internal_error: \"Interner FEHLER\",\n\n // ─── Rename group dialog ──────────────────────────────────────\n rename_group: \"Gruppe umbenennen\",\n group_name_label: \"Gruppenname\",\n group_name_empty_error: \"Gruppenname darf nicht leer sein.\",\n group_name_exists_error: \"Dieser Gruppenname existiert bereits.\",\n\n // ─── Search ───────────────────────────────────────────────────\n search_collections: \"Sammlungen durchsuchen\",\n\n // ─── Navigation groups ────────────────────────────────────────\n views_group: \"Ansichten\",\n\n // ─── Entity Edit View ─────────────────────────────────────────\n youd_need_to_save_before_additional_collections: \"Sie müssen Ihre Entität speichern, bevor Sie weitere Sammlungen hinzufügen können\",\n\n // ─── Not Found Page ───────────────────────────────────────────\n page_not_found: \"Seite nicht gefunden\",\n page_not_found_body: \"Diese Seite existiert nicht oder Sie haben möglicherweise keinen Zugriff darauf\",\n back_to_home: \"Zurück zur Startseite\",\n\n // ─── Collection Editor ─────────────────────────────────────────\n default_collection_view: \"Standard-Sammlungsansicht\",\n table_view: \"Tabelle\",\n cards_view: \"Karten\",\n kanban_view: \"Kanban\",\n choose_how_entities_displayed_default: \"Wählen Sie aus, wie Entitäten standardmäßig angezeigt werden sollen\",\n\n document_view: \"Dokumentenansicht\",\n side_panel: \"Seitenbereich\",\n full_screen: \"Vollbild\",\n should_documents_opened_full_screen: \"Sollen Dokumente im Vollbildmodus oder in einem Inline-Seitendialog geöffnet werden\",\n\n select_custom_view: \"Benutzerdefinierte Ansicht auswählen\",\n no_custom_views_defined: \"Keine benutzerdefinierten Ansichten definiert. Definieren Sie Ihre benutzerdefinierten Ansichten in den Anpassungseinstellungen, bevor Sie diesen Dialog verwenden.\",\n\n select_custom_action: \"Benutzerdefinierte Aktion auswählen\",\n no_custom_actions_defined: \"Keine benutzerdefinierten Aktionen definiert. Definieren Sie Ihre benutzerdefinierten Aktionen in den Anpassungseinstellungen, bevor Sie diesen Dialog verwenden.\",\n\n no_collections_found: \"Keine Sammlungen gefunden\",\n start_building_collections: \"Beginnen Sie einfach mit dem Erstellen von Sammlungen in Rebase. Ordnen Sie sie Ihren bestehenden Datenbankdaten zu, importieren Sie sie aus Dateien oder verwenden Sie unsere Vorlagen.\",\n create_first_collection: \"Erstellen Sie Ihre erste Sammlung\",\n define_collections_programmatically: \"Sie können Sammlungen auch programmgesteuert definieren.\",\n edit_collection: \"Sammlung bearbeiten\",\n no_permissions_edit_collection: \"Sie haben keine Berechtigung, diese Sammlung zu bearbeiten\",\n no_permissions_create_collection: \"Sie haben keine Berechtigung, Sammlungen zu erstellen\",\n create_collection: \"Sammlung erstellen\",\n update_collection: \"Sammlung aktualisieren\",\n\n new_collection: \"Neue Sammlung\",\n add_new_collection: \"Neue Sammlung hinzufügen\",\n collection_with_name: \"Sammlung {{name}}\",\n change_icon: \"Symbol ändern\",\n is_subcollection_of: \"Dies ist eine Untersammlung von\",\n name: \"Name\",\n collection_name_description: \"Name dieser Sammlung, normalerweise im Plural (z. B. Produkte)\",\n path: \"Pfad\",\n relative_path_to_parent: \"Relativer Pfad zum übergeordneten Element (der übergeordnete Pfad muss nicht eingeschlossen werden)\",\n path_in_database: \"Pfad, in dem diese Sammlung in der Datenbank gespeichert ist\",\n singular_name: \"Bezeichnung im Singular\",\n singular_name_description: \"Definieren Sie optional einen Singularnamen für Ihre Entitäten\",\n description: \"Beschreibung\",\n description_of_collection: \"Beschreibung der Sammlung, Sie können Markdown verwenden\",\n collection_id: \"Sammlungs-ID\",\n collection_id_description: \"Diese ID identifiziert diese Sammlung. Typischerweise identisch mit dem Pfad.\",\n collection_group: \"Sammlungsgruppe\",\n collection_group_description: \"Eine Sammlungsgruppe besteht aus allen Sammlungen mit demselben Pfad. Auf diese Weise können Sie über mehrere Sammlungen gleichzeitig abfragen.\",\n advanced_settings: \"Erweiterte Einstellungen\",\n doc_history_global: \"Dokumentverlaufsrevisionen aktiviert, falls global aktiviert\",\n doc_history_enabled: \"Dokumentverlaufsrevisionen AKTIVIERT\",\n doc_history_not_enabled: \"Dokumentverlaufsrevisionen NICHT aktiviert\",\n doc_history_description: \"Wenn diese Option aktiviert ist, verfügt jedes Dokument in dieser Sammlung über einen Änderungsverlauf. Dies ist nützlich für Überwachungszwecke. Die Daten werden in einer Untersammlung des Dokuments in Ihrer Datenbank namens __history gespeichert.\",\n document_id_generation: \"Generierung von Dokument-IDs\",\n code_defined: \"Code definiert\",\n users_must_define_id: \"Benutzer müssen eine ID definieren\",\n users_can_define_id: \"Benutzer können eine ID definieren, dies ist jedoch nicht erforderlich\",\n doc_id_auto_generated: \"Dokument-ID wird automatisch generiert\",\n config_doc_id_generation: \"Konfigurieren Sie, wie Dokument-IDs beim Erstellen neuer Entitäten generiert werden.\",\n enable_text_search: \"Textsuche für diese Sammlung aktivieren\",\n text_search_description: \"Erlauben Sie die Textsuche für diese Sammlung. Wenn Sie keinen Delegaten für die Textsuche angegeben haben, wird die integrierte lokale Textsuche verwendet. Dies wird für große Sammlungen nicht empfohlen, da dies zu Leistungs- und Kostenproblemen führen kann.\",\n database_id: \"Datenbank-ID\",\n default_text: \"(Standard)\",\n\n custom_actions: \"Benutzerdefinierte Aktionen\",\n more_info: \"Mehr Infos\",\n define_custom_actions_cli: \"Definieren Sie Ihre eigenen benutzerdefinierten Aktionen, indem Sie sie mit der CLI hochladen.\",\n action_defined_in_code: \"Diese Aktion ist im Code definiert mit dem Schlüssel\",\n add_custom_entity_action: \"Benutzerdefinierte Entitätsaktion hinzufügen\",\n remove_this_action: \"Diese Aktion entfernen?\",\n remove_action_warning: \"Dadurch werden keine Daten gelöscht, sondern nur die Aktion im CMS\",\n\n subcollections_of: \"Untersammlungen von\",\n add_subcollection: \"Untersammlung hinzufügen\",\n custom_views: \"Benutzerdefinierte Ansichten\",\n define_custom_views_cli: \"Definieren Sie Ihre eigenen benutzerdefinierten Ansichten, indem Sie sie mit der CLI hochladen.\",\n view_defined_in_code: \"Diese Ansicht ist im Code definiert mit dem Schlüssel\",\n add_custom_entity_view: \"Benutzerdefinierte Entitätsansicht hinzufügen\",\n delete_this_subcollection: \"Diese Untersammlung löschen?\",\n remove_collection_warning: \"Dadurch werden keine Daten gelöscht, sondern nur die Sammlung im CMS\",\n remove_this_view: \"Diese Ansicht entfernen?\",\n remove_view_warning: \"Dadurch werden keine Daten gelöscht, sondern nur die Ansicht im CMS\",\n\n no_collection_selected: \"Keine Sammlung ausgewählt\",\n code_for_collection: \"Code für\",\n use_config_define_json: \"Verwenden Sie diese Konfiguration, um die Sammlung im JSON-Format zu definieren.\",\n customise_collection_code: \"Wenn Sie die Sammlung im Code anpassen möchten, können Sie diesen Sammlungscode zu Ihrer CMS-App-Konfiguration hinzufügen.\",\n copied: \"Kopiert\",\n\n property_cant_be_edited: \"Diese Eigenschaft kann nicht bearbeitet werden\",\n property_not_editable_description: \"Sie haben möglicherweise keine Berechtigung zum Bearbeiten oder es ist im Code definiert und kann nicht geändert werden.\",\n delete_this_property: \"Diese Eigenschaft löschen?\",\n delete_property_warning: \"Dadurch werden keine Daten gelöscht, nur die Sammlung wird geändert.\",\n error_must_specify_id: \"Sie müssen eine ID für das Feld angeben\",\n error_id_format: \"Die ID darf nur Buchstaben, Zahlen und Unterstriche (_) enthalten und nicht mit einer Zahl beginnen\",\n error_id_already_exists: \"Es gibt bereits ein anderes Feld mit dieser ID\",\n error_must_specify_title: \"Sie müssen einen Titel für das Feld angeben\",\n custom_or_other: \"Benutzerdefiniert/Andere\",\n select_property_widget: \"Wählen Sie ein Eigenschafts-Widget aus\",\n error_changing_data_type: \"Dieses Widget verwendet einen anderen Datentyp als das ursprünglich ausgewählte Widget. Dies kann zu Fehlern bei vorhandenen Daten führen.\",\n required: \"Erforderlich\",\n\n enum_form_dialog: \"Enum-Formulardialog\",\n imported_data_preview: \"Vorschau der importierten Daten\",\n entities_with_same_id_overwritten: \"Entitäten mit derselben ID werden überschrieben\",\n collection_editor: \"Sammlungseditor\",\n properties_in_this_group: \"Eigenschaften in dieser Gruppe\",\n data_property_mapping: \"Daten-Eigenschafts-Zuordnung\",\n property_edit_view: \"Ansicht Eigenschaft bearbeiten\",\n all_of_these: \"Alle von diesen\",\n any_of_these: \"Eine von diesen\",\n\n only_admins_edit_roles: \"Nur Administratoren können Rollen bearbeiten\",\n error_user_not_found: \"Benutzer nicht gefunden\",\n all_roles: \"Alle Rollen\",\n role: \"Rolle\",\n name_of_this_role: \"Name dieser Rolle\",\n id_of_this_role: \"ID dieser Rolle\",\n create_entities: \"Entitäten erstellen\",\n read_entities: \"Entitäten lesen\",\n update_entities: \"Entitäten aktualisieren\",\n delete_entities: \"Entitäten löschen\",\n all_collections: \"Alle Sammlungen\",\n create_entities_in_collections: \"Entitäten in Sammlungen erstellen\",\n access_all_data_in_every_collection: \"Auf alle Daten in jeder Sammlung zugreifen\",\n update_data_in_any_collection: \"Daten in einer beliebigen Sammlung aktualisieren\",\n delete_data_in_any_collection: \"Daten in einer beliebigen Sammlung löschen\",\n allow_all_permissions_in_this_collections: \"Alle Berechtigungen in diesen Sammlungen zulassen\",\n all: \"Alle\",\n customise_permissions_description: \"Sie können die Berechtigungen anpassen, die die mit dieser Rolle verknüpften Benutzer für die Entitäten jeder Sammlung ausführen können\",\n create_collections: \"Sammlungen erstellen\",\n yes: \"Ja\",\n no: \"Nein\",\n can_user_create_collections: \"Kann der Benutzer Sammlungen erstellen\",\n edit_collections: \"Sammlungen bearbeiten\",\n only_own_collections: \"Nur seine/ihre eigenen\",\n own: \"Eigene\",\n can_user_edit_collections: \"Kann der Benutzer Sammlungen bearbeiten\",\n delete_collections: \"Sammlungen löschen\",\n can_user_delete_collections: \"Kann der Benutzer Sammlungen löschen\",\n error_saving_role: \"Beim Speichern dieser Rolle ist ein Fehler aufgetreten\",\n create_role: \"Rolle erstellen\",\n update: \"Aktualisieren\",\n\n only_admins_change_roles: \"Nur Administratoren können Rollen ändern\",\n must_be_at_least_one_admin: \"Es muss mindestens einen Administrator geben\",\n logged_user_not_found: \"Angemeldeter Benutzer nicht gefunden\",\n user: \"Benutzer\",\n user_id: \"Benutzer-ID\",\n name_of_this_user: \"Name dieses Benutzers\",\n email_of_this_user: \"E-Mail dieses Benutzers\",\n roles: \"Rollen\",\n create_user: \"Benutzer erstellen\",\n\n users: \"Benutzer\",\n add_user: \"Benutzer hinzufügen\",\n add_role: \"Rolle hinzufügen\",\n is_admin: \"Ist Administrator\",\n default_permissions: \"Standardberechtigungen\",\n created_on: \"Erstellt am\",\n email: \"E-Mail\",\n id: \"ID\",\n read: \"Lesen\",\n\n column_in_file: \"Spalte in der Datei\",\n map_to_property: \"Zuordnung zur Eigenschaft\",\n default_values: \"Standardwerte\",\n default_values_description: \"Sie können einen Standardwert für nicht zugeordnete Spalten und leere Werte auswählen:\",\n property: \"Eigenschaft\",\n default_value: \"Standardwert\",\n autogenerate_id: \"ID automatisch generieren\",\n id_column_description: \"Spalte, die als ID für jedes Dokument verwendet wird\",\n do_not_set_value: \"Wert nicht festlegen\",\n set_value_to_true: \"Wert auf true setzen\",\n set_value_to_false: \"Wert auf false setzen\",\n drag_and_drop_file: \"Datei hierher ziehen und ablegen oder zum Hochladen klicken\",\n error_saving_data: \"Fehler beim Speichern der Daten\",\n retry: \"Wiederholen\",\n saving_data: \"Daten speichern\",\n entities_saved: \"Entitäten gespeichert\",\n do_not_close_tab: \"Schließen Sie diesen Tab nicht, da sonst der Import unterbrochen wird\",\n import: \"Importieren\",\n import_data: \"Daten importieren\",\n upload_file_description: \"Laden Sie eine CSV-, Excel- oder JSON-Datei hoch und ordnen Sie sie Ihrem vorhandenen Schema zu\",\n back: \"Zurück\",\n next: \"Weiter\",\n save_data: \"Daten speichern\",\n use_column_as_id: \"Diese Spalte als ID verwenden\",\n do_not_import_property: \"Diese Eigenschaft nicht importieren\",\n entities_will_be_overwritten: \"Entitäten mit derselben ID werden überschrieben\",\n data_imported_successfully: \"Daten erfolgreich importiert\",\n export: \"Exportieren\",\n export_data: \"Daten exportieren\",\n download_table_csv: \"Laden Sie den Inhalt dieser Tabelle als CSV-Datei herunter\",\n csv: \"CSV\",\n json: \"JSON\",\n dates_as_timestamps: \"Daten als Zeitstempel\",\n dates_as_strings: \"Daten als Zeichenfolgen\",\n flatten_arrays: \"Arrays glätten\",\n download: \"Herunterladen\",\n large_number_of_documents: \"Diese Sammlung hat eine große Anzahl von Dokumenten ({{count}}).\",\n include_undefined_values: \"Undefinierte Werte einschließen\",\n submit: \"Einreichen\",\n\n no_filterable_properties: \"Keine filterbaren Eigenschaften verfügbar\",\n apply_filters: \"Filter anwenden\",\n list: \"Liste\",\n table_view_mode: \"Tabelle\",\n cards: \"Karten\",\n board: \"Board\",\n initialize_kanban_order_desc: \"Dadurch werden allen Elementen, die keine haben, fortlaufende Auftragswerte zugewiesen. Die Elemente behalten ihre aktuelle Reihenfolge innerhalb jeder Spalte bei.\",\n kanban_view_not_available: \"Kanban-Ansicht ist nicht verfügbar\",\n kanban_view_requires_enum: \"Die Kanban-Ansicht erfordert eine String-Eigenschaft mit Enum-Werten, um Entitäten in Spalten zu gruppieren. Bitte fügen Sie dem Schema Ihrer Sammlung eine Enum-Eigenschaft hinzu, um diese Ansicht zu verwenden.\",\n no_enum_values_configured: 'Keine Enum-Werte für Eigenschaft \"{{property}}\" konfiguriert',\n items_need_backfill: \"Einige Elemente haben keine Reihenfolge. Initialisieren Sie sie, um das Verschieben per Drag-and-Drop zu aktivieren.\",\n kanban_order_not_configured: \"Die Drag-and-Drop-Sortierung ist nicht konfiguriert. Legen Sie eine Ordnungseigenschaft in den Sammlungseinstellungen fest, um die Kartenpositionen zu speichern.\",\n initialize: \"Initialisieren\",\n confirm_multiple_delete: \"Mehrfaches Löschen bestätigen?\",\n delete_entity_confirm_title: \"Möchten Sie dieses {{entityName}} löschen?\",\n multiple_deleted: \"Mehrere gelöscht\",\n some_entities_deleted: \"Einige der Entitäten wurden gelöscht, aber nicht alle\",\n error_deleting_entities: \"Fehler beim Löschen der Entitäten\",\n deleted: \"gelöscht\",\n\n /** Recently extracted strings for collection editor */\n /** AI Collection Generator Popover */\n generate_collection_with_ai: \"Sammlung mit KI generieren\",\n modify_collection_with_ai: \"Sammlung mit KI ändern\",\n describe_collection_to_create: \"Beschreibe die Sammlung, die du erstellen möchtest.\",\n describe_changes_to_make: \"Beschreibe die Änderungen, die du an dieser Sammlung vornehmen möchtest.\",\n ai_placeholder_create: \"z. B. Erstelle eine Produktsammlung mit Name, Preis, Beschreibung und Kategorie...\",\n ai_placeholder_modify: \"z. B. Füge ein Miniaturbild-Feld mit Speicher hinzu, mache den Preis erforderlich...\",\n ai_assist: \"KI-Assistent\",\n generating: \"Generiere...\",\n\n this_is_subcollection_of: \"Dies ist eine Untersammlung von\",\n use_existing_paths_database: \"Verwenden Sie einen der vorhandenen Pfade in Ihrer Datenbank:\",\n describe_collection_ai: \"Beschreiben Sie Ihre Sammlung für KI:\",\n generate_with_ai: \"Mit KI generieren\",\n create_from_json_config: \"Aus JSON-Konfiguration erstellen:\",\n paste_json_config: \"JSON-Konfiguration einfügen\",\n create_collection_from_file_formats: \"Eine Sammlung aus einer Datei erstellen (csv, json, xls, xslx...)\",\n select_template: \"Wählen Sie eine Vorlage:\",\n products: \"Produkte\",\n collection_products_subtitle: \"Eine Sammlung von Produkten mit Bildern, Preisen und Lagerbestand\",\n collection_users_subtitle: \"Eine Sammlung von Benutzern mit E-Mails, Namen und Rollen\",\n blog_posts: \"Blogbeiträge\",\n collection_blog_posts_subtitle: \"Eine Sammlung von Blogbeiträgen mit Bildern, Autoren und komplexen Inhalten\",\n pages: \"Seiten\",\n collection_pages_subtitle: \"Eine Sammlung von Seiten mit Bildern, Autoren und komplexen Inhalten\",\n continue_from_scratch: \"Von vorne beginnen\",\n\n /** Admin views config */\n cms_users: \"CMS-Benutzer\",\n roles_menu: \"Rollen\",\n project_settings: \"Projekteinstellungen\",\n\n by_signing_in_you_agree_to_our: \"Mit der Anmeldung stimmen Sie unseren\",\n terms_and_conditions: \"Allgemeinen Geschäftsbedingungen\",\n and_our: \"und unserer\",\n privacy_policy: \"Datenschutzerklärung\",\n email_password: \"E-Mail/Passwort\",\n sign_in_with_google: \"Über Google anmelden\",\n\n // --- Auth error messages ---\n auth_user_not_found: \"Benutzer nicht gefunden\",\n auth_wrong_password: \"Falsches Passwort. Bitte versuchen Sie es erneut.\",\n auth_user_disabled: \"Benutzer deaktiviert. Bitte kontaktieren Sie den Support.\",\n auth_account_exists_with_different_credential: \"Konto existiert mit anderer Anmeldemethode\",\n auth_email_already_in_use: \"Die E-Mail wird bereits verwendet\",\n auth_google_permissions_required: \"Sie müssen zusätzliche Berechtigungen erteilen, um Ihre Google Cloud-Projekte verwalten zu können\",\n auth_invalid_email_password: \"Bitte geben Sie sowohl E-Mail als auch Passwort ein\",\n auth_enter_email_first: \"Bitte geben Sie zuerst Ihre E-Mail ein\",\n auth_password_reset_sent: \"E-Mail zum Zurücksetzen des Passworts gesendet\",\n auth_sign_in_account: \"Melden Sie sich in Ihrem Konto an\",\n auth_create_new_account: \"Neues Konto erstellen\",\n auth_password: \"Passwort\",\n auth_reset_password: \"Passwort zurücksetzen\",\n auth_new_user: \"Neuer Benutzer?\",\n auth_have_account: \"Haben Sie bereits ein Konto?\",\n auth_sign_in: \"Anmelden\",\n auth_sign_up: \"Registrieren\",\n\n\n auto_setup_collections_button: \"Sammlungen automatisch einrichten\",\n auto_setup_collections_title: \"Sammlungen automatisch einrichten?\",\n auto_setup_collections_desc: \"Dadurch werden automatisch Sammlungskonfigurationen für Sammlungen erstellt, die noch <b>NICHT</b> zugeordnet sind.\",\n this_can_take_a_minute: \"Dies kann ein bis zwei Minuten dauern\",\n no_collections_found_to_setup: \"Keine einzurichtenden Sammlungen gefunden\",\n collections_have_been_setup: \"Sammlungen wurden automatisch eingerichtet\",\n error_setting_up_collections: \"Fehler beim automatischen Einrichten der Sammlungen\",\n add_your: \"Fügen Sie Ihre\",\n database_collections: \"Datenbanksammlungen\",\n no_unmapped_collections: \"Keine nicht zugeordneten Sammlungen\",\n query_and_update_with_datatalk: \"Fragen Sie Ihre Daten in natürlicher Sprache ab und aktualisieren Sie sie mit DATATALK\",\n welcome_to_rebase: \"Willkommen bei Rebase\",\n admin_panel_ready_bring_data: \"Ihr Admin-Panel ist bereit. Bringen Sie Ihre Daten ein.\",\n admin_panel_ready_get_started: \"Ihr Admin-Panel ist bereit. So können Sie loslegen.\",\n auto_detect_collections: \"Sammlungen automatisch erkennen\",\n auto_detect_collections_desc: \"Lassen Sie die KI Ihre Datenbank scannen und Sammlungs-Schemata automatisch generieren.\",\n create_a_collection: \"Eine Sammlung erstellen\",\n create_collection_desc: \"Definieren Sie Ihre erste Sammlung manuell mit dem visuellen Editor.\",\n read_the_docs: \"Dokumentation lesen\",\n read_the_docs_desc: \"Erfahren Sie, wie Sie Felder, Ansichten, Aktionen und mehr anpassen können.\",\n explore_docs: \"Dokumentation erkunden\",\n want_to_customize_with_code: \"Möchten Sie mit Code anpassen? Führen Sie aus:\",\n to_scaffold_a_local_project: \"um ein lokales Projekt zu erstellen\",\n\n // ─── Collection Editor — Validation ──────────────────────────\n validation: \"Validierung\",\n unique: \"Einzigartig\",\n required_message: \"Pflichtfeld-Nachricht\",\n required_tooltip: \"Sie können diese Entität nicht speichern, wenn dieser Wert nicht gesetzt ist\",\n unique_tooltip: \"Es darf nicht mehrere Entitäten mit demselben Wert geben\",\n lowercase: \"Kleinbuchstaben\",\n uppercase: \"Großbuchstaben\",\n trim: \"Leerzeichen entfernen\",\n exact_length: \"Exakte Länge\",\n min_length: \"Mindestlänge\",\n max_length: \"Maximale Länge\",\n matches_regex: \"Entspricht Regex\",\n not_valid_regexp: \"Kein gültiger regulärer Ausdruck\",\n regex_helper: \"z.B. /^\\\\d+$/ nur für Ziffern\",\n min_value: \"Minimalwert\",\n max_value: \"Maximalwert\",\n less_than: \"Kleiner als\",\n more_than: \"Größer als\",\n positive_value: \"Positiver Wert\",\n negative_value: \"Negativer Wert\",\n integer_value: \"Ganzzahl\",\n\n // ─── Collection Editor — Property Edit ───────────────────────\n invalid_regular_expression: \"Ungültiger regulärer Ausdruck\",\n must_specify_target_collection: \"Sie müssen eine Ziel-Sammlung für das Feld angeben\",\n need_specify_repeat_field: \"Sie müssen ein Wiederholungsfeld angeben\",\n need_specify_block_properties: \"Sie müssen die Eigenschaften dieses Blocks angeben\",\n incomplete_condition: \"Unvollständige Bedingung – bitte wählen Sie ein Feld\",\n field_name: \"Feldname\",\n\n // ─── Collection Editor — Display & Config ────────────────────\n kanban_column_property: \"Kanban-Spalten-Eigenschaft\",\n select_a_property: \"Eigenschaft auswählen\",\n kanban_property_not_found: \"Eigenschaft \\\"{{property}}\\\" existiert nicht oder ist keine Enum-String-Eigenschaft. Bitte wählen Sie eine gültige Eigenschaft oder löschen Sie die Auswahl.\",\n no_enum_string_properties: \"Keine Enum-String-Eigenschaften gefunden. Fügen Sie eine String-Eigenschaft mit enumValues hinzu, um die Kanban-Ansicht zu verwenden.\",\n kanban_column_description: \"Wählen Sie eine String-Eigenschaft mit Enum-Werten, um Entitäten in Spalten zu gruppieren\",\n create_property: \"+ Eigenschaft \\\"{{property}}\\\" erstellen\",\n order_property: \"Reihenfolge-Eigenschaft\",\n order_property_not_found: \"Eigenschaft \\\"{{property}}\\\" existiert nicht oder ist keine Zahlen-Eigenschaft. Bitte wählen Sie eine gültige Eigenschaft oder löschen Sie die Auswahl.\",\n no_number_properties: \"Keine Zahlen-Eigenschaften gefunden. Fügen Sie eine Zahlen-Eigenschaft hinzu, um die Sortierung zu aktivieren.\",\n order_property_description: \"Wählen Sie eine Zahlen-Eigenschaft, um die Reihenfolge der Elemente beizubehalten\",\n display_settings: \"Anzeigeeinstellungen\",\n default_row_size: \"Standard-Zeilengröße\",\n side_dialog_width: \"Seitendialog-Breite\",\n side_dialog_width_description: \"Optional die Breite (in Pixeln) des Seitendialogs für Entitäten definieren. Standard ist 768px\",\n inline_editing_enabled: \"Daten können direkt in der Tabellenansicht bearbeitet werden\",\n inline_editing_disabled: \"Daten können nur in der Formularansicht bearbeitet werden\",\n inline_editing_description: \"Ermöglicht das direkte Bearbeiten von Daten in der Tabellenansicht, ohne die Formularansicht zu öffnen.\",\n include_json_view: \"JSON-Ansicht einbeziehen\",\n no_json_view: \"JSON-Ansicht nicht einbeziehen\",\n json_view_description: \"Die JSON-Darstellung des Dokuments einbeziehen.\",\n not_found_suffix: \"nicht gefunden\",\n\n // ─── Editor ─────────────────────────────────────────────────\n editor_text: \"Text\",\n editor_text_description: \"Fangen Sie einfach an, Klartext zu tippen.\",\n editor_heading_1: \"Überschrift 1\",\n editor_heading_1_description: \"Große Bereichsüberschrift.\",\n editor_heading_2: \"Überschrift 2\",\n editor_heading_2_description: \"Mittlere Bereichsüberschrift.\",\n editor_heading_3: \"Überschrift 3\",\n editor_heading_3_description: \"Kleine Bereichsüberschrift.\",\n editor_todo_list: \"To-Do Liste\",\n editor_todo_list_description: \"Verfolgen Sie Aufgaben mit einer To-Do Liste.\",\n editor_bullet_list: \"Aufzählungsliste\",\n editor_bullet_list_description: \"Erstellen Sie eine einfache Aufzählungsliste.\",\n editor_numbered_list: \"Nummerierte Liste\",\n editor_numbered_list_description: \"Erstellen Sie eine nummerierte Liste.\",\n editor_quote: \"Zitat\",\n editor_quote_description: \"Erfassen Sie ein Zitat.\",\n editor_code: \"Code\",\n editor_code_description: \"Erfassen Sie einen Code-Ausschnitt.\",\n editor_image: \"Bild\",\n editor_image_description: \"Laden Sie ein Bild hoch.\",\n editor_multiple: \"Mehrere\",\n editor_link: \"Link\",\n editor_save: \"Speichern\",\n editor_cancel: \"Abbrechen\",\n editor_remove_link: \"Link entfernen\",\n editor_paste_or_type_link: \"Link einfügen oder eintippen\",\n editor_open_in_new_window: \"In neuem Fenster öffnen\",\n editor_bold: \"Fett\",\n editor_italic: \"Kursiv\",\n editor_underline: \"Unterstrichen\",\n editor_strikethrough: \"Durchgestrichen\",\n editor_autocomplete: \"Autovervollständigung\",\n editor_autocomplete_description: \"Fügen Sie Text basierend auf dem Kontext hinzu.\",\n\n settings_heading: \"Einstellungen\",\n settings_project_name: \"Projektname\",\n settings_default_language: \"Standardsprache\",\n settings_default_language_caption: \"Wählen Sie die Basissprache für dieses Projekt. Benutzer können diese Einstellung in ihren persönlichen Einstellungen überschreiben.\",\n settings_enable_local_text_search: \"Lokale Textsuche aktivieren\",\n settings_local_text_search_caption: \"Aktivieren Sie die lokale Textsuche für alle Sammlungen. Dadurch können Sie Textfelder in Ihren Sammlungen über die Rebase-Suchleiste durchsuchen. Beachten Sie, dass diese Funktion zu höheren Lesezahlen führen kann, da alle Textfelder in Ihren Sammlungen indexiert werden.\",\n settings_doc_history_all_collections: \"Dokumentverlauf für alle Sammlungen aktiviert\",\n settings_doc_history_caption: \"Wenn aktiviert, wird der Verlauf standardmäßig für alle Sammlungen aktiviert. Sie können diese Einstellung für jede Sammlung überschreiben. Der Verlauf wird in der Untersammlung __history jedes Dokuments gespeichert.\",\n settings_theme: \"Design\",\n settings_primary_color: \"Primärfarbe\",\n settings_secondary_color: \"Sekundärfarbe\",\n settings_sample_theme_components: \"Beispiel-Designkomponenten\",\n settings_drag_drop_logo: \"Ziehen Sie Ihr Logo hierher\",\n settings_security_rules: \"Sicherheitsregeln\",\n settings_security_rules_description: \"Rebase verwendet Firebase-Sicherheitsregeln, um den Zugriff auf Daten einzuschränken. Beim Erstellen eines neuen Benutzers über Rebase wird dem Benutzer im Client-Projekt das benutzerdefinierte Attribut rebaseUser hinzugefügt. Durch Hinzufügen der folgenden Sicherheitsregeln stellen Sie sicher, dass Rebase-Benutzer über Rebase auf Daten zugreifen können.\",\n settings_security_rules_add_domain: \"Denken Sie daran, die Domain {{domain}} zu den erlaubten Domains Ihres Anbieters hinzuzufügen\",\n settings_security_rules_caption: \"Diese Regeln beschränken den Datenzugriff nur auf Rebase-Benutzer, setzen die Berechtigungen jedoch nicht auf Datenbankebene durch. Die Berechtigungen werden im Frontend durchgesetzt, was für die meisten Projekte ausreichend ist. Wenn Sie die Berechtigungen auf Datenbankebene durchsetzen müssen, können Sie diese Sicherheitsregeln entsprechend anpassen. Die einem Benutzer zugewiesenen Rollen werden als benutzerdefinierte Attribute im Firebase-Authentifizierungstoken gespeichert, sodass Sie sie in Ihren Sicherheitsregeln verwenden können.\",\n\n // ─── Text Search Dialog ─────────────────────────────────────\n text_search_dialog_title: \"Textsuche aktivieren\",\n text_search_local_not_recommended: \"Die lokale Textsuche wird für große Sammlungen nicht empfohlen.\",\n text_search_local_fetch_warning: \"Beachten Sie, dass die lokale Textsuche alle Dokumente Ihrer Sammlung abrufen und im Browser speichern muss. Dies kann bei großen Sammlungen ineffizient sein und zusätzliche Kosten verursachen.\",\n text_search_external_suggestion: \"Für größere Sammlungen wird empfohlen, eine externe Suchmaschine wie Algolia oder Elastic Search zu verwenden und einen Suchdelegaten in Ihrer Konfiguration zuzuweisen.\",\n text_search_local_description: \"Die lokale Textsuche ist der einfachste Weg, die Textsuche in Ihrer Sammlung zu aktivieren. Sie lädt alle Dokumente der Sammlung im Browser und führt die Suche lokal durch. Dies ist die empfohlene Option für kleine Sammlungen.\",\n text_search_own_implementation: \"Sie haben Ihren eigenen Textsuch-Controller implementiert. Sie können die Textsuche für Ihre Sammlung aktivieren.\",\n text_search_enable_for_collection: \"Für diese Sammlung aktivieren\",\n text_search_enable_for_project: \"Für das Projekt aktivieren\",\n text_search_enabled_snackbar: \"Lokale Textsuche aktiviert\",\n\n // ─── Missing keys (English placeholders — translate) ───\nno_filter: \"No filter\",\n is_true: \"is true\",\n is_false: \"is false\",\n error_uploading_file_size: \"Error uploading file: File is larger than {{maxSize}} bytes\",\n error_uploading_file_type: \"Error uploading file: File type is not supported\",\n drag_drop_files: \"Drag 'n' drop some files here, or click here to edit\",\n drag_drop_file: \"Drag 'n' drop a file here, or click here to edit\",\n select_reference: \"Select reference\",\n select_references: \"Select references\",\n account_settings: \"Account Settings\",\n profile: \"Profile\",\n sessions: \"Sessions\",\n display_name: \"Display Name\",\n photo_url: \"Photo URL\",\n save_profile: \"Save Profile\",\n saving: \"Saving...\",\n no_active_sessions: \"No active sessions found.\",\n revoking: \"Revoking...\",\n revoke_all_sessions: \"Revoke All Sessions\",\n unknown_device: \"Unknown Device\",\n current: \"Current\",\n role_id: \"Role ID\",\n role_name: \"Role Name\",\n add_reference: \"Add reference\",\n add_reference_to: \"Add reference to {{name}}\",\n role_deleted_successfully: \"Role deleted successfully\",\n error_deleting_role: \"Error deleting role\",\n collection_permissions: \"Collection permissions\",\n collection: \"Collection\",\n no_collections_configured: \"No collections configured\",\n no_security_rules_defined: \"No security rules defined — all operations unrestricted\",\n no_rules: \"no rules\",\n bootstrap_admin_success: \"You are now an admin! Refreshing...\",\n failed_to_bootstrap_admin: \"Failed to bootstrap admin\",\n user_deleted_successfully: \"User deleted successfully\",\n error_deleting_user: \"Error deleting user\",\n add_row_before: \"Add row before\",\n add_row_after: \"Add row after\",\n delete_row: \"Delete row\",\n add_column_before: \"Add column before\",\n add_column_after: \"Add column after\",\n delete_column: \"Delete column\",\n delete_table: \"Delete table\",\n alt_text: \"Alt text\",\n title: \"Title\",\n a_property_of_this_map_has_error: \"A property of this map has an error\",\n studio_sql_executing_query: \"EXECUTING QUERY...\",\n studio_sql_query_error: \"Query Error\",\n studio_sql_run_query_placeholder: \"Run a query to see results\",\n studio_sql_visual_execution_plan: \"Visual Execution Plan\",\n studio_sql_success: \"SUCCESS\",\n studio_sql_no_results: \"Query executed successfully but returned no results.\",\n studio_sql_rows: \"Rows:\",\n studio_sql_time: \"Time:\",\n studio_sql_copy_markdown: \"Copy Markdown\",\n studio_sql_export_json: \"Export JSON\",\n studio_sql_export_csv: \"Export CSV\",\n studio_sql_format_sql: \"Format SQL\",\n studio_sql_explain: \"Explain\",\n studio_sql_limit_1000: \"Limit 1000\",\n studio_sql_remove_from_favorites: \"Remove from Favorites\",\n studio_sql_add_to_favorites: \"Add to Favorites\",\n studio_sql_save: \"Save\",\n studio_sql_run: \"Run\",\n studio_sql_database: \"Database\",\n studio_sql_role: \"Role\",\n studio_sql_admin: \"(Admin)\",\n studio_sql_select_db: \"Select DB\",\n studio_sql_query_results: \"Query Results\",\n studio_sql_save_snippet: \"Save SQL Snippet\",\n studio_sql_snippet_name: \"Snippet Name\",\n studio_sql_snippet_name_placeholder: \"e.g., Get All Users\",\n studio_sql_snippet_saved_local: \"This will be saved to your local storage.\",\n studio_sql_cancel: \"Cancel\",\n studio_sql_dangerous_operation: \"Dangerous Operation Detected\",\n studio_sql_dangerous_operation_body: \"The query you are about to run contains potentially destructive operations (DELETE, DROP, TRUNCATE, or UPDATE without WHERE). Are you sure you want to proceed?\",\n studio_sql_snippet_saved: \"Snippet \\\"{{name}}\\\" saved.\",\n studio_sql_markdown_copied: \"Results copied as Markdown!\",\n studio_sql_markdown_copy_failed: \"Failed to copy Markdown to clipboard.\",\n studio_sql_row_updated: \"Row updated successfully.\",\n studio_sql_cannot_edit_missing_query: \"Cannot edit rows: The underlying query is missing.\",\n studio_sql_cannot_resolve_table: \"Could not resolve table/primary key\",\n studio_sql_missing_pk: \"Row is missing primary key column(s): {{columns}}. Cannot safely update.\",\n studio_sql_update_failed: \"Failed to update: {{message}}\",\n studio_sql_execution_not_supported: \"SQL execution is not supported by the current data source.\",\n studio_sql_error_executing: \"An error occurred while executing the query.\",\n studio_sql_error_explaining: \"An error occurred while explaining the query.\",\n studio_sql_save_first_to_favorite: \"Please save the snippet first before favoriting.\",\n studio_sql_cms: \"Collections:\",\n studio_sql_cms_collections_tooltip: \"Tables in this query that are mapped as CMS collections\",\n studio_sql_edit_entity: \"Edit {{name}} #{{id}}\",\n studio_sql_sql_not_supported: \"SQL execution not supported by this data source\",\n studio_sql_fetch_error: \"Failed to fetch connection options: {{message}}\",\n studio_sql_unexpected_format: \"Unexpected data format: {{type}}\",\n studio_sql_no_tables: \"No tables found in this database.\",\n studio_sql_schema_fetch_error: \"Failed to fetch schema: {{message}}\",\n studio_sql_sidebar_snippets: \"Snippets\",\n studio_sql_sidebar_history: \"History\",\n studio_sql_sidebar_schema: \"Schema\",\n studio_sql_sidebar_no_snippets: \"No saved snippets\",\n studio_sql_sidebar_save_snippet_hint: \"Save a query to access it here.\",\n studio_sql_sidebar_no_history: \"No history\",\n studio_sql_sidebar_history_hint: \"Executed queries will appear here.\",\n studio_sql_sidebar_delete_snippet: \"Delete snippet\",\n studio_schema_tables: \"Tables\",\n studio_schema_loading: \"Loading schema...\",\n studio_schema_no_tables: \"No tables found\",\n studio_schema_retry: \"Retry\",\n studio_schema_primary_key: \"Primary Key\",\n studio_schema_select_all: \"SELECT * FROM\",\n studio_schema_insert_into: \"INSERT INTO\",\n studio_schema_update: \"UPDATE\",\n studio_schema_delete_from: \"DELETE FROM\",\n studio_schema_columns: \"{{count}} columns\",\n studio_rls_title: \"Row Level Security\",\n studio_rls_description: \"Manage RLS policies for your tables\",\n studio_rls_enabled: \"RLS Enabled\",\n studio_rls_disabled: \"RLS Disabled\",\n studio_rls_no_rls: \"No RLS\",\n studio_rls_enable_rls: \"Enable RLS\",\n studio_rls_disable_rls: \"Disable RLS\",\n studio_rls_create_policy: \"Create Policy\",\n studio_rls_policies: \"Policies\",\n studio_rls_no_policies: \"No policies defined\",\n studio_rls_no_policies_desc: \"This table has no RLS policies. All rows are accessible based on the RLS status.\",\n studio_rls_add_first_policy: \"Add your first policy\",\n studio_rls_force_rls: \"Force RLS\",\n studio_rls_force_rls_desc: \"When enabled, RLS policies apply to the table owner as well.\",\n studio_rls_enable_force_rls: \"Enable Force RLS\",\n studio_rls_disable_force_rls: \"Disable Force RLS\",\n studio_rls_edit: \"Edit\",\n studio_rls_delete: \"Delete\",\n studio_rls_confirm_delete_title: \"Delete Policy\",\n studio_rls_confirm_delete_body: \"Are you sure you want to delete this policy? This action cannot be undone.\",\n studio_rls_confirm_enable_title: \"Enable Row Level Security\",\n studio_rls_confirm_enable_body: \"Enabling RLS will restrict access to rows in this table based on your policies. Make sure you have appropriate policies in place.\",\n studio_rls_confirm_disable_title: \"Disable Row Level Security\",\n studio_rls_confirm_disable_body: \"Disabling RLS will make all rows accessible to all roles. Are you sure you want to continue?\",\n studio_rls_select_table: \"Select a table\",\n studio_rls_no_tables: \"No tables available\",\n studio_rls_error: \"Error loading policies\",\n studio_rls_retry: \"Retry\",\n studio_rls_loading: \"Loading policies...\",\n studio_policy_edit: \"Edit Policy\",\n studio_policy_create: \"Create New Policy\",\n studio_policy_defining_rules: \"Defining access rules for\",\n studio_policy_cancel: \"Cancel\",\n studio_policy_save: \"Save Policy\",\n studio_policy_template: \"Start from a template (Optional)\",\n studio_policy_select_template: \"Select a template...\",\n studio_policy_name: \"Policy Name\",\n studio_policy_name_placeholder: \"Give your policy a descriptive name\",\n studio_policy_behavior: \"Policy Behavior\",\n studio_policy_permissive: \"Permissive\",\n studio_policy_permissive_desc: \"Combined using \\\"OR\\\"\",\n studio_policy_restrictive: \"Restrictive\",\n studio_policy_restrictive_desc: \"Combined using \\\"AND\\\"\",\n studio_policy_command: \"Policy Command\",\n studio_policy_target_roles: \"Target Roles\",\n studio_policy_roles_placeholder: \"Select roles (defaults to public)\",\n studio_policy_using_expr: \"USING expression\",\n studio_policy_using_expr_desc: \"Applies to existing rows (SELECT, UPDATE, DELETE)\",\n studio_policy_check_expr: \"WITH CHECK expression\",\n studio_policy_check_expr_desc: \"Applies to new or modified rows (INSERT, UPDATE)\",\n studio_policy_help_title: \"Row Level Security (RLS) Guide\",\n studio_policy_help_intro: \"Row Level Security (RLS) allows you to restrict which rows a user can access or modify based on their authentication status or roles.\",\n studio_policy_help_step1_title: \"1. Select a Template\",\n studio_policy_help_step1_desc: \"If you're new to RLS, the easiest way to start is by selecting a predefined template from the dropdown. It will automatically configure the policy for common use cases like \\\"Users can update their own rows\\\".\",\n studio_policy_help_step2_title: \"2. Target Roles\",\n studio_policy_help_step2_desc: \"Choose which users the policy applies to:\",\n studio_policy_help_role_public: \"Applies to everyone (logged in or not).\",\n studio_policy_help_role_authenticated: \"Only applies to users who are logged in.\",\n studio_policy_help_role_anon: \"Only applies to users who are NOT logged in.\",\n studio_policy_help_step3_title: \"3. USING Expression\",\n studio_policy_help_step3_desc: \"A SQL condition that must evaluate to true for existing rows to be visible or updatable (SELECT, UPDATE, DELETE).\",\n studio_policy_help_step3_example: \"Ensures users can only see rows where they are the owner.\",\n studio_policy_help_step4_title: \"4. WITH CHECK Expression\",\n studio_policy_help_step4_desc: \"A SQL condition that must evaluate to true for new or modified rows to be saved (INSERT, UPDATE).\",\n studio_policy_help_step4_example: \"Usually the same as the USING expression when users are only allowed to insert/edit their own data.\",\n studio_policy_help_auth_vars_title: \"Rebase Auth Variables\",\n studio_policy_help_auth_vars_desc: \"Rebase provides native helper functions that you can use in your expressions:\",\n studio_policy_help_auth_uid: \"Returns the current user's ID as text. Example:\",\n studio_policy_help_auth_jwt: \"Returns the full JWT payload as JSONB so you can check custom claims. Example:\",\n studio_policy_help_auth_roles: \"Returns the user's role IDs as a comma-separated string. Best used with:\",\n studio_policy_help_docs_cta: \"To learn more about Postgres policies, check out the official documentation.\",\n studio_policy_help_read_docs: \"Read Docs\",\n studio_policy_help_got_it: \"Got it!\",\n studio_add_kanban_column: \"Add column\",\n studio_add_kanban_column_title: \"Add Kanban Column\",\n studio_add_kanban_column_name: \"Column name\",\n studio_add_kanban_column_name_placeholder: \"New column name\",\n studio_add_kanban_column_add: \"Add\",\n studio_add_kanban_column_cancel: \"Cancel\",\n studio_collection_view_sql: \"SQL Editor\",\n studio_collection_view_cms: \"CMS View\",\n studio_editor_collection_tooltip: \"Edit collection schema\",\n studio_editor_collection_no_permission: \"You don't have permission to edit this collection\",\n studio_editor_collection_start_tooltip: \"Copy path or edit schema\",\n studio_editor_collection_start_no_permission: \"You don't have permission to modify this collection\",\n studio_editor_collection_start_copied: \"Copied!\",\n studio_editor_entity_tooltip: \"Edit entity schema\",\n studio_editor_entity_no_permission: \"You don't have permission to edit this entity\",\n studio_home_edit_collection: \"Edit collection\",\n studio_home_delete_collection: \"Delete collection\",\n studio_home_confirm_delete_title: \"Delete collection?\",\n studio_home_confirm_delete_body: \"Are you sure you want to delete the collection \\\"{{name}}\\\"? This action cannot be undone.\",\n studio_kanban_setup: \"Kanban Setup\",\n studio_missing_reference: \"Missing reference: {{path}}\",\n studio_missing_reference_create: \"Create\",\n studio_new_collection: \"New collection\",\n studio_new_collection_card: \"New collection\",\n studio_new_collection_no_permission: \"You don't have permissions to create collections\",\n studio_property_add_column: \"Add new property\",\n studio_property_add_column_no_permission: \"You don't have permission to add new properties\",\n studio_add_kanban_column_desc: \"Add a new option to the \\\"{{property}}\\\" property. This will create a new column in the Kanban board.\",\n studio_add_kanban_column_adding: \"Adding...\",\n studio_collection_view_edit: \"Edit\",\n studio_editor_collection_disabled: \"Collection editing is disabled\",\n studio_editor_collection_edit: \"Edit collection\",\n studio_editor_entity_save_first: \"You need to save the document before changing the schema\",\n studio_editor_entity_edit_schema: \"Edit schema for this form\",\n studio_editor_collection_start_save_filter: \"Save default filter and sort\",\n studio_editor_collection_start_clear_filter: \"Clear default filter and sort\",\n studio_editor_collection_start_reset_filter: \"Reset to default filter and sort\",\n studio_editor_collection_start_saved: \"Default config saved\",\n studio_home_duplicate_collection: \"Duplicate\",\n studio_home_delete: \"Delete\",\n studio_home_confirm_delete_no_data: \"This will not delete any data, only the collection in the CMS\",\n studio_home_collection_deleted: \"Collection deleted\",\n studio_kanban_configure: \"Configure Kanban\",\n studio_missing_reference_error: \"No collection for path: {{path}}\",\n studio_new_collection_add: \"Neue Sammlung hinzufügen\",\n\n // ─── Property field labels ──────────────────────────────────\n db_column_type: \"Datenbank-Spaltentyp\",\n primary_key_unique_id: \"Primärschlüssel / Eindeutige ID\",\n spread_children_as_columns: \"Kinder als Spalten aufteilen\",\n mode: \"Modus\",\n timezone: \"Zeitzone\",\n target_collection: \"Zielsammlung\",\n\n // ─── Storage property ───────────────────────────────────────\n storage_file_name: \"Dateiname\",\n storage_path: \"Speicherpfad\",\n storage_max_size: \"Maximale Größe (in Bytes)\",\n storage_resize_mode: \"Größenanpassungsmodus\",\n storage_output_format: \"Ausgabeformat\",\n storage_max_width: \"Maximale Breite (px)\",\n storage_max_height: \"Maximale Höhe (px)\",\n storage_quality: \"Qualität (0-100)\",\n storage_file_upload_config: \"Datei-Upload-Konfiguration\",\n storage_image_resize_config: \"Bildgrößenanpassung\",\n storage_all_file_types: \"Alle Dateitypen erlaubt\",\n storage_allowed_file_types: \"Erlaubte Dateitypen\",\n storage_include_bucket_url: \"Bucket-URL (s3://...) im gespeicherten Wert einschließen\",\n storage_save_url: \"URL anstelle des Speicherpfads speichern\",\n\n // ─── DateTime property ──────────────────────────────────────\n datetime_automatic_value: \"Automatischer Wert\",\n\n // ─── Markdown property ──────────────────────────────────────\n markdown_paste_behavior: \"Einfügeverhalten\",\n markdown_strip_html: \"HTML beim Einfügen entfernen\",\n markdown_convert_pasted: \"Eingefügten Text in Markdown umwandeln\"\n};\n\n","import { RebaseTranslations } from \"@rebasepro/types\";\n\nexport const fr: RebaseTranslations = {\n // ─── Form actions ────────────────────────────────────────────\n save: \"Enregistrer\",\n create: \"Créer\",\n create_copy: \"Créer une copie\",\n save_and_close: \"Enregistrer et fermer\",\n create_copy_and_close: \"Créer une copie et fermer\",\n create_and_close: \"Créer et fermer\",\n discard: \"Ignorer\",\n clear: \"Effacer\",\n cancel: \"Annuler\",\n\n // ─── Entity actions ──────────────────────────────────────────\n edit: \"Modifier\",\n copy: \"Copier\",\n delete: \"Supprimer\",\n delete_not_allowed: \"Vous avez sélectionné au moins une entité que vous ne pouvez pas supprimer\",\n\n // ─── Delete dialog ───────────────────────────────────────────\n delete_confirmation_title: \"Supprimer ?\",\n delete_confirmation_body: \"Cela supprimera l'entité. Êtes-vous sûr ?\",\n delete_multiple_confirmation_body: \"Cela supprimera les entités sélectionnées. Êtes-vous sûr ?\",\n\n // ─── Unsaved-changes dialog ───────────────────────────────────\n unsaved_changes_title: \"Modifications non enregistrées\",\n unsaved_changes_body: \"Vous avez des modifications non enregistrées. Voulez-vous les ignorer ?\",\n discard_changes: \"Ignorer les modifications\",\n keep_editing: \"Continuer l'édition\",\n clear_form: \"Vider le formulaire ?\",\n discard_changes_confirmation: \"Toutes les modifications non enregistrées seront perdues. Cette action est irréversible.\",\n clear_form_confirmation: \"Toutes les valeurs saisies seront effacées. Cette action est irréversible.\",\n\n // ─── Collection table / toolbar ──────────────────────────────\n search: \"Rechercher\",\n find_by_id: \"Rechercher par ID\",\n find_entity_by_id: \"Rechercher l'entité par ID\",\n filter: \"Filtrer\",\n filters: \"Filtres\",\n clear_filter: \"Effacer le filtre\",\n clear_filter_sort: \"Effacer le filtre/tri\",\n clear_sort: \"Effacer le tri\",\n clear_all: \"Tout effacer\",\n no_items: \"Aucun élément\",\n no_entries_found: \"Aucune entrée trouvée\",\n all_entries_loaded: \"Toutes les {{count}} entrées chargées\",\n create_your_first_entry: \"Créez votre première entrée\",\n no_results_filter_sort: \"Aucun résultat avec le filtre/tri appliqué\",\n no_results_search: \"Aucun résultat trouvé pour \\\"{{search}}\\\"\",\n add: \"Ajouter\",\n remove: \"Supprimer\",\n multiple_entities: \"Entités multiples\",\n unsaved_changes: \"Vous avez des modifications non enregistrées dans {{collectionName}}.\",\n so_empty: \"C'est bien vide...\",\n no_results: \"Aucun résultat avec le filtre/tri appliqué\",\n refresh_data: \"Actualiser les données\",\n dark_mode: \"Sombre\",\n light_mode: \"Clair\",\n system_mode: \"Système\",\n ok: \"Ok\",\n save_collection_config: \"Enregistrer la structure de la collection\",\n search_for_more_icons: \"Rechercher d'autres icônes…\",\n ai_modified: \"Modifié par l'IA\",\n size_label: \"Taille\",\n group_by: \"Grouper par\",\n initialize_kanban_order: \"Initialiser l'ordre Kanban\",\n copy_id: \"Copier l'ID\",\n add_specific: \"Ajouter {{name}}\",\n select_specific: \"Sélectionner {{name}}\",\n select_from: \"Sélectionner depuis {{name}}\",\n done: \"Terminé\",\n log_out: \"Se déconnecter\",\n column_cannot_be_edited: \"Cette colonne ne peut pas être modifiée directement\",\n close: \"Fermer\",\n unsaved_local_changes: \"Modifications locales non enregistrées\",\n unsaved_local_changes_description: \"Ce document a été modifié localement et contient des modifications non enregistrées. Ces modifications locales seront perdues si vous ne les appliquez pas.\",\n preview_changes: \"Aperçu des modifications\",\n apply_changes: \"Appliquer les modifications\",\n discard_local_changes: \"Ignorer les modifications locales\",\n preview_local_changes: \"Aperçu des modifications locales\",\n preview_local_changes_description: \"Voici les modifications locales qui seront appliquées au formulaire.\",\n type: \"Type\",\n string: \"chaîne de caractères\",\n number: \"nombre\",\n boolean: \"booléen\",\n date: \"date\",\n map: \"carte (map)\",\n array: \"tableau\",\n arrays_of_arrays_not_supported: \"Les tableaux de tableaux ne sont pas pris en charge.\",\n data_type_not_supported: \"Type de données {{dataType}} non pris en charge pour le moment\",\n passkey_error_unsupported: \"Votre appareil ou navigateur ne prend pas en charge les passkeys.\",\n\n // ─── Entity form feedback ─────────────────────────────────────\n saved_correctly: \"Enregistré avec succès\",\n error_before_saving: \"Erreur lors de la préparation des données\",\n error_after_saving: \"Erreur dans le traitement post-sauvegarde\",\n error_saving_entity: \"Erreur lors de l'enregistrement de l'entité\",\n entity_does_not_exist: \"Cette entité n'existe pas dans la base de données\",\n form_modified: \"Ce formulaire a été modifié\",\n form_in_sync: \"Le formulaire actuel est synchronisé avec la base de données\",\n fix_errors_before_saving: \"Corrigez les erreurs signalées avant d'enregistrer\",\n\n admin: \"Admin\",\n home: \"Accueil\",\n this_form_has_errors: \"Ce formulaire contient des erreurs\",\n error_loading_navigation: \"Erreur lors du chargement de la navigation\",\n error_loading_auth: \"Erreur lors du chargement de l'authentification\",\n this_form_has_been_modified: \"Ce formulaire a été modifié\",\n current_form_in_sync: \"Le formulaire actuel est synchronisé avec la base de données\",\n open_in_console: \"Ouvrir dans la console\",\n collection_does_not_exist: \"La collection spécifiée n'existe pas. Vérifiez la console\",\n unexpected_value: \"Valeur inattendue\",\n unexpected_value_click_to_edit: \"Valeur inattendue. Cliquez pour modifier\",\n unexpected_reference_value: \"Valeur de référence inattendue. Cliquez pour modifier\",\n copy_url_to_clipboard: \"Copier l'URL dans le presse-papiers\",\n open_image_in_new_tab: \"Ouvrir l'image dans un nouvel onglet\",\n reference_not_set: \"Référence non définie\",\n reference_does_not_exist: \"La référence n'existe pas\",\n entity_not_found: \"Entité non trouvée\",\n file_not_found: \"Fichier non trouvé\",\n unsaved_changes_in_entity: \"Vous avez des modifications non enregistrées dans cette entité.\",\n delete_this_role: \"Supprimer ce rôle\",\n no_roles_yet: \"Vous n'avez pas encore de rôles.\",\n create_default_roles: \"Créer les rôles par défaut\",\n delete_role_confirmation: \"Êtes-vous sûr de vouloir supprimer ce rôle ?\",\n delete_this_user: \"Supprimer cet utilisateur\",\n no_users_yet: \"Il n'y a pas encore d'utilisateurs\",\n add_logged_user_as_admin: \"Ajouter l'utilisateur connecté en tant qu'administrateur\",\n add_current_user_as_admin: \"Ajouter l'utilisateur actuel en tant qu'administrateur\",\n create_default_roles_and_add_admin: \"Créer les rôles par défaut et ajouter l'utilisateur actuel en tant qu'administrateur\",\n delete_user_confirmation: \"Êtes-vous sûr de vouloir supprimer cet utilisateur ?\",\n create_your_users_and_roles: \"Créez vos utilisateurs et rôles\",\n no_users_or_roles_defined: \"Vous n'avez défini aucun utilisateur ni rôle. Vous pouvez créer les rôles par défaut et ajouter l'utilisateur actuel en tant qu'administrateur.\",\n no_permission_to_view_users: \"Vous n'avez pas la permission de voir les utilisateurs\",\n no_permission_to_view_roles: \"Vous n'avez pas la permission de voir les rôles\",\n no_permission_description: \"Contactez un administrateur si vous avez besoin d'accéder à cette section.\",\n save_before_changing_schema: \"Vous devez enregistrer le document avant de modifier le schéma\",\n edit_schema_for_this_form: \"Modifier le schéma de ce formulaire\",\n no_permissions_to_edit_collection: \"Vous n'avez pas l'autorisation de modifier cette collection\",\n browser_does_not_support_audio: \"Votre navigateur ne prend pas en charge l'élément audio.\",\n user_not_found: \"Utilisateur introuvable : {{value}}\",\n\n // ─── Collection view actions ──────────────────────────────────\n delete_selected: \"Supprimer la sélection\",\n cannot_delete_selected: \"Vous avez sélectionné au moins une entité que vous ne pouvez pas supprimer\",\n\n // ─── Array / field containers ─────────────────────────────────\n add_entry: \"Ajouter\",\n add_on_top: \"Ajouter en haut\",\n add_below: \"Ajouter en dessous\",\n add_to_field: \"Ajouter à {{fieldName}}\",\n value: \"Valeur\",\n key: \"Clé\",\n drag_drop_multiple: \"Faites glisser et déposez des fichiers ici, ou cliquez pour sélectionner des fichiers. Faites glisser pour réorganiser.\",\n drag_drop_single: \"Faites glisser et déposez un fichier ici, ou cliquez pour en sélectionner un\",\n\n // ─── Navigation / scaffold ────────────────────────────────────\n open_menu: \"Ouvrir le menu\",\n close_drawer: \"Fermer le menu latéral\",\n navigation_drawer: \"Tiroir de navigation\",\n collapse: \"Réduire\",\n expand: \"Développer\",\n\n // ─── Error states ─────────────────────────────────────────────\n error: \"Erreur\",\n error_uploading_file: \"Erreur lors du téléchargement du fichier\",\n error_deleting: \"Erreur lors de la suppression\",\n error_before_delete: \"Erreur avant la suppression\",\n error_updating_asset: \"Erreur lors de la mise à jour de l'actif\",\n error_deleting_asset: \"Erreur lors de la suppression de l'actif\",\n error_firestore_index: \"Un index Firestore est requis pour cette requête.\",\n create_index: \"Créer un index\",\n value_is_not_reference: \"La valeur n'est pas une référence.\",\n click_to_edit: \"Cliquez pour modifier\",\n data_is_not_array_of_references: \"Les données ne sont pas un tableau de références\",\n\n // ─── Misc ─────────────────────────────────────────────────────\n loading: \"Chargement...\",\n local_changes_applied: \"Modifications locales appliquées au formulaire\",\n local_changes_discarded: \"Modifications locales ignorées\",\n are_you_sure_leave: \"Êtes-vous sûr de vouloir quitter cette page ?\",\n see_console_details: \"Consultez la console pour plus de détails.\",\n drop_here_create_group: \"Déposez ici pour créer un nouveau groupe\",\n filter_for_null_values: \"Filtrer les valeurs nulles\",\n value_updated_elsewhere: \"Cette valeur a été mise à jour ailleurs\",\n add_property: \"Ajouter une propriété\",\n edit_name: \"Modifier {{name}}\",\n this_entity_not_exist: \"Cette entité n'existe pas dans la base de données\",\n internal_error: \"ERREUR interne\",\n\n // ─── Rename group dialog ──────────────────────────────────────\n rename_group: \"Renommer le groupe\",\n group_name_label: \"Nom du groupe\",\n group_name_empty_error: \"Le nom du groupe ne peut pas être vide.\",\n group_name_exists_error: \"Ce nom de groupe existe déjà.\",\n\n // ─── Search ───────────────────────────────────────────────────\n search_collections: \"Rechercher dans les collections\",\n\n // ─── Navigation groups ────────────────────────────────────────\n views_group: \"Vues\",\n\n // ─── Entity Edit View ─────────────────────────────────────────\n youd_need_to_save_before_additional_collections: \"Vous devez enregistrer votre entité avant d'ajouter des collections supplémentaires\",\n\n // ─── Not Found Page ───────────────────────────────────────────\n page_not_found: \"Page introuvable\",\n page_not_found_body: \"Cette page n'existe pas ou vous n'y avez peut-être pas accès\",\n back_to_home: \"Retour à l'accueil\",\n\n // ─── Collection Editor ─────────────────────────────────────────\n default_collection_view: \"Vue de collection par défaut\",\n table_view: \"Tableau\",\n cards_view: \"Cartes\",\n kanban_view: \"Kanban\",\n choose_how_entities_displayed_default: \"Choisissez comment les entités doivent être affichées par défaut\",\n\n document_view: \"Vue de document\",\n side_panel: \"Panneau latéral\",\n full_screen: \"Plein écran\",\n should_documents_opened_full_screen: \"Les documents doivent-ils être ouverts en plein écran ou dans une boîte de dialogue latérale intégrée\",\n\n select_custom_view: \"Sélectionner une vue personnalisée\",\n no_custom_views_defined: \"Aucune vue personnalisée n'est définie. Définissez vos vues personnalisées dans les paramètres de personnalisation, avant d'utiliser cette boîte de dialogue.\",\n\n select_custom_action: \"Sélectionner une action personnalisée\",\n no_custom_actions_defined: \"Aucune action personnalisée définie. Définissez vos actions personnalisées dans les paramètres de personnalisation, avant d'utiliser cette boîte de dialogue.\",\n\n no_collections_found: \"Aucune collection trouvée\",\n start_building_collections: \"Commencez à créer des collections dans Rebase facilement. Mappez-les à vos données de base de données existantes, importez-les à partir de fichiers ou utilisez nos modèles.\",\n create_first_collection: \"Créez votre première collection\",\n define_collections_programmatically: \"Vous pouvez également définir des collections par programmation.\",\n edit_collection: \"Modifier la collection\",\n no_permissions_edit_collection: \"Vous n'avez pas les autorisations pour modifier cette collection\",\n no_permissions_create_collection: \"Vous n'avez pas les autorisations pour créer des collections\",\n create_collection: \"Créer une collection\",\n update_collection: \"Mettre à jour la collection\",\n\n new_collection: \"Nouvelle collection\",\n add_new_collection: \"Ajouter une nouvelle collection\",\n collection_with_name: \"Collection {{name}}\",\n change_icon: \"Changer l'icône\",\n is_subcollection_of: \"Ceci est une sous-collection de\",\n name: \"Nom\",\n collection_name_description: \"Nom de cette collection, généralement un nom au pluriel (par ex., Produits)\",\n path: \"Chemin\",\n relative_path_to_parent: \"Chemin relatif vers le parent (il n'est pas nécessaire d'inclure le chemin parent)\",\n path_in_database: \"Chemin dans lequel cette collection est stockée, dans la base de données\",\n singular_name: \"Nom au singulier\",\n singular_name_description: \"Définissez éventuellement un nom au singulier pour vos entités\",\n description: \"Description\",\n description_of_collection: \"Description de la collection, vous pouvez utiliser le format markdown\",\n collection_id: \"ID de la collection\",\n collection_id_description: \"Cet ID identifie cette collection. Généralement le même que le chemin.\",\n collection_group: \"Groupe de collections\",\n collection_group_description: \"Un groupe de collections se compose de toutes les collections ayant le même chemin. Cela vous permet d'effectuer des requêtes sur plusieurs collections à la fois.\",\n advanced_settings: \"Paramètres avancés\",\n doc_history_global: \"Révisions de l'historique des documents activées si activées globalement\",\n doc_history_enabled: \"Révisions de l'historique des documents ACTIVÉES\",\n doc_history_not_enabled: \"Révisions de l'historique des documents NON activées\",\n doc_history_description: \"Lorsqu'il est activé, chaque document de cette collection conservera un historique des modifications. Ceci est utile à des fins d'audit. Les données sont stockées dans une sous-collection du document dans votre base de données, appelée __history.\",\n document_id_generation: \"Génération des ID de document\",\n code_defined: \"Défini par le code\",\n users_must_define_id: \"Les utilisateurs doivent définir un ID\",\n users_can_define_id: \"Les utilisateurs peuvent définir un ID, mais ce n'est pas obligatoire\",\n doc_id_auto_generated: \"L'ID du document est généré automatiquement\",\n config_doc_id_generation: \"Configurez comment les ID de document sont générés lors de la création de nouvelles entités.\",\n enable_text_search: \"Activer la recherche de texte pour cette collection\",\n text_search_description: \"Autoriser la recherche de texte pour cette collection. Si vous n'avez pas spécifié de délégué de recherche de texte, la recherche de texte locale intégrée sera utilisée. Ceci n'est pas recommandé pour les grandes collections, car cela peut entraîner des problèmes de performances et de coûts.\",\n database_id: \"ID de base de données\",\n default_text: \"(par défaut)\",\n\n custom_actions: \"Actions personnalisées\",\n more_info: \"Plus d'informations\",\n define_custom_actions_cli: \"Définissez vos propres actions personnalisées en les téléchargeant via la CLI.\",\n action_defined_in_code: \"Cette action est définie dans le code avec la clé\",\n add_custom_entity_action: \"Ajouter une action d'entité personnalisée\",\n remove_this_action: \"Supprimer cette action ?\",\n remove_action_warning: \"Cela ne supprimera aucune donnée, uniquement l'action dans le CMS\",\n\n subcollections_of: \"Sous-collections de\",\n add_subcollection: \"Ajouter une sous-collection\",\n custom_views: \"Vues personnalisées\",\n define_custom_views_cli: \"Définissez vos propres vues personnalisées en les téléchargeant via la CLI.\",\n view_defined_in_code: \"Cette vue est définie dans le code avec la clé\",\n add_custom_entity_view: \"Ajouter une vue d'entité personnalisée\",\n delete_this_subcollection: \"Supprimer cette sous-collection ?\",\n remove_collection_warning: \"Cela ne supprimera aucune donnée, uniquement la collection dans le CMS\",\n remove_this_view: \"Supprimer cette vue ?\",\n remove_view_warning: \"Cela ne supprimera aucune donnée, uniquement la vue dans le CMS\",\n\n no_collection_selected: \"Aucune collection sélectionnée\",\n code_for_collection: \"Code pour\",\n use_config_define_json: \"Utilisez cette configuration pour définir la collection au format JSON.\",\n customise_collection_code: \"Si vous souhaitez personnaliser la collection dans le code, vous pouvez ajouter ce code de collection à la configuration de votre application CMS.\",\n copied: \"Copié\",\n\n property_cant_be_edited: \"Cette propriété ne peut pas être modifiée\",\n property_not_editable_description: \"Vous n'avez peut-être pas l'autorisation de la modifier ou elle est définie dans le code et ne peut pas être modifiée.\",\n delete_this_property: \"Supprimer cette propriété ?\",\n delete_property_warning: \"Cela ne supprimera aucune donnée, mais modifiera uniquement la collection.\",\n error_must_specify_id: \"Vous devez spécifier un ID pour le champ\",\n error_id_format: \"L'ID ne peut contenir que des lettres, des chiffres et des traits de soulignement (_), et ne doit pas commencer par un chiffre\",\n error_id_already_exists: \"Il existe déjà un autre champ avec cet ID\",\n error_must_specify_title: \"Vous devez spécifier un titre pour le champ\",\n custom_or_other: \"Personnalisé/Autre\",\n select_property_widget: \"Sélectionnez un widget de propriété\",\n error_changing_data_type: \"Ce widget utilise un type de données différent de celui initialement sélectionné. Cela peut provoquer des erreurs avec les données existantes.\",\n required: \"Requis\",\n\n enum_form_dialog: \"Boîte de dialogue du formulaire Enum\",\n imported_data_preview: \"Aperçu des données importées\",\n entities_with_same_id_overwritten: \"Les entités avec le même identifiant seront écrasées\",\n collection_editor: \"Éditeur de collection\",\n properties_in_this_group: \"Propriétés de ce groupe\",\n data_property_mapping: \"Mappage de propriétés de données\",\n property_edit_view: \"Vue d'édition de propriété\",\n all_of_these: \"Tous ces éléments\",\n any_of_these: \"N'importe lequel de ces éléments\",\n\n only_admins_edit_roles: \"Seuls les administrateurs peuvent modifier les rôles\",\n error_user_not_found: \"Utilisateur introuvable\",\n all_roles: \"Tous les rôles\",\n role: \"Rôle\",\n name_of_this_role: \"Nom de ce rôle\",\n id_of_this_role: \"ID de ce rôle\",\n create_entities: \"Créer des entités\",\n read_entities: \"Lire des entités\",\n update_entities: \"Mettre à jour des entités\",\n delete_entities: \"Supprimer des entités\",\n all_collections: \"Toutes les collections\",\n create_entities_in_collections: \"Créer des entités dans les collections\",\n access_all_data_in_every_collection: \"Accéder à toutes les données de chaque collection\",\n update_data_in_any_collection: \"Mettre à jour les données dans n'importe quelle collection\",\n delete_data_in_any_collection: \"Supprimer des données dans n'importe quelle collection\",\n allow_all_permissions_in_this_collections: \"Autoriser toutes les autorisations dans ces collections\",\n all: \"Tout\",\n customise_permissions_description: \"Vous pouvez personnaliser les autorisations que les utilisateurs liés à ce rôle peuvent exécuter dans les entités de chaque collection\",\n create_collections: \"Créer des collections\",\n yes: \"Oui\",\n no: \"Non\",\n can_user_create_collections: \"L'utilisateur peut-il créer des collections\",\n edit_collections: \"Modifier les collections\",\n only_own_collections: \"Uniquement les siennes\",\n own: \"Propre\",\n can_user_edit_collections: \"L'utilisateur peut-il modifier les collections\",\n delete_collections: \"Supprimer les collections\",\n can_user_delete_collections: \"L'utilisateur peut-il supprimer des collections\",\n error_saving_role: \"Une erreur s'est produite lors de l'enregistrement de ce rôle\",\n create_role: \"Créer un rôle\",\n update: \"Mettre à jour\",\n\n only_admins_change_roles: \"Seuls les administrateurs peuvent modifier les rôles\",\n must_be_at_least_one_admin: \"Il doit y avoir au moins un administrateur\",\n logged_user_not_found: \"Utilisateur connecté introuvable\",\n user: \"Utilisateur\",\n user_id: \"ID de l'utilisateur\",\n name_of_this_user: \"Nom de cet utilisateur\",\n email_of_this_user: \"Email de cet utilisateur\",\n roles: \"Rôles\",\n create_user: \"Créer un utilisateur\",\n\n users: \"Utilisateurs\",\n add_user: \"Ajouter un utilisateur\",\n add_role: \"Ajouter un rôle\",\n is_admin: \"Est Admin\",\n default_permissions: \"Autorisations par défaut\",\n created_on: \"Créé le\",\n email: \"E-mail\",\n id: \"ID\",\n read: \"Lire\",\n\n column_in_file: \"Colonne dans le fichier\",\n map_to_property: \"Mappage à la propriété\",\n default_values: \"Valeurs par défaut\",\n default_values_description: \"Vous pouvez sélectionner une valeur par défaut pour les colonnes non mappées et les valeurs vides :\",\n property: \"Propriété\",\n default_value: \"Valeur par défaut\",\n autogenerate_id: \"Générer automatiquement l'ID\",\n id_column_description: \"Colonne qui sera utilisée comme ID pour chaque document\",\n do_not_set_value: \"Ne pas définir de valeur\",\n set_value_to_true: \"Définir la valeur sur Vrai (true)\",\n set_value_to_false: \"Définir la valeur sur Faux (false)\",\n drag_and_drop_file: \"Glissez et déposez un fichier ici ou cliquez pour télécharger\",\n error_saving_data: \"Erreur lors de l'enregistrement des données\",\n retry: \"Réessayer\",\n saving_data: \"Enregistrement des données\",\n entities_saved: \"entités enregistrées\",\n do_not_close_tab: \"Ne fermez pas cet onglet, sinon l'importation sera interrompue\",\n import: \"Importer\",\n import_data: \"Importer des données\",\n upload_file_description: \"Téléchargez un fichier CSV, Excel ou JSON et mappez-le à votre schéma existant\",\n back: \"Retour\",\n next: \"Suivant\",\n save_data: \"Enregistrer les données\",\n use_column_as_id: \"Utiliser cette colonne comme ID\",\n do_not_import_property: \"Ne pas importer cette propriété\",\n entities_will_be_overwritten: \"Les entités avec le même identifiant seront écrasées\",\n data_imported_successfully: \"Données importées avec succès\",\n export: \"Exporter\",\n export_data: \"Exporter des données\",\n download_table_csv: \"Télécharger le contenu de cette table au format CSV\",\n csv: \"CSV\",\n json: \"JSON\",\n dates_as_timestamps: \"Dates sous forme d'horodatages\",\n dates_as_strings: \"Dates sous forme de chaînes\",\n flatten_arrays: \"Aplatir les tableaux\",\n download: \"Télécharger\",\n large_number_of_documents: \"Cette collection contient un grand nombre de documents ({{count}}).\",\n include_undefined_values: \"Inclure les valeurs non définies\",\n submit: \"Soumettre\",\n\n no_filterable_properties: \"Aucune propriété filtrable disponible\",\n apply_filters: \"Appliquer les filtres\",\n list: \"Liste\",\n table_view_mode: \"Tableau\",\n cards: \"Cartes\",\n board: \"Tableau\",\n initialize_kanban_order_desc: \"Ceci attribuera des valeurs d'ordre séquentiel à tous les éléments qui n'en ont pas. Les articles conserveront leur ordre actuel dans chaque colonne.\",\n kanban_view_not_available: \"La vue Kanban n'est pas disponible\",\n kanban_view_requires_enum: \"La vue Kanban requiert une propriété de chaîne de caractères avec des valeurs Enumération (enum) pour regrouper les entités en colonnes. Veuillez ajouter une propriété Enum à votre schéma de collection pour utiliser cette vue.\",\n no_enum_values_configured: 'Aucune valeur enum configurée pour la propriété \"{{property}}\"',\n items_need_backfill: \"Certains éléments n'ont pas de valeurs d'ordre. Initialisez-les pour permettre la réorganisation par glisser-déposer.\",\n kanban_order_not_configured: \"L'ordonnancement par glisser-déposer n'est pas configuré. Définissez une propriété d'ordre dans les paramètres de la collection pour conserver les positions des cartes.\",\n initialize: \"Initialiser\",\n confirm_multiple_delete: \"Confirmez la suppression multiple ?\",\n delete_entity_confirm_title: \"Souhaitez-vous supprimer {{entityName}} ?\",\n multiple_deleted: \"Suppression multiple terminée\",\n some_entities_deleted: \"Certaines des entités ont été supprimées, mais pas toutes\",\n error_deleting_entities: \"Erreur lors de la suppression des entités\",\n deleted: \"supprimé\",\n\n /** Recently extracted strings for collection editor */\n /** AI Collection Generator Popover */\n generate_collection_with_ai: \"Générer une collection avec l'IA\",\n modify_collection_with_ai: \"Modifier la collection avec l'IA\",\n describe_collection_to_create: \"Décrivez la collection que vous souhaitez créer.\",\n describe_changes_to_make: \"Décrivez les modifications que vous souhaitez apporter à cette collection.\",\n ai_placeholder_create: \"ex. : Créer une collection de produits avec nom, prix, description et catégorie...\",\n ai_placeholder_modify: \"ex. : Ajouter un champ d'image miniature avec stockage, rendre le prix obligatoire...\",\n ai_assist: \"Assistance IA\",\n generating: \"Génération en cours...\",\n\n this_is_subcollection_of: \"Ceci est une sous-collection de\",\n use_existing_paths_database: \"Utiliser l'un des chemins existants dans votre base de données :\",\n describe_collection_ai: \"Décrivez votre collection à l'IA :\",\n generate_with_ai: \"Générer avec l'IA\",\n create_from_json_config: \"Créer à partir d'une configuration JSON :\",\n paste_json_config: \"Coller la configuration JSON\",\n create_collection_from_file_formats: \"Créer une collection à partir d'un fichier (csv, json, xls, xslx...)\",\n select_template: \"Sélectionner un modèle :\",\n products: \"Produits\",\n collection_products_subtitle: \"Une collection de produits avec images, prix et stock\",\n collection_users_subtitle: \"Une collection d'utilisateurs avec e-mails, noms et rôles\",\n blog_posts: \"Articles de blog\",\n collection_blog_posts_subtitle: \"Une collection d'articles de blog avec images, auteurs et contenu complexe\",\n pages: \"Pages\",\n collection_pages_subtitle: \"Une collection de pages avec images, auteurs et contenu complexe\",\n continue_from_scratch: \"Continuer à partir de zéro\",\n\n /** Admin views config */\n cms_users: \"Utilisateurs du CMS\",\n roles_menu: \"Rôles\",\n project_settings: \"Paramètres du projet\",\n\n by_signing_in_you_agree_to_our: \"En vous connectant, vous acceptez nos\",\n terms_and_conditions: \"Conditions générales\",\n and_our: \"et notre\",\n privacy_policy: \"Politique de confidentialité\",\n email_password: \"E-mail/Mot de passe\",\n sign_in_with_google: \"Se connecter avec Google\",\n\n // --- Auth error messages ---\n auth_user_not_found: \"Utilisateur non trouvé\",\n auth_wrong_password: \"Mot de passe erroné. Veuillez réessayer.\",\n auth_user_disabled: \"Utilisateur désactivé. Veuillez contacter le support.\",\n auth_account_exists_with_different_credential: \"Un compte existe avec une méthode de connexion différente\",\n auth_email_already_in_use: \"L'e-mail est déjà utilisé\",\n auth_google_permissions_required: \"Vous devez accorder des autorisations supplémentaires afin de gérer vos projets Google Cloud\",\n auth_invalid_email_password: \"Veuillez entrer l'e-mail et le mot de passe\",\n auth_enter_email_first: \"Veuillez d'abord entrer votre e-mail\",\n auth_password_reset_sent: \"E-mail de réinitialisation du mot de passe envoyé\",\n auth_sign_in_account: \"Connectez-vous à votre compte\",\n auth_create_new_account: \"Créer un nouveau compte\",\n auth_password: \"Mot de passe\",\n auth_reset_password: \"Réinitialiser le mot de passe\",\n auth_new_user: \"Nouvel utilisateur ?\",\n auth_have_account: \"Vous avez déjà un compte ?\",\n auth_sign_in: \"Se connecter\",\n auth_sign_up: \"S'inscrire\",\n\n\n auto_setup_collections_button: \"Configurer les collections automatiquement\",\n auto_setup_collections_title: \"Configurer les collections automatiquement ?\",\n auto_setup_collections_desc: \"Cela créera automatiquement des configurations de collection pour les collections qui ne sont <b>PAS</b> déjà mappées\",\n this_can_take_a_minute: \"Cela peut prendre une minute\",\n no_collections_found_to_setup: \"Aucune collection à configurer trouvée\",\n collections_have_been_setup: \"Les collections ont été configurées\",\n error_setting_up_collections: \"Erreur lors de la configuration des collections\",\n add_your: \"Ajoutez vos\",\n database_collections: \"collections de base de données\",\n no_unmapped_collections: \"Aucune collection non mappée\",\n query_and_update_with_datatalk: \"Interrogez et mettez à jour vos données en langage naturel avec\",\n welcome_to_rebase: \"Bienvenue sur Rebase Cloud\",\n admin_panel_ready_bring_data: \"Votre panneau d'administration est prêt. Ajoutons vos données.\",\n admin_panel_ready_get_started: \"Votre panneau d'administration est prêt. Voici comment démarrer.\",\n auto_detect_collections: \"Détecter automatiquement les collections\",\n auto_detect_collections_desc: \"Laissez l'IA analyser votre base de données et générer automatiquement des schémas de collection.\",\n create_a_collection: \"Créer une collection\",\n create_collection_desc: \"Définissez manuellement votre première collection à partir de zéro à l'aide de l'éditeur visuel.\",\n read_the_docs: \"Lire la documentation\",\n read_the_docs_desc: \"Apprenez à personnaliser les champs, les vues, les actions et bien plus encore.\",\n explore_docs: \"Explorer la documentation\",\n want_to_customize_with_code: \"Vous souhaitez personnaliser avec du code ? Exécutez\",\n to_scaffold_a_local_project: \"pour générer un projet local.\",\n\n // ─── Collection Editor — Validation ──────────────────────────\n validation: \"Validation\",\n unique: \"Unique\",\n required_message: \"Message de champ obligatoire\",\n required_tooltip: \"Vous ne pourrez pas enregistrer cette entité si cette valeur n'est pas définie\",\n unique_tooltip: \"Il ne peut pas y avoir plusieurs entités avec la même valeur\",\n lowercase: \"Minuscules\",\n uppercase: \"Majuscules\",\n trim: \"Supprimer les espaces\",\n exact_length: \"Longueur exacte\",\n min_length: \"Longueur min.\",\n max_length: \"Longueur max.\",\n matches_regex: \"Correspond à une regex\",\n not_valid_regexp: \"Expression régulière non valide\",\n regex_helper: \"ex. /^\\\\d+$/ pour les chiffres uniquement\",\n min_value: \"Valeur min.\",\n max_value: \"Valeur max.\",\n less_than: \"Inférieur à\",\n more_than: \"Supérieur à\",\n positive_value: \"Valeur positive\",\n negative_value: \"Valeur négative\",\n integer_value: \"Valeur entière\",\n\n // ─── Collection Editor — Property Edit ───────────────────────\n invalid_regular_expression: \"Expression régulière non valide\",\n must_specify_target_collection: \"Vous devez spécifier une collection cible pour le champ\",\n need_specify_repeat_field: \"Vous devez spécifier un champ de répétition\",\n need_specify_block_properties: \"Vous devez spécifier les propriétés de ce bloc\",\n incomplete_condition: \"Condition incomplète - veuillez sélectionner un champ\",\n field_name: \"Nom du champ\",\n\n // ─── Collection Editor — Display & Config ────────────────────\n kanban_column_property: \"Propriété de colonne Kanban\",\n select_a_property: \"Sélectionner une propriété\",\n kanban_property_not_found: \"La propriété \\\"{{property}}\\\" n'existe pas ou n'est pas une propriété de type string avec enum. Veuillez sélectionner une propriété valide ou effacer la sélection.\",\n no_enum_string_properties: \"Aucune propriété de type string avec enum trouvée. Ajoutez une propriété string avec enumValues pour utiliser la vue Kanban.\",\n kanban_column_description: \"Sélectionnez une propriété de type string avec des valeurs enum pour regrouper les entités en colonnes\",\n create_property: \"+ Créer la propriété \\\"{{property}}\\\"\",\n order_property: \"Propriété d'ordre\",\n order_property_not_found: \"La propriété \\\"{{property}}\\\" n'existe pas ou n'est pas une propriété numérique. Veuillez sélectionner une propriété valide ou effacer la sélection.\",\n no_number_properties: \"Aucune propriété numérique trouvée. Ajoutez une propriété numérique pour activer le tri.\",\n order_property_description: \"Sélectionnez une propriété numérique pour conserver l'ordre des éléments\",\n display_settings: \"Paramètres d'affichage\",\n default_row_size: \"Taille de ligne par défaut\",\n side_dialog_width: \"Largeur du dialogue latéral\",\n side_dialog_width_description: \"Définissez optionnellement la largeur (en pixels) du dialogue latéral des entités. La valeur par défaut est 768px\",\n inline_editing_enabled: \"Les données peuvent être modifiées directement dans la vue tableau\",\n inline_editing_disabled: \"Les données ne peuvent être modifiées que dans la vue formulaire\",\n inline_editing_description: \"Autoriser la modification des données directement dans la vue tableau, sans ouvrir la vue formulaire.\",\n include_json_view: \"Inclure la vue JSON\",\n no_json_view: \"Ne pas inclure la vue JSON\",\n json_view_description: \"Inclure la représentation JSON du document.\",\n not_found_suffix: \"introuvable\",\n\n // ─── Editor ─────────────────────────────────────────────────\n editor_text: \"Texte\",\n editor_text_description: \"Commencez simplement à taper du texte brut.\",\n editor_heading_1: \"Titre 1\",\n editor_heading_1_description: \"Grand titre de section.\",\n editor_heading_2: \"Titre 2\",\n editor_heading_2_description: \"Titre de section moyen.\",\n editor_heading_3: \"Titre 3\",\n editor_heading_3_description: \"Petit titre de section.\",\n editor_todo_list: \"Liste de tâches\",\n editor_todo_list_description: \"Suivez les tâches avec une liste de tâches.\",\n editor_bullet_list: \"Liste à puces\",\n editor_bullet_list_description: \"Créez une simple liste à puces.\",\n editor_numbered_list: \"Liste numérotée\",\n editor_numbered_list_description: \"Créez une liste avec numérotation.\",\n editor_quote: \"Citation\",\n editor_quote_description: \"Capturez une citation.\",\n editor_code: \"Code\",\n editor_code_description: \"Capturez un extrait de code.\",\n editor_image: \"Image\",\n editor_image_description: \"Téléchargez une image depuis votre ordinateur.\",\n editor_multiple: \"Multiple\",\n editor_link: \"Lien\",\n editor_save: \"Enregistrer\",\n editor_cancel: \"Annuler\",\n editor_remove_link: \"Supprimer le lien\",\n editor_paste_or_type_link: \"Coller ou taper le lien\",\n editor_open_in_new_window: \"Ouvrir dans une nouvelle fenêtre\",\n editor_bold: \"Gras\",\n editor_italic: \"Italique\",\n editor_underline: \"Souligné\",\n editor_strikethrough: \"Barré\",\n editor_autocomplete: \"Saisie automatique\",\n editor_autocomplete_description: \"Ajoutez du texte basé sur le contexte.\",\n\n settings_heading: \"Paramètres\",\n settings_project_name: \"Nom du projet\",\n settings_default_language: \"Langue par défaut\",\n settings_default_language_caption: \"Sélectionnez la langue de base pour ce projet. Les utilisateurs peuvent modifier cette préférence dans leurs paramètres personnels.\",\n settings_enable_local_text_search: \"Activer la recherche de texte locale\",\n settings_local_text_search_caption: \"Activez la recherche de texte locale pour toutes les collections. Cela vous permettra de rechercher des champs textuels à l'aide de la barre de recherche Rebase. Notez que cette fonctionnalité peut entraîner un nombre de lectures plus élevé, car tous les champs textuels de vos collections seront indexés.\",\n settings_doc_history_all_collections: \"Historique des documents activé pour toutes les collections\",\n settings_doc_history_caption: \"Lorsque activé, toutes les collections auront l'historique activé par défaut. Vous pouvez modifier ce paramètre pour chaque collection. L'historique sera enregistré dans la sous-collection __history de chaque document.\",\n settings_theme: \"Thème\",\n settings_primary_color: \"Couleur primaire\",\n settings_secondary_color: \"Couleur secondaire\",\n settings_sample_theme_components: \"Exemples de composants du thème\",\n settings_drag_drop_logo: \"Glissez-déposez votre logo ici\",\n settings_security_rules: \"Règles de sécurité\",\n settings_security_rules_description: \"Rebase utilise les règles de sécurité Firebase pour restreindre l'accès aux données. Lors de la création d'un utilisateur via Rebase, l'attribut personnalisé rebaseUser est ajouté à l'utilisateur dans le projet client. En ajoutant les règles de sécurité suivantes, vous garantissez que les utilisateurs Rebase peuvent accéder aux données via Rebase.\",\n settings_security_rules_add_domain: \"N'oubliez pas d'ajouter le domaine {{domain}} aux domaines autorisés de votre fournisseur\",\n settings_security_rules_caption: \"Ces règles restreignent l'accès aux données aux seuls utilisateurs Rebase, mais n'appliquent pas les permissions au niveau de la base de données. Les permissions sont appliquées côté frontend, ce qui convient à la plupart des projets. Si vous devez appliquer les permissions au niveau de la base de données, vous pouvez modifier ces règles de sécurité. Les rôles attribués à un utilisateur sont définis comme attributs personnalisés dans le jeton d'authentification Firebase, vous pouvez donc les utiliser dans vos règles de sécurité.\",\n\n // ─── Text Search Dialog ─────────────────────────────────────\n text_search_dialog_title: \"Activer la recherche de texte\",\n text_search_local_not_recommended: \"La recherche de texte locale n'est pas recommandée pour les grandes collections.\",\n text_search_local_fetch_warning: \"Notez que l'activation de la recherche de texte locale nécessite de récupérer tous les documents de votre collection et de les stocker dans le navigateur. Cela peut être inefficace pour les grandes collections et entraîner des coûts supplémentaires.\",\n text_search_external_suggestion: \"Pour les collections plus grandes, il est recommandé d'utiliser un moteur de recherche externe comme Algolia ou Elastic Search, et d'attribuer un délégué de recherche à votre configuration.\",\n text_search_local_description: \"La recherche de texte locale est le moyen le plus simple d'activer la recherche de texte dans votre collection. Elle charge tous les documents de la collection dans le navigateur et effectue la recherche localement. C'est l'option recommandée pour les petites collections.\",\n text_search_own_implementation: \"Vous avez implémenté votre propre contrôleur de recherche de texte. Vous pouvez activer la recherche de texte pour votre collection.\",\n text_search_enable_for_collection: \"Activer pour cette collection\",\n text_search_enable_for_project: \"Activer pour le projet\",\n text_search_enabled_snackbar: \"Recherche de texte locale activée\",\n\n // ─── Missing keys (English placeholders — translate) ───\nno_filter: \"No filter\",\n is_true: \"is true\",\n is_false: \"is false\",\n error_uploading_file_size: \"Error uploading file: File is larger than {{maxSize}} bytes\",\n error_uploading_file_type: \"Error uploading file: File type is not supported\",\n drag_drop_files: \"Drag 'n' drop some files here, or click here to edit\",\n drag_drop_file: \"Drag 'n' drop a file here, or click here to edit\",\n select_reference: \"Select reference\",\n select_references: \"Select references\",\n account_settings: \"Account Settings\",\n profile: \"Profile\",\n sessions: \"Sessions\",\n display_name: \"Display Name\",\n photo_url: \"Photo URL\",\n save_profile: \"Save Profile\",\n saving: \"Saving...\",\n no_active_sessions: \"No active sessions found.\",\n revoking: \"Revoking...\",\n revoke_all_sessions: \"Revoke All Sessions\",\n unknown_device: \"Unknown Device\",\n current: \"Current\",\n role_id: \"Role ID\",\n role_name: \"Role Name\",\n add_reference: \"Add reference\",\n add_reference_to: \"Add reference to {{name}}\",\n role_deleted_successfully: \"Role deleted successfully\",\n error_deleting_role: \"Error deleting role\",\n collection_permissions: \"Collection permissions\",\n collection: \"Collection\",\n no_collections_configured: \"No collections configured\",\n no_security_rules_defined: \"No security rules defined — all operations unrestricted\",\n no_rules: \"no rules\",\n bootstrap_admin_success: \"You are now an admin! Refreshing...\",\n failed_to_bootstrap_admin: \"Failed to bootstrap admin\",\n user_deleted_successfully: \"User deleted successfully\",\n error_deleting_user: \"Error deleting user\",\n add_row_before: \"Add row before\",\n add_row_after: \"Add row after\",\n delete_row: \"Delete row\",\n add_column_before: \"Add column before\",\n add_column_after: \"Add column after\",\n delete_column: \"Delete column\",\n delete_table: \"Delete table\",\n alt_text: \"Alt text\",\n title: \"Title\",\n a_property_of_this_map_has_error: \"A property of this map has an error\",\n studio_sql_executing_query: \"EXECUTING QUERY...\",\n studio_sql_query_error: \"Query Error\",\n studio_sql_run_query_placeholder: \"Run a query to see results\",\n studio_sql_visual_execution_plan: \"Visual Execution Plan\",\n studio_sql_success: \"SUCCESS\",\n studio_sql_no_results: \"Query executed successfully but returned no results.\",\n studio_sql_rows: \"Rows:\",\n studio_sql_time: \"Time:\",\n studio_sql_copy_markdown: \"Copy Markdown\",\n studio_sql_export_json: \"Export JSON\",\n studio_sql_export_csv: \"Export CSV\",\n studio_sql_format_sql: \"Format SQL\",\n studio_sql_explain: \"Explain\",\n studio_sql_limit_1000: \"Limit 1000\",\n studio_sql_remove_from_favorites: \"Remove from Favorites\",\n studio_sql_add_to_favorites: \"Add to Favorites\",\n studio_sql_save: \"Save\",\n studio_sql_run: \"Run\",\n studio_sql_database: \"Database\",\n studio_sql_role: \"Role\",\n studio_sql_admin: \"(Admin)\",\n studio_sql_select_db: \"Select DB\",\n studio_sql_query_results: \"Query Results\",\n studio_sql_save_snippet: \"Save SQL Snippet\",\n studio_sql_snippet_name: \"Snippet Name\",\n studio_sql_snippet_name_placeholder: \"e.g., Get All Users\",\n studio_sql_snippet_saved_local: \"This will be saved to your local storage.\",\n studio_sql_cancel: \"Cancel\",\n studio_sql_dangerous_operation: \"Dangerous Operation Detected\",\n studio_sql_dangerous_operation_body: \"The query you are about to run contains potentially destructive operations (DELETE, DROP, TRUNCATE, or UPDATE without WHERE). Are you sure you want to proceed?\",\n studio_sql_snippet_saved: \"Snippet \\\"{{name}}\\\" saved.\",\n studio_sql_markdown_copied: \"Results copied as Markdown!\",\n studio_sql_markdown_copy_failed: \"Failed to copy Markdown to clipboard.\",\n studio_sql_row_updated: \"Row updated successfully.\",\n studio_sql_cannot_edit_missing_query: \"Cannot edit rows: The underlying query is missing.\",\n studio_sql_cannot_resolve_table: \"Could not resolve table/primary key\",\n studio_sql_missing_pk: \"Row is missing primary key column(s): {{columns}}. Cannot safely update.\",\n studio_sql_update_failed: \"Failed to update: {{message}}\",\n studio_sql_execution_not_supported: \"SQL execution is not supported by the current data source.\",\n studio_sql_error_executing: \"An error occurred while executing the query.\",\n studio_sql_error_explaining: \"An error occurred while explaining the query.\",\n studio_sql_save_first_to_favorite: \"Please save the snippet first before favoriting.\",\n studio_sql_cms: \"Collections:\",\n studio_sql_cms_collections_tooltip: \"Tables in this query that are mapped as CMS collections\",\n studio_sql_edit_entity: \"Edit {{name}} #{{id}}\",\n studio_sql_sql_not_supported: \"SQL execution not supported by this data source\",\n studio_sql_fetch_error: \"Failed to fetch connection options: {{message}}\",\n studio_sql_unexpected_format: \"Unexpected data format: {{type}}\",\n studio_sql_no_tables: \"No tables found in this database.\",\n studio_sql_schema_fetch_error: \"Failed to fetch schema: {{message}}\",\n studio_sql_sidebar_snippets: \"Snippets\",\n studio_sql_sidebar_history: \"History\",\n studio_sql_sidebar_schema: \"Schema\",\n studio_sql_sidebar_no_snippets: \"No saved snippets\",\n studio_sql_sidebar_save_snippet_hint: \"Save a query to access it here.\",\n studio_sql_sidebar_no_history: \"No history\",\n studio_sql_sidebar_history_hint: \"Executed queries will appear here.\",\n studio_sql_sidebar_delete_snippet: \"Delete snippet\",\n studio_schema_tables: \"Tables\",\n studio_schema_loading: \"Loading schema...\",\n studio_schema_no_tables: \"No tables found\",\n studio_schema_retry: \"Retry\",\n studio_schema_primary_key: \"Primary Key\",\n studio_schema_select_all: \"SELECT * FROM\",\n studio_schema_insert_into: \"INSERT INTO\",\n studio_schema_update: \"UPDATE\",\n studio_schema_delete_from: \"DELETE FROM\",\n studio_schema_columns: \"{{count}} columns\",\n studio_rls_title: \"Row Level Security\",\n studio_rls_description: \"Manage RLS policies for your tables\",\n studio_rls_enabled: \"RLS Enabled\",\n studio_rls_disabled: \"RLS Disabled\",\n studio_rls_no_rls: \"No RLS\",\n studio_rls_enable_rls: \"Enable RLS\",\n studio_rls_disable_rls: \"Disable RLS\",\n studio_rls_create_policy: \"Create Policy\",\n studio_rls_policies: \"Policies\",\n studio_rls_no_policies: \"No policies defined\",\n studio_rls_no_policies_desc: \"This table has no RLS policies. All rows are accessible based on the RLS status.\",\n studio_rls_add_first_policy: \"Add your first policy\",\n studio_rls_force_rls: \"Force RLS\",\n studio_rls_force_rls_desc: \"When enabled, RLS policies apply to the table owner as well.\",\n studio_rls_enable_force_rls: \"Enable Force RLS\",\n studio_rls_disable_force_rls: \"Disable Force RLS\",\n studio_rls_edit: \"Edit\",\n studio_rls_delete: \"Delete\",\n studio_rls_confirm_delete_title: \"Delete Policy\",\n studio_rls_confirm_delete_body: \"Are you sure you want to delete this policy? This action cannot be undone.\",\n studio_rls_confirm_enable_title: \"Enable Row Level Security\",\n studio_rls_confirm_enable_body: \"Enabling RLS will restrict access to rows in this table based on your policies. Make sure you have appropriate policies in place.\",\n studio_rls_confirm_disable_title: \"Disable Row Level Security\",\n studio_rls_confirm_disable_body: \"Disabling RLS will make all rows accessible to all roles. Are you sure you want to continue?\",\n studio_rls_select_table: \"Select a table\",\n studio_rls_no_tables: \"No tables available\",\n studio_rls_error: \"Error loading policies\",\n studio_rls_retry: \"Retry\",\n studio_rls_loading: \"Loading policies...\",\n studio_policy_edit: \"Edit Policy\",\n studio_policy_create: \"Create New Policy\",\n studio_policy_defining_rules: \"Defining access rules for\",\n studio_policy_cancel: \"Cancel\",\n studio_policy_save: \"Save Policy\",\n studio_policy_template: \"Start from a template (Optional)\",\n studio_policy_select_template: \"Select a template...\",\n studio_policy_name: \"Policy Name\",\n studio_policy_name_placeholder: \"Give your policy a descriptive name\",\n studio_policy_behavior: \"Policy Behavior\",\n studio_policy_permissive: \"Permissive\",\n studio_policy_permissive_desc: \"Combined using \\\"OR\\\"\",\n studio_policy_restrictive: \"Restrictive\",\n studio_policy_restrictive_desc: \"Combined using \\\"AND\\\"\",\n studio_policy_command: \"Policy Command\",\n studio_policy_target_roles: \"Target Roles\",\n studio_policy_roles_placeholder: \"Select roles (defaults to public)\",\n studio_policy_using_expr: \"USING expression\",\n studio_policy_using_expr_desc: \"Applies to existing rows (SELECT, UPDATE, DELETE)\",\n studio_policy_check_expr: \"WITH CHECK expression\",\n studio_policy_check_expr_desc: \"Applies to new or modified rows (INSERT, UPDATE)\",\n studio_policy_help_title: \"Row Level Security (RLS) Guide\",\n studio_policy_help_intro: \"Row Level Security (RLS) allows you to restrict which rows a user can access or modify based on their authentication status or roles.\",\n studio_policy_help_step1_title: \"1. Select a Template\",\n studio_policy_help_step1_desc: \"If you're new to RLS, the easiest way to start is by selecting a predefined template from the dropdown. It will automatically configure the policy for common use cases like \\\"Users can update their own rows\\\".\",\n studio_policy_help_step2_title: \"2. Target Roles\",\n studio_policy_help_step2_desc: \"Choose which users the policy applies to:\",\n studio_policy_help_role_public: \"Applies to everyone (logged in or not).\",\n studio_policy_help_role_authenticated: \"Only applies to users who are logged in.\",\n studio_policy_help_role_anon: \"Only applies to users who are NOT logged in.\",\n studio_policy_help_step3_title: \"3. USING Expression\",\n studio_policy_help_step3_desc: \"A SQL condition that must evaluate to true for existing rows to be visible or updatable (SELECT, UPDATE, DELETE).\",\n studio_policy_help_step3_example: \"Ensures users can only see rows where they are the owner.\",\n studio_policy_help_step4_title: \"4. WITH CHECK Expression\",\n studio_policy_help_step4_desc: \"A SQL condition that must evaluate to true for new or modified rows to be saved (INSERT, UPDATE).\",\n studio_policy_help_step4_example: \"Usually the same as the USING expression when users are only allowed to insert/edit their own data.\",\n studio_policy_help_auth_vars_title: \"Rebase Auth Variables\",\n studio_policy_help_auth_vars_desc: \"Rebase provides native helper functions that you can use in your expressions:\",\n studio_policy_help_auth_uid: \"Returns the current user's ID as text. Example:\",\n studio_policy_help_auth_jwt: \"Returns the full JWT payload as JSONB so you can check custom claims. Example:\",\n studio_policy_help_auth_roles: \"Returns the user's role IDs as a comma-separated string. Best used with:\",\n studio_policy_help_docs_cta: \"To learn more about Postgres policies, check out the official documentation.\",\n studio_policy_help_read_docs: \"Read Docs\",\n studio_policy_help_got_it: \"Got it!\",\n studio_add_kanban_column: \"Add column\",\n studio_add_kanban_column_title: \"Add Kanban Column\",\n studio_add_kanban_column_name: \"Column name\",\n studio_add_kanban_column_name_placeholder: \"New column name\",\n studio_add_kanban_column_add: \"Add\",\n studio_add_kanban_column_cancel: \"Cancel\",\n studio_collection_view_sql: \"SQL Editor\",\n studio_collection_view_cms: \"CMS View\",\n studio_editor_collection_tooltip: \"Edit collection schema\",\n studio_editor_collection_no_permission: \"You don't have permission to edit this collection\",\n studio_editor_collection_start_tooltip: \"Copy path or edit schema\",\n studio_editor_collection_start_no_permission: \"You don't have permission to modify this collection\",\n studio_editor_collection_start_copied: \"Copied!\",\n studio_editor_entity_tooltip: \"Edit entity schema\",\n studio_editor_entity_no_permission: \"You don't have permission to edit this entity\",\n studio_home_edit_collection: \"Edit collection\",\n studio_home_delete_collection: \"Delete collection\",\n studio_home_confirm_delete_title: \"Delete collection?\",\n studio_home_confirm_delete_body: \"Are you sure you want to delete the collection \\\"{{name}}\\\"? This action cannot be undone.\",\n studio_kanban_setup: \"Kanban Setup\",\n studio_missing_reference: \"Missing reference: {{path}}\",\n studio_missing_reference_create: \"Create\",\n studio_new_collection: \"New collection\",\n studio_new_collection_card: \"New collection\",\n studio_new_collection_no_permission: \"You don't have permissions to create collections\",\n studio_property_add_column: \"Add new property\",\n studio_property_add_column_no_permission: \"You don't have permission to add new properties\",\n studio_add_kanban_column_desc: \"Add a new option to the \\\"{{property}}\\\" property. This will create a new column in the Kanban board.\",\n studio_add_kanban_column_adding: \"Adding...\",\n studio_collection_view_edit: \"Edit\",\n studio_editor_collection_disabled: \"Collection editing is disabled\",\n studio_editor_collection_edit: \"Edit collection\",\n studio_editor_entity_save_first: \"You need to save the document before changing the schema\",\n studio_editor_entity_edit_schema: \"Edit schema for this form\",\n studio_editor_collection_start_save_filter: \"Save default filter and sort\",\n studio_editor_collection_start_clear_filter: \"Clear default filter and sort\",\n studio_editor_collection_start_reset_filter: \"Reset to default filter and sort\",\n studio_editor_collection_start_saved: \"Default config saved\",\n studio_home_duplicate_collection: \"Duplicate\",\n studio_home_delete: \"Delete\",\n studio_home_confirm_delete_no_data: \"This will not delete any data, only the collection in the CMS\",\n studio_home_collection_deleted: \"Collection deleted\",\n studio_kanban_configure: \"Configure Kanban\",\n studio_missing_reference_error: \"No collection for path: {{path}}\",\n studio_new_collection_add: \"Ajouter une nouvelle collection\",\n\n // ─── Property field labels ──────────────────────────────────\n db_column_type: \"Type de colonne de base de données\",\n primary_key_unique_id: \"Clé primaire / ID unique\",\n spread_children_as_columns: \"Étendre les enfants en colonnes\",\n mode: \"Mode\",\n timezone: \"Fuseau horaire\",\n target_collection: \"Collection cible\",\n\n // ─── Storage property ───────────────────────────────────────\n storage_file_name: \"Nom du fichier\",\n storage_path: \"Chemin de stockage\",\n storage_max_size: \"Taille maximale (en octets)\",\n storage_resize_mode: \"Mode de redimensionnement\",\n storage_output_format: \"Format de sortie\",\n storage_max_width: \"Largeur maximale (px)\",\n storage_max_height: \"Hauteur maximale (px)\",\n storage_quality: \"Qualité (0-100)\",\n storage_file_upload_config: \"Configuration de téléchargement de fichier\",\n storage_image_resize_config: \"Configuration du redimensionnement d'image\",\n storage_all_file_types: \"Tous les types de fichiers autorisés\",\n storage_allowed_file_types: \"Types de fichiers autorisés\",\n storage_include_bucket_url: \"Inclure l'URL du bucket (s3://...) dans la valeur enregistrée\",\n storage_save_url: \"Enregistrer l'URL au lieu du chemin de stockage\",\n\n // ─── DateTime property ──────────────────────────────────────\n datetime_automatic_value: \"Valeur automatique\",\n\n // ─── Markdown property ──────────────────────────────────────\n markdown_paste_behavior: \"Comportement au collage\",\n markdown_strip_html: \"Supprimer le HTML au collage\",\n markdown_convert_pasted: \"Convertir le texte collé en markdown\"\n};\n","import { RebaseTranslations } from \"@rebasepro/types\";\n\nexport const it: RebaseTranslations = {\n // ─── Form actions ────────────────────────────────────────────\n save: \"Salva\",\n create: \"Crea\",\n create_copy: \"Crea copia\",\n save_and_close: \"Salva e chiudi\",\n create_copy_and_close: \"Crea copia e chiudi\",\n create_and_close: \"Crea e chiudi\",\n discard: \"Scarta\",\n clear: \"Cancella\",\n cancel: \"Annulla\",\n\n // ─── Entity actions ──────────────────────────────────────────\n edit: \"Modifica\",\n copy: \"Copia\",\n delete: \"Elimina\",\n delete_not_allowed: \"Hai selezionato almeno un'entità che non puoi eliminare\",\n\n // ─── Delete dialog ───────────────────────────────────────────\n delete_confirmation_title: \"Eliminare?\",\n delete_confirmation_body: \"Questo eliminerà l'entità. Sei sicuro?\",\n delete_multiple_confirmation_body: \"Questo eliminerà le entità selezionate. Sei sicuro?\",\n\n // ─── Unsaved-changes dialog ───────────────────────────────────\n unsaved_changes_title: \"Modifiche non salvate\",\n unsaved_changes_body: \"Hai modifiche non salvate. Vuoi scartarle?\",\n discard_changes: \"Scarta le modifiche\",\n keep_editing: \"Continua a modificare\",\n clear_form: \"Svuotare il modulo?\",\n discard_changes_confirmation: \"Tutte le modifiche non salvate andranno perse. Questa azione non può essere annullata.\",\n clear_form_confirmation: \"Tutti i valori inseriti verranno cancellati. Questa azione non può essere annullata.\",\n\n // ─── Collection table / toolbar ──────────────────────────────\n search: \"Cerca\",\n find_by_id: \"Cerca per ID\",\n find_entity_by_id: \"Cerca entità per ID\",\n filter: \"Filtra\",\n filters: \"Filtri\",\n clear_filter: \"Cancella filtro\",\n clear_filter_sort: \"Cancella filtro/ordinamento\",\n clear_sort: \"Cancella ordinamento\",\n clear_all: \"Cancella tutto\",\n no_items: \"Nessun elemento\",\n no_entries_found: \"Nessuna voce trovata\",\n all_entries_loaded: \"Tutte le {{count}} voci caricate\",\n create_your_first_entry: \"Crea la tua prima voce\",\n no_results_filter_sort: \"Nessun risultato con il filtro/ordinamento applicato\",\n no_results_search: \"Nessun risultato trovato per \\\"{{search}}\\\"\",\n add: \"Aggiungi\",\n remove: \"Rimuovi\",\n multiple_entities: \"Entità multiple\",\n unsaved_changes: \"Hai modifiche non salvate in {{collectionName}}.\",\n so_empty: \"Così vuoto...\",\n no_results: \"Nessun risultato con il filtro/ordinamento applicato\",\n refresh_data: \"Aggiorna i dati\",\n dark_mode: \"Scuro\",\n light_mode: \"Chiaro\",\n system_mode: \"Sistema\",\n ok: \"Ok\",\n save_collection_config: \"Salva struttura della collezione\",\n search_for_more_icons: \"Cerca altre icone…\",\n ai_modified: \"Modificato dall'IA\",\n size_label: \"Dimensioni\",\n group_by: \"Raggruppa per\",\n initialize_kanban_order: \"Inizializza ordine Kanban\",\n copy_id: \"Copia ID\",\n add_specific: \"Aggiungi {{name}}\",\n select_specific: \"Seleziona {{name}}\",\n select_from: \"Seleziona da {{name}}\",\n done: \"Fatto\",\n log_out: \"Esci\",\n column_cannot_be_edited: \"Questa colonna non può essere modificata direttamente\",\n close: \"Chiudi\",\n unsaved_local_changes: \"Modifiche locali non salvate\",\n unsaved_local_changes_description: \"Questo documento è stato modificato localmente e ha modifiche non salvate. Queste modifiche locali andranno perse se non le applichi.\",\n preview_changes: \"Anteprima modifiche\",\n apply_changes: \"Applica modifiche\",\n discard_local_changes: \"Scarta modifiche locali\",\n preview_local_changes: \"Anteprima modifiche locali\",\n preview_local_changes_description: \"Queste sono le modifiche locali che verranno applicate al modulo.\",\n type: \"Tipo\",\n string: \"stringa\",\n number: \"numero\",\n boolean: \"booleano\",\n date: \"data\",\n map: \"mappa\",\n array: \"array\",\n arrays_of_arrays_not_supported: \"Array di array non sono supportati.\",\n data_type_not_supported: \"Tipo di dati {{dataType}} non ancora supportato\",\n passkey_error_unsupported: \"Il tuo dispositivo o browser non supporta le passkey.\",\n\n // ─── Entity form feedback ─────────────────────────────────────\n saved_correctly: \"Salvato correttamente\",\n error_before_saving: \"Errore nella preparazione dei dati\",\n error_after_saving: \"Errore nel processo post-salvataggio\",\n error_saving_entity: \"Errore durante il salvataggio dell'entità\",\n entity_does_not_exist: \"Questa entità non esiste nel database\",\n form_modified: \"Questo modulo è stato modificato\",\n form_in_sync: \"Il modulo attuale è sincronizzato con il database\",\n fix_errors_before_saving: \"Correggi gli errori evidenziati prima di salvare\",\n\n admin: \"Admin\",\n home: \"Home\",\n this_form_has_errors: \"Questo modulo contiene errori\",\n error_loading_navigation: \"Errore durante il caricamento della navigazione\",\n error_loading_auth: \"Errore durante il caricamento dell'autenticazione\",\n this_form_has_been_modified: \"Questo modulo è stato modificato\",\n current_form_in_sync: \"Il modulo corrente è sincronizzato con il database\",\n open_in_console: \"Apri nella console\",\n collection_does_not_exist: \"La collezione specificata non esiste. Controlla la console\",\n unexpected_value: \"Valore inaspettato\",\n unexpected_value_click_to_edit: \"Valore inaspettato. Fai clic per modificare\",\n unexpected_reference_value: \"Valore di riferimento inaspettato. Fai clic per modificare\",\n copy_url_to_clipboard: \"Copia url negli appunti\",\n open_image_in_new_tab: \"Apri immagine in una nuova scheda\",\n reference_not_set: \"Riferimento non impostato\",\n reference_does_not_exist: \"Il riferimento non esiste\",\n entity_not_found: \"Entità non trovata\",\n file_not_found: \"File non trovato\",\n unsaved_changes_in_entity: \"Hai modifiche non salvate in questa entità.\",\n delete_this_role: \"Elimina questo ruolo\",\n no_roles_yet: \"Non hai ancora ruoli.\",\n create_default_roles: \"Crea ruoli predefiniti\",\n delete_role_confirmation: \"Sei sicuro di voler eliminare questo ruolo?\",\n delete_this_user: \"Elimina questo utente\",\n no_users_yet: \"Non ci sono ancora utenti\",\n add_logged_user_as_admin: \"Aggiungi l'utente registrato come amministratore\",\n add_current_user_as_admin: \"Aggiungi l'utente corrente come amministratore\",\n create_default_roles_and_add_admin: \"Crea i ruoli predefiniti e aggiungi l'utente corrente come amministratore\",\n delete_user_confirmation: \"Sei sicuro di voler eliminare questo utente?\",\n create_your_users_and_roles: \"Crea i tuoi utenti e ruoli\",\n no_users_or_roles_defined: \"Non hai definito né utenti né ruoli. Puoi creare ruoli predefiniti e aggiungere l'utente corrente come amministratore.\",\n no_permission_to_view_users: \"Non hai i permessi per visualizzare gli utenti\",\n no_permission_to_view_roles: \"Non hai i permessi per visualizzare i ruoli\",\n no_permission_description: \"Contatta un amministratore se hai bisogno di accedere a questa sezione.\",\n save_before_changing_schema: \"Devi salvare il documento prima di modificare lo schema\",\n edit_schema_for_this_form: \"Modifica lo schema per questo modulo\",\n no_permissions_to_edit_collection: \"Non hai i permessi per modificare questa collezione\",\n browser_does_not_support_audio: \"Il tuo browser non supporta l'elemento audio.\",\n user_not_found: \"Utente non trovato: {{value}}\",\n\n // ─── Collection view actions ──────────────────────────────────\n delete_selected: \"Elimina selezionato\",\n cannot_delete_selected: \"Hai selezionato almeno un'entità che non puoi eliminare\",\n\n // ─── Array / field containers ─────────────────────────────────\n add_entry: \"Aggiungi\",\n add_on_top: \"Aggiungi in alto\",\n add_below: \"Aggiungi in basso\",\n add_to_field: \"Aggiungi a {{fieldName}}\",\n value: \"Valore\",\n key: \"Chiave\",\n drag_drop_multiple: \"Trascina qui alcuni file oppure fai clic per selezionarli. Trascina per riordinare.\",\n drag_drop_single: \"Trascina qui un file oppure fai clic per selezionarne uno\",\n\n // ─── Navigation / scaffold ────────────────────────────────────\n open_menu: \"Apri menù\",\n close_drawer: \"Chiudi cassetto\",\n navigation_drawer: \"Cassetto di navigazione\",\n collapse: \"Comprimi\",\n expand: \"Espandi\",\n\n // ─── Error states ─────────────────────────────────────────────\n error: \"Errore\",\n error_uploading_file: \"Errore durante il caricamento del file\",\n error_deleting: \"Errore durante l'eliminazione\",\n error_before_delete: \"Errore prima dell'eliminazione\",\n error_updating_asset: \"Errore durante l'aggiornamento dell'asset\",\n error_deleting_asset: \"Errore durante l'eliminazione dell'asset\",\n error_firestore_index: \"Per questa query è richiesto un indice Firestore.\",\n create_index: \"Crea indice\",\n value_is_not_reference: \"Il valore non è un riferimento.\",\n click_to_edit: \"Fai clic per modificare\",\n data_is_not_array_of_references: \"I dati non sono un array di riferimenti\",\n\n // ─── Misc ─────────────────────────────────────────────────────\n loading: \"Caricamento in corso\",\n local_changes_applied: \"Modifiche locali applicate al modulo\",\n local_changes_discarded: \"Modifiche locali scartate\",\n are_you_sure_leave: \"Sei sicuro di voler uscire da questa pagina?\",\n see_console_details: \"Vedi la console per maggiori dettagli.\",\n drop_here_create_group: \"Rilascia qui per creare un nuovo gruppo\",\n filter_for_null_values: \"Filtra per valori nulli\",\n value_updated_elsewhere: \"Questo valore è stato aggiornato altrove\",\n add_property: \"Aggiungi proprietà\",\n edit_name: \"Modifica {{name}}\",\n this_entity_not_exist: \"Questa entità non esiste nel database\",\n internal_error: \"ERRORE interno\",\n\n // ─── Rename group dialog ──────────────────────────────────────\n rename_group: \"Rinomina gruppo\",\n group_name_label: \"Nome gruppo\",\n group_name_empty_error: \"Il nome del gruppo non può essere vuoto.\",\n group_name_exists_error: \"Questo nome del gruppo esiste già.\",\n\n // ─── Search ───────────────────────────────────────────────────\n search_collections: \"Cerca collezioni\",\n\n // ─── Navigation groups ────────────────────────────────────────\n views_group: \"Viste\",\n\n // ─── Entity Edit View ─────────────────────────────────────────\n youd_need_to_save_before_additional_collections: \"Devi salvare la tua entità prima di poter aggiungere altre collezioni\",\n\n // ─── Not Found Page ───────────────────────────────────────────\n page_not_found: \"Pagina non trovata\",\n page_not_found_body: \"Questa pagina non esiste o potresti non avere i permessi per accedervi\",\n back_to_home: \"Torna alla home\",\n\n // ─── Collection Editor ─────────────────────────────────────────\n default_collection_view: \"Vista collezione predefinita\",\n table_view: \"Tabella\",\n cards_view: \"Schede (card)\",\n kanban_view: \"Kanban\",\n choose_how_entities_displayed_default: \"Scegli come debbano essere visualizzate le entità di default\",\n\n document_view: \"Vista documento\",\n side_panel: \"Pannello laterale\",\n full_screen: \"Schermo intero\",\n should_documents_opened_full_screen: \"I documenti dovrebbero essere aperti a schermo intero o in una finestra di dialogo laterale integrata\",\n\n select_custom_view: \"Seleziona vista personalizzata\",\n no_custom_views_defined: \"Nessuna vista personalizzata definita. Definisci le viste personalizzate nelle impostazioni di personalizzazione prima di utilizzare questa finestra.\",\n\n select_custom_action: \"Seleziona azione personalizzata\",\n no_custom_actions_defined: \"Nessuna azione personalizzata definita. Definisci le azioni personalizzate nelle impostazioni di personalizzazione prima di utilizzare questa finestra.\",\n\n no_collections_found: \"Nessuna collezione trovata\",\n start_building_collections: \"Inizia facilmente a costruire collezioni in Rebase. Mapale comodamente ai dati del tuo database esistente, importali da file o usa i nostri modelli.\",\n create_first_collection: \"Crea la tua prima collezione\",\n define_collections_programmatically: \"Puoi anche definire le collezioni a livello di codice.\",\n edit_collection: \"Modifica collezione\",\n no_permissions_edit_collection: \"Non disponi dei permessi per modificare questa collezione\",\n no_permissions_create_collection: \"Non disponi dei permessi per creare collezioni\",\n create_collection: \"Crea collezione\",\n update_collection: \"Aggiorna collezione\",\n\n new_collection: \"Nuova collezione\",\n add_new_collection: \"Aggiungi nuova collezione\",\n collection_with_name: \"Collezione {{name}}\",\n change_icon: \"Cambia icona\",\n is_subcollection_of: \"Questa è una sottocollezione di\",\n name: \"Nome\",\n collection_name_description: \"Il nome di questa collezione, solitamente un nome al plurale (es. Prodotti)\",\n path: \"Percorso\",\n relative_path_to_parent: \"Percorso relativo al genitore (non è necessario includere il percorso genitore)\",\n path_in_database: \"Il percorso in cui questa collezione è archiviata nel database\",\n singular_name: \"Nome singolare\",\n singular_name_description: \"Facoltativamente definisci un nome singolare per le tue entità\",\n description: \"Descrizione\",\n description_of_collection: \"Descrizione della collezione, puoi utilizzare il markdown\",\n collection_id: \"ID della collezione\",\n collection_id_description: \"Questo ID identifica in modo univoco questa collezione. Spesso coincide con il percorso.\",\n collection_group: \"Gruppo di collezioni\",\n collection_group_description: \"Un gruppo di collezioni include tutte le collezioni con lo stesso percorso. Ciò consente di interrogare più collezioni simultaneamente.\",\n advanced_settings: \"Impostazioni avanzate\",\n doc_history_global: \"Revisioni della cronologia dei documenti abilitate se abilitate a livello globale\",\n doc_history_enabled: \"Revisioni della cronologia dei documenti ABILITATE\",\n doc_history_not_enabled: \"Revisioni della cronologia dei documenti NON abilitate\",\n doc_history_description: \"Se abilitata questa opzione, ogni documento in questa collezione avrà una cronologia delle modifiche per scopi di auditing. I dati vengono salvati in una sottocollezione del documento denominata __history.\",\n document_id_generation: \"Generazione ID documento\",\n code_defined: \"Definito dal codice\",\n users_must_define_id: \"Gli utenti devono definire un ID\",\n users_can_define_id: \"Gli utenti possono definire un ID, ma non è obbligatorio\",\n doc_id_auto_generated: \"L'ID del documento viene generato automaticamente\",\n config_doc_id_generation: \"Configura il modo in cui vengono generati gli ID dei documenti per le nuove entità.\",\n enable_text_search: \"Abilita la ricerca testuale in questa collezione\",\n text_search_description: \"Attiva la ricerca testuale per questa collezione. Se non è specificato un delegato di ricerca testuale, si utilizzerà la ricerca locale integrata. Si sconsiglia l'uso con collezioni grandi, essendo soggetto a problemi di prestazioni e costi.\",\n database_id: \"ID del Database\",\n default_text: \"(predefinito)\",\n\n custom_actions: \"Azioni personalizzate\",\n more_info: \"Ulteriori info\",\n define_custom_actions_cli: \"Definisci le tue azioni personalizzate ed eseguine l'upload tramite l'interfaccia a riga di comando (CLI).\",\n action_defined_in_code: \"Questa azione è definita dal codice con la chiave\",\n add_custom_entity_action: \"Aggiungi azione di entità personalizzata\",\n remove_this_action: \"Rimuovi questa azione?\",\n remove_action_warning: \"Questa operazione non eliminerà dati, ma solo l'azione dal CMS\",\n\n subcollections_of: \"Sottocollezioni di\",\n add_subcollection: \"Aggiungi sottocollezione\",\n custom_views: \"Viste personalizzate\",\n define_custom_views_cli: \"Definisci le tue viste personalizzate e caricale tramite l'interfaccia a riga di comando (CLI).\",\n view_defined_in_code: \"Questa vista è definita nel codice dalla chiave\",\n add_custom_entity_view: \"Aggiungi vista ad entità personalizzata\",\n delete_this_subcollection: \"Vuoi eliminare questa sottocollezione?\",\n remove_collection_warning: \"Attenzione: questo rimuoverà solo la collezione configurata nel CMS, senza eliminare i dati effettivi.\",\n remove_this_view: \"Desideri rimuovere questa vista?\",\n remove_view_warning: \"Questa azione rimuoverà solo la visualizzazione dal CMS; i dati rimarranno intatti.\",\n\n no_collection_selected: \"Nessuna collezione selezionata\",\n code_for_collection: \"Codice per\",\n use_config_define_json: \"Utilizza questa configurazione per definire la collezione in formato JSON.\",\n customise_collection_code: \"Se desideri personalizzare ulteriormente tramite codice la collezione, puoi aggiungere questo frammento di codice nel tuo CMS.\",\n copied: \"Copiato\",\n\n property_cant_be_edited: \"Non è possibile modificare questa proprietà\",\n property_not_editable_description: \"Potresti non disporre dei permessi per modificarla o potrebbe essere definita nel codice e non modificabile.\",\n delete_this_property: \"Desideri eliminare questa proprietà?\",\n delete_property_warning: \"Questo non cancellerà i dati associati, modificherà semplicemente la configurazione della collezione.\",\n error_must_specify_id: \"È d'obbligo specificare un id per questo campo\",\n error_id_format: \"L'id può contenere solo lettere, numeri e underscore (_) e non deve iniziare con un numero\",\n error_id_already_exists: \"Esiste già un altro campo utilizzando questo ID\",\n error_must_specify_title: \"Specifica un titolo obbligatorio per questo campo\",\n custom_or_other: \"Personalizzato/Altro\",\n select_property_widget: \"Scegli un widget per la proprietà\",\n error_changing_data_type: \"Il widget selezionato adotta un formato di dati diverso rispetto a quello iniziale. Questa modifica potrebbe causare errori sui dati già presenti.\",\n required: \"Richiesto\",\n\n enum_form_dialog: \"Finestra di dialogo modulo Enum\",\n imported_data_preview: \"Anteprima dei dati importati\",\n entities_with_same_id_overwritten: \"Le entità con lo stesso id verranno sovrascritte\",\n collection_editor: \"Editor della collezione\",\n properties_in_this_group: \"Proprietà di questo gruppo\",\n data_property_mapping: \"Mappatura dei dati alle proprietà\",\n property_edit_view: \"Vista di modifica delle proprietà\",\n all_of_these: \"Tutti questi\",\n any_of_these: \"Alcuni di questi\",\n\n only_admins_edit_roles: \"Solo gli amministratori possono modificare i ruoli\",\n error_user_not_found: \"Utente non trovato\",\n all_roles: \"Tutti i ruoli\",\n role: \"Ruolo\",\n name_of_this_role: \"Nome di questo ruolo\",\n id_of_this_role: \"ID di questo ruolo\",\n create_entities: \"Crea entità\",\n read_entities: \"Leggi entità\",\n update_entities: \"Aggiorna entità\",\n delete_entities: \"Elimina entità\",\n all_collections: \"Tutte le collezioni\",\n create_entities_in_collections: \"Crea entità nelle collezioni\",\n access_all_data_in_every_collection: \"Accedi a tutti i dati in ogni collezione\",\n update_data_in_any_collection: \"Aggiorna i dati in qualsiasi collezione\",\n delete_data_in_any_collection: \"Elimina i dati in qualsiasi collezione\",\n allow_all_permissions_in_this_collections: \"Consenti tutti i permessi in queste collezioni\",\n all: \"Tutto\",\n customise_permissions_description: \"Puoi personalizzare i permessi che gli utenti associati a questo ruolo possono eseguire nelle entità di ciascuna collezione\",\n create_collections: \"Crea collezioni\",\n yes: \"Sì\",\n no: \"No\",\n can_user_create_collections: \"L'utente può creare collezioni\",\n edit_collections: \"Modifica collezioni\",\n only_own_collections: \"Solo le proprie collezioni\",\n own: \"Propri\",\n can_user_edit_collections: \"L'utente può modificare le collezioni\",\n delete_collections: \"Elimina collezioni\",\n can_user_delete_collections: \"L'utente può eliminare le collezioni\",\n error_saving_role: \"Si è verificato un errore durante il salvataggio del ruolo\",\n create_role: \"Crea ruolo\",\n update: \"Aggiorna\",\n\n only_admins_change_roles: \"Solo gli amministratori possono modificare i ruoli\",\n must_be_at_least_one_admin: \"Deve esserci almeno un amministratore\",\n logged_user_not_found: \"Utente connesso non trovato\",\n user: \"Utente\",\n user_id: \"ID utente\",\n name_of_this_user: \"Nome dell'utente\",\n email_of_this_user: \"Email dell'utente\",\n roles: \"Ruoli\",\n create_user: \"Crea utente\",\n\n users: \"Utenti\",\n add_user: \"Aggiungi utente\",\n add_role: \"Aggiungi ruolo\",\n is_admin: \"È amministratore\",\n default_permissions: \"Permessi predefiniti\",\n created_on: \"Creato il\",\n email: \"Email\",\n id: \"ID\",\n read: \"Lettura\",\n\n column_in_file: \"Colonna nel file\",\n map_to_property: \"Mappa alla proprietà\",\n default_values: \"Valori predefiniti\",\n default_values_description: \"Non tutte le righe del file importato contengono dati per ogni colonna. Assegna valori predefiniti che Rebase utilizzerà per le colonne mancanti.\",\n property: \"Proprietà\",\n default_value: \"Valore predefinito\",\n autogenerate_id: \"Genera automaticamente ID\",\n id_column_description: \"Imposta la colonna che verrà utilizzata come ID dell'entità\",\n do_not_set_value: \"Non impostare il valore\",\n set_value_to_true: \"Imposta il valore su Vero\",\n set_value_to_false: \"Imposta il valore su Falso\",\n drag_and_drop_file: \"Trascina e rilascia un file CSV, Excel o JSON qui, oppure fai clic per caricare\",\n error_saving_data: \"Errore durante il salvataggio dei dati\",\n retry: \"Riprova\",\n saving_data: \"Salvataggio dei dati in corso...\",\n entities_saved: \"entità salvate\",\n do_not_close_tab: \"Non chiudere questa scheda durante l'importazione dei dati\",\n import: \"Importa\",\n import_data: \"Importa dati\",\n upload_file_description: \"Carica il tuo file CSV, Excel o foglio di calcolo per importare i dati\",\n back: \"Indietro\",\n next: \"Avanti\",\n save_data: \"Salva dati\",\n use_column_as_id: \"Usa questa colonna come ID dell'entità\",\n do_not_import_property: \"Non importare questa proprietà\",\n entities_will_be_overwritten: \"Le entità esistenti con lo stesso ID verranno sovrascritte\",\n data_imported_successfully: \"Dati importati con successo\",\n export: \"Esporta\",\n export_data: \"Esporta dati\",\n download_table_csv: \"Scarica la tabella come file CSV\",\n csv: \"CSV\",\n json: \"JSON\",\n dates_as_timestamps: \"Date come timestamp\",\n dates_as_strings: \"Date come stringhe\",\n flatten_arrays: \"Appiattisci gli array\",\n download: \"Scarica\",\n large_number_of_documents: \"Questa collezione contiene un numero elevato di documenti ({{count}})\",\n include_undefined_values: \"Includi valori non definiti\",\n submit: \"Invia\",\n\n no_filterable_properties: \"Nessuna proprietà filtrabile disponibile\",\n apply_filters: \"Applica filtri\",\n list: \"Elenco\",\n table_view_mode: \"Tabella\",\n cards: \"Schede\",\n board: \"Bacheca\",\n initialize_kanban_order_desc: \"Verranno assegnati valori di ordine sequenziali a tutti gli elementi che ne sono privi. Gli elementi manterranno l'ordine corrente all'interno di ciascuna colonna.\",\n kanban_view_not_available: \"Vista Kanban non disponibile\",\n kanban_view_requires_enum: \"La vista Kanban richiede una proprietà stringa con valori enumerati per raggruppare le entità nelle colonne. Aggiungi una proprietà enum allo schema della tua collezione per utilizzare questa vista.\",\n no_enum_values_configured: \"Nessun valore enumerativo configurato per \\\"{{property}}\\\"\",\n items_need_backfill: \"Alcuni elementi non hanno un ordine definito. Fai clic su 'Inizializza' per impostare l'ordine.\",\n kanban_order_not_configured: \"L'ordinamento drag-and-drop non è configurato. Imposta una proprietà di ordinamento nelle impostazioni della collezione per mantenere le posizioni delle schede.\",\n initialize: \"Inizializza\",\n confirm_multiple_delete: \"Conferma eliminazione multipla\",\n delete_entity_confirm_title: \"Eliminare '{{entityName}}'?\",\n multiple_deleted: \"Eliminazioni multiple\",\n some_entities_deleted: \"Alcune entità sono state eliminate, ma non tutte\",\n error_deleting_entities: \"Errore durante l'eliminazione delle entità\",\n deleted: \"eliminata\",\n\n /** Recently extracted strings for collection editor */\n /** AI Collection Generator Popover */\n generate_collection_with_ai: \"Genera collezione con AI\",\n modify_collection_with_ai: \"Modifica collezione con AI\",\n describe_collection_to_create: \"Descrivi la collezione che vuoi creare.\",\n describe_changes_to_make: \"Descrivi le modifiche che vuoi apportare a questa collezione.\",\n ai_placeholder_create: \"es. Crea una collezione di prodotti con nome, prezzo, descrizione e categoria...\",\n ai_placeholder_modify: \"es. Aggiungi un campo immagine in miniatura con archiviazione, rendi il prezzo obbligatorio...\",\n ai_assist: \"Assistente AI\",\n generating: \"Generazione in corso...\",\n\n this_is_subcollection_of: \"Questa è una sottocollezione di\",\n use_existing_paths_database: \"Utilizza i percorsi esistenti nel database\",\n describe_collection_ai: \"Descrivi la collezione per generarla con l'IA\",\n generate_with_ai: \"Genera con IA\",\n create_from_json_config: \"Crea da configurazione JSON\",\n paste_json_config: \"Incolla la configurazione JSON\",\n create_collection_from_file_formats: \"Crea collezione da file (CSV, Excel, JSON)\",\n select_template: \"Seleziona un modello\",\n products: \"Prodotti\",\n collection_products_subtitle: \"Gestisci i tuoi prodotti con prezzi, inventario e immagini\",\n collection_users_subtitle: \"Gestisci gli utenti registrati con i loro profili e ruoli\",\n blog_posts: \"Articoli del blog\",\n collection_blog_posts_subtitle: \"Crea e gestisci gli articoli del tuo blog\",\n pages: \"Pagine\",\n collection_pages_subtitle: \"Gestisci le pagine statiche del tuo sito\",\n continue_from_scratch: \"Continua da zero\",\n\n /** Admin views config */\n cms_users: \"Utenti CMS\",\n roles_menu: \"Ruoli\",\n project_settings: \"Impostazioni del progetto\",\n\n by_signing_in_you_agree_to_our: \"Accedendo accetti i nostri\",\n terms_and_conditions: \"Termini e Condizioni\",\n and_our: \"e la nostra\",\n privacy_policy: \"Informativa sulla privacy\",\n email_password: \"Email/password\",\n sign_in_with_google: \"Accedi con Google\",\n\n // --- Auth error messages ---\n auth_user_not_found: \"Utente non trovato\",\n auth_wrong_password: \"Password errata\",\n auth_user_disabled: \"Account disabilitato\",\n auth_account_exists_with_different_credential: \"Esiste già un account con questo indirizzo email ma con credenziali diverse\",\n auth_email_already_in_use: \"Questo indirizzo email è già in uso\",\n auth_google_permissions_required: \"Sono necessarie le autorizzazioni di Google\",\n auth_invalid_email_password: \"Email o password non valide\",\n auth_enter_email_first: \"Inserisci prima l'indirizzo email\",\n auth_password_reset_sent: \"Email di reimpostazione della password inviata\",\n auth_sign_in_account: \"Accedi al tuo account\",\n auth_create_new_account: \"Crea un nuovo account\",\n auth_password: \"Password\",\n auth_reset_password: \"Reimposta password\",\n auth_new_user: \"Nuovo utente\",\n auth_have_account: \"Hai già un account?\",\n auth_sign_in: \"Accedi\",\n auth_sign_up: \"Registrati\",\n\n\n auto_setup_collections_button: \"Configura le collezioni automaticamente\",\n auto_setup_collections_title: \"Configurazione automatica delle collezioni\",\n auto_setup_collections_desc: \"Configura le collezioni automaticamente in base ai dati Firestore esistenti. Lascia che Rebase configuri il CMS perfetto per te.\",\n this_can_take_a_minute: \"Potrebbe richiedere qualche minuto\",\n no_collections_found_to_setup: \"Nessuna collezione trovata da configurare\",\n collections_have_been_setup: \"Le collezioni sono state configurate\",\n error_setting_up_collections: \"Errore durante la configurazione delle collezioni\",\n add_your: \"Aggiungi le tue\",\n database_collections: \"collezioni del database\",\n no_unmapped_collections: \"Nessuna collezione non mappata\",\n query_and_update_with_datatalk: \"Interroga e aggiorna i tuoi dati in linguaggio naturale con DATATALK\",\n welcome_to_rebase: \"Benvenuto in Rebase Cloud\",\n admin_panel_ready_bring_data: \"Il tuo pannello è pronto. Inizia aggiungendo i tuoi dati.\",\n admin_panel_ready_get_started: \"Il tuo pannello è pronto. Ecco come iniziare.\",\n auto_detect_collections: \"Rileva automaticamente le collezioni\",\n auto_detect_collections_desc: \"Rebase analizzerà i tuoi dati Firestore e configurerà automaticamente le collezioni per te\",\n create_a_collection: \"Crea una collezione\",\n create_collection_desc: \"Definisci manualmente la struttura della tua collezione\",\n read_the_docs: \"Leggi la documentazione\",\n read_the_docs_desc: \"Scopri come usare Rebase al meglio\",\n explore_docs: \"Esplora la documentazione\",\n want_to_customize_with_code: \"Vuoi personalizzare con il codice? Esegui\",\n to_scaffold_a_local_project: \"per creare un progetto locale\",\n\n // ─── Collection Editor — Validation ──────────────────────────\n validation: \"Validazione\",\n unique: \"Unico\",\n required_message: \"Messaggio campo obbligatorio\",\n required_tooltip: \"Non potrai salvare questa entità se questo valore non è impostato\",\n unique_tooltip: \"Non possono esistere più entità con lo stesso valore\",\n lowercase: \"Minuscolo\",\n uppercase: \"Maiuscolo\",\n trim: \"Rimuovi spazi\",\n exact_length: \"Lunghezza esatta\",\n min_length: \"Lunghezza min.\",\n max_length: \"Lunghezza max.\",\n matches_regex: \"Corrisponde a regex\",\n not_valid_regexp: \"Espressione regolare non valida\",\n regex_helper: \"es. /^\\\\d+$/ solo per cifre\",\n min_value: \"Valore min.\",\n max_value: \"Valore max.\",\n less_than: \"Minore di\",\n more_than: \"Maggiore di\",\n positive_value: \"Valore positivo\",\n negative_value: \"Valore negativo\",\n integer_value: \"Valore intero\",\n\n // ─── Collection Editor — Property Edit ───────────────────────\n invalid_regular_expression: \"Espressione regolare non valida\",\n must_specify_target_collection: \"Devi specificare una collezione di destinazione per il campo\",\n need_specify_repeat_field: \"Devi specificare un campo di ripetizione\",\n need_specify_block_properties: \"Devi specificare le proprietà di questo blocco\",\n incomplete_condition: \"Condizione incompleta - seleziona un campo\",\n field_name: \"Nome del campo\",\n\n // ─── Collection Editor — Display & Config ────────────────────\n kanban_column_property: \"Proprietà colonna Kanban\",\n select_a_property: \"Seleziona una proprietà\",\n kanban_property_not_found: \"La proprietà \\\"{{property}}\\\" non esiste o non è una proprietà string con enum. Seleziona una proprietà valida o cancella la selezione.\",\n no_enum_string_properties: \"Nessuna proprietà string con enum trovata. Aggiungi una proprietà string con enumValues per usare la vista Kanban.\",\n kanban_column_description: \"Seleziona una proprietà string con valori enum per raggruppare le entità in colonne\",\n create_property: \"+ Crea proprietà \\\"{{property}}\\\"\",\n order_property: \"Proprietà di ordinamento\",\n order_property_not_found: \"La proprietà \\\"{{property}}\\\" non esiste o non è una proprietà numerica. Seleziona una proprietà valida o cancella la selezione.\",\n no_number_properties: \"Nessuna proprietà numerica trovata. Aggiungi una proprietà numerica per abilitare l'ordinamento.\",\n order_property_description: \"Seleziona una proprietà numerica per mantenere l'ordine degli elementi\",\n display_settings: \"Impostazioni di visualizzazione\",\n default_row_size: \"Dimensione riga predefinita\",\n side_dialog_width: \"Larghezza del dialogo laterale\",\n side_dialog_width_description: \"Definisci opzionalmente la larghezza (in pixel) del dialogo laterale delle entità. Il valore predefinito è 768px\",\n inline_editing_enabled: \"I dati possono essere modificati direttamente nella vista tabella\",\n inline_editing_disabled: \"I dati possono essere modificati solo nella vista modulo\",\n inline_editing_description: \"Consenti la modifica dei dati direttamente nella vista tabella, senza aprire la vista modulo.\",\n include_json_view: \"Includi vista JSON\",\n no_json_view: \"Non includere vista JSON\",\n json_view_description: \"Includi la rappresentazione JSON del documento.\",\n not_found_suffix: \"non trovato\",\n\n // ─── Editor ─────────────────────────────────────────────────\n editor_text: \"Testo\",\n editor_text_description: \"Inizia a digitare con testo semplice.\",\n editor_heading_1: \"Intestazione 1\",\n editor_heading_1_description: \"Intestazione di sezione grande.\",\n editor_heading_2: \"Intestazione 2\",\n editor_heading_2_description: \"Intestazione di sezione media.\",\n editor_heading_3: \"Intestazione 3\",\n editor_heading_3_description: \"Intestazione di sezione piccola.\",\n editor_todo_list: \"Lista di cose da fare\",\n editor_todo_list_description: \"Tieni traccia delle attività con una lista di cose da fare.\",\n editor_bullet_list: \"Elenco puntato\",\n editor_bullet_list_description: \"Crea un semplice elenco puntato.\",\n editor_numbered_list: \"Elenco numerato\",\n editor_numbered_list_description: \"Crea un elenco con numerazione.\",\n editor_quote: \"Citazione\",\n editor_quote_description: \"Cattura una citazione.\",\n editor_code: \"Codice\",\n editor_code_description: \"Cattura un frammento di codice.\",\n editor_image: \"Immagine\",\n editor_image_description: \"Carica un'immagine dal tuo computer.\",\n editor_multiple: \"Multiplo\",\n editor_link: \"Link\",\n editor_save: \"Salva\",\n editor_cancel: \"Annulla\",\n editor_remove_link: \"Rimuovi link\",\n editor_paste_or_type_link: \"Incolla o digita il link\",\n editor_open_in_new_window: \"Apri in una nuova finestra\",\n editor_bold: \"Grassetto\",\n editor_italic: \"Corsivo\",\n editor_underline: \"Sottolineato\",\n editor_strikethrough: \"Barrato\",\n editor_autocomplete: \"Completamento automatico\",\n editor_autocomplete_description: \"Aggiungi testo basato sul contesto.\",\n\n settings_heading: \"Impostazioni\",\n settings_project_name: \"Nome del progetto\",\n settings_default_language: \"Lingua predefinita\",\n settings_default_language_caption: \"Seleziona la lingua di base per questo progetto. Gli utenti possono modificare questa preferenza nelle impostazioni personali.\",\n settings_enable_local_text_search: \"Abilita la ricerca testuale locale\",\n settings_local_text_search_caption: \"Abilita la ricerca testuale locale per tutte le collezioni. Questo ti permetterà di cercare campi di testo nelle collezioni utilizzando la barra di ricerca di Rebase. Tieni presente che questa funzionalità può comportare un numero maggiore di letture, poiché verranno indicizzati tutti i campi di testo delle tue collezioni.\",\n settings_doc_history_all_collections: \"Cronologia documenti abilitata per tutte le collezioni\",\n settings_doc_history_caption: \"Quando attivato, tutte le collezioni avranno la cronologia abilitata per impostazione predefinita. Puoi modificare questa impostazione per ogni singola collezione. La cronologia verrà salvata nella sottocollezione __history di ogni documento.\",\n settings_theme: \"Tema\",\n settings_primary_color: \"Colore primario\",\n settings_secondary_color: \"Colore secondario\",\n settings_sample_theme_components: \"Componenti di esempio del tema\",\n settings_drag_drop_logo: \"Trascina e rilascia il tuo logo qui\",\n settings_security_rules: \"Regole di sicurezza\",\n settings_security_rules_description: \"Rebase utilizza le regole di sicurezza di Firebase per limitare l'accesso ai dati. Quando si crea un nuovo utente tramite Rebase, l'attributo personalizzato rebaseUser viene aggiunto all'utente nel progetto client. Aggiungendo le seguenti regole di sicurezza al tuo progetto, ti assicuri che gli utenti Rebase possano accedere ai dati tramite Rebase.\",\n settings_security_rules_add_domain: \"Ricorda di aggiungere il dominio {{domain}} ai domini consentiti del tuo provider\",\n settings_security_rules_caption: \"Queste regole limitano l'accesso ai dati solo agli utenti Rebase, ma non applicano i permessi a livello di database. I permessi vengono applicati nel frontend, il che funziona bene per la maggior parte dei progetti. Se hai bisogno di applicare i permessi a livello di database, puoi modificare queste regole di sicurezza. I ruoli assegnati a un utente vengono impostati come attributi personalizzati nel token di autenticazione Firebase, quindi puoi utilizzarli nelle tue regole di sicurezza.\",\n\n // ─── Text Search Dialog ─────────────────────────────────────\n text_search_dialog_title: \"Abilita ricerca testuale\",\n text_search_local_not_recommended: \"La ricerca testuale locale non è consigliata per collezioni di grandi dimensioni.\",\n text_search_local_fetch_warning: \"Tieni presente che abilitando la ricerca testuale locale sarà necessario scaricare tutti i documenti dalla collezione e memorizzarli nel browser. Questo può essere inefficiente per collezioni grandi e può comportare costi aggiuntivi.\",\n text_search_external_suggestion: \"Per collezioni più grandi, ti consigliamo di utilizzare un motore di ricerca esterno come Algolia o Elastic Search e di assegnare un delegato di ricerca alla tua configurazione.\",\n text_search_local_description: \"La ricerca testuale locale è il modo più semplice per abilitare la ricerca testuale nella tua collezione. Carica tutti i documenti della collezione nel browser ed esegue la ricerca localmente. È l'opzione consigliata per le collezioni piccole.\",\n text_search_own_implementation: \"Hai implementato il tuo controller di ricerca testuale. Puoi abilitare la ricerca testuale per la tua collezione.\",\n text_search_enable_for_collection: \"Abilita per questa collezione\",\n text_search_enable_for_project: \"Abilita per il progetto\",\n text_search_enabled_snackbar: \"Ricerca testuale locale abilitata\",\n\n // ─── Missing keys (English placeholders — translate) ───\nno_filter: \"No filter\",\n is_true: \"is true\",\n is_false: \"is false\",\n error_uploading_file_size: \"Error uploading file: File is larger than {{maxSize}} bytes\",\n error_uploading_file_type: \"Error uploading file: File type is not supported\",\n drag_drop_files: \"Drag 'n' drop some files here, or click here to edit\",\n drag_drop_file: \"Drag 'n' drop a file here, or click here to edit\",\n select_reference: \"Select reference\",\n select_references: \"Select references\",\n account_settings: \"Account Settings\",\n profile: \"Profile\",\n sessions: \"Sessions\",\n display_name: \"Display Name\",\n photo_url: \"Photo URL\",\n save_profile: \"Save Profile\",\n saving: \"Saving...\",\n no_active_sessions: \"No active sessions found.\",\n revoking: \"Revoking...\",\n revoke_all_sessions: \"Revoke All Sessions\",\n unknown_device: \"Unknown Device\",\n current: \"Current\",\n role_id: \"Role ID\",\n role_name: \"Role Name\",\n add_reference: \"Add reference\",\n add_reference_to: \"Add reference to {{name}}\",\n role_deleted_successfully: \"Role deleted successfully\",\n error_deleting_role: \"Error deleting role\",\n collection_permissions: \"Collection permissions\",\n collection: \"Collection\",\n no_collections_configured: \"No collections configured\",\n no_security_rules_defined: \"No security rules defined — all operations unrestricted\",\n no_rules: \"no rules\",\n bootstrap_admin_success: \"You are now an admin! Refreshing...\",\n failed_to_bootstrap_admin: \"Failed to bootstrap admin\",\n user_deleted_successfully: \"User deleted successfully\",\n error_deleting_user: \"Error deleting user\",\n add_row_before: \"Add row before\",\n add_row_after: \"Add row after\",\n delete_row: \"Delete row\",\n add_column_before: \"Add column before\",\n add_column_after: \"Add column after\",\n delete_column: \"Delete column\",\n delete_table: \"Delete table\",\n alt_text: \"Alt text\",\n title: \"Title\",\n a_property_of_this_map_has_error: \"A property of this map has an error\",\n studio_sql_executing_query: \"EXECUTING QUERY...\",\n studio_sql_query_error: \"Query Error\",\n studio_sql_run_query_placeholder: \"Run a query to see results\",\n studio_sql_visual_execution_plan: \"Visual Execution Plan\",\n studio_sql_success: \"SUCCESS\",\n studio_sql_no_results: \"Query executed successfully but returned no results.\",\n studio_sql_rows: \"Rows:\",\n studio_sql_time: \"Time:\",\n studio_sql_copy_markdown: \"Copy Markdown\",\n studio_sql_export_json: \"Export JSON\",\n studio_sql_export_csv: \"Export CSV\",\n studio_sql_format_sql: \"Format SQL\",\n studio_sql_explain: \"Explain\",\n studio_sql_limit_1000: \"Limit 1000\",\n studio_sql_remove_from_favorites: \"Remove from Favorites\",\n studio_sql_add_to_favorites: \"Add to Favorites\",\n studio_sql_save: \"Save\",\n studio_sql_run: \"Run\",\n studio_sql_database: \"Database\",\n studio_sql_role: \"Role\",\n studio_sql_admin: \"(Admin)\",\n studio_sql_select_db: \"Select DB\",\n studio_sql_query_results: \"Query Results\",\n studio_sql_save_snippet: \"Save SQL Snippet\",\n studio_sql_snippet_name: \"Snippet Name\",\n studio_sql_snippet_name_placeholder: \"e.g., Get All Users\",\n studio_sql_snippet_saved_local: \"This will be saved to your local storage.\",\n studio_sql_cancel: \"Cancel\",\n studio_sql_dangerous_operation: \"Dangerous Operation Detected\",\n studio_sql_dangerous_operation_body: \"The query you are about to run contains potentially destructive operations (DELETE, DROP, TRUNCATE, or UPDATE without WHERE). Are you sure you want to proceed?\",\n studio_sql_snippet_saved: \"Snippet \\\"{{name}}\\\" saved.\",\n studio_sql_markdown_copied: \"Results copied as Markdown!\",\n studio_sql_markdown_copy_failed: \"Failed to copy Markdown to clipboard.\",\n studio_sql_row_updated: \"Row updated successfully.\",\n studio_sql_cannot_edit_missing_query: \"Cannot edit rows: The underlying query is missing.\",\n studio_sql_cannot_resolve_table: \"Could not resolve table/primary key\",\n studio_sql_missing_pk: \"Row is missing primary key column(s): {{columns}}. Cannot safely update.\",\n studio_sql_update_failed: \"Failed to update: {{message}}\",\n studio_sql_execution_not_supported: \"SQL execution is not supported by the current data source.\",\n studio_sql_error_executing: \"An error occurred while executing the query.\",\n studio_sql_error_explaining: \"An error occurred while explaining the query.\",\n studio_sql_save_first_to_favorite: \"Please save the snippet first before favoriting.\",\n studio_sql_cms: \"Collections:\",\n studio_sql_cms_collections_tooltip: \"Tables in this query that are mapped as CMS collections\",\n studio_sql_edit_entity: \"Edit {{name}} #{{id}}\",\n studio_sql_sql_not_supported: \"SQL execution not supported by this data source\",\n studio_sql_fetch_error: \"Failed to fetch connection options: {{message}}\",\n studio_sql_unexpected_format: \"Unexpected data format: {{type}}\",\n studio_sql_no_tables: \"No tables found in this database.\",\n studio_sql_schema_fetch_error: \"Failed to fetch schema: {{message}}\",\n studio_sql_sidebar_snippets: \"Snippets\",\n studio_sql_sidebar_history: \"History\",\n studio_sql_sidebar_schema: \"Schema\",\n studio_sql_sidebar_no_snippets: \"No saved snippets\",\n studio_sql_sidebar_save_snippet_hint: \"Save a query to access it here.\",\n studio_sql_sidebar_no_history: \"No history\",\n studio_sql_sidebar_history_hint: \"Executed queries will appear here.\",\n studio_sql_sidebar_delete_snippet: \"Delete snippet\",\n studio_schema_tables: \"Tables\",\n studio_schema_loading: \"Loading schema...\",\n studio_schema_no_tables: \"No tables found\",\n studio_schema_retry: \"Retry\",\n studio_schema_primary_key: \"Primary Key\",\n studio_schema_select_all: \"SELECT * FROM\",\n studio_schema_insert_into: \"INSERT INTO\",\n studio_schema_update: \"UPDATE\",\n studio_schema_delete_from: \"DELETE FROM\",\n studio_schema_columns: \"{{count}} columns\",\n studio_rls_title: \"Row Level Security\",\n studio_rls_description: \"Manage RLS policies for your tables\",\n studio_rls_enabled: \"RLS Enabled\",\n studio_rls_disabled: \"RLS Disabled\",\n studio_rls_no_rls: \"No RLS\",\n studio_rls_enable_rls: \"Enable RLS\",\n studio_rls_disable_rls: \"Disable RLS\",\n studio_rls_create_policy: \"Create Policy\",\n studio_rls_policies: \"Policies\",\n studio_rls_no_policies: \"No policies defined\",\n studio_rls_no_policies_desc: \"This table has no RLS policies. All rows are accessible based on the RLS status.\",\n studio_rls_add_first_policy: \"Add your first policy\",\n studio_rls_force_rls: \"Force RLS\",\n studio_rls_force_rls_desc: \"When enabled, RLS policies apply to the table owner as well.\",\n studio_rls_enable_force_rls: \"Enable Force RLS\",\n studio_rls_disable_force_rls: \"Disable Force RLS\",\n studio_rls_edit: \"Edit\",\n studio_rls_delete: \"Delete\",\n studio_rls_confirm_delete_title: \"Delete Policy\",\n studio_rls_confirm_delete_body: \"Are you sure you want to delete this policy? This action cannot be undone.\",\n studio_rls_confirm_enable_title: \"Enable Row Level Security\",\n studio_rls_confirm_enable_body: \"Enabling RLS will restrict access to rows in this table based on your policies. Make sure you have appropriate policies in place.\",\n studio_rls_confirm_disable_title: \"Disable Row Level Security\",\n studio_rls_confirm_disable_body: \"Disabling RLS will make all rows accessible to all roles. Are you sure you want to continue?\",\n studio_rls_select_table: \"Select a table\",\n studio_rls_no_tables: \"No tables available\",\n studio_rls_error: \"Error loading policies\",\n studio_rls_retry: \"Retry\",\n studio_rls_loading: \"Loading policies...\",\n studio_policy_edit: \"Edit Policy\",\n studio_policy_create: \"Create New Policy\",\n studio_policy_defining_rules: \"Defining access rules for\",\n studio_policy_cancel: \"Cancel\",\n studio_policy_save: \"Save Policy\",\n studio_policy_template: \"Start from a template (Optional)\",\n studio_policy_select_template: \"Select a template...\",\n studio_policy_name: \"Policy Name\",\n studio_policy_name_placeholder: \"Give your policy a descriptive name\",\n studio_policy_behavior: \"Policy Behavior\",\n studio_policy_permissive: \"Permissive\",\n studio_policy_permissive_desc: \"Combined using \\\"OR\\\"\",\n studio_policy_restrictive: \"Restrictive\",\n studio_policy_restrictive_desc: \"Combined using \\\"AND\\\"\",\n studio_policy_command: \"Policy Command\",\n studio_policy_target_roles: \"Target Roles\",\n studio_policy_roles_placeholder: \"Select roles (defaults to public)\",\n studio_policy_using_expr: \"USING expression\",\n studio_policy_using_expr_desc: \"Applies to existing rows (SELECT, UPDATE, DELETE)\",\n studio_policy_check_expr: \"WITH CHECK expression\",\n studio_policy_check_expr_desc: \"Applies to new or modified rows (INSERT, UPDATE)\",\n studio_policy_help_title: \"Row Level Security (RLS) Guide\",\n studio_policy_help_intro: \"Row Level Security (RLS) allows you to restrict which rows a user can access or modify based on their authentication status or roles.\",\n studio_policy_help_step1_title: \"1. Select a Template\",\n studio_policy_help_step1_desc: \"If you're new to RLS, the easiest way to start is by selecting a predefined template from the dropdown. It will automatically configure the policy for common use cases like \\\"Users can update their own rows\\\".\",\n studio_policy_help_step2_title: \"2. Target Roles\",\n studio_policy_help_step2_desc: \"Choose which users the policy applies to:\",\n studio_policy_help_role_public: \"Applies to everyone (logged in or not).\",\n studio_policy_help_role_authenticated: \"Only applies to users who are logged in.\",\n studio_policy_help_role_anon: \"Only applies to users who are NOT logged in.\",\n studio_policy_help_step3_title: \"3. USING Expression\",\n studio_policy_help_step3_desc: \"A SQL condition that must evaluate to true for existing rows to be visible or updatable (SELECT, UPDATE, DELETE).\",\n studio_policy_help_step3_example: \"Ensures users can only see rows where they are the owner.\",\n studio_policy_help_step4_title: \"4. WITH CHECK Expression\",\n studio_policy_help_step4_desc: \"A SQL condition that must evaluate to true for new or modified rows to be saved (INSERT, UPDATE).\",\n studio_policy_help_step4_example: \"Usually the same as the USING expression when users are only allowed to insert/edit their own data.\",\n studio_policy_help_auth_vars_title: \"Rebase Auth Variables\",\n studio_policy_help_auth_vars_desc: \"Rebase provides native helper functions that you can use in your expressions:\",\n studio_policy_help_auth_uid: \"Returns the current user's ID as text. Example:\",\n studio_policy_help_auth_jwt: \"Returns the full JWT payload as JSONB so you can check custom claims. Example:\",\n studio_policy_help_auth_roles: \"Returns the user's role IDs as a comma-separated string. Best used with:\",\n studio_policy_help_docs_cta: \"To learn more about Postgres policies, check out the official documentation.\",\n studio_policy_help_read_docs: \"Read Docs\",\n studio_policy_help_got_it: \"Got it!\",\n studio_add_kanban_column: \"Add column\",\n studio_add_kanban_column_title: \"Add Kanban Column\",\n studio_add_kanban_column_name: \"Column name\",\n studio_add_kanban_column_name_placeholder: \"New column name\",\n studio_add_kanban_column_add: \"Add\",\n studio_add_kanban_column_cancel: \"Cancel\",\n studio_collection_view_sql: \"SQL Editor\",\n studio_collection_view_cms: \"CMS View\",\n studio_editor_collection_tooltip: \"Edit collection schema\",\n studio_editor_collection_no_permission: \"You don't have permission to edit this collection\",\n studio_editor_collection_start_tooltip: \"Copy path or edit schema\",\n studio_editor_collection_start_no_permission: \"You don't have permission to modify this collection\",\n studio_editor_collection_start_copied: \"Copied!\",\n studio_editor_entity_tooltip: \"Edit entity schema\",\n studio_editor_entity_no_permission: \"You don't have permission to edit this entity\",\n studio_home_edit_collection: \"Edit collection\",\n studio_home_delete_collection: \"Delete collection\",\n studio_home_confirm_delete_title: \"Delete collection?\",\n studio_home_confirm_delete_body: \"Are you sure you want to delete the collection \\\"{{name}}\\\"? This action cannot be undone.\",\n studio_kanban_setup: \"Kanban Setup\",\n studio_missing_reference: \"Missing reference: {{path}}\",\n studio_missing_reference_create: \"Create\",\n studio_new_collection: \"New collection\",\n studio_new_collection_card: \"New collection\",\n studio_new_collection_no_permission: \"You don't have permissions to create collections\",\n studio_property_add_column: \"Add new property\",\n studio_property_add_column_no_permission: \"You don't have permission to add new properties\",\n studio_add_kanban_column_desc: \"Add a new option to the \\\"{{property}}\\\" property. This will create a new column in the Kanban board.\",\n studio_add_kanban_column_adding: \"Adding...\",\n studio_collection_view_edit: \"Edit\",\n studio_editor_collection_disabled: \"Collection editing is disabled\",\n studio_editor_collection_edit: \"Edit collection\",\n studio_editor_entity_save_first: \"You need to save the document before changing the schema\",\n studio_editor_entity_edit_schema: \"Edit schema for this form\",\n studio_editor_collection_start_save_filter: \"Save default filter and sort\",\n studio_editor_collection_start_clear_filter: \"Clear default filter and sort\",\n studio_editor_collection_start_reset_filter: \"Reset to default filter and sort\",\n studio_editor_collection_start_saved: \"Default config saved\",\n studio_home_duplicate_collection: \"Duplicate\",\n studio_home_delete: \"Delete\",\n studio_home_confirm_delete_no_data: \"This will not delete any data, only the collection in the CMS\",\n studio_home_collection_deleted: \"Collection deleted\",\n studio_kanban_configure: \"Configure Kanban\",\n studio_missing_reference_error: \"No collection for path: {{path}}\",\n studio_new_collection_add: \"Aggiungi nuova collezione\",\n\n // ─── Property field labels ──────────────────────────────────\n db_column_type: \"Tipo di colonna del database\",\n primary_key_unique_id: \"Chiave primaria / ID univoco\",\n spread_children_as_columns: \"Espandi i figli come colonne\",\n mode: \"Modalità\",\n timezone: \"Fuso orario\",\n target_collection: \"Collezione di destinazione\",\n\n // ─── Storage property ───────────────────────────────────────\n storage_file_name: \"Nome del file\",\n storage_path: \"Percorso di archiviazione\",\n storage_max_size: \"Dimensione massima (in byte)\",\n storage_resize_mode: \"Modalità di ridimensionamento\",\n storage_output_format: \"Formato di output\",\n storage_max_width: \"Larghezza massima (px)\",\n storage_max_height: \"Altezza massima (px)\",\n storage_quality: \"Qualità (0-100)\",\n storage_file_upload_config: \"Configurazione caricamento file\",\n storage_image_resize_config: \"Configurazione ridimensionamento immagine\",\n storage_all_file_types: \"Tutti i tipi di file consentiti\",\n storage_allowed_file_types: \"Tipi di file consentiti\",\n storage_include_bucket_url: \"Includi URL del bucket (s3://...) nel valore salvato\",\n storage_save_url: \"Salva URL invece del percorso di archiviazione\",\n\n // ─── DateTime property ──────────────────────────────────────\n datetime_automatic_value: \"Valore automatico\",\n\n // ─── Markdown property ──────────────────────────────────────\n markdown_paste_behavior: \"Comportamento incolla\",\n markdown_strip_html: \"Rimuovi HTML all'incolla\",\n markdown_convert_pasted: \"Converti testo incollato in markdown\"\n};\n","import { RebaseTranslations } from \"@rebasepro/types\";\n\nexport const hi: RebaseTranslations = {\n // ─── Form actions ────────────────────────────────────────────\n save: \"सहेजें\",\n create: \"बनाएं\",\n create_copy: \"प्रतिलिपि बनाएं\",\n save_and_close: \"सहेजें और बंद करें\",\n create_copy_and_close: \"प्रतिलिपि बनाएं और बंद करें\",\n create_and_close: \"बनाएं और बंद करें\",\n discard: \"रद्द करें (Discard)\",\n clear: \"साफ़ करें\",\n cancel: \"रद्द करें (Cancel)\",\n\n // ─── Entity actions ──────────────────────────────────────────\n edit: \"संपादित करें\",\n copy: \"कॉपी करें\",\n delete: \"हटाएं\",\n delete_not_allowed: \"आपने कम से कम एक ऐसी इकाई चुनी है जिसे आप हटा नहीं सकते\",\n\n // ─── Delete dialog ───────────────────────────────────────────\n delete_confirmation_title: \"हटाएं?\",\n delete_confirmation_body: \"इससे इकाई (entity) हटा दी जाएगी। क्या आप सुनिश्चित हैं?\",\n delete_multiple_confirmation_body: \"इससे चयनित इकाइयां (entities) हटा दी जाएंगी। क्या आप सुनिश्चित हैं?\",\n\n // ─── Unsaved-changes dialog ───────────────────────────────────\n unsaved_changes_title: \"सहेजे नहीं गए परिवर्तन\",\n unsaved_changes_body: \"आपके पास सहेजे नहीं गए परिवर्तन हैं। क्या आप उन्हें रद्द करना चाहते हैं?\",\n discard_changes: \"परिवर्तन रद्द करें\",\n keep_editing: \"संपादन जारी रखें\",\n clear_form: \"फ़ॉर्म साफ़ करें?\",\n discard_changes_confirmation: \"सभी सहेजे नहीं गए परिवर्तन खो जाएँगे। इसे पूर्ववत नहीं किया जा सकता।\",\n clear_form_confirmation: \"सभी दर्ज किए गए मान साफ़ कर दिए जाएँगे। इसे पूर्ववत नहीं किया जा सकता।\",\n\n // ─── Collection table / toolbar ──────────────────────────────\n search: \"खोजें\",\n find_by_id: \"ID द्वारा खोजें\",\n find_entity_by_id: \"ID द्वारा इकाई खोजें\",\n filter: \"फ़िल्टर\",\n filters: \"फ़िल्टर\",\n clear_filter: \"फ़िल्टर साफ़ करें\",\n clear_filter_sort: \"फ़िल्टर/सॉर्ट साफ़ करें\",\n clear_sort: \"सॉर्ट साफ़ करें\",\n clear_all: \"सभी साफ़ करें\",\n no_items: \"कोई आइटम नहीं\",\n no_entries_found: \"कोई प्रविष्टि नहीं मिली\",\n all_entries_loaded: \"सभी {{count}} प्रविष्टियाँ लोड हो गईं\",\n create_your_first_entry: \"अपनी पहली प्रविष्टि बनाएं\",\n no_results_filter_sort: \"लागू किए गए फ़िल्टर/सॉर्ट के साथ कोई परिणाम नहीं\",\n no_results_search: \"\\\"{{search}}\\\" के लिए कोई परिणाम नहीं मिला\",\n add: \"जोड़ें\",\n remove: \"हटाएं\",\n multiple_entities: \"एकाधिक इकाइयां\",\n unsaved_changes: \"आपके पास {{collectionName}} में सहेजे नहीं गए परिवर्तन हैं।\",\n so_empty: \"इतना खाली...\",\n no_results: \"लागू किए गए फ़िल्टर/सॉर्ट के साथ कोई परिणाम नहीं\",\n refresh_data: \"डेटा रीफ़्रेश करें\",\n dark_mode: \"डार्क\",\n light_mode: \"लाइट\",\n system_mode: \"सिस्टम\",\n ok: \"ठीक है\",\n save_collection_config: \"संग्रह संरचना सहेजें\",\n search_for_more_icons: \"और आइकन खोजें…\",\n ai_modified: \"AI द्वारा संशोधित\",\n size_label: \"आकार\",\n group_by: \"इसके द्वारा समूहित करें\",\n initialize_kanban_order: \"कानबन क्रम प्रारंभ करें\",\n copy_id: \"ID कॉपी करें\",\n add_specific: \"विशिष्ट {{name}} जोड़ें\",\n select_specific: \"विशिष्ट {{name}} चुनें\",\n select_from: \"{{name}} से चुनें\",\n done: \"हो गया\",\n log_out: \"लॉग आउट\",\n column_cannot_be_edited: \"इस कॉलम को सीधे संपादित नहीं किया जा सकता\",\n close: \"बंद करें\",\n unsaved_local_changes: \"सहेजे नहीं गए स्थानीय परिवर्तन\",\n unsaved_local_changes_description: \"इस दस्तावेज़ को स्थानीय स्तर पर संपादित किया गया था और इसमें सहेजे नहीं गए परिवर्तन हैं। यदि आप इन्हें लागू नहीं करते हैं तो ये स्थानीय परिवर्तन खो जाएंगे।\",\n preview_changes: \"परिवर्तनों का पूर्वावलोकन करें\",\n apply_changes: \"परिवर्तन लागू करें\",\n discard_local_changes: \"स्थानीय परिवर्तन रद्द करें\",\n preview_local_changes: \"स्थानीय परिवर्तनों का पूर्वावलोकन करें\",\n preview_local_changes_description: \"ये वे स्थानीय परिवर्तन हैं जिन्हें फॉर्म पर लागू किया जाएगा।\",\n type: \"प्रकार\",\n string: \"स्ट्रिंग\",\n number: \"नंबर\",\n boolean: \"बूलियन\",\n date: \"दिनांक\",\n map: \"मैप\",\n array: \"ऐरे\",\n arrays_of_arrays_not_supported: \"ऐरे के ऐरे समर्थित नहीं हैं।\",\n data_type_not_supported: \"डेटा प्रकार {{dataType}} अभी समर्थित नहीं है\",\n passkey_error_unsupported: \"आपका डिवाइस या ब्राउज़र पासकी का समर्थन नहीं करता है।\",\n\n // ─── Entity form feedback ─────────────────────────────────────\n saved_correctly: \"सफलतापूर्वक सहेजा गया\",\n error_before_saving: \"डेटा तैयार करने में त्रुटि\",\n error_after_saving: \"सहेजने के बाद की प्रक्रिया में त्रुटि\",\n error_saving_entity: \"प्रविष्टि सहेजने में त्रुटि\",\n entity_does_not_exist: \"यह प्रविष्टि डेटाबेस में मौजूद नहीं है\",\n form_modified: \"इस फ़ॉर्म में बदलाव किए गए हैं\",\n form_in_sync: \"वर्तमान फ़ॉर्म डेटाबेस के साथ सिंक में है\",\n fix_errors_before_saving: \"सहेजने से पहले हाइलाइट की गई त्रुटियों को ठीक करें\",\n\n admin: \"एडमिन\",\n home: \"होम\",\n this_form_has_errors: \"इस फॉर्म में त्रुटियाँ हैं\",\n error_loading_navigation: \"नेविगेशन लोड करने में त्रुटि\",\n error_loading_auth: \"प्रमाणीकरण लोड करने में त्रुटि\",\n this_form_has_been_modified: \"इस फॉर्म को संशोधित किया गया है\",\n current_form_in_sync: \"वर्तमान फॉर्म डेटाबेस के साथ सिंक में है\",\n open_in_console: \"कंसोल में खोलें\",\n collection_does_not_exist: \"निर्दिष्ट संग्रह मौजूद नहीं है। कंसोल चेक करें\",\n unexpected_value: \"अप्रत्याशित मान\",\n unexpected_value_click_to_edit: \"अप्रत्याशित मान। संपादित करने के लिए क्लिक करें\",\n unexpected_reference_value: \"अप्रत्याशित संदर्भ मान। संपादित करने के लिए क्लिक करें\",\n copy_url_to_clipboard: \"क्लिपबोर्ड पर URL कॉपी करें\",\n open_image_in_new_tab: \"नई टैब में छवि खोलें\",\n reference_not_set: \"संदर्भ सेट नहीं है\",\n reference_does_not_exist: \"संदर्भ मौजूद नहीं है\",\n entity_not_found: \"इकाई नहीं मिली\",\n file_not_found: \"फ़ाइल नहीं मिली\",\n unsaved_changes_in_entity: \"आपके पास इस इकाई में सहेजे नहीं गए परिवर्तन हैं।\",\n delete_this_role: \"यह भूमिका हटाएं\",\n no_roles_yet: \"आपके पास अभी तक कोई भूमिका नहीं है।\",\n create_default_roles: \"डिफ़ॉल्ट भूमिकाएँ बनाएँ\",\n delete_role_confirmation: \"क्या आप वाकई इस भूमिका को हटाना चाहते हैं?\",\n delete_this_user: \"इस उपयोगकर्ता को हटाएं\",\n no_users_yet: \"अभी तक कोई उपयोगकर्ता नहीं है\",\n add_logged_user_as_admin: \"लॉग इन उपयोगकर्ता को एडमिन के रूप में जोड़ें\",\n add_current_user_as_admin: \"वर्तमान उपयोगकर्ता को एडमिन के रूप में जोड़ें\",\n create_default_roles_and_add_admin: \"डिफ़ॉल्ट भूमिकाएँ बनाएं और वर्तमान उपयोगकर्ता को एडमिन के रूप में जोड़ें\",\n delete_user_confirmation: \"क्या आप वाकई इस उपयोगकर्ता को हटाना चाहते हैं?\",\n create_your_users_and_roles: \"अपने उपयोगकर्ता और भूमिकाएँ बनाएँ\",\n no_users_or_roles_defined: \"आपके पास कोई उपयोगकर्ता या भूमिका परिभाषित नहीं है। आप डिफ़ॉल्ट भूमिकाएँ बना सकते हैं और वर्तमान उपयोगकर्ता को एडमिन के रूप में जोड़ सकते हैं।\",\n no_permission_to_view_users: \"आपको उपयोगकर्ताओं को देखने की अनुमति नहीं है\",\n no_permission_to_view_roles: \"आपको भूमिकाओं को देखने की अनुमति नहीं है\",\n no_permission_description: \"यदि आपको इस अनुभाग तक पहुँच की आवश्यकता है तो किसी व्यवस्थापक से संपर्क करें।\",\n save_before_changing_schema: \"स्कीमा बदलने से पहले आपको दस्तावेज़ सहेजना होगा\",\n edit_schema_for_this_form: \"इस फॉर्म के लिए स्कीमा संपादित करें\",\n no_permissions_to_edit_collection: \"आपके पास इस संग्रह को संपादित करने की अनुमति नहीं है\",\n browser_does_not_support_audio: \"आपका ब्राउज़र ऑडियो तत्व का समर्थन नहीं करता है।\",\n user_not_found: \"उपयोगकर्ता नहीं मिला: {{value}}\",\n\n // ─── Collection view actions ──────────────────────────────────\n delete_selected: \"चयनित हटाएं\",\n cannot_delete_selected: \"आपने कम से कम एक इकाई का चयन किया है जिसे आप हटा नहीं सकते\",\n\n // ─── Array / field containers ─────────────────────────────────\n add_entry: \"जोड़ें\",\n add_on_top: \"शीर्ष पर जोड़ें\",\n add_below: \"नीचे जोड़ें\",\n add_to_field: \"{{fieldName}} में जोड़ें\",\n value: \"मान\",\n key: \"कुंजी\",\n drag_drop_multiple: \"कुछ फ़ाइलों को यहां खींचें और छोड़ें, या फ़ाइलों का चयन करने के लिए क्लिक करें। पुन: क्रमबद्ध करने के लिए खींचें।\",\n drag_drop_single: \"किसी फ़ाइल को यहां खींचें और छोड़ें, या किसी एक का चयन करने के लिए क्लिक करें\",\n\n // ─── Navigation / scaffold ────────────────────────────────────\n open_menu: \"मेनू खोलें\",\n close_drawer: \"ड्रॉअर बंद करें\",\n navigation_drawer: \"नेविगेशन ड्रॉअर\",\n collapse: \"संक्षिप्त करें\",\n expand: \"विस्तार करें\",\n\n // ─── Error states ─────────────────────────────────────────────\n error: \"त्रुटि\",\n error_uploading_file: \"फ़ाइल अपलोड करने में त्रुटि\",\n error_deleting: \"हटाने में त्रुटि\",\n error_before_delete: \"हटाने से पहले त्रुटि\",\n error_updating_asset: \"एसेट अपडेट करने में त्रुटि\",\n error_deleting_asset: \"एसेट हटाने में त्रुटि\",\n error_firestore_index: \"इस क्वेरी के लिए Firestore इंडेक्स आवश्यक है।\",\n create_index: \"इंडेक्स बनाएं\",\n value_is_not_reference: \"मान एक संदर्भ नहीं है।\",\n click_to_edit: \"संपादित करने के लिए क्लिक करें\",\n data_is_not_array_of_references: \"डेटा संदर्भों का ऐरे नहीं है\",\n\n // ─── Misc ─────────────────────────────────────────────────────\n loading: \"लोड हो रहा है\",\n local_changes_applied: \"स्थानीय परिवर्तन फॉर्म पर लागू किए गए\",\n local_changes_discarded: \"स्थानीय परिवर्तन रद्द किए गए\",\n are_you_sure_leave: \"क्या आप वाकई इस पृष्ठ को छोड़ना चाहते हैं?\",\n see_console_details: \"अधिक विवरण के लिए कंसोल देखें।\",\n drop_here_create_group: \"नया समूह बनाने के लिए यहां छोड़ें\",\n filter_for_null_values: \"रिक्त (नल्ल) मानों के लिए फ़िल्टर करें\",\n value_updated_elsewhere: \"इस मान को कहीं और अपडेट किया गया है\",\n add_property: \"विशेषता (प्रॉपर्टी) जोड़ें\",\n edit_name: \"{{name}} संपादित करें\",\n this_entity_not_exist: \"यह इकाई डेटाबेस में मौजूद नहीं है\",\n internal_error: \"आंतरिक त्रुटि (Internal ERROR)\",\n\n // ─── Rename group dialog ──────────────────────────────────────\n rename_group: \"समूह का नाम बदलें\",\n group_name_label: \"समूह का नाम\",\n group_name_empty_error: \"समूह का नाम खाली नहीं हो सकता।\",\n group_name_exists_error: \"यह समूह नाम पहले से मौजूद है।\",\n\n // ─── Search ───────────────────────────────────────────────────\n search_collections: \"संग्रह खोजें\",\n\n // ─── Navigation groups ────────────────────────────────────────\n views_group: \"दृश्य\",\n\n // ─── Entity Edit View ─────────────────────────────────────────\n youd_need_to_save_before_additional_collections: \"अतिरिक्त संग्रह जोड़ने से पहले आपको अपनी इकाई को सहेजना होगा\",\n\n // ─── Not Found Page ───────────────────────────────────────────\n page_not_found: \"पृष्ठ नहीं मिला\",\n page_not_found_body: \"यह पृष्ठ मौजूद नहीं है या आपके पास इस तक पहुंच नहीं हो सकती है\",\n back_to_home: \"होम पर वापस जाएँ\",\n\n // ─── Collection Editor ─────────────────────────────────────────\n default_collection_view: \"डिफ़ॉल्ट संग्रह दृश्य\",\n table_view: \"तालिका\",\n cards_view: \"कार्ड्स\",\n kanban_view: \"कानबन\",\n choose_how_entities_displayed_default: \"चुनें कि डिफ़ॉल्ट रूप से इकाइयां कैसे प्रदर्शित होनी चाहिए\",\n\n document_view: \"दस्तावेज़ दृश्य\",\n side_panel: \"साइड पैनल\",\n full_screen: \"पूरी स्क्रीन\",\n should_documents_opened_full_screen: \"क्या दस्तावेज़ों को फ़ुल स्क्रीन में या इनलाइन साइड डायलॉग में खोला जाना चाहिए\",\n\n select_custom_view: \"कस्टम दृश्य चुनें\",\n no_custom_views_defined: \"कोई कस्टम दृश्य परिभाषित नहीं है। इस डायलॉग का उपयोग करने से पहले कस्टमाइज़ेशन सेटिंग्स में अपने कस्टम दृश्य परिभाषित करें।\",\n\n select_custom_action: \"कस्टम कार्रवाई चुनें\",\n no_custom_actions_defined: \"कोई कस्टम कार्रवाई परिभाषित नहीं है। इस डायलॉग का उपयोग करने से पहले कस्टमाइज़ेशन सेटिंग्स में अपनी कस्टम कार्रवाइयाँ परिभाषित करें।\",\n\n no_collections_found: \"कोई संग्रह नहीं मिला\",\n start_building_collections: \"Rebase में आसानी से संग्रह बनाना शुरू करें। उन्हें अपने मौजूदा डेटाबेस डेटा पर मैप करें, फ़ाइलों से आयात करें या हमारे टेम्प्लेट का उपयोग करें।\",\n create_first_collection: \"अपना पहला संग्रह बनाएं\",\n define_collections_programmatically: \"आप संग्रहों को प्रोग्रामेटिक रूप से भी परिभाषित कर सकते हैं।\",\n edit_collection: \"संग्रह संपादित करें\",\n no_permissions_edit_collection: \"आपके पास इस संग्रह को संपादित करने की अनुमति नहीं है\",\n no_permissions_create_collection: \"आपके पास संग्रह बनाने की अनुमति नहीं है\",\n create_collection: \"संग्रह बनाएं\",\n update_collection: \"संग्रह अपडेट करें\",\n\n new_collection: \"नया संग्रह\",\n add_new_collection: \"नया संग्रह जोड़ें\",\n collection_with_name: \"{{name}} संग्रह\",\n change_icon: \"आइकन बदलें\",\n is_subcollection_of: \"यह इसका उपसंग्रह (subcollection) है\",\n name: \"नाम\",\n collection_name_description: \"इस संग्रह का नाम, आमतौर पर एक बहुवचन नाम (जैसे उत्पाद)\",\n path: \"पथ (Path)\",\n relative_path_to_parent: \"मूल (parent) का सापेक्ष पथ (मूल पथ को शामिल करने की आवश्यकता नहीं है)\",\n path_in_database: \"वह पथ जिसमें यह संग्रह संग्रहीत है, डेटाबेस में\",\n singular_name: \"एकवचन नाम\",\n singular_name_description: \"वैकल्पिक रूप से अपनी इकाइयों के लिए एकवचन नाम परिभाषित करें\",\n description: \"विवरण\",\n description_of_collection: \"संग्रह का विवरण, आप मार्कडाउन का उपयोग कर सकते हैं\",\n collection_id: \"संग्रह ID\",\n collection_id_description: \"यह ID इस संग्रह की पहचान करता है। आम तौर पर पथ के समान।\",\n collection_group: \"संग्रह समूह\",\n collection_group_description: \"एक संग्रह समूह में एक ही पथ वाले सभी संग्रह होते हैं। यह आपको एक साथ कई संग्रहों पर क्वेरी करने की अनुमति देता है।\",\n advanced_settings: \"उन्नत सेटिंग्स\",\n doc_history_global: \"दस्तावेज़ इतिहास संशोधन सक्षम (यदि विश्व स्तर पर सक्षम हैं)\",\n doc_history_enabled: \"दस्तावेज़ इतिहास संशोधन सक्षम\",\n doc_history_not_enabled: \"दस्तावेज़ इतिहास संशोधन सक्षम नहीं\",\n doc_history_description: \"सक्षम होने पर, इस संग्रह के प्रत्येक दस्तावेज़ में परिवर्तनों का इतिहास होगा। यह ऑडिटिंग उद्देश्यों के लिए उपयोगी है। डेटा आपके डेटाबेस में दस्तावेज़ के एक उपसंग्रह में संग्रहीत होता है, जिसे __history कहा जाता है।\",\n document_id_generation: \"दस्तावेज़ ID जनरेशन\",\n code_defined: \"कोड परिभाषित\",\n users_must_define_id: \"उपयोगकर्ताओं को एक ID परिभाषित करनी होगी\",\n users_can_define_id: \"उपयोगकर्ता एक ID परिभाषित कर सकते हैं, लेकिन इसकी आवश्यकता नहीं है\",\n doc_id_auto_generated: \"दस्तावेज़ ID स्वचालित रूप से उत्पन्न होती है\",\n config_doc_id_generation: \"नई इकाइयां बनाते समय दस्तावेज़ ID कैसे उत्पन्न होती हैं, इसे कॉन्फ़िगर करें।\",\n enable_text_search: \"इस संग्रह के लिए पाठ खोज (text search) सक्षम करें\",\n text_search_description: \"इस संग्रह के लिए पाठ खोज की अनुमति दें। यदि आपने पाठ खोज प्रतिनिधि निर्दिष्ट नहीं किया है, तो यह अंतर्निहित स्थानीय पाठ खोज का उपयोग करेगा। बड़े संग्रहों के लिए इसकी अनुशंसा नहीं की जाती है, क्योंकि इससे प्रदर्शन और लागत संबंधी समस्याएं हो सकती हैं।\",\n database_id: \"डेटाबेस ID\",\n default_text: \"(डिफ़ॉल्ट)\",\n\n custom_actions: \"कस्टम कार्रवाइयां\",\n more_info: \"अतिरिक्त जानकारी\",\n define_custom_actions_cli: \"CLI के साथ अपलोड करके अपनी स्वयं की कस्टम कार्रवाइयां परिभाषित करें।\",\n action_defined_in_code: \"यह क्रिया कोड में कुंजी (key) के साथ परिभाषित की गई है\",\n add_custom_entity_action: \"कस्टम इकाई कार्रवाई जोड़ें\",\n remove_this_action: \"यह क्रिया हटाएँ?\",\n remove_action_warning: \"यह कोई डेटा नहीं हटाएगा, केवल CMS में कार्रवाई को हटाएगा\",\n\n subcollections_of: \"के उपसंग्रह\",\n add_subcollection: \"उपसंग्रह जोड़ें\",\n custom_views: \"कस्टम दृश्य\",\n define_custom_views_cli: \"CLI के साथ अपलोड करके अपने स्वयं के कस्टम दृश्य परिभाषित करें।\",\n view_defined_in_code: \"यह दृश्य कोड में कुंजी (key) के साथ परिभाषित किया गया है\",\n add_custom_entity_view: \"कस्टम इकाई दृश्य जोड़ें\",\n delete_this_subcollection: \"इस उपसंग्रह को हटाएं?\",\n remove_collection_warning: \"यह कोई डेटा नहीं हटाएगा, केवल CMS में संग्रह को हटाएगा\",\n remove_this_view: \"यह दृश्य हटाएँ?\",\n remove_view_warning: \"यह कोई डेटा नहीं हटाएगा, केवल CMS में दृश्य को हटाएगा\",\n\n no_collection_selected: \"कोई संग्रह नहीं चुना गया\",\n code_for_collection: \"संग्रह के लिए कोड\",\n use_config_define_json: \"संग्रह को JSON प्रारूप में परिभाषित करने के लिए इस कॉन्फ़िगरेशन का उपयोग करें।\",\n customise_collection_code: \"यदि आप कोड में संग्रह को अनुकूलित करना चाहते हैं, तो आप इस संग्रह कोड को अपने CMS ऐप कॉन्फ़िगरेशन में जोड़ सकते हैं।\",\n copied: \"कॉपी किया गया\",\n\n property_cant_be_edited: \"इस विशेषता को संपादित नहीं किया जा सकता\",\n property_not_editable_description: \"आपके पास इसे संपादित करने की अनुमति नहीं हो सकती है या इसे कोड में परिभाषित किया गया है और इसे संशोधित नहीं किया जा सकता।\",\n delete_this_property: \"यह विशेषता हटाएँ?\",\n delete_property_warning: \"यह कोई डेटा नहीं हटाएगा, केवल संग्रह को संशोधित करेगा।\",\n error_must_specify_id: \"आपको फ़ील्ड के लिए एक id निर्दिष्ट करना होगा\",\n error_id_format: \"id में केवल अक्षर, संख्याएं और अंडरस्कोर (_) हो सकते हैं, और यह किसी संख्या से शुरू नहीं हो सकता\",\n error_id_already_exists: \"इस ID के साथ पहले से ही एक और फ़ील्ड मौजूद है\",\n error_must_specify_title: \"आपको फ़ील्ड के लिए एक शीर्षक निर्दिष्ट करना होगा\",\n custom_or_other: \"कस्टम/अन्य\",\n select_property_widget: \"एक प्रॉपर्टी विजेट का चयन करें\",\n error_changing_data_type: \"यह विजेट प्रारंभ में चयनित विजेट की तुलना में एक अलग डेटा प्रकार का उपयोग करता है। यह मौजूदा डेटा के साथ त्रुटियों का कारण बन सकता है।\",\n required: \"आवश्यक\",\n\n enum_form_dialog: \"Enum फॉर्म डायलॉग\",\n imported_data_preview: \"आयात किए गए डेटा का पूर्वावलोकन\",\n entities_with_same_id_overwritten: \"समान id वाली इकाइयों को अधिलेखित (overwritten) किया जाएगा\",\n collection_editor: \"संग्रह संपादक\",\n properties_in_this_group: \"इस समूह में विशेषताएं\",\n data_property_mapping: \"डेटा संपत्ति मानचित्रण (मॅपिंग)\",\n property_edit_view: \"प्रॉपर्टी संपादन दृश्य\",\n all_of_these: \"ये सभी\",\n any_of_these: \"इनमें से कोई भी\",\n\n only_admins_edit_roles: \"केवल व्यवस्थापक (Admins) ही भूमिकाएँ संपादित कर सकते हैं\",\n error_user_not_found: \"उपयोगकर्ता नहीं मिला\",\n all_roles: \"सभी भूमिकाएँ\",\n role: \"भूमिका\",\n name_of_this_role: \"इस भूमिका का नाम\",\n id_of_this_role: \"इस भूमिका की ID\",\n create_entities: \"इकाइयाँ बनाएँ\",\n read_entities: \"इकाइयाँ पढ़ें\",\n update_entities: \"इकाइयाँ अपडेट करें\",\n delete_entities: \"इकाइयाँ हटाएँ\",\n all_collections: \"सभी संग्रह\",\n create_entities_in_collections: \"संग्रहों में इकाइयाँ बनाएँ\",\n access_all_data_in_every_collection: \"हर संग्रह में सभी डेटा तक पहुँचें\",\n update_data_in_any_collection: \"किसी भी संग्रह में डेटा अपडेट करें\",\n delete_data_in_any_collection: \"किसी भी संग्रह में डेटा हटाएँ\",\n allow_all_permissions_in_this_collections: \"इन संग्रहों में सभी अनुमतियों की अनुमति दें\",\n all: \"सभी\",\n customise_permissions_description: \"आप उन अनुमतियों को अनुकूलित कर सकते हैं जो इस भूमिका से संबंधित उपयोगकर्ता प्रत्येक संग्रह की इकाइयों में कर सकते हैं\",\n create_collections: \"संग्रह बनाएँ\",\n yes: \"हाँ\",\n no: \"नहीं\",\n can_user_create_collections: \"क्या उपयोगकर्ता संग्रह बना सकता है\",\n edit_collections: \"संग्रह संपादित करें\",\n only_own_collections: \"केवल उसकी/उसकी अपनी\",\n own: \"अपनी\",\n can_user_edit_collections: \"क्या उपयोगकर्ता संग्रह संपादित कर सकता है\",\n delete_collections: \"संग्रह हटाएँ\",\n can_user_delete_collections: \"क्या उपयोगकर्ता संग्रह हटा सकता है\",\n error_saving_role: \"इस भूमिका को सहेजने में कोई त्रुटि हुई\",\n create_role: \"भूमिका बनाएँ\",\n update: \"अपडेट करें\",\n\n only_admins_change_roles: \"केवल व्यवस्थापक ही भूमिकाएँ बदल सकते हैं\",\n must_be_at_least_one_admin: \"कम से कम एक एडमिन होना चाहिए\",\n logged_user_not_found: \"लॉग इन उपयोगकर्ता नहीं मिला\",\n user: \"उपयोगकर्ता (User)\",\n user_id: \"उपयोगकर्ता ID\",\n name_of_this_user: \"इस उपयोगकर्ता का नाम\",\n email_of_this_user: \"इस उपयोगकर्ता का ईमेल\",\n roles: \"भूमिकाएँ\",\n create_user: \"उपयोगकर्ता बनाएँ\",\n\n users: \"उपयोगकर्ता (Users)\",\n add_user: \"उपयोगकर्ता जोड़ें\",\n add_role: \"भूमिका जोड़ें\",\n is_admin: \"एडमिन है\",\n default_permissions: \"डिफ़ॉल्ट अनुमतियाँ\",\n created_on: \"इस दिन बनाया गया\",\n email: \"ईमेल\",\n id: \"ID\",\n read: \"पढ़ें\",\n\n column_in_file: \"फ़ाइल में कॉलम\",\n map_to_property: \"प्रॉपर्टी में मैप करें\",\n default_values: \"डिफ़ॉल्ट मान\",\n default_values_description: \"आप अनमैप किए गए कॉलम और खाली मानों के लिए एक डिफ़ॉल्ट मान का चयन कर सकते हैं:\",\n property: \"विशेषता (Property)\",\n default_value: \"डिफ़ॉल्ट मान\",\n autogenerate_id: \"ID स्वतः उत्पन्न करें\",\n id_column_description: \"कॉलम जिसका उपयोग प्रत्येक दस्तावेज़ के लिए ID के रूप में किया जाएगा\",\n do_not_set_value: \"मान सेट न करें\",\n set_value_to_true: \"मान को true पर सेट करें\",\n set_value_to_false: \"मान को false पर सेट करें\",\n drag_and_drop_file: \"फ़ाइल को यहां खींचें और छोड़ें या अपलोड करने के लिए क्लिक करें\",\n error_saving_data: \"डेटा सहेजने में त्रुटि\",\n retry: \"पुनः प्रयास करें\",\n saving_data: \"डेटा सहेजा जा रहा है\",\n entities_saved: \"इकाइयाँ सहेजी गईं\",\n do_not_close_tab: \"इस टैब को बंद न करें अन्यथा आयात बाधित हो जाएगा\",\n import: \"आयात (Import)\",\n import_data: \"डेटा आयात करें\",\n upload_file_description: \"CSV, Excel या JSON फ़ाइल अपलोड करें और इसे अपने मौजूदा स्कीमा में मैप करें\",\n back: \"पीछे\",\n next: \"अगला\",\n save_data: \"डेटा सहेजें\",\n use_column_as_id: \"इस कॉलम को ID के रूप में उपयोग करें\",\n do_not_import_property: \"इस विशेषता को आयात न करें\",\n entities_will_be_overwritten: \"समान ID वाली इकाइयों को अधिलेखित (overwritten) किया जाएगा\",\n data_imported_successfully: \"डेटा सफलतापूर्वक आयात किया गया\",\n export: \"निर्यात (Export)\",\n export_data: \"डेटा निर्यात करें\",\n download_table_csv: \"इस तालिका की सामग्री को CSV के रूप में डाउनलोड करें\",\n csv: \"CSV\",\n json: \"JSON\",\n dates_as_timestamps: \"टाइमस्टैम्प के रूप में तिथियां\",\n dates_as_strings: \"स्ट्रिंग्स के रूप में तिथियां\",\n flatten_arrays: \"ऐरे को फ़्लैट करें\",\n download: \"डाउनलोड\",\n large_number_of_documents: \"इस संग्रह में बड़ी संख्या में दस्तावेज़ हैं ({{count}})।\",\n include_undefined_values: \"अपरिभाषित (undefined) मान शामिल करें\",\n submit: \"सबमिट करें\",\n\n no_filterable_properties: \"कोई फ़िल्टर करने योग्य गुण उपलब्ध नहीं हैं\",\n apply_filters: \"फ़िल्टर लागू करें\",\n list: \"सूची\",\n table_view_mode: \"तालिका\",\n cards: \"कार्ड\",\n board: \"बोर्ड\",\n initialize_kanban_order_desc: \"यह उन सभी आइटम को अनुक्रमिक क्रम मान निर्दिष्ट करेगा जिनके पास एक नहीं है। आइटम प्रत्येक कॉलम के भीतर अपना वर्तमान क्रम बनाए रखेंगे।\",\n kanban_view_not_available: \"कानबन दृश्य उपलब्ध नहीं है\",\n kanban_view_requires_enum: \"कानबन दृश्य के लिए इकाइयों को कॉलम में समूहीकृत करने के लिए एनम (Enum) मानों वाली एक स्ट्रिंग संपत्ति की आवश्यकता होती है। कृपया इस दृश्य का उपयोग करने के लिए अपने संग्रह स्कीमा में एक Enum संपत्ति जोड़ें।\",\n no_enum_values_configured: 'प्रॉपर्टी \"{{property}}\" के लिए कोई एनम मान कॉन्फ़िगर नहीं किया गया है',\n items_need_backfill: \"कुछ आइटम के क्रम मान नहीं होते हैं। खींचें-और-छोड़ें (Drag-and-drop) पुनर्रचना को सक्षम करने के लिए प्रारंभ करें।\",\n kanban_order_not_configured: \"खींचें-और-छोड़ें क्रमबद्धता कॉन्फ़िगर नहीं है। कार्ड की स्थिति बनाए रखने के लिए संग्रह सेटिंग्स में एक क्रम गुण सेट करें।\",\n initialize: \"प्रारंभ करें\",\n confirm_multiple_delete: \"एकाधिक विलोपन की पुष्टि करें?\",\n delete_entity_confirm_title: \"क्या आप इस {{entityName}} को हटाना चाहेंगे?\",\n multiple_deleted: \"कई हटाए गए\",\n some_entities_deleted: \"कुछ संस्थाएँ हटा दी गई हैं, लेकिन सभी नहीं\",\n error_deleting_entities: \"संस्थाओं को हटाने में त्रुटि\",\n deleted: \"हटाया गया\",\n\n /** Recently extracted strings for collection editor */\n /** AI Collection Generator Popover */\n generate_collection_with_ai: \"AI से संग्रह बनाएं\",\n modify_collection_with_ai: \"AI से संग्रह संशोधित करें\",\n describe_collection_to_create: \"वह संग्रह बताएं जिसे आप बनाना चाहते हैं।\",\n describe_changes_to_make: \"वे परिवर्तन बताएं जो आप इस संग्रह में करना चाहते हैं।\",\n ai_placeholder_create: \"उदा. नाम, मूल्य, विवरण और श्रेणी के साथ एक उत्पाद संग्रह बनाएं...\",\n ai_placeholder_modify: \"उदा. स्टोरेज के साथ एक थंबनेल छवि फ़ील्ड जोड़ें, मूल्य को आवश्यक बनाएं...\",\n ai_assist: \"AI सहायक\",\n generating: \"उत्पन्न हो रहा है...\",\n\n this_is_subcollection_of: \"यह इसका एक उपसंघ (subcollection) है\",\n use_existing_paths_database: \"अपने डेटाबेस में मौजूदा पथों में से एक का उपयोग करें:\",\n describe_collection_ai: \"AI को अपने संग्रह का वर्णन करें:\",\n generate_with_ai: \"AI के साथ जनरेट करें\",\n create_from_json_config: \"JSON कॉन्फ़िगरेशन से बनाएँ:\",\n paste_json_config: \"JSON कॉन्फ़िगरेशन पेस्ट करें\",\n create_collection_from_file_formats: \"फ़ाइल (csv, json, xls, xslx...) से एक संग्रह बनाएँ\",\n select_template: \"एक टेम्पलेट चुनें:\",\n products: \"उत्पाद\",\n collection_products_subtitle: \"छवियों, कीमतों और स्टॉक वाले उत्पादों का संग्रह\",\n collection_users_subtitle: \"ईमेल, नाम और भूमिकाओं वाले उपयोगकर्ताओं का एक संग्रह\",\n blog_posts: \"ब्लॉग पोस्ट\",\n collection_blog_posts_subtitle: \"छवियों, लेखकों और जटिल सामग्री के साथ ब्लॉग पोस्ट का एक संग्रह\",\n pages: \"पृष्ठ (Pages)\",\n collection_pages_subtitle: \"छवियों, लेखकों और जटिल सामग्री के साथ पृष्ठों का एक संग्रह\",\n continue_from_scratch: \"शुरुआत से जारी रखें\",\n\n /** Admin views config */\n cms_users: \"CMS उपयोगकर्ता\",\n roles_menu: \"भूमिकाएँ\",\n project_settings: \"परियोजना सेटिंग\",\n\n by_signing_in_you_agree_to_our: \"साइन इन करके आप हमारे नियमों और शर्तों से सहमत होते हैं\",\n terms_and_conditions: \"नियम और शर्तें\",\n and_our: \"और हमारी गोपनीयता नीति\",\n privacy_policy: \"गोपनीयता नीति\",\n email_password: \"ईमेल/पासवर्ड\",\n sign_in_with_google: \"Google से साइन इन करें\",\n\n // --- Auth error messages ---\n auth_user_not_found: \"उपयोगकर्ता नहीं मिला\",\n auth_wrong_password: \"गलत पासवर्ड। कृपया पुनः प्रयास करें।\",\n auth_user_disabled: \"उपयोगकर्ता अक्षम है। कृपया समर्थन से संपर्क करें।\",\n auth_account_exists_with_different_credential: \"विभिन्न साइन-इन विधि के साथ खाता मौजूद है\",\n auth_email_already_in_use: \"ईमेल पहले से ही उपयोग में है\",\n auth_google_permissions_required: \"अपने Google Cloud प्रोजेक्ट प्रबंधित करने के लिए आपको अतिरिक्त अनुमतियाँ देने की आवश्यकता है\",\n auth_invalid_email_password: \"कृपया ईमेल और पासवर्ड दोनों दर्ज करें\",\n auth_enter_email_first: \"कृपया पहले अपना ईमेल दर्ज करें\",\n auth_password_reset_sent: \"पासवर्ड रीसेट ईमेल भेजा गया\",\n auth_sign_in_account: \"अपने खाते में प्रवेश करें\",\n auth_create_new_account: \"एक नया अकाउंट बनाएँ\",\n auth_password: \"पासवर्ड\",\n auth_reset_password: \"पासवर्ड रीसेट करें\",\n auth_new_user: \"नया उपयोगकर्ता?\",\n auth_have_account: \"क्या आपके पास एक खाता है?\",\n auth_sign_in: \"साइन इन करें\",\n auth_sign_up: \"साइन अप करें\",\n\n\n auto_setup_collections_button: \"संग्रहों को स्वचालित रूप से सेट करें\",\n auto_setup_collections_title: \"संग्रहों की स्वचालित सेटअप\",\n auto_setup_collections_desc: \"अपने मौजूदा Firestore डेटा के आधार पर संग्रहों को स्वचालित रूप से सेट करें। Rebase को आपके लिए परफेक्ट CMS कॉन्फ़िगर करने दें।\",\n this_can_take_a_minute: \"इसमें एक मिनट लग सकता है\",\n no_collections_found_to_setup: \"सेट करने के लिए कोई संग्रह नहीं मिला\",\n collections_have_been_setup: \"संग्रहों को सेट कर दिया गया है\",\n error_setting_up_collections: \"संग्रह सेट करने में त्रुटि\",\n add_your: \"अपने\",\n database_collections: \"डेटाबेस संग्रह\",\n no_unmapped_collections: \"कोई असंबद्ध संग्रह नहीं\",\n query_and_update_with_datatalk: \"DATATALK के साथ प्राकृतिक भाषा में अपना डेटा क्वेरी और अपडेट करें\",\n welcome_to_rebase: \"Rebase में आपका स्वागत है\",\n admin_panel_ready_bring_data: \"आपका पैनल तैयार है। अपना डेटा जोड़कर शुरू करें।\",\n admin_panel_ready_get_started: \"शुरू करें\",\n auto_detect_collections: \"संग्रहों को स्वचालित रूप से पहचानें\",\n auto_detect_collections_desc: \"Rebase आपके Firestore डेटा का विश्लेषण करेगा और आपके लिए संग्रहों को स्वचालित रूप से कॉन्फ़िगर करेगा\",\n create_a_collection: \"एक संग्रह बनाएं\",\n create_collection_desc: \"अपने संग्रह की संरचना मैन्युअल रूप से परिभाषित करें\",\n read_the_docs: \"दस्तावेज़ीकरण पढ़ें\",\n read_the_docs_desc: \"जानें कि Rebase का अधिकतम उपयोग कैसे करें\",\n explore_docs: \"दस्तावेज़ीकरण देखें\",\n want_to_customize_with_code: \"क्या आप कोड से Rebase को कस्टमाइज़ करना चाहते हैं?\",\n to_scaffold_a_local_project: \"एक स्थानीय प्रोजेक्ट बनाने के लिए\",\n\n // ─── Collection Editor — Validation ──────────────────────────\n validation: \"सत्यापन\",\n unique: \"अद्वितीय\",\n required_message: \"आवश्यक संदेश\",\n required_tooltip: \"यदि यह मान सेट नहीं है तो आप इस एंटिटी को सहेज नहीं पाएंगे\",\n unique_tooltip: \"एक ही मान वाली एक से अधिक एंटिटी नहीं हो सकतीं\",\n lowercase: \"लोअरकेस\",\n uppercase: \"अपरकेस\",\n trim: \"ट्रिम\",\n exact_length: \"सटीक लंबाई\",\n min_length: \"न्यूनतम लंबाई\",\n max_length: \"अधिकतम लंबाई\",\n matches_regex: \"रेजेक्स से मेल खाता है\",\n not_valid_regexp: \"वैध रेगुलर एक्सप्रेशन नहीं है\",\n regex_helper: \"उदा. /^\\\\d+$/ केवल अंकों के लिए\",\n min_value: \"न्यूनतम मान\",\n max_value: \"अधिकतम मान\",\n less_than: \"से कम\",\n more_than: \"से अधिक\",\n positive_value: \"सकारात्मक मान\",\n negative_value: \"नकारात्मक मान\",\n integer_value: \"पूर्णांक मान\",\n\n // ─── Collection Editor — Property Edit ───────────────────────\n invalid_regular_expression: \"अमान्य रेगुलर एक्सप्रेशन\",\n must_specify_target_collection: \"आपको फ़ील्ड के लिए एक लक्ष्य संग्रह निर्दिष्ट करना होगा\",\n need_specify_repeat_field: \"आपको एक दोहराव फ़ील्ड निर्दिष्ट करना होगा\",\n need_specify_block_properties: \"आपको इस ब्लॉक के गुण निर्दिष्ट करने होंगे\",\n incomplete_condition: \"अपूर्ण शर्त - कृपया एक फ़ील्ड चुनें\",\n field_name: \"फ़ील्ड का नाम\",\n\n // ─── Collection Editor — Display & Config ────────────────────\n kanban_column_property: \"कानबन कॉलम प्रॉपर्टी\",\n select_a_property: \"एक प्रॉपर्टी चुनें\",\n kanban_property_not_found: \"प्रॉपर्टी \\\"{{property}}\\\" मौजूद नहीं है या एनम स्ट्रिंग प्रॉपर्टी नहीं है। कृपया एक वैध प्रॉपर्टी चुनें या चयन साफ़ करें।\",\n no_enum_string_properties: \"कोई एनम स्ट्रिंग प्रॉपर्टी नहीं मिली। कानबन दृश्य का उपयोग करने के लिए enumValues के साथ एक स्ट्रिंग प्रॉपर्टी जोड़ें।\",\n kanban_column_description: \"एंटिटीज़ को कॉलम में समूहित करने के लिए एनम मानों वाली एक स्ट्रिंग प्रॉपर्टी चुनें\",\n create_property: \"+ \\\"{{property}}\\\" प्रॉपर्टी बनाएं\",\n order_property: \"क्रम प्रॉपर्टी\",\n order_property_not_found: \"प्रॉपर्टी \\\"{{property}}\\\" मौजूद नहीं है या एक संख्या प्रॉपर्टी नहीं है। कृपया एक वैध प्रॉपर्टी चुनें या चयन साफ़ करें।\",\n no_number_properties: \"कोई संख्या प्रॉपर्टी नहीं मिली। क्रम सक्षम करने के लिए एक संख्या प्रॉपर्टी जोड़ें।\",\n order_property_description: \"आइटम का क्रम बनाए रखने के लिए एक संख्या प्रॉपर्टी चुनें\",\n display_settings: \"प्रदर्शन सेटिंग्स\",\n default_row_size: \"डिफ़ॉल्ट पंक्ति आकार\",\n side_dialog_width: \"साइड डायलॉग चौड़ाई\",\n side_dialog_width_description: \"वैकल्पिक रूप से एंटिटी साइड डायलॉग की चौड़ाई (पिक्सेल में) परिभाषित करें। डिफ़ॉल्ट 768px है\",\n inline_editing_enabled: \"डेटा को सीधे टेबल दृश्य में संपादित किया जा सकता है\",\n inline_editing_disabled: \"डेटा को केवल फ़ॉर्म दृश्य में संपादित किया जा सकता है\",\n inline_editing_description: \"फ़ॉर्म दृश्य खोले बिना सीधे टेबल दृश्य में डेटा संपादन की अनुमति दें।\",\n include_json_view: \"JSON दृश्य शामिल करें\",\n no_json_view: \"JSON दृश्य शामिल न करें\",\n json_view_description: \"दस्तावेज़ का JSON प्रतिनिधित्व शामिल करें।\",\n not_found_suffix: \"नहीं मिला\",\n\n // ─── Editor ─────────────────────────────────────────────────\n editor_text: \"पाठ\",\n editor_text_description: \"बस सादे पाठ के साथ टाइप करना शुरू करें।\",\n editor_heading_1: \"शीर्षक 1\",\n editor_heading_1_description: \"बड़ा अनुभाग शीर्षक।\",\n editor_heading_2: \"शीर्षक 2\",\n editor_heading_2_description: \"मध्यम अनुभाग शीर्षक।\",\n editor_heading_3: \"शीर्षक 3\",\n editor_heading_3_description: \"छोटा अनुभाग शीर्षक।\",\n editor_todo_list: \"टू-डू सूची\",\n editor_todo_list_description: \"टू-डू सूची के साथ कार्यों को ट्रैक करें।\",\n editor_bullet_list: \"बुलेट सूची\",\n editor_bullet_list_description: \"एक सरल बुलेट सूची बनाएं।\",\n editor_numbered_list: \"क्रमांकित सूची\",\n editor_numbered_list_description: \"नंबरिंग के साथ एक सूची बनाएं।\",\n editor_quote: \"उद्धरण\",\n editor_quote_description: \"एक उद्धरण कैप्चर करें।\",\n editor_code: \"कोड\",\n editor_code_description: \"एक कोड स्निपेट कैप्चर करें।\",\n editor_image: \"छवि\",\n editor_image_description: \"अपने कंप्यूटर से एक छवि अपलोड करें।\",\n editor_multiple: \"एकाधिक\",\n editor_link: \"लिंक\",\n editor_save: \"सहेजें\",\n editor_cancel: \"रद्द करें\",\n editor_remove_link: \"लिंक हटाएं\",\n editor_paste_or_type_link: \"लिंक पेस्ट करें या टाइप करें\",\n editor_open_in_new_window: \"नई विंडो में खोलें\",\n editor_bold: \"बोल्ड\",\n editor_italic: \"इटैलिक\",\n editor_underline: \"अंडरलाइन\",\n editor_strikethrough: \"स्ट्राइकथ्रू\",\n editor_autocomplete: \"स्वतः पूर्ण\",\n editor_autocomplete_description: \"संदर्भ के आधार पर पाठ जोड़ें।\",\n\n settings_heading: \"सेटिंग्स\",\n settings_project_name: \"परियोजना का नाम\",\n settings_default_language: \"डिफ़ॉल्ट भाषा\",\n settings_default_language_caption: \"इस परियोजना के लिए आधार भाषा चुनें। उपयोगकर्ता अपनी व्यक्तिगत सेटिंग्स में इस प्राथमिकता को बदल सकते हैं।\",\n settings_enable_local_text_search: \"स्थानीय पाठ खोज सक्षम करें\",\n settings_local_text_search_caption: \"सभी संग्रहों के लिए स्थानीय पाठ खोज सक्षम करें। इससे आप Rebase खोज पट्टी का उपयोग करके अपने संग्रहों में पाठ फ़ील्ड खोज सकेंगे। ध्यान दें कि इस सुविधा के कारण अधिक पठन हो सकते हैं, क्योंकि यह आपके संग्रहों के सभी पाठ फ़ील्ड को अनुक्रमित करेगी।\",\n settings_doc_history_all_collections: \"सभी संग्रहों के लिए दस्तावेज़ इतिहास सक्षम\",\n settings_doc_history_caption: \"सक्षम होने पर, सभी संग्रहों में डिफ़ॉल्ट रूप से इतिहास सक्षम होगा। आप प्रत्येक संग्रह में इस सेटिंग को बदल सकते हैं। इतिहास प्रत्येक दस्तावेज़ की __history उपसंग्रह में सहेजा जाएगा।\",\n settings_theme: \"थीम\",\n settings_primary_color: \"प्राथमिक रंग\",\n settings_secondary_color: \"द्वितीयक रंग\",\n settings_sample_theme_components: \"नमूना थीम घटक\",\n settings_drag_drop_logo: \"अपना लोगो यहां खींचें और छोड़ें\",\n settings_security_rules: \"सुरक्षा नियम\",\n settings_security_rules_description: \"Rebase डेटा तक पहुंच प्रतिबंधित करने के लिए Firebase सुरक्षा नियमों का उपयोग करता है। Rebase के माध्यम से नया उपयोगकर्ता बनाते समय, कस्टम दावा rebaseUser क्लाइंट प्रोजेक्ट में उपयोगकर्ता में जोड़ा जाता है। निम्नलिखित सुरक्षा नियम जोड़कर, आप सुनिश्चित करते हैं कि Rebase उपयोगकर्ता Rebase के माध्यम से डेटा तक पहुंच सकें।\",\n settings_security_rules_add_domain: \"कृपया अपने प्रदाता के अनुमत डोमेन में {{domain}} डोमेन जोड़ना याद रखें\",\n settings_security_rules_caption: \"ये नियम डेटा तक पहुंच को केवल Rebase उपयोगकर्ताओं तक सीमित करते हैं, लेकिन डेटाबेस स्तर पर अनुमतियों को लागू नहीं करते। अनुमतियां फ्रंटएंड में लागू होती हैं, जो अधिकांश परियोजनाओं के लिए ठीक काम करती हैं। यदि आपको डेटाबेस स्तर पर अनुमतियां लागू करने की आवश्यकता है, तो आप इन सुरक्षा नियमों को संशोधित कर सकते हैं। उपयोगकर्ता को सौंपी गई भूमिकाएं Firebase प्रमाणीकरण टोकन में कस्टम दावों के रूप में सेट की जाती हैं, इसलिए आप उन्हें अपने सुरक्षा नियमों में उपयोग कर सकते हैं।\",\n\n // ─── Text Search Dialog ─────────────────────────────────────\n text_search_dialog_title: \"पाठ खोज सक्षम करें\",\n text_search_local_not_recommended: \"बड़ी संग्रहों के लिए स्थानीय पाठ खोज की अनुशंसा नहीं की जाती है।\",\n text_search_local_fetch_warning: \"ध्यान दें कि स्थानीय पाठ खोज सक्षम करने के लिए आपके संग्रह से सभी दस्तावेज़ प्राप्त करने और उन्हें ब्राउज़र में संग्रहीत करने की आवश्यकता होगी। बड़ी संग्रहों के लिए यह अक्षम हो सकता है और अतिरिक्त लागत भी लग सकती है।\",\n text_search_external_suggestion: \"बड़ी संग्रहों के लिए, Algolia या Elastic Search जैसे बाहरी खोज इंजन का उपयोग करने और अपनी कॉन्फ़िगरेशन में एक खोज प्रतिनिधि निर्दिष्ट करने की सलाह दी जाती है।\",\n text_search_local_description: \"स्थानीय पाठ खोज आपके संग्रह में पाठ खोज सक्षम करने का सबसे सरल तरीका है। यह ब्राउज़र में संग्रह के सभी दस्तावेज़ लोड करता है और खोज स्थानीय रूप से करता है। छोटी संग्रहों के लिए यह अनुशंसित विकल्प है।\",\n text_search_own_implementation: \"आपने अपना स्वयं का पाठ खोज नियंत्रक लागू किया है। आप अपने संग्रह के लिए पाठ खोज सक्षम कर सकते हैं।\",\n text_search_enable_for_collection: \"इस संग्रह के लिए सक्षम करें\",\n text_search_enable_for_project: \"प्रोजेक्ट के लिए सक्षम करें\",\n text_search_enabled_snackbar: \"स्थानीय पाठ खोज सक्षम की गई\",\n\n // ─── Missing keys (English placeholders — translate) ───\nno_filter: \"No filter\",\n is_true: \"is true\",\n is_false: \"is false\",\n error_uploading_file_size: \"Error uploading file: File is larger than {{maxSize}} bytes\",\n error_uploading_file_type: \"Error uploading file: File type is not supported\",\n drag_drop_files: \"Drag 'n' drop some files here, or click here to edit\",\n drag_drop_file: \"Drag 'n' drop a file here, or click here to edit\",\n select_reference: \"Select reference\",\n select_references: \"Select references\",\n account_settings: \"Account Settings\",\n profile: \"Profile\",\n sessions: \"Sessions\",\n display_name: \"Display Name\",\n photo_url: \"Photo URL\",\n save_profile: \"Save Profile\",\n saving: \"Saving...\",\n no_active_sessions: \"No active sessions found.\",\n revoking: \"Revoking...\",\n revoke_all_sessions: \"Revoke All Sessions\",\n unknown_device: \"Unknown Device\",\n current: \"Current\",\n role_id: \"Role ID\",\n role_name: \"Role Name\",\n add_reference: \"Add reference\",\n add_reference_to: \"Add reference to {{name}}\",\n role_deleted_successfully: \"Role deleted successfully\",\n error_deleting_role: \"Error deleting role\",\n collection_permissions: \"Collection permissions\",\n collection: \"Collection\",\n no_collections_configured: \"No collections configured\",\n no_security_rules_defined: \"No security rules defined — all operations unrestricted\",\n no_rules: \"no rules\",\n bootstrap_admin_success: \"You are now an admin! Refreshing...\",\n failed_to_bootstrap_admin: \"Failed to bootstrap admin\",\n user_deleted_successfully: \"User deleted successfully\",\n error_deleting_user: \"Error deleting user\",\n add_row_before: \"Add row before\",\n add_row_after: \"Add row after\",\n delete_row: \"Delete row\",\n add_column_before: \"Add column before\",\n add_column_after: \"Add column after\",\n delete_column: \"Delete column\",\n delete_table: \"Delete table\",\n alt_text: \"Alt text\",\n title: \"Title\",\n a_property_of_this_map_has_error: \"A property of this map has an error\",\n studio_sql_executing_query: \"EXECUTING QUERY...\",\n studio_sql_query_error: \"Query Error\",\n studio_sql_run_query_placeholder: \"Run a query to see results\",\n studio_sql_visual_execution_plan: \"Visual Execution Plan\",\n studio_sql_success: \"SUCCESS\",\n studio_sql_no_results: \"Query executed successfully but returned no results.\",\n studio_sql_rows: \"Rows:\",\n studio_sql_time: \"Time:\",\n studio_sql_copy_markdown: \"Copy Markdown\",\n studio_sql_export_json: \"Export JSON\",\n studio_sql_export_csv: \"Export CSV\",\n studio_sql_format_sql: \"Format SQL\",\n studio_sql_explain: \"Explain\",\n studio_sql_limit_1000: \"Limit 1000\",\n studio_sql_remove_from_favorites: \"Remove from Favorites\",\n studio_sql_add_to_favorites: \"Add to Favorites\",\n studio_sql_save: \"Save\",\n studio_sql_run: \"Run\",\n studio_sql_database: \"Database\",\n studio_sql_role: \"Role\",\n studio_sql_admin: \"(Admin)\",\n studio_sql_select_db: \"Select DB\",\n studio_sql_query_results: \"Query Results\",\n studio_sql_save_snippet: \"Save SQL Snippet\",\n studio_sql_snippet_name: \"Snippet Name\",\n studio_sql_snippet_name_placeholder: \"e.g., Get All Users\",\n studio_sql_snippet_saved_local: \"This will be saved to your local storage.\",\n studio_sql_cancel: \"Cancel\",\n studio_sql_dangerous_operation: \"Dangerous Operation Detected\",\n studio_sql_dangerous_operation_body: \"The query you are about to run contains potentially destructive operations (DELETE, DROP, TRUNCATE, or UPDATE without WHERE). Are you sure you want to proceed?\",\n studio_sql_snippet_saved: \"Snippet \\\"{{name}}\\\" saved.\",\n studio_sql_markdown_copied: \"Results copied as Markdown!\",\n studio_sql_markdown_copy_failed: \"Failed to copy Markdown to clipboard.\",\n studio_sql_row_updated: \"Row updated successfully.\",\n studio_sql_cannot_edit_missing_query: \"Cannot edit rows: The underlying query is missing.\",\n studio_sql_cannot_resolve_table: \"Could not resolve table/primary key\",\n studio_sql_missing_pk: \"Row is missing primary key column(s): {{columns}}. Cannot safely update.\",\n studio_sql_update_failed: \"Failed to update: {{message}}\",\n studio_sql_execution_not_supported: \"SQL execution is not supported by the current data source.\",\n studio_sql_error_executing: \"An error occurred while executing the query.\",\n studio_sql_error_explaining: \"An error occurred while explaining the query.\",\n studio_sql_save_first_to_favorite: \"Please save the snippet first before favoriting.\",\n studio_sql_cms: \"Collections:\",\n studio_sql_cms_collections_tooltip: \"Tables in this query that are mapped as CMS collections\",\n studio_sql_edit_entity: \"Edit {{name}} #{{id}}\",\n studio_sql_sql_not_supported: \"SQL execution not supported by this data source\",\n studio_sql_fetch_error: \"Failed to fetch connection options: {{message}}\",\n studio_sql_unexpected_format: \"Unexpected data format: {{type}}\",\n studio_sql_no_tables: \"No tables found in this database.\",\n studio_sql_schema_fetch_error: \"Failed to fetch schema: {{message}}\",\n studio_sql_sidebar_snippets: \"Snippets\",\n studio_sql_sidebar_history: \"History\",\n studio_sql_sidebar_schema: \"Schema\",\n studio_sql_sidebar_no_snippets: \"No saved snippets\",\n studio_sql_sidebar_save_snippet_hint: \"Save a query to access it here.\",\n studio_sql_sidebar_no_history: \"No history\",\n studio_sql_sidebar_history_hint: \"Executed queries will appear here.\",\n studio_sql_sidebar_delete_snippet: \"Delete snippet\",\n studio_schema_tables: \"Tables\",\n studio_schema_loading: \"Loading schema...\",\n studio_schema_no_tables: \"No tables found\",\n studio_schema_retry: \"Retry\",\n studio_schema_primary_key: \"Primary Key\",\n studio_schema_select_all: \"SELECT * FROM\",\n studio_schema_insert_into: \"INSERT INTO\",\n studio_schema_update: \"UPDATE\",\n studio_schema_delete_from: \"DELETE FROM\",\n studio_schema_columns: \"{{count}} columns\",\n studio_rls_title: \"Row Level Security\",\n studio_rls_description: \"Manage RLS policies for your tables\",\n studio_rls_enabled: \"RLS Enabled\",\n studio_rls_disabled: \"RLS Disabled\",\n studio_rls_no_rls: \"No RLS\",\n studio_rls_enable_rls: \"Enable RLS\",\n studio_rls_disable_rls: \"Disable RLS\",\n studio_rls_create_policy: \"Create Policy\",\n studio_rls_policies: \"Policies\",\n studio_rls_no_policies: \"No policies defined\",\n studio_rls_no_policies_desc: \"This table has no RLS policies. All rows are accessible based on the RLS status.\",\n studio_rls_add_first_policy: \"Add your first policy\",\n studio_rls_force_rls: \"Force RLS\",\n studio_rls_force_rls_desc: \"When enabled, RLS policies apply to the table owner as well.\",\n studio_rls_enable_force_rls: \"Enable Force RLS\",\n studio_rls_disable_force_rls: \"Disable Force RLS\",\n studio_rls_edit: \"Edit\",\n studio_rls_delete: \"Delete\",\n studio_rls_confirm_delete_title: \"Delete Policy\",\n studio_rls_confirm_delete_body: \"Are you sure you want to delete this policy? This action cannot be undone.\",\n studio_rls_confirm_enable_title: \"Enable Row Level Security\",\n studio_rls_confirm_enable_body: \"Enabling RLS will restrict access to rows in this table based on your policies. Make sure you have appropriate policies in place.\",\n studio_rls_confirm_disable_title: \"Disable Row Level Security\",\n studio_rls_confirm_disable_body: \"Disabling RLS will make all rows accessible to all roles. Are you sure you want to continue?\",\n studio_rls_select_table: \"Select a table\",\n studio_rls_no_tables: \"No tables available\",\n studio_rls_error: \"Error loading policies\",\n studio_rls_retry: \"Retry\",\n studio_rls_loading: \"Loading policies...\",\n studio_policy_edit: \"Edit Policy\",\n studio_policy_create: \"Create New Policy\",\n studio_policy_defining_rules: \"Defining access rules for\",\n studio_policy_cancel: \"Cancel\",\n studio_policy_save: \"Save Policy\",\n studio_policy_template: \"Start from a template (Optional)\",\n studio_policy_select_template: \"Select a template...\",\n studio_policy_name: \"Policy Name\",\n studio_policy_name_placeholder: \"Give your policy a descriptive name\",\n studio_policy_behavior: \"Policy Behavior\",\n studio_policy_permissive: \"Permissive\",\n studio_policy_permissive_desc: \"Combined using \\\"OR\\\"\",\n studio_policy_restrictive: \"Restrictive\",\n studio_policy_restrictive_desc: \"Combined using \\\"AND\\\"\",\n studio_policy_command: \"Policy Command\",\n studio_policy_target_roles: \"Target Roles\",\n studio_policy_roles_placeholder: \"Select roles (defaults to public)\",\n studio_policy_using_expr: \"USING expression\",\n studio_policy_using_expr_desc: \"Applies to existing rows (SELECT, UPDATE, DELETE)\",\n studio_policy_check_expr: \"WITH CHECK expression\",\n studio_policy_check_expr_desc: \"Applies to new or modified rows (INSERT, UPDATE)\",\n studio_policy_help_title: \"Row Level Security (RLS) Guide\",\n studio_policy_help_intro: \"Row Level Security (RLS) allows you to restrict which rows a user can access or modify based on their authentication status or roles.\",\n studio_policy_help_step1_title: \"1. Select a Template\",\n studio_policy_help_step1_desc: \"If you're new to RLS, the easiest way to start is by selecting a predefined template from the dropdown. It will automatically configure the policy for common use cases like \\\"Users can update their own rows\\\".\",\n studio_policy_help_step2_title: \"2. Target Roles\",\n studio_policy_help_step2_desc: \"Choose which users the policy applies to:\",\n studio_policy_help_role_public: \"Applies to everyone (logged in or not).\",\n studio_policy_help_role_authenticated: \"Only applies to users who are logged in.\",\n studio_policy_help_role_anon: \"Only applies to users who are NOT logged in.\",\n studio_policy_help_step3_title: \"3. USING Expression\",\n studio_policy_help_step3_desc: \"A SQL condition that must evaluate to true for existing rows to be visible or updatable (SELECT, UPDATE, DELETE).\",\n studio_policy_help_step3_example: \"Ensures users can only see rows where they are the owner.\",\n studio_policy_help_step4_title: \"4. WITH CHECK Expression\",\n studio_policy_help_step4_desc: \"A SQL condition that must evaluate to true for new or modified rows to be saved (INSERT, UPDATE).\",\n studio_policy_help_step4_example: \"Usually the same as the USING expression when users are only allowed to insert/edit their own data.\",\n studio_policy_help_auth_vars_title: \"Rebase Auth Variables\",\n studio_policy_help_auth_vars_desc: \"Rebase provides native helper functions that you can use in your expressions:\",\n studio_policy_help_auth_uid: \"Returns the current user's ID as text. Example:\",\n studio_policy_help_auth_jwt: \"Returns the full JWT payload as JSONB so you can check custom claims. Example:\",\n studio_policy_help_auth_roles: \"Returns the user's role IDs as a comma-separated string. Best used with:\",\n studio_policy_help_docs_cta: \"To learn more about Postgres policies, check out the official documentation.\",\n studio_policy_help_read_docs: \"Read Docs\",\n studio_policy_help_got_it: \"Got it!\",\n studio_add_kanban_column: \"Add column\",\n studio_add_kanban_column_title: \"Add Kanban Column\",\n studio_add_kanban_column_name: \"Column name\",\n studio_add_kanban_column_name_placeholder: \"New column name\",\n studio_add_kanban_column_add: \"Add\",\n studio_add_kanban_column_cancel: \"Cancel\",\n studio_collection_view_sql: \"SQL Editor\",\n studio_collection_view_cms: \"CMS View\",\n studio_editor_collection_tooltip: \"Edit collection schema\",\n studio_editor_collection_no_permission: \"You don't have permission to edit this collection\",\n studio_editor_collection_start_tooltip: \"Copy path or edit schema\",\n studio_editor_collection_start_no_permission: \"You don't have permission to modify this collection\",\n studio_editor_collection_start_copied: \"Copied!\",\n studio_editor_entity_tooltip: \"Edit entity schema\",\n studio_editor_entity_no_permission: \"You don't have permission to edit this entity\",\n studio_home_edit_collection: \"Edit collection\",\n studio_home_delete_collection: \"Delete collection\",\n studio_home_confirm_delete_title: \"Delete collection?\",\n studio_home_confirm_delete_body: \"Are you sure you want to delete the collection \\\"{{name}}\\\"? This action cannot be undone.\",\n studio_kanban_setup: \"Kanban Setup\",\n studio_missing_reference: \"Missing reference: {{path}}\",\n studio_missing_reference_create: \"Create\",\n studio_new_collection: \"New collection\",\n studio_new_collection_card: \"New collection\",\n studio_new_collection_no_permission: \"You don't have permissions to create collections\",\n studio_property_add_column: \"Add new property\",\n studio_property_add_column_no_permission: \"You don't have permission to add new properties\",\n studio_add_kanban_column_desc: \"Add a new option to the \\\"{{property}}\\\" property. This will create a new column in the Kanban board.\",\n studio_add_kanban_column_adding: \"Adding...\",\n studio_collection_view_edit: \"Edit\",\n studio_editor_collection_disabled: \"Collection editing is disabled\",\n studio_editor_collection_edit: \"Edit collection\",\n studio_editor_entity_save_first: \"You need to save the document before changing the schema\",\n studio_editor_entity_edit_schema: \"Edit schema for this form\",\n studio_editor_collection_start_save_filter: \"Save default filter and sort\",\n studio_editor_collection_start_clear_filter: \"Clear default filter and sort\",\n studio_editor_collection_start_reset_filter: \"Reset to default filter and sort\",\n studio_editor_collection_start_saved: \"Default config saved\",\n studio_home_duplicate_collection: \"Duplicate\",\n studio_home_delete: \"Delete\",\n studio_home_confirm_delete_no_data: \"This will not delete any data, only the collection in the CMS\",\n studio_home_collection_deleted: \"Collection deleted\",\n studio_kanban_configure: \"Configure Kanban\",\n studio_missing_reference_error: \"No collection for path: {{path}}\",\n studio_new_collection_add: \"नया संग्रह जोड़ें\",\n\n // ─── Property field labels ──────────────────────────────────\n db_column_type: \"डेटाबेस कॉलम प्रकार\",\n primary_key_unique_id: \"प्राथमिक कुंजी / अद्वितीय ID\",\n spread_children_as_columns: \"बच्चों को कॉलम के रूप में फैलाएं\",\n mode: \"मोड\",\n timezone: \"समय क्षेत्र\",\n target_collection: \"लक्ष्य संग्रह\",\n\n // ─── Storage property ───────────────────────────────────────\n storage_file_name: \"फ़ाइल का नाम\",\n storage_path: \"संग्रहण पथ\",\n storage_max_size: \"अधिकतम आकार (बाइट्स में)\",\n storage_resize_mode: \"आकार बदलने का मोड\",\n storage_output_format: \"आउटपुट प्रारूप\",\n storage_max_width: \"अधिकतम चौड़ाई (px)\",\n storage_max_height: \"अधिकतम ऊंचाई (px)\",\n storage_quality: \"गुणवत्ता (0-100)\",\n storage_file_upload_config: \"फ़ाइल अपलोड कॉन्फ़िगरेशन\",\n storage_image_resize_config: \"इमेज आकार बदलने का कॉन्फ़िगरेशन\",\n storage_all_file_types: \"सभी फ़ाइल प्रकार अनुमत\",\n storage_allowed_file_types: \"अनुमत फ़ाइल प्रकार\",\n storage_include_bucket_url: \"सहेजे गए मान में बकेट URL (s3://...) शामिल करें\",\n storage_save_url: \"संग्रहण पथ के बजाय URL सहेजें\",\n\n // ─── DateTime property ──────────────────────────────────────\n datetime_automatic_value: \"स्वचालित मान\",\n\n // ─── Markdown property ──────────────────────────────────────\n markdown_paste_behavior: \"पेस्ट व्यवहार\",\n markdown_strip_html: \"पेस्ट करते समय HTML हटाएं\",\n markdown_convert_pasted: \"पेस्ट किए गए टेक्स्ट को मार्कडाउन में बदलें\"\n};\n","import { RebaseTranslations } from \"@rebasepro/types\";\n\n/**\n * Portuguese (pt) translations for @rebasepro/app.\n *\n * @group Core\n */\nexport const pt: RebaseTranslations = {\n // ─── Form actions ────────────────────────────────────────────\n save: \"Guardar\",\n create: \"Criar\",\n create_copy: \"Criar cópia\",\n save_and_close: \"Guardar e fechar\",\n create_copy_and_close: \"Criar cópia e fechar\",\n create_and_close: \"Criar e fechar\",\n discard: \"Descartar\",\n clear: \"Limpar\",\n cancel: \"Cancelar\",\n\n // ─── Entity actions ──────────────────────────────────────────\n edit: \"Editar\",\n copy: \"Copiar\",\n delete: \"Eliminar\",\n delete_not_allowed: \"Selecionou pelo menos uma entidade que não pode eliminar\",\n\n // ─── Delete dialog ───────────────────────────────────────────\n delete_confirmation_title: \"Eliminar?\",\n delete_confirmation_body: \"Esta ação eliminará a entidade. Tem a certeza?\",\n delete_multiple_confirmation_body: \"Esta ação eliminará as entidades selecionadas. Tem a certeza?\",\n\n // ─── Unsaved-changes dialog ───────────────────────────────────\n unsaved_changes_title: \"Alterações não guardadas\",\n unsaved_changes_body: \"Tem alterações não guardadas. Deseja descartá-las?\",\n discard_changes: \"Descartar alterações\",\n keep_editing: \"Continuar a editar\",\n clear_form: \"Limpar formulário?\",\n discard_changes_confirmation: \"Todas as alterações não guardadas serão perdidas. Esta ação não pode ser desfeita.\",\n clear_form_confirmation: \"Todos os valores introduzidos serão apagados. Esta ação não pode ser desfeita.\",\n\n // ─── Collection table / toolbar ──────────────────────────────\n search: \"Pesquisar\",\n find_by_id: \"Encontrar por ID\",\n find_entity_by_id: \"Encontrar entidade por ID\",\n filter: \"Filtrar\",\n filters: \"Filtros\",\n clear_filter: \"Limpar filtro\",\n clear_filter_sort: \"Limpar filtro/ordenação\",\n clear_sort: \"Limpar ordenação\",\n clear_all: \"Limpar tudo\",\n no_items: \"Sem itens\",\n no_entries_found: \"Nenhum registo encontrado\",\n all_entries_loaded: \"Todos os {{count}} registos carregados\",\n create_your_first_entry: \"Crie o seu primeiro registo\",\n no_results_filter_sort: \"Sem resultados com o filtro/ordenação aplicado\",\n no_results_search: \"Nenhum resultado encontrado para \\\"{{search}}\\\"\",\n add: \"Adicionar\",\n remove: \"Remover\",\n multiple_entities: \"Múltiplas entidades\",\n unsaved_changes: \"Tem alterações não guardadas em {{collectionName}}.\",\n so_empty: \"Tão vazio...\",\n no_results: \"Sem resultados com o filtro/ordenação aplicado\",\n refresh_data: \"Atualizar dados\",\n dark_mode: \"Escuro\",\n light_mode: \"Claro\",\n system_mode: \"Sistema\",\n ok: \"Ok\",\n save_collection_config: \"Guardar estrutura da coleção\",\n search_for_more_icons: \"Pesquisar mais ícones…\",\n ai_modified: \"Modificado por IA\",\n size_label: \"Tamanho\",\n group_by: \"Agrupar por\",\n initialize_kanban_order: \"Inicializar Ordem Kanban\",\n copy_id: \"Copiar ID\",\n add_specific: \"Adicionar {{name}}\",\n select_specific: \"Selecionar {{name}}\",\n select_from: \"Selecionar de {{name}}\",\n done: \"Concluído\",\n log_out: \"Terminar sessão\",\n column_cannot_be_edited: \"Esta coluna não pode ser editada diretamente\",\n close: \"Fechar\",\n unsaved_local_changes: \"Alterações locais não guardadas\",\n unsaved_local_changes_description: \"Este documento foi editado localmente e tem alterações não guardadas. Estas alterações locais serão perdidas se não as aplicar.\",\n preview_changes: \"Pré-visualizar alterações\",\n apply_changes: \"Aplicar alterações\",\n discard_local_changes: \"Descartar alterações locais\",\n preview_local_changes: \"Pré-visualizar alterações locais\",\n preview_local_changes_description: \"Estas são as alterações locais que serão aplicadas ao formulário.\",\n type: \"Tipo\",\n string: \"string\",\n number: \"número\",\n boolean: \"booleano\",\n date: \"data\",\n map: \"mapa\",\n array: \"lista\",\n arrays_of_arrays_not_supported: \"Listas de listas não são suportadas.\",\n data_type_not_supported: \"Tipo de dados {{dataType}} ainda não suportado\",\n passkey_error_unsupported: \"O seu dispositivo ou browser não suporta passkeys.\",\n\n // ─── Entity form feedback ─────────────────────────────────────\n saved_correctly: \"Guardado com sucesso\",\n error_before_saving: \"Erro ao preparar os dados\",\n error_after_saving: \"Erro no processamento pós-gravação\",\n error_saving_entity: \"Erro ao guardar a entidade\",\n entity_does_not_exist: \"Esta entidade não existe na base de dados\",\n form_modified: \"Este formulário foi modificado\",\n form_in_sync: \"O formulário atual está sincronizado com a base de dados\",\n fix_errors_before_saving: \"Corrija os erros destacados antes de guardar\",\n\n admin: \"Administrador\",\n home: \"Início\",\n this_form_has_errors: \"Este formulário tem erros\",\n error_loading_navigation: \"Erro ao carregar navegação\",\n error_loading_auth: \"Erro ao carregar autenticação\",\n this_form_has_been_modified: \"Este formulário foi modificado\",\n current_form_in_sync: \"O formulário atual está sincronizado com a base de dados\",\n open_in_console: \"Abrir na consola\",\n collection_does_not_exist: \"A coleção especificada não existe. Verifique a consola\",\n unexpected_value: \"Valor inesperado\",\n unexpected_value_click_to_edit: \"Valor inesperado. Clique para editar\",\n unexpected_reference_value: \"Valor de referência inesperado. Clique para editar\",\n copy_url_to_clipboard: \"Copiar URL para a área de transferência\",\n open_image_in_new_tab: \"Abrir imagem numa nova aba\",\n reference_not_set: \"Referência não definida\",\n reference_does_not_exist: \"A referência não existe\",\n entity_not_found: \"Entidade não encontrada\",\n file_not_found: \"Ficheiro não encontrado\",\n unsaved_changes_in_entity: \"Tem alterações não guardadas nesta entidade.\",\n delete_this_role: \"Eliminar esta função\",\n no_roles_yet: \"Ainda não tem nenhuma função.\",\n create_default_roles: \"Criar funções predefinidas\",\n delete_role_confirmation: \"Tem a certeza de que quer eliminar esta função?\",\n delete_this_user: \"Eliminar este utilizador\",\n no_users_yet: \"Ainda não existem utilizadores\",\n add_logged_user_as_admin: \"Adicionar o utilizador com sessão iniciada como administrador\",\n add_current_user_as_admin: \"Adicionar utilizador atual como administrador\",\n create_default_roles_and_add_admin: \"Criar funções predefinidas e adicionar utilizador atual como administrador\",\n delete_user_confirmation: \"Tem a certeza de que quer eliminar este utilizador?\",\n create_your_users_and_roles: \"Crie os seus utilizadores e funções\",\n no_users_or_roles_defined: \"Não tem utilizadores ou funções definidas. Pode criar funções predefinidas e adicionar o utilizador atual como administrador.\",\n no_permission_to_view_users: \"Não tem permissão para ver os utilizadores\",\n no_permission_to_view_roles: \"Não tem permissão para ver as funções\",\n no_permission_description: \"Contacte um administrador se precisar de acesso a esta secção.\",\n save_before_changing_schema: \"Precisa de guardar o documento antes de alterar o esquema\",\n edit_schema_for_this_form: \"Editar esquema para este formulário\",\n no_permissions_to_edit_collection: \"Não tem permissões para editar esta coleção\",\n browser_does_not_support_audio: \"O seu browser não suporta o elemento de áudio.\",\n user_not_found: \"Utilizador não encontrado: {{value}}\",\n\n // ─── Collection view actions ──────────────────────────────────\n delete_selected: \"Eliminar\",\n cannot_delete_selected: \"Selecionou pelo menos uma entidade que não pode eliminar\",\n\n // ─── Array / field containers ─────────────────────────────────\n add_entry: \"Adicionar\",\n add_on_top: \"Adicionar no topo\",\n add_below: \"Adicionar abaixo\",\n add_to_field: \"Adicionar a {{fieldName}}\",\n value: \"Valor\",\n key: \"Chave\",\n drag_drop_multiple: \"Arraste e solte ficheiros aqui, ou clique para selecionar. Arraste para reordenar.\",\n drag_drop_single: \"Arraste e solte um ficheiro aqui, ou clique para selecionar um\",\n\n // ─── Navigation / scaffold ────────────────────────────────────\n open_menu: \"Abrir menu\",\n close_drawer: \"Fechar painel lateral\",\n navigation_drawer: \"Painel lateral de navegação\",\n collapse: \"Recolher\",\n expand: \"Expandir\",\n\n // ─── Error states ─────────────────────────────────────────────\n error: \"Erro\",\n error_uploading_file: \"Erro ao carregar ficheiro\",\n error_deleting: \"Erro ao eliminar\",\n error_before_delete: \"Erro antes de eliminar\",\n error_updating_asset: \"Erro ao atualizar recurso\",\n error_deleting_asset: \"Erro ao eliminar recurso\",\n error_firestore_index: \"É necessário um índice Firestore para esta consulta.\",\n create_index: \"Criar índice\",\n value_is_not_reference: \"O valor não é uma referência.\",\n click_to_edit: \"Clique para editar\",\n data_is_not_array_of_references: \"Os dados não são uma lista de referências\",\n\n // ─── Misc ─────────────────────────────────────────────────────\n loading: \"A carregar\",\n local_changes_applied: \"Alterações locais aplicadas ao formulário\",\n local_changes_discarded: \"Alterações locais descartadas\",\n are_you_sure_leave: \"Tem a certeza de que quer sair desta página?\",\n see_console_details: \"Consulte a consola para mais detalhes.\",\n drop_here_create_group: \"Solte aqui para criar um novo grupo\",\n filter_for_null_values: \"Filtrar valores nulos\",\n value_updated_elsewhere: \"Este valor foi atualizado noutro local\",\n add_property: \"Adicionar propriedade\",\n edit_name: \"Editar {{name}}\",\n this_entity_not_exist: \"Esta entidade não existe na base de dados\",\n internal_error: \"ERRO interno\",\n\n // ─── Rename group dialog ──────────────────────────────────────\n rename_group: \"Renomear Grupo\",\n group_name_label: \"Nome do Grupo\",\n group_name_empty_error: \"O nome do grupo não pode estar vazio.\",\n group_name_exists_error: \"Este nome de grupo já existe.\",\n\n // ─── Search ───────────────────────────────────────────────────\n search_collections: \"Pesquisar coleções\",\n\n // ─── Navigation groups ────────────────────────────────────────\n views_group: \"Visualizações\",\n\n // ─── Entity Edit View ─────────────────────────────────────────\n youd_need_to_save_before_additional_collections: \"Precisa de guardar a sua entidade antes de adicionar coleções adicionais\",\n\n // ─── Not Found Page ───────────────────────────────────────────\n page_not_found: \"Página não encontrada\",\n page_not_found_body: \"Esta página não existe ou pode não ter acesso a ela\",\n back_to_home: \"Voltar ao início\",\n\n // ─── Collection Editor ─────────────────────────────────────────\n default_collection_view: \"Vista de coleção predefinida\",\n table_view: \"Tabela\",\n cards_view: \"Cartões\",\n kanban_view: \"Kanban\",\n choose_how_entities_displayed_default: \"Escolha como as entidades devem ser exibidas por padrão\",\n\n document_view: \"Vista de documento\",\n side_panel: \"Painel lateral\",\n full_screen: \"Ecrã inteiro\",\n should_documents_opened_full_screen: \"Os documentos devem ser abertos em ecrã inteiro ou num painel lateral inline\",\n\n select_custom_view: \"Selecionar vista personalizada\",\n no_custom_views_defined: \"Nenhuma vista personalizada definida. Defina as suas vistas personalizadas nas definições de personalização, antes de usar este diálogo.\",\n\n select_custom_action: \"Selecionar ação personalizada\",\n no_custom_actions_defined: \"Nenhuma ação personalizada definida. Defina as suas ações personalizadas nas definições de personalização, antes de usar este diálogo.\",\n\n no_collections_found: \"Nenhuma coleção encontrada\",\n start_building_collections: \"Comece a criar coleções no Rebase facilmente. Mapeie-as aos dados existentes na sua base de dados, importe de ficheiros ou use os nossos modelos.\",\n create_first_collection: \"Crie a sua primeira coleção\",\n define_collections_programmatically: \"Também pode definir coleções programaticamente.\",\n edit_collection: \"Editar coleção\",\n no_permissions_edit_collection: \"Não tem permissões para editar esta coleção\",\n no_permissions_create_collection: \"Não tem permissões para criar coleções\",\n create_collection: \"Criar coleção\",\n update_collection: \"Atualizar coleção\",\n\n new_collection: \"Nova coleção\",\n add_new_collection: \"Adicionar nova coleção\",\n collection_with_name: \"Coleção {{name}}\",\n change_icon: \"Alterar ícone\",\n is_subcollection_of: \"Esta é uma subcoleção de\",\n name: \"Nome\",\n collection_name_description: \"Nome desta coleção, normalmente um nome no plural (ex. Produtos)\",\n path: \"Caminho\",\n relative_path_to_parent: \"Caminho relativo ao pai (não é necessário incluir o caminho do pai)\",\n path_in_database: \"Caminho em que esta coleção está armazenada na base de dados\",\n singular_name: \"Nome singular\",\n singular_name_description: \"Opcionalmente defina um nome singular para as suas entidades\",\n description: \"Descrição\",\n description_of_collection: \"Descrição da coleção, pode usar markdown\",\n collection_id: \"ID da coleção\",\n collection_id_description: \"Este ID identifica esta coleção. Normalmente igual ao caminho.\",\n collection_group: \"Grupo de coleções\",\n collection_group_description: \"Um grupo de coleções consiste em todas as coleções com o mesmo caminho. Isto permite consultar várias coleções ao mesmo tempo.\",\n advanced_settings: \"Definições avançadas\",\n doc_history_global: \"Revisões do histórico do documento ativadas se ativadas globalmente\",\n doc_history_enabled: \"Revisões do histórico do documento ATIVADAS\",\n doc_history_not_enabled: \"Revisões do histórico do documento NÃO ativadas\",\n doc_history_description: \"Quando ativado, cada documento nesta coleção terá um histórico de alterações. Útil para fins de auditoria. Os dados são armazenados numa subcoleção do documento na sua base de dados, chamada __history.\",\n document_id_generation: \"Geração de IDs de documentos\",\n code_defined: \"Definido por código\",\n users_must_define_id: \"Os utilizadores devem definir um ID\",\n users_can_define_id: \"Os utilizadores podem definir um ID, mas não é obrigatório\",\n doc_id_auto_generated: \"O ID do documento é gerado automaticamente\",\n config_doc_id_generation: \"Configure como os IDs de documentos são gerados ao criar novas entidades.\",\n enable_text_search: \"Ativar pesquisa de texto para esta coleção\",\n text_search_description: \"Permitir pesquisa de texto para esta coleção. Se não especificou um delegado de pesquisa de texto, será usada a pesquisa de texto local integrada. Não recomendado para grandes coleções, pois pode causar problemas de desempenho e custo.\",\n database_id: \"ID da base de dados\",\n default_text: \"(predefinição)\",\n\n custom_actions: \"Ações personalizadas\",\n more_info: \"Mais informações\",\n define_custom_actions_cli: \"Defina as suas próprias ações personalizadas carregando-as com o CLI.\",\n action_defined_in_code: \"Esta ação está definida em código com a chave\",\n add_custom_entity_action: \"Adicionar ação de entidade personalizada\",\n remove_this_action: \"Remover esta ação?\",\n remove_action_warning: \"Isto não eliminará nenhum dado, apenas a ação no CMS\",\n\n subcollections_of: \"Subcoleções de\",\n add_subcollection: \"Adicionar subcoleção\",\n custom_views: \"Vistas personalizadas\",\n define_custom_views_cli: \"Defina as suas próprias vistas personalizadas carregando-as com o CLI.\",\n view_defined_in_code: \"Esta vista está definida em código com a chave\",\n add_custom_entity_view: \"Adicionar vista de entidade personalizada\",\n delete_this_subcollection: \"Eliminar esta subcoleção?\",\n remove_collection_warning: \"Isto não eliminará nenhum dado, apenas a coleção no CMS\",\n remove_this_view: \"Remover esta vista?\",\n remove_view_warning: \"Isto não eliminará nenhum dado, apenas a vista no CMS\",\n\n no_collection_selected: \"Nenhuma coleção selecionada\",\n code_for_collection: \"Código para\",\n use_config_define_json: \"Use esta configuração para definir a coleção em formato JSON.\",\n customise_collection_code: \"Se quiser personalizar a coleção em código, pode adicionar este código de coleção à configuração da sua aplicação CMS.\",\n copied: \"Copiado\",\n\n property_cant_be_edited: \"Esta propriedade não pode ser editada\",\n property_not_editable_description: \"Pode não ter permissão para editá-la ou está definida em código e não pode ser modificada.\",\n delete_this_property: \"Eliminar esta propriedade?\",\n delete_property_warning: \"Isto não eliminará nenhum dado, apenas modificará a coleção.\",\n error_must_specify_id: \"Deve especificar um id para o campo\",\n error_id_format: \"O id só pode conter letras, números e underscores (_), e não pode começar com um número\",\n error_id_already_exists: \"Já existe outro campo com este ID\",\n error_must_specify_title: \"Deve especificar um título para o campo\",\n custom_or_other: \"Personalizado/Outro\",\n select_property_widget: \"Selecionar um widget de propriedade\",\n error_changing_data_type: \"Este widget usa um tipo de dados diferente do widget inicialmente selecionado. Isto pode causar erros com dados existentes.\",\n required: \"Obrigatório\",\n\n enum_form_dialog: \"Diálogo de formulário enum\",\n imported_data_preview: \"Pré-visualização de dados importados\",\n entities_with_same_id_overwritten: \"Entidades com o mesmo id serão substituídas\",\n collection_editor: \"Editor de coleção\",\n properties_in_this_group: \"Propriedades neste grupo\",\n data_property_mapping: \"Mapeamento de propriedade de dados\",\n property_edit_view: \"Vista de edição de propriedade\",\n all_of_these: \"Todos estes\",\n any_of_these: \"Qualquer um destes\",\n\n only_admins_edit_roles: \"Apenas administradores podem editar funções\",\n error_user_not_found: \"Utilizador não encontrado\",\n all_roles: \"Todos os papéis\",\n role: \"Função\",\n name_of_this_role: \"Nome desta função\",\n id_of_this_role: \"ID desta função\",\n create_entities: \"Criar entidades\",\n read_entities: \"Ler entidades\",\n update_entities: \"Atualizar entidades\",\n delete_entities: \"Eliminar entidades\",\n all_collections: \"Todas as coleções\",\n create_entities_in_collections: \"Criar entidades em coleções\",\n access_all_data_in_every_collection: \"Aceder a todos os dados em todas as coleções\",\n update_data_in_any_collection: \"Atualizar dados em qualquer coleção\",\n delete_data_in_any_collection: \"Eliminar dados em qualquer coleção\",\n allow_all_permissions_in_this_collections: \"Permitir todas as permissões nestas coleções\",\n all: \"Todos\",\n customise_permissions_description: \"Pode personalizar as permissões que os utilizadores relacionados com esta função podem realizar nas entidades de cada coleção\",\n create_collections: \"Criar coleções\",\n yes: \"Sim\",\n no: \"Não\",\n can_user_create_collections: \"O utilizador pode criar coleções\",\n edit_collections: \"Editar coleções\",\n only_own_collections: \"Apenas as suas próprias\",\n own: \"Próprias\",\n can_user_edit_collections: \"O utilizador pode editar coleções\",\n delete_collections: \"Eliminar coleções\",\n can_user_delete_collections: \"O utilizador pode eliminar coleções\",\n error_saving_role: \"Ocorreu um erro ao guardar esta função\",\n create_role: \"Criar função\",\n update: \"Atualizar\",\n\n only_admins_change_roles: \"Apenas administradores podem alterar funções\",\n must_be_at_least_one_admin: \"Deve existir pelo menos um administrador\",\n logged_user_not_found: \"Utilizador com sessão iniciada não encontrado\",\n user: \"Utilizador\",\n user_id: \"ID do utilizador\",\n name_of_this_user: \"Nome deste utilizador\",\n email_of_this_user: \"Email deste utilizador\",\n roles: \"Funções\",\n create_user: \"Criar utilizador\",\n\n users: \"Utilizadores\",\n add_user: \"Adicionar utilizador\",\n add_role: \"Adicionar função\",\n is_admin: \"É Administrador\",\n default_permissions: \"Permissões predefinidas\",\n created_on: \"Criado em\",\n email: \"Email\",\n id: \"ID\",\n read: \"Ler\",\n\n column_in_file: \"Coluna no ficheiro\",\n map_to_property: \"Mapear para propriedade\",\n default_values: \"Valores predefinidos\",\n default_values_description: \"Pode selecionar um valor predefinido para colunas não mapeadas e valores vazios:\",\n property: \"Propriedade\",\n default_value: \"Valor predefinido\",\n autogenerate_id: \"Gerar ID automaticamente\",\n id_column_description: \"Coluna que será usada como ID para cada documento\",\n do_not_set_value: \"Não definir valor\",\n set_value_to_true: \"Definir valor como verdadeiro\",\n set_value_to_false: \"Definir valor como falso\",\n drag_and_drop_file: \"Arraste e solte um ficheiro aqui ou clique para carregar\",\n error_saving_data: \"Erro ao guardar dados\",\n retry: \"Tentar novamente\",\n saving_data: \"A guardar dados\",\n entities_saved: \"entidades guardadas\",\n do_not_close_tab: \"Não feche este separador ou a importação será interrompida\",\n import: \"Importar\",\n import_data: \"Importar dados\",\n upload_file_description: \"Carregue um ficheiro CSV, Excel ou JSON e mapeie-o para o esquema existente\",\n back: \"Voltar\",\n next: \"Seguinte\",\n save_data: \"Guardar dados\",\n use_column_as_id: \"Usar esta coluna como ID\",\n do_not_import_property: \"Não importar esta propriedade\",\n entities_will_be_overwritten: \"Entidades com o mesmo id serão substituídas\",\n data_imported_successfully: \"Dados importados com sucesso\",\n export: \"Exportar\",\n export_data: \"Exportar dados\",\n download_table_csv: \"Descarregar o conteúdo desta tabela como CSV\",\n csv: \"CSV\",\n json: \"JSON\",\n dates_as_timestamps: \"Datas como timestamps\",\n dates_as_strings: \"Datas como strings\",\n flatten_arrays: \"Achatar listas\",\n download: \"Descarregar\",\n large_number_of_documents: \"Esta coleção tem um grande número de documentos ({{count}}).\",\n include_undefined_values: \"Incluir valores indefinidos\",\n submit: \"Submeter\",\n\n no_filterable_properties: \"Não há propriedades filtráveis disponíveis\",\n apply_filters: \"Aplicar filtros\",\n list: \"Lista\",\n table_view_mode: \"Tabela\",\n cards: \"Cartões\",\n board: \"Quadro\",\n initialize_kanban_order_desc: \"Isto atribuirá valores de ordem sequenciais a todos os itens que não tenham um. Os itens manterão a sua ordem atual dentro de cada coluna.\",\n kanban_view_not_available: \"A vista Kanban não está disponível\",\n kanban_view_requires_enum: \"A vista Kanban requer uma propriedade de string com valores enum para agrupar entidades em colunas. Adicione uma propriedade enum ao esquema da sua coleção para usar esta vista.\",\n no_enum_values_configured: 'Nenhum valor enum configurado para a propriedade \"{{property}}\"',\n items_need_backfill: \"Alguns itens não têm valores de ordem. Inicialize para ativar a reordenação por arrastar e soltar.\",\n kanban_order_not_configured: \"A ordenação por arrastar e soltar não está configurada. Defina uma propriedade de ordem nas configurações da coleção para manter as posições dos cartões.\",\n initialize: \"Inicializar\",\n confirm_multiple_delete: \"Confirmar eliminação múltipla?\",\n delete_entity_confirm_title: \"Deseja eliminar este/a {{entityName}}?\",\n multiple_deleted: \"Exclusão múltipla\",\n some_entities_deleted: \"Algumas entidades foram excluídas, mas não todas\",\n error_deleting_entities: \"Erro ao excluir entidades\",\n deleted: \"excluído(a)\",\n\n /** AI Collection Generator Popover */\n generate_collection_with_ai: \"Gerar Coleção com IA\",\n modify_collection_with_ai: \"Modificar Coleção com IA\",\n describe_collection_to_create: \"Descreva a coleção que quer criar.\",\n describe_changes_to_make: \"Descreva as alterações que quer fazer a esta coleção.\",\n ai_placeholder_create: \"ex.: Criar uma coleção de produtos com nome, preço, descrição e categoria...\",\n ai_placeholder_modify: \"ex.: Adicionar um campo de imagem miniatura com armazenamento, tornar o preço obrigatório...\",\n ai_assist: \"Assistente IA\",\n generating: \"A gerar...\",\n\n /** Recently extracted strings for collection editor */\n this_is_subcollection_of: \"Esta é uma subcoleção de\",\n use_existing_paths_database: \"Use um dos caminhos existentes na sua base de dados:\",\n describe_collection_ai: \"Descreva a sua coleção à IA:\",\n generate_with_ai: \"Gerar com IA\",\n create_from_json_config: \"Criar a partir de configuração JSON:\",\n paste_json_config: \"Colar Configuração JSON\",\n create_collection_from_file_formats: \"Criar uma coleção a partir de um ficheiro (csv, json, xls, xslx...)\",\n select_template: \"Selecionar um modelo:\",\n products: \"Produtos\",\n collection_products_subtitle: \"Uma coleção de produtos com imagens, preços e stock\",\n collection_users_subtitle: \"Uma coleção de utilizadores com emails, nomes e funções\",\n blog_posts: \"Publicações de blog\",\n collection_blog_posts_subtitle: \"Uma coleção de publicações de blog com imagens, autores e conteúdo complexo\",\n pages: \"Páginas\",\n collection_pages_subtitle: \"Uma coleção de páginas com imagens, autores e conteúdo complexo\",\n continue_from_scratch: \"Continuar do zero\",\n\n /** Admin views config */\n cms_users: \"Utilizadores do CMS\",\n roles_menu: \"Funções\",\n project_settings: \"Definições do projeto\",\n\n by_signing_in_you_agree_to_our: \"Ao iniciar sessão, concorda com os nossos\",\n terms_and_conditions: \"Termos e Condições\",\n and_our: \"e a nossa\",\n privacy_policy: \"Política de privacidade\",\n email_password: \"Email/palavra-passe\",\n sign_in_with_google: \"Iniciar sessão com Google\",\n\n // --- Auth error messages ---\n auth_user_not_found: \"Utilizador não encontrado\",\n auth_wrong_password: \"Palavra-passe incorreta. Por favor tente novamente.\",\n auth_user_disabled: \"Utilizador desativado. Por favor contacte o suporte.\",\n auth_account_exists_with_different_credential: \"Conta existente com método de início de sessão diferente\",\n auth_email_already_in_use: \"O email já está em uso\",\n auth_google_permissions_required: \"Precisa de conceder permissões adicionais para gerir os seus projetos Google Cloud\",\n auth_invalid_email_password: \"Por favor introduza o email e a palavra-passe\",\n auth_enter_email_first: \"Por favor introduza primeiro o seu email\",\n auth_password_reset_sent: \"Email de redefinição de palavra-passe enviado\",\n auth_sign_in_account: \"Iniciar sessão na sua conta\",\n auth_create_new_account: \"Criar uma nova conta\",\n auth_password: \"Palavra-passe\",\n auth_reset_password: \"Redefinir palavra-passe\",\n auth_new_user: \"Novo utilizador?\",\n auth_have_account: \"Já tem uma conta?\",\n auth_sign_in: \"Iniciar Sessão\",\n auth_sign_up: \"Registar\",\n\n\n auto_setup_collections_button: \"Configurar coleções automaticamente\",\n auto_setup_collections_title: \"Configurar coleções automaticamente?\",\n auto_setup_collections_desc: \"Isto criará automaticamente configurações de coleção para coleções que <b>NÃO</b> estão já mapeadas\",\n this_can_take_a_minute: \"Isto pode demorar um ou dois minutos\",\n no_collections_found_to_setup: \"Nenhuma coleção encontrada para configurar.\",\n collections_have_been_setup: \"As coleções foram configuradas automaticamente.\",\n error_setting_up_collections: \"Erro ao configurar coleções automaticamente\",\n\n // --- Home Suggestions ---\n add_your: \"Adicione as suas\",\n database_collections: \"coleções da base de dados\",\n no_unmapped_collections: \"Sem coleções não mapeadas na base de dados\",\n query_and_update_with_datatalk: \"Consulte e atualize os seus dados em linguagem natural com\",\n\n welcome_to_rebase: \"Bem-vindo ao Rebase Cloud\",\n admin_panel_ready_bring_data: \"O seu painel de administração está pronto. Vamos importar os seus dados.\",\n admin_panel_ready_get_started: \"O seu painel de administração está pronto. Veja como começar.\",\n auto_detect_collections: \"Detetar coleções automaticamente\",\n auto_detect_collections_desc: \"Deixe a IA analisar a sua base de dados e gerar automaticamente esquemas de coleção.\",\n create_a_collection: \"Criar uma coleção\",\n create_collection_desc: \"Defina manualmente a sua primeira coleção do zero usando o editor visual.\",\n read_the_docs: \"Ler a documentação\",\n read_the_docs_desc: \"Saiba como personalizar campos, vistas, ações e muito mais.\",\n explore_docs: \"Explorar documentação\",\n want_to_customize_with_code: \"Quer personalizar com código? Execute\",\n to_scaffold_a_local_project: \"para criar um projeto local.\",\n\n // ─── Collection Editor — Validation ──────────────────────────\n validation: \"Validação\",\n unique: \"Único\",\n required_message: \"Mensagem de campo obrigatório\",\n required_tooltip: \"Você não poderá salvar esta entidade se este valor não estiver definido\",\n unique_tooltip: \"Não pode haver múltiplas entidades com o mesmo valor\",\n lowercase: \"Minúsculas\",\n uppercase: \"Maiúsculas\",\n trim: \"Remover espaços\",\n exact_length: \"Comprimento exato\",\n min_length: \"Comprimento mín.\",\n max_length: \"Comprimento máx.\",\n matches_regex: \"Corresponde a regex\",\n not_valid_regexp: \"Expressão regular inválida\",\n regex_helper: \"ex. /^\\\\d+$/ apenas para dígitos\",\n min_value: \"Valor mín.\",\n max_value: \"Valor máx.\",\n less_than: \"Menor que\",\n more_than: \"Maior que\",\n positive_value: \"Valor positivo\",\n negative_value: \"Valor negativo\",\n integer_value: \"Valor inteiro\",\n\n // ─── Collection Editor — Property Edit ───────────────────────\n invalid_regular_expression: \"Expressão regular inválida\",\n must_specify_target_collection: \"Você deve especificar uma coleção de destino para o campo\",\n need_specify_repeat_field: \"Você precisa especificar um campo de repetição\",\n need_specify_block_properties: \"Você precisa especificar as propriedades deste bloco\",\n incomplete_condition: \"Condição incompleta - por favor selecione um campo\",\n field_name: \"Nome do campo\",\n\n // ─── Collection Editor — Display & Config ────────────────────\n kanban_column_property: \"Propriedade de coluna Kanban\",\n select_a_property: \"Selecionar uma propriedade\",\n kanban_property_not_found: \"A propriedade \\\"{{property}}\\\" não existe ou não é uma propriedade string com enum. Selecione uma propriedade válida ou limpe a seleção.\",\n no_enum_string_properties: \"Nenhuma propriedade string com enum encontrada. Adicione uma propriedade string com enumValues para usar a visualização Kanban.\",\n kanban_column_description: \"Selecione uma propriedade string com valores enum para agrupar entidades em colunas\",\n create_property: \"+ Criar propriedade \\\"{{property}}\\\"\",\n order_property: \"Propriedade de ordem\",\n order_property_not_found: \"A propriedade \\\"{{property}}\\\" não existe ou não é uma propriedade numérica. Selecione uma propriedade válida ou limpe a seleção.\",\n no_number_properties: \"Nenhuma propriedade numérica encontrada. Adicione uma propriedade numérica para habilitar a ordenação.\",\n order_property_description: \"Selecione uma propriedade numérica para manter a ordem dos itens\",\n display_settings: \"Configurações de exibição\",\n default_row_size: \"Tamanho de linha padrão\",\n side_dialog_width: \"Largura do diálogo lateral\",\n side_dialog_width_description: \"Defina opcionalmente a largura (em pixels) do diálogo lateral de entidades. O padrão é 768px\",\n inline_editing_enabled: \"Os dados podem ser editados diretamente na visualização de tabela\",\n inline_editing_disabled: \"Os dados só podem ser editados na visualização de formulário\",\n inline_editing_description: \"Permitir edição de dados diretamente na visualização de tabela, sem abrir a visualização de formulário.\",\n include_json_view: \"Incluir visualização JSON\",\n no_json_view: \"Não incluir visualização JSON\",\n json_view_description: \"Incluir a representação JSON do documento.\",\n not_found_suffix: \"não encontrado\",\n\n // ─── Editor ─────────────────────────────────────────────────\n editor_text: \"Texto\",\n editor_text_description: \"Comece simplesmente a escrever em texto simples.\",\n editor_heading_1: \"Título 1\",\n editor_heading_1_description: \"Título de secção grande.\",\n editor_heading_2: \"Título 2\",\n editor_heading_2_description: \"Título de secção médio.\",\n editor_heading_3: \"Título 3\",\n editor_heading_3_description: \"Título de secção pequeno.\",\n editor_todo_list: \"Lista de Tarefas\",\n editor_todo_list_description: \"Acompanhe tarefas com uma lista de afazeres.\",\n editor_bullet_list: \"Lista com Marcadores\",\n editor_bullet_list_description: \"Crie uma lista simples com marcadores.\",\n editor_numbered_list: \"Lista Numerada\",\n editor_numbered_list_description: \"Crie uma lista com numeração.\",\n editor_quote: \"Citação\",\n editor_quote_description: \"Capture uma citação.\",\n editor_code: \"Código\",\n editor_code_description: \"Capture um snippet de código.\",\n editor_image: \"Imagem\",\n editor_image_description: \"Carregue uma imagem do seu computador.\",\n editor_multiple: \"Múltiplos\",\n editor_link: \"Ligação\",\n editor_save: \"Guardar\",\n editor_cancel: \"Cancelar\",\n editor_remove_link: \"Remover ligação\",\n editor_paste_or_type_link: \"Cole ou escreva a ligação\",\n editor_open_in_new_window: \"Abrir numa nova janela\",\n editor_bold: \"Negrito\",\n editor_italic: \"Itálico\",\n editor_underline: \"Sublinhado\",\n editor_strikethrough: \"Riscado\",\n editor_autocomplete: \"Preenchimento automático\",\n editor_autocomplete_description: \"Adicione texto com base no contexto.\",\n\n settings_heading: \"Definições\",\n settings_project_name: \"Nome do projeto\",\n settings_default_language: \"Idioma predefinido\",\n settings_default_language_caption: \"Selecione o idioma base para este projeto. Os utilizadores podem alterar esta preferência nas suas definições pessoais.\",\n settings_enable_local_text_search: \"Ativar pesquisa de texto local\",\n settings_local_text_search_caption: \"Ative a pesquisa de texto local para todas as coleções. Isto permitirá pesquisar campos de texto nas suas coleções usando a barra de pesquisa do Rebase. Note que esta funcionalidade pode resultar num maior número de leituras, pois todos os campos de texto das suas coleções serão indexados.\",\n settings_doc_history_all_collections: \"Histórico de documentos ativado para todas as coleções\",\n settings_doc_history_caption: \"Quando ativado, todas as coleções terão o histórico ativado por predefinição. Pode alterar esta definição em cada coleção. O histórico será guardado na subcoleção __history de cada documento.\",\n settings_theme: \"Tema\",\n settings_primary_color: \"Cor primária\",\n settings_secondary_color: \"Cor secundária\",\n settings_sample_theme_components: \"Exemplos de componentes do tema\",\n settings_drag_drop_logo: \"Arraste e solte o seu logótipo aqui\",\n settings_security_rules: \"Regras de segurança\",\n settings_security_rules_description: \"O Rebase utiliza as regras de segurança do Firebase para restringir o acesso aos dados. Ao criar um novo utilizador através do Rebase, o atributo personalizado rebaseUser é adicionado ao utilizador no projeto cliente. Ao adicionar as seguintes regras de segurança ao seu projeto, garante que os utilizadores do Rebase possam aceder aos dados através do Rebase.\",\n settings_security_rules_add_domain: \"Lembre-se de adicionar o domínio {{domain}} aos domínios permitidos do seu fornecedor\",\n settings_security_rules_caption: \"Estas regras restringem o acesso aos dados apenas aos utilizadores do Rebase, mas não aplicam as permissões ao nível da base de dados. As permissões são aplicadas no frontend, o que funciona bem para a maioria dos projetos. Se precisar de aplicar as permissões ao nível da base de dados, pode modificar estas regras de segurança. As funções atribuídas a um utilizador são definidas como atributos personalizados no token de autenticação do Firebase, pelo que pode utilizá-las nas suas regras de segurança.\",\n\n // ─── Text Search Dialog ─────────────────────────────────────\n text_search_dialog_title: \"Ativar pesquisa de texto\",\n text_search_local_not_recommended: \"A pesquisa de texto local não é recomendada para coleções grandes.\",\n text_search_local_fetch_warning: \"Note que ativar a pesquisa de texto local requer descarregar todos os documentos da sua coleção e armazená-los no navegador. Isto pode ser ineficiente para coleções grandes e gerar custos adicionais.\",\n text_search_external_suggestion: \"Para coleções maiores, recomendamos usar um motor de pesquisa externo como Algolia ou Elastic Search e atribuir um delegado de pesquisa à sua configuração.\",\n text_search_local_description: \"A pesquisa de texto local é a forma mais simples de ativar a pesquisa de texto na sua coleção. Carrega todos os documentos da coleção no navegador e efetua a pesquisa localmente. É a opção recomendada para coleções pequenas.\",\n text_search_own_implementation: \"Implementou o seu próprio controlador de pesquisa de texto. Pode ativar a pesquisa de texto para a sua coleção.\",\n text_search_enable_for_collection: \"Ativar para esta coleção\",\n text_search_enable_for_project: \"Ativar para o projeto\",\n text_search_enabled_snackbar: \"Pesquisa de texto local ativada\",\n\n // ─── Missing keys (English placeholders — translate) ───\nno_filter: \"No filter\",\n is_true: \"is true\",\n is_false: \"is false\",\n error_uploading_file_size: \"Error uploading file: File is larger than {{maxSize}} bytes\",\n error_uploading_file_type: \"Error uploading file: File type is not supported\",\n drag_drop_files: \"Drag 'n' drop some files here, or click here to edit\",\n drag_drop_file: \"Drag 'n' drop a file here, or click here to edit\",\n select_reference: \"Select reference\",\n select_references: \"Select references\",\n account_settings: \"Account Settings\",\n profile: \"Profile\",\n sessions: \"Sessions\",\n display_name: \"Display Name\",\n photo_url: \"Photo URL\",\n save_profile: \"Save Profile\",\n saving: \"Saving...\",\n no_active_sessions: \"No active sessions found.\",\n revoking: \"Revoking...\",\n revoke_all_sessions: \"Revoke All Sessions\",\n unknown_device: \"Unknown Device\",\n current: \"Current\",\n role_id: \"Role ID\",\n role_name: \"Role Name\",\n add_reference: \"Add reference\",\n add_reference_to: \"Add reference to {{name}}\",\n role_deleted_successfully: \"Role deleted successfully\",\n error_deleting_role: \"Error deleting role\",\n collection_permissions: \"Collection permissions\",\n collection: \"Collection\",\n no_collections_configured: \"No collections configured\",\n no_security_rules_defined: \"No security rules defined — all operations unrestricted\",\n no_rules: \"no rules\",\n bootstrap_admin_success: \"You are now an admin! Refreshing...\",\n failed_to_bootstrap_admin: \"Failed to bootstrap admin\",\n user_deleted_successfully: \"User deleted successfully\",\n error_deleting_user: \"Error deleting user\",\n add_row_before: \"Add row before\",\n add_row_after: \"Add row after\",\n delete_row: \"Delete row\",\n add_column_before: \"Add column before\",\n add_column_after: \"Add column after\",\n delete_column: \"Delete column\",\n delete_table: \"Delete table\",\n alt_text: \"Alt text\",\n title: \"Title\",\n a_property_of_this_map_has_error: \"A property of this map has an error\",\n studio_sql_executing_query: \"EXECUTING QUERY...\",\n studio_sql_query_error: \"Query Error\",\n studio_sql_run_query_placeholder: \"Run a query to see results\",\n studio_sql_visual_execution_plan: \"Visual Execution Plan\",\n studio_sql_success: \"SUCCESS\",\n studio_sql_no_results: \"Query executed successfully but returned no results.\",\n studio_sql_rows: \"Rows:\",\n studio_sql_time: \"Time:\",\n studio_sql_copy_markdown: \"Copy Markdown\",\n studio_sql_export_json: \"Export JSON\",\n studio_sql_export_csv: \"Export CSV\",\n studio_sql_format_sql: \"Format SQL\",\n studio_sql_explain: \"Explain\",\n studio_sql_limit_1000: \"Limit 1000\",\n studio_sql_remove_from_favorites: \"Remove from Favorites\",\n studio_sql_add_to_favorites: \"Add to Favorites\",\n studio_sql_save: \"Save\",\n studio_sql_run: \"Run\",\n studio_sql_database: \"Database\",\n studio_sql_role: \"Role\",\n studio_sql_admin: \"(Admin)\",\n studio_sql_select_db: \"Select DB\",\n studio_sql_query_results: \"Query Results\",\n studio_sql_save_snippet: \"Save SQL Snippet\",\n studio_sql_snippet_name: \"Snippet Name\",\n studio_sql_snippet_name_placeholder: \"e.g., Get All Users\",\n studio_sql_snippet_saved_local: \"This will be saved to your local storage.\",\n studio_sql_cancel: \"Cancel\",\n studio_sql_dangerous_operation: \"Dangerous Operation Detected\",\n studio_sql_dangerous_operation_body: \"The query you are about to run contains potentially destructive operations (DELETE, DROP, TRUNCATE, or UPDATE without WHERE). Are you sure you want to proceed?\",\n studio_sql_snippet_saved: \"Snippet \\\"{{name}}\\\" saved.\",\n studio_sql_markdown_copied: \"Results copied as Markdown!\",\n studio_sql_markdown_copy_failed: \"Failed to copy Markdown to clipboard.\",\n studio_sql_row_updated: \"Row updated successfully.\",\n studio_sql_cannot_edit_missing_query: \"Cannot edit rows: The underlying query is missing.\",\n studio_sql_cannot_resolve_table: \"Could not resolve table/primary key\",\n studio_sql_missing_pk: \"Row is missing primary key column(s): {{columns}}. Cannot safely update.\",\n studio_sql_update_failed: \"Failed to update: {{message}}\",\n studio_sql_execution_not_supported: \"SQL execution is not supported by the current data source.\",\n studio_sql_error_executing: \"An error occurred while executing the query.\",\n studio_sql_error_explaining: \"An error occurred while explaining the query.\",\n studio_sql_save_first_to_favorite: \"Please save the snippet first before favoriting.\",\n studio_sql_cms: \"Collections:\",\n studio_sql_cms_collections_tooltip: \"Tables in this query that are mapped as CMS collections\",\n studio_sql_edit_entity: \"Edit {{name}} #{{id}}\",\n studio_sql_sql_not_supported: \"SQL execution not supported by this data source\",\n studio_sql_fetch_error: \"Failed to fetch connection options: {{message}}\",\n studio_sql_unexpected_format: \"Unexpected data format: {{type}}\",\n studio_sql_no_tables: \"No tables found in this database.\",\n studio_sql_schema_fetch_error: \"Failed to fetch schema: {{message}}\",\n studio_sql_sidebar_snippets: \"Snippets\",\n studio_sql_sidebar_history: \"History\",\n studio_sql_sidebar_schema: \"Schema\",\n studio_sql_sidebar_no_snippets: \"No saved snippets\",\n studio_sql_sidebar_save_snippet_hint: \"Save a query to access it here.\",\n studio_sql_sidebar_no_history: \"No history\",\n studio_sql_sidebar_history_hint: \"Executed queries will appear here.\",\n studio_sql_sidebar_delete_snippet: \"Delete snippet\",\n studio_schema_tables: \"Tables\",\n studio_schema_loading: \"Loading schema...\",\n studio_schema_no_tables: \"No tables found\",\n studio_schema_retry: \"Retry\",\n studio_schema_primary_key: \"Primary Key\",\n studio_schema_select_all: \"SELECT * FROM\",\n studio_schema_insert_into: \"INSERT INTO\",\n studio_schema_update: \"UPDATE\",\n studio_schema_delete_from: \"DELETE FROM\",\n studio_schema_columns: \"{{count}} columns\",\n studio_rls_title: \"Row Level Security\",\n studio_rls_description: \"Manage RLS policies for your tables\",\n studio_rls_enabled: \"RLS Enabled\",\n studio_rls_disabled: \"RLS Disabled\",\n studio_rls_no_rls: \"No RLS\",\n studio_rls_enable_rls: \"Enable RLS\",\n studio_rls_disable_rls: \"Disable RLS\",\n studio_rls_create_policy: \"Create Policy\",\n studio_rls_policies: \"Policies\",\n studio_rls_no_policies: \"No policies defined\",\n studio_rls_no_policies_desc: \"This table has no RLS policies. All rows are accessible based on the RLS status.\",\n studio_rls_add_first_policy: \"Add your first policy\",\n studio_rls_force_rls: \"Force RLS\",\n studio_rls_force_rls_desc: \"When enabled, RLS policies apply to the table owner as well.\",\n studio_rls_enable_force_rls: \"Enable Force RLS\",\n studio_rls_disable_force_rls: \"Disable Force RLS\",\n studio_rls_edit: \"Edit\",\n studio_rls_delete: \"Delete\",\n studio_rls_confirm_delete_title: \"Delete Policy\",\n studio_rls_confirm_delete_body: \"Are you sure you want to delete this policy? This action cannot be undone.\",\n studio_rls_confirm_enable_title: \"Enable Row Level Security\",\n studio_rls_confirm_enable_body: \"Enabling RLS will restrict access to rows in this table based on your policies. Make sure you have appropriate policies in place.\",\n studio_rls_confirm_disable_title: \"Disable Row Level Security\",\n studio_rls_confirm_disable_body: \"Disabling RLS will make all rows accessible to all roles. Are you sure you want to continue?\",\n studio_rls_select_table: \"Select a table\",\n studio_rls_no_tables: \"No tables available\",\n studio_rls_error: \"Error loading policies\",\n studio_rls_retry: \"Retry\",\n studio_rls_loading: \"Loading policies...\",\n studio_policy_edit: \"Edit Policy\",\n studio_policy_create: \"Create New Policy\",\n studio_policy_defining_rules: \"Defining access rules for\",\n studio_policy_cancel: \"Cancel\",\n studio_policy_save: \"Save Policy\",\n studio_policy_template: \"Start from a template (Optional)\",\n studio_policy_select_template: \"Select a template...\",\n studio_policy_name: \"Policy Name\",\n studio_policy_name_placeholder: \"Give your policy a descriptive name\",\n studio_policy_behavior: \"Policy Behavior\",\n studio_policy_permissive: \"Permissive\",\n studio_policy_permissive_desc: \"Combined using \\\"OR\\\"\",\n studio_policy_restrictive: \"Restrictive\",\n studio_policy_restrictive_desc: \"Combined using \\\"AND\\\"\",\n studio_policy_command: \"Policy Command\",\n studio_policy_target_roles: \"Target Roles\",\n studio_policy_roles_placeholder: \"Select roles (defaults to public)\",\n studio_policy_using_expr: \"USING expression\",\n studio_policy_using_expr_desc: \"Applies to existing rows (SELECT, UPDATE, DELETE)\",\n studio_policy_check_expr: \"WITH CHECK expression\",\n studio_policy_check_expr_desc: \"Applies to new or modified rows (INSERT, UPDATE)\",\n studio_policy_help_title: \"Row Level Security (RLS) Guide\",\n studio_policy_help_intro: \"Row Level Security (RLS) allows you to restrict which rows a user can access or modify based on their authentication status or roles.\",\n studio_policy_help_step1_title: \"1. Select a Template\",\n studio_policy_help_step1_desc: \"If you're new to RLS, the easiest way to start is by selecting a predefined template from the dropdown. It will automatically configure the policy for common use cases like \\\"Users can update their own rows\\\".\",\n studio_policy_help_step2_title: \"2. Target Roles\",\n studio_policy_help_step2_desc: \"Choose which users the policy applies to:\",\n studio_policy_help_role_public: \"Applies to everyone (logged in or not).\",\n studio_policy_help_role_authenticated: \"Only applies to users who are logged in.\",\n studio_policy_help_role_anon: \"Only applies to users who are NOT logged in.\",\n studio_policy_help_step3_title: \"3. USING Expression\",\n studio_policy_help_step3_desc: \"A SQL condition that must evaluate to true for existing rows to be visible or updatable (SELECT, UPDATE, DELETE).\",\n studio_policy_help_step3_example: \"Ensures users can only see rows where they are the owner.\",\n studio_policy_help_step4_title: \"4. WITH CHECK Expression\",\n studio_policy_help_step4_desc: \"A SQL condition that must evaluate to true for new or modified rows to be saved (INSERT, UPDATE).\",\n studio_policy_help_step4_example: \"Usually the same as the USING expression when users are only allowed to insert/edit their own data.\",\n studio_policy_help_auth_vars_title: \"Rebase Auth Variables\",\n studio_policy_help_auth_vars_desc: \"Rebase provides native helper functions that you can use in your expressions:\",\n studio_policy_help_auth_uid: \"Returns the current user's ID as text. Example:\",\n studio_policy_help_auth_jwt: \"Returns the full JWT payload as JSONB so you can check custom claims. Example:\",\n studio_policy_help_auth_roles: \"Returns the user's role IDs as a comma-separated string. Best used with:\",\n studio_policy_help_docs_cta: \"To learn more about Postgres policies, check out the official documentation.\",\n studio_policy_help_read_docs: \"Read Docs\",\n studio_policy_help_got_it: \"Got it!\",\n studio_add_kanban_column: \"Add column\",\n studio_add_kanban_column_title: \"Add Kanban Column\",\n studio_add_kanban_column_name: \"Column name\",\n studio_add_kanban_column_name_placeholder: \"New column name\",\n studio_add_kanban_column_add: \"Add\",\n studio_add_kanban_column_cancel: \"Cancel\",\n studio_collection_view_sql: \"SQL Editor\",\n studio_collection_view_cms: \"CMS View\",\n studio_editor_collection_tooltip: \"Edit collection schema\",\n studio_editor_collection_no_permission: \"You don't have permission to edit this collection\",\n studio_editor_collection_start_tooltip: \"Copy path or edit schema\",\n studio_editor_collection_start_no_permission: \"You don't have permission to modify this collection\",\n studio_editor_collection_start_copied: \"Copied!\",\n studio_editor_entity_tooltip: \"Edit entity schema\",\n studio_editor_entity_no_permission: \"You don't have permission to edit this entity\",\n studio_home_edit_collection: \"Edit collection\",\n studio_home_delete_collection: \"Delete collection\",\n studio_home_confirm_delete_title: \"Delete collection?\",\n studio_home_confirm_delete_body: \"Are you sure you want to delete the collection \\\"{{name}}\\\"? This action cannot be undone.\",\n studio_kanban_setup: \"Kanban Setup\",\n studio_missing_reference: \"Missing reference: {{path}}\",\n studio_missing_reference_create: \"Create\",\n studio_new_collection: \"New collection\",\n studio_new_collection_card: \"New collection\",\n studio_new_collection_no_permission: \"You don't have permissions to create collections\",\n studio_property_add_column: \"Add new property\",\n studio_property_add_column_no_permission: \"You don't have permission to add new properties\",\n studio_add_kanban_column_desc: \"Add a new option to the \\\"{{property}}\\\" property. This will create a new column in the Kanban board.\",\n studio_add_kanban_column_adding: \"Adding...\",\n studio_collection_view_edit: \"Edit\",\n studio_editor_collection_disabled: \"Collection editing is disabled\",\n studio_editor_collection_edit: \"Edit collection\",\n studio_editor_entity_save_first: \"You need to save the document before changing the schema\",\n studio_editor_entity_edit_schema: \"Edit schema for this form\",\n studio_editor_collection_start_save_filter: \"Save default filter and sort\",\n studio_editor_collection_start_clear_filter: \"Clear default filter and sort\",\n studio_editor_collection_start_reset_filter: \"Reset to default filter and sort\",\n studio_editor_collection_start_saved: \"Default config saved\",\n studio_home_duplicate_collection: \"Duplicate\",\n studio_home_delete: \"Delete\",\n studio_home_confirm_delete_no_data: \"This will not delete any data, only the collection in the CMS\",\n studio_home_collection_deleted: \"Collection deleted\",\n studio_kanban_configure: \"Configure Kanban\",\n studio_missing_reference_error: \"No collection for path: {{path}}\",\n studio_new_collection_add: \"Adicionar nova coleção\",\n\n // ─── Property field labels ──────────────────────────────────\n db_column_type: \"Tipo de coluna do banco de dados\",\n primary_key_unique_id: \"Chave primária / ID único\",\n spread_children_as_columns: \"Expandir filhos como colunas\",\n mode: \"Modo\",\n timezone: \"Fuso horário\",\n target_collection: \"Coleção de destino\",\n\n // ─── Storage property ───────────────────────────────────────\n storage_file_name: \"Nome do arquivo\",\n storage_path: \"Caminho de armazenamento\",\n storage_max_size: \"Tamanho máximo (em bytes)\",\n storage_resize_mode: \"Modo de redimensionamento\",\n storage_output_format: \"Formato de saída\",\n storage_max_width: \"Largura máxima (px)\",\n storage_max_height: \"Altura máxima (px)\",\n storage_quality: \"Qualidade (0-100)\",\n storage_file_upload_config: \"Configuração de upload de arquivo\",\n storage_image_resize_config: \"Configuração de redimensionamento de imagem\",\n storage_all_file_types: \"Todos os tipos de arquivo permitidos\",\n storage_allowed_file_types: \"Tipos de arquivo permitidos\",\n storage_include_bucket_url: \"Incluir URL do bucket (s3://...) no valor salvo\",\n storage_save_url: \"Salvar URL em vez do caminho de armazenamento\",\n\n // ─── DateTime property ──────────────────────────────────────\n datetime_automatic_value: \"Valor automático\",\n\n // ─── Markdown property ──────────────────────────────────────\n markdown_paste_behavior: \"Comportamento ao colar\",\n markdown_strip_html: \"Remover HTML ao colar\",\n markdown_convert_pasted: \"Converter texto colado para markdown\"\n};\n","import React, { PropsWithChildren, useEffect, useRef } from \"react\";\nimport i18next, { i18n } from \"i18next\";\nimport { I18nextProvider, initReactI18next } from \"react-i18next\";\nimport { en } from \"../locales/en\";\nimport { es } from \"../locales/es\";\nimport { de } from \"../locales/de\";\nimport { fr } from \"../locales/fr\";\nimport { it } from \"../locales/it\";\nimport { hi } from \"../locales/hi\";\nimport { pt } from \"../locales/pt\";\nimport { RebaseTranslations } from \"@rebasepro/types\";\n\nconst REBASE_NS = \"rebase_core\";\n\nexport const REBASE_LOCALE_STORAGE_KEY = \"rebase_locale\";\n\n/** DeepPartial helper — allows partial overrides at any nesting level */\ntype DeepPartial<T> = T extends object\n ? { [K in keyof T]?: DeepPartial<T[K]> }\n : T;\n\nexport interface RebaseI18nProviderProps {\n /** BCP-47 locale tag, e.g. \"en\", \"es\", \"fr\". Defaults to \"en\". */\n locale?: string;\n /**\n * Override or extend any Rebase UI string, keyed by locale.\n *\n * @example\n * translations={{\n * en: { save: \"Publish\" },\n * es: { save: \"Publicar\", discard: \"Descartar\" }\n * }}\n */\n translations?: {\n [locale: string]: DeepPartial<RebaseTranslations>;\n };\n}\n\n/**\n * Initialises a dedicated i18next instance for Rebase's internal UI strings.\n *\n * This instance is isolated from any app-level i18next configuration the\n * consumer may have. Mount this at the top of the Rebase component tree.\n *\n * @internal\n */\nexport function RebaseI18nProvider({\n locale = \"en\",\n translations,\n children\n}: PropsWithChildren<RebaseI18nProviderProps>) {\n const i18nRef = useRef<i18n | null>(null);\n const [ready, setReady] = React.useState(false);\n\n if (!i18nRef.current) {\n const instance = i18next.createInstance();\n\n // Build the initial resources: English baseline + any consumer overrides\n const resources = buildResources(translations);\n\n let initialLocale = locale;\n if (typeof window !== \"undefined\") {\n const stored = localStorage.getItem(REBASE_LOCALE_STORAGE_KEY);\n if (stored) initialLocale = stored;\n }\n\n instance\n .use(initReactI18next)\n .init({\n lng: initialLocale,\n fallbackLng: \"en\",\n ns: [REBASE_NS],\n defaultNS: REBASE_NS,\n resources,\n interpolation: {\n // React already escapes — don't double-escape\n escapeValue: false\n }\n }, () => {\n setReady(true);\n });\n\n instance.on(\"languageChanged\", (lng) => {\n if (typeof window !== \"undefined\") {\n localStorage.setItem(REBASE_LOCALE_STORAGE_KEY, lng);\n }\n });\n\n i18nRef.current = instance;\n }\n\n // When `locale` prop changes, switch language on the existing instance\n // ONLY if the user hasn't explicitly set a preference\n useEffect(() => {\n if (i18nRef.current && i18nRef.current.language !== locale) {\n const hasUserPreference = typeof window !== \"undefined\" && Boolean(localStorage.getItem(REBASE_LOCALE_STORAGE_KEY));\n if (!hasUserPreference) {\n i18nRef.current.changeLanguage(locale);\n }\n }\n }, [locale]);\n\n // When consumer translations prop changes, update the resource bundles\n useEffect(() => {\n if (!i18nRef.current) return;\n const resources = buildResources(translations);\n for (const [lang, bundle] of Object.entries(resources)) {\n i18nRef.current.addResourceBundle(\n lang,\n REBASE_NS,\n bundle[REBASE_NS],\n true, // deep merge\n true // overwrite existing keys\n );\n }\n }, [translations]);\n\n if (!ready || !i18nRef.current) return null;\n\n return (\n <I18nextProvider i18n={i18nRef.current}>\n {children}\n </I18nextProvider>\n );\n}\n\n/**\n * Build an i18next resources object from the English baseline plus any\n * consumer-provided overrides.\n */\nfunction buildResources(\n translations?: { [locale: string]: DeepPartial<RebaseTranslations> }\n): Record<string, Record<string, object>> {\n const resources: Record<string, Record<string, object>> = {\n en: { [REBASE_NS]: { ...en } },\n es: { [REBASE_NS]: { ...es } },\n de: { [REBASE_NS]: { ...de } },\n fr: { [REBASE_NS]: { ...fr } },\n it: { [REBASE_NS]: { ...it } },\n hi: { [REBASE_NS]: { ...hi } },\n pt: { [REBASE_NS]: { ...pt } }\n };\n\n if (!translations) return resources;\n\n for (const [lang, overrides] of Object.entries(translations)) {\n if (!resources[lang]) {\n // For non-English/Spanish locales, start from English as the fallback base\n resources[lang] = { [REBASE_NS]: { ...en } };\n }\n // Merge consumer overrides (shallow merge is enough since translations\n // is a flat record — deepMerge option in addResourceBundle handles deeper)\n resources[lang][REBASE_NS] = {\n ...resources[lang][REBASE_NS],\n ...overrides\n };\n }\n\n return resources;\n}\n","\"use client\";\nimport type { RebaseProps } from \"./RebaseProps\";\nimport type { CustomizationController, RebasePlugin, SlotContribution } from \"@rebasepro/types\";\nimport type { ComponentOverrideMap } from \"@rebasepro/types\";\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { CenteredView, Typography } from \"@rebasepro/ui\";\nimport { RebaseContext, User, CollectionRegistryController, DataDriver, DataSourceDefinition, RebaseData, DEFAULT_DATA_SOURCE_KEY, StorageSource, StorageSourceDefinition, DEFAULT_STORAGE_SOURCE_KEY } from \"@rebasepro/types\";\nimport { PluginProviderStack } from \"./PluginProviderStack\";\nimport { PluginLifecycleManager } from \"./PluginLifecycleManager\";\nimport { AuthControllerContext } from \"../contexts\";\nimport { useCustomizationController, useRebaseContext, useAuthSubscription } from \"../hooks\";\nimport { ApiConfigProvider, useApiConfig } from \"../hooks/ApiConfigContext\";\nimport { ErrorView } from \"../components\";\nimport { StorageSourceContext } from \"../contexts/StorageSourceContext\";\nimport { UserConfigurationPersistenceContext } from \"../contexts/UserConfigurationPersistenceContext\";\nimport { RebaseDataContext } from \"../contexts/RebaseDataContext\";\nimport { DataSourcesContext, DataSourcesContextValue } from \"../contexts/DataSourcesContext\";\nimport { StorageSourcesContext, StorageSourcesContextValue } from \"../contexts/StorageSourcesContext\";\nimport { DatabaseAdminContext } from \"../contexts/DatabaseAdminContext\";\nimport { ModeControllerProvider, AdminModeControllerProvider, SnackbarProvider } from \"../contexts\";\nimport { RebaseI18nProvider } from \"../i18n/RebaseI18nProvider\";\nimport { RebaseRegistryProvider } from \"../hooks/useRebaseRegistry\";\nimport { SchemaDriftProvider } from \"../components/SchemaDriftBanner\";\nimport { GlobalComponentOverrideProvider } from \"../contexts/ComponentOverrideContext\";\nimport { useBuildModeController } from \"../hooks/useBuildModeController\";\nimport { useBuildAdminModeController } from \"../hooks/useBuildAdminModeController\";\nimport { RebaseClientInstanceContext } from \"../contexts/RebaseClientInstanceContext\";\nimport { DialogsProvider } from \"../contexts/DialogsProvider\";\nimport { buildRebaseData, wrapAsEntityData, CollectionRegistry } from \"@rebasepro/common\";\nimport { CustomizationControllerContext } from \"../contexts/CustomizationControllerContext\";\nimport { AnalyticsContext } from \"../contexts/AnalyticsContext\";\n\nimport { EffectiveRoleControllerContext } from \"../contexts/EffectiveRoleController\";\nimport { useBuildEffectiveRoleController } from \"../hooks/useBuildEffectiveRoleController\";\n\n/**\n * If you are using independent components of the CMS\n * you need to wrap them with this main component, so the internal hooks work.\n *\n * This is the main component of Rebase. It acts as the provider of all the\n * internal contexts and hooks.\n *\n * You only need to use this component if you are building a custom app.\n *\n * @group Core\n */\nexport function Rebase<USER extends User>(props: RebaseProps<USER>) {\n\n const {\n children,\n entityLinkBuilder,\n userConfigPersistence,\n dateTimeFormat,\n locale,\n client,\n authController: authControllerProp,\n storageSource: storageSourceProp,\n dataSources: dataSourcesProp,\n storageSources: storageSourcesProp,\n\n databaseAdmin,\n plugins: pluginsProp,\n slots: directSlots = [],\n onAnalyticsEvent,\n propertyConfigs,\n entityViews,\n entityActions,\n\n effectiveRoleController,\n apiUrl,\n translations,\n components: componentsProp\n } = props;\n\n const plugins = pluginsProp;\n\n // Validate plugin key uniqueness\n if (plugins) {\n const keys = plugins.map((p) => p.key);\n if (new Set(keys).size !== keys.length) {\n console.error(\"Duplicate plugin keys detected:\", keys.filter((k, i) => keys.indexOf(k) !== i));\n }\n }\n\n // Merge direct slots with plugin slots\n const resolvedSlots: SlotContribution[] = useMemo(() => [\n ...directSlots,\n ...((plugins ?? []).flatMap((p) => p.slots ?? []))\n ], [directSlots, plugins]);\n\n\n // Auth fallback logic\n const clientAuthController = useAuthSubscription(authControllerProp ? undefined : client?.auth);\n const authController = authControllerProp ?? clientAuthController;\n\n const normalizedDataSources = useMemo(() => {\n return dataSourcesProp ?? [];\n }, [dataSourcesProp]);\n\n // Build the data-source context: the declared registry plus a RebaseData\n // per direct/custom source (those carrying a client-side driver). Server-\n // mediated sources have no entry — they ride the default client.\n //\n // Shallow-compared against the previous build (key/engine/transport +\n // driver instances) so inline `dataSources` literals don't rebuild\n // RebaseData instances every render and thrash data-fetch effects that\n // key off the data identity.\n const dataSourcesRef = useRef<{\n sig: { key: string; engine: string; transport?: string; driver?: DataDriver }[];\n value: DataSourcesContextValue;\n } | null>(null);\n const dataSourcesValue = useMemo<DataSourcesContextValue>(() => {\n const sig = normalizedDataSources.map((d) => ({ key: d.key, engine: d.engine, transport: d.transport, driver: d.driver }));\n const prev = dataSourcesRef.current;\n if (prev\n && prev.sig.length === sig.length\n && sig.every((s, i) => prev.sig[i].key === s.key\n && prev.sig[i].engine === s.engine\n && prev.sig[i].transport === s.transport\n && prev.sig[i].driver === s.driver)) {\n return prev.value;\n }\n const registry: Record<string, DataSourceDefinition> = {};\n const sources: Record<string, RebaseData> = {};\n for (const ds of normalizedDataSources) {\n const { driver, ...definition } = ds;\n // Materialize the inferred transport so downstream consumers\n // (routing, editor capabilities) always see a concrete value.\n registry[ds.key] = {\n ...definition,\n transport: ds.transport ?? (driver ? \"direct\" : \"server\")\n };\n if (driver) sources[ds.key] = buildRebaseData(driver);\n }\n const value: DataSourcesContextValue = { registry, sources };\n dataSourcesRef.current = { sig, value };\n return value;\n }, [normalizedDataSources]);\n\n // Default data source — serves every collection not routed to a\n // registered direct/custom source. Resolution:\n // 1. A \"(default)\"-keyed data source with a driver.\n // 2. `client.data`.\n // 3. The sole registered source, when it is the only candidate.\n const resolvedData = useMemo(() => {\n const registeredDefault = dataSourcesValue.sources[DEFAULT_DATA_SOURCE_KEY];\n if (registeredDefault) return registeredDefault;\n // CMS boundary: the SDK client returns flat rows; wrap them into the\n // Entity view-model the admin (`useData()`) renders.\n if (client?.data) return wrapAsEntityData(client.data);\n const built = Object.values(dataSourcesValue.sources);\n if (built.length === 1) return built[0];\n if (built.length > 1) {\n throw new Error(\n \"[Rebase] Several data sources are registered but none is the default. \" +\n \"Pass a `client`, or key one `dataSources` entry \\\"(default)\\\".\"\n );\n }\n throw new Error(\"Rebase requires either `client` or a `dataSources` entry with a driver to be provided\");\n }, [client, dataSourcesValue]);\n\n // Storage fallback logic\n const resolvedStorage = storageSourceProp ?? client?.storage;\n\n // ── Storage sources (mirrors the dataSources pattern) ────────────\n // Storage-source definitions discovered from the backend via\n // `GET /api/storage/sources`. The backend is the single source of truth;\n // server-transport sources are auto-wired on the client, `direct` sources\n // are completed by the `storageSources` prop (which holds live instances).\n const [remoteStorageSources, setRemoteStorageSources] = useState<StorageSourceDefinition[]>([]);\n const authUser = authController.user;\n const loginSkipped = authController.loginSkipped;\n useEffect(() => {\n if (!client?.fetchStorageSources) return;\n let cancelled = false;\n client.fetchStorageSources()\n .then((defs) => { if (!cancelled) setRemoteStorageSources(defs); })\n .catch((e) => {\n // A 401 before auth is expected; the effect re-runs once the\n // user logs in (authUser/loginSkipped change) and retries.\n console.debug(\"[Rebase] Could not load storage sources\", e);\n });\n return () => { cancelled = true; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, authUser, loginSkipped]);\n\n // Normalize the prop + discovered definitions into a registry + sources map.\n const storageSourcesRef = useRef<{\n propList: { key: string; source?: StorageSource; transport?: string }[];\n remote: StorageSourceDefinition[];\n resolvedStorage?: StorageSource;\n client?: typeof client;\n value: StorageSourcesContextValue;\n } | null>(null);\n const storageSourcesValue = useMemo<StorageSourcesContextValue>(() => {\n const list = storageSourcesProp ?? [];\n const prev = storageSourcesRef.current;\n // Stable identity unless an input actually changed (the prop may be a\n // fresh array literal on every render; sources are compared by identity).\n if (prev\n && prev.remote === remoteStorageSources\n && prev.resolvedStorage === resolvedStorage\n && prev.client === client\n && prev.propList.length === list.length\n && list.every((s, i) => prev.propList[i].key === s.key\n && prev.propList[i].source === s.source\n && prev.propList[i].transport === s.transport)) {\n return prev.value;\n }\n const registry: Record<string, StorageSourceDefinition> = {};\n const sources: Record<string, StorageSource> = {};\n\n // 1. Definitions discovered from the backend (labels, engine, transport).\n for (const def of remoteStorageSources) {\n registry[def.key] = def;\n }\n\n // 2. Server-backed named sources wired on the client registry: the\n // default, `createRebaseClient({ storageSources })`, and any\n // server-transport sources auto-registered by `fetchStorageSources`.\n if (client?.storageRegistry) {\n for (const key of client.storageRegistry.list()) {\n const source = client.storageRegistry.get(key);\n if (source) sources[key] = source;\n }\n }\n\n // 3. App-provided definitions: `direct` live sources and overrides.\n for (const ss of list) {\n const { source, ...definition } = ss;\n registry[ss.key] = definition;\n if (source) {\n // `direct` transport: app-provided live source (e.g. Firebase).\n sources[ss.key] = source;\n } else if (!sources[ss.key]\n && ss.transport === \"server\"\n && ss.key !== DEFAULT_STORAGE_SOURCE_KEY\n && client?.createStorageSource) {\n // `server` transport declared only on the prop: build a\n // backend-routed source so requests carry `?storageId=key`.\n sources[ss.key] = client.createStorageSource(ss.key);\n }\n }\n // 4. Default/server storage from the client.\n if (resolvedStorage && !sources[DEFAULT_STORAGE_SOURCE_KEY]) {\n sources[DEFAULT_STORAGE_SOURCE_KEY] = resolvedStorage;\n }\n const value: StorageSourcesContextValue = { registry, sources };\n storageSourcesRef.current = {\n propList: list.map((s) => ({ key: s.key, source: s.source, transport: s.transport })),\n remote: remoteStorageSources,\n resolvedStorage,\n client,\n value\n };\n return value;\n }, [storageSourcesProp, remoteStorageSources, resolvedStorage, client]);\n\n // Database admin — use explicit prop, or derive from client.ws / driver when available.\n const resolvedDatabaseAdmin = useMemo(() => {\n if (databaseAdmin) return databaseAdmin;\n\n // 1. The default source's DataDriver exposes `.admin` capability object\n const defaultDriver = normalizedDataSources.find((d) => d.key === DEFAULT_DATA_SOURCE_KEY && d.driver)?.driver\n ?? (!client && normalizedDataSources.length === 1 ? normalizedDataSources[0].driver : undefined);\n if (defaultDriver?.admin) {\n return defaultDriver.admin;\n }\n\n // 2. Auto-derive from the client's WebSocket connection (Rebase backend)\n const ws = client?.ws;\n if (ws && typeof (ws as unknown as Record<string, unknown>).executeSql === \"function\") {\n const wsAdmin = ws as unknown as import(\"@rebasepro/types\").DatabaseAdmin;\n return {\n executeSql: wsAdmin.executeSql!.bind(wsAdmin),\n fetchAvailableDatabases: wsAdmin.fetchAvailableDatabases?.bind(wsAdmin),\n fetchAvailableRoles: wsAdmin.fetchAvailableRoles?.bind(wsAdmin),\n fetchCurrentDatabase: wsAdmin.fetchCurrentDatabase?.bind(wsAdmin),\n fetchUnmappedTables: wsAdmin.fetchUnmappedTables?.bind(wsAdmin),\n fetchTableMetadata: wsAdmin.fetchTableMetadata?.bind(wsAdmin),\n // Branch admin capabilities\n ...(typeof wsAdmin.createBranch === \"function\" ? {\n createBranch: wsAdmin.createBranch.bind(wsAdmin),\n deleteBranch: wsAdmin.deleteBranch!.bind(wsAdmin),\n listBranches: wsAdmin.listBranches!.bind(wsAdmin)\n } : {})\n };\n }\n\n return undefined;\n }, [databaseAdmin, client, normalizedDataSources]);\n\n if (!resolvedStorage && typeof console !== \"undefined\") {\n console.warn(\n \"[Rebase] No storageSource provided. File upload features will not work. \" +\n \"Provide storageSource via props or through a RebaseClient.\"\n );\n }\n\n const pluginsLoading = plugins?.some((p) => p.loading) ?? false;\n\n const loading = authController.initialLoading || pluginsLoading;\n\n const customizationController: CustomizationController = useMemo(() => ({\n dateTimeFormat,\n locale,\n entityLinkBuilder,\n plugins,\n resolvedSlots,\n entityViews: entityViews ?? [],\n entityActions: entityActions ?? [],\n propertyConfigs: propertyConfigs ?? {},\n components: componentsProp\n }), [dateTimeFormat, locale, entityLinkBuilder, plugins, resolvedSlots, entityViews, entityActions, propertyConfigs, componentsProp]);\n\n const analyticsController = useMemo(() => ({\n onAnalyticsEvent\n }), []);\n\n const fallbackEffectiveRoleController = useBuildEffectiveRoleController();\n const activeEffectiveRoleController = effectiveRoleController ?? fallbackEffectiveRoleController;\n\n const modeController = useBuildModeController();\n const adminModeController = useBuildAdminModeController();\n\n if (authController.authError) {\n return (\n <CenteredView maxWidth={\"md\"}>\n <ErrorView\n title={\"Error loading auth\"}\n error={authController.authError as Error | string}/>\n </CenteredView>\n );\n }\n\n const content = (\n <RebaseI18nProvider locale={locale} translations={translations}>\n <GlobalComponentOverrideProvider overrides={componentsProp}>\n <SnackbarProvider>\n <ModeControllerProvider value={modeController}>\n <AdminModeControllerProvider value={adminModeController}>\n <RebaseClientInstanceContext.Provider value={client}>\n <AnalyticsContext.Provider value={analyticsController}>\n <CustomizationControllerContext.Provider value={customizationController}>\n <UserConfigurationPersistenceContext.Provider\n value={userConfigPersistence}>\n <StorageSourcesContext.Provider\n value={storageSourcesValue}>\n <StorageSourceContext.Provider\n value={resolvedStorage!}>\n <DataSourcesContext.Provider\n value={dataSourcesValue}>\n <RebaseDataContext.Provider\n value={resolvedData}>\n <DatabaseAdminContext.Provider\n value={resolvedDatabaseAdmin}>\n <AuthControllerContext.Provider\n value={authController}>\n <EffectiveRoleControllerContext.Provider value={activeEffectiveRoleController}>\n <DialogsProvider>\n <SchemaDriftProvider>\n <RebaseRegistryProvider>\n <RebaseInternal\n loading={loading}>\n {children}\n </RebaseInternal>\n </RebaseRegistryProvider>\n </SchemaDriftProvider>\n </DialogsProvider>\n </EffectiveRoleControllerContext.Provider>\n </AuthControllerContext.Provider>\n </DatabaseAdminContext.Provider>\n </RebaseDataContext.Provider>\n </DataSourcesContext.Provider>\n </StorageSourceContext.Provider>\n </StorageSourcesContext.Provider>\n </UserConfigurationPersistenceContext.Provider>\n </CustomizationControllerContext.Provider>\n </AnalyticsContext.Provider>\n </RebaseClientInstanceContext.Provider>\n </AdminModeControllerProvider>\n </ModeControllerProvider>\n </SnackbarProvider>\n </GlobalComponentOverrideProvider>\n </RebaseI18nProvider>\n );\n\n const resolvedApiUrl = apiUrl || client?.baseUrl || (typeof window !== \"undefined\" ? window.location.origin : \"\");\n\n if (resolvedApiUrl) {\n return (\n <ApiConfigProvider apiUrl={resolvedApiUrl} getAuthToken={authController.getAuthToken}>\n {content}\n </ApiConfigProvider>\n );\n }\n\n return content;\n\n}\n\nfunction RebaseInternal({\n loading,\n children\n}: {\n loading: boolean;\n children: React.ReactNode | ((props: { context: RebaseContext; loading: boolean; }) => React.ReactNode);\n}) {\n\n const context = useRebaseContext();\n const customizationController = useCustomizationController();\n\n const childrenResult = typeof children === \"function\" ? children({\n context,\n loading\n }) : children;\n\n const plugins = customizationController.plugins;\n const authController = context.authController;\n const authReady = !loading\n && !authController.authLoading\n && (Boolean(authController.user) || authController.loginSkipped);\n\n if (plugins && plugins.length > 0) {\n return (\n <PluginProviderStack\n plugins={plugins}\n scope=\"root\"\n scopeProps={{ context }}>\n {authReady && <PluginLifecycleManager plugins={plugins} context={context}/>}\n {childrenResult}\n </PluginProviderStack>\n );\n }\n\n return childrenResult;\n}\n\n","import { createBrowserRouter, RouterProvider } from \"react-router-dom\"\nimport { removeInitialAndTrailingSlashes } from \"@rebasepro/common\";\n\nexport function RebaseRouter({\n children,\n basePath\n}: {\n children: React.ReactNode,\n basePath?: string;\n}) {\n return <RouterProvider router={createBrowserRouter([\n {\n path: basePath ? `${removeInitialAndTrailingSlashes(basePath)}/*` : \"/*\",\n element: children\n }\n ])}/>;\n}\n","import React from \"react\";\nimport { Route, Routes, useLocation } from \"react-router-dom\";\n\n\n/**\n * A drop-in replacement for react-router's `<Routes>` that preserves the\n * underlying view when a side dialog navigates the URL to a different path.\n *\n * When opening a side dialog from e.g. `/posts` to `authors/123#side`,\n * the `base_location` stored in router state is used so the route tree\n * keeps rendering the original `/posts` view underneath the dialog overlay.\n *\n * Additionally, registered views from `useNavigationStateController()` are\n * automatically routed — no need to manually map them to `<Route>` elements.\n * Views with `nestedRoutes: true` get a wildcard route (slug/*) as well.\n * Explicitly declared `children` routes take priority.\n */\nexport function RebaseRoutes({ children }: { children?: React.ReactNode }) {\n const location = useLocation();\n const state = location.state as Record<string, unknown> | null;\n const baseLocation = state?.base_location ?? location;\n\n return <Routes location={baseLocation}>{children}</Routes>;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { User, AuthChangeEvent, RebaseSession } from \"@rebasepro/types\";\nimport type { AuthConfigResponse } from \"./api\";\nimport { RebaseAuthController, RebaseAuthControllerProps } from \"./types\";\n\n/**\n * Auth controller hook for JWT-based authentication.\n *\n * This is a thin React binding over the headless SDK `client.auth`.\n * It synchronizes React state with the SDK's internal state and delegates\n * all operations to the SDK to ensure a single source of truth for\n * authentication sessions across the entire application.\n *\n * @param props Configuration options\n * @returns RebaseAuthController instance\n */\nexport function useRebaseAuthController(\n props: RebaseAuthControllerProps = {}\n): RebaseAuthController {\n const { client, onSignOut, defineRolesFor } = props;\n const auth = client?.auth;\n\n const [user, setUser] = useState<User | null>(null);\n const [authLoading, setAuthLoading] = useState(false);\n const [initialLoading, setInitialLoading] = useState(true);\n const [authError, setAuthError] = useState<Error | null>(null);\n const [authProviderError, setAuthProviderError] = useState<Error | null>(null);\n const [loginSkipped, setLoginSkipped] = useState(false);\n const [extra, setExtra] = useState<unknown>(null);\n const [authConfig, setAuthConfig] = useState<AuthConfigResponse | null>(null);\n\n const isMountedRef = useRef(true);\n // Keep a stable ref to onSignOut so the listener never goes stale.\n const onSignOutRef = useRef(onSignOut);\n onSignOutRef.current = onSignOut;\n // Keep a stable ref to defineRolesFor too, so an inline (non-memoized)\n // function from the consumer does not re-run the sync effect on every\n // render — which would re-subscribe to auth events and re-fetch the\n // (uncached) auth config each time.\n const defineRolesForRef = useRef(defineRolesFor);\n defineRolesForRef.current = defineRolesFor;\n\n const clearError = useCallback(() => {\n setAuthProviderError(null);\n }, []);\n\n // Sync state with client.auth\n useEffect(() => {\n if (!auth) {\n setInitialLoading(false);\n return;\n }\n\n isMountedRef.current = true;\n\n const updateState = async (session: RebaseSession | null) => {\n if (!isMountedRef.current) return;\n\n let userToSet = session?.user ?? null;\n const defineRolesFor = defineRolesForRef.current;\n if (userToSet && defineRolesFor) {\n try {\n const roles = await defineRolesFor(userToSet);\n if (roles && isMountedRef.current) {\n userToSet = { ...userToSet, roles };\n }\n } catch (e) {\n console.error(\"Error defining roles:\", e);\n }\n }\n\n if (isMountedRef.current) {\n setUser(userToSet);\n }\n };\n\n const syncState = async (event: AuthChangeEvent, session: RebaseSession | null) => {\n await updateState(session);\n if (event === \"SIGNED_OUT\") {\n if (isMountedRef.current) {\n setLoginSkipped(false);\n }\n onSignOutRef.current?.();\n }\n };\n\n // Initial sync with whatever is currently in the SDK\n updateState(auth.getSession());\n\n // Wait for SDK initialization (restoring session from storage or silent refresh)\n auth.isInitialized().then(() => {\n if (isMountedRef.current) {\n updateState(auth.getSession());\n setInitialLoading(false);\n }\n }).catch(() => {\n if (isMountedRef.current) setInitialLoading(false);\n });\n\n // Fetch backend auth configuration\n auth.getAuthConfig().then((config: AuthConfigResponse) => {\n if (isMountedRef.current) setAuthConfig(config);\n }).catch(() => {});\n\n const unsubscribe = auth.onAuthStateChange(syncState);\n\n return () => {\n isMountedRef.current = false;\n unsubscribe();\n };\n }, [auth]);\n\n const getAuthToken = useCallback(async (): Promise<string> => {\n if (!auth) throw new Error(\"Rebase client with auth is required\");\n const session = auth.getSession();\n\n // If we have a valid token, return it\n if (session?.accessToken && session.expiresAt > Date.now() + 10000) {\n return session.accessToken;\n }\n\n // Otherwise, refresh\n const newSession = await auth.refreshSession();\n return newSession.accessToken;\n }, [auth]);\n\n const signOut = useCallback(async () => {\n if (!auth) return;\n setAuthLoading(true);\n try {\n await auth.signOut();\n // signOut emits SIGNED_OUT → syncState calls onSignOutRef.current\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n setAuthProviderError(err);\n } finally {\n setAuthLoading(false);\n }\n }, [auth]);\n\n const emailPasswordLogin = useCallback(async (email: string, password: string) => {\n if (!auth) throw new Error(\"Rebase client with auth is required\");\n setAuthLoading(true);\n setAuthProviderError(null);\n try {\n await auth.signInWithEmail(email, password);\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n setAuthProviderError(err);\n throw error;\n } finally {\n setAuthLoading(false);\n }\n }, [auth]);\n\n const register = useCallback(async (email: string, password: string, displayName?: string) => {\n if (!auth) throw new Error(\"Rebase client with auth is required\");\n setAuthLoading(true);\n setAuthProviderError(null);\n try {\n await auth.signUp(email, password, displayName);\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n setAuthProviderError(err);\n throw error;\n } finally {\n setAuthLoading(false);\n }\n }, [auth]);\n\n const googleLogin = useCallback(async (\n payload: { idToken: string } | { accessToken: string } | { code: string; redirectUri: string }\n ) => {\n if (!auth) throw new Error(\"Rebase client with auth is required\");\n setAuthLoading(true);\n setAuthProviderError(null);\n try {\n await auth.signInWithGoogle(payload);\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n setAuthProviderError(err);\n throw error;\n } finally {\n setAuthLoading(false);\n }\n }, [auth]);\n\n const oauthLogin = useCallback(async (providerId: string, payload: Record<string, unknown>) => {\n if (!auth) throw new Error(\"Rebase client with auth is required\");\n setAuthLoading(true);\n setAuthProviderError(null);\n try {\n await auth.signInWithOAuth(providerId, payload);\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n setAuthProviderError(err);\n throw error;\n } finally {\n setAuthLoading(false);\n }\n }, [auth]);\n\n const skipLogin = useCallback(() => {\n setLoginSkipped(true);\n setUser(null);\n }, []);\n\n const forgotPassword = useCallback(async (email: string) => {\n if (!auth) throw new Error(\"Rebase client with auth is required\");\n setAuthLoading(true);\n setAuthProviderError(null);\n try {\n await auth.resetPasswordForEmail(email);\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n setAuthProviderError(err);\n throw error;\n } finally {\n setAuthLoading(false);\n }\n }, [auth]);\n\n const resetPassword = useCallback(async (token: string, password: string) => {\n if (!auth) throw new Error(\"Rebase client with auth is required\");\n setAuthLoading(true);\n setAuthProviderError(null);\n try {\n await auth.resetPassword(token, password);\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n setAuthProviderError(err);\n throw error;\n } finally {\n setAuthLoading(false);\n }\n }, [auth]);\n\n const changePassword = useCallback(async (oldPassword: string, newPassword: string) => {\n if (!auth) throw new Error(\"Rebase client with auth is required\");\n setAuthLoading(true);\n setAuthProviderError(null);\n try {\n await auth.changePassword(oldPassword, newPassword);\n // Sign out after password change as sessions are usually invalidated\n await auth.signOut();\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n setAuthProviderError(err);\n throw error;\n } finally {\n setAuthLoading(false);\n }\n }, [auth]);\n\n const updateProfile = useCallback(async (displayName?: string, photoURL?: string) => {\n if (!auth) throw new Error(\"Rebase client with auth is required\");\n setAuthLoading(true);\n setAuthProviderError(null);\n try {\n const updatedUser = await auth.updateUser({ displayName, photoURL });\n return updatedUser;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n setAuthProviderError(err);\n throw error;\n } finally {\n setAuthLoading(false);\n }\n }, [auth]);\n\n const fetchSessions = useCallback(async () => {\n if (!auth) throw new Error(\"Rebase client with auth is required\");\n return await auth.getSessions();\n }, [auth]);\n\n const revokeSession = useCallback(async (sessionId: string) => {\n if (!auth) throw new Error(\"Rebase client with auth is required\");\n await auth.revokeSession(sessionId);\n }, [auth]);\n\n const revokeAllSessions = useCallback(async () => {\n if (!auth) throw new Error(\"Rebase client with auth is required\");\n await auth.revokeAllSessions();\n }, [auth]);\n\n return {\n user,\n authLoading,\n initialLoading,\n authError,\n authProviderError,\n loginSkipped,\n needsSetup: authConfig?.needsSetup ?? false,\n registrationEnabled: authConfig?.registrationEnabled ?? false,\n getAuthToken,\n getApiUrl: () => client?.baseUrl,\n signOut,\n emailPasswordLogin,\n register,\n googleLogin,\n oauthLogin,\n skipLogin,\n forgotPassword,\n resetPassword,\n changePassword,\n updateProfile,\n fetchSessions,\n revokeSession,\n revokeAllSessions,\n clearError,\n setAuthProviderError,\n extra,\n setExtra,\n capabilities: {\n emailPasswordLogin: true,\n googleLogin: !!(props.googleClientId),\n registration: authConfig?.registrationEnabled ?? false,\n passwordReset: authConfig?.passwordReset ?? false,\n // Defaults to true so backends predating this field keep showing the\n // action. Adapters that don't support it report `false` explicitly.\n adminPasswordReset: authConfig?.adminPasswordReset ?? true,\n sessionManagement: true,\n profileUpdate: true,\n emailVerification: authConfig?.emailVerification ?? false,\n enabledProviders: authConfig?.enabledProviders ?? []\n }\n };\n}\n","/**\n * Auth-config fetch helper for the Rebase React frontend.\n *\n * The former per-endpoint auth client (login, register, refresh, OAuth,\n * sessions, …) has been removed: `useRebaseAuthController` now delegates to\n * the headless SDK's `client.auth` (from `@rebasepro/client`), which is the\n * single source of truth for the auth session. The only piece that remains\n * here is the unauthenticated `/api/auth/config` probe used to detect\n * bootstrap mode and enabled providers before a session exists.\n */\n\nimport { RebaseApiError } from \"@rebasepro/types\";\n\n/**\n * @deprecated Use {@link RebaseApiError} (from `@rebasepro/types`, re-exported by\n * `@rebasepro/client`). Kept as an alias so `instanceof` / imports keep working;\n * errors thrown here now carry `.code` and `.status` on the unified type.\n */\nexport const AuthApiError = RebaseApiError;\n\nasync function handleResponse<T>(response: Response): Promise<T> {\n let data: Record<string, unknown>;\n try {\n data = await response.json();\n } catch (parseError) {\n // Response wasn't JSON - could be network error or server issue\n throw new RebaseApiError(\n `Server returned non-JSON response (status: ${response.status})`,\n { status: response.status, code: \"PARSE_ERROR\" }\n );\n }\n\n if (!response.ok) {\n throw new RebaseApiError(\n (data as Record<string, Record<string, string>>).error?.message || \"Request failed\",\n {\n status: response.status,\n code: (data as Record<string, Record<string, string>>).error?.code || \"UNKNOWN_ERROR\"\n }\n );\n }\n\n return data as T;\n}\n\n/**\n * Wrapper for fetch that catches generic network failures (like server down)\n * and translates them to a {@link RebaseApiError} with code `NETWORK_ERROR`.\n */\nasync function fetchWithHandling(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n try {\n return await fetch(input, init);\n } catch (error: unknown) {\n if (error instanceof TypeError && error.message.includes(\"Failed to fetch\")) {\n throw new RebaseApiError(\n \"Failed to connect to the backend server. The backend might be down or failed to initialize (e.g., database connection timeout).\",\n { code: \"NETWORK_ERROR\", cause: error }\n );\n }\n throw new RebaseApiError(\n \"Network error: \" + (error instanceof Error ? error.message : String(error)),\n { code: \"NETWORK_ERROR\", cause: error }\n );\n }\n}\n\n/**\n * Auth config response from the backend\n */\nexport interface AuthConfigResponse {\n /** True when there are no users in the system and first user setup is needed */\n needsSetup: boolean;\n /** Whether new user registration is enabled */\n registrationEnabled: boolean;\n /** Whether email service is configured */\n emailServiceEnabled?: boolean;\n /** Whether the self-service password reset flow (email link) is supported */\n passwordReset?: boolean;\n /**\n * Whether an admin can reset another user's password, i.e. the adapter\n * mounts `POST /admin/users/:userId/reset-password`. Absent on backends\n * predating this field, which the frontend treats as supported.\n */\n adminPasswordReset?: boolean;\n /** Whether email verification is supported */\n emailVerification?: boolean;\n /** Complete list of enabled OAuth provider IDs (e.g. [\"google\", \"github\", \"discord\"]) */\n enabledProviders: string[];\n}\n\n/**\n * Cache container for `fetchAuthConfig` — holds both the inflight promise\n * (to deduplicate concurrent calls) and the cached result.\n */\nexport interface AuthConfigCache {\n cached: AuthConfigResponse | null;\n inflight: Promise<AuthConfigResponse> | null;\n}\n\n/**\n * Create a fresh `AuthConfigCache` instance.\n * Callers own the cache object and pass it into `fetchAuthConfig` / `clearAuthConfigCache`.\n */\nexport function createAuthConfigCache(): AuthConfigCache {\n return { cached: null, inflight: null };\n}\n\n/**\n * Fetch auth configuration / status from the backend\n * This is an unauthenticated endpoint used to detect bootstrap mode.\n *\n * Results are cached for the session lifetime.\n * Concurrent calls are deduplicated: only one network request is made\n * and all callers share the same promise.\n */\nexport async function fetchAuthConfig(apiUrl: string, cache: AuthConfigCache): Promise<AuthConfigResponse> {\n if (cache.cached) {\n return cache.cached;\n }\n\n if (cache.inflight) {\n return cache.inflight;\n }\n\n cache.inflight = (async () => {\n const response = await fetchWithHandling(`${apiUrl}/api/auth/config`, {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" }\n });\n return handleResponse<AuthConfigResponse>(response);\n })();\n\n try {\n const result = await cache.inflight;\n cache.cached = result;\n return result;\n } finally {\n cache.inflight = null;\n }\n}\n\n/**\n * Clear the cached auth config (e.g. on logout or for testing).\n */\nexport function clearAuthConfigCache(cache: AuthConfigCache): void {\n cache.cached = null;\n cache.inflight = null;\n}\n","const iconSynonyms: Record<string, string> = {};\nimport { iconKeys } from \"@rebasepro/ui\";\nimport Fuse from \"fuse.js\";\n\n\nconst map = iconKeys\n .map((importName) => {\n const iconSynonym = importName in iconSynonyms ? iconSynonyms[importName] : \"\";\n return {\n key: importName,\n synonyms: iconSynonym\n }\n });\nexport const iconsSearch = new Fuse(map, {\n isCaseSensitive: false,\n shouldSort: true,\n ignoreLocation: true,\n distance: 0,\n keys: [\"key\", \"synonyms\"]\n})\n\n\n","import React from \"react\";\nimport {\n cls,\n colorClassesMapping,\n coolIconKeys,\n IconColor,\n iconKeys,\n iconSize,\n lucideIcons\n} from \"@rebasepro/ui\";\nimport { deepEqual as equal } from \"fast-equals\"\nimport { hashString, slugify } from \"@rebasepro/utils\";\n\n// iconKeys are now PascalCase strings (e.g. \"ShoppingCart\", \"Users\")\nconst iconKeysMap: Record<string, string> = iconKeys.reduce((acc: Record<string, string>, key) => {\n // Also add lowercase versions and snake_case versions to support legacy lookups\n const lower = key.toLowerCase();\n const snake = key.replace(/([A-Z])/g, \"_$1\").toLowerCase().replace(/^_/, \"\");\n acc[lower] = key;\n acc[snake] = key;\n acc[key] = key;\n return acc;\n}, {});\n\nfunction toPascalCase(str: string): string {\n return str.split(/[-_]/).map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(\"\");\n}\n\n/**\n * Resolve a Lucide icon component by string key.\n * Tries direct match, PascalCase conversion, and falls back to CircleAlert.\n */\nfunction resolveIcon(iconKey: string): React.ComponentType<{ size?: number; className?: string }> | null {\n const iconsMap = lucideIcons as Record<string, React.ComponentType<{ size?: number; className?: string }> | undefined>;\n let icon = iconsMap[iconKey];\n if (!icon) {\n icon = iconsMap[toPascalCase(iconKey)];\n }\n if (!icon) {\n icon = iconsMap.CircleAlert;\n }\n return icon ?? null;\n}\n\n/**\n * Render an icon element from a string key or existing React element.\n * This resolves the icon from the lucide-react icons map directly.\n */\nexport function getIcon(iconKey?: string | React.ReactNode,\n className?: string,\n color?: IconColor,\n size?: \"smallest\" | \"small\" | \"medium\" | \"large\" | number): React.ReactElement | undefined {\n\n if (React.isValidElement(iconKey)) {\n return iconKey;\n }\n\n if (!iconKey) return undefined;\n if (typeof iconKey === \"string\") {\n const lowerKey = iconKey.toLowerCase();\n const slugifiedKey = slugify(iconKey).replace(/-/g, \"_\");\n\n const mappedKey = iconKeysMap[iconKey] || iconKeysMap[lowerKey] || iconKeysMap[slugifiedKey];\n\n if (!mappedKey) {\n return undefined;\n }\n\n const LucideIcon = resolveIcon(mappedKey);\n if (!LucideIcon) return undefined;\n\n const sizeInPx = typeof size === \"number\" ? size : iconSize[size ?? \"medium\"];\n return <LucideIcon\n size={sizeInPx}\n className={cls(\n color ? colorClassesMapping[color] : \"\",\n \"select-none shrink-0\",\n className\n )}\n />;\n }\n\n console.warn(\"Invalid icon key provided:\", iconKey);\n return undefined;\n}\n\nexport type IconViewProps = {\n slug: string;\n name: string;\n singularName?: string;\n group?: string;\n icon?: string | React.ReactNode;\n}\n\nexport const IconForView = React.memo(\n function IconForView({\n collectionOrView,\n className,\n color,\n size = \"medium\"\n }: {\n collectionOrView?: IconViewProps,\n color?: IconColor,\n className?: string,\n size?: \"smallest\" | \"small\" | \"medium\" | \"large\" | number,\n }): React.ReactElement {\n if (!collectionOrView) return <></>;\n const icon = getIcon(collectionOrView.icon, className, color, size);\n if (collectionOrView?.icon && icon)\n return icon;\n\n let pathname = slugify((\"singularName\" in collectionOrView ? collectionOrView.singularName : undefined) ?? collectionOrView.name).replace(/-/g, \"_\");\n\n let key: string | undefined;\n if (pathname in iconKeysMap)\n key = iconKeysMap[pathname];\n\n if (!key) {\n pathname = slugify(collectionOrView.slug).replace(/-/g, \"_\");\n if (pathname in iconKeysMap)\n key = iconKeysMap[pathname];\n }\n\n const iconsCount = coolIconKeys.length;\n\n if (!key)\n key = coolIconKeys[hashString(collectionOrView.slug) % iconsCount];\n\n const LucideIcon = resolveIcon(key);\n if (!LucideIcon) return <></>;\n\n const sizeInPx = typeof size === \"number\" ? size : iconSize[size];\n return <LucideIcon\n size={sizeInPx}\n className={cls(\n color ? colorClassesMapping[color] : \"\",\n \"select-none shrink-0\",\n className\n )}\n />;\n }, (prevProps, nextProps) => {\n return equal(prevProps.collectionOrView?.icon, nextProps.collectionOrView?.icon) &&\n prevProps.collectionOrView?.name === nextProps.collectionOrView?.name &&\n prevProps.collectionOrView?.slug === nextProps.collectionOrView?.slug &&\n prevProps.collectionOrView?.singularName === nextProps.collectionOrView?.singularName &&\n equal(prevProps.color, nextProps.color) &&\n prevProps.className === nextProps.className &&\n prevProps.size === nextProps.size;\n });\n","import { FormexController } from \"@rebasepro/forms\";\n\nexport function createFormexStub<T extends object>(values: T): FormexController<T> {\n const errorMessage = \"You are in a read-only context. You cannot modify the formex controller.\";\n\n return {\n debugId: \"\",\n values,\n initialValues: values,\n touched: {} as Record<string, boolean>,\n dirty: false,\n errors: {} as Record<string, string>,\n submitCount: 0,\n isSubmitting: false,\n isValidating: false,\n version: 0,\n canUndo: false,\n canRedo: false,\n\n setValues: () => {\n throw new Error(errorMessage);\n },\n setTouched(touched: Record<string, boolean>): void {\n throw new Error(errorMessage);\n },\n setFieldValue: () => {\n throw new Error(errorMessage);\n },\n setFieldTouched: () => {\n throw new Error(errorMessage);\n },\n setDirty: () => {\n throw new Error(errorMessage);\n },\n setSubmitCount: () => {\n throw new Error(errorMessage);\n },\n setFieldError: () => {\n throw new Error(errorMessage);\n },\n handleChange: () => {\n throw new Error(errorMessage);\n },\n handleBlur: () => {\n throw new Error(errorMessage);\n },\n handleSubmit: () => {\n throw new Error(errorMessage);\n },\n validate: () => {\n throw new Error(errorMessage);\n },\n resetForm: () => {\n throw new Error(errorMessage);\n },\n setSubmitting: () => {\n throw new Error(errorMessage);\n },\n undo: () => {\n throw new Error(errorMessage);\n },\n redo: () => {\n throw new Error(errorMessage);\n }\n };\n}\n","import { EntityReference, EntityRelation, GeoPoint, Vector } from \"@rebasepro/types\";\nimport { isObject, isPlainObject } from \"@rebasepro/utils\";\n\n// Define a unique prefix for entity keys in sessionStorage to avoid key collisions\nconst LOCAL_STORAGE_PREFIX = \"entity_cache::\";\n\n// In-memory cache to store entities for quick access\nconst entityCache: Map<string, object> = new Map();\n\n// Check `sessionStorage` availability once during initialization\nconst isSessionStorageAvailable = typeof sessionStorage !== \"undefined\";\n\n// Define custom replacer for JSON.stringify\nfunction customReplacer(this: Record<string, unknown>, key: string): unknown {\n\n const value = this[key];\n\n // Handle Date objects\n if (value instanceof Date) {\n return {\n __type: \"Date\",\n value: value.toISOString()\n };\n }\n\n // Handle EntityReference\n if (value instanceof EntityReference) {\n return {\n __type: \"EntityReference\",\n id: value.id,\n path: value.path,\n driver: value.driver,\n databaseId: value.databaseId\n };\n }\n\n if (value instanceof EntityRelation) {\n return {\n __type: \"EntityRelation\",\n id: value.id,\n path: value.path,\n data: value.data\n };\n }\n\n // Handle GeoPoint\n if (value instanceof GeoPoint) {\n return {\n __type: \"GeoPoint\",\n latitude: value.latitude,\n longitude: value.longitude\n };\n }\n\n // Handle Vector\n if (value instanceof Vector) {\n return {\n __type: \"Vector\",\n value: value.value\n };\n }\n\n return value;\n}\n\n// Define custom reviver for JSON.parse\nfunction customReviver(_key: string, value: unknown): unknown {\n if (value && typeof value === \"object\" && \"__type\" in value) {\n const record = value as Record<string, unknown>;\n switch (record.__type) {\n case \"date\":\n case \"Date\":\n return new Date(record.value as string);\n case \"reference\":\n case \"EntityReference\":\n return new EntityReference({\n id: record.id as string,\n path: record.path as string,\n driver: record.driver as string | undefined,\n databaseId: record.databaseId as string | undefined\n });\n case \"relation\":\n case \"EntityRelation\":\n return new EntityRelation(record.id as string, record.path as string, record.data as Record<string, unknown> | undefined);\n case \"GeoPoint\":\n return new GeoPoint(record.latitude as number, record.longitude as number);\n case \"Vector\":\n return new Vector(record.value as number[]);\n default:\n return value;\n }\n }\n return value;\n}\n\n// Initialize the in-memory cache by loading entities from `sessionStorage`\nif (isSessionStorageAvailable) {\n try {\n // Iterate over all keys in sessionStorage to find those with the specified prefix\n for (let i = 0; i < sessionStorage.length; i++) {\n const fullKey = sessionStorage.key(i);\n if (fullKey && fullKey.startsWith(LOCAL_STORAGE_PREFIX)) {\n const path = fullKey.substring(LOCAL_STORAGE_PREFIX.length);\n const entityString = sessionStorage.getItem(fullKey);\n if (entityString) {\n try {\n const entity: object = JSON.parse(entityString, customReviver);\n entityCache.set(path, entity);\n } catch (parseError) {\n console.error(\n `Failed to parse entity for path \"${path}\" from sessionStorage:`,\n parseError\n );\n }\n }\n }\n }\n } catch (error) {\n console.error(\"Error accessing sessionStorage during initialization:\", error);\n }\n}\n\n/**\n * Saves data to the in-memory cache and persists it individually in `sessionStorage`.\n * @param path - The unique path/key for the data.\n * @param data - The data to cache and persist.\n */\nexport function saveEntityToCache(path: string, data: object): void {\n // Persist the data individually in sessionStorage\n if (isSessionStorageAvailable) {\n try {\n const key = LOCAL_STORAGE_PREFIX + path;\n\n const entityString = JSON.stringify(data, customReplacer);\n sessionStorage.setItem(key, entityString);\n } catch (error) {\n console.error(\n `Failed to save entity for path \"${path}\" to sessionStorage:`,\n error\n );\n }\n }\n}\n\nexport function removeEntityFromMemoryCache(path: string): void {\n entityCache.delete(path);\n}\n\nexport function saveEntityToMemoryCache(path: string, data: object): void {\n entityCache.set(path, data);\n}\n\nexport function getEntityFromMemoryCache(path: string): object | undefined {\n return entityCache.get(path);\n}\n\n\n/**\n * Retrieves a entity from the in-memory cache or `sessionStorage`.\n * If the entity is not in the cache but exists in `sessionStorage`, it loads it into the cache.\n * @param path - The unique path/key for the entity.\n * @returns The cached entity or `undefined` if not found.\n */\nexport function getEntityFromCache(path: string): object | undefined {\n\n // If not in the cache, attempt to load it from sessionStorage\n if (isSessionStorageAvailable) {\n try {\n const key = LOCAL_STORAGE_PREFIX + path;\n const entityString = sessionStorage.getItem(key);\n if (entityString) {\n const entity: object = JSON.parse(entityString, customReviver);\n return entity;\n }\n } catch (error) {\n console.error(\n `Failed to load entity for path \"${path}\" from sessionStorage:`,\n error\n );\n }\n }\n\n // Entity not found\n return undefined;\n}\n\n/**\n * Removes a entity from both the in-memory cache and `sessionStorage`.\n * @param path - The unique path/key for the entity to remove.\n */\nexport function removeEntityFromCache(path: string): void {\n\n console.debug(\"Removing entity from cache\", path);\n\n // Remove from the in-memory cache\n entityCache.delete(path);\n\n // Remove from sessionStorage\n if (isSessionStorageAvailable) {\n try {\n const key = LOCAL_STORAGE_PREFIX + path;\n sessionStorage.removeItem(key);\n } catch (error) {\n console.error(\n `Failed to remove entity for path \"${path}\" from sessionStorage:`,\n error\n );\n }\n }\n}\n\n\nexport function flattenKeys(obj: Record<string, unknown> | unknown[], prefix = \"\", result: string[] = []): string[] {\n\n if (isObject(obj) || Array.isArray(obj)) {\n const plainObject = isPlainObject(obj);\n if (!plainObject && prefix) {\n result.push(prefix);\n } else {\n const record = obj as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n const newKey = prefix\n ? Array.isArray(obj)\n ? `${prefix}[${key}]`\n : `${prefix}.${key}`\n : key;\n const val = record[key];\n if (isObject(val) || Array.isArray(val)) {\n flattenKeys(val as Record<string, unknown> | unknown[], newKey, result);\n } else {\n result.push(newKey);\n }\n }\n }\n }\n }\n return result;\n}\n","\nimport type { ArrayProperty, Property, StringProperty } from \"@rebasepro/types\";\nimport Compressor from \"compressorjs\";\nimport { deepEqual as equal } from \"fast-equals\";\n\nimport { EntityValues, StorageConfig, StorageSource, StorageSourceRegistry } from \"@rebasepro/types\";import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { resolveStorageFilenameString, resolveStoragePathString, resolveStorageSource } from \"@rebasepro/common\";\nimport { useAuthController } from \"../hooks\";\nimport { useStorageSources } from \"../contexts/StorageSourcesContext\";\nimport { randomString } from \"@rebasepro/utils\";\n\nexport type StorageFieldSize = \"smallest\" | \"small\" | \"medium\" | \"large\" | number;\n\n/**\n * Internal representation of an item in the storage\n * It can have two states, having a storagePathOrDownloadUrl set,\n * which means the file has been uploaded, and it is rendered as a preview\n * Or have a pending file being uploaded.\n */\nexport interface StorageFieldItem {\n id: number; // generated on the fly for internal use only\n storagePathOrDownloadUrl?: string;\n file?: File;\n fileName?: string;\n metadata?: Record<string, unknown>,\n size: StorageFieldSize\n}\n\nexport function useStorageUploadController<M extends Record<string, unknown>>({\n entityId,\n entityValues,\n path,\n value,\n property,\n propertyKey,\n storageSource,\n storageSourceRegistry,\n disabled,\n onChange\n}:\n {\n entityId?: string | number,\n entityValues: EntityValues<M>,\n value: string | string[] | null;\n path?: string,\n propertyKey: string,\n property: StringProperty | ArrayProperty | StringProperty | ArrayProperty,\n storageSource: StorageSource,\n /** Optional explicit registry. When omitted, the hook reads from the\n * `StorageSourcesContext` provided by `<Rebase storageSources={...}>`. */\n storageSourceRegistry?: StorageSourceRegistry,\n disabled: boolean,\n onChange: (value: string | string[] | null) => void\n }) {\n\n const authController = useAuthController();\n const storageSources = useStorageSources();\n const storage: StorageConfig | undefined = property.type === \"string\"\n ? property.storage\n : property.type === \"array\" &&\n (property.of as Property).type === \"string\"\n ? (property.of as StringProperty).storage\n : undefined;\n\n // Resolve the correct storage source for this property.\n // Priority: explicit registry prop → StorageSourcesContext → default.\n const resolvedStorageSource = useMemo(() => resolveStorageSource({\n sourceKey: storage?.storageSource,\n registry: storageSourceRegistry,\n sources: storageSources.sources,\n defaultSource: storageSource\n }), [storage?.storageSource, storageSourceRegistry, storageSources.sources, storageSource]);\n\n const multipleFilesSupported = property.type === \"array\";\n\n if (!storage)\n throw Error(\"Storage meta must be specified\");\n\n const processFile = storage?.processFile;\n\n const metadata: Record<string, unknown> | undefined = storage?.metadata;\n const size = multipleFilesSupported ? \"medium\" : \"large\";\n\n const imageResize = storage?.imageResize;\n\n const internalInitialValue: StorageFieldItem[] =\n getInternalInitialValue(multipleFilesSupported, value, metadata, size);\n\n const [initialValue, setInitialValue] = useState<string | string[] | null>(value);\n const [internalValue, setInternalValue] = useState<StorageFieldItem[]>(internalInitialValue);\n\n useEffect(() => {\n if (!equal(initialValue, value)) {\n setInitialValue(value);\n setInternalValue(internalInitialValue);\n }\n }, [internalInitialValue, value, initialValue]);\n\n const fileNameBuilder = useCallback(async (file: File) => {\n if (storage.fileName) {\n const fileName = await resolveStorageFilenameString({\n input: storage.fileName,\n storage,\n values: entityValues,\n entityId,\n path,\n property: property,\n file,\n propertyKey\n });\n if (!fileName || fileName.length === 0) {\n throw Error(\"You need to return a valid filename\");\n }\n return fileName;\n }\n return randomString() + \"_\" + file.name;\n }, [entityId, entityValues, path, property, propertyKey, storage]);\n\n const storagePathBuilder = useCallback((file: File) => {\n return resolveStoragePathString({\n input: storage.storagePath,\n storage,\n values: entityValues,\n entityId,\n path,\n property: property,\n file,\n propertyKey\n }) ?? \"/\";\n }, [entityId, entityValues, path, property, propertyKey, storage]);\n\n const onFileUploadComplete = useCallback(async (uploadedPath: string,\n entry: StorageFieldItem,\n metadata?: Record<string, unknown>,\n uploadedUrl?: string) => {\n\n console.debug(\"onFileUploadComplete\", uploadedPath, entry);\n\n let uploadPathOrDownloadUrl: string | null = uploadedPath;\n\n if (storage.includeBucketUrl) {\n if (!uploadedUrl) {\n console.warn(\"includeBucketUrl is set but no fully-qualified storage URL was returned by the StorageSource. Falling back to the storage path.\");\n } else {\n uploadPathOrDownloadUrl = uploadedUrl;\n }\n }\n\n if (storage.storeUrl) {\n uploadPathOrDownloadUrl = (await resolvedStorageSource.getSignedUrl(uploadedPath)).url;\n }\n if (storage.postProcess && uploadPathOrDownloadUrl) {\n uploadPathOrDownloadUrl = await storage.postProcess(uploadPathOrDownloadUrl);\n }\n\n if (!uploadPathOrDownloadUrl) {\n console.warn(\"uploadPathOrDownloadUrl is null\")\n return;\n }\n\n let newValue: StorageFieldItem[];\n\n entry.storagePathOrDownloadUrl = uploadPathOrDownloadUrl;\n entry.metadata = metadata;\n newValue = [...internalValue];\n\n newValue = removeDuplicates(newValue);\n setInternalValue(newValue);\n\n const fieldValue = newValue\n .filter(e => !!e.storagePathOrDownloadUrl)\n .map(e => e.storagePathOrDownloadUrl as string);\n\n if (multipleFilesSupported) {\n onChange(fieldValue);\n } else {\n onChange(fieldValue ? fieldValue[0] : null);\n }\n }, [internalValue, multipleFilesSupported, onChange, storage, resolvedStorageSource]);\n\n const onFileUploadError = useCallback((entry: StorageFieldItem) => {\n console.debug(\"onFileUploadError\", entry);\n\n // Remove the failed entry from internalValue\n const newValue = internalValue.filter(item => item.id !== entry.id);\n setInternalValue(newValue);\n }, [internalValue]);\n\n const onFilesAdded = useCallback(async (acceptedFiles: File[]) => {\n\n if (!acceptedFiles.length || disabled)\n return;\n\n if (processFile) {\n try {\n acceptedFiles = await Promise.all(acceptedFiles.map(async file => {\n const processedFile = await processFile(file);\n if (!processedFile) {\n return file;\n }\n return processedFile;\n }));\n } catch (e) {\n console.error(\"Error processing file with custom code. Attempting to continue uploading.\", e);\n }\n }\n\n let newInternalValue: StorageFieldItem[];\n\n if (multipleFilesSupported) {\n newInternalValue = [...internalValue,\n ...(await Promise.all(acceptedFiles.map(async file => {\n if (imageResize && isImageFile(file)) {\n file = await resizeImage(file, imageResize);\n }\n\n return {\n id: getRandomId(),\n file,\n fileName: await fileNameBuilder(file),\n metadata,\n size\n } as StorageFieldItem;\n })))];\n } else {\n let file = acceptedFiles[0];\n if (imageResize && isImageFile(file)) {\n file = await resizeImage(file, imageResize);\n }\n\n newInternalValue = [{\n id: getRandomId(),\n file,\n fileName: await fileNameBuilder(file),\n metadata,\n size\n }];\n }\n\n // Remove either storage path or file duplicates\n newInternalValue = removeDuplicates(newInternalValue);\n setInternalValue(newInternalValue);\n }, [disabled, fileNameBuilder, internalValue, metadata, multipleFilesSupported, size, imageResize]);\n\n return {\n internalValue,\n setInternalValue,\n storage,\n fileNameBuilder,\n storagePathBuilder,\n onFileUploadComplete,\n onFileUploadError,\n onFilesAdded,\n multipleFilesSupported,\n /** The resolved StorageSource for this property — may differ from the\n * default context source when `StorageConfig.storageSource` is set. */\n resolvedStorageSource\n }\n}\n\nfunction getInternalInitialValue(multipleFilesSupported: boolean,\n value: string | string[] | null,\n metadata: Record<string, unknown> | undefined,\n size: StorageFieldSize): StorageFieldItem[] {\n let strings: string[] = [];\n if (multipleFilesSupported) {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n strings = (value ?? []) as string[];\n }\n } else {\n if (typeof value === \"string\") {\n strings = value ? [value as string] : [];\n }\n }\n\n return strings\n .map(entry => (\n {\n id: getRandomId(),\n storagePathOrDownloadUrl: entry,\n metadata,\n size\n }\n ));\n}\n\nfunction removeDuplicates(items: StorageFieldItem[]) {\n return items.filter(\n (item, i) => {\n return ((items.map((v) => v.storagePathOrDownloadUrl).indexOf(item.storagePathOrDownloadUrl) === i) || !item.storagePathOrDownloadUrl) &&\n ((items.map((v) => v.file).indexOf(item.file) === i) || !item.file);\n }\n );\n}\n\nfunction getRandomId() {\n return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER));\n}\n\n/**\n * Check if a file is an image type supported for resizing\n */\nfunction isImageFile(file: File): boolean {\n return file.type === \"image/jpeg\" ||\n file.type === \"image/png\" ||\n file.type === \"image/webp\";\n}\n\n/**\n * Resize and compress an image using compressorjs.\n */\nasync function resizeImage(\n file: File,\n imageResize?: StorageConfig[\"imageResize\"]\n): Promise<File> {\n const maxWidth = imageResize?.maxWidth;\n const maxHeight = imageResize?.maxHeight;\n const quality = (imageResize?.quality ?? 80) / 100;\n const mode = imageResize?.mode ?? \"contain\";\n\n // Determine output format\n let mimeType = file.type;\n if (imageResize?.format && imageResize.format !== \"original\") {\n mimeType = `image/${imageResize.format}`;\n }\n\n return new Promise<File>((resolve, reject) => {\n new Compressor(file, {\n quality,\n maxWidth,\n maxHeight,\n mimeType,\n // Use cover mode if specified (crops to fit)\n // Otherwise use contain mode (scales to fit)\n ...(mode === \"cover\" || mode === undefined ? {\n width: maxWidth,\n height: maxHeight,\n resize: \"cover\" as const\n } : {}),\n success: (result) => {\n const compressedFile = new File([result], file.name, {\n type: result.type,\n lastModified: Date.now()\n });\n resolve(compressedFile);\n },\n error: reject\n });\n });\n}\n","import type { CollectionConfig, Property, PropertyConfig } from \"@rebasepro/types\";\nimport { AuthController } from \"@rebasepro/types\";\nimport { isPropertyBuilder } from \"@rebasepro/common\";\n\nfunction isReferenceProperty(property: Property) {\n if (!property) return null;\n if (property.type === \"reference\") return true;\n if (property.type === \"array\") {\n if (Array.isArray(property.of)) return false;\n else return property.of?.type === \"reference\";\n }\n return false;\n}\n\nfunction isRelationProperty(property: Property) {\n if (!property) return null;\n if (property.type === \"relation\") return true;\n if (property.type === \"array\") {\n if (Array.isArray(property.of)) return false;\n else return property.of?.type === \"relation\";\n }\n return false;\n}\n\nfunction isHiddenProperty(property: Property | undefined): boolean {\n if (!property) return false;\n return Boolean(property.ui?.hideFromCollection);\n}\n\n/**\n * Returns true when the property holds file-storage content (single image,\n * array of images, generic upload, …). These properties are rendered by the\n * dedicated image-slot and should NOT appear as regular preview columns.\n */\nfunction isStorageProperty(property: Property | undefined): boolean {\n if (!property) return false;\n // Single string with storage config\n if (property.type === \"string\" && property.storage) return true;\n // String displayed as image URL\n if (property.type === \"string\" && property.ui?.url === \"image\") return true;\n // Array whose inner element has storage config or image URL\n if (property.type === \"array\" && property.of && !Array.isArray(property.of)) {\n const inner = property.of;\n if (inner.type === \"string\" && (inner.storage || inner.ui?.url === \"image\")) return true;\n }\n return false;\n}\n\nexport function getEntityPreviewKeys(\n authController: AuthController,\n targetCollection: CollectionConfig<any>,\n fields: Record<string, PropertyConfig>,\n previewProperties?: string[],\n limit = 3) {\n const allProperties = Object.keys(targetCollection.properties);\n let listProperties = previewProperties?.filter(p => allProperties.includes(p as string));\n if (!listProperties && targetCollection.previewProperties) {\n listProperties = targetCollection.previewProperties?.filter(p => allProperties.includes(p as string));\n }\n if (listProperties && listProperties.length > 0) {\n return listProperties;\n } else {\n listProperties = (targetCollection.propertiesOrder as string[]) || allProperties;\n return listProperties\n .filter(key => {\n const prop = targetCollection.properties[key];\n const isIdProp = prop && typeof prop === \"object\" && \"isId\" in prop && Boolean((prop as { isId?: boolean }).isId);\n return !isIdProp && key !== \"id\";\n })\n .filter(key => {\n const property = targetCollection.properties[key];\n return property && !isPropertyBuilder(property) && !isReferenceProperty(property) && !isRelationProperty(property) && !isHiddenProperty(property) && !isStorageProperty(property as Property);\n }).slice(0, limit);\n }\n}\n\nexport function getEntityTitlePropertyKey<M extends Record<string, any>>(collection: CollectionConfig<M>, propertyConfigs: Record<string, PropertyConfig>): string | undefined {\n if (collection.titleProperty) {\n return collection.titleProperty as string;\n }\n\n const orderToSearch = (collection.propertiesOrder as string[]) || Object.keys(collection.properties);\n let firstStringCandidate: string | undefined;\n\n for (const key of orderToSearch) {\n const property = collection.properties[key];\n if (property && !isPropertyBuilder(property)) {\n const prop = property as Property;\n if (isHiddenProperty(prop)) {\n continue;\n }\n if (prop.type === \"string\" && !prop.ui?.multiline && !prop.ui?.markdown && !prop.storage && !prop.isId) {\n if (!firstStringCandidate) {\n firstStringCandidate = key;\n }\n const lowerKey = key.toLowerCase();\n if ([\"name\", \"title\", \"label\", \"displayname\", \"username\"].includes(lowerKey)) {\n return key; // Immediate return if it's a strong title candidate\n }\n }\n }\n }\n return firstStringCandidate;\n}\n\n","import { EnumValueConfig } from \"@rebasepro/types\";\nimport { CHIP_COLORS, ChipColorScheme, getColorSchemeForSeed } from \"@rebasepro/ui\";\nimport { getLabelOrConfigFrom } from \"@rebasepro/common\";\n\nexport function getColorScheme(enumValues: EnumValueConfig[], key: string | number): ChipColorScheme | undefined {\n const labelOrConfig = getLabelOrConfigFrom(enumValues, key);\n if (!labelOrConfig?.color)\n return getColorSchemeForSeed(key.toString());\n if (typeof labelOrConfig === \"object\" && \"color\" in labelOrConfig) {\n if (typeof labelOrConfig.color === \"string\")\n return CHIP_COLORS[labelOrConfig.color];\n if (typeof labelOrConfig.color === \"object\")\n return labelOrConfig.color;\n }\n return undefined;\n}\n\nexport function isEnumValueDisabled(labelOrConfig?: string | EnumValueConfig) {\n return typeof labelOrConfig === \"object\" && (labelOrConfig as EnumValueConfig).disabled;\n}\n\nexport function buildEnumLabel(\n labelOrConfig?: string | EnumValueConfig\n): string | undefined {\n if (labelOrConfig === undefined)\n return undefined;\n if (typeof labelOrConfig === \"object\") {\n return labelOrConfig.label;\n } else {\n return labelOrConfig;\n }\n}\n","export const STUDIO_NAVIGATION_GROUPS = [\n \"Database\",\n \"Compute\",\n \"API\",\n \"Storage\",\n \"Access Control\"\n];\n","/**\n * Layout width primitives used by the framework's own side-panel and form\n * dialog sizing logic.\n *\n * @internal Not part of the stable public API — exported only because\n * `@rebasepro/admin` and `@rebasepro/studio` need them to compute the same\n * dialog widths as the framework. Do not depend on these for app code; they\n * may change shape or be removed without a major version bump.\n */\nexport const CONTAINER_FULL_WIDTH = \"100vw\";\n\n/** @internal See {@link CONTAINER_FULL_WIDTH}. */\nexport const ADDITIONAL_TAB_WIDTH = \"55vw\";\n\n/** @internal See {@link CONTAINER_FULL_WIDTH}. */\nexport const FORM_CONTAINER_WIDTH = \"768px\";\n","import React, { useCallback, useEffect, useRef } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nconst scrollsMap: Record<string, number> = {};\n\n/**\n * Restores per-route scroll position on a scrollable container, keyed by\n * router location. Used by the framework's own home page implementations.\n *\n * @internal Not part of the stable public API — exported only because\n * `@rebasepro/admin` and `@rebasepro/studio` reuse it in their home page\n * components. Its behavior (module-level scroll cache, router coupling) is\n * an implementation detail and may change without a major version bump.\n */\nexport function useRestoreScroll() {\n\n const location = useLocation();\n\n const containerRef = useRef<HTMLDivElement>(null);\n const [scroll, setScroll] = React.useState(0);\n const [direction, setDirection] = React.useState<\"up\" | \"down\">(\"down\");\n\n // Use ref to track previous scroll for direction calculation\n // This avoids recreating handleScroll on every scroll\n const prevScrollRef = useRef(0);\n\n const handleScroll = useCallback(() => {\n if (!containerRef.current || !location.key) return;\n const scrollTop = containerRef.current.scrollTop;\n scrollsMap[location.key] = scrollTop;\n setScroll(scrollTop);\n setDirection(scrollTop > prevScrollRef.current ? \"down\" : \"up\");\n prevScrollRef.current = scrollTop;\n }, [location.key]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n container.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => {\n if (container)\n container.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // Defer scroll restoration to next tick to allow async content to render\n // This is necessary because DefaultHomePage content loads asynchronously\n useEffect(() => {\n const savedScroll = scrollsMap[location.key];\n if (!containerRef.current || !savedScroll) return;\n\n const timeoutId = setTimeout(() => {\n if (!containerRef.current) return;\n containerRef.current.scrollTo({\n top: savedScroll,\n behavior: \"auto\"\n });\n }, 0);\n\n return () => clearTimeout(timeoutId);\n }, [location.key]);\n\n return {\n containerRef,\n scroll,\n direction\n };\n}\n","import React from \"react\";\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, Typography } from \"@rebasepro/ui\";\nimport { useTranslation } from \"../hooks\";\n\nexport interface UnsavedChangesDialogProps {\n open: boolean;\n body?: React.ReactNode;\n title?: string;\n handleOk: () => void;\n handleCancel: () => void;\n}\n\nexport function UnsavedChangesDialog({\n open,\n handleOk,\n handleCancel,\n body,\n title\n}: UnsavedChangesDialogProps) {\n\n const { t } = useTranslation();\n\n return (\n <Dialog\n onEscapeKeyDown={() => {\n handleCancel();\n }}\n open={open}\n >\n <DialogTitle variant={\"h6\"}>{title}</DialogTitle>\n <DialogContent>\n\n <Typography>\n {body ?? t(\"unsaved_changes\")}\n </Typography>\n\n </DialogContent>\n <DialogActions>\n <Button variant=\"text\"\n onClick={handleCancel} autoFocus> {t(\"cancel\")} </Button>\n <Button\n onClick={handleOk}> {t(\"ok\")} </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import React, { createContext, useCallback, useContext, useMemo, useRef, useState } from \"react\";\nimport type {\n CollectionRegistryController,\n SidePanelController,\n UrlController,\n NavigationStateController,\n BreadcrumbEntry,\n BreadcrumbsController\n} from \"@rebasepro/types\";\n\nexport type { BreadcrumbEntry, BreadcrumbsController };\n\n// ─── Breadcrumbs ──────────────────────────────────────────────────\n\n\n// ─── Bridge interface ───────────────────────────────────────────────\n\n/**\n * StudioBridge provides optional CMS capabilities to Studio components.\n * When CMS is present, a bridge provider injects real implementations.\n * When CMS is absent, noop defaults ensure Studio works standalone.\n */\nexport interface StudioBridge {\n collectionRegistry: CollectionRegistryController;\n sidePanelController: SidePanelController;\n urlController: UrlController;\n navigationState: NavigationStateController;\n breadcrumbs: BreadcrumbsController;\n}\n\n// ─── Noop defaults ──────────────────────────────────────────────────\n\nconst NOOP_COLLECTION_REGISTRY: CollectionRegistryController = {\n getCollection: () => undefined,\n getRawCollection: () => undefined,\n getParentReferencesFromPath: () => [],\n getParentCollectionSlugs: () => [],\n getParentEntityIds: () => [],\n convertIdsToPaths: () => [],\n initialised: false\n};\n\nconst NOOP_SIDE_PANEL: SidePanelController = {\n open: () => {},\n replace: () => {},\n close: () => {}\n};\n\nconst NOOP_URL_CONTROLLER: UrlController = {\n basePath: \"/\",\n baseCollectionPath: \"/c\",\n urlPathToDataPath: () => \"\",\n homeUrl: \"/\",\n isUrlCollectionPath: () => false,\n buildUrlCollectionPath: () => \"\",\n buildAppUrlPath: () => \"\",\n resolveDatabasePathsFrom: () => \"\",\n navigate: () => {}\n};\n\nconst NOOP_NAVIGATION_STATE: NavigationStateController = {\n loading: false,\n refreshNavigation: () => {}\n};\n\nconst NOOP_BREADCRUMBS: BreadcrumbsController = {\n breadcrumbs: [],\n set: () => {},\n updateCount: () => {}\n};\n\nconst NOOP_BRIDGE: StudioBridge = {\n collectionRegistry: NOOP_COLLECTION_REGISTRY,\n sidePanelController: NOOP_SIDE_PANEL,\n urlController: NOOP_URL_CONTROLLER,\n navigationState: NOOP_NAVIGATION_STATE,\n breadcrumbs: NOOP_BREADCRUMBS\n};\n\n// ─── Context & Provider ─────────────────────────────────────────────\n\nexport const StudioBridgeContext = createContext<StudioBridge>(NOOP_BRIDGE);\n\n/**\n * Provider that injects CMS capabilities into Studio.\n * Accepts partial overrides — any field not provided falls back to noop.\n *\n * Usage (in app wiring, when CMS is present):\n * ```tsx\n * <StudioBridgeProvider value={{\n * collectionRegistry: useCollectionRegistryController(),\n * sidePanelController: useSidePanel(),\n * urlController: useUrlController(),\n * navigationState: useNavigationStateController(),\n * breadcrumbs: useBreadcrumbsController(),\n * }}>\n * <RebaseStudio ... />\n * </StudioBridgeProvider>\n * ```\n */\nexport function StudioBridgeProvider({\n value,\n children\n}: {\n value: Partial<StudioBridge>;\n children: React.ReactNode;\n}) {\n const merged = React.useMemo(\n () => ({ ...NOOP_BRIDGE,\n...value }),\n [value]\n );\n return (\n <StudioBridgeContext.Provider value={merged}>\n {children}\n </StudioBridgeContext.Provider>\n );\n}\n\n// ─── Convenience hooks ──────────────────────────────────────────────\n\n/** Collection registry — returns noop if CMS is not present. */\nexport function useStudioCollectionRegistry(): CollectionRegistryController {\n return useContext(StudioBridgeContext).collectionRegistry;\n}\n\n/** Side panel controller — returns noop if CMS is not present. */\nexport function useStudioSidePanelController(): SidePanelController {\n return useContext(StudioBridgeContext).sidePanelController;\n}\n\n/** URL controller — returns noop if CMS is not present. */\nexport function useStudioUrlController(): UrlController {\n return useContext(StudioBridgeContext).urlController;\n}\n\n/** Navigation state — returns noop if CMS is not present. */\nexport function useStudioNavigationState(): NavigationStateController {\n return useContext(StudioBridgeContext).navigationState;\n}\n\n/** Breadcrumbs controller — returns noop if CMS is not present. */\nexport function useStudioBreadcrumbs(): BreadcrumbsController {\n return useContext(StudioBridgeContext).breadcrumbs;\n}\n\n// ─── Self-Assembling Bridge Registry ────────────────────────────────\n\n/**\n * Registry that controllers use to self-register their implementations\n * into the Studio bridge. Each controller calls `register(key, value)`\n * on mount and `unregister(key)` on unmount.\n */\nexport interface StudioBridgeRegistry {\n register: <K extends keyof StudioBridge>(key: K, value: StudioBridge[K]) => void;\n unregister: (key: keyof StudioBridge) => void;\n}\n\nexport const StudioBridgeRegistryContext = createContext<StudioBridgeRegistry | null>(null);\n\n/**\n * Provider that creates a self-assembling bridge.\n *\n * Mount this above the controller providers. Each controller calls\n * `useBridgeRegistration(key, value)` to inject its implementation.\n * The bridge context value is automatically kept in sync.\n *\n * ```tsx\n * <StudioBridgeRegistryProvider>\n * <CollectionRegistryProvider> // auto-registers\n * <SidePanelProvider> // auto-registers\n * <UrlProvider> // auto-registers\n * <RebaseStudio /> // consumes bridge\n * </UrlProvider>\n * </SidePanelProvider>\n * </CollectionRegistryProvider>\n * </StudioBridgeRegistryProvider>\n * ```\n */\nexport function StudioBridgeRegistryProvider({ children }: { children: React.ReactNode }) {\n const [version, setVersion] = useState(0);\n const slicesRef = useRef<Partial<StudioBridge>>({});\n\n const register = useCallback(<K extends keyof StudioBridge>(key: K, value: StudioBridge[K]) => {\n slicesRef.current[key] = value;\n setVersion(v => v + 1);\n }, []);\n\n const unregister = useCallback((key: keyof StudioBridge) => {\n delete slicesRef.current[key];\n setVersion(v => v + 1);\n }, []);\n\n const registry = useMemo<StudioBridgeRegistry>(() => ({ register,\nunregister }), [register, unregister]);\n\n const bridgeValue = useMemo<StudioBridge>(() => ({\n ...NOOP_BRIDGE,\n ...slicesRef.current\n }), [version]);\n\n return (\n <StudioBridgeRegistryContext.Provider value={registry}>\n <StudioBridgeContext.Provider value={bridgeValue}>\n {children}\n </StudioBridgeContext.Provider>\n </StudioBridgeRegistryContext.Provider>\n );\n}\n","import { useContext, useEffect } from \"react\";\nimport type { StudioBridge } from \"./useStudioBridge\";\nimport { StudioBridgeRegistryContext } from \"./useStudioBridge\";\n\n/**\n * Registers a value into the self-assembling Studio bridge.\n *\n * Each controller (collectionRegistry, sidePanel, url, navigation, breadcrumbs)\n * calls this hook on mount to inject its real implementation into the bridge.\n * On unmount the slice is automatically removed, reverting to the noop default.\n *\n * Usage:\n * ```tsx\n * function SomeProvider({ children }) {\n * const controller = useBuildSomeController();\n * useBridgeRegistration(\"sidePanelController\", controller);\n * return <SomeContext.Provider value={controller}>{children}</SomeContext.Provider>;\n * }\n * ```\n */\nexport function useBridgeRegistration<K extends keyof StudioBridge>(\n key: K,\n value: StudioBridge[K]\n): void {\n const registry = useContext(StudioBridgeRegistryContext);\n\n useEffect(() => {\n if (!registry) return;\n registry.register(key, value);\n return () => registry.unregister(key);\n }, [registry, key, value]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,SAAgB,oBAAoB,EAChC,SACA,OACA,YACA,YAMD;CAIC,OAHkB,QAAQ,SAAQ,MAAK,EAAE,aAAa,CAAC,CAAC,EACnD,QAAO,MAAK,EAAE,UAAU,KAEtB,EAAU,aACZ,KAAK,aACF,oBAAC,SAAS,WAAV;EAAoB,GAAI,SAAS;EAAO,GAAI;YACvC;CACe,CAAA,GAExB,QACJ;AACJ;;;;;;;;;;;;;;;ACvBA,SAAgB,uBAAuB,EACnC,SACA,WAID;CACC,MAAM,aAAa,OAAO,KAAK;CAC/B,MAAM,cAAc,OAAgC,KAAA,CAAS;CAG7D,gBAAgB;EAEZ,IAAI,WAAW,SAAS;EACxB,WAAW,UAAU;EAErB,KAAK,MAAM,UAAU,SACjB,IAAI,OAAO,WAAW,SAClB,IAAI;GACA,MAAM,SAAS,OAAO,UAAU,QAAQ,OAAO;GAC/C,IAAI,kBAAkB,SAClB,OAAO,OAAO,QACV,QAAQ,MAAM,oBAAoB,OAAO,IAAI,mBAAmB,GAAG,CACvE;EAER,SAAS,KAAK;GACV,QAAQ,MAAM,oBAAoB,OAAO,IAAI,mBAAmB,GAAG;EACvE;EAIR,aAAa;GACT,WAAW,UAAU;GACrB,KAAK,MAAM,UAAU,SACjB,IAAI,OAAO,WAAW,WAClB,IAAI;IACA,OAAO,UAAU,UAAU;GAC/B,SAAS,KAAK;IACV,QAAQ,MAAM,oBAAoB,OAAO,IAAI,qBAAqB,GAAG;GACzE;EAGZ;CAEJ,GAAG,CAAC,CAAC;CAGL,MAAM,cAAc,QAAQ,gBAAgB,QAAQ;CAEpD,gBAAgB;EAEZ,IAAI,YAAY,YAAY,KAAA,GAAW;GACnC,YAAY,UAAU;GACtB;EACJ;EAKA,IAFgB,YAAY,SAAS,QACrB,aAAa,KACJ;EAEzB,YAAY,UAAU;EAEtB,KAAK,MAAM,UAAU,SACjB,IAAI,OAAO,WAAW,mBAClB,IAAI;GACA,OAAO,UAAU,kBAAkB,WAAW;EAClD,SAAS,KAAK;GACV,QAAQ,MACJ,oBAAoB,OAAO,IAAI,6BAC/B,GACJ;EACJ;CAGZ,GAAG,CAAC,aAAa,OAAO,CAAC;CAEzB,OAAO;AACX;;;ACzFA,IAAa,oBAAiD,EAAE,eAAe;CAE3E,OACI,oBAAC,oBAAD;EAA2B,UAAU;EACV,kBAAkB;EAClB,kBAAkB;EACxC;CACsB,CAAA;AAEnC;ACNA,IAAa,wBAAwB,MAAM,cAA8B;CAJrE,MAAM;CACN,UAAU,SAAsC,CAChD;AAEqE,CAAkB;AAE3F,IAAa,yBAAyB,sBAAsB;ACF5D,IAAa,6BAA6B,MAAM,cAAmC;CAJ/E,MAAM;CACN,UAAU,SAA4C,CACtD;AAE+E,CAAwB;AAE3G,IAAa,8BAA8B,2BAA2B;ACDtE,IAAa,iCAAiC,MAAM,cAAuC;CAJvF,eAAe;CACf,mBAAmB,UAAyB,CAC5C;AAEuF,CAA4B;AAEvH,IAAa,kCAAkC,+BAA+B;;;ACR9E,IAAa,wBAAwB,MAAM,cAAwC,CAAC,CAA6B;;;ACAjH,IAAa,oBAAoB,MAAM,cAA0B,CAAC,CAAe;;ACyBjF,IAAa,qBAAqB,MAAM,cAAuC;CAHtC,UAAU,CAAC;CAAG,SAAS,CAAC;AAGc,CAAK;;;;;;AAOpF,IAAa,uBAAgD,MAAM,WAAW,kBAAkB;;;AChChG,IAAa,oBAAoB,MAAM,cAA0B,CAAC,CAAe;;;ACAjF,IAAa,mBAAmB,MAAM,cAAmC,CAAC,CAAwB;;;ACAlG,IAAa,uBAAuB,MAAM,cAA6B,CAAC,CAAkB;;ACmB1F,IAAa,wBAAwB,MAAM,cAA0C;CAHzC,UAAU,CAAC;CAAG,SAAS,CAAC;AAGiB,CAAK;;;;;;AAO1F,IAAa,0BAAsD,MAAM,WAAW,qBAAqB;;;AC1BzG,IAAa,sCAAsC,MAAM,cAAwD,KAAA,CAAS;;;ACC1H,IAAa,2BAA2B,MAAM,cAAiC,CAAC,CAAsB;AAEtG,IAAa,mBAAgD,EAAE,eAAe;CAE1E,MAAM,CAAC,eAAe,oBAAoB,SAAuC,CAAC,CAAC;CACnF,MAAM,mBAAmB,OAAqC,aAAa;CAE3E,MAAM,uBAAuB,cAAiD;EAC1E,iBAAiB,UAAU;EAC3B,iBAAiB,SAAS;CAC9B;CAEA,MAAM,QAAQ,kBAAkB;EAE5B,IAAI,cAAc,WAAW,GACzB;EAGJ,oBAAoB,CADG,GAAG,iBAAiB,QAAQ,MAAM,GAAG,EAAE,CAC1C,CAAa;CAErC,GAAG,CAAC,aAAa,CAAC;CAElB,MAAM,OAAO,aAAwC,gBAA+C;EAGhG,oBAAoB,CADG,GAAG,iBAAiB,SAAS,WAChC,CAAa;EAEjC,OAAO,EACH,mBAAmB;GAEf,oBADsB,iBAAiB,QAAQ,QAAO,MAAK,EAAE,QAAQ,YAAY,GAC7D,CAAa;EACrC,EACJ;CACJ,GAAG,CAAC,aAAa,CAAC;CAElB,MAAM,oBAAoB,eAAe;EACrC;EACA;CACJ,IAAI,CAAC,MAAM,KAAK,CAAC;CAEjB,OACI,qBAAC,yBAAyB,UAA1B;EAAmC,OAAO;YAA1C,CACK,UACA,cAAc,KAAK,OAAO,MAAM,oBAAC,MAAM,WAAP;GAE7B,MAAM;GACN,aAAa;GACb,GAAI,MAAM;EACb,GAJQ,UAAU,GAIlB,CAAC,CAC6B;;AAE3C;;;;;;;ACjDA,IAAa,8BAA8B,MAAM,cAAmB,KAAA,CAAS;;;ACH7E,IAAa,iCAAiC,MAAM,cAAuC,CAAC,CAA4B;;;;ACCxH,IAAM,kBAAwC,CAAC;AAgB/C,IAAa,2BAA2B,cAAsC;CAC1E,iBAAiB;CACjB,qBAAqB;AACzB,CAAC;;;;;;;AAQD,SAAgB,gCAAgC,EAC5C,WACA,YAID;CACC,MAAM,QAAQ,eAAuC;EACjD,iBAAiB,aAAa;EAC9B,qBAAqB;CACzB,IAAI,CAAC,SAAS,CAAC;CAEf,OACI,oBAAC,yBAAyB,UAA1B;EAA0C;EACrC;CAC8B,CAAA;AAE3C;;;;;;;;;;;;AAaA,SAAgB,oCAAoC,EAChD,WACA,YAID;CACC,MAAM,SAAS,WAAW,wBAAwB;CAElD,MAAM,QAAQ,eAAuC;EACjD,iBAAiB,OAAO;EACxB,qBAAqB,aAAa;CACtC,IAAI,CAAC,OAAO,iBAAiB,SAAS,CAAC;CAEvC,OACI,oBAAC,yBAAyB,UAA1B;EAA0C;EACrC;CAC8B,CAAA;AAE3C;;;;;;;;;;;;;;;;AC/DA,IAAa,yBAAyB,cAA4C,KAAA,CAAS;;;;;;;AAQ3F,SAAgB,qBAAmD;CAC/D,OAAO,WAAW,sBAAsB;AAC5C;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,SAAgB,wBAAwB,EACpC,YACA,YAID;CACC,OACI,oBAAC,uBAAuB,UAAxB;EAAiC,OAAO;YACpC,oBAAC,qCAAD;GAAqC,WAAW,YAAY;GACvD;EACgC,CAAA;CACR,CAAA;AAEzC;;;;;;;;;;;;;;ACnDA,IAAa,gBAA4B;CACrC,OAAO,WAAW,iBAAiB;AACvC;;;ACHA,IAAM,qBAAqB,cAAuC;CAC9D,yBAAyB,CAAC;CAC1B,oBAAoB;CACpB,eAAe,CAAC;AACpB,CAAC;AAED,SAAgB,wBAAiD;CAC7D,OAAO,WAAW,kBAAkB;AACxC;;;;;;AAOA,SAAgB,mBAAmB,OAAyB;CACxD,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO;CAEhD,IAAI,UAAU,SAAU,MAA4B,SAAS,gBACzD,OAAO;CAGX,IAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,eAAe,GAChE,OAAO;CAEX,OAAO;AACX;AAIA,SAAgB,oBAAoB,EAAE,YAA2C;CAC7E,MAAM,CAAC,oBAAoB,yBAAyB,SAAwB,IAAI;CAChF,MAAM,CAAC,WAAW,gBAAgB,SAAS,KAAK;CAEhD,MAAM,oBAAoB,aAAa,YAAoB;EACvD,uBAAsB,SAAQ,QAAQ,OAAO;CACjD,GAAG,CAAC,CAAC;CAEL,MAAM,UAAU,kBAAkB;EAC9B,aAAa,IAAI;CACrB,GAAG,CAAC,CAAC;CAEL,MAAM,QAAQ,eAAwC;EAClD;EACA,oBAAoB,YAAY,OAAO;EACvC;CACJ,IAAI;EAAC;EAAmB;EAAoB;EAAW;CAAO,CAAC;CAE/D,OACI,oBAAC,mBAAmB,UAApB;EAAoC;EAC/B;CACwB,CAAA;AAErC;;;;AAWA,SAAgB,kBAAkB,EAAE,aAAqC;CACrE,MAAM,EAAE,oBAAoB,YAAY,sBAAsB;CAE9D,IAAI,CAAC,oBAAoB,OAAO;CAEhC,OACI,oBAAC,OAAD;EACI,OAAM;EACN,MAAK;EACL,WAAW;EACA;YAEX,qBAAC,OAAD;GAAK,WAAU;aAAf,CACI,oBAAC,YAAD;IAAY,SAAQ;IAAQ,WAAU;cAAqC;GAE/D,CAAA,GACZ,qBAAC,YAAD;IAAY,SAAQ;IAAQ,WAAU;cAAtC;KACK;KAAoB;KAAI;KACrB,oBAAC,QAAD;MAAM,WAAU;gBAAsD;KAAkB,CAAA;KAAC;IACrF;KACX;;CACF,CAAA;AAEf;;;;;;;;;;;;;;;AC3BA,SAAgB,cACZ,EACI,MACA,YACA,cACA,QACA,WACA,QACA,MACA,gBACwC;CAC5C,MAAM,aAAa,QAAQ;CAC3B,MAAM,EAAE,sBAAsB,sBAAsB;CAEpD,MAAM,iBAAiB,SAAS,OAAO,KAAK,KAAA;CAC5C,MAAM,cAAc,SAAS,OAAO,KAAK,KAAA;CAEzC,MAAM,gBAAsD,SAAS,CAAC,OAAO,OAAO,EAAE,GAAG,OAAO,EAAE,IAAI,KAAA;CAGtG,MAAM,cAAc,gBAAgB,OAAO,KAAK,YAAY,EAAE,SAAS,IAAI,eAAe,KAAA;CAE1F,MAAM,CAAC,MAAM,WAAW,SAAsB,CAAC,CAAC;CAEhD,MAAM,CAAC,aAAa,kBAAkB,SAAkB,KAAK;CAC7D,MAAM,CAAC,kBAAkB,uBAAuB,SAA4B;CAC5E,MAAM,CAAC,cAAc,mBAAmB,SAAkB,KAAK;CAC/D,MAAM,CAAC,YAAY,iBAAiB,SAA6B;CAEjE,gBAAgB;EAEZ,eAAe,IAAI;EAEnB,MAAM,mBAAmB,OAAO,QAA2E;GACvG,MAAM,WAAW,IAAI;GACrB,eAAe,KAAK;GACpB,oBAAoB,KAAA,CAAS;GAC7B,QAAQ,SAAS,KAAI,OAAM,EACvB,GAAG,EACP,EAAE,CAAC;GACH,gBAAgB,CAAC,IAAI,KAAK,OAAO;GACjC,cAAc,IAAI,KAAK,KAAK;EAChC;EAEA,MAAM,WAAW,UAAiB;GAC9B,QAAQ,MAAM,SAAS,KAAK;GAC5B,eAAe,KAAK;GACpB,QAAQ,CAAC,CAAC;GACV,oBAAoB,KAAK;GACzB,cAAc,KAAA,CAAS;GAEvB,IAAI,mBAAmB,KAAK,GACxB,kBAAkB,MAAM,OAAO;EAEvC;EAEA,MAAM,WAAW,WAAW,WAAW,IAAI;EAM3C,MAAM,gBAHe,WAAW,cAAc,OAAO,OAAO,WAAW,UAAU,EAAE,MAC9E,MAAM,EAAE,SAAS,cAAc,EAAE,SAAS,WAC/C,IACqC,CAAC,GAAG,IAAI,KAAA;EAE7C,IAAI,SAAS,QACT,OAAO,SAAS,OAAO;GACnB,OAAO;GACP,OAAO;GACP;GACA;GACA,SAAS;GACT;GACA,SAAS;EACb,IAAI,QAAQ,iBAAiB;GAAE,MAAM,IAAI;GACrD,MAAM,IAAI;EAAK,CAAC,GAAG,OAAO;OACX;GACH,SAAS,KAAK;IACV,OAAO;IACP,OAAO;IACP;IACA;IACA,SAAS;IACT;IACA,SAAS;GACb,CAAC,EACI,MAAM,QAAQ,iBAAiB;IAAE,MAAM,IAAI;IAC5D,MAAM,IAAI;GAAK,CAAC,CAAC,EACA,MAAM,OAAO;GAClB,aAAa,CACb;EACJ;CACJ,GAAG;EAAC;EAAM;EAAW;EAAQ;EAAM;EAAa;EAAgB;EAAc;EAAc;EAAY;CAAU,CAAC;CAEnH,OAAO,eAAe;EAClB;EACA;EACA;EACA;EACA;CACJ,IAAI;EAAC;EAAM;EAAa;EAAkB;EAAc;CAAU,CAAC;AAEvE;;;;;;;;;;;;AClKA,IAAa,0BAAgJ,WAAW,qBAAqB;;;;;;;ACN7L,SAAgB,kBAA0C;CACtD,OAAO,WAAW,2BAA2B;AACjD;;;;;;;ACDA,IAAa,yBAAwC;CACjD,OAAO,WAAW,oBAAoB;AAC1C;;;;;;;;;;;;ACIA,IAAa,8BAA8B;CAEvC,MAAM,EACF,iBACA,kBACA,YAAY;CAEhB,MAAM,OAAO,aAAa,UAKpB;EACF,MAAM,EACF,MACA,SACA,qBACA;EACJ,gBAAgB;GACZ,SAAS,MAAM,QAAQ,qBAAC,OAAD;IAAK,WAAW;cAAhB,CACnB,oBAAC,UAAD,EAAA,UAAS,MAAM,MAAc,CAAA,GAC5B,OACA;QAAI;GACT,SAAS;GACT;EACJ,CAAC;CACL,GAAG,CAAC,CAAC;CAEL,MAAM,QAAQ,kBAAkB;EAC5B,cAAc;CAClB,GAAG,CAAC,CAAC;CAEL,OAAO,eAAe;EAClB;EACA;CACJ,IAAI,CAAC,MAAM,KAAK,CAAC;AAErB;;;;;;;;;ACzCA,IAAa,wCAAkF,WAAW,mCAAmC;;;;;;;;;;;;ACI7I,IAAa,6BAAgD,WAAW,wBAAwB;;;;;;;;;;;;ACDhG,IAAa,mCAA4D,WAAW,8BAA8B;;;;;;ACNlH,IAAa,+BAAoD,WAAW,gBAAgB;;;;;;;;;ACE5F,IAAa,mCAAmC,WAAW,8BAA8B;;;ACNzF,IAAa,uBAAuB,MAAM,cAAyC,KAAA,CAAS;;;;;;;;;;;;ACwB5F,IAAa,yBAAoK;CAE7K,MAAM,SAAS,gBAAqB;CAEpC,MAAM,iBAAiB,kBAA4C;CAInE,MAAM,aAAa,QAAQ;CAC3B,MAAM,OAAO,MAAM,cAAc,cAAc,UAAU,GAAG,CAAC,UAAU,CAAC;CACxE,MAAM,gBAAgB,iBAAiB;CACvC,MAAM,qBAAqB,sBAAsB;CACjD,MAAM,wBAAwB,gCAAgC;CAC9D,MAAM,oBAAoB,qBAAqB;CAC/C,MAAM,0BAA0B,2BAA2B;CAC3D,MAAM,sBAAsB,uBAAuB;CACnD,MAAM,0BAA0B,2BAA2B;CAI3D,MAAM,gBAAgB,WAAW,oBAAoB;CAErD,MAAM,mBAAmB,MAAM,OAAgD;EAC3E;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACQ;CACZ,CAAC;CAED,MAAM,gBAAgB;EAClB,iBAAiB,UAAU;GACvB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACQ;EACZ;CACJ,GAAG;EAAC;EAAgB;EAAM;EAAe;EAAoB;EACzD;EAAmB;EAAyB;EAC5C;EAAyB;EAAe;CAAM,CAAC;CAEnD,OAAO,iBAAiB;AAC5B;;;ACxDA,IAAM,QAAiD,CAAC;;;;;;;;AASxD,SAAgB,mBAAkD,MAAc,UAA6B;CACzG,KAAK,MAAM,UAAU,UACjB,MAAM,GAAG,KAAK,GAAG,OAAO,QAAQ;AAExC;;;;;AAMA,SAAgB,kBAAwB;CACpC,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GAC/B,OAAO,MAAM;AAErB;;;;;;;;;;AAYA,SAAgB,SACZ,EACI,MACA,UACA,YACA,YACA,WAAW,SACyB;CAExC,MAAM,aAAa,QAAQ;CAEU,iBAAiB;CAKtD,MAAM,WAAW,WAAW,GAAG,KAAK,GAAG,aAAa,KAAA;CACpD,MAAM,eAAe,WAAW,MAAM,YAAqC,KAAA;CAE3E,MAAM,CAAC,QAAQ,aAAa,SAAgC,YAAY;CACxE,MAAM,CAAC,aAAa,kBAAkB,SAAkB,CAAC,YAAY;CACrE,MAAM,CAAC,kBAAkB,uBAAuB,SAA4B;CAE5E,gBAAgB;EAGZ,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,aAClB,eAAe,IAAI;EAGvB,MAAM,iBAAiB,OAAO,kBAAqC;GAC/D,MAAM,GAAG,KAAK,GAAG,cAAc,iBAAiB,KAAA;GAChD,UAAU,iBAAiB,KAAA,CAAS;GACpC,eAAe,KAAK;GACpB,oBAAoB,KAAA,CAAS;EACjC;EAEA,MAAM,WAAW,UAAiB;GAC9B,QAAQ,MAAM,yBAAyB,KAAK;GAC5C,eAAe,KAAK;GACpB,UAAU,KAAA,CAAS;GACnB,oBAAoB,KAAK;EAC7B;EAEA,IAAI,YAAY,YAAY,MAAM,GAAG,KAAK,GAAG,aAAa;GACtD,UAAU,MAAM,GAAG,KAAK,GAAG,WAAW;GACtC,eAAe,KAAK;GACpB,oBAAoB,KAAA,CAAS;GAE7B,aAAa,CACb;EACJ,OAAO,IAAI,YAAY,QAAQ,YAAY;GACvC,MAAM,WAAW,WAAW,WAAW,IAAI;GAE3C,IAAI,SAAS,YACT,OAAO,SAAS,WAAW,WAAW,WAAW,eAAe,MAA+B,GAAG,OAAO;QACtG;IACH,SAAS,SAAS,QAAQ,EACrB,MAAM,WAAW,eAAe,MAA+B,CAAC,EAChE,MAAM,OAAO;IAClB,aAAa,CACb;GACJ;EACJ,OAEK;GACD,eAAe,KAAA,CAAS;GACxB,aAAa,CACb;EACJ;CACJ,GAAG;EAAC;EAAU;EAAM;EAAY;EAAY;EAAU;CAAU,CAAC;CAEjE,OAAO,eAAe;EAClB;EACA;EACA;CACJ,IAAI;EAAC;EAAQ;EAAa;CAAgB,CAAC;AAE/C;;;ACtFA,IAAM,sBAAoB;;;;AAK1B,SAAgB,oBACZ,EACI,MACA,YACA,aACA,WAAW,qBACX,oBACA,0BACA,uBAEsB;CAE1B,MAAM,aAAa,QAAQ;CAE3B,MAAM,CAAC,OAAO,YAAY,SAAyB,CAAC,CAAC;CACrD,MAAM,CAAC,WAAW,gBAAgB,SAAS,KAAK;CAChD,MAAM,eAAe,OAAO,KAAK;CACjC,MAAM,CAAC,OAAO,YAAY,SAA4B;CACtD,MAAM,CAAC,SAAS,cAAc,SAAS,IAAI;CAC3C,MAAM,CAAC,eAAe,oBAAoB,SAAiB,EAAE;CAC7D,MAAM,CAAC,OAAO,YAAY,SAAiB,QAAQ;CAEnD,MAAM,iBAAiB,OAA4B,IAAI;CACvD,MAAM,mBAAmB,OAA8B,IAAI;CAE3D,MAAM,aAAa,aAAa,YAAqB;EACjD,aAAa,UAAU;EACvB,aAAa,OAAO;CACxB,GAAG,CAAC,CAAC;CAGL,MAAM,uBAAuB,aAAa,QAAmB,aAA4C;EACrG,IAAI;EACJ,IAAI;EAEJ,IAAI,oBACA,QAAQ,mBAAmB,MAAM;OAC9B;GAEH,MAAM,mBAAmB;IAAC;IAAQ;IAAS;IAAS;GAAa;GACjE,IAAI;GAEJ,IAAI,OAAO,QACP,YAAY,iBAAiB,MAAK,SAAQ,OAAO,OAAO,SAAS,QAAQ,OAAO,OAAO,UAAU,EAAE;GAGvG,IAAI,aAAa,OAAO,OAAO,YAC3B,QAAQ,OAAO,OAAO,OAAO,UAAU;QAGvC,QAAQ,OAAO,OAAO,EAAE;EAEhC;EAEA,IAAI,0BACA,cAAc,yBAAyB,MAAM;OAC1C,IAAI,uBAAuB,OAAO,UAAU,OAAO,OAAO,sBAC7D,cAAc,OAAO,OAAO,OAAO,oBAAoB;EAG3D,OAAO;GACH,IAAI,OAAO;GACX;GACA;GACA,MAAM;GACN,UAAU,WAAW,WAAW,IAAI,eAAe,OAAO,IAAI,IAAI;EACtE;CACJ,GAAG;EAAC;EAAoB;EAA0B;CAAmB,CAAC;CAGtE,MAAM,sBAAsB,kBAAkB;EAC1C,IAAI,eAAe,SAAS;GACxB,eAAe,QAAQ;GACvB,eAAe,UAAU;EAC7B;CACJ,GAAG,CAAC,CAAC;CAEL,MAAM,YAAY,kBAAkB;EAChC,oBAAoB;EACpB,SAAS,KAAA,CAAS;EAClB,WAAW,IAAI;EAGf,MAAM,cAAc,eAAe,OAAO,KAAK,WAAW,EAAE,SAAS,IAAI,cAAc,KAAA;EAEvF,MAAM,oBAAoB,QAA2D;GAEjF,SADiB,IAAI,KAAK,KAAK,MAAM,qBAAqB,CAAC,CAClD,CAAQ;GACjB,WAAW,IAAI,KAAK,OAAO;GAC3B,WAAW,KAAK;EACpB;EAEA,MAAM,iBAAiB,eAAsB;GACzC,QAAQ,MAAM,6CAA6C,UAAU;GACrE,SAAS,UAAU;GACnB,WAAW,KAAK;EACpB;EAEA,MAAM,WAAW,WAAW,WAAW,IAAI;EAE3C,IAAI;EAEJ,IAAI,SAAS,QACT,cAAc,SAAS,OAAO;GAC1B,OAAO;GACA;GACP,SAAS,KAAA;GACT,cAAc;EAClB,IAAI,QAAQ,iBAAiB;GAAE,MAAM,IAAI;GACrD,MAAM,IAAI;EAAK,CAAC,GAAG,aAAa;OACjB;GACH,SAAS,KAAK;IACV,OAAO;IACA;IACP,QAAQ;IACR,SAAS,KAAA;IACT,cAAc;GAClB,CAAC,EACI,MAAM,QAAQ,iBAAiB;IAAE,MAAM,IAAI;IAC5D,MAAM,IAAI;GAAK,CAAC,CAAC,EACA,MAAM,aAAa;GACxB,oBAAoB,CAAC;EACzB;EAEA,eAAe,UAAU,eAAe;CAC5C,GAAG;EAAC;EAAY;EAAM;EAAa;EAAO;EAAe;EAAsB;EAAqB;CAAU,CAAC;CAG/G,MAAM,SAAS,aAAa,iBAAyB;EAEjD,IAAI,iBAAiB,SACjB,aAAa,iBAAiB,OAAO;EAIzC,iBAAiB,UAAU,iBAAiB;GACxC,SAAS,QAAQ;GACjB,iBAAiB,YAAY;EACjC,GAAG,aAAa,KAAK,IAAI,MAAM,CAAC;CACpC,GAAG,CAAC,QAAQ,CAAC;CAGb,MAAM,WAAW,kBAAkB;EAC/B,IAAI,CAAC,aAAa,WAAW,WAAW,MAAM,SAAS,GAAG;GACtD,WAAW,IAAI;GACf,UAAS,SAAQ,OAAO,QAAQ;EACpC;CACJ,GAAG;EAAC;EAAS,MAAM;EAAQ;EAAU;CAAU,CAAC;CAGhD,gBAAgB;EACZ,UAAU;EAEV,aAAa;GACT,oBAAoB;EACxB;CACJ,GAAG,CAAC,SAAS,CAAC;CAEd,gBAAgB;EACZ,aAAa;GACT,IAAI,iBAAiB,SACjB,aAAa,iBAAiB,OAAO;EAE7C;CACJ,GAAG,CAAC,CAAC;CAEL,OAAO,eAAe;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;CACJ,IAAI;EAAC;EAAO;EAAW;EAAO;EAAQ;EAAU;EAAS;CAAoB,CAAC;AAClF;;;;;;;;;;;;;;;;;;;;;;ACpMA,eAAsB,wBAA2D,EAC7E,YACA,MACA,UACA,QACA,gBACA,QACA,MACA,SACA,WACA,kBAMkB;CAElB,IAAI,WAAW,SAAS,WAAW,UAAU,CAAC,UAC1C,MAAM,IAAI,MAAM,8DAA8D;CAGlF,MAAM,WAAW,KAAK,WAAW,IAAI;CAErC,IAAI;CACJ,IAAI,WAAW,SAAS,WAAW,QAC/B,cAAc,SAAS,OAAO,QAAQ,QAAQ;MAE9C,cAAc,SAAS,OAAO,UAAW,MAAM;CAGnD,OAAO,YAAY,MAAM,WAAW;EAChC,IAAI,WACA,UAAU,MAAM;EACpB,OAAO;CACX,CAAC,EAAE,OAAO,MAAM;EACZ,IAAI,gBAAgB,eAAe,CAAC;EACpC,MAAM;CACV,CAAC;AACL;;;;;;;;;;;;;;;;;;AC9CA,eAAsB,0BAA4E,EAC9F,MACA,QACA,YACA,WACA,iBACA,iBACA,WAMgB;CAEhB,QAAQ,MAAM,mBAAmB,OAAO,MAAM,OAAO,EAAE;CAEvD,OAAO,KAAK,WAAW,OAAO,IAAI,EAAE,OAAO,OAAO,EAAE,EAAE,WAAW;EAC7D,IAAI,iBAAiB,gBAAgB,MAAM;EAC3C,OAAO;CACX,CAAC,EAAE,OAAO,MAAM;EACZ,IAAI,iBAAiB,gBAAgB,QAAQ,CAAC;EAC9C,OAAO;CACX,CAAC;AACL;;;;;;;;;;AC3CA,SAAgB,wBACZ,MACA,MAIF;CACE,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,KAAK;CAE9D,MAAM,UAAU,YACX,EAAE,iBAAiB,mBAChB,QAAQ,gBAAgB,aAAa,aAAa,QAC1D;CAEA,gBAAgB;EACZ,IAAI,CAAC,MAAM;EAEX,MAAM,sBAAsB,MAAyB;GACjD,EAAE,eAAe;GACjB,EAAE,cAAc;EACpB;EAEA,OAAO,iBAAiB,gBAAgB,kBAAkB;EAC1D,aAAa,OAAO,oBAAoB,gBAAgB,kBAAkB;CAC9E,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,WAAW,kBAAkB;EAC/B,KAAK;EACL,IAAI,QAAQ,UAAU,WAClB,QAAQ,QAAQ;EAEpB,oBAAoB,KAAK;CAC7B,GAAG,CAAC,SAAS,IAAI,CAAC;CAElB,MAAM,eAAe,kBAAkB;EACnC,IAAI,QAAQ,UAAU,WAClB,QAAQ,MAAM;EAElB,oBAAoB,KAAK;CAC7B,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,gBAAgB,kBAAkB,oBAAoB,IAAI,GAAG,CAAC,CAAC;CAErE,OAAO,eAAe;EAClB,aAAa;GACT,MAAM,oBAAoB,QAAQ,UAAU;GAC5C;GACA;GACA,MAAM;EACV;EACA;CACJ,IAAI;EAAC;EAAkB,QAAQ;EAAO;EAAU;EAAc;CAAa,CAAC;AAChF;;;AC5DA,SAAgB,oBAAoB,YAAyC;CAGzE,MAAM,iBAAiB,YAAY,WAAW;CAC9C,MAAM,CAAC,MAAM,WAAW,SAAsB,gBAAgB,QAAQ,IAAI;CAE1E,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,CAAC,cAAc;CACpE,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CACpD,MAAM,CAAC,WAAW,gBAAgB,SAAgB;CAClD,MAAM,CAAC,cAAc,mBAAmB,SAAS,KAAK;CACtD,MAAM,CAAC,OAAO,YAAY,SAAc;CAExC,gBAAgB;EACZ,IAAI,CAAC,YAAY;EAEjB,IAAI,CAAC,gBAAgB;GACjB,kBAAkB,IAAI;GACtB,WAAW,QAAQ,EACd,MAAK,SAAQ;IACV,IAAI,MACA,QAAQ,IAAI;GAEpB,CAAC,EACA,OAAM,MAAK,CAEZ,CAAC,EACA,cAAc;IACX,kBAAkB,KAAK;GAC3B,CAAC;EACT;CACJ,GAAG,CAAC,YAAY,cAAc,CAAC;CAE/B,gBAAgB;EACZ,IAAI,CAAC,YAAY;EAQjB,OAPoB,WAAW,mBAAmB,OAAO,YAAY;GACjE,IAAI,UAAU,eAAe,UAAU,kBAAkB,UAAU,mBAC/D,QAAQ,SAAS,QAAQ,IAAI;QAC1B,IAAI,UAAU,cACjB,QAAQ,IAAI;EAEpB,CACO;CACX,GAAG,CAAC,UAAU,CAAC;CAEf,MAAM,UAAU,YAAY,YAAY;EACpC,IAAI,CAAC,YAAY;EACjB,eAAe,IAAI;EACnB,IAAI;GACA,MAAM,WAAW,QAAQ;EAC7B,UAAU;GACN,eAAe,KAAK;EACxB;CACJ,GAAG,CAAC,UAAU,CAAC;CAEf,MAAM,eAAe,YAAY,YAAY;EACzC,IAAI,CAAC,YAAY,OAAO;EACxB,MAAM,UAAU,WAAW,WAAW;EACtC,IAAI,CAAC,SAAS,OAAO;EACrB,IAAI,QAAQ,YAAY,KAAK,IAAI,GAC7B,IAAI;GAEA,QAAO,MADiB,WAAW,eAAe,GACjC;EACrB,SAAS,GAAG;GACR,OAAO;EACX;EAEJ,OAAO,QAAQ;CACnB,GAAG,CAAC,UAAU,CAAC;CAEf,OAAO,eAAe;EAClB;EACA,gBAAgB,aAAa,iBAAiB;EAC9C;EACA;EACA;EACA;EACA;EACA;EACA;CACJ,IAAsB;EAClB;EAAM;EAAgB;EAAa;EAAS;EAC5C;EAAc;EAAc;EAAO;EAAU;CACjD,CAAC;AACL;;;;;;;;;;;;;AChEA,IAAa,+BAA+B,WAAW,0BAA0B;;;;;;;ACfjF,SAAgB,8BAAmD;CAG/D,MAAM,CAAC,MAAM,WAAW,UADN,OAAO,WAAW,cAAc,aAAa,QAAQ,mBAAmB,IAAgD,SACzD,SAAS;CAE1F,MAAM,kBAAkB,aAAa,YAA+C;EAChF,IAAI,OAAO,WAAW,aAClB,aAAa,QAAQ,qBAAqB,OAAO;EAErD,QAAQ,OAAO;CACnB,GAAG,CAAC,CAAC;CAEL,OAAO,eAAe;EAClB;EACA,SAAS;CACb,IAAI,CAAC,MAAM,eAAe,CAAC;AAC/B;;;;;;;;;ACbA,SAAgB,kCAA2D;CAGvE,MAAM,CAAC,eAAe,oBAAoB,UADxB,OAAO,WAAW,cAAc,aAAa,QAAQ,uBAAuB,IAAI,SACnB,IAAI;CAEnF,MAAM,kBAAkB,aAAa,YAA2B;EAC5D,IAAI,OAAO,WAAW,aAClB,IAAI,SACA,aAAa,QAAQ,yBAAyB,OAAO;OAErD,aAAa,WAAW,uBAAuB;EAGvD,iBAAiB,OAAO;CAC5B,GAAG,CAAC,CAAC;CAEL,OAAO,eAAe;EAClB;EACA,kBAAkB;CACtB,IAAI,CAAC,eAAe,eAAe,CAAC;AACxC;;;;;;;;;;;;;ACRA,IAAa,0BAA0B,WAAW,qBAAqB;;;ACgDvE,IAAa,gBACT,YACyB;CACzB,MAAM,EAAE,WAAW,SAAS,sBAAsB,OAAO,mBACzD,WAAW,CAAC;CACZ,MAAM,MAAM,OAAY,IAAI;CAC5B,MAAM,CAAC,WAAW,gBAAgB,SAAS,KAAK;CAChD,MAAM,CAAC,WAAW,gBAAgB,SAAS,EAAE;CAE7C,gBAAgB;EACZ,IAAI,gBAAgB,iBAAiB,aAAa,KAAK,GAAG,cAAc;CAC5E,GAAG,CAAC,SAAS,CAAC;CAEd,MAAM,cAAc,kBAAkB,UAAU,cAAc,KAAA,GAAW,CAAC,CAAC;CAE3E,MAAM,cAAc,aAAa,UAAkB;EAC/C,IAAI,SAAS,QAAQ,KAAK;OACrB,MAAM,IAAI,MAAM,KAAK;CAC9B,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,gBAAgB,aAAa,SAAiB;EAChD,IAAI,WAAW,UAAU,IAAI;EAC7B,aAAa,IAAI;EACjB,aAAa,IAAI;CACrB,GAAG,CAAC,SAAS,CAAC;CAEd,MAAM,kBAAkB,aAAa,SAAiB;EAClD,UAAU,UACL,UAAU,IAAI,EACd,WAAW,cAAc,IAAI,CAAC,EAC9B,OAAO,QAAQ;GACZ,YAAY,GAAG;GACf,aAAa,KAAK;EACtB,CAAC;CACT,GAAG,CAAC,aAAa,aAAa,CAAC;CAE/B,MAAM,iBAAiB,kBAAkB;EACrC,IAAI,YAAY,GACZ,UAAU,UAAU,UAAU,EAAE;CAExC,GAAG,CAAC,WAAW,CAAC;CAEhB,MAAM,SAAS,aACV,YAAY,QAAQ,SAAkB;EACnC,MAAM,UAAU,IAAI;EAEpB,MAAM,UACF,YACC,QAAQ,YAAY,WAAW,QAAQ,YAAY;EAExD,MAAM,QAAQ,IAAI;EAElB,IAAI,YAAY,KAAK,CAAC,qBAClB,IAAI,MACA,gBAAgB,IAAI;OACjB,IAAI,SACP,IAAI,SAAS;GACT,gBAAgB,MAAM,KAAK;GAE3B,IAAI,cAAc,OACd,MAAM,QAAQ;EAEtB,OACI,gBAAgB,QAAQ,SAAS;OAGrC,YAAY,oCAAoC;CAG5D,GACA;EAAC;EAAqB;EAAiB;CAAW,CACtD;CAEA,MAAM,OAAO,aAAa,SACtB,OAAO,QAAQ,OAAO,SAAS,WAAW,KAAA,IAAY,IAAI,GAAG,CAAC,MAAM,CAAC;CAEzE,MAAM,MAAM,kBAAkB,OAAO,KAAK,GAAG,CAAC,MAAM,CAAC;CAErD,OAAO,eAAe;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;CACJ,IAAI;EAAC;EAAW;EAAW;EAAgB;EAAa;EAAM;CAAG,CAAC;AACtE;;;ACzJA,IAAM,cAAc;CAChB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;CACP,OAAO;AACX;AAGA,IAAI,sBAAsB,iBAAiB,IAAI;AAC/C,IAAM,YAA8B,CAAC;AAGrC,IAAM,wBAAwB;CAC1B,UAAU,SAAQ,aAAY,SAAS,mBAAmB,CAAC;AAC/D;AAGA,IAAI,OAAO,WAAW,aAClB,OAAO,iBAAiB,gBAAgB;CACpC,MAAM,mBAAmB,iBAAiB,IAAI;CAC9C,IAAI,qBAAqB,qBAAqB;EAC1C,sBAAsB;EACtB,gBAAgB;CACpB;AACJ,CAAC;AAEL,IAAa,uBAAuB;CAChC,MAAM,CAAC,eAAe,oBAAoB,SAAS,mBAAmB;CAEtE,gBAAgB;EAEZ,MAAM,YAA4B,qBAAqB;GACnD,iBAAiB,gBAAgB;EACrC;EAGA,UAAU,KAAK,QAAQ;EAGvB,iBAAiB,mBAAmB;EAGpC,aAAa;GACT,MAAM,QAAQ,UAAU,QAAQ,QAAQ;GACxC,IAAI,QAAQ,IACR,UAAU,OAAO,OAAO,CAAC;EAEjC;CACJ,GAAG,CAAC,CAAC;CAEL,OAAO;AACX;AAEA,SAAS,iBAAiB,aAA+D,MAAe;CACpG,IAAI,OAAO,WAAW,aAClB,OAAO;CACX,OAAO,OAAO,WAAW,eAAe,YAAY,cAAc,EAAE,IAAI,EAAE;AAC9E;;;AC9DA,IAAM,qBAAqB;;;;;;;;;;;;;AAc3B,SAAgB,mBACZ,YACA,YAAY,WACZ,UACF;CACE,MAAM,aAAa,GAAG,mBAAmB,GAAG;CAG5C,MAAM,CAAC,iBAAiB,sBAAsB,eAAwC;EAClF,IAAI;GACA,MAAM,SAAS,aAAa,QAAQ,UAAU;GAC9C,OAAO,SAAS,KAAK,MAAM,MAAM,IAAI,CAAC;EAC1C,QAAQ;GACJ,OAAO,CAAC;EACZ;CACJ,CAAC;CAGD,gBAAgB;EACZ,IAAI;GACA,aAAa,QAAQ,YAAY,KAAK,UAAU,eAAe,CAAC;EACpE,QAAQ,CAER;CACJ,GAAG,CAAC,iBAAiB,UAAU,CAAC;CAGhC,gBAAgB;EAEZ,IAAI,WAAW,WAAW,GAAG;EAE7B,MAAM,oBAAoB,IAAI,IAAI,UAAU;EAE5C,oBAAmB,SAAQ;GACvB,MAAM,UAAU,OAAO,YACnB,OAAO,QAAQ,IAAI,EAAE,QAAQ,CAAC,eAAe,kBAAkB,IAAI,SAAS,CAAC,CACjF;GAGA,MAAM,WAAW,OAAO,KAAK,IAAI;GACjC,MAAM,cAAc,OAAO,KAAK,OAAO;GAEvC,IAAI,SAAS,WAAW,YAAY,UAAU,SAAS,OAAM,QAAO,YAAY,SAAS,GAAG,CAAC,GACzF,OAAO;GAGX,OAAO;EACX,CAAC;CACL,GAAG,CAAC,UAAU,CAAC;CAEf,MAAM,mBAAmB,aAAa,SAAiB;EAEnD,IAAI,QAAQ,iBACR,OAAO,gBAAgB;EAG3B,OAAO,WAAW,SAAS;CAC/B,GAAG,CAAC,iBAAiB,QAAQ,CAAC;CAE9B,MAAM,uBAAuB,aAAa,SAAiB;EACvD,oBAAmB,SAAQ;GAEvB,MAAM,qBAAqB,QAAQ,OAC7B,KAAK,QACJ,WAAW,SAAS;GAC3B,OAAO;IAAE,GAAG;KACvB,OAAO,CAAC;GAAmB;EACpB,CAAC;CACL,GAAG,CAAC,QAAQ,CAAC;CAEb,OAAO,eAAe;EAClB;EACA;CACJ,IAAI,CAAC,kBAAkB,oBAAoB,CAAC;AAChD;;;;;AAMA,SAAgB,uBACZ,UACA,WACuB;CACvB,IAAI,CAAC,UAAU,OAAO,CAAC;CACvB,MAAM,SAAkC,CAAC;CACzC,KAAK,MAAM,WAAW,UAAU;EAC5B,MAAM,MAAM,QAAQ;EACpB,IAAI,QAAQ,KAAA,GAAW;EACvB,IAAI,OAAO,QAAQ,WACf,OAAO,QAAQ,QAAQ;OACpB;GACH,MAAM,KAAK,IAAI;GACf,IAAI,OAAO,KAAA,GACP,OAAO,QAAQ,QAAQ;EAE/B;CACJ;CACA,OAAO;AACX;;;ACjHA,IAAM,aAAa;;;;;;AAOnB,SAAgB,uBAAuB,MAAc,MAAe;CAChE,gBAAgB;EACZ,IAAI,UAAU;GACV,SAAS,QAAQ,GAAG,KAAK;GACzB,IAAI,OAAO,SAAS,cAAc,mBAAmB;GACrD,IAAI,CAAC,MAAM;IACP,OAAO,SAAS,cAAc,MAAM;IACpC,KAAK,MAAM;IACX,SAAS,qBAAqB,MAAM,EAAE,GAAG,YAAY,IAAI;GAC7D;GACA,KAAK,OAAO,QAAQ;EACxB;CACJ,GAAG,CAAC,MAAM,IAAI,CAAC;AACnB;;;;;;;;;;;;;;;;;;ACDA,SAAgB,QACZ,MACA,OACiB;CACjB,MAAM,EAAE,kBAAkB,2BAA2B;CAErD,MAAM,WAAW,MAAM,OAAO,KAAK;CACnC,MAAM,eAAe;CACrB,MAAM,YAAY,SAAS;CAE3B,IAAI,UAAU;CACd,IAAI,iBAAiB,WAAW;EAC5B,MAAM,OAAO,OAAO,KAAK,YAAY;EACrC,MAAM,WAAW,OAAO,KAAK,SAAS;EACtC,IAAI,KAAK,WAAW,SAAS,QACzB,UAAU;OAEV,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC7B,IAAI,aAAa,KAAK,QAAQ,UAAU,KAAK,KAAK;GAC9C,UAAU;GACV;EACJ;CAGZ;CAEA,IAAI,SACA,SAAS,UAAU;CAGvB,MAAM,cAAc,SAAS;CAE7B,OAAO,cAAc;EACjB,OAAO,cACF,QAAO,MAAK,EAAE,SAAS,IAAI,EAC3B,MAAM,GAAG,OAAO,EAAE,SAAS,OAAO,EAAE,SAAS,GAAG,EAChD,KAAK,GAAG,MACL,oBAAC,eAAD,EAAA,UACI,oBAAC,EAAE,WAAH;GAAa,GAAK;GAAoD,GAAK,EAAE,SAAS,CAAC;EAAI,CAAA,EAChF,GAFK,GAAG,KAAK,GAAG,GAEhB,CAClB;CACT,GAAG;EAAC;EAAe;EAAM;CAAW,CAAC;AACzC;;;AC1DA,SAAgB,wCAAsE;CAElF,MAAM,cAAc,OAAgD,CAAC,CAAC;CAEtE,MAAM,2BAA2B,aAAa,eAAuB;EACjE,MAAM,OAAO,aAAa,QAAQ,UAAU;EAC5C,OAAO,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC;CACtC,GAAG,CAAC,CAAC;CAEL,MAAM,sBAAsB,aAA4C,SAA6C;EACjH,MAAM,aAAa,sBAAsB,oBAAoB,IAAI;EACjE,IAAI,YAAY,QAAQ,aACpB,OAAO,YAAY,QAAQ;EAE/B,OAAO,yBAAyB,UAAU;CAC9C,GAAG,CAAC,wBAAwB,CAAC;CAE7B,MAAM,uBAAuB,aAA4C,MAAc,SAAqC;EACxH,MAAM,aAAa,sBAAsB,oBAAoB,IAAI;EACjE,aAAa,QAAQ,YAAY,KAAK,UAAU,IAAI,CAAC;EACrD,MAAM,eAAe,YAAY,QAAQ;EACzC,MAAM,YAAY,UAAU,gBAAgB,yBAAyB,IAAI,GAAG,IAAI;EAChF,YAAY,QAAQ,cAAc,UAAU,YAAY,QAAQ,aAAa,SAAS;CAC1F,GAAG,CAAC,wBAAwB,CAAC;CAE7B,MAAM,CAAC,sBAAsB,4BAA4B,SAAmB,CAAC,CAAC;CAC9E,MAAM,CAAC,gBAAgB,sBAAsB,SAAmB,CAAC,CAAC;CAClE,MAAM,CAAC,iBAAiB,uBAAuB,SAAmB,CAAC,CAAC;CAEpE,gBAAgB;EACZ,yBAAyB,aAAa,QAAQ,wBAAwB,IAAI,KAAK,MAAM,aAAa,QAAQ,wBAAwB,CAAE,IAAI,CAAC,CAAC;EAC1I,mBAAmB,aAAa,QAAQ,iBAAiB,IAAI,KAAK,MAAM,aAAa,QAAQ,iBAAiB,CAAE,IAAI,CAAC,CAAC;EACtH,oBAAoB,aAAa,QAAQ,kBAAkB,IAAI,KAAK,MAAM,aAAa,QAAQ,kBAAkB,CAAE,IAAI,CAAC,CAAC;CAC7H,GAAG,CAAC,CAAC;CAEL,MAAM,0BAA0B,aAAa,UAAoB;EAC7D,aAAa,QAAQ,0BAA0B,KAAK,UAAU,KAAK,CAAC;EACpE,yBAAyB,KAAK;CAClC,GAAG,CAAC,CAAC;CAEL,MAAM,oBAAoB,aAAa,UAAoB;EACvD,aAAa,QAAQ,mBAAmB,KAAK,UAAU,KAAK,CAAC;EAC7D,mBAAmB,KAAK;CAC5B,GAAG,CAAC,CAAC;CAEL,MAAM,qBAAqB,aAAa,UAAoB;EACxD,aAAa,QAAQ,oBAAoB,KAAK,UAAU,KAAK,CAAC;EAC9D,oBAAoB,KAAK;CAC7B,GAAG,CAAC,CAAC;CAEL,OAAO,eAAe;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ,IAAI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ,CAAC;AACL;;;;;;;AClEA,SAAgB,yBAAyC;CAErD,MAAM,uBAAuB,kBAA2B;EACpD,IAAI,OAAO,WAAW,aAClB,OAAO;EAEX,OADuB,OAAO,WAAW,8BAClC,EAAe;CAC1B,GAAG,CAAC,CAAC;CAEL,MAAM,CAAC,MAAM,WAAW,eAAiC;EAKrD,QAJ+B,OAAO,WAAW,eAAe,aAAa,QAAQ,mBAAmB,KAAK,OACvG,aAAa,QAAQ,mBAAmB,MAAM,SAC9C,SAC4C,qBAAqB,IAC9C,SAAS;CACtC,CAAC;CAED,gBAAgB;EACZ,MAAM,aAAa,OAAO,WAAW,8BAA8B;EACnE,MAAM,gBAAgB,MAA2B;GAC7C,IAAI,aAAa,QAAQ,mBAAmB,KAAK,MAAM;IACnD,QAAQ,EAAE,UAAU,SAAS,OAAO;IACpC,gBAAgB,EAAE,UAAU,SAAS,OAAO;GAChD;EACJ;EAGA,gBAAgB,IAAI;EAEpB,WAAW,iBAAiB,UAAU,YAAY;EAClD,aAAa,WAAW,oBAAoB,UAAU,YAAY;CACtE,GAAG,CAAC,CAAC;CAEL,MAAM,mBAAmB,SAA2B;EAChD,IAAI,SAAS,QACT,SAAS,gBAAgB,UAAU,IAAI,MAAM;OAE7C,SAAS,gBAAgB,UAAU,OAAO,MAAM;CAExD;CAEA,MAAM,kBAAkB,aAAa,SAAsC;EACvE,IAAI,SAAS,SAAS;GAClB,gBAAgB,OAAO;GACvB,aAAa,QAAQ,qBAAqB,OAAO;GACjD,QAAQ,OAAO;EACnB,OAAO,IAAI,SAAS,QAAQ;GACxB,gBAAgB,MAAM;GACtB,aAAa,QAAQ,qBAAqB,MAAM;GAChD,QAAQ,MAAM;EAClB,OAAO;GACH,MAAM,gBAAgB,qBAAqB,IAAI,SAAS;GACxD,gBAAgB,aAAa;GAC7B,aAAa,WAAW,mBAAmB;GAC3C,QAAQ,aAAa;EACzB;CACJ,GAAG,CAAC,oBAAoB,CAAC;CAEzB,OAAO,eAAe;EAClB;EACA,SAAS;CACb,IAAI,CAAC,MAAM,eAAe,CAAC;AAC/B;;;AC1CA,IAAM,0BAA0B,cAA4C,KAAA,CAAS;AACrF,IAAM,uBAAuB,cAA6B;CACtD,WAAW;CACX,cAAc;CACd,YAAY;AAChB,CAAC;AAED,SAAgB,uBAAuB,EAAE,YAA2C;CAChF,MAAM,CAAC,WAAW,gBAAgB,SAAmC,IAAI;CACzE,MAAM,CAAC,cAAc,mBAAmB,SAAoC,IAAI;CAChF,MAAM,CAAC,YAAY,iBAAiB,SAAkC,IAAI;CAG1E,MAAM,WAAW,eAAiC;EAC9C,cAAc,WAA8B,aAAa,MAAM;EAC/D,qBAAqB,aAAa,IAAI;EACtC,iBAAiB,WAA+B,gBAAgB,MAAM;EACtE,wBAAwB,gBAAgB,IAAI;EAC5C,eAAe,WAA6B,cAAc,MAAM;EAChE,sBAAsB,cAAc,IAAI;CAC5C,IAAI,CAAC,CAAC;CAEN,MAAM,QAAQ,eAA8B;EACxC;EACR;EACA;CACI,IAAI;EAAC;EAAW;EAAc;CAAU,CAAC;CAEzC,OACI,oBAAC,wBAAwB,UAAzB;EAAkC,OAAO;YACrC,oBAAC,qBAAqB,UAAtB;GAA+B,OAAO;GACjC;EAC0B,CAAA;CACD,CAAA;AAE1C;;;;;AAMA,SAAgB,oBAA8C;CAC1D,MAAM,WAAW,WAAW,uBAAuB;CACnD,MAAM,QAAQ,WAAW,oBAAoB;CAC7C,IAAI,CAAC,UACD,MAAM,IAAI,MAAM,8DAA8D;CAElF,OAAO,eAAe;EAAE,GAAG;EAC/B,GAAG;CAAS,IAAI,CAAC,OAAO,QAAQ,CAAC;AACjC;;;;;;AAOA,SAAgB,4BAA8C;CAC1D,MAAM,WAAW,WAAW,uBAAuB;CACnD,IAAI,CAAC,UACD,MAAM,IAAI,MAAM,sEAAsE;CAE1F,OAAO;AACX;;;;;;;;;;;;;;;;;;;;;ACnDA,SAAgB,wBAAwB,EACpC,QACA,gBACyC;CAEzC,MAAM,kBAAkB,GAAG,OAAO;CAGlC,MAAM,YAAY,8BAAc,IAAI,IAA4B,GAAG,CAAC,CAAC;;;;CAKrE,MAAM,gBAAgB,YAAY,OAC9B,KACA,UAAuB,CAAC,MACJ;EACpB,MAAM,QAAQ,MAAM,aAAa;EACjC,OAAO,MAAM,KAAK;GACd,GAAG;GACH,SAAS;IACL,GAAG,QAAQ;IACX,iBAAiB,UAAU;GAC/B;EACJ,CAAC;CACL,GAAG,CAAC,YAAY,CAAC;;;;CAKjB,MAAM,YAAY,YAAY,OAAO,EACjC,MACA,KACA,UACA,aAC8C;EAC9C,MAAM,WAAW,IAAI,SAAS;EAC9B,SAAS,OAAO,QAAQ,IAAI;EAE5B,IAAI,KACA,SAAS,OAAO,OAAO,GAAG;EAE9B,IAAI,QACA,SAAS,OAAO,UAAU,MAAM;EAIpC,IAAI;QACK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,GAC9C,IAAI,UAAU,KAAA,KAAa,UAAU,MACjC,SAAS,OACL,YAAY,OACZ,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK,CAC5D;EAAA;EAKZ,MAAM,WAAW,MAAM,cAAc,GAAG,gBAAgB,UAAU;GAC9D,QAAQ;GACR,MAAM;EACV,CAAC;EAED,IAAI,CAAC,SAAS,IAAI;GACd,MAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,aAAa,EAAE,OAAO,gBAAgB,EAAE;GAC5E,MAAM,IAAI,MAAM,MAAM,SAAS,eAAe;EAClD;EAGA,QAAO,MADc,SAAS,KAAK,GACrB;CAClB,GAAG,CAAC,eAAe,eAAe,CAAC;;;;CAKnC,MAAM,eAAe,YAAY,OAC7B,UACA,WAC0B;EAE1B,MAAM,WAAW,SAAS,GAAG,OAAO,GAAG,aAAa;EACpD,MAAM,SAAS,UAAU,IAAI,QAAQ;EACrC,IAAI,QACA,OAAO;EAIX,IAAI,WAAW;EAGf,IAAI,aAAa,SAAS,WAAW,UAAU,KAAK,SAAS,WAAW,OAAO,IAE3E,WADwB,SAAS,UAAU,SAAS,QAAQ,KAAK,IAAI,CAC1D;EAIf,IAAI,UAAU,YAAY,CAAC,SAAS,WAAW,MAAM,GACjD,WAAW,GAAG,OAAO,GAAG;EAG5B,IAAI,CAAC,YAAY,SAAS,KAAK,MAAM,MAAM,aAAa,KACpD,OAAO;GAAE,KAAK;GAC1B,cAAc;EAAK;EAGX,MAAM,WAAW,MAAM,cAAc,GAAG,gBAAgB,YAAY,UAAU;EAE9E,IAAI,SAAS,WAAW,KACpB,OAAO;GACH,KAAK;GACL,cAAc;EAClB;EAGJ,IAAI,CAAC,SAAS,IAAI;GACd,MAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,aAAa,EAAE,OAAO,6BAA6B,EAAE;GACzF,MAAM,IAAI,MAAM,MAAM,SAAS,4BAA4B;EAC/D;EAEA,MAAM,SAAS,MAAM,SAAS,KAAK;EAEnC,MAAM,QAAQ,MAAM,aAAa;EACjC,MAAM,aAAa,QAAQ,UAAU,UAAU;EAG/C,MAAM,iBAAiC;GACnC,KAAK,GAAG,gBAAgB,QAAQ,WAAW;GAC3C,UAAU,OAAO;EACrB;EAGA,UAAU,IAAI,UAAU,cAAc;EAEtC,OAAO;CACX,GAAG;EAAC;EAAe;EAAiB;CAAS,CAAC;;;;CAK9C,MAAM,YAAY,YAAY,OAC1B,KACA,WACuB;EACvB,IAAI,WAAW;EAGf,IAAI,aAAa,SAAS,WAAW,UAAU,KAAK,SAAS,WAAW,OAAO,IAE3E,WADwB,SAAS,UAAU,SAAS,QAAQ,KAAK,IAAI,CAC1D;EAGf,IAAI,UAAU,YAAY,CAAC,SAAS,WAAW,MAAM,GACjD,WAAW,GAAG,OAAO,GAAG;EAG5B,IAAI,CAAC,YAAY,SAAS,KAAK,MAAM,MAAM,aAAa,KACpD,OAAO;EAGX,MAAM,WAAW,MAAM,cAAc,GAAG,gBAAgB,QAAQ,UAAU;EAE1E,IAAI,SAAS,WAAW,KACpB,OAAO;EAGX,IAAI,CAAC,SAAS,IACV,MAAM,IAAI,MAAM,oBAAoB;EAGxC,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,MAAM,WAAW,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;EAC9C,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,UAAU,EAAE,MAAM,KAAK,KAAK,CAAC;CACzD,GAAG,CAAC,eAAe,eAAe,CAAC;;;;CAKnC,MAAM,eAAe,YAAY,OAC7B,KACA,WACgB;EAChB,IAAI,WAAW;EAGf,IAAI,aAAa,SAAS,WAAW,UAAU,KAAK,SAAS,WAAW,OAAO,IAE3E,WADwB,SAAS,UAAU,SAAS,QAAQ,KAAK,IAAI,CAC1D;EAGf,IAAI,UAAU,YAAY,CAAC,SAAS,WAAW,MAAM,GACjD,WAAW,GAAG,OAAO,GAAG;EAG5B,IAAI,CAAC,YAAY,SAAS,KAAK,MAAM,MAAM,aAAa,KACpD;EAGJ,MAAM,WAAW,MAAM,cAAc,GAAG,gBAAgB,QAAQ,YAAY,EACxE,QAAQ,SACZ,CAAC;EAED,IAAI,CAAC,SAAS,MAAM,SAAS,WAAW,KAAK;GACzC,MAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,aAAa,EAAE,OAAO,wBAAwB,EAAE;GACpF,MAAM,IAAI,MAAM,MAAM,SAAS,uBAAuB;EAC1D;EAGA,UAAU,OAAO,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG;CACtD,GAAG;EAAC;EAAe;EAAiB;CAAS,CAAC;;;;CAK9C,MAAM,cAAc,YAAY,OAC5B,QACA,YAK6B;EAC7B,MAAM,SAAS,IAAI,gBAAgB;EACnC,IAAI,QAAQ,OAAO,IAAI,UAAU,MAAM;EACvC,IAAI,SAAS,QAAQ,OAAO,IAAI,UAAU,QAAQ,MAAM;EACxD,IAAI,SAAS,YAAY,OAAO,IAAI,cAAc,OAAO,QAAQ,UAAU,CAAC;EAC5E,IAAI,SAAS,WAAW,OAAO,IAAI,aAAa,QAAQ,SAAS;EAEjE,MAAM,WAAW,MAAM,cACnB,GAAG,gBAAgB,QAAQ,OAAO,SAAS,GAC/C;EAEA,IAAI,CAAC,SAAS,IAAI;GACd,MAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,aAAa,EAAE,OAAO,uBAAuB,EAAE;GACnF,MAAM,IAAI,MAAM,MAAM,SAAS,sBAAsB;EACzD;EAGA,QAAO,MADc,SAAS,KAAK,GACrB;CAClB,GAAG,CAAC,eAAe,eAAe,CAAC;CAGnC,OAAO,eAA8B;EACjC;EACA;EACA;EACA;EACA;CACJ,IAAI;EAAC;EAAW;EAAc;EAAW;EAAc;CAAW,CAAC;AACvE;;;;;;;ACrRA,SAAgB,iBAAiB;CAC7B,MAAM,iBAAiB,kBAAkB;CAEzC,MAAM,YAAY,aACb,YAAmC,SAChC,gBAAgB,YAAY,gBAAgB,MAAM,IAAI,GAC1D,CAAC,cAAc,CACnB;CAEA,MAAM,UAAU,aACX,YAAmC,MAAc,WAC9C,cAAc,YAAY,gBAAgB,MAAM,MAAM,GAC1D,CAAC,cAAc,CACnB;CAEA,MAAM,YAAY,aACb,YAAmC,MAAc,WAC9C,gBAAgB,YAAY,gBAAgB,MAAM,MAAM,GAC5D,CAAC,cAAc,CACnB;CAEA,MAAM,UAAU,aACX,eACG,kBAAkB,YAAY,cAAc,GAChD,CAAC,cAAc,CACnB;CAEA,OAAO,eAAe;EAClB;EACA;EACA;EACA;CACJ,IAAI;EAAC;EAAW;EAAS;EAAW;CAAO,CAAC;AAChD;;;AC7BA,IAAM,mBAAmB,MAAM,cAAqC,KAAA,CAAS;;;;;AAM7E,SAAgB,eAAsC;CAClD,OAAO,WAAW,gBAAgB;AACtC;;;;;AAMA,SAAgB,kBAAkB,EAC9B,QACA,cACA,YAC0C;CAC1C,MAAM,QAAQ,MAAM,eAAe;EAAE;EACzC;CAAa,IAAI,CAAC,QAAQ,YAAY,CAAC;CACnC,OACI,oBAAC,iBAAiB,UAAlB;EAAkC;EAC7B;CACsB,CAAA;AAEnC;;;ACrCA,IAAM,cAAY;;;;;;;;;;;;;;AAelB,SAAgB,iBAAiB;CAC7B,MAAM,EAAE,GAAG,SAAS,iBAAmB,WAAS;;;;;;;CAQhD,MAAM,SAAS,aAAa,KAAa,SACrC,EAAE,KAAK,IAAI,GAAa,CAAC,CAAC,CAAC;CAE/B,OAAO,eAAe;EAAE,GAAG;EAC/B;CAAK,IAAI,CAAC,QAAQ,IAAI,CAAC;AACvB;;;;;;;;;;;;;;AChBA,IAAM,4BAAY,IAAI,QAAsE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsC5F,SAAgB,qBACZ,KACkC;CAClC,OAAO,cAAc,oBAAoB,GAAG,GAAG,CAAC,GAAG,CAAC;AACxD;;;;;AAMA,SAAS,gBACL,KACA,QACsB;CACtB,MAAM,SAAS,UAAU,IAAI,GAAG;CAChC,IAAI,QAAQ,OAAO;CAGnB,MAAM,gBAAgB,KAAK,MAAM;CACjC,UAAU,IAAI,KAAK,aAAa;CAChC,OAAO;AACX;;;;;;;;AASA,SAAgB,oBACZ,KACkC;CAClC,IAAI,OAAO,MAAM,OAAO,KAAA;CAIxB,IAAI,OAAO,QAAQ,UAAU;EACzB,QAAQ,KACJ,oDAAoD,IAAI,gJAG5D;EACA;CACJ;CAIA,IAAI,mBAAmB,GAAG,GACtB,OAAO,gBACH,WACO,IAA4B,KAAK,CAC5C;CAIJ,IAAI,OAAO,QAAQ,YAAY;EAC3B,MAAM,KAAK;EAGX,IAAI,GAAG,WAAW,kBACd,OAAO;EAIX,IAAI,cAAc,IACd,OAAO;EAKX,IAAI,GAAG,SAAS,GACZ,OAAO;EAWX,MAAM,OAAO,GAAG;EAChB,IAAI,QAAQ,SAAS,KAAK,IAAI,GAE1B,OAAO;EAIX,OAAO,gBACH,IACA,GACJ;CACJ;CAIA,IAAI,OAAO,QAAQ,YAAY,cAAe,KAC1C,OAAO;AAKf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7HA,SAAgB,qBACZ,MACA,kBACsB;CACtB,MAAM,EAAE,iBAAiB,wBAAwB,WAAW,wBAAwB;CAEpF,OAAO,cAAc;EAEjB,MAAM,WAAW,oBAAoB,SAAS,gBAAgB;EAE9D,IAAI,CAAC,UAAU,OAAO;EAEtB,IAAI,SAAS,MAAM;GAEf,MAAM,gBAAgB,SAAS;GAC/B,MAAM,WAAW,UACb,oBAAC,eAAD;IAAe,GAAK;IAAmC,mBAAmB;GAAmB,CAAA;GAEjG,QAAQ,cAAc,WAAW,KAAK;GACtC,OAAO;EACX;EAGA,OAAO,SAAS;CACpB,GAAG;EAAC;EAAqB;EAAiB;EAAM;CAAgB,CAAC;AACrE;;;ACvDA,SAAgB,aAAa,OAAqB;CAC9C,OACI,oBAAC,SAAD;EAAS,GAAI;EACT,WAAW,MAAM;EACjB,kBAAkB;YACjB,MAAM;CACF,CAAA;AAEjB;;;;;;;;;;;;;ACaA,SAAgB,UAAU,EACtB,OACA,OACA,SACA,WACmC;CACnC,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;CAEzD,MAAM,YAAY,iBAAiB,SAAS,UAAU,QAC/C,MAAoC,OACrC,KAAA;CAEN,MAAM,OACF,oBAAC,OAAD;EAAK,WAAU;YACX,qBAAC,OAAD;GAAK,WAAU;aAAf,CACI,oBAAC,mBAAD;IACI,MAAM,SAAS;IACf,WAAU;GACb,CAAA,GACD,qBAAC,OAAD;IAAK,WAAU;cAAf;KACK,SACG,oBAAC,YAAD;MACI,SAAQ;MACR,OAAM;MACN,WAAU;gBAET;KACO,CAAA;KAEhB,oBAAC,YAAD;MACI,SAAQ;MACR,OAAM;MACN,WAAU;gBAET;KACO,CAAA;KACX,aACG,oBAAC,QAAD;MACI,WAAU;gBAET;KACC,CAAA;KAET,WACG,oBAAC,OAAD;MAAK,WAAU;gBACX,oBAAC,QAAD;OACI,SAAQ;OACR,OAAM;OACN,MAAK;OACL,SAAS;OACT,WAAU;iBACb;MAEO,CAAA;KACP,CAAA;IAER;KACJ;;CACJ,CAAA;CAGT,IAAI,SACA,OACI,oBAAC,cAAD;EAAc,OAAO;YAChB;CACS,CAAA;CAGtB,OAAO;AACX;;;;;;;;;;;AClFA,SAAgB,iBAAoB,MAAW,MAAe,YAAY,KAAM;CAE5E,MAAM,CAAC,cAAc,mBAAmB,MAAM,SAAS,IAAI;CAC3D,MAAM,aAAa,MAAM,OAAO,aAAa,UAAU,CAAC;CACxD,MAAM,gBAAgB,MAAM,OAAO,KAAK;CACxC,MAAM,cAAc,MAAM,OAAO,IAAI;CAErC,MAAM,kBAAkB,CAAC,UAAM,YAAY,SAAS,IAAI;CACxD,MAAM,kBAAkB,KAAK,UAAU,WAAW,WAAW;CAE7D,MAAM,gBAAgB;EAElB,MAAM,sBAAsB;GACxB,IAAI,CAAC,UAAM,cAAc,IAAI,GAAG;IAC5B,YAAY,UAAU;IACtB,WAAW,UAAU,KAAK;IAC1B,gBAAgB,IAAI;GACxB;GACA,cAAc,UAAU;EAC5B;EAEA,cAAc,UAAU;EAExB,IAAI;EACJ,IAAI,iBACA,cAAc;OAEd,UAAU,WAAW,eAAe,SAAS;EAEjD,aAAa;GACT,aAAa,OAAO;GACpB,IAAI,cAAc,WAAW,iBACzB,cAAc;EACtB;CACJ,GAAG;EAAC;EAAM;EAAW;EAAM;CAAe,CAAC;CAE3C,OAAO,kBAAkB,OAAO;AACpC;;;;;;;ACvCA,SAAS,kBAAkB,YAAwB,MAAoC;CACnF,IAAI,OAAO,eAAe,UAAU;EAChC,IAAI,QAAQ,YACR,OAAQ,WAAwC;EAEpD,IAAI,KAAK,SAAS,GAAG,GAAG;GACpB,MAAM,eAAe,KAAK,MAAM,GAAG;GACnC,MAAM,gBAAiB,WAAwC,aAAa;GAC5E,IAAI,OAAO,kBAAkB,YAAY,cAAc,SAAS,SAAS,cAAc,YACnF,OAAO,kBAAkB,cAAc,YAAY,aAAa,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;EAE1F;CACJ;AAEJ;AAOA,SAAgB,yBAAyB,YAAmC;CACxE,OAAO,iBAAiB,WAAW;AACvC;AACA,SAAgB,aAA4C,YAAiC,uBAAwD;CACjJ,OAAO,cAAc;EACjB,IAAI,WAAW,iBACX,OAAO,kBAAkB,YAAY,WAAW,eAAe;EAEnE,OAAO,qBAAqB,YAAY,qBAAqB;CACjE,GAAG,CAAC,YAAY,qBAAqB,CAAC;AAC1C;AAEA,SAAS,kBAAiD,YAAiC,MAAwC;CAI/H,MAAM,4CAA4B,IAAI,IAAY;CAClD,KAAK,MAAM,OAAO,MACd,IAAI,IAAI,SAAS,GAAG,GAAG;EACnB,MAAM,UAAU,IAAI,MAAM,GAAG,EAAE;EAC/B,MAAM,eAAe,WAAW,WAAW;EAC3C,IAAI,gBAAgB,aAAa,SAAS,SAAS,aAAa,IAAI,kBAAkB,aAAa,YAC/F,0BAA0B,IAAI,OAAO;CAE7C;CAIJ,MAAM,wCAAwB,IAAI,IAAY;CAE9C,MAAM,SAAS,KAAK,SAAS,QAAQ;EAEjC,IAAI,sBAAsB,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI;EAGhD,MAAM,WAAW,WAAW,WAAW;EACvC,IAAI,UAAU;GACV,sBAAsB,IAAI,GAAG;GAC7B,IAAI,SAAS,IAAI,oBACb,OAAO,CAAC,IAAI;GAChB,IAAI,SAAS,IAAI,YAAY,OAAO,SAAS,IAAI,aAAa,YAAY,SAAS,IAAI,SAAS,QAC5F,OAAO,CAAC,IAAI;GAEhB,IAAI,SAAS,SAAS,SAAS,SAAS,IAAI,kBAAkB,SAAS,YAAY;IAE/E,IAAI,0BAA0B,IAAI,GAAG,GAEjC,OAAO,CAAC,IAAI;IAGhB,MAAM,eAAe,yBAAyB,UAAU,GAAG;IAC3D,aAAa,SAAQ,MAAK,sBAAsB,IAAI,EAAE,GAAG,CAAC;IAC1D,OAAO;GACX;GACA,OAAO,CAAC;IACJ;IACA,UAAU,QAAQ,SAAS,IAAI,QAAQ,KAAK,QAAQ,SAAS,IAAI,QAAQ;GAC7E,CAAC;EACL;EAGA,IAAI,IAAI,SAAS,GAAG,GAAG;GACnB,MAAM,UAAU,IAAI,MAAM,GAAG,EAAE;GAC/B,MAAM,eAAe,WAAW,WAAW;GAE3C,IAAI,gBAAgB,aAAa,SAAS,SAAS,aAAa,YAAY;IACxE,MAAM,iBAAiB,kBAAkB,WAAW,YAAY,GAAG;IACnE,IAAI,gBAAgB;KAChB,sBAAsB,IAAI,GAAG;KAE7B,sBAAsB,IAAI,OAAO;KAEjC,IAAI,eAAe,IAAI,oBACnB,OAAO,CAAC,IAAI;KAChB,IAAI,eAAe,IAAI,YAAY,OAAO,eAAe,IAAI,aAAa,YAAY,eAAe,IAAI,SAAS,QAC9G,OAAO,CAAC,IAAI;KAEhB,OAAO,CAAC;MACJ;MACA,UAAU,QAAQ,aAAa,IAAI,QAAQ,KAAK,QAAQ,aAAa,IAAI,QAAQ,KAC7E,QAAQ,eAAe,IAAI,QAAQ,KAAK,QAAQ,eAAe,IAAI,QAAQ;KACnF,CAAC;IACL;GACJ;EACJ;EAIA,IADwB,WAAW,kBAAkB,MAAK,UAAS,MAAM,QAAQ,GAAG,GAEhF,OAAO,CAAC;GACJ;GACA,UAAU;EACd,CAAC;EAIL,MAAM,iBAAiB,kBAAkB,UAAU;EACnD,IAAI;OACsB,eACjB,MAAK,WAAU,yBAAyB,MAAM,MAAM,GACrD,GACA,OAAO,CAAC;IACJ;IACA,UAAU;GACd,CAAC;EAAA;EAIT,OAAO,CAAC,IAAI;CAChB,CAAC,EAAE,OAAO,OAAO;CAIjB,KAAK,MAAM,WAAW,OAAO,KAAK,WAAW,UAAU,GAAG;EAEtD,IAAI,sBAAsB,IAAI,OAAO,GAAG;EAExC,MAAM,WAAW,WAAW,WAAW;EACvC,IAAI,CAAC,UAAU;EACf,IAAI,SAAS,IAAI,oBAAoB;EACrC,IAAI,SAAS,IAAI,YAAY,OAAO,SAAS,IAAI,aAAa,YAAY,SAAS,IAAI,SAAS,QAAQ;EAExG,IAAI,SAAS,SAAS,SAAS,SAAS,IAAI,kBAAkB,SAAS,YAAY;GAE/E,MAAM,kBAAkB,yBAAyB,UAAyB,OAAO;GACjF,KAAK,MAAM,eAAe,iBACtB,IAAI,CAAC,sBAAsB,IAAI,YAAY,GAAG,GAAG;IAC7C,OAAO,KAAK,WAAW;IACvB,sBAAsB,IAAI,YAAY,GAAG;GAC7C;EAER,OAAO;GACH,OAAO,KAAK;IACR,KAAK;IACL,UAAU,QAAQ,SAAS,IAAI,QAAQ,KAAK,QAAQ,SAAS,IAAI,QAAQ;GAC7E,CAAC;GACD,sBAAsB,IAAI,OAAO;EACrC;CACJ;CAEA,OAAO;AACX;AAEA,SAAS,qBAA0D,YAAiC,uBAAgC;CAChI,MAAM,eAAe,OAAO,KAAK,WAAW,UAAU;CAEtD,MAAM,mBAAmB,WAAW,oBAAoB,CAAC;CACzD,MAAM,iBAAqC,kBAAkB,UAAU,KAAK,CAAC;CAE7E,MAAM,YAAsB,CACxB,GAAG,cAEH,GAAG,iBAAiB,QAAQ,UAAU,CAAC,aAAa,SAAS,MAAM,GAAG,CAAC,EAAE,KAAK,UAAU,MAAM,GAAG,CACrG;CAEA,IAAI,uBAAuB;EACvB,MAAM,mBAAmB,eACpB,KAAK,eAAe,yBAAyB,UAAU,CAAC;EAC7D,UAAU,KAAK,GAAG,iBAAiB,QAAQ,aAAa,CAAC,UAAU,SAAS,QAAQ,CAAC,CAAC;CAC1F;CAEA,OAAO,kBAAkB,YAAY,SAAS;AAClD;AAEA,SAAgB,yBAAyB,UAAoB,KAAa,UAA4C;CAClH,IAAI,SAAS,SAAS,SAAS,SAAS,IAAI,kBAAkB,SAAS,YACnE,OAAO,OAAO,QAAQ,SAAS,UAAU,EACpC,SAAS,CAAC,UAAU,mBAAmB,yBACpC,eACA,GAAG,IAAI,GAAG,YACV,YAAY,QAAQ,SAAS,IAAI,QAAQ,KAAK,QAAQ,SAAS,IAAI,QAAQ,CAAC,CAChF;CAER,OAAO,CAAC;EACJ;EACA,UAAU,YAAY,QAAQ,SAAS,IAAI,QAAQ,KAAK,QAAQ,SAAS,IAAI,QAAQ;CACzF,CAAC;AACL;AAEA,SAAgB,iBAAiB,YAAwC;CACrE,MAAM,eAAe,WAAW,aAAa,OAAO,KAAK,WAAW,UAAU,IAAI,CAAC;CACnF,MAAM,mBAAmB,WAAW,oBAAoB,CAAC;CACzD,MAAM,UAAU,CACZ,GAAG,cACH,GAAG,iBAAiB,KAAK,UAAU,MAAM,GAAG,CAChD;CAEA,IAAI,WAAW,iBACX,OAAO,WAAW,gBAAgB,QAAO,QAAO,QAAQ,SAAS,GAAG,CAAC;CAEzE,OAAO;AACX;;;;;;;;;AChNA,SAAgB,aACZ,EACI,MACA,0BAC+B;CAEnC,IAAI,CAAC,wBACD,OAAO;CAEX,MAAM,mBAAmB,IAAI,IAAI,uBAAuB,KAAK,MAAM,EAAE,EAAE,CAAC;CACxE,OAAO,CAAC,GAAG,wBAAwB,GAAG,KAAK,QAAQ,MAAM,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC,CAAC;AAEzF;;;ACfA,IAAa,oBAAoB;;;;;;;;;;;;;;;;AAgDjC,SAAgB,uBACZ,EACI,MACA,YACA,mBACA,wBACA,qBAAqB,sBACrB,aAAa,sBACb,aAEuB;CAE3B,MAAM,EACF,eACA,MACA,aAAa,8BACb;CAEJ,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAA2C,KAAA,CAAS;CAC5F,MAAM,aAAa,QAAQ;CAE3B,MAAM,cAAc,wBAAwB;CAC5C,MAAM,oBAAoB,WAAW,eAAe,KAAA,KAAa,QAAQ,WAAW,UAAU;CAC9F,MAAM,WAAW,OAAO,WAAW,eAAe,WAAW,WAAW,aAAA;CAExE,MAAM,WAAW,YAAY;CAE7B,MAAM,CAAC,cAAc,mBAAmB,MAAM,eAAmC;EAC7E,IAAI,WAAW;GAEX,MAAM,YAAY,IADC,gBAAgB,SAAS,MAC1B,EAAO,IAAI,QAAQ;GACrC,OAAO,YAAY,mBAAmB,SAAS,IAAI,KAAA;EACvD;CAEJ,CAAC;CAED,MAAM,yBAAyB,aAAa,cACxC,WAAsC;EAEtC,OAAO;CACX,GAAG,CAAC,CAAC;CAEL,MAAM,eAAe,cAAc;EAC/B,IAAI,QAAQ,eAAe,CAAC,uBAAuB,aAAa,IAAI,GAAG;GACnE,QAAQ,KAAK,6EAA6E;GAC1F;EACJ;EACA,OAAO;CACX,GAAG,CAAC,MAAM,WAAW,CAAC;CAEtB,MAAM,EACF,cAAc,WACd,QAAQ,YACR,mBAAmB,SAAS,MAAM;CAEtC,MAAM,CAAC,cAAc,mBAAmB,MAAM,SAA6E,gBAAgB,YAAY,YAAY,KAAA,MAAc,iBAAiB,KAAA,CAAS;CAC3M,MAAM,CAAC,QAAQ,aAAa,MAAM,UAAkF,YAAY,UAAU,KAAA,MAAc,YAAY;CAIpK,MAAM,mBAAmB,MAAM,OAAsB,SAAS,MAAM;CACpE,gBAAgB;EACZ,IAAI,CAAC,WAAW;EAEhB,IAAI,iBAAiB,YAAY,QAAQ,iBAAiB,YAAY,SAAS,QAAQ;GACnF,iBAAiB,UAAU;GAC3B;EACJ;EACA,iBAAiB,UAAU;EAE3B,MAAM,EAAE,cAAc,iBAAiB,QAAQ,cAAc,mBAAmB,SAAS,MAAM;EAC/F,IAAI,CAAC,aACD,gBAAiB,mBAAmB,aAAoF;EAE5H,IAAI,aAAa,eAAe,CAAC,uBAAuB,aAAa,SAAS,GAC1E,QAAQ,KAAK,mDAAmD;OAEhE,UAAU,SAAmF;EAKjG,MAAM,YAAY,IADI,gBAAgB,SAAS,MAC7B,EAAU,IAAI,QAAQ;EACxC,gBAAgB,YAAY,mBAAmB,SAAS,IAAI,KAAA,CAAS;CACzE,GAAG;EAAC,SAAS;EAAQ;EAAW;EAAa;CAAsB,CAAC;CAEpE,aAAa,cAAc,QAAQ,cAAc,SAAS;CAE1D,MAAM,mBAAmB,mBAAmB,oBAAoB,MAAM,YAAY;CAClF,MAAM,mBAAmB,kBAAkB,KAAK,UAAU;CAE1D,gBAAgB;EACZ,IAAI,mBACA,kBAAkB,uBAAuB;GACrC;GACA,cAAc,kBAAkB,gBAAgB;GAChD,MAAM;GACN,SAAS;EACb,CAAC;CAET,GAAG,CAAC,CAAC;CAEL,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAA6B,oBAAoB,mBAAmB,KAAA,CAAS;CAErH,MAAM,iBAAiB,SAAS,OAAO,KAAK,KAAA;CAC5C,MAAM,cAAc,SAAS,OAAO,KAAK,KAAA;CAEzC,MAAM,UAA+B,iBAAiB;CAEtD,MAAM,CAAC,SAAS,cAAc,SAAsB,kBAAkB,QAAQ,CAAC,CAAC;CAEhF,MAAM,WAAW,aAAa,EAC1B,mBAGE;EACF,IAAI,mBACA,kBAAkB,uBAAuB;GACrC;GACA;GACA,MAAM;GACN,SAAS;EACb,CAAC;CAET,GAAG;EAAC;EAAmB;EAAM;EAAS;CAAY,CAAC;CAEnD,MAAM,CAAC,aAAa,kBAAkB,SAAkB,KAAK;CAC7D,MAAM,CAAC,kBAAkB,uBAAuB,SAA4B;CAC5E,MAAM,CAAC,cAAc,mBAAmB,SAAkB,KAAK;CAE/D,MAAM,cAAc,kBAAkB,gBAAgB,eAAe,iBAAiB,KAAA,CAAS,GAAG,CAAC,aAAa,aAAa,CAAC;CAE9H,MAAM,qBAAqB,aAAa,kBAAsF;EAC1H,IAAI,aAAa;GACb,QAAQ,KAAK,iEAAiE;GAC9E;EACJ;EACA,IAAI,iBAAiB,OAAO,KAAK,aAAa,EAAE,WAAW,GACvD,gBAAgB,KAAA,CAAS;OAEzB,gBAAgB,aAAa;CAErC,GAAG,CAAC,WAAW,CAAC;CAEhB,gBAAgB;EAEZ,eAAe,IAAI;EAEnB,MAAM,mBAAmB,OAAO,aAA0B;GACtD,IAAI,WAAW,WAAW,WACtB,IAAI;IAGA,WAAW,MAAM,QAAQ,IACrB,SAAS,IAAI,OAAO,WAAW;KAC3B,MAAM,eAAe,MAAM,WAAW,UAAW,UAAW;MACxD;MACA;MACA,KAAK;OAAE,IAAI,OAAO;OAAI,GAAG,OAAO;MAAO;MACvC;KACJ,CAAC;KACD,OAAO;MACH,GAAG;MACH,QAAQ;KACZ;IACJ,CAAC,CAAC;GACV,SAAS,IAAa;IAClB,QAAQ,MAAM,EAAE;GACpB;GAEJ,eAAe,KAAK;GACpB,oBAAoB,KAAA,CAAS;GAC7B,WAAW,SAAS,KAAI,OAAM,EAC1B,GAAG,EAEP,EAAE,CAAC;GACH,gBAAgB,CAAC,aAAa,SAAS,SAAS,SAAS;GAIzD,mBAAmB,MAAM,QAAQ;EACrC;EAEA,MAAM,WAAW,UAAiB;GAC9B,QAAQ,MAAM,SAAS,KAAK;GAC5B,eAAe,KAAK;GACpB,YAAY,SAAS,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC;GACxD,oBAAoB,KAAK;EAC7B;EAEA,MAAM,WAAW,WAAW,WAAW,IAAI;EAG3C,MAAM,cAAc,gBAAgB,OAAO,KAAK,YAAY,EAAE,SAAS,IAAI,eAAe,KAAA;EAC1F,MAAM,gBAAsD,SAAS,CAAC,OAAO,OAAO,EAAE,GAAG,OAAO,EAAE,IAAI,KAAA;EAEtG,IAAI;EAEJ,IAAI,SAAS,QACT,cAAc,SAAS,OAAO;GAC1B,OAAO;GACP,OAAO;GACP,SAAS;GACT;EACJ,IAAI,QAAQ,iBAAiB,IAAI,IAAmB,GAAG,OAAO;OAC3D;GACH,SAAS,KAAK;IACV,OAAO;IACP,OAAO;IACP,SAAS;IACT;GACJ,CAAC,EACI,MAAM,QAAQ,iBAAiB,IAAI,IAAmB,CAAC,EACvD,MAAM,OAAO;GAClB,oBAAoB,KAAA;EACxB;EAEA,OAAO;CACX,GAAG;EAAC;EAAY;EAAM;EAAW;EAAa;EAAgB;EAAc;CAAY,CAAC;CAezF,MAAM,OAZc,aAAa;EAC7B,MAAM;EACN;CACJ,CASa;CAEb,OAAO,eAAe;EAClB;EACA;EACA;EACA;EACA;EACA,iBAAiB;EACjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA,eAAe,kBAAkB;EACjC;EACA;EACA;EACA;EACA;EACA;CACJ,IAAI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAAkB;EAClB;EACA;EACA;EACA;EACA;CACJ,CAAC;AACL;AAEA,SAAS,aACL,cACA,QACA,cACA,WACF;CAEE,gBAAgB;EACZ,IAAI,WAAW;GAEX,MAAM,iBAAiB,IAAI,gBAAgB,OAAO,SAAS,MAAM;GACjE,MAAM,kBAAkB,IAAI,gBAAgB;GAG5C,eAAe,SAAS,OAAO,QAAQ;IACnC,IAAI,IAAI,WAAW,IAAI,KAAK,QAAQ,YAAY,QAAQ,gBACpD,gBAAgB,IAAI,KAAK,KAAK;GAEtC,CAAC;GAED,MAAM,kBAAkB,oBAAoB,cAAc,MAAM;GAChE,MAAM,SAAS,eAAe,UAAU,mBAAmB,YAAY,MAAM;GAK7E,MAAM,QADQ;IADU,gBAAgB,SACzB;IAAiB;IAAiB;GAAM,EAAE,OAAO,OAClD,EAAM,KAAK,GAAG;GAE5B,MAAM,OAAO,OAAO,SAAS;GAC7B,IAAI,UAAU,IACV,OAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,GAAG,OAAO,SAAS,WAAW,MAAM;QAExE,OAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,IAAI,QAAQ,MAAM;EAC9D;CACJ,GAAG;EAAC;EAAc;EAAQ;EAAc;CAAS,CAAC;AACtD;AAEA,SAAS,oBAAoB,cAAqC,QAA+C;CAC7G,MAAM,UAAkC,CAAC;CACzC,IAAI,QAAQ;EACR,QAAQ,YAAY,mBAAmB,OAAO,EAAE;EAChD,QAAQ,kBAAkB,mBAAmB,OAAO,EAAE;CAC1D;CACA,IAAI,cACA,OAAO,QAAQ,YAAY,EAAE,SAAS,CAAC,KAAK,WAAW;EACnD,IAAI,OAAO;GAKP,MAAM,CAAC,IAAI,QAJoC,MAAM,QAAQ,MAAM,EAAE,IAC9D,QACD,CAAC,KAAiC,GAEX,MAAM,CAAC;GACpC,IAAI,IAAI;IACJ,IAAI,eAAwB;IAC5B,IAAI;KACA,IAAI,OAAO,QAAQ;UACX,eAAe,MACf,eAAe,IAAI,YAAY;WAC5B,IAAI,MAAM,QAAQ,GAAG,GACxB,eAAe,KAAK,UAAU,MAAM,GAAG,MAAM;OACzC,IAAI,aAAa,gBACb,OAAO,eAAe,CAAC;OAE3B,IAAI,aAAa,iBACb,OAAO,gBAAgB,CAAC;OAE5B,OAAO;MACX,CAAC;WACE,IAAI,eAAe,gBACtB,eAAe,eAAe,GAAG;WAC9B,IAAI,eAAe,iBACtB,eAAe,gBAAgB,GAAG;KAAA;IAG9C,SAAS,GAAG;KACR,eAAe;IACnB;IACA,IAAI,iBAAiB,KAAA,GAAW;KAC5B,QAAQ,mBAAmB,GAAG,IAAI,IAAI,KAAK,mBAAmB,EAAE;KAChE,QAAQ,mBAAmB,GAAG,IAAI,OAAO,KAAK,eAAe,mBAAmB,OAAO,YAAY,CAAC,IAAI;IAC5G;GACJ;EACJ;CACJ,CAAC;CAEL,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,QACtB,OAAO;CAEX,OAAO,OAAO,QAAQ,OAAO,EAAE,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,OAAO,EAAE,KAAK,GAAG;AACpF;AAEA,SAAS,mBAAsB,QAG7B;CACE,MAAM,UAAU,IAAI,gBAAgB,MAAM;CAC1C,MAAM,eAAqC,CAAC;CAC5C,IAAI,SAA+C,KAAA;CACnD,QAAQ,SAAS,OAAO,QAAQ;EAC5B,IAAI,QAAQ,UACR,SAAS,CAAC,mBAAmB,KAAK,GAAG,QAAQ,IAAI,cAAc,CAAmB;OAC/E,IAAI,IAAI,SAAS,KAAK,GAAG;GAC5B,MAAM,QAAQ,IAAI,QAAQ,OAAO,EAAE;GACnC,MAAM,WAAW,mBAAmB,KAAK;GACzC,MAAM,eAAe,QAAQ,IAAI,GAAG,MAAM,OAAO;GACjD,IAAI,iBAAiB,MACjB,aAAa,SAAS,CAAC,UAAU,aAAa,YAAY,CAAC;EAEnE;CACJ,CAAC;CAED,OAAO;EACH,cAAc,OAAO,KAAK,YAAY,EAAE,SAAS,eAAe,KAAA;EAChE;CACJ;AACJ;AAEA,SAAS,OAAO,YAA6B;CAKzC,IAAI,CAAC,gDAAa,KAAK,UAAU,GAC7B,OAAO;CAKX,OAAO,IADU,KAAK,UACf,EAAK,YAAY,MAAM;AAClC;AAEA,SAAS,gBAAgB,KAAsB;CAC3C,OAAO,QAAQ,IAAI,KAAK,GAAG,IAAI;AACnC;AACA,SAAS,eAAe,KAAqB;CACzC,OAAO,QAAQ,IAAI,KAAK,GAAG,IAAI;AACnC;AAEA,SAAS,aAAa,KAA+D;CACjF,IAAI,kBAAoE;CACxE,IAAI,OAAO,GAAG,GACV,IAAI;EACA,kBAAkB,IAAI,KAAK,GAAG;CAClC,SAAS,IAAI,CAEb;CAEJ,IAAI,OAAO,oBAAoB,UAC3B,IAAI;EACA,kBAAkB,KAAK,MAAM,kBAAkB,KAAK,UAAU;GAC1D,IAAI,OAAO,UAAU,UAAU;IAC3B,IAAI,MAAM,WAAW,OAAO,GAAG;KAC3B,MAAM,CAAC,MAAM,MAAM,MAAM,UAAU,CAAC,EAAE,MAAM,GAAG;KAC/C,OAAO,IAAI,gBAAgB;MAAE;MACrD;KAAK,CAAC;IACc;IACA,IAAI,MAAM,WAAW,OAAO,GAAG;KAC3B,MAAM,CAAC,MAAM,MAAM,MAAM,UAAU,CAAC,EAAE,MAAM,GAAG;KAC/C,OAAO,IAAI,eAAe,IAAI,IAAI;IACtC;GACJ;GACA,OAAO;EACX,CAAC;CACL,SAAS,IAAI,CAEb;CAGJ,IAAI,OAAO,oBAAoB,UAAU;EACrC,IAAI,gBAAgB,WAAW,OAAO,GAAG;GACrC,MAAM,CAAC,MAAM,MAAM,gBAAgB,UAAU,CAAC,EAAE,MAAM,GAAG;GACzD,OAAO,IAAI,gBAAgB;IAAE;IACzC;GAAK,CAAC;EACE;EACA,IAAI,gBAAgB,WAAW,OAAO,GAAG;GACrC,MAAM,CAAC,MAAM,MAAM,gBAAgB,UAAU,CAAC,EAAE,MAAM,GAAG;GACzD,OAAO,IAAI,eAAe,IAAI,IAAI;EACtC;CACJ;CACA,OAAO;AACX;;;AC/fA,IAAM,wCAAwB,IAAI,IAA2D;AAmB7F,SAAgB,uBAAoD;CAEhE,MAAM,0BAA0B,EAC5B,MACA,SACA,cACA,WAOE;EACF,sBAAsB,IAClB,eAAe,MAAM,OAAO,GAC5B;GACI;GACA;EACJ,CAAC;CACT;CAEA,MAAM,uBAAuB,MACzB,YAAgC;EAChC,OAAO,sBAAsB,IAAI,eAAe,MAAM,OAAO,CAAC;CAClE;CAEA,OAAO;EACH;EACA;CACJ;AACJ;AAEA,SAAS,eAAe,MAAc,SAA6B;CAE/D,IAAI,CAAC,SACD,OAAO;CASX,OAAO,GAAG,KAAK,GALO,UAAU,OAAO,KAAK,OAAO,EAAE,KAAI,QAAO;EAE5D,OAAO,GAAG,IAAI,GADA,KAAK,UAAU,QAAQ,IACpB;CACrB,CAAC,EAAE,KAAK,GAAG,IAAI;AAGnB;;;AC9DA,SAAgB,aAAa,MAAyB;CAClD,QAAQ,MAAR;EACI,KAAK,MACD,OAAO;EACX,KAAK,KACD,OAAO;EACX,KAAK,KACD,OAAO;EACX,KAAK,KACD,OAAO;EACX,KAAK,MACD,OAAO;EACX,SACI,MAAM,MAAM,+CAA+C;CACnE;AACJ;;;ACfA,SAAgB,eAAe;CAC3B,MAAM,EAAE,MAAM,eAAe;CAE7B,OACI,oBAAC,OAAD;EAAK,WAAU;YACX,qBAAC,OAAD;GAAK,WAAU;aAAf;IAEI,oBAAC,YAAD;KAAY,SAAS;KAAM,OAAO;KAC9B,cAAc;eACb,EAAE,gBAAgB;IACX,CAAA;IACZ,oBAAC,YAAD;KAAY,OAAO;KAAU,cAAc;eACtC,EAAE,qBAAqB;IAChB,CAAA;IACZ,oBAAC,QAAD;KACI,SAAS;KACT,WAAW;KACX,IAAI;eAAM,EAAE,cAAc;IAAU,CAAA;GACvC;;CACJ,CAAA;AAEb;;;ACrBA,SAAgB,mBAAmB,EAC/B,MACA,UACA,UACA,OACA,SACA,QAQD;CACC,MAAM,EAAE,MAAM,eAAe;CAC7B,OACI,qBAAC,QAAD;EACU;EACN,eAAe,SAAS,CAAC,OAAO,SAAS,IAAI,KAAA;YAFjD;GAII,oBAAC,aAAD;IAAa,SAAS;IAAM,WAAW;cAAS;GAAmB,CAAA;GACnE,oBAAC,eAAD,EAAA,UACK,KACU,CAAA;GAEf,qBAAC,eAAD,EAAA,UAAA,CACI,oBAAC,QAAD;IACI,SAAS;IACT,SAAS;IACT,WAAA;cAAW,EAAE,QAAQ;GAAU,CAAA,GAEnC,oBAAC,eAAD;IACI,MAAK;IACI;IACT,SAAS;IACT,WAAA;cACC,EAAE,IAAI;GACI,CAAA,CACJ,EAAA,CAAA;EACX;;AAEhB;;;AC7CA,SAAgB,WAAW,EACvB,OACA,QACA,WACA,SAMD;CACC,OACI,qBAAC,OAAD;EACI,OAAO,SAAS;EAAQ,QAAQ,UAAU;EAC1C,SAAQ;EACD;EACI;EACX,SAAQ;EAAc,MAAK;EAAO,OAAM;YAL5C;GAMI,oBAAC,UAAD;IAAQ,IAAG;IAAQ,IAAG;IAAQ,GAAE;IAAQ,MAAK;GAAU,CAAA;GACvD,oBAAC,WAAD;IAAS,IAAG;IAAM,IAAG;IAAQ,IAAG;IAAM,IAAG;IAAQ,MAAK;GAAU,CAAA;GAChE,oBAAC,QAAD;IACI,GAAE;IACF,MAAK;GAAU,CAAA;EAClB;;AAGb;;;;;;;AChBA,SAAgB,OAAO,EAAE,OAAO,SAAS,aAA0B;CAS/D,OACI,oBAAC,WAAD;EACI,MAJY,OAAO,SAAS,WAAW;GAL3C,UAAU;GACV,OAAO;GACP,QAAQ;GACR,OAAO;EAEoC,EAAQ,SAAS,KAAK;EAKlD;EACX,OAAO;GACH,YAAY;GACZ,sBAAsB;GACtB,qBAAqB;GACrB,gBAAgB;EACpB;CACH,CAAA;AAET;;;;;AAMA,SAAgB,oBAAoB,EAAE,aAAqC;CACvE,OACI,oBAAC,OAAD;EACI,WAAW,iFAAiF,aAAa;EACzG,OAAM;CACT,CAAA;AAET;;;AC1CA,IAAa,qBAAqB;CAC9B,MAAM,qBAAqB;EACvB;EAAM;EAAM;EAAM;EAAM;EAAM;EAC9B;EAAa;EACb;EAAS;EACT;EAAW;EAAS;CACxB;CAEA,MAAM,SAAS;EAAC;EAAW;EAAa;EAAY;CAAO;CAC3D,MAAM,iBAAiB,CAAC,UAAU,MAAM;CACxC,MAAM,eAAe;EAAC;EAAW;EAAa;EAAQ;EAAS;CAAS;CACxE,MAAM,cAAc;EAAC;EAAS;EAAU;EAAS;EAAM;CAAK;CAE5D,MAAM,oBACF,oBAAC,OAAD;EAAK,WAAU;EAAU,MAAK;EAAO,QAAO;EAAe,SAAQ;YAC/D,oBAAC,QAAD;GAAM,eAAc;GAAQ,gBAAe;GAAQ,aAAa;GAAG,GAAE;EAA6B,CAAA;CACjG,CAAA;CAGT,OACI,qBAAC,WAAD;EAAW,WAAU;YAArB;GACI,oBAAC,YAAD;IAAY,SAAQ;IAAK,cAAA;cAAa;GAAiC,CAAA;GACvE,oBAAC,YAAD;IAAY,SAAQ;IAAQ,OAAM;IAAY,WAAU;cAAO;GAEnD,CAAA;GAEZ,qBAAC,WAAD;IAAS,WAAU;cAAnB,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAK,cAAA;KAAa,WAAU;eAAqB;IAA+B,CAAA,GACpG,oBAAC,OAAD;KAAO,WAAU;eACZ,mBAAmB,KAAI,YACpB,qBAAC,OAAD;MAAmB,WAAU;gBAA7B,CACI,oBAAC,QAAD;OAAM,WAAU;iBAA0E;MAAc,CAAA,GACxG,qBAAC,YAAD;OAAqB;iBAArB;QAA8B;QACoB;QAAQ;OAC9C;QACX;QALK,OAKL,CACR;IACE,CAAA,CACF;;GAET,qBAAC,WAAD;IAAS,WAAU;cAAnB,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAK,cAAA;KAAa,WAAU;eAAqB;IAA6B,CAAA,GAClG,oBAAC,OAAD;KAAO,WAAU;eACZ,OAAO,KAAI,UACR,qBAAC,OAAD;MAAiB,WAAU;gBAA3B,CACI,oBAAC,QAAD;OAAM,WAAU;iBAA0E;MAAY,CAAA,GACtG,qBAAC,YAAD;OAAmB;iBAAnB;QAA0B;QACkB;QAAM;OACtC;QACX;QALK,KAKL,CACR;IACE,CAAA,CACF;;GAET,qBAAC,WAAD;IAAS,WAAU;cAAnB,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAK,cAAA;KAAa,WAAU;eAAqB;IAA4B,CAAA,GAEjG,oBAAC,OAAD;KAAK,WAAU;eACV,eAAe,KAAI,YAChB,qBAAC,OAAD,EAAA,UAAA,CACI,qBAAC,YAAD;MAAY,SAAQ;MAAK,cAAA;MAAa,WAAU;gBAAhD,CAAmE,SAAQ,UAAoB;SAC/F,oBAAC,OAAD;MAAO,WAAU;gBACb,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACK,aAAa,KAAI,UACd,qBAAC,OAAD;QAAiB,WAAU;kBAA3B,CACI,oBAAC,QAAD;SAAiB;SAAgB;mBAC5B;QACG,CAAA,GACR,oBAAC,QAAD;SAAM,WAAU;mBAA4C;QAAY,CAAA,CACvE;UALK,KAKL,CACR,GACD,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,QAAD;SAAiB;SAAS,OAAM;SAAU,UAAA;mBAAS;QAE3C,CAAA,GACR,oBAAC,QAAD;SAAM,WAAU;mBAA2C;QAAc,CAAA,CACxE;SACJ;;KACF,CAAA,CACN,EAAA,GApBK,OAoBL,CACR;IACA,CAAA,CACA;;GAET,qBAAC,WAAD;IAAS,WAAU;cAAnB,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAK,cAAA;KAAa,WAAU;eAAqB;IAAwB,CAAA,GAC7F,oBAAC,OAAD;KAAO,WAAU;eACb,oBAAC,OAAD;MAAK,WAAU;gBACV,YAAY,KAAI,SACb,qBAAC,OAAD;OAAgB,WAAU;iBAA1B,CACI,oBAAC,QAAD;QAAc;QAAM,OAAM;kBACrB;OACG,CAAA,GACR,oBAAC,QAAD;QAAM,WAAU;kBAA4C;OAAW,CAAA,CACtE;SALK,IAKL,CACR;KACA,CAAA;IACF,CAAA,CACF;;GAET,qBAAC,WAAD;IAAS,WAAU;cAAnB,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAK,cAAA;KAAa,WAAU;eAAqB;IAAwB,CAAA,GAC7F,oBAAC,OAAD;KAAO,WAAU;eACb,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACI,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,YAAD;SAAY,OAAM;mBACd,oBAAC,aAAD,CAAa,CAAA;QACL,CAAA,GACZ,oBAAC,QAAD;SAAM,WAAU;mBAA2C;QAAa,CAAA,CACvE;;OACL,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,YAAD;SAAY,OAAM;mBACd,oBAAC,aAAD,CAAa,CAAA;QACL,CAAA,GACZ,oBAAC,QAAD;SAAM,WAAU;mBAA2C;QAAe,CAAA,CACzE;;OACL,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,YAAD;SAAY,MAAK;mBACb,oBAAC,aAAD,CAAa,CAAA;QACL,CAAA,GACZ,oBAAC,QAAD;SAAM,WAAU;mBAA2C;QAAW,CAAA,CACrE;;OACL,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,YAAD;SAAY,UAAA;mBACR,oBAAC,aAAD,CAAa,CAAA;QACL,CAAA,GACZ,oBAAC,QAAD;SAAM,WAAU;mBAA2C;QAAc,CAAA,CACxE;;OACL,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,YAAD;SAAY,MAAK;SAAQ,OAAM;mBAC3B,oBAAC,YAAD,CAAY,CAAA;QACJ,CAAA,GACZ,oBAAC,QAAD;SAAM,WAAU;mBAA2C;QAAY,CAAA,CACtE;;MACJ;;IACF,CAAA,CACF;;GAET,oBAAC,WAAD;IAAS,WAAU;cACf,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;MAAY,SAAQ;gBAAK;KAA2B,CAAA,GACpD,oBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;gBAAY;KAA8D,CAAA,CAC3G,EAAA,CAAA,GACL,oBAAC,QAAD;MAAQ,SAAQ;MAAS,OAAM;MAAU,WAAW,oBAAC,aAAD,CAAa,CAAA;gBAAG;KAE5D,CAAA,CACP;;GACA,CAAA;EACF;;AAEnB;;;AC3HA,SAAgB,iBAAiB,EAC7B,SACA,UACA,iBACA,gBACsB;CACtB,OACI,qBAAC,OAAD;EAAK,WAAU;YAAf;GAEI,oBAAC,MAAD;IAAM,WAAU;cACZ,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,OAAD;MAAK,WAAU;gBACX,oBAAC,OAAD,EAAW,WAAU,UAAW,CAAA;KAC/B,CAAA,GACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAA0C;MAAuB,CAAA,GAC1H,UACG,oBAAC,UAAD,EAAU,WAAU,kBAAmB,CAAA,IAEvC,oBAAC,YAAD;OAAY,SAAQ;OAAK,WAAU;iBAC9B;MACO,CAAA,CAEf;OACJ;;GACH,CAAA;GAGN,oBAAC,MAAD;IAAM,WAAU;cACZ,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,OAAD;MAAK,WAAU;gBACX,oBAAC,YAAD,EAAY,WAAU,UAAW,CAAA;KAChC,CAAA,GACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAA0C;MAA0B,CAAA,GAC7H,UACG,oBAAC,UAAD,EAAU,WAAU,kBAAmB,CAAA,IAEvC,oBAAC,YAAD;OAAY,SAAQ;OAAK,WAAU;iBAC9B,UAAU,iBAAiB;MACpB,CAAA,CAEf;OACJ;;GACH,CAAA;GAGN,oBAAC,MAAD;IAAM,WAAU;cACZ,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,OAAD;MAAK,WAAU;gBACX,oBAAC,YAAD,EAAgB,WAAU,UAAW,CAAA;KACpC,CAAA,GACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAA0C;MAAmB,CAAA,GACtH,UACG,oBAAC,UAAD,EAAU,WAAU,kBAAmB,CAAA,IAEvC,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACI,qBAAC,YAAD;QAAY,SAAQ;QAAK,WAAU;kBAAnC,CAAkD,KAC5C,aAAa,eAAe,CACtB;WACX,YAAY,SAAS,oBAAoB,KACtC,qBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAA1D;SAAwE;SACjE,SAAS,kBAAkB,eAAe;SAAE;QACvC;SAEf;QAER;OACJ;;GACH,CAAA;GAGN,oBAAC,MAAD;IAAM,WAAU;cACZ,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,OAAD;MAAK,WAAW,IACZ,4CACA,YAAY,SAAS,mBAAmB,IAClC,iBACA,wCACV;gBACI,oBAAC,eAAD,EAAe,WAAU,UAAW,CAAA;KACnC,CAAA,GACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAA0C;MAAyB,CAAA,GAC5H,UACG,oBAAC,UAAD,EAAU,WAAU,iBAAkB,CAAA,IAEtC,oBAAC,YAAD;OAAY,SAAQ;OAAK,WAAW,IAChC,uBACA,YAAY,SAAS,mBAAmB,KAAK,gCACjD;iBACK,UAAU,oBAAoB;MACvB,CAAA,CAEf;OACJ;;GACH,CAAA;EACL;;AAEb;;;AC7EA,SAAgB,iBAAiB,EAC7B,SACA,UACA,oBACA,kBACA,YACA,cACA,cACA,cACA,iBACA,gBACsB;CACtB,MAAM,iBAAiB,aAAa,SAAS;CAC7C,MAAM,cAAc,aAAa,SAAS;CAE1C,OACI,qBAAC,MAAD;EAAM,WAAU;YAAhB,CACI,qBAAC,OAAD;GAAK,WAAU;aAAf,CACI,qBAAC,OAAD;IAAK,WAAU;cAAf,CACI,qBAAC,YAAD;KAAY,SAAQ;eAApB,CAAgC,YACnB,CAAC,WAAW,kBAAkB,IAAI,KAAK,gBAAgB,aAAa,EACrE;QAGX,YAAY,SAAS,UAAU,SAAS,KACrC,oBAAC,QAAD;KACI,OAAO,sBAAsB;KAC7B,gBAAgB,MAAM,iBAAiB,CAAW;KAClD,MAAK;KACL,cAAc,MAAM;MAChB,MAAM,WAAW,SAAS,UAAU,MAAK,MAAK,EAAE,OAAO,CAAC;MACxD,OAAO,WAAW,SAAS,OAAO;KACtC;KACA,UAAS;eAER,SAAS,UAAU,KAAI,MACpB,oBAAC,YAAD;MAAuB,OAAO,EAAE;gBAC3B,EAAE;KACK,GAFK,EAAE,EAEP,CACf;IACG,CAAA,CAEX;OACL,oBAAC,QAAD;IACI,SAAQ;IACR,MAAK;IACL,eAAe;KAAE,WAAW,gBAAgB;IAAG;IAC/C,SAAS,oBAAC,cAAD,EAAc,WAAU,UAAW,CAAA;cAC/C;GAEO,CAAA,CACP;MAEJ,UACG,oBAAC,UAAD,EAAU,WAAU,yBAA0B,CAAA,IAC9C,YAAY,aAAa,WAAW,IAEpC,qBAAC,OAAD;GAAK,WAAU;aAAf;IACI,oBAAC,OAAD;KAAK,WAAU;eACX,oBAAC,UAAD,EAAU,WAAU,UAAW,CAAA;IAC9B,CAAA;IACL,oBAAC,YAAD;KAAY,SAAQ;KAAQ,OAAM;KAAY,WAAU;eAAO;IAEnD,CAAA;IACZ,oBAAC,YAAD;KAAY,SAAQ;KAAU,OAAM;KAAW,WAAU;eAAmB;IAEhE,CAAA;IACZ,oBAAC,QAAD;KACI,SAAQ;KACR,MAAK;KACL,eAAe,WAAW,mBAAmB;eAChD;IAEO,CAAA;GACP;OACL,YAAY,oBAAoB,IAEhC,qBAAC,OAAD;GAAK,WAAU;aAAf;IACI,oBAAC,OAAD;KAAK,WAAU;eACX,oBAAC,OAAD,EAAW,WAAU,UAAW,CAAA;IAC/B,CAAA;IACL,oBAAC,YAAD;KAAY,SAAQ;KAAQ,OAAM;KAAY,WAAU;eAAO;IAEnD,CAAA;IACZ,oBAAC,YAAD;KAAY,SAAQ;KAAU,OAAM;KAAW,WAAU;eAAO;IAEpD,CAAA;GACX;OACL,WAEA,qBAAC,OAAD;GAAK,WAAU;aAAf,CACK,eACG,qBAAA,UAAA,EAAA,UAAA,CACI,oBAAC,OAAD,EAAK,WAAU,4IAA6I,CAAA,GAC5J,oBAAC,OAAD,EAAK,WAAU,6IAA8I,CAAA,CAC/J,EAAA,CAAA,GAEN,qBAAC,OAAD;IAAK,WAAW,IACZ,4BACA,eAAe,iBACnB;cAHA;KAKK,aAAa,KAAK,OAAO,QAAQ;MAC9B,MAAM,UAAU,MAAM,UAAU;MAChC,MAAM,eAAe,kBAAkB,IACjC,KAAK,IAAI,GAAI,MAAM,QAAQ,kBAAmB,GAAG,IACjD,MAAM,KAAK,IAAI,aAAa,QAAQ,CAAC;MAC3C,MAAM,aAAa,aAAa,MAAM,KAAK;MAC3C,MAAM,eAAe,iBAAiB,MAAM,aAAa,MAAM;MAE/D,OACI,qBAAC,MAAM,UAAP,EAAA,UAAA,CACK,MAAM,KACH,oBAAC,OAAD;OAAK,WAAU;iBACX,oBAAC,cAAD,EAAc,WAAU,UAAW,CAAA;MAClC,CAAA,GAET,oBAAC,SAAD;OAAS,OAAO,GAAG,MAAM,MAAM,KAAK,MAAM,MAAM,SAAS,MAAM,UAAU,IAAI,MAAM;iBAC/E,qBAAC,OAAD;QACI,WAAW,IACP,6HACA,yDACA,UACM,yCACA,0CACV;QACA,OAAO,EAAE,MAAM,GAAG,aAAa,OAAO;QACtC,eAAe,WAAW,wBAAwB,MAAM,UAAU;kBATtE,CAWI,oBAAC,YAAD;SACI,SAAQ;SACR,WAAW,IACP,2CACA,WAAW,YACf;mBAEC,MAAM;QACC,CAAA,GACZ,qBAAC,OAAD;SAAK,WAAU;mBAAf,CACI,oBAAC,QAAD;UACI,WAAU;UACV,OAAO;WACH,iBAAiB;WACjB,SAAS,UAAU,MAAO;UAC9B;SACH,CAAA,GACD,oBAAC,YAAD;UACI,SAAQ;UACR,OAAM;UACN,WAAW,IACP,iCACA,WAAW,YACf;oBAEC;SACO,CAAA,CACX;UACJ;;MACA,CAAA,CACG,EAAA,GAhDK,MAAM,QAgDX;KAExB,CAAC;KAGA,aAAa,SAAS,KAAK,aAAa,SAAS,KAC9C,oBAAC,OAAD;MAAK,WAAU;gBACX,oBAAC,OAAD,EAAK,WAAU,8CAA+C,CAAA;KAC7D,CAAA;KAIR,aAAa,KAAK,OAAO,QAAQ;MAC9B,MAAM,UAAU,MAAM,UAAU;MAChC,MAAM,aAAa,aAAa,MAAM,KAAK;MAC3C,MAAM,eAAe,iBAAiB,MAAM,aAAa,MAAM;MAE/D,OACI,qBAAC,MAAM,UAAP,EAAA,UAAA,CACK,MAAM,KACH,oBAAC,OAAD;OAAK,WAAU;iBACX,oBAAC,cAAD,EAAc,WAAU,UAAW,CAAA;MAClC,CAAA,GAET,oBAAC,SAAD;OAAS,OAAO,GAAG,MAAM,MAAM,KAAK,MAAM,MAAM,SAAS,MAAM,UAAU,IAAI,MAAM;iBAC/E,qBAAC,OAAD;QACI,WAAW,IACP,6HACA,yDACA,cACA,UACM,yCACA,0CACV;QACA,OAAO,EAAE,MAAM,WAAW;QAC1B,eAAe,WAAW,wBAAwB,MAAM,UAAU;kBAVtE,CAYI,oBAAC,YAAD;SACI,SAAQ;SACR,WAAW,IACP,2CACA,WAAW,YACf;mBAEC,MAAM;QACC,CAAA,GACZ,qBAAC,OAAD;SAAK,WAAU;mBAAf,CACI,oBAAC,QAAD;UACI,WAAU;UACV,OAAO;WACH,iBAAiB;WACjB,SAAS,UAAU,MAAO;UAC9B;SACH,CAAA,GACD,oBAAC,YAAD;UACI,SAAQ;UACR,OAAM;UACN,WAAW,IACP,iCACA,WAAW,YACf;oBAEC;SACO,CAAA,CACX;UACJ;;MACA,CAAA,CACG,EAAA,GAjDK,MAAM,QAiDX;KAExB,CAAC;IACA;KACJ;OACL,IACF;;AAEd;;;ACrQA,IAAM,iBAAkD;CACpD,UAAmB,oBAAC,WAAD,EAAW,WAAU,wBAAyB,CAAA;CACjE,gBAAmB,oBAAC,gBAAD,EAAgB,WAAU,0BAA2B,CAAA;CACxE,YAAmB,oBAAC,MAAD,EAAM,WAAU,uBAAwB,CAAA;CAC3D,iBAAmB,oBAAC,UAAD,EAAU,WAAU,yBAA0B,CAAA;CACjE,mBAAmB,oBAAC,SAAD,EAAS,WAAU,2BAA4B,CAAA;CAClE,YAAmB,oBAAC,OAAD,EAAO,WAAU,wBAAyB,CAAA;CAC7D,gBAAmB,oBAAC,eAAD,EAAe,WAAU,yBAA0B,CAAA;CACtE,MAAmB,oBAAC,YAAD,EAAY,WAAU,0BAA2B,CAAA;CACpE,cAAmB,oBAAC,UAAD,EAAU,WAAU,wBAAyB,CAAA;CAChE,gBAAmB,oBAAC,cAAD,EAAc,WAAU,2BAA4B,CAAA;CACvE,eAAmB,oBAAC,QAAD,EAAQ,WAAU,0BAA2B,CAAA;AACpE;AAGA,SAAS,aAAa,SAAyB;CAC3C,MAAM,MAAM,KAAK,IAAI;CACrB,MAAM,OAAO,IAAI,KAAK,OAAO,EAAE,QAAQ;CACvC,MAAM,UAAU,KAAK,OAAO,MAAM,QAAQ,GAAI;CAC9C,IAAI,UAAU,IAAI,OAAO;CACzB,MAAM,UAAU,KAAK,MAAM,UAAU,EAAE;CACvC,IAAI,UAAU,IAAI,OAAO,GAAG,QAAQ;CACpC,MAAM,SAAS,KAAK,MAAM,UAAU,EAAE;CACtC,IAAI,SAAS,IAAI,OAAO,GAAG,OAAO;CAClC,MAAM,UAAU,KAAK,MAAM,SAAS,EAAE;CACtC,IAAI,UAAU,GAAG,OAAO,GAAG,QAAQ;CACnC,OAAO,IAAI,KAAK,OAAO,EAAE,mBAAmB,SAAS;EAAE,OAAO;EAAS,KAAK;CAAU,CAAC;AAC3F;AAkBA,SAAgB,eAAe,EAC3B,YACA,mBACA,UACA,gBACA,aACA,YACA,iBACA,yBACA,iBACoB;CACpB,OACI,qBAAA,UAAA,EAAA,UAAA,CACI,qBAAC,MAAD;EAAM,WAAU;YAAhB,CACI,oBAAC,YAAD;GAAY,SAAQ;GAAY,WAAU;aAAO;EAA2B,CAAA,GAE3E,oBACG,oBAAC,OAAD;GAAK,WAAU;aACV,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,GAAG,MAC/B,qBAAC,OAAD;IAAa,WAAU;cAAvB,CACI,oBAAC,UAAD,EAAU,WAAU,gCAAiC,CAAA,GACrD,oBAAC,UAAD,EAAU,WAAU,aAAc,CAAA,CACjC;MAHK,CAGL,CACR;EACA,CAAA,IACL,WAAW,WAAW,IACtB,oBAAC,OAAD;GAAK,WAAU;aACX,oBAAC,YAAD;IAAY,SAAQ;IAAQ,OAAM;cAAY;GAElC,CAAA;EACX,CAAA,IAEL,oBAAC,OAAD;GAAK,WAAU;aACV,WAAW,KAAK,UAAe,QAAgB;IAC5C,MAAM,UAAU,SAAS,QAAQ;IACjC,MAAM,SAAS,SAAS,QAAQ,UAAU;IAC1C,MAAM,cAAc,SAAS,SAAS,IAAI,MAAM,IAAI;IACpD,MAAM,iBAAiB,YAAY,kBAAkB,YAAY;IACjE,MAAM,kBAAkB,YAAY;IAEpC,OACI,qBAAC,MAAM,UAAP,EAAA,UAAA,CACK,MAAM,KAAK,oBAAC,WAAD;KAAW,aAAY;KAAa,WAAU;IAAQ,CAAA,GAClE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,QAAD;MAAM,WAAU;gBACX,eAAe,YAAY,oBAAC,KAAD,EAAK,WAAU,iDAAkD,CAAA;KAC3F,CAAA,GACN,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACI,oBAAC,YAAD;QAAY,SAAQ;QAAQ,WAAU;kBACjC,SAAS,QAAQ,eAAe,WAAW;OACpC,CAAA;OACX,SAAS,QAAQ,aACd,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBACrD,aAAa,SAAS,OAAO,SAAS;OAC/B,CAAA;OAGhB,qBAAC,OAAD;QAAK,WAAU;kBAAf;SAEK,kBAAkB,eAAe,YAAY,QAAQ,WAAW,eAC7D,oBAAC,QAAD;UACI,SAAQ;UACR,MAAK;UACL,OAAM;UACN,WAAU;UACV,eAAe,eAAe,QAAQ;oBACzC;SAEO,CAAA;SAGX,mBACG,oBAAC,QAAD;UACI,SAAQ;UACR,MAAK;UACL,OAAM;UACN,WAAU;UACV,eAAe,YAAY,QAAQ;oBACtC;SAEO,CAAA;SAGX,kBAAkB,UACf,oBAAC,QAAD;UACI,SAAQ;UACR,MAAK;UACL,OAAM;UACN,WAAU;UACV,eAAe,WAAW,QAAQ;oBACrC;SAEO,CAAA;QAEX;;MACJ;OACJ;MACO,EAAA,GAxDK,SAAS,EAwDd;GAExB,CAAC;EACA,CAAA,CAEP;KAGN,qBAAC,QAAD;EACI,MAAM;EACN,cAAc;EACd,UAAS;YAHb;GAKI,oBAAC,aAAD,EAAA,UAAc,eAAe,WAAW,QAAqB,CAAA;GAC7D,oBAAC,eAAD,EAAA,UACK,iBACG,qBAAC,OAAD;IAAK,WAAU;cAAf;KACI,qBAAC,YAAD;MAAY,SAAQ;MAAU,OAAM;gBAApC,CAAgD,QACvC,cAAc,EACX;;KACX,cAAc,OACX,oBAAC,OAAD;MACI,WAAU;MACV,yBAAyB,EAAE,QAAQ,cAAc,KAAK;KACzD,CAAA,IAED,oBAAC,YAAD;MAAY,SAAQ;MAAQ,WAAU;gBACjC,cAAc;KACP,CAAA;KAEf,cAAc,SAAS,eACpB,oBAAC,YAAD;MAAY,SAAQ;MAAU,OAAM;MAAY,WAAU;gBAAoB;KAElE,CAAA;IAEf;MAEE,CAAA;GACf,oBAAC,eAAD,EAAA,UACI,oBAAC,QAAD;IAAQ,SAAQ;IAAO,eAAe,wBAAwB,KAAK;cAAG;GAAa,CAAA,EACxE,CAAA;EACX;GACV,EAAA,CAAA;AAEV;;;AC5KA,SAAgB,YAAY,EACxB,aACA,qBACA,aACA,qBACA,cACA,sBACA,YACA,oBACA,iBACA,mBACA,cACA,cACA,aACA,kBACA,aACA,iBACA,cACiB;CACjB,OACI,qBAAA,UAAA,EAAA,UAAA,CAEI,qBAAC,OAAD;EAAK,WAAU;YAAf,CACI,qBAAC,OAAD;GAAK,WAAU;aAAf;IACI,oBAAC,OAAD;KAAK,WAAU;eACX,oBAAC,UAAD,EAAU,WAAU,UAAW,CAAA;IAC9B,CAAA;IACL,oBAAC,YAAD;KAAY,SAAQ;eAAY;IAAiB,CAAA;IAChD,aAAa,SAAS,KACnB,qBAAC,MAAD;KAAM,MAAK;KAAW,aAAY;eAAlC,CACK,aAAa,QAAQ,kBAAkB,WAAW,UACjD;;GAET;MACJ,aAAa,SAAS,KACnB,qBAAC,MAAD;GAAM,MAAK;GAAW,aAAY;aAAlC,CACK,aAAa,QAAO,UACnB;IAET;KAGL,qBAAC,OAAD;EAAK,WAAU;YAAf,CAEI,qBAAC,OAAD;GAAK,WAAU;aAAf;IACI,oBAAC,YAAD;KACI,QAAQ,gBAAgB,SAAS,CAAC,eAAe,CAAC;KAClD,eAAe;MAAE,oBAAoB,KAAK;MAAG,oBAAoB,IAAI;MAAG,qBAAqB,IAAI;KAAG;KACpG,MAAK;eACR;IAEW,CAAA;IACZ,qBAAC,YAAD;KACI,QAAQ,gBAAgB;KACxB,eAAe;MAAE,oBAAoB,gBAAgB,YAAY,QAAQ,SAAS;KAAG;KACrF,MAAK;KACL,MAAM,oBAAC,eAAD,EAAe,WAAU,UAAW,CAAA;eAJ9C,CAKC,WACW,aAAa,SAAS,IAAI,KAAK,aAAa,OAAO,KAAK,EACxD;;IAGX,mBACG,oBAAC,QAAD;KACI,SAAQ;KACR,MAAK;KACL,OAAM;KACN,WAAU;KACV,SAAS;KACT,WAAW,oBAAC,GAAD,EAAG,WAAU,UAAW,CAAA;eACtC;IAEO,CAAA;GAEX;MAGL,qBAAC,OAAD;GAAK,WAAU;aAAf;IACI,oBAAC,OAAD;KAAK,WAAU;eACX,oBAAC,WAAD;MACI,eAAe,MAAM;OAAE,mBAAmB,KAAK,EAAE;MAAG;MACpD,aAAY;MACZ,MAAK;MACL,WAAU;KACb,CAAA;IACA,CAAA;IAGL,qBAAC,QAAD;KACI,OAAO,eAAe;KACtB,gBAAgB,MAAM;MAAE,oBAAoB,MAAM,YAAY,OAAO,CAAW;KAAG;KACnF,aAAY;KACZ,MAAK;KACL,cAAc,MAAM;MAChB,IAAI,CAAC,KAAK,MAAM,WAAW,OAAO;MAClC,OAAO,YAAY,MAAgB;KACvC;KACA,UAAS;eATb,CAWI,oBAAC,YAAD;MAAY,OAAO;gBAAW;KAAsB,CAAA,GACnD,iBACI,QAAO,YAAW,YAAY,WAAW,CAAC,EAC1C,KAAI,YACD,qBAAC,YAAD;MAA0B,OAAO;gBAAjC,CACK,YAAY,YAAY,SACxB,YAAY,WAAW,IAAI,KAAK,YAAY,SAAS,KAAK,EACnD;QAHK,OAGL,CACf,CAED;;IAGP,gBAAgB,SAAS,KACtB,qBAAC,QAAD;KACI,OAAO,gBAAgB;KACvB,gBAAgB,MAAM;MAAE,qBAAqB,MAAM,YAAY,OAAO,CAAW;KAAG;KACpF,aAAY;KACZ,MAAK;KACL,cAAc,MAAM;MAChB,IAAI,CAAC,KAAK,MAAM,WAAW,OAAO;MAElC,OADa,WAAW,IAAI,CACrB,GAAM,QAAQ;KACzB;KACA,UAAS;eAVb,CAYI,oBAAC,YAAD;MAAY,OAAO;gBAAW;KAAuB,CAAA,GACpD,gBAAgB,KAAI,QAAO;MACxB,MAAM,OAAO,WAAW,IAAI,GAAG;MAC/B,IAAI,CAAC,MAAM,OAAO;MAClB,OACI,oBAAC,YAAD;OAAsB,OAAO;iBACxB,KAAK;MACE,GAFK,GAEL;KAEpB,CAAC,CACG;;GAEX;IACJ;GACP,EAAA,CAAA;AAEV;;;AC3HA,IAAa,oBAA4E;CACrF,UAAU;EAAE,OAAO;EAAY,aAAa;CAAQ;CACpD,gBAAgB;EAAE,OAAO;EAAmB,aAAa;CAAQ;CACjE,UAAU;EAAE,OAAO;EAAY,aAAa;CAAQ;CACpD,WAAW;EAAE,OAAO;EAAa,aAAa;CAAM;CACpD,mBAAmB;EAAE,OAAO;EAAqB,aAAa;CAAQ;CACtE,eAAe;EAAE,OAAO;EAAkB,aAAa;CAAO;CAC9D,UAAU;EAAE,OAAO;EAAY,aAAa;CAAQ;CACpD,aAAa;EAAE,OAAO;EAAe,aAAa;CAAQ;CAC1D,iBAAiB;EAAE,OAAO;EAAmB,aAAa;CAAQ;CAClE,QAAQ;EAAE,OAAO;EAAU,aAAa;CAAQ;CAChD,eAAe;EAAE,OAAO;EAAiB,aAAa;CAAO;CAC7D,mBAAmB;EAAE,OAAO;EAAqB,aAAa;CAAQ;CACtE,kBAAkB;EAAE,OAAO;EAAoB,aAAa;CAAQ;CACpE,MAAM;EAAE,OAAO;EAAQ,aAAa;CAAQ;CAC5C,WAAW;EAAE,OAAO;EAAa,aAAa;CAAQ;CACtD,SAAS;EAAE,OAAO;EAAW,aAAa;CAAQ;CAClD,WAAW;EAAE,OAAO;EAAa,aAAa;CAAQ;CACtD,mBAAmB;EAAE,OAAO;EAAqB,aAAa;CAAQ;CACtE,mBAAmB;EAAE,OAAO;EAAqB,aAAa;CAAQ;CACtE,UAAU;EAAE,OAAO;EAAY,aAAa;CAAQ;CACpD,MAAM;EAAE,OAAO;EAAQ,aAAa;CAAQ;AAChD;AAIA,SAAS,cAAc,SAAuC;CAC1D,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,IAAI,IAAI,KAAK,OAAO;CAC1B,IAAI,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO;CAC/B,MAAM,sBAAM,IAAI,KAAK;CACrB,MAAM,QAAQ,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,CAAC;CAEvE,MAAM,SAAS,IADI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAClD,EAAO,QAAQ,IAAI,MAAM,QAAQ;CAChD,MAAM,WAAW,KAAK,MAAM,UAAU,MAAO,KAAK,KAAK,GAAG;CAE1D,IAAI,aAAa,GAAG,OAAO;CAC3B,IAAI,aAAa,GAAG,OAAO;CAC3B,IAAI,aAAa,IAAI,OAAO;CAC5B,IAAI,WAAW,GAAG,OAAO,GAAG,KAAK,IAAI,QAAQ,EAAE;CAC/C,IAAI,YAAY,GAAG,OAAO,MAAM,SAAS;CACzC,OAAO,EAAE,mBAAmB,SAAS;EAAE,OAAO;EAAS,KAAK;CAAU,CAAC;AAC3E;AAEA,SAAS,mBAAiB,SAAiC;CACvD,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,IAAI,IAAI,KAAK,OAAO;CAC1B,IAAI,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO;CAC/B,MAAM,sBAAM,IAAI,KAAK;CAErB,OAAO,IAAI,IADO,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,CAC3D;AACf;AAEA,SAAS,cAAc,SAAiC;CACpD,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,IAAI,IAAI,KAAK,OAAO;CAC1B,IAAI,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO;CAC/B,MAAM,sBAAM,IAAI,KAAK;CACrB,MAAM,QAAQ,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,CAAC;CACvE,MAAM,SAAS,EAAE,QAAQ,IAAI,MAAM,QAAQ;CAC3C,MAAM,WAAW,KAAK,MAAM,UAAU,MAAO,KAAK,KAAK,GAAG;CAC1D,OAAO,YAAY,KAAK,YAAY;AACxC;AAIA,SAAgB,UAAU,EACtB,OACA,SACA,cACA,qBACA,gBACA,mBACA,cACA,aACA,cACA,YACA,cACA,YACA,aACA,oBACA,gBACA,iBACA,kBACA,kBACA,mBACA,uBACe;CAGf,MAAM,gBAAgB,aAAa,SAAqB;EACpD,MAAM,cAAc,KAAK,QAAQ,WAAW;EAC5C,MAAM,aAAa,YAAY,IAAI,KAAK,EAAE;EAC1C,MAAM,WAAW,cAAc,KAAK,QAAQ,OAAO;EACnD,MAAM,UAAU,CAAC,eAAe,mBAAiB,KAAK,QAAQ,OAAO;EACrE,MAAM,OAAO,CAAC,eAAe,cAAc,KAAK,QAAQ,OAAO;EAC/D,MAAM,YAAY,KAAK,QAAQ,UAAU,YAAY,KAAK,OAAO,WAAW;EAC5E,MAAM,aAAa,KAAK,QAAQ,WAAW,WAAW,IAAI,KAAK,OAAO,QAAQ,IAAI;EAClF,MAAM,aAAa,YAAY,QAAQ;EAEvC,OACI,qBAAC,OAAD;GAEI,WAAW,IACP,qGACA,yDACA,eAAe,cACf,WAAW,8CACX,QAAQ,CAAC,WAAW,8CACxB;GACA,eAAe,WAAW,KAAK,EAAE;aATrC,CAYI,oBAAC,OAAD;IACI,WAAU;IACV,UAAU,MAAM,EAAE,gBAAgB;cAElC,oBAAC,UAAD;KACI,SAAS;KACT,MAAK;KACL,uBAAuB;MACnB,IAAI,CAAC,YAAY,aAAa,KAAK,IAAI,KAAK,QAAQ,MAAM;KAC9D;IACH,CAAA;GACA,CAAA,GAGL,qBAAC,OAAD;IAAK,WAAU;cAAf,CACI,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,YAAD;MACI,SAAQ;MACR,WAAW,IACP,gBACA,eAAe,8DACnB;gBAEC,KAAK,QAAQ,SAAS;KACf,CAAA,GACX,KAAK,QAAQ,aAAa,UACvB,oBAAC,MAAD;MAAM,aAAY;MAAM,MAAK;gBAAW;KAAU,CAAA,CAErD;QAGL,qBAAC,OAAD;KAAK,WAAU;eAAf;MACK,YACG,qBAAC,QAAD;OAAM,WAAW,IACb,8CACA,WAAW,8CACX,QAAQ,CAAC,WAAW,kDACpB,CAAC,WAAW,CAAC,QAAQ,mDACzB;iBALA,CAMK,UACG,oBAAC,eAAD,EAAe,WAAU,UAAW,CAAA,IAEpC,oBAAC,UAAD,EAAU,WAAU,UAAW,CAAA,GAElC,QACC;;MAGT,cAAc,KAAK,QAAQ,YACxB,qBAAC,YAAD;OACI,SAAQ;OACR,WAAW,IACP,uEACA,mDACA,4CACJ;OACA,UAAU,MAAM;QACZ,EAAE,gBAAgB;QAClB,aAAa,KAAK,OAAO,QAAS;OACtC;iBAVJ,QAYY;QACJ,MAAM,YAAY,YAAY;QAC9B,MAAM,iBAAiB,cAAc,KAAK,GAAG,YAAY;QACzD,OAAO,YACH,oBAAC,OAAD;SAAK,KAAK;SAAW,KAAI;SAAG,WAAU;QAA8C,CAAA,IAEpF,oBAAC,OAAD;SAAK,WAAU;mBACX,oBAAC,QAAD;UAAM,WAAU;oBAA4B;SAAoB,CAAA;QAC/D,CAAA;OAEb,GAAG,GACF,UACO;;MAGf,aACG,oBAAC,MAAD;OAAM,MAAK;OAAW,aAAY;OAAO,UAAA;iBACpC;MACC,CAAA;MAIT,eAAe,KAAK,QAAQ,cAAc,kBAAkB,KAAK,OAAO,eACrE,oBAAC,MAAD;OACI,MAAK;OACL,aAAa,kBAAkB,KAAK,OAAO,YAAY;iBAEtD,kBAAkB,KAAK,OAAO,YAAY;MACzC,CAAA;KAET;MACJ;KACJ;KAxGI,KAAK,EAwGT;CAEb,GAAG;EAAC;EAAa;EAAc;EAAY;EAAc;EAAY;EAAoB;CAAW,CAAC;CAGrG,IAAI,SACA,OACI,oBAAC,OAAD;EAAK,WAAU;YACV;GAAC;GAAG;GAAG;GAAG;EAAC,EAAE,KAAI,MACd,qBAAC,OAAD;GAAa,WAAU;aAAvB,CACI,oBAAC,UAAD;IAAU,OAAO;IAAI,QAAQ;GAAK,CAAA,GAClC,qBAAC,OAAD;IAAK,WAAU;cAAf,CACI,oBAAC,UAAD;KAAU,OAAO;KAAK,QAAQ;IAAK,CAAA,GACnC,oBAAC,UAAD;KAAU,OAAO;KAAK,QAAQ;IAAK,CAAA,CAClC;KACJ;KANK,CAML,CACR;CACA,CAAA;CAIb,OACI,oBAAC,OAAD;EAAK,WAAU;YACV,MAAM,WAAW,IACd,qBAAC,MAAD;GAAM,WAAU;aAAhB;IACI,oBAAC,OAAD;KAAK,WAAU;eACX,oBAAC,cAAD,EAAc,WAAU,UAAW,CAAA;IAClC,CAAA;IACL,oBAAC,YAAD;KAAY,SAAQ;KAAY,WAAU;eAAO;IAErC,CAAA;IACZ,oBAAC,YAAD;KAAY,SAAQ;KAAQ,OAAM;eAAY;IAElC,CAAA;GACV;OAEN,qBAAC,OAAD;GAAK,WAAU;aAAf,CAEK,aAAa,SAAS,KACnB,qBAAC,OAAD;IAAK,WAAU;cAAf,CACK,oBAAoB,IAAI,aAAa,GACrC,kBACG,oBAAC,OAAD;KAAK,WAAU;eACX,qBAAC,QAAD;MACI,SAAQ;MACR,MAAK;MACL,OAAM;MACN,WAAU;MACV,SAAS;gBALb;OAMC;OACe,eAAe,oBAAoB;OAAO;MAClD;;IACP,CAAA,CAER;OAIT,oBAAC,kBAAD;IACI,OAAO;IACQ;IACf,UAAU;IACV,YAAY;IACZ,SAAS;IACT,SAAS;GACZ,CAAA,CACA;;CAER,CAAA;AAEb;AAIA,SAAS,iBAAiB,EACtB,OACA,eACA,UACA,YACA,SACA,WAQD;CACC,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAE9C,MAAM,qBAAqB;EACvB,MAAM,aAAa,CAAC;EACpB,YAAY,UAAU;EACtB,IAAI,YAAY,SAAS;CAC7B;CAEA,OACI,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,QAAD;EACI,SAAQ;EACR,MAAK;EACL,OAAM;EACN,WAAU;EACV,SAAS;EACT,SACI,oBAAC,OAAD;GACI,WAAW,IACP,+FACA,YAAY,WAChB;GACA,SAAQ;GACR,MAAK;GACL,QAAO;GACP,aAAa;GACb,eAAc;GACd,gBAAe;aAEf,oBAAC,YAAD,EAAU,QAAO,iBAAkB,CAAA;EAClC,CAAA;YAGT,qBAAC,YAAD;GACI,SAAQ;GACR,OAAM;GACN,WAAU;aAHd,CAIC,aACa,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,UAAU,MAAM,GAAG,KAAK,EACjE;;CACR,CAAA,GACP,YACG,oBAAC,OAAD;EAAK,WAAU;YACV,WAAW,MAAM,WAAW,IACzB,qBAAC,OAAD;GAAK,WAAU;aAAf,CACI,oBAAC,UAAD;IAAU,OAAO;IAAI,QAAQ;GAAK,CAAA,GAClC,oBAAC,UAAD;IAAU,OAAO;IAAK,QAAQ;GAAK,CAAA,CAClC;OAEL,qBAAA,UAAA,EAAA,UAAA,CACK,MAAM,IAAI,aAAa,GACvB,WACG,oBAAC,OAAD;GAAK,WAAU;aACX,oBAAC,QAAD;IACI,SAAQ;IACR,MAAK;IACL,OAAM;IACN,WAAU;IACV,SAAS;IACT,UAAU;cAET,UAAU,eAAe;GACtB,CAAA;EACP,CAAA,CAEX,EAAA,CAAA;CAEL,CAAA,CAER,EAAA,CAAA;AAEb;;;ACjZA,IAAM,oBAAoB;AAE1B,SAAS,iBAAiB,SAAiC;CACvD,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,IAAI,IAAI,KAAK,OAAO;CAC1B,IAAI,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO;CAC/B,MAAM,sBAAM,IAAI,KAAK;CAErB,OAAO,IAAI,IADO,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,CAC3D;AACf;AAsBA,SAAgB,UAAU,EACtB,SACA,OACA,aACA,cACA,YACA,cACA,YACA,gBACA,oBACA,gBACA,iBACA,kBACA,kBACA,mBACA,uBACe;CACf,MAAM,cAAsC,cAClC,OAAO,YACT,eAAe,KAAI,MAAK,CAAC,EAAE,QAAQ,UAAU,EAAE,QAAQ,KAAK,CAAC,CACjE,GACA,CAAC,cAAc,CACnB;CAEA,MAAM,mBAA6B,cACzB,eAAe,KAAI,MAAK,EAAE,QAAQ,QAAQ,EAAE,OAAO,OAAO,GAChE,CAAC,cAAc,CACnB;CAGA,MAAM,CAAC,aAAa,kBAAkB,SAAsB,KAAK;CACjE,MAAM,CAAC,aAAa,kBAAkB,SAAwB,IAAI;CAClE,MAAM,CAAC,cAAc,mBAAmB,SAAwB,IAAI;CACpE,MAAM,CAAC,YAAY,iBAAiB,SAAiB,EAAE;CACvD,MAAM,CAAC,qBAAqB,0BAA0B,SAAS,iBAAiB;CAGhF,MAAM,eAAe,cACX,MAAM,QAAO,MACf,EAAE,QAAQ,WAAW,aACrB,CAAC,mBAAmB,IAAI,EAAE,EAAE,KAC5B,iBAAiB,EAAE,QAAQ,OAAO,CACtC,GACA,CAAC,OAAO,kBAAkB,CAC9B;CAGA,MAAM,kBAAkB,cAAc;EAClC,MAAM,sBAAM,IAAI,IAAY;EAC5B,MAAM,SAAQ,MAAK;GACf,IAAI,EAAE,QAAQ,UAAU,IAAI,IAAI,EAAE,OAAO,QAAQ;EACrD,CAAC;EACD,OAAO,MAAM,KAAK,GAAG,EAAE,MAAM,GAAG,MAAM;GAClC,MAAM,KAAK,WAAW,IAAI,CAAC,GAAG,QAAQ;GACtC,MAAM,KAAK,WAAW,IAAI,CAAC,GAAG,QAAQ;GACtC,OAAO,GAAG,cAAc,EAAE;EAC9B,CAAC;CACL,GAAG,CAAC,OAAO,UAAU,CAAC;CAGtB,MAAM,cAAc,cAAc;EAC9B,MAAM,SAAiC,CAAC;EACxC,MAAM,SAAQ,MAAK;GACf,IAAI,EAAE,QAAQ,WAAW,aAAa,EAAE,QAAQ,SAC5C,OAAO,EAAE,OAAO,YAAY,OAAO,EAAE,OAAO,YAAY,KAAK;EAErE,CAAC;EACD,OAAO;CACX,GAAG,CAAC,KAAK,CAAC;CAGV,MAAM,uBAAuB,cAAc;EACvC,IAAI,WAAW,MAAM,QAAO,MACxB,EAAE,QAAQ,WAAW,aACpB,EAAE,QAAQ,WAAW,eAAe,mBAAmB,IAAI,EAAE,EAAE,CACpE;EAEA,IAAI,gBAAgB,WAChB,WAAW,SAAS,QAAO,MACvB,iBAAiB,EAAE,QAAQ,OAAO,KAClC,mBAAmB,IAAI,EAAE,EAAE,CAC/B;EAGJ,IAAI,aACA,WAAW,SAAS,QAAO,MACvB,EAAE,QAAQ,YAAY,eACtB,mBAAmB,IAAI,EAAE,EAAE,CAC/B;EAGJ,IAAI,cACA,WAAW,SAAS,QAAO,MACvB,EAAE,QAAQ,aAAa,gBACvB,mBAAmB,IAAI,EAAE,EAAE,CAC/B;EAGJ,IAAI,WAAW,KAAK,GAAG;GACnB,MAAM,IAAI,WAAW,KAAK,EAAE,YAAY;GACxC,WAAW,SAAS,QAAO,MAAK;IAC5B,MAAM,SAAS,EAAE,QAAQ,SAAS,IAAI,YAAY;IAClD,MAAM,QAAQ,EAAE,QAAQ,eAAe,IAAI,YAAY;IACvD,MAAM,aAAa,EAAE,QAAQ,YACtB,WAAW,IAAI,EAAE,OAAO,QAAQ,GAAG,QAAQ,IAAI,YAAY,IAC5D;IACN,OAAO,MAAM,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK,WAAW,SAAS,CAAC;GACzE,CAAC;EACL;EAEA,OAAO;CACX,GAAG;EAAC;EAAO;EAAoB;EAAa;EAAa;EAAc;EAAY;CAAU,CAAC;CAE9F,MAAM,sBAAsB,cACxB,qBAAqB,MAAM,GAAG,mBAAmB,GACjD,CAAC,sBAAsB,mBAAmB,CAC9C;CACA,MAAM,iBAAiB,qBAAqB,SAAS;CACrD,MAAM,eAAe,qBAAqB;CAE1C,MAAM,wBAAwB,kBAAkB;EAC5C,eAAe,KAAK;EACpB,eAAe,IAAI;EACnB,gBAAgB,IAAI;EACpB,cAAc,EAAE;CACpB,GAAG,CAAC,CAAC;CAIL,OACI,oBAAC,OAAD;EAAK,WAAU;YACX,qBAAC,OAAD;GAAK,WAAU;aAAf,CACI,oBAAC,aAAD;IACiB;IACb,qBAAqB;IACR;IACb,qBAAqB;IACP;IACd,sBAAsB;IACV;IACZ,oBAAoB;IACH,iBAdT,gBAAgB,SAAS,gBAAgB,QAAQ,iBAAiB,QAAQ,eAAe;IAejG,mBAAmB;IACL;IACd,cAAc,MAAM,QAAO,MAAK,EAAE,QAAQ,WAAW,aAAa,CAAC,mBAAmB,IAAI,EAAE,EAAE,CAAC;IAClF;IACK;IACL;IACI;IACL;GACf,CAAA,GAED,oBAAC,WAAD;IACW;IACE;IACT,cAAc;IACO;IACL;IAChB,yBAAyB,wBAAuB,SAAQ,OAAO,iBAAiB;IAClE;IACD;IACC;IACF;IACE;IACF;IACC;IACO;IACJ;IACC;IACC;IACA;IACC;IACE;GACxB,CAAA,CACA;;CACJ,CAAA;AAEb;;;ACnMA,SAAS,aAAa,MAAkB;CACpC,OAAO,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,CAAC;AAC1D;AAEA,SAAS,WAAW,MAAkB;CAClC,OAAO,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC;AAC9D;AAEA,SAAS,UAAU,GAAS,GAAkB;CAC1C,OACI,EAAE,YAAY,MAAM,EAAE,YAAY,KAClC,EAAE,SAAS,MAAM,EAAE,SAAS,KAC5B,EAAE,QAAQ,MAAM,EAAE,QAAQ;AAElC;AAEA,SAAS,UAAU,MAAoB;CACnC,OAAO,GAAG,KAAK,YAAY,EAAE,GAAG,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC1H;AAEA,SAAS,cAAc,MAAqB;CACxC,MAAM,wBAAQ,IAAI,KAAK;CACvB,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC;CACzB,MAAM,IAAI,IAAI,KAAK,IAAI;CACvB,EAAE,SAAS,GAAG,GAAG,GAAG,CAAC;CACrB,OAAO,IAAI;AACf;AAIA,IAAM,cAAsC;CACxC,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,YAAY;CACZ,YAAY;CACZ,QAAQ;CACR,WAAW;CACX,WAAW;AACf;AAWA,SAAS,kBAAkB,UAA+B;CACtD,MAAM,wBAAQ,IAAI,KAAK;CACvB,MAAM,QAAQ,aAAa,QAAQ;CACnC,MAAM,OAAO,WAAW,QAAQ;CAGhC,IAAI,WAAW,MAAM,OAAO,IAAI;CAChC,IAAI,WAAW,GAAG,WAAW;CAE7B,MAAM,OAAsB,CAAC;CAG7B,KAAK,IAAI,IAAI,WAAW,GAAG,KAAK,GAAG,KAAK;EACpC,MAAM,IAAI,IAAI,KAAK,KAAK;EACxB,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI,EAAE;EAC/B,KAAK,KAAK;GACN,MAAM;GACN,gBAAgB;GAChB,SAAS,UAAU,GAAG,KAAK;GAC3B,SAAS,UAAU,CAAC;EACxB,CAAC;CACL;CAGA,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,QAAQ,GAAG,KAAK;EACtC,MAAM,OAAO,IAAI,KAAK,SAAS,YAAY,GAAG,SAAS,SAAS,GAAG,CAAC;EACpE,KAAK,KAAK;GACN;GACA,gBAAgB;GAChB,SAAS,UAAU,MAAM,KAAK;GAC9B,SAAS,UAAU,IAAI;EAC3B,CAAC;CACL;CAGA,OAAO,KAAK,SAAS,MAAM,GAAG;EAC1B,MAAM,IAAI,IAAI,KAAK,IAAI;EACvB,EAAE,QAAQ,EAAE,QAAQ,KAAK,KAAK,UAAU,WAAW,KAAK,QAAQ,MAAM,CAAC;EACvE,KAAK,KAAK;GACN,MAAM;GACN,gBAAgB;GAChB,SAAS,UAAU,GAAG,KAAK;GAC3B,SAAS,UAAU,CAAC;EACxB,CAAC;CACL;CAEA,OAAO;AACX;AAIA,IAAM,cAAc;CAAC;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;AAAI;AAE7D,IAAM,cAAc;CAChB;CAAW;CAAY;CAAS;CAAS;CAAO;CAChD;CAAQ;CAAU;CAAa;CAAW;CAAY;AAC1D;AAEA,SAAgB,eAAe,EAAE,SAAS,OAAO,cAAmC;CAChF,MAAM,CAAC,UAAU,eAAe,+BAAe,IAAI,KAAK,CAAC;CACzD,MAAM,CAAC,aAAa,kBAAkB,SAAwB,IAAI;CAGlE,MAAM,cAAc,cAAc;EAC9B,MAAM,sBAAM,IAAI,IAA0B;EAC1C,KAAK,MAAM,QAAQ,OAAO;GACtB,IAAI,CAAC,KAAK,QAAQ,SAAS;GAE3B,MAAM,MAAM,UAAU,IADR,KAAK,KAAK,OAAO,OACT,CAAC;GACvB,IAAI,CAAC,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC;GAClC,IAAI,IAAI,GAAG,EAAG,KAAK,IAAI;EAC3B;EACA,OAAO;CACX,GAAG,CAAC,KAAK,CAAC;CAGV,MAAM,eAAe,cAAc,kBAAkB,QAAQ,GAAG,CAAC,QAAQ,CAAC;CAG1E,MAAM,gBAAgB,kBAAkB;EACpC,aAAY,SAAQ,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC;EACxE,eAAe,IAAI;CACvB,GAAG,CAAC,CAAC;CAEL,MAAM,gBAAgB,kBAAkB;EACpC,aAAY,SAAQ,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC;EACxE,eAAe,IAAI;CACvB,GAAG,CAAC,CAAC;CAEL,MAAM,YAAY,kBAAkB;EAChC,MAAM,wBAAQ,IAAI,KAAK;EACvB,YAAY,IAAI,KAAK,MAAM,YAAY,GAAG,MAAM,SAAS,GAAG,CAAC,CAAC;EAC9D,eAAe,UAAU,KAAK,CAAC;CACnC,GAAG,CAAC,CAAC;CAGL,MAAM,mBAAmB,cAAc;EACnC,IAAI,CAAC,aAAa,OAAO,CAAC;EAC1B,OAAO,YAAY,IAAI,WAAW,KAAK,CAAC;CAC5C,GAAG,CAAC,aAAa,WAAW,CAAC;CAE7B,OACI,qBAAC,OAAD,EAAA,UAAA;EAEI,qBAAC,OAAD;GAAK,WAAU;aAAf,CACI,oBAAC,YAAD;IAAY,SAAQ;cAAY;GAAoB,CAAA,GACpD,oBAAC,QAAD;IACI,SAAQ;IACR,MAAK;IACL,OAAM;IACN,WAAU;IACV,SAAS;cACZ;GAEO,CAAA,CACP;;EAGL,qBAAC,OAAD;GAAK,WAAU;aAAf;IACI,oBAAC,YAAD;KACI,MAAK;KACL,cAAW;KACX,SAAS;eAET,oBAAC,aAAD,EAAa,WAAU,UAAW,CAAA;IAC1B,CAAA;IACZ,qBAAC,YAAD;KAAY,SAAQ;KAAQ,WAAU;eAAtC;MACK,YAAY,SAAS,SAAS;MAAG;MAAE,SAAS,YAAY;KACjD;;IACZ,oBAAC,YAAD;KACI,MAAK;KACL,cAAW;KACX,SAAS;eAET,oBAAC,cAAD,EAAc,WAAU,UAAW,CAAA;IAC3B,CAAA;GACX;;EAEJ,UACG,oBAAC,UAAD,EAAU,WAAU,yBAA0B,CAAA,IAE9C,qBAAA,UAAA,EAAA,UAAA;GAEI,oBAAC,OAAD;IAAK,WAAU;cACV,YAAY,KAAI,MACb,oBAAC,OAAD;KAAa,WAAU;eACnB,oBAAC,YAAD;MAAY,SAAQ;MAAU,OAAM;MAAY,WAAU;gBACrD;KACO,CAAA;IACX,GAJK,CAIL,CACR;GACA,CAAA;GAGL,oBAAC,OAAD;IAAK,WAAU;cACV,aAAa,KAAK,QAAQ;KACvB,MAAM,WAAW,YAAY,IAAI,IAAI,OAAO,KAAK,CAAC;KAClD,MAAM,WAAW,SAAS,SAAS;KACnC,MAAM,aAAa,gBAAgB,IAAI;KAGvC,MAAM,eAAe,SAAS,QAAO,MAAK,EAAE,OAAO,WAAW,SAAS,EAAE;KACzE,MAAM,iBAAiB,SAAS,QAAO,MAAK,EAAE,OAAO,WAAW,WAAW,EAAE;KAC7E,MAAM,aAAa,SAAS,MACxB,MAAK,EAAE,OAAO,WAAW,aAAa,cAAc,IAAI,KAAK,EAAE,OAAO,OAAQ,CAAC,CACnF;KAEA,OACI,qBAAC,UAAD;MAEI,eAAe,eAAe,aAAa,OAAO,IAAI,OAAO;MAC7D,WAAW,IACP,iHACA,IAAI,iBACE,kDACA,0CACN,IAAI,WAAW,CAAC,cAAc,0BAC9B,aACM,4DACA,kDACN,YAAY,gBAChB;gBAbJ,CAeI,oBAAC,YAAD;OACI,SAAQ;OACR,OAAM;OACN,WAAW,IACP,yCACA,IAAI,WAAW,oDACnB;iBAEC,IAAI,KAAK,QAAQ;MACV,CAAA,GAGX,WACG,qBAAC,OAAD;OAAK,WAAU;iBAAf;QACK,cACG,oBAAC,QAAD,EAAM,WAAU,0CAA2C,CAAA;QAE9D,eAAe,KAAK,CAAC,cAClB,oBAAC,QAAD,EAAM,WAAU,0CAA2C,CAAA;QAE9D,iBAAiB,KACd,oBAAC,QAAD,EAAM,WAAU,8CAA+C,CAAA;OAElE;WAEL,oBAAC,OAAD,EAAK,WAAU,eAAgB,CAAA,CAE/B;QAzCC,IAAI,OAyCL;IAEhB,CAAC;GACA,CAAA;GAGL,qBAAC,OAAD;IAAK,WAAU;cAAf;KACI,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,QAAD,EAAM,WAAU,0CAA2C,CAAA,GAC3D,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAAc;MAAmB,CAAA,CAC1F;;KACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,QAAD,EAAM,WAAU,0CAA2C,CAAA,GAC3D,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAAc;MAAmB,CAAA,CAC1F;;KACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,QAAD,EAAM,WAAU,8CAA+C,CAAA,GAC/D,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAAc;MAAgB,CAAA,CACvF;;IACJ;;GAGJ,eACG,qBAAC,OAAD;IAAK,WAAU;cAAf,CACI,oBAAC,WAAD;KAAW,aAAY;KAAa,WAAU;IAAQ,CAAA,GACrD,iBAAiB,WAAW,IACzB,oBAAC,OAAD;KAAK,WAAU;eACX,oBAAC,YAAD;MAAY,SAAQ;MAAU,OAAM;gBAAY;KAEpC,CAAA;IACX,CAAA,IAEL,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,qBAAC,YAAD;MAAY,SAAQ;MAAU,OAAM;MAAY,WAAU;gBAA1D;OACK,iBAAiB;OAAO;OAAM,iBAAiB,WAAW,IAAI,MAAM;OAAG;wBAAI,IAAI,KAAK,cAAc,WAAW,GAAE,mBAAmB,SAAS;QAAE,SAAS;QAAS,OAAO;QAAS,KAAK;OAAU,CAAC;MACxL;SACX,iBAAiB,KAAK,SAAS;MAC5B,MAAM,YAAY,KAAK,OAAO,WAAW;MACzC,MAAM,YAAY,aAAa,cAAc,IAAI,KAAK,KAAK,OAAO,OAAQ,CAAC;MAC3E,OACI,qBAAC,UAAD;OAEI,eAAe,WAAW,KAAK,EAAE;OACjC,WAAW,IACP,kEACA,kGACJ;iBANJ;QASI,oBAAC,QAAD,EACI,WAAW,IACP,4CACA,YACM,eACA,YACI,eACA,gBACd,EACH,CAAA;QACD,qBAAC,OAAD;SAAK,WAAU;mBAAf,CACI,oBAAC,YAAD;UAAY,SAAQ;UAAQ,WAAU;oBACjC,KAAK,OAAO;SACL,CAAA,GACZ,qBAAC,OAAD;UAAK,WAAU;oBAAf,CACK,KAAK,OAAO,QAAQ,QACjB,oBAAC,YAAD;WAAY,SAAQ;WAAU,OAAM;WAAY,WAAU;qBACrD,KAAK,OAAO,OAAO;UACZ,CAAA,GAEf,KAAK,OAAO,WACT,oBAAC,YAAD;WAAY,SAAQ;WAAU,OAAM;WAAW,WAAU;qBACpD,YAAY,KAAK,OAAO,YAAY,KAAK,OAAO;UACzC,CAAA,CAEf;WACJ;;QACJ,KAAK,OAAO,aAAa,UACtB,oBAAC,MAAD;SAAM,aAAY;SAAM,MAAK;mBAAW;QAAU,CAAA;OAElD;SAtCC,KAAK,EAsCN;KAEhB,CAAC,CACA;MAER;;EAEX,EAAA,CAAA;CAEL,EAAA,CAAA;AAEb;;;AChSA,IAAM,YAAoC;CACtC,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;CACR,MAAM;CACN,KAAK;CACL,MAAM;CACN,KAAK;CACL,OAAO;AACX;AAEA,SAAS,aAAa,WAA2B;CAC7C,OAAO,UAAU,cAAc,UAAU;AAC7C;AAIA,IAAM,eAAuC;CACzC,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,YAAY;CACZ,YAAY;CACZ,QAAQ;CACR,WAAW;CACX,WAAW;AACf;AAEA,IAAM,YAA8B,CAChC;CAAE,IAAI;CAAQ,MAAM;CAAuB,WAAW;CAAM,OAAO;AAAO,GAC1E;CAAE,IAAI;CAAgB,MAAM;CAAuB,WAAW;CAAO,OAAO;AAAS,CACzF;AAEA,IAAM,iBAAiE;CACnE,MAAM;EACF;GAAE,UAAU;GAAY,OAAO;GAAY,YAAY;GAAW,OAAO;GAAQ,MAAM;GAAS,WAAW;GAAG,YAAY;GAAO,aAAa;EAAM;EACpJ;GAAE,UAAU;GAAc,OAAO;GAAe,YAAY;GAAS,OAAO;GAAU,MAAM;GAAQ,WAAW;GAAG,YAAY;GAAO,aAAa;EAAM;EACxJ;GAAE,UAAU;GAAkB,OAAO;GAAa,YAAY;GAAS,OAAO;GAAU,MAAM;GAAS,WAAW;GAAG,YAAY;GAAO,aAAa;EAAM;EAC3J;GAAE,UAAU;GAAc,OAAO;GAAc,YAAY;GAAa,OAAO;GAAU,MAAM;GAAa,WAAW;GAAG,YAAY;GAAO,aAAa;EAAM;EAChK;GAAE,UAAU;GAAc,OAAO;GAAc,YAAY;GAAW,OAAO;GAAQ,MAAM;GAAc,WAAW;GAAG,YAAY;GAAO,aAAa;EAAM;EAC7J;GAAE,UAAU;GAAU,OAAO;GAAU,YAAY;GAAU,OAAO;GAAS,MAAM;GAAY,WAAW;GAAG,YAAY;GAAO,aAAa;EAAM;EACnJ;GAAE,UAAU;GAAa,OAAO;GAAa,YAAY;GAAQ,OAAO;GAAU,MAAM;GAAgB,WAAW;GAAG,YAAY;GAAM,aAAa;EAAM;EAC3J;GAAE,UAAU;GAAa,OAAO;GAAQ,YAAY;GAAU,OAAO;GAAO,MAAM;GAAW,WAAW;GAAG,YAAY;GAAM,aAAa;EAAK;CACnJ;CACA,cAAc;EACV;GAAE,UAAU;GAAY,OAAO;GAAY,YAAY;GAAY,OAAO;GAAQ,MAAM;GAAQ,WAAW;GAAG,YAAY;GAAO,aAAa;EAAM;EACpJ;GAAE,UAAU;GAAkB,OAAO;GAAiB,YAAY;GAAQ,OAAO;GAAU,MAAM;GAAS,WAAW;GAAG,YAAY;GAAO,aAAa;EAAM;EAC9J;GAAE,UAAU;GAAc,OAAO;GAAY,YAAY;GAAQ,OAAO;GAAU,MAAM;GAAQ,WAAW;GAAG,YAAY;GAAO,aAAa;EAAM;EACpJ;GAAE,UAAU;GAAU,OAAO;GAAa,YAAY;GAAQ,OAAO;GAAS,MAAM;GAAa,WAAW;GAAG,YAAY;GAAM,aAAa;EAAM;CACxJ;AACJ;AAEA,IAAM,kBAA4B;CAC9B;EAAE,IAAI;EAAY,MAAM;EAAiB,OAAO;EAAqB,OAAO;EAAiB,OAAO;CAAiB;CACrH;EAAE,IAAI;EAAY,MAAM;EAAa,OAAO;EAAgB,OAAO;EAAiB,OAAO;CAAa;CACxG;EAAE,IAAI;EAAY,MAAM;EAAe,OAAO;EAAuB,OAAO;EAAiB,OAAO;CAAa;CACjH;EAAE,IAAI;EAAY,MAAM;EAAe,OAAO;EAAqB,OAAO;EAAiB,OAAO;CAAa;CAC/G;EAAE,IAAI;EAAY,MAAM;EAAa,OAAO;EAAoB,OAAO;EAAiB,OAAO;CAAS;CACxG;EAAE,IAAI;EAAY,MAAM;EAAgB,OAAO;EAAoB,OAAO;EAAiB,OAAO;CAAY;AAClH;AAEA,IAAM,gBAAwB;CAC1B;EACI,IAAI;EACJ,QAAQ;GACJ,OAAO;GACP,QAAQ;GACR,YAAY;GACZ,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;GAClE,SAAS;GACT,UAAU;GACV,UAAU;GACV,aAAa;GACb,OAAO;GACP,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,GAAE,YAAY;EAC5D;CACJ;CACA;EACI,IAAI;EACJ,QAAQ;GACJ,OAAO;GACP,QAAQ;GACR,YAAY;GACZ,0BAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;GACnE,SAAS;GACT,UAAU;GACV,UAAU;GACV,aAAa;GACb,OAAO;GACP,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,GAAE,YAAY;EAC5D;CACJ;CACA;EACI,IAAI;EACJ,QAAQ;GACJ,OAAO;GACP,QAAQ;GACR,YAAY;GACZ,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;GACnE,SAAS;GACT,UAAU;GACV,UAAU;GACV,aAAa;GACb,OAAO;GACP,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,GAAE,YAAY;EAC3D;CACJ;CACA;EACI,IAAI;EACJ,QAAQ;GACJ,OAAO;GACP,QAAQ;GACR,YAAY;GACZ,0BAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;GAClE,SAAS;GACT,UAAU;GACV,UAAU;GACV,aAAa;GACb,OAAO;GACP,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,GAAE,YAAY;EAC5D;CACJ;CACA;EACI,IAAI;EACJ,QAAQ;GACJ,OAAO;GACP,QAAQ;GACR,YAAY;GACZ,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;GACnE,SAAS;GACT,UAAU;GACV,UAAU;GACV,aAAa;GACb,OAAO;GACP,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,GAAE,YAAY;EAC3D;CACJ;AACJ;AAEA,IAAM,0BAAkC,CACpC;CACI,IAAI;CACJ,QAAQ;EACJ,OAAO;EACP,QAAQ;EACR,YAAY;EACZ,0BAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;EACnE,SAAS;EACT,UAAU;EACV,UAAU;EACV,aAAa;EACb,OAAO;EACP,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,GAAE,YAAY;CAC5D;AACJ,GACA;CACI,IAAI;CACJ,QAAQ;EACJ,OAAO;EACP,QAAQ;EACR,YAAY;EACZ,0BAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;EACnE,SAAS;EACT,UAAU;EACV,UAAU;EACV,aAAa;EACb,OAAO;EACP,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,GAAE,YAAY;CAC5D;AACJ,CACJ;AAEA,IAAM,qBAAiC;CACnC;EACI,IAAI;EACJ,QAAQ;GACJ,MAAM;GACN,aAAa;GACb,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,IAAO,GAAE,YAAY;GACtD,UAAU;IACN,SAAS;IACT,MAAM;IACN,IAAI;IACJ,MAAM;GACV;EACJ;CACJ;CACA;EACI,IAAI;EACJ,QAAQ;GACJ,MAAM;GACN,aAAa;GACb,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,GAAE,YAAY;GACvD,UAAU;IACN,QAAQ;IACR,WAAW;GACf;EACJ;CACJ;CACA;EACI,IAAI;EACJ,QAAQ;GACJ,MAAM;GACN,aAAa;GACb,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,GAAE,YAAY;EAC3D;CACJ;CACA;EACI,IAAI;EACJ,QAAQ;GACJ,MAAM;GACN,aAAa;GACb,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,GAAE,YAAY;EAC5D;CACJ;AACJ;AAIA,SAAS,cAAsB;CAC3B,MAAM,wBAAO,IAAI,KAAK,GAAE,SAAS;CACjC,IAAI,OAAO,IAAI,OAAO;CACtB,IAAI,OAAO,IAAI,OAAO;CACtB,OAAO;AACX;AAEA,SAAS,mBAA2B;CAChC,wBAAO,IAAI,KAAK,GAAE,mBAAmB,SAAS;EAC1C,SAAS;EACT,OAAO;EACP,KAAK;CACT,CAAC;AACL;AAIA,SAAgB,mBAAmB;CAC/B,MAAM,CAAC,SAAS,cAAc,SAAS,IAAI;CAC3C,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,IAAI;CAG/D,MAAM,CAAC,SAAS,cAAc,SAAmB,eAAe;CAChE,MAAM,CAAC,OAAO,YAAY,SAAiB,aAAa;CACxD,MAAM,CAAC,gBAAgB,qBAAqB,SAAiB,uBAAuB;CACpF,MAAM,CAAC,YAAY,iBAAiB,SAAqB,kBAAkB;CAE3E,MAAM,CAAC,oBAAoB,yBAAyB,SAAiB,MAAM;CAG3E,MAAM,CAAC,cAAc,mBAAmB,SAAwB,IAAI;CAGpE,MAAM,CAAC,kBAAkB,uBAAuB,SAGtC,IAAI;CAGd,MAAM,CAAC,iBAAiB,sBAAsB,SAAS,KAAK;CAC5D,MAAM,CAAC,eAAe,oBAAoB,SAA6F,IAAI;CAG3I,MAAM,CAAC,eAAe,oBAAoB,SAAS,EAAE;CACrD,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,EAAE;CACvD,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,EAAE;CACvD,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,UAAU;CAG/D,MAAM,CAAC,aAAa,kBAAkB,yBAAsB,IAAI,IAAI,CAAC;CACrE,MAAM,CAAC,oBAAoB,yBAAyB,yBAAsB,IAAI,IAAI,CAAC;CAGnF,MAAM,CAAC,iBAAiB,sBAAsB,SAAS,KAAK;CAC5D,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,KAAK;CAG9D,gBAAgB;EACZ,MAAM,SAAS,iBAAiB,WAAW,KAAK,GAAG,GAAG;EACtD,MAAM,SAAS,iBAAiB,qBAAqB,KAAK,GAAG,GAAG;EAChE,aAAa;GACT,aAAa,MAAM;GACnB,aAAa,MAAM;EACvB;CACJ,GAAG,CAAC,CAAC;CAGL,MAAM,YAAY,aAAa,QAAgB;EAC3C,gBAAgB,GAAG;EACnB,MAAM,QAAQ,iBAAiB,gBAAgB,IAAI,GAAG,GAAI;EAC1D,aAAa,aAAa,KAAK;CACnC,GAAG,CAAC,CAAC;CAGL,MAAM,wBAAwB,kBAAkB;EAC5C,IAAI,iBAAiB;EACrB,oBAAoB,IAAI;EACxB,iBAAiB;GACb,mBAAmB,IAAI;GACvB,oBAAoB,KAAK;EAC7B,GAAG,GAAG;CACV,GAAG,CAAC,eAAe,CAAC;CAEpB,MAAM,0BAA0B,kBAAkB;EAC9C,oBAAoB,IAAI;EACxB,iBAAiB;GACb,oBAAoB,KAAK;GACzB,UAAU,oCAAoC;EAClD,GAAG,GAAG;CACV,GAAG,CAAC,SAAS,CAAC;CAGd,MAAM,uBAAuB,aAAa,eAAuB;EAC7D,sBAAsB,UAAU;EAChC,WAAW,IAAI;EACf,iBAAiB;GACb,WAAW,KAAK;GAChB,UAAU,eAAe,UAAU,MAAK,MAAK,EAAE,OAAO,UAAU,GAAG,MAAM;EAC7E,GAAG,GAAG;CACV,GAAG,CAAC,SAAS,CAAC;CAGd,MAAM,aAAa,cAAc;EAC7B,MAAM,sBAAM,IAAI,IAAgD;EAChE,QAAQ,SAAQ,MAAK,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;EACpD,OAAO;CACX,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,WAAW,cAAc;EAC3B,MAAM,sBAAM,IAAI,IAAiB;EACjC,MAAM,SAAQ,MAAK,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC;EACnC,eAAe,SAAQ,MAAK,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC;EAC5C,OAAO;CACX,GAAG,CAAC,OAAO,cAAc,CAAC;CAG1B,MAAM,mBAAmB,aAAa,QAAgB,kBAA0B;EAC5E,gBAAe,SAAQ,IAAI,IAAI,IAAI,EAAE,IAAI,MAAM,CAAC;EAEhD,iBAAiB;GACb,IAAI,kBAAkB,WAAW;IAE7B,MAAM,OAAO,MAAM,MAAK,MAAK,EAAE,OAAO,MAAM;IAC5C,IAAI,MAAM;KACN,UAAS,SAAQ,KAAK,QAAO,MAAK,EAAE,OAAO,MAAM,CAAC;KAClD,MAAM,gBAAsB;MACxB,GAAG;MACH,QAAQ;OAAE,GAAG,KAAK;OAAQ,QAAQ;OAAa,YAAY;MAAO;KACtE;KACA,mBAAkB,SAAQ,CAAC,eAAe,GAAG,IAAI,CAAC;KAGlD,MAAM,SAAmB;MACrB,IAAI,OAAO,KAAK,IAAI;MACpB,QAAQ;OACJ,MAAM;OACN,aAAa,oBAAoB,KAAK,OAAO,MAAM;OACnD,4BAAW,IAAI,KAAK,GAAE,YAAY;OAClC,UAAU;QACN,QAAQ,KAAK;QACb,WAAW,KAAK,OAAO;OAC3B;MACJ;KACJ;KACA,eAAc,SAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;KACvC,UAAU,oBAAoB,KAAK,OAAO,MAAM,EAAE;IACtD;GACJ,OAAO;IAEH,MAAM,OAAO,eAAe,MAAK,MAAK,EAAE,OAAO,MAAM;IACrD,IAAI,MAAM;KACN,mBAAkB,SAAQ,KAAK,QAAO,MAAK,EAAE,OAAO,MAAM,CAAC;KAC3D,MAAM,cAAoB;MACtB,GAAG;MACH,QAAQ;OAAE,GAAG,KAAK;OAAQ,QAAQ;OAAW,YAAY;MAAK;KAClE;KACA,UAAS,SAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;KAGvC,MAAM,SAAmB;MACrB,IAAI,OAAO,KAAK,IAAI;MACpB,QAAQ;OACJ,MAAM;OACN,aAAa,oBAAoB,KAAK,OAAO,MAAM;OACnD,4BAAW,IAAI,KAAK,GAAE,YAAY;OAClC,UAAU;QACN,QAAQ,KAAK;QACb,WAAW,KAAK,OAAO;OAC3B;MACJ;KACJ;KACA,eAAc,SAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;KACvC,UAAU,oBAAoB,KAAK,OAAO,MAAM,EAAE;IACtD;GACJ;GACA,gBAAe,SAAQ;IACnB,MAAM,OAAO,IAAI,IAAI,IAAI;IACzB,KAAK,OAAO,MAAM;IAClB,OAAO;GACX,CAAC;EACL,GAAG,GAAG;CACV,GAAG;EAAC;EAAO;EAAgB;CAAS,CAAC;CAGrC,MAAM,iCAAiC,aAAa,aAAkB;EAClE,MAAM,SAAS,SAAS,QAAQ,UAAU;EAC1C,IAAI,QACA,iBAAiB,QAAQ,SAAS;CAE1C,GAAG,CAAC,gBAAgB,CAAC;CAErB,MAAM,kBAAkB,aAAa,aAAkB;EACnD,IAAI,SAAS,QAAQ,UAAU,SAAS;GACpC,iBAAiB;IACb,IAAI,SAAS,OAAO,SAAS,MAAM;IACnC,SAAS,SAAS,OAAO,SAAS;IAClC,MAAM,SAAS,OAAO,SAAS,QAAQ;IACvC,MAAM,SAAS,OAAO,SAAS,QAAQ;IACvC,MAAM,SAAS,OAAO,SAAS,QAAQ;GAC3C,CAAC;GACD,mBAAmB,IAAI;EAC3B;CACJ,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAiB,aAAa,aAAkB;EAClD,MAAM,SAAS,SAAS,QAAQ,UAAU;EAC1C,IAAI,QACA,oBAAoB;GAAE,MAAM;GAAQ,IAAI;EAAO,CAAC;CAExD,GAAG,CAAC,CAAC;CAGL,MAAM,iBAAiB,aAAa,WAAmB;EACnD,oBAAoB;GAAE,MAAM;GAAQ,IAAI;EAAO,CAAC;CACpD,GAAG,CAAC,CAAC;CAEL,MAAM,mBAAmB,aAAa,aAAqB;EACvD,oBAAoB;GAAE,MAAM;GAAU,IAAI;EAAS,CAAC;CACxD,GAAG,CAAC,CAAC;CAEL,MAAM,sBAAsB,kBAAkB;EAC1C,oBAAoB,EAAE,MAAM,aAAa,CAAC;CAC9C,GAAG,CAAC,CAAC;CAGL,MAAM,2BAA2B;EAC7B,IAAI,CAAC,cAAc,KAAK,GAAG;EAE3B,MAAM,QAAQ,UAAU,KAAK,IAAI;EACjC,MAAM,YAAoB;GACtB,IAAI;GACJ,MAAM;GACN,OAAO,kBAAkB,GAAG,cAAc,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE;GAC7E,OAAO,kBAAkB;GACzB,OAAO;EACX;EAEA,YAAW,SAAQ,CAAC,GAAG,MAAM,SAAS,CAAC;EAGvC,MAAM,UAAgB;GAClB,IAAI,QAAQ,KAAK,IAAI;GACrB,QAAQ;IACJ,OAAO,qCAAqC;IAC5C,QAAQ;IACR,YAAY;IACZ,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;IACnE,SAAS;IACT,UAAU;IACV,UAAU;IACV,aAAa,sDAAsD,cAAc;IACjF,OAAO;IACP,4BAAW,IAAI,KAAK,GAAE,YAAY;GACtC;EACJ;EACA,UAAS,SAAQ,CAAC,SAAS,GAAG,IAAI,CAAC;EAGnC,MAAM,SAAmB;GACrB,IAAI,OAAO,KAAK,IAAI;GACpB,QAAQ;IACJ,MAAM;IACN,aAAa,eAAe,cAAc,mBAAmB,aAAa,mBAAmB,eAAe;IAC5G,4BAAW,IAAI,KAAK,GAAE,YAAY;GACtC;EACJ;EACA,eAAc,SAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;EAEvC,UAAU,mBAAmB,cAAc,EAAE;EAG7C,iBAAiB,EAAE;EACnB,kBAAkB,EAAE;EACpB,kBAAkB,EAAE;EACpB,kBAAkB,UAAU;EAC5B,oBAAoB,IAAI;CAC5B;CAGA,MAAM,iBAAiB,aAAa,SAAiB;EACjD,IAAI,KAAK,SAAS,QAAQ,GAEtB,UAAU,0CAA0C;OAEpD,UAAU,4BAA4B,MAAM;CAEpD,GAAG,CAAC,SAAS,CAAC;CAGd,MAAM,mBAAmB,cAAc;EAEnC,QADmB,eAAe,uBAAuB,CAAC,GACxC,KAAI,MAAK;GACvB,MAAM,QAAQ,QAAQ,QAAO,MAAK,EAAE,UAAU,EAAE,QAAQ,EAAE;GAC1D,OAAO;IAAE,GAAG;IAAG;GAAM;EACzB,CAAC;CACL,GAAG,CAAC,SAAS,kBAAkB,CAAC;CAEhC,MAAM,eAAe,cAAc;EAC/B,OAAO,CAAC,GAAG,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;CACzE,GAAG,CAAC,gBAAgB,CAAC;CAErB,MAAM,mBAAmB,cACrB,aAAa,QAAO,MAAK,CAAC,EAAE,cAAc,CAAC,EAAE,WAAW,GACxD,CAAC,YAAY,CACjB;CAEA,MAAM,mBAAmB,cACrB,aAAa,QAAO,MAAK,EAAE,cAAc,EAAE,WAAW,GACtD,CAAC,YAAY,CACjB;CAEA,MAAM,kBAAkB,cAAc;EAClC,OAAO,QAAQ,QAAO,MAAK,EAAE,UAAU,WAAW,EAAE;CACxD,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,WAAW,cAAc;EAC3B,MAAM,gBAAgB,QAAQ,QAAO,MAAK,EAAE,UAAU,eAAe,EAAE,UAAU,WAAW,EAAE;EAC9F,MAAM,mBAAmB,MAAM,QAAO,MAAK;GACvC,IAAI,EAAE,OAAO,WAAW,WAAW,OAAO;GAC1C,IAAI,CAAC,EAAE,OAAO,SAAS,OAAO;GAC9B,OAAO,IAAI,KAAK,EAAE,OAAO,OAAO,IAAI,IAAI,sBAAK,IAAI,KAAK,GAAE,YAAY,oBAAG,IAAI,KAAK,GAAE,SAAS,oBAAG,IAAI,KAAK,GAAE,QAAQ,CAAC;EACtH,CAAC,EAAE;EAEH,OAAO;GACH,WAAW;GACX;GACA,kBAAkB,gBAAgB;GAClC,mBAAmB,QAAQ,QAAO,MAAK,EAAE,UAAU,eAAe,EAAE,UAAU,QAAQ,EAAE,SAAS;GACjG;EACJ;CACJ,GAAG,CAAC,SAAS,KAAK,CAAC;CAEnB,MAAM,eAAe,SAAS,oBAAoB,SAAS;CAI3D,MAAM,oBAAoB,WAAoB;EAC1C,MAAM,OAAO,SAAS,IAAI,UAAU,EAAE;EACtC,IAAI,CAAC,MAAM,OAAO,oBAAC,YAAD;GAAY,SAAQ;GAAQ,OAAM;aAAY;EAA2B,CAAA;EAE3F,MAAM,cAAc,KAAK,OAAO,WAAW;EAC3C,MAAM,aAAa,KAAK,OAAO,WAAW,QAAQ,MAAK,MAAK,EAAE,OAAO,KAAK,OAAO,QAAQ,IAAI;EAC7F,MAAM,YAAY,KAAK,OAAO,UAAU,aAAa,KAAK,OAAO,WAAW;EAE5E,OACI,qBAAC,OAAD;GAAK,WAAU;aAAf;IACI,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAU,OAAM;KAAY,WAAU;eAA+D;IAAsB,CAAA,GAC/I,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,QAAD;MAAM,WAAU;gBACZ,oBAAC,SAAD;OACI,MAAK;OACL,SAAS;OACT,gBAAgB,iBAAiB,KAAK,IAAI,KAAK,OAAO,MAAM;OAC5D,WAAU;MACb,CAAA;KACC,CAAA,GACN,oBAAC,YAAD;MAAY,SAAQ;MAAK,WAAW,cAAc,iEAAiE;gBAC9G,KAAK,OAAO;KACL,CAAA,CACX;MACJ,EAAA,CAAA;IAEL,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAU,OAAM;MAAY,WAAU;gBAA4C;KAAoB,CAAA,GAC1H,qBAAC,YAAD;MAAY,SAAQ;MAAQ,WAAU;gBAAtC,CACI,oBAAC,UAAD,EAAU,WAAU,+BAAgC,CAAA,GACnD,KAAK,OAAO,WAAW,aAChB;OACX,EAAA,CAAA,GACL,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAU,OAAM;MAAY,WAAU;gBAA4C;KAAoB,CAAA,GAC1H,oBAAC,YAAD;MAAY,SAAQ;MAAQ,WAAU;gBACjC,KAAK,OAAO,aAAa,SACtB,oBAAC,QAAD;OAAM,WAAU;iBAA+C;MAAU,CAAA,IACzE,KAAK,OAAO,aAAa,WACzB,oBAAC,QAAD;OAAM,WAAU;iBAAiD;MAAY,CAAA,IAE7E,oBAAC,QAAD;OAAM,WAAU;iBAA2D;MAAS,CAAA;KAEhF,CAAA,CACX,EAAA,CAAA,CACJ;;IAEJ,cACG,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAU,OAAM;KAAY,WAAU;eAA+D;IAA0B,CAAA,GACnJ,oBAAC,MAAD;KACI,WAAU;KACV,eAAe,iBAAiB,WAAW,EAAE;eAE7C,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,OAAD;OAAK,WAAU;iBACV,WAAW,KAAK,GAAG,YAAY;MAC/B,CAAA,GACL,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAQ,WAAU;kBAAwB,WAAW;OAAiB,CAAA,GAC1F,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAA8B,WAAW;OAAkB,CAAA,CACpH;QACJ;;IACH,CAAA,CACL,EAAA,CAAA;IAGT,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAU,OAAM;KAAY,WAAU;eAAmD;IAA0B,CAAA,GACvI,oBAAC,YAAD;KAAY,SAAQ;KAAQ,WAAU;eAAe;IAAsB,CAAA,CAC1E,EAAA,CAAA;IAEJ,KAAK,OAAO,eACT,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAU,OAAM;KAAY,WAAU;eAAmD;IAAuB,CAAA,GACpI,oBAAC,OAAD;KAAK,WAAU;eACX,oBAAC,YAAD;MAAY,SAAQ;MAAQ,WAAU;gBACjC,KAAK,OAAO;KACL,CAAA;IACX,CAAA,CACJ,EAAA,CAAA;IAGR,KAAK,OAAO,SACT,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAU,OAAM;KAAY,WAAU;eAAmD;IAAiB,CAAA,GAC9H,qBAAC,YAAD;KAAY,SAAQ;KAAQ,OAAM;KAAY,WAAU;eAAxD;MAAqF;MACzE,KAAK,OAAO;MAAM;KAClB;MACX,EAAA,CAAA;GAER;;CAEb;CAEA,MAAM,sBAAsB,aAAsB;EAC9C,MAAM,SAAS,QAAQ,MAAK,MAAK,EAAE,OAAO,QAAQ;EAClD,IAAI,CAAC,QAAQ,OAAO,oBAAC,YAAD;GAAY,SAAQ;GAAQ,OAAM;aAAY;EAA6B,CAAA;EAE/F,MAAM,cAAc,MAAM,QAAO,MAAK,EAAE,OAAO,aAAa,OAAO,EAAE;EACrE,MAAM,YAAY,aAAa,OAAO,UAAU,OAAO;EAEvD,OACI,qBAAC,OAAD;GAAK,WAAU;aAAf;IACI,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,OAAD;MAAK,WAAU;gBACV,OAAO,KAAK,GAAG,YAAY;KAC3B,CAAA,GACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,YAAD;OAAY,SAAQ;OAAK,WAAU;iBAAY,OAAO;MAAiB,CAAA,GACvE,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACI,oBAAC,QAAD,EAAM,WAAU,oCAAqC,CAAA,GACrD,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;kBAAa;OAAsB,CAAA,CACtE;QACJ;OACJ;;IAEL,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,MAAD,EAAM,WAAU,2BAA4B,CAAA,GAC5C,oBAAC,YAAD;OAAY,SAAQ;iBAAS,OAAO;MAAkB,CAAA,CACrD;SACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,OAAD,EAAO,WAAU,2BAA4B,CAAA,GAC7C,oBAAC,YAAD;OAAY,SAAQ;iBAAS,OAAO;MAAkB,CAAA,CACrD;OACJ;;IAEL,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAU,OAAM;KAAY,WAAU;eAA+D;IAAgC,CAAA,GACxJ,YAAY,WAAW,IACpB,oBAAC,YAAD;KAAY,SAAQ;KAAQ,OAAM;KAAY,WAAU;eAAS;IAA6C,CAAA,IAE9G,oBAAC,OAAD;KAAK,WAAU;eACV,YAAY,KAAI,MACb,oBAAC,MAAD;MAEI,WAAU;MACV,eAAe,eAAe,EAAE,EAAE;gBAElC,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACI,oBAAC,SAAD;QACI,MAAK;QACL,SAAS,EAAE,OAAO,WAAW;QAC7B,WAAW,MAAM;SACb,EAAE,gBAAgB;SAClB,iBAAiB,EAAE,IAAI,EAAE,OAAO,MAAM;QAC1C;QACA,WAAU;OACb,CAAA,GACD,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,YAAD;SAAY,SAAQ;SAAQ,WAAU;mBAAqC,EAAE,OAAO;QAAkB,CAAA,GACrG,EAAE,OAAO,WACN,qBAAC,YAAD;SAAY,SAAQ;SAAU,OAAM;SAAY,WAAU;mBAA1D,CAAqF,SAAM,EAAE,OAAO,OAAoB;UAE3H;SACJ;;KACH,GArBG,EAAE,EAqBL,CACT;IACA,CAAA,CAER,EAAA,CAAA;IAEL,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAU,OAAM;MAAY,WAAU;gBAA+D;KAAyB,CAAA,GAClJ,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,QAAD;OACI,SAAQ;OACR,MAAK;OACL,eAAe;QAEX,MAAM,SAAmB;SACrB,IAAI,OAAO,KAAK,IAAI;SACpB,QAAQ;UACJ,MAAM;UACN,aAAa,oCAAoC,OAAO;UACxD,4BAAW,IAAI,KAAK,GAAE,YAAY;SACtC;QACJ;QACA,eAAc,SAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvC,UAAU,kCAAkC;OAChD;iBACH;MAEO,CAAA,GACR,oBAAC,QAAD;OACI,SAAQ;OACR,MAAK;OACL,eAAe;QAEX,MAAM,SAAmB;SACrB,IAAI,OAAO,KAAK,IAAI;SACpB,QAAQ;UACJ,MAAM;UACN,aAAa,iBAAiB,OAAO;UACrC,4BAAW,IAAI,KAAK,GAAE,YAAY;UAClC,UAAU;WACN,SAAS;WACT,MAAM,MAAM,OAAO,KAAK,MAAM,GAAG,EAAE,GAAG;WACtC,IAAI,OAAO;WACX,MAAM;UACV;SACJ;QACJ;QACA,eAAc,SAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvC,UAAU,8BAA8B;OAC5C;iBACH;MAEO,CAAA,CACP;OACJ;;GACJ;;CAEb;CAEA,MAAM,8BAA8B;EAChC,OACI,qBAAC,OAAD;GAAK,WAAU;aAAf,CACI,qBAAC,OAAD;IAAK,WAAU;cAAf;KACI,oBAAC,YAAD;MAAY,SAAQ;MAAY,WAAU;gBAAO;KAA4B,CAAA;KAE7E,oBAAC,WAAD;MACI,OAAM;MACN,UAAA;MACA,OAAO;MACP,WAAU,MAAK,iBAAiB,EAAE,OAAO,KAAK;MAC9C,aAAY;KACf,CAAA;KAED,oBAAC,WAAD;MACI,OAAM;MACN,OAAO;MACP,WAAU,MAAK,kBAAkB,EAAE,OAAO,KAAK;MAC/C,aAAY;KACf,CAAA;KAED,oBAAC,WAAD;MACI,OAAM;MACN,OAAO;MACP,WAAU,MAAK,kBAAkB,EAAE,OAAO,KAAK;MAC/C,aAAY;KACf,CAAA;KAED,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAU,OAAM;MAAY,WAAU;gBAAiD;KAA0B,CAAA,GACrI,oBAAC,QAAD;MACI,OAAO;MACP,gBAAgB,MAAM,kBAAkB,CAAW;MACnD,MAAK;MACL,cAAc,MAAM,aAAa,MAAgB;MACjD,UAAS;gBAER,OAAO,QAAQ,YAAY,EAAE,KAAK,CAAC,KAAK,SACrC,oBAAC,YAAD;OAAsB,OAAO;iBAAM;MAAgB,GAAlC,GAAkC,CACtD;KACG,CAAA,CACP,EAAA,CAAA;IACJ;OAEL,qBAAC,OAAD;IAAK,WAAU;cAAf,CACI,oBAAC,QAAD;KACI,SAAQ;KACR,OAAM;KACN,WAAU;KACV,eAAe,oBAAoB,IAAI;eAC1C;IAEO,CAAA,GACR,oBAAC,QAAD;KACI,SAAQ;KACR,OAAM;KACN,WAAU;KACV,SAAS;KACT,UAAU,CAAC,cAAc,KAAK;eACjC;IAEO,CAAA,CACP;KACJ;;CAEb;CAEA,OACI,qBAAC,OAAD;EAAK,WAAU;YAAf;GAEI,qBAAC,OAAD;IAAK,WAAU;cAAf;KAEI,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,qBAAC,OAAD,EAAA,UAAA,CACI,qBAAC,YAAD;OAAY,SAAQ;OAAK,WAAU;iBAAnC,CACK,YAAY,GAAE,KACP;UACZ,qBAAC,YAAD;OAAY,SAAQ;OAAQ,OAAM;OAAY,WAAU;iBAAxD,CACK,iBAAiB,GAAE,8BACZ;QACX,EAAA,CAAA,GACL,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACI,oBAAC,QAAD;QACI,SAAQ;QACR,OAAM;QACN,MAAK;QACL,eAAe;SACX,WAAW,IAAI;SACf,qBAAqB,IAAI;SACzB,iBAAiB;UACb,WAAW,KAAK;UAChB,qBAAqB,KAAK;UAC1B,UAAU,iBAAiB;SAC/B,GAAG,GAAG;QACV;QACA,UAAU;QACV,WAAW,oBAAC,WAAD,EAAW,WAAW,IAAI,WAAW,WAAW,cAAc,EAAI,CAAA;kBAChF;OAEO,CAAA,GACR,oBAAC,QAAD;QACI,SAAQ;QACR,OAAM;QACN,MAAK;QACL,SAAS;QACT,WAAW,oBAAC,UAAD,EAAU,WAAU,UAAW,CAAA;kBAC7C;OAEO,CAAA,CACP;QACJ;;KAGL,oBAAC,kBAAD;MACa;MACC;MACO;MACH;KACjB,CAAA;KAGD,oBAAC,kBAAD;MACa;MACC;MACU;MACpB,kBAAkB;MAClB,YAAY;MACE;MACd,cAAc;MACd,cAAc;MACG;MACH;KACjB,CAAA;KAGD,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,MAAD;OAAM,WAAU;iBACZ,oBAAC,WAAD;QACa;QACF;QACM;QACb,cAAc;QACd,YAAY;QACZ,cAAc;QACF;QACZ,gBAAgB;QACI;QACJ;QACC;QACC;QAClB,kBAAkB;QAClB,mBAAmB;QACnB,qBAAqB;OACxB,CAAA;MACC,CAAA,GAEN,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACI,oBAAC,MAAD;QAAM,WAAU;kBACZ,oBAAC,gBAAD;SACa;SACT,OAAO,MAAM,OAAO,cAAc;SAClC,YAAY;QACf,CAAA;OACC,CAAA,GACN,oBAAC,gBAAD;QACgB;QACO;QACT;QACV,gBAAgB;QAChB,aAAa;QACb,YAAY;QACK;QACjB,yBAAyB;QACV;OAClB,CAAA,CACA;QACJ;;IACJ;;GAGL,qBAAC,OAAD;IAAK,WAAW,IACZ,iNACA,mBAAmB,kBAAkB,kBACzC;cAHA,CAII,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAY,WAAU;gBACrC,kBAAkB,SAAS,SAAS,iBAAiB,kBAAkB,SAAS,WAAW,mBAAmB;KACvG,CAAA,GACZ,oBAAC,UAAD;MACI,eAAe,oBAAoB,IAAI;MACvC,WAAU;gBAEV,oBAAC,GAAD,EAAG,WAAU,UAAW,CAAA;KACpB,CAAA,CACP;QACL,qBAAC,OAAD;KAAK,WAAU;eAAf;MACK,kBAAkB,SAAS,UAAU,iBAAiB,iBAAiB,EAAE;MACzE,kBAAkB,SAAS,YAAY,mBAAmB,iBAAiB,EAAE;MAC7E,kBAAkB,SAAS,gBAAgB,sBAAsB;KACjE;MACJ;;GAGJ,oBACG,oBAAC,OAAD;IACI,eAAe,oBAAoB,IAAI;IACvC,WAAU;GACb,CAAA;GAIL,oBAAC,OAAD;IAAK,WAAW,IACZ,uEACA,eAAe,8BAA8B,6CACjD;cACK,gBACG,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,OAAD,EAAO,WAAU,yBAA0B,CAAA,GAC3C,oBAAC,QAAD,EAAA,UAAO,aAAmB,CAAA,CACzB;;GAER,CAAA;EACJ;;AAEb;;;AC7jCA,IAAa,gBAAyE;CAClF,SAAS;EAAE,OAAO;EAAW,OAAO;CAAO;CAC3C,aAAa;EAAE,OAAO;EAAe,OAAO;CAAO;CACnD,WAAW;EAAE,OAAO;EAAa,OAAO;CAAS;CACjD,MAAM;EAAE,OAAO;EAAQ,OAAO;CAAQ;AAC1C;AAEA,IAAa,kBAA6E;CACtF,KAAK;EAAE,OAAO;EAAO,OAAO;CAAO;CACnC,QAAQ;EAAE,OAAO;EAAU,OAAO;CAAS;CAC3C,MAAM;EAAE,OAAO;EAAQ,OAAO;CAAS;CACvC,UAAU;EAAE,OAAO;EAAY,OAAO;CAAM;AAChD;AAEA,IAAa,kBAAmC;CAC5C;EAAE,IAAI;EAAU,MAAM;EAAoB,aAAa;EAAwE,QAAQ;EAAe,UAAU;EAAQ,UAAU;EAAiB,MAAM,CAAC,YAAY,QAAQ;EAAG,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;EAAI,UAAU;EAAI,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAQ,GAAE,YAAY;CAAE;CACvX;EAAE,IAAI;EAAU,MAAM;EAAqB,aAAa;EAAoE,QAAQ;EAAa,UAAU;EAAY,UAAU;EAAa,MAAM,CAAC,WAAW,UAAU;EAAG,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;EAAI,UAAU;EAAI,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAQ,GAAE,YAAY;CAAE;CACnX;EAAE,IAAI;EAAU,MAAM;EAA6B,aAAa;EAAiE,QAAQ;EAAW,UAAU;EAAU,UAAU;EAAe,MAAM,CAAC,UAAU,SAAS;EAAG,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;EAAI,UAAU;EAAG,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,GAAE,YAAY;CAAE;CACnX;EAAE,IAAI;EAAU,MAAM;EAAuB,aAAa;EAAmE,QAAQ;EAAe,UAAU;EAAQ,UAAU;EAAe,MAAM,CAAC,YAAY,MAAM;EAAG,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;EAAI,UAAU;EAAI,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,GAAE,YAAY;CAAE;CAChX;EAAE,IAAI;EAAU,MAAM;EAAwB,aAAa;EAA0E,QAAQ;EAAQ,UAAU;EAAU,UAAU;EAAa,MAAM,CAAC,YAAY,IAAI;EAAG,0BAAS,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;EAAI,UAAU;EAAK,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAQ,GAAE,YAAY;CAAE;CACjX;EAAE,IAAI;EAAU,MAAM;EAAyB,aAAa;EAAgE,QAAQ;EAAW,UAAU;EAAO,UAAU;EAAgB,MAAM,CAAC,WAAW,gBAAgB;EAAG,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;EAAI,UAAU;EAAG,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,GAAE,YAAY;CAAE;CACpX;EAAE,IAAI;EAAU,MAAM;EAAmB,aAAa;EAA6D,QAAQ;EAAe,UAAU;EAAY,UAAU;EAAiB,MAAM;GAAC;GAAW;GAAY;EAAY;EAAG,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;EAAI,UAAU;EAAI,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAQ,GAAE,YAAY;CAAE;CAC9X;EAAE,IAAI;EAAU,MAAM;EAAkB,aAAa;EAAqE,QAAQ;EAAa,UAAU;EAAU,UAAU;EAAa,MAAM,CAAC,WAAW,QAAQ;EAAG,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;EAAI,UAAU;EAAI,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,GAAE,YAAY;CAAE;CAC5W;EAAE,IAAI;EAAU,MAAM;EAA0B,aAAa;EAA8E,QAAQ;EAAQ,UAAU;EAAQ,UAAU;EAAe,MAAM,CAAC,WAAW,UAAU;EAAG,0BAAS,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;EAAI,UAAU;EAAK,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAQ,GAAE,YAAY;CAAE;CAC5X;EAAE,IAAI;EAAW,MAAM;EAAoB,aAAa;EAAwE,QAAQ;EAAW,UAAU;EAAO,UAAU;EAAe,MAAM,CAAC,YAAY,QAAQ;EAAG,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;EAAI,UAAU;EAAG,4BAAW,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,GAAE,YAAY;CAAE;AACpX;;;AC3BA,SAAgB,sBAAsB;CAClC,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAC/C,MAAM,CAAC,WAAW,gBAAgB,SAAoB,MAAM;CAC5D,MAAM,CAAC,eAAe,oBAAoB,SAAwB,KAAK;CACvE,MAAM,CAAC,aAAa,kBAAkB,yBAAsB,IAAI,IAAI,CAAC;CACrE,MAAM,CAAC,cAAc,mBAAmB,SAAiB,KAAK;CAE9D,MAAM,oBAAoB,cAAc;EACpC,IAAI,UAAU,gBAAgB,QAAO,MAAK;GACtC,MAAM,gBAAgB,CAAC,cACnB,EAAE,KAAK,YAAY,EAAE,SAAS,WAAW,YAAY,CAAC,KACtD,EAAE,SAAS,YAAY,EAAE,SAAS,WAAW,YAAY,CAAC;GAC9D,MAAM,gBAAgB,iBAAiB,SAAS,EAAE,WAAW;GAC7D,OAAO,iBAAiB;EAC5B,CAAC;EACD,UAAU,CAAC,GAAG,OAAO,EAAE,MAAM,GAAG,MAAM;GAClC,MAAM,MAAM,OAAO,EAAE,UAAU,EAAE,cAAc,OAAO,EAAE,UAAU,CAAC;GACnE,OAAO,kBAAkB,QAAQ,MAAM,CAAC;EAC5C,CAAC;EACD,OAAO;CACX,GAAG;EAAC;EAAY;EAAW;EAAe;CAAY,CAAC;CAEvD,MAAM,cAAc,UAAqB;EACrC,IAAI,cAAc,OAAO,kBAAiB,MAAK,MAAM,QAAQ,SAAS,KAAK;OACtE;GAAE,aAAa,KAAK;GAAG,iBAAiB,KAAK;EAAG;CACzD;CAEA,MAAM,gBAAgB,OAAe;EACjC,gBAAe,SAAQ;GACnB,MAAM,OAAO,IAAI,IAAI,IAAI;GACzB,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,EAAE;QAAQ,KAAK,IAAI,EAAE;GACnD,OAAO;EACX,CAAC;CACL;CAEA,MAAM,mBAAmB,YAAqB;EAC1C,eAAe,UAAU,IAAI,IAAI,kBAAkB,KAAI,MAAK,EAAE,EAAE,CAAC,oBAAI,IAAI,IAAI,CAAC;CAClF;CAEA,MAAM,cAAc,kBAAkB,SAAS,KAAK,kBAAkB,OAAM,MAAK,YAAY,IAAI,EAAE,EAAE,CAAC;CAEtG,MAAM,YAAY,EAAE,YAAkC;EAClD,IAAI,cAAc,OAAO,OAAO,oBAAC,iBAAD;GAAiB,MAAM;GAAI,WAAU;EAAoB,CAAA;EACzF,OAAO,kBAAkB,QACnB,oBAAC,aAAD;GAAa,MAAM;GAAI,WAAU;EAAgB,CAAA,IACjD,oBAAC,eAAD;GAAe,MAAM;GAAI,WAAU;EAAgB,CAAA;CAC7D;CAEA,OACI,qBAAC,OAAD;EAAK,WAAU;YAAf;GACI,qBAAC,OAAD;IAAK,WAAU;cAAf;KACI,oBAAC,WAAD;MAAW,eAAe,SAAS,cAAc,QAAQ,EAAE;MAAG,aAAY;MAAmB,MAAK;KAAS,CAAA;KAC3G,qBAAC,QAAD;MAAQ,OAAO;MAAc,eAAe;MAAiB,MAAK;MAAQ,aAAY;gBAAtF,CACI,oBAAC,YAAD;OAAY,OAAM;iBAAM;MAAwB,CAAA,GAC9C,OAAO,QAAQ,aAAa,EAA2C,KAAK,CAAC,KAAK,EAAE,aAClF,oBAAC,YAAD;OAAsB,OAAO;iBAAM;MAAkB,GAApC,GAAoC,CACxD,CACG;;KACP,YAAY,OAAO,KAAK,qBAAC,YAAD;MAAY,SAAQ;MAAU,OAAM;gBAApC,CAAiD,YAAY,MAAK,WAAqB;;IAC/G;;GACL,qBAAC,OAAD;IAAK,WAAW,IAAI,qCAAqC,kBAAkB;cAA3E,CACI,qBAAC,OAAD;KAAO,WAAU;eAAjB,CACI,qBAAC,aAAD,EAAA,UAAA;MACI,oBAAC,WAAD;OAAW,QAAA;OAAO,OAAO,EAAE,OAAO,OAAO;iBAAG,oBAAC,UAAD;QAAU,SAAS;QAAa,iBAAiB;QAAiB,MAAK;OAAS,CAAA;MAAY,CAAA;MACxI,oBAAC,WAAD;OAAW,QAAA;iBAAO,qBAAC,UAAD;QAAQ,eAAe,WAAW,MAAM;QAAG,WAAU;kBAArD,CAA8F,oBAAC,YAAD;SAAY,SAAQ;SAAU,WAAU;mBAAgB;QAAgB,CAAA,GAAC,oBAAC,UAAD,EAAU,OAAM,OAAQ,CAAA,CAAS;;MAAY,CAAA;MACtO,oBAAC,WAAD;OAAW,QAAA;iBAAO,qBAAC,UAAD;QAAQ,eAAe,WAAW,QAAQ;QAAG,WAAU;kBAAvD,CAAgG,oBAAC,YAAD;SAAY,SAAQ;SAAU,WAAU;mBAAgB;QAAkB,CAAA,GAAC,oBAAC,UAAD,EAAU,OAAM,SAAU,CAAA,CAAS;;MAAY,CAAA;MAC5O,oBAAC,WAAD;OAAW,QAAA;iBAAO,qBAAC,UAAD;QAAQ,eAAe,WAAW,UAAU;QAAG,WAAU;kBAAzD,CAAkG,oBAAC,YAAD;SAAY,SAAQ;SAAU,WAAU;mBAAgB;QAAoB,CAAA,GAAC,oBAAC,UAAD,EAAU,OAAM,WAAY,CAAA,CAAS;;MAAY,CAAA;MAClP,oBAAC,WAAD;OAAW,QAAA;iBAAO,oBAAC,YAAD;QAAY,SAAQ;QAAU,WAAU;kBAAgB;OAAoB,CAAA;MAAY,CAAA;MAC1G,oBAAC,WAAD;OAAW,QAAA;iBAAO,oBAAC,YAAD;QAAY,SAAQ;QAAU,WAAU;kBAAgB;OAAgB,CAAA;MAAY,CAAA;MACtG,oBAAC,WAAD;OAAW,QAAA;iBAAO,qBAAC,UAAD;QAAQ,eAAe,WAAW,SAAS;QAAG,WAAU;kBAAxD,CAAiG,oBAAC,YAAD;SAAY,SAAQ;SAAU,WAAU;mBAAgB;QAAoB,CAAA,GAAC,oBAAC,UAAD,EAAU,OAAM,UAAW,CAAA,CAAS;;MAAY,CAAA;MAChP,oBAAC,WAAD;OAAW,QAAA;OAAO,OAAO,EAAE,OAAO,OAAO;iBAAG,oBAAC,YAAD;QAAY,SAAQ;QAAU,WAAU;kBAAgB;OAAmB,CAAA;MAAY,CAAA;KAC1H,EAAA,CAAA,GACb,oBAAC,WAAD,EAAA,UACK,kBAAkB,KAAI,YACnB,qBAAC,UAAD;MAA2B,WAAW,IAAI,YAAY,IAAI,QAAQ,EAAE,KAAK,0CAA0C;gBAAnH;OACI,oBAAC,WAAD;QAAW,OAAO,EAAE,OAAO,OAAO;kBAAG,oBAAC,UAAD;SAAU,SAAS,YAAY,IAAI,QAAQ,EAAE;SAAG,uBAAuB,aAAa,QAAQ,EAAE;SAAG,MAAK;QAAS,CAAA;OAAY,CAAA;OAChK,oBAAC,WAAD,EAAA,UAAW,qBAAC,OAAD,EAAA,UAAA,CAAK,oBAAC,YAAD;QAAY,SAAQ;QAAQ,WAAU;kBAAe,QAAQ;OAAiB,CAAA,GAAC,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAgB,QAAQ;OAAwB,CAAA,CAAM,EAAA,CAAA,EAAY,CAAA;OAC3N,oBAAC,WAAD,EAAA,UAAW,oBAAC,MAAD;QAAM,aAAa,cAAc,QAAQ,QAAQ;QAAO,MAAK;kBAAS,cAAc,QAAQ,QAAQ;OAAY,CAAA,EAAY,CAAA;OACvI,oBAAC,WAAD,EAAA,UAAW,oBAAC,MAAD;QAAM,aAAa,gBAAgB,QAAQ,UAAU;QAAO,MAAK;QAAW,UAAA;kBAAU,gBAAgB,QAAQ,UAAU;OAAY,CAAA,EAAY,CAAA;OAC3J,oBAAC,WAAD,EAAA,UAAW,qBAAC,OAAD;QAAK,WAAU;kBAAf,CAAyC,oBAAC,OAAD;SAAK,WAAU;mBAA4I,QAAQ,SAAS;QAAQ,CAAA,GAAC,oBAAC,YAAD;SAAY,SAAQ;SAAQ,WAAU;mBAAY,QAAQ;QAAqB,CAAA,CAAM;UAAY,CAAA;OAC1U,oBAAC,WAAD,EAAA,UAAW,oBAAC,OAAD;QAAK,WAAU;kBAAwB,QAAQ,KAAK,KAAI,QAAQ,oBAAC,MAAD;SAAgB,MAAK;SAAW,aAAY;mBAAQ;QAAU,GAAnD,GAAmD,CAAE;OAAO,CAAA,EAAY,CAAA;OAC9J,oBAAC,WAAD,EAAA,UAAW,oBAAC,YAAD;QAAY,SAAQ;QAAQ,WAAU;kBAAqB,QAAQ;OAAoB,CAAA,EAAY,CAAA;OAC9G,oBAAC,WAAD;QAAW,OAAO,EAAE,OAAO,OAAO;kBAAG,qBAAC,OAAD;SAAK,WAAU;mBAAf,CAA4B,oBAAC,SAAD;UAAS,OAAM;UAAO,SAAA;oBAAQ,oBAAC,YAAD;WAAY,MAAK;qBAAW,oBAAC,cAAD,EAAY,MAAM,SAAS,SAAW,CAAA;UAAa,CAAA;SAAU,CAAA,GAAC,oBAAC,SAAD;UAAS,OAAM;UAAS,SAAA;oBAAQ,oBAAC,YAAD;WAAY,MAAK;qBAAW,oBAAC,cAAD,EAAY,MAAM,SAAS,SAAW,CAAA;UAAa,CAAA;SAAU,CAAA,CAAM;;OAAY,CAAA;MAC9T;QATK,QAAQ,EASb,CACb,EACM,CAAA,CACR;QACN,kBAAkB,WAAW,KAAK,oBAAC,OAAD;KAAK,WAAU;eAAwC,oBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;gBAAY;KAA0C,CAAA;IAAM,CAAA,CACvL;;GACL,qBAAC,YAAD;IAAY,SAAQ;IAAU,OAAM;cAApC;KAAiD,kBAAkB;KAAO;KAAK,gBAAgB;KAAO;IAAqB;;EAC1H;;AAEb;;;AClGA,SAAgB,eAAe;CAC3B,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAC/C,MAAM,CAAC,UAAU,eAAe,SAAmB,IAAI;CAEvD,MAAM,WAAW,cAAc;EAC3B,IAAI,CAAC,YAAY,OAAO;EACxB,MAAM,QAAQ,WAAW,YAAY;EACrC,OAAO,gBAAgB,QAAO,MAC1B,EAAE,KAAK,YAAY,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,YAAY,EAAE,SAAS,KAAK,KAAK,EAAE,KAAK,MAAK,MAAK,EAAE,YAAY,EAAE,SAAS,KAAK,CAAC,CACxI;CACJ,GAAG,CAAC,UAAU,CAAC;CAEf,MAAM,YAAY,cAAc;EAC5B,QAAQ,UAAR;GACI,KAAK,MAAM,OAAO;GAClB,KAAK,MAAM,OAAO;GAClB,KAAK,MAAM,OAAO;EACtB;CACJ,GAAG,CAAC,QAAQ,CAAC;CAEb,OACI,qBAAC,OAAD;EAAK,WAAU;YAAf;GACI,qBAAC,OAAD;IAAK,WAAU;cAAf;KACI,oBAAC,WAAD;MAAW,eAAe,SAAS,cAAc,QAAQ,EAAE;MAAG,aAAY;MAAgB,MAAK;KAAS,CAAA;KACxG,oBAAC,mBAAD;MAAmB,OAAO;MAAU,eAAe;MAAa,SAAS;OACrE;QAAE,OAAO;QAAe,OAAO;QAAS,MAAM,oBAAC,kBAAD,EAAgB,MAAM,GAAK,CAAA;OAAE;OAC3E;QAAE,OAAO;QAAe,OAAO;QAAU,MAAM,oBAAC,YAAD,EAAU,MAAM,GAAK,CAAA;OAAE;OACtE;QAAE,OAAO;QAAe,OAAO;QAAS,MAAM,oBAAC,kBAAD,EAAkB,MAAM,GAAK,CAAA;OAAE;MACjF;KAAI,CAAA;KACJ,qBAAC,YAAD;MAAY,SAAQ;MAAU,OAAM;MAAY,WAAU;gBAA1D,CAAqE,SAAS,QAAO,WAAqB;;IACzG;;GACL,oBAAC,OAAD;IAAK,WAAW,IAAI,cAAc,SAAS;cACtC,SAAS,KAAI,YAAW,oBAAC,aAAD;KAAuC;KAAS,SAAS,aAAa;IAAO,GAA3D,QAAQ,EAAmD,CAAC;GACtG,CAAA;GACJ,SAAS,WAAW,KAAK,oBAAC,OAAD;IAAK,WAAU;cAAwC,oBAAC,YAAD;KAAY,SAAQ;KAAQ,OAAM;eAAY;IAAyC,CAAA;GAAM,CAAA;EAC7K;;AAEb;AAEA,SAAS,YAAY,EAAE,SAAS,WAA0D;CACtF,MAAM,YAAY,cAAc,QAAQ;CACxC,MAAM,cAAc,gBAAgB,QAAQ;CAC5C,MAAM,YAAY,IAAI,KAAK,QAAQ,OAAO,oBAAI,IAAI,KAAK,KAAK,QAAQ,WAAW;CAE/E,OACI,qBAAC,MAAD;EAAM,WAAW,IAAI,iDAAiD,+BAA+B,wCAAwC;YAA7I,CACI,qBAAC,OAAD;GAAK,WAAW,IAAI,+DAA+D,UAAU,SAAS,cAAc;aAApH;IACI,oBAAC,OAAD;KAAK,WAAU;KAA0D,OAAO,EAAE,YAAY,+CAA+C,QAAQ,SAAS,iBAAiB,QAAQ,SAAS,IAAI;IAAI,CAAA;IACxM,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,kBAAD;MAAkB,MAAM,UAAU,KAAK;MAAI,WAAU;KAA0C,CAAA,GAC9F,CAAC,WAAW,qBAAC,YAAD;MAAY,SAAQ;MAAU,OAAM;MAAY,WAAU;gBAA1D,CAAmF,QAAQ,UAAS,YAAsB;OACtI;;IACL,oBAAC,OAAD,EAAK,WAAU,qFAAsF,CAAA;IACrG,oBAAC,OAAD;KAAK,WAAU;eAAyB,oBAAC,MAAD;MAAM,aAAa,YAAY;MAAO,MAAK;MAAW,UAAA;gBAAU,YAAY;KAAY,CAAA;IAAM,CAAA;GACrI;MACL,qBAAC,OAAD;GAAK,WAAW,UAAU,QAAQ;aAAlC;IACI,oBAAC,YAAD;KAAY,SAAQ;KAAU,OAAM;KAAW,WAAU;eAAwC,QAAQ;IAAe,CAAA;IACxH,oBAAC,OAAD;KAAK,WAAU;eAAgB,oBAAC,YAAD;MAAY,SAAS,UAAU,YAAY;MAAS,WAAU;gBAAe,QAAQ;KAAiB,CAAA;IAAM,CAAA;IAC1I,CAAC,WAAW,oBAAC,YAAD;KAAY,SAAQ;KAAU,OAAM;KAAY,WAAU;eAAqB,QAAQ;IAAwB,CAAA;IAC5H,qBAAC,OAAD;KAAK,WAAU;eAAf;MACI,oBAAC,MAAD;OAAM,aAAa,UAAU;OAAO,MAAK;iBAAY,UAAU;MAAY,CAAA;MAC1E,CAAC,WAAW,QAAQ,KAAK,MAAM,GAAG,CAAC,EAAE,KAAI,QAAO,oBAAC,MAAD;OAAgB,MAAK;OAAW,aAAY;OAAO,WAAU;iBAAgB;MAAU,GAA5E,GAA4E,CAAC;MACxI,CAAC,WAAW,QAAQ,KAAK,SAAS,KAAK,qBAAC,QAAD;OAAM,WAAU;iBAAhB,CAA+C,KAAE,QAAQ,KAAK,SAAS,CAAQ;;KACtH;;IACJ,CAAC,WACE,qBAAC,OAAD;KAAK,WAAW,IAAI,wDAAwD,kBAAkB;eAA9F,CACI,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,OAAD;OAAK,WAAU;iBAAkI,QAAQ,SAAS;MAAQ,CAAA,GAC1K,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAA0B,QAAQ;MAAqB,CAAA,CAChH;SACL,oBAAC,YAAD;MAAY,SAAQ;MAAU,WAAW,IAAI,yBAAyB,YAAY,+BAA+B,kBAAkB;gBAAI,QAAQ;KAAoB,CAAA,CAClK;;GAER;IACH;;AAEd;;;AC7EA,IAAM,iBAAkC;CAAC;CAAW;CAAe;CAAa;AAAM;AACtF,IAAM,gBAA+C;CAAE,SAAS;CAAW,aAAa;CAAe,WAAW;CAAa,MAAM;AAAO;AAC5I,IAAM,gBAA+C;CAAE,SAAS;CAAW,aAAa;CAAW,WAAW;CAAW,MAAM;AAAU;AAEzI,SAAS,kBAAkB,EAAE,MAAM,YAAY,eAAe,SAA4C;CACtG,MAAM,UAAU,KAAK;CACrB,MAAM,cAAc,gBAAgB,QAAQ;CAC5C,MAAM,YAAY,IAAI,KAAK,QAAQ,OAAO,oBAAI,IAAI,KAAK,KAAK,QAAQ,WAAW;CAE/E,MAAM,kBAAkB,cAAsB;EAC1C,IAAI,YAAY,OAAO;EACvB,IAAI,eAAe,OAAO;EAC1B,OAAO;CACX,GAAG,CAAC,YAAY,aAAa,CAAC;CAE9B,MAAM,cAAc,cAAsB,aAAa,wBAAwB,IAAI,CAAC,UAAU,CAAC;CAE/F,OACI,oBAAC,OAAD;EAAY;EAAO,WAAU;EAAO,eAAa,KAAK;YAClD,qBAAC,OAAD;GAAK,WAAW,IAAI,gGAAgG,oBAAoB,aAAa,iBAAiB,iBAAiB;aAAvL,CACI,oBAAC,OAAD;IAAK,WAAU;cACX,oBAAC,kBAAD;KAAkB,MAAM;KAAI,WAAU;IAAoB,CAAA;GACzD,CAAA,GACL,qBAAC,OAAD;IAAK,WAAU;cAAf;KACI,oBAAC,OAAD;MAAK,WAAU;gBAAoC,QAAQ;KAAU,CAAA;KACrE,oBAAC,OAAD;MAAK,WAAU;gBAAyD,QAAQ;KAAiB,CAAA;KACjG,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,oBAAC,MAAD;OAAM,aAAa,YAAY;OAAO,MAAK;OAAW,UAAA;OAAS,WAAU;iBAAqC,YAAY;MAAY,CAAA,GACrI,QAAQ,KAAK,MAAM,GAAG,CAAC,EAAE,KAAI,QAAO,oBAAC,MAAD;OAAgB,MAAK;OAAW,aAAY;OAAO,WAAU;iBAA2D;MAAU,GAAvH,GAAuH,CAAC,CACvK;;KACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACI,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACI,oBAAC,OAAD;QAAK,WAAU;kBAAkI,QAAQ,SAAS;OAAQ,CAAA,GAC1K,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAqC,QAAQ;OAAqB,CAAA,CAC3H;UACL,oBAAC,YAAD;OAAY,SAAQ;OAAU,WAAW,IAAI,yBAAyB,YAAY,+BAA+B,kBAAkB;iBAAI,QAAQ;MAAoB,CAAA,CAClK;;IACJ;KACJ;;CACJ,CAAA;AAEb;AAEA,SAAgB,kBAAkB;CAC9B,MAAM,CAAC,WAAW,gBAAgB,eAA2C,gBAAgB,KAAI,OAAM;EAAE,IAAI,EAAE;EAAI,MAAM;CAAE,EAAE,CAAC;CAC9H,MAAM,CAAC,SAAS,cAAc,SAA0B,cAAc;CAEtE,MAAM,eAAe,aAAa,SAAkD,KAAK,KAAK,QAAQ,CAAC,CAAC;CAExG,MAAM,qBAAqB,aAAa,OAAmC,aAA4F;EAOnK,aANqB,MAAM,KAAI,SAAQ;GACnC,IAAI,YAAY,KAAK,OAAO,SAAS,UAAU,SAAS,iBAAiB,SAAS,cAC9E,OAAO;IAAE,GAAG;IAAM,MAAM;KAAE,GAAG,KAAK;KAAM,QAAQ,SAAS;KAAc,UAAU,SAAS,iBAAiB,SAAS,MAAM,KAAK,KAAK;IAAS;GAAE;GAEnJ,OAAO;EACX,CACa,CAAY;CAC7B,GAAG,CAAC,CAAC;CAEL,MAAM,sBAAsB,aAAa,cAA+B,WAAW,SAAS,GAAG,CAAC,CAAC;CAEjG,MAAM,qBAAqB,cAAc;EACrC,MAAM,QAAuG,CAAC;EAC9G,KAAK,MAAM,OAAO,SAAS;GACvB,MAAM,QAAQ,UAAU,QAAO,SAAQ,KAAK,KAAK,WAAW,GAAG,EAAE;GACjE,MAAM,OAAO;IAAE,SAAS;IAAO,SAAS;IAAO,WAAW;IAAO,YAAY;GAAM;EACvF;EACA,OAAO;CACX,GAAG,CAAC,WAAW,OAAO,CAAC;CAEvB,OACI,qBAAC,OAAD;EAAK,WAAU;YAAf,CACI,oBAAC,OAAD;GAAO,OAAM;GAAO,MAAK;aAAQ;EAA0F,CAAA,GAC3H,oBAAC,OAAD;GAAK,WAAW,IAAI,qCAAqC,kBAAkB;GAAG,OAAO,EAAE,QAAQ,IAAI;aAC/F,oBAAC,YAAD;IACI,MAAM;IAAoB;IAAS,cAAc;IAAe,cAAc;IAChE;IAAc,oBAAoB;IAAM,iBAAiB;IACvE,gBAAgB;IAAoB,eAAe;IAAuC;GAC7F,CAAA;EACA,CAAA,CACJ;;AAEb;;;;;;;;;;;;;;ACZA,IAAM,WAAW;CACb;EAAE,IAAI;EAAU,OAAO;EAAU,MAAM;CAAc;CACrD;EAAE,IAAI;EAAU,OAAO;EAAW,MAAM;CAAU;CAClD;EAAE,IAAI;EAAQ,OAAO;EAAQ,MAAM;CAAS;CAC5C;EAAE,IAAI;EAAkB,OAAO;EAAkB,MAAM;CAAY;CACnE;EAAE,IAAI;EAAgB,OAAO;EAAgB,MAAM;CAAS;CAC5D;EAAE,IAAI;EAAc,OAAO;EAAc,MAAM;CAAS;CACxD;EAAE,IAAI;EAAW,OAAO;EAAW,MAAM;CAAS;CAClD;EAAE,IAAI;EAAU,OAAO;EAAe,MAAM;CAAa;CACzD;EAAE,IAAI;EAAgB,OAAO;EAAkB,MAAM;CAAgB;CACrE;EAAE,IAAI;EAAS,OAAO;EAAc,MAAM;CAAS;CACnD;EAAE,IAAI;EAAe,OAAO;EAAe,MAAM;CAAe;CAChE;EAAE,IAAI;EAAiB,OAAO;EAAiB,MAAM;CAAe;CACpE;EAAE,IAAI;EAAoB,OAAO;EAAoB,MAAM;CAAS;CACpE;EAAE,IAAI;EAAa,OAAO;EAAa,MAAM;CAAe;CAC5D;EAAE,IAAI;EAAgB,OAAO;EAAgB,MAAM;CAAW;AAClE;AAEA,SAAgB,kBAAkB;CAC9B,MAAM,CAAC,eAAe,oBAAoB,SAAS,QAAQ;CAC3D,MAAM,qBAAqB,MAAM,OAAuB,IAAI;CAE5D,MAAM,YAAY,OAAe;EAC7B,MAAM,KAAK,SAAS,eAAe,EAAE;EACrC,MAAM,YAAY,mBAAmB;EACrC,IAAI,MAAM,WAAW;GACjB,MAAM,YAAY,GAAG,YAAY,UAAU;GAC3C,UAAU,SAAS;IAAE,KAAK;IAAW,UAAU;GAAS,CAAC;EAC7D;EACA,iBAAiB,EAAE;CACvB;CAEA,OACI,qBAAC,OAAD;EAAK,WAAU;YAAf,CAGI,qBAAC,OAAD;GAAK,WAAW,IAAI,0EAA0E,kBAAkB;aAAhH;IAEI,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,OAAD;MAAK,WAAU;gBACX,oBAAC,YAAD;OAAY,OAAM;OAAO,QAAO;MAAO,CAAA;KACtC,CAAA,GACL,oBAAC,YAAD;MAAY,SAAQ;MAAY,QAAA;MAAO,WAAU;gBAAW;KAAkB,CAAA,CAC7E;;IAGL,oBAAC,OAAD;KAAK,WAAU;eACX,qBAAC,OAAD;MAAK,WAAU;gBAAf,CAEI,qBAAC,OAAD;OAAK,WAAW,IAAI,gLAAgL;iBAApM,CACI,oBAAC,iBAAD;QAAiB,MAAM,SAAS;QAAU,WAAU;OAAgF,CAAA,GACpI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAqC;OAEnF,CAAA,CACX;UAEL,oBAAC,OAAD;OAAK,WAAU;iBACV,SAAS,KAAI,MAAK;QACf,MAAM,gBAAgB,EAAE;QACxB,OACI,oBAAC,OAAD,EAAA,UACI,qBAAC,OAAD;SACI,eAAe,SAAS,EAAE,EAAE;SAC5B,WAAW,IACP,iCACA,mIACA,8BACA,aACA,sCACA,kBAAkB,EAAE,KAAK,mEAAmE,EAChG;mBATJ,CAWI,oBAAC,OAAD;UAAK,WAAW,IAAI,0KAA0K,kBAAkB,EAAE,MAAM,gCAAgC;oBACpP,oBAAC,eAAD,EAAe,MAAM,SAAS,MAAO,CAAA;SACpC,CAAA,GACL,oBAAC,OAAD;UAAK,WAAU;oBACV,EAAE,MAAM,YAAY;SACpB,CAAA,CACJ;WACJ,GAnBK,EAAE,EAmBP;OAEb,CAAC;MACA,CAAA,CACJ;;IACJ,CAAA;IAGL,oBAAC,OAAD;KAAK,WAAW,IAAI,uCAAuC,kBAAkB;eACzE,qBAAC,OAAD;MAAK,WAAW,IACZ,wDACA,yDACA,kCACA,MACJ;gBALA,CAMI,oBAAC,OAAD;OAAK,WAAU;iBACX,oBAAC,kBAAD,EAAkB,MAAM,SAAS,MAAO,CAAA;MACvC,CAAA,GACL,oBAAC,YAAD;OAAY,SAAQ;OAAQ,WAAU;iBAAuE;MAEjG,CAAA,CACX;;IACJ,CAAA;GACJ;MAGL,qBAAC,OAAD;GAAK,KAAK;GAAoB,WAAU;aAAxC;IAKI,qBAAC,cAAD;KAAc,IAAG;KAAS,OAAM;eAAhC,CACI,qBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;MAAY,WAAU;gBAAxD;OAA+D;OAC1C,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAgB,CAAA;OAAC;OAAa,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAA2B,CAAA;OAAC;OAC/I,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAkB,CAAA;OAAC;MACnD;SACZ,qBAAC,OAAD;MAAK,WAAU;gBAAf,CAGI,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAAa;MAA4B,CAAA,GACnG,qBAAC,OAAD;OAAK,WAAW,IAAI,uGAAuG,kBAAkB;iBAA7I;QACI,oBAAC,OAAD;SAAK,WAAU;mBACX,oBAAC,OAAD;UAAK,WAAU;oBACX,oBAAC,YAAD;WAAY,OAAM;WAAO,QAAO;UAAO,CAAA;SACtC,CAAA;QACJ,CAAA;QACL,oBAAC,OAAD;SAAK,WAAU;mBACX,oBAAC,OAAD;UAAK,WAAU;oBACX,oBAAC,OAAD;WAAK,WAAU;qBACV;YAAC,oBAAC,YAAD,EAAyB,MAAM,SAAS,MAAO,GAA/B,QAA+B;YAAG,oBAAC,UAAD,EAAqB,MAAM,SAAS,MAAO,GAA7B,MAA6B;YAAG,oBAAC,SAAD,EAAmB,MAAM,SAAS,MAAO,GAA5B,KAA4B;WAAC,EAAE,KAAK,MAAM,MACrJ,oBAAC,OAAD;YAAa,WAAU;sBACnB,oBAAC,OAAD;aAAK,WAAU;uBACV;YACA,CAAA;WACJ,GAJK,CAIL,CACR;UACA,CAAA;SACJ,CAAA;QACJ,CAAA;QACL,oBAAC,OAAD;SAAK,WAAW,IAAI,uCAAuC,kBAAkB;mBACzE,oBAAC,OAAD;UAAK,WAAU;oBACX,oBAAC,OAAD;WAAK,WAAU;qBACX,oBAAC,mBAAD,EAAmB,MAAM,SAAS,MAAO,CAAA;UACxC,CAAA;SACJ,CAAA;QACJ,CAAA;OACJ;QACJ,EAAA,CAAA,GAGL,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAAa;MAA4B,CAAA,GACnG,qBAAC,OAAD;OAAK,WAAW,IAAI,wGAAwG,kBAAkB;iBAA9I;QAEI,qBAAC,OAAD;SAAK,WAAU;mBAAf,CACI,oBAAC,OAAD;UAAK,WAAU;oBACX,oBAAC,YAAD;WAAY,OAAM;WAAO,QAAO;UAAO,CAAA;SACtC,CAAA,GACL,oBAAC,OAAD;UAAK,WAAU;oBACX,oBAAC,YAAD;WAAY,SAAQ;WAAY,QAAA;WAAO,WAAU;qBAAW;UAAkB,CAAA;SAC7E,CAAA,CACJ;;QAEL,oBAAC,OAAD;SAAK,WAAU;mBACX,qBAAC,OAAD;UAAK,WAAU;oBAAf,CACI,qBAAC,OAAD;WAAK,WAAU;qBAAf,CACI,oBAAC,iBAAD;YAAiB,MAAM,SAAS;YAAU,WAAU;WAA8C,CAAA,GAClG,oBAAC,YAAD;YAAY,SAAQ;YAAU,OAAM;YAAY,WAAU;sBAAqC;WAAmB,CAAA,CACjH;cACL,oBAAC,OAAD;WAAK,WAAU;qBACV;YACG;aAAE,OAAO;aACzD,MAAM,oBAAC,YAAD,EAAY,MAAM,SAAS,MAAO,CAAA;aACxC,QAAQ;YAAK;YACmC;aAAE,OAAO;aACzD,MAAM,oBAAC,UAAD,EAAU,MAAM,SAAS,MAAO,CAAA;aACtC,QAAQ;YAAM;YACkC;aAAE,OAAO;aACzD,MAAM,oBAAC,SAAD,EAAS,MAAM,SAAS,MAAO,CAAA;aACrC,QAAQ;YAAM;WAC8B,EAAE,KAAK,EAAE,OAAO,MAAM,aAClB,qBAAC,OAAD;YAAiB,WAAW,IACxB,+NACA,SAAS,mEAAmE,EAChF;sBAHA,CAII,oBAAC,OAAD;aAAK,WAAW,IAAI,8FAA8F,SAAS,mCAAmC,gDAAgD;uBACzM;YACA,CAAA,GACL,oBAAC,OAAD;aAAK,WAAU;uBACV,MAAM,YAAY;YAClB,CAAA,CACJ;cAVK,KAUL,CACR;UACA,CAAA,CACJ;;QACJ,CAAA;QAEL,oBAAC,OAAD;SAAK,WAAW,IAAI,uCAAuC,kBAAkB;mBACzE,qBAAC,OAAD;UAAK,WAAU;oBAAf,CACI,oBAAC,OAAD;WAAK,WAAU;qBACX,oBAAC,kBAAD,EAAkB,MAAM,SAAS,MAAO,CAAA;UACvC,CAAA,GACL,oBAAC,OAAD;WAAK,WAAU;qBACX,oBAAC,YAAD;YAAY,SAAQ;YAAQ,WAAU;sBAAuE;WAEjG,CAAA;UACX,CAAA,CACJ;;QACJ,CAAA;OACJ;QACJ,EAAA,CAAA,CACJ;OACK;;IAKd,qBAAC,cAAD;KAAc,IAAG;KAAS,OAAM;eAAhC,CACI,qBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;MAAY,WAAU;gBAAxD;OAA+D;OAC7C,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAyB,CAAA;OAAC;OACvC,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAU,CAAA;OAAC;MAC5E;SAEZ,qBAAC,OAAD;MAAK,WAAW,IAAI,gFAAgF,kBAAkB;gBAAtH;OAEI,oBAAC,OAAD;QAAK,WAAU;kBACX,qBAAC,OAAD;SAAK,WAAU;mBAAf;UACI,oBAAC,YAAD;WAAY,SAAQ;WAAU,OAAM;qBAAY;UAAa,CAAA;UAC7D,qBAAC,OAAD;WAAK,WAAU;qBAAf,CACI,oBAAC,YAAD;YAAY,SAAQ;sBAAQ;WAAiB,CAAA,GAC7C,oBAAC,QAAD;YAAM,WAAU;sBAAoH;WAAQ,CAAA,CAC3I;;UACL,oBAAC,YAAD;WAAY,SAAQ;WAAU,OAAM;qBAAY;UAAa,CAAA;UAC7D,oBAAC,OAAD;WAAK,WAAU;qBACX,oBAAC,YAAD;YAAY,SAAQ;sBAAQ;WAAmB,CAAA;UAC9C,CAAA;SACJ;;OACJ,CAAA;OACL,oBAAC,OAAD,EAAK,WAAU,OAAO,CAAA;OAEtB,qBAAC,OAAD;QAAK,WAAW,IAAI,kFAAkF,kBAAkB;kBAAxH,CACI,oBAAC,UAAD;SAAQ,WAAW,IAAI,6DAA6D,2EAA2E;mBAAG;QAE1J,CAAA,GACR,oBAAC,UAAD;SAAQ,WAAW,IAAI,6DAA6D,+DAA+D;mBAAG;QAE9I,CAAA,CACP;;OAEL,qBAAC,MAAD;QAAM,SACF,oBAAC,YAAD;SAAY,OAAM;mBACd,oBAAC,UAAD,CAAU,CAAA;QACF,CAAA;kBAHhB;SAKI,qBAAC,UAAD,EAAA,UAAA,CAAU,oBAAC,UAAD,EAAU,MAAM,SAAS,SAAU,CAAA,GAAC,OAAe,EAAA,CAAA;SAC7D,qBAAC,UAAD,EAAA,UAAA,CAAU,oBAAC,SAAD,EAAS,MAAM,SAAS,SAAU,CAAA,GAAC,QAAgB,EAAA,CAAA;SAC7D,qBAAC,UAAD,EAAA,UAAA,CAAU,oBAAC,aAAD,EAAa,MAAM,SAAS,SAAU,CAAA,GAAC,SAAiB,EAAA,CAAA;QAChE;;OAEN,qBAAC,MAAD;QAAM,SAAS,oBAAC,QAAD,EAAA,UAAQ,IAAS,CAAA;kBAAhC;SACI,qBAAC,OAAD;UAAK,WAAU;oBAAf,CACI,oBAAC,YAAD;WAAY,SAAQ;WAAQ,OAAM;qBAAY;UAAyB,CAAA,GACvE,oBAAC,YAAD;WAAY,SAAQ;WAAQ,OAAM;qBAAY;UAA6B,CAAA,CAC1E;;SACL,qBAAC,UAAD,EAAA,UAAA,CAAU,oBAAC,cAAD,CAAc,CAAA,GAAC,mBAA2B,EAAA,CAAA;SACpD,qBAAC,UAAD,EAAA,UAAA,CAAU,oBAAC,YAAD,CAAY,CAAA,GAAC,UAAkB,EAAA,CAAA;QACvC;;MACL;OACK;;IAKd,qBAAC,cAAD;KAAc,IAAG;KAAO,OAAM;eAA9B,CACI,qBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;MAAY,WAAU;gBAAxD;OAA+D;OACjC,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAA8B,CAAA;OAAC;MAErF;SAEZ,qBAAC,OAAD;MAAK,WAAU;gBAAf;OAEI,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAuB;OAAuC,CAAA,GACxH,qBAAC,MAAD;QAAM,OAAM;QAAO,qBAAqB,CAAC;kBAAzC;SACI,oBAAC,KAAD;UAAK,OAAM;oBAAO;SAAW,CAAA;SAC7B,oBAAC,KAAD;UAAK,OAAM;oBAAO;SAAa,CAAA;SAC/B,oBAAC,KAAD;UAAK,OAAM;oBAAO;SAAY,CAAA;QAC5B;SACL,EAAA,CAAA;OAGL,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAuB;OAAsD,CAAA,GACvI,qBAAC,OAAD;QAAK,WAAW,IAAI,+CAA+C,kBAAkB;kBAArF;SACI,qBAAC,MAAD;UAAM,OAAM;UAAS,qBAAqB,CAAC;UAAG,SAAQ;UAAO,WAAU;oBAAvE;WACI,oBAAC,KAAD;YAAK,OAAM;sBAAS;WAAW,CAAA;WAC/B,oBAAC,KAAD;YAAK,OAAM;sBAAW;WAAa,CAAA;WACnC,oBAAC,KAAD;YAAK,OAAM;sBAAU;WAAY,CAAA;UAC/B;;SAEN,qBAAC,OAAD;UAAK,WAAW,IAAI,oFAAoF,kBAAkB;oBAA1H,CACI,oBAAC,YAAD;WAAY,SAAQ;WAAU,WAAU;qBAAqF;UAAkB,CAAA,GAC/I,oBAAC,YAAD;WAAY,MAAK;qBACb,oBAAC,cAAD,EAAc,MAAM,SAAS,SAAU,CAAA;UAC/B,CAAA,CACX;;SACL,oBAAC,OAAD;UAAK,WAAU;oBACX,oBAAC,YAAD;WAAY,SAAQ;WAAU,WAAU;qBAA6D;UAA6B,CAAA;SACjI,CAAA;QACJ;SACJ,EAAA,CAAA;OAGL,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAuB;OAAqD,CAAA,GACtI,qBAAC,OAAD;QAAK,WAAW,IAAI,yGAAyG,kBAAkB;kBAA/I,CACI,qBAAC,OAAD;SAAK,WAAU;mBAAf,CACI,qBAAC,MAAD;UAAM,OAAM;UAAS,qBAAqB,CAAC;UAAG,SAAQ;UAAO,WAAU;oBAAvE,CACI,qBAAC,KAAD;WAAK,OAAM;WAAS,WAAU;qBAA9B,CACI,oBAAC,OAAD;YAAK,WAAU;YAA4B,MAAK;YAAO,QAAO;YAAe,SAAQ;sBAAY,oBAAC,QAAD;aAAM,eAAc;aAAQ,gBAAe;aAAQ,aAAa;aAAK,GAAE;YAAiJ,CAAA;WAAM,CAAA,GAAC,SAE/T;cACL,qBAAC,KAAD;WAAK,OAAM;WAAS,WAAU;qBAA9B,CACI,oBAAC,OAAD;YAAK,WAAU;YAA4B,MAAK;YAAO,QAAO;YAAe,SAAQ;sBAAY,oBAAC,QAAD;aAAM,eAAc;aAAQ,gBAAe;aAAQ,aAAa;aAAK,GAAE;YAAiJ,CAAA;WAAM,CAAA,GAAC,SAE/T;YACH;aACN,oBAAC,YAAD;UAAY,MAAK;UAAQ,WAAU;oBAC/B,oBAAC,UAAD,CAAU,CAAA;SACF,CAAA,CACX;YACL,qBAAC,OAAD;SAAK,WAAU;mBAAf;UACI,oBAAC,QAAD;WAAQ,SAAQ;WAAO,MAAK;qBAAQ;UAAe,CAAA;UACnD,oBAAC,OAAD,EAAK,WAAU,8CAA8C,CAAA;UAC7D,oBAAC,QAAD;WAAQ,MAAK;WAAQ,OAAM;qBAAU;UAAW,CAAA;SAC/C;UACJ;SACJ,EAAA,CAAA;MACJ;OACK;;IAKd,qBAAC,cAAD;KAAc,IAAG;KAAiB,OAAM;eAAxC,CACI,qBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;MAAY,WAAU;gBAAxD;OAA+D;OAE3D,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAmC,CAAA;OAAC;OACiB,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAe,CAAA;OAAC;OAAE,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAa,CAAA;OAAC;MACzL;SAEZ,qBAAC,OAAD;MAAK,WAAU;gBAAf;OAEI,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAa;OAA8B,CAAA,GACrG,qBAAC,OAAD;QAAK,WAAW,IAAI,kEAAkE,kBAAkB;kBAAxG;SACI,qBAAC,MAAD;UAAM,OAAM;UAAS,qBAAqB,CAAC;UAAG,SAAQ;UAAO,WAAU;oBAAvE;WACI,oBAAC,KAAD;YAAK,OAAM;sBAAS;WAAW,CAAA;WAC/B,oBAAC,KAAD;YAAK,OAAM;sBAAW;WAAa,CAAA;WACnC,oBAAC,KAAD;YAAK,OAAM;sBAAU;WAAY,CAAA;UAC/B;;SACN,qBAAC,OAAD;UAAK,WAAW,IAAI,oFAAoF,kBAAkB;oBAA1H,CACI,oBAAC,YAAD;WAAY,SAAQ;WAAU,WAAU;qBAAuF;UAAkB,CAAA,GACjJ,oBAAC,YAAD;WAAY,MAAK;qBACb,oBAAC,cAAD,EAAc,MAAM,SAAS,SAAU,CAAA;UAC/B,CAAA,CACX;;SACL,oBAAC,OAAD;UAAK,WAAU;oBAEX,qBAAC,OAAD;WAAK,WAAU;qBAAf,CACI,qBAAC,OAAD;YAAK,WAAU;sBAAf,CACI,oBAAC,OAAD;aAAK,WAAU;aAAyB,MAAK;aAAe,SAAQ;uBAAY,oBAAC,QAAD,EAAM,GAAE,qHAAqH,CAAA;YAAM,CAAA,GACnN,oBAAC,YAAD;aAAY,SAAQ;aAAQ,WAAU;uBAAoE;YAAkB,CAAA,CAC3H;eACL,oBAAC,OAAD;YAAK,WAAU;sBACV;aAAC;aAAS;aAAS;YAAU,EAAE,KAAI,MAChC,qBAAC,OAAD;aAAa,WAAU;uBAAvB,CACI,oBAAC,OAAD;cAAK,WAAU;cAA4E,MAAK;cAAO,QAAO;cAAe,SAAQ;wBAAY,oBAAC,QAAD;eAAM,eAAc;eAAQ,gBAAe;eAAQ,aAAa;eAAG,GAAE;cAA4F,CAAA;aAAM,CAAA,GACxT,oBAAC,YAAD;cAAY,SAAQ;cAAQ,WAAU;wBAAsE;aAAc,CAAA,CACzH;eAHK,CAGL,CACR;WACA,CAAA,CACJ;;SACJ,CAAA;QACJ;SACJ,EAAA,CAAA;OAGL,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAa;OAA8B,CAAA,GACrG,qBAAC,OAAD;QAAK,WAAW,IAAI,kEAAkE,kBAAkB;kBAAxG;SACI,qBAAC,MAAD;UAAM,OAAM;UAAS,qBAAqB,CAAC;UAAG,SAAQ;UAAO,WAAU;oBAAvE,CACI,oBAAC,KAAD;WAAK,OAAM;qBAAS;UAAW,CAAA,GAC/B,oBAAC,KAAD;WAAK,OAAM;qBAAO;UAAS,CAAA,CACzB;;SACN,qBAAC,OAAD;UAAK,WAAW,IAAI,oFAAoF,kBAAkB;oBAA1H,CACI,oBAAC,YAAD;WAAY,SAAQ;WAAU,WAAU;qBAAqF;UAAe,CAAA,GAC5I,oBAAC,YAAD;WAAY,MAAK;qBACb,oBAAC,cAAD,EAAc,MAAM,SAAS,SAAU,CAAA;UAC/B,CAAA,CACX;;SACL,oBAAC,OAAD;UAAK,WAAU;oBACX,qBAAC,OAAD;WAAK,WAAU;qBAAf,CACI,qBAAC,OAAD;YAAK,WAAU;sBAAf,CACI,oBAAC,OAAD;aAAK,WAAU;aAAyB,MAAK;aAAe,SAAQ;uBAAY,oBAAC,QAAD,EAAM,GAAE,qHAAqH,CAAA;YAAM,CAAA,GACnN,oBAAC,YAAD;aAAY,SAAQ;aAAQ,WAAU;uBAAoE;YAAkB,CAAA,CAC3H;eACL,oBAAC,OAAD;YAAK,WAAU;sBACV;aAAC;cAAE,MAAM;cACtD,SAAS;aAAK;aAAG;cAAE,MAAM;cACzB,SAAS;aAAK;aAAG;cAAE,MAAM;cACzB,SAAS;aAAM;YAAC,EAAE,KAAI,MAC0B,qBAAC,OAAD;aAAkB,WAAW,IAAI,kEAAkE,EAAE,SAAS,UAAU,kDAAkD,oEAAoE;uBAA9O;cACI,oBAAC,OAAD;eAAK,WAAU;eAA+C,MAAK;eAAO,QAAO;eAAe,SAAQ;yBAAY,oBAAC,QAAD;gBAAM,eAAc;gBAAQ,gBAAe;gBAAQ,aAAa;gBAAG,GAAE;eAA4F,CAAA;cAAM,CAAA;cAC3R,oBAAC,YAAD;eAAY,SAAQ;eAAQ,WAAU;yBAA2B,EAAE;cAAiB,CAAA;cACpF,oBAAC,OAAD,EAAK,WAAW,IAAI,qCAAqC,EAAE,UAAU,iBAAiB,0BAA0B,EAAG,CAAA;aAClH;eAJK,EAAE,IAIP,CACR;WACA,CAAA,CACJ;;SACJ,CAAA;QACJ;SACJ,EAAA,CAAA;OAGL,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAa;OAAqC,CAAA,GAC5G,qBAAC,OAAD;QAAK,WAAW,IAAI,+FAA+F,kBAAkB;kBAArI,CACI,qBAAC,OAAD;SAAK,WAAW,IAAI,oFAAoF,kBAAkB;mBAA1H,CACI,oBAAC,YAAD;UAAY,SAAQ;UAAU,WAAU;oBAAqF;SAAuB,CAAA,GACpJ,oBAAC,YAAD;UAAY,MAAK;oBACb,oBAAC,UAAD,EAAU,MAAM,SAAS,SAAU,CAAA;SAC3B,CAAA,CACX;YACL,oBAAC,OAAD;SAAK,WAAU;mBACV;UAAC,EAAE,MAAM,UAAU;UAAG;WAAE,MAAM;WACnE,UAAU;UAAK;UAAG,EAAE,MAAM,OAAO;SAAC,EAAE,KAAI,MACA,qBAAC,OAAD;UAAkB,WAAW,IAAI,yFAAyF,EAAE,WAAW,0EAA0E,kGAAkG;oBAAnT,CACI,oBAAC,YAAD;WAAY,MAAM,SAAS;WAAO,WAAW,IAAI,EAAE,WAAW,yCAAyC,mDAAmD;UAAG,CAAA,GAC7J,oBAAC,QAAD;WAAM,WAAU;qBAAmB,EAAE;UAAW,CAAA,CAC/C;YAHK,EAAE,IAGP,CACR;QACA,CAAA,CACJ;SACJ,EAAA,CAAA;MACJ;OACK;;IAKd,qBAAC,cAAD;KAAc,IAAG;KAAe,OAAM;eAAtC,CACI,qBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;MAAY,WAAU;gBAAxD;OAA+D;OACM,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAc,CAAA;OAAC;OAC/G,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAA0C,CAAA;OAAC;OAAuB,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAY,CAAA;OAAC;OAAM,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAa,CAAA;OAAC;OAC3M,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAoC,CAAA;OAAC;OAAE,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAA2B,CAAA;OAAC;OAAE,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAA0B,CAAA;OAAC;MAC7M;SAEZ,qBAAC,OAAD;MAAK,WAAU;gBAAf;OAEI,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAa;OAA0C,CAAA,GACjH,oBAAC,OAAD;QAAK,WAAW,IAAI,8EAA8E,kBAAkB;kBAChH,qBAAC,OAAD;SAAK,WAAU;mBAAf,CACI,oBAAC,YAAD;UAAY,SAAQ;oBAAQ;SAEhB,CAAA,GACZ,qBAAC,QAAD,EAAA,UAAA,CACI,oBAAC,UAAD,CAAU,CAAA,GAAC,kBAEP,EAAA,CAAA,CACP;;OACJ,CAAA,CACJ,EAAA,CAAA;OAGL,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAa;OAA8C,CAAA,GACrH,oBAAC,OAAD;QAAK,WAAW,IAAI,8EAA8E,kBAAkB;kBAChH,qBAAC,OAAD;SAAK,WAAU;mBAAf,CACI,oBAAC,YAAD;UAAY,SAAQ;oBAAQ;SAEhB,CAAA,GACZ,qBAAC,QAAD,EAAA,UAAA,CACI,oBAAC,UAAD,CAAU,CAAA,GAAC,kBAEP,EAAA,CAAA,CACP;;OACJ,CAAA,CACJ,EAAA,CAAA;OAGL,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAa;OAA8C,CAAA,GACrH,oBAAC,OAAD;QAAK,WAAW,IAAI,8EAA8E,kBAAkB;kBAChH,qBAAC,OAAD;SAAK,WAAU;mBAAf,CACI,oBAAC,YAAD;UAAY,SAAQ;oBAAQ;SAEhB,CAAA,GACZ,qBAAC,QAAD,EAAA,UAAA,CACI,oBAAC,UAAD,CAAU,CAAA,GAAC,oBAEP,EAAA,CAAA,CACP;;OACJ,CAAA,CACJ,EAAA,CAAA;MACJ;OACK;;IAKd,qBAAC,cAAD;KAAc,IAAG;KAAa,OAAM;eAApC;MACI,qBAAC,YAAD;OAAY,SAAQ;OAAQ,OAAM;OAAY,WAAU;iBAAxD;QAA+D;QACzC,oBAAC,QAAD;SAAM,WAAU;mBAAoB;QAAgB,CAAA;QAAC;OAC/D;;MACZ,oBAAC,OAAD;OAAK,WAAU;iBACT;QAAC;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAa;QAAa;QAAS;QAAS;QAAW;QAAS;OAAQ,EAAY,KAAI,MAC3H,qBAAC,OAAD;QAAa,WAAW,IAAI,yDAAyD,kBAAkB;kBAAvG,CACI,oBAAC,QAAD;SAAM,WAAU;mBAAoD;QAAQ,CAAA,GAC5E,oBAAC,YAAD;SAAY,SAAS;mBAAG;QAAuD,CAAA,CAC9E;UAHK,CAGL,CACR;MACA,CAAA;MACL,oBAAC,OAAD;OAAK,WAAU;iBACT;QAAC;QAAW;QAAa;QAAY;OAAO,EAAY,KAAI,MAC1D,qBAAC,YAAD;QAAoB,OAAO;kBAA3B;SAA8B;SAAa;SAAE;QAAkB;UAA9C,CAA8C,CAClE;MACA,CAAA;KACK;;IAKd,oBAAC,cAAD;KAAc,IAAG;KAAU,OAAM;eAC7B,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACM,CAAC,UAAU,MAAM,EAAY,KAAI,YAC/B,qBAAC,OAAD,EAAA,UAAA,CACI,qBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAA1D;SAAiF;SAAe;SAAQ;QAAkB;WAC1H,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACM;SAAC;SAAW;SAAa;SAAQ;SAAS;QAAS,EAAY,KAAI,UACjE,oBAAC,QAAD;SAA6B;SAAgB;mBAAQ,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC;QAAU,GAA/F,KAA+F,CAC/G,GACD,oBAAC,QAAD;SAAiB;SAAS,UAAA;mBAAS;QAAgB,CAAA,CAClD;SACJ,EAAA,GARK,OAQL,CACR;OACD,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAuB;OAAiB,CAAA,GAClG,oBAAC,OAAD;QAAK,WAAU;kBACT;SAAC;SAAS;SAAU;SAAS;SAAM;QAAK,EAAY,KAAI,MACtD,oBAAC,QAAD;SAAgB,MAAM;mBAAI,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC;QAAU,GAA5D,CAA4D,CAC5E;OACA,CAAA,CACJ,EAAA,CAAA;OACL,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAuB;OAA8B,CAAA,GAC/G,qBAAC,OAAD;QAAK,WAAU;kBAAf;SACM;UACE;WAAE,GAAG;WAAqB,MAAM,oBAAC,YAAD,EAAY,MAAM,GAAI,CAAA;UAAE;UACxD;WAAE,GAAG;WAAkB,MAAM,oBAAC,YAAD,EAAY,MAAM,GAAI,CAAA;UAAE;UACrD;WAAE,GAAG;WAAmB,MAAM,oBAAC,YAAD,EAAY,MAAM,GAAI,CAAA;UAAE;UACtD;WAAE,GAAG;WAAkB,MAAM,oBAAC,YAAD,EAAY,MAAM,GAAI,CAAA;UAAE;SACzD,EAAG,KAAK,EAAE,GAAG,WACT,qBAAC,OAAD;UAAa,WAAU;oBAAvB,CACI,oBAAC,YAAD;WAAY,MAAM;qBAAI;UAAiB,CAAA,GACvC,oBAAC,YAAD;WAAY,SAAQ;WAAU,OAAM;qBAAa,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC;UAAc,CAAA,CACnG;YAHK,CAGL,CACR;SACD,qBAAC,OAAD;UAAK,WAAU;oBAAf,CACI,oBAAC,YAAD;WAAY,UAAA;qBAAS,oBAAC,YAAD,EAAY,MAAM,GAAI,CAAA;UAAa,CAAA,GACxD,oBAAC,YAAD;WAAY,SAAQ;WAAU,OAAM;qBAAY;UAAoB,CAAA,CACnE;;SACL,qBAAC,OAAD;UAAK,WAAU;oBAAf,CACI,oBAAC,YAAD;WAAY,SAAQ;qBAAS,oBAAC,UAAD,EAAU,MAAM,GAAI,CAAA;UAAa,CAAA,GAC9D,oBAAC,YAAD;WAAY,SAAQ;WAAU,OAAM;qBAAY;UAAkB,CAAA,CACjE;;SACL,qBAAC,OAAD;UAAK,WAAU;oBAAf,CACI,oBAAC,YAAD;WAAY,OAAM;qBAAS,oBAAC,cAAD,EAAc,MAAM,GAAI,CAAA;UAAa,CAAA,GAChE,oBAAC,YAAD;WAAY,SAAQ;WAAU,OAAM;qBAAY;UAAkB,CAAA,CACjE;;QACJ;SACJ,EAAA,CAAA;OACL,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAuB;OAAyB,CAAA,GAC1G,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,eAAD;SAAe,SAAS;mBAAM;QAAsB,CAAA,GACpD,oBAAC,eAAD;SAAe,SAAS;mBAAO;QAAmB,CAAA,CACjD;SACJ,EAAA,CAAA;MACJ;;IACK,CAAA;IAKd,oBAAC,cAAD;KAAc,IAAG;KAAS,OAAM;eAC5B,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACI,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,YAAD;SAAY,SAAQ;SAAU,OAAM;SAAY,WAAU;mBAAuB;QAAqB,CAAA,GACtG,qBAAC,OAAD;SAAK,WAAU;mBAAf;UACI,oBAAC,WAAD;WAAW,OAAM;WAAU,aAAY;UAAkB,CAAA;UACzD,oBAAC,WAAD;WAAW,OAAM;WAAa,OAAM;WAAe,gBAAgB,CAAC;UAAG,CAAA;UACvE,oBAAC,WAAD;WAAW,OAAM;WAAc,OAAA;WAAM,OAAM;WAAY,gBAAgB,CAAC;UAAG,CAAA;UAC3E,oBAAC,WAAD;WAAW,OAAM;WAAW,UAAA;WAAS,OAAM;WAAY,gBAAgB,CAAC;UAAG,CAAA;SAC1E;UACJ;;OACL,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;SAAY,SAAQ;SAAU,OAAM;SAAY,WAAU;mBAAuB;QAAkB,CAAA,GACnG,qBAAC,QAAD;SAAQ,OAAM;SAAS,OAAM;SAAY,qBAAqB,CAAC;mBAA/D;UACI,oBAAC,YAAD;WAAY,OAAM;qBAAQ;UAAiB,CAAA;UAC3C,oBAAC,YAAD;WAAY,OAAM;qBAAY;UAAqB,CAAA;UACnD,oBAAC,YAAD;WAAY,OAAM;qBAAW;UAAoB,CAAA;SAC7C;UACP,EAAA,CAAA,GACL,qBAAC,OAAD,EAAA,UAAA,CACI,oBAAC,YAAD;SAAY,SAAQ;SAAU,OAAM;SAAY,WAAU;mBAAuB;QAAuB,CAAA,GACxG,qBAAC,aAAD;SAAa,OAAM;SAAQ,OAAO,CAAC,SAAS,QAAQ;SAAG,qBAAqB,CAAC;mBAA7E;UACI,oBAAC,iBAAD;WAAiB,OAAM;qBAAQ;UAAsB,CAAA;UACrD,oBAAC,iBAAD;WAAiB,OAAM;qBAAS;UAAuB,CAAA;UACvD,oBAAC,iBAAD;WAAiB,OAAM;qBAAS;UAAuB,CAAA;SAC9C;UACZ,EAAA,CAAA,CACJ;;OACL,qBAAC,OAAD;QAAK,WAAU;kBAAf;SACI,oBAAC,YAAD;UAAY,SAAQ;UAAU,OAAM;UAAY,WAAU;oBAAkB;SAAoB,CAAA;SAChG,qBAAC,SAAD;UAAO,WAAU;oBAAjB,CAA0D,oBAAC,UAAD;WAAU,SAAS;WAAM,uBAAuB,CAAC;UAAG,CAAA,GAAC,oBAAC,QAAD,EAAA,UAAM,UAAa,CAAA,CAAQ;;SAC1I,qBAAC,SAAD;UAAO,WAAU;oBAAjB,CAA0D,oBAAC,UAAD;WAAU,SAAS;WAAO,uBAAuB,CAAC;UAAG,CAAA,GAAC,oBAAC,QAAD,EAAA,UAAM,YAAe,CAAA,CAAQ;;SAC7I,qBAAC,SAAD;UAAO,WAAU;oBAAjB,CAA2C,oBAAC,UAAD;WAAU,SAAS;WAAM,UAAA;UAAS,CAAA,GAAC,oBAAC,QAAD,EAAA,UAAM,WAAc,CAAA,CAAQ;;QACzG;;OACL,qBAAC,OAAD;QAAK,WAAU;kBAAf;SACI,oBAAC,YAAD;UAAY,SAAQ;UAAU,OAAM;UAAY,WAAU;oBAAkB;SAAyB,CAAA;SACrG,qBAAC,OAAD;UAAK,WAAU;oBAAf,CAAyC,oBAAC,eAAD;WAAe,OAAO;WAAM,qBAAqB,CAAC;UAAG,CAAA,GAAC,oBAAC,QAAD,EAAA,UAAM,KAAQ,CAAA,CAAM;;SACnH,qBAAC,OAAD;UAAK,WAAU;oBAAf,CAAyC,oBAAC,eAAD;WAAe,OAAO;WAAO,qBAAqB,CAAC;UAAG,CAAA,GAAC,oBAAC,QAAD,EAAA,UAAM,MAAS,CAAA,CAAM;;QACpH;;OACL,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,YAAD;SAAY,SAAQ;SAAU,OAAM;SAAY,WAAU;mBAAuB;QAAqB,CAAA,GACtG,oBAAC,WAAD,EAAW,aAAY,mBAAmB,CAAA,CACzC;;OACL,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,YAAD;SAAY,SAAQ;SAAU,OAAM;SAAY,WAAU;mBAAuB;QAAoB,CAAA,GACrG,qBAAC,OAAD;SAAK,WAAU;mBAAf;UACI,oBAAC,UAAD,EAAU,WAAU,yBAAyB,CAAA;UAC7C,oBAAC,UAAD,EAAU,WAAU,mBAAmB,CAAA;UACvC,oBAAC,UAAD,EAAU,WAAU,sBAAsB,CAAA;SACzC;UACJ;;MACJ;;IACK,CAAA;IAKd,qBAAC,cAAD;KAAc,IAAG;KAAe,OAAM;eAAtC;MACI,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAAuB;MAA8B,CAAA;MAC/G,oBAAC,OAAD;OAAK,WAAU;iBACT;QAAC;QAAQ;QAAQ;QAAO;QAAS;QAAU;QAAU;QAAU;QAAQ;QAAQ;QAAU;QAAU;QAAW;QAAQ;QAAW;OAAM,EAAY,KAAI,MACrJ,oBAAC,MAAD;QAAc,aAAa;kBAAI;OAAQ,GAA5B,CAA4B,CAC1C;MACA,CAAA;MACL,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAAuB;MAAwB,CAAA;MACzG,oBAAC,OAAD;OAAK,WAAU;iBACT;QAAC;QAAY;QAAS;QAAU;OAAO,EAAY,KAAI,OACrD,oBAAC,MAAD;QAAe,aAAY;QAAO,MAAM;kBAAK;OAAS,GAA3C,EAA2C,CACzD;MACA,CAAA;MACL,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAAuB;MAAmD,CAAA;MACpI,qBAAC,OAAD;OAAK,WAAU;iBAAf;QACI,oBAAC,MAAD;SAAM,aAAY;SAAM,UAAA;mBAAS;QAAkB,CAAA;QACnD,oBAAC,MAAD;SAAM,aAAY;SAAO,UAAA;mBAAS;QAAmB,CAAA;QACrD,oBAAC,MAAD;SAAM,OAAA;mBAAM;QAAW,CAAA;QACvB,oBAAC,MAAD;SAAM,OAAA;SAAM,UAAA;mBAAS;QAAoB,CAAA;QACzC,oBAAC,MAAD;SAAM,eAAe,CAAC;mBAAG;QAAe,CAAA;QACxC,oBAAC,MAAD;SAAM,MAAM,oBAAC,SAAD,EAAS,MAAM,GAAI,CAAA;SAAG,aAAY;mBAAO;QAAe,CAAA;QACpE,oBAAC,MAAD,EAAA,UAAM,sBAAyB,CAAA;QAC/B,oBAAC,MAAD;SAAM,UAAA;mBAAS;QAAsB,CAAA;OACpC;;MACL,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAAuB;MAAsB,CAAA;MACvG,qBAAC,OAAD;OAAK,WAAU;iBAAf;QACI,oBAAC,YAAD;SAAY,QAAA;mBAAO;QAAkB,CAAA;QACrC,oBAAC,YAAD,EAAA,UAAY,WAAoB,CAAA;QAChC,oBAAC,YAAD;SAAY,MAAM,oBAAC,YAAD,EAAY,MAAM,GAAI,CAAA;SAAG,QAAA;mBAAO;QAAqB,CAAA;QACvE,oBAAC,YAAD;SAAY,MAAK;mBAAQ;QAAiB,CAAA;QAC1C,oBAAC,YAAD;SAAY,UAAA;mBAAS;QAAoB,CAAA;OACxC;;MACL,oBAAC,YAAD;OAAY,SAAQ;OAAU,OAAM;OAAY,WAAU;iBAAuB;MAAkC,CAAA;MACnH,qBAAC,OAAD;OAAK,WAAU;iBAAf;QACI,oBAAC,OAAD;SAAO,OAAM;mBAAO;QAAmC,CAAA;QACvD,oBAAC,OAAD;SAAO,OAAM;mBAAU;QAAoC,CAAA;QAC3D,oBAAC,OAAD;SAAO,OAAM;mBAAU;QAAmC,CAAA;QAC1D,oBAAC,OAAD;SAAO,OAAM;mBAAQ;QAAmC,CAAA;OACvD;;MACL,qBAAC,OAAD;OAAK,WAAU;iBAAf;QACI,oBAAC,YAAD;SAAY,SAAQ;SAAU,OAAM;SAAY,WAAU;mBAAuB;QAAqB,CAAA;QACtG,oBAAC,OAAD,EAAA,UAAK,QAAU,CAAA;QACf,oBAAC,WAAD,EAAW,aAAY,aAAa,CAAA;QACpC,oBAAC,OAAD,EAAA,UAAK,QAAU,CAAA;OACd;;MACL,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACI,oBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;QAAY,WAAU;kBAAuB;OAA4B,CAAA,GAC7G,oBAAC,OAAD;QAAK,WAAU;kBACT;SAAC;SAAS;SAAU;QAAO,EAAY,KAAI,MACzC,qBAAC,OAAD;SAAa,WAAU;mBAAvB,CACI,oBAAC,kBAAD,EAAkB,MAAM,EAAG,CAAA,GAC3B,oBAAC,YAAD;UAAY,SAAQ;UAAU,OAAM;oBAAa;SAAc,CAAA,CAC9D;WAHK,CAGL,CACR;OACA,CAAA,CACJ;;KACK;;IAKd,qBAAC,cAAD;KAAc,IAAG;KAAQ,OAAM;eAA/B;MACI,qBAAC,YAAD;OAAY,SAAQ;OAAQ,OAAM;OAAY,WAAU;iBAAxD;QAA+D;QAC/C,oBAAC,QAAD;SAAM,WAAU;mBAAoB;QAAe,CAAA;QAAC;QAAE,oBAAC,QAAD;SAAM,WAAU;mBAAoB;QAAwC,CAAA;QAAC;QAA6B,oBAAC,QAAD;SAAM,WAAU;mBAAoB;QAAc,CAAA;QAAC;OACvN;;MAEZ,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACI,oBAAC,OAAD,EAAA,UACI,oBAAC,YAAD;QAAY,SAAQ;QAAQ,WAAU;kBAAuC;OAEjE,CAAA,EACX,CAAA,GACL,oBAAC,QAAD,EAAA,UAAQ,gBAAqB,CAAA,CAC5B;;MAEL,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACI,oBAAC,YAAD;QAAY,cAAA;QAAa,SAAQ;QAAK,WAAU;QAAO,WAAU;kBAAK;OAAiB,CAAA,GACvF,oBAAC,QAAD;QAAQ,WAAW,oBAAC,UAAD,CAAU,CAAA;kBAAG;OAAgB,CAAA,CAC/C;;MAEL,oBAAC,OAAD;OAAK,WAAU;iBACX,qBAAC,OAAD;QAAO,WAAU;kBAAjB,CACI,qBAAC,aAAD,EAAA,UAAA;SACI,oBAAC,WAAD;UAAW,QAAA;UAAO,WAAU;SAA2B,CAAA;SACvD,oBAAC,WAAD;UAAW,QAAA;oBAAO;SAAgB,CAAA;SAClC,oBAAC,WAAD;UAAW,QAAA;oBAAO;SAAe,CAAA;SACjC,oBAAC,WAAD;UAAW,QAAA;oBAAO;SAAgB,CAAA;QACzB,EAAA,CAAA,GACb,oBAAC,WAAD,EAAA,UACK;SACG;UAAE,KAAK;UAC3C,OAAO;UACP,aAAa;UACb,OAAO,CAAC;WAAE,IAAI;WACd,MAAM;WACN,SAAS;UAAK,CAAC;SAAE;SACmB;UAAE,KAAK;UAC3C,OAAO;UACP,aAAa;UACb,OAAO,CAAC;WAAE,IAAI;WACd,MAAM;WACN,SAAS;UAAM,CAAC;SAAE;SACkB;UAAE,KAAK;UAC3C,OAAO;UACP,aAAa;UACb,OAAO,CAAC;SAAE;QACsB,EAAE,KAAI,SACF,qBAAC,UAAD,EAAA,UAAA;SACI,oBAAC,WAAD;UAAW,OAAO,EAAE,OAAO,OAAO;oBAC9B,oBAAC,SAAD;WAAS,SAAA;WAAQ,OAAM;qBACnB,oBAAC,YAAD;YAAY,MAAK;sBAAQ,oBAAC,YAAD,CAAY,CAAA;WAAa,CAAA;UAC7C,CAAA;SACF,CAAA;SACX,oBAAC,WAAD,EAAA,UAAY,KAAK,MAAiB,CAAA;SAClC,oBAAC,WAAD;UAAW,WAAU;oBAAe,KAAK;SAAuB,CAAA;SAChE,oBAAC,WAAD,EAAA,UACI,oBAAC,OAAD;UAAK,WAAU;oBACV,KAAK,MAAM,KAAI,SACZ,oBAAC,MAAD;WAAoB,aAAa,KAAK,UAAU,eAAe;WAAY,MAAK;qBAC3E,KAAK;UACJ,GAFK,KAAK,EAEV,CACT;SACA,CAAA,EACE,CAAA;QACL,EAAA,GAjBK,KAAK,GAiBV,CACb,EACM,CAAA,CACR;;MACN,CAAA;KACK;;IAKd,qBAAC,cAAD;KAAc,IAAG;KAAc,OAAM;eAArC,CACI,qBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;MAAY,WAAU;gBAAxD;OAA+D;OACxC,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAqB,CAAA;OAAC;OAAE,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAA6B,CAAA;OAAC;OAAE,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAiB,CAAA;OAAC;OAAY,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAmB,CAAA;OAAC;MACrQ;SACZ,qBAAC,OAAD;MAAK,WAAW,qCAAqC;gBAArD;OACI,oBAAC,OAAD;QAAK,WAAU;kBACX,oBAAC,YAAD;SAAY,SAAQ;mBAAK;QAAgB,CAAA;OACxC,CAAA;OACL,oBAAC,OAAD;QAAK,WAAU;kBACX,qBAAC,OAAD;SAAK,WAAU;mBAAf;UACI,oBAAC,OAAD;WAAK,WAAU;qBACX,oBAAC,WAAD;YAAW,MAAK;YAAc,UAAA;YAAS,OAAM;YAAgB,gBAAgB,CAAC;YAAG,OAAM;WAAO,CAAA;UAC7F,CAAA;UACL,oBAAC,OAAD;WAAK,WAAU;qBACX,oBAAC,WAAD;YAAW,UAAA;YAAS,MAAK;YAAQ,OAAM;YAAoB,gBAAgB,CAAC;YAAG,OAAM;YAAQ,UAAA;WAAS,CAAA;UACrG,CAAA;UACL,oBAAC,OAAD;WAAK,WAAU;qBACX,qBAAC,aAAD;YAAa,WAAU;YAAS,OAAM;YAAQ,OAAO,CAAC,OAAO;YAAG,qBAAqB,CAAC;sBAAtF;aACI,oBAAC,iBAAD;cAAiB,OAAM;wBAAQ;aAAsB,CAAA;aACrD,oBAAC,iBAAD;cAAiB,OAAM;wBAAS;aAAuB,CAAA;aACvD,oBAAC,iBAAD;cAAiB,OAAM;wBAAS;aAAuB,CAAA;YAC9C;;UACZ,CAAA;SACJ;;OACJ,CAAA;OACL,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,QAAD;SAAQ,SAAQ;mBAAO;QAAc,CAAA,GACrC,oBAAC,eAAD;SAAe,SAAQ;SAAS,SAAS;mBAAO;QAAqB,CAAA,CACpE;;MACJ;OACK;;IAKd,qBAAC,cAAD;KAAc,IAAG;KAAgB,OAAM;eAAvC,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;MAAY,WAAU;gBAAO;KAEnD,CAAA,GACZ,oBAAC,OAAD;MAAK,WAAU;gBACX,oBAAC,kBAAD,CAAmB,CAAA;KAClB,CAAA,CACK;;IAKd,qBAAC,cAAD;KAAc,IAAG;KAAmB,OAAM;eAA1C,CACI,qBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;MAAY,WAAU;gBAAxD;OAA+D;OAEtD,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAW,CAAA;OAAC;OAAE,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAU,CAAA;OAAC;OAAE;OACxG,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAe,CAAA;OAAC;OAAE,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAY,CAAA;OAAC;OAAE;OACzG,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAc,CAAA;OAAC;MAC3C;SACZ,oBAAC,OAAD;MAAK,WAAU;gBAAS,oBAAC,qBAAD,CAAsB,CAAA;KAAM,CAAA,CAC1C;;IAKd,qBAAC,cAAD;KAAc,IAAG;KAAY,OAAM;eAAnC,CACI,qBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;MAAY,WAAU;gBAAxD;OAA+D;OAEtD,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAU,CAAA;OAAC;OAAE,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAU,CAAA;OAAC;OAAE;OACvG,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAuB,CAAA;OAAC;OAAE,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAe,CAAA;OAAC;MAC1G;SACZ,oBAAC,OAAD;MAAK,WAAU;gBAAS,oBAAC,cAAD,CAAe,CAAA;KAAM,CAAA,CACnC;;IAKd,qBAAC,cAAD;KAAc,IAAG;KAAe,OAAM;eAAtC,CACI,qBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;MAAY,WAAU;gBAAxD;OAA+D;OAEtD,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAgB,CAAA;OAAC;OAAE,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAe,CAAA;OAAC;OAAE;OAClH,oBAAC,QAAD;QAAM,WAAU;kBAAoB;OAAwB,CAAA;OAAC;MACrD;SACZ,oBAAC,OAAD;MAAK,WAAU;gBAAS,oBAAC,iBAAD,CAAkB,CAAA;KAAM,CAAA,CACtC;;GACb;IACJ;;AAEb;AAEA,SAAS,aAAa,EAAE,IAAI,OAAO,YAAsE;CACrG,OACI,qBAAC,WAAD;EAAa;EAAI,WAAW,IAAI,4CAA4C,kBAAkB;YAA9F,CACI,oBAAC,YAAD;GAAY,SAAQ;GAAK,WAAU;aAAQ;EAAkB,CAAA,GAC7D,oBAAC,OAAD;GAAK,WAAU;GAAQ;EAAc,CAAA,CAChC;;AAEjB;;;ACv5BA,SAAgB,mBAAmB;CAC/B,MAAM,iBAAiB,kBAAkB;CACzC,MAAM,OAAO,eAAe;CAC5B,MAAM,EAAE,MAAM,eAAe;CAE7B,MAAM,oBAAoB,CAAC,CAAC,eAAe;CAC3C,MAAM,CAAC,WAAW,gBAAgB,SAAoB,SAAS;CAG/D,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM,eAAe,EAAE;CACtE,MAAM,CAAC,UAAU,eAAe,SAAS,MAAM,YAAY,EAAE;CAC7D,MAAM,CAAC,eAAe,oBAAoB,SAAS,KAAK;CACxD,MAAM,CAAC,cAAc,mBAAmB,SAAwB,IAAI;CAGpE,MAAM,CAAC,iBAAiB,sBAAsB,SAAS,EAAE;CACzD,MAAM,CAAC,aAAa,kBAAkB,SAAS,EAAE;CACjD,MAAM,CAAC,iBAAiB,sBAAsB,SAAS,EAAE;CACzD,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,KAAK;CAC9D,MAAM,CAAC,eAAe,oBAAoB,SAAwB,IAAI;CACtE,MAAM,CAAC,iBAAiB,sBAAsB,SAAwB,IAAI;CAG1E,MAAM,CAAC,UAAU,eAAe,SAAwB,CAAC,CAAC;CAC1D,MAAM,CAAC,iBAAiB,sBAAsB,SAAS,KAAK;CAC5D,MAAM,CAAC,eAAe,oBAAoB,SAAwB,IAAI;CACtE,MAAM,CAAC,mBAAmB,wBAAwB,SAAwB,IAAI;CAC9E,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CAEpD,gBAAgB;EACZ,eAAe,MAAM,eAAe,EAAE;EACtC,YAAY,MAAM,YAAY,EAAE;EAChC,IAAI,cAAc,YACd,aAAa;CAErB,GAAG,CAAC,WAAW,IAAI,CAAC;CAEpB,MAAM,oBAAoB,YAAY;EAClC,iBAAiB,IAAI;EACrB,gBAAgB,IAAI;EACpB,IAAI;GACA,IAAI,eAAe,eACf,MAAM,eAAe,cAAc,aAAa,QAAQ;QAExD,MAAM,IAAI,MAAM,wDAAwD;EAEhF,SAAS,GAAY;GACjB,gBAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;EAC9D,UAAU;GACN,iBAAiB,KAAK;EAC1B;CACJ;CAEA,MAAM,uBAAuB,YAAY;EACrC,iBAAiB,IAAI;EACrB,mBAAmB,IAAI;EAGvB,IAAI,YAAY,SAAS,GAAG;GACxB,iBAAiB,EAAE,oBAAoB,CAAC;GACxC;EACJ;EACA,IAAI,gBAAgB,iBAAiB;GACjC,iBAAiB,EAAE,sBAAsB,CAAC;GAC1C;EACJ;EAEA,oBAAoB,IAAI;EACxB,IAAI;GACA,IAAI,eAAe,gBAAgB;IAC/B,MAAM,eAAe,eAAe,iBAAiB,WAAW;IAChE,mBAAmB,EAAE,kBAAkB,CAAC;IACxC,mBAAmB,EAAE;IACrB,eAAe,EAAE;IACjB,mBAAmB,EAAE;IAGrB,iBAAiB;KACb,eAAe,QAAQ;IAC3B,GAAG,GAAI;GACX;EACJ,SAAS,GAAY;GACjB,iBAAiB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;EAC/D,UAAU;GACN,oBAAoB,KAAK;EAC7B;CACJ;CAEA,MAAM,eAAe,YAAY;EAC7B,mBAAmB,IAAI;EACvB,iBAAiB,IAAI;EACrB,IAAI;GACA,IAAI,eAAe,eAKf,aAHwB,MADM,eAAe,cAAc,KAChB,CAAC,GAAG,MAAM,GAAgB,MACjE,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,CAExD,CAAc;QAE1B,MAAM,IAAI,MAAM,wDAAwD;EAEhF,SAAS,GAAY;GACjB,iBAAiB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;EAC/D,UAAU;GACN,mBAAmB,KAAK;EAC5B;CACJ;CAEA,MAAM,sBAAsB,OAAO,IAAY,qBAA+B;EAC1E,qBAAqB,EAAE;EACvB,IAAI;GACA,IAAI,eAAe,eAAe;IAC9B,MAAM,eAAe,cAAc,EAAE;IACrC,YAAY,SAAS,QAAO,MAAK,EAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,kBACA,MAAM,eAAe,QAAQ;GAErC,OACI,MAAM,IAAI,MAAM,wDAAwD;EAEhF,SAAS,GAAY;GACjB,iBAAiB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;EAC/D,UAAU;GACN,qBAAqB,IAAI;EAC7B;CACJ;CAEA,MAAM,kBAAkB,YAAY;EAChC,eAAe,IAAI;EACnB,IAAI;GACA,IAAI,eAAe,mBACf,MAAM,eAAe,kBAAkB;QAEvC,MAAM,IAAI,MAAM,4DAA4D;EAEpF,SAAS,GAAY;GACjB,iBAAiB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;EAC/D,UAAU;GACN,eAAe,KAAK;EACxB;CACJ;CAEA,IAAI,CAAC,MAAM,OAAO;CAElB,OACI,qBAAC,OAAD;EAAK,WAAU;YAAf;GACI,oBAAC,YAAD;IAAY,SAAQ;IAAK,WAAU;cAAQ,EAAE,kBAAkB;GAAc,CAAA;GAE7E,qBAAC,MAAD;IAAM,OAAO;IAAW,gBAAgB,MAAM,aAAa,CAAc;IAAG,WAAU;cAAtF;KACI,oBAAC,KAAD;MAAK,OAAM;gBAAW,EAAE,SAAS;KAAO,CAAA;KACvC,qBAAqB,oBAAC,KAAD;MAAK,OAAM;gBAAY,EAAE,UAAU;KAAO,CAAA;KAChE,oBAAC,KAAD;MAAK,OAAM;gBAAY,EAAE,UAAU;KAAO,CAAA;IACxC;;GAEL,cAAc,aACX,qBAAC,OAAD;IAAK,WAAU;cAAf;KACI,oBAAC,OAAD;MAAK,WAAU;gBACX,oBAAC,QAAD;OAAQ,KAAK,YAAY,KAAA;OAAW,WAAU;iBACzC,cAAc,YAAY,GAAG,YAAY,IAAK,KAAK,QAAQ,KAAK,MAAM,GAAG,YAAY,IAAI;MACtF,CAAA;KACP,CAAA;KACL,oBAAC,WAAD;MACI,OAAO,EAAE,cAAc;MACvB,OAAO;MACP,WAAW,MAAM,eAAe,EAAE,OAAO,KAAK;KACjD,CAAA;KACD,oBAAC,WAAD;MACI,OAAO,EAAE,WAAW;MACpB,OAAO;MACP,WAAW,MAAM,YAAY,EAAE,OAAO,KAAK;KAC9C,CAAA;KACA,gBAAgB,oBAAC,YAAD;MAAY,OAAM;gBAAS;KAAyB,CAAA;KACrE,oBAAC,OAAD;MAAK,WAAU;gBACX,oBAAC,QAAD;OAAQ,SAAQ;OAAS,SAAS;OAAmB,UAAU;iBAC1D,gBAAgB,EAAE,QAAQ,IAAI,EAAE,cAAc;MAC3C,CAAA;KACP,CAAA;IACJ;;GAGR,cAAc,cAAc,qBACzB,qBAAC,OAAD;IAAK,WAAU;cAAf;KACI,oBAAC,YAAD;MAAY,SAAQ;MAAK,WAAU;gBAAQ,EAAE,iBAAiB;KAAc,CAAA;KAE5E,oBAAC,WAAD;MACI,OAAO,EAAE,kBAAkB;MAC3B,MAAK;MACL,OAAO;MACP,WAAW,MAAM,mBAAmB,EAAE,OAAO,KAAK;MAClD,cAAa;KAChB,CAAA;KACD,oBAAC,WAAD;MACI,OAAO,EAAE,cAAc;MACvB,MAAK;MACL,OAAO;MACP,WAAW,MAAM,eAAe,EAAE,OAAO,KAAK;MAC9C,cAAa;KAChB,CAAA;KACD,oBAAC,WAAD;MACI,OAAO,EAAE,kBAAkB;MAC3B,MAAK;MACL,OAAO;MACP,WAAW,MAAM,mBAAmB,EAAE,OAAO,KAAK;MAClD,cAAa;KAChB,CAAA;KAEA,iBACG,oBAAC,YAAD;MAAY,OAAM;gBAAS;KAA0B,CAAA;KAExD,mBACG,oBAAC,YAAD;MAAY,WAAU;gBAA0C;KAA4B,CAAA;KAGhG,oBAAC,OAAD;MAAK,WAAU;gBACX,oBAAC,QAAD;OACI,SAAQ;OACR,SAAS;OACT,UAAU,oBAAoB,CAAC,mBAAmB,CAAC,eAAe,CAAC;iBAElE,mBAAmB,EAAE,mBAAmB,IAAI,EAAE,iBAAiB;MAC5D,CAAA;KACP,CAAA;IACJ;;GAGR,cAAc,cACX,oBAAC,OAAD;IAAK,WAAU;cACV,kBACG,oBAAC,OAAD;KAAK,WAAU;eAA0B,oBAAC,kBAAD,CAAkB,CAAA;IAAM,CAAA,IACjE,gBACA,oBAAC,YAAD;KAAY,OAAM;eAAS;IAA0B,CAAA,IACrD,SAAS,WAAW,IACpB,oBAAC,YAAD,EAAA,UAAa,EAAE,oBAAoB,EAAc,CAAA,IAEjD,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,OAAD;MAAK,WAAU;gBACX,oBAAC,QAAD;OACI,SAAQ;OACR,OAAM;OACN,SAAS;OACT,UAAU;iBAET,cAAc,EAAE,UAAU,IAAI,EAAE,qBAAqB;MAClD,CAAA;KACP,CAAA,GACJ,SAAS,KAAI,YACV,qBAAC,MAAD;MAAuB,WAAU;gBAAjC,CACI,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACI,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACI,oBAAC,YAAD;SAAY,SAAQ;mBACf,QAAQ,aAAa,EAAE,gBAAgB;QAChC,CAAA,GACX,QAAQ,oBACL,oBAAC,MAAD;SAAM,aAAY;SAAO,MAAK;mBACzB,EAAE,SAAS;QACV,CAAA,CAET;WACL,qBAAC,YAAD;QAAY,SAAQ;QAAU,OAAM;kBAApC;SAAgD;SACvC,QAAQ,aAAa;SAAU;SAAa,IAAI,KAAK,QAAQ,SAAS,EAAE,eAAe;QACpF;SACX;UACL,oBAAC,OAAD;OAAK,WAAU;iBACV,sBAAsB,QAAQ,KAC3B,oBAAC,kBAAD,EAAkB,MAAK,QAAQ,CAAA,IAE/B,oBAAC,YAAD;QAAY,eAAe,oBAAoB,QAAQ,IAAI,QAAQ,gBAAgB;QAAG,cAAW;kBAC7F,oBAAC,YAAD,CAAY,CAAA;OACJ,CAAA;MAEf,CAAA,CACH;QAzBK,QAAQ,EAyBb,CACT,CACA;;GAER,CAAA;EAER;;AAEb;;;ACzTA,SAAgB,iBAAiB;CAC7B,MAAM,EAAE,SAAS,eAAe;CAEhC,OACI,qBAAC,MAAD;EACI,SAAS,oBAAC,YAAD;GACL,OAAM;GACN,cAAW;aACX,oBAAC,eAAD,EAAe,MAAM,SAAS,MAAO,CAAA;EAC7B,CAAA;YALhB;GAMI,oBAAC,UAAD;IAAU,eAAe,KAAK,eAAe,IAAI;cAC7C,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAQ,WAAW,KAAK,aAAa,OAAO,cAAc;gBAAI;KAAmB,CAAA,GACpG,KAAK,aAAa,QAAQ,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA,CAC3D;;GACC,CAAA;GACV,oBAAC,UAAD;IAAU,eAAe,KAAK,eAAe,IAAI;cAC7C,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAQ,WAAW,KAAK,aAAa,OAAO,cAAc;gBAAI;KAAmB,CAAA,GACpG,KAAK,aAAa,QAAQ,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA,CAC3D;;GACC,CAAA;GACV,oBAAC,UAAD;IAAU,eAAe,KAAK,eAAe,IAAI;cAC7C,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAQ,WAAW,KAAK,aAAa,OAAO,cAAc;gBAAI;KAAmB,CAAA,GACpG,KAAK,aAAa,QAAQ,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA,CAC3D;;GACC,CAAA;GACV,oBAAC,UAAD;IAAU,eAAe,KAAK,eAAe,IAAI;cAC7C,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAQ,WAAW,KAAK,aAAa,OAAO,cAAc;gBAAI;KAAoB,CAAA,GACrG,KAAK,aAAa,QAAQ,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA,CAC3D;;GACC,CAAA;GACV,oBAAC,UAAD;IAAU,eAAe,KAAK,eAAe,IAAI;cAC7C,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAQ,WAAW,KAAK,aAAa,OAAO,cAAc;gBAAI;KAAoB,CAAA,GACrG,KAAK,aAAa,QAAQ,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA,CAC3D;;GACC,CAAA;GACV,oBAAC,UAAD;IAAU,eAAe,KAAK,eAAe,IAAI;cAC7C,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAQ,WAAW,KAAK,aAAa,OAAO,cAAc;gBAAI;KAAkB,CAAA,GACnG,KAAK,aAAa,QAAQ,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA,CAC3D;;GACC,CAAA;GACV,oBAAC,UAAD;IAAU,eAAe,KAAK,eAAe,IAAI;cAC7C,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,YAAD;MAAY,SAAQ;MAAQ,WAAW,KAAK,aAAa,OAAO,cAAc;gBAAI;KAAqB,CAAA,GACtG,KAAK,aAAa,QAAQ,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA,CAC3D;;GACC,CAAA;EACR;;AAEd;;;ACeA,IAAM,cAAc;AACpB,IAAM,oBAAoB;;;;;;;;AAS1B,SAAgB,kBAAkB,EAC9B,cACA,gBACA,OACA,UAAU,OACV,aACA,eAAe,gBACf,cAAc,KACd,WACA,OAAO,WACgB;CACvB,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAC/C,MAAM,WAAW,OAAyB,IAAI;CAC9C,MAAM,UAAU,OAAuB,IAAI;CAG3C,MAAM,qBAAqB,eACpB,aAAa,eAAe,aAAa,SAAS,aAAa,MAC/D,aAAa,eAAe,aAAa,SAAS;CAGzD,MAAM,gBAAgB,cAAc;EAChC,MAAM,QAAQ,WAAW,KAAK,EAAE,YAAY;EAC5C,MAAM,OAAO,MAAM,QAAO,MAAK,EAAE,QAAQ,aAAa,GAAG;EAEzD,IAAI,CAAC,OAAO,OAAO,KAAK,MAAM,GAAG,WAAW;EAe5C,OAbgB,KAAK,QAAO,MAAK;GAC7B,MAAM,QAAQ,EAAE,eAAe,IAAI,YAAY;GAC/C,MAAM,SAAS,EAAE,SAAS,IAAI,YAAY;GAC1C,MAAM,MAAM,EAAE,IAAI,YAAY;GAC9B,MAAM,SAAS,EAAE,SAAS,CAAC,GAAG,KAAK,GAAG,EAAE,YAAY;GACpD,OACI,KAAK,SAAS,KAAK,KACnB,MAAM,SAAS,KAAK,KACpB,IAAI,SAAS,KAAK,KAClB,MAAM,SAAS,KAAK;EAE5B,CAEO,EAAQ,MAAM,GAAG,WAAW;CACvC,GAAG;EAAC;EAAO,aAAa;EAAK;EAAY;CAAW,CAAC;CAErD,MAAM,kBAAkB,cAAc;EAClC,MAAM,QAAQ,WAAW,KAAK,EAAE,YAAY;EAC5C,MAAM,OAAO,MAAM,QAAO,MAAK,EAAE,QAAQ,aAAa,GAAG;EACzD,IAAI,CAAC,OAAO,OAAO,KAAK;EACxB,OAAO,KAAK,QAAO,MAAK;GACpB,MAAM,QAAQ,EAAE,eAAe,IAAI,YAAY;GAC/C,MAAM,SAAS,EAAE,SAAS,IAAI,YAAY;GAC1C,MAAM,MAAM,EAAE,IAAI,YAAY;GAC9B,MAAM,SAAS,EAAE,SAAS,CAAC,GAAG,KAAK,GAAG,EAAE,YAAY;GACpD,OAAO,KAAK,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK;EACvG,CAAC,EAAE;CACP,GAAG;EAAC;EAAO,aAAa;EAAK;CAAU,CAAC;CAExC,MAAM,eAAe,aAAa,SAAgC;EAC9D,eAAe,IAAI;EACnB,QAAQ,KAAK;EACb,cAAc,EAAE;CACpB,GAAG,CAAC,cAAc,CAAC;CAEnB,MAAM,mBAAmB,aAAa,WAAoB;EACtD,QAAQ,MAAM;EACd,IAAI,QAEA,iBAAiB,SAAS,SAAS,MAAM,GAAG,EAAE;OAE9C,cAAc,EAAE;CAExB,GAAG,CAAC,CAAC;CAEL,MAAM,gBAAgB,aAAa,MAA2B;EAC1D,IAAI,EAAE,QAAQ,UAAU;GACpB,QAAQ,KAAK;GACb,cAAc,EAAE;EACpB;CACJ,GAAG,CAAC,CAAC;CAEc,KAAK,KACnB,cAAc,SAAS,KAAK,aAC7B,oBAAoB,WACxB;CAEA,OACI,oBAAC,SAAD;EACU;EACN,cAAc;EACd,MAAK;EACL,OAAM;EACN,YAAY;EACZ,SACI,qBAAC,UAAD;GACI,WAAW,IACP,qGACA,qDACA,6DACA,qFACA,SAAS,UAAU,cAAc,eACjC,SACJ;aARJ;IAUK,cAAc,WACX,oBAAC,OAAD;KACI,KAAK,aAAa;KAClB,KAAI;KACJ,WAAU;IACb,CAAA,IAED,oBAAC,OAAD;KACI,WAAU;KACV,MAAK;KACL,QAAO;KACP,SAAQ;eAER,oBAAC,QAAD;MACI,eAAc;MACd,gBAAe;MACf,aAAa;MACb,GAAE;KACL,CAAA;IACA,CAAA;IAET,oBAAC,QAAD;KAAM,WAAU;eAA0B;IAAyB,CAAA;IAClE,gBACG,oBAAC,QAAD;KAAM,WAAU;eAAoE;IAE9E,CAAA;IAEV,oBAAC,OAAD;KAAK,WAAU;KAA4B,MAAK;KAAO,QAAO;KAAe,SAAQ;eACjF,oBAAC,QAAD;MAAM,eAAc;MAAQ,gBAAe;MAAQ,aAAa;MAAG,GAAE;KAAiB,CAAA;IACrF,CAAA;GACD;;YAGZ,qBAAC,OAAD;GACI,WAAU;GACV,WAAW;aAFf;IAKI,qBAAC,OAAD;KAAK,WAAW,IAAI,iEAAiE,kBAAkB;eAAvG,CACI,oBAAC,YAAD;MACI,SAAQ;MACR,WAAU;gBACb;KAEW,CAAA,GACX,MAAM,SAAS,KACZ,qBAAC,YAAD;MACI,SAAQ;MACR,WAAU;gBAFd;OAIK;OAAgB;OAAM,oBAAoB,IAAI,MAAM;MAC7C;OAEf;;IAGL,oBAAC,OAAD;KAAK,WAAW,IAAI,iCAAiC,kBAAkB;eACnE,oBAAC,WAAD;MACc;MACV,MAAK;MACL,aAAY;MACZ,eAAe,QAAQ,cAAc,OAAO,EAAE;KACjD,CAAA;IACA,CAAA;IAGL,qBAAC,OAAD;KACI,KAAK;KACL,WAAU;KACV,OAAO,EAAE,WAAW,oBAAoB,YAAY;eAHxD;MAMK,gBAAgB,CAAC,WAAW,KAAK,KAAK,cAAc,aAAa,UAAU,MACxE,oBAAC,SAAD;OACI,MAAM;OACN,YAAY,CAAC;OACb,QAAA;OACA,eAAe,aAAa,IAAI;MACnC,CAAA;MAIJ,WACG,oBAAC,OAAD;OAAK,WAAU;iBACX,oBAAC,kBAAD,EAAkB,MAAK,QAAQ,CAAA;MAC9B,CAAA;MAIR,CAAC,WAAW,cAAc,WAAW,KAAK,WAAW,KAAK,KACvD,oBAAC,OAAD;OAAK,WAAU;iBACX,qBAAC,YAAD;QAAY,SAAQ;QAAU,WAAU;kBAAxC;SAAsG;SACxE;SAAW;QAC7B;;MACX,CAAA;MAIR,CAAC,WAAW,cAAc,KAAI,SAC3B,oBAAC,SAAD;OAEU;OACN,YAAY,cAAc,QAAQ,KAAK;OACvC,eAAe,aAAa,IAAI;MACnC,GAJQ,KAAK,GAIb,CACJ;MAGA,CAAC,WAAW,kBAAkB,eAC3B,oBAAC,OAAD;OAAK,WAAW,IAAI,kCAAkC,kBAAkB;iBACpE,qBAAC,YAAD;QACI,SAAQ;QACR,WAAU;kBAFd;SAGC;SACY;SAAY;SAAK;SAAgB;QAClC;;MACX,CAAA;KAER;;GACJ;;CACA,CAAA;AAEjB;AAWA,SAAS,QAAQ,EAAE,MAAM,YAAY,QAAQ,WAAyB;CAClE,OACI,qBAAC,UAAD;EACa;EACT,WAAW,IACP,0EACA,gEACA,cAAc,sCAClB;EACA,OAAO,EAAE,WAAW,YAAY;YAPpC;GAUK,KAAK,WACF,oBAAC,OAAD;IACI,KAAK,KAAK;IACV,KAAI;IACJ,WAAU;GACb,CAAA,IAED,oBAAC,OAAD;IAAK,WAAU;cACX,oBAAC,gBAAD;KACI,MAAM;KACN,WAAU;IACb,CAAA;GACA,CAAA;GAIT,qBAAC,OAAD;IAAK,WAAU;cAAf,CACI,qBAAC,OAAD;KAAK,WAAU;eAAf,CACI,oBAAC,QAAD;MACI,WAAW,IACP,gCACA,aACM,wCACA,+CACV;gBAEC,KAAK,eAAe,KAAK,SAAS,KAAK;KACtC,CAAA,GACL,UACG,oBAAC,QAAD;MAAM,WAAU;gBAAkF;KAE5F,CAAA,CAET;SACH,KAAK,SAAS,KAAK,OAAO,WACxB,qBAAC,QAAD;KAAM,WAAU;eAAhB;MACK,KAAK,SAAS,KAAK,cAAc,KAAK,QAAQ;MAC9C,KAAK,SAAS,KAAK,eAAe,KAAK,OAAO,SAAS,QAAQ;MAC/D,KAAK,OAAO,SAAS,KAAK,MAAM,KAAK,IAAI,IAAI;KAC5C;MAET;;GAGJ,cACG,oBAAC,OAAD;IACI,WAAU;IACV,MAAK;IACL,QAAO;IACP,SAAQ;cAER,oBAAC,QAAD;KAAM,eAAc;KAAQ,gBAAe;KAAQ,aAAa;KAAK,GAAE;IAAiB,CAAA;GACvF,CAAA;EAEL;;AAEhB;AAIA,SAAS,cAAc,MAAsB,YAA6B;CACtE,MAAM,QAAQ,WAAW,KAAK,EAAE,YAAY;CAC5C,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,QAAQ,KAAK,eAAe,IAAI,YAAY;CAClD,MAAM,SAAS,KAAK,SAAS,IAAI,YAAY;CAC7C,MAAM,MAAM,KAAK,IAAI,YAAY;CACjC,OAAO,KAAK,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK;AAC9E;;;;;;ACxYA,SAAgB,YAAY,EACxB,QACsB;CACtB,IAAI,CAAC,MACD,OAAO,oBAAC,QAAD;EAAM,WAAW,IAAI,UAAU,mDAAmD,SAAS;YAAG;CAAa,CAAA;CAGtH,MAAM,kBAAkB;CAExB,OACI,qBAAC,OAAD;EAAK,WAAW,IACZ,4FACA,oDACA,UACA,kBACJ;YALA,CAMK,KAAK,WACF,oBAAC,OAAD;GACI,KAAK,KAAK;GACV,KAAK,KAAK,eAAe,KAAK,SAAS;GACvC,WAAW,IACP,6BACA,eACJ;EACH,CAAA,IAED,oBAAC,gBAAD,EACI,WAAW,IACP,qDACA,eACJ,EACH,CAAA,GAEL,qBAAC,OAAD;GAAK,WAAU;aAAf,CACI,oBAAC,QAAD;IAAM,WAAW,IAAI,yBAAyB,SAAS;cAClD,KAAK,eAAe,KAAK,SAAS;GACjC,CAAA,GACL,KAAK,eAAe,KAAK,SACtB,oBAAC,QAAD;IAAM,WAAW,IAAI,8DACjB,SACJ;cACK,KAAK;GACJ,CAAA,CAET;IACJ;;AAEb;;;;;;;ACiGA,IAAM,oBAAoB;;;;;;AAO1B,SAAgB,UAAU,EACtB,MACA,gBACA,iBACA,sBAAsB,OACtB,WAAW,OACX,iBACA,gBACA,gBACA,kBACA,OACA,UACA,YACA,qBACA,qBACA,cACA,cACA,mBACe;CAGf,MAAM,EAAE,MAAM,WAAW,SAAS,iBADhB,kBACiC;CACnD,MAAM,EAAE,MAAM,eAAe;CAE7B,MAAM,CAAC,MAAM,WAAW,SAAmB,SAAS;CACpD,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAC1C,MAAM,CAAC,aAAa,kBAAkB,SAAS,IAAI;CAEnD,MAAM,cAAc,YAAsB;EACtC,eAAe,KAAK;EACpB,iBAAiB;GACb,QAAQ,OAAO;GACf,eAAe,IAAI;EACvB,GAAG,GAAG;CACV;CAGA,MAAM,OAAO,eAAe,gBAAgB,CAAC;CAC7C,MAAM,kBAAkB,eAChB,gBAAgB,kBAAkB,CAAC,CAAE,eAA4C,eAClF;CACP,MAAM,cAAc,uBAAuB,KAAK,gBAAgB;CAChE,MAAM,iBAAiB,mBAAmB,KAAK,kBAAkB,SAAS,QAAQ,KAAK,KAAK,eAAe;CAC3G,MAAM,iBAAiB,mBAAmB,KAAK,kBAAkB,SAAS,QAAQ,KAAK;CACvF,MAAM,mBAAmB,qBAAqB,KAAK,kBAAkB,SAAS,UAAU,KAAK;CAC7F,MAAM,mBAAmB,KAAK,iBAAiB,CAAC,CAAC,eAAe;CAEhE,MAAM,mBAAmB,CAAC,uBAAuB;CAEjD,gBAAgB;EACZ,MAAM,QAAQ,iBAAiB,UAAU,IAAI,GAAG,EAAE;EAClD,aAAa,aAAa,KAAK;CACnC,GAAG,CAAC,CAAC;CAGL,gBAAgB;EAEZ,MAAM,OAAO,IADM,gBAAgB,OAAO,SAAS,MACtC,EAAO,IAAI,MAAM;EAC9B,MAAM,WAAW,aAAa,QAAQ,uBAAuB;EAC7D,IAAI,QAAQ,UAAU;GAClB,aAAa,WAAW,uBAAuB;GAE/C,MAAM,WAAW,OAAO,SAAS,SAAS,OAAO,SAAS;GAC1D,OAAO,QAAQ,aAAa,CAAC,GAAG,SAAS,OAAO,QAAQ;GAExD,IAAI,eAAe,YACf,eAAe,WAAW,UAAU;IAChC;IACA,aAAa;GACjB,CAAC,EAAE,OAAO,QAAQ;IACd,QAAQ,MAAM,GAAG,SAAS,iBAAiB,GAAG;GAClD,CAAC;EAET;CACJ,GAAG,CAAC,cAAc,CAAC;CAInB,IAAI;CACJ,IAAI,MACA,gBAAgB,oBAAC,OAAD;EAAK,KAAK;EACtB,OAAO;GACH,QAAQ;GACR,OAAO;GACP,WAAW;EACf;EACA,KAAK;CAAQ,CAAA;MAEjB,gBAAgB,oBAAC,YAAD,CAAY,CAAA;CAGhC,IAAI;CACJ,IAAI,iBACA,IAAI,OAAO,oBAAoB,UAC3B,oBAAoB;MACjB,IAAI,2BAA2B,OAClC,oBAAoB,gBAAgB;MAEpC,oBAAoB;CAI5B,OACI,qBAAC,OAAD;EACI,WAAW,IACP,qJACA,SAAS,gBAAgB,WAC7B;YAJJ,CAOI,qBAAC,OAAD;GAAK,WAAU;aAAf,CACI,oBAAC,gBAAD,CAAgB,CAAA,GAChB,qBAAC,MAAD;IACI,SAAS,oBAAC,YAAD;KACL,OAAM;KACN,cAAW;eACV,cAAc,SACT,oBAAC,UAAD,EAAU,MAAM,SAAS,MAAO,CAAA,IAChC,oBAAC,SAAD,EAAS,MAAM,SAAS,MAAO,CAAA;IAC7B,CAAA;cAPhB;KAQI,qBAAC,UAAD;MAAU,eAAe,aAAa,MAAM;gBAA5C;OAA+C,oBAAC,UAAD,EAAU,MAAM,SAAS,SAAU,CAAA;OAAC;OAAE,EAAE,WAAW;MAAY;;KAC9G,qBAAC,UAAD;MAAU,eAAe,aAAa,OAAO;gBAA7C;OAAgD,oBAAC,SAAD,EAAS,MAAM,SAAS,SAAU,CAAA;OAAC;OAAE,EAAE,YAAY;MAAY;;KAC/G,qBAAC,UAAD;MAAU,eAAe,aAAa,QAAQ;gBAA9C;OAAiD,oBAAC,aAAD,EAAa,MAAM,SAAS,SAAU,CAAA;OAAC;OAAE,EAAE,aAAa;MAAY;;IACnH;KACL;MAEL,qBAAC,OAAD;GAAK,WAAU;aAAf;IAEI,oBAAC,OAAD;KAAK,WAAU;eACV;IACA,CAAA;IAEJ,qBACG,oBAAC,OAAD;KAAK,WAAU;eACX,oBAAC,WAAD,EAAW,OAAO,kBAAmB,CAAA;IACpC,CAAA;IAGT,qBAAC,OAAD;KAAK,WAAW,IACZ,0CACA,cAAc,gBAAgB,WAClC;eAHA,CAMK,mBAAmB,CAAC,eAAe,QAChC,oBAAC,WAAD;MACoB;MAChB,kBAAkB;MAClB,eAAe,CAAC;MAChB,wBAAwB,CAAC;MACzB,qBAAqB;MACrB,eAAe;MACD;MACG;KACpB,CAAA,GAIJ,CAAC,mBACE,qBAAA,UAAA,EAAA,UAAA;MAEK,SAAS,aACN,qBAAC,OAAD;OAAK,WAAU;iBAAf;SACM,SAAS,aACP,qBAAC,OAAD;SAAK,WAAU;mBAAf,CACK,SACG,oBAAC,YAAD;UAAY,SAAQ;UAAK,WAAU;oBAC9B;SACO,CAAA,GAEf,YACG,oBAAC,YAAD;UAAY,SAAQ;UAAQ,OAAM;UAAY,WAAU;oBACnD;SACO,CAAA,CAEf;;QAER,gBACG,oBAAC,OAAD;SAAK,WAAU;mBACV;QACA,CAAA;QAET,oBAAC,aAAD;SACc;SACV,MAAM;SACN,MAAM,oBAAC,UAAD,CAAU,CAAA;SAChB,eAAe,WAAW,OAAO;QACpC,CAAA;QACA,kBAAkB,kBACf,oBAAC,mBAAD;SACc;SACM;SACA;QACnB,CAAA;QAEJ,kBAAkB,kBACf,oBAAC,mBAAD;SACc;SACM;QACnB,CAAA;QAEJ,oBAAoB,oBACjB,oBAAC,qBAAD;SACc;SACQ;QACrB,CAAA;QAEJ,oBACG,oBAAC,OAAD;SAAK,WAAU;mBACX,qBAAC,YAAD;UAAY,SAAQ;UAAQ,OAAM;oBAAlC;WAA8C;WACd;WAC5B,oBAAC,UAAD;YACI,MAAK;YACL,WAAU;YACV,eAAe,WAAW,UAAU;sBACvC;WAEO,CAAA;UACA;;QACX,CAAA;OAER;;MAIR,SAAS,WACN,oBAAC,WAAD;OACoB;OAChB,kBAAkB;OAClB,eAAe,WAAW,SAAS;OACnC,kBAAkB,yBAAyB,WAAW,QAAQ,IAAI,KAAA;OACjD;OACI;OACrB,kBAAkB,yBAAyB,WAAW,UAAU,IAAI,KAAA;OACtD;OACG;MACpB,CAAA;MAIJ,SAAS,cACN,oBAAC,WAAD;OACoB;OAChB,kBAAkB;OAClB,eAAe,WAAW,SAAS;OACnC,kBAAkB,yBAAyB,WAAW,QAAQ,IAAI,KAAA;OACjD;OACI;OACrB,qBAAqB,WAAW,OAAO;OACzB;OACG;MACpB,CAAA;MAIJ,SAAS,YAAY,eAAe,kBACjC,oBAAC,oBAAD;OACoB;OAChB,eAAe,WAAW,OAAO;MACpC,CAAA;KAEP,EAAA,CAAA,CAEL;;IAEJ,uBAAuB,CAAC,mBAAmB,SAAS,aACjD,oBAAC,OAAD;KAAK,WAAU;eACV;IACA,CAAA;GAER;IACJ;;AAEb;AAEA,SAAS,YAAY,EACjB,MACA,SACA,MACA,YACiF;CACjF,OACI,oBAAC,QAAD;EACc;EACV,WAAU;EACV,SAAQ;EACR,MAAK;EACI;YACT,qBAAC,OAAD;GAAK,WAAU;aAAf,CACI,oBAAC,QAAD;IAAM,WAAU;cACX;GACC,CAAA,GACN,oBAAC,YAAD;IAAY,SAAQ;cAAU;GAAiB,CAAA,CAC9C;;CACD,CAAA;AAEhB;AAEA,IAAM,mBACF,qBAAC,OAAD;CAAK,SAAQ;CAAY,OAAM;CAAK,QAAO;WAA3C;EACI,oBAAC,QAAD;GAAM,MAAK;GACP,GAAE;EAA0H,CAAA;EAChI,oBAAC,QAAD;GAAM,MAAK;GACP,GAAE;EAAwI,CAAA;EAC9I,oBAAC,QAAD;GAAM,MAAK;GACP,GAAE;EAAgI,CAAA;EACtI,oBAAC,QAAD;GAAM,MAAK;GACP,GAAE;EAAsI,CAAA;CAC3I;;AAGT,SAAS,kBAAkB,EACvB,UACA,gBACA,kBAKD;CACC,MAAM,gBAAgB,OAAuC,IAAI;CAEjE,gBAAgB;EACZ,IAAI,CAAC,eAAe,aAAa;EAEjC,MAAM,SAAS,OAAO;EACtB,IAAI,CAAC,UAAU,cAAc,SAAS;EAEtC,cAAc,UAAU,OAAO,SAAS,OAAO,eAAe;GAC1D,WAAW;GACX,OAAO;GACP,SAAS;GACT,UAAU,OAAO,aAAgD;IAC7D,IAAI,SAAS,SAAS,CAAC,SAAS,MAAM;KAClC,QAAQ,MAAM,uBAAuB,SAAS,KAAK;KACnD;IACJ;IACA,IAAI;KAGA,MAAM,eAAe,YAAa;MAC9B,MAAM,SAAS;MACf,aAAa;KACjB,CAAC;IACL,SAAS,KAAc;KACnB,QAAQ,MAAM,uBAAuB,GAAG;IAC5C;GACJ;EACJ,CAAC;CACL,GAAG,CAAC,gBAAgB,cAAc,CAAC;CAEnC,MAAM,oBAAoB;EACtB,IAAI,CAAC,cAAc,SAAS;GACxB,QAAQ,MAAM,2BAA2B;GACzC;EACJ;EACA,cAAc,QAAQ,YAAY;CACtC;CAEA,OACI,oBAAC,aAAD;EACc;EACV,MAAK;EACL,MAAM,oBAAC,YAAD,CAAY,CAAA;EAClB,SAAS;CACZ,CAAA;AAET;AAEA,IAAM,mBACF,oBAAC,OAAD;CAAK,SAAQ;CAAY,OAAM;CAAK,QAAO;CAAK,MAAK;WACjD,oBAAC,QAAD,EAAM,GAAE,gtBAAgtB,CAAA;AACvtB,CAAA;AAGT,SAAS,kBAAkB,EACvB,UACA,kBAID;CACC,MAAM,oBAAoB;EACtB,aAAa,QAAQ,yBAAyB,QAAQ;EACtD,MAAM,cAAc,mBAAmB,OAAO,SAAS,SAAS,OAAO,SAAS,QAAQ;EACxF,MAAM,QAAQ;EACd,OAAO,SAAS,OAAO,sDAAsD,eAAe,gBAAgB,YAAY,SAAS;CACrI;CAEA,OACI,oBAAC,aAAD;EACc;EACV,MAAK;EACL,MAAM,oBAAC,YAAD,CAAY,CAAA;EAClB,SAAS;CACZ,CAAA;AAET;AAEA,IAAM,qBACF,oBAAC,OAAD;CAAK,SAAQ;CAAY,OAAM;CAAK,QAAO;CAAK,MAAK;WACjD,oBAAC,QAAD,EAAM,GAAE,sUAAsU,CAAA;AAC7U,CAAA;AAGT,SAAS,oBAAoB,EACzB,UACA,oBAID;CACC,MAAM,oBAAoB;EACtB,aAAa,QAAQ,yBAAyB,UAAU;EACxD,MAAM,cAAc,mBAAmB,OAAO,SAAS,SAAS,OAAO,SAAS,QAAQ;EACxF,MAAM,QAAQ;EACd,OAAO,SAAS,OAAO,gFAAgF,iBAAiB,gBAAgB,YAAY,SAAS;CACjK;CAEA,OACI,oBAAC,aAAD;EACc;EACV,MAAK;EACL,MAAM,oBAAC,cAAD,CAAc,CAAA;EACpB,SAAS;CACZ,CAAA;AAET;AAEA,SAAS,UAAU,EACf,SACA,kBACA,gBACA,kBACA,iBACA,qBACA,gBAAgB,OAChB,kBACA,eACA,cACA,mBAaD;CACC,MAAM,cAAc,OAAgC,IAAI;CAExD,MAAM,CAAC,OAAO,YAAY,SAA6B,YAAY;CACnE,MAAM,CAAC,UAAU,eAAe,SAA6B,eAAe;CAC5E,MAAM,CAAC,aAAa,kBAAkB,SAAiB;CAEvD,gBAAgB;EACZ,IAAI,CAAC,UAAU;EACf,MAAM,eAAe,UAAyB;GAC1C,IAAI,MAAM,QAAQ,UACd,QAAQ;EAEhB;EACA,SAAS,iBAAiB,WAAW,aAAa,KAAK;EACvD,aAAa;GACT,SAAS,oBAAoB,WAAW,aAAa,KAAK;EAC9D;CACJ,GAAG,CAAC,OAAO,CAAC;CAEZ,SAAS,sBAAsB;EAC3B,IAAI,SAAS,YAAY,eAAe,oBACpC,eAAe,mBAAmB,OAAO,QAAQ;CAEzD;CAEA,SAAS,qBAAqB;EAC1B,IAAI,SAAS,YAAY,eAAe,UACpC,eAAe,SAAS,OAAO,UAAU,WAAW;CAE5D;CAEA,MAAM,gBAAgB,UAA2B;EAC7C,MAAM,eAAe;EACrB,IAAI,kBACA,mBAAmB;OAEnB,oBAAoB;CAC5B;CAEA,MAAM,QAAQ,gBACR,aACA,mBACI,mBACA;CAEV,MAAM,WAAW,gBACX,uFACA,mBACI,iDACA;CAEV,MAAM,cAAc,mBAAmB,mBAAmB;CAE1D,OACI,qBAAC,QAAD;EAAM,UAAU;EAAc,WAAU;YAAxC;GACK,CAAC,iBACE,oBAAC,OAAD;IAAK,WAAU;cACX,oBAAC,YAAD;KAAY,SAAS;eACjB,oBAAC,eAAD,CAAe,CAAA;IACP,CAAA;GACX,CAAA;UAGD;IACJ,MAAM,MAAM,eAAe;IAC3B,IAAI,CAAC,OAAO,eAAe,MAAM,OAAO;IAExC,OACI,oBAAC,OAAD;KAAK,WAAU;eACX,oBAAC,WAAD,EAAW,OAHC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAGpC,CAAA;IACtB,CAAA;GAEb,GAAG;GAEH,oBAAC,YAAD;IAAY,SAAQ;IAAK,WAAU;cAC9B;GACO,CAAA;GACZ,oBAAC,YAAD;IAAY,SAAQ;IAAQ,OAAM;IAAY,WAAU;cACnD;GACO,CAAA;GAEX,oBAAoB,CAAC,iBAAiB,mBACnC,oBAAC,OAAD;IAAK,WAAU;cACV;GACA,CAAA;GAGR,oBACG,qBAAC,OAAD;IAAK,WAAU;cAAf,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAQ,OAAM;KAAY,WAAU;eAAO;IAEnD,CAAA,GACZ,oBAAC,WAAD;KAAW,aAAY;KACnB,WAAW;KACX,OAAO,eAAe;KACtB,UAAU,eAAe;KACzB,MAAK;KACL,MAAK;KACL,WAAW,UAAU,eAAe,MAAM,OAAO,KAAK;IAAG,CAAA,CAC5D;;GAGT,qBAAC,OAAD;IAAK,WAAU;cAAf,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAQ,OAAM;KAAY,WAAU;eAAO;IAEnD,CAAA,GACZ,oBAAC,WAAD;KAAW,aAAY;KACnB,WAAW;KACX,WAAA;KACA,OAAO,SAAS;KAChB,UAAU,eAAe;KACzB,MAAK;KACL,MAAK;KACL,WAAW,UAAU,SAAS,MAAM,OAAO,KAAK;IAAG,CAAA,CACtD;;GAEL,qBAAC,OAAD;IAAK,WAAU;cAAf,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAQ,OAAM;KAAY,WAAU;eAAO;IAEnD,CAAA,GACZ,oBAAC,WAAD;KAAW,aAAY;KACnB,WAAW;KACX,OAAO,YAAY;KACnB,UAAU,eAAe;KACzB,UAAU;KACV,MAAK;KACL,MAAK;KACL,WAAW,UAAU,YAAY,MAAM,OAAO,KAAK;IAAG,CAAA,CACzD;;GAEJ,oBACG,oBAAC,YAAD;IAAY,SAAQ;IAAU,OAAM;IAAY,WAAU;cAAO;GAErD,CAAA;GAGf,CAAC,oBAAoB,oBAClB,oBAAC,OAAD;IAAK,WAAU;cACX,oBAAC,UAAD;KACI,MAAK;KACL,WAAU;KACV,SAAS;eACZ;IAEO,CAAA;GACP,CAAA;GAGT,oBAAC,eAAD;IACI,MAAK;IACL,SAAQ;IACR,OAAM;IACN,WAAU;IACV,MAAK;IACL,SAAS,eAAe;IACxB,UAAU,eAAe,eAAe,CAAC,SAAS,CAAC;cAElD;GACU,CAAA;GAGd,oBACG,oBAAC,OAAD;IAAK,WAAU;cACX,qBAAC,YAAD;KAAY,SAAQ;KAAQ,OAAM;eAAlC;MAA8C;MACd;MAC5B,oBAAC,UAAD;OACI,MAAK;OACL,WAAU;OACV,SAAS;iBACZ;MAEO,CAAA;KACA;;GACX,CAAA;GAGR,iBACG,oBAAC,OAAD;IAAK,WAAU;cACX,qBAAC,YAAD;KAAY,SAAQ;KAAQ,OAAM;eAAlC;MAA8C;MACjB;MACzB,oBAAC,UAAD;OACI,MAAK;OACL,WAAU;OACV,SAAS;iBACZ;MAEO,CAAA;KACA;;GACX,CAAA;EAEP;;AAEd;AAEA,SAAS,mBAAmB,EACxB,SACA,kBAID;CACC,MAAM,CAAC,OAAO,YAAY,SAAiB,EAAE;CAC7C,MAAM,CAAC,WAAW,gBAAgB,SAAS,KAAK;CAChD,MAAM,CAAC,OAAO,YAAY,SAAwB,IAAI;CAEtD,gBAAgB;EACZ,IAAI,CAAC,UAAU;EACf,MAAM,eAAe,UAAyB;GAC1C,IAAI,MAAM,QAAQ,UACd,QAAQ;EAEhB;EACA,SAAS,iBAAiB,WAAW,aAAa,KAAK;EACvD,aAAa;GACT,SAAS,oBAAoB,WAAW,aAAa,KAAK;EAC9D;CACJ,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,eAAe,OAAO,UAA2B;EACnD,MAAM,eAAe;EACrB,SAAS,IAAI;EAEb,IAAI,CAAC,OAAO;GACR,SAAS,iCAAiC;GAC1C;EACJ;EAEA,IAAI,CAAC,eAAe,gBAAgB;GAChC,SAAS,0DAA0D;GACnE;EACJ;EAEA,IAAI;GACA,MAAM,eAAe,eAAe,KAAK;GACzC,aAAa,IAAI;EACrB,SAAS,KAAc;GAEnB,IAAI,eAAe,SAAU,IAA0B,SAAS,wBAC5D,SAAS,qEAAqE;QAG9E,aAAa,IAAI;EAEzB;CACJ;CAEA,IAAI,WACA,OACI,qBAAC,OAAD;EAAK,WAAU;YAAf;GACI,oBAAC,OAAD;IAAK,WAAU;cACX,oBAAC,YAAD;KAAY,SAAS;eACjB,oBAAC,eAAD,CAAe,CAAA;IACP,CAAA;GACX,CAAA;GAEL,qBAAC,OAAD;IAAK,WAAU;cAAf;KACI,oBAAC,OAAD;MAAK,WAAU;gBAAgB;KAAO,CAAA;KACtC,oBAAC,YAAD;MAAY,SAAQ;MAAY,WAAU;gBAAO;KAErC,CAAA;KACZ,qBAAC,YAAD;MAAY,SAAQ;MAAQ,OAAM;gBAAlC;OAA8C;OACjB,oBAAC,UAAD,EAAA,UAAS,MAAc,CAAA;OAAC;MACzC;;IACX;;GAEL,oBAAC,QAAD;IAAQ,SAAS;IAAS,SAAQ;IAAO,WAAU;cAAO;GAElD,CAAA;EACP;;CAIb,OACI,qBAAC,QAAD;EAAM,UAAU;EAAc,WAAU;YAAxC;GACI,oBAAC,OAAD;IAAK,WAAU;cACP,oBAAC,YAAD;KAAY,SAAS;eACjB,oBAAC,eAAD,CAAe,CAAA;IACX,CAAA;GACX,CAAA;GAEL,oBAAC,YAAD;IAAY,SAAQ;IAAK,WAAU;cAAS;GAEhC,CAAA;GACZ,oBAAC,YAAD;IAAY,SAAQ;IAAQ,OAAM;IAAY,WAAU;cAAO;GAEnD,CAAA;GAEX,SACG,oBAAC,OAAD;IAAK,WAAU;cACX,oBAAC,WAAD,EAAkB,MAAO,CAAA;GACxB,CAAA;GAGT,qBAAC,OAAD;IAAK,WAAU;cAAf,CACI,oBAAC,YAAD;KAAY,SAAQ;KAAQ,OAAM;KAAY,WAAU;eAAO;IAEnD,CAAA,GACZ,oBAAC,WAAD;KACI,aAAY;KACZ,WAAW;KACX,WAAA;KACA,OAAO;KACP,MAAK;KACL,MAAK;KACL,WAAW,UAAU,SAAS,MAAM,OAAO,KAAK;IACnD,CAAA,CACA;;GAEL,oBAAC,eAAD;IACI,MAAK;IACL,SAAQ;IACR,WAAU;IACV,MAAK;IACL,SAAS,eAAe;IACxB,UAAU,eAAe,eAAe,CAAC;cAC5C;GAEc,CAAA;EACb;;AAEd;;;;;;;;;;;ACv5BA,SAAgB,WAAW,EAAE,aAA+B;CACxD,MAAM,WAAW,0BAA0B;CAC3C,MAAM,gBAAgB,OAAO,KAAK;CAElC,sBAAsB;EAClB,SAAS,aAAa,EAAE,UAAU,CAAC;EACnC,cAAc,UAAU;EACxB,aAAa;GACT,cAAc,UAAU;GACxB,SAAS,eAAe;EAC5B;CACJ,GAAG,CAAC,UAAU,SAAS,CAAC;CAExB,OAAO;AACX;;;;;;;;;;;AChBA,IAAa,KAAyB;CAElC,MAAM;CACN,QAAQ;CACR,aAAa;CACb,gBAAgB;CAChB,uBAAuB;CACvB,kBAAkB;CAClB,SAAS;CACT,OAAO;CACP,QAAQ;CAGR,MAAM;CACN,MAAM;CACN,QAAQ;CACR,oBAAoB;CACpB,aAAa;CACb,gBAAgB;CAGhB,2BAA2B;CAC3B,0BAA0B;CAC1B,mCAAmC;CAGnC,uBAAuB;CACvB,sBAAsB;CACtB,iBAAiB;CACjB,cAAc;CACd,YAAY;CACZ,8BAA8B;CAC9B,yBAAyB;CAGzB,QAAQ;CACR,YAAY;CACZ,mBAAmB;CACnB,QAAQ;CACR,SAAS;CACT,cAAc;CACd,mBAAmB;CACnB,YAAY;CACZ,WAAW;CACX,UAAU;CACV,kBAAkB;CAClB,oBAAoB;CACpB,yBAAyB;CACzB,wBAAwB;CACxB,mBAAmB;CACnB,KAAK;CACL,QAAQ;CACR,mBAAmB;CACnB,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,cAAc;CACd,WAAW;CACX,YAAY;CACZ,aAAa;CACb,IAAI;CACJ,wBAAwB;CACxB,uBAAuB;CACvB,aAAa;CACb,YAAY;CACZ,UAAU;CACV,yBAAyB;CACzB,SAAS;CACT,cAAc;CACd,iBAAiB;CACjB,aAAa;CACb,MAAM;CACN,SAAS;CACT,yBAAyB;CACzB,OAAO;CACP,uBAAuB;CACvB,mCAAmC;CACnC,iBAAiB;CACjB,eAAe;CACf,uBAAuB;CACvB,uBAAuB;CACvB,mCAAmC;CACnC,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,MAAM;CACN,KAAK;CACL,OAAO;CACP,gCAAgC;CAChC,yBAAyB;CACzB,2BAA2B;CAG3B,iBAAiB;CACjB,qBAAqB;CACrB,oBAAoB;CACpB,qBAAqB;CACrB,uBAAuB;CACvB,eAAe;CACf,cAAc;CACd,0BAA0B;CAE1B,OAAO;CACP,MAAM;CACN,sBAAsB;CACtB,0BAA0B;CAC1B,oBAAoB;CACpB,6BAA6B;CAC7B,sBAAsB;CACtB,iBAAiB;CACjB,2BAA2B;CAC3B,kBAAkB;CAClB,gCAAgC;CAChC,4BAA4B;CAC5B,uBAAuB;CACvB,uBAAuB;CACvB,mBAAmB;CACnB,0BAA0B;CAC1B,kBAAkB;CAClB,gBAAgB;CAChB,2BAA2B;CAC3B,kBAAkB;CAClB,cAAc;CACd,sBAAsB;CACtB,0BAA0B;CAC1B,kBAAkB;CAClB,cAAc;CACd,0BAA0B;CAC1B,2BAA2B;CAC3B,oCAAoC;CACpC,0BAA0B;CAC1B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,2BAA2B;CAC3B,mCAAmC;CACnC,gCAAgC;CAChC,gBAAgB;CAGhB,iBAAiB;CACjB,wBAAwB;CAGxB,WAAW;CACX,YAAY;CACZ,WAAW;CACX,cAAc;CACd,OAAO;CACP,KAAK;CACL,oBAAoB;CACpB,kBAAkB;CAGlB,WAAW;CACX,cAAc;CACd,mBAAmB;CACnB,UAAU;CACV,QAAQ;CACR,iBAAiB;CACjB,cAAc;CACd,WAAW;CAGX,OAAO;CACP,oBAAoB;CACpB,yBAAyB;CACzB,yBAAyB;CACzB,sBAAsB;CACtB,gBAAgB;CAChB,qBAAqB;CACrB,sBAAsB;CACtB,sBAAsB;CACtB,uBAAuB;CACvB,cAAc;CACd,wBAAwB;CACxB,eAAe;CACf,iCAAiC;CAGjC,SAAS;CACT,uBAAuB;CACvB,yBAAyB;CACzB,oBAAoB;CACpB,qBAAqB;CACrB,wBAAwB;CACxB,wBAAwB;CACxB,yBAAyB;CACzB,cAAc;CACd,WAAW;CACX,uBAAuB;CACvB,gBAAgB;CAGhB,cAAc;CACd,kBAAkB;CAClB,wBAAwB;CACxB,yBAAyB;CAGzB,oBAAoB;CAGpB,aAAa;CAGb,iDAAiD;CAGjD,gBAAgB;CAChB,qBAAqB;CACrB,cAAc;CAGd,yBAAyB;CACzB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,uCAAuC;CAEvC,eAAe;CACf,YAAY;CACZ,aAAa;CACb,qCAAqC;CAErC,oBAAoB;CACpB,yBAAyB;CAEzB,sBAAsB;CACtB,2BAA2B;CAE3B,sBAAsB;CACtB,4BAA4B;CAC5B,yBAAyB;CACzB,qCAAqC;CACrC,iBAAiB;CACjB,gCAAgC;CAChC,kCAAkC;CAClC,mBAAmB;CACnB,mBAAmB;CAEnB,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,aAAa;CACb,qBAAqB;CACrB,MAAM;CACN,6BAA6B;CAC7B,MAAM;CACN,yBAAyB;CACzB,kBAAkB;CAClB,eAAe;CACf,2BAA2B;CAC3B,aAAa;CACb,2BAA2B;CAC3B,eAAe;CACf,2BAA2B;CAC3B,kBAAkB;CAClB,8BAA8B;CAC9B,mBAAmB;CACnB,oBAAoB;CACpB,qBAAqB;CACrB,yBAAyB;CACzB,yBAAyB;CACzB,wBAAwB;CACxB,cAAc;CACd,sBAAsB;CACtB,qBAAqB;CACrB,uBAAuB;CACvB,0BAA0B;CAC1B,oBAAoB;CACpB,yBAAyB;CACzB,aAAa;CACb,cAAc;CAEd,gBAAgB;CAChB,WAAW;CACX,2BAA2B;CAC3B,wBAAwB;CACxB,0BAA0B;CAC1B,oBAAoB;CACpB,uBAAuB;CAEvB,mBAAmB;CACnB,mBAAmB;CACnB,cAAc;CACd,yBAAyB;CACzB,sBAAsB;CACtB,wBAAwB;CACxB,2BAA2B;CAC3B,2BAA2B;CAC3B,kBAAkB;CAClB,qBAAqB;CAErB,wBAAwB;CACxB,qBAAqB;CACrB,wBAAwB;CACxB,2BAA2B;CAC3B,QAAQ;CAER,yBAAyB;CACzB,mCAAmC;CACnC,sBAAsB;CACtB,yBAAyB;CACzB,uBAAuB;CACvB,iBAAiB;CACjB,yBAAyB;CACzB,0BAA0B;CAC1B,iBAAiB;CACjB,wBAAwB;CACxB,0BAA0B;CAC1B,UAAU;CAEV,kBAAkB;CAClB,uBAAuB;CACvB,mCAAmC;CACnC,mBAAmB;CACnB,0BAA0B;CAC1B,uBAAuB;CACvB,oBAAoB;CACpB,cAAc;CACd,cAAc;CAEd,wBAAwB;CACxB,sBAAsB;CACtB,WAAW;CACX,MAAM;CACN,mBAAmB;CACnB,iBAAiB;CACjB,iBAAiB;CACjB,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,gCAAgC;CAChC,qCAAqC;CACrC,+BAA+B;CAC/B,+BAA+B;CAC/B,2CAA2C;CAC3C,KAAK;CACL,mCAAmC;CACnC,oBAAoB;CACpB,KAAK;CACL,IAAI;CACJ,6BAA6B;CAC7B,kBAAkB;CAClB,sBAAsB;CACtB,KAAK;CACL,2BAA2B;CAC3B,oBAAoB;CACpB,6BAA6B;CAC7B,mBAAmB;CACnB,aAAa;CACb,QAAQ;CAER,0BAA0B;CAC1B,4BAA4B;CAC5B,uBAAuB;CACvB,MAAM;CACN,SAAS;CACT,mBAAmB;CACnB,oBAAoB;CACpB,OAAO;CACP,aAAa;CAEb,OAAO;CACP,UAAU;CACV,UAAU;CACV,UAAU;CACV,qBAAqB;CACrB,YAAY;CACZ,OAAO;CACP,IAAI;CACJ,MAAM;CAEN,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,4BAA4B;CAC5B,UAAU;CACV,eAAe;CACf,iBAAiB;CACjB,uBAAuB;CACvB,kBAAkB;CAClB,mBAAmB;CACnB,oBAAoB;CACpB,oBAAoB;CACpB,mBAAmB;CACnB,OAAO;CACP,aAAa;CACb,gBAAgB;CAChB,kBAAkB;CAClB,QAAQ;CACR,aAAa;CACb,yBAAyB;CACzB,MAAM;CACN,MAAM;CACN,WAAW;CACX,kBAAkB;CAClB,wBAAwB;CACxB,8BAA8B;CAC9B,4BAA4B;CAC5B,QAAQ;CACR,aAAa;CACb,oBAAoB;CACpB,KAAK;CACL,MAAM;CACN,qBAAqB;CACrB,kBAAkB;CAClB,gBAAgB;CAChB,UAAU;CACV,2BAA2B;CAC3B,0BAA0B;CAC1B,QAAQ;CAER,0BAA0B;CAC1B,eAAe;CAGf,gBAAgB;CAChB,qBAAqB;CACrB,sBAAsB;CAEtB,MAAM;CACN,iBAAiB;CACjB,OAAO;CACP,OAAO;CACP,8BAA8B;CAC9B,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,6BAA6B;CAC7B,YAAY;CACZ,yBAAyB;CACzB,6BAA6B;CAC7B,WAAW;CACX,SAAS;CACT,UAAU;CACV,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,uBAAuB;CACvB,yBAAyB;CACzB,SAAS;CAET,kBAAkB;CAClB,mBAAmB;CACnB,kBAAkB;CAClB,SAAS;CACT,UAAU;CACV,UAAU;CACV,iBAAiB;CACjB,kBAAkB;CAClB,cAAc;CACd,kBAAkB;CAClB,kBAAkB;CAClB,sBAAsB;CACtB,oBAAoB;CACpB,+BAA+B;CAC/B,mBAAmB;CACnB,cAAc;CACd,WAAW;CACX,cAAc;CACd,QAAQ;CACR,oBAAoB;CACpB,UAAU;CACV,qBAAqB;CACrB,gBAAgB;CAChB,SAAS;CACT,SAAS;CACT,WAAW;CACX,eAAe;CACf,kBAAkB;;CAGlB,2BAA2B;CAC3B,qBAAqB;CACrB,wBAAwB;CACxB,YAAY;CACZ,2BAA2B;CAC3B,2BAA2B;CAC3B,UAAU;;CAGV,yBAAyB;CACzB,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,2BAA2B;CAC3B,iBAAiB;CACjB,uBAAuB;CACvB,oBAAoB;CACpB,gCAAgC;CAChC,6CAA6C;CAC7C,eAAe;CACf,iBAAiB;;CAGjB,cAAc;CACd,SAAS;CACT,SAAS;CACT,gBAAgB;CAChB,gBAAgB;CAChB,wBAAwB;CACxB,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,yCAAyC;;CAGzC,6BAA6B;CAC7B,6BAA6B;CAC7B,2BAA2B;CAC3B,0BAA0B;;CAG1B,gBAAgB;CAChB,eAAe;CACf,YAAY;CACZ,mBAAmB;CACnB,kBAAkB;CAClB,eAAe;CACf,cAAc;;CAGd,UAAU;CACV,OAAO;;CAGP,kCAAkC;;CAGlC,6BAA6B;CAC7B,2BAA2B;CAC3B,+BAA+B;CAC/B,0BAA0B;CAC1B,uBAAuB;CACvB,uBAAuB;CACvB,WAAW;CACX,YAAY;;CAGZ,0BAA0B;CAC1B,6BAA6B;CAC7B,wBAAwB;CACxB,kBAAkB;CAClB,yBAAyB;CACzB,mBAAmB;CACnB,qCAAqC;CACrC,iBAAiB;CACjB,UAAU;CACV,8BAA8B;CAC9B,2BAA2B;CAC3B,YAAY;CACZ,gCAAgC;CAChC,OAAO;CACP,2BAA2B;CAC3B,uBAAuB;;CAGvB,WAAW;CACX,YAAY;CACZ,kBAAkB;CAElB,gCAAgC;CAChC,sBAAsB;CACtB,SAAS;CACT,gBAAgB;CAChB,gBAAgB;CAChB,qBAAqB;CAGrB,qBAAqB;CACrB,qBAAqB;CACrB,oBAAoB;CACpB,+CAA+C;CAC/C,2BAA2B;CAC3B,kCAAkC;CAClC,6BAA6B;CAC7B,wBAAwB;CACxB,0BAA0B;CAC1B,sBAAsB;CACtB,yBAAyB;CACzB,eAAe;CACf,qBAAqB;CACrB,eAAe;CACf,mBAAmB;CACnB,cAAc;CACd,cAAc;CAGd,+BAA+B;CAC/B,8BAA8B;CAC9B,6BAA6B;CAC7B,wBAAwB;CACxB,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAG9B,UAAU;CACV,sBAAsB;CACtB,yBAAyB;CACzB,gCAAgC;CAEhC,mBAAmB;CACnB,8BAA8B;CAC9B,+BAA+B;CAC/B,yBAAyB;CACzB,8BAA8B;CAC9B,qBAAqB;CACrB,wBAAwB;CACxB,eAAe;CACf,oBAAoB;CACpB,cAAc;CACd,6BAA6B;CAC7B,6BAA6B;CAG7B,YAAY;CACZ,QAAQ;CACR,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,WAAW;CACX,WAAW;CACX,MAAM;CACN,cAAc;CACd,YAAY;CACZ,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,cAAc;CACd,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,gBAAgB;CAChB,gBAAgB;CAChB,eAAe;CAGf,4BAA4B;CAC5B,gCAAgC;CAChC,2BAA2B;CAC3B,+BAA+B;CAC/B,sBAAsB;CACtB,YAAY;CAGZ,wBAAwB;CACxB,mBAAmB;CACnB,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,0BAA0B;CAC1B,sBAAsB;CACtB,4BAA4B;CAC5B,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;CACnB,+BAA+B;CAC/B,wBAAwB;CACxB,yBAAyB;CACzB,4BAA4B;CAC5B,mBAAmB;CACnB,cAAc;CACd,uBAAuB;CACvB,kBAAkB;CAGlB,aAAa;CACb,yBAAyB;CACzB,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,oBAAoB;CACpB,gCAAgC;CAChC,sBAAsB;CACtB,kCAAkC;CAClC,cAAc;CACd,0BAA0B;CAC1B,aAAa;CACb,yBAAyB;CACzB,cAAc;CACd,0BAA0B;CAC1B,iBAAiB;CACjB,aAAa;CACb,aAAa;CACb,eAAe;CACf,oBAAoB;CACpB,2BAA2B;CAC3B,2BAA2B;CAC3B,aAAa;CACb,eAAe;CACf,kBAAkB;CAClB,sBAAsB;CACtB,qBAAqB;CACrB,iCAAiC;CAGjC,0BAA0B;CAC1B,mCAAmC;CACnC,iCAAiC;CACjC,iCAAiC;CACjC,+BAA+B;CAC/B,gCAAgC;CAChC,mCAAmC;CACnC,gCAAgC;CAChC,8BAA8B;CAE9B,kBAAkB;CAClB,uBAAuB;CACvB,2BAA2B;CAC3B,mCAAmC;CACnC,mCAAmC;CACnC,oCAAoC;CACpC,sCAAsC;CACtC,8BAA8B;CAC9B,gBAAgB;CAChB,wBAAwB;CACxB,0BAA0B;CAC1B,kCAAkC;CAClC,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,oCAAoC;CACpC,iCAAiC;CAGjC,4BAA4B;CAC5B,wBAAwB;CACxB,kCAAkC;CAClC,kCAAkC;CAClC,oBAAoB;CACpB,uBAAuB;CACvB,iBAAiB;CACjB,iBAAiB;CACjB,0BAA0B;CAC1B,wBAAwB;CACxB,uBAAuB;CACvB,uBAAuB;CACvB,oBAAoB;CACpB,uBAAuB;CACvB,kCAAkC;CAClC,6BAA6B;CAC7B,iBAAiB;CACjB,gBAAgB;CAChB,qBAAqB;CACrB,iBAAiB;CACjB,kBAAkB;CAClB,sBAAsB;CACtB,0BAA0B;CAC1B,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,gCAAgC;CAChC,mBAAmB;CACnB,gCAAgC;CAChC,qCAAqC;CACrC,0BAA0B;CAC1B,4BAA4B;CAC5B,iCAAiC;CACjC,wBAAwB;CACxB,sCAAsC;CACtC,iCAAiC;CACjC,uBAAuB;CACvB,0BAA0B;CAC1B,oCAAoC;CACpC,4BAA4B;CAC5B,6BAA6B;CAC7B,mCAAmC;CACnC,gBAAgB;CAChB,oCAAoC;CACpC,wBAAwB;CACxB,8BAA8B;CAC9B,wBAAwB;CACxB,8BAA8B;CAC9B,sBAAsB;CACtB,+BAA+B;CAG/B,6BAA6B;CAC7B,4BAA4B;CAC5B,2BAA2B;CAC3B,gCAAgC;CAChC,sCAAsC;CACtC,+BAA+B;CAC/B,iCAAiC;CACjC,mCAAmC;CAGnC,sBAAsB;CACtB,uBAAuB;CACvB,yBAAyB;CACzB,qBAAqB;CACrB,2BAA2B;CAC3B,0BAA0B;CAC1B,2BAA2B;CAC3B,sBAAsB;CACtB,2BAA2B;CAC3B,uBAAuB;CAGvB,kBAAkB;CAClB,wBAAwB;CACxB,oBAAoB;CACpB,qBAAqB;CACrB,mBAAmB;CACnB,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,qBAAqB;CACrB,wBAAwB;CACxB,6BAA6B;CAC7B,6BAA6B;CAC7B,sBAAsB;CACtB,2BAA2B;CAC3B,6BAA6B;CAC7B,8BAA8B;CAC9B,iBAAiB;CACjB,mBAAmB;CACnB,iCAAiC;CACjC,gCAAgC;CAChC,iCAAiC;CACjC,gCAAgC;CAChC,kCAAkC;CAClC,iCAAiC;CACjC,yBAAyB;CACzB,sBAAsB;CACtB,kBAAkB;CAClB,kBAAkB;CAClB,oBAAoB;CAGpB,oBAAoB;CACpB,sBAAsB;CACtB,8BAA8B;CAC9B,sBAAsB;CACtB,oBAAoB;CACpB,wBAAwB;CACxB,+BAA+B;CAC/B,oBAAoB;CACpB,gCAAgC;CAChC,wBAAwB;CACxB,0BAA0B;CAC1B,+BAA+B;CAC/B,2BAA2B;CAC3B,gCAAgC;CAChC,uBAAuB;CACvB,4BAA4B;CAC5B,iCAAiC;CACjC,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,uCAAuC;CACvC,8BAA8B;CAC9B,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,oCAAoC;CACpC,mCAAmC;CACnC,6BAA6B;CAC7B,6BAA6B;CAC7B,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAC9B,2BAA2B;CAG3B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,2CAA2C;CAC3C,8BAA8B;CAC9B,iCAAiC;CACjC,4BAA4B;CAC5B,4BAA4B;CAC5B,kCAAkC;CAClC,wCAAwC;CACxC,wCAAwC;CACxC,8CAA8C;CAC9C,uCAAuC;CACvC,8BAA8B;CAC9B,oCAAoC;CACpC,6BAA6B;CAC7B,+BAA+B;CAC/B,kCAAkC;CAClC,iCAAiC;CACjC,qBAAqB;CACrB,0BAA0B;CAC1B,iCAAiC;CACjC,uBAAuB;CACvB,4BAA4B;CAC5B,qCAAqC;CACrC,4BAA4B;CAC5B,0CAA0C;CAC1C,+BAA+B;CAC/B,iCAAiC;CACjC,6BAA6B;CAC7B,mCAAmC;CACnC,+BAA+B;CAC/B,iCAAiC;CACjC,kCAAkC;CAClC,4CAA4C;CAC5C,6CAA6C;CAC7C,6CAA6C;CAC7C,sCAAsC;CACtC,kCAAkC;CAClC,oBAAoB;CACpB,oCAAoC;CACpC,gCAAgC;CAChC,yBAAyB;CACzB,gCAAgC;CAChC,2BAA2B;CAG3B,gBAAgB;CAChB,uBAAuB;CACvB,4BAA4B;CAC5B,MAAM;CACN,UAAU;CACV,mBAAmB;CAGnB,mBAAmB;CACnB,cAAc;CACd,kBAAkB;CAClB,qBAAqB;CACrB,uBAAuB;CACvB,mBAAmB;CACnB,oBAAoB;CACpB,iBAAiB;CACjB,4BAA4B;CAC5B,6BAA6B;CAC7B,wBAAwB;CACxB,4BAA4B;CAC5B,4BAA4B;CAC5B,kBAAkB;CAGlB,0BAA0B;CAG1B,yBAAyB;CACzB,qBAAqB;CACrB,yBAAyB;AAC7B;;;;;;;;;;;ACz8BA,IAAa,KAAyB;CAElC,MAAM;CACN,QAAQ;CACR,aAAa;CACb,gBAAgB;CAChB,uBAAuB;CACvB,kBAAkB;CAClB,SAAS;CACT,OAAO;CACP,QAAQ;CAGR,MAAM;CACN,MAAM;CACN,QAAQ;CACR,oBAAoB;CAGpB,2BAA2B;CAC3B,0BAA0B;CAC1B,mCAAmC;CAGnC,uBAAuB;CACvB,sBAAsB;CACtB,iBAAiB;CACjB,cAAc;CACd,YAAY;CACZ,8BAA8B;CAC9B,yBAAyB;CAGzB,QAAQ;CACR,YAAY;CACZ,mBAAmB;CACnB,QAAQ;CACR,SAAS;CACT,cAAc;CACd,mBAAmB;CACnB,YAAY;CACZ,WAAW;CACX,UAAU;CACV,kBAAkB;CAClB,oBAAoB;CACpB,yBAAyB;CACzB,wBAAwB;CACxB,mBAAmB;CACnB,KAAK;CACL,QAAQ;CACR,mBAAmB;CACnB,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,cAAc;CACd,WAAW;CACX,YAAY;CACZ,aAAa;CACb,IAAI;CACJ,wBAAwB;CACxB,uBAAuB;CACvB,aAAa;CACb,YAAY;CACZ,UAAU;CACV,yBAAyB;CACzB,SAAS;CACT,cAAc;CACd,iBAAiB;CACjB,aAAa;CACb,MAAM;CACN,SAAS;CACT,yBAAyB;CACzB,OAAO;CACP,uBAAuB;CACvB,mCAAmC;CACnC,iBAAiB;CACjB,eAAe;CACf,uBAAuB;CACvB,uBAAuB;CACvB,mCAAmC;CACnC,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,MAAM;CACN,KAAK;CACL,OAAO;CACP,gCAAgC;CAChC,yBAAyB;CACzB,2BAA2B;CAG3B,iBAAiB;CACjB,qBAAqB;CACrB,oBAAoB;CACpB,qBAAqB;CACrB,uBAAuB;CACvB,eAAe;CACf,cAAc;CACd,0BAA0B;CAE1B,OAAO;CACP,MAAM;CACN,sBAAsB;CACtB,0BAA0B;CAC1B,oBAAoB;CACpB,6BAA6B;CAC7B,sBAAsB;CACtB,kBAAkB;CAClB,gCAAgC;CAChC,4BAA4B;CAC5B,uBAAuB;CACvB,uBAAuB;CACvB,mBAAmB;CACnB,0BAA0B;CAC1B,kBAAkB;CAClB,gBAAgB;CAChB,2BAA2B;CAC3B,kBAAkB;CAClB,cAAc;CACd,sBAAsB;CACtB,0BAA0B;CAC1B,kBAAkB;CAClB,cAAc;CACd,0BAA0B;CAC1B,2BAA2B;CAC3B,oCAAoC;CACpC,0BAA0B;CAC1B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,2BAA2B;CAC3B,mCAAmC;CACnC,gCAAgC;CAChC,gBAAgB;CAGhB,iBAAiB;CACjB,wBAAwB;CAGxB,WAAW;CACX,YAAY;CACZ,WAAW;CACX,cAAc;CACd,OAAO;CACP,KAAK;CACL,oBAAoB;CACpB,kBAAkB;CAGlB,WAAW;CACX,cAAc;CACd,mBAAmB;CACnB,UAAU;CACV,QAAQ;CAGR,OAAO;CACP,sBAAsB;CACtB,gBAAgB;CAChB,qBAAqB;CACrB,sBAAsB;CACtB,sBAAsB;CACtB,uBAAuB;CACvB,cAAc;CACd,wBAAwB;CACxB,eAAe;CACf,iCAAiC;CACjC,2BAA2B;CAG3B,SAAS;CACT,uBAAuB;CACvB,yBAAyB;CACzB,iBAAiB;CACjB,qBAAqB;CACrB,wBAAwB;CACxB,wBAAwB;CACxB,yBAAyB;CACzB,cAAc;CACd,WAAW;CACX,uBAAuB;CACvB,gBAAgB;CAChB,oBAAoB;CAGpB,cAAc;CACd,kBAAkB;CAClB,wBAAwB;CACxB,yBAAyB;CAGzB,oBAAoB;CAGpB,aAAa;CAGb,iDAAiD;CAGjD,gBAAgB;CAChB,qBAAqB;CACrB,cAAc;CAGd,yBAAyB;CACzB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,uCAAuC;CAEvC,eAAe;CACf,YAAY;CACZ,aAAa;CACb,qCAAqC;CAErC,oBAAoB;CACpB,yBAAyB;CAEzB,sBAAsB;CACtB,2BAA2B;CAE3B,sBAAsB;CACtB,4BAA4B;CAC5B,yBAAyB;CACzB,qCAAqC;CACrC,iBAAiB;CACjB,gCAAgC;CAChC,kCAAkC;CAClC,mBAAmB;CACnB,mBAAmB;CAEnB,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,aAAa;CACb,qBAAqB;CACrB,MAAM;CACN,6BAA6B;CAC7B,MAAM;CACN,yBAAyB;CACzB,kBAAkB;CAClB,eAAe;CACf,2BAA2B;CAC3B,aAAa;CACb,2BAA2B;CAC3B,eAAe;CACf,2BAA2B;CAC3B,kBAAkB;CAClB,8BAA8B;CAC9B,mBAAmB;CACnB,oBAAoB;CACpB,qBAAqB;CACrB,yBAAyB;CACzB,yBAAyB;CACzB,wBAAwB;CACxB,cAAc;CACd,sBAAsB;CACtB,qBAAqB;CACrB,uBAAuB;CACvB,0BAA0B;CAC1B,oBAAoB;CACpB,yBAAyB;CACzB,aAAa;CACb,cAAc;CAEd,gBAAgB;CAChB,WAAW;CACX,2BAA2B;CAC3B,wBAAwB;CACxB,0BAA0B;CAC1B,oBAAoB;CACpB,uBAAuB;CAEvB,mBAAmB;CACnB,mBAAmB;CACnB,cAAc;CACd,yBAAyB;CACzB,sBAAsB;CACtB,wBAAwB;CACxB,2BAA2B;CAC3B,2BAA2B;CAC3B,kBAAkB;CAClB,qBAAqB;CAErB,wBAAwB;CACxB,qBAAqB;CACrB,wBAAwB;CACxB,2BAA2B;CAC3B,QAAQ;CAER,yBAAyB;CACzB,mCAAmC;CACnC,sBAAsB;CACtB,yBAAyB;CACzB,uBAAuB;CACvB,iBAAiB;CACjB,yBAAyB;CACzB,0BAA0B;CAC1B,iBAAiB;CACjB,wBAAwB;CACxB,0BAA0B;CAC1B,UAAU;CAEV,kBAAkB;CAClB,uBAAuB;CACvB,mCAAmC;CACnC,mBAAmB;CACnB,0BAA0B;CAC1B,uBAAuB;CACvB,oBAAoB;CACpB,cAAc;CACd,cAAc;CAEd,wBAAwB;CACxB,sBAAsB;CACtB,WAAW;CACX,MAAM;CACN,mBAAmB;CACnB,iBAAiB;CACjB,iBAAiB;CACjB,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,gCAAgC;CAChC,qCAAqC;CACrC,+BAA+B;CAC/B,+BAA+B;CAC/B,2CAA2C;CAC3C,KAAK;CACL,mCAAmC;CACnC,oBAAoB;CACpB,KAAK;CACL,IAAI;CACJ,6BAA6B;CAC7B,kBAAkB;CAClB,sBAAsB;CACtB,KAAK;CACL,2BAA2B;CAC3B,oBAAoB;CACpB,6BAA6B;CAC7B,mBAAmB;CACnB,aAAa;CACb,QAAQ;CAER,0BAA0B;CAC1B,4BAA4B;CAC5B,uBAAuB;CACvB,MAAM;CACN,SAAS;CACT,mBAAmB;CACnB,oBAAoB;CACpB,OAAO;CACP,aAAa;CAEb,OAAO;CACP,UAAU;CACV,UAAU;CACV,UAAU;CACV,qBAAqB;CACrB,YAAY;CACZ,OAAO;CACP,IAAI;CACJ,MAAM;CAEN,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,4BAA4B;CAC5B,UAAU;CACV,eAAe;CACf,iBAAiB;CACjB,uBAAuB;CACvB,kBAAkB;CAClB,mBAAmB;CACnB,oBAAoB;CACpB,oBAAoB;CACpB,mBAAmB;CACnB,OAAO;CACP,aAAa;CACb,gBAAgB;CAChB,kBAAkB;CAClB,QAAQ;CACR,aAAa;CACb,yBAAyB;CACzB,MAAM;CACN,MAAM;CACN,WAAW;CACX,kBAAkB;CAClB,wBAAwB;CACxB,8BAA8B;CAC9B,4BAA4B;CAC5B,QAAQ;CACR,aAAa;CACb,oBAAoB;CACpB,KAAK;CACL,MAAM;CACN,qBAAqB;CACrB,kBAAkB;CAClB,gBAAgB;CAChB,UAAU;CACV,2BAA2B;CAC3B,0BAA0B;CAC1B,QAAQ;CAER,0BAA0B;CAC1B,eAAe;CACf,MAAM;CACN,iBAAiB;CACjB,OAAO;CACP,OAAO;CACP,8BAA8B;CAC9B,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,6BAA6B;CAC7B,YAAY;CACZ,yBAAyB;CACzB,6BAA6B;CAC7B,kBAAkB;CAClB,uBAAuB;CACvB,yBAAyB;CACzB,SAAS;;;CAIT,6BAA6B;CAC7B,2BAA2B;CAC3B,+BAA+B;CAC/B,0BAA0B;CAC1B,uBAAuB;CACvB,uBAAuB;CACvB,WAAW;CACX,YAAY;CAEZ,0BAA0B;CAC1B,6BAA6B;CAC7B,wBAAwB;CACxB,kBAAkB;CAClB,yBAAyB;CACzB,mBAAmB;CACnB,qCAAqC;CACrC,iBAAiB;CACjB,UAAU;CACV,8BAA8B;CAC9B,2BAA2B;CAC3B,YAAY;CACZ,gCAAgC;CAChC,OAAO;CACP,2BAA2B;CAC3B,uBAAuB;;CAGvB,WAAW;CACX,YAAY;CACZ,kBAAkB;CAElB,gCAAgC;CAChC,sBAAsB;CACtB,SAAS;CACT,gBAAgB;CAChB,gBAAgB;CAChB,qBAAqB;CAGrB,qBAAqB;CACrB,qBAAqB;CACrB,oBAAoB;CACpB,+CAA+C;CAC/C,2BAA2B;CAC3B,kCAAkC;CAClC,6BAA6B;CAC7B,wBAAwB;CACxB,0BAA0B;CAC1B,sBAAsB;CACtB,yBAAyB;CACzB,eAAe;CACf,qBAAqB;CACrB,eAAe;CACf,mBAAmB;CACnB,cAAc;CACd,cAAc;CAGd,+BAA+B;CAC/B,8BAA8B;CAC9B,6BAA6B;CAC7B,wBAAwB;CACxB,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAG9B,UAAU;CACV,sBAAsB;CACtB,yBAAyB;CACzB,gCAAgC;CAEhC,mBAAmB;CACnB,8BAA8B;CAC9B,+BAA+B;CAC/B,yBAAyB;CACzB,8BAA8B;CAC9B,qBAAqB;CACrB,wBAAwB;CACxB,eAAe;CACf,oBAAoB;CACpB,cAAc;CACd,6BAA6B;CAC7B,6BAA6B;CAG7B,YAAY;CACZ,QAAQ;CACR,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,WAAW;CACX,WAAW;CACX,MAAM;CACN,cAAc;CACd,YAAY;CACZ,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,cAAc;CACd,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,gBAAgB;CAChB,gBAAgB;CAChB,eAAe;CAGf,4BAA4B;CAC5B,gCAAgC;CAChC,2BAA2B;CAC3B,+BAA+B;CAC/B,sBAAsB;CACtB,YAAY;CAGZ,wBAAwB;CACxB,mBAAmB;CACnB,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,0BAA0B;CAC1B,sBAAsB;CACtB,4BAA4B;CAC5B,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;CACnB,+BAA+B;CAC/B,wBAAwB;CACxB,yBAAyB;CACzB,4BAA4B;CAC5B,mBAAmB;CACnB,cAAc;CACd,uBAAuB;CACvB,kBAAkB;CAGlB,aAAa;CACb,yBAAyB;CACzB,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,oBAAoB;CACpB,gCAAgC;CAChC,sBAAsB;CACtB,kCAAkC;CAClC,cAAc;CACd,0BAA0B;CAC1B,aAAa;CACb,yBAAyB;CACzB,cAAc;CACd,0BAA0B;CAC1B,iBAAiB;CACjB,aAAa;CACb,aAAa;CACb,eAAe;CACf,oBAAoB;CACpB,2BAA2B;CAC3B,2BAA2B;CAC3B,aAAa;CACb,eAAe;CACf,kBAAkB;CAClB,sBAAsB;CACtB,qBAAqB;CACrB,iCAAiC;CAEjC,kBAAkB;CAClB,uBAAuB;CACvB,2BAA2B;CAC3B,mCAAmC;CACnC,mCAAmC;CACnC,oCAAoC;CACpC,sCAAsC;CACtC,8BAA8B;CAC9B,gBAAgB;CAChB,wBAAwB;CACxB,0BAA0B;CAC1B,kCAAkC;CAClC,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,oCAAoC;CACpC,iCAAiC;CAGjC,0BAA0B;CAC1B,mCAAmC;CACnC,iCAAiC;CACjC,iCAAiC;CACjC,+BAA+B;CAC/B,gCAAgC;CAChC,mCAAmC;CACnC,gCAAgC;CAChC,8BAA8B;CAGlC,WAAW;CACP,SAAS;CACT,UAAU;CACV,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,mBAAmB;CACnB,kBAAkB;CAClB,SAAS;CACT,UAAU;CACV,UAAU;CACV,iBAAiB;CACjB,kBAAkB;CAClB,cAAc;CACd,kBAAkB;CAClB,kBAAkB;CAClB,sBAAsB;CACtB,oBAAoB;CACpB,+BAA+B;CAC/B,mBAAmB;CACnB,cAAc;CACd,WAAW;CACX,cAAc;CACd,QAAQ;CACR,oBAAoB;CACpB,UAAU;CACV,qBAAqB;CACrB,gBAAgB;CAChB,SAAS;CACT,SAAS;CACT,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,2BAA2B;CAC3B,qBAAqB;CACrB,wBAAwB;CACxB,YAAY;CACZ,2BAA2B;CAC3B,2BAA2B;CAC3B,UAAU;CACV,yBAAyB;CACzB,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,gBAAgB;CAChB,eAAe;CACf,YAAY;CACZ,mBAAmB;CACnB,kBAAkB;CAClB,eAAe;CACf,cAAc;CACd,UAAU;CACV,OAAO;CACP,kCAAkC;CAClC,4BAA4B;CAC5B,wBAAwB;CACxB,kCAAkC;CAClC,kCAAkC;CAClC,oBAAoB;CACpB,uBAAuB;CACvB,iBAAiB;CACjB,iBAAiB;CACjB,0BAA0B;CAC1B,wBAAwB;CACxB,uBAAuB;CACvB,uBAAuB;CACvB,oBAAoB;CACpB,uBAAuB;CACvB,kCAAkC;CAClC,6BAA6B;CAC7B,iBAAiB;CACjB,gBAAgB;CAChB,qBAAqB;CACrB,iBAAiB;CACjB,kBAAkB;CAClB,sBAAsB;CACtB,0BAA0B;CAC1B,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,gCAAgC;CAChC,mBAAmB;CACnB,gCAAgC;CAChC,qCAAqC;CACrC,0BAA0B;CAC1B,4BAA4B;CAC5B,iCAAiC;CACjC,wBAAwB;CACxB,sCAAsC;CACtC,iCAAiC;CACjC,uBAAuB;CACvB,0BAA0B;CAC1B,oCAAoC;CACpC,4BAA4B;CAC5B,6BAA6B;CAC7B,mCAAmC;CACnC,gBAAgB;CAChB,oCAAoC;CACpC,wBAAwB;CACxB,8BAA8B;CAC9B,wBAAwB;CACxB,8BAA8B;CAC9B,sBAAsB;CACtB,+BAA+B;CAC/B,6BAA6B;CAC7B,4BAA4B;CAC5B,2BAA2B;CAC3B,gCAAgC;CAChC,sCAAsC;CACtC,+BAA+B;CAC/B,iCAAiC;CACjC,mCAAmC;CACnC,sBAAsB;CACtB,uBAAuB;CACvB,yBAAyB;CACzB,qBAAqB;CACrB,2BAA2B;CAC3B,0BAA0B;CAC1B,2BAA2B;CAC3B,sBAAsB;CACtB,2BAA2B;CAC3B,uBAAuB;CACvB,kBAAkB;CAClB,wBAAwB;CACxB,oBAAoB;CACpB,qBAAqB;CACrB,mBAAmB;CACnB,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,qBAAqB;CACrB,wBAAwB;CACxB,6BAA6B;CAC7B,6BAA6B;CAC7B,sBAAsB;CACtB,2BAA2B;CAC3B,6BAA6B;CAC7B,8BAA8B;CAC9B,iBAAiB;CACjB,mBAAmB;CACnB,iCAAiC;CACjC,gCAAgC;CAChC,iCAAiC;CACjC,gCAAgC;CAChC,kCAAkC;CAClC,iCAAiC;CACjC,yBAAyB;CACzB,sBAAsB;CACtB,kBAAkB;CAClB,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,sBAAsB;CACtB,8BAA8B;CAC9B,sBAAsB;CACtB,oBAAoB;CACpB,wBAAwB;CACxB,+BAA+B;CAC/B,oBAAoB;CACpB,gCAAgC;CAChC,wBAAwB;CACxB,0BAA0B;CAC1B,+BAA+B;CAC/B,2BAA2B;CAC3B,gCAAgC;CAChC,uBAAuB;CACvB,4BAA4B;CAC5B,iCAAiC;CACjC,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,uCAAuC;CACvC,8BAA8B;CAC9B,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,oCAAoC;CACpC,mCAAmC;CACnC,6BAA6B;CAC7B,6BAA6B;CAC7B,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAC9B,2BAA2B;CAC3B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,2CAA2C;CAC3C,8BAA8B;CAC9B,iCAAiC;CACjC,4BAA4B;CAC5B,4BAA4B;CAC5B,kCAAkC;CAClC,wCAAwC;CACxC,wCAAwC;CACxC,8CAA8C;CAC9C,uCAAuC;CACvC,8BAA8B;CAC9B,oCAAoC;CACpC,6BAA6B;CAC7B,+BAA+B;CAC/B,kCAAkC;CAClC,iCAAiC;CACjC,qBAAqB;CACrB,0BAA0B;CAC1B,iCAAiC;CACjC,uBAAuB;CACvB,4BAA4B;CAC5B,qCAAqC;CACrC,4BAA4B;CAC5B,0CAA0C;CAC1C,+BAA+B;CAC/B,iCAAiC;CACjC,6BAA6B;CAC7B,mCAAmC;CACnC,+BAA+B;CAC/B,iCAAiC;CACjC,kCAAkC;CAClC,4CAA4C;CAC5C,6CAA6C;CAC7C,6CAA6C;CAC7C,sCAAsC;CACtC,kCAAkC;CAClC,oBAAoB;CACpB,oCAAoC;CACpC,gCAAgC;CAChC,yBAAyB;CACzB,gCAAgC;CAChC,2BAA2B;CAG3B,gBAAgB;CAChB,uBAAuB;CACvB,4BAA4B;CAC5B,MAAM;CACN,UAAU;CACV,mBAAmB;CAGnB,mBAAmB;CACnB,cAAc;CACd,kBAAkB;CAClB,qBAAqB;CACrB,uBAAuB;CACvB,mBAAmB;CACnB,oBAAoB;CACpB,iBAAiB;CACjB,4BAA4B;CAC5B,6BAA6B;CAC7B,wBAAwB;CACxB,4BAA4B;CAC5B,4BAA4B;CAC5B,kBAAkB;CAGlB,0BAA0B;CAG1B,yBAAyB;CACzB,qBAAqB;CACrB,yBAAyB;AAC7B;;;ACv5BA,IAAa,KAAyB;CAElC,MAAM;CACN,QAAQ;CACR,aAAa;CACb,gBAAgB;CAChB,uBAAuB;CACvB,kBAAkB;CAClB,SAAS;CACT,OAAO;CACP,QAAQ;CAGR,MAAM;CACN,MAAM;CACN,QAAQ;CACR,oBAAoB;CAGpB,2BAA2B;CAC3B,0BAA0B;CAC1B,mCAAmC;CAGnC,uBAAuB;CACvB,sBAAsB;CACtB,iBAAiB;CACjB,cAAc;CACd,YAAY;CACZ,8BAA8B;CAC9B,yBAAyB;CAGzB,QAAQ;CACR,YAAY;CACZ,mBAAmB;CACnB,QAAQ;CACR,SAAS;CACT,cAAc;CACd,mBAAmB;CACnB,YAAY;CACZ,WAAW;CACX,UAAU;CACV,kBAAkB;CAClB,oBAAoB;CACpB,yBAAyB;CACzB,wBAAwB;CACxB,mBAAmB;CACnB,KAAK;CACL,QAAQ;CACR,mBAAmB;CACnB,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,cAAc;CACd,WAAW;CACX,YAAY;CACZ,aAAa;CACb,IAAI;CACJ,wBAAwB;CACxB,uBAAuB;CACvB,aAAa;CACb,YAAY;CACZ,UAAU;CACV,yBAAyB;CACzB,SAAS;CACT,cAAc;CACd,iBAAiB;CACjB,aAAa;CACb,MAAM;CACN,SAAS;CACT,yBAAyB;CACzB,OAAO;CACP,uBAAuB;CACvB,mCAAmC;CACnC,iBAAiB;CACjB,eAAe;CACf,uBAAuB;CACvB,uBAAuB;CACvB,mCAAmC;CACnC,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,MAAM;CACN,KAAK;CACL,OAAO;CACP,gCAAgC;CAChC,yBAAyB;CACzB,2BAA2B;CAG3B,iBAAiB;CACjB,qBAAqB;CACrB,oBAAoB;CACpB,qBAAqB;CACrB,uBAAuB;CACvB,eAAe;CACf,cAAc;CACd,0BAA0B;CAE1B,OAAO;CACP,MAAM;CACN,sBAAsB;CACtB,0BAA0B;CAC1B,oBAAoB;CACpB,6BAA6B;CAC7B,sBAAsB;CACtB,iBAAiB;CACjB,2BAA2B;CAC3B,kBAAkB;CAClB,gCAAgC;CAChC,4BAA4B;CAC5B,uBAAuB;CACvB,uBAAuB;CACvB,mBAAmB;CACnB,0BAA0B;CAC1B,kBAAkB;CAClB,gBAAgB;CAChB,2BAA2B;CAC3B,kBAAkB;CAClB,cAAc;CACd,sBAAsB;CACtB,0BAA0B;CAC1B,kBAAkB;CAClB,cAAc;CACd,0BAA0B;CAC1B,2BAA2B;CAC3B,oCAAoC;CACpC,0BAA0B;CAC1B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,2BAA2B;CAC3B,mCAAmC;CACnC,gCAAgC;CAChC,gBAAgB;CAGhB,iBAAiB;CACjB,wBAAwB;CAGxB,WAAW;CACX,YAAY;CACZ,WAAW;CACX,cAAc;CACd,OAAO;CACP,KAAK;CACL,oBAAoB;CACpB,kBAAkB;CAGlB,WAAW;CACX,cAAc;CACd,mBAAmB;CACnB,UAAU;CACV,QAAQ;CAGR,OAAO;CACP,sBAAsB;CACtB,gBAAgB;CAChB,qBAAqB;CACrB,sBAAsB;CACtB,sBAAsB;CACtB,uBAAuB;CACvB,cAAc;CACd,wBAAwB;CACxB,eAAe;CACf,iCAAiC;CAGjC,SAAS;CACT,uBAAuB;CACvB,yBAAyB;CACzB,oBAAoB;CACpB,qBAAqB;CACrB,wBAAwB;CACxB,wBAAwB;CACxB,yBAAyB;CACzB,cAAc;CACd,WAAW;CACX,uBAAuB;CACvB,gBAAgB;CAGhB,cAAc;CACd,kBAAkB;CAClB,wBAAwB;CACxB,yBAAyB;CAGzB,oBAAoB;CAGpB,aAAa;CAGb,iDAAiD;CAGjD,gBAAgB;CAChB,qBAAqB;CACrB,cAAc;CAGd,yBAAyB;CACzB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,uCAAuC;CAEvC,eAAe;CACf,YAAY;CACZ,aAAa;CACb,qCAAqC;CAErC,oBAAoB;CACpB,yBAAyB;CAEzB,sBAAsB;CACtB,2BAA2B;CAE3B,sBAAsB;CACtB,4BAA4B;CAC5B,yBAAyB;CACzB,qCAAqC;CACrC,iBAAiB;CACjB,gCAAgC;CAChC,kCAAkC;CAClC,mBAAmB;CACnB,mBAAmB;CAEnB,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,aAAa;CACb,qBAAqB;CACrB,MAAM;CACN,6BAA6B;CAC7B,MAAM;CACN,yBAAyB;CACzB,kBAAkB;CAClB,eAAe;CACf,2BAA2B;CAC3B,aAAa;CACb,2BAA2B;CAC3B,eAAe;CACf,2BAA2B;CAC3B,kBAAkB;CAClB,8BAA8B;CAC9B,mBAAmB;CACnB,oBAAoB;CACpB,qBAAqB;CACrB,yBAAyB;CACzB,yBAAyB;CACzB,wBAAwB;CACxB,cAAc;CACd,sBAAsB;CACtB,qBAAqB;CACrB,uBAAuB;CACvB,0BAA0B;CAC1B,oBAAoB;CACpB,yBAAyB;CACzB,aAAa;CACb,cAAc;CAEd,gBAAgB;CAChB,WAAW;CACX,2BAA2B;CAC3B,wBAAwB;CACxB,0BAA0B;CAC1B,oBAAoB;CACpB,uBAAuB;CAEvB,mBAAmB;CACnB,mBAAmB;CACnB,cAAc;CACd,yBAAyB;CACzB,sBAAsB;CACtB,wBAAwB;CACxB,2BAA2B;CAC3B,2BAA2B;CAC3B,kBAAkB;CAClB,qBAAqB;CAErB,wBAAwB;CACxB,qBAAqB;CACrB,wBAAwB;CACxB,2BAA2B;CAC3B,QAAQ;CAER,yBAAyB;CACzB,mCAAmC;CACnC,sBAAsB;CACtB,yBAAyB;CACzB,uBAAuB;CACvB,iBAAiB;CACjB,yBAAyB;CACzB,0BAA0B;CAC1B,iBAAiB;CACjB,wBAAwB;CACxB,0BAA0B;CAC1B,UAAU;CAEV,kBAAkB;CAClB,uBAAuB;CACvB,mCAAmC;CACnC,mBAAmB;CACnB,0BAA0B;CAC1B,uBAAuB;CACvB,oBAAoB;CACpB,cAAc;CACd,cAAc;CAEd,wBAAwB;CACxB,sBAAsB;CACtB,WAAW;CACX,MAAM;CACN,mBAAmB;CACnB,iBAAiB;CACjB,iBAAiB;CACjB,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,gCAAgC;CAChC,qCAAqC;CACrC,+BAA+B;CAC/B,+BAA+B;CAC/B,2CAA2C;CAC3C,KAAK;CACL,mCAAmC;CACnC,oBAAoB;CACpB,KAAK;CACL,IAAI;CACJ,6BAA6B;CAC7B,kBAAkB;CAClB,sBAAsB;CACtB,KAAK;CACL,2BAA2B;CAC3B,oBAAoB;CACpB,6BAA6B;CAC7B,mBAAmB;CACnB,aAAa;CACb,QAAQ;CAER,0BAA0B;CAC1B,4BAA4B;CAC5B,uBAAuB;CACvB,MAAM;CACN,SAAS;CACT,mBAAmB;CACnB,oBAAoB;CACpB,OAAO;CACP,aAAa;CAEb,OAAO;CACP,UAAU;CACV,UAAU;CACV,UAAU;CACV,qBAAqB;CACrB,YAAY;CACZ,OAAO;CACP,IAAI;CACJ,MAAM;CAEN,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,4BAA4B;CAC5B,UAAU;CACV,eAAe;CACf,iBAAiB;CACjB,uBAAuB;CACvB,kBAAkB;CAClB,mBAAmB;CACnB,oBAAoB;CACpB,oBAAoB;CACpB,mBAAmB;CACnB,OAAO;CACP,aAAa;CACb,gBAAgB;CAChB,kBAAkB;CAClB,QAAQ;CACR,aAAa;CACb,yBAAyB;CACzB,MAAM;CACN,MAAM;CACN,WAAW;CACX,kBAAkB;CAClB,wBAAwB;CACxB,8BAA8B;CAC9B,4BAA4B;CAC5B,QAAQ;CACR,aAAa;CACb,oBAAoB;CACpB,KAAK;CACL,MAAM;CACN,qBAAqB;CACrB,kBAAkB;CAClB,gBAAgB;CAChB,UAAU;CACV,2BAA2B;CAC3B,0BAA0B;CAC1B,QAAQ;CAER,0BAA0B;CAC1B,eAAe;CACf,MAAM;CACN,iBAAiB;CACjB,OAAO;CACP,OAAO;CACP,8BAA8B;CAC9B,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,6BAA6B;CAC7B,YAAY;CACZ,yBAAyB;CACzB,6BAA6B;CAC7B,kBAAkB;CAClB,uBAAuB;CACvB,yBAAyB;CACzB,SAAS;;;CAIT,6BAA6B;CAC7B,2BAA2B;CAC3B,+BAA+B;CAC/B,0BAA0B;CAC1B,uBAAuB;CACvB,uBAAuB;CACvB,WAAW;CACX,YAAY;CAEZ,0BAA0B;CAC1B,6BAA6B;CAC7B,wBAAwB;CACxB,kBAAkB;CAClB,yBAAyB;CACzB,mBAAmB;CACnB,qCAAqC;CACrC,iBAAiB;CACjB,UAAU;CACV,8BAA8B;CAC9B,2BAA2B;CAC3B,YAAY;CACZ,gCAAgC;CAChC,OAAO;CACP,2BAA2B;CAC3B,uBAAuB;;CAGvB,WAAW;CACX,YAAY;CACZ,kBAAkB;CAElB,gCAAgC;CAChC,sBAAsB;CACtB,SAAS;CACT,gBAAgB;CAChB,gBAAgB;CAChB,qBAAqB;CAGrB,qBAAqB;CACrB,qBAAqB;CACrB,oBAAoB;CACpB,+CAA+C;CAC/C,2BAA2B;CAC3B,kCAAkC;CAClC,6BAA6B;CAC7B,wBAAwB;CACxB,0BAA0B;CAC1B,sBAAsB;CACtB,yBAAyB;CACzB,eAAe;CACf,qBAAqB;CACrB,eAAe;CACf,mBAAmB;CACnB,cAAc;CACd,cAAc;CAGd,+BAA+B;CAC/B,8BAA8B;CAC9B,6BAA6B;CAC7B,wBAAwB;CACxB,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAC9B,UAAU;CACV,sBAAsB;CACtB,yBAAyB;CACzB,gCAAgC;CAChC,mBAAmB;CACnB,8BAA8B;CAC9B,+BAA+B;CAC/B,yBAAyB;CACzB,8BAA8B;CAC9B,qBAAqB;CACrB,wBAAwB;CACxB,eAAe;CACf,oBAAoB;CACpB,cAAc;CACd,6BAA6B;CAC7B,6BAA6B;CAG7B,YAAY;CACZ,QAAQ;CACR,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,WAAW;CACX,WAAW;CACX,MAAM;CACN,cAAc;CACd,YAAY;CACZ,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,cAAc;CACd,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,gBAAgB;CAChB,gBAAgB;CAChB,eAAe;CAGf,4BAA4B;CAC5B,gCAAgC;CAChC,2BAA2B;CAC3B,+BAA+B;CAC/B,sBAAsB;CACtB,YAAY;CAGZ,wBAAwB;CACxB,mBAAmB;CACnB,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,0BAA0B;CAC1B,sBAAsB;CACtB,4BAA4B;CAC5B,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;CACnB,+BAA+B;CAC/B,wBAAwB;CACxB,yBAAyB;CACzB,4BAA4B;CAC5B,mBAAmB;CACnB,cAAc;CACd,uBAAuB;CACvB,kBAAkB;CAGlB,aAAa;CACb,yBAAyB;CACzB,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,oBAAoB;CACpB,gCAAgC;CAChC,sBAAsB;CACtB,kCAAkC;CAClC,cAAc;CACd,0BAA0B;CAC1B,aAAa;CACb,yBAAyB;CACzB,cAAc;CACd,0BAA0B;CAC1B,iBAAiB;CACjB,aAAa;CACb,aAAa;CACb,eAAe;CACf,oBAAoB;CACpB,2BAA2B;CAC3B,2BAA2B;CAC3B,aAAa;CACb,eAAe;CACf,kBAAkB;CAClB,sBAAsB;CACtB,qBAAqB;CACrB,iCAAiC;CAEjC,kBAAkB;CAClB,uBAAuB;CACvB,2BAA2B;CAC3B,mCAAmC;CACnC,mCAAmC;CACnC,oCAAoC;CACpC,sCAAsC;CACtC,8BAA8B;CAC9B,gBAAgB;CAChB,wBAAwB;CACxB,0BAA0B;CAC1B,kCAAkC;CAClC,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,oCAAoC;CACpC,iCAAiC;CAGjC,0BAA0B;CAC1B,mCAAmC;CACnC,iCAAiC;CACjC,iCAAiC;CACjC,+BAA+B;CAC/B,gCAAgC;CAChC,mCAAmC;CACnC,gCAAgC;CAChC,8BAA8B;CAGlC,WAAW;CACP,SAAS;CACT,UAAU;CACV,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,mBAAmB;CACnB,kBAAkB;CAClB,SAAS;CACT,UAAU;CACV,cAAc;CACd,WAAW;CACX,cAAc;CACd,QAAQ;CACR,oBAAoB;CACpB,UAAU;CACV,qBAAqB;CACrB,gBAAgB;CAChB,SAAS;CACT,SAAS;CACT,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,2BAA2B;CAC3B,qBAAqB;CACrB,wBAAwB;CACxB,YAAY;CACZ,2BAA2B;CAC3B,2BAA2B;CAC3B,UAAU;CACV,yBAAyB;CACzB,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,gBAAgB;CAChB,eAAe;CACf,YAAY;CACZ,mBAAmB;CACnB,kBAAkB;CAClB,eAAe;CACf,cAAc;CACd,UAAU;CACV,OAAO;CACP,kCAAkC;CAClC,4BAA4B;CAC5B,wBAAwB;CACxB,kCAAkC;CAClC,kCAAkC;CAClC,oBAAoB;CACpB,uBAAuB;CACvB,iBAAiB;CACjB,iBAAiB;CACjB,0BAA0B;CAC1B,wBAAwB;CACxB,uBAAuB;CACvB,uBAAuB;CACvB,oBAAoB;CACpB,uBAAuB;CACvB,kCAAkC;CAClC,6BAA6B;CAC7B,iBAAiB;CACjB,gBAAgB;CAChB,qBAAqB;CACrB,iBAAiB;CACjB,kBAAkB;CAClB,sBAAsB;CACtB,0BAA0B;CAC1B,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,gCAAgC;CAChC,mBAAmB;CACnB,gCAAgC;CAChC,qCAAqC;CACrC,0BAA0B;CAC1B,4BAA4B;CAC5B,iCAAiC;CACjC,wBAAwB;CACxB,sCAAsC;CACtC,iCAAiC;CACjC,uBAAuB;CACvB,0BAA0B;CAC1B,oCAAoC;CACpC,4BAA4B;CAC5B,6BAA6B;CAC7B,mCAAmC;CACnC,gBAAgB;CAChB,oCAAoC;CACpC,wBAAwB;CACxB,8BAA8B;CAC9B,wBAAwB;CACxB,8BAA8B;CAC9B,sBAAsB;CACtB,+BAA+B;CAC/B,6BAA6B;CAC7B,4BAA4B;CAC5B,2BAA2B;CAC3B,gCAAgC;CAChC,sCAAsC;CACtC,+BAA+B;CAC/B,iCAAiC;CACjC,mCAAmC;CACnC,sBAAsB;CACtB,uBAAuB;CACvB,yBAAyB;CACzB,qBAAqB;CACrB,2BAA2B;CAC3B,0BAA0B;CAC1B,2BAA2B;CAC3B,sBAAsB;CACtB,2BAA2B;CAC3B,uBAAuB;CACvB,kBAAkB;CAClB,wBAAwB;CACxB,oBAAoB;CACpB,qBAAqB;CACrB,mBAAmB;CACnB,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,qBAAqB;CACrB,wBAAwB;CACxB,6BAA6B;CAC7B,6BAA6B;CAC7B,sBAAsB;CACtB,2BAA2B;CAC3B,6BAA6B;CAC7B,8BAA8B;CAC9B,iBAAiB;CACjB,mBAAmB;CACnB,iCAAiC;CACjC,gCAAgC;CAChC,iCAAiC;CACjC,gCAAgC;CAChC,kCAAkC;CAClC,iCAAiC;CACjC,yBAAyB;CACzB,sBAAsB;CACtB,kBAAkB;CAClB,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,sBAAsB;CACtB,8BAA8B;CAC9B,sBAAsB;CACtB,oBAAoB;CACpB,wBAAwB;CACxB,+BAA+B;CAC/B,oBAAoB;CACpB,gCAAgC;CAChC,wBAAwB;CACxB,0BAA0B;CAC1B,+BAA+B;CAC/B,2BAA2B;CAC3B,gCAAgC;CAChC,uBAAuB;CACvB,4BAA4B;CAC5B,iCAAiC;CACjC,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,uCAAuC;CACvC,8BAA8B;CAC9B,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,oCAAoC;CACpC,mCAAmC;CACnC,6BAA6B;CAC7B,6BAA6B;CAC7B,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAC9B,2BAA2B;CAC3B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,2CAA2C;CAC3C,8BAA8B;CAC9B,iCAAiC;CACjC,4BAA4B;CAC5B,4BAA4B;CAC5B,kCAAkC;CAClC,wCAAwC;CACxC,wCAAwC;CACxC,8CAA8C;CAC9C,uCAAuC;CACvC,8BAA8B;CAC9B,oCAAoC;CACpC,6BAA6B;CAC7B,+BAA+B;CAC/B,kCAAkC;CAClC,iCAAiC;CACjC,qBAAqB;CACrB,0BAA0B;CAC1B,iCAAiC;CACjC,uBAAuB;CACvB,4BAA4B;CAC5B,qCAAqC;CACrC,4BAA4B;CAC5B,0CAA0C;CAC1C,+BAA+B;CAC/B,iCAAiC;CACjC,6BAA6B;CAC7B,mCAAmC;CACnC,+BAA+B;CAC/B,iCAAiC;CACjC,kCAAkC;CAClC,4CAA4C;CAC5C,6CAA6C;CAC7C,6CAA6C;CAC7C,sCAAsC;CACtC,kCAAkC;CAClC,oBAAoB;CACpB,oCAAoC;CACpC,gCAAgC;CAChC,yBAAyB;CACzB,gCAAgC;CAChC,2BAA2B;CAG3B,gBAAgB;CAChB,uBAAuB;CACvB,4BAA4B;CAC5B,MAAM;CACN,UAAU;CACV,mBAAmB;CAGnB,mBAAmB;CACnB,cAAc;CACd,kBAAkB;CAClB,qBAAqB;CACrB,uBAAuB;CACvB,mBAAmB;CACnB,oBAAoB;CACpB,iBAAiB;CACjB,4BAA4B;CAC5B,6BAA6B;CAC7B,wBAAwB;CACxB,4BAA4B;CAC5B,4BAA4B;CAC5B,kBAAkB;CAGlB,0BAA0B;CAG1B,yBAAyB;CACzB,qBAAqB;CACrB,yBAAyB;AAC7B;;;ACl4BA,IAAa,KAAyB;CAElC,MAAM;CACN,QAAQ;CACR,aAAa;CACb,gBAAgB;CAChB,uBAAuB;CACvB,kBAAkB;CAClB,SAAS;CACT,OAAO;CACP,QAAQ;CAGR,MAAM;CACN,MAAM;CACN,QAAQ;CACR,oBAAoB;CAGpB,2BAA2B;CAC3B,0BAA0B;CAC1B,mCAAmC;CAGnC,uBAAuB;CACvB,sBAAsB;CACtB,iBAAiB;CACjB,cAAc;CACd,YAAY;CACZ,8BAA8B;CAC9B,yBAAyB;CAGzB,QAAQ;CACR,YAAY;CACZ,mBAAmB;CACnB,QAAQ;CACR,SAAS;CACT,cAAc;CACd,mBAAmB;CACnB,YAAY;CACZ,WAAW;CACX,UAAU;CACV,kBAAkB;CAClB,oBAAoB;CACpB,yBAAyB;CACzB,wBAAwB;CACxB,mBAAmB;CACnB,KAAK;CACL,QAAQ;CACR,mBAAmB;CACnB,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,cAAc;CACd,WAAW;CACX,YAAY;CACZ,aAAa;CACb,IAAI;CACJ,wBAAwB;CACxB,uBAAuB;CACvB,aAAa;CACb,YAAY;CACZ,UAAU;CACV,yBAAyB;CACzB,SAAS;CACT,cAAc;CACd,iBAAiB;CACjB,aAAa;CACb,MAAM;CACN,SAAS;CACT,yBAAyB;CACzB,OAAO;CACP,uBAAuB;CACvB,mCAAmC;CACnC,iBAAiB;CACjB,eAAe;CACf,uBAAuB;CACvB,uBAAuB;CACvB,mCAAmC;CACnC,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,MAAM;CACN,KAAK;CACL,OAAO;CACP,gCAAgC;CAChC,yBAAyB;CACzB,2BAA2B;CAG3B,iBAAiB;CACjB,qBAAqB;CACrB,oBAAoB;CACpB,qBAAqB;CACrB,uBAAuB;CACvB,eAAe;CACf,cAAc;CACd,0BAA0B;CAE1B,OAAO;CACP,MAAM;CACN,sBAAsB;CACtB,0BAA0B;CAC1B,oBAAoB;CACpB,6BAA6B;CAC7B,sBAAsB;CACtB,iBAAiB;CACjB,2BAA2B;CAC3B,kBAAkB;CAClB,gCAAgC;CAChC,4BAA4B;CAC5B,uBAAuB;CACvB,uBAAuB;CACvB,mBAAmB;CACnB,0BAA0B;CAC1B,kBAAkB;CAClB,gBAAgB;CAChB,2BAA2B;CAC3B,kBAAkB;CAClB,cAAc;CACd,sBAAsB;CACtB,0BAA0B;CAC1B,kBAAkB;CAClB,cAAc;CACd,0BAA0B;CAC1B,2BAA2B;CAC3B,oCAAoC;CACpC,0BAA0B;CAC1B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,2BAA2B;CAC3B,mCAAmC;CACnC,gCAAgC;CAChC,gBAAgB;CAGhB,iBAAiB;CACjB,wBAAwB;CAGxB,WAAW;CACX,YAAY;CACZ,WAAW;CACX,cAAc;CACd,OAAO;CACP,KAAK;CACL,oBAAoB;CACpB,kBAAkB;CAGlB,WAAW;CACX,cAAc;CACd,mBAAmB;CACnB,UAAU;CACV,QAAQ;CAGR,OAAO;CACP,sBAAsB;CACtB,gBAAgB;CAChB,qBAAqB;CACrB,sBAAsB;CACtB,sBAAsB;CACtB,uBAAuB;CACvB,cAAc;CACd,wBAAwB;CACxB,eAAe;CACf,iCAAiC;CAGjC,SAAS;CACT,uBAAuB;CACvB,yBAAyB;CACzB,oBAAoB;CACpB,qBAAqB;CACrB,wBAAwB;CACxB,wBAAwB;CACxB,yBAAyB;CACzB,cAAc;CACd,WAAW;CACX,uBAAuB;CACvB,gBAAgB;CAGhB,cAAc;CACd,kBAAkB;CAClB,wBAAwB;CACxB,yBAAyB;CAGzB,oBAAoB;CAGpB,aAAa;CAGb,iDAAiD;CAGjD,gBAAgB;CAChB,qBAAqB;CACrB,cAAc;CAGd,yBAAyB;CACzB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,uCAAuC;CAEvC,eAAe;CACf,YAAY;CACZ,aAAa;CACb,qCAAqC;CAErC,oBAAoB;CACpB,yBAAyB;CAEzB,sBAAsB;CACtB,2BAA2B;CAE3B,sBAAsB;CACtB,4BAA4B;CAC5B,yBAAyB;CACzB,qCAAqC;CACrC,iBAAiB;CACjB,gCAAgC;CAChC,kCAAkC;CAClC,mBAAmB;CACnB,mBAAmB;CAEnB,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,aAAa;CACb,qBAAqB;CACrB,MAAM;CACN,6BAA6B;CAC7B,MAAM;CACN,yBAAyB;CACzB,kBAAkB;CAClB,eAAe;CACf,2BAA2B;CAC3B,aAAa;CACb,2BAA2B;CAC3B,eAAe;CACf,2BAA2B;CAC3B,kBAAkB;CAClB,8BAA8B;CAC9B,mBAAmB;CACnB,oBAAoB;CACpB,qBAAqB;CACrB,yBAAyB;CACzB,yBAAyB;CACzB,wBAAwB;CACxB,cAAc;CACd,sBAAsB;CACtB,qBAAqB;CACrB,uBAAuB;CACvB,0BAA0B;CAC1B,oBAAoB;CACpB,yBAAyB;CACzB,aAAa;CACb,cAAc;CAEd,gBAAgB;CAChB,WAAW;CACX,2BAA2B;CAC3B,wBAAwB;CACxB,0BAA0B;CAC1B,oBAAoB;CACpB,uBAAuB;CAEvB,mBAAmB;CACnB,mBAAmB;CACnB,cAAc;CACd,yBAAyB;CACzB,sBAAsB;CACtB,wBAAwB;CACxB,2BAA2B;CAC3B,2BAA2B;CAC3B,kBAAkB;CAClB,qBAAqB;CAErB,wBAAwB;CACxB,qBAAqB;CACrB,wBAAwB;CACxB,2BAA2B;CAC3B,QAAQ;CAER,yBAAyB;CACzB,mCAAmC;CACnC,sBAAsB;CACtB,yBAAyB;CACzB,uBAAuB;CACvB,iBAAiB;CACjB,yBAAyB;CACzB,0BAA0B;CAC1B,iBAAiB;CACjB,wBAAwB;CACxB,0BAA0B;CAC1B,UAAU;CAEV,kBAAkB;CAClB,uBAAuB;CACvB,mCAAmC;CACnC,mBAAmB;CACnB,0BAA0B;CAC1B,uBAAuB;CACvB,oBAAoB;CACpB,cAAc;CACd,cAAc;CAEd,wBAAwB;CACxB,sBAAsB;CACtB,WAAW;CACX,MAAM;CACN,mBAAmB;CACnB,iBAAiB;CACjB,iBAAiB;CACjB,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,gCAAgC;CAChC,qCAAqC;CACrC,+BAA+B;CAC/B,+BAA+B;CAC/B,2CAA2C;CAC3C,KAAK;CACL,mCAAmC;CACnC,oBAAoB;CACpB,KAAK;CACL,IAAI;CACJ,6BAA6B;CAC7B,kBAAkB;CAClB,sBAAsB;CACtB,KAAK;CACL,2BAA2B;CAC3B,oBAAoB;CACpB,6BAA6B;CAC7B,mBAAmB;CACnB,aAAa;CACb,QAAQ;CAER,0BAA0B;CAC1B,4BAA4B;CAC5B,uBAAuB;CACvB,MAAM;CACN,SAAS;CACT,mBAAmB;CACnB,oBAAoB;CACpB,OAAO;CACP,aAAa;CAEb,OAAO;CACP,UAAU;CACV,UAAU;CACV,UAAU;CACV,qBAAqB;CACrB,YAAY;CACZ,OAAO;CACP,IAAI;CACJ,MAAM;CAEN,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,4BAA4B;CAC5B,UAAU;CACV,eAAe;CACf,iBAAiB;CACjB,uBAAuB;CACvB,kBAAkB;CAClB,mBAAmB;CACnB,oBAAoB;CACpB,oBAAoB;CACpB,mBAAmB;CACnB,OAAO;CACP,aAAa;CACb,gBAAgB;CAChB,kBAAkB;CAClB,QAAQ;CACR,aAAa;CACb,yBAAyB;CACzB,MAAM;CACN,MAAM;CACN,WAAW;CACX,kBAAkB;CAClB,wBAAwB;CACxB,8BAA8B;CAC9B,4BAA4B;CAC5B,QAAQ;CACR,aAAa;CACb,oBAAoB;CACpB,KAAK;CACL,MAAM;CACN,qBAAqB;CACrB,kBAAkB;CAClB,gBAAgB;CAChB,UAAU;CACV,2BAA2B;CAC3B,0BAA0B;CAC1B,QAAQ;CAER,0BAA0B;CAC1B,eAAe;CACf,MAAM;CACN,iBAAiB;CACjB,OAAO;CACP,OAAO;CACP,8BAA8B;CAC9B,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,6BAA6B;CAC7B,YAAY;CACZ,yBAAyB;CACzB,6BAA6B;CAC7B,kBAAkB;CAClB,uBAAuB;CACvB,yBAAyB;CACzB,SAAS;;;CAIT,6BAA6B;CAC7B,2BAA2B;CAC3B,+BAA+B;CAC/B,0BAA0B;CAC1B,uBAAuB;CACvB,uBAAuB;CACvB,WAAW;CACX,YAAY;CAEZ,0BAA0B;CAC1B,6BAA6B;CAC7B,wBAAwB;CACxB,kBAAkB;CAClB,yBAAyB;CACzB,mBAAmB;CACnB,qCAAqC;CACrC,iBAAiB;CACjB,UAAU;CACV,8BAA8B;CAC9B,2BAA2B;CAC3B,YAAY;CACZ,gCAAgC;CAChC,OAAO;CACP,2BAA2B;CAC3B,uBAAuB;;CAGvB,WAAW;CACX,YAAY;CACZ,kBAAkB;CAElB,gCAAgC;CAChC,sBAAsB;CACtB,SAAS;CACT,gBAAgB;CAChB,gBAAgB;CAChB,qBAAqB;CAGrB,qBAAqB;CACrB,qBAAqB;CACrB,oBAAoB;CACpB,+CAA+C;CAC/C,2BAA2B;CAC3B,kCAAkC;CAClC,6BAA6B;CAC7B,wBAAwB;CACxB,0BAA0B;CAC1B,sBAAsB;CACtB,yBAAyB;CACzB,eAAe;CACf,qBAAqB;CACrB,eAAe;CACf,mBAAmB;CACnB,cAAc;CACd,cAAc;CAGd,+BAA+B;CAC/B,8BAA8B;CAC9B,6BAA6B;CAC7B,wBAAwB;CACxB,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAC9B,UAAU;CACV,sBAAsB;CACtB,yBAAyB;CACzB,gCAAgC;CAChC,mBAAmB;CACnB,8BAA8B;CAC9B,+BAA+B;CAC/B,yBAAyB;CACzB,8BAA8B;CAC9B,qBAAqB;CACrB,wBAAwB;CACxB,eAAe;CACf,oBAAoB;CACpB,cAAc;CACd,6BAA6B;CAC7B,6BAA6B;CAG7B,YAAY;CACZ,QAAQ;CACR,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,WAAW;CACX,WAAW;CACX,MAAM;CACN,cAAc;CACd,YAAY;CACZ,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,cAAc;CACd,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,gBAAgB;CAChB,gBAAgB;CAChB,eAAe;CAGf,4BAA4B;CAC5B,gCAAgC;CAChC,2BAA2B;CAC3B,+BAA+B;CAC/B,sBAAsB;CACtB,YAAY;CAGZ,wBAAwB;CACxB,mBAAmB;CACnB,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,0BAA0B;CAC1B,sBAAsB;CACtB,4BAA4B;CAC5B,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;CACnB,+BAA+B;CAC/B,wBAAwB;CACxB,yBAAyB;CACzB,4BAA4B;CAC5B,mBAAmB;CACnB,cAAc;CACd,uBAAuB;CACvB,kBAAkB;CAGlB,aAAa;CACb,yBAAyB;CACzB,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,oBAAoB;CACpB,gCAAgC;CAChC,sBAAsB;CACtB,kCAAkC;CAClC,cAAc;CACd,0BAA0B;CAC1B,aAAa;CACb,yBAAyB;CACzB,cAAc;CACd,0BAA0B;CAC1B,iBAAiB;CACjB,aAAa;CACb,aAAa;CACb,eAAe;CACf,oBAAoB;CACpB,2BAA2B;CAC3B,2BAA2B;CAC3B,aAAa;CACb,eAAe;CACf,kBAAkB;CAClB,sBAAsB;CACtB,qBAAqB;CACrB,iCAAiC;CAEjC,kBAAkB;CAClB,uBAAuB;CACvB,2BAA2B;CAC3B,mCAAmC;CACnC,mCAAmC;CACnC,oCAAoC;CACpC,sCAAsC;CACtC,8BAA8B;CAC9B,gBAAgB;CAChB,wBAAwB;CACxB,0BAA0B;CAC1B,kCAAkC;CAClC,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,oCAAoC;CACpC,iCAAiC;CAGjC,0BAA0B;CAC1B,mCAAmC;CACnC,iCAAiC;CACjC,iCAAiC;CACjC,+BAA+B;CAC/B,gCAAgC;CAChC,mCAAmC;CACnC,gCAAgC;CAChC,8BAA8B;CAGlC,WAAW;CACP,SAAS;CACT,UAAU;CACV,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,mBAAmB;CACnB,kBAAkB;CAClB,SAAS;CACT,UAAU;CACV,cAAc;CACd,WAAW;CACX,cAAc;CACd,QAAQ;CACR,oBAAoB;CACpB,UAAU;CACV,qBAAqB;CACrB,gBAAgB;CAChB,SAAS;CACT,SAAS;CACT,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,2BAA2B;CAC3B,qBAAqB;CACrB,wBAAwB;CACxB,YAAY;CACZ,2BAA2B;CAC3B,2BAA2B;CAC3B,UAAU;CACV,yBAAyB;CACzB,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,gBAAgB;CAChB,eAAe;CACf,YAAY;CACZ,mBAAmB;CACnB,kBAAkB;CAClB,eAAe;CACf,cAAc;CACd,UAAU;CACV,OAAO;CACP,kCAAkC;CAClC,4BAA4B;CAC5B,wBAAwB;CACxB,kCAAkC;CAClC,kCAAkC;CAClC,oBAAoB;CACpB,uBAAuB;CACvB,iBAAiB;CACjB,iBAAiB;CACjB,0BAA0B;CAC1B,wBAAwB;CACxB,uBAAuB;CACvB,uBAAuB;CACvB,oBAAoB;CACpB,uBAAuB;CACvB,kCAAkC;CAClC,6BAA6B;CAC7B,iBAAiB;CACjB,gBAAgB;CAChB,qBAAqB;CACrB,iBAAiB;CACjB,kBAAkB;CAClB,sBAAsB;CACtB,0BAA0B;CAC1B,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,gCAAgC;CAChC,mBAAmB;CACnB,gCAAgC;CAChC,qCAAqC;CACrC,0BAA0B;CAC1B,4BAA4B;CAC5B,iCAAiC;CACjC,wBAAwB;CACxB,sCAAsC;CACtC,iCAAiC;CACjC,uBAAuB;CACvB,0BAA0B;CAC1B,oCAAoC;CACpC,4BAA4B;CAC5B,6BAA6B;CAC7B,mCAAmC;CACnC,gBAAgB;CAChB,oCAAoC;CACpC,wBAAwB;CACxB,8BAA8B;CAC9B,wBAAwB;CACxB,8BAA8B;CAC9B,sBAAsB;CACtB,+BAA+B;CAC/B,6BAA6B;CAC7B,4BAA4B;CAC5B,2BAA2B;CAC3B,gCAAgC;CAChC,sCAAsC;CACtC,+BAA+B;CAC/B,iCAAiC;CACjC,mCAAmC;CACnC,sBAAsB;CACtB,uBAAuB;CACvB,yBAAyB;CACzB,qBAAqB;CACrB,2BAA2B;CAC3B,0BAA0B;CAC1B,2BAA2B;CAC3B,sBAAsB;CACtB,2BAA2B;CAC3B,uBAAuB;CACvB,kBAAkB;CAClB,wBAAwB;CACxB,oBAAoB;CACpB,qBAAqB;CACrB,mBAAmB;CACnB,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,qBAAqB;CACrB,wBAAwB;CACxB,6BAA6B;CAC7B,6BAA6B;CAC7B,sBAAsB;CACtB,2BAA2B;CAC3B,6BAA6B;CAC7B,8BAA8B;CAC9B,iBAAiB;CACjB,mBAAmB;CACnB,iCAAiC;CACjC,gCAAgC;CAChC,iCAAiC;CACjC,gCAAgC;CAChC,kCAAkC;CAClC,iCAAiC;CACjC,yBAAyB;CACzB,sBAAsB;CACtB,kBAAkB;CAClB,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,sBAAsB;CACtB,8BAA8B;CAC9B,sBAAsB;CACtB,oBAAoB;CACpB,wBAAwB;CACxB,+BAA+B;CAC/B,oBAAoB;CACpB,gCAAgC;CAChC,wBAAwB;CACxB,0BAA0B;CAC1B,+BAA+B;CAC/B,2BAA2B;CAC3B,gCAAgC;CAChC,uBAAuB;CACvB,4BAA4B;CAC5B,iCAAiC;CACjC,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,uCAAuC;CACvC,8BAA8B;CAC9B,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,oCAAoC;CACpC,mCAAmC;CACnC,6BAA6B;CAC7B,6BAA6B;CAC7B,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAC9B,2BAA2B;CAC3B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,2CAA2C;CAC3C,8BAA8B;CAC9B,iCAAiC;CACjC,4BAA4B;CAC5B,4BAA4B;CAC5B,kCAAkC;CAClC,wCAAwC;CACxC,wCAAwC;CACxC,8CAA8C;CAC9C,uCAAuC;CACvC,8BAA8B;CAC9B,oCAAoC;CACpC,6BAA6B;CAC7B,+BAA+B;CAC/B,kCAAkC;CAClC,iCAAiC;CACjC,qBAAqB;CACrB,0BAA0B;CAC1B,iCAAiC;CACjC,uBAAuB;CACvB,4BAA4B;CAC5B,qCAAqC;CACrC,4BAA4B;CAC5B,0CAA0C;CAC1C,+BAA+B;CAC/B,iCAAiC;CACjC,6BAA6B;CAC7B,mCAAmC;CACnC,+BAA+B;CAC/B,iCAAiC;CACjC,kCAAkC;CAClC,4CAA4C;CAC5C,6CAA6C;CAC7C,6CAA6C;CAC7C,sCAAsC;CACtC,kCAAkC;CAClC,oBAAoB;CACpB,oCAAoC;CACpC,gCAAgC;CAChC,yBAAyB;CACzB,gCAAgC;CAChC,2BAA2B;CAG3B,gBAAgB;CAChB,uBAAuB;CACvB,4BAA4B;CAC5B,MAAM;CACN,UAAU;CACV,mBAAmB;CAGnB,mBAAmB;CACnB,cAAc;CACd,kBAAkB;CAClB,qBAAqB;CACrB,uBAAuB;CACvB,mBAAmB;CACnB,oBAAoB;CACpB,iBAAiB;CACjB,4BAA4B;CAC5B,6BAA6B;CAC7B,wBAAwB;CACxB,4BAA4B;CAC5B,4BAA4B;CAC5B,kBAAkB;CAGlB,0BAA0B;CAG1B,yBAAyB;CACzB,qBAAqB;CACrB,yBAAyB;AAC7B;;;ACl4BA,IAAa,KAAyB;CAElC,MAAM;CACN,QAAQ;CACR,aAAa;CACb,gBAAgB;CAChB,uBAAuB;CACvB,kBAAkB;CAClB,SAAS;CACT,OAAO;CACP,QAAQ;CAGR,MAAM;CACN,MAAM;CACN,QAAQ;CACR,oBAAoB;CAGpB,2BAA2B;CAC3B,0BAA0B;CAC1B,mCAAmC;CAGnC,uBAAuB;CACvB,sBAAsB;CACtB,iBAAiB;CACjB,cAAc;CACd,YAAY;CACZ,8BAA8B;CAC9B,yBAAyB;CAGzB,QAAQ;CACR,YAAY;CACZ,mBAAmB;CACnB,QAAQ;CACR,SAAS;CACT,cAAc;CACd,mBAAmB;CACnB,YAAY;CACZ,WAAW;CACX,UAAU;CACV,kBAAkB;CAClB,oBAAoB;CACpB,yBAAyB;CACzB,wBAAwB;CACxB,mBAAmB;CACnB,KAAK;CACL,QAAQ;CACR,mBAAmB;CACnB,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,cAAc;CACd,WAAW;CACX,YAAY;CACZ,aAAa;CACb,IAAI;CACJ,wBAAwB;CACxB,uBAAuB;CACvB,aAAa;CACb,YAAY;CACZ,UAAU;CACV,yBAAyB;CACzB,SAAS;CACT,cAAc;CACd,iBAAiB;CACjB,aAAa;CACb,MAAM;CACN,SAAS;CACT,yBAAyB;CACzB,OAAO;CACP,uBAAuB;CACvB,mCAAmC;CACnC,iBAAiB;CACjB,eAAe;CACf,uBAAuB;CACvB,uBAAuB;CACvB,mCAAmC;CACnC,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,MAAM;CACN,KAAK;CACL,OAAO;CACP,gCAAgC;CAChC,yBAAyB;CACzB,2BAA2B;CAG3B,iBAAiB;CACjB,qBAAqB;CACrB,oBAAoB;CACpB,qBAAqB;CACrB,uBAAuB;CACvB,eAAe;CACf,cAAc;CACd,0BAA0B;CAE1B,OAAO;CACP,MAAM;CACN,sBAAsB;CACtB,0BAA0B;CAC1B,oBAAoB;CACpB,6BAA6B;CAC7B,sBAAsB;CACtB,iBAAiB;CACjB,2BAA2B;CAC3B,kBAAkB;CAClB,gCAAgC;CAChC,4BAA4B;CAC5B,uBAAuB;CACvB,uBAAuB;CACvB,mBAAmB;CACnB,0BAA0B;CAC1B,kBAAkB;CAClB,gBAAgB;CAChB,2BAA2B;CAC3B,kBAAkB;CAClB,cAAc;CACd,sBAAsB;CACtB,0BAA0B;CAC1B,kBAAkB;CAClB,cAAc;CACd,0BAA0B;CAC1B,2BAA2B;CAC3B,oCAAoC;CACpC,0BAA0B;CAC1B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,2BAA2B;CAC3B,mCAAmC;CACnC,gCAAgC;CAChC,gBAAgB;CAGhB,iBAAiB;CACjB,wBAAwB;CAGxB,WAAW;CACX,YAAY;CACZ,WAAW;CACX,cAAc;CACd,OAAO;CACP,KAAK;CACL,oBAAoB;CACpB,kBAAkB;CAGlB,WAAW;CACX,cAAc;CACd,mBAAmB;CACnB,UAAU;CACV,QAAQ;CAGR,OAAO;CACP,sBAAsB;CACtB,gBAAgB;CAChB,qBAAqB;CACrB,sBAAsB;CACtB,sBAAsB;CACtB,uBAAuB;CACvB,cAAc;CACd,wBAAwB;CACxB,eAAe;CACf,iCAAiC;CAGjC,SAAS;CACT,uBAAuB;CACvB,yBAAyB;CACzB,oBAAoB;CACpB,qBAAqB;CACrB,wBAAwB;CACxB,wBAAwB;CACxB,yBAAyB;CACzB,cAAc;CACd,WAAW;CACX,uBAAuB;CACvB,gBAAgB;CAGhB,cAAc;CACd,kBAAkB;CAClB,wBAAwB;CACxB,yBAAyB;CAGzB,oBAAoB;CAGpB,aAAa;CAGb,iDAAiD;CAGjD,gBAAgB;CAChB,qBAAqB;CACrB,cAAc;CAGd,yBAAyB;CACzB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,uCAAuC;CAEvC,eAAe;CACf,YAAY;CACZ,aAAa;CACb,qCAAqC;CAErC,oBAAoB;CACpB,yBAAyB;CAEzB,sBAAsB;CACtB,2BAA2B;CAE3B,sBAAsB;CACtB,4BAA4B;CAC5B,yBAAyB;CACzB,qCAAqC;CACrC,iBAAiB;CACjB,gCAAgC;CAChC,kCAAkC;CAClC,mBAAmB;CACnB,mBAAmB;CAEnB,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,aAAa;CACb,qBAAqB;CACrB,MAAM;CACN,6BAA6B;CAC7B,MAAM;CACN,yBAAyB;CACzB,kBAAkB;CAClB,eAAe;CACf,2BAA2B;CAC3B,aAAa;CACb,2BAA2B;CAC3B,eAAe;CACf,2BAA2B;CAC3B,kBAAkB;CAClB,8BAA8B;CAC9B,mBAAmB;CACnB,oBAAoB;CACpB,qBAAqB;CACrB,yBAAyB;CACzB,yBAAyB;CACzB,wBAAwB;CACxB,cAAc;CACd,sBAAsB;CACtB,qBAAqB;CACrB,uBAAuB;CACvB,0BAA0B;CAC1B,oBAAoB;CACpB,yBAAyB;CACzB,aAAa;CACb,cAAc;CAEd,gBAAgB;CAChB,WAAW;CACX,2BAA2B;CAC3B,wBAAwB;CACxB,0BAA0B;CAC1B,oBAAoB;CACpB,uBAAuB;CAEvB,mBAAmB;CACnB,mBAAmB;CACnB,cAAc;CACd,yBAAyB;CACzB,sBAAsB;CACtB,wBAAwB;CACxB,2BAA2B;CAC3B,2BAA2B;CAC3B,kBAAkB;CAClB,qBAAqB;CAErB,wBAAwB;CACxB,qBAAqB;CACrB,wBAAwB;CACxB,2BAA2B;CAC3B,QAAQ;CAER,yBAAyB;CACzB,mCAAmC;CACnC,sBAAsB;CACtB,yBAAyB;CACzB,uBAAuB;CACvB,iBAAiB;CACjB,yBAAyB;CACzB,0BAA0B;CAC1B,iBAAiB;CACjB,wBAAwB;CACxB,0BAA0B;CAC1B,UAAU;CAEV,kBAAkB;CAClB,uBAAuB;CACvB,mCAAmC;CACnC,mBAAmB;CACnB,0BAA0B;CAC1B,uBAAuB;CACvB,oBAAoB;CACpB,cAAc;CACd,cAAc;CAEd,wBAAwB;CACxB,sBAAsB;CACtB,WAAW;CACX,MAAM;CACN,mBAAmB;CACnB,iBAAiB;CACjB,iBAAiB;CACjB,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,gCAAgC;CAChC,qCAAqC;CACrC,+BAA+B;CAC/B,+BAA+B;CAC/B,2CAA2C;CAC3C,KAAK;CACL,mCAAmC;CACnC,oBAAoB;CACpB,KAAK;CACL,IAAI;CACJ,6BAA6B;CAC7B,kBAAkB;CAClB,sBAAsB;CACtB,KAAK;CACL,2BAA2B;CAC3B,oBAAoB;CACpB,6BAA6B;CAC7B,mBAAmB;CACnB,aAAa;CACb,QAAQ;CAER,0BAA0B;CAC1B,4BAA4B;CAC5B,uBAAuB;CACvB,MAAM;CACN,SAAS;CACT,mBAAmB;CACnB,oBAAoB;CACpB,OAAO;CACP,aAAa;CAEb,OAAO;CACP,UAAU;CACV,UAAU;CACV,UAAU;CACV,qBAAqB;CACrB,YAAY;CACZ,OAAO;CACP,IAAI;CACJ,MAAM;CAEN,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,4BAA4B;CAC5B,UAAU;CACV,eAAe;CACf,iBAAiB;CACjB,uBAAuB;CACvB,kBAAkB;CAClB,mBAAmB;CACnB,oBAAoB;CACpB,oBAAoB;CACpB,mBAAmB;CACnB,OAAO;CACP,aAAa;CACb,gBAAgB;CAChB,kBAAkB;CAClB,QAAQ;CACR,aAAa;CACb,yBAAyB;CACzB,MAAM;CACN,MAAM;CACN,WAAW;CACX,kBAAkB;CAClB,wBAAwB;CACxB,8BAA8B;CAC9B,4BAA4B;CAC5B,QAAQ;CACR,aAAa;CACb,oBAAoB;CACpB,KAAK;CACL,MAAM;CACN,qBAAqB;CACrB,kBAAkB;CAClB,gBAAgB;CAChB,UAAU;CACV,2BAA2B;CAC3B,0BAA0B;CAC1B,QAAQ;CAER,0BAA0B;CAC1B,eAAe;CACf,MAAM;CACN,iBAAiB;CACjB,OAAO;CACP,OAAO;CACP,8BAA8B;CAC9B,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,6BAA6B;CAC7B,YAAY;CACZ,yBAAyB;CACzB,6BAA6B;CAC7B,kBAAkB;CAClB,uBAAuB;CACvB,yBAAyB;CACzB,SAAS;;;CAIT,6BAA6B;CAC7B,2BAA2B;CAC3B,+BAA+B;CAC/B,0BAA0B;CAC1B,uBAAuB;CACvB,uBAAuB;CACvB,WAAW;CACX,YAAY;CAEZ,0BAA0B;CAC1B,6BAA6B;CAC7B,wBAAwB;CACxB,kBAAkB;CAClB,yBAAyB;CACzB,mBAAmB;CACnB,qCAAqC;CACrC,iBAAiB;CACjB,UAAU;CACV,8BAA8B;CAC9B,2BAA2B;CAC3B,YAAY;CACZ,gCAAgC;CAChC,OAAO;CACP,2BAA2B;CAC3B,uBAAuB;;CAGvB,WAAW;CACX,YAAY;CACZ,kBAAkB;CAElB,gCAAgC;CAChC,sBAAsB;CACtB,SAAS;CACT,gBAAgB;CAChB,gBAAgB;CAChB,qBAAqB;CAGrB,qBAAqB;CACrB,qBAAqB;CACrB,oBAAoB;CACpB,+CAA+C;CAC/C,2BAA2B;CAC3B,kCAAkC;CAClC,6BAA6B;CAC7B,wBAAwB;CACxB,0BAA0B;CAC1B,sBAAsB;CACtB,yBAAyB;CACzB,eAAe;CACf,qBAAqB;CACrB,eAAe;CACf,mBAAmB;CACnB,cAAc;CACd,cAAc;CAGd,+BAA+B;CAC/B,8BAA8B;CAC9B,6BAA6B;CAC7B,wBAAwB;CACxB,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAC9B,UAAU;CACV,sBAAsB;CACtB,yBAAyB;CACzB,gCAAgC;CAChC,mBAAmB;CACnB,8BAA8B;CAC9B,+BAA+B;CAC/B,yBAAyB;CACzB,8BAA8B;CAC9B,qBAAqB;CACrB,wBAAwB;CACxB,eAAe;CACf,oBAAoB;CACpB,cAAc;CACd,6BAA6B;CAC7B,6BAA6B;CAG7B,YAAY;CACZ,QAAQ;CACR,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,WAAW;CACX,WAAW;CACX,MAAM;CACN,cAAc;CACd,YAAY;CACZ,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,cAAc;CACd,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,gBAAgB;CAChB,gBAAgB;CAChB,eAAe;CAGf,4BAA4B;CAC5B,gCAAgC;CAChC,2BAA2B;CAC3B,+BAA+B;CAC/B,sBAAsB;CACtB,YAAY;CAGZ,wBAAwB;CACxB,mBAAmB;CACnB,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,0BAA0B;CAC1B,sBAAsB;CACtB,4BAA4B;CAC5B,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;CACnB,+BAA+B;CAC/B,wBAAwB;CACxB,yBAAyB;CACzB,4BAA4B;CAC5B,mBAAmB;CACnB,cAAc;CACd,uBAAuB;CACvB,kBAAkB;CAGlB,aAAa;CACb,yBAAyB;CACzB,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,oBAAoB;CACpB,gCAAgC;CAChC,sBAAsB;CACtB,kCAAkC;CAClC,cAAc;CACd,0BAA0B;CAC1B,aAAa;CACb,yBAAyB;CACzB,cAAc;CACd,0BAA0B;CAC1B,iBAAiB;CACjB,aAAa;CACb,aAAa;CACb,eAAe;CACf,oBAAoB;CACpB,2BAA2B;CAC3B,2BAA2B;CAC3B,aAAa;CACb,eAAe;CACf,kBAAkB;CAClB,sBAAsB;CACtB,qBAAqB;CACrB,iCAAiC;CAEjC,kBAAkB;CAClB,uBAAuB;CACvB,2BAA2B;CAC3B,mCAAmC;CACnC,mCAAmC;CACnC,oCAAoC;CACpC,sCAAsC;CACtC,8BAA8B;CAC9B,gBAAgB;CAChB,wBAAwB;CACxB,0BAA0B;CAC1B,kCAAkC;CAClC,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,oCAAoC;CACpC,iCAAiC;CAGjC,0BAA0B;CAC1B,mCAAmC;CACnC,iCAAiC;CACjC,iCAAiC;CACjC,+BAA+B;CAC/B,gCAAgC;CAChC,mCAAmC;CACnC,gCAAgC;CAChC,8BAA8B;CAGlC,WAAW;CACP,SAAS;CACT,UAAU;CACV,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,mBAAmB;CACnB,kBAAkB;CAClB,SAAS;CACT,UAAU;CACV,cAAc;CACd,WAAW;CACX,cAAc;CACd,QAAQ;CACR,oBAAoB;CACpB,UAAU;CACV,qBAAqB;CACrB,gBAAgB;CAChB,SAAS;CACT,SAAS;CACT,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,2BAA2B;CAC3B,qBAAqB;CACrB,wBAAwB;CACxB,YAAY;CACZ,2BAA2B;CAC3B,2BAA2B;CAC3B,UAAU;CACV,yBAAyB;CACzB,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,gBAAgB;CAChB,eAAe;CACf,YAAY;CACZ,mBAAmB;CACnB,kBAAkB;CAClB,eAAe;CACf,cAAc;CACd,UAAU;CACV,OAAO;CACP,kCAAkC;CAClC,4BAA4B;CAC5B,wBAAwB;CACxB,kCAAkC;CAClC,kCAAkC;CAClC,oBAAoB;CACpB,uBAAuB;CACvB,iBAAiB;CACjB,iBAAiB;CACjB,0BAA0B;CAC1B,wBAAwB;CACxB,uBAAuB;CACvB,uBAAuB;CACvB,oBAAoB;CACpB,uBAAuB;CACvB,kCAAkC;CAClC,6BAA6B;CAC7B,iBAAiB;CACjB,gBAAgB;CAChB,qBAAqB;CACrB,iBAAiB;CACjB,kBAAkB;CAClB,sBAAsB;CACtB,0BAA0B;CAC1B,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,gCAAgC;CAChC,mBAAmB;CACnB,gCAAgC;CAChC,qCAAqC;CACrC,0BAA0B;CAC1B,4BAA4B;CAC5B,iCAAiC;CACjC,wBAAwB;CACxB,sCAAsC;CACtC,iCAAiC;CACjC,uBAAuB;CACvB,0BAA0B;CAC1B,oCAAoC;CACpC,4BAA4B;CAC5B,6BAA6B;CAC7B,mCAAmC;CACnC,gBAAgB;CAChB,oCAAoC;CACpC,wBAAwB;CACxB,8BAA8B;CAC9B,wBAAwB;CACxB,8BAA8B;CAC9B,sBAAsB;CACtB,+BAA+B;CAC/B,6BAA6B;CAC7B,4BAA4B;CAC5B,2BAA2B;CAC3B,gCAAgC;CAChC,sCAAsC;CACtC,+BAA+B;CAC/B,iCAAiC;CACjC,mCAAmC;CACnC,sBAAsB;CACtB,uBAAuB;CACvB,yBAAyB;CACzB,qBAAqB;CACrB,2BAA2B;CAC3B,0BAA0B;CAC1B,2BAA2B;CAC3B,sBAAsB;CACtB,2BAA2B;CAC3B,uBAAuB;CACvB,kBAAkB;CAClB,wBAAwB;CACxB,oBAAoB;CACpB,qBAAqB;CACrB,mBAAmB;CACnB,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,qBAAqB;CACrB,wBAAwB;CACxB,6BAA6B;CAC7B,6BAA6B;CAC7B,sBAAsB;CACtB,2BAA2B;CAC3B,6BAA6B;CAC7B,8BAA8B;CAC9B,iBAAiB;CACjB,mBAAmB;CACnB,iCAAiC;CACjC,gCAAgC;CAChC,iCAAiC;CACjC,gCAAgC;CAChC,kCAAkC;CAClC,iCAAiC;CACjC,yBAAyB;CACzB,sBAAsB;CACtB,kBAAkB;CAClB,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,sBAAsB;CACtB,8BAA8B;CAC9B,sBAAsB;CACtB,oBAAoB;CACpB,wBAAwB;CACxB,+BAA+B;CAC/B,oBAAoB;CACpB,gCAAgC;CAChC,wBAAwB;CACxB,0BAA0B;CAC1B,+BAA+B;CAC/B,2BAA2B;CAC3B,gCAAgC;CAChC,uBAAuB;CACvB,4BAA4B;CAC5B,iCAAiC;CACjC,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,uCAAuC;CACvC,8BAA8B;CAC9B,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,oCAAoC;CACpC,mCAAmC;CACnC,6BAA6B;CAC7B,6BAA6B;CAC7B,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAC9B,2BAA2B;CAC3B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,2CAA2C;CAC3C,8BAA8B;CAC9B,iCAAiC;CACjC,4BAA4B;CAC5B,4BAA4B;CAC5B,kCAAkC;CAClC,wCAAwC;CACxC,wCAAwC;CACxC,8CAA8C;CAC9C,uCAAuC;CACvC,8BAA8B;CAC9B,oCAAoC;CACpC,6BAA6B;CAC7B,+BAA+B;CAC/B,kCAAkC;CAClC,iCAAiC;CACjC,qBAAqB;CACrB,0BAA0B;CAC1B,iCAAiC;CACjC,uBAAuB;CACvB,4BAA4B;CAC5B,qCAAqC;CACrC,4BAA4B;CAC5B,0CAA0C;CAC1C,+BAA+B;CAC/B,iCAAiC;CACjC,6BAA6B;CAC7B,mCAAmC;CACnC,+BAA+B;CAC/B,iCAAiC;CACjC,kCAAkC;CAClC,4CAA4C;CAC5C,6CAA6C;CAC7C,6CAA6C;CAC7C,sCAAsC;CACtC,kCAAkC;CAClC,oBAAoB;CACpB,oCAAoC;CACpC,gCAAgC;CAChC,yBAAyB;CACzB,gCAAgC;CAChC,2BAA2B;CAG3B,gBAAgB;CAChB,uBAAuB;CACvB,4BAA4B;CAC5B,MAAM;CACN,UAAU;CACV,mBAAmB;CAGnB,mBAAmB;CACnB,cAAc;CACd,kBAAkB;CAClB,qBAAqB;CACrB,uBAAuB;CACvB,mBAAmB;CACnB,oBAAoB;CACpB,iBAAiB;CACjB,4BAA4B;CAC5B,6BAA6B;CAC7B,wBAAwB;CACxB,4BAA4B;CAC5B,4BAA4B;CAC5B,kBAAkB;CAGlB,0BAA0B;CAG1B,yBAAyB;CACzB,qBAAqB;CACrB,yBAAyB;AAC7B;;;ACl4BA,IAAa,KAAyB;CAElC,MAAM;CACN,QAAQ;CACR,aAAa;CACb,gBAAgB;CAChB,uBAAuB;CACvB,kBAAkB;CAClB,SAAS;CACT,OAAO;CACP,QAAQ;CAGR,MAAM;CACN,MAAM;CACN,QAAQ;CACR,oBAAoB;CAGpB,2BAA2B;CAC3B,0BAA0B;CAC1B,mCAAmC;CAGnC,uBAAuB;CACvB,sBAAsB;CACtB,iBAAiB;CACjB,cAAc;CACd,YAAY;CACZ,8BAA8B;CAC9B,yBAAyB;CAGzB,QAAQ;CACR,YAAY;CACZ,mBAAmB;CACnB,QAAQ;CACR,SAAS;CACT,cAAc;CACd,mBAAmB;CACnB,YAAY;CACZ,WAAW;CACX,UAAU;CACV,kBAAkB;CAClB,oBAAoB;CACpB,yBAAyB;CACzB,wBAAwB;CACxB,mBAAmB;CACnB,KAAK;CACL,QAAQ;CACR,mBAAmB;CACnB,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,cAAc;CACd,WAAW;CACX,YAAY;CACZ,aAAa;CACb,IAAI;CACJ,wBAAwB;CACxB,uBAAuB;CACvB,aAAa;CACb,YAAY;CACZ,UAAU;CACV,yBAAyB;CACzB,SAAS;CACT,cAAc;CACd,iBAAiB;CACjB,aAAa;CACb,MAAM;CACN,SAAS;CACT,yBAAyB;CACzB,OAAO;CACP,uBAAuB;CACvB,mCAAmC;CACnC,iBAAiB;CACjB,eAAe;CACf,uBAAuB;CACvB,uBAAuB;CACvB,mCAAmC;CACnC,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,MAAM;CACN,KAAK;CACL,OAAO;CACP,gCAAgC;CAChC,yBAAyB;CACzB,2BAA2B;CAG3B,iBAAiB;CACjB,qBAAqB;CACrB,oBAAoB;CACpB,qBAAqB;CACrB,uBAAuB;CACvB,eAAe;CACf,cAAc;CACd,0BAA0B;CAE1B,OAAO;CACP,MAAM;CACN,sBAAsB;CACtB,0BAA0B;CAC1B,oBAAoB;CACpB,6BAA6B;CAC7B,sBAAsB;CACtB,iBAAiB;CACjB,2BAA2B;CAC3B,kBAAkB;CAClB,gCAAgC;CAChC,4BAA4B;CAC5B,uBAAuB;CACvB,uBAAuB;CACvB,mBAAmB;CACnB,0BAA0B;CAC1B,kBAAkB;CAClB,gBAAgB;CAChB,2BAA2B;CAC3B,kBAAkB;CAClB,cAAc;CACd,sBAAsB;CACtB,0BAA0B;CAC1B,kBAAkB;CAClB,cAAc;CACd,0BAA0B;CAC1B,2BAA2B;CAC3B,oCAAoC;CACpC,0BAA0B;CAC1B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,2BAA2B;CAC3B,mCAAmC;CACnC,gCAAgC;CAChC,gBAAgB;CAGhB,iBAAiB;CACjB,wBAAwB;CAGxB,WAAW;CACX,YAAY;CACZ,WAAW;CACX,cAAc;CACd,OAAO;CACP,KAAK;CACL,oBAAoB;CACpB,kBAAkB;CAGlB,WAAW;CACX,cAAc;CACd,mBAAmB;CACnB,UAAU;CACV,QAAQ;CAGR,OAAO;CACP,sBAAsB;CACtB,gBAAgB;CAChB,qBAAqB;CACrB,sBAAsB;CACtB,sBAAsB;CACtB,uBAAuB;CACvB,cAAc;CACd,wBAAwB;CACxB,eAAe;CACf,iCAAiC;CAGjC,SAAS;CACT,uBAAuB;CACvB,yBAAyB;CACzB,oBAAoB;CACpB,qBAAqB;CACrB,wBAAwB;CACxB,wBAAwB;CACxB,yBAAyB;CACzB,cAAc;CACd,WAAW;CACX,uBAAuB;CACvB,gBAAgB;CAGhB,cAAc;CACd,kBAAkB;CAClB,wBAAwB;CACxB,yBAAyB;CAGzB,oBAAoB;CAGpB,aAAa;CAGb,iDAAiD;CAGjD,gBAAgB;CAChB,qBAAqB;CACrB,cAAc;CAGd,yBAAyB;CACzB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,uCAAuC;CAEvC,eAAe;CACf,YAAY;CACZ,aAAa;CACb,qCAAqC;CAErC,oBAAoB;CACpB,yBAAyB;CAEzB,sBAAsB;CACtB,2BAA2B;CAE3B,sBAAsB;CACtB,4BAA4B;CAC5B,yBAAyB;CACzB,qCAAqC;CACrC,iBAAiB;CACjB,gCAAgC;CAChC,kCAAkC;CAClC,mBAAmB;CACnB,mBAAmB;CAEnB,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,aAAa;CACb,qBAAqB;CACrB,MAAM;CACN,6BAA6B;CAC7B,MAAM;CACN,yBAAyB;CACzB,kBAAkB;CAClB,eAAe;CACf,2BAA2B;CAC3B,aAAa;CACb,2BAA2B;CAC3B,eAAe;CACf,2BAA2B;CAC3B,kBAAkB;CAClB,8BAA8B;CAC9B,mBAAmB;CACnB,oBAAoB;CACpB,qBAAqB;CACrB,yBAAyB;CACzB,yBAAyB;CACzB,wBAAwB;CACxB,cAAc;CACd,sBAAsB;CACtB,qBAAqB;CACrB,uBAAuB;CACvB,0BAA0B;CAC1B,oBAAoB;CACpB,yBAAyB;CACzB,aAAa;CACb,cAAc;CAEd,gBAAgB;CAChB,WAAW;CACX,2BAA2B;CAC3B,wBAAwB;CACxB,0BAA0B;CAC1B,oBAAoB;CACpB,uBAAuB;CAEvB,mBAAmB;CACnB,mBAAmB;CACnB,cAAc;CACd,yBAAyB;CACzB,sBAAsB;CACtB,wBAAwB;CACxB,2BAA2B;CAC3B,2BAA2B;CAC3B,kBAAkB;CAClB,qBAAqB;CAErB,wBAAwB;CACxB,qBAAqB;CACrB,wBAAwB;CACxB,2BAA2B;CAC3B,QAAQ;CAER,yBAAyB;CACzB,mCAAmC;CACnC,sBAAsB;CACtB,yBAAyB;CACzB,uBAAuB;CACvB,iBAAiB;CACjB,yBAAyB;CACzB,0BAA0B;CAC1B,iBAAiB;CACjB,wBAAwB;CACxB,0BAA0B;CAC1B,UAAU;CAEV,kBAAkB;CAClB,uBAAuB;CACvB,mCAAmC;CACnC,mBAAmB;CACnB,0BAA0B;CAC1B,uBAAuB;CACvB,oBAAoB;CACpB,cAAc;CACd,cAAc;CAEd,wBAAwB;CACxB,sBAAsB;CACtB,WAAW;CACX,MAAM;CACN,mBAAmB;CACnB,iBAAiB;CACjB,iBAAiB;CACjB,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,gCAAgC;CAChC,qCAAqC;CACrC,+BAA+B;CAC/B,+BAA+B;CAC/B,2CAA2C;CAC3C,KAAK;CACL,mCAAmC;CACnC,oBAAoB;CACpB,KAAK;CACL,IAAI;CACJ,6BAA6B;CAC7B,kBAAkB;CAClB,sBAAsB;CACtB,KAAK;CACL,2BAA2B;CAC3B,oBAAoB;CACpB,6BAA6B;CAC7B,mBAAmB;CACnB,aAAa;CACb,QAAQ;CAER,0BAA0B;CAC1B,4BAA4B;CAC5B,uBAAuB;CACvB,MAAM;CACN,SAAS;CACT,mBAAmB;CACnB,oBAAoB;CACpB,OAAO;CACP,aAAa;CAEb,OAAO;CACP,UAAU;CACV,UAAU;CACV,UAAU;CACV,qBAAqB;CACrB,YAAY;CACZ,OAAO;CACP,IAAI;CACJ,MAAM;CAEN,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,4BAA4B;CAC5B,UAAU;CACV,eAAe;CACf,iBAAiB;CACjB,uBAAuB;CACvB,kBAAkB;CAClB,mBAAmB;CACnB,oBAAoB;CACpB,oBAAoB;CACpB,mBAAmB;CACnB,OAAO;CACP,aAAa;CACb,gBAAgB;CAChB,kBAAkB;CAClB,QAAQ;CACR,aAAa;CACb,yBAAyB;CACzB,MAAM;CACN,MAAM;CACN,WAAW;CACX,kBAAkB;CAClB,wBAAwB;CACxB,8BAA8B;CAC9B,4BAA4B;CAC5B,QAAQ;CACR,aAAa;CACb,oBAAoB;CACpB,KAAK;CACL,MAAM;CACN,qBAAqB;CACrB,kBAAkB;CAClB,gBAAgB;CAChB,UAAU;CACV,2BAA2B;CAC3B,0BAA0B;CAC1B,QAAQ;CAER,0BAA0B;CAC1B,eAAe;CACf,MAAM;CACN,iBAAiB;CACjB,OAAO;CACP,OAAO;CACP,8BAA8B;CAC9B,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,6BAA6B;CAC7B,YAAY;CACZ,yBAAyB;CACzB,6BAA6B;CAC7B,kBAAkB;CAClB,uBAAuB;CACvB,yBAAyB;CACzB,SAAS;;;CAIT,6BAA6B;CAC7B,2BAA2B;CAC3B,+BAA+B;CAC/B,0BAA0B;CAC1B,uBAAuB;CACvB,uBAAuB;CACvB,WAAW;CACX,YAAY;CAEZ,0BAA0B;CAC1B,6BAA6B;CAC7B,wBAAwB;CACxB,kBAAkB;CAClB,yBAAyB;CACzB,mBAAmB;CACnB,qCAAqC;CACrC,iBAAiB;CACjB,UAAU;CACV,8BAA8B;CAC9B,2BAA2B;CAC3B,YAAY;CACZ,gCAAgC;CAChC,OAAO;CACP,2BAA2B;CAC3B,uBAAuB;;CAGvB,WAAW;CACX,YAAY;CACZ,kBAAkB;CAElB,gCAAgC;CAChC,sBAAsB;CACtB,SAAS;CACT,gBAAgB;CAChB,gBAAgB;CAChB,qBAAqB;CAGrB,qBAAqB;CACrB,qBAAqB;CACrB,oBAAoB;CACpB,+CAA+C;CAC/C,2BAA2B;CAC3B,kCAAkC;CAClC,6BAA6B;CAC7B,wBAAwB;CACxB,0BAA0B;CAC1B,sBAAsB;CACtB,yBAAyB;CACzB,eAAe;CACf,qBAAqB;CACrB,eAAe;CACf,mBAAmB;CACnB,cAAc;CACd,cAAc;CAGd,+BAA+B;CAC/B,8BAA8B;CAC9B,6BAA6B;CAC7B,wBAAwB;CACxB,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAC9B,UAAU;CACV,sBAAsB;CACtB,yBAAyB;CACzB,gCAAgC;CAChC,mBAAmB;CACnB,8BAA8B;CAC9B,+BAA+B;CAC/B,yBAAyB;CACzB,8BAA8B;CAC9B,qBAAqB;CACrB,wBAAwB;CACxB,eAAe;CACf,oBAAoB;CACpB,cAAc;CACd,6BAA6B;CAC7B,6BAA6B;CAG7B,YAAY;CACZ,QAAQ;CACR,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,WAAW;CACX,WAAW;CACX,MAAM;CACN,cAAc;CACd,YAAY;CACZ,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,cAAc;CACd,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,gBAAgB;CAChB,gBAAgB;CAChB,eAAe;CAGf,4BAA4B;CAC5B,gCAAgC;CAChC,2BAA2B;CAC3B,+BAA+B;CAC/B,sBAAsB;CACtB,YAAY;CAGZ,wBAAwB;CACxB,mBAAmB;CACnB,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,0BAA0B;CAC1B,sBAAsB;CACtB,4BAA4B;CAC5B,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;CACnB,+BAA+B;CAC/B,wBAAwB;CACxB,yBAAyB;CACzB,4BAA4B;CAC5B,mBAAmB;CACnB,cAAc;CACd,uBAAuB;CACvB,kBAAkB;CAGlB,aAAa;CACb,yBAAyB;CACzB,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,oBAAoB;CACpB,gCAAgC;CAChC,sBAAsB;CACtB,kCAAkC;CAClC,cAAc;CACd,0BAA0B;CAC1B,aAAa;CACb,yBAAyB;CACzB,cAAc;CACd,0BAA0B;CAC1B,iBAAiB;CACjB,aAAa;CACb,aAAa;CACb,eAAe;CACf,oBAAoB;CACpB,2BAA2B;CAC3B,2BAA2B;CAC3B,aAAa;CACb,eAAe;CACf,kBAAkB;CAClB,sBAAsB;CACtB,qBAAqB;CACrB,iCAAiC;CAEjC,kBAAkB;CAClB,uBAAuB;CACvB,2BAA2B;CAC3B,mCAAmC;CACnC,mCAAmC;CACnC,oCAAoC;CACpC,sCAAsC;CACtC,8BAA8B;CAC9B,gBAAgB;CAChB,wBAAwB;CACxB,0BAA0B;CAC1B,kCAAkC;CAClC,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,oCAAoC;CACpC,iCAAiC;CAGjC,0BAA0B;CAC1B,mCAAmC;CACnC,iCAAiC;CACjC,iCAAiC;CACjC,+BAA+B;CAC/B,gCAAgC;CAChC,mCAAmC;CACnC,gCAAgC;CAChC,8BAA8B;CAGlC,WAAW;CACP,SAAS;CACT,UAAU;CACV,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,mBAAmB;CACnB,kBAAkB;CAClB,SAAS;CACT,UAAU;CACV,cAAc;CACd,WAAW;CACX,cAAc;CACd,QAAQ;CACR,oBAAoB;CACpB,UAAU;CACV,qBAAqB;CACrB,gBAAgB;CAChB,SAAS;CACT,SAAS;CACT,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,2BAA2B;CAC3B,qBAAqB;CACrB,wBAAwB;CACxB,YAAY;CACZ,2BAA2B;CAC3B,2BAA2B;CAC3B,UAAU;CACV,yBAAyB;CACzB,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,gBAAgB;CAChB,eAAe;CACf,YAAY;CACZ,mBAAmB;CACnB,kBAAkB;CAClB,eAAe;CACf,cAAc;CACd,UAAU;CACV,OAAO;CACP,kCAAkC;CAClC,4BAA4B;CAC5B,wBAAwB;CACxB,kCAAkC;CAClC,kCAAkC;CAClC,oBAAoB;CACpB,uBAAuB;CACvB,iBAAiB;CACjB,iBAAiB;CACjB,0BAA0B;CAC1B,wBAAwB;CACxB,uBAAuB;CACvB,uBAAuB;CACvB,oBAAoB;CACpB,uBAAuB;CACvB,kCAAkC;CAClC,6BAA6B;CAC7B,iBAAiB;CACjB,gBAAgB;CAChB,qBAAqB;CACrB,iBAAiB;CACjB,kBAAkB;CAClB,sBAAsB;CACtB,0BAA0B;CAC1B,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,gCAAgC;CAChC,mBAAmB;CACnB,gCAAgC;CAChC,qCAAqC;CACrC,0BAA0B;CAC1B,4BAA4B;CAC5B,iCAAiC;CACjC,wBAAwB;CACxB,sCAAsC;CACtC,iCAAiC;CACjC,uBAAuB;CACvB,0BAA0B;CAC1B,oCAAoC;CACpC,4BAA4B;CAC5B,6BAA6B;CAC7B,mCAAmC;CACnC,gBAAgB;CAChB,oCAAoC;CACpC,wBAAwB;CACxB,8BAA8B;CAC9B,wBAAwB;CACxB,8BAA8B;CAC9B,sBAAsB;CACtB,+BAA+B;CAC/B,6BAA6B;CAC7B,4BAA4B;CAC5B,2BAA2B;CAC3B,gCAAgC;CAChC,sCAAsC;CACtC,+BAA+B;CAC/B,iCAAiC;CACjC,mCAAmC;CACnC,sBAAsB;CACtB,uBAAuB;CACvB,yBAAyB;CACzB,qBAAqB;CACrB,2BAA2B;CAC3B,0BAA0B;CAC1B,2BAA2B;CAC3B,sBAAsB;CACtB,2BAA2B;CAC3B,uBAAuB;CACvB,kBAAkB;CAClB,wBAAwB;CACxB,oBAAoB;CACpB,qBAAqB;CACrB,mBAAmB;CACnB,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,qBAAqB;CACrB,wBAAwB;CACxB,6BAA6B;CAC7B,6BAA6B;CAC7B,sBAAsB;CACtB,2BAA2B;CAC3B,6BAA6B;CAC7B,8BAA8B;CAC9B,iBAAiB;CACjB,mBAAmB;CACnB,iCAAiC;CACjC,gCAAgC;CAChC,iCAAiC;CACjC,gCAAgC;CAChC,kCAAkC;CAClC,iCAAiC;CACjC,yBAAyB;CACzB,sBAAsB;CACtB,kBAAkB;CAClB,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,sBAAsB;CACtB,8BAA8B;CAC9B,sBAAsB;CACtB,oBAAoB;CACpB,wBAAwB;CACxB,+BAA+B;CAC/B,oBAAoB;CACpB,gCAAgC;CAChC,wBAAwB;CACxB,0BAA0B;CAC1B,+BAA+B;CAC/B,2BAA2B;CAC3B,gCAAgC;CAChC,uBAAuB;CACvB,4BAA4B;CAC5B,iCAAiC;CACjC,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,uCAAuC;CACvC,8BAA8B;CAC9B,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,oCAAoC;CACpC,mCAAmC;CACnC,6BAA6B;CAC7B,6BAA6B;CAC7B,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAC9B,2BAA2B;CAC3B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,2CAA2C;CAC3C,8BAA8B;CAC9B,iCAAiC;CACjC,4BAA4B;CAC5B,4BAA4B;CAC5B,kCAAkC;CAClC,wCAAwC;CACxC,wCAAwC;CACxC,8CAA8C;CAC9C,uCAAuC;CACvC,8BAA8B;CAC9B,oCAAoC;CACpC,6BAA6B;CAC7B,+BAA+B;CAC/B,kCAAkC;CAClC,iCAAiC;CACjC,qBAAqB;CACrB,0BAA0B;CAC1B,iCAAiC;CACjC,uBAAuB;CACvB,4BAA4B;CAC5B,qCAAqC;CACrC,4BAA4B;CAC5B,0CAA0C;CAC1C,+BAA+B;CAC/B,iCAAiC;CACjC,6BAA6B;CAC7B,mCAAmC;CACnC,+BAA+B;CAC/B,iCAAiC;CACjC,kCAAkC;CAClC,4CAA4C;CAC5C,6CAA6C;CAC7C,6CAA6C;CAC7C,sCAAsC;CACtC,kCAAkC;CAClC,oBAAoB;CACpB,oCAAoC;CACpC,gCAAgC;CAChC,yBAAyB;CACzB,gCAAgC;CAChC,2BAA2B;CAG3B,gBAAgB;CAChB,uBAAuB;CACvB,4BAA4B;CAC5B,MAAM;CACN,UAAU;CACV,mBAAmB;CAGnB,mBAAmB;CACnB,cAAc;CACd,kBAAkB;CAClB,qBAAqB;CACrB,uBAAuB;CACvB,mBAAmB;CACnB,oBAAoB;CACpB,iBAAiB;CACjB,4BAA4B;CAC5B,6BAA6B;CAC7B,wBAAwB;CACxB,4BAA4B;CAC5B,4BAA4B;CAC5B,kBAAkB;CAGlB,0BAA0B;CAG1B,yBAAyB;CACzB,qBAAqB;CACrB,yBAAyB;AAC7B;;;;;;;;AC73BA,IAAa,KAAyB;CAElC,MAAM;CACN,QAAQ;CACR,aAAa;CACb,gBAAgB;CAChB,uBAAuB;CACvB,kBAAkB;CAClB,SAAS;CACT,OAAO;CACP,QAAQ;CAGR,MAAM;CACN,MAAM;CACN,QAAQ;CACR,oBAAoB;CAGpB,2BAA2B;CAC3B,0BAA0B;CAC1B,mCAAmC;CAGnC,uBAAuB;CACvB,sBAAsB;CACtB,iBAAiB;CACjB,cAAc;CACd,YAAY;CACZ,8BAA8B;CAC9B,yBAAyB;CAGzB,QAAQ;CACR,YAAY;CACZ,mBAAmB;CACnB,QAAQ;CACR,SAAS;CACT,cAAc;CACd,mBAAmB;CACnB,YAAY;CACZ,WAAW;CACX,UAAU;CACV,kBAAkB;CAClB,oBAAoB;CACpB,yBAAyB;CACzB,wBAAwB;CACxB,mBAAmB;CACnB,KAAK;CACL,QAAQ;CACR,mBAAmB;CACnB,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,cAAc;CACd,WAAW;CACX,YAAY;CACZ,aAAa;CACb,IAAI;CACJ,wBAAwB;CACxB,uBAAuB;CACvB,aAAa;CACb,YAAY;CACZ,UAAU;CACV,yBAAyB;CACzB,SAAS;CACT,cAAc;CACd,iBAAiB;CACjB,aAAa;CACb,MAAM;CACN,SAAS;CACT,yBAAyB;CACzB,OAAO;CACP,uBAAuB;CACvB,mCAAmC;CACnC,iBAAiB;CACjB,eAAe;CACf,uBAAuB;CACvB,uBAAuB;CACvB,mCAAmC;CACnC,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,MAAM;CACN,KAAK;CACL,OAAO;CACP,gCAAgC;CAChC,yBAAyB;CACzB,2BAA2B;CAG3B,iBAAiB;CACjB,qBAAqB;CACrB,oBAAoB;CACpB,qBAAqB;CACrB,uBAAuB;CACvB,eAAe;CACf,cAAc;CACd,0BAA0B;CAE1B,OAAO;CACP,MAAM;CACN,sBAAsB;CACtB,0BAA0B;CAC1B,oBAAoB;CACpB,6BAA6B;CAC7B,sBAAsB;CACtB,iBAAiB;CACjB,2BAA2B;CAC3B,kBAAkB;CAClB,gCAAgC;CAChC,4BAA4B;CAC5B,uBAAuB;CACvB,uBAAuB;CACvB,mBAAmB;CACnB,0BAA0B;CAC1B,kBAAkB;CAClB,gBAAgB;CAChB,2BAA2B;CAC3B,kBAAkB;CAClB,cAAc;CACd,sBAAsB;CACtB,0BAA0B;CAC1B,kBAAkB;CAClB,cAAc;CACd,0BAA0B;CAC1B,2BAA2B;CAC3B,oCAAoC;CACpC,0BAA0B;CAC1B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,6BAA6B;CAC7B,2BAA2B;CAC3B,6BAA6B;CAC7B,2BAA2B;CAC3B,mCAAmC;CACnC,gCAAgC;CAChC,gBAAgB;CAGhB,iBAAiB;CACjB,wBAAwB;CAGxB,WAAW;CACX,YAAY;CACZ,WAAW;CACX,cAAc;CACd,OAAO;CACP,KAAK;CACL,oBAAoB;CACpB,kBAAkB;CAGlB,WAAW;CACX,cAAc;CACd,mBAAmB;CACnB,UAAU;CACV,QAAQ;CAGR,OAAO;CACP,sBAAsB;CACtB,gBAAgB;CAChB,qBAAqB;CACrB,sBAAsB;CACtB,sBAAsB;CACtB,uBAAuB;CACvB,cAAc;CACd,wBAAwB;CACxB,eAAe;CACf,iCAAiC;CAGjC,SAAS;CACT,uBAAuB;CACvB,yBAAyB;CACzB,oBAAoB;CACpB,qBAAqB;CACrB,wBAAwB;CACxB,wBAAwB;CACxB,yBAAyB;CACzB,cAAc;CACd,WAAW;CACX,uBAAuB;CACvB,gBAAgB;CAGhB,cAAc;CACd,kBAAkB;CAClB,wBAAwB;CACxB,yBAAyB;CAGzB,oBAAoB;CAGpB,aAAa;CAGb,iDAAiD;CAGjD,gBAAgB;CAChB,qBAAqB;CACrB,cAAc;CAGd,yBAAyB;CACzB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,uCAAuC;CAEvC,eAAe;CACf,YAAY;CACZ,aAAa;CACb,qCAAqC;CAErC,oBAAoB;CACpB,yBAAyB;CAEzB,sBAAsB;CACtB,2BAA2B;CAE3B,sBAAsB;CACtB,4BAA4B;CAC5B,yBAAyB;CACzB,qCAAqC;CACrC,iBAAiB;CACjB,gCAAgC;CAChC,kCAAkC;CAClC,mBAAmB;CACnB,mBAAmB;CAEnB,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,aAAa;CACb,qBAAqB;CACrB,MAAM;CACN,6BAA6B;CAC7B,MAAM;CACN,yBAAyB;CACzB,kBAAkB;CAClB,eAAe;CACf,2BAA2B;CAC3B,aAAa;CACb,2BAA2B;CAC3B,eAAe;CACf,2BAA2B;CAC3B,kBAAkB;CAClB,8BAA8B;CAC9B,mBAAmB;CACnB,oBAAoB;CACpB,qBAAqB;CACrB,yBAAyB;CACzB,yBAAyB;CACzB,wBAAwB;CACxB,cAAc;CACd,sBAAsB;CACtB,qBAAqB;CACrB,uBAAuB;CACvB,0BAA0B;CAC1B,oBAAoB;CACpB,yBAAyB;CACzB,aAAa;CACb,cAAc;CAEd,gBAAgB;CAChB,WAAW;CACX,2BAA2B;CAC3B,wBAAwB;CACxB,0BAA0B;CAC1B,oBAAoB;CACpB,uBAAuB;CAEvB,mBAAmB;CACnB,mBAAmB;CACnB,cAAc;CACd,yBAAyB;CACzB,sBAAsB;CACtB,wBAAwB;CACxB,2BAA2B;CAC3B,2BAA2B;CAC3B,kBAAkB;CAClB,qBAAqB;CAErB,wBAAwB;CACxB,qBAAqB;CACrB,wBAAwB;CACxB,2BAA2B;CAC3B,QAAQ;CAER,yBAAyB;CACzB,mCAAmC;CACnC,sBAAsB;CACtB,yBAAyB;CACzB,uBAAuB;CACvB,iBAAiB;CACjB,yBAAyB;CACzB,0BAA0B;CAC1B,iBAAiB;CACjB,wBAAwB;CACxB,0BAA0B;CAC1B,UAAU;CAEV,kBAAkB;CAClB,uBAAuB;CACvB,mCAAmC;CACnC,mBAAmB;CACnB,0BAA0B;CAC1B,uBAAuB;CACvB,oBAAoB;CACpB,cAAc;CACd,cAAc;CAEd,wBAAwB;CACxB,sBAAsB;CACtB,WAAW;CACX,MAAM;CACN,mBAAmB;CACnB,iBAAiB;CACjB,iBAAiB;CACjB,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,gCAAgC;CAChC,qCAAqC;CACrC,+BAA+B;CAC/B,+BAA+B;CAC/B,2CAA2C;CAC3C,KAAK;CACL,mCAAmC;CACnC,oBAAoB;CACpB,KAAK;CACL,IAAI;CACJ,6BAA6B;CAC7B,kBAAkB;CAClB,sBAAsB;CACtB,KAAK;CACL,2BAA2B;CAC3B,oBAAoB;CACpB,6BAA6B;CAC7B,mBAAmB;CACnB,aAAa;CACb,QAAQ;CAER,0BAA0B;CAC1B,4BAA4B;CAC5B,uBAAuB;CACvB,MAAM;CACN,SAAS;CACT,mBAAmB;CACnB,oBAAoB;CACpB,OAAO;CACP,aAAa;CAEb,OAAO;CACP,UAAU;CACV,UAAU;CACV,UAAU;CACV,qBAAqB;CACrB,YAAY;CACZ,OAAO;CACP,IAAI;CACJ,MAAM;CAEN,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,4BAA4B;CAC5B,UAAU;CACV,eAAe;CACf,iBAAiB;CACjB,uBAAuB;CACvB,kBAAkB;CAClB,mBAAmB;CACnB,oBAAoB;CACpB,oBAAoB;CACpB,mBAAmB;CACnB,OAAO;CACP,aAAa;CACb,gBAAgB;CAChB,kBAAkB;CAClB,QAAQ;CACR,aAAa;CACb,yBAAyB;CACzB,MAAM;CACN,MAAM;CACN,WAAW;CACX,kBAAkB;CAClB,wBAAwB;CACxB,8BAA8B;CAC9B,4BAA4B;CAC5B,QAAQ;CACR,aAAa;CACb,oBAAoB;CACpB,KAAK;CACL,MAAM;CACN,qBAAqB;CACrB,kBAAkB;CAClB,gBAAgB;CAChB,UAAU;CACV,2BAA2B;CAC3B,0BAA0B;CAC1B,QAAQ;CAER,0BAA0B;CAC1B,eAAe;CACf,MAAM;CACN,iBAAiB;CACjB,OAAO;CACP,OAAO;CACP,8BAA8B;CAC9B,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,6BAA6B;CAC7B,YAAY;CACZ,yBAAyB;CACzB,6BAA6B;CAC7B,kBAAkB;CAClB,uBAAuB;CACvB,yBAAyB;CACzB,SAAS;;CAGT,6BAA6B;CAC7B,2BAA2B;CAC3B,+BAA+B;CAC/B,0BAA0B;CAC1B,uBAAuB;CACvB,uBAAuB;CACvB,WAAW;CACX,YAAY;;CAGZ,0BAA0B;CAC1B,6BAA6B;CAC7B,wBAAwB;CACxB,kBAAkB;CAClB,yBAAyB;CACzB,mBAAmB;CACnB,qCAAqC;CACrC,iBAAiB;CACjB,UAAU;CACV,8BAA8B;CAC9B,2BAA2B;CAC3B,YAAY;CACZ,gCAAgC;CAChC,OAAO;CACP,2BAA2B;CAC3B,uBAAuB;;CAGvB,WAAW;CACX,YAAY;CACZ,kBAAkB;CAElB,gCAAgC;CAChC,sBAAsB;CACtB,SAAS;CACT,gBAAgB;CAChB,gBAAgB;CAChB,qBAAqB;CAGrB,qBAAqB;CACrB,qBAAqB;CACrB,oBAAoB;CACpB,+CAA+C;CAC/C,2BAA2B;CAC3B,kCAAkC;CAClC,6BAA6B;CAC7B,wBAAwB;CACxB,0BAA0B;CAC1B,sBAAsB;CACtB,yBAAyB;CACzB,eAAe;CACf,qBAAqB;CACrB,eAAe;CACf,mBAAmB;CACnB,cAAc;CACd,cAAc;CAGd,+BAA+B;CAC/B,8BAA8B;CAC9B,6BAA6B;CAC7B,wBAAwB;CACxB,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAG9B,UAAU;CACV,sBAAsB;CACtB,yBAAyB;CACzB,gCAAgC;CAEhC,mBAAmB;CACnB,8BAA8B;CAC9B,+BAA+B;CAC/B,yBAAyB;CACzB,8BAA8B;CAC9B,qBAAqB;CACrB,wBAAwB;CACxB,eAAe;CACf,oBAAoB;CACpB,cAAc;CACd,6BAA6B;CAC7B,6BAA6B;CAG7B,YAAY;CACZ,QAAQ;CACR,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,WAAW;CACX,WAAW;CACX,MAAM;CACN,cAAc;CACd,YAAY;CACZ,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,cAAc;CACd,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,gBAAgB;CAChB,gBAAgB;CAChB,eAAe;CAGf,4BAA4B;CAC5B,gCAAgC;CAChC,2BAA2B;CAC3B,+BAA+B;CAC/B,sBAAsB;CACtB,YAAY;CAGZ,wBAAwB;CACxB,mBAAmB;CACnB,2BAA2B;CAC3B,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,0BAA0B;CAC1B,sBAAsB;CACtB,4BAA4B;CAC5B,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;CACnB,+BAA+B;CAC/B,wBAAwB;CACxB,yBAAyB;CACzB,4BAA4B;CAC5B,mBAAmB;CACnB,cAAc;CACd,uBAAuB;CACvB,kBAAkB;CAGlB,aAAa;CACb,yBAAyB;CACzB,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,kBAAkB;CAClB,8BAA8B;CAC9B,oBAAoB;CACpB,gCAAgC;CAChC,sBAAsB;CACtB,kCAAkC;CAClC,cAAc;CACd,0BAA0B;CAC1B,aAAa;CACb,yBAAyB;CACzB,cAAc;CACd,0BAA0B;CAC1B,iBAAiB;CACjB,aAAa;CACb,aAAa;CACb,eAAe;CACf,oBAAoB;CACpB,2BAA2B;CAC3B,2BAA2B;CAC3B,aAAa;CACb,eAAe;CACf,kBAAkB;CAClB,sBAAsB;CACtB,qBAAqB;CACrB,iCAAiC;CAEjC,kBAAkB;CAClB,uBAAuB;CACvB,2BAA2B;CAC3B,mCAAmC;CACnC,mCAAmC;CACnC,oCAAoC;CACpC,sCAAsC;CACtC,8BAA8B;CAC9B,gBAAgB;CAChB,wBAAwB;CACxB,0BAA0B;CAC1B,kCAAkC;CAClC,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,oCAAoC;CACpC,iCAAiC;CAGjC,0BAA0B;CAC1B,mCAAmC;CACnC,iCAAiC;CACjC,iCAAiC;CACjC,+BAA+B;CAC/B,gCAAgC;CAChC,mCAAmC;CACnC,gCAAgC;CAChC,8BAA8B;CAGlC,WAAW;CACP,SAAS;CACT,UAAU;CACV,2BAA2B;CAC3B,2BAA2B;CAC3B,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,mBAAmB;CACnB,kBAAkB;CAClB,SAAS;CACT,UAAU;CACV,cAAc;CACd,WAAW;CACX,cAAc;CACd,QAAQ;CACR,oBAAoB;CACpB,UAAU;CACV,qBAAqB;CACrB,gBAAgB;CAChB,SAAS;CACT,SAAS;CACT,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,2BAA2B;CAC3B,qBAAqB;CACrB,wBAAwB;CACxB,YAAY;CACZ,2BAA2B;CAC3B,2BAA2B;CAC3B,UAAU;CACV,yBAAyB;CACzB,2BAA2B;CAC3B,2BAA2B;CAC3B,qBAAqB;CACrB,gBAAgB;CAChB,eAAe;CACf,YAAY;CACZ,mBAAmB;CACnB,kBAAkB;CAClB,eAAe;CACf,cAAc;CACd,UAAU;CACV,OAAO;CACP,kCAAkC;CAClC,4BAA4B;CAC5B,wBAAwB;CACxB,kCAAkC;CAClC,kCAAkC;CAClC,oBAAoB;CACpB,uBAAuB;CACvB,iBAAiB;CACjB,iBAAiB;CACjB,0BAA0B;CAC1B,wBAAwB;CACxB,uBAAuB;CACvB,uBAAuB;CACvB,oBAAoB;CACpB,uBAAuB;CACvB,kCAAkC;CAClC,6BAA6B;CAC7B,iBAAiB;CACjB,gBAAgB;CAChB,qBAAqB;CACrB,iBAAiB;CACjB,kBAAkB;CAClB,sBAAsB;CACtB,0BAA0B;CAC1B,yBAAyB;CACzB,yBAAyB;CACzB,qCAAqC;CACrC,gCAAgC;CAChC,mBAAmB;CACnB,gCAAgC;CAChC,qCAAqC;CACrC,0BAA0B;CAC1B,4BAA4B;CAC5B,iCAAiC;CACjC,wBAAwB;CACxB,sCAAsC;CACtC,iCAAiC;CACjC,uBAAuB;CACvB,0BAA0B;CAC1B,oCAAoC;CACpC,4BAA4B;CAC5B,6BAA6B;CAC7B,mCAAmC;CACnC,gBAAgB;CAChB,oCAAoC;CACpC,wBAAwB;CACxB,8BAA8B;CAC9B,wBAAwB;CACxB,8BAA8B;CAC9B,sBAAsB;CACtB,+BAA+B;CAC/B,6BAA6B;CAC7B,4BAA4B;CAC5B,2BAA2B;CAC3B,gCAAgC;CAChC,sCAAsC;CACtC,+BAA+B;CAC/B,iCAAiC;CACjC,mCAAmC;CACnC,sBAAsB;CACtB,uBAAuB;CACvB,yBAAyB;CACzB,qBAAqB;CACrB,2BAA2B;CAC3B,0BAA0B;CAC1B,2BAA2B;CAC3B,sBAAsB;CACtB,2BAA2B;CAC3B,uBAAuB;CACvB,kBAAkB;CAClB,wBAAwB;CACxB,oBAAoB;CACpB,qBAAqB;CACrB,mBAAmB;CACnB,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,qBAAqB;CACrB,wBAAwB;CACxB,6BAA6B;CAC7B,6BAA6B;CAC7B,sBAAsB;CACtB,2BAA2B;CAC3B,6BAA6B;CAC7B,8BAA8B;CAC9B,iBAAiB;CACjB,mBAAmB;CACnB,iCAAiC;CACjC,gCAAgC;CAChC,iCAAiC;CACjC,gCAAgC;CAChC,kCAAkC;CAClC,iCAAiC;CACjC,yBAAyB;CACzB,sBAAsB;CACtB,kBAAkB;CAClB,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,sBAAsB;CACtB,8BAA8B;CAC9B,sBAAsB;CACtB,oBAAoB;CACpB,wBAAwB;CACxB,+BAA+B;CAC/B,oBAAoB;CACpB,gCAAgC;CAChC,wBAAwB;CACxB,0BAA0B;CAC1B,+BAA+B;CAC/B,2BAA2B;CAC3B,gCAAgC;CAChC,uBAAuB;CACvB,4BAA4B;CAC5B,iCAAiC;CACjC,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,+BAA+B;CAC/B,0BAA0B;CAC1B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,uCAAuC;CACvC,8BAA8B;CAC9B,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,gCAAgC;CAChC,+BAA+B;CAC/B,kCAAkC;CAClC,oCAAoC;CACpC,mCAAmC;CACnC,6BAA6B;CAC7B,6BAA6B;CAC7B,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAC9B,2BAA2B;CAC3B,0BAA0B;CAC1B,gCAAgC;CAChC,+BAA+B;CAC/B,2CAA2C;CAC3C,8BAA8B;CAC9B,iCAAiC;CACjC,4BAA4B;CAC5B,4BAA4B;CAC5B,kCAAkC;CAClC,wCAAwC;CACxC,wCAAwC;CACxC,8CAA8C;CAC9C,uCAAuC;CACvC,8BAA8B;CAC9B,oCAAoC;CACpC,6BAA6B;CAC7B,+BAA+B;CAC/B,kCAAkC;CAClC,iCAAiC;CACjC,qBAAqB;CACrB,0BAA0B;CAC1B,iCAAiC;CACjC,uBAAuB;CACvB,4BAA4B;CAC5B,qCAAqC;CACrC,4BAA4B;CAC5B,0CAA0C;CAC1C,+BAA+B;CAC/B,iCAAiC;CACjC,6BAA6B;CAC7B,mCAAmC;CACnC,+BAA+B;CAC/B,iCAAiC;CACjC,kCAAkC;CAClC,4CAA4C;CAC5C,6CAA6C;CAC7C,6CAA6C;CAC7C,sCAAsC;CACtC,kCAAkC;CAClC,oBAAoB;CACpB,oCAAoC;CACpC,gCAAgC;CAChC,yBAAyB;CACzB,gCAAgC;CAChC,2BAA2B;CAG3B,gBAAgB;CAChB,uBAAuB;CACvB,4BAA4B;CAC5B,MAAM;CACN,UAAU;CACV,mBAAmB;CAGnB,mBAAmB;CACnB,cAAc;CACd,kBAAkB;CAClB,qBAAqB;CACrB,uBAAuB;CACvB,mBAAmB;CACnB,oBAAoB;CACpB,iBAAiB;CACjB,4BAA4B;CAC5B,6BAA6B;CAC7B,wBAAwB;CACxB,4BAA4B;CAC5B,4BAA4B;CAC5B,kBAAkB;CAGlB,0BAA0B;CAG1B,yBAAyB;CACzB,qBAAqB;CACrB,yBAAyB;AAC7B;;;ACh4BA,IAAM,YAAY;AAElB,IAAa,4BAA4B;;;;;;;;;AAgCzC,SAAgB,mBAAmB,EAC/B,SAAS,MACT,cACA,YAC2C;CAC3C,MAAM,UAAU,OAAoB,IAAI;CACxC,MAAM,CAAC,OAAO,YAAY,MAAM,SAAS,KAAK;CAE9C,IAAI,CAAC,QAAQ,SAAS;EAClB,MAAM,WAAW,QAAQ,eAAe;EAGxC,MAAM,YAAY,eAAe,YAAY;EAE7C,IAAI,gBAAgB;EACpB,IAAI,OAAO,WAAW,aAAa;GAC/B,MAAM,SAAS,aAAa,QAAQ,yBAAyB;GAC7D,IAAI,QAAQ,gBAAgB;EAChC;EAEA,SACK,IAAI,gBAAgB,EACpB,KAAK;GACF,KAAK;GACL,aAAa;GACb,IAAI,CAAC,SAAS;GACd,WAAW;GACX;GACA,eAAe,EAEX,aAAa,MACjB;EACJ,SAAS;GACL,SAAS,IAAI;EACjB,CAAC;EAEL,SAAS,GAAG,oBAAoB,QAAQ;GACpC,IAAI,OAAO,WAAW,aAClB,aAAa,QAAQ,2BAA2B,GAAG;EAE3D,CAAC;EAED,QAAQ,UAAU;CACtB;CAIA,gBAAgB;EACZ,IAAI,QAAQ,WAAW,QAAQ,QAAQ,aAAa;OAE5C,EADsB,OAAO,WAAW,eAAe,QAAQ,aAAa,QAAA,eAAiC,CAAC,IAE9G,QAAQ,QAAQ,eAAe,MAAM;EAAA;CAGjD,GAAG,CAAC,MAAM,CAAC;CAGX,gBAAgB;EACZ,IAAI,CAAC,QAAQ,SAAS;EACtB,MAAM,YAAY,eAAe,YAAY;EAC7C,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,SAAS,GACjD,QAAQ,QAAQ,kBACZ,MACA,WACA,OAAO,YACP,MACA,IACJ;CAER,GAAG,CAAC,YAAY,CAAC;CAEjB,IAAI,CAAC,SAAS,CAAC,QAAQ,SAAS,OAAO;CAEvC,OACI,oBAAC,iBAAD;EAAiB,MAAM,QAAQ;EAC1B;CACY,CAAA;AAEzB;;;;;AAMA,SAAS,eACL,cACsC;CACtC,MAAM,YAAoD;EACtD,IAAI,GAAG,YAAY,EAAE,GAAG,GAAG,EAAE;EAC7B,IAAI,GAAG,YAAY,EAAE,GAAG,GAAG,EAAE;EAC7B,IAAI,GAAG,YAAY,EAAE,GAAG,GAAG,EAAE;EAC7B,IAAI,GAAG,YAAY,EAAE,GAAG,GAAG,EAAE;EAC7B,IAAI,GAAG,YAAY,EAAE,GAAG,GAAG,EAAE;EAC7B,IAAI,GAAG,YAAY,EAAE,GAAG,GAAG,EAAE;EAC7B,IAAI,GAAG,YAAY,EAAE,GAAG,GAAG,EAAE;CACjC;CAEA,IAAI,CAAC,cAAc,OAAO;CAE1B,KAAK,MAAM,CAAC,MAAM,cAAc,OAAO,QAAQ,YAAY,GAAG;EAC1D,IAAI,CAAC,UAAU,OAEX,UAAU,QAAQ,GAAG,YAAY,EAAE,GAAG,GAAG,EAAE;EAI/C,UAAU,MAAM,aAAa;GACzB,GAAG,UAAU,MAAM;GACnB,GAAG;EACP;CACJ;CAEA,OAAO;AACX;;;;;;;;;;;;;;AChHA,SAAgB,OAA0B,OAA0B;CAEhE,MAAM,EACF,UACA,mBACA,uBACA,gBACA,QACA,QACA,gBAAgB,oBAChB,eAAe,mBACf,aAAa,iBACb,gBAAgB,oBAEhB,eACA,SAAS,aACT,OAAO,cAAc,CAAC,GACtB,kBACA,iBACA,aACA,eAEA,yBACA,QACA,cACA,YAAY,mBACZ;CAEJ,MAAM,UAAU;CAGhB,IAAI,SAAS;EACT,MAAM,OAAO,QAAQ,KAAK,MAAM,EAAE,GAAG;EACrC,IAAI,IAAI,IAAI,IAAI,EAAE,SAAS,KAAK,QAC5B,QAAQ,MAAM,mCAAmC,KAAK,QAAQ,GAAG,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC;CAErG;CAGA,MAAM,gBAAoC,cAAc,CACpD,GAAG,aACH,IAAK,WAAW,CAAC,GAAG,SAAS,MAAM,EAAE,SAAS,CAAC,CAAC,CACpD,GAAG,CAAC,aAAa,OAAO,CAAC;CAIzB,MAAM,uBAAuB,oBAAoB,qBAAqB,KAAA,IAAY,QAAQ,IAAI;CAC9F,MAAM,iBAAiB,sBAAsB;CAE7C,MAAM,wBAAwB,cAAc;EACxC,OAAO,mBAAmB,CAAC;CAC/B,GAAG,CAAC,eAAe,CAAC;CAUpB,MAAM,iBAAiB,OAGb,IAAI;CACd,MAAM,mBAAmB,cAAuC;EAC5D,MAAM,MAAM,sBAAsB,KAAK,OAAO;GAAE,KAAK,EAAE;GAAK,QAAQ,EAAE;GAAQ,WAAW,EAAE;GAAW,QAAQ,EAAE;EAAO,EAAE;EACzH,MAAM,OAAO,eAAe;EAC5B,IAAI,QACG,KAAK,IAAI,WAAW,IAAI,UACxB,IAAI,OAAO,GAAG,MAAM,KAAK,IAAI,GAAG,QAAQ,EAAE,OACtC,KAAK,IAAI,GAAG,WAAW,EAAE,UACzB,KAAK,IAAI,GAAG,cAAc,EAAE,aAC5B,KAAK,IAAI,GAAG,WAAW,EAAE,MAAM,GACtC,OAAO,KAAK;EAEhB,MAAM,WAAiD,CAAC;EACxD,MAAM,UAAsC,CAAC;EAC7C,KAAK,MAAM,MAAM,uBAAuB;GACpC,MAAM,EAAE,QAAQ,GAAG,eAAe;GAGlC,SAAS,GAAG,OAAO;IACf,GAAG;IACH,WAAW,GAAG,cAAc,SAAS,WAAW;GACpD;GACA,IAAI,QAAQ,QAAQ,GAAG,OAAO,gBAAgB,MAAM;EACxD;EACA,MAAM,QAAiC;GAAE;GAAU;EAAQ;EAC3D,eAAe,UAAU;GAAE;GAAK;EAAM;EACtC,OAAO;CACX,GAAG,CAAC,qBAAqB,CAAC;CAO1B,MAAM,eAAe,cAAc;EAC/B,MAAM,oBAAoB,iBAAiB,QAAQ;EACnD,IAAI,mBAAmB,OAAO;EAG9B,IAAI,QAAQ,MAAM,OAAO,iBAAiB,OAAO,IAAI;EACrD,MAAM,QAAQ,OAAO,OAAO,iBAAiB,OAAO;EACpD,IAAI,MAAM,WAAW,GAAG,OAAO,MAAM;EACrC,IAAI,MAAM,SAAS,GACf,MAAM,IAAI,MACN,sIAEJ;EAEJ,MAAM,IAAI,MAAM,uFAAuF;CAC3G,GAAG,CAAC,QAAQ,gBAAgB,CAAC;CAG7B,MAAM,kBAAkB,qBAAqB,QAAQ;CAOrD,MAAM,CAAC,sBAAsB,2BAA2B,SAAoC,CAAC,CAAC;CAC9F,MAAM,WAAW,eAAe;CAChC,MAAM,eAAe,eAAe;CACpC,gBAAgB;EACZ,IAAI,CAAC,QAAQ,qBAAqB;EAClC,IAAI,YAAY;EAChB,OAAO,oBAAoB,EACtB,MAAM,SAAS;GAAE,IAAI,CAAC,WAAW,wBAAwB,IAAI;EAAG,CAAC,EACjE,OAAO,MAAM;GAGV,QAAQ,MAAM,2CAA2C,CAAC;EAC9D,CAAC;EACL,aAAa;GAAE,YAAY;EAAM;CAErC,GAAG;EAAC;EAAQ;EAAU;CAAY,CAAC;CAGnC,MAAM,oBAAoB,OAMhB,IAAI;CACd,MAAM,sBAAsB,cAA0C;EAClE,MAAM,OAAO,sBAAsB,CAAC;EACpC,MAAM,OAAO,kBAAkB;EAG/B,IAAI,QACG,KAAK,WAAW,wBAChB,KAAK,oBAAoB,mBACzB,KAAK,WAAW,UAChB,KAAK,SAAS,WAAW,KAAK,UAC9B,KAAK,OAAO,GAAG,MAAM,KAAK,SAAS,GAAG,QAAQ,EAAE,OAC5C,KAAK,SAAS,GAAG,WAAW,EAAE,UAC9B,KAAK,SAAS,GAAG,cAAc,EAAE,SAAS,GACjD,OAAO,KAAK;EAEhB,MAAM,WAAoD,CAAC;EAC3D,MAAM,UAAyC,CAAC;EAGhD,KAAK,MAAM,OAAO,sBACd,SAAS,IAAI,OAAO;EAMxB,IAAI,QAAQ,iBACR,KAAK,MAAM,OAAO,OAAO,gBAAgB,KAAK,GAAG;GAC7C,MAAM,SAAS,OAAO,gBAAgB,IAAI,GAAG;GAC7C,IAAI,QAAQ,QAAQ,OAAO;EAC/B;EAIJ,KAAK,MAAM,MAAM,MAAM;GACnB,MAAM,EAAE,QAAQ,GAAG,eAAe;GAClC,SAAS,GAAG,OAAO;GACnB,IAAI,QAEA,QAAQ,GAAG,OAAO;QACf,IAAI,CAAC,QAAQ,GAAG,QAChB,GAAG,cAAc,YACjB,GAAG,QAAQ,8BACX,QAAQ,qBAGX,QAAQ,GAAG,OAAO,OAAO,oBAAoB,GAAG,GAAG;EAE3D;EAEA,IAAI,mBAAmB,CAAC,QAAQ,6BAC5B,QAAQ,8BAA8B;EAE1C,MAAM,QAAoC;GAAE;GAAU;EAAQ;EAC9D,kBAAkB,UAAU;GACxB,UAAU,KAAK,KAAK,OAAO;IAAE,KAAK,EAAE;IAAK,QAAQ,EAAE;IAAQ,WAAW,EAAE;GAAU,EAAE;GACpF,QAAQ;GACR;GACA;GACA;EACJ;EACA,OAAO;CACX,GAAG;EAAC;EAAoB;EAAsB;EAAiB;CAAM,CAAC;CAGtE,MAAM,wBAAwB,cAAc;EACxC,IAAI,eAAe,OAAO;EAG1B,MAAM,gBAAgB,sBAAsB,MAAM,MAAM,EAAE,QAAQ,2BAA2B,EAAE,MAAM,GAAG,WAChG,CAAC,UAAU,sBAAsB,WAAW,IAAI,sBAAsB,GAAG,SAAS,KAAA;EAC1F,IAAI,eAAe,OACf,OAAO,cAAc;EAIzB,MAAM,KAAK,QAAQ;EACnB,IAAI,MAAM,OAAQ,GAA0C,eAAe,YAAY;GACnF,MAAM,UAAU;GAChB,OAAO;IACH,YAAY,QAAQ,WAAY,KAAK,OAAO;IAC5C,yBAAyB,QAAQ,yBAAyB,KAAK,OAAO;IACtE,qBAAqB,QAAQ,qBAAqB,KAAK,OAAO;IAC9D,sBAAsB,QAAQ,sBAAsB,KAAK,OAAO;IAChE,qBAAqB,QAAQ,qBAAqB,KAAK,OAAO;IAC9D,oBAAoB,QAAQ,oBAAoB,KAAK,OAAO;IAE5D,GAAI,OAAO,QAAQ,iBAAiB,aAAa;KAC7C,cAAc,QAAQ,aAAa,KAAK,OAAO;KAC/C,cAAc,QAAQ,aAAc,KAAK,OAAO;KAChD,cAAc,QAAQ,aAAc,KAAK,OAAO;IACpD,IAAI,CAAC;GACT;EACJ;CAGJ,GAAG;EAAC;EAAe;EAAQ;CAAqB,CAAC;CAEjD,IAAI,CAAC,mBAAmB,OAAO,YAAY,aACvC,QAAQ,KACJ,oIAEJ;CAGJ,MAAM,iBAAiB,SAAS,MAAM,MAAM,EAAE,OAAO,KAAK;CAE1D,MAAM,UAAU,eAAe,kBAAkB;CAEjD,MAAM,0BAAmD,eAAe;EACpE;EACA;EACA;EACA;EACA;EACA,aAAa,eAAe,CAAC;EAC7B,eAAe,iBAAiB,CAAC;EACjC,iBAAiB,mBAAmB,CAAC;EACrC,YAAY;CAChB,IAAI;EAAC;EAAgB;EAAQ;EAAmB;EAAS;EAAe;EAAa;EAAe;EAAiB;CAAc,CAAC;CAEpI,MAAM,sBAAsB,eAAe,EACvC,iBACJ,IAAI,CAAC,CAAC;CAEN,MAAM,kCAAkC,gCAAgC;CACxE,MAAM,gCAAgC,2BAA2B;CAEjE,MAAM,iBAAiB,uBAAuB;CAC9C,MAAM,sBAAsB,4BAA4B;CAExD,IAAI,eAAe,WACf,OACI,oBAAC,cAAD;EAAc,UAAU;YACpB,oBAAC,WAAD;GACI,OAAO;GACP,OAAO,eAAe;EAA6B,CAAA;CAC7C,CAAA;CAItB,MAAM,UACF,oBAAC,oBAAD;EAA4B;EAAsB;YAClD,oBAAC,iCAAD;GAAiC,WAAW;aAC5C,oBAAC,kBAAD,EAAA,UACA,oBAAC,wBAAD;IAAwB,OAAO;cAC/B,oBAAC,6BAAD;KAA6B,OAAO;eACpC,oBAAC,4BAA4B,UAA7B;MAAsC,OAAO;gBAC7C,oBAAC,iBAAiB,UAAlB;OAA2B,OAAO;iBAC9B,oBAAC,+BAA+B,UAAhC;QAAyC,OAAO;kBAC5C,oBAAC,oCAAoC,UAArC;SACI,OAAO;mBACP,oBAAC,sBAAsB,UAAvB;UACI,OAAO;oBACX,oBAAC,qBAAqB,UAAtB;WACI,OAAO;qBACP,oBAAC,mBAAmB,UAApB;YACI,OAAO;sBACX,oBAAC,kBAAkB,UAAnB;aACI,OAAO;uBACP,oBAAC,qBAAqB,UAAtB;cACI,OAAO;wBACP,oBAAC,sBAAsB,UAAvB;eACI,OAAO;yBACH,oBAAC,+BAA+B,UAAhC;gBAAyC,OAAO;0BAC5C,oBAAC,iBAAD,EAAA,UACI,oBAAC,qBAAD,EAAA,UACA,oBAAC,wBAAD,EAAA,UACI,oBAAC,gBAAD;iBACa;iBACR;gBACW,CAAA,EACI,CAAA,EACH,CAAA,EACR,CAAA;eACoB,CAAA;cACjB,CAAA;aACL,CAAA;YACP,CAAA;WACC,CAAA;UACF,CAAA;SACC,CAAA;QACU,CAAA;OACT,CAAA;MAClB,CAAA;KACW,CAAA;IACT,CAAA;GACL,CAAA,EACN,CAAA;EACe,CAAA;CACb,CAAA;CAGxB,MAAM,iBAAiB,UAAU,QAAQ,YAAY,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;CAE9G,IAAI,gBACA,OACI,oBAAC,mBAAD;EAAmB,QAAQ;EAAgB,cAAc,eAAe;YACnE;CACc,CAAA;CAI3B,OAAO;AAEX;AAEA,SAAS,eAAe,EACpB,SACA,YAID;CAEC,MAAM,UAAU,iBAAiB;CACjC,MAAM,0BAA0B,2BAA2B;CAE3D,MAAM,iBAAiB,OAAO,aAAa,aAAa,SAAS;EAC7D;EACA;CACJ,CAAC,IAAI;CAEL,MAAM,UAAU,wBAAwB;CACxC,MAAM,iBAAiB,QAAQ;CAC/B,MAAM,YAAY,CAAC,WACZ,CAAC,eAAe,gBACf,QAAQ,eAAe,IAAI,KAAK,eAAe;CAEvD,IAAI,WAAW,QAAQ,SAAS,GAC5B,OACI,qBAAC,qBAAD;EACa;EACT,OAAM;EACN,YAAY,EAAE,QAAQ;YAH1B,CAIK,aAAa,oBAAC,wBAAD;GAAiC;GAAkB;EAAS,CAAA,GACzE,cACgB;;CAI7B,OAAO;AACX;;;AClbA,SAAgB,aAAa,EACzB,UACA,YAID;CACC,OAAO,oBAAC,gBAAD,EAAgB,QAAQ,oBAAoB,CAC/C;EACI,MAAM,WAAW,GAAG,gCAAgC,QAAQ,EAAE,MAAM;EACpE,SAAS;CACb,CACJ,CAAC,EAAG,CAAA;AACR;;;;;;;;;;;;;;;;ACCA,SAAgB,aAAa,EAAE,YAA4C;CACvE,MAAM,WAAW,YAAY;CAI7B,OAAO,oBAAC,QAAD;EAAQ,UAHD,SAAS,OACK,iBAAiB;EAEL;CAAiB,CAAA;AAC7D;;;;;;;;;;;;;;ACPA,SAAgB,wBACZ,QAAmC,CAAC,GAChB;CACpB,MAAM,EAAE,QAAQ,WAAW,mBAAmB;CAC9C,MAAM,OAAO,QAAQ;CAErB,MAAM,CAAC,MAAM,WAAW,SAAsB,IAAI;CAClD,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CACpD,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,IAAI;CACzD,MAAM,CAAC,WAAW,gBAAgB,SAAuB,IAAI;CAC7D,MAAM,CAAC,mBAAmB,wBAAwB,SAAuB,IAAI;CAC7E,MAAM,CAAC,cAAc,mBAAmB,SAAS,KAAK;CACtD,MAAM,CAAC,OAAO,YAAY,SAAkB,IAAI;CAChD,MAAM,CAAC,YAAY,iBAAiB,SAAoC,IAAI;CAE5E,MAAM,eAAe,OAAO,IAAI;CAEhC,MAAM,eAAe,OAAO,SAAS;CACrC,aAAa,UAAU;CAKvB,MAAM,oBAAoB,OAAO,cAAc;CAC/C,kBAAkB,UAAU;CAE5B,MAAM,aAAa,kBAAkB;EACjC,qBAAqB,IAAI;CAC7B,GAAG,CAAC,CAAC;CAGL,gBAAgB;EACZ,IAAI,CAAC,MAAM;GACP,kBAAkB,KAAK;GACvB;EACJ;EAEA,aAAa,UAAU;EAEvB,MAAM,cAAc,OAAO,YAAkC;GACzD,IAAI,CAAC,aAAa,SAAS;GAE3B,IAAI,YAAY,SAAS,QAAQ;GACjC,MAAM,iBAAiB,kBAAkB;GACzC,IAAI,aAAa,gBACb,IAAI;IACA,MAAM,QAAQ,MAAM,eAAe,SAAS;IAC5C,IAAI,SAAS,aAAa,SACtB,YAAY;KAAE,GAAG;KAAW;IAAM;GAE1C,SAAS,GAAG;IACR,QAAQ,MAAM,yBAAyB,CAAC;GAC5C;GAGJ,IAAI,aAAa,SACb,QAAQ,SAAS;EAEzB;EAEA,MAAM,YAAY,OAAO,OAAwB,YAAkC;GAC/E,MAAM,YAAY,OAAO;GACzB,IAAI,UAAU,cAAc;IACxB,IAAI,aAAa,SACb,gBAAgB,KAAK;IAEzB,aAAa,UAAU;GAC3B;EACJ;EAGA,YAAY,KAAK,WAAW,CAAC;EAG7B,KAAK,cAAc,EAAE,WAAW;GAC5B,IAAI,aAAa,SAAS;IACtB,YAAY,KAAK,WAAW,CAAC;IAC7B,kBAAkB,KAAK;GAC3B;EACJ,CAAC,EAAE,YAAY;GACX,IAAI,aAAa,SAAS,kBAAkB,KAAK;EACrD,CAAC;EAGD,KAAK,cAAc,EAAE,MAAM,WAA+B;GACtD,IAAI,aAAa,SAAS,cAAc,MAAM;EAClD,CAAC,EAAE,YAAY,CAAC,CAAC;EAEjB,MAAM,cAAc,KAAK,kBAAkB,SAAS;EAEpD,aAAa;GACT,aAAa,UAAU;GACvB,YAAY;EAChB;CACJ,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,eAAe,YAAY,YAA6B;EAC1D,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,qCAAqC;EAChE,MAAM,UAAU,KAAK,WAAW;EAGhC,IAAI,SAAS,eAAe,QAAQ,YAAY,KAAK,IAAI,IAAI,KACzD,OAAO,QAAQ;EAKnB,QAAO,MADkB,KAAK,eAAe,GAC3B;CACtB,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,UAAU,YAAY,YAAY;EACpC,IAAI,CAAC,MAAM;EACX,eAAe,IAAI;EACnB,IAAI;GACA,MAAM,KAAK,QAAQ;EAEvB,SAAS,OAAgB;GAErB,qBADY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC5C;EAC5B,UAAU;GACN,eAAe,KAAK;EACxB;CACJ,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,qBAAqB,YAAY,OAAO,OAAe,aAAqB;EAC9E,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,qCAAqC;EAChE,eAAe,IAAI;EACnB,qBAAqB,IAAI;EACzB,IAAI;GACA,MAAM,KAAK,gBAAgB,OAAO,QAAQ;EAC9C,SAAS,OAAgB;GAErB,qBADY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC5C;GACxB,MAAM;EACV,UAAU;GACN,eAAe,KAAK;EACxB;CACJ,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,WAAW,YAAY,OAAO,OAAe,UAAkB,gBAAyB;EAC1F,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,qCAAqC;EAChE,eAAe,IAAI;EACnB,qBAAqB,IAAI;EACzB,IAAI;GACA,MAAM,KAAK,OAAO,OAAO,UAAU,WAAW;EAClD,SAAS,OAAgB;GAErB,qBADY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC5C;GACxB,MAAM;EACV,UAAU;GACN,eAAe,KAAK;EACxB;CACJ,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,cAAc,YAAY,OAC5B,YACC;EACD,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,qCAAqC;EAChE,eAAe,IAAI;EACnB,qBAAqB,IAAI;EACzB,IAAI;GACA,MAAM,KAAK,iBAAiB,OAAO;EACvC,SAAS,OAAgB;GAErB,qBADY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC5C;GACxB,MAAM;EACV,UAAU;GACN,eAAe,KAAK;EACxB;CACJ,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,aAAa,YAAY,OAAO,YAAoB,YAAqC;EAC3F,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,qCAAqC;EAChE,eAAe,IAAI;EACnB,qBAAqB,IAAI;EACzB,IAAI;GACA,MAAM,KAAK,gBAAgB,YAAY,OAAO;EAClD,SAAS,OAAgB;GAErB,qBADY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC5C;GACxB,MAAM;EACV,UAAU;GACN,eAAe,KAAK;EACxB;CACJ,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,YAAY,kBAAkB;EAChC,gBAAgB,IAAI;EACpB,QAAQ,IAAI;CAChB,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAiB,YAAY,OAAO,UAAkB;EACxD,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,qCAAqC;EAChE,eAAe,IAAI;EACnB,qBAAqB,IAAI;EACzB,IAAI;GACA,MAAM,KAAK,sBAAsB,KAAK;EAC1C,SAAS,OAAgB;GAErB,qBADY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC5C;GACxB,MAAM;EACV,UAAU;GACN,eAAe,KAAK;EACxB;CACJ,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,gBAAgB,YAAY,OAAO,OAAe,aAAqB;EACzE,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,qCAAqC;EAChE,eAAe,IAAI;EACnB,qBAAqB,IAAI;EACzB,IAAI;GACA,MAAM,KAAK,cAAc,OAAO,QAAQ;EAC5C,SAAS,OAAgB;GAErB,qBADY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC5C;GACxB,MAAM;EACV,UAAU;GACN,eAAe,KAAK;EACxB;CACJ,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,iBAAiB,YAAY,OAAO,aAAqB,gBAAwB;EACnF,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,qCAAqC;EAChE,eAAe,IAAI;EACnB,qBAAqB,IAAI;EACzB,IAAI;GACA,MAAM,KAAK,eAAe,aAAa,WAAW;GAElD,MAAM,KAAK,QAAQ;EACvB,SAAS,OAAgB;GAErB,qBADY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC5C;GACxB,MAAM;EACV,UAAU;GACN,eAAe,KAAK;EACxB;CACJ,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,gBAAgB,YAAY,OAAO,aAAsB,aAAsB;EACjF,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,qCAAqC;EAChE,eAAe,IAAI;EACnB,qBAAqB,IAAI;EACzB,IAAI;GAEA,OAAO,MADmB,KAAK,WAAW;IAAE;IAAa;GAAS,CAAC;EAEvE,SAAS,OAAgB;GAErB,qBADY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC5C;GACxB,MAAM;EACV,UAAU;GACN,eAAe,KAAK;EACxB;CACJ,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,gBAAgB,YAAY,YAAY;EAC1C,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,qCAAqC;EAChE,OAAO,MAAM,KAAK,YAAY;CAClC,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,gBAAgB,YAAY,OAAO,cAAsB;EAC3D,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,qCAAqC;EAChE,MAAM,KAAK,cAAc,SAAS;CACtC,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,oBAAoB,YAAY,YAAY;EAC9C,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,qCAAqC;EAChE,MAAM,KAAK,kBAAkB;CACjC,GAAG,CAAC,IAAI,CAAC;CAET,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA,YAAY,YAAY,cAAc;EACtC,qBAAqB,YAAY,uBAAuB;EACxD;EACA,iBAAiB,QAAQ;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;GACV,oBAAoB;GACpB,aAAa,CAAC,CAAE,MAAM;GACtB,cAAc,YAAY,uBAAuB;GACjD,eAAe,YAAY,iBAAiB;GAG5C,oBAAoB,YAAY,sBAAsB;GACtD,mBAAmB;GACnB,eAAe;GACf,mBAAmB,YAAY,qBAAqB;GACpD,kBAAkB,YAAY,oBAAoB,CAAC;EACvD;CACJ;AACJ;;;;;;;;;;;;;;;;;;ACrTA,IAAa,eAAe;AAE5B,eAAe,eAAkB,UAAgC;CAC7D,IAAI;CACJ,IAAI;EACA,OAAO,MAAM,SAAS,KAAK;CAC/B,SAAS,YAAY;EAEjB,MAAM,IAAI,eACN,8CAA8C,SAAS,OAAO,IAC9D;GAAE,QAAQ,SAAS;GAAQ,MAAM;EAAc,CACnD;CACJ;CAEA,IAAI,CAAC,SAAS,IACV,MAAM,IAAI,eACL,KAAgD,OAAO,WAAW,kBACnE;EACI,QAAQ,SAAS;EACjB,MAAO,KAAgD,OAAO,QAAQ;CAC1E,CACJ;CAGJ,OAAO;AACX;;;;;AAMA,eAAe,kBAAkB,OAA0B,MAAuC;CAC9F,IAAI;EACA,OAAO,MAAM,MAAM,OAAO,IAAI;CAClC,SAAS,OAAgB;EACrB,IAAI,iBAAiB,aAAa,MAAM,QAAQ,SAAS,iBAAiB,GACtE,MAAM,IAAI,eACN,mIACA;GAAE,MAAM;GAAiB,OAAO;EAAM,CAC1C;EAEJ,MAAM,IAAI,eACN,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,IAC1E;GAAE,MAAM;GAAiB,OAAO;EAAM,CAC1C;CACJ;AACJ;;;;;AAuCA,SAAgB,wBAAyC;CACrD,OAAO;EAAE,QAAQ;EAAM,UAAU;CAAK;AAC1C;;;;;;;;;AAUA,eAAsB,gBAAgB,QAAgB,OAAqD;CACvG,IAAI,MAAM,QACN,OAAO,MAAM;CAGjB,IAAI,MAAM,UACN,OAAO,MAAM;CAGjB,MAAM,YAAY,YAAY;EAK1B,OAAO,eAAmC,MAJnB,kBAAkB,GAAG,OAAO,mBAAmB;GAClE,QAAQ;GACR,SAAS,EAAE,gBAAgB,mBAAmB;EAClD,CAAC,CACiD;CACtD,GAAG;CAEH,IAAI;EACA,MAAM,SAAS,MAAM,MAAM;EAC3B,MAAM,SAAS;EACf,OAAO;CACX,UAAU;EACN,MAAM,WAAW;CACrB;AACJ;;;;AAKA,SAAgB,qBAAqB,OAA8B;CAC/D,MAAM,SAAS;CACf,MAAM,WAAW;AACrB;;;ACnJA,IAAM,eAAuC,CAAC;AAa9C,IAAa,cAAc,IAAI,KARnB,SACP,KAAK,eAAe;CAEjB,OAAO;EACH,KAAK;EACL,UAHgB,cAAc,eAAe,aAAa,cAAc;CAI5E;AACJ,CACgC,GAAK;CACrC,iBAAiB;CACjB,YAAY;CACZ,gBAAgB;CAChB,UAAU;CACV,MAAM,CAAC,OAAO,UAAU;AAC5B,CAAC;;;ACLD,IAAM,cAAsC,SAAS,QAAQ,KAA6B,QAAQ;CAE9F,MAAM,QAAQ,IAAI,YAAY;CAC9B,MAAM,QAAQ,IAAI,QAAQ,YAAY,KAAK,EAAE,YAAY,EAAE,QAAQ,MAAM,EAAE;CAC3E,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI,OAAO;CACX,OAAO;AACX,GAAG,CAAC,CAAC;AAEL,SAAS,aAAa,KAAqB;CACvC,OAAO,IAAI,MAAM,MAAM,EAAE,KAAI,SAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE;AAC9F;;;;;AAMA,SAAS,YAAY,SAAoF;CACrG,MAAM,WAAW;CACjB,IAAI,OAAO,SAAS;CACpB,IAAI,CAAC,MACD,OAAO,SAAS,aAAa,OAAO;CAExC,IAAI,CAAC,MACD,OAAO,SAAS;CAEpB,OAAO,QAAQ;AACnB;;;;;AAMA,SAAgB,QAAQ,SACpB,WACA,OACA,MAA2F;CAE3F,IAAI,MAAM,eAAe,OAAO,GAC5B,OAAO;CAGX,IAAI,CAAC,SAAS,OAAO,KAAA;CACrB,IAAI,OAAO,YAAY,UAAU;EAC7B,MAAM,WAAW,QAAQ,YAAY;EACrC,MAAM,eAAe,QAAQ,OAAO,EAAE,QAAQ,MAAM,GAAG;EAEvD,MAAM,YAAY,YAAY,YAAY,YAAY,aAAa,YAAY;EAE/E,IAAI,CAAC,WACD;EAGJ,MAAM,aAAa,YAAY,SAAS;EACxC,IAAI,CAAC,YAAY,OAAO,KAAA;EAGxB,OAAO,oBAAC,YAAD;GACH,MAFa,OAAO,SAAS,WAAW,OAAO,SAAS,QAAQ;GAGhE,WAAW,IACP,QAAQ,oBAAoB,SAAS,IACrC,wBACA,SACJ;EACH,CAAA;CACL;CAEA,QAAQ,KAAK,8BAA8B,OAAO;AAEtD;AAUA,IAAa,cAAc,MAAM,KAC7B,SAAS,YAAY,EACjB,kBACA,WACA,OACA,OAAO,YAMY;CACnB,IAAI,CAAC,kBAAkB,OAAO,oBAAA,UAAA,CAAI,CAAA;CAClC,MAAM,OAAO,QAAQ,iBAAiB,MAAM,WAAW,OAAO,IAAI;CAClE,IAAI,kBAAkB,QAAQ,MAC1B,OAAO;CAEX,IAAI,WAAW,SAAS,kBAAkB,mBAAmB,iBAAiB,eAAe,KAAA,MAAc,iBAAiB,IAAI,EAAE,QAAQ,MAAM,GAAG;CAEnJ,IAAI;CACJ,IAAI,YAAY,aACZ,MAAM,YAAY;CAEtB,IAAI,CAAC,KAAK;EACN,WAAW,QAAQ,iBAAiB,IAAI,EAAE,QAAQ,MAAM,GAAG;EAC3D,IAAI,YAAY,aACZ,MAAM,YAAY;CAC1B;CAEA,MAAM,aAAa,aAAa;CAEhC,IAAI,CAAC,KACD,MAAM,aAAa,WAAW,iBAAiB,IAAI,IAAI;CAE3D,MAAM,aAAa,YAAY,GAAG;CAClC,IAAI,CAAC,YAAY,OAAO,oBAAA,UAAA,CAAI,CAAA;CAG5B,OAAO,oBAAC,YAAD;EACH,MAFa,OAAO,SAAS,WAAW,OAAO,SAAS;EAGxD,WAAW,IACP,QAAQ,oBAAoB,SAAS,IACrC,wBACA,SACJ;CACH,CAAA;AACL,IAAI,WAAW,cAAc;CACzB,OAAO,UAAM,UAAU,kBAAkB,MAAM,UAAU,kBAAkB,IAAI,KAC3E,UAAU,kBAAkB,SAAS,UAAU,kBAAkB,QACjE,UAAU,kBAAkB,SAAS,UAAU,kBAAkB,QACjE,UAAU,kBAAkB,iBAAiB,UAAU,kBAAkB,gBACzE,UAAM,UAAU,OAAO,UAAU,KAAK,KACtC,UAAU,cAAc,UAAU,aAClC,UAAU,SAAS,UAAU;AACrC,CAAC;;;AClJL,SAAgB,iBAAmC,QAAgC;CAC/E,MAAM,eAAe;CAErB,OAAO;EACH,SAAS;EACT;EACA,eAAe;EACf,SAAS,CAAC;EACV,OAAO;EACP,QAAQ,CAAC;EACT,aAAa;EACb,cAAc;EACd,cAAc;EACd,SAAS;EACT,SAAS;EACT,SAAS;EAET,iBAAiB;GACb,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,WAAW,SAAwC;GAC/C,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,qBAAqB;GACjB,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,uBAAuB;GACnB,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,gBAAgB;GACZ,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,sBAAsB;GAClB,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,qBAAqB;GACjB,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,oBAAoB;GAChB,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,kBAAkB;GACd,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,oBAAoB;GAChB,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,gBAAgB;GACZ,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,iBAAiB;GACb,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,qBAAqB;GACjB,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,YAAY;GACR,MAAM,IAAI,MAAM,YAAY;EAChC;EACA,YAAY;GACR,MAAM,IAAI,MAAM,YAAY;EAChC;CACJ;AACJ;;;AC7DA,IAAM,uBAAuB;AAG7B,IAAM,8BAAmC,IAAI,IAAI;AAGjD,IAAM,4BAA4B,OAAO,mBAAmB;AAG5D,SAAS,eAA8C,KAAsB;CAEzE,MAAM,QAAQ,KAAK;CAGnB,IAAI,iBAAiB,MACjB,OAAO;EACH,QAAQ;EACR,OAAO,MAAM,YAAY;CAC7B;CAIJ,IAAI,iBAAiB,iBACjB,OAAO;EACH,QAAQ;EACR,IAAI,MAAM;EACV,MAAM,MAAM;EACZ,QAAQ,MAAM;EACd,YAAY,MAAM;CACtB;CAGJ,IAAI,iBAAiB,gBACjB,OAAO;EACH,QAAQ;EACR,IAAI,MAAM;EACV,MAAM,MAAM;EACZ,MAAM,MAAM;CAChB;CAIJ,IAAI,iBAAiB,UACjB,OAAO;EACH,QAAQ;EACR,UAAU,MAAM;EAChB,WAAW,MAAM;CACrB;CAIJ,IAAI,iBAAiB,QACjB,OAAO;EACH,QAAQ;EACR,OAAO,MAAM;CACjB;CAGJ,OAAO;AACX;AAGA,SAAS,cAAc,MAAc,OAAyB;CAC1D,IAAI,SAAS,OAAO,UAAU,YAAY,YAAY,OAAO;EACzD,MAAM,SAAS;EACf,QAAQ,OAAO,QAAf;GACI,KAAK;GACL,KAAK,QACD,OAAO,IAAI,KAAK,OAAO,KAAe;GAC1C,KAAK;GACL,KAAK,mBACD,OAAO,IAAI,gBAAgB;IACvB,IAAI,OAAO;IACX,MAAM,OAAO;IACb,QAAQ,OAAO;IACf,YAAY,OAAO;GACvB,CAAC;GACL,KAAK;GACL,KAAK,kBACD,OAAO,IAAI,eAAe,OAAO,IAAc,OAAO,MAAgB,OAAO,IAA2C;GAC5H,KAAK,YACD,OAAO,IAAI,SAAS,OAAO,UAAoB,OAAO,SAAmB;GAC7E,KAAK,UACD,OAAO,IAAI,OAAO,OAAO,KAAiB;GAC9C,SACI,OAAO;EACf;CACJ;CACA,OAAO;AACX;AAGA,IAAI,2BACA,IAAI;CAEA,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;EAC5C,MAAM,UAAU,eAAe,IAAI,CAAC;EACpC,IAAI,WAAW,QAAQ,WAAW,oBAAoB,GAAG;GACrD,MAAM,OAAO,QAAQ,UAAU,EAA2B;GAC1D,MAAM,eAAe,eAAe,QAAQ,OAAO;GACnD,IAAI,cACA,IAAI;IACA,MAAM,SAAiB,KAAK,MAAM,cAAc,aAAa;IAC7D,YAAY,IAAI,MAAM,MAAM;GAChC,SAAS,YAAY;IACjB,QAAQ,MACJ,oCAAoC,KAAK,yBACzC,UACJ;GACJ;EAER;CACJ;AACJ,SAAS,OAAO;CACZ,QAAQ,MAAM,yDAAyD,KAAK;AAChF;;;;;;AAQJ,SAAgB,kBAAkB,MAAc,MAAoB;CAEhE,IAAI,2BACA,IAAI;EACA,MAAM,MAAM,uBAAuB;EAEnC,MAAM,eAAe,KAAK,UAAU,MAAM,cAAc;EACxD,eAAe,QAAQ,KAAK,YAAY;CAC5C,SAAS,OAAO;EACZ,QAAQ,MACJ,mCAAmC,KAAK,uBACxC,KACJ;CACJ;AAER;AAEA,SAAgB,4BAA4B,MAAoB;CAC5D,YAAY,OAAO,IAAI;AAC3B;AAEA,SAAgB,wBAAwB,MAAc,MAAoB;CACtE,YAAY,IAAI,MAAM,IAAI;AAC9B;AAEA,SAAgB,yBAAyB,MAAkC;CACvE,OAAO,YAAY,IAAI,IAAI;AAC/B;;;;;;;AASA,SAAgB,mBAAmB,MAAkC;CAGjE,IAAI,2BACA,IAAI;EACA,MAAM,MAAM,uBAAuB;EACnC,MAAM,eAAe,eAAe,QAAQ,GAAG;EAC/C,IAAI,cAEA,OADuB,KAAK,MAAM,cAAc,aACzC;CAEf,SAAS,OAAO;EACZ,QAAQ,MACJ,mCAAmC,KAAK,yBACxC,KACJ;CACJ;AAKR;;;;;AAMA,SAAgB,sBAAsB,MAAoB;CAEtD,QAAQ,MAAM,8BAA8B,IAAI;CAGhD,YAAY,OAAO,IAAI;CAGvB,IAAI,2BACA,IAAI;EACA,MAAM,MAAM,uBAAuB;EACnC,eAAe,WAAW,GAAG;CACjC,SAAS,OAAO;EACZ,QAAQ,MACJ,qCAAqC,KAAK,yBAC1C,KACJ;CACJ;AAER;AAGA,SAAgB,YAAY,KAA0C,SAAS,IAAI,SAAmB,CAAC,GAAa;CAEhH,IAAI,SAAS,GAAG,KAAK,MAAM,QAAQ,GAAG,GAElC,IAAI,CADgB,cAAc,GAC7B,KAAe,QAChB,OAAO,KAAK,MAAM;MACf;EACH,MAAM,SAAS;EACf,KAAK,MAAM,OAAO,QACd,IAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG,GAAG;GACnD,MAAM,SAAS,SACT,MAAM,QAAQ,GAAG,IACb,GAAG,OAAO,GAAG,IAAI,KACjB,GAAG,OAAO,GAAG,QACjB;GACN,MAAM,MAAM,OAAO;GACnB,IAAI,SAAS,GAAG,KAAK,MAAM,QAAQ,GAAG,GAClC,YAAY,KAA4C,QAAQ,MAAM;QAEtE,OAAO,KAAK,MAAM;EAE1B;CAER;CAEJ,OAAO;AACX;;;AClNA,SAAgB,2BAA8D,EAC1E,UACA,cACA,MACA,OACA,UACA,aACA,eACA,uBACA,UACA,YAeG;CAEoB,kBAAkB;CACzC,MAAM,iBAAiB,kBAAkB;CACzC,MAAM,UAAqC,SAAS,SAAS,WACvD,SAAS,UACT,SAAS,SAAS,WACf,SAAS,GAAgB,SAAS,WAChC,SAAS,GAAsB,UAChC,KAAA;CAIV,MAAM,wBAAwB,cAAc,qBAAqB;EAC7D,WAAW,SAAS;EACpB,UAAU;EACV,SAAS,eAAe;EACxB,eAAe;CACnB,CAAC,GAAG;EAAC,SAAS;EAAe;EAAuB,eAAe;EAAS;CAAa,CAAC;CAE1F,MAAM,yBAAyB,SAAS,SAAS;CAEjD,IAAI,CAAC,SACD,MAAM,MAAM,gCAAgC;CAEhD,MAAM,cAAc,SAAS;CAE7B,MAAM,WAAgD,SAAS;CAC/D,MAAM,OAAO,yBAAyB,WAAW;CAEjD,MAAM,cAAc,SAAS;CAE7B,MAAM,uBACF,wBAAwB,wBAAwB,OAAO,UAAU,IAAI;CAEzE,MAAM,CAAC,cAAc,mBAAmB,SAAmC,KAAK;CAChF,MAAM,CAAC,eAAe,oBAAoB,SAA6B,oBAAoB;CAE3F,gBAAgB;EACZ,IAAI,CAAC,UAAM,cAAc,KAAK,GAAG;GAC7B,gBAAgB,KAAK;GACrB,iBAAiB,oBAAoB;EACzC;CACJ,GAAG;EAAC;EAAsB;EAAO;CAAY,CAAC;CAE9C,MAAM,kBAAkB,YAAY,OAAO,SAAe;EACtD,IAAI,QAAQ,UAAU;GAClB,MAAM,WAAW,MAAM,6BAA6B;IAChD,OAAO,QAAQ;IACf;IACA,QAAQ;IACR;IACA;IACU;IACV;IACA;GACJ,CAAC;GACD,IAAI,CAAC,YAAY,SAAS,WAAW,GACjC,MAAM,MAAM,qCAAqC;GAErD,OAAO;EACX;EACA,OAAO,aAAa,IAAI,MAAM,KAAK;CACvC,GAAG;EAAC;EAAU;EAAc;EAAM;EAAU;EAAa;CAAO,CAAC;CAgIjE,OAAO;EACH;EACA;EACA;EACA;EACA,oBAnIuB,aAAa,SAAe;GACnD,OAAO,yBAAyB;IAC5B,OAAO,QAAQ;IACf;IACA,QAAQ;IACR;IACA;IACU;IACV;IACA;GACJ,CAAC,KAAK;EACV,GAAG;GAAC;GAAU;GAAc;GAAM;GAAU;GAAa;EAAO,CAwH5D;EACA,sBAvHyB,YAAY,OAAO,cAC5C,OACA,UACA,gBAAyB;GAEzB,QAAQ,MAAM,wBAAwB,cAAc,KAAK;GAEzD,IAAI,0BAAyC;GAE7C,IAAI,QAAQ,kBACR,IAAI,CAAC,aACD,QAAQ,KAAK,iIAAiI;QAE9I,0BAA0B;GAIlC,IAAI,QAAQ,UACR,2BAA2B,MAAM,sBAAsB,aAAa,YAAY,GAAG;GAEvF,IAAI,QAAQ,eAAe,yBACvB,0BAA0B,MAAM,QAAQ,YAAY,uBAAuB;GAG/E,IAAI,CAAC,yBAAyB;IAC1B,QAAQ,KAAK,iCAAiC;IAC9C;GACJ;GAEA,IAAI;GAEJ,MAAM,2BAA2B;GACjC,MAAM,WAAW;GACjB,WAAW,CAAC,GAAG,aAAa;GAE5B,WAAW,iBAAiB,QAAQ;GACpC,iBAAiB,QAAQ;GAEzB,MAAM,aAAa,SACd,QAAO,MAAK,CAAC,CAAC,EAAE,wBAAwB,EACxC,KAAI,MAAK,EAAE,wBAAkC;GAElD,IAAI,wBACA,SAAS,UAAU;QAEnB,SAAS,aAAa,WAAW,KAAK,IAAI;EAElD,GAAG;GAAC;GAAe;GAAwB;GAAU;GAAS;EAAqB,CAwE/E;EACA,mBAvEsB,aAAa,UAA4B;GAC/D,QAAQ,MAAM,qBAAqB,KAAK;GAIxC,iBADiB,cAAc,QAAO,SAAQ,KAAK,OAAO,MAAM,EAC/C,CAAQ;EAC7B,GAAG,CAAC,aAAa,CAiEb;EACA,cAhEiB,YAAY,OAAO,kBAA0B;GAE9D,IAAI,CAAC,cAAc,UAAU,UACzB;GAEJ,IAAI,aACA,IAAI;IACA,gBAAgB,MAAM,QAAQ,IAAI,cAAc,IAAI,OAAM,SAAQ;KAC9D,MAAM,gBAAgB,MAAM,YAAY,IAAI;KAC5C,IAAI,CAAC,eACD,OAAO;KAEX,OAAO;IACX,CAAC,CAAC;GACN,SAAS,GAAG;IACR,QAAQ,MAAM,6EAA6E,CAAC;GAChG;GAGJ,IAAI;GAEJ,IAAI,wBACA,mBAAmB,CAAC,GAAG,eACvB,GAAI,MAAM,QAAQ,IAAI,cAAc,IAAI,OAAM,SAAQ;IAClD,IAAI,eAAe,YAAY,IAAI,GAC/B,OAAO,MAAM,YAAY,MAAM,WAAW;IAG9C,OAAO;KACH,IAAI,YAAY;KAChB;KACA,UAAU,MAAM,gBAAgB,IAAI;KACpC;KACA;IACJ;GACJ,CAAC,CAAC,CAAE;QACD;IACH,IAAI,OAAO,cAAc;IACzB,IAAI,eAAe,YAAY,IAAI,GAC/B,OAAO,MAAM,YAAY,MAAM,WAAW;IAG9C,mBAAmB,CAAC;KAChB,IAAI,YAAY;KAChB;KACA,UAAU,MAAM,gBAAgB,IAAI;KACpC;KACA;IACJ,CAAC;GACL;GAGA,mBAAmB,iBAAiB,gBAAgB;GACpD,iBAAiB,gBAAgB;EACrC,GAAG;GAAC;GAAU;GAAiB;GAAe;GAAU;GAAwB;GAAM;EAAW,CAU7F;EACA;;;EAGA;CACJ;AACJ;AAEA,SAAS,wBAAwB,wBAC7B,OACA,UACA,MAA4C;CAC5C,IAAI,UAAoB,CAAC;CACzB,IAAI;MACI,MAAM,QAAQ,KAAK,KAAK,MAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,GAChE,UAAW,SAAS,CAAC;CAAA,OAGzB,IAAI,OAAO,UAAU,UACjB,UAAU,QAAQ,CAAC,KAAe,IAAI,CAAC;CAI/C,OAAO,QACF,KAAI,WACD;EACI,IAAI,YAAY;EAChB,0BAA0B;EAC1B;EACA;CACJ,EACH;AACT;AAEA,SAAS,iBAAiB,OAA2B;CACjD,OAAO,MAAM,QACR,MAAM,MAAM;EACT,QAAS,MAAM,KAAK,MAAM,EAAE,wBAAwB,EAAE,QAAQ,KAAK,wBAAwB,MAAM,KAAM,CAAC,KAAK,8BACvG,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAK,IAAI,MAAM,KAAM,CAAC,KAAK;CACtE,CACJ;AACJ;AAEA,SAAS,cAAc;CACnB,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,MAAM,OAAO,gBAAgB,CAAC;AACzE;;;;AAKA,SAAS,YAAY,MAAqB;CACtC,OAAO,KAAK,SAAS,gBACjB,KAAK,SAAS,eACd,KAAK,SAAS;AACtB;;;;AAKA,eAAe,YACX,MACA,aACa;CACb,MAAM,WAAW,aAAa;CAC9B,MAAM,YAAY,aAAa;CAC/B,MAAM,WAAW,aAAa,WAAW,MAAM;CAC/C,MAAM,OAAO,aAAa,QAAQ;CAGlC,IAAI,WAAW,KAAK;CACpB,IAAI,aAAa,UAAU,YAAY,WAAW,YAC9C,WAAW,SAAS,YAAY;CAGpC,OAAO,IAAI,SAAe,SAAS,WAAW;EAC1C,IAAI,WAAW,MAAM;GACjB;GACA;GACA;GACA;GAGA,GAAI,SAAS,WAAW,SAAS,KAAA,IAAY;IACzC,OAAO;IACP,QAAQ;IACR,QAAQ;GACZ,IAAI,CAAC;GACL,UAAU,WAAW;IAKjB,QAAQ,IAJmB,KAAK,CAAC,MAAM,GAAG,KAAK,MAAM;KACjD,MAAM,OAAO;KACb,cAAc,KAAK,IAAI;IAC3B,CACQ,CAAc;GAC1B;GACA,OAAO;EACX,CAAC;CACL,CAAC;AACL;;;ACzVA,SAAS,oBAAoB,UAAoB;CAC7C,IAAI,CAAC,UAAU,OAAO;CACtB,IAAI,SAAS,SAAS,aAAa,OAAO;CAC1C,IAAI,SAAS,SAAS,SAClB,IAAI,MAAM,QAAQ,SAAS,EAAE,GAAG,OAAO;MAClC,OAAO,SAAS,IAAI,SAAS;CAEtC,OAAO;AACX;AAEA,SAAS,mBAAmB,UAAoB;CAC5C,IAAI,CAAC,UAAU,OAAO;CACtB,IAAI,SAAS,SAAS,YAAY,OAAO;CACzC,IAAI,SAAS,SAAS,SAClB,IAAI,MAAM,QAAQ,SAAS,EAAE,GAAG,OAAO;MAClC,OAAO,SAAS,IAAI,SAAS;CAEtC,OAAO;AACX;AAEA,SAAS,iBAAiB,UAAyC;CAC/D,IAAI,CAAC,UAAU,OAAO;CACtB,OAAO,QAAQ,SAAS,IAAI,kBAAkB;AAClD;;;;;;AAOA,SAAS,kBAAkB,UAAyC;CAChE,IAAI,CAAC,UAAU,OAAO;CAEtB,IAAI,SAAS,SAAS,YAAY,SAAS,SAAS,OAAO;CAE3D,IAAI,SAAS,SAAS,YAAY,SAAS,IAAI,QAAQ,SAAS,OAAO;CAEvE,IAAI,SAAS,SAAS,WAAW,SAAS,MAAM,CAAC,MAAM,QAAQ,SAAS,EAAE,GAAG;EACzE,MAAM,QAAQ,SAAS;EACvB,IAAI,MAAM,SAAS,aAAa,MAAM,WAAW,MAAM,IAAI,QAAQ,UAAU,OAAO;CACxF;CACA,OAAO;AACX;AAEA,SAAgB,qBACZ,gBACA,kBACA,QACA,mBACA,QAAQ,GAAG;CACX,MAAM,gBAAgB,OAAO,KAAK,iBAAiB,UAAU;CAC7D,IAAI,iBAAiB,mBAAmB,QAAO,MAAK,cAAc,SAAS,CAAW,CAAC;CACvF,IAAI,CAAC,kBAAkB,iBAAiB,mBACpC,iBAAiB,iBAAiB,mBAAmB,QAAO,MAAK,cAAc,SAAS,CAAW,CAAC;CAExG,IAAI,kBAAkB,eAAe,SAAS,GAC1C,OAAO;MACJ;EACH,iBAAkB,iBAAiB,mBAAgC;EACnE,OAAO,eACF,QAAO,QAAO;GACX,MAAM,OAAO,iBAAiB,WAAW;GAEzC,OAAO,EADU,QAAQ,OAAO,SAAS,YAAY,UAAU,QAAQ,QAAS,KAA4B,IAAI,MAC5F,QAAQ;EAChC,CAAC,EACA,QAAO,QAAO;GACX,MAAM,WAAW,iBAAiB,WAAW;GAC7C,OAAO,YAAY,CAAC,kBAAkB,QAAQ,KAAK,CAAC,oBAAoB,QAAQ,KAAK,CAAC,mBAAmB,QAAQ,KAAK,CAAC,iBAAiB,QAAQ,KAAK,CAAC,kBAAkB,QAAoB;EAChM,CAAC,EAAE,MAAM,GAAG,KAAK;CACzB;AACJ;AAEA,SAAgB,0BAAyD,YAAiC,iBAAqE;CAC3K,IAAI,WAAW,eACX,OAAO,WAAW;CAGtB,MAAM,gBAAiB,WAAW,mBAAgC,OAAO,KAAK,WAAW,UAAU;CACnG,IAAI;CAEJ,KAAK,MAAM,OAAO,eAAe;EAC7B,MAAM,WAAW,WAAW,WAAW;EACvC,IAAI,YAAY,CAAC,kBAAkB,QAAQ,GAAG;GAC1C,MAAM,OAAO;GACb,IAAI,iBAAiB,IAAI,GACrB;GAEJ,IAAI,KAAK,SAAS,YAAY,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,WAAW,CAAC,KAAK,MAAM;IACpG,IAAI,CAAC,sBACD,uBAAuB;IAE3B,MAAM,WAAW,IAAI,YAAY;IACjC,IAAI;KAAC;KAAQ;KAAS;KAAS;KAAe;IAAU,EAAE,SAAS,QAAQ,GACvE,OAAO;GAEf;EACJ;CACJ;CACA,OAAO;AACX;;;ACnGA,SAAgB,eAAe,YAA+B,KAAmD;CAC7G,MAAM,gBAAgB,qBAAqB,YAAY,GAAG;CAC1D,IAAI,CAAC,eAAe,OAChB,OAAO,sBAAsB,IAAI,SAAS,CAAC;CAC/C,IAAI,OAAO,kBAAkB,YAAY,WAAW,eAAe;EAC/D,IAAI,OAAO,cAAc,UAAU,UAC/B,OAAO,YAAY,cAAc;EACrC,IAAI,OAAO,cAAc,UAAU,UAC/B,OAAO,cAAc;CAC7B;AAEJ;AAEA,SAAgB,oBAAoB,eAA0C;CAC1E,OAAO,OAAO,kBAAkB,YAAa,cAAkC;AACnF;AAEA,SAAgB,eACZ,eACkB;CAClB,IAAI,kBAAkB,KAAA,GAClB,OAAO,KAAA;CACX,IAAI,OAAO,kBAAkB,UACzB,OAAO,cAAc;MAErB,OAAO;AAEf;;;AC/BA,IAAa,2BAA2B;CACpC;CACA;CACA;CACA;CACA;AACJ;;;;;;;;;;;;ACGA,IAAa,uBAAuB;;AAGpC,IAAa,uBAAuB;;AAGpC,IAAa,uBAAuB;;;ACZpC,IAAM,aAAqC,CAAC;;;;;;;;;;AAW5C,SAAgB,mBAAmB;CAE/B,MAAM,WAAW,YAAY;CAE7B,MAAM,eAAe,OAAuB,IAAI;CAChD,MAAM,CAAC,QAAQ,aAAa,MAAM,SAAS,CAAC;CAC5C,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAAwB,MAAM;CAItE,MAAM,gBAAgB,OAAO,CAAC;CAE9B,MAAM,eAAe,kBAAkB;EACnC,IAAI,CAAC,aAAa,WAAW,CAAC,SAAS,KAAK;EAC5C,MAAM,YAAY,aAAa,QAAQ;EACvC,WAAW,SAAS,OAAO;EAC3B,UAAU,SAAS;EACnB,aAAa,YAAY,cAAc,UAAU,SAAS,IAAI;EAC9D,cAAc,UAAU;CAC5B,GAAG,CAAC,SAAS,GAAG,CAAC;CAEjB,gBAAgB;EACZ,MAAM,YAAY,aAAa;EAC/B,IAAI,CAAC,WAAW;EAChB,UAAU,iBAAiB,UAAU,cAAc,EAAE,SAAS,KAAK,CAAC;EAEpE,aAAa;GACT,IAAI,WACA,UAAU,oBAAoB,UAAU,YAAY;EAC5D;CACJ,GAAG,CAAC,YAAY,CAAC;CAIjB,gBAAgB;EACZ,MAAM,cAAc,WAAW,SAAS;EACxC,IAAI,CAAC,aAAa,WAAW,CAAC,aAAa;EAE3C,MAAM,YAAY,iBAAiB;GAC/B,IAAI,CAAC,aAAa,SAAS;GAC3B,aAAa,QAAQ,SAAS;IAC1B,KAAK;IACL,UAAU;GACd,CAAC;EACL,GAAG,CAAC;EAEJ,aAAa,aAAa,SAAS;CACvC,GAAG,CAAC,SAAS,GAAG,CAAC;CAEjB,OAAO;EACH;EACA;EACA;CACJ;AACJ;;;ACxDA,SAAgB,qBAAqB,EACjC,MACA,UACA,cACA,MACA,SAC0B;CAE1B,MAAM,EAAE,MAAM,eAAe;CAE7B,OACI,qBAAC,QAAD;EACI,uBAAuB;GACnB,aAAa;EACjB;EACM;YAJV;GAMI,oBAAC,aAAD;IAAa,SAAS;cAAO;GAAmB,CAAA;GAChD,oBAAC,eAAD,EAAA,UAEI,oBAAC,YAAD,EAAA,UACK,QAAQ,EAAE,iBAAiB,EACpB,CAAA,EAED,CAAA;GACf,qBAAC,eAAD,EAAA,UAAA,CACI,qBAAC,QAAD;IAAQ,SAAQ;IACZ,SAAS;IAAc,WAAA;cAD3B;KACqC;KAAE,EAAE,QAAQ;KAAE;IAAS;OAC5D,qBAAC,QAAD;IACI,SAAS;cADb;KACuB;KAAE,EAAE,IAAI;KAAE;IAAS;KAC/B,EAAA,CAAA;EACX;;AAEhB;;;AC0BA,IAAM,cAA4B;CAC9B,oBAAoB;EAvCpB,qBAAqB,KAAA;EACrB,wBAAwB,KAAA;EACxB,mCAAmC,CAAC;EACpC,gCAAgC,CAAC;EACjC,0BAA0B,CAAC;EAC3B,yBAAyB,CAAC;EAC1B,aAAa;CAiCO;CACpB,qBAAqB;EA9BrB,YAAY,CAAC;EACb,eAAe,CAAC;EAChB,aAAa,CAAC;CA4BO;CACrB,eAAe;EAzBf,UAAU;EACV,oBAAoB;EACpB,yBAAyB;EACzB,SAAS;EACT,2BAA2B;EAC3B,8BAA8B;EAC9B,uBAAuB;EACvB,gCAAgC;EAChC,gBAAgB,CAAC;CAiBF;CACf,iBAAiB;EAdjB,SAAS;EACT,yBAAyB,CAAC;CAaT;CACjB,aAAa;EAVb,aAAa,CAAC;EACd,WAAW,CAAC;EACZ,mBAAmB,CAAC;CAQP;AACjB;AAIA,IAAa,sBAAsB,cAA4B,WAAW;;;;;;;;;;;;;;;;;;AAmB1E,SAAgB,qBAAqB,EACjC,OACA,YAID;CACC,MAAM,SAAS,MAAM,eACV;EAAE,GAAG;EACpB,GAAG;CAAM,IACD,CAAC,KAAK,CACV;CACA,OACI,oBAAC,oBAAoB,UAArB;EAA8B,OAAO;EAChC;CACyB,CAAA;AAEtC;;AAKA,SAAgB,8BAA4D;CACxE,OAAO,WAAW,mBAAmB,EAAE;AAC3C;;AAGA,SAAgB,+BAAoD;CAChE,OAAO,WAAW,mBAAmB,EAAE;AAC3C;;AAGA,SAAgB,yBAAwC;CACpD,OAAO,WAAW,mBAAmB,EAAE;AAC3C;;AAGA,SAAgB,2BAAsD;CAClE,OAAO,WAAW,mBAAmB,EAAE;AAC3C;;AAGA,SAAgB,uBAA8C;CAC1D,OAAO,WAAW,mBAAmB,EAAE;AAC3C;AAcA,IAAa,8BAA8B,cAA2C,IAAI;;;;;;;;;;;;;;;;;;;;AAqB1F,SAAgB,6BAA6B,EAAE,YAA2C;CACtF,MAAM,CAAC,SAAS,cAAc,SAAS,CAAC;CACxC,MAAM,YAAY,OAA8B,CAAC,CAAC;CAElD,MAAM,WAAW,aAA2C,KAAQ,UAA2B;EAC3F,UAAU,QAAQ,OAAO;EACzB,YAAW,MAAK,IAAI,CAAC;CACzB,GAAG,CAAC,CAAC;CAEL,MAAM,aAAa,aAAa,QAA4B;EACxD,OAAO,UAAU,QAAQ;EACzB,YAAW,MAAK,IAAI,CAAC;CACzB,GAAG,CAAC,CAAC;CAEL,MAAM,WAAW,eAAqC;EAAE;EAC5D;CAAW,IAAI,CAAC,UAAU,UAAU,CAAC;CAEjC,MAAM,cAAc,eAA6B;EAC7C,GAAG;EACH,GAAG,UAAU;CACjB,IAAI,CAAC,OAAO,CAAC;CAEb,OACI,oBAAC,4BAA4B,UAA7B;EAAsC,OAAO;YACzC,oBAAC,oBAAoB,UAArB;GAA8B,OAAO;GAChC;EACyB,CAAA;CACI,CAAA;AAE9C;;;;;;;;;;;;;;;;;;;AC5LA,SAAgB,sBACZ,KACA,OACI;CACJ,MAAM,WAAW,WAAW,2BAA2B;CAEvD,gBAAgB;EACZ,IAAI,CAAC,UAAU;EACf,SAAS,SAAS,KAAK,KAAK;EAC5B,aAAa,SAAS,WAAW,GAAG;CACxC,GAAG;EAAC;EAAU;EAAK;CAAK,CAAC;AAC7B"}
|