@genispace/geniapp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +153 -0
  3. package/dist/CrossAppRecordPicker-BXchXcK5.js +624 -0
  4. package/dist/CrossAppRecordPicker-BXchXcK5.js.map +1 -0
  5. package/dist/Page-wHZrMN17.js +24 -0
  6. package/dist/Page-wHZrMN17.js.map +1 -0
  7. package/dist/ai/adopt/AiSuggestionPanel.d.ts +30 -0
  8. package/dist/ai/adopt/BusinessGuidancePanel.d.ts +31 -0
  9. package/dist/ai/adopt/DetailPageAiLayout.d.ts +7 -0
  10. package/dist/ai/adopt/adoptPresets.d.ts +11 -0
  11. package/dist/ai/adopt/guidanceContent.d.ts +27 -0
  12. package/dist/ai/adopt/parseAiSummary.d.ts +7 -0
  13. package/dist/ai/components/AgentJobProgress.d.ts +124 -0
  14. package/dist/ai/components/AsyncCombobox.d.ts +44 -0
  15. package/dist/ai/components/BulkActionBar.d.ts +44 -0
  16. package/dist/ai/components/EntityRef.d.ts +39 -0
  17. package/dist/ai/components/JobProgress.d.ts +64 -0
  18. package/dist/ai/components/ServerDataTable.d.ts +89 -0
  19. package/dist/ai/components/Timeline.d.ts +35 -0
  20. package/dist/ai/components/useInfiniteRows.d.ts +25 -0
  21. package/dist/ai/errors/userFacingError.d.ts +14 -0
  22. package/dist/ai/errors/userFacingError.js +48 -0
  23. package/dist/ai/errors/userFacingError.js.map +1 -0
  24. package/dist/ai/index.d.ts +34 -0
  25. package/dist/ai/integrations/partner/createPartnerRecordPickerHook.d.ts +15 -0
  26. package/dist/ai/integrations/partner/partnerRecordPicker.d.ts +20 -0
  27. package/dist/ai/layout/ModalWithAiLayout.d.ts +11 -0
  28. package/dist/ai/layout/aiUi.d.ts +16 -0
  29. package/dist/ai/layout/layoutConstants.d.ts +19 -0
  30. package/dist/ai/layout/modalSizeForAi.d.ts +5 -0
  31. package/dist/ai/locales/sharedAiCopy.d.ts +6 -0
  32. package/dist/ai/managed-data/DatasourceReadonlyTable.d.ts +11 -0
  33. package/dist/ai/managed-data/createTableClient.d.ts +7 -0
  34. package/dist/ai/managed-data/emitManagedEvent.d.ts +18 -0
  35. package/dist/ai/managed-data/executeManagedDatasource.d.ts +21 -0
  36. package/dist/ai/managed-data/queryManagedDatasource.d.ts +28 -0
  37. package/dist/ai/providers/AppUiProviders.d.ts +6 -0
  38. package/dist/ai/types/app-ai.types.d.ts +29 -0
  39. package/dist/ai/types/index.d.ts +1 -0
  40. package/dist/ai.d.ts +1 -0
  41. package/dist/ai.js +1817 -0
  42. package/dist/ai.js.map +1 -0
  43. package/dist/case-workspace/domain.d.ts +41 -0
  44. package/dist/case-workspace/domain.js +24 -0
  45. package/dist/case-workspace/domain.js.map +1 -0
  46. package/dist/case-workspace/index.d.ts +91 -0
  47. package/dist/case-workspace.d.ts +1 -0
  48. package/dist/case-workspace.js +392 -0
  49. package/dist/case-workspace.js.map +1 -0
  50. package/dist/cn-B6yFEsav.js +9 -0
  51. package/dist/cn-B6yFEsav.js.map +1 -0
  52. package/dist/components/ui/calendar.css +7 -0
  53. package/dist/cookieSettings-D_v3KS02.js +97 -0
  54. package/dist/cookieSettings-D_v3KS02.js.map +1 -0
  55. package/dist/dashboard/index.d.ts +16 -0
  56. package/dist/dashboard/src/ChartFrame.d.ts +18 -0
  57. package/dist/dashboard/src/ChartTooltip.d.ts +38 -0
  58. package/dist/dashboard/src/FilterBar.d.ts +23 -0
  59. package/dist/dashboard/src/KpiStatCard.d.ts +29 -0
  60. package/dist/dashboard/src/StatGrid.d.ts +15 -0
  61. package/dist/dashboard/src/TimeRangePicker.d.ts +14 -0
  62. package/dist/dashboard/src/chart.d.ts +10 -0
  63. package/dist/dashboard/src/format.d.ts +16 -0
  64. package/dist/dashboard/src/links.d.ts +2 -0
  65. package/dist/dashboard/src/useDashboardRange.d.ts +27 -0
  66. package/dist/dashboard.d.ts +1 -0
  67. package/dist/dashboard.js +361 -0
  68. package/dist/dashboard.js.map +1 -0
  69. package/dist/fonts.css +15 -0
  70. package/dist/hooks/access/AppAccessGate.d.ts +20 -0
  71. package/dist/hooks/access/AppAccessNotice.d.ts +8 -0
  72. package/dist/hooks/access/useAppAccess.d.ts +26 -0
  73. package/dist/hooks/config/businessLocale.d.ts +12 -0
  74. package/dist/hooks/config/currencies.d.ts +9 -0
  75. package/dist/hooks/index.d.ts +17 -0
  76. package/dist/hooks/picker/CrossAppRecordPicker.d.ts +37 -0
  77. package/dist/hooks/picker/managedAppPicker.d.ts +21 -0
  78. package/dist/hooks/picker/partnerPayload.d.ts +6 -0
  79. package/dist/hooks/routing/draftEntityId.d.ts +5 -0
  80. package/dist/hooks/routing/useRefetchOnRouteMatch.d.ts +6 -0
  81. package/dist/hooks/shell/resolveApiRoot.d.ts +13 -0
  82. package/dist/hooks/shell/shell.d.ts +4 -0
  83. package/dist/hooks/shell/useGenispacePlatformClient.d.ts +7 -0
  84. package/dist/hooks.d.ts +1 -0
  85. package/dist/hooks.js +42 -0
  86. package/dist/hooks.js.map +1 -0
  87. package/dist/index.d.ts +3 -0
  88. package/dist/index.js +77 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/kit.d.ts +50 -0
  91. package/dist/kit.js +2067 -0
  92. package/dist/kit.js.map +1 -0
  93. package/dist/page.d.ts +1 -0
  94. package/dist/page.js +5 -0
  95. package/dist/page.js.map +1 -0
  96. package/dist/shell-DIHnXIUb.js +6 -0
  97. package/dist/shell-DIHnXIUb.js.map +1 -0
  98. package/dist/shell.d.ts +30 -0
  99. package/dist/shell.js +104 -0
  100. package/dist/shell.js.map +1 -0
  101. package/dist/storage/assetPreview.d.ts +12 -0
  102. package/dist/storage/components/AssetThumbnail.d.ts +15 -0
  103. package/dist/storage/components/CopyStorageLinkButton.d.ts +13 -0
  104. package/dist/storage/components/StorageImage.d.ts +9 -0
  105. package/dist/storage/components/StoragePreviewContent.d.ts +22 -0
  106. package/dist/storage/components/StorageVideo.d.ts +9 -0
  107. package/dist/storage/copyTextToClipboard.d.ts +5 -0
  108. package/dist/storage/hooks/useAuthenticatedStorageBlobs.d.ts +3 -0
  109. package/dist/storage/hooks/useImageThumbnailBlobs.d.ts +4 -0
  110. package/dist/storage/hooks/useShareableStorageLink.d.ts +7 -0
  111. package/dist/storage/index.d.ts +12 -0
  112. package/dist/storage/openUrlInNewTab.d.ts +6 -0
  113. package/dist/storage/platformStorage.d.ts +43 -0
  114. package/dist/storage.d.ts +1 -0
  115. package/dist/storage.js +605 -0
  116. package/dist/storage.js.map +1 -0
  117. package/dist/style.css +1 -0
  118. package/dist/styles/base.css +616 -0
  119. package/dist/styles/reduced-motion.css +14 -0
  120. package/dist/styles/tailwind-preset.js +269 -0
  121. package/dist/task-workspace/domain.d.ts +35 -0
  122. package/dist/task-workspace/domain.js +45 -0
  123. package/dist/task-workspace/domain.js.map +1 -0
  124. package/dist/task-workspace/experience.d.ts +50 -0
  125. package/dist/task-workspace/index.d.ts +172 -0
  126. package/dist/task-workspace.d.ts +1 -0
  127. package/dist/task-workspace.js +626 -0
  128. package/dist/task-workspace.js.map +1 -0
  129. package/dist/ui/components/features/app/AppCheckboxInput.d.ts +9 -0
  130. package/dist/ui/components/features/app/AppConfirmDialog.d.ts +12 -0
  131. package/dist/ui/components/features/app/AppDashboardSkeleton.d.ts +9 -0
  132. package/dist/ui/components/features/app/AppDatePicker.d.ts +69 -0
  133. package/dist/ui/components/features/app/AppModal.d.ts +27 -0
  134. package/dist/ui/components/features/app/AppPageStates.d.ts +17 -0
  135. package/dist/ui/components/features/app/AppSelectInput.d.ts +10 -0
  136. package/dist/ui/components/features/app/AppTemporalInput.d.ts +19 -0
  137. package/dist/ui/components/features/app/Page.d.ts +14 -0
  138. package/dist/ui/components/features/app/QueryErrorAlert.d.ts +7 -0
  139. package/dist/ui/components/features/app/Sidebar.d.ts +47 -0
  140. package/dist/ui/components/features/app/index.d.ts +17 -0
  141. package/dist/ui/components/features/user/UserAvatar.d.ts +17 -0
  142. package/dist/ui/components/features/user/UserDisplay.d.ts +10 -0
  143. package/dist/ui/components/features/user/UserSelect.d.ts +14 -0
  144. package/dist/ui/components/features/user/useUserDirectory.d.ts +13 -0
  145. package/dist/ui/components/features/user/userDirectoryTypes.d.ts +18 -0
  146. package/dist/ui/components/patterns/form-section.d.ts +11 -0
  147. package/dist/ui/components/primitives/feedback/index.d.ts +2 -0
  148. package/dist/ui/components/primitives/feedback/toaster.d.ts +1 -0
  149. package/dist/ui/components/primitives/feedback/use-toast.d.ts +46 -0
  150. package/dist/ui/components/primitives/page-skeleton/ChartAreaSkeleton.d.ts +13 -0
  151. package/dist/ui/components/primitives/page-skeleton/ChartEmptyState.d.ts +14 -0
  152. package/dist/ui/components/primitives/page-skeleton/ComponentSkeletonShell.d.ts +16 -0
  153. package/dist/ui/components/primitives/page-skeleton/ConfigEditorSkeleton.d.ts +5 -0
  154. package/dist/ui/components/primitives/page-skeleton/DetailTabsSkeleton.d.ts +6 -0
  155. package/dist/ui/components/primitives/page-skeleton/EmptyStateBadge.d.ts +13 -0
  156. package/dist/ui/components/primitives/page-skeleton/FormCardSkeleton.d.ts +7 -0
  157. package/dist/ui/components/primitives/page-skeleton/FormFieldSkeleton.d.ts +6 -0
  158. package/dist/ui/components/primitives/page-skeleton/FormPageSkeleton.d.ts +6 -0
  159. package/dist/ui/components/primitives/page-skeleton/GridCardsSkeleton.d.ts +6 -0
  160. package/dist/ui/components/primitives/page-skeleton/ListSkeleton.d.ts +26 -0
  161. package/dist/ui/components/primitives/page-skeleton/PageHeaderSkeleton.d.ts +6 -0
  162. package/dist/ui/components/primitives/page-skeleton/SplitPaneSkeleton.d.ts +4 -0
  163. package/dist/ui/components/primitives/page-skeleton/StatsRowSkeleton.d.ts +5 -0
  164. package/dist/ui/components/primitives/page-skeleton/TableEmptyState.d.ts +27 -0
  165. package/dist/ui/components/primitives/page-skeleton/TablePageSkeleton.d.ts +8 -0
  166. package/dist/ui/components/primitives/page-skeleton/TabsBarSkeleton.d.ts +6 -0
  167. package/dist/ui/components/primitives/page-skeleton/index.d.ts +24 -0
  168. package/dist/ui/components/primitives/page-skeleton/skeletonMetrics.d.ts +9 -0
  169. package/dist/ui/components/primitives/page-skeleton/useVisibleCenter.d.ts +34 -0
  170. package/dist/ui/components/ui/accordion.d.ts +7 -0
  171. package/dist/ui/components/ui/ai-draft-banner.d.ts +21 -0
  172. package/dist/ui/components/ui/alert-dialog.d.ts +48 -0
  173. package/dist/ui/components/ui/alert.d.ts +8 -0
  174. package/dist/ui/components/ui/avatar.d.ts +6 -0
  175. package/dist/ui/components/ui/badge.d.ts +9 -0
  176. package/dist/ui/components/ui/breadcrumb.d.ts +19 -0
  177. package/dist/ui/components/ui/button.d.ts +11 -0
  178. package/dist/ui/components/ui/calendar.d.ts +8 -0
  179. package/dist/ui/components/ui/card.d.ts +8 -0
  180. package/dist/ui/components/ui/chart.d.ts +16 -0
  181. package/dist/ui/components/ui/checkbox.d.ts +4 -0
  182. package/dist/ui/components/ui/collapsible.d.ts +5 -0
  183. package/dist/ui/components/ui/column-config.d.ts +42 -0
  184. package/dist/ui/components/ui/date-picker.d.ts +9 -0
  185. package/dist/ui/components/ui/date-range-filter.d.ts +32 -0
  186. package/dist/ui/components/ui/date-range-picker.d.ts +11 -0
  187. package/dist/ui/components/ui/dialog-input.d.ts +17 -0
  188. package/dist/ui/components/ui/dialog-safe-select.d.ts +13 -0
  189. package/dist/ui/components/ui/dialog.d.ts +25 -0
  190. package/dist/ui/components/ui/dropdown-menu.d.ts +27 -0
  191. package/dist/ui/components/ui/feature-guide.d.ts +43 -0
  192. package/dist/ui/components/ui/form.d.ts +25 -0
  193. package/dist/ui/components/ui/help-tip.d.ts +29 -0
  194. package/dist/ui/components/ui/hint-notice.d.ts +22 -0
  195. package/dist/ui/components/ui/index.d.ts +6 -0
  196. package/dist/ui/components/ui/input.d.ts +3 -0
  197. package/dist/ui/components/ui/label.d.ts +5 -0
  198. package/dist/ui/components/ui/modal-container.d.ts +56 -0
  199. package/dist/ui/components/ui/modal-templates.d.ts +46 -0
  200. package/dist/ui/components/ui/multi-select.d.ts +20 -0
  201. package/dist/ui/components/ui/pagination.d.ts +28 -0
  202. package/dist/ui/components/ui/popover.d.ts +7 -0
  203. package/dist/ui/components/ui/progress.d.ts +7 -0
  204. package/dist/ui/components/ui/radio-button-group.d.ts +18 -0
  205. package/dist/ui/components/ui/radio-group.d.ts +5 -0
  206. package/dist/ui/components/ui/scroll-area.d.ts +5 -0
  207. package/dist/ui/components/ui/select.d.ts +16 -0
  208. package/dist/ui/components/ui/separator.d.ts +7 -0
  209. package/dist/ui/components/ui/sheet.d.ts +25 -0
  210. package/dist/ui/components/ui/sidebar-rail.d.ts +9 -0
  211. package/dist/ui/components/ui/skeleton.d.ts +2 -0
  212. package/dist/ui/components/ui/slider.d.ts +13 -0
  213. package/dist/ui/components/ui/switch.d.ts +4 -0
  214. package/dist/ui/components/ui/table.d.ts +10 -0
  215. package/dist/ui/components/ui/tabs.d.ts +10 -0
  216. package/dist/ui/components/ui/textarea.d.ts +3 -0
  217. package/dist/ui/components/ui/toast.d.ts +21 -0
  218. package/dist/ui/components/ui/toggle-group.d.ts +12 -0
  219. package/dist/ui/components/ui/toggle.d.ts +12 -0
  220. package/dist/ui/components/ui/tooltip.d.ts +7 -0
  221. package/dist/ui/components/ui/typography.d.ts +15 -0
  222. package/dist/ui/components/ui/underline-tabs.d.ts +13 -0
  223. package/dist/ui/components/ui/view-mode-toggle.d.ts +9 -0
  224. package/dist/ui/hooks/useIsMobile.d.ts +16 -0
  225. package/dist/ui/styles/design-tokens.d.ts +189 -0
  226. package/dist/ui/styles/z-index-layers.d.ts +46 -0
  227. package/dist/ui.d.ts +2 -0
  228. package/dist/ui.js +35 -0
  229. package/dist/ui.js.map +1 -0
  230. package/dist/useUserDirectory-CqkyCQoR.js +2377 -0
  231. package/dist/useUserDirectory-CqkyCQoR.js.map +1 -0
  232. package/dist/utils/cookieSettings.d.ts +12 -0
  233. package/dist/utils/data/countryCodes.d.ts +26 -0
  234. package/dist/utils/index.d.ts +18 -0
  235. package/dist/utils/utils/appPath.d.ts +5 -0
  236. package/dist/utils/utils/chunkLoadRecovery.d.ts +7 -0
  237. package/dist/utils/utils/cn.d.ts +3 -0
  238. package/dist/utils/utils/crossApp.d.ts +71 -0
  239. package/dist/utils/utils/debounce.d.ts +1 -0
  240. package/dist/utils/utils/formatUserLabel.d.ts +8 -0
  241. package/dist/utils/utils/formatting.d.ts +18 -0
  242. package/dist/utils/utils/logoutNotification.d.ts +28 -0
  243. package/dist/utils/utils/operatorLocale.d.ts +32 -0
  244. package/dist/utils/utils/routeLocalePrefetch.d.ts +5 -0
  245. package/dist/utils/utils/shellIframeUrl.d.ts +20 -0
  246. package/dist/utils/utils/spaceSettings.d.ts +20 -0
  247. package/dist/utils/utils/sso.d.ts +42 -0
  248. package/dist/utils/utils/throttle.d.ts +1 -0
  249. package/dist/utils/utils/timezones.d.ts +14 -0
  250. package/dist/utils/utils/toDateInputValue.d.ts +5 -0
  251. package/dist/utils/utils/watermark.d.ts +1 -0
  252. package/dist/utils.d.ts +1 -0
  253. package/dist/utils.js +1334 -0
  254. package/dist/utils.js.map +1 -0
  255. package/dist/vite.d.ts +22 -0
  256. package/dist/vite.js +74 -0
  257. package/dist/vite.js.map +1 -0
  258. package/package.json +191 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../src/utils/utils/crossApp.ts","../src/utils/utils/toDateInputValue.ts","../src/utils/utils/formatting.ts","../src/utils/utils/formatUserLabel.ts","../src/utils/utils/debounce.ts","../src/utils/utils/throttle.ts","../src/utils/utils/chunkLoadRecovery.ts","../src/utils/utils/routeLocalePrefetch.ts","../src/utils/utils/sso.ts","../src/utils/utils/logoutNotification.ts","../src/utils/utils/timezones.ts","../src/utils/utils/operatorLocale.ts","../src/utils/data/countryCodes.ts","../src/utils/utils/shellIframeUrl.ts","../src/utils/utils/appPath.ts","../src/utils/utils/spaceSettings.ts"],"sourcesContent":["/**\n * Cross-plane navigation + post-login landing resolution for the\n * Hub / Console / Shell split.\n *\n * Base URLs come from the runtime `window.__APP_CONFIG__` so the same logic\n * works in every app. When a plane's URL is unset (pre-split, single origin),\n * targets resolve to relative paths and navigation stays in-app — i.e. this is\n * behaviour-preserving until the subdomains are provisioned.\n */\n\nexport type AppPlane = 'hub' | 'console' | 'shell' | 'workbench' | 'chat';\n\ninterface RuntimeConfig {\n /** Hub / platform base (login / account / identity), e.g. https://www.genispace.ai. */\n APP_URL?: string;\n /** Console (management) base, e.g. https://www.genispace.ai/console. */\n CONSOLE_URL?: string;\n SHELL_URL?: string;\n WORKBENCH_URL?: string;\n CHAT_URL?: string;\n}\n\nfunction readRuntimeConfig(): RuntimeConfig {\n if (typeof window === 'undefined') return {};\n return ((window as Window & { __APP_CONFIG__?: RuntimeConfig }).__APP_CONFIG__) || {};\n}\n\nfunction trimUrl(value?: string): string {\n return typeof value === 'string' && value.trim() !== '' ? value.trim().replace(/\\/$/, '') : '';\n}\n\n/**\n * Origin for a plane from runtime config. Empty string means \"same origin\"\n * (pre-split), in which case callers should navigate with a relative path.\n */\nexport function getPlaneBaseUrl(plane: AppPlane): string {\n const c = readRuntimeConfig();\n switch (plane) {\n case 'hub':\n return trimUrl(c.APP_URL);\n case 'console':\n return trimUrl(c.CONSOLE_URL);\n case 'shell':\n return trimUrl(c.SHELL_URL);\n case 'workbench':\n return trimUrl(c.WORKBENCH_URL);\n case 'chat':\n return trimUrl(c.CHAT_URL);\n default:\n return '';\n }\n}\n\n/** Build a URL for another plane: absolute when its origin is configured, else a relative path. */\nexport function buildCrossAppUrl(plane: AppPlane, path = ''): string {\n const base = getPlaneBaseUrl(plane);\n const rel = path ? (path.startsWith('/') ? path : `/${path}`) : '';\n if (!base) return rel || '/';\n return `${base}${rel}`;\n}\n\n/**\n * Navigate to another plane. If the target is same-origin (no configured base)\n * and an SPA `navigate` fn is supplied, use it; otherwise do a full navigation.\n */\nexport function crossAppNav(\n plane: AppPlane,\n path = '',\n navigate?: (path: string) => void\n): void {\n const base = getPlaneBaseUrl(plane);\n const url = buildCrossAppUrl(plane, path);\n if (!base && navigate) {\n navigate(url);\n return;\n }\n if (typeof window !== 'undefined') {\n window.location.assign(url);\n }\n}\n\n/** A launchable app (any type) as returned by the backend capability snapshot. */\nexport interface LaunchableApp {\n id: string;\n identifier: string;\n name?: string;\n /** Short description shown on launcher tiles. */\n description?: string | null;\n type?: string;\n /** Pinned version label (null → shown as \"Default\"). */\n version?: string | null;\n /** Backend launcher kind (`BUILTIN` from `/rbac/my-permissions`) or legacy `BUILT_IN`. */\n kind?: 'BUILT_IN' | 'BUILTIN' | 'SHELL' | 'WORKBENCH' | 'CONSOLE' | 'CUSTOM';\n workbenchId?: string | null;\n ingressHost?: string | null;\n}\n\nfunction isWorkbenchApp(app: LaunchableApp): boolean {\n const kind = (app.kind || '').toUpperCase();\n if (kind === 'WORKBENCH') return !!app.workbenchId;\n const t = (app.type || '').toUpperCase();\n return (t === 'WORKBENCH' || t === 'LOWCODE') && !!app.workbenchId;\n}\n\nfunction isBuiltInShellApp(app: LaunchableApp): boolean {\n const kind = (app.kind || '').toUpperCase();\n if (kind === 'BUILT_IN' || kind === 'BUILTIN' || kind === 'SHELL') return true;\n const t = (app.type || '').toUpperCase();\n return t === 'GENIAPP' || t === 'PLATFORM_BUILTIN';\n}\n\n/**\n * Resolve the open URL for a launchable app of any type, mirroring the\n * console's applicationOpenHref rules:\n * - workbench -> WORKBENCH_URL/workbench/{workbenchId}\n * - built-in -> SHELL_URL/{identifier}\n * - custom -> https://{ingressHost} (RUNNING deployment)\n * Returns null when the app is not currently openable.\n */\nexport function getAppLaunchUrl(app: LaunchableApp): string | null {\n if (isWorkbenchApp(app)) {\n const base = getPlaneBaseUrl('workbench');\n if (base) return `${base}/workbench/${app.workbenchId}`;\n return null;\n }\n if (isBuiltInShellApp(app)) {\n const base = getPlaneBaseUrl('shell');\n if (base) return `${base}/${app.identifier}`;\n return null;\n }\n if (app.ingressHost) {\n return `https://${app.ingressHost}`;\n }\n return null;\n}\n\nexport interface ResolveLandingInput {\n canAccessConsole: boolean;\n accessibleApps: LaunchableApp[];\n /** Server-authoritative last surface: 'console' | 'app' | 'launcher'. */\n lastSurface?: string | null;\n lastAppId?: string | null;\n}\n\nexport type LandingTarget =\n | { kind: 'console'; path: string }\n | { kind: 'app'; app: LaunchableApp }\n | { kind: 'launcher' }\n | { kind: 'home' };\n\n/**\n * Decide where a user lands after login or after switching space. Shared by the\n * Hub and Console so behaviour is identical across surfaces. The caller is\n * responsible for validating that a remembered target is still accessible — the\n * accessibleApps list passed in is already the authoritative current set.\n */\nexport function resolveLanding(input: ResolveLandingInput): LandingTarget {\n const apps = Array.isArray(input.accessibleApps) ? input.accessibleApps : [];\n\n // 1. Console-entitled and the last surface was the console.\n if (input.canAccessConsole && input.lastSurface === 'console') {\n return { kind: 'console', path: '/dashboard' };\n }\n // 2. A remembered last app that is still accessible.\n if (input.lastAppId) {\n const last = apps.find((a) => a.id === input.lastAppId);\n if (last) return { kind: 'app', app: last };\n }\n // 3. Exactly one app and no console -> open it directly.\n if (apps.length === 1 && !input.canAccessConsole) {\n return { kind: 'app', app: apps[0] };\n }\n // 4. Has apps -> the launcher (shows app tiles + console tile if entitled).\n if (apps.length > 0) {\n return { kind: 'launcher' };\n }\n // 5. Console-entitled with no apps -> the console.\n if (input.canAccessConsole) {\n return { kind: 'console', path: '/dashboard' };\n }\n // 6. Nothing actionable -> the Hub home / personal space.\n return { kind: 'home' };\n}\n","function dateToCalendarYmd(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\n/**\n * Normalize API/DB date values to YYYY-MM-DD for HTML date inputs and AppDatePicker.\n * Uses local calendar components (not UTC) so PG DATE / node-pg values stay correct in all timezones.\n */\nexport function toDateInputValue(value: string | Date | null | undefined): string {\n if (value == null || value === '') return '';\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? '' : dateToCalendarYmd(value);\n }\n const s = String(value).trim();\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return s;\n // ISO datetimes must use local calendar parts — never slice the UTC date prefix.\n const d = new Date(s);\n if (!Number.isNaN(d.getTime())) return dateToCalendarYmd(d);\n return '';\n}\n","import { getTimeZone } from '../cookieSettings';\nimport { toDateInputValue } from './toDateInputValue';\n\nfunction getLocale(locale?: string): string {\n if (locale) return locale;\n\n if (typeof navigator !== 'undefined' && navigator.language) {\n return navigator.language;\n }\n\n return 'en-US';\n}\n\nexport function formatDate(date: string | Date, locale?: string) {\n if (!date) return '-';\n const d = new Date(date);\n const currentLocale = getLocale(locale);\n return d.toLocaleString(currentLocale, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n });\n}\n\nexport function formatNumber(num: number, locale?: string) {\n if (!num) return '0';\n const currentLocale = getLocale(locale);\n return num.toLocaleString(currentLocale);\n}\n\nexport function formatBytes(bytes: number, decimals: number = 2, t?: (key: string, defaultValue: string) => string) {\n if (bytes === 0) {\n const unit = t ? t('common.formatting.bytes', 'Bytes') : 'Bytes';\n return `0 ${unit}`;\n }\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const i = Math.max(0, Math.floor(Math.log(bytes) / Math.log(k)));\n const value = parseFloat((bytes / Math.pow(k, i)).toFixed(dm));\n const unit = t ? t(`common.formatting.${sizes[i].toLowerCase()}`, sizes[i]) : sizes[i];\n return `${value} ${unit}`;\n}\n\nexport function formatLargeNumber(num: number, precision: number = 1, locale?: string): string {\n if (!num || num === 0) return '0';\n\n const absNum = Math.abs(num);\n const sign = num < 0 ? '-' : '';\n const currentLocale = getLocale(locale);\n\n if (absNum < 1000) {\n return sign + absNum.toLocaleString(currentLocale);\n }\n\n const units = [\n { value: 1e12, symbol: 'T' }, \n { value: 1e9, symbol: 'B' }, \n { value: 1e6, symbol: 'M' }, \n { value: 1e3, symbol: 'K' } \n ];\n\n for (const unit of units) {\n if (absNum >= unit.value) {\n const formatted = (absNum / unit.value).toFixed(precision);\n\n const cleaned = formatted.replace(/\\.?0+$/, '');\n return sign + cleaned + unit.symbol;\n }\n }\n\n return sign + absNum.toLocaleString(currentLocale);\n}\n\nexport function formatTokens(tokens: number, showUnit: boolean = true, locale?: string): string {\n void showUnit;\n\n if (!tokens && tokens !== 0) return '0';\n\n const formatted = formatNumber(tokens, locale);\n\n return formatted;\n}\n\nexport const formatDuration = (seconds: number, t?: (key: string, defaultValue: string) => string): string => {\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = (seconds % 60).toFixed(2);\n const minuteUnit = t ? t('common.formatting.minute_short', 'm') : 'm';\n const secondUnit = t ? t('common.formatting.second_short', 's') : 's';\n return `${minutes}${minuteUnit} ${remainingSeconds}${secondUnit}`;\n};\n\nexport const formatDurationFromMs = (ms: number, t?: (key: string, defaultValue: string) => string): string => {\n const seconds = Math.floor(ms / 1000);\n return formatDuration(seconds, t);\n};\n\nexport const formatDateTime = (dateString: string | null, locale?: string): string => {\n if (!dateString) return '-';\n const date = new Date(dateString);\n const currentLocale = getLocale(locale);\n return date.toLocaleString(currentLocale);\n};\n\n/**\n * Format a date-only value (YYYY-MM-DD or ISO datetime) in the platform timezone.\n * Uses noon-UTC to avoid day-boundary shifts for date-only strings.\n */\nexport function formatLocalDate(isoDate: string | null | undefined, locale?: string): string {\n const ymd = toDateInputValue(isoDate);\n if (!ymd) return '—';\n try {\n const tz = getTimeZone();\n const currentLocale = getLocale(locale);\n return new Intl.DateTimeFormat(currentLocale, {\n timeZone: tz,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).format(new Date(`${ymd}T12:00:00Z`));\n } catch {\n return ymd;\n }\n}\n\n/**\n * Format a datetime value (ISO 8601) in the platform timezone, showing date + time.\n */\nexport function formatLocalDateTime(isoDatetime: string | null | undefined, locale?: string): string {\n if (!isoDatetime) return '—';\n try {\n const tz = getTimeZone();\n const currentLocale = getLocale(locale);\n return new Intl.DateTimeFormat(currentLocale, {\n timeZone: tz,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n }).format(new Date(isoDatetime));\n } catch {\n return isoDatetime.slice(0, 10);\n }\n}\n\nexport const formatRelativeTime = (dateString: string, t?: (key: string, defaultValue: string, options?: unknown) => string): string => {\n try {\n const date = new Date(dateString);\n const now = new Date();\n const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);\n\n if (diffInSeconds < 60) {\n return t ? t('common.time.just_now', 'Just now') : 'Just now';\n } else if (diffInSeconds < 3600) {\n const minutes = Math.floor(diffInSeconds / 60);\n return t \n ? t('common.time.minutes_ago', '{{minutes}} minutes ago', { minutes })\n : `${minutes} minutes ago`;\n } else if (diffInSeconds < 86400) {\n const hours = Math.floor(diffInSeconds / 3600);\n return t \n ? t('common.time.hours_ago', '{{hours}} hours ago', { hours })\n : `${hours} hours ago`;\n } else if (diffInSeconds < 2592000) {\n const days = Math.floor(diffInSeconds / 86400);\n return t \n ? t('common.time.days_ago', '{{days}} days ago', { days })\n : `${days} days ago`;\n } else if (diffInSeconds < 31536000) {\n const months = Math.floor(diffInSeconds / 2592000);\n return t \n ? t('common.time.months_ago', '{{months}} months ago', { months })\n : `${months} months ago`;\n } else {\n const years = Math.floor(diffInSeconds / 31536000);\n return t \n ? t('common.time.years_ago', '{{years}} years ago', { years })\n : `${years} years ago`;\n }\n } catch (error) {\n console.warn('Time formatting failed:', error);\n return t ? t('common.time.unknown', 'Unknown time') : 'Unknown time';\n }\n};\n\n","export type UserLabelSource = {\n name?: string | null;\n email?: string | null;\n};\n\n/**\n * Display label for a platform user: name, then email, then shortened id.\n */\nexport function formatUserLabel(\n profile?: UserLabelSource | null,\n userId?: string | null,\n emptyLabel = '—'\n): string {\n const name = profile?.name?.trim();\n if (name) return name;\n const email = profile?.email?.trim();\n if (email) return email;\n const id = userId?.trim();\n if (id) {\n if (id.length <= 12) return id;\n return `${id.slice(0, 8)}…`;\n }\n return emptyLabel;\n}\n","export function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: NodeJS.Timeout;\n\n return function (this: unknown, ...args: Parameters<T>) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func.apply(this, args), delay);\n };\n}\n\n","export function throttle<T extends (...args: unknown[]) => unknown>(\n func: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let lastCallTime = 0;\n let timeoutId: NodeJS.Timeout | null = null;\n\n return function (this: unknown, ...args: Parameters<T>) {\n const now = Date.now();\n const timeSinceLastCall = now - lastCallTime;\n\n if (timeSinceLastCall >= delay) {\n\n lastCallTime = now;\n func.apply(this, args);\n } else {\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n lastCallTime = Date.now();\n func.apply(this, args);\n timeoutId = null;\n }, delay - timeSinceLastCall);\n }\n };\n}\n\n","const DEFAULT_STORAGE_KEY = 'genispace:chunk_reload_once';\n\nfunction storageKey(options?: { storageKey?: string }): string {\n return options?.storageKey ?? DEFAULT_STORAGE_KEY;\n}\n\nexport function isChunkLoadError(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const e = err as { name?: string; message?: string };\n if (e.name === 'ChunkLoadError') return true;\n const msg = String(e.message ?? '');\n return (\n msg.includes('Failed to fetch dynamically imported module') ||\n msg.includes('Importing a module script failed') ||\n msg.includes('error loading dynamically imported module') ||\n msg.includes('Loading chunk') ||\n msg.includes('dynamically imported module')\n );\n}\n\nfunction isLikelyViteBundleScript(src: string): boolean {\n if (!src) return false;\n try {\n const u = new URL(src, typeof window !== 'undefined' ? window.location.origin : 'http://localhost');\n return u.pathname.includes('/static/');\n } catch {\n return src.includes('/static/');\n }\n}\n\nfunction tryReloadOnce(key: string): boolean {\n if (typeof window === 'undefined' || typeof sessionStorage === 'undefined') {\n return false;\n }\n if (sessionStorage.getItem(key)) {\n return false;\n }\n sessionStorage.setItem(key, '1');\n window.location.reload();\n return true;\n}\n\nexport function reloadOnceIfChunkError(\n error: unknown,\n options?: { storageKey?: string },\n): boolean {\n if (!isChunkLoadError(error)) {\n return false;\n }\n return tryReloadOnce(storageKey(options));\n}\n\nlet recoveryInstalled = false;\n\nexport function setupChunkLoadRecovery(options?: { storageKey?: string }): void {\n if (typeof window === 'undefined' || recoveryInstalled) {\n return;\n }\n recoveryInstalled = true;\n const key = storageKey(options);\n\n window.addEventListener('unhandledrejection', (event) => {\n if (!isChunkLoadError(event.reason)) return;\n event.preventDefault();\n tryReloadOnce(key);\n });\n\n window.addEventListener(\n 'error',\n (event) => {\n const t = event.target;\n if (!(t instanceof HTMLScriptElement) || !t.src) return;\n if (!isLikelyViteBundleScript(t.src)) return;\n tryReloadOnce(key);\n },\n true,\n );\n}\n","export interface RouteLocaleRule {\n\n prefix: string;\n namespaces: readonly string[];\n}\n\nfunction normalizePathname(pathname: string): string {\n if (!pathname || pathname === '') return '/';\n return pathname.startsWith('/') ? pathname : `/${pathname}`;\n}\n\nfunction ruleMatches(pathname: string, prefix: string): boolean {\n const p = normalizePathname(pathname);\n if (prefix === '/') {\n return p === '/' || p === '';\n }\n const pre = prefix.endsWith('/') ? prefix.slice(0, -1) : prefix;\n if (!pre.startsWith('/')) {\n return false;\n }\n return p === pre || p.startsWith(`${pre}/`);\n}\n\nexport function namespacesForPath(\n pathname: string,\n rules: readonly RouteLocaleRule[],\n): string[] {\n const sorted = [...rules].sort((a, b) => b.prefix.length - a.prefix.length);\n for (const rule of sorted) {\n if (ruleMatches(pathname, rule.prefix)) {\n return [...rule.namespaces];\n }\n }\n return [];\n}\n","const OAUTH_REDIRECT_URI_STORAGE_KEY = 'genispace_sso_oauth_redirect_uri';\n\nexport interface ApplicationConfig {\n client_id: string;\n app_type: string;\n app_name: string;\n redirect_uris: string[];\n scope: string;\n is_platform_core: boolean;\n}\n\ninterface ApiResponse<T> {\n success: boolean;\n data?: T;\n message?: string;\n}\n\nexport interface SSOCallbackResult {\n token: string;\n refreshToken?: string;\n expiresIn?: number;\n user: {\n id: string;\n email: string;\n name: string;\n emailVerified?: boolean;\n };\n}\n\nexport interface StateData {\n nonce: string;\n returnPath: string;\n timestamp: number;\n}\n\nexport interface SSOClientConfig {\n\n getConfig: () => {\n API_BASE_URL: string;\n APP_URL?: string;\n };\n\n appType: string;\n\n defaultReturnPath?: string;\n\n identifyApp?: () => string;\n\n getOAuthRedirectUri?: () => string | undefined | Promise<string | undefined>;\n\n openLoginUrl?: (url: string) => void | Promise<void>;\n}\n\nexport interface SSOClient {\n startLogin: (returnPath?: string) => Promise<void>;\n handleCallback: () => Promise<SSOCallbackResult>;\n parseState: (state: string) => StateData | null;\n clearCache: () => void;\n}\n\nexport function createSSOClient(config: SSOClientConfig): SSOClient {\n const {\n getConfig: getConfigFn,\n appType,\n defaultReturnPath = '/',\n identifyApp = () => {\n const hostname = window.location.hostname;\n if (hostname.includes('ebook')) return 'ebook';\n if (hostname.includes('workbench')) return 'workbench';\n return 'app';\n },\n getOAuthRedirectUri,\n openLoginUrl,\n } = config;\n\n let activeOAuthRedirectUri = `${window.location.origin}/sso/callback`;\n try {\n const stored = sessionStorage.getItem(OAUTH_REDIRECT_URI_STORAGE_KEY);\n if (stored) activeOAuthRedirectUri = stored;\n } catch {\n /* private mode / no sessionStorage */\n }\n const SCOPE = 'openid profile email';\n\n let appConfigCache: ApplicationConfig | null = null;\n\n let pendingRequest: Promise<ApplicationConfig> | null = null;\n\n async function getApplicationConfig(): Promise<ApplicationConfig> {\n\n if (appConfigCache) {\n return appConfigCache;\n }\n\n if (pendingRequest) {\n return pendingRequest;\n }\n\n const currentDomain = window.location.origin;\n const apiBaseUrl = getConfigFn().API_BASE_URL;\n\n pendingRequest = (async () => {\n try {\n const response = await fetch(\n `${apiBaseUrl}/sso/applications/by-domain?domain=${encodeURIComponent(currentDomain)}`\n );\n\n if (!response.ok) {\n\n if (response.status === 429) {\n console.warn('[SSO] Too many requests; waiting before retry...');\n await new Promise(resolve => setTimeout(resolve, 1000));\n\n pendingRequest = null;\n return getApplicationConfig();\n }\n throw new Error(`Failed to get application config: ${response.status}`);\n }\n\n const result = await response.json() as ApiResponse<ApplicationConfig>;\n\n if (!result.success || !result.data) {\n throw new Error('Invalid response from application config endpoint');\n }\n\n const config: ApplicationConfig = result.data;\n appConfigCache = config;\n return config;\n } catch (error) {\n console.error('Failed to get application config:', error);\n throw new Error('Failed to get application config. Please check your network connection.');\n } finally {\n\n pendingRequest = null;\n }\n })();\n\n return pendingRequest;\n }\n\n async function startLogin(returnPath?: string): Promise<void> {\n try {\n const state = generateState(returnPath);\n const appConfig = await getApplicationConfig();\n const clientId = appConfig.client_id;\n\n // The OAuth authorize page (`/sso/login`) is served by the Hub (the IdP),\n // i.e. the main site (www.*). `APP_URL` is the Hub/platform base.\n const runtimeHubUrl =\n (typeof window !== 'undefined' &&\n (window as Window & { __APP_CONFIG__?: { APP_URL?: string } }).__APP_CONFIG__?.APP_URL) ||\n '';\n const appUrl = runtimeHubUrl || getConfigFn().APP_URL || 'http://localhost:5018';\n\n const defaultRedirect = `${window.location.origin}/sso/callback`;\n let oauthRedirectUri = defaultRedirect;\n try {\n const override = await getOAuthRedirectUri?.();\n if (override) oauthRedirectUri = override;\n } catch (e) {\n console.warn('[SSO] getOAuthRedirectUri failed; using default redirect_uri', e);\n }\n activeOAuthRedirectUri = oauthRedirectUri;\n try {\n sessionStorage.setItem(OAUTH_REDIRECT_URI_STORAGE_KEY, oauthRedirectUri);\n } catch {\n /* pass */\n }\n\n const appAuthUrl = new URL(`${appUrl}/sso/login`);\n appAuthUrl.searchParams.set('client_id', clientId);\n appAuthUrl.searchParams.set('redirect_uri', oauthRedirectUri);\n appAuthUrl.searchParams.set('response_type', 'code');\n appAuthUrl.searchParams.set('scope', SCOPE);\n appAuthUrl.searchParams.set('state', state);\n\n // Platform core (built-in) apps use silent auth when Hub session exists.\n appAuthUrl.searchParams.set('prompt', appConfig.is_platform_core ? 'none' : 'consent');\n\n const from = identifyApp();\n appAuthUrl.searchParams.set('from', from);\n\n const loginUrl = appAuthUrl.toString();\n\n if (openLoginUrl) {\n await Promise.resolve(openLoginUrl(loginUrl));\n } else {\n window.location.href = loginUrl;\n }\n } catch (error) {\n console.error('Failed to start SSO login:', error);\n throw error;\n }\n }\n\n async function handleCallback(): Promise<SSOCallbackResult> {\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n const error = urlParams.get('error');\n\n if (error) {\n console.error('[SSO] handleCallback: OAuth error', error);\n throw new Error(`OAuth error: ${error}`);\n }\n\n if (!code) {\n console.error('[SSO] handleCallback: authorization code not found');\n throw new Error('Authorization code not found');\n }\n\n try {\n\n const appConfig = await getApplicationConfig();\n const appTypeValue = appConfig.app_type || appType;\n\n const apiBaseUrl = getConfigFn().API_BASE_URL;\n const callbackUrl = `${apiBaseUrl}/sso/platform/${appTypeValue}/callback`;\n\n const response = await fetch(callbackUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n code,\n redirectUri: activeOAuthRedirectUri,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error('[SSO] handleCallback: callback proxy failed', {\n status: response.status,\n statusText: response.statusText,\n errorText\n });\n\n let errorData;\n try {\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { message: errorText || 'Unknown error' };\n }\n\n throw new Error(errorData.message || `Token exchange failed: ${response.status}`);\n }\n\n const data = await response.json() as ApiResponse<SSOCallbackResult>;\n\n if (!data.success || !data.data) {\n console.error('[SSO] handleCallback: invalid response data', data);\n throw new Error(data.message || 'Invalid response from callback endpoint');\n }\n\n try {\n sessionStorage.removeItem(OAUTH_REDIRECT_URI_STORAGE_KEY);\n } catch {\n /* pass */\n }\n return {\n token: data.data.token,\n refreshToken: data.data.refreshToken,\n expiresIn: data.data.expiresIn,\n user: data.data.user\n };\n } catch (error) {\n console.error('[SSO] handleCallback: error while handling callback', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n throw error;\n }\n }\n\n function generateState(returnPath?: string): string {\n const state: StateData = {\n nonce: Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15),\n returnPath:\n returnPath || defaultReturnPath || window.location.pathname + window.location.search,\n timestamp: Date.now()\n };\n\n sessionStorage.setItem('oauth_state', JSON.stringify(state));\n\n return btoa(JSON.stringify(state));\n }\n\n function parseState(state: string): StateData | null {\n try {\n const decoded = JSON.parse(atob(state));\n\n const storedState = sessionStorage.getItem('oauth_state');\n if (storedState) {\n const stored = JSON.parse(storedState);\n if (stored.nonce === decoded.nonce) {\n\n sessionStorage.removeItem('oauth_state');\n return decoded;\n }\n }\n\n return decoded;\n } catch (error) {\n console.error('Failed to parse state:', error);\n return null;\n }\n }\n\n function clearCache(): void {\n appConfigCache = null;\n try {\n sessionStorage.removeItem(OAUTH_REDIRECT_URI_STORAGE_KEY);\n } catch {\n /* pass */\n }\n }\n\n return {\n startLogin,\n handleCallback,\n parseState,\n clearCache\n };\n}\n\n","/**\n * Front-channel logout across the multi-origin app family (Hub / Console /\n * Workbench / Chat / Ebook / Partner / Shell).\n *\n * Auth tokens live in each origin's own localStorage, so signing out (or\n * switching accounts) in one app cannot directly clear the others. Every app\n * exposes a `/logout-notification` receiver page that wipes its origin's auth\n * keys; on sign-out the initiating app loads those receivers in hidden iframes\n * and waits for their `logout-completed` acks (bounded by a timeout).\n *\n * This relies on all apps being served from the same site (eTLD+1) so browser\n * third-party storage partitioning does not isolate the iframes' localStorage.\n */\n\nexport const LOGOUT_NOTIFICATION_PATH = '/logout-notification';\nexport const LOGOUT_COMPLETED_MESSAGE = 'logout-completed';\n\ninterface LogoutRuntimeConfig {\n APP_URL?: string;\n CONSOLE_URL?: string;\n WORKBENCH_URL?: string;\n CHAT_URL?: string;\n EBOOK_URL?: string;\n PARTNER_URL?: string;\n SHELL_URL?: string;\n}\n\nfunction readRuntimeConfig(): LogoutRuntimeConfig {\n if (typeof window === 'undefined') return {};\n return (window as Window & { __APP_CONFIG__?: LogoutRuntimeConfig }).__APP_CONFIG__ || {};\n}\n\n/**\n * Receiver URLs for every configured app base except the current origin\n * (the caller clears its own storage directly). Bases sharing an origin are\n * deduped (e.g. Hub and its `/console` mount) — one receiver per origin.\n */\nexport function collectLogoutNotificationUrls(): string[] {\n if (typeof window === 'undefined') return [];\n const c = readRuntimeConfig();\n const candidates = [\n c.APP_URL,\n c.CONSOLE_URL,\n c.WORKBENCH_URL,\n c.CHAT_URL,\n c.EBOOK_URL,\n c.PARTNER_URL,\n c.SHELL_URL,\n ];\n const seenOrigins = new Set<string>([window.location.origin]);\n const urls: string[] = [];\n for (const raw of candidates) {\n const base = typeof raw === 'string' ? raw.trim().replace(/\\/+$/, '') : '';\n if (!base) continue;\n let origin = '';\n try {\n origin = new URL(base, window.location.origin).origin;\n } catch {\n continue;\n }\n if (seenOrigins.has(origin)) continue;\n seenOrigins.add(origin);\n urls.push(`${base}${LOGOUT_NOTIFICATION_PATH}`);\n }\n return urls;\n}\n\n/**\n * True while a local sign-out broadcast is running in this window. Auth\n * watchers (e.g. RequireAuth's logged-out restart) must not navigate away\n * while this is set: the local token is already cleared but the identity\n * provider's origin may not be yet — redirecting to SSO at that moment would\n * silently log the user straight back in and abort the iframe broadcast.\n */\nlet broadcastInProgress = false;\n\nexport function isLogoutBroadcastInProgress(): boolean {\n return broadcastInProgress;\n}\n\n/**\n * Load each receiver in a hidden iframe and resolve once every origin has\n * acked with `logout-completed`, or after `timeoutMs` — never rejects, so it\n * is safe to await inside sign-out flows before redirecting.\n */\nexport function broadcastLogoutNotifications(\n urls: string[] = collectLogoutNotificationUrls(),\n timeoutMs = 2500\n): Promise<void> {\n if (typeof window === 'undefined' || typeof document === 'undefined' || urls.length === 0) {\n return Promise.resolve();\n }\n broadcastInProgress = true;\n return new Promise((resolve) => {\n const iframes: HTMLIFrameElement[] = [];\n const pendingOrigins = new Set(\n urls\n .map((u) => {\n try {\n return new URL(u, window.location.origin).origin;\n } catch {\n return '';\n }\n })\n .filter(Boolean)\n );\n let timer = 0;\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n broadcastInProgress = false;\n window.removeEventListener('message', onMessage);\n window.clearTimeout(timer);\n for (const frame of iframes) frame.parentNode?.removeChild(frame);\n resolve();\n };\n const onMessage = (ev: MessageEvent) => {\n if (ev.data !== LOGOUT_COMPLETED_MESSAGE) return;\n pendingOrigins.delete(ev.origin);\n if (pendingOrigins.size === 0) finish();\n };\n window.addEventListener('message', onMessage);\n timer = window.setTimeout(finish, timeoutMs);\n for (const url of urls) {\n const iframe = document.createElement('iframe');\n iframe.style.display = 'none';\n iframe.setAttribute('aria-hidden', 'true');\n iframe.src = url;\n document.body.appendChild(iframe);\n iframes.push(iframe);\n }\n });\n}\n","/**\n * IANA time zone helpers using Intl (supportedValuesOf, DisplayNames).\n * Labels follow the given BCP 47 locale (e.g. en-US, zh-CN).\n */\n\n/** Used only when Intl.supportedValuesOf('timeZone') is missing (legacy runtimes). */\nconst FALLBACK_IANA_IDS: readonly string[] = [\n 'UTC',\n 'Etc/UTC',\n // Asia / Oceania\n 'Asia/Bangkok',\n 'Asia/Dubai',\n 'Asia/Ho_Chi_Minh',\n 'Asia/Hong_Kong',\n 'Asia/Jakarta',\n 'Asia/Jerusalem',\n 'Asia/Kolkata',\n 'Asia/Kuala_Lumpur',\n 'Asia/Manila',\n 'Asia/Riyadh',\n 'Asia/Seoul',\n 'Asia/Shanghai',\n 'Asia/Singapore',\n 'Asia/Taipei',\n 'Asia/Tokyo',\n 'Australia/Melbourne',\n 'Australia/Sydney',\n 'Pacific/Auckland',\n 'Pacific/Honolulu',\n // Europe\n 'Europe/Amsterdam',\n 'Europe/Berlin',\n 'Europe/Dublin',\n 'Europe/Istanbul',\n 'Europe/London',\n 'Europe/Madrid',\n 'Europe/Moscow',\n 'Europe/Paris',\n 'Europe/Rome',\n 'Europe/Warsaw',\n 'Europe/Zurich',\n // Africa\n 'Africa/Cairo',\n 'Africa/Johannesburg',\n 'Africa/Lagos',\n 'Africa/Nairobi',\n // Americas\n 'America/Anchorage',\n 'America/Argentina/Buenos_Aires',\n 'America/Chicago',\n 'America/Denver',\n 'America/Lima',\n 'America/Los_Angeles',\n 'America/Mexico_City',\n 'America/New_York',\n 'America/Phoenix',\n 'America/Santiago',\n 'America/Sao_Paulo',\n 'America/Toronto',\n 'America/Vancouver',\n];\n\nfunction trySupportedTimeZones(): string[] | null {\n try {\n const intl = Intl as unknown as { supportedValuesOf?: (key: string) => string[] };\n if (typeof intl.supportedValuesOf === 'function') {\n return intl.supportedValuesOf('timeZone');\n }\n } catch {\n /* ignore */\n }\n return null;\n}\n\n/** All IANA zone IDs available in the runtime, sorted lexicographically. */\nexport function getAllIanaTimeZoneIds(): string[] {\n const fromIntl = trySupportedTimeZones();\n if (fromIntl?.length) {\n return [...fromIntl].sort((a, b) => a.localeCompare(b));\n }\n return [...FALLBACK_IANA_IDS].sort((a, b) => a.localeCompare(b));\n}\n\nfunction getGmtOffsetShort(timeZone: string, date: Date): string {\n try {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n timeZoneName: 'shortOffset',\n }).formatToParts(date);\n return parts.find((p) => p.type === 'timeZoneName')?.value ?? '';\n } catch {\n return '';\n }\n}\n\nfunction getTimeZoneDisplayName(timeZoneId: string, locale: string): string {\n try {\n const dn = new Intl.DisplayNames([locale], {\n type: 'timeZone' as Intl.DisplayNamesOptions['type'],\n });\n const name = dn.of(timeZoneId);\n if (name) return name;\n } catch {\n /* ignore */\n }\n return timeZoneId;\n}\n\nexport type TimeZoneSelectOption = { value: string; label: string };\n\n/**\n * Build sorted options for a select: localized name + GMT offset (winter reference date).\n */\nexport function buildTimeZoneSelectOptions(locale: string, refDate = new Date()): TimeZoneSelectOption[] {\n const ids = getAllIanaTimeZoneIds();\n const options: TimeZoneSelectOption[] = ids.map((id) => {\n const display = getTimeZoneDisplayName(id, locale);\n const off = getGmtOffsetShort(id, refDate);\n const label = off ? `${display} (${off})` : display;\n return { value: id, label };\n });\n options.sort((a, b) => a.label.localeCompare(b.label, locale, { sensitivity: 'base' }));\n return options;\n}\n","export type OperatorLang = 'en' | 'zh';\n\nexport function normalizeOperatorLang(language: string | undefined): OperatorLang {\n const raw = (language || 'en').split('-')[0].toLowerCase();\n return raw.startsWith('zh') ? 'zh' : 'en';\n}\n\ntype SchemaNode = Record<string, unknown>;\n\nfunction isObject(v: unknown): v is SchemaNode {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nexport function mergeSchemaLocale(base: unknown, patch: unknown): unknown {\n if (!isObject(base) || !isObject(patch)) {\n return base;\n }\n const out: SchemaNode = { ...base };\n if (patch.description !== undefined) {\n out.description = patch.description;\n }\n if (patch.title !== undefined) {\n out.title = patch.title;\n }\n if (patch.properties && isObject(base.properties)) {\n out.properties = { ...base.properties } as SchemaNode;\n const propsOut = out.properties as SchemaNode;\n const pProps = patch.properties;\n if (isObject(pProps)) {\n for (const [key, pPatch] of Object.entries(pProps)) {\n if (propsOut[key] && isObject(pPatch)) {\n propsOut[key] = mergeSchemaLocale(propsOut[key], pPatch) as unknown;\n }\n }\n }\n }\n if (patch.items && base.items !== undefined) {\n if (Array.isArray(base.items) && Array.isArray(patch.items)) {\n out.items = base.items.map((sub, i) => {\n const pEl = (patch.items as unknown[])[i];\n return pEl && isObject(pEl) ? mergeSchemaLocale(sub, pEl) : sub;\n });\n } else {\n out.items = mergeSchemaLocale(base.items, patch.items);\n }\n }\n for (const key of ['oneOf', 'anyOf', 'allOf'] as const) {\n const bArr = base[key];\n const pArr = patch[key];\n if (Array.isArray(bArr) && Array.isArray(pArr) && pArr.length) {\n out[key] = bArr.map((sub, i) => {\n const pEl = pArr[i];\n return pEl && isObject(pEl) ? mergeSchemaLocale(sub, pEl) : sub;\n });\n }\n }\n if (isObject(base.not) && isObject(patch.not)) {\n out.not = mergeSchemaLocale(base.not, patch.not);\n }\n if (\n isObject(base.additionalProperties) &&\n isObject(patch.additionalProperties)\n ) {\n out.additionalProperties = mergeSchemaLocale(\n base.additionalProperties,\n patch.additionalProperties\n );\n }\n return out;\n}\n\nfunction patchSchemaNodeHasContent(node: unknown): boolean {\n if (!isObject(node)) return false;\n if (node.title !== undefined || node.description !== undefined) return true;\n if (isObject(node.properties)) {\n for (const k of Object.keys(node.properties)) {\n if (patchSchemaNodeHasContent(node.properties[k])) return true;\n }\n }\n if (Array.isArray(node.items)) {\n for (const el of node.items) {\n if (el !== null && el !== undefined && patchSchemaNodeHasContent(el)) return true;\n }\n }\n for (const key of ['oneOf', 'anyOf', 'allOf'] as const) {\n const arr = node[key];\n if (Array.isArray(arr)) {\n for (const el of arr) {\n if (el !== null && el !== undefined && patchSchemaNodeHasContent(el)) return true;\n }\n }\n }\n if (isObject(node.not) && patchSchemaNodeHasContent(node.not)) return true;\n if (isObject(node.additionalProperties) && patchSchemaNodeHasContent(node.additionalProperties))\n return true;\n return false;\n}\n\nfunction pickLocaleTitle(canonical: SchemaNode, patch: SchemaNode): string | undefined {\n const ct = typeof canonical.title === 'string' ? canonical.title : undefined;\n const pt = patch.title !== undefined && typeof patch.title === 'string' ? patch.title : undefined;\n if (pt !== undefined && pt.length > 0) return pt;\n if (ct !== undefined && ct.length > 0) return ct;\n return undefined;\n}\n\nfunction pickLocaleDescription(canonical: SchemaNode, patch: SchemaNode): unknown {\n const cd = canonical.description;\n const pd = patch.description;\n if (pd !== undefined && pd !== null && String(pd).length > 0) return pd;\n if (cd !== undefined && cd !== null && String(cd).length > 0) return cd;\n return undefined;\n}\n\nexport function syncSchemaLocalePatchWithCanonical(\n canonical: unknown,\n existingPatch: unknown\n): Record<string, unknown> | undefined {\n if (!isObject(canonical)) return undefined;\n const p = isObject(existingPatch) ? existingPatch : {};\n const out: SchemaNode = {};\n\n const t = pickLocaleTitle(canonical, p);\n if (t !== undefined) out.title = t;\n const d = pickLocaleDescription(canonical, p);\n if (d !== undefined) out.description = d;\n\n if (isObject(canonical.properties)) {\n const pProps = isObject(p.properties) ? p.properties : {};\n const propsOut: SchemaNode = {};\n for (const key of Object.keys(canonical.properties)) {\n const sub = syncSchemaLocalePatchWithCanonical(canonical.properties[key], pProps[key]);\n if (sub !== undefined && patchSchemaNodeHasContent(sub)) {\n propsOut[key] = sub;\n }\n }\n if (Object.keys(propsOut).length > 0) {\n out.properties = propsOut;\n }\n }\n\n if (canonical.items !== undefined) {\n const pItems = p.items;\n if (Array.isArray(canonical.items)) {\n const pArr = Array.isArray(pItems) ? pItems : [];\n const outItems = canonical.items.map((sub, i) => {\n const el = syncSchemaLocalePatchWithCanonical(sub, pArr[i]);\n return el !== undefined && patchSchemaNodeHasContent(el) ? el : null;\n });\n if (outItems.some((x) => x !== null)) {\n out.items = outItems;\n }\n } else {\n const one = syncSchemaLocalePatchWithCanonical(canonical.items, pItems);\n if (one !== undefined && patchSchemaNodeHasContent(one)) {\n out.items = one;\n }\n }\n }\n\n for (const key of ['oneOf', 'anyOf', 'allOf'] as const) {\n const bArr = canonical[key];\n const pArr = p[key];\n if (Array.isArray(bArr) && bArr.length > 0) {\n const pList = Array.isArray(pArr) ? pArr : [];\n const built = bArr.map((sub, i) => {\n const el = syncSchemaLocalePatchWithCanonical(sub, pList[i]);\n return el !== undefined && patchSchemaNodeHasContent(el) ? el : null;\n });\n if (built.some((x) => x !== null)) {\n out[key] = built;\n }\n }\n }\n\n if (isObject(canonical.not)) {\n const n = syncSchemaLocalePatchWithCanonical(canonical.not, p.not);\n if (n !== undefined && patchSchemaNodeHasContent(n)) {\n out.not = n;\n }\n }\n if (isObject(canonical.additionalProperties)) {\n const ap = syncSchemaLocalePatchWithCanonical(\n canonical.additionalProperties,\n p.additionalProperties\n );\n if (ap !== undefined && patchSchemaNodeHasContent(ap)) {\n out.additionalProperties = ap;\n }\n }\n\n if (!patchSchemaNodeHasContent(out)) return undefined;\n return out;\n}\n\nexport type CanonicalMethodForLocaleSync = {\n identifier: string;\n inputSchema?: unknown;\n outputSchema?: unknown;\n};\n\nexport function syncOperatorMetadataLocalesWithCanonicalSchemas(options: {\n metadata: Record<string, unknown>;\n methods: CanonicalMethodForLocaleSync[];\n operatorInputSchema?: unknown;\n operatorOutputSchema?: unknown;\n}): Record<string, unknown> {\n const md: Record<string, unknown> = isObject(options.metadata) ? { ...options.metadata } : {};\n const localesRaw = md.locales;\n if (!isObject(localesRaw)) {\n return md;\n }\n const locales: SchemaNode = { ...(localesRaw as SchemaNode) };\n const validIds = new Set(options.methods.map((m) => m.identifier));\n const methodById = new Map(options.methods.map((m) => [m.identifier, m]));\n\n for (const localeKey of Object.keys(locales)) {\n const block = locales[localeKey];\n if (!isObject(block)) continue;\n const nextBlock: SchemaNode = { ...block };\n\n if (options.operatorInputSchema !== undefined) {\n const synced = syncSchemaLocalePatchWithCanonical(\n options.operatorInputSchema,\n nextBlock.inputSchema\n );\n if (synced) nextBlock.inputSchema = synced;\n else delete nextBlock.inputSchema;\n }\n if (options.operatorOutputSchema !== undefined) {\n const synced = syncSchemaLocalePatchWithCanonical(\n options.operatorOutputSchema,\n nextBlock.outputSchema\n );\n if (synced) nextBlock.outputSchema = synced;\n else delete nextBlock.outputSchema;\n }\n\n if (Array.isArray(block.methods)) {\n const kept: unknown[] = [];\n for (const row of block.methods) {\n if (!isObject(row) || typeof row.identifier !== 'string') continue;\n if (!validIds.has(row.identifier)) continue;\n const canon = methodById.get(row.identifier);\n if (!canon) continue;\n const nm: SchemaNode = { ...row };\n const inS = syncSchemaLocalePatchWithCanonical(canon.inputSchema, row.inputSchema);\n if (inS) nm.inputSchema = inS;\n else delete nm.inputSchema;\n const outS = syncSchemaLocalePatchWithCanonical(canon.outputSchema, row.outputSchema);\n if (outS) nm.outputSchema = outS;\n else delete nm.outputSchema;\n kept.push(nm);\n }\n nextBlock.methods = kept;\n }\n\n locales[localeKey] = nextBlock;\n }\n\n md.locales = locales;\n return md;\n}\n\ntype LocaleMethodEntry = {\n identifier?: string;\n name?: string;\n description?: unknown;\n inputSchema?: unknown;\n outputSchema?: unknown;\n};\n\nexport function stripTenantOperatorSystemConfigurationDeep(op: Record<string, unknown>): void {\n delete op.systemConfiguration;\n if (Array.isArray(op.methods)) {\n op.methods = op.methods.map((m) => {\n if (!isObject(m)) return m;\n const node = m as SchemaNode;\n const { systemConfiguration, ...rest } = node;\n void systemConfiguration;\n return rest;\n });\n }\n const uo = op.userOperator;\n if (isObject(uo)) {\n stripTenantOperatorSystemConfigurationDeep(uo as Record<string, unknown>);\n }\n}\n\nfunction userZhBlockHasContent(uoZh: SchemaNode | null): boolean {\n if (!uoZh) return false;\n return !!(\n uoZh.name ||\n (uoZh.description !== undefined && uoZh.description !== null) ||\n uoZh.inputSchema ||\n uoZh.outputSchema ||\n (Array.isArray(uoZh.methods) && uoZh.methods.length > 0)\n );\n}\n\nfunction mergeLinkedSystemLocalesIntoTenantOperator(op: Record<string, unknown>): void {\n const linked = op.linkedSystemMetadata;\n if (!isObject(linked)) {\n delete op.linkedSystemMetadata;\n return;\n }\n const lmeta = linked.metadata;\n if (!isObject(lmeta) || !isObject(lmeta.locales)) {\n delete op.linkedSystemMetadata;\n return;\n }\n const sysLocales = lmeta.locales as SchemaNode;\n const sysZh = isObject(sysLocales.zh) ? sysLocales.zh : null;\n if (!sysZh) {\n delete op.linkedSystemMetadata;\n return;\n }\n const userMeta = isObject(op.metadata) ? { ...op.metadata } : {};\n const userLocales = isObject(userMeta.locales) ? { ...userMeta.locales } : {};\n const userZh = isObject(userLocales.zh) ? (userLocales.zh as SchemaNode) : null;\n if (!userZhBlockHasContent(userZh)) {\n userLocales.zh = { ...sysZh };\n userMeta.locales = userLocales;\n op.metadata = userMeta;\n }\n delete op.linkedSystemMetadata;\n}\n\nfunction mergeZhLocaleIntoOperatorRecord(\n op: Record<string, unknown>,\n language: string | undefined\n): void {\n if (normalizeOperatorLang(language) !== 'zh') {\n return;\n }\n const meta = op.metadata;\n if (!isObject(meta)) {\n return;\n }\n const locales = meta.locales;\n if (!isObject(locales)) {\n return;\n }\n const zh = locales.zh;\n if (!isObject(zh)) {\n return;\n }\n\n if (typeof zh.name === 'string' && zh.name) {\n op.name = zh.name;\n }\n if (zh.description !== undefined && zh.description !== null) {\n op.description = zh.description;\n }\n\n const zhMethods = zh.methods;\n if (Array.isArray(op.methods) && Array.isArray(zhMethods)) {\n const byId = new Map<string, LocaleMethodEntry>(\n zhMethods\n .filter((m): m is LocaleMethodEntry => isObject(m) && typeof m.identifier === 'string')\n .map((m) => [m.identifier as string, m])\n );\n op.methods = (op.methods as Record<string, unknown>[]).map((method) => {\n const id = method.identifier;\n const loc = typeof id === 'string' ? byId.get(id) : undefined;\n if (!loc) {\n return { ...method };\n }\n const nm = { ...method };\n if (typeof loc.name === 'string' && loc.name) {\n nm.name = loc.name;\n }\n if (loc.description !== undefined && loc.description !== null) {\n nm.description = loc.description as unknown;\n }\n if (loc.inputSchema && nm.inputSchema) {\n nm.inputSchema = mergeSchemaLocale(nm.inputSchema, loc.inputSchema);\n }\n if (loc.outputSchema && nm.outputSchema) {\n nm.outputSchema = mergeSchemaLocale(nm.outputSchema, loc.outputSchema);\n }\n return nm;\n }) as unknown as typeof op.methods;\n }\n\n if (zh.inputSchema && op.inputSchema) {\n op.inputSchema = mergeSchemaLocale(op.inputSchema, zh.inputSchema);\n }\n if (zh.outputSchema && op.outputSchema) {\n op.outputSchema = mergeSchemaLocale(op.outputSchema, zh.outputSchema);\n }\n}\n\nexport function prepareTenantOperatorApiResponseForConsole(\n raw: unknown,\n language: string | undefined\n): unknown {\n if (!isObject(raw)) {\n return raw;\n }\n let c: Record<string, unknown>;\n try {\n c = structuredClone(raw) as Record<string, unknown>;\n } catch {\n c = JSON.parse(JSON.stringify(raw)) as Record<string, unknown>;\n }\n stripTenantOperatorSystemConfigurationDeep(c);\n const uo = c.userOperator;\n if (isObject(uo)) {\n mergeLinkedSystemLocalesIntoTenantOperator(uo as Record<string, unknown>);\n mergeZhLocaleIntoOperatorRecord(uo as Record<string, unknown>, language);\n }\n mergeLinkedSystemLocalesIntoTenantOperator(c);\n mergeZhLocaleIntoOperatorRecord(c, language);\n return c;\n}\n\nexport function mergeImportedOperatorDefinitionLocale<T extends { operator: Record<string, unknown> }>(\n definition: T,\n language: string | undefined\n): T {\n let clone: T;\n try {\n clone = structuredClone(definition);\n } catch {\n clone = JSON.parse(JSON.stringify(definition)) as T;\n }\n mergeZhLocaleIntoOperatorRecord(clone.operator, language);\n return clone;\n}\n\nexport type OperatorDefinitionDisplay = {\n name: string;\n description: string;\n methods: Array<{ identifier: string; name: string; description: string }>;\n};\n\nexport function getOperatorDefinitionDisplay(\n definition: { operator: Record<string, unknown> },\n language: string | undefined\n): OperatorDefinitionDisplay {\n const op = definition.operator;\n const lng = normalizeOperatorLang(language);\n const methodsRaw = Array.isArray(op.methods) ? (op.methods as Record<string, unknown>[]) : [];\n\n const methodRows = (list: Record<string, unknown>[]) =>\n list.map((m) => ({\n identifier: typeof m.identifier === 'string' ? m.identifier : String(m.identifier ?? ''),\n name: typeof m.name === 'string' ? m.name : String(m.name ?? ''),\n description: m.description != null ? String(m.description) : '',\n }));\n\n if (lng !== 'zh') {\n return {\n name: typeof op.name === 'string' ? op.name : String(op.name ?? ''),\n description: op.description != null ? String(op.description) : '',\n methods: methodRows(methodsRaw),\n };\n }\n\n const meta = op.metadata;\n const zh =\n isObject(meta) && isObject(meta.locales) && isObject((meta.locales as SchemaNode).zh)\n ? ((meta.locales as SchemaNode).zh as SchemaNode)\n : null;\n\n let name = typeof op.name === 'string' ? op.name : String(op.name ?? '');\n let description = op.description != null ? String(op.description) : '';\n\n if (zh) {\n if (typeof zh.name === 'string' && zh.name) {\n name = zh.name;\n }\n if (zh.description !== undefined && zh.description !== null) {\n description = String(zh.description);\n }\n }\n\n const zhMethods = zh && Array.isArray(zh.methods) ? (zh.methods as unknown[]) : [];\n if (zhMethods.length > 0) {\n const byId = new Map<string, LocaleMethodEntry>(\n zhMethods\n .filter((m): m is LocaleMethodEntry => isObject(m) && typeof m.identifier === 'string')\n .map((m) => [m.identifier as string, m])\n );\n const methods = methodsRaw.map((method) => {\n const id = typeof method.identifier === 'string' ? method.identifier : String(method.identifier ?? '');\n const loc = byId.get(id);\n let displayName = typeof method.name === 'string' ? method.name : String(method.name ?? '');\n let displayDesc = method.description != null ? String(method.description) : '';\n if (loc) {\n if (typeof loc.name === 'string' && loc.name) {\n displayName = loc.name;\n }\n if (loc.description !== undefined && loc.description !== null) {\n displayDesc = String(loc.description);\n }\n }\n return { identifier: id, name: displayName, description: displayDesc };\n });\n return { name, description, methods };\n }\n\n return {\n name,\n description,\n methods: methodRows(methodsRaw),\n };\n}\n","export interface CountryCode {\n\n code: string;\n\n name: string;\n\n nameCn: string;\n\n dialCode: string;\n\n flag: string;\n}\n\nexport const COUNTRY_CODES: CountryCode[] = [\n\n { code: 'CN', name: 'China', nameCn: '中国', dialCode: '86', flag: '🇨🇳' },\n { code: 'US', name: 'United States', nameCn: '美国', dialCode: '1', flag: '🇺🇸' },\n { code: 'GB', name: 'United Kingdom', nameCn: '英国', dialCode: '44', flag: '🇬🇧' },\n { code: 'JP', name: 'Japan', nameCn: '日本', dialCode: '81', flag: '🇯🇵' },\n { code: 'KR', name: 'South Korea', nameCn: '韩国', dialCode: '82', flag: '🇰🇷' },\n { code: 'SG', name: 'Singapore', nameCn: '新加坡', dialCode: '65', flag: '🇸🇬' },\n { code: 'HK', name: 'Hong Kong', nameCn: '中国香港', dialCode: '852', flag: '🇭🇰' },\n { code: 'TW', name: 'Taiwan', nameCn: '中国台湾', dialCode: '886', flag: '🇨🇳' },\n { code: 'MO', name: 'Macau', nameCn: '中国澳门', dialCode: '853', flag: '🇲🇴' },\n { code: 'AU', name: 'Australia', nameCn: '澳大利亚', dialCode: '61', flag: '🇦🇺' },\n { code: 'CA', name: 'Canada', nameCn: '加拿大', dialCode: '1', flag: '🇨🇦' },\n { code: 'DE', name: 'Germany', nameCn: '德国', dialCode: '49', flag: '🇩🇪' },\n { code: 'FR', name: 'France', nameCn: '法国', dialCode: '33', flag: '🇫🇷' },\n\n // A\n { code: 'AF', name: 'Afghanistan', nameCn: '阿富汗', dialCode: '93', flag: '🇦🇫' },\n { code: 'AL', name: 'Albania', nameCn: '阿尔巴尼亚', dialCode: '355', flag: '🇦🇱' },\n { code: 'DZ', name: 'Algeria', nameCn: '阿尔及利亚', dialCode: '213', flag: '🇩🇿' },\n { code: 'AS', name: 'American Samoa', nameCn: '美属萨摩亚', dialCode: '1684', flag: '🇦🇸' },\n { code: 'AD', name: 'Andorra', nameCn: '安道尔', dialCode: '376', flag: '🇦🇩' },\n { code: 'AO', name: 'Angola', nameCn: '安哥拉', dialCode: '244', flag: '🇦🇴' },\n { code: 'AI', name: 'Anguilla', nameCn: '安圭拉', dialCode: '1264', flag: '🇦🇮' },\n { code: 'AG', name: 'Antigua and Barbuda', nameCn: '安提瓜和巴布达', dialCode: '1268', flag: '🇦🇬' },\n { code: 'AR', name: 'Argentina', nameCn: '阿根廷', dialCode: '54', flag: '🇦🇷' },\n { code: 'AM', name: 'Armenia', nameCn: '亚美尼亚', dialCode: '374', flag: '🇦🇲' },\n { code: 'AW', name: 'Aruba', nameCn: '阿鲁巴', dialCode: '297', flag: '🇦🇼' },\n { code: 'AT', name: 'Austria', nameCn: '奥地利', dialCode: '43', flag: '🇦🇹' },\n { code: 'AZ', name: 'Azerbaijan', nameCn: '阿塞拜疆', dialCode: '994', flag: '🇦🇿' },\n\n // B\n { code: 'BS', name: 'Bahamas', nameCn: '巴哈马', dialCode: '1242', flag: '🇧🇸' },\n { code: 'BH', name: 'Bahrain', nameCn: '巴林', dialCode: '973', flag: '🇧🇭' },\n { code: 'BD', name: 'Bangladesh', nameCn: '孟加拉国', dialCode: '880', flag: '🇧🇩' },\n { code: 'BB', name: 'Barbados', nameCn: '巴巴多斯', dialCode: '1246', flag: '🇧🇧' },\n { code: 'BY', name: 'Belarus', nameCn: '白俄罗斯', dialCode: '375', flag: '🇧🇾' },\n { code: 'BE', name: 'Belgium', nameCn: '比利时', dialCode: '32', flag: '🇧🇪' },\n { code: 'BZ', name: 'Belize', nameCn: '伯利兹', dialCode: '501', flag: '🇧🇿' },\n { code: 'BJ', name: 'Benin', nameCn: '贝宁', dialCode: '229', flag: '🇧🇯' },\n { code: 'BM', name: 'Bermuda', nameCn: '百慕大', dialCode: '1441', flag: '🇧🇲' },\n { code: 'BT', name: 'Bhutan', nameCn: '不丹', dialCode: '975', flag: '🇧🇹' },\n { code: 'BO', name: 'Bolivia', nameCn: '玻利维亚', dialCode: '591', flag: '🇧🇴' },\n { code: 'BA', name: 'Bosnia and Herzegovina', nameCn: '波斯尼亚和黑塞哥维那', dialCode: '387', flag: '🇧🇦' },\n { code: 'BW', name: 'Botswana', nameCn: '博茨瓦纳', dialCode: '267', flag: '🇧🇼' },\n { code: 'BR', name: 'Brazil', nameCn: '巴西', dialCode: '55', flag: '🇧🇷' },\n { code: 'BN', name: 'Brunei', nameCn: '文莱', dialCode: '673', flag: '🇧🇳' },\n { code: 'BG', name: 'Bulgaria', nameCn: '保加利亚', dialCode: '359', flag: '🇧🇬' },\n { code: 'BF', name: 'Burkina Faso', nameCn: '布基纳法索', dialCode: '226', flag: '🇧🇫' },\n { code: 'BI', name: 'Burundi', nameCn: '布隆迪', dialCode: '257', flag: '🇧🇮' },\n\n // C\n { code: 'KH', name: 'Cambodia', nameCn: '柬埔寨', dialCode: '855', flag: '🇰🇭' },\n { code: 'CM', name: 'Cameroon', nameCn: '喀麦隆', dialCode: '237', flag: '🇨🇲' },\n { code: 'CV', name: 'Cape Verde', nameCn: '佛得角', dialCode: '238', flag: '🇨🇻' },\n { code: 'KY', name: 'Cayman Islands', nameCn: '开曼群岛', dialCode: '1345', flag: '🇰🇾' },\n { code: 'CF', name: 'Central African Republic', nameCn: '中非共和国', dialCode: '236', flag: '🇨🇫' },\n { code: 'TD', name: 'Chad', nameCn: '乍得', dialCode: '235', flag: '🇹🇩' },\n { code: 'CL', name: 'Chile', nameCn: '智利', dialCode: '56', flag: '🇨🇱' },\n { code: 'CO', name: 'Colombia', nameCn: '哥伦比亚', dialCode: '57', flag: '🇨🇴' },\n { code: 'KM', name: 'Comoros', nameCn: '科摩罗', dialCode: '269', flag: '🇰🇲' },\n { code: 'CG', name: 'Congo', nameCn: '刚果(布)', dialCode: '242', flag: '🇨🇬' },\n { code: 'CD', name: 'Congo (DRC)', nameCn: '刚果(金)', dialCode: '243', flag: '🇨🇩' },\n { code: 'CK', name: 'Cook Islands', nameCn: '库克群岛', dialCode: '682', flag: '🇨🇰' },\n { code: 'CR', name: 'Costa Rica', nameCn: '哥斯达黎加', dialCode: '506', flag: '🇨🇷' },\n { code: 'CI', name: 'Côte d\\'Ivoire', nameCn: '科特迪瓦', dialCode: '225', flag: '🇨🇮' },\n { code: 'HR', name: 'Croatia', nameCn: '克罗地亚', dialCode: '385', flag: '🇭🇷' },\n { code: 'CU', name: 'Cuba', nameCn: '古巴', dialCode: '53', flag: '🇨🇺' },\n { code: 'CW', name: 'Curaçao', nameCn: '库拉索', dialCode: '599', flag: '🇨🇼' },\n { code: 'CY', name: 'Cyprus', nameCn: '塞浦路斯', dialCode: '357', flag: '🇨🇾' },\n { code: 'CZ', name: 'Czech Republic', nameCn: '捷克', dialCode: '420', flag: '🇨🇿' },\n\n // D\n { code: 'DK', name: 'Denmark', nameCn: '丹麦', dialCode: '45', flag: '🇩🇰' },\n { code: 'DJ', name: 'Djibouti', nameCn: '吉布提', dialCode: '253', flag: '🇩🇯' },\n { code: 'DM', name: 'Dominica', nameCn: '多米尼克', dialCode: '1767', flag: '🇩🇲' },\n { code: 'DO', name: 'Dominican Republic', nameCn: '多米尼加', dialCode: '1809', flag: '🇩🇴' },\n\n // E\n { code: 'EC', name: 'Ecuador', nameCn: '厄瓜多尔', dialCode: '593', flag: '🇪🇨' },\n { code: 'EG', name: 'Egypt', nameCn: '埃及', dialCode: '20', flag: '🇪🇬' },\n { code: 'SV', name: 'El Salvador', nameCn: '萨尔瓦多', dialCode: '503', flag: '🇸🇻' },\n { code: 'GQ', name: 'Equatorial Guinea', nameCn: '赤道几内亚', dialCode: '240', flag: '🇬🇶' },\n { code: 'ER', name: 'Eritrea', nameCn: '厄立特里亚', dialCode: '291', flag: '🇪🇷' },\n { code: 'EE', name: 'Estonia', nameCn: '爱沙尼亚', dialCode: '372', flag: '🇪🇪' },\n { code: 'SZ', name: 'Eswatini', nameCn: '斯威士兰', dialCode: '268', flag: '🇸🇿' },\n { code: 'ET', name: 'Ethiopia', nameCn: '埃塞俄比亚', dialCode: '251', flag: '🇪🇹' },\n\n // F\n { code: 'FK', name: 'Falkland Islands', nameCn: '福克兰群岛', dialCode: '500', flag: '🇫🇰' },\n { code: 'FO', name: 'Faroe Islands', nameCn: '法罗群岛', dialCode: '298', flag: '🇫🇴' },\n { code: 'FJ', name: 'Fiji', nameCn: '斐济', dialCode: '679', flag: '🇫🇯' },\n { code: 'FI', name: 'Finland', nameCn: '芬兰', dialCode: '358', flag: '🇫🇮' },\n { code: 'GF', name: 'French Guiana', nameCn: '法属圭亚那', dialCode: '594', flag: '🇬🇫' },\n { code: 'PF', name: 'French Polynesia', nameCn: '法属波利尼西亚', dialCode: '689', flag: '🇵🇫' },\n\n // G\n { code: 'GA', name: 'Gabon', nameCn: '加蓬', dialCode: '241', flag: '🇬🇦' },\n { code: 'GM', name: 'Gambia', nameCn: '冈比亚', dialCode: '220', flag: '🇬🇲' },\n { code: 'GE', name: 'Georgia', nameCn: '格鲁吉亚', dialCode: '995', flag: '🇬🇪' },\n { code: 'GH', name: 'Ghana', nameCn: '加纳', dialCode: '233', flag: '🇬🇭' },\n { code: 'GI', name: 'Gibraltar', nameCn: '直布罗陀', dialCode: '350', flag: '🇬🇮' },\n { code: 'GR', name: 'Greece', nameCn: '希腊', dialCode: '30', flag: '🇬🇷' },\n { code: 'GL', name: 'Greenland', nameCn: '格陵兰', dialCode: '299', flag: '🇬🇱' },\n { code: 'GD', name: 'Grenada', nameCn: '格林纳达', dialCode: '1473', flag: '🇬🇩' },\n { code: 'GP', name: 'Guadeloupe', nameCn: '瓜德罗普', dialCode: '590', flag: '🇬🇵' },\n { code: 'GU', name: 'Guam', nameCn: '关岛', dialCode: '1671', flag: '🇬🇺' },\n { code: 'GT', name: 'Guatemala', nameCn: '危地马拉', dialCode: '502', flag: '🇬🇹' },\n { code: 'GG', name: 'Guernsey', nameCn: '根西岛', dialCode: '44', flag: '🇬🇬' },\n { code: 'GN', name: 'Guinea', nameCn: '几内亚', dialCode: '224', flag: '🇬🇳' },\n { code: 'GW', name: 'Guinea-Bissau', nameCn: '几内亚比绍', dialCode: '245', flag: '🇬🇼' },\n { code: 'GY', name: 'Guyana', nameCn: '圭亚那', dialCode: '592', flag: '🇬🇾' },\n\n // H\n { code: 'HT', name: 'Haiti', nameCn: '海地', dialCode: '509', flag: '🇭🇹' },\n { code: 'HN', name: 'Honduras', nameCn: '洪都拉斯', dialCode: '504', flag: '🇭🇳' },\n { code: 'HU', name: 'Hungary', nameCn: '匈牙利', dialCode: '36', flag: '🇭🇺' },\n\n // I\n { code: 'IS', name: 'Iceland', nameCn: '冰岛', dialCode: '354', flag: '🇮🇸' },\n { code: 'IN', name: 'India', nameCn: '印度', dialCode: '91', flag: '🇮🇳' },\n { code: 'ID', name: 'Indonesia', nameCn: '印度尼西亚', dialCode: '62', flag: '🇮🇩' },\n { code: 'IR', name: 'Iran', nameCn: '伊朗', dialCode: '98', flag: '🇮🇷' },\n { code: 'IQ', name: 'Iraq', nameCn: '伊拉克', dialCode: '964', flag: '🇮🇶' },\n { code: 'IE', name: 'Ireland', nameCn: '爱尔兰', dialCode: '353', flag: '🇮🇪' },\n { code: 'IM', name: 'Isle of Man', nameCn: '马恩岛', dialCode: '44', flag: '🇮🇲' },\n { code: 'IL', name: 'Israel', nameCn: '以色列', dialCode: '972', flag: '🇮🇱' },\n { code: 'IT', name: 'Italy', nameCn: '意大利', dialCode: '39', flag: '🇮🇹' },\n\n // J\n { code: 'JM', name: 'Jamaica', nameCn: '牙买加', dialCode: '1876', flag: '🇯🇲' },\n { code: 'JE', name: 'Jersey', nameCn: '泽西岛', dialCode: '44', flag: '🇯🇪' },\n { code: 'JO', name: 'Jordan', nameCn: '约旦', dialCode: '962', flag: '🇯🇴' },\n\n // K\n { code: 'KZ', name: 'Kazakhstan', nameCn: '哈萨克斯坦', dialCode: '7', flag: '🇰🇿' },\n { code: 'KE', name: 'Kenya', nameCn: '肯尼亚', dialCode: '254', flag: '🇰🇪' },\n { code: 'KI', name: 'Kiribati', nameCn: '基里巴斯', dialCode: '686', flag: '🇰🇮' },\n { code: 'KP', name: 'North Korea', nameCn: '朝鲜', dialCode: '850', flag: '🇰🇵' },\n { code: 'KW', name: 'Kuwait', nameCn: '科威特', dialCode: '965', flag: '🇰🇼' },\n { code: 'KG', name: 'Kyrgyzstan', nameCn: '吉尔吉斯斯坦', dialCode: '996', flag: '🇰🇬' },\n\n // L\n { code: 'LA', name: 'Laos', nameCn: '老挝', dialCode: '856', flag: '🇱🇦' },\n { code: 'LV', name: 'Latvia', nameCn: '拉脱维亚', dialCode: '371', flag: '🇱🇻' },\n { code: 'LB', name: 'Lebanon', nameCn: '黎巴嫩', dialCode: '961', flag: '🇱🇧' },\n { code: 'LS', name: 'Lesotho', nameCn: '莱索托', dialCode: '266', flag: '🇱🇸' },\n { code: 'LR', name: 'Liberia', nameCn: '利比里亚', dialCode: '231', flag: '🇱🇷' },\n { code: 'LY', name: 'Libya', nameCn: '利比亚', dialCode: '218', flag: '🇱🇾' },\n { code: 'LI', name: 'Liechtenstein', nameCn: '列支敦士登', dialCode: '423', flag: '🇱🇮' },\n { code: 'LT', name: 'Lithuania', nameCn: '立陶宛', dialCode: '370', flag: '🇱🇹' },\n { code: 'LU', name: 'Luxembourg', nameCn: '卢森堡', dialCode: '352', flag: '🇱🇺' },\n\n // M\n { code: 'MK', name: 'North Macedonia', nameCn: '北马其顿', dialCode: '389', flag: '🇲🇰' },\n { code: 'MG', name: 'Madagascar', nameCn: '马达加斯加', dialCode: '261', flag: '🇲🇬' },\n { code: 'MW', name: 'Malawi', nameCn: '马拉维', dialCode: '265', flag: '🇲🇼' },\n { code: 'MY', name: 'Malaysia', nameCn: '马来西亚', dialCode: '60', flag: '🇲🇾' },\n { code: 'MV', name: 'Maldives', nameCn: '马尔代夫', dialCode: '960', flag: '🇲🇻' },\n { code: 'ML', name: 'Mali', nameCn: '马里', dialCode: '223', flag: '🇲🇱' },\n { code: 'MT', name: 'Malta', nameCn: '马耳他', dialCode: '356', flag: '🇲🇹' },\n { code: 'MH', name: 'Marshall Islands', nameCn: '马绍尔群岛', dialCode: '692', flag: '🇲🇭' },\n { code: 'MQ', name: 'Martinique', nameCn: '马提尼克', dialCode: '596', flag: '🇲🇶' },\n { code: 'MR', name: 'Mauritania', nameCn: '毛里塔尼亚', dialCode: '222', flag: '🇲🇷' },\n { code: 'MU', name: 'Mauritius', nameCn: '毛里求斯', dialCode: '230', flag: '🇲🇺' },\n { code: 'YT', name: 'Mayotte', nameCn: '马约特', dialCode: '262', flag: '🇾🇹' },\n { code: 'MX', name: 'Mexico', nameCn: '墨西哥', dialCode: '52', flag: '🇲🇽' },\n { code: 'FM', name: 'Micronesia', nameCn: '密克罗尼西亚', dialCode: '691', flag: '🇫🇲' },\n { code: 'MD', name: 'Moldova', nameCn: '摩尔多瓦', dialCode: '373', flag: '🇲🇩' },\n { code: 'MC', name: 'Monaco', nameCn: '摩纳哥', dialCode: '377', flag: '🇲🇨' },\n { code: 'MN', name: 'Mongolia', nameCn: '蒙古', dialCode: '976', flag: '🇲🇳' },\n { code: 'ME', name: 'Montenegro', nameCn: '黑山', dialCode: '382', flag: '🇲🇪' },\n { code: 'MS', name: 'Montserrat', nameCn: '蒙特塞拉特', dialCode: '1664', flag: '🇲🇸' },\n { code: 'MA', name: 'Morocco', nameCn: '摩洛哥', dialCode: '212', flag: '🇲🇦' },\n { code: 'MZ', name: 'Mozambique', nameCn: '莫桑比克', dialCode: '258', flag: '🇲🇿' },\n { code: 'MM', name: 'Myanmar', nameCn: '缅甸', dialCode: '95', flag: '🇲🇲' },\n\n // N\n { code: 'NA', name: 'Namibia', nameCn: '纳米比亚', dialCode: '264', flag: '🇳🇦' },\n { code: 'NR', name: 'Nauru', nameCn: '瑙鲁', dialCode: '674', flag: '🇳🇷' },\n { code: 'NP', name: 'Nepal', nameCn: '尼泊尔', dialCode: '977', flag: '🇳🇵' },\n { code: 'NL', name: 'Netherlands', nameCn: '荷兰', dialCode: '31', flag: '🇳🇱' },\n { code: 'NC', name: 'New Caledonia', nameCn: '新喀里多尼亚', dialCode: '687', flag: '🇳🇨' },\n { code: 'NZ', name: 'New Zealand', nameCn: '新西兰', dialCode: '64', flag: '🇳🇿' },\n { code: 'NI', name: 'Nicaragua', nameCn: '尼加拉瓜', dialCode: '505', flag: '🇳🇮' },\n { code: 'NE', name: 'Niger', nameCn: '尼日尔', dialCode: '227', flag: '🇳🇪' },\n { code: 'NG', name: 'Nigeria', nameCn: '尼日利亚', dialCode: '234', flag: '🇳🇬' },\n { code: 'NU', name: 'Niue', nameCn: '纽埃', dialCode: '683', flag: '🇳🇺' },\n { code: 'NF', name: 'Norfolk Island', nameCn: '诺福克岛', dialCode: '672', flag: '🇳🇫' },\n { code: 'MP', name: 'Northern Mariana Islands', nameCn: '北马里亚纳群岛', dialCode: '1670', flag: '🇲🇵' },\n { code: 'NO', name: 'Norway', nameCn: '挪威', dialCode: '47', flag: '🇳🇴' },\n\n // O\n { code: 'OM', name: 'Oman', nameCn: '阿曼', dialCode: '968', flag: '🇴🇲' },\n\n // P\n { code: 'PK', name: 'Pakistan', nameCn: '巴基斯坦', dialCode: '92', flag: '🇵🇰' },\n { code: 'PW', name: 'Palau', nameCn: '帕劳', dialCode: '680', flag: '🇵🇼' },\n { code: 'PS', name: 'Palestine', nameCn: '巴勒斯坦', dialCode: '970', flag: '🇵🇸' },\n { code: 'PA', name: 'Panama', nameCn: '巴拿马', dialCode: '507', flag: '🇵🇦' },\n { code: 'PG', name: 'Papua New Guinea', nameCn: '巴布亚新几内亚', dialCode: '675', flag: '🇵🇬' },\n { code: 'PY', name: 'Paraguay', nameCn: '巴拉圭', dialCode: '595', flag: '🇵🇾' },\n { code: 'PE', name: 'Peru', nameCn: '秘鲁', dialCode: '51', flag: '🇵🇪' },\n { code: 'PH', name: 'Philippines', nameCn: '菲律宾', dialCode: '63', flag: '🇵🇭' },\n { code: 'PL', name: 'Poland', nameCn: '波兰', dialCode: '48', flag: '🇵🇱' },\n { code: 'PT', name: 'Portugal', nameCn: '葡萄牙', dialCode: '351', flag: '🇵🇹' },\n { code: 'PR', name: 'Puerto Rico', nameCn: '波多黎各', dialCode: '1787', flag: '🇵🇷' },\n\n // Q\n { code: 'QA', name: 'Qatar', nameCn: '卡塔尔', dialCode: '974', flag: '🇶🇦' },\n\n // R\n { code: 'RE', name: 'Réunion', nameCn: '留尼汪', dialCode: '262', flag: '🇷🇪' },\n { code: 'RO', name: 'Romania', nameCn: '罗马尼亚', dialCode: '40', flag: '🇷🇴' },\n { code: 'RU', name: 'Russia', nameCn: '俄罗斯', dialCode: '7', flag: '🇷🇺' },\n { code: 'RW', name: 'Rwanda', nameCn: '卢旺达', dialCode: '250', flag: '🇷🇼' },\n\n // S\n { code: 'BL', name: 'Saint Barthélemy', nameCn: '圣巴泰勒米', dialCode: '590', flag: '🇧🇱' },\n { code: 'SH', name: 'Saint Helena', nameCn: '圣赫勒拿', dialCode: '290', flag: '🇸🇭' },\n { code: 'KN', name: 'Saint Kitts and Nevis', nameCn: '圣基茨和尼维斯', dialCode: '1869', flag: '🇰🇳' },\n { code: 'LC', name: 'Saint Lucia', nameCn: '圣卢西亚', dialCode: '1758', flag: '🇱🇨' },\n { code: 'MF', name: 'Saint Martin', nameCn: '圣马丁(法属)', dialCode: '590', flag: '🇲🇫' },\n { code: 'PM', name: 'Saint Pierre and Miquelon', nameCn: '圣皮埃尔和密克隆', dialCode: '508', flag: '🇵🇲' },\n { code: 'VC', name: 'Saint Vincent and the Grenadines', nameCn: '圣文森特和格林纳丁斯', dialCode: '1784', flag: '🇻🇨' },\n { code: 'WS', name: 'Samoa', nameCn: '萨摩亚', dialCode: '685', flag: '🇼🇸' },\n { code: 'SM', name: 'San Marino', nameCn: '圣马力诺', dialCode: '378', flag: '🇸🇲' },\n { code: 'ST', name: 'São Tomé and Príncipe', nameCn: '圣多美和普林西比', dialCode: '239', flag: '🇸🇹' },\n { code: 'SA', name: 'Saudi Arabia', nameCn: '沙特阿拉伯', dialCode: '966', flag: '🇸🇦' },\n { code: 'SN', name: 'Senegal', nameCn: '塞内加尔', dialCode: '221', flag: '🇸🇳' },\n { code: 'RS', name: 'Serbia', nameCn: '塞尔维亚', dialCode: '381', flag: '🇷🇸' },\n { code: 'SC', name: 'Seychelles', nameCn: '塞舌尔', dialCode: '248', flag: '🇸🇨' },\n { code: 'SL', name: 'Sierra Leone', nameCn: '塞拉利昂', dialCode: '232', flag: '🇸🇱' },\n { code: 'SX', name: 'Sint Maarten', nameCn: '圣马丁(荷属)', dialCode: '1721', flag: '🇸🇽' },\n { code: 'SK', name: 'Slovakia', nameCn: '斯洛伐克', dialCode: '421', flag: '🇸🇰' },\n { code: 'SI', name: 'Slovenia', nameCn: '斯洛文尼亚', dialCode: '386', flag: '🇸🇮' },\n { code: 'SB', name: 'Solomon Islands', nameCn: '所罗门群岛', dialCode: '677', flag: '🇸🇧' },\n { code: 'SO', name: 'Somalia', nameCn: '索马里', dialCode: '252', flag: '🇸🇴' },\n { code: 'ZA', name: 'South Africa', nameCn: '南非', dialCode: '27', flag: '🇿🇦' },\n { code: 'SS', name: 'South Sudan', nameCn: '南苏丹', dialCode: '211', flag: '🇸🇸' },\n { code: 'ES', name: 'Spain', nameCn: '西班牙', dialCode: '34', flag: '🇪🇸' },\n { code: 'LK', name: 'Sri Lanka', nameCn: '斯里兰卡', dialCode: '94', flag: '🇱🇰' },\n { code: 'SD', name: 'Sudan', nameCn: '苏丹', dialCode: '249', flag: '🇸🇩' },\n { code: 'SR', name: 'Suriname', nameCn: '苏里南', dialCode: '597', flag: '🇸🇷' },\n { code: 'SE', name: 'Sweden', nameCn: '瑞典', dialCode: '46', flag: '🇸🇪' },\n { code: 'CH', name: 'Switzerland', nameCn: '瑞士', dialCode: '41', flag: '🇨🇭' },\n { code: 'SY', name: 'Syria', nameCn: '叙利亚', dialCode: '963', flag: '🇸🇾' },\n\n // T\n { code: 'TJ', name: 'Tajikistan', nameCn: '塔吉克斯坦', dialCode: '992', flag: '🇹🇯' },\n { code: 'TZ', name: 'Tanzania', nameCn: '坦桑尼亚', dialCode: '255', flag: '🇹🇿' },\n { code: 'TH', name: 'Thailand', nameCn: '泰国', dialCode: '66', flag: '🇹🇭' },\n { code: 'TL', name: 'Timor-Leste', nameCn: '东帝汶', dialCode: '670', flag: '🇹🇱' },\n { code: 'TG', name: 'Togo', nameCn: '多哥', dialCode: '228', flag: '🇹🇬' },\n { code: 'TK', name: 'Tokelau', nameCn: '托克劳', dialCode: '690', flag: '🇹🇰' },\n { code: 'TO', name: 'Tonga', nameCn: '汤加', dialCode: '676', flag: '🇹🇴' },\n { code: 'TT', name: 'Trinidad and Tobago', nameCn: '特立尼达和多巴哥', dialCode: '1868', flag: '🇹🇹' },\n { code: 'TN', name: 'Tunisia', nameCn: '突尼斯', dialCode: '216', flag: '🇹🇳' },\n { code: 'TR', name: 'Turkey', nameCn: '土耳其', dialCode: '90', flag: '🇹🇷' },\n { code: 'TM', name: 'Turkmenistan', nameCn: '土库曼斯坦', dialCode: '993', flag: '🇹🇲' },\n { code: 'TC', name: 'Turks and Caicos Islands', nameCn: '特克斯和凯科斯群岛', dialCode: '1649', flag: '🇹🇨' },\n { code: 'TV', name: 'Tuvalu', nameCn: '图瓦卢', dialCode: '688', flag: '🇹🇻' },\n\n // U\n { code: 'UG', name: 'Uganda', nameCn: '乌干达', dialCode: '256', flag: '🇺🇬' },\n { code: 'UA', name: 'Ukraine', nameCn: '乌克兰', dialCode: '380', flag: '🇺🇦' },\n { code: 'AE', name: 'United Arab Emirates', nameCn: '阿联酋', dialCode: '971', flag: '🇦🇪' },\n { code: 'UY', name: 'Uruguay', nameCn: '乌拉圭', dialCode: '598', flag: '🇺🇾' },\n { code: 'UZ', name: 'Uzbekistan', nameCn: '乌兹别克斯坦', dialCode: '998', flag: '🇺🇿' },\n\n // V\n { code: 'VU', name: 'Vanuatu', nameCn: '瓦努阿图', dialCode: '678', flag: '🇻🇺' },\n { code: 'VA', name: 'Vatican City', nameCn: '梵蒂冈', dialCode: '379', flag: '🇻🇦' },\n { code: 'VE', name: 'Venezuela', nameCn: '委内瑞拉', dialCode: '58', flag: '🇻🇪' },\n { code: 'VN', name: 'Vietnam', nameCn: '越南', dialCode: '84', flag: '🇻🇳' },\n { code: 'VG', name: 'British Virgin Islands', nameCn: '英属维尔京群岛', dialCode: '1284', flag: '🇻🇬' },\n { code: 'VI', name: 'U.S. Virgin Islands', nameCn: '美属维尔京群岛', dialCode: '1340', flag: '🇻🇮' },\n\n // W\n { code: 'WF', name: 'Wallis and Futuna', nameCn: '瓦利斯和富图纳', dialCode: '681', flag: '🇼🇫' },\n\n // Y\n { code: 'YE', name: 'Yemen', nameCn: '也门', dialCode: '967', flag: '🇾🇪' },\n\n // Z\n { code: 'ZM', name: 'Zambia', nameCn: '赞比亚', dialCode: '260', flag: '🇿🇲' },\n { code: 'ZW', name: 'Zimbabwe', nameCn: '津巴布韦', dialCode: '263', flag: '🇿🇼' },\n];\n\nexport function getCountryByCode(code: string): CountryCode | undefined {\n return COUNTRY_CODES.find(country => country.code === code.toUpperCase());\n}\n\nexport function getCountriesByDialCode(dialCode: string): CountryCode[] {\n return COUNTRY_CODES.filter(country => country.dialCode === dialCode);\n}\n\nexport function getAllCountries(): CountryCode[] {\n return COUNTRY_CODES;\n}\n\nexport function searchCountries(query: string, language: 'en' | 'zh' = 'en'): CountryCode[] {\n const lowerQuery = query.toLowerCase().trim();\n if (!lowerQuery) return COUNTRY_CODES;\n\n return COUNTRY_CODES.filter(country => {\n\n if (country.dialCode.includes(lowerQuery) || `+${country.dialCode}`.includes(lowerQuery)) {\n return true;\n }\n\n if (country.code.toLowerCase().includes(lowerQuery)) {\n return true;\n }\n\n if (language === 'zh') {\n return country.nameCn.includes(lowerQuery) || country.name.toLowerCase().includes(lowerQuery);\n }\n return country.name.toLowerCase().includes(lowerQuery) || country.nameCn.includes(lowerQuery);\n });\n}\n\n/** ISO country codes for mainland China + HK / MO / TW (CN edition SMS allowlist). */\nexport const GREATER_CHINA_COUNTRY_CODES = ['CN', 'HK', 'MO', 'TW'] as const;\n\nexport type GreaterChinaCountryCode = (typeof GREATER_CHINA_COUNTRY_CODES)[number];\n\nexport function getGreaterChinaCountries(): CountryCode[] {\n return GREATER_CHINA_COUNTRY_CODES\n .map((code) => getCountryByCode(code))\n .filter((country): country is CountryCode => Boolean(country));\n}\n\n/**\n * Validate national digits for a dial code (aligned with api phoneValidation KNOWN_REGIONS).\n */\nexport function validateNationalNumber(dialCode: string, national: string): boolean {\n const digits = national.replace(/\\D/g, '');\n if (!digits) {\n return false;\n }\n if (dialCode === '86') {\n return /^1[3-9]\\d{9}$/.test(digits);\n }\n if (dialCode === '852' || dialCode === '853') {\n return /^\\d{8}$/.test(digits);\n }\n if (dialCode === '886') {\n return /^\\d{8,10}$/.test(digits);\n }\n return /^\\d{6,14}$/.test(digits);\n}\n\nexport function formatPhoneNumber(dialCode: string, phoneNumber: string): string {\n\n const cleanNumber = phoneNumber.replace(/\\D/g, '');\n return `+${dialCode}-${cleanNumber}`;\n}\n\nexport function parsePhoneNumber(phoneNumber: string): { dialCode: string; number: string } | null {\n const match = phoneNumber.match(/^\\+(\\d{1,4})-(\\d+)$/);\n if (match) {\n return { dialCode: match[1], number: match[2] };\n }\n return null;\n}\n\nexport function getChinaCountry(): CountryCode {\n return COUNTRY_CODES[0]; \n}\n","/**\n * Helpers for Shell iframe embedding of GeniApps (cross-origin safe URL composition).\n */\n\nexport function normalizeIframeBaseUrl(base: string): string {\n const x = base.trim();\n if (!x) return x;\n return x.endsWith('/') ? x : `${x}/`;\n}\n\n/** True when `baseUrl` is an expanded CDN directory (`…/{identifier}/{version}/`), not a bare dev origin. */\nexport function isExpandedGeniappIframeBase(baseUrl: string, identifier: string): boolean {\n try {\n const parts = new URL(baseUrl).pathname.split('/').filter(Boolean);\n const identifierIndex = parts.lastIndexOf(identifier);\n return (\n identifierIndex >= 0 &&\n identifierIndex === parts.length - 2 &&\n /^\\d+\\.\\d+\\.\\d+$/u.test(parts[identifierIndex + 1] ?? '')\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Build full iframe document URL. `baseUrl` is typically expanded manifest `iframeEntryTemplate`\n * (must include trailing slash when serving SPA from a directory prefix).\n *\n * - Bare origin (`https://host/`): append `{identifier}` and optional `innerPath` (legacy hr-timesheet dev).\n * - Expanded CDN base (`…/{identifier}/{version}/`): always load the version directory root. Object\n * storage/CDN origins do not provide BrowserRouter fallback for deep paths; Shell sends `innerPath`\n * separately through `GENISPACE_SHELL_ROUTE` after the iframe is available.\n */\nexport function buildAppIframeSrc(baseUrl: string, identifier: string, innerPath: string): string {\n const baseNorm = normalizeIframeBaseUrl(baseUrl);\n const expandedCdn = isExpandedGeniappIframeBase(baseNorm, identifier);\n const tail = expandedCdn\n ? ''\n : innerPath\n ? `${identifier}/${innerPath}`\n : `${identifier}`;\n const u = new URL(tail, baseNorm);\n // Vite apps with versioned `base` only serve the document at the directory URL (trailing slash).\n if (!innerPath && !u.pathname.endsWith('/')) {\n u.pathname += '/';\n }\n return u.href;\n}\n\n/** Shell route `/:appSlug/*` → path segments inside the GeniApp router (`summary`, `reports/project`, …). */\nexport function shellPathnameToInnerPath(pathname: string, appSlug: string): string {\n const parts = pathname.split('/').filter(Boolean);\n if (parts[0] !== appSlug) return '';\n return parts.slice(1).join('/');\n}\n\n/** @deprecated Use buildAppIframeSrc */\nexport const buildGeniappIframeSrc = buildAppIframeSrc;\n","/**\n * Path inside a GeniApp SPA after removing Vite's public base (`import.meta.env.BASE_URL`).\n * Matches Shell ↔ iframe `innerPath` convention: no leading/trailing slashes (empty = app root).\n */\nexport function pathnameWithinBase(pathname: string, viteBaseRaw: string): string {\n const pathnameNorm = pathname.replace(/\\/+/gu, '/');\n const raw = viteBaseRaw.trim();\n if (!raw || raw === '/') {\n return pathnameNorm.replace(/^\\/+|\\/+$/gu, '');\n }\n let base = raw.replace(/\\/+/gu, '/');\n if (!base.startsWith('/')) base = `/${base}`;\n base = base.replace(/\\/+$/u, '') || '/';\n if (base === '/') {\n return pathnameNorm.replace(/^\\/+|\\/+$/gu, '');\n }\n const pathNoTrailing = pathnameNorm.replace(/\\/+$/u, '') || '/';\n const prefix = `${base}/`;\n if (pathNoTrailing === base) return '';\n if (pathNoTrailing.startsWith(prefix)) {\n return pathNoTrailing.slice(prefix.length).replace(/\\/+$/u, '');\n }\n return pathnameNorm.replace(/^\\/+|\\/+$/gu, '');\n}\n","export const GENISPACE_APP_IDS = [\n 'workbench',\n 'console',\n 'hub',\n 'chat',\n 'shell',\n 'admin',\n 'ebook',\n 'partner',\n] as const;\n\nexport type GenispaceAppId = (typeof GENISPACE_APP_IDS)[number];\n\nexport type SpaceWatermarkApps = Record<GenispaceAppId, boolean>;\n\nexport interface SpaceSettings {\n watermark: {\n apps: SpaceWatermarkApps;\n };\n}\n\nconst DEFAULT_WATERMARK_APPS: SpaceWatermarkApps = {\n workbench: false,\n console: false,\n hub: false,\n chat: false,\n shell: false,\n admin: false,\n ebook: false,\n partner: false,\n};\n\nexport const DEFAULT_SPACE_SETTINGS: SpaceSettings = {\n watermark: {\n apps: { ...DEFAULT_WATERMARK_APPS },\n },\n};\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction deepMergeSettings(\n base: Record<string, unknown>,\n patch: Record<string, unknown>,\n): Record<string, unknown> {\n const result = { ...base };\n for (const key of Object.keys(patch)) {\n const patchVal = patch[key];\n const baseVal = base[key];\n if (isPlainObject(patchVal) && isPlainObject(baseVal)) {\n result[key] = deepMergeSettings(baseVal, patchVal);\n } else {\n result[key] = patchVal;\n }\n }\n return result;\n}\n\nexport function normalizeSpaceSettings(raw?: unknown): SpaceSettings {\n const merged = deepMergeSettings(\n structuredClone(DEFAULT_SPACE_SETTINGS) as unknown as Record<string, unknown>,\n isPlainObject(raw) ? raw : {},\n );\n\n const apps = { ...DEFAULT_WATERMARK_APPS };\n const watermark = merged.watermark;\n if (isPlainObject(watermark) && isPlainObject(watermark.apps)) {\n for (const id of GENISPACE_APP_IDS) {\n if (typeof watermark.apps[id] === 'boolean') {\n apps[id] = watermark.apps[id];\n }\n }\n }\n\n return {\n ...merged,\n watermark: {\n ...(isPlainObject(watermark) ? watermark : {}),\n apps,\n },\n } as SpaceSettings;\n}\n\nexport function isSpaceWatermarkEnabled(\n appId: GenispaceAppId,\n settings?: unknown,\n): boolean {\n return normalizeSpaceSettings(settings).watermark.apps[appId] === true;\n}\n\nexport function readStoredUserPhone(): string | null {\n try {\n const storedUser = localStorage.getItem('user');\n if (!storedUser) return null;\n const user = JSON.parse(storedUser) as Record<string, unknown>;\n const phone = user.phone ?? user.phoneNumber;\n if (typeof phone === 'string' && phone.trim()) {\n return phone.trim();\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport interface WatermarkLabelInput {\n name?: string | null;\n phone?: string | null;\n email?: string | null;\n spaceName?: string | null;\n}\n\n/** Build watermark text: `{identifier}@{spaceName}` (name → phone → email local-part). */\nexport function buildWatermarkLabel(input: WatermarkLabelInput): string | null {\n const spaceName = input.spaceName?.trim();\n if (!spaceName) return null;\n\n const name = input.name?.trim();\n if (name) return `${name}@${spaceName}`;\n\n const phone = input.phone?.trim();\n if (phone) return `${phone}@${spaceName}`;\n\n const email = input.email?.trim();\n if (email) {\n const localPart = email.includes('@') ? email.split('@')[0] : email;\n if (localPart) return `${localPart}@${spaceName}`;\n }\n\n return null;\n}\n"],"names":["readRuntimeConfig","trimUrl","value","getPlaneBaseUrl","plane","c","buildCrossAppUrl","path","base","rel","crossAppNav","navigate","url","isWorkbenchApp","app","t","isBuiltInShellApp","kind","getAppLaunchUrl","resolveLanding","input","apps","last","a","dateToCalendarYmd","d","y","m","day","toDateInputValue","s","getLocale","locale","formatDate","date","currentLocale","formatNumber","num","formatBytes","bytes","decimals","k","dm","sizes","i","unit","formatLargeNumber","precision","absNum","sign","units","cleaned","formatTokens","tokens","showUnit","formatDuration","seconds","minutes","remainingSeconds","minuteUnit","secondUnit","formatDurationFromMs","ms","formatDateTime","dateString","formatLocalDate","isoDate","ymd","tz","getTimeZone","formatLocalDateTime","isoDatetime","formatRelativeTime","diffInSeconds","hours","days","months","years","error","formatUserLabel","profile","userId","emptyLabel","name","email","id","debounce","func","delay","timeoutId","args","throttle","lastCallTime","now","timeSinceLastCall","DEFAULT_STORAGE_KEY","storageKey","options","isChunkLoadError","err","e","msg","isLikelyViteBundleScript","src","tryReloadOnce","key","reloadOnceIfChunkError","recoveryInstalled","setupChunkLoadRecovery","event","normalizePathname","pathname","ruleMatches","prefix","p","pre","namespacesForPath","rules","sorted","b","rule","OAUTH_REDIRECT_URI_STORAGE_KEY","createSSOClient","config","getConfigFn","appType","defaultReturnPath","identifyApp","hostname","getOAuthRedirectUri","openLoginUrl","activeOAuthRedirectUri","stored","SCOPE","appConfigCache","pendingRequest","getApplicationConfig","currentDomain","apiBaseUrl","response","resolve","result","startLogin","returnPath","state","generateState","appConfig","clientId","appUrl","oauthRedirectUri","override","appAuthUrl","from","loginUrl","handleCallback","urlParams","code","appTypeValue","callbackUrl","errorText","errorData","data","parseState","decoded","storedState","clearCache","LOGOUT_NOTIFICATION_PATH","LOGOUT_COMPLETED_MESSAGE","collectLogoutNotificationUrls","candidates","seenOrigins","urls","raw","origin","broadcastInProgress","isLogoutBroadcastInProgress","broadcastLogoutNotifications","timeoutMs","iframes","pendingOrigins","u","timer","finished","finish","onMessage","frame","ev","iframe","FALLBACK_IANA_IDS","trySupportedTimeZones","intl","getAllIanaTimeZoneIds","fromIntl","getGmtOffsetShort","timeZone","getTimeZoneDisplayName","timeZoneId","buildTimeZoneSelectOptions","refDate","display","off","label","normalizeOperatorLang","language","isObject","v","mergeSchemaLocale","patch","out","propsOut","pProps","pPatch","sub","pEl","bArr","pArr","patchSchemaNodeHasContent","node","el","arr","pickLocaleTitle","canonical","ct","pt","pickLocaleDescription","cd","pd","syncSchemaLocalePatchWithCanonical","existingPatch","pItems","outItems","x","one","pList","built","n","ap","syncOperatorMetadataLocalesWithCanonicalSchemas","md","localesRaw","locales","validIds","methodById","localeKey","block","nextBlock","synced","kept","row","canon","nm","inS","outS","stripTenantOperatorSystemConfigurationDeep","op","systemConfiguration","rest","uo","userZhBlockHasContent","uoZh","mergeLinkedSystemLocalesIntoTenantOperator","linked","lmeta","sysLocales","sysZh","userMeta","userLocales","userZh","mergeZhLocaleIntoOperatorRecord","meta","zh","zhMethods","byId","method","loc","prepareTenantOperatorApiResponseForConsole","mergeImportedOperatorDefinitionLocale","definition","clone","getOperatorDefinitionDisplay","lng","methodsRaw","methodRows","list","description","methods","displayName","displayDesc","COUNTRY_CODES","getCountryByCode","country","getCountriesByDialCode","dialCode","getAllCountries","searchCountries","query","lowerQuery","GREATER_CHINA_COUNTRY_CODES","getGreaterChinaCountries","validateNationalNumber","national","digits","formatPhoneNumber","phoneNumber","cleanNumber","parsePhoneNumber","match","getChinaCountry","normalizeIframeBaseUrl","isExpandedGeniappIframeBase","baseUrl","identifier","parts","identifierIndex","buildAppIframeSrc","innerPath","baseNorm","tail","shellPathnameToInnerPath","appSlug","pathnameWithinBase","viteBaseRaw","pathnameNorm","pathNoTrailing","GENISPACE_APP_IDS","DEFAULT_WATERMARK_APPS","DEFAULT_SPACE_SETTINGS","isPlainObject","deepMergeSettings","patchVal","baseVal","normalizeSpaceSettings","merged","watermark","isSpaceWatermarkEnabled","appId","settings","readStoredUserPhone","storedUser","user","phone","buildWatermarkLabel","spaceName","localPart"],"mappings":";;;AAsBA,SAASA,IAAmC;AAC1C,SAAI,OAAO,SAAW,MAAoB,CAAA,IACjC,OAAuD,kBAAmB,CAAA;AACrF;AAEA,SAASC,EAAQC,GAAwB;AACvC,SAAO,OAAOA,KAAU,YAAYA,EAAM,KAAA,MAAW,KAAKA,EAAM,KAAA,EAAO,QAAQ,OAAO,EAAE,IAAI;AAC9F;AAMO,SAASC,EAAgBC,GAAyB;AACvD,QAAMC,IAAIL,EAAA;AACV,UAAQI,GAAA;AAAA,IACN,KAAK;AACH,aAAOH,EAAQI,EAAE,OAAO;AAAA,IAC1B,KAAK;AACH,aAAOJ,EAAQI,EAAE,WAAW;AAAA,IAC9B,KAAK;AACH,aAAOJ,EAAQI,EAAE,SAAS;AAAA,IAC5B,KAAK;AACH,aAAOJ,EAAQI,EAAE,aAAa;AAAA,IAChC,KAAK;AACH,aAAOJ,EAAQI,EAAE,QAAQ;AAAA,IAC3B;AACE,aAAO;AAAA,EAAA;AAEb;AAGO,SAASC,EAAiBF,GAAiBG,IAAO,IAAY;AACnE,QAAMC,IAAOL,EAAgBC,CAAK,GAC5BK,IAAMF,IAAQA,EAAK,WAAW,GAAG,IAAIA,IAAO,IAAIA,CAAI,KAAM;AAChE,SAAKC,IACE,GAAGA,CAAI,GAAGC,CAAG,KADFA,KAAO;AAE3B;AAMO,SAASC,GACdN,GACAG,IAAO,IACPI,GACM;AACN,QAAMH,IAAOL,EAAgBC,CAAK,GAC5BQ,IAAMN,EAAiBF,GAAOG,CAAI;AACxC,MAAI,CAACC,KAAQG,GAAU;AACrB,IAAAA,EAASC,CAAG;AACZ;AAAA,EACF;AACA,EAAI,OAAO,SAAW,OACpB,OAAO,SAAS,OAAOA,CAAG;AAE9B;AAkBA,SAASC,GAAeC,GAA6B;AAEnD,OADcA,EAAI,QAAQ,IAAI,YAAA,MACjB,YAAa,QAAO,CAAC,CAACA,EAAI;AACvC,QAAMC,KAAKD,EAAI,QAAQ,IAAI,YAAA;AAC3B,UAAQC,MAAM,eAAeA,MAAM,cAAc,CAAC,CAACD,EAAI;AACzD;AAEA,SAASE,GAAkBF,GAA6B;AACtD,QAAMG,KAAQH,EAAI,QAAQ,IAAI,YAAA;AAC9B,MAAIG,MAAS,cAAcA,MAAS,aAAaA,MAAS,QAAS,QAAO;AAC1E,QAAMF,KAAKD,EAAI,QAAQ,IAAI,YAAA;AAC3B,SAAOC,MAAM,aAAaA,MAAM;AAClC;AAUO,SAASG,GAAgBJ,GAAmC;AACjE,MAAID,GAAeC,CAAG,GAAG;AACvB,UAAMN,IAAOL,EAAgB,WAAW;AACxC,WAAIK,IAAa,GAAGA,CAAI,cAAcM,EAAI,WAAW,KAC9C;AAAA,EACT;AACA,MAAIE,GAAkBF,CAAG,GAAG;AAC1B,UAAMN,IAAOL,EAAgB,OAAO;AACpC,WAAIK,IAAa,GAAGA,CAAI,IAAIM,EAAI,UAAU,KACnC;AAAA,EACT;AACA,SAAIA,EAAI,cACC,WAAWA,EAAI,WAAW,KAE5B;AACT;AAsBO,SAASK,GAAeC,GAA2C;AACxE,QAAMC,IAAO,MAAM,QAAQD,EAAM,cAAc,IAAIA,EAAM,iBAAiB,CAAA;AAG1E,MAAIA,EAAM,oBAAoBA,EAAM,gBAAgB;AAClD,WAAO,EAAE,MAAM,WAAW,MAAM,aAAA;AAGlC,MAAIA,EAAM,WAAW;AACnB,UAAME,IAAOD,EAAK,KAAK,CAACE,MAAMA,EAAE,OAAOH,EAAM,SAAS;AACtD,QAAIE,EAAM,QAAO,EAAE,MAAM,OAAO,KAAKA,EAAA;AAAA,EACvC;AAEA,SAAID,EAAK,WAAW,KAAK,CAACD,EAAM,mBACvB,EAAE,MAAM,OAAO,KAAKC,EAAK,CAAC,EAAA,IAG/BA,EAAK,SAAS,IACT,EAAE,MAAM,WAAA,IAGbD,EAAM,mBACD,EAAE,MAAM,WAAW,MAAM,aAAA,IAG3B,EAAE,MAAM,OAAA;AACjB;ACtLA,SAASI,EAAkBC,GAAiB;AAC1C,QAAMC,IAAID,EAAE,YAAA,GACNE,IAAI,OAAOF,EAAE,SAAA,IAAa,CAAC,EAAE,SAAS,GAAG,GAAG,GAC5CG,IAAM,OAAOH,EAAE,QAAA,CAAS,EAAE,SAAS,GAAG,GAAG;AAC/C,SAAO,GAAGC,CAAC,IAAIC,CAAC,IAAIC,CAAG;AACzB;AAMO,SAASC,GAAiB3B,GAAiD;AAChF,MAAIA,KAAS,QAAQA,MAAU,GAAI,QAAO;AAC1C,MAAIA,aAAiB;AACnB,WAAO,OAAO,MAAMA,EAAM,QAAA,CAAS,IAAI,KAAKsB,EAAkBtB,CAAK;AAErE,QAAM4B,IAAI,OAAO5B,CAAK,EAAE,KAAA;AACxB,MAAI,sBAAsB,KAAK4B,CAAC,EAAG,QAAOA;AAE1C,QAAML,IAAI,IAAI,KAAKK,CAAC;AACpB,SAAK,OAAO,MAAML,EAAE,SAAS,IACtB,KADgCD,EAAkBC,CAAC;AAE5D;ACnBA,SAASM,EAAUC,GAAyB;AAC1C,SAAIA,MAEA,OAAO,YAAc,OAAe,UAAU,WACzC,UAAU,WAGZ;AACT;AAEO,SAASC,GAAWC,GAAqBF,GAAiB;AAC/D,MAAI,CAACE,EAAM,QAAO;AAClB,QAAMT,IAAI,IAAI,KAAKS,CAAI,GACjBC,IAAgBJ,EAAUC,CAAM;AACtC,SAAOP,EAAE,eAAeU,GAAe;AAAA,IACrC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA,CACT;AACH;AAEO,SAASC,GAAaC,GAAaL,GAAiB;AACzD,MAAI,CAACK,EAAK,QAAO;AACjB,QAAMF,IAAgBJ,EAAUC,CAAM;AACtC,SAAOK,EAAI,eAAeF,CAAa;AACzC;AAEO,SAASG,GAAYC,GAAeC,IAAmB,GAAGzB,GAAmD;AAClH,MAAIwB,MAAU;AAEZ,WAAO,KADMxB,IAAIA,EAAE,2BAA2B,OAAO,IAAI,OACzC;AAElB,QAAM0B,IAAI,MACJC,IAAKF,IAAW,IAAI,IAAIA,GACxBG,IAAQ,CAAC,SAAS,MAAM,MAAM,MAAM,MAAM,IAAI,GAC9CC,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,IAAIL,CAAK,IAAI,KAAK,IAAIE,CAAC,CAAC,CAAC,GACzDvC,IAAQ,YAAYqC,IAAQ,KAAK,IAAIE,GAAGG,CAAC,GAAG,QAAQF,CAAE,CAAC,GACvDG,IAAO9B,IAAIA,EAAE,qBAAqB4B,EAAMC,CAAC,EAAE,YAAA,CAAa,IAAID,EAAMC,CAAC,CAAC,IAAID,EAAMC,CAAC;AACrF,SAAO,GAAG1C,CAAK,IAAI2C,CAAI;AACzB;AAEO,SAASC,GAAkBT,GAAaU,IAAoB,GAAGf,GAAyB;AAC7F,MAAI,CAACK,KAAOA,MAAQ,EAAG,QAAO;AAE9B,QAAMW,IAAS,KAAK,IAAIX,CAAG,GACrBY,IAAOZ,IAAM,IAAI,MAAM,IACvBF,IAAgBJ,EAAUC,CAAM;AAEtC,MAAIgB,IAAS;AACX,WAAOC,IAAOD,EAAO,eAAeb,CAAa;AAGnD,QAAMe,IAAQ;AAAA,IACZ,EAAE,OAAO,MAAM,QAAQ,IAAA;AAAA,IACvB,EAAE,OAAO,KAAK,QAAQ,IAAA;AAAA,IACtB,EAAE,OAAO,KAAK,QAAQ,IAAA;AAAA,IACtB,EAAE,OAAO,KAAK,QAAQ,IAAA;AAAA,EAAI;AAG5B,aAAWL,KAAQK;AACjB,QAAIF,KAAUH,EAAK,OAAO;AAGxB,YAAMM,KAFaH,IAASH,EAAK,OAAO,QAAQE,CAAS,EAE/B,QAAQ,UAAU,EAAE;AAC9C,aAAOE,IAAOE,IAAUN,EAAK;AAAA,IAC/B;AAGF,SAAOI,IAAOD,EAAO,eAAeb,CAAa;AACnD;AAEO,SAASiB,GAAaC,GAAgBC,IAAoB,IAAMtB,GAAyB;AAG9F,SAAI,CAACqB,KAAUA,MAAW,IAAU,MAElBjB,GAAaiB,GAAQrB,CAAM;AAG/C;AAEO,MAAMuB,KAAiB,CAACC,GAAiBzC,MAA8D;AAC5G,QAAM0C,IAAU,KAAK,MAAMD,IAAU,EAAE,GACjCE,KAAoBF,IAAU,IAAI,QAAQ,CAAC,GAC3CG,IAAa5C,IAAIA,EAAE,kCAAkC,GAAG,IAAI,KAC5D6C,IAAa7C,IAAIA,EAAE,kCAAkC,GAAG,IAAI;AAClE,SAAO,GAAG0C,CAAO,GAAGE,CAAU,IAAID,CAAgB,GAAGE,CAAU;AACjE,GAEaC,KAAuB,CAACC,GAAY/C,MAA8D;AAC7G,QAAMyC,IAAU,KAAK,MAAMM,IAAK,GAAI;AACpC,SAAOP,GAAeC,GAASzC,CAAC;AAClC,GAEagD,KAAiB,CAACC,GAA2BhC,MAA4B;AACpF,MAAI,CAACgC,EAAY,QAAO;AACxB,QAAM9B,IAAO,IAAI,KAAK8B,CAAU,GAC1B7B,IAAgBJ,EAAUC,CAAM;AACtC,SAAOE,EAAK,eAAeC,CAAa;AAC1C;AAMO,SAAS8B,GAAgBC,GAAoClC,GAAyB;AAC3F,QAAMmC,IAAMtC,GAAiBqC,CAAO;AACpC,MAAI,CAACC,EAAK,QAAO;AACjB,MAAI;AACF,UAAMC,IAAKC,EAAA,GACLlC,IAAgBJ,EAAUC,CAAM;AACtC,WAAO,IAAI,KAAK,eAAeG,GAAe;AAAA,MAC5C,UAAUiC;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,IAAA,CACN,EAAE,OAAO,oBAAI,KAAK,GAAGD,CAAG,YAAY,CAAC;AAAA,EACxC,QAAQ;AACN,WAAOA;AAAA,EACT;AACF;AAKO,SAASG,GAAoBC,GAAwCvC,GAAyB;AACnG,MAAI,CAACuC,EAAa,QAAO;AACzB,MAAI;AACF,UAAMH,IAAKC,EAAA,GACLlC,IAAgBJ,EAAUC,CAAM;AACtC,WAAO,IAAI,KAAK,eAAeG,GAAe;AAAA,MAC5C,UAAUiC;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,IAAA,CACT,EAAE,OAAO,IAAI,KAAKG,CAAW,CAAC;AAAA,EACjC,QAAQ;AACN,WAAOA,EAAY,MAAM,GAAG,EAAE;AAAA,EAChC;AACF;AAEO,MAAMC,KAAqB,CAACR,GAAoBjD,MAAiF;AACtI,MAAI;AACF,UAAMmB,IAAO,IAAI,KAAK8B,CAAU,GAE1BS,IAAgB,KAAK,4BADX,KAAA,GACsB,YAAYvC,EAAK,QAAA,KAAa,GAAI;AAExE,QAAIuC,IAAgB;AAClB,aAAO1D,IAAIA,EAAE,wBAAwB,UAAU,IAAI;AACrD,QAAW0D,IAAgB,MAAM;AAC/B,YAAMhB,IAAU,KAAK,MAAMgB,IAAgB,EAAE;AAC7C,aAAO1D,IACHA,EAAE,2BAA2B,2BAA2B,EAAE,SAAA0C,EAAA,CAAS,IACnE,GAAGA,CAAO;AAAA,IAChB,WAAWgB,IAAgB,OAAO;AAChC,YAAMC,IAAQ,KAAK,MAAMD,IAAgB,IAAI;AAC7C,aAAO1D,IACHA,EAAE,yBAAyB,uBAAuB,EAAE,OAAA2D,EAAA,CAAO,IAC3D,GAAGA,CAAK;AAAA,IACd,WAAWD,IAAgB,QAAS;AAClC,YAAME,IAAO,KAAK,MAAMF,IAAgB,KAAK;AAC7C,aAAO1D,IACHA,EAAE,wBAAwB,qBAAqB,EAAE,MAAA4D,EAAA,CAAM,IACvD,GAAGA,CAAI;AAAA,IACb,WAAWF,IAAgB,SAAU;AACnC,YAAMG,IAAS,KAAK,MAAMH,IAAgB,MAAO;AACjD,aAAO1D,IACHA,EAAE,0BAA0B,yBAAyB,EAAE,QAAA6D,EAAA,CAAQ,IAC/D,GAAGA,CAAM;AAAA,IACf,OAAO;AACL,YAAMC,IAAQ,KAAK,MAAMJ,IAAgB,OAAQ;AACjD,aAAO1D,IACHA,EAAE,yBAAyB,uBAAuB,EAAE,OAAA8D,EAAA,CAAO,IAC3D,GAAGA,CAAK;AAAA,IACd;AAAA,EACF,SAASC,GAAO;AACd,mBAAQ,KAAK,2BAA2BA,CAAK,GACtC/D,IAAIA,EAAE,uBAAuB,cAAc,IAAI;AAAA,EACxD;AACF;ACnLO,SAASgE,GACdC,GACAC,GACAC,IAAa,KACL;AACR,QAAMC,IAAOH,GAAS,MAAM,KAAA;AAC5B,MAAIG,EAAM,QAAOA;AACjB,QAAMC,IAAQJ,GAAS,OAAO,KAAA;AAC9B,MAAII,EAAO,QAAOA;AAClB,QAAMC,IAAKJ,GAAQ,KAAA;AACnB,SAAII,IACEA,EAAG,UAAU,KAAWA,IACrB,GAAGA,EAAG,MAAM,GAAG,CAAC,CAAC,MAEnBH;AACT;ACvBO,SAASI,GACdC,GACAC,GACkC;AAClC,MAAIC;AAEJ,SAAO,YAA4BC,GAAqB;AACtD,iBAAaD,CAAS,GACtBA,IAAY,WAAW,MAAMF,EAAK,MAAM,MAAMG,CAAI,GAAGF,CAAK;AAAA,EAC5D;AACF;ACVO,SAASG,GACdJ,GACAC,GACkC;AAClC,MAAII,IAAe,GACfH,IAAmC;AAEvC,SAAO,YAA4BC,GAAqB;AACtD,UAAMG,IAAM,KAAK,IAAA,GACXC,IAAoBD,IAAMD;AAEhC,IAAIE,KAAqBN,KAEvBI,IAAeC,GACfN,EAAK,MAAM,MAAMG,CAAI,MAGjBD,KACF,aAAaA,CAAS,GAExBA,IAAY,WAAW,MAAM;AAC3B,MAAAG,IAAe,KAAK,IAAA,GACpBL,EAAK,MAAM,MAAMG,CAAI,GACrBD,IAAY;AAAA,IACd,GAAGD,IAAQM,CAAiB;AAAA,EAEhC;AACF;AC3BA,MAAMC,KAAsB;AAE5B,SAASC,EAAWC,GAA2C;AAC7D,SAAOA,GAAS,cAAcF;AAChC;AAEO,SAASG,EAAiBC,GAAuB;AACtD,MAAI,CAACA,KAAO,OAAOA,KAAQ,SAAU,QAAO;AAC5C,QAAMC,IAAID;AACV,MAAIC,EAAE,SAAS,iBAAkB,QAAO;AACxC,QAAMC,IAAM,OAAOD,EAAE,WAAW,EAAE;AAClC,SACEC,EAAI,SAAS,6CAA6C,KAC1DA,EAAI,SAAS,kCAAkC,KAC/CA,EAAI,SAAS,2CAA2C,KACxDA,EAAI,SAAS,eAAe,KAC5BA,EAAI,SAAS,6BAA6B;AAE9C;AAEA,SAASC,GAAyBC,GAAsB;AACtD,MAAI,CAACA,EAAK,QAAO;AACjB,MAAI;AAEF,WADU,IAAI,IAAIA,GAAK,OAAO,SAAW,MAAc,OAAO,SAAS,SAAS,kBAAkB,EACzF,SAAS,SAAS,UAAU;AAAA,EACvC,QAAQ;AACN,WAAOA,EAAI,SAAS,UAAU;AAAA,EAChC;AACF;AAEA,SAASC,EAAcC,GAAsB;AAI3C,SAHI,OAAO,SAAW,OAAe,OAAO,iBAAmB,OAG3D,eAAe,QAAQA,CAAG,IACrB,MAET,eAAe,QAAQA,GAAK,GAAG,GAC/B,OAAO,SAAS,OAAA,GACT;AACT;AAEO,SAASC,GACd5B,GACAmB,GACS;AACT,SAAKC,EAAiBpB,CAAK,IAGpB0B,EAAcR,EAAWC,CAAO,CAAC,IAF/B;AAGX;AAEA,IAAIU,IAAoB;AAEjB,SAASC,GAAuBX,GAAyC;AAC9E,MAAI,OAAO,SAAW,OAAeU;AACnC;AAEF,EAAAA,IAAoB;AACpB,QAAMF,IAAMT,EAAWC,CAAO;AAE9B,SAAO,iBAAiB,sBAAsB,CAACY,MAAU;AACvD,IAAKX,EAAiBW,EAAM,MAAM,MAClCA,EAAM,eAAA,GACNL,EAAcC,CAAG;AAAA,EACnB,CAAC,GAED,OAAO;AAAA,IACL;AAAA,IACA,CAACI,MAAU;AACT,YAAM9F,IAAI8F,EAAM;AAChB,MAAI,EAAE9F,aAAa,sBAAsB,CAACA,EAAE,OACvCuF,GAAyBvF,EAAE,GAAG,KACnCyF,EAAcC,CAAG;AAAA,IACnB;AAAA,IACA;AAAA,EAAA;AAEJ;ACvEA,SAASK,GAAkBC,GAA0B;AACnD,SAAI,CAACA,KAAYA,MAAa,KAAW,MAClCA,EAAS,WAAW,GAAG,IAAIA,IAAW,IAAIA,CAAQ;AAC3D;AAEA,SAASC,GAAYD,GAAkBE,GAAyB;AAC9D,QAAMC,IAAIJ,GAAkBC,CAAQ;AACpC,MAAIE,MAAW;AACb,WAAOC,MAAM,OAAOA,MAAM;AAE5B,QAAMC,IAAMF,EAAO,SAAS,GAAG,IAAIA,EAAO,MAAM,GAAG,EAAE,IAAIA;AACzD,SAAKE,EAAI,WAAW,GAAG,IAGhBD,MAAMC,KAAOD,EAAE,WAAW,GAAGC,CAAG,GAAG,IAFjC;AAGX;AAEO,SAASC,GACdL,GACAM,GACU;AACV,QAAMC,IAAS,CAAC,GAAGD,CAAK,EAAE,KAAK,CAAC9F,GAAGgG,MAAMA,EAAE,OAAO,SAAShG,EAAE,OAAO,MAAM;AAC1E,aAAWiG,KAAQF;AACjB,QAAIN,GAAYD,GAAUS,EAAK,MAAM;AACnC,aAAO,CAAC,GAAGA,EAAK,UAAU;AAG9B,SAAO,CAAA;AACT;AClCA,MAAMC,IAAiC;AA4DhC,SAASC,GAAgBC,GAAoC;AAClE,QAAM;AAAA,IACJ,WAAWC;AAAA,IACX,SAAAC;AAAA,IACA,mBAAAC,IAAoB;AAAA,IACpB,aAAAC,IAAc,MAAM;AAClB,YAAMC,IAAW,OAAO,SAAS;AACjC,aAAIA,EAAS,SAAS,OAAO,IAAU,UACnCA,EAAS,SAAS,WAAW,IAAU,cACpC;AAAA,IACT;AAAA,IACA,qBAAAC;AAAA,IACA,cAAAC;AAAA,EAAA,IACEP;AAEJ,MAAIQ,IAAyB,GAAG,OAAO,SAAS,MAAM;AACtD,MAAI;AACF,UAAMC,IAAS,eAAe,QAAQX,CAA8B;AACpE,IAAIW,MAAQD,IAAyBC;AAAA,EACvC,QAAQ;AAAA,EAER;AACA,QAAMC,IAAQ;AAEd,MAAIC,IAA2C,MAE3CC,IAAoD;AAExD,iBAAeC,IAAmD;AAEhE,QAAIF;AACF,aAAOA;AAGT,QAAIC;AACF,aAAOA;AAGT,UAAME,IAAgB,OAAO,SAAS,QAChCC,IAAad,IAAc;AAEjC,WAAAW,KAAkB,YAAY;AAC5B,UAAI;AACF,cAAMI,IAAW,MAAM;AAAA,UACrB,GAAGD,CAAU,sCAAsC,mBAAmBD,CAAa,CAAC;AAAA,QAAA;AAGtF,YAAI,CAACE,EAAS,IAAI;AAEhB,cAAIA,EAAS,WAAW;AACtB,2BAAQ,KAAK,kDAAkD,GAC/D,MAAM,IAAI,QAAQ,CAAAC,MAAW,WAAWA,GAAS,GAAI,CAAC,GAEtDL,IAAiB,MACVC,EAAA;AAET,gBAAM,IAAI,MAAM,qCAAqCG,EAAS,MAAM,EAAE;AAAA,QACxE;AAEA,cAAME,IAAS,MAAMF,EAAS,KAAA;AAE9B,YAAI,CAACE,EAAO,WAAW,CAACA,EAAO;AAC7B,gBAAM,IAAI,MAAM,mDAAmD;AAGrE,cAAMlB,IAA4BkB,EAAO;AACzC,eAAAP,IAAiBX,GACVA;AAAAA,MACT,SAAS7C,GAAO;AACd,sBAAQ,MAAM,qCAAqCA,CAAK,GAClD,IAAI,MAAM,yEAAyE;AAAA,MAC3F,UAAA;AAEE,QAAAyD,IAAiB;AAAA,MACnB;AAAA,IACF,GAAA,GAEOA;AAAA,EACT;AAEA,iBAAeO,EAAWC,GAAoC;AAC5D,QAAI;AACF,YAAMC,IAAQC,EAAcF,CAAU,GAChCG,IAAY,MAAMV,EAAA,GAClBW,IAAWD,EAAU,WAQrBE,IAHH,OAAO,SAAW,OAChB,OAA8D,gBAAgB,WACjF,MAC8BxB,EAAA,EAAc,WAAW;AAGzD,UAAIyB,IADoB,GAAG,OAAO,SAAS,MAAM;AAEjD,UAAI;AACF,cAAMC,IAAW,MAAMrB,IAAA;AACvB,QAAIqB,MAAUD,IAAmBC;AAAA,MACnC,SAASlD,GAAG;AACV,gBAAQ,KAAK,gEAAgEA,CAAC;AAAA,MAChF;AACA,MAAA+B,IAAyBkB;AACzB,UAAI;AACF,uBAAe,QAAQ5B,GAAgC4B,CAAgB;AAAA,MACzE,QAAQ;AAAA,MAER;AAEA,YAAME,IAAa,IAAI,IAAI,GAAGH,CAAM,YAAY;AAChD,MAAAG,EAAW,aAAa,IAAI,aAAaJ,CAAQ,GACjDI,EAAW,aAAa,IAAI,gBAAgBF,CAAgB,GAC5DE,EAAW,aAAa,IAAI,iBAAiB,MAAM,GACnDA,EAAW,aAAa,IAAI,SAASlB,CAAK,GAC1CkB,EAAW,aAAa,IAAI,SAASP,CAAK,GAG1CO,EAAW,aAAa,IAAI,UAAUL,EAAU,mBAAmB,SAAS,SAAS;AAErF,YAAMM,IAAOzB,EAAA;AACb,MAAAwB,EAAW,aAAa,IAAI,QAAQC,CAAI;AAExC,YAAMC,IAAWF,EAAW,SAAA;AAE5B,MAAIrB,IACF,MAAM,QAAQ,QAAQA,EAAauB,CAAQ,CAAC,IAE5C,OAAO,SAAS,OAAOA;AAAA,IAE3B,SAAS3E,GAAO;AACd,oBAAQ,MAAM,8BAA8BA,CAAK,GAC3CA;AAAA,IACR;AAAA,EACF;AAEA,iBAAe4E,IAA6C;AAC1D,UAAMC,IAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM,GACtDC,IAAOD,EAAU,IAAI,MAAM,GAC3B7E,IAAQ6E,EAAU,IAAI,OAAO;AAEnC,QAAI7E;AACF,oBAAQ,MAAM,qCAAqCA,CAAK,GAClD,IAAI,MAAM,gBAAgBA,CAAK,EAAE;AAGzC,QAAI,CAAC8E;AACH,oBAAQ,MAAM,oDAAoD,GAC5D,IAAI,MAAM,8BAA8B;AAGhD,QAAI;AAGF,YAAMC,KADY,MAAMrB,EAAA,GACO,YAAYX,GAGrCiC,IAAc,GADDlC,IAAc,YACA,iBAAiBiC,CAAY,aAExDlB,IAAW,MAAM,MAAMmB,GAAa;AAAA,QACxC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAAA;AAAA,QAElB,MAAM,KAAK,UAAU;AAAA,UACnB,MAAAF;AAAA,UACA,aAAazB;AAAA,QAAA,CACd;AAAA,MAAA,CACF;AAED,UAAI,CAACQ,EAAS,IAAI;AAChB,cAAMoB,IAAY,MAAMpB,EAAS,KAAA;AACjC,gBAAQ,MAAM,+CAA+C;AAAA,UAC3D,QAAQA,EAAS;AAAA,UACjB,YAAYA,EAAS;AAAA,UACrB,WAAAoB;AAAA,QAAA,CACD;AAED,YAAIC;AACJ,YAAI;AACF,UAAAA,IAAY,KAAK,MAAMD,CAAS;AAAA,QAClC,QAAQ;AACN,UAAAC,IAAY,EAAE,SAASD,KAAa,gBAAA;AAAA,QACtC;AAEA,cAAM,IAAI,MAAMC,EAAU,WAAW,0BAA0BrB,EAAS,MAAM,EAAE;AAAA,MAClF;AAEA,YAAMsB,IAAO,MAAMtB,EAAS,KAAA;AAE5B,UAAI,CAACsB,EAAK,WAAW,CAACA,EAAK;AACzB,sBAAQ,MAAM,+CAA+CA,CAAI,GAC3D,IAAI,MAAMA,EAAK,WAAW,yCAAyC;AAG3E,UAAI;AACF,uBAAe,WAAWxC,CAA8B;AAAA,MAC1D,QAAQ;AAAA,MAER;AACA,aAAO;AAAA,QACL,OAAOwC,EAAK,KAAK;AAAA,QACjB,cAAcA,EAAK,KAAK;AAAA,QACxB,WAAWA,EAAK,KAAK;AAAA,QACrB,MAAMA,EAAK,KAAK;AAAA,MAAA;AAAA,IAEpB,SAASnF,GAAO;AACd,oBAAQ,MAAM,uDAAuD;AAAA,QACnE,OAAOA,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AAAA,QAC5D,OAAOA,aAAiB,QAAQA,EAAM,QAAQ;AAAA,MAAA,CAC/C,GACKA;AAAAA,IACR;AAAA,EACF;AAEA,WAASmE,EAAcF,GAA6B;AAClD,UAAMC,IAAmB;AAAA,MACvB,OAAO,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,IAAI,KAAK,SAAS,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAAA,MAC/F,YACED,KAAcjB,KAAqB,OAAO,SAAS,WAAW,OAAO,SAAS;AAAA,MAChF,WAAW,KAAK,IAAA;AAAA,IAAI;AAGtB,0BAAe,QAAQ,eAAe,KAAK,UAAUkB,CAAK,CAAC,GAEpD,KAAK,KAAK,UAAUA,CAAK,CAAC;AAAA,EACnC;AAEA,WAASkB,EAAWlB,GAAiC;AACnD,QAAI;AACF,YAAMmB,IAAU,KAAK,MAAM,KAAKnB,CAAK,CAAC,GAEhCoB,IAAc,eAAe,QAAQ,aAAa;AACxD,aAAIA,KACa,KAAK,MAAMA,CAAW,EAC1B,UAAUD,EAAQ,SAE3B,eAAe,WAAW,aAAa,GAChCA;AAAA,IAKb,SAASrF,GAAO;AACd,qBAAQ,MAAM,0BAA0BA,CAAK,GACtC;AAAA,IACT;AAAA,EACF;AAEA,WAASuF,IAAmB;AAC1B,IAAA/B,IAAiB;AACjB,QAAI;AACF,qBAAe,WAAWb,CAA8B;AAAA,IAC1D,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAAqB;AAAA,IACA,gBAAAY;AAAA,IACA,YAAAQ;AAAA,IACA,YAAAG;AAAA,EAAA;AAEJ;ACrTO,MAAMC,KAA2B,wBAC3BC,KAA2B;AAYxC,SAASvK,KAAyC;AAChD,SAAI,OAAO,SAAW,MAAoB,CAAA,IAClC,OAA6D,kBAAkB,CAAA;AACzF;AAOO,SAASwK,KAA0C;AACxD,MAAI,OAAO,SAAW,IAAa,QAAO,CAAA;AAC1C,QAAMnK,IAAIL,GAAA,GACJyK,IAAa;AAAA,IACjBpK,EAAE;AAAA,IACFA,EAAE;AAAA,IACFA,EAAE;AAAA,IACFA,EAAE;AAAA,IACFA,EAAE;AAAA,IACFA,EAAE;AAAA,IACFA,EAAE;AAAA,EAAA,GAEEqK,IAAc,oBAAI,IAAY,CAAC,OAAO,SAAS,MAAM,CAAC,GACtDC,IAAiB,CAAA;AACvB,aAAWC,KAAOH,GAAY;AAC5B,UAAMjK,IAAO,OAAOoK,KAAQ,WAAWA,EAAI,OAAO,QAAQ,QAAQ,EAAE,IAAI;AACxE,QAAI,CAACpK,EAAM;AACX,QAAIqK,IAAS;AACb,QAAI;AACF,MAAAA,IAAS,IAAI,IAAIrK,GAAM,OAAO,SAAS,MAAM,EAAE;AAAA,IACjD,QAAQ;AACN;AAAA,IACF;AACA,IAAIkK,EAAY,IAAIG,CAAM,MAC1BH,EAAY,IAAIG,CAAM,GACtBF,EAAK,KAAK,GAAGnK,CAAI,GAAG8J,EAAwB,EAAE;AAAA,EAChD;AACA,SAAOK;AACT;AASA,IAAIG,IAAsB;AAEnB,SAASC,KAAuC;AACrD,SAAOD;AACT;AAOO,SAASE,GACdL,IAAiBH,MACjBS,IAAY,MACG;AACf,SAAI,OAAO,SAAW,OAAe,OAAO,WAAa,OAAeN,EAAK,WAAW,IAC/E,QAAQ,QAAA,KAEjBG,IAAsB,IACf,IAAI,QAAQ,CAAClC,MAAY;AAC9B,UAAMsC,IAA+B,CAAA,GAC/BC,IAAiB,IAAI;AAAA,MACzBR,EACG,IAAI,CAACS,MAAM;AACV,YAAI;AACF,iBAAO,IAAI,IAAIA,GAAG,OAAO,SAAS,MAAM,EAAE;AAAA,QAC5C,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF,CAAC,EACA,OAAO,OAAO;AAAA,IAAA;AAEnB,QAAIC,IAAQ,GACRC,IAAW;AACf,UAAMC,IAAS,MAAM;AACnB,UAAI,CAAAD,GACJ;AAAA,QAAAA,IAAW,IACXR,IAAsB,IACtB,OAAO,oBAAoB,WAAWU,CAAS,GAC/C,OAAO,aAAaH,CAAK;AACzB,mBAAWI,KAASP,EAAS,CAAAO,EAAM,YAAY,YAAYA,CAAK;AAChE,QAAA7C,EAAA;AAAA;AAAA,IACF,GACM4C,IAAY,CAACE,MAAqB;AACtC,MAAIA,EAAG,SAASnB,OAChBY,EAAe,OAAOO,EAAG,MAAM,GAC3BP,EAAe,SAAS,KAAGI,EAAA;AAAA,IACjC;AACA,WAAO,iBAAiB,WAAWC,CAAS,GAC5CH,IAAQ,OAAO,WAAWE,GAAQN,CAAS;AAC3C,eAAWrK,KAAO+J,GAAM;AACtB,YAAMgB,IAAS,SAAS,cAAc,QAAQ;AAC9C,MAAAA,EAAO,MAAM,UAAU,QACvBA,EAAO,aAAa,eAAe,MAAM,GACzCA,EAAO,MAAM/K,GACb,SAAS,KAAK,YAAY+K,CAAM,GAChCT,EAAQ,KAAKS,CAAM;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AC/HA,MAAMC,KAAuC;AAAA,EAC3C;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAASC,KAAyC;AAChD,MAAI;AACF,UAAMC,IAAO;AACb,QAAI,OAAOA,EAAK,qBAAsB;AACpC,aAAOA,EAAK,kBAAkB,UAAU;AAAA,EAE5C,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAGO,SAASC,KAAkC;AAChD,QAAMC,IAAWH,GAAA;AACjB,SAAIG,GAAU,SACL,CAAC,GAAGA,CAAQ,EAAE,KAAK,CAACzK,GAAGgG,MAAMhG,EAAE,cAAcgG,CAAC,CAAC,IAEjD,CAAC,GAAGqE,EAAiB,EAAE,KAAK,CAACrK,GAAGgG,MAAMhG,EAAE,cAAcgG,CAAC,CAAC;AACjE;AAEA,SAAS0E,GAAkBC,GAAkBhK,GAAoB;AAC/D,MAAI;AAKF,WAJc,IAAI,KAAK,eAAe,SAAS;AAAA,MAC7C,UAAAgK;AAAA,MACA,cAAc;AAAA,IAAA,CACf,EAAE,cAAchK,CAAI,EACR,KAAK,CAACgF,MAAMA,EAAE,SAAS,cAAc,GAAG,SAAS;AAAA,EAChE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASiF,GAAuBC,GAAoBpK,GAAwB;AAC1E,MAAI;AAIF,UAAMmD,IAHK,IAAI,KAAK,aAAa,CAACnD,CAAM,GAAG;AAAA,MACzC,MAAM;AAAA,IAAA,CACP,EACe,GAAGoK,CAAU;AAC7B,QAAIjH,EAAM,QAAOA;AAAA,EACnB,QAAQ;AAAA,EAER;AACA,SAAOiH;AACT;AAOO,SAASC,GAA2BrK,GAAgBsK,IAAU,oBAAI,QAAgC;AAEvG,QAAMrG,IADM8F,GAAA,EACgC,IAAI,CAAC1G,MAAO;AACtD,UAAMkH,IAAUJ,GAAuB9G,GAAIrD,CAAM,GAC3CwK,IAAMP,GAAkB5G,GAAIiH,CAAO,GACnCG,IAAQD,IAAM,GAAGD,CAAO,KAAKC,CAAG,MAAMD;AAC5C,WAAO,EAAE,OAAOlH,GAAI,OAAAoH,EAAA;AAAA,EACtB,CAAC;AACD,SAAAxG,EAAQ,KAAK,CAAC1E,GAAGgG,MAAMhG,EAAE,MAAM,cAAcgG,EAAE,OAAOvF,GAAQ,EAAE,aAAa,OAAA,CAAQ,CAAC,GAC/EiE;AACT;ACzHO,SAASyG,EAAsBC,GAA4C;AAEhF,UADaA,KAAY,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,YAAA,EAClC,WAAW,IAAI,IAAI,OAAO;AACvC;AAIA,SAASC,EAASC,GAA6B;AAC7C,SAAOA,MAAM,QAAQ,OAAOA,KAAM,YAAY,CAAC,MAAM,QAAQA,CAAC;AAChE;AAEO,SAASC,EAAkBtM,GAAeuM,GAAyB;AACxE,MAAI,CAACH,EAASpM,CAAI,KAAK,CAACoM,EAASG,CAAK;AACpC,WAAOvM;AAET,QAAMwM,IAAkB,EAAE,GAAGxM,EAAA;AAO7B,MANIuM,EAAM,gBAAgB,WACxBC,EAAI,cAAcD,EAAM,cAEtBA,EAAM,UAAU,WAClBC,EAAI,QAAQD,EAAM,QAEhBA,EAAM,cAAcH,EAASpM,EAAK,UAAU,GAAG;AACjD,IAAAwM,EAAI,aAAa,EAAE,GAAGxM,EAAK,WAAA;AAC3B,UAAMyM,IAAWD,EAAI,YACfE,IAASH,EAAM;AACrB,QAAIH,EAASM,CAAM;AACjB,iBAAW,CAACzG,GAAK0G,CAAM,KAAK,OAAO,QAAQD,CAAM;AAC/C,QAAID,EAASxG,CAAG,KAAKmG,EAASO,CAAM,MAClCF,EAASxG,CAAG,IAAIqG,EAAkBG,EAASxG,CAAG,GAAG0G,CAAM;AAAA,EAI/D;AACA,EAAIJ,EAAM,SAASvM,EAAK,UAAU,WAC5B,MAAM,QAAQA,EAAK,KAAK,KAAK,MAAM,QAAQuM,EAAM,KAAK,IACxDC,EAAI,QAAQxM,EAAK,MAAM,IAAI,CAAC4M,GAAKxK,MAAM;AACrC,UAAMyK,IAAON,EAAM,MAAoBnK,CAAC;AACxC,WAAOyK,KAAOT,EAASS,CAAG,IAAIP,EAAkBM,GAAKC,CAAG,IAAID;AAAA,EAC9D,CAAC,IAEDJ,EAAI,QAAQF,EAAkBtM,EAAK,OAAOuM,EAAM,KAAK;AAGzD,aAAWtG,KAAO,CAAC,SAAS,SAAS,OAAO,GAAY;AACtD,UAAM6G,IAAO9M,EAAKiG,CAAG,GACf8G,IAAOR,EAAMtG,CAAG;AACtB,IAAI,MAAM,QAAQ6G,CAAI,KAAK,MAAM,QAAQC,CAAI,KAAKA,EAAK,WACrDP,EAAIvG,CAAG,IAAI6G,EAAK,IAAI,CAACF,GAAKxK,MAAM;AAC9B,YAAMyK,IAAME,EAAK3K,CAAC;AAClB,aAAOyK,KAAOT,EAASS,CAAG,IAAIP,EAAkBM,GAAKC,CAAG,IAAID;AAAA,IAC9D,CAAC;AAAA,EAEL;AACA,SAAIR,EAASpM,EAAK,GAAG,KAAKoM,EAASG,EAAM,GAAG,MAC1CC,EAAI,MAAMF,EAAkBtM,EAAK,KAAKuM,EAAM,GAAG,IAG/CH,EAASpM,EAAK,oBAAoB,KAClCoM,EAASG,EAAM,oBAAoB,MAEnCC,EAAI,uBAAuBF;AAAA,IACzBtM,EAAK;AAAA,IACLuM,EAAM;AAAA,EAAA,IAGHC;AACT;AAEA,SAASQ,EAA0BC,GAAwB;AACzD,MAAI,CAACb,EAASa,CAAI,EAAG,QAAO;AAC5B,MAAIA,EAAK,UAAU,UAAaA,EAAK,gBAAgB,OAAW,QAAO;AACvE,MAAIb,EAASa,EAAK,UAAU;AAC1B,eAAWhL,KAAK,OAAO,KAAKgL,EAAK,UAAU;AACzC,UAAID,EAA0BC,EAAK,WAAWhL,CAAC,CAAC,EAAG,QAAO;AAAA;AAG9D,MAAI,MAAM,QAAQgL,EAAK,KAAK;AAC1B,eAAWC,KAAMD,EAAK;AACpB,UAAIC,KAAO,QAA4BF,EAA0BE,CAAE,EAAG,QAAO;AAAA;AAGjF,aAAWjH,KAAO,CAAC,SAAS,SAAS,OAAO,GAAY;AACtD,UAAMkH,IAAMF,EAAKhH,CAAG;AACpB,QAAI,MAAM,QAAQkH,CAAG;AACnB,iBAAWD,KAAMC;AACf,YAAID,KAAO,QAA4BF,EAA0BE,CAAE,EAAG,QAAO;AAAA;AAAA,EAGnF;AAEA,SADI,GAAAd,EAASa,EAAK,GAAG,KAAKD,EAA0BC,EAAK,GAAG,KACxDb,EAASa,EAAK,oBAAoB,KAAKD,EAA0BC,EAAK,oBAAoB;AAGhG;AAEA,SAASG,GAAgBC,GAAuBd,GAAuC;AACrF,QAAMe,IAAK,OAAOD,EAAU,SAAU,WAAWA,EAAU,QAAQ,QAC7DE,IAAKhB,EAAM,UAAU,UAAa,OAAOA,EAAM,SAAU,WAAWA,EAAM,QAAQ;AACxF,MAAIgB,MAAO,UAAaA,EAAG,SAAS,EAAG,QAAOA;AAC9C,MAAID,MAAO,UAAaA,EAAG,SAAS,EAAG,QAAOA;AAEhD;AAEA,SAASE,GAAsBH,GAAuBd,GAA4B;AAChF,QAAMkB,IAAKJ,EAAU,aACfK,IAAKnB,EAAM;AACjB,MAAwBmB,KAAO,QAAQ,OAAOA,CAAE,EAAE,SAAS,EAAG,QAAOA;AACrE,MAAwBD,KAAO,QAAQ,OAAOA,CAAE,EAAE,SAAS,EAAG,QAAOA;AAEvE;AAEO,SAASE,EACdN,GACAO,GACqC;AACrC,MAAI,CAACxB,EAASiB,CAAS,EAAG;AAC1B,QAAM3G,IAAI0F,EAASwB,CAAa,IAAIA,IAAgB,CAAA,GAC9CpB,IAAkB,CAAA,GAElB,IAAIY,GAAgBC,GAAW3G,CAAC;AACtC,EAAI,MAAM,WAAW8F,EAAI,QAAQ;AACjC,QAAMvL,IAAIuM,GAAsBH,GAAW3G,CAAC;AAG5C,MAFIzF,MAAM,WAAWuL,EAAI,cAAcvL,IAEnCmL,EAASiB,EAAU,UAAU,GAAG;AAClC,UAAMX,IAASN,EAAS1F,EAAE,UAAU,IAAIA,EAAE,aAAa,CAAA,GACjD+F,IAAuB,CAAA;AAC7B,eAAWxG,KAAO,OAAO,KAAKoH,EAAU,UAAU,GAAG;AACnD,YAAMT,IAAMe,EAAmCN,EAAU,WAAWpH,CAAG,GAAGyG,EAAOzG,CAAG,CAAC;AACrF,MAAI2G,MAAQ,UAAaI,EAA0BJ,CAAG,MACpDH,EAASxG,CAAG,IAAI2G;AAAA,IAEpB;AACA,IAAI,OAAO,KAAKH,CAAQ,EAAE,SAAS,MACjCD,EAAI,aAAaC;AAAA,EAErB;AAEA,MAAIY,EAAU,UAAU,QAAW;AACjC,UAAMQ,IAASnH,EAAE;AACjB,QAAI,MAAM,QAAQ2G,EAAU,KAAK,GAAG;AAClC,YAAMN,IAAO,MAAM,QAAQc,CAAM,IAAIA,IAAS,CAAA,GACxCC,IAAWT,EAAU,MAAM,IAAI,CAACT,GAAKxK,MAAM;AAC/C,cAAM8K,IAAKS,EAAmCf,GAAKG,EAAK3K,CAAC,CAAC;AAC1D,eAAO8K,MAAO,UAAaF,EAA0BE,CAAE,IAAIA,IAAK;AAAA,MAClE,CAAC;AACD,MAAIY,EAAS,KAAK,CAACC,MAAMA,MAAM,IAAI,MACjCvB,EAAI,QAAQsB;AAAA,IAEhB,OAAO;AACL,YAAME,IAAML,EAAmCN,EAAU,OAAOQ,CAAM;AACtE,MAAIG,MAAQ,UAAahB,EAA0BgB,CAAG,MACpDxB,EAAI,QAAQwB;AAAA,IAEhB;AAAA,EACF;AAEA,aAAW/H,KAAO,CAAC,SAAS,SAAS,OAAO,GAAY;AACtD,UAAM6G,IAAOO,EAAUpH,CAAG,GACpB8G,IAAOrG,EAAET,CAAG;AAClB,QAAI,MAAM,QAAQ6G,CAAI,KAAKA,EAAK,SAAS,GAAG;AAC1C,YAAMmB,IAAQ,MAAM,QAAQlB,CAAI,IAAIA,IAAO,CAAA,GACrCmB,IAAQpB,EAAK,IAAI,CAACF,GAAKxK,MAAM;AACjC,cAAM8K,IAAKS,EAAmCf,GAAKqB,EAAM7L,CAAC,CAAC;AAC3D,eAAO8K,MAAO,UAAaF,EAA0BE,CAAE,IAAIA,IAAK;AAAA,MAClE,CAAC;AACD,MAAIgB,EAAM,KAAK,CAACH,MAAMA,MAAM,IAAI,MAC9BvB,EAAIvG,CAAG,IAAIiI;AAAA,IAEf;AAAA,EACF;AAEA,MAAI9B,EAASiB,EAAU,GAAG,GAAG;AAC3B,UAAMc,IAAIR,EAAmCN,EAAU,KAAK3G,EAAE,GAAG;AACjE,IAAIyH,MAAM,UAAanB,EAA0BmB,CAAC,MAChD3B,EAAI,MAAM2B;AAAA,EAEd;AACA,MAAI/B,EAASiB,EAAU,oBAAoB,GAAG;AAC5C,UAAMe,IAAKT;AAAA,MACTN,EAAU;AAAA,MACV3G,EAAE;AAAA,IAAA;AAEJ,IAAI0H,MAAO,UAAapB,EAA0BoB,CAAE,MAClD5B,EAAI,uBAAuB4B;AAAA,EAE/B;AAEA,MAAKpB,EAA0BR,CAAG;AAClC,WAAOA;AACT;AAQO,SAAS6B,GAAgD5I,GAKpC;AAC1B,QAAM6I,IAA8BlC,EAAS3G,EAAQ,QAAQ,IAAI,EAAE,GAAGA,EAAQ,SAAA,IAAa,CAAA,GACrF8I,IAAaD,EAAG;AACtB,MAAI,CAAClC,EAASmC,CAAU;AACtB,WAAOD;AAET,QAAME,IAAsB,EAAE,GAAID,EAAA,GAC5BE,IAAW,IAAI,IAAIhJ,EAAQ,QAAQ,IAAI,CAACtE,MAAMA,EAAE,UAAU,CAAC,GAC3DuN,IAAa,IAAI,IAAIjJ,EAAQ,QAAQ,IAAI,CAACtE,MAAM,CAACA,EAAE,YAAYA,CAAC,CAAC,CAAC;AAExE,aAAWwN,KAAa,OAAO,KAAKH,CAAO,GAAG;AAC5C,UAAMI,IAAQJ,EAAQG,CAAS;AAC/B,QAAI,CAACvC,EAASwC,CAAK,EAAG;AACtB,UAAMC,IAAwB,EAAE,GAAGD,EAAA;AAEnC,QAAInJ,EAAQ,wBAAwB,QAAW;AAC7C,YAAMqJ,IAASnB;AAAA,QACblI,EAAQ;AAAA,QACRoJ,EAAU;AAAA,MAAA;AAEZ,MAAIC,MAAkB,cAAcA,WACxBD,EAAU;AAAA,IACxB;AACA,QAAIpJ,EAAQ,yBAAyB,QAAW;AAC9C,YAAMqJ,IAASnB;AAAA,QACblI,EAAQ;AAAA,QACRoJ,EAAU;AAAA,MAAA;AAEZ,MAAIC,MAAkB,eAAeA,WACzBD,EAAU;AAAA,IACxB;AAEA,QAAI,MAAM,QAAQD,EAAM,OAAO,GAAG;AAChC,YAAMG,IAAkB,CAAA;AACxB,iBAAWC,KAAOJ,EAAM,SAAS;AAE/B,YADI,CAACxC,EAAS4C,CAAG,KAAK,OAAOA,EAAI,cAAe,YAC5C,CAACP,EAAS,IAAIO,EAAI,UAAU,EAAG;AACnC,cAAMC,IAAQP,EAAW,IAAIM,EAAI,UAAU;AAC3C,YAAI,CAACC,EAAO;AACZ,cAAMC,IAAiB,EAAE,GAAGF,EAAA,GACtBG,IAAMxB,EAAmCsB,EAAM,aAAaD,EAAI,WAAW;AACjF,QAAIG,MAAQ,cAAcA,WACdD,EAAG;AACf,cAAME,IAAOzB,EAAmCsB,EAAM,cAAcD,EAAI,YAAY;AACpF,QAAII,MAAS,eAAeA,WAChBF,EAAG,cACfH,EAAK,KAAKG,CAAE;AAAA,MACd;AACA,MAAAL,EAAU,UAAUE;AAAA,IACtB;AAEA,IAAAP,EAAQG,CAAS,IAAIE;AAAA,EACvB;AAEA,SAAAP,EAAG,UAAUE,GACNF;AACT;AAUO,SAASe,EAA2CC,GAAmC;AAC5F,SAAOA,EAAG,qBACN,MAAM,QAAQA,EAAG,OAAO,MAC1BA,EAAG,UAAUA,EAAG,QAAQ,IAAI,CAACnO,MAAM;AACjC,QAAI,CAACiL,EAASjL,CAAC,EAAG,QAAOA;AACzB,UAAM8L,IAAO9L,GACP,EAAE,qBAAAoO,GAAqB,GAAGC,EAAA,IAASvC;AAEzC,WAAOuC;AAAA,EACT,CAAC;AAEH,QAAMC,IAAKH,EAAG;AACd,EAAIlD,EAASqD,CAAE,KACbJ,EAA2CI,CAA6B;AAE5E;AAEA,SAASC,GAAsBC,GAAkC;AAC/D,SAAKA,IACE,CAAC,EACNA,EAAK,QACJA,EAAK,gBAAgB,UAAaA,EAAK,gBAAgB,QACxDA,EAAK,eACLA,EAAK,gBACJ,MAAM,QAAQA,EAAK,OAAO,KAAKA,EAAK,QAAQ,SAAS,KANtC;AAQpB;AAEA,SAASC,EAA2CN,GAAmC;AACrF,QAAMO,IAASP,EAAG;AAClB,MAAI,CAAClD,EAASyD,CAAM,GAAG;AACrB,WAAOP,EAAG;AACV;AAAA,EACF;AACA,QAAMQ,IAAQD,EAAO;AACrB,MAAI,CAACzD,EAAS0D,CAAK,KAAK,CAAC1D,EAAS0D,EAAM,OAAO,GAAG;AAChD,WAAOR,EAAG;AACV;AAAA,EACF;AACA,QAAMS,IAAaD,EAAM,SACnBE,IAAQ5D,EAAS2D,EAAW,EAAE,IAAIA,EAAW,KAAK;AACxD,MAAI,CAACC,GAAO;AACV,WAAOV,EAAG;AACV;AAAA,EACF;AACA,QAAMW,IAAW7D,EAASkD,EAAG,QAAQ,IAAI,EAAE,GAAGA,EAAG,SAAA,IAAa,CAAA,GACxDY,IAAc9D,EAAS6D,EAAS,OAAO,IAAI,EAAE,GAAGA,EAAS,QAAA,IAAY,CAAA,GACrEE,IAAS/D,EAAS8D,EAAY,EAAE,IAAKA,EAAY,KAAoB;AAC3E,EAAKR,GAAsBS,CAAM,MAC/BD,EAAY,KAAK,EAAE,GAAGF,EAAA,GACtBC,EAAS,UAAUC,GACnBZ,EAAG,WAAWW,IAEhB,OAAOX,EAAG;AACZ;AAEA,SAASc,EACPd,GACAnD,GACM;AACN,MAAID,EAAsBC,CAAQ,MAAM;AACtC;AAEF,QAAMkE,IAAOf,EAAG;AAChB,MAAI,CAAClD,EAASiE,CAAI;AAChB;AAEF,QAAM7B,IAAU6B,EAAK;AACrB,MAAI,CAACjE,EAASoC,CAAO;AACnB;AAEF,QAAM8B,IAAK9B,EAAQ;AACnB,MAAI,CAACpC,EAASkE,CAAE;AACd;AAGF,EAAI,OAAOA,EAAG,QAAS,YAAYA,EAAG,SACpChB,EAAG,OAAOgB,EAAG,OAEXA,EAAG,gBAAgB,UAAaA,EAAG,gBAAgB,SACrDhB,EAAG,cAAcgB,EAAG;AAGtB,QAAMC,IAAYD,EAAG;AACrB,MAAI,MAAM,QAAQhB,EAAG,OAAO,KAAK,MAAM,QAAQiB,CAAS,GAAG;AACzD,UAAMC,IAAO,IAAI;AAAA,MACfD,EACG,OAAO,CAACpP,MAA8BiL,EAASjL,CAAC,KAAK,OAAOA,EAAE,cAAe,QAAQ,EACrF,IAAI,CAACA,MAAM,CAACA,EAAE,YAAsBA,CAAC,CAAC;AAAA,IAAA;AAE3C,IAAAmO,EAAG,UAAWA,EAAG,QAAsC,IAAI,CAACmB,MAAW;AACrE,YAAM5L,IAAK4L,EAAO,YACZC,IAAM,OAAO7L,KAAO,WAAW2L,EAAK,IAAI3L,CAAE,IAAI;AACpD,UAAI,CAAC6L;AACH,eAAO,EAAE,GAAGD,EAAA;AAEd,YAAMvB,IAAK,EAAE,GAAGuB,EAAA;AAChB,aAAI,OAAOC,EAAI,QAAS,YAAYA,EAAI,SACtCxB,EAAG,OAAOwB,EAAI,OAEZA,EAAI,gBAAgB,UAAaA,EAAI,gBAAgB,SACvDxB,EAAG,cAAcwB,EAAI,cAEnBA,EAAI,eAAexB,EAAG,gBACxBA,EAAG,cAAc5C,EAAkB4C,EAAG,aAAawB,EAAI,WAAW,IAEhEA,EAAI,gBAAgBxB,EAAG,iBACzBA,EAAG,eAAe5C,EAAkB4C,EAAG,cAAcwB,EAAI,YAAY,IAEhExB;AAAA,IACT,CAAC;AAAA,EACH;AAEA,EAAIoB,EAAG,eAAehB,EAAG,gBACvBA,EAAG,cAAchD,EAAkBgD,EAAG,aAAagB,EAAG,WAAW,IAE/DA,EAAG,gBAAgBhB,EAAG,iBACxBA,EAAG,eAAehD,EAAkBgD,EAAG,cAAcgB,EAAG,YAAY;AAExE;AAEO,SAASK,GACdvG,GACA+B,GACS;AACT,MAAI,CAACC,EAAShC,CAAG;AACf,WAAOA;AAET,MAAIvK;AACJ,MAAI;AACF,IAAAA,IAAI,gBAAgBuK,CAAG;AAAA,EACzB,QAAQ;AACN,IAAAvK,IAAI,KAAK,MAAM,KAAK,UAAUuK,CAAG,CAAC;AAAA,EACpC;AACA,EAAAiF,EAA2CxP,CAAC;AAC5C,QAAM4P,IAAK5P,EAAE;AACb,SAAIuM,EAASqD,CAAE,MACbG,EAA2CH,CAA6B,GACxEW,EAAgCX,GAA+BtD,CAAQ,IAEzEyD,EAA2C/P,CAAC,GAC5CuQ,EAAgCvQ,GAAGsM,CAAQ,GACpCtM;AACT;AAEO,SAAS+Q,GACdC,GACA1E,GACG;AACH,MAAI2E;AACJ,MAAI;AACF,IAAAA,IAAQ,gBAAgBD,CAAU;AAAA,EACpC,QAAQ;AACN,IAAAC,IAAQ,KAAK,MAAM,KAAK,UAAUD,CAAU,CAAC;AAAA,EAC/C;AACA,SAAAT,EAAgCU,EAAM,UAAU3E,CAAQ,GACjD2E;AACT;AAQO,SAASC,GACdF,GACA1E,GAC2B;AAC3B,QAAMmD,IAAKuB,EAAW,UAChBG,IAAM9E,EAAsBC,CAAQ,GACpC8E,IAAa,MAAM,QAAQ3B,EAAG,OAAO,IAAKA,EAAG,UAAwC,CAAA,GAErF4B,IAAa,CAACC,MAClBA,EAAK,IAAI,CAAChQ,OAAO;AAAA,IACf,YAAY,OAAOA,EAAE,cAAe,WAAWA,EAAE,aAAa,OAAOA,EAAE,cAAc,EAAE;AAAA,IACvF,MAAM,OAAOA,EAAE,QAAS,WAAWA,EAAE,OAAO,OAAOA,EAAE,QAAQ,EAAE;AAAA,IAC/D,aAAaA,EAAE,eAAe,OAAO,OAAOA,EAAE,WAAW,IAAI;AAAA,EAAA,EAC7D;AAEJ,MAAI6P,MAAQ;AACV,WAAO;AAAA,MACL,MAAM,OAAO1B,EAAG,QAAS,WAAWA,EAAG,OAAO,OAAOA,EAAG,QAAQ,EAAE;AAAA,MAClE,aAAaA,EAAG,eAAe,OAAO,OAAOA,EAAG,WAAW,IAAI;AAAA,MAC/D,SAAS4B,EAAWD,CAAU;AAAA,IAAA;AAIlC,QAAMZ,IAAOf,EAAG,UACVgB,IACJlE,EAASiE,CAAI,KAAKjE,EAASiE,EAAK,OAAO,KAAKjE,EAAUiE,EAAK,QAAuB,EAAE,IAC9EA,EAAK,QAAuB,KAC9B;AAEN,MAAI1L,IAAO,OAAO2K,EAAG,QAAS,WAAWA,EAAG,OAAO,OAAOA,EAAG,QAAQ,EAAE,GACnE8B,IAAc9B,EAAG,eAAe,OAAO,OAAOA,EAAG,WAAW,IAAI;AAEpE,EAAIgB,MACE,OAAOA,EAAG,QAAS,YAAYA,EAAG,SACpC3L,IAAO2L,EAAG,OAERA,EAAG,gBAAgB,UAAaA,EAAG,gBAAgB,SACrDc,IAAc,OAAOd,EAAG,WAAW;AAIvC,QAAMC,IAAYD,KAAM,MAAM,QAAQA,EAAG,OAAO,IAAKA,EAAG,UAAwB,CAAA;AAChF,MAAIC,EAAU,SAAS,GAAG;AACxB,UAAMC,IAAO,IAAI;AAAA,MACfD,EACG,OAAO,CAACpP,MAA8BiL,EAASjL,CAAC,KAAK,OAAOA,EAAE,cAAe,QAAQ,EACrF,IAAI,CAACA,MAAM,CAACA,EAAE,YAAsBA,CAAC,CAAC;AAAA,IAAA,GAErCkQ,IAAUJ,EAAW,IAAI,CAACR,MAAW;AACzC,YAAM5L,IAAK,OAAO4L,EAAO,cAAe,WAAWA,EAAO,aAAa,OAAOA,EAAO,cAAc,EAAE,GAC/FC,IAAMF,EAAK,IAAI3L,CAAE;AACvB,UAAIyM,IAAc,OAAOb,EAAO,QAAS,WAAWA,EAAO,OAAO,OAAOA,EAAO,QAAQ,EAAE,GACtFc,IAAcd,EAAO,eAAe,OAAO,OAAOA,EAAO,WAAW,IAAI;AAC5E,aAAIC,MACE,OAAOA,EAAI,QAAS,YAAYA,EAAI,SACtCY,IAAcZ,EAAI,OAEhBA,EAAI,gBAAgB,UAAaA,EAAI,gBAAgB,SACvDa,IAAc,OAAOb,EAAI,WAAW,KAGjC,EAAE,YAAY7L,GAAI,MAAMyM,GAAa,aAAaC,EAAA;AAAA,IAC3D,CAAC;AACD,WAAO,EAAE,MAAA5M,GAAM,aAAAyM,GAAa,SAAAC,EAAA;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,MAAA1M;AAAA,IACA,aAAAyM;AAAA,IACA,SAASF,EAAWD,CAAU;AAAA,EAAA;AAElC;AC/eO,MAAMO,IAA+B;AAAA,EAE1C,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,KAAK,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,kBAAkB,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,MAAM,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,KAAK,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA;AAAA,EAGlE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,kBAAkB,QAAQ,SAAS,UAAU,QAAQ,MAAM,OAAA;AAAA,EAC/E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,OAAO,UAAU,QAAQ,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,uBAAuB,QAAQ,WAAW,UAAU,QAAQ,MAAM,OAAA;AAAA,EACtF,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGzE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,QAAQ,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,QAAQ,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,QAAQ,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,0BAA0B,QAAQ,cAAc,UAAU,OAAO,MAAM,OAAA;AAAA,EAC3F,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAC5E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGrE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,kBAAkB,QAAQ,QAAQ,UAAU,QAAQ,MAAM,OAAA;AAAA,EAC9E,EAAE,MAAM,MAAM,MAAM,4BAA4B,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EACxF,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,MAAM,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,iBAAkB,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EAC7E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,kBAAkB,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAG3E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,QAAQ,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,sBAAsB,QAAQ,QAAQ,UAAU,QAAQ,MAAM,OAAA;AAAA;AAAA,EAGlF,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,qBAAqB,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EACjF,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGxE,EAAE,MAAM,MAAM,MAAM,oBAAoB,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAChF,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EAC5E,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAC7E,EAAE,MAAM,MAAM,MAAM,oBAAoB,QAAQ,WAAW,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGlF,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,QAAQ,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,MAAM,UAAU,QAAQ,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAC7E,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGpE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA;AAAA,EAGpE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,SAAS,UAAU,MAAM,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA;AAAA,EAGlE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,QAAQ,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGnE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,SAAS,UAAU,KAAK,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,UAAU,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAG3E,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAC7E,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGxE,EAAE,MAAM,MAAM,MAAM,mBAAmB,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EAC9E,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,MAAM,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,oBAAoB,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAChF,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,UAAU,UAAU,OAAO,MAAM,OAAA;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,SAAS,UAAU,QAAQ,MAAM,OAAA;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA;AAAA,EAGnE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,UAAU,UAAU,OAAO,MAAM,OAAA;AAAA,EAC9E,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,kBAAkB,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EAC7E,EAAE,MAAM,MAAM,MAAM,4BAA4B,QAAQ,WAAW,UAAU,QAAQ,MAAM,OAAA;AAAA,EAC3F,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA;AAAA,EAGlE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGjE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,MAAM,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,oBAAoB,QAAQ,WAAW,UAAU,OAAO,MAAM,OAAA;AAAA,EAClF,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,QAAQ,UAAU,QAAQ,MAAM,OAAA;AAAA;AAAA,EAG3E,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGnE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,MAAM,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,KAAK,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGpE,EAAE,MAAM,MAAM,MAAM,oBAAoB,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAChF,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,yBAAyB,QAAQ,WAAW,UAAU,QAAQ,MAAM,OAAA;AAAA,EACxF,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,QAAQ,UAAU,QAAQ,MAAM,OAAA;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,WAAW,UAAU,OAAO,MAAM,OAAA;AAAA,EAC9E,EAAE,MAAM,MAAM,MAAM,6BAA6B,QAAQ,YAAY,UAAU,OAAO,MAAM,OAAA;AAAA,EAC5F,EAAE,MAAM,MAAM,MAAM,oCAAoC,QAAQ,cAAc,UAAU,QAAQ,MAAM,OAAA;AAAA,EACtG,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,yBAAyB,QAAQ,YAAY,UAAU,OAAO,MAAM,OAAA;AAAA,EACxF,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAC5E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,WAAW,UAAU,QAAQ,MAAM,OAAA;AAAA,EAC/E,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,mBAAmB,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAC/E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,MAAM,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGnE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,uBAAuB,QAAQ,YAAY,UAAU,QAAQ,MAAM,OAAA;AAAA,EACvF,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,MAAM,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,SAAS,UAAU,OAAO,MAAM,OAAA;AAAA,EAC5E,EAAE,MAAM,MAAM,MAAM,4BAA4B,QAAQ,aAAa,UAAU,QAAQ,MAAM,OAAA;AAAA,EAC7F,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGpE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,wBAAwB,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EAClF,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,UAAU,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAG3E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,MAAM,MAAM,OAAA;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAA;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,0BAA0B,QAAQ,WAAW,UAAU,QAAQ,MAAM,OAAA;AAAA,EACzF,EAAE,MAAM,MAAM,MAAM,uBAAuB,QAAQ,WAAW,UAAU,QAAQ,MAAM,OAAA;AAAA;AAAA,EAGtF,EAAE,MAAM,MAAM,MAAM,qBAAqB,QAAQ,WAAW,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGnF,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,UAAU,OAAO,MAAM,OAAA;AAAA;AAAA,EAGlE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,OAAO,UAAU,OAAO,MAAM,OAAA;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO,MAAM,OAAA;AACzE;AAEO,SAASC,GAAiBrI,GAAuC;AACtE,SAAOoI,EAAc,KAAK,CAAAE,MAAWA,EAAQ,SAAStI,EAAK,aAAa;AAC1E;AAEO,SAASuI,GAAuBC,GAAiC;AACtE,SAAOJ,EAAc,OAAO,CAAAE,MAAWA,EAAQ,aAAaE,CAAQ;AACtE;AAEO,SAASC,KAAiC;AAC/C,SAAOL;AACT;AAEO,SAASM,GAAgBC,GAAe5F,IAAwB,MAAqB;AAC1F,QAAM6F,IAAaD,EAAM,YAAA,EAAc,KAAA;AACvC,SAAKC,IAEER,EAAc,OAAO,CAAAE,MAEtBA,EAAQ,SAAS,SAASM,CAAU,KAAK,IAAIN,EAAQ,QAAQ,GAAG,SAASM,CAAU,KAInFN,EAAQ,KAAK,YAAA,EAAc,SAASM,CAAU,IACzC,KAGL7F,MAAa,OACRuF,EAAQ,OAAO,SAASM,CAAU,KAAKN,EAAQ,KAAK,YAAA,EAAc,SAASM,CAAU,IAEvFN,EAAQ,KAAK,YAAA,EAAc,SAASM,CAAU,KAAKN,EAAQ,OAAO,SAASM,CAAU,CAC7F,IAhBuBR;AAiB1B;AAGO,MAAMS,KAA8B,CAAC,MAAM,MAAM,MAAM,IAAI;AAI3D,SAASC,KAA0C;AACxD,SAAOD,GACJ,IAAI,CAAC7I,MAASqI,GAAiBrI,CAAI,CAAC,EACpC,OAAO,CAACsI,MAAoC,EAAQA,CAAQ;AACjE;AAKO,SAASS,GAAuBP,GAAkBQ,GAA2B;AAClF,QAAMC,IAASD,EAAS,QAAQ,OAAO,EAAE;AACzC,SAAKC,IAGDT,MAAa,OACR,gBAAgB,KAAKS,CAAM,IAEhCT,MAAa,SAASA,MAAa,QAC9B,UAAU,KAAKS,CAAM,IAE1BT,MAAa,QACR,aAAa,KAAKS,CAAM,IAE1B,aAAa,KAAKA,CAAM,IAXtB;AAYX;AAEO,SAASC,GAAkBV,GAAkBW,GAA6B;AAE/E,QAAMC,IAAcD,EAAY,QAAQ,OAAO,EAAE;AACjD,SAAO,IAAIX,CAAQ,IAAIY,CAAW;AACpC;AAEO,SAASC,GAAiBF,GAAkE;AACjG,QAAMG,IAAQH,EAAY,MAAM,qBAAqB;AACrD,SAAIG,IACK,EAAE,UAAUA,EAAM,CAAC,GAAG,QAAQA,EAAM,CAAC,EAAA,IAEvC;AACT;AAEO,SAASC,KAA+B;AAC7C,SAAOnB,EAAc,CAAC;AACxB;AC1XO,SAASoB,GAAuB5S,GAAsB;AAC3D,QAAM+N,IAAI/N,EAAK,KAAA;AACf,SAAK+N,MACEA,EAAE,SAAS,GAAG,IAAIA,IAAI,GAAGA,CAAC;AACnC;AAGO,SAAS8E,GAA4BC,GAAiBC,GAA6B;AACxF,MAAI;AACF,UAAMC,IAAQ,IAAI,IAAIF,CAAO,EAAE,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,GAC3DG,IAAkBD,EAAM,YAAYD,CAAU;AACpD,WACEE,KAAmB,KACnBA,MAAoBD,EAAM,SAAS,KACnC,mBAAmB,KAAKA,EAAMC,IAAkB,CAAC,KAAK,EAAE;AAAA,EAE5D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAWO,SAASC,GAAkBJ,GAAiBC,GAAoBI,GAA2B;AAChG,QAAMC,IAAWR,GAAuBE,CAAO,GAEzCO,IADcR,GAA4BO,GAAUL,CAAU,IAEhE,KACAI,IACE,GAAGJ,CAAU,IAAII,CAAS,KAC1B,GAAGJ,CAAU,IACbnI,IAAI,IAAI,IAAIyI,GAAMD,CAAQ;AAEhC,SAAI,CAACD,KAAa,CAACvI,EAAE,SAAS,SAAS,GAAG,MACxCA,EAAE,YAAY,MAETA,EAAE;AACX;AAGO,SAAS0I,GAAyB/M,GAAkBgN,GAAyB;AAClF,QAAMP,IAAQzM,EAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAChD,SAAIyM,EAAM,CAAC,MAAMO,IAAgB,KAC1BP,EAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AAChC;ACnDO,SAASQ,GAAmBjN,GAAkBkN,GAA6B;AAChF,QAAMC,IAAenN,EAAS,QAAQ,SAAS,GAAG,GAC5C6D,IAAMqJ,EAAY,KAAA;AACxB,MAAI,CAACrJ,KAAOA,MAAQ;AAClB,WAAOsJ,EAAa,QAAQ,eAAe,EAAE;AAE/C,MAAI1T,IAAOoK,EAAI,QAAQ,SAAS,GAAG;AAGnC,MAFKpK,EAAK,WAAW,GAAG,MAAGA,IAAO,IAAIA,CAAI,KAC1CA,IAAOA,EAAK,QAAQ,SAAS,EAAE,KAAK,KAChCA,MAAS;AACX,WAAO0T,EAAa,QAAQ,eAAe,EAAE;AAE/C,QAAMC,IAAiBD,EAAa,QAAQ,SAAS,EAAE,KAAK,KACtDjN,IAAS,GAAGzG,CAAI;AACtB,SAAI2T,MAAmB3T,IAAa,KAChC2T,EAAe,WAAWlN,CAAM,IAC3BkN,EAAe,MAAMlN,EAAO,MAAM,EAAE,QAAQ,SAAS,EAAE,IAEzDiN,EAAa,QAAQ,eAAe,EAAE;AAC/C;ACvBO,MAAME,KAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAYMC,IAA6C;AAAA,EACjD,WAAW;AAAA,EACX,SAAS;AAAA,EACT,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AACX,GAEaC,KAAwC;AAAA,EACnD,WAAW;AAAA,IACT,MAAM,EAAE,GAAGD,EAAA;AAAA,EAAuB;AAEtC;AAEA,SAASE,EAAcrU,GAAkD;AACvE,SAAOA,MAAU,QAAQ,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK;AAC5E;AAEA,SAASsU,EACPhU,GACAuM,GACyB;AACzB,QAAMlE,IAAS,EAAE,GAAGrI,EAAA;AACpB,aAAWiG,KAAO,OAAO,KAAKsG,CAAK,GAAG;AACpC,UAAM0H,IAAW1H,EAAMtG,CAAG,GACpBiO,IAAUlU,EAAKiG,CAAG;AACxB,IAAI8N,EAAcE,CAAQ,KAAKF,EAAcG,CAAO,IAClD7L,EAAOpC,CAAG,IAAI+N,EAAkBE,GAASD,CAAQ,IAEjD5L,EAAOpC,CAAG,IAAIgO;AAAA,EAElB;AACA,SAAO5L;AACT;AAEO,SAAS8L,GAAuB/J,GAA8B;AACnE,QAAMgK,IAASJ;AAAA,IACb,gBAAgBF,EAAsB;AAAA,IACtCC,EAAc3J,CAAG,IAAIA,IAAM,CAAA;AAAA,EAAC,GAGxBvJ,IAAO,EAAE,GAAGgT,EAAA,GACZQ,IAAYD,EAAO;AACzB,MAAIL,EAAcM,CAAS,KAAKN,EAAcM,EAAU,IAAI;AAC1D,eAAWxP,KAAM+O;AACf,MAAI,OAAOS,EAAU,KAAKxP,CAAE,KAAM,cAChChE,EAAKgE,CAAE,IAAIwP,EAAU,KAAKxP,CAAE;AAKlC,SAAO;AAAA,IACL,GAAGuP;AAAA,IACH,WAAW;AAAA,MACT,GAAIL,EAAcM,CAAS,IAAIA,IAAY,CAAA;AAAA,MAC3C,MAAAxT;AAAA,IAAA;AAAA,EACF;AAEJ;AAEO,SAASyT,GACdC,GACAC,GACS;AACT,SAAOL,GAAuBK,CAAQ,EAAE,UAAU,KAAKD,CAAK,MAAM;AACpE;AAEO,SAASE,KAAqC;AACnD,MAAI;AACF,UAAMC,IAAa,aAAa,QAAQ,MAAM;AAC9C,QAAI,CAACA,EAAY,QAAO;AACxB,UAAMC,IAAO,KAAK,MAAMD,CAAU,GAC5BE,IAAQD,EAAK,SAASA,EAAK;AACjC,WAAI,OAAOC,KAAU,YAAYA,EAAM,SAC9BA,EAAM,KAAA,IAER;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAUO,SAASC,GAAoBjU,GAA2C;AAC7E,QAAMkU,IAAYlU,EAAM,WAAW,KAAA;AACnC,MAAI,CAACkU,EAAW,QAAO;AAEvB,QAAMnQ,IAAO/D,EAAM,MAAM,KAAA;AACzB,MAAI+D,EAAM,QAAO,GAAGA,CAAI,IAAImQ,CAAS;AAErC,QAAMF,IAAQhU,EAAM,OAAO,KAAA;AAC3B,MAAIgU,EAAO,QAAO,GAAGA,CAAK,IAAIE,CAAS;AAEvC,QAAMlQ,IAAQhE,EAAM,OAAO,KAAA;AAC3B,MAAIgE,GAAO;AACT,UAAMmQ,IAAYnQ,EAAM,SAAS,GAAG,IAAIA,EAAM,MAAM,GAAG,EAAE,CAAC,IAAIA;AAC9D,QAAImQ,EAAW,QAAO,GAAGA,CAAS,IAAID,CAAS;AAAA,EACjD;AAEA,SAAO;AACT;"}
package/dist/vite.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import { Plugin } from 'vite';
2
+
3
+ export type GeniAppBundlePluginOptions = {
4
+ appRoot: string;
5
+ outDir?: string;
6
+ };
7
+ /** Serves and copies the complete, installable GeniApp contract bundle. */
8
+ export declare function copyGeniAppBundle({ appRoot, outDir }: GeniAppBundlePluginOptions): Plugin;
9
+ /** Backward-compatible name used by the existing GeniApp scaffolds. */
10
+ export declare function copyManifestToDist(appRoot: string): Plugin;
11
+ export declare function geniappBasePath(options: {
12
+ command: 'build' | 'serve';
13
+ mode: string;
14
+ identifier: string;
15
+ version: string;
16
+ }): string;
17
+ /** Dependencies that should remain host-resolved instead of pre-bundled in dev. */
18
+ export declare const geniappOptimizeDeps: {
19
+ exclude: string[];
20
+ };
21
+ /** Stable chunk grouping without repository-path aliases. */
22
+ export declare function geniappManualChunks(id: string): "react-runtime" | "localization" | "icons" | "genispace-runtime" | undefined;
package/dist/vite.js ADDED
@@ -0,0 +1,74 @@
1
+ import { existsSync as o, copyFileSync as p, cpSync as m, statSync as f, readFileSync as g } from "node:fs";
2
+ import n from "node:path";
3
+ function j(e) {
4
+ switch (n.extname(e).toLowerCase()) {
5
+ case ".json":
6
+ return "application/json; charset=utf-8";
7
+ case ".sql":
8
+ return "application/sql; charset=utf-8";
9
+ case ".jpg":
10
+ case ".jpeg":
11
+ return "image/jpeg";
12
+ case ".png":
13
+ return "image/png";
14
+ case ".webp":
15
+ return "image/webp";
16
+ case ".mp4":
17
+ return "video/mp4";
18
+ case ".txt":
19
+ return "text/plain; charset=utf-8";
20
+ default:
21
+ return "application/octet-stream";
22
+ }
23
+ }
24
+ function h(e, u) {
25
+ const t = u.split("?")[0].replace(/^\/+/, "");
26
+ if (t === "manifest.json") return n.join(e, "manifest.json");
27
+ if (!t.startsWith("data/")) return null;
28
+ const a = n.resolve(e, "data"), i = n.resolve(e, t);
29
+ return i !== a && !i.startsWith(`${a}${n.sep}`) ? null : i;
30
+ }
31
+ function y({ appRoot: e, outDir: u = "dist" }) {
32
+ const t = n.resolve(e), a = n.join(t, "manifest.json"), i = n.join(t, "data");
33
+ return {
34
+ name: "genispace-copy-geniapp-bundle",
35
+ configureServer(r) {
36
+ r.middlewares.use((d, c, l) => {
37
+ const s = h(t, d.url || "");
38
+ if (!s || !o(s) || !f(s).isFile()) return l();
39
+ try {
40
+ c.setHeader("Content-Type", j(s)), c.setHeader("Access-Control-Allow-Origin", "*"), c.statusCode = 200, c.end(g(s));
41
+ } catch {
42
+ l();
43
+ }
44
+ });
45
+ },
46
+ closeBundle() {
47
+ const r = n.resolve(t, u);
48
+ o(r) && (o(a) && p(a, n.join(r, "manifest.json")), o(i) && m(i, n.join(r, "data"), { recursive: !0 }));
49
+ }
50
+ };
51
+ }
52
+ function x(e) {
53
+ return y({ appRoot: e });
54
+ }
55
+ function w(e) {
56
+ return e.command === "serve" && e.mode === "development" ? "/" : `/${e.identifier}/${e.version}/`;
57
+ }
58
+ const F = {
59
+ exclude: ["lucide-react", "genispace", "@genispace/geniapp"]
60
+ };
61
+ function S(e) {
62
+ if (e.includes("/node_modules/react/") || e.includes("/node_modules/react-dom/") || e.includes("/node_modules/react-router")) return "react-runtime";
63
+ if (e.includes("/node_modules/i18next") || e.includes("/node_modules/react-i18next")) return "localization";
64
+ if (e.includes("/node_modules/lucide-react/")) return "icons";
65
+ if (e.includes("/node_modules/@genispace/geniapp/") || e.includes("/node_modules/genispace/")) return "genispace-runtime";
66
+ }
67
+ export {
68
+ y as copyGeniAppBundle,
69
+ x as copyManifestToDist,
70
+ w as geniappBasePath,
71
+ S as geniappManualChunks,
72
+ F as geniappOptimizeDeps
73
+ };
74
+ //# sourceMappingURL=vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.js","sources":["../src/vite.ts"],"sourcesContent":["import { copyFileSync, cpSync, existsSync, readFileSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport type { Plugin } from 'vite';\n\nexport type GeniAppBundlePluginOptions = {\n appRoot: string;\n outDir?: string;\n};\n\nfunction contentTypeForDataFile(filePath: string) {\n switch (path.extname(filePath).toLowerCase()) {\n case '.json': return 'application/json; charset=utf-8';\n case '.sql': return 'application/sql; charset=utf-8';\n case '.jpg':\n case '.jpeg': return 'image/jpeg';\n case '.png': return 'image/png';\n case '.webp': return 'image/webp';\n case '.mp4': return 'video/mp4';\n case '.txt': return 'text/plain; charset=utf-8';\n default: return 'application/octet-stream';\n }\n}\n\nfunction safeBundleFile(appRoot: string, requestPath: string) {\n const cleanPath = requestPath.split('?')[0].replace(/^\\/+/, '');\n if (cleanPath === 'manifest.json') return path.join(appRoot, 'manifest.json');\n if (!cleanPath.startsWith('data/')) return null;\n\n const dataRoot = path.resolve(appRoot, 'data');\n const candidate = path.resolve(appRoot, cleanPath);\n if (candidate !== dataRoot && !candidate.startsWith(`${dataRoot}${path.sep}`)) return null;\n return candidate;\n}\n\n/** Serves and copies the complete, installable GeniApp contract bundle. */\nexport function copyGeniAppBundle({ appRoot, outDir = 'dist' }: GeniAppBundlePluginOptions): Plugin {\n const normalizedRoot = path.resolve(appRoot);\n const manifest = path.join(normalizedRoot, 'manifest.json');\n const data = path.join(normalizedRoot, 'data');\n\n return {\n name: 'genispace-copy-geniapp-bundle',\n configureServer(server) {\n server.middlewares.use((request, response, next) => {\n const filePath = safeBundleFile(normalizedRoot, request.url || '');\n if (!filePath || !existsSync(filePath) || !statSync(filePath).isFile()) return next();\n try {\n response.setHeader('Content-Type', contentTypeForDataFile(filePath));\n response.setHeader('Access-Control-Allow-Origin', '*');\n response.statusCode = 200;\n response.end(readFileSync(filePath));\n } catch {\n next();\n }\n });\n },\n closeBundle() {\n const output = path.resolve(normalizedRoot, outDir);\n if (!existsSync(output)) return;\n if (existsSync(manifest)) copyFileSync(manifest, path.join(output, 'manifest.json'));\n if (existsSync(data)) cpSync(data, path.join(output, 'data'), { recursive: true });\n },\n };\n}\n\n/** Backward-compatible name used by the existing GeniApp scaffolds. */\nexport function copyManifestToDist(appRoot: string): Plugin {\n return copyGeniAppBundle({ appRoot });\n}\n\nexport function geniappBasePath(options: {\n command: 'build' | 'serve';\n mode: string;\n identifier: string;\n version: string;\n}) {\n return options.command === 'serve' && options.mode === 'development'\n ? '/'\n : `/${options.identifier}/${options.version}/`;\n}\n\n/** Dependencies that should remain host-resolved instead of pre-bundled in dev. */\nexport const geniappOptimizeDeps = {\n exclude: ['lucide-react', 'genispace', '@genispace/geniapp'],\n};\n\n/** Stable chunk grouping without repository-path aliases. */\nexport function geniappManualChunks(id: string) {\n if (id.includes('/node_modules/react/') || id.includes('/node_modules/react-dom/') || id.includes('/node_modules/react-router')) return 'react-runtime';\n if (id.includes('/node_modules/i18next') || id.includes('/node_modules/react-i18next')) return 'localization';\n if (id.includes('/node_modules/lucide-react/')) return 'icons';\n if (id.includes('/node_modules/@genispace/geniapp/') || id.includes('/node_modules/genispace/')) return 'genispace-runtime';\n return undefined;\n}\n"],"names":["contentTypeForDataFile","filePath","path","safeBundleFile","appRoot","requestPath","cleanPath","dataRoot","candidate","copyGeniAppBundle","outDir","normalizedRoot","manifest","data","server","request","response","next","existsSync","statSync","readFileSync","output","copyFileSync","cpSync","copyManifestToDist","geniappBasePath","options","geniappOptimizeDeps","geniappManualChunks","id"],"mappings":"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"}