@rizom/brain 0.2.0-alpha.376 → 0.2.0-alpha.377
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/brain.js +36 -36
- package/dist/chunks/{app-k4p9j73w.js → app-ednfk9av.js} +2 -2
- package/dist/chunks/{index-sxqr4shz.js → index-89p4askv.js} +3 -3
- package/dist/chunks/{index-sxqr4shz.js.map → index-89p4askv.js.map} +1 -1
- package/dist/chunks/{index-cpa1q0gz.js → index-e2z2b1cp.js} +2 -2
- package/dist/chunks/{index-hfyww710.js → index-vegc4wzt.js} +2 -2
- package/dist/index.js +1 -1
- package/dist/model.js +37 -37
- package/dist/model.js.map +1 -1
- package/dist/ui/studio-app.js +1 -1
- package/dist/ui/studio-asset-manifest.json +2 -2
- package/dist/ui/studio-chunks/studio-chat-workspace-yk5ycrr7.js +5 -0
- package/dist/ui/studio-chunks/{studio-chat-workspace-n3cfkz27.js.map → studio-chat-workspace-yk5ycrr7.js.map} +3 -3
- package/package.json +1 -1
- package/dist/ui/studio-chunks/studio-chat-workspace-n3cfkz27.js +0 -5
- /package/dist/chunks/{app-k4p9j73w.js.map → app-ednfk9av.js.map} +0 -0
- /package/dist/chunks/{index-cpa1q0gz.js.map → index-e2z2b1cp.js.map} +0 -0
- /package/dist/chunks/{index-hfyww710.js.map → index-vegc4wzt.js.map} +0 -0
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
"/** @jsxImportSource react */\nimport { useEffect, useRef, useState, type ReactElement } from \"react\";\nimport { Button, Input } from \"@brains/app-ui-react\";\nimport { getErrorMessage } from \"@brains/utils/error\";\nimport { chatClass, chatLayout } from \"./studio-chat-layout.styles\";\n\nexport function StudioChatSessionRename(props: {\n title: string;\n onRename: (title: string) => Promise<void>;\n}): ReactElement {\n const [editing, setEditing] = useState(false);\n const [title, setTitle] = useState(props.title);\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const mounted = useRef(false);\n const pendingRequest = useRef(false);\n const input = useRef<HTMLInputElement | null>(null);\n useEffect(() => {\n if (editing) input.current?.focus();\n }, [editing]);\n const trigger = useRef<HTMLSpanElement | null>(null);\n useEffect(() => {\n mounted.current = true;\n return (): void => {\n mounted.current = false;\n };\n }, []);\n const finish = (): void => {\n setEditing(false);\n setError(null);\n requestAnimationFrame(() =>\n trigger.current?.querySelector(\"button\")?.focus(),\n );\n };\n const rename = async (): Promise<void> => {\n if (pendingRequest.current || !title.trim()) return;\n pendingRequest.current = true;\n setPending(true);\n setError(null);\n try {\n await props.onRename(title.trim());\n if (mounted.current) finish();\n } catch (cause) {\n if (mounted.current)\n setError(\n getErrorMessage(\n cause,\n \"Rename failed. Your proposed title is kept.\",\n ) || \"Rename failed. Your proposed title is kept.\",\n );\n } finally {\n pendingRequest.current = false;\n if (mounted.current) setPending(false);\n }\n };\n return (\n <>\n <span ref={trigger}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n aria-expanded={editing}\n disabled={editing}\n onClick={() => {\n setTitle(props.title);\n setEditing(true);\n }}\n >\n Rename\n </Button>\n </span>\n {editing && (\n <form\n className={chatClass(\n \"studio-chat-rename\",\n chatLayout.sessionControls,\n )}\n onSubmit={(event) => {\n event.preventDefault();\n void rename();\n }}\n >\n <label>\n Conversation title\n <Input\n ref={input}\n xstyle={chatLayout.sessionFilterSelect}\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n required\n maxLength={48}\n disabled={pending}\n />\n </label>\n <div className={chatClass(\"\", chatLayout.actions)}>\n <Button type=\"submit\" disabled={pending || !title.trim()}>\n {pending ? \"Renaming…\" : \"Save title\"}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={pending}\n onClick={finish}\n >\n Cancel\n </Button>\n </div>\n {error && <p role=\"alert\">{error}</p>}\n </form>\n )}\n </>\n );\n}\n",
|
|
13
13
|
"/** @jsxImportSource react */\nimport {\n useEffect,\n useRef,\n useState,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogTitle,\n} from \"@brains/app-ui-react\";\nimport { chatClass, chatLayout } from \"./studio-chat-layout.styles\";\nimport { libraryStyles } from \"./studio-library.styles\";\n\nconst NARROW_QUERY = \"(max-width: 860px)\";\n\n/**\n * Keep narrow-screen context out of the conversation's vertical space.\n * CSS may blur a hidden control before the media event; blur handlers bridge\n * focus to the visible presentation without waiting for that event.\n */\nexport function StudioChatWorkingSetDisclosure(props: {\n contextKey: string | null;\n children: ReactNode;\n}): ReactElement {\n const [narrow, setNarrow] = useState(false);\n const [inlineOpen, setInlineOpen] = useState(false);\n const [dialogOpen, setDialogOpen] = useState(false);\n const trigger = useRef<HTMLSpanElement>(null);\n const summary = useRef<HTMLElement>(null);\n\n useEffect(() => {\n const media = window.matchMedia(NARROW_QUERY);\n const update = (): void => {\n if (\n media.matches &&\n summary.current?.parentElement?.contains(document.activeElement)\n )\n trigger.current?.querySelector(\"button\")?.focus();\n if (\n !media.matches &&\n document.activeElement === trigger.current?.querySelector(\"button\")\n )\n summary.current?.focus();\n setNarrow(media.matches);\n if (!media.matches) setDialogOpen(false);\n };\n update();\n media.addEventListener(\"change\", update);\n return (): void => media.removeEventListener(\"change\", update);\n }, []);\n\n useEffect(() => setDialogOpen(false), [props.contextKey]);\n\n return (\n <div\n className={chatClass(\n \"studio-chat-working-set-control\",\n chatLayout.context,\n )}\n >\n <details\n className={chatClass(\n \"studio-chat-working-set\",\n chatLayout.desktopContext,\n )}\n open={inlineOpen}\n onBlurCapture={(event) => {\n if (\n event.relatedTarget === null &&\n window.matchMedia(NARROW_QUERY).matches\n )\n trigger.current?.querySelector(\"button\")?.focus();\n }}\n onToggle={(event) => setInlineOpen(event.currentTarget.open)}\n >\n <summary\n ref={summary}\n className={chatClass(\n \"studio-chat-working-set-summary\",\n chatLayout.summary,\n )}\n >\n Working set\n </summary>\n {!narrow && props.children}\n </details>\n <span\n ref={trigger}\n onBlurCapture={(event) => {\n if (\n event.relatedTarget === null &&\n !window.matchMedia(NARROW_QUERY).matches\n )\n summary.current?.focus();\n }}\n className={chatClass(\n \"studio-chat-working-set-mobile\",\n chatLayout.mobileSessions,\n )}\n >\n <Button\n className=\"studio-chat-working-set-trigger\"\n variant=\"ghost\"\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={dialogOpen}\n onClick={() => setDialogOpen(true)}\n >\n Working set\n </Button>\n </span>\n <Dialog open={narrow && dialogOpen} onOpenChange={setDialogOpen}>\n <DialogContent\n className={chatClass(\n \"studio-chat-working-set-dialog\",\n libraryStyles.readable,\n )}\n aria-describedby={undefined}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n // A closing portal can retain its pre-resize render's callback.\n (window.matchMedia(NARROW_QUERY).matches\n ? trigger.current?.querySelector(\"button\")\n : summary.current\n )?.focus();\n }}\n >\n <DialogTitle>Working set</DialogTitle>\n {props.children}\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n",
|
|
14
14
|
"export const defaultMessageUploadFilename = \"upload.txt\";\nexport const messageTextUploadAccept =\n \".md,.txt,.markdown,text/plain,text/markdown,text/x-markdown\";\nexport const messageBinaryUploadAccept =\n \".png,.jpg,.jpeg,.webp,.gif,.pdf,image/png,image/jpeg,image/webp,image/gif,application/pdf\";\nexport const messageUploadAccept =\n \".md,.txt,.markdown,.png,.jpg,.jpeg,.webp,.gif,.pdf,text/plain,text/markdown,text/x-markdown,image/png,image/jpeg,image/webp,image/gif,application/pdf\";\nexport const messageTextUploadMaxBytes = 100_000;\nexport const messageUploadMaxBytes = 5_000_000;\n\nconst textFileExtensions = [\".md\", \".txt\", \".markdown\"];\nconst textMimeTypes = [\"text/plain\", \"text/markdown\", \"text/x-markdown\"];\nconst binaryFileExtensionMediaTypes = new Map([\n [\".png\", \"image/png\"],\n [\".jpg\", \"image/jpeg\"],\n [\".jpeg\", \"image/jpeg\"],\n [\".webp\", \"image/webp\"],\n [\".gif\", \"image/gif\"],\n [\".pdf\", \"application/pdf\"],\n]);\nconst binaryMimeTypes = new Set(binaryFileExtensionMediaTypes.values());\n\nexport type MessageUploadPolicyErrorCode =\n \"unsupported_type\" | \"file_too_large\" | \"binary_content\";\n\nexport interface ValidatedTextUpload {\n ok: true;\n filename: string;\n mediaType: string;\n sizeBytes: number;\n text: string;\n}\n\nexport interface ValidatedFileUpload {\n ok: true;\n kind: \"file\";\n filename: string;\n mediaType: string;\n sizeBytes: number;\n}\n\nexport interface InvalidUpload {\n ok: false;\n code: MessageUploadPolicyErrorCode;\n message: string;\n}\n\nexport type TextUploadValidationResult = ValidatedTextUpload | InvalidUpload;\n\nexport type ValidatedMessageUpload =\n (ValidatedTextUpload & { kind: \"text\" }) | ValidatedFileUpload;\n\nexport type MessageUploadValidationResult =\n ValidatedMessageUpload | InvalidUpload;\n\nexport interface ValidateUploadInput {\n filename: string;\n mediaType: string | undefined;\n content: Uint8Array;\n fallbackFilename?: string | undefined;\n}\n\nexport function sanitizeUploadFilename(\n filename: string,\n fallbackFilename: string = defaultMessageUploadFilename,\n): string {\n const leaf = filename.split(/[\\\\/]/).at(-1)?.trim() ?? \"\";\n const cleaned = Array.from(leaf)\n .filter((char: string) => {\n const code = char.charCodeAt(0);\n return code > 31 && code !== 127;\n })\n .join(\"\")\n .slice(0, 160);\n return cleaned.length > 0 ? cleaned : fallbackFilename;\n}\n\nexport function normalizeTextUploadMediaType(\n filename: string,\n mediaType: string | undefined,\n): string {\n const trimmed = mediaType?.trim() ?? \"\";\n if (trimmed.length > 0) return trimmed;\n\n const lowerFilename = filename.toLowerCase();\n if (lowerFilename.endsWith(\".md\") || lowerFilename.endsWith(\".markdown\")) {\n return \"text/markdown\";\n }\n if (lowerFilename.endsWith(\".txt\")) {\n return \"text/plain\";\n }\n return \"application/octet-stream\";\n}\n\nexport function normalizeMessageUploadMediaType(\n filename: string,\n mediaType: string | undefined,\n): string {\n const trimmed = mediaType?.trim() ?? \"\";\n const explicitMediaType = trimmed.split(\";\", 1)[0]?.toLowerCase() ?? trimmed;\n if (\n explicitMediaType.length > 0 &&\n explicitMediaType !== \"application/octet-stream\"\n ) {\n return explicitMediaType;\n }\n\n const textMediaType = normalizeTextUploadMediaType(filename, undefined);\n if (textMediaType !== \"application/octet-stream\") return textMediaType;\n\n const lowerFilename = filename.toLowerCase();\n for (const [extension, extensionMediaType] of binaryFileExtensionMediaTypes) {\n if (lowerFilename.endsWith(extension)) return extensionMediaType;\n }\n return \"application/octet-stream\";\n}\n\nexport function isUploadableTextFile(\n filename: string,\n mediaType: string | undefined,\n): boolean {\n if (\n mediaType &&\n textMimeTypes.some((type) => mediaType.toLowerCase().startsWith(type))\n ) {\n return true;\n }\n return textFileExtensions.some((extension) =>\n filename.toLowerCase().endsWith(extension),\n );\n}\n\nexport function isTextUploadSizeAllowed(sizeBytes: number): boolean {\n return sizeBytes <= messageTextUploadMaxBytes;\n}\n\nexport function isMessageUploadSizeAllowed(sizeBytes: number): boolean {\n return sizeBytes <= messageUploadMaxBytes;\n}\n\nexport function isUploadableBinaryFile(\n filename: string,\n mediaType: string | undefined,\n): boolean {\n const normalizedMediaType = normalizeMessageUploadMediaType(\n filename,\n mediaType,\n );\n if (binaryMimeTypes.has(normalizedMediaType)) return true;\n\n return binaryFileExtensionMediaTypes.has(getLowercaseExtension(filename));\n}\n\nexport function getMessageUploadKind(\n filename: string,\n mediaType: string | undefined,\n): \"text\" | \"file\" | undefined {\n const normalizedMediaType = normalizeMessageUploadMediaType(\n filename,\n mediaType,\n );\n if (isUploadableTextFile(filename, normalizedMediaType)) return \"text\";\n if (isUploadableBinaryFile(filename, normalizedMediaType)) return \"file\";\n return undefined;\n}\n\nexport function isMessageUploadDeclaredSizeAllowed(\n uploadKind: \"text\" | \"file\",\n sizeBytes: number,\n): boolean {\n if (sizeBytes <= 0) return true;\n return uploadKind === \"text\"\n ? isTextUploadSizeAllowed(sizeBytes)\n : isMessageUploadSizeAllowed(sizeBytes);\n}\n\nexport function isLikelyUtf8Text(bytes: Uint8Array): boolean {\n if (bytes.includes(0)) return false;\n try {\n new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function validateTextUpload(\n input: ValidateUploadInput,\n): TextUploadValidationResult {\n const filename = sanitizeUploadFilename(\n input.filename,\n input.fallbackFilename,\n );\n const mediaType = normalizeTextUploadMediaType(filename, input.mediaType);\n if (!isUploadableTextFile(filename, mediaType)) {\n return {\n ok: false,\n code: \"unsupported_type\",\n message: `Unsupported file upload type: ${filename}`,\n };\n }\n\n if (!isTextUploadSizeAllowed(input.content.byteLength)) {\n return {\n ok: false,\n code: \"file_too_large\",\n message: `File upload too large: ${filename}`,\n };\n }\n\n if (!isLikelyUtf8Text(input.content)) {\n return {\n ok: false,\n code: \"binary_content\",\n message: `Unsupported file upload type: ${filename}`,\n };\n }\n\n return {\n ok: true,\n filename,\n mediaType,\n sizeBytes: input.content.byteLength,\n text: new TextDecoder(\"utf-8\").decode(input.content).replace(/^\\uFEFF/, \"\"),\n };\n}\n\nexport function validateMessageUpload(\n input: ValidateUploadInput,\n): MessageUploadValidationResult {\n const filename = sanitizeUploadFilename(\n input.filename,\n input.fallbackFilename,\n );\n const mediaType = normalizeMessageUploadMediaType(filename, input.mediaType);\n\n if (isUploadableTextFile(filename, mediaType)) {\n const textUpload = validateTextUpload({\n filename,\n mediaType,\n content: input.content,\n ...(input.fallbackFilename !== undefined && {\n fallbackFilename: input.fallbackFilename,\n }),\n });\n return textUpload.ok ? { ...textUpload, kind: \"text\" } : textUpload;\n }\n\n if (!isUploadableBinaryFile(filename, mediaType)) {\n return {\n ok: false,\n code: \"unsupported_type\",\n message: `Unsupported file upload type: ${filename}`,\n };\n }\n\n if (!isMessageUploadSizeAllowed(input.content.byteLength)) {\n return {\n ok: false,\n code: \"file_too_large\",\n message: `File upload too large: ${filename}`,\n };\n }\n\n if (!hasExpectedBinarySignature(input.content, mediaType)) {\n return {\n ok: false,\n code: \"unsupported_type\",\n message: `Unsupported file upload type: ${filename}`,\n };\n }\n\n return {\n ok: true,\n kind: \"file\",\n filename,\n mediaType,\n sizeBytes: input.content.byteLength,\n };\n}\n\nfunction getLowercaseExtension(filename: string): string {\n const dotIndex = filename.lastIndexOf(\".\");\n return dotIndex >= 0 ? filename.slice(dotIndex).toLowerCase() : \"\";\n}\n\nfunction hasExpectedBinarySignature(\n bytes: Uint8Array,\n mediaType: string,\n): boolean {\n switch (mediaType) {\n case \"image/png\":\n return startsWithBytes(bytes, [0x89, 0x50, 0x4e, 0x47]);\n case \"image/jpeg\":\n return startsWithBytes(bytes, [0xff, 0xd8, 0xff]);\n case \"image/gif\":\n return (\n startsWithAscii(bytes, \"GIF87a\") || startsWithAscii(bytes, \"GIF89a\")\n );\n case \"image/webp\":\n return startsWithAscii(bytes, \"RIFF\") && hasAsciiAt(bytes, \"WEBP\", 8);\n case \"application/pdf\":\n return startsWithAscii(bytes, \"%PDF-\");\n default:\n return false;\n }\n}\n\nfunction startsWithBytes(bytes: Uint8Array, expected: number[]): boolean {\n return expected.every((byte, index) => bytes[index] === byte);\n}\n\nfunction startsWithAscii(bytes: Uint8Array, expected: string): boolean {\n return hasAsciiAt(bytes, expected, 0);\n}\n\nfunction hasAsciiAt(\n bytes: Uint8Array,\n expected: string,\n offset: number,\n): boolean {\n return Array.from(expected).every(\n (char, index) => bytes[offset + index] === char.charCodeAt(0),\n );\n}\n",
|
|
15
|
-
"/** @jsxImportSource react */\nimport { libraryStyles as library } from \"./studio-library.styles\";\nimport { StudioChatAttachment } from \"./studio-chat-attachment\";\nimport { StudioChatSessionRename } from \"./studio-chat-session-rename\";\nimport { StudioChatWorkingSetDisclosure } from \"./studio-chat-working-set-disclosure\";\nimport {\n messageUploadAccept,\n messageTextUploadMaxBytes,\n messageUploadMaxBytes,\n} from \"@brains/plugins/message-interface/upload-policy\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogTitle,\n NativeSelect,\n} from \"@brains/app-ui-react\";\nimport { chatClass, chatLayout } from \"./studio-chat-layout.styles\";\nimport {\n StudioChatDraftStore,\n studioChatDraftKey,\n type StudioChatNavigationState,\n} from \"./studio-chat-drafts\";\nimport { StudioPageHead, studioAccessRequirement } from \"./studio-page-head\";\nimport { headStyles } from \"./studio-page-head.styles\";\nimport { typographyStyles } from \"./studio-typography.styles\";\nimport {\n createChatClient,\n readChatProtocolEvents,\n type ChatCard,\n type ChatClient,\n type ChatHistoryMessage,\n type ChatMessage,\n type ChatSession,\n type ChatUploadResponse,\n} from \"@brains/contracts/chat\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type ChangeEvent,\n type FormEvent,\n type KeyboardEvent,\n type ReactElement,\n} from \"react\";\nimport {\n STUDIO_CHAT_WORKSPACE_ID,\n studioChatWorkspacePath,\n} from \"../../src/chat-workspace\";\nimport type { EntityTypeInfo, StudioWorkspaceInfo } from \"./api\";\nimport type { StudioChatHandoff } from \"./operator-launch\";\nimport {\n approvalResponseMessage,\n createStudioChatStreamState,\n reduceStudioChatStream,\n streamAssistantMessage,\n type StudioChatApproval,\n type StudioChatStreamState,\n} from \"./chat-workspace-model\";\nimport { TypeSwitcher } from \"./entity-fields\";\nimport { useStudioNavigationCollapsed } from \"./studio-navigation-state\";\nimport { StudioChrome } from \"./studio-chrome\";\nimport { StudioSearchField } from \"./studio-search-field\";\nimport { StudioMarkdown } from \"./studio-markdown\";\nimport {\n navigationClassName as navClass,\n navigationStyles as nav,\n} from \"./studio-navigation.styles\";\n\nconst CHAT_UPLOAD_GUIDANCE = `Text/Markdown up to ${messageTextUploadMaxBytes / 1000} KB; PNG, JPEG, WebP, GIF or PDF up to ${messageUploadMaxBytes / 1000000} MB.`;\n\nconst studioChatKeys = {\n sessions: [\"studio\", \"chat\", \"sessions\"] as const,\n messages: (conversationId: string) =>\n [\"studio\", \"chat\", \"messages\", conversationId] as const,\n};\n\ntype ChatActionCard = Extract<ChatCard, { kind: \"actions\" }>;\ntype ChatSuggestedAction = ChatActionCard[\"actions\"][number];\n\ninterface SessionView {\n query: string;\n archived: boolean;\n offset: number;\n}\n\ninterface ChatUploadAttempt {\n id: string;\n file: File;\n status: \"uploading\" | \"failed\";\n error?: string;\n}\n\ninterface InterruptedResponse {\n kind: \"stopped\" | \"disconnected\" | \"failed\";\n detail?: string;\n retry?: { text: string; uploads: ChatUploadResponse[] };\n}\n\nexport interface StudioChatWorkspaceProps {\n apiPath?: string | undefined;\n draftStore?: StudioChatDraftStore | undefined;\n onNavigationStateChange?:\n ((state: StudioChatNavigationState) => void) | undefined;\n studioBasePath: string;\n sessionId: string | null;\n types: EntityTypeInfo[];\n workspaces: StudioWorkspaceInfo[];\n handoff: StudioChatHandoff | null;\n navigate: (href: string, options?: { preserveWork?: boolean }) => void;\n selectEntityType: (entityType: string) => void;\n selectWorkspace: (workspaceId: string) => void;\n}\n\nexport function StudioChatWorkspace(\n props: StudioChatWorkspaceProps,\n): ReactElement {\n const queryClient = useQueryClient();\n const chatClient = useMemo(\n () =>\n createChatClient({\n apiPath: props.apiPath,\n fetch: (input, init) => globalThis.fetch(input, init),\n }),\n [props.apiPath],\n );\n const [localDraftStore] = useState(() => new StudioChatDraftStore());\n const draftStore = props.draftStore ?? localDraftStore;\n const draftKey = studioChatDraftKey(props.apiPath, props.sessionId);\n const currentDraftKey = useRef(draftKey);\n currentDraftKey.current = draftKey;\n const { text: draft, uploads } = useSyncExternalStore(\n draftStore.subscribe,\n () => draftStore.read(draftKey),\n () => draftStore.read(draftKey),\n );\n const setDraft = useCallback(\n (text: string) => draftStore.update(draftKey, { text }),\n [draftStore, draftKey],\n );\n const setUploads = useCallback(\n (\n value:\n | ChatUploadResponse[]\n | ((current: ChatUploadResponse[]) => ChatUploadResponse[]),\n ) =>\n draftStore.update(draftKey, {\n uploads:\n typeof value === \"function\"\n ? value(draftStore.read(draftKey).uploads)\n : value,\n }),\n [draftStore, draftKey],\n );\n const [pendingMessages, setPendingMessages] = useState<ChatHistoryMessage[]>(\n [],\n );\n const [stream, setStream] = useState<StudioChatStreamState | null>(null);\n const [sending, setSending] = useState(false);\n const [archiving, setArchiving] = useState(false);\n const [uploading, setUploading] = useState(false);\n const [uploadAttempts, setUploadAttempts] = useState<ChatUploadAttempt[]>([]);\n const uploadBatchRef = useRef<symbol | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [interrupted, setInterrupted] = useState<InterruptedResponse | null>(\n null,\n );\n useEffect(() => {\n props.onNavigationStateChange?.({\n hasDraft: Boolean(draft || uploads.length || uploadAttempts.length),\n busy: sending || uploading,\n });\n }, [\n draft,\n uploads,\n uploadAttempts,\n sending,\n uploading,\n props.onNavigationStateChange,\n ]);\n useEffect(\n () => (): void =>\n props.onNavigationStateChange?.({ hasDraft: false, busy: false }),\n [props.onNavigationStateChange],\n );\n const navigationCollapsed = useStudioNavigationCollapsed();\n const [sessionPickerOpen, setSessionPickerOpen] = useState(false);\n const sessionPickerTrigger = useRef<HTMLSpanElement>(null);\n const threadEndRef = useRef<HTMLDivElement | null>(null);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const followLatestRef = useRef(true);\n const [showJumpToLatest, setShowJumpToLatest] = useState(false);\n const activeStreamRef = useRef<AbortController | null>(null);\n const mountedRef = useRef(false);\n useEffect(() => {\n mountedRef.current = true;\n return (): void => {\n mountedRef.current = false;\n uploadBatchRef.current = null;\n const active = activeStreamRef.current;\n activeStreamRef.current = null;\n active?.abort();\n };\n }, []);\n const handledHandoffRef = useRef<string | null>(null);\n const adoptedSessionRef = useRef<string | null>(null);\n\n const [sessionSearch, setSessionSearch] = useState(\"\");\n const [sessionView, setSessionView] = useState<SessionView>({\n query: \"\",\n archived: false,\n offset: 0,\n });\n useEffect(() => {\n const timer = window.setTimeout(\n () =>\n setSessionView((current) =>\n current.query === sessionSearch.trim()\n ? current\n : { ...current, query: sessionSearch.trim(), offset: 0 },\n ),\n 250,\n );\n return (): void => window.clearTimeout(timer);\n }, [sessionSearch]);\n const sessionsQuery = useQuery({\n queryKey: [...studioChatKeys.sessions, sessionView],\n queryFn: () => chatClient.listSessions(sessionView),\n });\n const messagesQuery = useQuery({\n queryKey: studioChatKeys.messages(props.sessionId ?? \"\"),\n queryFn: () => chatClient.getMessages(props.sessionId ?? \"\"),\n // A newly accepted session already has an optimistic copy of its first\n // turn. Wait for the completed stream to replace that copy atomically.\n enabled:\n props.sessionId !== null && !sending && pendingMessages.length === 0,\n });\n const sessions = sessionsQuery.data ?? [];\n const showSessionRail =\n sessionsQuery.isPending ||\n Boolean(sessionsQuery.error) ||\n sessions.length > 0 ||\n sessionSearch.length > 0 ||\n sessionView.archived ||\n sessionView.offset > 0;\n const storedMessages = messagesQuery.data ?? [];\n const currentSession =\n sessions.find((session) => session.id === props.sessionId) ??\n queryClient\n .getQueriesData<ChatSession[]>({ queryKey: studioChatKeys.sessions })\n .flatMap(([, items]) => items ?? [])\n .find((session) => session.id === props.sessionId);\n const archivedSession = currentSession?.archived === true;\n const sessionControls = {\n search: sessionSearch,\n view: sessionView,\n error: sessionsQuery.error ? \"Sessions could not be loaded.\" : null,\n onRetry: (): void => {\n void sessionsQuery.refetch();\n },\n onSearch: setSessionSearch,\n onView: setSessionView,\n };\n const visibleMessages = useMemo(() => {\n const next = [...storedMessages, ...pendingMessages];\n if (stream && (stream.text || stream.cards.length > 0)) {\n next.push(streamAssistantMessage(stream));\n }\n return next;\n }, [pendingMessages, storedMessages, stream]);\n const contextCards = useMemo(\n () =>\n visibleMessages.flatMap((message) =>\n (message.cards ?? []).filter(\n (card) => card.kind === \"sources\" || card.kind === \"attachment\",\n ),\n ),\n [visibleMessages],\n );\n\n useEffect(() => {\n if (props.sessionId && adoptedSessionRef.current === props.sessionId) {\n adoptedSessionRef.current = null;\n return;\n }\n const active = activeStreamRef.current;\n activeStreamRef.current = null;\n active?.abort();\n setSending(false);\n setPendingMessages([]);\n setStream(null);\n setUploading(false);\n uploadBatchRef.current = null;\n setUploadAttempts([]);\n setArchiving(false);\n setError(null);\n setInterrupted(null);\n }, [props.sessionId]);\n\n useEffect(() => {\n followLatestRef.current = true;\n setShowJumpToLatest(false);\n }, [props.sessionId]);\n\n useEffect(() => {\n const scroll = threadScrollRef.current;\n const manuscript = scroll?.firstElementChild;\n if (!scroll || !manuscript) return;\n const follow = (): void => {\n if (followLatestRef.current) scroll.scrollTop = scroll.scrollHeight;\n };\n follow();\n const observer = new ResizeObserver(follow);\n observer.observe(manuscript);\n return (): void => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (followLatestRef.current) {\n const scroll = threadScrollRef.current;\n if (scroll) scroll.scrollTop = scroll.scrollHeight;\n }\n }, [stream, visibleMessages.length]);\n\n const navigateToSession = useCallback(\n (conversationId?: string, preserveWork = false): void => {\n props.navigate(\n studioChatWorkspacePath(props.studioBasePath, conversationId),\n { preserveWork },\n );\n setSessionPickerOpen(false);\n },\n [props.navigate, props.studioBasePath],\n );\n\n useEffect(() => {\n if (!props.handoff || props.sessionId) return;\n const handoffKey = `${props.handoff.sourceId}\\u0000${props.handoff.itemId}`;\n if (handledHandoffRef.current === handoffKey) return;\n handledHandoffRef.current = handoffKey;\n setDraft(props.handoff.prompt);\n setError(null);\n void chatClient\n .openContextSession({\n version: 1,\n sourceId: props.handoff.sourceId,\n itemId: props.handoff.itemId,\n titleSeed: props.handoff.label,\n })\n .then(({ conversationId }) => {\n if (\n !mountedRef.current ||\n currentDraftKey.current !== draftKey ||\n handledHandoffRef.current !== handoffKey\n )\n return;\n draftStore.adopt(\n draftKey,\n studioChatDraftKey(props.apiPath, conversationId),\n );\n navigateToSession(conversationId, true);\n })\n .catch((cause: unknown) => {\n if (\n !mountedRef.current ||\n currentDraftKey.current !== draftKey ||\n handledHandoffRef.current !== handoffKey\n )\n return;\n handledHandoffRef.current = null;\n setError(errorMessage(cause, \"Context could not be attached\"));\n });\n }, [\n chatClient,\n navigateToSession,\n props.handoff,\n props.sessionId,\n props.apiPath,\n draftStore,\n draftKey,\n setDraft,\n ]);\n\n const runStream = useCallback(\n async (\n conversationId: string,\n messages: ChatMessage[],\n onAccepted?: () => void,\n retry?: InterruptedResponse[\"retry\"],\n ): Promise<boolean> => {\n activeStreamRef.current?.abort();\n const controller = new AbortController();\n activeStreamRef.current = controller;\n setSending(true);\n setError(null);\n setInterrupted(null);\n let stoppedByServer = false;\n let next: StudioChatStreamState = {\n ...createStudioChatStreamState(),\n messageId: crypto.randomUUID(),\n };\n setStream(next);\n let accepted = false;\n let retained = false;\n const retainResponse = (): void => {\n if (retained || (!next.text && next.cards.length === 0)) return;\n retained = true;\n const message = streamAssistantMessage(next);\n setPendingMessages((current) => [...current, message]);\n setStream({ ...next, text: \"\", cards: [] });\n };\n try {\n const response = await chatClient.streamMessages(\n {\n id: conversationId,\n messages,\n trigger: \"submit-message\",\n },\n { signal: controller.signal },\n );\n accepted = true;\n onAccepted?.();\n for await (const event of readChatProtocolEvents(response)) {\n if (activeStreamRef.current !== controller) return accepted;\n if (event.type === \"abort\") stoppedByServer = true;\n next = reduceStudioChatStream(next, event);\n setStream(next);\n }\n if (activeStreamRef.current !== controller) return accepted;\n retainResponse();\n if (\n controller.signal.aborted ||\n stoppedByServer ||\n next.error !== null ||\n !next.finished\n ) {\n setInterrupted({\n kind:\n controller.signal.aborted || stoppedByServer\n ? \"stopped\"\n : next.error !== null\n ? \"failed\"\n : \"disconnected\",\n ...(next.error ? { detail: next.error } : {}),\n ...(retry ? { retry } : {}),\n });\n return accepted;\n }\n try {\n const authoritativeMessages =\n await chatClient.getMessages(conversationId);\n if (activeStreamRef.current !== controller) return accepted;\n queryClient.setQueryData(\n studioChatKeys.messages(conversationId),\n authoritativeMessages,\n );\n setPendingMessages([]);\n } catch {\n // The completed response remains visible from the optimistic state;\n // a later session visit can retry the authoritative history read.\n }\n await queryClient.invalidateQueries({\n queryKey: studioChatKeys.sessions,\n });\n } catch (cause) {\n if (activeStreamRef.current !== controller) return accepted;\n retainResponse();\n setInterrupted({\n kind: controller.signal.aborted\n ? \"stopped\"\n : accepted\n ? \"disconnected\"\n : \"failed\",\n ...(!controller.signal.aborted\n ? {\n detail: errorMessage(\n cause,\n \"Chat could not complete the response\",\n ),\n }\n : {}),\n ...(retry ? { retry } : {}),\n });\n } finally {\n if (activeStreamRef.current === controller) {\n activeStreamRef.current = null;\n setSending(false);\n }\n }\n return accepted;\n },\n [chatClient, queryClient],\n );\n\n const submitPrompt = useCallback(\n async (prompt: string): Promise<void> => {\n const text = prompt.trim();\n if (\n (!text && uploads.length === 0) ||\n sending ||\n uploading ||\n uploadAttempts.length > 0\n )\n return;\n const conversationId = props.sessionId ?? `web-${crypto.randomUUID()}`;\n const sentKey = studioChatDraftKey(props.apiPath, conversationId);\n const messageId = crypto.randomUUID();\n const uploadParts = uploads.map((upload) => ({\n type: \"data-upload\" as const,\n data: { ref: upload.ref },\n }));\n const parts = [\n ...(text ? [{ type: \"text\" as const, text }] : []),\n ...uploadParts,\n ];\n setPendingMessages((current) => [\n ...current,\n {\n id: messageId,\n role: \"user\",\n content: text || uploads.map((upload) => upload.filename).join(\", \"),\n },\n ]);\n // The transcript owns the message from here, so the composer empties now\n // rather than when the server answers; a refusal puts the draft back. A\n // suggested action carries its own prompt and never empties the composer.\n const sentUploads = [...uploads];\n const held = draftStore.read(draftKey);\n const sentFromComposer = held.text === prompt;\n if (sentFromComposer || sentUploads.length > 0)\n draftStore.update(draftKey, {\n text: sentFromComposer ? \"\" : held.text,\n uploads: held.uploads.filter(\n (upload) => !sentUploads.some((sent) => sent.id === upload.id),\n ),\n });\n const accepted = await runStream(\n conversationId,\n [{ id: messageId, role: \"user\", parts }],\n () => {\n if (\n !props.sessionId &&\n mountedRef.current &&\n currentDraftKey.current === draftKey\n ) {\n draftStore.adopt(draftKey, sentKey);\n adoptedSessionRef.current = conversationId;\n navigateToSession(conversationId, true);\n }\n },\n { text: prompt, uploads: [...uploads] },\n );\n if (\n !accepted &&\n (currentDraftKey.current === sentKey ||\n (!props.sessionId && currentDraftKey.current === draftKey))\n ) {\n setPendingMessages((current) =>\n current.filter((message) => message.id !== messageId),\n );\n // Restore into whichever conversation the composer now shows, keeping\n // anything typed while the request was in flight.\n const key = currentDraftKey.current;\n const current = draftStore.read(key);\n draftStore.update(key, {\n ...(sentFromComposer && !current.text ? { text: prompt } : {}),\n uploads: [\n ...sentUploads.filter(\n (upload) =>\n !current.uploads.some((kept) => kept.id === upload.id),\n ),\n ...current.uploads,\n ],\n });\n }\n },\n [\n navigateToSession,\n props.sessionId,\n props.apiPath,\n draftStore,\n draftKey,\n runStream,\n sending,\n uploading,\n uploads,\n uploadAttempts.length,\n ],\n );\n\n const submit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n void submitPrompt(draft);\n };\n\n const respondToApproval = useCallback(\n async (approval: StudioChatApproval, approved: boolean): Promise<void> => {\n if (!props.sessionId || sending) return;\n await runStream(props.sessionId, [\n approvalResponseMessage(approval, approved),\n ]);\n },\n [props.sessionId, runStream, sending],\n );\n\n const runSuggestedAction = useCallback(\n async (action: ChatSuggestedAction): Promise<void> => {\n if (action.type === \"prompt\") {\n await submitPrompt(action.prompt);\n return;\n }\n if (!props.sessionId || sending) return;\n setSending(true);\n setError(null);\n try {\n const result = await chatClient.runAction({\n conversationId: props.sessionId,\n action: {\n type: \"event\",\n event: action.event,\n ...(action.fromState ? { fromState: action.fromState } : {}),\n },\n });\n if (!mountedRef.current || currentDraftKey.current !== draftKey) return;\n setPendingMessages((current) => [\n ...current,\n {\n id: crypto.randomUUID(),\n role: \"assistant\",\n content: result.text,\n ...(result.cards ? { cards: result.cards } : {}),\n },\n ]);\n } catch (cause) {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setError(errorMessage(cause, \"Chat action failed\"));\n } finally {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setSending(false);\n }\n },\n [chatClient, props.sessionId, sending, submitPrompt, draftKey],\n );\n\n const runUploads = useCallback(\n async (attempts: ChatUploadAttempt[]): Promise<void> => {\n if (uploadBatchRef.current || attempts.length === 0) return;\n const batch = Symbol();\n uploadBatchRef.current = batch;\n setUploading(true);\n setUploadAttempts((current) => [\n ...current.filter(\n (item) => !attempts.some((attempt) => attempt.id === item.id),\n ),\n ...attempts.map((attempt): ChatUploadAttempt => ({\n id: attempt.id,\n file: attempt.file,\n status: \"uploading\",\n })),\n ]);\n await Promise.all(\n attempts.map(async (attempt): Promise<void> => {\n try {\n const upload = await chatClient.upload(\n attempt.file,\n attempt.file.name,\n );\n if (\n uploadBatchRef.current !== batch ||\n currentDraftKey.current !== draftKey\n )\n return;\n setUploads((current) => [...current, upload]);\n setUploadAttempts((current) =>\n current.filter((item) => item.id !== attempt.id),\n );\n } catch (cause) {\n if (\n uploadBatchRef.current !== batch ||\n currentDraftKey.current !== draftKey\n )\n return;\n setUploadAttempts((current) =>\n current.map((item) =>\n item.id === attempt.id\n ? {\n ...item,\n status: \"failed\",\n error: errorMessage(cause, \"Upload failed\"),\n }\n : item,\n ),\n );\n }\n }),\n );\n if (uploadBatchRef.current === batch) {\n uploadBatchRef.current = null;\n setUploading(false);\n }\n },\n [chatClient, draftKey, setUploads],\n );\n\n const uploadFiles = useCallback(\n async (event: ChangeEvent<HTMLInputElement>): Promise<void> => {\n const files = Array.from(event.target.files ?? []);\n event.target.value = \"\";\n await runUploads(\n files.map((file) => ({\n id: crypto.randomUUID(),\n file,\n status: \"uploading\",\n })),\n );\n },\n [runUploads],\n );\n\n const archiveCurrent = useCallback(async (): Promise<void> => {\n if (\n !props.sessionId ||\n sending ||\n uploading ||\n draft ||\n uploads.length ||\n uploadAttempts.length\n )\n return;\n setSending(true);\n setArchiving(true);\n try {\n await chatClient.archiveSession(props.sessionId);\n await queryClient.invalidateQueries({\n queryKey: studioChatKeys.sessions,\n });\n if (mountedRef.current && currentDraftKey.current === draftKey)\n navigateToSession(undefined, true);\n } catch (cause) {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setError(errorMessage(cause, \"Conversation could not be archived\"));\n } finally {\n if (mountedRef.current && currentDraftKey.current === draftKey) {\n setSending(false);\n setArchiving(false);\n }\n }\n }, [\n chatClient,\n navigateToSession,\n props.sessionId,\n queryClient,\n sending,\n uploading,\n draft,\n uploads.length,\n uploadAttempts.length,\n draftKey,\n ]);\n\n const workspaceBadges = Object.fromEntries(\n props.workspaces.flatMap((workspace) =>\n workspace.badge === undefined ? [] : [[workspace.id, workspace.badge]],\n ),\n );\n\n return (\n <div\n className={chatClass(\"studio\", library.frame, chatLayout.root)}\n data-view=\"chat\"\n data-studio-shell=\"\"\n >\n <StudioChrome\n contextLabel=\"Chat\"\n navigation={{\n types: props.types,\n workspaces: props.workspaces,\n activeEntityType: null,\n activeWorkspaceId: STUDIO_CHAT_WORKSPACE_ID,\n workspaceBadges,\n selectEntityType: props.selectEntityType,\n selectWorkspace: props.selectWorkspace,\n }}\n />\n <div\n className={navClass(\n \"studio-chat-shell\",\n chatLayout.shell,\n nav.shell,\n navigationCollapsed && nav.shellCollapsed,\n )}\n >\n <aside className={navClass(\"rail studio-chat-studio-rail\", nav.rail)}>\n <TypeSwitcher\n renderMode=\"desktop\"\n types={props.types}\n active={null}\n onSelect={props.selectEntityType}\n workspaces={props.workspaces}\n activeWorkspace={STUDIO_CHAT_WORKSPACE_ID}\n workspaceBadges={workspaceBadges}\n onSelectWorkspace={props.selectWorkspace}\n />\n </aside>\n <main\n className={chatClass(\n \"studio-chat-workspace\",\n chatLayout.frame,\n headStyles.inset,\n )}\n >\n <div>\n <StudioPageHead\n model={{\n title: \"Chat\",\n totals: [],\n access: studioAccessRequirement(\"trusted\"),\n }}\n action={\n <div\n className={chatClass(\n \"studio-chat-head-actions\",\n chatLayout.actions,\n )}\n >\n <span\n ref={sessionPickerTrigger}\n className={chatClass(\n \"studio-chat-session-picker-trigger\",\n showSessionRail && chatLayout.mobileSessions,\n )}\n >\n <Button\n aria-expanded={sessionPickerOpen}\n aria-haspopup=\"dialog\"\n variant=\"outline\"\n type=\"button\"\n onClick={() => setSessionPickerOpen(true)}\n >\n Sessions\n </Button>\n </span>\n <Button type=\"button\" onClick={() => navigateToSession()}>\n New conversation\n </Button>\n </div>\n }\n />\n </div>\n <Dialog\n open={sessionPickerOpen}\n onOpenChange={(open) => {\n setSessionPickerOpen(open);\n }}\n >\n <DialogContent\n aria-describedby={undefined}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n sessionPickerTrigger.current?.querySelector(\"button\")?.focus();\n }}\n >\n <DialogTitle>Conversations</DialogTitle>\n <SessionRail\n {...sessionControls}\n popup\n activeSessionId={props.sessionId}\n loading={sessionsQuery.isPending}\n sessions={sessions}\n onNew={() => navigateToSession()}\n onSelect={navigateToSession}\n />\n </DialogContent>\n </Dialog>\n <div\n className={chatClass(\n \"studio-chat-room\",\n chatLayout.room,\n !showSessionRail && chatLayout.roomWithoutSessions,\n )}\n >\n {showSessionRail && (\n <SessionRail\n {...sessionControls}\n activeSessionId={props.sessionId}\n loading={sessionsQuery.isPending}\n sessions={sessions}\n onNew={() => navigateToSession()}\n onSelect={navigateToSession}\n />\n )}\n <section\n className={chatClass(\"studio-chat-thread\", chatLayout.thread)}\n aria-label=\"Conversation\"\n >\n <header\n className={chatClass(\n \"studio-chat-thread-head\",\n chatLayout.threadHead,\n !props.sessionId &&\n visibleMessages.length === 0 &&\n chatLayout.emptyThreadHead,\n )}\n >\n <div\n className={chatClass(\n \"studio-chat-head-copy\",\n chatLayout.headCopy,\n )}\n >\n <h2\n className={chatClass(\n \"studio-chat-session-heading\",\n chatLayout.title,\n typographyStyles.secondaryDisplay,\n )}\n >\n {currentSession?.title ??\n (props.sessionId ? \"Conversation\" : \"New conversation\")}\n </h2>\n {currentSession && (\n <StudioChatSessionRename\n key={currentSession.id}\n title={currentSession.title}\n onRename={async (title): Promise<void> => {\n const result = await chatClient.renameSession(\n currentSession.id,\n title,\n );\n if (!result.renamed)\n throw new Error(\n \"The conversation could not be renamed.\",\n );\n queryClient.setQueriesData<ChatSession[]>(\n { queryKey: studioChatKeys.sessions },\n (items) =>\n items?.map((session) =>\n session.id === currentSession.id\n ? { ...session, title: result.title }\n : session,\n ),\n );\n void queryClient.invalidateQueries({\n queryKey: studioChatKeys.sessions,\n });\n }}\n />\n )}\n {archivedSession && (\n <p role=\"status\">\n Archived conversation. New messages here remain archived.\n </p>\n )}\n </div>\n {props.sessionId && !archivedSession ? (\n <Button\n className=\"studio-chat-header-action\"\n variant=\"ghost\"\n type=\"button\"\n onClick={() => void archiveCurrent()}\n disabled={\n sending ||\n uploading ||\n Boolean(draft) ||\n uploads.length > 0 ||\n uploadAttempts.length > 0\n }\n title={\n draft || uploads.length || uploadAttempts.length\n ? \"Send or clear the draft before archiving\"\n : undefined\n }\n >\n {archiving ? \"Archiving…\" : \"Archive\"}\n </Button>\n ) : null}\n </header>\n {(props.sessionId !== null || visibleMessages.length > 0) && (\n <StudioChatWorkingSetDisclosure contextKey={props.sessionId}>\n <WorkingSet\n cards={contextCards}\n messages={visibleMessages}\n progress={stream?.progress ?? []}\n session={currentSession}\n />\n </StudioChatWorkingSetDisclosure>\n )}\n <div\n ref={threadScrollRef}\n tabIndex={0}\n role=\"region\"\n aria-label=\"Conversation messages\"\n onScroll={(event) => {\n const scroll = event.currentTarget;\n const nearBottom =\n scroll.scrollHeight -\n scroll.clientHeight -\n scroll.scrollTop <=\n 48;\n followLatestRef.current = nearBottom;\n setShowJumpToLatest(!nearBottom);\n }}\n className={chatClass(\n \"studio-chat-thread-scroll\",\n chatLayout.threadScroll,\n )}\n >\n <div\n className={chatClass(\n \"studio-chat-manuscript\",\n chatLayout.manuscript,\n )}\n >\n {messagesQuery.error && (\n <section role=\"alert\">\n <p>\n {storedMessages.length > 0\n ? \"Showing previously loaded messages. \"\n : \"\"}\n Conversation could not be loaded.\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={messagesQuery.isFetching}\n onClick={() => void messagesQuery.refetch()}\n >\n Retry conversation\n </Button>\n </section>\n )}\n {messagesQuery.isPending &&\n props.sessionId &&\n visibleMessages.length === 0 ? (\n <p\n className={chatClass(\n \"studio-chat-empty\",\n chatLayout.empty,\n )}\n >\n Opening conversation…\n </p>\n ) : null}\n {!messagesQuery.error &&\n (!props.sessionId || !messagesQuery.isPending) &&\n visibleMessages.length === 0 ? (\n <ChatEmptyState />\n ) : null}\n {visibleMessages.map((message) => (\n <ChatTurn\n key={message.id}\n message={message}\n client={chatClient}\n onAction={runSuggestedAction}\n onApproval={respondToApproval}\n />\n ))}\n {stream?.approvals.map((approval) => (\n <ApprovalCard\n key={approval.approvalId}\n approval={approval}\n disabled={sending}\n onDecision={respondToApproval}\n />\n ))}\n {sending ? (\n <p\n className={chatClass(\n \"studio-chat-stream-status\",\n chatLayout.empty,\n )}\n role=\"status\"\n >\n Working…\n </p>\n ) : null}\n {interrupted && (\n <section\n className={chatClass(\n \"studio-chat-interruption\",\n chatLayout.empty,\n )}\n role={interrupted.kind === \"stopped\" ? \"status\" : \"alert\"}\n aria-atomic=\"true\"\n >\n <strong>\n {interrupted.kind === \"stopped\"\n ? \"Stopped\"\n : interrupted.kind === \"disconnected\"\n ? \"Connection lost\"\n : \"Response failed\"}\n </strong>\n <p>\n Any received text is kept here. Stopping the response\n does not undo completed actions; the server may still be\n working.\n </p>\n {interrupted.detail && <p>{interrupted.detail}</p>}\n {interrupted.retry && (\n <>\n <p>\n Sending again may repeat completed actions. Review\n the request before sending.\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={\n sending ||\n uploading ||\n Boolean(draft) ||\n uploads.length > 0\n }\n onClick={() => {\n if (\n !interrupted.retry ||\n draft ||\n uploads.length > 0\n )\n return;\n setDraft(interrupted.retry.text);\n setUploads([...interrupted.retry.uploads]);\n threadScrollRef.current\n ?.closest(\".studio-chat-thread\")\n ?.querySelector<HTMLTextAreaElement>(\"textarea\")\n ?.focus();\n }}\n >\n Review retry in composer\n </Button>\n {(draft || uploads.length > 0) && (\n <p>\n Your composer draft is unchanged. Send or clear it\n before restoring this request.\n </p>\n )}\n </>\n )}\n </section>\n )}\n {error ? (\n <p\n className={chatClass(\n \"studio-chat-error\",\n chatLayout.empty,\n chatLayout.error,\n )}\n role=\"alert\"\n >\n {error}\n </p>\n ) : null}\n <div ref={threadEndRef} />\n </div>\n </div>\n <Composer\n onJumpToLatest={\n showJumpToLatest\n ? (): void => {\n followLatestRef.current = true;\n setShowJumpToLatest(false);\n const scroll = threadScrollRef.current;\n if (scroll) {\n scroll.focus({ preventScroll: true });\n scroll.scrollTop = scroll.scrollHeight;\n }\n }\n : undefined\n }\n draft={draft}\n sending={sending}\n uploading={uploading}\n uploads={uploads}\n uploadAttempts={uploadAttempts}\n onRetryUpload={(attempt) => void runUploads([attempt])}\n onDismissUpload={(id) =>\n setUploadAttempts((current) =>\n current.filter((attempt) => attempt.id !== id),\n )\n }\n onDraft={setDraft}\n locked={archiving}\n onRemoveUpload={(id) =>\n setUploads((current) =>\n current.filter((upload) => upload.id !== id),\n )\n }\n onFiles={uploadFiles}\n onSubmit={submit}\n onStop={\n activeStreamRef.current\n ? (): void => activeStreamRef.current?.abort()\n : undefined\n }\n />\n </section>\n </div>\n </main>\n </div>\n </div>\n );\n}\n\nfunction SessionRail(props: {\n popup?: boolean;\n sessions: ChatSession[];\n activeSessionId: string | null;\n loading: boolean;\n search: string;\n view: SessionView;\n error: string | null;\n onRetry: () => void;\n onSearch: (search: string) => void;\n onView: (view: SessionView) => void;\n onNew: () => void;\n onSelect: (id: string) => void;\n}): ReactElement {\n return (\n <aside\n className={\n props.popup\n ? chatClass(\"studio-chat-session-picker\", chatLayout.picker)\n : chatClass(\"studio-chat-sessions\", chatLayout.sessions)\n }\n aria-label=\"Chat sessions\"\n >\n {props.popup && (\n <header\n className={chatClass(\n \"studio-chat-sessions-head\",\n chatLayout.threadHead,\n )}\n >\n <div\n className={chatClass(\"studio-chat-head-copy\", chatLayout.headCopy)}\n >\n <h2\n className={chatClass(\n \"studio-chat-sessions-title\",\n chatLayout.subheading,\n typographyStyles.section,\n )}\n >\n Sessions\n </h2>\n </div>\n <button\n className={chatClass(\"studio-chat-new\", chatLayout.button)}\n type=\"button\"\n aria-label=\"New conversation\"\n onClick={props.onNew}\n >\n +\n </button>\n </header>\n )}\n <div\n className={chatClass(\n \"studio-chat-session-controls\",\n chatLayout.sessionControls,\n )}\n >\n <StudioSearchField\n label=\"Search conversations\"\n placeholder=\"Search conversations\"\n value={props.search}\n onChange={props.onSearch}\n />\n <NativeSelect\n xstyle={chatLayout.sessionFilterSelect}\n aria-label=\"Show conversations\"\n value={props.view.archived ? \"archived\" : \"active\"}\n onChange={(event) =>\n props.onView({\n ...props.view,\n archived: event.target.value === \"archived\",\n offset: 0,\n })\n }\n >\n <option value=\"active\">Active conversations</option>\n <option value=\"archived\">Archived conversations</option>\n </NativeSelect>\n {(props.view.offset > 0 || props.sessions.length >= 25) && (\n <div\n className={chatClass(\"\", chatLayout.actions)}\n aria-label=\"Conversation pages\"\n role=\"group\"\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={props.loading || props.view.offset === 0}\n onClick={() =>\n props.onView({\n ...props.view,\n offset: Math.max(0, props.view.offset - 25),\n })\n }\n >\n Previous\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={props.loading || props.sessions.length < 25}\n onClick={() =>\n props.onView({ ...props.view, offset: props.view.offset + 25 })\n }\n >\n Next\n </Button>\n </div>\n )}\n {props.error && (\n <p role=\"alert\">\n {props.error}{\" \"}\n <Button type=\"button\" variant=\"ghost\" onClick={props.onRetry}>\n Retry sessions\n </Button>\n </p>\n )}\n </div>\n <div\n className={chatClass(\n \"studio-chat-session-list\",\n chatLayout.sessionList,\n )}\n >\n {props.loading ? (\n <p className={chatClass(\"studio-chat-empty\", chatLayout.empty)}>\n Loading sessions…\n </p>\n ) : null}\n {!props.loading && !props.error && props.sessions.length === 0 ? (\n <p className={chatClass(\"studio-chat-empty\", chatLayout.empty)}>\n {props.view.query\n ? \"No conversations match this search.\"\n : props.view.offset > 0\n ? \"No more conversations.\"\n : props.view.archived\n ? \"No archived conversations.\"\n : \"No conversations yet.\"}\n </p>\n ) : null}\n {props.sessions.map((session) => (\n <button\n className={chatClass(\n \"studio-chat-session\",\n chatLayout.session,\n session.id === props.activeSessionId && chatLayout.activeSession,\n )}\n data-active={\n session.id === props.activeSessionId ? \"true\" : \"false\"\n }\n type=\"button\"\n key={session.id}\n onClick={() => props.onSelect(session.id)}\n >\n <strong\n className={chatClass(\n \"studio-chat-session-title\",\n chatLayout.sessionTitle,\n )}\n >\n {session.title}\n </strong>\n <time\n className={chatClass(\n \"studio-chat-session-time\",\n chatLayout.timestamp,\n )}\n dateTime={session.lastActiveAt}\n title={session.lastActiveAt}\n >\n {formatSessionTime(session.lastActiveAt)}\n </time>\n </button>\n ))}\n </div>\n </aside>\n );\n}\n\nfunction ChatEmptyState(): ReactElement {\n return (\n <section\n className={chatClass(\n \"studio-chat-empty\",\n chatLayout.empty,\n chatLayout.emptyConversation,\n )}\n aria-label=\"New conversation\"\n >\n <p className={chatClass(\"\", chatLayout.cardText)}>\n No messages yet. Your draft stays in the composer until you send it.\n </p>\n </section>\n );\n}\n\nfunction ChatTurn(props: {\n message: ChatHistoryMessage;\n client: ChatClient;\n onAction: (action: ChatSuggestedAction) => Promise<void>;\n onApproval: (\n approval: StudioChatApproval,\n approved: boolean,\n ) => Promise<void>;\n}): ReactElement {\n return (\n <article\n className={chatClass(\"studio-chat-turn\", chatLayout.turn)}\n data-role={props.message.role}\n >\n <span className={chatClass(\"studio-chat-turn-label\", chatLayout.speaker)}>\n {props.message.role === \"user\" ? \"You\" : \"Brain\"}\n </span>\n <div\n className={chatClass(\n \"studio-chat-turn-body\",\n chatLayout.turnBody,\n props.message.role === \"user\" && chatLayout.userBody,\n )}\n >\n {props.message.content ? (\n props.message.role === \"assistant\" ? (\n <StudioMarkdown\n className={chatClass(\"studio-chat-prose\", chatLayout.cards)}\n presentation=\"chat\"\n >\n {props.message.content}\n </StudioMarkdown>\n ) : (\n <p className={chatClass(\"studio-chat-text\", chatLayout.paragraph)}>\n {props.message.content}\n </p>\n )\n ) : null}\n {props.message.attachments?.map((attachment) => (\n <p\n className={chatClass(\"studio-chat-upload\", chatLayout.upload)}\n key={`${attachment.filename}-${attachment.createdAt}`}\n >\n {attachment.filename}\n </p>\n ))}\n {props.message.cards?.length ? (\n <div className={chatClass(\"studio-chat-cards\", chatLayout.cards)}>\n {props.message.cards.map((card) => (\n <MessageCard\n card={card}\n client={props.client}\n key={`${card.kind}-${card.id}`}\n onAction={props.onAction}\n onApproval={props.onApproval}\n />\n ))}\n </div>\n ) : null}\n </div>\n </article>\n );\n}\n\nfunction MessageCard(props: {\n card: ChatCard;\n client: ChatClient;\n onAction: (action: ChatSuggestedAction) => Promise<void>;\n onApproval: (\n approval: StudioChatApproval,\n approved: boolean,\n ) => Promise<void>;\n}): ReactElement {\n const { card } = props;\n if (card.kind === \"actions\") {\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span\n className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}\n >\n Actions\n </span>\n {card.title ? <strong>{card.title}</strong> : null}\n <div\n className={chatClass(\"studio-chat-card-actions\", chatLayout.actions)}\n >\n {card.actions.map((action) => (\n <button\n className={chatClass(\n \"studio-chat-card-action\",\n chatLayout.button,\n )}\n type=\"button\"\n key={action.id}\n onClick={() => void props.onAction(action)}\n >\n {action.label}\n </button>\n ))}\n </div>\n </section>\n );\n }\n if (card.kind === \"sources\") {\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span\n className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}\n >\n Sources\n </span>\n <ul>\n {card.sources.map((source) => (\n <li key={source.id}>\n {source.url ? (\n <a href={source.url}>{source.title ?? source.source}</a>\n ) : (\n (source.title ?? source.source)\n )}\n </li>\n ))}\n </ul>\n </section>\n );\n }\n if (card.kind === \"attachment\") {\n return <StudioChatAttachment card={card} client={props.client} />;\n }\n const pending = card.state === \"approval-requested\";\n const approval: StudioChatApproval = {\n approvalId: card.id,\n toolCallId: card.toolCallId ?? card.id,\n toolName: card.toolName,\n ...(card.input ? { input: card.input } : {}),\n ...(card.summary ? { title: card.summary } : {}),\n };\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}>\n {pending ? \"Approval required\" : \"Approval record\"}\n </span>\n <strong>{card.summary}</strong>\n {card.preview ? (\n <p\n className={chatClass(\n \"studio-chat-card-preview\",\n chatLayout.paragraph,\n )}\n >\n {card.preview}\n </p>\n ) : null}\n {pending ? (\n <div\n className={chatClass(\n \"studio-chat-approval-actions\",\n chatLayout.actions,\n )}\n >\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n )}\n type=\"button\"\n onClick={() => void props.onApproval(approval, false)}\n >\n Decline\n </button>\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n chatLayout.primaryButton,\n )}\n data-primary=\"true\"\n type=\"button\"\n onClick={() => void props.onApproval(approval, true)}\n >\n Approve\n </button>\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction ApprovalCard(props: {\n approval: StudioChatApproval;\n disabled: boolean;\n onDecision: (\n approval: StudioChatApproval,\n approved: boolean,\n ) => Promise<void>;\n}): ReactElement {\n return (\n <section className={chatClass(\"studio-chat-approval\", chatLayout.card)}>\n <span className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}>\n Approval required\n </span>\n <strong>{props.approval.title ?? props.approval.toolName}</strong>\n <div\n className={chatClass(\n \"studio-chat-approval-actions\",\n chatLayout.actions,\n )}\n >\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n )}\n type=\"button\"\n disabled={props.disabled}\n onClick={() => void props.onDecision(props.approval, false)}\n >\n Decline\n </button>\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n chatLayout.primaryButton,\n )}\n data-primary=\"true\"\n type=\"button\"\n disabled={props.disabled}\n onClick={() => void props.onDecision(props.approval, true)}\n >\n Approve\n </button>\n </div>\n </section>\n );\n}\n\nfunction Composer(props: {\n locked: boolean;\n onRemoveUpload: (id: string) => void;\n draft: string;\n uploads: ChatUploadResponse[];\n uploadAttempts: ChatUploadAttempt[];\n onRetryUpload: (attempt: ChatUploadAttempt) => void;\n onDismissUpload: (id: string) => void;\n sending: boolean;\n uploading: boolean;\n onDraft: (value: string) => void;\n onFiles: (event: ChangeEvent<HTMLInputElement>) => Promise<void>;\n onSubmit: (event: FormEvent<HTMLFormElement>) => void;\n onStop?: (() => void) | undefined;\n onJumpToLatest?: (() => void) | undefined;\n}): ReactElement {\n const keyDown = (event: KeyboardEvent<HTMLTextAreaElement>): void => {\n if (\n event.key === \"Enter\" &&\n !event.shiftKey &&\n !event.nativeEvent.isComposing\n ) {\n event.preventDefault();\n event.currentTarget.form?.requestSubmit();\n }\n };\n return (\n <footer className={chatClass(\"studio-chat-composer\", chatLayout.composer)}>\n {props.onJumpToLatest && (\n <Button type=\"button\" variant=\"ghost\" onClick={props.onJumpToLatest}>\n Jump to latest ↓\n </Button>\n )}\n {props.uploadAttempts.length > 0 && (\n <ul\n className={chatClass(\n \"studio-chat-upload-list\",\n chatLayout.uploadList,\n )}\n aria-label=\"File upload progress\"\n >\n {props.uploadAttempts.map((attempt) => (\n <li\n key={attempt.id}\n className={chatClass(\"studio-chat-upload\", chatLayout.upload)}\n >\n <span role={attempt.status === \"failed\" ? \"alert\" : \"status\"}>\n {attempt.file.name}:{\" \"}\n {attempt.status === \"uploading\"\n ? \"Uploading…\"\n : (attempt.error ?? \"Upload failed\")}\n </span>\n {attempt.status === \"failed\" && (\n <>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Retry uploading ${attempt.file.name}`}\n disabled={props.uploading || props.sending || props.locked}\n onClick={() => props.onRetryUpload(attempt)}\n >\n Retry\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Dismiss failed upload ${attempt.file.name}`}\n onClick={() => props.onDismissUpload(attempt.id)}\n >\n Dismiss\n </Button>\n </>\n )}\n </li>\n ))}\n </ul>\n )}\n {props.uploads.length > 0 ? (\n <div\n className={chatClass(\n \"studio-chat-upload-list\",\n chatLayout.uploadList,\n )}\n >\n {props.uploads.map((upload) => (\n <span\n className={chatClass(\"studio-chat-upload\", chatLayout.upload)}\n key={upload.id}\n >\n {upload.filename}{\" \"}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Remove ${upload.filename} from message`}\n disabled={props.locked}\n onClick={() => props.onRemoveUpload(upload.id)}\n >\n ×\n </Button>\n </span>\n ))}\n </div>\n ) : null}\n <form\n className={chatClass(\"studio-chat-composer-form\", chatLayout.form)}\n onSubmit={props.onSubmit}\n >\n <label\n className={chatClass(\n \"studio-chat-message-label\",\n chatLayout.fieldLabel,\n )}\n >\n Message\n <textarea\n className={chatClass(\"studio-chat-message\", chatLayout.input)}\n aria-label=\"Message\"\n aria-describedby=\"studio-chat-composer-hint\"\n placeholder=\"Write to your brain…\"\n value={props.draft}\n disabled={props.locked}\n onChange={(event) => props.onDraft(event.target.value)}\n onKeyDown={keyDown}\n />\n </label>\n <div\n className={chatClass(\n \"studio-chat-composer-actions\",\n chatLayout.actions,\n )}\n >\n <label\n className={chatClass(\n \"studio-chat-composer-action\",\n chatLayout.attachButton,\n )}\n >\n {props.uploading ? \"Attaching…\" : \"Attach files\"}\n <input\n className={chatClass(\n \"studio-chat-upload-input\",\n chatLayout.uploadInput,\n )}\n type=\"file\"\n accept={messageUploadAccept}\n aria-describedby=\"studio-chat-upload-guidance\"\n multiple\n disabled={props.locked || props.sending || props.uploading}\n onChange={(event) => void props.onFiles(event)}\n />\n </label>\n {props.locked ? (\n <Button type=\"button\" disabled>\n Archiving…\n </Button>\n ) : props.sending ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={props.onStop}\n disabled={!props.onStop}\n title=\"Stop receiving the response. Completed actions are not undone.\"\n >\n Stop\n </Button>\n ) : (\n <Button\n className=\"studio-chat-composer-action\"\n type=\"submit\"\n aria-label=\"Send message\"\n disabled={\n props.uploading ||\n props.uploadAttempts.length > 0 ||\n (!props.draft.trim() && props.uploads.length === 0)\n }\n >\n Send\n </Button>\n )}\n </div>\n </form>\n <small\n id=\"studio-chat-composer-hint\"\n className={chatClass(\n \"studio-chat-composer-hint\",\n chatLayout.composerHint,\n )}\n >\n Enter to send · Shift+Enter for a new line\n </small>\n <details\n className={chatClass(\n \"studio-chat-upload-guidance\",\n chatLayout.composerHint,\n )}\n >\n <summary>File types and limits</summary>\n <p id=\"studio-chat-upload-guidance\">{CHAT_UPLOAD_GUIDANCE}</p>\n </details>\n </footer>\n );\n}\n\nfunction WorkingSet(props: {\n cards: ChatCard[];\n messages: ChatHistoryMessage[];\n progress: StudioChatStreamState[\"progress\"];\n session: ChatSession | undefined;\n}): ReactElement {\n return (\n <aside\n className={chatClass(\"studio-chat-context\", chatLayout.contextBody)}\n tabIndex={0}\n aria-label=\"Working set\"\n >\n <div className={chatClass(\"studio-chat-context-list\", chatLayout.cards)}>\n {props.session?.contextHandoff ? (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n Linked context\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n typographyStyles.section,\n )}\n >\n {props.session.contextHandoff.titleSeed}\n </h3>\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {props.session.contextHandoff.sourceId} ·{\" \"}\n {props.session.contextHandoff.itemId}\n </p>\n </section>\n ) : null}\n {props.cards.length === 0 && props.progress.length === 0 ? (\n <p className={chatClass(\"studio-chat-empty\", chatLayout.empty)}>\n Sources, artifacts, and durable jobs appear here as the conversation\n develops.\n </p>\n ) : null}\n {props.cards.map((card, index) => (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n key={`${card.kind}-${card.id}-${index}`}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n {card.kind === \"sources\" ? \"Sources\" : \"Artifact\"}\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n typographyStyles.section,\n )}\n >\n {card.kind === \"sources\"\n ? (card.title ?? `${card.sources.length} consulted`)\n : card.kind === \"attachment\"\n ? card.title\n : \"Conversation context\"}\n </h3>\n {card.kind === \"sources\" ? (\n <>\n <ul>\n {card.sources.slice(0, 5).map((source) => (\n <li key={source.id}>{source.title ?? source.source}</li>\n ))}\n </ul>\n {card.sources.length > 5 ? (\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {card.sources.length - 5} more sources in the conversation.\n </p>\n ) : null}\n </>\n ) : card.kind === \"attachment\" && card.description ? (\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {card.description}\n </p>\n ) : null}\n </section>\n ))}\n {props.progress.map((item, index) => (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n key={`${item.type}-${index}`}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n Durable job\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n typographyStyles.section,\n )}\n >\n {item.operationTarget ?? item.operationType}\n </h3>\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {item.message ?? item.status}\n </p>\n </section>\n ))}\n {props.messages.length > 0 ? (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n Activity\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n typographyStyles.section,\n )}\n >\n Visible conversation\n </h3>\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {props.messages.length} visible messages.\n </p>\n </section>\n ) : null}\n </div>\n </aside>\n );\n}\n\nfunction formatSessionTime(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(undefined, {\n day: \"numeric\",\n year:\n date.getFullYear() === new Date().getFullYear() ? undefined : \"numeric\",\n month: \"short\",\n timeZoneName: \"short\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(date);\n}\n\nfunction errorMessage(cause: unknown, fallback: string): string {\n return cause instanceof Error && cause.message ? cause.message : fallback;\n}\n",
|
|
15
|
+
"/** @jsxImportSource react */\nimport { libraryStyles as library } from \"./studio-library.styles\";\nimport { StudioChatAttachment } from \"./studio-chat-attachment\";\nimport { StudioChatSessionRename } from \"./studio-chat-session-rename\";\nimport { StudioChatWorkingSetDisclosure } from \"./studio-chat-working-set-disclosure\";\nimport {\n messageUploadAccept,\n messageTextUploadMaxBytes,\n messageUploadMaxBytes,\n} from \"@brains/plugins/message-interface/upload-policy\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogTitle,\n NativeSelect,\n} from \"@brains/app-ui-react\";\nimport { chatClass, chatLayout } from \"./studio-chat-layout.styles\";\nimport {\n StudioChatDraftStore,\n studioChatDraftKey,\n type StudioChatNavigationState,\n} from \"./studio-chat-drafts\";\nimport { StudioPageHead, studioAccessRequirement } from \"./studio-page-head\";\nimport { headStyles } from \"./studio-page-head.styles\";\nimport { typographyStyles } from \"./studio-typography.styles\";\nimport {\n createChatClient,\n readChatProtocolEvents,\n type ChatCard,\n type ChatClient,\n type ChatHistoryMessage,\n type ChatMessage,\n type ChatSession,\n type ChatUploadResponse,\n} from \"@brains/contracts/chat\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type ChangeEvent,\n type FormEvent,\n type KeyboardEvent,\n type ReactElement,\n} from \"react\";\nimport {\n STUDIO_CHAT_WORKSPACE_ID,\n studioChatWorkspacePath,\n} from \"../../src/chat-workspace\";\nimport type { EntityTypeInfo, StudioWorkspaceInfo } from \"./api\";\nimport type { StudioChatHandoff } from \"./operator-launch\";\nimport {\n approvalResponseMessage,\n createStudioChatStreamState,\n reduceStudioChatStream,\n streamAssistantMessage,\n type StudioChatApproval,\n type StudioChatStreamState,\n} from \"./chat-workspace-model\";\nimport { TypeSwitcher } from \"./entity-fields\";\nimport { useStudioNavigationCollapsed } from \"./studio-navigation-state\";\nimport { StudioChrome } from \"./studio-chrome\";\nimport { StudioSearchField } from \"./studio-search-field\";\nimport { StudioMarkdown } from \"./studio-markdown\";\nimport {\n navigationClassName as navClass,\n navigationStyles as nav,\n} from \"./studio-navigation.styles\";\n\nconst CHAT_UPLOAD_GUIDANCE = `Text/Markdown up to ${messageTextUploadMaxBytes / 1000} KB; PNG, JPEG, WebP, GIF or PDF up to ${messageUploadMaxBytes / 1000000} MB.`;\n\nconst studioChatKeys = {\n sessions: [\"studio\", \"chat\", \"sessions\"] as const,\n messages: (conversationId: string) =>\n [\"studio\", \"chat\", \"messages\", conversationId] as const,\n};\n\ntype ChatActionCard = Extract<ChatCard, { kind: \"actions\" }>;\ntype ChatSuggestedAction = ChatActionCard[\"actions\"][number];\n\ninterface SessionView {\n query: string;\n archived: boolean;\n offset: number;\n}\n\ninterface ChatUploadAttempt {\n id: string;\n file: File;\n status: \"uploading\" | \"failed\";\n error?: string;\n}\n\ninterface InterruptedResponse {\n kind: \"stopped\" | \"disconnected\" | \"failed\";\n detail?: string;\n retry?: { text: string; uploads: ChatUploadResponse[] };\n}\n\nexport interface StudioChatWorkspaceProps {\n apiPath?: string | undefined;\n draftStore?: StudioChatDraftStore | undefined;\n onNavigationStateChange?:\n ((state: StudioChatNavigationState) => void) | undefined;\n studioBasePath: string;\n sessionId: string | null;\n types: EntityTypeInfo[];\n workspaces: StudioWorkspaceInfo[];\n handoff: StudioChatHandoff | null;\n navigate: (href: string, options?: { preserveWork?: boolean }) => void;\n selectEntityType: (entityType: string) => void;\n selectWorkspace: (workspaceId: string) => void;\n}\n\nexport function StudioChatWorkspace(\n props: StudioChatWorkspaceProps,\n): ReactElement {\n const queryClient = useQueryClient();\n const chatClient = useMemo(\n () =>\n createChatClient({\n apiPath: props.apiPath,\n fetch: (input, init) => globalThis.fetch(input, init),\n }),\n [props.apiPath],\n );\n const [localDraftStore] = useState(() => new StudioChatDraftStore());\n const draftStore = props.draftStore ?? localDraftStore;\n const draftKey = studioChatDraftKey(props.apiPath, props.sessionId);\n const currentDraftKey = useRef(draftKey);\n currentDraftKey.current = draftKey;\n const { text: draft, uploads } = useSyncExternalStore(\n draftStore.subscribe,\n () => draftStore.read(draftKey),\n () => draftStore.read(draftKey),\n );\n const setDraft = useCallback(\n (text: string) => draftStore.update(draftKey, { text }),\n [draftStore, draftKey],\n );\n const setUploads = useCallback(\n (\n value:\n | ChatUploadResponse[]\n | ((current: ChatUploadResponse[]) => ChatUploadResponse[]),\n ) =>\n draftStore.update(draftKey, {\n uploads:\n typeof value === \"function\"\n ? value(draftStore.read(draftKey).uploads)\n : value,\n }),\n [draftStore, draftKey],\n );\n const [pendingMessages, setPendingMessages] = useState<ChatHistoryMessage[]>(\n [],\n );\n const [stream, setStream] = useState<StudioChatStreamState | null>(null);\n const [sending, setSending] = useState(false);\n const [archiving, setArchiving] = useState(false);\n const [uploading, setUploading] = useState(false);\n const [uploadAttempts, setUploadAttempts] = useState<ChatUploadAttempt[]>([]);\n const uploadBatchRef = useRef<symbol | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [interrupted, setInterrupted] = useState<InterruptedResponse | null>(\n null,\n );\n useEffect(() => {\n props.onNavigationStateChange?.({\n hasDraft: Boolean(draft || uploads.length || uploadAttempts.length),\n busy: sending || uploading,\n });\n }, [\n draft,\n uploads,\n uploadAttempts,\n sending,\n uploading,\n props.onNavigationStateChange,\n ]);\n useEffect(\n () => (): void =>\n props.onNavigationStateChange?.({ hasDraft: false, busy: false }),\n [props.onNavigationStateChange],\n );\n const navigationCollapsed = useStudioNavigationCollapsed();\n const [sessionPickerOpen, setSessionPickerOpen] = useState(false);\n const sessionPickerTrigger = useRef<HTMLSpanElement>(null);\n const threadEndRef = useRef<HTMLDivElement | null>(null);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const followLatestRef = useRef(true);\n const [showJumpToLatest, setShowJumpToLatest] = useState(false);\n const activeStreamRef = useRef<AbortController | null>(null);\n const mountedRef = useRef(false);\n useEffect(() => {\n mountedRef.current = true;\n return (): void => {\n mountedRef.current = false;\n uploadBatchRef.current = null;\n const active = activeStreamRef.current;\n activeStreamRef.current = null;\n active?.abort();\n };\n }, []);\n const handledHandoffRef = useRef<string | null>(null);\n const adoptedSessionRef = useRef<string | null>(null);\n\n const [sessionSearch, setSessionSearch] = useState(\"\");\n const [sessionView, setSessionView] = useState<SessionView>({\n query: \"\",\n archived: false,\n offset: 0,\n });\n useEffect(() => {\n const timer = window.setTimeout(\n () =>\n setSessionView((current) =>\n current.query === sessionSearch.trim()\n ? current\n : { ...current, query: sessionSearch.trim(), offset: 0 },\n ),\n 250,\n );\n return (): void => window.clearTimeout(timer);\n }, [sessionSearch]);\n const sessionsQuery = useQuery({\n queryKey: [...studioChatKeys.sessions, sessionView],\n queryFn: () => chatClient.listSessions(sessionView),\n });\n const messagesQuery = useQuery({\n queryKey: studioChatKeys.messages(props.sessionId ?? \"\"),\n queryFn: () => chatClient.getMessages(props.sessionId ?? \"\"),\n // A newly accepted session already has an optimistic copy of its first\n // turn. Wait for the completed stream to replace that copy atomically.\n enabled:\n props.sessionId !== null && !sending && pendingMessages.length === 0,\n });\n const sessions = sessionsQuery.data ?? [];\n const showSessionRail =\n sessionsQuery.isPending ||\n Boolean(sessionsQuery.error) ||\n sessions.length > 0 ||\n sessionSearch.length > 0 ||\n sessionView.archived ||\n sessionView.offset > 0;\n const storedMessages = messagesQuery.data ?? [];\n const currentSession =\n sessions.find((session) => session.id === props.sessionId) ??\n queryClient\n .getQueriesData<ChatSession[]>({ queryKey: studioChatKeys.sessions })\n .flatMap(([, items]) => items ?? [])\n .find((session) => session.id === props.sessionId);\n const archivedSession = currentSession?.archived === true;\n const sessionControls = {\n search: sessionSearch,\n view: sessionView,\n error: sessionsQuery.error ? \"Sessions could not be loaded.\" : null,\n onRetry: (): void => {\n void sessionsQuery.refetch();\n },\n onSearch: setSessionSearch,\n onView: setSessionView,\n };\n const visibleMessages = useMemo(() => {\n const next = [...storedMessages, ...pendingMessages];\n if (stream && (stream.text || stream.cards.length > 0)) {\n next.push(streamAssistantMessage(stream));\n }\n return next;\n }, [pendingMessages, storedMessages, stream]);\n const contextCards = useMemo(\n () =>\n visibleMessages.flatMap((message) =>\n (message.cards ?? []).filter(\n (card) => card.kind === \"sources\" || card.kind === \"attachment\",\n ),\n ),\n [visibleMessages],\n );\n\n useEffect(() => {\n if (props.sessionId && adoptedSessionRef.current === props.sessionId) {\n adoptedSessionRef.current = null;\n return;\n }\n const active = activeStreamRef.current;\n activeStreamRef.current = null;\n active?.abort();\n setSending(false);\n setPendingMessages([]);\n setStream(null);\n setUploading(false);\n uploadBatchRef.current = null;\n setUploadAttempts([]);\n setArchiving(false);\n setError(null);\n setInterrupted(null);\n }, [props.sessionId]);\n\n useEffect(() => {\n followLatestRef.current = true;\n setShowJumpToLatest(false);\n }, [props.sessionId]);\n\n useEffect(() => {\n const scroll = threadScrollRef.current;\n const manuscript = scroll?.firstElementChild;\n if (!scroll || !manuscript) return;\n const follow = (): void => {\n if (followLatestRef.current) scroll.scrollTop = scroll.scrollHeight;\n };\n follow();\n const observer = new ResizeObserver(follow);\n observer.observe(manuscript);\n return (): void => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (followLatestRef.current) {\n const scroll = threadScrollRef.current;\n if (scroll) scroll.scrollTop = scroll.scrollHeight;\n }\n }, [stream, visibleMessages.length]);\n\n const navigateToSession = useCallback(\n (conversationId?: string, preserveWork = false): void => {\n props.navigate(\n studioChatWorkspacePath(props.studioBasePath, conversationId),\n { preserveWork },\n );\n setSessionPickerOpen(false);\n },\n [props.navigate, props.studioBasePath],\n );\n\n useEffect(() => {\n if (!props.handoff || props.sessionId) return;\n const handoffKey = `${props.handoff.sourceId}\\u0000${props.handoff.itemId}`;\n if (handledHandoffRef.current === handoffKey) return;\n handledHandoffRef.current = handoffKey;\n setDraft(props.handoff.prompt);\n setError(null);\n void chatClient\n .openContextSession({\n version: 1,\n sourceId: props.handoff.sourceId,\n itemId: props.handoff.itemId,\n titleSeed: props.handoff.label,\n })\n .then(({ conversationId }) => {\n if (\n !mountedRef.current ||\n currentDraftKey.current !== draftKey ||\n handledHandoffRef.current !== handoffKey\n )\n return;\n draftStore.adopt(\n draftKey,\n studioChatDraftKey(props.apiPath, conversationId),\n );\n navigateToSession(conversationId, true);\n })\n .catch((cause: unknown) => {\n if (\n !mountedRef.current ||\n currentDraftKey.current !== draftKey ||\n handledHandoffRef.current !== handoffKey\n )\n return;\n handledHandoffRef.current = null;\n setError(errorMessage(cause, \"Context could not be attached\"));\n });\n }, [\n chatClient,\n navigateToSession,\n props.handoff,\n props.sessionId,\n props.apiPath,\n draftStore,\n draftKey,\n setDraft,\n ]);\n\n const runStream = useCallback(\n async (\n conversationId: string,\n messages: ChatMessage[],\n onAccepted?: () => void,\n retry?: InterruptedResponse[\"retry\"],\n ): Promise<boolean> => {\n activeStreamRef.current?.abort();\n const controller = new AbortController();\n activeStreamRef.current = controller;\n setSending(true);\n setError(null);\n setInterrupted(null);\n let stoppedByServer = false;\n let next: StudioChatStreamState = {\n ...createStudioChatStreamState(),\n messageId: crypto.randomUUID(),\n };\n setStream(next);\n let accepted = false;\n let retained = false;\n const retainResponse = (): void => {\n if (retained || (!next.text && next.cards.length === 0)) return;\n retained = true;\n const message = streamAssistantMessage(next);\n setPendingMessages((current) => [...current, message]);\n setStream({ ...next, text: \"\", cards: [] });\n };\n try {\n const response = await chatClient.streamMessages(\n {\n id: conversationId,\n messages,\n trigger: \"submit-message\",\n },\n { signal: controller.signal },\n );\n accepted = true;\n onAccepted?.();\n for await (const event of readChatProtocolEvents(response)) {\n if (activeStreamRef.current !== controller) return accepted;\n if (event.type === \"abort\") stoppedByServer = true;\n next = reduceStudioChatStream(next, event);\n setStream(next);\n }\n if (activeStreamRef.current !== controller) return accepted;\n retainResponse();\n if (\n controller.signal.aborted ||\n stoppedByServer ||\n next.error !== null ||\n !next.finished\n ) {\n setInterrupted({\n kind:\n controller.signal.aborted || stoppedByServer\n ? \"stopped\"\n : next.error !== null\n ? \"failed\"\n : \"disconnected\",\n ...(next.error ? { detail: next.error } : {}),\n ...(retry ? { retry } : {}),\n });\n return accepted;\n }\n try {\n const authoritativeMessages =\n await chatClient.getMessages(conversationId);\n if (activeStreamRef.current !== controller) return accepted;\n queryClient.setQueryData(\n studioChatKeys.messages(conversationId),\n authoritativeMessages,\n );\n setPendingMessages([]);\n // History now owns the completed turn, including its approvals.\n // Keep the live state only when this read fails.\n setStream(null);\n } catch {\n // The completed response remains visible from the optimistic state;\n // a later session visit can retry the authoritative history read.\n }\n await queryClient.invalidateQueries({\n queryKey: studioChatKeys.sessions,\n });\n } catch (cause) {\n if (activeStreamRef.current !== controller) return accepted;\n retainResponse();\n setInterrupted({\n kind: controller.signal.aborted\n ? \"stopped\"\n : accepted\n ? \"disconnected\"\n : \"failed\",\n ...(!controller.signal.aborted\n ? {\n detail: errorMessage(\n cause,\n \"Chat could not complete the response\",\n ),\n }\n : {}),\n ...(retry ? { retry } : {}),\n });\n } finally {\n if (activeStreamRef.current === controller) {\n activeStreamRef.current = null;\n setSending(false);\n }\n }\n return accepted;\n },\n [chatClient, queryClient],\n );\n\n const submitPrompt = useCallback(\n async (prompt: string): Promise<void> => {\n const text = prompt.trim();\n if (\n (!text && uploads.length === 0) ||\n sending ||\n uploading ||\n uploadAttempts.length > 0\n )\n return;\n const conversationId = props.sessionId ?? `web-${crypto.randomUUID()}`;\n const sentKey = studioChatDraftKey(props.apiPath, conversationId);\n const messageId = crypto.randomUUID();\n const uploadParts = uploads.map((upload) => ({\n type: \"data-upload\" as const,\n data: { ref: upload.ref },\n }));\n const parts = [\n ...(text ? [{ type: \"text\" as const, text }] : []),\n ...uploadParts,\n ];\n setPendingMessages((current) => [\n ...current,\n {\n id: messageId,\n role: \"user\",\n content: text || uploads.map((upload) => upload.filename).join(\", \"),\n },\n ]);\n // The transcript owns the message from here, so the composer empties now\n // rather than when the server answers; a refusal puts the draft back. A\n // suggested action carries its own prompt and never empties the composer.\n const sentUploads = [...uploads];\n const held = draftStore.read(draftKey);\n const sentFromComposer = held.text === prompt;\n if (sentFromComposer || sentUploads.length > 0)\n draftStore.update(draftKey, {\n text: sentFromComposer ? \"\" : held.text,\n uploads: held.uploads.filter(\n (upload) => !sentUploads.some((sent) => sent.id === upload.id),\n ),\n });\n const accepted = await runStream(\n conversationId,\n [{ id: messageId, role: \"user\", parts }],\n () => {\n if (\n !props.sessionId &&\n mountedRef.current &&\n currentDraftKey.current === draftKey\n ) {\n draftStore.adopt(draftKey, sentKey);\n adoptedSessionRef.current = conversationId;\n navigateToSession(conversationId, true);\n }\n },\n { text: prompt, uploads: [...uploads] },\n );\n if (\n !accepted &&\n (currentDraftKey.current === sentKey ||\n (!props.sessionId && currentDraftKey.current === draftKey))\n ) {\n setPendingMessages((current) =>\n current.filter((message) => message.id !== messageId),\n );\n // Restore into whichever conversation the composer now shows, keeping\n // anything typed while the request was in flight.\n const key = currentDraftKey.current;\n const current = draftStore.read(key);\n draftStore.update(key, {\n ...(sentFromComposer && !current.text ? { text: prompt } : {}),\n uploads: [\n ...sentUploads.filter(\n (upload) =>\n !current.uploads.some((kept) => kept.id === upload.id),\n ),\n ...current.uploads,\n ],\n });\n }\n },\n [\n navigateToSession,\n props.sessionId,\n props.apiPath,\n draftStore,\n draftKey,\n runStream,\n sending,\n uploading,\n uploads,\n uploadAttempts.length,\n ],\n );\n\n const submit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n void submitPrompt(draft);\n };\n\n const respondToApproval = useCallback(\n async (approval: StudioChatApproval, approved: boolean): Promise<void> => {\n if (!props.sessionId || sending) return;\n await runStream(props.sessionId, [\n approvalResponseMessage(approval, approved),\n ]);\n },\n [props.sessionId, runStream, sending],\n );\n\n const runSuggestedAction = useCallback(\n async (action: ChatSuggestedAction): Promise<void> => {\n if (action.type === \"prompt\") {\n await submitPrompt(action.prompt);\n return;\n }\n if (!props.sessionId || sending) return;\n setSending(true);\n setError(null);\n try {\n const result = await chatClient.runAction({\n conversationId: props.sessionId,\n action: {\n type: \"event\",\n event: action.event,\n ...(action.fromState ? { fromState: action.fromState } : {}),\n },\n });\n if (!mountedRef.current || currentDraftKey.current !== draftKey) return;\n setPendingMessages((current) => [\n ...current,\n {\n id: crypto.randomUUID(),\n role: \"assistant\",\n content: result.text,\n ...(result.cards ? { cards: result.cards } : {}),\n },\n ]);\n } catch (cause) {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setError(errorMessage(cause, \"Chat action failed\"));\n } finally {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setSending(false);\n }\n },\n [chatClient, props.sessionId, sending, submitPrompt, draftKey],\n );\n\n const runUploads = useCallback(\n async (attempts: ChatUploadAttempt[]): Promise<void> => {\n if (uploadBatchRef.current || attempts.length === 0) return;\n const batch = Symbol();\n uploadBatchRef.current = batch;\n setUploading(true);\n setUploadAttempts((current) => [\n ...current.filter(\n (item) => !attempts.some((attempt) => attempt.id === item.id),\n ),\n ...attempts.map((attempt): ChatUploadAttempt => ({\n id: attempt.id,\n file: attempt.file,\n status: \"uploading\",\n })),\n ]);\n await Promise.all(\n attempts.map(async (attempt): Promise<void> => {\n try {\n const upload = await chatClient.upload(\n attempt.file,\n attempt.file.name,\n );\n if (\n uploadBatchRef.current !== batch ||\n currentDraftKey.current !== draftKey\n )\n return;\n setUploads((current) => [...current, upload]);\n setUploadAttempts((current) =>\n current.filter((item) => item.id !== attempt.id),\n );\n } catch (cause) {\n if (\n uploadBatchRef.current !== batch ||\n currentDraftKey.current !== draftKey\n )\n return;\n setUploadAttempts((current) =>\n current.map((item) =>\n item.id === attempt.id\n ? {\n ...item,\n status: \"failed\",\n error: errorMessage(cause, \"Upload failed\"),\n }\n : item,\n ),\n );\n }\n }),\n );\n if (uploadBatchRef.current === batch) {\n uploadBatchRef.current = null;\n setUploading(false);\n }\n },\n [chatClient, draftKey, setUploads],\n );\n\n const uploadFiles = useCallback(\n async (event: ChangeEvent<HTMLInputElement>): Promise<void> => {\n const files = Array.from(event.target.files ?? []);\n event.target.value = \"\";\n await runUploads(\n files.map((file) => ({\n id: crypto.randomUUID(),\n file,\n status: \"uploading\",\n })),\n );\n },\n [runUploads],\n );\n\n const archiveCurrent = useCallback(async (): Promise<void> => {\n if (\n !props.sessionId ||\n sending ||\n uploading ||\n draft ||\n uploads.length ||\n uploadAttempts.length\n )\n return;\n setSending(true);\n setArchiving(true);\n try {\n await chatClient.archiveSession(props.sessionId);\n await queryClient.invalidateQueries({\n queryKey: studioChatKeys.sessions,\n });\n if (mountedRef.current && currentDraftKey.current === draftKey)\n navigateToSession(undefined, true);\n } catch (cause) {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setError(errorMessage(cause, \"Conversation could not be archived\"));\n } finally {\n if (mountedRef.current && currentDraftKey.current === draftKey) {\n setSending(false);\n setArchiving(false);\n }\n }\n }, [\n chatClient,\n navigateToSession,\n props.sessionId,\n queryClient,\n sending,\n uploading,\n draft,\n uploads.length,\n uploadAttempts.length,\n draftKey,\n ]);\n\n const workspaceBadges = Object.fromEntries(\n props.workspaces.flatMap((workspace) =>\n workspace.badge === undefined ? [] : [[workspace.id, workspace.badge]],\n ),\n );\n\n return (\n <div\n className={chatClass(\"studio\", library.frame, chatLayout.root)}\n data-view=\"chat\"\n data-studio-shell=\"\"\n >\n <StudioChrome\n contextLabel=\"Chat\"\n navigation={{\n types: props.types,\n workspaces: props.workspaces,\n activeEntityType: null,\n activeWorkspaceId: STUDIO_CHAT_WORKSPACE_ID,\n workspaceBadges,\n selectEntityType: props.selectEntityType,\n selectWorkspace: props.selectWorkspace,\n }}\n />\n <div\n className={navClass(\n \"studio-chat-shell\",\n chatLayout.shell,\n nav.shell,\n navigationCollapsed && nav.shellCollapsed,\n )}\n >\n <aside className={navClass(\"rail studio-chat-studio-rail\", nav.rail)}>\n <TypeSwitcher\n renderMode=\"desktop\"\n types={props.types}\n active={null}\n onSelect={props.selectEntityType}\n workspaces={props.workspaces}\n activeWorkspace={STUDIO_CHAT_WORKSPACE_ID}\n workspaceBadges={workspaceBadges}\n onSelectWorkspace={props.selectWorkspace}\n />\n </aside>\n <main\n className={chatClass(\n \"studio-chat-workspace\",\n chatLayout.frame,\n headStyles.inset,\n )}\n >\n <div>\n <StudioPageHead\n model={{\n title: \"Chat\",\n totals: [],\n access: studioAccessRequirement(\"trusted\"),\n }}\n action={\n <div\n className={chatClass(\n \"studio-chat-head-actions\",\n chatLayout.actions,\n )}\n >\n <span\n ref={sessionPickerTrigger}\n className={chatClass(\n \"studio-chat-session-picker-trigger\",\n showSessionRail && chatLayout.mobileSessions,\n )}\n >\n <Button\n aria-expanded={sessionPickerOpen}\n aria-haspopup=\"dialog\"\n variant=\"outline\"\n type=\"button\"\n onClick={() => setSessionPickerOpen(true)}\n >\n Sessions\n </Button>\n </span>\n <Button type=\"button\" onClick={() => navigateToSession()}>\n New conversation\n </Button>\n </div>\n }\n />\n </div>\n <Dialog\n open={sessionPickerOpen}\n onOpenChange={(open) => {\n setSessionPickerOpen(open);\n }}\n >\n <DialogContent\n aria-describedby={undefined}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n sessionPickerTrigger.current?.querySelector(\"button\")?.focus();\n }}\n >\n <DialogTitle>Conversations</DialogTitle>\n <SessionRail\n {...sessionControls}\n popup\n activeSessionId={props.sessionId}\n loading={sessionsQuery.isPending}\n sessions={sessions}\n onNew={() => navigateToSession()}\n onSelect={navigateToSession}\n />\n </DialogContent>\n </Dialog>\n <div\n className={chatClass(\n \"studio-chat-room\",\n chatLayout.room,\n !showSessionRail && chatLayout.roomWithoutSessions,\n )}\n >\n {showSessionRail && (\n <SessionRail\n {...sessionControls}\n activeSessionId={props.sessionId}\n loading={sessionsQuery.isPending}\n sessions={sessions}\n onNew={() => navigateToSession()}\n onSelect={navigateToSession}\n />\n )}\n <section\n className={chatClass(\"studio-chat-thread\", chatLayout.thread)}\n aria-label=\"Conversation\"\n >\n <header\n className={chatClass(\n \"studio-chat-thread-head\",\n chatLayout.threadHead,\n !props.sessionId &&\n visibleMessages.length === 0 &&\n chatLayout.emptyThreadHead,\n )}\n >\n <div\n className={chatClass(\n \"studio-chat-head-copy\",\n chatLayout.headCopy,\n )}\n >\n <h2\n className={chatClass(\n \"studio-chat-session-heading\",\n chatLayout.title,\n typographyStyles.secondaryDisplay,\n )}\n >\n {currentSession?.title ??\n (props.sessionId ? \"Conversation\" : \"New conversation\")}\n </h2>\n {currentSession && (\n <StudioChatSessionRename\n key={currentSession.id}\n title={currentSession.title}\n onRename={async (title): Promise<void> => {\n const result = await chatClient.renameSession(\n currentSession.id,\n title,\n );\n if (!result.renamed)\n throw new Error(\n \"The conversation could not be renamed.\",\n );\n queryClient.setQueriesData<ChatSession[]>(\n { queryKey: studioChatKeys.sessions },\n (items) =>\n items?.map((session) =>\n session.id === currentSession.id\n ? { ...session, title: result.title }\n : session,\n ),\n );\n void queryClient.invalidateQueries({\n queryKey: studioChatKeys.sessions,\n });\n }}\n />\n )}\n {archivedSession && (\n <p role=\"status\">\n Archived conversation. New messages here remain archived.\n </p>\n )}\n </div>\n {props.sessionId && !archivedSession ? (\n <Button\n className=\"studio-chat-header-action\"\n variant=\"ghost\"\n type=\"button\"\n onClick={() => void archiveCurrent()}\n disabled={\n sending ||\n uploading ||\n Boolean(draft) ||\n uploads.length > 0 ||\n uploadAttempts.length > 0\n }\n title={\n draft || uploads.length || uploadAttempts.length\n ? \"Send or clear the draft before archiving\"\n : undefined\n }\n >\n {archiving ? \"Archiving…\" : \"Archive\"}\n </Button>\n ) : null}\n </header>\n {(props.sessionId !== null || visibleMessages.length > 0) && (\n <StudioChatWorkingSetDisclosure contextKey={props.sessionId}>\n <WorkingSet\n cards={contextCards}\n messages={visibleMessages}\n progress={stream?.progress ?? []}\n session={currentSession}\n />\n </StudioChatWorkingSetDisclosure>\n )}\n <div\n ref={threadScrollRef}\n tabIndex={0}\n role=\"region\"\n aria-label=\"Conversation messages\"\n onScroll={(event) => {\n const scroll = event.currentTarget;\n const nearBottom =\n scroll.scrollHeight -\n scroll.clientHeight -\n scroll.scrollTop <=\n 48;\n followLatestRef.current = nearBottom;\n setShowJumpToLatest(!nearBottom);\n }}\n className={chatClass(\n \"studio-chat-thread-scroll\",\n chatLayout.threadScroll,\n )}\n >\n <div\n className={chatClass(\n \"studio-chat-manuscript\",\n chatLayout.manuscript,\n )}\n >\n {messagesQuery.error && (\n <section role=\"alert\">\n <p>\n {storedMessages.length > 0\n ? \"Showing previously loaded messages. \"\n : \"\"}\n Conversation could not be loaded.\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={messagesQuery.isFetching}\n onClick={() => void messagesQuery.refetch()}\n >\n Retry conversation\n </Button>\n </section>\n )}\n {messagesQuery.isPending &&\n props.sessionId &&\n visibleMessages.length === 0 ? (\n <p\n className={chatClass(\n \"studio-chat-empty\",\n chatLayout.empty,\n )}\n >\n Opening conversation…\n </p>\n ) : null}\n {!messagesQuery.error &&\n (!props.sessionId || !messagesQuery.isPending) &&\n visibleMessages.length === 0 ? (\n <ChatEmptyState />\n ) : null}\n {visibleMessages.map((message) => (\n <ChatTurn\n key={message.id}\n message={message}\n client={chatClient}\n onAction={runSuggestedAction}\n onApproval={respondToApproval}\n />\n ))}\n {stream?.approvals.map((approval) => (\n <ApprovalCard\n key={approval.approvalId}\n approval={approval}\n disabled={sending}\n onDecision={respondToApproval}\n />\n ))}\n {sending ? (\n <p\n className={chatClass(\n \"studio-chat-stream-status\",\n chatLayout.empty,\n )}\n role=\"status\"\n >\n Working…\n </p>\n ) : null}\n {interrupted && (\n <section\n className={chatClass(\n \"studio-chat-interruption\",\n chatLayout.empty,\n )}\n role={interrupted.kind === \"stopped\" ? \"status\" : \"alert\"}\n aria-atomic=\"true\"\n >\n <strong>\n {interrupted.kind === \"stopped\"\n ? \"Stopped\"\n : interrupted.kind === \"disconnected\"\n ? \"Connection lost\"\n : \"Response failed\"}\n </strong>\n <p>\n Any received text is kept here. Stopping the response\n does not undo completed actions; the server may still be\n working.\n </p>\n {interrupted.detail && <p>{interrupted.detail}</p>}\n {interrupted.retry && (\n <>\n <p>\n Sending again may repeat completed actions. Review\n the request before sending.\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={\n sending ||\n uploading ||\n Boolean(draft) ||\n uploads.length > 0\n }\n onClick={() => {\n if (\n !interrupted.retry ||\n draft ||\n uploads.length > 0\n )\n return;\n setDraft(interrupted.retry.text);\n setUploads([...interrupted.retry.uploads]);\n threadScrollRef.current\n ?.closest(\".studio-chat-thread\")\n ?.querySelector<HTMLTextAreaElement>(\"textarea\")\n ?.focus();\n }}\n >\n Review retry in composer\n </Button>\n {(draft || uploads.length > 0) && (\n <p>\n Your composer draft is unchanged. Send or clear it\n before restoring this request.\n </p>\n )}\n </>\n )}\n </section>\n )}\n {error ? (\n <p\n className={chatClass(\n \"studio-chat-error\",\n chatLayout.empty,\n chatLayout.error,\n )}\n role=\"alert\"\n >\n {error}\n </p>\n ) : null}\n <div ref={threadEndRef} />\n </div>\n </div>\n <Composer\n onJumpToLatest={\n showJumpToLatest\n ? (): void => {\n followLatestRef.current = true;\n setShowJumpToLatest(false);\n const scroll = threadScrollRef.current;\n if (scroll) {\n scroll.focus({ preventScroll: true });\n scroll.scrollTop = scroll.scrollHeight;\n }\n }\n : undefined\n }\n draft={draft}\n sending={sending}\n uploading={uploading}\n uploads={uploads}\n uploadAttempts={uploadAttempts}\n onRetryUpload={(attempt) => void runUploads([attempt])}\n onDismissUpload={(id) =>\n setUploadAttempts((current) =>\n current.filter((attempt) => attempt.id !== id),\n )\n }\n onDraft={setDraft}\n locked={archiving}\n onRemoveUpload={(id) =>\n setUploads((current) =>\n current.filter((upload) => upload.id !== id),\n )\n }\n onFiles={uploadFiles}\n onSubmit={submit}\n onStop={\n activeStreamRef.current\n ? (): void => activeStreamRef.current?.abort()\n : undefined\n }\n />\n </section>\n </div>\n </main>\n </div>\n </div>\n );\n}\n\nfunction SessionRail(props: {\n popup?: boolean;\n sessions: ChatSession[];\n activeSessionId: string | null;\n loading: boolean;\n search: string;\n view: SessionView;\n error: string | null;\n onRetry: () => void;\n onSearch: (search: string) => void;\n onView: (view: SessionView) => void;\n onNew: () => void;\n onSelect: (id: string) => void;\n}): ReactElement {\n return (\n <aside\n className={\n props.popup\n ? chatClass(\"studio-chat-session-picker\", chatLayout.picker)\n : chatClass(\"studio-chat-sessions\", chatLayout.sessions)\n }\n aria-label=\"Chat sessions\"\n >\n {props.popup && (\n <header\n className={chatClass(\n \"studio-chat-sessions-head\",\n chatLayout.threadHead,\n )}\n >\n <div\n className={chatClass(\"studio-chat-head-copy\", chatLayout.headCopy)}\n >\n <h2\n className={chatClass(\n \"studio-chat-sessions-title\",\n chatLayout.subheading,\n typographyStyles.section,\n )}\n >\n Sessions\n </h2>\n </div>\n <button\n className={chatClass(\"studio-chat-new\", chatLayout.button)}\n type=\"button\"\n aria-label=\"New conversation\"\n onClick={props.onNew}\n >\n +\n </button>\n </header>\n )}\n <div\n className={chatClass(\n \"studio-chat-session-controls\",\n chatLayout.sessionControls,\n )}\n >\n <StudioSearchField\n label=\"Search conversations\"\n placeholder=\"Search conversations\"\n value={props.search}\n onChange={props.onSearch}\n />\n <NativeSelect\n xstyle={chatLayout.sessionFilterSelect}\n aria-label=\"Show conversations\"\n value={props.view.archived ? \"archived\" : \"active\"}\n onChange={(event) =>\n props.onView({\n ...props.view,\n archived: event.target.value === \"archived\",\n offset: 0,\n })\n }\n >\n <option value=\"active\">Active conversations</option>\n <option value=\"archived\">Archived conversations</option>\n </NativeSelect>\n {(props.view.offset > 0 || props.sessions.length >= 25) && (\n <div\n className={chatClass(\"\", chatLayout.actions)}\n aria-label=\"Conversation pages\"\n role=\"group\"\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={props.loading || props.view.offset === 0}\n onClick={() =>\n props.onView({\n ...props.view,\n offset: Math.max(0, props.view.offset - 25),\n })\n }\n >\n Previous\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={props.loading || props.sessions.length < 25}\n onClick={() =>\n props.onView({ ...props.view, offset: props.view.offset + 25 })\n }\n >\n Next\n </Button>\n </div>\n )}\n {props.error && (\n <p role=\"alert\">\n {props.error}{\" \"}\n <Button type=\"button\" variant=\"ghost\" onClick={props.onRetry}>\n Retry sessions\n </Button>\n </p>\n )}\n </div>\n <div\n className={chatClass(\n \"studio-chat-session-list\",\n chatLayout.sessionList,\n )}\n >\n {props.loading ? (\n <p className={chatClass(\"studio-chat-empty\", chatLayout.empty)}>\n Loading sessions…\n </p>\n ) : null}\n {!props.loading && !props.error && props.sessions.length === 0 ? (\n <p className={chatClass(\"studio-chat-empty\", chatLayout.empty)}>\n {props.view.query\n ? \"No conversations match this search.\"\n : props.view.offset > 0\n ? \"No more conversations.\"\n : props.view.archived\n ? \"No archived conversations.\"\n : \"No conversations yet.\"}\n </p>\n ) : null}\n {props.sessions.map((session) => (\n <button\n className={chatClass(\n \"studio-chat-session\",\n chatLayout.session,\n session.id === props.activeSessionId && chatLayout.activeSession,\n )}\n data-active={\n session.id === props.activeSessionId ? \"true\" : \"false\"\n }\n type=\"button\"\n key={session.id}\n onClick={() => props.onSelect(session.id)}\n >\n <strong\n className={chatClass(\n \"studio-chat-session-title\",\n chatLayout.sessionTitle,\n )}\n >\n {session.title}\n </strong>\n <time\n className={chatClass(\n \"studio-chat-session-time\",\n chatLayout.timestamp,\n )}\n dateTime={session.lastActiveAt}\n title={session.lastActiveAt}\n >\n {formatSessionTime(session.lastActiveAt)}\n </time>\n </button>\n ))}\n </div>\n </aside>\n );\n}\n\nfunction ChatEmptyState(): ReactElement {\n return (\n <section\n className={chatClass(\n \"studio-chat-empty\",\n chatLayout.empty,\n chatLayout.emptyConversation,\n )}\n aria-label=\"New conversation\"\n >\n <p className={chatClass(\"\", chatLayout.cardText)}>\n No messages yet. Your draft stays in the composer until you send it.\n </p>\n </section>\n );\n}\n\nfunction ChatTurn(props: {\n message: ChatHistoryMessage;\n client: ChatClient;\n onAction: (action: ChatSuggestedAction) => Promise<void>;\n onApproval: (\n approval: StudioChatApproval,\n approved: boolean,\n ) => Promise<void>;\n}): ReactElement {\n return (\n <article\n className={chatClass(\"studio-chat-turn\", chatLayout.turn)}\n data-role={props.message.role}\n >\n <span className={chatClass(\"studio-chat-turn-label\", chatLayout.speaker)}>\n {props.message.role === \"user\" ? \"You\" : \"Brain\"}\n </span>\n <div\n className={chatClass(\n \"studio-chat-turn-body\",\n chatLayout.turnBody,\n props.message.role === \"user\" && chatLayout.userBody,\n )}\n >\n {props.message.content ? (\n props.message.role === \"assistant\" ? (\n <StudioMarkdown\n className={chatClass(\"studio-chat-prose\", chatLayout.cards)}\n presentation=\"chat\"\n >\n {props.message.content}\n </StudioMarkdown>\n ) : (\n <p className={chatClass(\"studio-chat-text\", chatLayout.paragraph)}>\n {props.message.content}\n </p>\n )\n ) : null}\n {props.message.attachments?.map((attachment) => (\n <p\n className={chatClass(\"studio-chat-upload\", chatLayout.upload)}\n key={`${attachment.filename}-${attachment.createdAt}`}\n >\n {attachment.filename}\n </p>\n ))}\n {props.message.cards?.length ? (\n <div className={chatClass(\"studio-chat-cards\", chatLayout.cards)}>\n {props.message.cards.map((card) => (\n <MessageCard\n card={card}\n client={props.client}\n key={`${card.kind}-${card.id}`}\n onAction={props.onAction}\n onApproval={props.onApproval}\n />\n ))}\n </div>\n ) : null}\n </div>\n </article>\n );\n}\n\nfunction MessageCard(props: {\n card: ChatCard;\n client: ChatClient;\n onAction: (action: ChatSuggestedAction) => Promise<void>;\n onApproval: (\n approval: StudioChatApproval,\n approved: boolean,\n ) => Promise<void>;\n}): ReactElement {\n const { card } = props;\n if (card.kind === \"actions\") {\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span\n className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}\n >\n Actions\n </span>\n {card.title ? <strong>{card.title}</strong> : null}\n <div\n className={chatClass(\"studio-chat-card-actions\", chatLayout.actions)}\n >\n {card.actions.map((action) => (\n <button\n className={chatClass(\n \"studio-chat-card-action\",\n chatLayout.button,\n )}\n type=\"button\"\n key={action.id}\n onClick={() => void props.onAction(action)}\n >\n {action.label}\n </button>\n ))}\n </div>\n </section>\n );\n }\n if (card.kind === \"sources\") {\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span\n className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}\n >\n Sources\n </span>\n <ul>\n {card.sources.map((source) => (\n <li key={source.id}>\n {source.url ? (\n <a href={source.url}>{source.title ?? source.source}</a>\n ) : (\n (source.title ?? source.source)\n )}\n </li>\n ))}\n </ul>\n </section>\n );\n }\n if (card.kind === \"attachment\") {\n return <StudioChatAttachment card={card} client={props.client} />;\n }\n const pending = card.state === \"approval-requested\";\n const approval: StudioChatApproval = {\n approvalId: card.id,\n toolCallId: card.toolCallId ?? card.id,\n toolName: card.toolName,\n ...(card.input ? { input: card.input } : {}),\n ...(card.summary ? { title: card.summary } : {}),\n };\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}>\n {pending ? \"Approval required\" : \"Approval record\"}\n </span>\n <strong>{card.summary}</strong>\n {card.preview ? (\n <p\n className={chatClass(\n \"studio-chat-card-preview\",\n chatLayout.paragraph,\n )}\n >\n {card.preview}\n </p>\n ) : null}\n {pending ? (\n <div\n className={chatClass(\n \"studio-chat-approval-actions\",\n chatLayout.actions,\n )}\n >\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n )}\n type=\"button\"\n onClick={() => void props.onApproval(approval, false)}\n >\n Decline\n </button>\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n chatLayout.primaryButton,\n )}\n data-primary=\"true\"\n type=\"button\"\n onClick={() => void props.onApproval(approval, true)}\n >\n Approve\n </button>\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction ApprovalCard(props: {\n approval: StudioChatApproval;\n disabled: boolean;\n onDecision: (\n approval: StudioChatApproval,\n approved: boolean,\n ) => Promise<void>;\n}): ReactElement {\n return (\n <section className={chatClass(\"studio-chat-approval\", chatLayout.card)}>\n <span className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}>\n Approval required\n </span>\n <strong>{props.approval.title ?? props.approval.toolName}</strong>\n <div\n className={chatClass(\n \"studio-chat-approval-actions\",\n chatLayout.actions,\n )}\n >\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n )}\n type=\"button\"\n disabled={props.disabled}\n onClick={() => void props.onDecision(props.approval, false)}\n >\n Decline\n </button>\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n chatLayout.primaryButton,\n )}\n data-primary=\"true\"\n type=\"button\"\n disabled={props.disabled}\n onClick={() => void props.onDecision(props.approval, true)}\n >\n Approve\n </button>\n </div>\n </section>\n );\n}\n\nfunction Composer(props: {\n locked: boolean;\n onRemoveUpload: (id: string) => void;\n draft: string;\n uploads: ChatUploadResponse[];\n uploadAttempts: ChatUploadAttempt[];\n onRetryUpload: (attempt: ChatUploadAttempt) => void;\n onDismissUpload: (id: string) => void;\n sending: boolean;\n uploading: boolean;\n onDraft: (value: string) => void;\n onFiles: (event: ChangeEvent<HTMLInputElement>) => Promise<void>;\n onSubmit: (event: FormEvent<HTMLFormElement>) => void;\n onStop?: (() => void) | undefined;\n onJumpToLatest?: (() => void) | undefined;\n}): ReactElement {\n const keyDown = (event: KeyboardEvent<HTMLTextAreaElement>): void => {\n if (\n event.key === \"Enter\" &&\n !event.shiftKey &&\n !event.nativeEvent.isComposing\n ) {\n event.preventDefault();\n event.currentTarget.form?.requestSubmit();\n }\n };\n return (\n <footer className={chatClass(\"studio-chat-composer\", chatLayout.composer)}>\n {props.onJumpToLatest && (\n <Button type=\"button\" variant=\"ghost\" onClick={props.onJumpToLatest}>\n Jump to latest ↓\n </Button>\n )}\n {props.uploadAttempts.length > 0 && (\n <ul\n className={chatClass(\n \"studio-chat-upload-list\",\n chatLayout.uploadList,\n )}\n aria-label=\"File upload progress\"\n >\n {props.uploadAttempts.map((attempt) => (\n <li\n key={attempt.id}\n className={chatClass(\"studio-chat-upload\", chatLayout.upload)}\n >\n <span role={attempt.status === \"failed\" ? \"alert\" : \"status\"}>\n {attempt.file.name}:{\" \"}\n {attempt.status === \"uploading\"\n ? \"Uploading…\"\n : (attempt.error ?? \"Upload failed\")}\n </span>\n {attempt.status === \"failed\" && (\n <>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Retry uploading ${attempt.file.name}`}\n disabled={props.uploading || props.sending || props.locked}\n onClick={() => props.onRetryUpload(attempt)}\n >\n Retry\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Dismiss failed upload ${attempt.file.name}`}\n onClick={() => props.onDismissUpload(attempt.id)}\n >\n Dismiss\n </Button>\n </>\n )}\n </li>\n ))}\n </ul>\n )}\n {props.uploads.length > 0 ? (\n <div\n className={chatClass(\n \"studio-chat-upload-list\",\n chatLayout.uploadList,\n )}\n >\n {props.uploads.map((upload) => (\n <span\n className={chatClass(\"studio-chat-upload\", chatLayout.upload)}\n key={upload.id}\n >\n {upload.filename}{\" \"}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Remove ${upload.filename} from message`}\n disabled={props.locked}\n onClick={() => props.onRemoveUpload(upload.id)}\n >\n ×\n </Button>\n </span>\n ))}\n </div>\n ) : null}\n <form\n className={chatClass(\"studio-chat-composer-form\", chatLayout.form)}\n onSubmit={props.onSubmit}\n >\n <label\n className={chatClass(\n \"studio-chat-message-label\",\n chatLayout.fieldLabel,\n )}\n >\n Message\n <textarea\n className={chatClass(\"studio-chat-message\", chatLayout.input)}\n aria-label=\"Message\"\n aria-describedby=\"studio-chat-composer-hint\"\n placeholder=\"Write to your brain…\"\n value={props.draft}\n disabled={props.locked}\n onChange={(event) => props.onDraft(event.target.value)}\n onKeyDown={keyDown}\n />\n </label>\n <div\n className={chatClass(\n \"studio-chat-composer-actions\",\n chatLayout.actions,\n )}\n >\n <label\n className={chatClass(\n \"studio-chat-composer-action\",\n chatLayout.attachButton,\n )}\n >\n {props.uploading ? \"Attaching…\" : \"Attach files\"}\n <input\n className={chatClass(\n \"studio-chat-upload-input\",\n chatLayout.uploadInput,\n )}\n type=\"file\"\n accept={messageUploadAccept}\n aria-describedby=\"studio-chat-upload-guidance\"\n multiple\n disabled={props.locked || props.sending || props.uploading}\n onChange={(event) => void props.onFiles(event)}\n />\n </label>\n {props.locked ? (\n <Button type=\"button\" disabled>\n Archiving…\n </Button>\n ) : props.sending ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={props.onStop}\n disabled={!props.onStop}\n title=\"Stop receiving the response. Completed actions are not undone.\"\n >\n Stop\n </Button>\n ) : (\n <Button\n className=\"studio-chat-composer-action\"\n type=\"submit\"\n aria-label=\"Send message\"\n disabled={\n props.uploading ||\n props.uploadAttempts.length > 0 ||\n (!props.draft.trim() && props.uploads.length === 0)\n }\n >\n Send\n </Button>\n )}\n </div>\n </form>\n <small\n id=\"studio-chat-composer-hint\"\n className={chatClass(\n \"studio-chat-composer-hint\",\n chatLayout.composerHint,\n )}\n >\n Enter to send · Shift+Enter for a new line\n </small>\n <details\n className={chatClass(\n \"studio-chat-upload-guidance\",\n chatLayout.composerHint,\n )}\n >\n <summary>File types and limits</summary>\n <p id=\"studio-chat-upload-guidance\">{CHAT_UPLOAD_GUIDANCE}</p>\n </details>\n </footer>\n );\n}\n\nfunction WorkingSet(props: {\n cards: ChatCard[];\n messages: ChatHistoryMessage[];\n progress: StudioChatStreamState[\"progress\"];\n session: ChatSession | undefined;\n}): ReactElement {\n return (\n <aside\n className={chatClass(\"studio-chat-context\", chatLayout.contextBody)}\n tabIndex={0}\n aria-label=\"Working set\"\n >\n <div className={chatClass(\"studio-chat-context-list\", chatLayout.cards)}>\n {props.session?.contextHandoff ? (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n Linked context\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n typographyStyles.section,\n )}\n >\n {props.session.contextHandoff.titleSeed}\n </h3>\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {props.session.contextHandoff.sourceId} ·{\" \"}\n {props.session.contextHandoff.itemId}\n </p>\n </section>\n ) : null}\n {props.cards.length === 0 && props.progress.length === 0 ? (\n <p className={chatClass(\"studio-chat-empty\", chatLayout.empty)}>\n Sources, artifacts, and durable jobs appear here as the conversation\n develops.\n </p>\n ) : null}\n {props.cards.map((card, index) => (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n key={`${card.kind}-${card.id}-${index}`}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n {card.kind === \"sources\" ? \"Sources\" : \"Artifact\"}\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n typographyStyles.section,\n )}\n >\n {card.kind === \"sources\"\n ? (card.title ?? `${card.sources.length} consulted`)\n : card.kind === \"attachment\"\n ? card.title\n : \"Conversation context\"}\n </h3>\n {card.kind === \"sources\" ? (\n <>\n <ul>\n {card.sources.slice(0, 5).map((source) => (\n <li key={source.id}>{source.title ?? source.source}</li>\n ))}\n </ul>\n {card.sources.length > 5 ? (\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {card.sources.length - 5} more sources in the conversation.\n </p>\n ) : null}\n </>\n ) : card.kind === \"attachment\" && card.description ? (\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {card.description}\n </p>\n ) : null}\n </section>\n ))}\n {props.progress.map((item, index) => (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n key={`${item.type}-${index}`}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n Durable job\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n typographyStyles.section,\n )}\n >\n {item.operationTarget ?? item.operationType}\n </h3>\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {item.message ?? item.status}\n </p>\n </section>\n ))}\n {props.messages.length > 0 ? (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n Activity\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n typographyStyles.section,\n )}\n >\n Visible conversation\n </h3>\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {props.messages.length} visible messages.\n </p>\n </section>\n ) : null}\n </div>\n </aside>\n );\n}\n\nfunction formatSessionTime(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(undefined, {\n day: \"numeric\",\n year:\n date.getFullYear() === new Date().getFullYear() ? undefined : \"numeric\",\n month: \"short\",\n timeZoneName: \"short\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(date);\n}\n\nfunction errorMessage(cause: unknown, fallback: string): string {\n return cause instanceof Error && cause.message ? cause.message : fallback;\n}\n",
|
|
16
16
|
"import {\n chatMessageSchema,\n type ChatCard,\n type ChatHistoryMessage,\n type ChatMessage,\n type ChatProgressEvent,\n type ChatProtocolEvent,\n type ChatToolStatusEvent,\n} from \"@brains/contracts/chat\";\n\ninterface StudioChatToolInput {\n toolCallId: string;\n toolName: string;\n input: unknown;\n title?: string | undefined;\n}\n\nexport interface StudioChatApproval {\n approvalId: string;\n toolCallId: string;\n toolName: string;\n input?: Record<string, unknown> | undefined;\n title?: string | undefined;\n}\n\nexport interface StudioChatStreamState {\n messageId: string;\n text: string;\n cards: ChatCard[];\n approvals: StudioChatApproval[];\n progress: ChatProgressEvent[];\n statuses: ChatToolStatusEvent[];\n toolInputs: Readonly<Record<string, StudioChatToolInput>>;\n finished: boolean;\n error: string | null;\n}\n\nexport function createStudioChatStreamState(): StudioChatStreamState {\n return {\n messageId: \"assistant-stream\",\n text: \"\",\n cards: [],\n approvals: [],\n progress: [],\n statuses: [],\n toolInputs: {},\n finished: false,\n error: null,\n };\n}\n\n/** Studio-owned assembly of raw server protocol facts into one visible turn. */\nexport function reduceStudioChatStream(\n state: StudioChatStreamState,\n event: ChatProtocolEvent,\n): StudioChatStreamState {\n switch (event.type) {\n case \"start\":\n return event.messageId ? { ...state, messageId: event.messageId } : state;\n case \"text-delta\":\n return { ...state, text: `${state.text}${event.delta}` };\n case \"tool-input-available\":\n return {\n ...state,\n toolInputs: {\n ...state.toolInputs,\n [event.toolCallId]: {\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.input,\n ...(event.title ? { title: event.title } : {}),\n },\n },\n };\n case \"tool-approval-request\": {\n const tool = state.toolInputs[event.toolCallId];\n const approval: StudioChatApproval = {\n approvalId: event.approvalId,\n toolCallId: event.toolCallId,\n toolName: tool?.toolName ?? \"tool\",\n ...(isRecord(tool?.input) ? { input: tool.input } : {}),\n ...(tool?.title ? { title: tool.title } : {}),\n };\n return {\n ...state,\n approvals: [\n ...state.approvals.filter(\n (item) => item.approvalId !== event.approvalId,\n ),\n approval,\n ],\n };\n }\n case \"tool-output-available\":\n case \"tool-output-error\":\n case \"tool-output-denied\":\n return {\n ...state,\n approvals: state.approvals.filter(\n (approval) => approval.toolCallId !== event.toolCallId,\n ),\n };\n case \"data-progress\":\n return { ...state, progress: [...state.progress, event.data] };\n case \"data-status\":\n return { ...state, statuses: [...state.statuses, event.data] };\n case \"data-actions\":\n case \"data-sources\":\n case \"data-attachment\":\n return { ...state, cards: [...state.cards, event.data] };\n case \"finish\":\n return { ...state, finished: true };\n case \"abort\":\n return {\n ...state,\n finished: true,\n error: event.reason ?? \"Response stopped\",\n };\n case \"error\":\n return { ...state, finished: true, error: event.errorText };\n default:\n return state;\n }\n}\n\nexport function streamAssistantMessage(\n state: StudioChatStreamState,\n): ChatHistoryMessage {\n return {\n id: state.messageId,\n role: \"assistant\",\n content: state.text,\n ...(state.cards.length > 0 ? { cards: state.cards } : {}),\n };\n}\n\nexport function approvalResponseMessage(\n approval: StudioChatApproval,\n approved: boolean,\n): ChatMessage {\n const response = {\n id: approval.approvalId,\n approved,\n toolCallId: approval.toolCallId,\n toolName: approval.toolName,\n ...(approval.input ? { input: approval.input } : {}),\n ...(approval.title ? { title: approval.title } : {}),\n };\n return chatMessageSchema.parse({\n role: \"assistant\",\n parts: [\n {\n state: \"approval-responded\",\n toolCallId: approval.toolCallId,\n toolName: approval.toolName,\n ...(approval.input ? { input: approval.input } : {}),\n ...(approval.title ? { title: approval.title } : {}),\n approval: response,\n },\n ],\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"
|
|
17
17
|
],
|
|
18
|
-
"mappings": "4XAAA,iBCUO,IAAM,GAAiD,EAAE,OAAO,CACrE,KAAM,EAAE,QAAQ,OAAO,EACvB,MAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAEvB,UAAW,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,CACxC,CAAC,EAkBY,GAAqD,EAAE,OAAO,CACzE,eAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAChC,cAAe,EAAE,OAAO,EAAE,IAAI,CAAC,EAC/B,UAAW,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EACtC,YAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAC7B,oBAAqB,EAAE,KAAK,CAAC,QAAS,UAAW,QAAQ,CAAC,EAC1D,SAAU,EAAE,QAAQ,EACpB,OAAQ,EACV,CAAC,ECpCM,IAAM,GAOT,EAAE,aAAa,CACjB,KAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAChC,SAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EACpC,gBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAC7C,CAAC,ECVM,IAAM,GAUR,EAAE,aAAa,CAClB,kBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAC7C,aAAc,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EACxC,cAAe,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EACzC,aAAc,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EACxC,UAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EACrC,UAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EACrC,qBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAChD,UAAW,GACX,sBAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,OAAS,CAClE,CAAC,EAEY,GAGR,EAAE,aAAa,CAClB,OAAQ,GACR,gBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAC7C,CAAC,ECzBM,IAAM,GAAmB,EACnB,GAAwB,YAQ9B,IAAM,GAGR,EACF,aAAa,CACZ,YAAa,EACV,OAAO,EACP,IAAI,EACJ,SAAS,EACT,IAAI,KAAK,MAAM,OAAO,iBAAmB,IAAI,CAAC,EACjD,cAAe,EACZ,OAAO,EACP,IAAI,EACJ,SAAS,EACT,IAAI,KAAK,MAAM,OAAO,iBAAmB,IAAI,CAAC,CACnD,CAAC,EACA,OACC,CAAC,IAAc,EAAU,aAAe,EAAU,cAClD,+CACF,EAEW,GAGR,EAAE,aAAa,CAClB,UAAW,EAAE,OAAO,EAAE,KAAK,EAC3B,UAAW,EACb,CAAC,EAKK,EAA4B,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAI3D,IAAM,GAQR,EAAE,aAAa,CAClB,UAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EACrC,SAAU,EAAE,OAAO,EAAE,IAAI,CAAC,EAC1B,OAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EACxB,oBAAqB,EAAE,OAAO,EAAE,IAAI,CAAC,EACrC,UAAW,GACX,kBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAC7C,QAAS,EAAE,QAAQ,CACrB,CAAC,EAKY,GASR,EAAE,aAAa,CAClB,eAAgB,EAChB,MAAO,EAAE,KAAK,CAAC,SAAU,YAAa,SAAU,cAAe,WAAW,CAAC,CAC7E,CAAC,EAKK,GAAkC,EACrC,OAAO,EACP,MACC,mFACF,EACI,GAA+B,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAC9D,GAAmC,EAAE,OAAO,EAAE,SAAS,EACvD,GAAqC,EACxC,OAAO,EACP,MAAM,WAAW,EACjB,IAAI,IAAK,EACN,GAAiC,EACpC,OAAO,EACP,MAAM,2BAA2B,EACjC,IAAI,IAAK,EAEN,GAkBD,EAAE,YAAY,CACjB,KAAM,EAAE,QAAQ,eAAe,EAC/B,GAAI,EACJ,WAAY,EAAa,SAAS,EAClC,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC1C,MAAO,EAAE,OAAO,EAAE,OAAO,EAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,EAClD,QAAS,EAAE,OAAO,EAAE,IAAI,IAAK,EAC7B,kBAAmB,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,EAClD,QAAS,EAAE,OAAO,EAAE,IAAI,GAAO,EAAE,SAAS,EAC1C,MAAO,EAAE,KAAK,CACZ,qBACA,qBACA,mBACA,gBACA,cACF,CAAC,EACD,OAAQ,EAAE,QAAQ,EAAE,SAAS,EAC7B,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,CACxC,CAAC,EAEK,GAID,EAAE,YAAY,CACjB,WAAY,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EACvD,SAAU,EAAa,SAAS,EAChC,eAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,CAC7D,CAAC,EAEK,GAQD,EAAE,YAAY,CACjB,UAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC3C,IAAK,GACL,YAAa,GAAkB,SAAS,EACxC,WAAY,GAAkB,SAAS,EACvC,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EACrD,UAAW,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EACnD,OAAQ,GAA+B,SAAS,CAClD,CAAC,EAEK,GAOD,EAAE,YAAY,CACjB,KAAM,EAAE,QAAQ,YAAY,EAC5B,GAAI,EACJ,MAAO,EAAa,SAAS,EAC7B,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAC3B,YAAa,EAAE,OAAO,EAAE,IAAI,KAAM,EAAE,SAAS,EAC7C,WAAY,EACd,CAAC,EAEK,GASD,EAAE,YAAY,CACjB,GAAI,EACJ,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,EACtC,OAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EACxC,IAAK,GAAkB,SAAS,EAChC,WAAY,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EACvD,SAAU,EAAa,SAAS,EAChC,QAAS,EAAE,OAAO,EAAE,IAAI,KAAM,EAAE,SAAS,EACzC,WAAY,EAAE,OAAO,EAAE,OAAO,EAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,CACzD,CAAC,EAEK,GAKD,EAAE,YAAY,CACjB,KAAM,EAAE,QAAQ,SAAS,EACzB,GAAI,EACJ,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,EACtC,QAAS,EAAE,MAAM,EAAwB,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,CAC3D,CAAC,EAEK,GAmBF,EAAE,mBAAmB,OAAQ,CAC/B,EAAE,OAAO,CACP,KAAM,EAAE,QAAQ,QAAQ,EACxB,GAAI,EACJ,MAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EACvC,OAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAO,EACrC,YAAa,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,CAC9C,CAAC,EACD,EAAE,OAAO,CACP,KAAM,EAAE,QAAQ,OAAO,EACvB,GAAI,EACJ,MAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EACvC,MAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EACvC,UAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EACtD,YAAa,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,CAC9C,CAAC,CACH,CAAC,EAEK,GAKD,EAAE,YAAY,CACjB,KAAM,EAAE,QAAQ,SAAS,EACzB,GAAI,EACJ,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,EACtC,QAAS,EAAE,MAAM,EAAyB,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,CAC5D,CAAC,EAEY,GAQT,EAAE,mBAAmB,OAAQ,CAC/B,GACA,GACA,GACA,EACF,CAAC,EAqED,IAAM,GAQD,EAAE,OAAO,CACZ,GAAI,EACJ,WAAY,EAAa,SAAS,EAClC,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC1C,QAAS,EAAE,OAAO,EAAE,IAAI,IAAK,EAC7B,kBAAmB,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,EAClD,QAAS,EAAE,OAAO,EAAE,IAAI,GAAO,EAAE,SAAS,EAC1C,KAAM,EAAE,QAAQ,CAClB,CAAC,EAEK,GAWD,EAAE,OAAO,CACZ,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC1C,KAAM,EAAE,OAAO,EAAE,OAAO,EAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,EACjD,MAAO,EAAa,SAAS,EAC7B,KAAM,EAAE,QAAQ,EAAE,SAAS,EAC3B,MAAO,EACJ,OAAO,CACN,QAAS,EAAE,OAAO,EAAE,IAAI,IAAK,EAC7B,KAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,CACnD,CAAC,EACA,SAAS,CACd,CAAC,EAEY,GAYR,EAAE,YAAY,CACjB,KAAM,EAAE,OAAO,EAAE,IAAI,GAAS,EAC9B,YAAa,EAAE,MAAM,EAAoB,EAAE,IAAI,GAAG,EAAE,SAAS,EAC7D,MAAO,EAAE,MAAM,EAAc,EAAE,IAAI,GAAG,EAAE,SAAS,EACjD,qBAAsB,EACnB,MAAM,EAA6B,EACnC,IAAI,GAAG,EACP,SAAS,EACZ,MAAO,EAAE,OAAO,CACd,aAAc,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAC3C,iBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAC/C,YAAa,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAC5C,CAAC,CACH,CAAC,EAiBM,SAAS,EAAkB,CAChC,EAAkB,GACJ,CACd,IAAM,EAAa,GAAqB,CAAO,EAC/C,MAAO,CACL,OAAQ,EACR,QAAS,GAAG,YACZ,SAAU,GAAG,aACb,eAAgB,GAAG,qBACnB,SAAU,GAAG,aACb,QAAS,GAAG,YACZ,gBAAiB,GAAG,qBACpB,oBAAqB,GAAG,yBACxB,iBAAkB,GAAG,sBACrB,UAAW,GAAG,eAChB,EAGF,SAAS,EAAoB,CAAC,EAAyB,CACrD,IAAM,EAAU,EAAQ,KAAK,EAC7B,GACE,CAAC,EAAQ,WAAW,GAAG,GACvB,EAAQ,WAAW,IAAI,GACvB,EAAQ,OAAS,KACjB,cAAc,KAAK,CAAO,GAC1B,EAAQ,SAAS,GAAG,GACpB,EAAQ,SAAS,GAAG,EAEpB,MAAU,MACR,6EACF,EAEF,IAAM,EAAa,EAAQ,QAAQ,OAAQ,EAAE,EAC7C,GAAI,EAAW,SAAW,EACxB,MAAU,MAAM,yCAAyC,EAE3D,OAAO,EAGF,IAAM,GAKR,EAAE,aAAa,CAClB,QAAS,EAAE,QAAQ,CAAC,EACpB,SAAU,EACP,OAAO,EACP,KAAK,EACL,MAAM,mBAAmB,EACzB,IAAI,EAAE,EACT,OAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EACxC,UAAW,EACR,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,GAAG,EACP,OAAO,CAAC,IAAU,CAAC,kBAAkB,KAAK,CAAK,CAAC,CACrD,CAAC,EAMY,GAKR,EAAE,OAAO,CACZ,MAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE,EAC5C,SAAU,EAAE,QAAQ,EAAE,QAAQ,EAAK,EACnC,OAAQ,EACL,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,IAAI,OAAO,gBAAgB,EAC3B,QAAQ,CAAC,EACZ,MAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE,CACpD,CAAC,EAGY,GAMR,EAAE,YAAY,CACjB,GAAI,EACJ,MAAO,GACP,aAAc,GACd,SAAU,EAAE,QAAQ,EAAE,SAAS,EAC/B,eAAgB,GAAgC,SAAS,CAC3D,CAAC,EAIY,GAER,EAAE,YAAY,CACjB,SAAU,EAAE,MAAM,EAAiB,EAAE,IAAI,GAAG,CAC9C,CAAC,EAIY,GAGR,EAAE,YAAY,CACjB,KAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EACrC,GAAI,CACN,CAAC,EAMY,GAOR,EAAE,YAAY,CACjB,KAAM,EAAE,QAAQ,MAAM,EACtB,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC1C,UAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC3C,UAAW,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EACxC,UAAW,GACX,OAAQ,GAAkC,SAAS,CACrD,CAAC,EAMY,GAMR,EAAE,YAAY,CACjB,GAAI,EACJ,KAAM,EAAE,KAAK,CAAC,OAAQ,WAAW,CAAC,EAClC,QAAS,EAAE,OAAO,EAAE,IAAI,GAAS,EACjC,YAAa,EAAE,MAAM,EAA2B,EAAE,IAAI,GAAG,EAAE,SAAS,EACpE,MAAO,EAAE,MAAM,EAAc,EAAE,IAAI,GAAG,EAAE,SAAS,CACnD,CAAC,EAIY,GAER,EAAE,YAAY,CACjB,SAAU,EAAE,MAAM,EAAwB,EAAE,IAAI,GAAG,CACrD,CAAC,EAKY,GAA2C,EACrD,OAAO,EACP,IAAI,CAAC,EACL,IAAI,GAAG,EACP,OAAO,CAAC,IAAU,EAAM,KAAK,EAAE,OAAS,CAAC,EAC/B,GAGR,EAAE,aAAa,CAClB,SAAU,EAAE,MAAM,EAAwB,EAAE,IAAI,GAAG,EACnD,WAAY,GAAgC,SAAS,CACvD,CAAC,EAKY,GAGR,EAAE,OAAO,CACZ,KAAM,EAAE,QAAQ,MAAM,EACtB,KAAM,EAAE,OAAO,EAAE,IAAI,GAAS,CAChC,CAAC,EAIY,GAKR,EAAE,OAAO,CACZ,KAAM,EAAE,QAAQ,MAAM,EACtB,UAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EACtD,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EACrD,IAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,OAAS,CACtC,CAAC,EAIY,GAGR,EAAE,OAAO,CACZ,KAAM,EAAE,QAAQ,QAAQ,EACxB,GAAI,EACN,CAAC,EAIY,GAGR,EAAE,OAAO,CACZ,KAAM,EAAE,QAAQ,aAAa,EAC7B,KAAM,EAAE,YAAY,CAAE,IAAK,EAAoB,CAAC,CAClD,CAAC,EAKY,GAOR,EAAE,OAAO,CACZ,GAAI,EACJ,SAAU,EAAE,QAAQ,EACpB,WAAY,EAAa,SAAS,EAClC,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EACrD,MAAO,EAAE,OAAO,EAAE,OAAO,EAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,EAClD,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,CACxC,CAAC,EAIY,GAOR,EAAE,YAAY,CACjB,MAAO,EAAE,QAAQ,oBAAoB,EACrC,WAAY,EAAa,SAAS,EAClC,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EACrD,MAAO,EAAE,OAAO,EAAE,OAAO,EAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,EAClD,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,EACtC,SAAU,EACZ,CAAC,EAMY,GAKR,EAAE,OAAO,CACZ,GAAI,EAAa,SAAS,EAC1B,KAAM,EAAE,KAAK,CAAC,OAAQ,YAAa,QAAQ,CAAC,EAC5C,MAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,IAAI,IAAK,EAAE,SAAS,EAChD,QAAS,EAAE,OAAO,EAAE,IAAI,GAAS,EAAE,SAAS,CAC9C,CAAC,EAKK,GAAe,CAAC,IACpB,EACG,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,CAAG,EACP,OAAO,CAAC,IAAU,CAAC,kBAAkB,KAAK,CAAK,CAAC,EAExC,GAIR,EAAE,aAAa,CAClB,SAAU,EACP,OAAO,EACP,KAAK,EACL,MAAM,mBAAmB,EACzB,IAAI,EAAE,EACT,OAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EACxC,MAAO,GAAa,GAAG,CACzB,CAAC,EAIY,GAKR,EACF,OAAO,CACN,GAAI,EAAa,SAAS,EAC1B,SAAU,EAAE,MAAM,EAAiB,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EACnD,QAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EACnD,aAAc,GAAwB,SAAS,CACjD,CAAC,EACA,OAAO,EAKG,GAWR,EAAE,aAAa,CAClB,GAAI,EAAa,SAAS,EAC1B,SAAU,EACP,MACC,EAAE,aAAa,CACb,GAAI,EACJ,KAAM,EAAE,QAAQ,MAAM,EACtB,MAAO,EACJ,MAAM,EAAE,aAAa,CAAE,KAAM,EAAE,QAAQ,MAAM,EAAG,KAAM,EAAE,OAAO,CAAE,CAAC,CAAC,EACnE,IAAI,CAAC,EACL,IAAI,EAAE,CACX,CAAC,CACH,EACC,OAAO,CAAC,CACb,CAAC,EAEK,GAKD,EAAE,KAAK,CAAC,UAAW,aAAc,YAAa,QAAQ,CAAC,EAI/C,GAkBR,EAAE,YAAY,CACjB,KAAM,EAAE,KAAK,CAAC,MAAO,OAAO,CAAC,EAC7B,OAAQ,GACR,cAAe,EAAE,KAAK,CACpB,kBACA,qBACA,kBACA,kBACF,CAAC,EACD,gBAAiB,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,EAChD,QAAS,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,EACxC,SAAU,EACP,OAAO,CACN,QAAS,EAAE,OAAO,EAAE,YAAY,EAChC,MAAO,EAAE,OAAO,EAAE,YAAY,EAC9B,WAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,CACvC,CAAC,EACA,SAAS,CACd,CAAC,EAIY,GASR,EAAE,YAAY,CACjB,OAAQ,EAAE,KAAK,CACb,eACA,iBACA,yBACA,aACF,CAAC,EACD,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC1C,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,CACxC,CAAC,EASY,GA8IT,EAAE,mBAAmB,OAAQ,CAC/B,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,OAAO,EACvB,UAAW,EAAa,SAAS,CACnC,CAAC,EACD,EAAE,YAAY,CAAE,KAAM,EAAE,QAAQ,YAAY,CAAE,CAAC,EAC/C,EAAE,YAAY,CAAE,KAAM,EAAE,QAAQ,aAAa,CAAE,CAAC,EAChD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,QAAQ,EACxB,aAAc,EACX,KAAK,CACJ,SACA,QACA,OACA,iBACA,aACA,OACF,CAAC,EACA,SAAS,CACd,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,OAAO,EACvB,OAAQ,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,CACzC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,OAAO,EACvB,UAAW,EAAE,OAAO,EAAE,IAAI,KAAM,CAClC,CAAC,EACD,EAAE,YAAY,CAAE,KAAM,EAAE,QAAQ,YAAY,EAAG,GAAI,CAAa,CAAC,EACjE,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,YAAY,EAC5B,GAAI,EACJ,MAAO,EAAE,OAAO,EAAE,IAAI,GAAS,CACjC,CAAC,EACD,EAAE,YAAY,CAAE,KAAM,EAAE,QAAQ,UAAU,EAAG,GAAI,CAAa,CAAC,EAC/D,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,iBAAiB,EACjC,GAAI,CACN,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,iBAAiB,EACjC,GAAI,EACJ,MAAO,EAAE,OAAO,EAAE,IAAI,GAAS,CACjC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,eAAe,EAC/B,GAAI,CACN,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,kBAAkB,EAClC,WAAY,EACZ,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC1C,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,CACxC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,kBAAkB,EAClC,WAAY,EACZ,eAAgB,EAAE,OAAO,EAAE,IAAI,GAAS,CAC1C,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,sBAAsB,EACtC,WAAY,EACZ,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC1C,MAAO,EAAE,QAAQ,EACjB,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,CACxC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,kBAAkB,EAClC,WAAY,EACZ,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC1C,MAAO,EAAE,QAAQ,EACjB,UAAW,EAAE,OAAO,EAAE,IAAI,KAAM,EAChC,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,CACxC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,uBAAuB,EACvC,WAAY,EACZ,WAAY,CACd,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,uBAAuB,EACvC,WAAY,EACZ,OAAQ,EAAE,QAAQ,EAClB,YAAa,EAAE,QAAQ,EAAE,SAAS,CACpC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,mBAAmB,EACnC,WAAY,EACZ,UAAW,EAAE,OAAO,EAAE,IAAI,KAAM,CAClC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,oBAAoB,EACpC,WAAY,CACd,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,YAAY,EAC5B,SAAU,EACV,IAAK,GACL,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,CACxC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,iBAAiB,EACjC,SAAU,EACV,UAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC3C,MAAO,EAAE,OAAO,EAAE,IAAI,IAAK,EAC3B,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,CACvD,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,MAAM,EACtB,IAAK,GACL,UAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,CAC7C,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,eAAe,EAC/B,GAAI,EAAa,SAAS,EAC1B,KAAM,GACN,UAAW,EAAE,QAAQ,EAAE,SAAS,CAClC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,aAAa,EAC7B,GAAI,EAAa,SAAS,EAC1B,KAAM,GACN,UAAW,EAAE,QAAQ,EAAE,SAAS,CAClC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,kBAAkB,EAClC,GAAI,EAAa,SAAS,EAC1B,KAAM,GACN,UAAW,EAAE,QAAQ,EAAE,SAAS,CAClC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,cAAc,EAC9B,GAAI,EAAa,SAAS,EAC1B,KAAM,GACN,UAAW,EAAE,QAAQ,EAAE,SAAS,CAClC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,cAAc,EAC9B,GAAI,EAAa,SAAS,EAC1B,KAAM,GACN,UAAW,EAAE,QAAQ,EAAE,SAAS,CAClC,CAAC,EACD,EAAE,YAAY,CACZ,KAAM,EAAE,QAAQ,iBAAiB,EACjC,GAAI,EAAa,SAAS,EAC1B,KAAM,GACN,UAAW,EAAE,QAAQ,EAAE,SAAS,CAClC,CAAC,CACH,CAAC,EAIY,GAER,EAAE,aAAa,CAClB,eAAgB,CAClB,CAAC,EAMY,GAER,EACF,OAAO,CACN,MAAO,EACT,CAAC,EACA,OAAO,EAMG,GAGR,EAAE,OAAO,CACZ,QAAS,EAAE,QAAQ,EACnB,MAAO,EACT,CAAC,EAMY,GAER,EAAE,OAAO,CACZ,SAAU,EAAE,QAAQ,CACtB,CAAC,EAMY,GAER,EAAE,OAAO,CACZ,QAAS,EAAE,QAAQ,CACrB,CAAC,EAMY,GAGR,EACF,OAAO,CACN,eAAgB,EAChB,OAAQ,EACV,CAAC,EACA,OAAO,EAIG,GAIR,EAAE,YAAY,CACjB,GAAI,EACJ,OAAQ,GACR,QAAS,EAAE,OAAO,EAAE,IAAI,IAAK,EAAE,SAAS,CAC1C,CAAC,EAIY,GASR,EACF,YAAY,CACX,GAAI,GACJ,IAAK,GACL,SAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC1C,UAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAC3C,UAAW,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EACxC,UAAW,GACX,IAAK,GACL,YAAa,EACf,CAAC,EACA,OAAO,CAAC,IAAW,EAAO,KAAO,EAAO,IAAI,GAAI,CAC/C,KAAM,CAAC,MAAO,IAAI,EAClB,QAAS,gCACX,CAAC,EAiDI,MAAM,UAAqB,KAAM,CACtB,UACA,OACA,KAEA,gBAET,WAAW,CAChB,EACA,EACA,EAAyB,OACzB,EACA,CACA,MAAM,sBAAsB,MAAc,IAAS,EACnD,KAAK,KAAO,eACZ,KAAK,UAAY,EACjB,KAAK,OAAS,EACd,KAAK,KAAO,EAGZ,OAAO,eAAe,KAAM,kBAAmB,CAC7C,MAAO,EACP,WAAY,GACZ,SAAU,EACZ,CAAC,EAEL,CAEA,SAAS,EAAqB,CAAC,EAA6C,CAC1E,IAAM,EAAa,EAAK,SAAS,IAAI,EAAI,EAAK,MAAM,EAAG,EAAE,EAAI,EAC7D,GAAI,CAAC,EAAW,WAAW,OAAO,EAAG,OACrC,IAAM,EAAU,EAAW,MAAM,CAAC,EAAE,UAAU,EAC9C,GAAI,EAAQ,SAAW,GAAK,IAAY,SAAU,OAElD,IAAI,EACJ,GAAI,CACF,EAAQ,KAAK,MAAM,CAAO,EAC1B,KAAM,CACN,MAAM,IAAI,EAAa,cAAe,IAAK,kBAAkB,EAE/D,IAAM,EAAS,GAAwB,UAAU,CAAK,EACtD,GAAI,CAAC,EAAO,QACV,MAAM,IAAI,EAAa,cAAe,IAAK,kBAAkB,EAE/D,OAAO,EAAO,KAIhB,eAAuB,EAAsB,CAC3C,EACmC,CACnC,GAAI,CAAC,EAAS,GACZ,MAAM,IAAI,EAAa,cAAe,EAAS,MAAM,EAEvD,GAAI,CAAC,EAAS,KACZ,MAAM,IAAI,EAAa,cAAe,IAAK,kBAAkB,EAG/D,IAAM,EAAS,EAAS,KAAK,UAAU,EACjC,EAAU,IAAI,YAChB,EAAW,GACf,GAAI,CACF,OAAS,CACP,IAAQ,QAAO,QAAS,MAAM,EAAO,KAAK,EAC1C,GAAY,EAAQ,OAAO,EAAO,CAAE,OAAQ,CAAC,CAAK,CAAC,EACnD,IAAI,EAAU,EAAS,QAAQ;AAAA,CAAI,EACnC,MAAO,GAAW,EAAG,CACnB,IAAM,EAAO,EAAS,MAAM,EAAG,CAAO,EACtC,EAAW,EAAS,MAAM,EAAU,CAAC,EACrC,IAAM,EAAQ,GAAsB,CAAI,EACxC,GAAI,EAAO,MAAM,EACjB,EAAU,EAAS,QAAQ;AAAA,CAAI,EAEjC,GAAI,EAAM,MAEZ,GAAI,EAAS,OAAS,EAAG,CACvB,IAAM,EAAQ,GAAsB,CAAQ,EAC5C,GAAI,EAAO,MAAM,UAEnB,CACA,EAAO,YAAY,GAIhB,SAAS,EAAgB,CAAC,EAA6B,CAAC,EAAe,CAC5E,IAAM,EAAQ,GAAmB,EAAQ,OAAO,EAC1C,EAAU,EAAQ,OAAS,WAAW,MACtC,EAAc,EAAQ,aAAe,UAE3C,eAAe,CAAc,CAC3B,EACA,EACA,EACA,EACY,CACZ,IAAM,EAAW,MAAM,EAAQ,EAAK,IAC/B,EACH,aACF,CAAC,EACD,GAAI,CAAC,EAAS,GACZ,MAAM,IAAI,EAAa,EAAW,EAAS,MAAM,EAGnD,IAAI,EACJ,GAAI,CACF,EAAO,MAAM,EAAS,KAAK,EAC3B,KAAM,CACN,MAAM,IAAI,EAAa,EAAW,IAAK,kBAAkB,EAE3D,IAAM,EAAS,EAAO,UAAU,CAAI,EACpC,GAAI,CAAC,EAAO,QACV,MAAM,IAAI,EAAa,EAAW,IAAK,kBAAkB,EAE3D,OAAO,EAAO,KAGhB,SAAS,CAAM,CAAC,EAAc,EAAoB,CAChD,IAAM,EAAW,EAAa,MAAM,CAAE,EACtC,MAAO,GAAG,QAAW,mBAAmB,CAAQ,IAGlD,SAAS,CAAY,CAAC,EAAc,EAAY,EAA2B,CACzE,IAAM,EAAO,EAAO,EAAM,CAAE,EAC5B,OAAO,EAAW,GAAG,eAAoB,EAG3C,MAAO,CACL,QAAS,GACT,aACM,iBAAgB,EAAsC,CAC1D,OAAO,EACL,qBACA,GAAG,EAAM,iBACT,GACA,CACE,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,IACR,CACF,QAEI,eAAc,CAClB,EACA,EAAsD,CAAC,EACpC,CACnB,IAAM,EAAO,GAAyB,MAAM,CAAO,EAC7C,EAAW,MAAM,EAAQ,EAAM,OAAQ,CAC3C,OAAQ,OACR,cACA,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,CAAI,KACrB,EAAc,OAAS,CAAE,OAAQ,EAAc,MAAO,EAAI,CAAC,CACjE,CAAC,EACD,GAAI,CAAC,EAAS,GAAI,CAChB,IAAI,EACJ,GAAI,EAAS,SAAW,IACtB,GAAI,CACF,IAAM,EAAS,GAAgC,UAC7C,MAAM,EAAS,KAAK,CACtB,EACA,GAAI,EAAO,QAAS,EAAa,EAAO,KACxC,KAAM,EAIV,MAAM,IAAI,EACR,gBACA,EAAS,OACT,OACA,CACF,EAEF,OAAO,QAEH,aAAY,CAChB,EAAgC,CAAC,EACT,CACxB,IAAM,EAAQ,GAA2B,MAAM,CAAO,EAChD,EAAS,IAAI,gBACnB,GAAI,EAAM,MAAO,EAAO,IAAI,IAAK,EAAM,KAAK,EAC5C,GAAI,EAAM,SAAU,EAAO,IAAI,WAAY,MAAM,EACjD,GAAI,EAAM,OAAQ,EAAO,IAAI,SAAU,OAAO,EAAM,MAAM,CAAC,EAC3D,GAAI,EAAM,QAAU,GAAI,EAAO,IAAI,QAAS,OAAO,EAAM,KAAK,CAAC,EAC/D,IAAM,EAAS,EAAO,KAAO,IAAI,EAAO,SAAS,IAAM,GAMvD,OALiB,MAAM,EACrB,gBACA,GAAG,EAAM,WAAW,IACpB,EACF,GACgB,eAEZ,YAAW,CAAC,EAAuD,CAMvE,OALiB,MAAM,EACrB,gBACA,EAAO,EAAM,SAAU,CAAc,EACrC,EACF,GACgB,eAEZ,gBAAe,CACnB,EACA,EACmC,CACnC,OAAO,EACL,sBACA,GAAG,EAAO,EAAM,SAAU,CAAc,kBAAkB,mBAAmB,GAA4B,MAAM,CAAY,CAAC,IAC5H,EACF,QAEI,cAAa,CACjB,EACA,EACoC,CACpC,IAAM,EAAO,GAA+B,MAAM,CAAE,OAAM,CAAC,EAC3D,OAAO,EACL,iBACA,EAAO,EAAM,SAAU,CAAc,EACrC,GACA,CACE,OAAQ,MACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,CAAI,CAC3B,CACF,QAEI,eAAc,CAClB,EACqC,CACrC,OAAO,EACL,kBACA,EAAO,EAAM,eAAgB,CAAc,EAC3C,GACA,CAAE,OAAQ,KAAM,CAClB,QAEI,cAAa,CACjB,EACoC,CACpC,OAAO,EACL,iBACA,EAAO,EAAM,SAAU,CAAc,EACrC,GACA,CAAE,OAAQ,QAAS,CACrB,GAEF,YAAY,CAAC,EAAuC,CAClD,OAAO,EACL,kBACA,EAAO,EAAM,UAAW,CAAK,EAC7B,EACF,GAEF,kBAAkB,CAChB,EACqC,CACrC,OAAO,EACL,uBACA,EAAM,gBACN,GACA,CACE,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,GAAgC,MAAM,CAAO,CAAC,CACrE,CACF,GAEF,SAAS,CAAC,EAAyD,CACjE,IAAM,EAAO,GAAwB,MAAM,CAAO,EAClD,OAAO,EACL,aACA,EAAM,QACN,GACA,CACE,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,CAAI,CAC3B,CACF,QAEI,OAAM,CAAC,EAAY,EAA+C,CACtE,IAAM,EAAqB,EACxB,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,GAAG,EACP,MAAM,CAAQ,EACX,EAAO,IAAI,SAEjB,OADA,EAAK,IAAI,OAAQ,EAAM,CAAkB,EAClC,EACL,cACA,EAAM,QACN,GACA,CACE,OAAQ,OACR,KAAM,CACR,CACF,GAEF,YAAY,CAAC,EAAkB,EAAW,GAAe,CACvD,OAAO,EAAa,EAAM,QAAS,EAAU,CAAQ,GAEvD,wBAAwB,CAAC,EAAoB,EAAW,GAAe,CACrE,OAAO,EAAa,EAAM,oBAAqB,EAAY,CAAQ,GAErE,qBAAqB,CAAC,EAAiB,EAAW,GAAe,CAC/D,OAAO,EAAa,EAAM,iBAAkB,EAAS,CAAQ,EAEjE,ECpgDK,SAAS,EAAuB,CACrC,EACmB,CACnB,OAAQ,OACD,cACA,iBACA,gBACA,SACH,OAAO,UAEP,MAAO,WAIN,SAAS,EAAmB,CAAC,EAA0C,CAC5E,OAAQ,OACD,UACH,MAAO,aACJ,aACH,MAAO,iBACJ,YACH,MAAO,YACJ,SACH,MAAO,aACJ,UACH,MAAO,yBAEP,MAAO,SAIN,SAAS,EAAoB,CAClC,EACmB,CACnB,MAAO,CACL,OAAQ,GAAa,QACrB,MAAO,GAAoB,CAAS,EACpC,UAAW,IAAc,WAAa,IAAc,YACtD,EAGF,IAAM,GAAe,EAAE,OAAO,EAAE,OAAO,EAAG,EAAE,QAAQ,CAAC,EC7G9C,IAAM,EAAsyB,CACjzB,gBAAiB,CACf,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,MAAO,EACT,EACA,oBAAqB,CACnB,OAAQ,UACR,OAAQ,UACR,OAAQ,oBACR,OAAQ,kBACR,MAAO,EACT,EACA,aAAc,CACZ,OAAQ,WACR,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,MAAO,EACT,EACA,MAAO,CACL,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,KAAM,CACJ,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,MAAO,WACP,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,MAAO,CACL,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,mBACR,OAAQ,UACR,MAAO,EACT,EACA,KAAM,CACJ,OAAQ,UACR,OAAQ,kBACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,oBAAqB,CACnB,OAAQ,WACR,MAAO,EACT,EACA,gBAAiB,CACf,OAAQ,UACR,MAAO,EACT,EACA,kBAAmB,CACjB,OAAQ,WACR,MAAO,EACT,EACA,eAAgB,CACd,OAAQ,oBACR,MAAO,EACT,EACA,SAAU,CACR,OAAQ,mBACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,MAAO,EACT,EACA,OAAQ,CACN,uBAAwB,WACxB,OAAQ,UACR,OAAQ,WACR,MAAO,WACP,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,OAAQ,CACN,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,WAAY,CACV,OAAQ,UACR,OAAQ,WACR,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,MAAO,CACL,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,SAAU,CACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,QAAS,CACP,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,YAAa,CACX,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,MAAO,EACT,EACA,QAAS,CACP,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,cAAe,CACb,OAAQ,WACR,MAAO,EACT,EACA,aAAc,CACZ,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,UAAW,CACT,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,QAAS,CACP,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,WACR,MAAO,EACT,EACA,eAAgB,CACd,OAAQ,mBACR,MAAO,EACT,EACA,QAAS,CACP,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,YAAa,CACX,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,MAAO,kBACP,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,YAAa,CACX,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,MAAO,EACT,EACA,aAAc,CACZ,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,WAAY,CACV,OAAQ,UACR,MAAO,EACT,EACA,KAAM,CACJ,OAAQ,UACR,OAAQ,kBACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,QAAS,CACP,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,WACR,OAAQ,WACR,MAAO,EACT,EACA,SAAU,CACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,SAAU,CACR,OAAQ,UACR,MAAO,EACT,EACA,UAAW,CACT,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,MAAO,CACL,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,kBAAmB,CACjB,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,MAAO,WACP,OAAQ,WACR,OAAQ,WACR,MAAO,EACT,EACA,KAAM,CACJ,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,OAAQ,CACN,OAAQ,UACR,OAAQ,WACR,OAAQ,WACR,MAAO,EACT,EACA,YAAa,CACX,OAAQ,WACR,MAAO,EACT,EACA,SAAU,CACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,MAAO,EACT,EACA,MAAO,CACL,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,MAAO,CACL,OAAQ,WACR,MAAO,EACT,EACA,KAAM,CACJ,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,SAAU,CACR,MAAO,UACP,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,WAAY,CACV,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,MAAO,CACL,OAAQ,UACR,OAAQ,SACR,OAAQ,UACR,OAAQ,UACR,MAAO,WACP,OAAQ,SACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,aAAc,CACZ,OAAQ,UACR,OAAQ,UACR,OAAQ,oBACR,OAAQ,WACR,OAAQ,SACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,MAAO,EACT,EACA,YAAa,CACX,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,WAAY,CACV,OAAQ,UACR,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,OAAQ,CACN,OAAQ,WACR,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,MAAO,EACT,EACA,OAAQ,CACN,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,WACR,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,cAAe,CACb,OAAQ,WACR,OAAQ,UACR,OAAQ,UACR,MAAO,EACT,EACA,WAAY,CACV,OAAQ,WACR,OAAQ,WACR,MAAO,EACT,CACF,EACO,SAAS,CAAS,CAAC,KAAiB,EAAuC,CAChF,MAAO,GAAG,KAAe,GAAM,GAAG,CAAM,EAAE,WAAa,oBNvclD,SAAS,EAAoB,CAAC,EAGpB,CACf,IAAQ,OAAM,UAAW,EACnB,EAAM,GAAS,CACnB,SAAU,CACR,SACA,OACA,iBACA,EAAO,MAAM,UACb,EAAK,KACP,EACA,QAAS,IAAM,EAAO,aAAa,EAAK,OAAS,EAAE,EACnD,QAAS,QAAQ,EAAK,KAAK,EAC3B,MAAO,GACP,gBAAiB,CAAC,IAChB,EAAM,MAAM,MAAM,SAAW,WAC7B,EAAM,MAAM,MAAM,SAAW,aACzB,KACA,EACR,CAAC,EACK,EACJ,EAAI,iBAAiB,GAAgB,EAAI,MAAM,SAAW,IACtD,EAAoB,EAAI,SAAW,CAAC,EACpC,EAAQ,GACZ,EAAK,MAAQ,GAAwB,EAAI,MAAM,MAAM,EAAI,IAC3D,EAGM,EACJ,CAAC,EAAK,OACN,GACC,CAAC,EAAI,SACJ,EAAI,OAAS,SACZ,EAAM,SAAW,aAAe,EAAM,SAAW,WAChD,EAAa,EAAK,WAAW,YAAc,EAAK,WAAW,KAC1D,EAAe,GAAoB,YAAwB,IAAI,EAChE,EAAQ,EACV,qBACA,EAAK,OAAS,EAAI,UAChB,6BACA,EAAM,MAEZ,OACE,SAyEE,UAzEF,CACE,UAAW,EAAU,mBAAoB,EAAW,IAAI,EACxD,aAAY,EAAK,MAFnB,SAyEE,CArEA,SAEE,OAFF,CAAM,UAAW,EAAU,0BAA2B,EAAW,MAAM,EAAvE,0CAEE,EACF,SAAsB,SAAtB,UAAS,EAAK,OAAd,qBAAsB,EACtB,SAQE,OARF,CACE,KAAK,SACL,UAAW,EACT,+BACA,EAAW,QACb,EALF,SAOG,GAPH,qBAQE,EACD,EAAK,YACJ,SAOE,IAPF,CACE,UAAW,EACT,+BACA,EAAW,QACb,EAJF,SAMG,EAAK,aANR,qBAOE,EACA,KACH,GAAa,EAAK,WAAW,UAAU,WAAW,QAAQ,EACzD,IAAkB,EAChB,SAEE,IAFF,CAAG,KAAK,SAAR,qGAEE,EAEF,SAAC,MAAD,CACE,UAAW,EACT,iCACA,EAAW,iBACb,EACA,IAAK,EACL,IAAK,EAAK,MACV,QAAQ,OACR,QAAS,IAAM,EAAiB,CAAU,GAR5C,qBASA,EAEA,KACH,EACC,SAgBE,MAhBF,CACE,UAAW,EAAU,2BAA4B,EAAW,OAAO,EADrE,SAgBE,CAbA,SAKE,IALF,CACE,UAAW,EAAU,0BAA2B,EAAW,MAAM,EACjE,KAAM,EAAK,WAAW,IAFxB,sCAKE,EACF,SAME,IANF,CACE,UAAW,EAAU,0BAA2B,EAAW,MAAM,EACjE,KAAM,EAAK,WAAW,aAAe,EAAK,WAAW,IACrD,SAAU,EAAK,WAAW,UAAY,GAHxC,0CAME,IAfJ,qBAgBE,EACA,KACH,EACC,SAME,EANF,CACE,KAAK,SACL,QAAQ,UACR,QAAS,IAAM,KAAK,EAAI,QAAQ,EAHlC,8CAME,EACA,OAxEN,qBAyEE,EOnIN,+BAKO,SAAS,EAAuB,CAAC,EAGvB,CACf,IAAO,EAAS,GAAc,WAAS,EAAK,GACrC,EAAO,GAAY,WAAS,EAAM,KAAK,GACvC,EAAS,GAAc,WAAS,EAAK,GACrC,EAAO,GAAY,WAAwB,IAAI,EAChD,EAAU,SAAO,EAAK,EACtB,EAAiB,SAAO,EAAK,EAC7B,EAAQ,SAAgC,IAAI,EAClD,YAAU,IAAM,CACd,GAAI,EAAS,EAAM,SAAS,MAAM,GACjC,CAAC,CAAO,CAAC,EACZ,IAAM,EAAU,SAA+B,IAAI,EACnD,YAAU,KACR,EAAQ,QAAU,GACX,IAAY,CACjB,EAAQ,QAAU,KAEnB,CAAC,CAAC,EACL,IAAM,EAAS,IAAY,CACzB,EAAW,EAAK,EAChB,EAAS,IAAI,EACb,sBAAsB,IACpB,EAAQ,SAAS,cAAc,QAAQ,GAAG,MAAM,CAClD,GAEI,GAAS,SAA2B,CACxC,GAAI,EAAe,SAAW,CAAC,EAAM,KAAK,EAAG,OAC7C,EAAe,QAAU,GACzB,EAAW,EAAI,EACf,EAAS,IAAI,EACb,GAAI,CAEF,GADA,MAAM,EAAM,SAAS,EAAM,KAAK,CAAC,EAC7B,EAAQ,QAAS,EAAO,EAC5B,MAAO,EAAO,CACd,GAAI,EAAQ,QACV,EACE,GACE,EACA,6CACF,GAAK,6CACP,SACF,CAEA,GADA,EAAe,QAAU,GACrB,EAAQ,QAAS,EAAW,EAAK,IAGzC,OACE,8BAsDE,CArDA,SAaE,OAbF,CAAM,IAAK,EAAX,SACE,SAWE,EAXF,CACE,KAAK,SACL,QAAQ,QACR,gBAAe,EACf,SAAU,EACV,QAAS,IAAM,CACb,EAAS,EAAM,KAAK,EACpB,EAAW,EAAI,GAPnB,wCAWE,GAZJ,qBAaE,EACD,GACC,SAoCE,OApCF,CACE,UAAW,EACT,qBACA,EAAW,eACb,EACA,SAAU,CAAC,IAAU,CACnB,EAAM,eAAe,EAChB,GAAO,GAPhB,SAoCE,CA1BA,SAWE,QAXF,UAWE,CAXF,qBAEE,SAAC,GAAD,CACE,IAAK,EACL,OAAQ,EAAW,oBACnB,MAAO,EACP,SAAU,CAAC,IAAU,EAAS,EAAM,OAAO,KAAK,EAChD,SAAQ,GACR,UAAW,GACX,SAAU,GAPZ,qBAQA,IAVF,qBAWE,EACF,SAYE,MAZF,CAAK,UAAW,EAAU,GAAI,EAAW,OAAO,EAAhD,SAYE,CAXA,SAEE,EAFF,CAAQ,KAAK,SAAS,SAAU,GAAW,CAAC,EAAM,KAAK,EAAvD,SACG,EAAU,YAAc,cAD3B,qBAEE,EACF,SAOE,EAPF,CACE,KAAK,SACL,QAAQ,QACR,SAAU,EACV,QAAS,EAJX,wCAOE,IAXJ,qBAYE,EACD,GAAS,SAAyB,IAAzB,CAAG,KAAK,QAAR,SAAiB,GAAjB,qBAAyB,IAnCrC,qBAoCE,IApDN,qBAsDE,EC7GN,+BAgBM,GAAe,qBAOd,SAAS,EAA8B,CAAC,EAG9B,CACf,IAAO,EAAQ,GAAa,WAAS,EAAK,GACnC,EAAY,GAAiB,WAAS,EAAK,GAC3C,EAAY,GAAiB,WAAS,EAAK,EAC5C,EAAU,SAAwB,IAAI,EACtC,EAAU,SAAoB,IAAI,EAyBxC,OAvBA,YAAU,IAAM,CACd,IAAM,EAAQ,OAAO,WAAW,EAAY,EACtC,EAAS,IAAY,CACzB,GACE,EAAM,SACN,EAAQ,SAAS,eAAe,SAAS,SAAS,aAAa,EAE/D,EAAQ,SAAS,cAAc,QAAQ,GAAG,MAAM,EAClD,GACE,CAAC,EAAM,SACP,SAAS,gBAAkB,EAAQ,SAAS,cAAc,QAAQ,EAElE,EAAQ,SAAS,MAAM,EAEzB,GADA,EAAU,EAAM,OAAO,EACnB,CAAC,EAAM,QAAS,EAAc,EAAK,GAIzC,OAFA,EAAO,EACP,EAAM,iBAAiB,SAAU,CAAM,EAChC,IAAY,EAAM,oBAAoB,SAAU,CAAM,GAC5D,CAAC,CAAC,EAEL,YAAU,IAAM,EAAc,EAAK,EAAG,CAAC,EAAM,UAAU,CAAC,EAGtD,SA6EE,MA7EF,CACE,UAAW,EACT,kCACA,EAAW,OACb,EAJF,SA6EE,CAvEA,SAyBE,UAzBF,CACE,UAAW,EACT,0BACA,EAAW,cACb,EACA,KAAM,EACN,cAAe,CAAC,IAAU,CACxB,GACE,EAAM,gBAAkB,MACxB,OAAO,WAAW,EAAY,EAAE,QAEhC,EAAQ,SAAS,cAAc,QAAQ,GAAG,MAAM,GAEpD,SAAU,CAAC,IAAU,EAAc,EAAM,cAAc,IAAI,EAb7D,SAyBE,CAVA,SAQE,UARF,CACE,IAAK,EACL,UAAW,EACT,kCACA,EAAW,OACb,EALF,6CAQE,EACD,CAAC,GAAU,EAAM,WAxBpB,qBAyBE,EACF,SAwBE,OAxBF,CACE,IAAK,EACL,cAAe,CAAC,IAAU,CACxB,GACE,EAAM,gBAAkB,MACxB,CAAC,OAAO,WAAW,EAAY,EAAE,QAEjC,EAAQ,SAAS,MAAM,GAE3B,UAAW,EACT,iCACA,EAAW,cACb,EAZF,SAcE,SASE,EATF,CACE,UAAU,kCACV,QAAQ,QACR,KAAK,SACL,gBAAc,SACd,gBAAe,EACf,QAAS,IAAM,EAAc,EAAI,EANnC,6CASE,GAvBJ,qBAwBE,EACF,SAmBE,GAnBF,CAAQ,KAAM,GAAU,EAAY,aAAc,EAAlD,SACE,SAiBE,GAjBF,CACE,UAAW,EACT,iCACA,GAAc,QAChB,EACA,mBAAkB,OAClB,iBAAkB,CAAC,IAAU,CAC3B,EAAM,eAAe,GAEpB,OAAO,WAAW,EAAY,EAAE,QAC7B,EAAQ,SAAS,cAAc,QAAQ,EACvC,EAAQ,UACT,MAAM,GAZb,SAiBE,CAFA,SAA0B,GAA1B,8CAA0B,EACzB,EAAM,WAhBT,qBAiBE,GAlBJ,qBAmBE,IA5EJ,qBA6EE,EClIC,IAAM,GACX,wJACW,GAA4B,IAC5B,GAAwB,QAIrC,IAAM,GAAgC,IAAI,IAAI,CAC5C,CAAC,OAAQ,WAAW,EACpB,CAAC,OAAQ,YAAY,EACrB,CAAC,QAAS,YAAY,EACtB,CAAC,QAAS,YAAY,EACtB,CAAC,OAAQ,WAAW,EACpB,CAAC,OAAQ,iBAAiB,CAC5B,CAAC,EACK,GAAkB,IAAI,IAAI,GAA8B,OAAO,CAAC,ECiBtE,gBCAO,SAAS,EAA2B,EAA0B,CACnE,MAAO,CACL,UAAW,mBACX,KAAM,GACN,MAAO,CAAC,EACR,UAAW,CAAC,EACZ,SAAU,CAAC,EACX,SAAU,CAAC,EACX,WAAY,CAAC,EACb,SAAU,GACV,MAAO,IACT,EAIK,SAAS,EAAsB,CACpC,EACA,EACuB,CACvB,OAAQ,EAAM,UACP,QACH,OAAO,EAAM,UAAY,IAAK,EAAO,UAAW,EAAM,SAAU,EAAI,MACjE,aACH,MAAO,IAAK,EAAO,KAAM,GAAG,EAAM,OAAO,EAAM,OAAQ,MACpD,uBACH,MAAO,IACF,EACH,WAAY,IACP,EAAM,YACR,EAAM,YAAa,CAClB,WAAY,EAAM,WAClB,SAAU,EAAM,SAChB,MAAO,EAAM,SACT,EAAM,MAAQ,CAAE,MAAO,EAAM,KAAM,EAAI,CAAC,CAC9C,CACF,CACF,MACG,wBAAyB,CAC5B,IAAM,EAAO,EAAM,WAAW,EAAM,YAC9B,EAA+B,CACnC,WAAY,EAAM,WAClB,WAAY,EAAM,WAClB,SAAU,GAAM,UAAY,UACxB,GAAS,GAAM,KAAK,EAAI,CAAE,MAAO,EAAK,KAAM,EAAI,CAAC,KACjD,GAAM,MAAQ,CAAE,MAAO,EAAK,KAAM,EAAI,CAAC,CAC7C,EACA,MAAO,IACF,EACH,UAAW,CACT,GAAG,EAAM,UAAU,OACjB,CAAC,IAAS,EAAK,aAAe,EAAM,UACtC,EACA,CACF,CACF,CACF,KACK,4BACA,wBACA,qBACH,MAAO,IACF,EACH,UAAW,EAAM,UAAU,OACzB,CAAC,IAAa,EAAS,aAAe,EAAM,UAC9C,CACF,MACG,gBACH,MAAO,IAAK,EAAO,SAAU,CAAC,GAAG,EAAM,SAAU,EAAM,IAAI,CAAE,MAC1D,cACH,MAAO,IAAK,EAAO,SAAU,CAAC,GAAG,EAAM,SAAU,EAAM,IAAI,CAAE,MAC1D,mBACA,mBACA,kBACH,MAAO,IAAK,EAAO,MAAO,CAAC,GAAG,EAAM,MAAO,EAAM,IAAI,CAAE,MACpD,SACH,MAAO,IAAK,EAAO,SAAU,EAAK,MAC/B,QACH,MAAO,IACF,EACH,SAAU,GACV,MAAO,EAAM,QAAU,kBACzB,MACG,QACH,MAAO,IAAK,EAAO,SAAU,GAAM,MAAO,EAAM,SAAU,UAE1D,OAAO,GAIN,SAAS,EAAsB,CACpC,EACoB,CACpB,MAAO,CACL,GAAI,EAAM,UACV,KAAM,YACN,QAAS,EAAM,QACX,EAAM,MAAM,OAAS,EAAI,CAAE,MAAO,EAAM,KAAM,EAAI,CAAC,CACzD,EAGK,SAAS,EAAuB,CACrC,EACA,EACa,CACb,IAAM,EAAW,CACf,GAAI,EAAS,WACb,WACA,WAAY,EAAS,WACrB,SAAU,EAAS,YACf,EAAS,MAAQ,CAAE,MAAO,EAAS,KAAM,EAAI,CAAC,KAC9C,EAAS,MAAQ,CAAE,MAAO,EAAS,KAAM,EAAI,CAAC,CACpD,EACA,OAAO,GAAkB,MAAM,CAC7B,KAAM,YACN,MAAO,CACL,CACE,MAAO,qBACP,WAAY,EAAS,WACrB,SAAU,EAAS,YACf,EAAS,MAAQ,CAAE,MAAO,EAAS,KAAM,EAAI,CAAC,KAC9C,EAAS,MAAQ,CAAE,MAAO,EAAS,KAAM,EAAI,CAAC,EAClD,SAAU,CACZ,CACF,CACF,CAAC,EAGH,SAAS,EAAQ,CAAC,EAAkD,CAClE,OAAO,OAAO,IAAU,UAAY,IAAU,MAAQ,CAAC,MAAM,QAAQ,CAAK,iBD3FtE,GAAuB,uBAAuB,GAA4B,8CAA8C,GAAwB,UAEhJ,EAAiB,CACrB,SAAU,CAAC,SAAU,OAAQ,UAAU,EACvC,SAAU,CAAC,IACT,CAAC,SAAU,OAAQ,WAAY,CAAc,CACjD,EAuCO,SAAS,EAAmB,CACjC,EACc,CACd,IAAM,EAAc,GAAe,EAC7B,EAAa,UACjB,IACE,GAAiB,CACf,QAAS,EAAM,QACf,MAAO,CAAC,EAAO,IAAS,WAAW,MAAM,EAAO,CAAI,CACtD,CAAC,EACH,CAAC,EAAM,OAAO,CAChB,GACO,GAAmB,WAAS,IAAM,IAAI,EAAsB,EAC7D,EAAa,EAAM,YAAc,EACjC,EAAW,GAAmB,EAAM,QAAS,EAAM,SAAS,EAC5D,EAAkB,SAAO,CAAQ,EACvC,EAAgB,QAAU,EAC1B,IAAQ,KAAM,EAAO,WAAY,uBAC/B,EAAW,UACX,IAAM,EAAW,KAAK,CAAQ,EAC9B,IAAM,EAAW,KAAK,CAAQ,CAChC,EACM,EAAW,cACf,CAAC,IAAiB,EAAW,OAAO,EAAU,CAAE,MAAK,CAAC,EACtD,CAAC,EAAY,CAAQ,CACvB,EACM,EAAa,cACjB,CACE,IAIA,EAAW,OAAO,EAAU,CAC1B,QACE,OAAO,IAAU,WACb,EAAM,EAAW,KAAK,CAAQ,EAAE,OAAO,EACvC,CACR,CAAC,EACH,CAAC,EAAY,CAAQ,CACvB,GACO,EAAiB,GAAsB,WAC5C,CAAC,CACH,GACO,EAAQ,IAAa,WAAuC,IAAI,GAChE,EAAS,GAAc,WAAS,EAAK,GACrC,GAAW,IAAgB,WAAS,EAAK,GACzC,EAAW,IAAgB,WAAS,EAAK,GACzC,EAAgB,IAAqB,WAA8B,CAAC,CAAC,EACtE,EAAiB,SAAsB,IAAI,GAC1C,GAAO,GAAY,WAAwB,IAAI,GAC/C,EAAa,IAAkB,WACpC,IACF,EACA,YAAU,IAAM,CACd,EAAM,0BAA0B,CAC9B,SAAU,QAAQ,GAAS,EAAQ,QAAU,EAAe,MAAM,EAClE,KAAM,GAAW,CACnB,CAAC,GACA,CACD,EACA,EACA,EACA,EACA,EACA,EAAM,uBACR,CAAC,EACD,YACE,IAAM,IACJ,EAAM,0BAA0B,CAAE,SAAU,GAAO,KAAM,EAAM,CAAC,EAClE,CAAC,EAAM,uBAAuB,CAChC,EACA,IAAM,GAAsB,GAA6B,GAClD,GAAmB,IAAwB,WAAS,EAAK,EAC1D,GAAuB,SAAwB,IAAI,EACnD,GAAe,SAA8B,IAAI,EACjD,GAAkB,SAA8B,IAAI,EACpD,GAAkB,SAAO,EAAI,GAC5B,GAAkB,IAAuB,WAAS,EAAK,EACxD,EAAkB,SAA+B,IAAI,EACrD,EAAa,SAAO,EAAK,EAC/B,YAAU,KACR,EAAW,QAAU,GACd,IAAY,CACjB,EAAW,QAAU,GACrB,EAAe,QAAU,KACzB,IAAM,EAAS,EAAgB,QAC/B,EAAgB,QAAU,KAC1B,GAAQ,MAAM,IAEf,CAAC,CAAC,EACL,IAAM,GAAoB,SAAsB,IAAI,EAC9C,GAAoB,SAAsB,IAAI,GAE7C,GAAe,IAAoB,WAAS,EAAE,GAC9C,GAAa,IAAkB,WAAsB,CAC1D,MAAO,GACP,SAAU,GACV,OAAQ,CACV,CAAC,EACD,YAAU,IAAM,CACd,IAAM,EAAQ,OAAO,WACnB,IACE,GAAe,CAAC,IACd,EAAQ,QAAU,GAAc,KAAK,EACjC,EACA,IAAK,EAAS,MAAO,GAAc,KAAK,EAAG,OAAQ,CAAE,CAC3D,EACF,GACF,EACA,MAAO,IAAY,OAAO,aAAa,CAAK,GAC3C,CAAC,EAAa,CAAC,EAClB,IAAM,EAAgB,GAAS,CAC7B,SAAU,CAAC,GAAG,EAAe,SAAU,EAAW,EAClD,QAAS,IAAM,EAAW,aAAa,EAAW,CACpD,CAAC,EACK,EAAgB,GAAS,CAC7B,SAAU,EAAe,SAAS,EAAM,WAAa,EAAE,EACvD,QAAS,IAAM,EAAW,YAAY,EAAM,WAAa,EAAE,EAG3D,QACE,EAAM,YAAc,MAAQ,CAAC,GAAW,EAAgB,SAAW,CACvE,CAAC,EACK,GAAW,EAAc,MAAQ,CAAC,EAClC,GACJ,EAAc,WACd,QAAQ,EAAc,KAAK,GAC3B,GAAS,OAAS,GAClB,GAAc,OAAS,GACvB,GAAY,UACZ,GAAY,OAAS,EACjB,GAAiB,EAAc,MAAQ,CAAC,EACxC,EACJ,GAAS,KAAK,CAAC,IAAY,EAAQ,KAAO,EAAM,SAAS,GACzD,EACG,eAA8B,CAAE,SAAU,EAAe,QAAS,CAAC,EACnE,QAAQ,GAAI,KAAW,GAAS,CAAC,CAAC,EAClC,KAAK,CAAC,IAAY,EAAQ,KAAO,EAAM,SAAS,EAC/C,GAAkB,GAAgB,WAAa,GAC/C,GAAkB,CACtB,OAAQ,GACR,KAAM,GACN,MAAO,EAAc,MAAQ,gCAAkC,KAC/D,QAAS,IAAY,CACd,EAAc,QAAQ,GAE7B,SAAU,GACV,OAAQ,EACV,EACM,EAAkB,UAAQ,IAAM,CACpC,IAAM,EAAO,CAAC,GAAG,GAAgB,GAAG,CAAe,EACnD,GAAI,IAAW,EAAO,MAAQ,EAAO,MAAM,OAAS,GAClD,EAAK,KAAK,GAAuB,CAAM,CAAC,EAE1C,OAAO,GACN,CAAC,EAAiB,GAAgB,CAAM,CAAC,EACtC,GAAe,UACnB,IACE,EAAgB,QAAQ,CAAC,KACtB,EAAQ,OAAS,CAAC,GAAG,OACpB,CAAC,IAAS,EAAK,OAAS,WAAa,EAAK,OAAS,YACrD,CACF,EACF,CAAC,CAAe,CAClB,EAEA,YAAU,IAAM,CACd,GAAI,EAAM,WAAa,GAAkB,UAAY,EAAM,UAAW,CACpE,GAAkB,QAAU,KAC5B,OAEF,IAAM,EAAS,EAAgB,QAC/B,EAAgB,QAAU,KAC1B,GAAQ,MAAM,EACd,EAAW,EAAK,EAChB,EAAmB,CAAC,CAAC,EACrB,GAAU,IAAI,EACd,GAAa,EAAK,EAClB,EAAe,QAAU,KACzB,GAAkB,CAAC,CAAC,EACpB,GAAa,EAAK,EAClB,EAAS,IAAI,EACb,GAAe,IAAI,GAClB,CAAC,EAAM,SAAS,CAAC,EAEpB,YAAU,IAAM,CACd,GAAgB,QAAU,GAC1B,GAAoB,EAAK,GACxB,CAAC,EAAM,SAAS,CAAC,EAEpB,YAAU,IAAM,CACd,IAAM,EAAS,GAAgB,QACzB,EAAa,GAAQ,kBAC3B,GAAI,CAAC,GAAU,CAAC,EAAY,OAC5B,IAAM,EAAS,IAAY,CACzB,GAAI,GAAgB,QAAS,EAAO,UAAY,EAAO,cAEzD,EAAO,EACP,IAAM,EAAW,IAAI,eAAe,CAAM,EAE1C,OADA,EAAS,QAAQ,CAAU,EACpB,IAAY,EAAS,WAAW,GACtC,CAAC,CAAC,EAEL,YAAU,IAAM,CACd,GAAI,GAAgB,QAAS,CAC3B,IAAM,EAAS,GAAgB,QAC/B,GAAI,EAAQ,EAAO,UAAY,EAAO,eAEvC,CAAC,EAAQ,EAAgB,MAAM,CAAC,EAEnC,IAAM,EAAoB,cACxB,CAAC,EAAyB,EAAe,KAAgB,CACvD,EAAM,SACJ,GAAwB,EAAM,eAAgB,CAAc,EAC5D,CAAE,cAAa,CACjB,EACA,GAAqB,EAAK,GAE5B,CAAC,EAAM,SAAU,EAAM,cAAc,CACvC,EAEA,YAAU,IAAM,CACd,GAAI,CAAC,EAAM,SAAW,EAAM,UAAW,OACvC,IAAM,EAAa,GAAG,EAAM,QAAQ,eAAiB,EAAM,QAAQ,SACnE,GAAI,GAAkB,UAAY,EAAY,OAC9C,GAAkB,QAAU,EAC5B,EAAS,EAAM,QAAQ,MAAM,EAC7B,EAAS,IAAI,EACR,EACF,mBAAmB,CAClB,QAAS,EACT,SAAU,EAAM,QAAQ,SACxB,OAAQ,EAAM,QAAQ,OACtB,UAAW,EAAM,QAAQ,KAC3B,CAAC,EACA,KAAK,EAAG,oBAAqB,CAC5B,GACE,CAAC,EAAW,SACZ,EAAgB,UAAY,GAC5B,GAAkB,UAAY,EAE9B,OACF,EAAW,MACT,EACA,GAAmB,EAAM,QAAS,CAAc,CAClD,EACA,EAAkB,EAAgB,EAAI,EACvC,EACA,MAAM,CAAC,IAAmB,CACzB,GACE,CAAC,EAAW,SACZ,EAAgB,UAAY,GAC5B,GAAkB,UAAY,EAE9B,OACF,GAAkB,QAAU,KAC5B,EAAS,GAAa,EAAO,+BAA+B,CAAC,EAC9D,GACF,CACD,EACA,EACA,EAAM,QACN,EAAM,UACN,EAAM,QACN,EACA,EACA,CACF,CAAC,EAED,IAAM,GAAY,cAChB,MACE,EACA,EACA,EACA,IACqB,CACrB,EAAgB,SAAS,MAAM,EAC/B,IAAM,EAAa,IAAI,gBACvB,EAAgB,QAAU,EAC1B,EAAW,EAAI,EACf,EAAS,IAAI,EACb,GAAe,IAAI,EACnB,IAAI,EAAkB,GAClB,EAA8B,IAC7B,GAA4B,EAC/B,UAAW,OAAO,WAAW,CAC/B,EACA,GAAU,CAAI,EACd,IAAI,EAAW,GACX,GAAW,GACT,GAAiB,IAAY,CACjC,GAAI,IAAa,CAAC,EAAK,MAAQ,EAAK,MAAM,SAAW,EAAI,OACzD,GAAW,GACX,IAAM,GAAU,GAAuB,CAAI,EAC3C,EAAmB,CAAC,IAAY,CAAC,GAAG,EAAS,EAAO,CAAC,EACrD,GAAU,IAAK,EAAM,KAAM,GAAI,MAAO,CAAC,CAAE,CAAC,GAE5C,GAAI,CACF,IAAM,GAAW,MAAM,EAAW,eAChC,CACE,GAAI,EACJ,WACA,QAAS,gBACX,EACA,CAAE,OAAQ,EAAW,MAAO,CAC9B,EACA,EAAW,GACX,IAAa,EACb,cAAiB,KAAS,GAAuB,EAAQ,EAAG,CAC1D,GAAI,EAAgB,UAAY,EAAY,OAAO,EACnD,GAAI,EAAM,OAAS,QAAS,EAAkB,GAC9C,EAAO,GAAuB,EAAM,CAAK,EACzC,GAAU,CAAI,EAEhB,GAAI,EAAgB,UAAY,EAAY,OAAO,EAEnD,GADA,GAAe,EAEb,EAAW,OAAO,SAClB,GACA,EAAK,QAAU,MACf,CAAC,EAAK,SAYN,OAVA,GAAe,CACb,KACE,EAAW,OAAO,SAAW,EACzB,UACA,EAAK,QAAU,KACb,SACA,kBACJ,EAAK,MAAQ,CAAE,OAAQ,EAAK,KAAM,EAAI,CAAC,KACvC,EAAQ,CAAE,OAAM,EAAI,CAAC,CAC3B,CAAC,EACM,EAET,GAAI,CACF,IAAM,EACJ,MAAM,EAAW,YAAY,CAAc,EAC7C,GAAI,EAAgB,UAAY,EAAY,OAAO,EACnD,EAAY,aACV,EAAe,SAAS,CAAc,EACtC,CACF,EACA,EAAmB,CAAC,CAAC,EACrB,KAAM,EAIR,MAAM,EAAY,kBAAkB,CAClC,SAAU,EAAe,QAC3B,CAAC,EACD,MAAO,GAAO,CACd,GAAI,EAAgB,UAAY,EAAY,OAAO,EACnD,GAAe,EACf,GAAe,CACb,KAAM,EAAW,OAAO,QACpB,UACA,EACE,eACA,YACF,CAAC,EAAW,OAAO,QACnB,CACE,OAAQ,GACN,GACA,sCACF,CACF,EACA,CAAC,KACD,EAAQ,CAAE,OAAM,EAAI,CAAC,CAC3B,CAAC,SACD,CACA,GAAI,EAAgB,UAAY,EAC9B,EAAgB,QAAU,KAC1B,EAAW,EAAK,EAGpB,OAAO,GAET,CAAC,EAAY,CAAW,CAC1B,EAEM,GAAe,cACnB,MAAO,IAAkC,CACvC,IAAM,EAAO,EAAO,KAAK,EACzB,GACG,CAAC,GAAQ,EAAQ,SAAW,GAC7B,GACA,GACA,EAAe,OAAS,EAExB,OACF,IAAM,EAAiB,EAAM,WAAa,OAAO,OAAO,WAAW,IAC7D,EAAU,GAAmB,EAAM,QAAS,CAAc,EAC1D,EAAY,OAAO,WAAW,EAC9B,EAAc,EAAQ,IAAI,CAAC,KAAY,CAC3C,KAAM,cACN,KAAM,CAAE,IAAK,EAAO,GAAI,CAC1B,EAAE,EACI,EAAQ,CACZ,GAAI,EAAO,CAAC,CAAE,KAAM,OAAiB,MAAK,CAAC,EAAI,CAAC,EAChD,GAAG,CACL,EACA,EAAmB,CAAC,IAAY,CAC9B,GAAG,EACH,CACE,GAAI,EACJ,KAAM,OACN,QAAS,GAAQ,EAAQ,IAAI,CAAC,KAAW,GAAO,QAAQ,EAAE,KAAK,IAAI,CACrE,CACF,CAAC,EAID,IAAM,EAAc,CAAC,GAAG,CAAO,EACzB,GAAO,EAAW,KAAK,CAAQ,EAC/B,GAAmB,GAAK,OAAS,EACvC,GAAI,IAAoB,EAAY,OAAS,EAC3C,EAAW,OAAO,EAAU,CAC1B,KAAM,GAAmB,GAAK,GAAK,KACnC,QAAS,GAAK,QAAQ,OACpB,CAAC,IAAW,CAAC,EAAY,KAAK,CAAC,KAAS,GAAK,KAAO,EAAO,EAAE,CAC/D,CACF,CAAC,EAiBH,GACE,CAjBe,MAAM,GACrB,EACA,CAAC,CAAE,GAAI,EAAW,KAAM,OAAQ,OAAM,CAAC,EACvC,IAAM,CACJ,GACE,CAAC,EAAM,WACP,EAAW,SACX,EAAgB,UAAY,EAE5B,EAAW,MAAM,EAAU,CAAO,EAClC,GAAkB,QAAU,EAC5B,EAAkB,EAAgB,EAAI,GAG1C,CAAE,KAAM,EAAQ,QAAS,CAAC,GAAG,CAAO,CAAE,CACxC,IAGG,EAAgB,UAAY,GAC1B,CAAC,EAAM,WAAa,EAAgB,UAAY,GACnD,CACA,EAAmB,CAAC,KAClB,GAAQ,OAAO,CAAC,KAAY,GAAQ,KAAO,CAAS,CACtD,EAGA,IAAM,EAAM,EAAgB,QACtB,GAAU,EAAW,KAAK,CAAG,EACnC,EAAW,OAAO,EAAK,IACjB,IAAoB,CAAC,GAAQ,KAAO,CAAE,KAAM,CAAO,EAAI,CAAC,EAC5D,QAAS,CACP,GAAG,EAAY,OACb,CAAC,KACC,CAAC,GAAQ,QAAQ,KAAK,CAAC,KAAS,GAAK,KAAO,GAAO,EAAE,CACzD,EACA,GAAG,GAAQ,OACb,CACF,CAAC,IAGL,CACE,EACA,EAAM,UACN,EAAM,QACN,EACA,EACA,GACA,EACA,EACA,EACA,EAAe,MACjB,CACF,EAEM,GAAS,CAAC,IAA4C,CAC1D,EAAM,eAAe,EAChB,GAAa,CAAK,GAGnB,GAAoB,cACxB,MAAO,EAA8B,IAAqC,CACxE,GAAI,CAAC,EAAM,WAAa,EAAS,OACjC,MAAM,GAAU,EAAM,UAAW,CAC/B,GAAwB,EAAU,CAAQ,CAC5C,CAAC,GAEH,CAAC,EAAM,UAAW,GAAW,CAAO,CACtC,EAEM,GAAqB,cACzB,MAAO,IAA+C,CACpD,GAAI,EAAO,OAAS,SAAU,CAC5B,MAAM,GAAa,EAAO,MAAM,EAChC,OAEF,GAAI,CAAC,EAAM,WAAa,EAAS,OACjC,EAAW,EAAI,EACf,EAAS,IAAI,EACb,GAAI,CACF,IAAM,EAAS,MAAM,EAAW,UAAU,CACxC,eAAgB,EAAM,UACtB,OAAQ,CACN,KAAM,QACN,MAAO,EAAO,SACV,EAAO,UAAY,CAAE,UAAW,EAAO,SAAU,EAAI,CAAC,CAC5D,CACF,CAAC,EACD,GAAI,CAAC,EAAW,SAAW,EAAgB,UAAY,EAAU,OACjE,EAAmB,CAAC,IAAY,CAC9B,GAAG,EACH,CACE,GAAI,OAAO,WAAW,EACtB,KAAM,YACN,QAAS,EAAO,QACZ,EAAO,MAAQ,CAAE,MAAO,EAAO,KAAM,EAAI,CAAC,CAChD,CACF,CAAC,EACD,MAAO,EAAO,CACd,GAAI,EAAW,SAAW,EAAgB,UAAY,EACpD,EAAS,GAAa,EAAO,oBAAoB,CAAC,SACpD,CACA,GAAI,EAAW,SAAW,EAAgB,UAAY,EACpD,EAAW,EAAK,IAGtB,CAAC,EAAY,EAAM,UAAW,EAAS,GAAc,CAAQ,CAC/D,EAEM,GAAa,cACjB,MAAO,IAAiD,CACtD,GAAI,EAAe,SAAW,EAAS,SAAW,EAAG,OACrD,IAAM,EAAQ,OAAO,EAiDrB,GAhDA,EAAe,QAAU,EACzB,GAAa,EAAI,EACjB,GAAkB,CAAC,IAAY,CAC7B,GAAG,EAAQ,OACT,CAAC,IAAS,CAAC,EAAS,KAAK,CAAC,IAAY,EAAQ,KAAO,EAAK,EAAE,CAC9D,EACA,GAAG,EAAS,IAAI,CAAC,KAAgC,CAC/C,GAAI,EAAQ,GACZ,KAAM,EAAQ,KACd,OAAQ,WACV,EAAE,CACJ,CAAC,EACD,MAAM,QAAQ,IACZ,EAAS,IAAI,MAAO,IAA2B,CAC7C,GAAI,CACF,IAAM,EAAS,MAAM,EAAW,OAC9B,EAAQ,KACR,EAAQ,KAAK,IACf,EACA,GACE,EAAe,UAAY,GAC3B,EAAgB,UAAY,EAE5B,OACF,EAAW,CAAC,IAAY,CAAC,GAAG,EAAS,CAAM,CAAC,EAC5C,GAAkB,CAAC,IACjB,EAAQ,OAAO,CAAC,IAAS,EAAK,KAAO,EAAQ,EAAE,CACjD,EACA,MAAO,EAAO,CACd,GACE,EAAe,UAAY,GAC3B,EAAgB,UAAY,EAE5B,OACF,GAAkB,CAAC,IACjB,EAAQ,IAAI,CAAC,IACX,EAAK,KAAO,EAAQ,GAChB,IACK,EACH,OAAQ,SACR,MAAO,GAAa,EAAO,eAAe,CAC5C,EACA,CACN,CACF,GAEH,CACH,EACI,EAAe,UAAY,EAC7B,EAAe,QAAU,KACzB,GAAa,EAAK,GAGtB,CAAC,EAAY,EAAU,CAAU,CACnC,EAEM,GAAc,cAClB,MAAO,IAAwD,CAC7D,IAAM,EAAQ,MAAM,KAAK,EAAM,OAAO,OAAS,CAAC,CAAC,EACjD,EAAM,OAAO,MAAQ,GACrB,MAAM,GACJ,EAAM,IAAI,CAAC,KAAU,CACnB,GAAI,OAAO,WAAW,EACtB,OACA,OAAQ,WACV,EAAE,CACJ,GAEF,CAAC,EAAU,CACb,EAEM,GAAiB,cAAY,SAA2B,CAC5D,GACE,CAAC,EAAM,WACP,GACA,GACA,GACA,EAAQ,QACR,EAAe,OAEf,OACF,EAAW,EAAI,EACf,GAAa,EAAI,EACjB,GAAI,CAKF,GAJA,MAAM,EAAW,eAAe,EAAM,SAAS,EAC/C,MAAM,EAAY,kBAAkB,CAClC,SAAU,EAAe,QAC3B,CAAC,EACG,EAAW,SAAW,EAAgB,UAAY,EACpD,EAAkB,OAAW,EAAI,EACnC,MAAO,EAAO,CACd,GAAI,EAAW,SAAW,EAAgB,UAAY,EACpD,EAAS,GAAa,EAAO,oCAAoC,CAAC,SACpE,CACA,GAAI,EAAW,SAAW,EAAgB,UAAY,EACpD,EAAW,EAAK,EAChB,GAAa,EAAK,IAGrB,CACD,EACA,EACA,EAAM,UACN,EACA,EACA,EACA,EACA,EAAQ,OACR,EAAe,OACf,CACF,CAAC,EAEK,GAAkB,OAAO,YAC7B,EAAM,WAAW,QAAQ,CAAC,IACxB,EAAU,QAAU,OAAY,CAAC,EAAI,CAAC,CAAC,EAAU,GAAI,EAAU,KAAK,CAAC,CACvE,CACF,EAEA,OACE,SAgbE,MAhbF,CACE,UAAW,EAAU,SAAU,GAAQ,MAAO,EAAW,IAAI,EAC7D,YAAU,OACV,oBAAkB,GAHpB,SAgbE,CA3aA,SAAC,GAAD,CACE,aAAa,OACb,WAAY,CACV,MAAO,EAAM,MACb,WAAY,EAAM,WAClB,iBAAkB,KAClB,kBAAmB,GACnB,mBACA,iBAAkB,EAAM,iBACxB,gBAAiB,EAAM,eACzB,GAVF,qBAWA,EACA,SA8ZE,MA9ZF,CACE,UAAW,GACT,oBACA,EAAW,MACX,GAAI,MACJ,IAAuB,GAAI,cAC7B,EANF,SA8ZE,CAtZA,SAWE,QAXF,CAAO,UAAW,GAAS,+BAAgC,GAAI,IAAI,EAAnE,SACE,SAAC,GAAD,CACE,WAAW,UACX,MAAO,EAAM,MACb,OAAQ,KACR,SAAU,EAAM,iBAChB,WAAY,EAAM,WAClB,gBAAiB,GACjB,gBAAiB,GACjB,kBAAmB,EAAM,iBAR3B,qBASA,GAVF,qBAWE,EACF,SAyYE,OAzYF,CACE,UAAW,EACT,wBACA,EAAW,MACX,GAAW,KACb,EALF,SAyYE,CAlYA,SAqCE,MArCF,UACE,SAAC,GAAD,CACE,MAAO,CACL,MAAO,OACP,OAAQ,CAAC,EACT,OAAQ,GAAwB,SAAS,CAC3C,EACA,OACE,SA0BE,MA1BF,CACE,UAAW,EACT,2BACA,EAAW,OACb,EAJF,SA0BE,CApBA,SAgBE,OAhBF,CACE,IAAK,GACL,UAAW,EACT,qCACA,IAAmB,EAAW,cAChC,EALF,SAOE,SAQE,EARF,CACE,gBAAe,GACf,gBAAc,SACd,QAAQ,UACR,KAAK,SACL,QAAS,IAAM,GAAqB,EAAI,EAL1C,0CAQE,GAfJ,qBAgBE,EACF,SAEE,EAFF,CAAQ,KAAK,SAAS,QAAS,IAAM,EAAkB,EAAvD,kDAEE,IAzBJ,qBA0BE,GAjCN,qBAmCA,GApCF,qBAqCE,EACF,SAwBE,GAxBF,CACE,KAAM,GACN,aAAc,CAAC,IAAS,CACtB,GAAqB,CAAI,GAH7B,SAME,SAiBE,GAjBF,CACE,mBAAkB,OAClB,iBAAkB,CAAC,IAAU,CAC3B,EAAM,eAAe,EACrB,GAAqB,SAAS,cAAc,QAAQ,GAAG,MAAM,GAJjE,SAiBE,CAVA,SAA4B,GAA5B,gDAA4B,EAC5B,SAAC,GAAD,IACM,GACJ,MAAK,GACL,gBAAiB,EAAM,UACvB,QAAS,EAAc,UACvB,SAAU,GACV,MAAO,IAAM,EAAkB,EAC/B,SAAU,GAPZ,qBAQA,IAhBF,qBAiBE,GAvBJ,qBAwBE,EACF,SAkUE,MAlUF,CACE,UAAW,EACT,mBACA,EAAW,KACX,CAAC,IAAmB,EAAW,mBACjC,EALF,SAkUE,CA3TC,IACC,SAAC,GAAD,IACM,GACJ,gBAAiB,EAAM,UACvB,QAAS,EAAc,UACvB,SAAU,GACV,MAAO,IAAM,EAAkB,EAC/B,SAAU,GANZ,qBAOA,EAEF,SAgTE,UAhTF,CACE,UAAW,EAAU,qBAAsB,EAAW,MAAM,EAC5D,aAAW,eAFb,SAgTE,CA5SA,SAiFE,SAjFF,CACE,UAAW,EACT,0BACA,EAAW,WACX,CAAC,EAAM,WACL,EAAgB,SAAW,GAC3B,EAAW,eACf,EAPF,SAiFE,CAxEA,SAiDE,MAjDF,CACE,UAAW,EACT,wBACA,EAAW,QACb,EAJF,SAiDE,CA3CA,SASE,KATF,CACE,UAAW,EACT,8BACA,EAAW,MACX,GAAiB,gBACnB,EALF,SAOG,GAAgB,QACd,EAAM,UAAY,eAAiB,qBARxC,qBASE,EACD,GACC,SAAC,GAAD,CAEE,MAAO,EAAe,MACtB,SAAU,MAAO,IAAyB,CACxC,IAAM,EAAS,MAAM,EAAW,cAC9B,EAAe,GACf,CACF,EACA,GAAI,CAAC,EAAO,QACV,MAAU,MACR,wCACF,EACF,EAAY,eACV,CAAE,SAAU,EAAe,QAAS,EACpC,CAAC,IACC,GAAO,IAAI,CAAC,IACV,EAAQ,KAAO,EAAe,GAC1B,IAAK,EAAS,MAAO,EAAO,KAAM,EAClC,CACN,CACJ,EACK,EAAY,kBAAkB,CACjC,SAAU,EAAe,QAC3B,CAAC,IAtBE,EAAe,GADtB,cAyBA,EAED,IACC,SAEE,IAFF,CAAG,KAAK,SAAR,2FAEE,IA/CN,qBAiDE,EACD,EAAM,WAAa,CAAC,GACnB,SAmBE,EAnBF,CACE,UAAU,4BACV,QAAQ,QACR,KAAK,SACL,QAAS,IAAM,KAAK,GAAe,EACnC,SACE,GACA,GACA,QAAQ,CAAK,GACb,EAAQ,OAAS,GACjB,EAAe,OAAS,EAE1B,MACE,GAAS,EAAQ,QAAU,EAAe,OACtC,2CACA,OAfR,SAkBG,GAAY,aAAe,WAlB9B,qBAmBE,EACA,OAhFN,qBAiFE,GACA,EAAM,YAAc,MAAQ,EAAgB,OAAS,IACrD,SAOE,GAPF,CAAgC,WAAY,EAAM,UAAlD,SACE,SAAC,GAAD,CACE,MAAO,GACP,SAAU,EACV,SAAU,GAAQ,UAAY,CAAC,EAC/B,QAAS,GAJX,qBAKA,GANF,qBAOE,EAEJ,SAuKE,MAvKF,CACE,IAAK,GACL,SAAU,EACV,KAAK,SACL,aAAW,wBACX,SAAU,CAAC,IAAU,CACnB,IAAM,EAAS,EAAM,cACf,EACJ,EAAO,aACL,EAAO,aACP,EAAO,WACT,GACF,GAAgB,QAAU,EAC1B,GAAoB,CAAC,CAAU,GAEjC,UAAW,EACT,4BACA,EAAW,YACb,EAlBF,SAoBE,SAkJE,MAlJF,CACE,UAAW,EACT,yBACA,EAAW,UACb,EAJF,SAkJE,CA5IC,EAAc,OACb,SAeE,UAfF,CAAS,KAAK,QAAd,SAeE,CAdA,SAKE,IALF,UAKE,CAJC,GAAe,OAAS,EACrB,uCACA,GAHN,2DAKE,EACF,SAOE,EAPF,CACE,KAAK,SACL,QAAQ,QACR,SAAU,EAAc,WACxB,QAAS,IAAM,KAAK,EAAc,QAAQ,EAJ5C,oDAOE,IAdJ,qBAeE,EAEH,EAAc,WACf,EAAM,WACN,EAAgB,SAAW,EACzB,SAOE,IAPF,CACE,UAAW,EACT,oBACA,EAAW,KACb,EAJF,uDAOE,EACA,KACH,CAAC,EAAc,QACf,CAAC,EAAM,WAAa,CAAC,EAAc,YACpC,EAAgB,SAAW,EACzB,SAAC,GAAD,wBAAgB,EACd,KACH,EAAgB,IAAI,CAAC,IACpB,SAAC,GAAD,CAEE,QAAS,EACT,OAAQ,EACR,SAAU,GACV,WAAY,IAJP,EAAQ,GADf,cAMA,CACD,EACA,GAAQ,UAAU,IAAI,CAAC,IACtB,SAAC,GAAD,CAEE,SAAU,EACV,SAAU,EACV,WAAY,IAHP,EAAS,WADhB,cAKA,CACD,EACA,EACC,SAQE,IARF,CACE,UAAW,EACT,4BACA,EAAW,KACb,EACA,KAAK,SALP,0CAQE,EACA,KACH,GACC,SA6DE,UA7DF,CACE,UAAW,EACT,2BACA,EAAW,KACb,EACA,KAAM,EAAY,OAAS,UAAY,SAAW,QAClD,cAAY,OANd,SA6DE,CArDA,SAME,SANF,UACG,EAAY,OAAS,UAClB,UACA,EAAY,OAAS,eACnB,kBACA,mBALR,qBAME,EACF,SAIE,IAJF,0JAIE,EACD,EAAY,QAAU,SAAyB,IAAzB,UAAI,EAAY,QAAhB,qBAAyB,EAC/C,EAAY,OACX,8BAqCE,CApCA,SAGE,IAHF,iHAGE,EACF,SAyBE,EAzBF,CACE,KAAK,SACL,QAAQ,QACR,SACE,GACA,GACA,QAAQ,CAAK,GACb,EAAQ,OAAS,EAEnB,QAAS,IAAM,CACb,GACE,CAAC,EAAY,OACb,GACA,EAAQ,OAAS,EAEjB,OACF,EAAS,EAAY,MAAM,IAAI,EAC/B,EAAW,CAAC,GAAG,EAAY,MAAM,OAAO,CAAC,EACzC,GAAgB,SACZ,QAAQ,qBAAqB,GAC7B,cAAmC,UAAU,GAC7C,MAAM,GArBd,0DAyBE,GACA,GAAS,EAAQ,OAAS,IAC1B,SAGE,IAHF,oHAGE,IAnCN,qBAqCE,IA3DN,qBA6DE,EAEH,GACC,SASE,IATF,CACE,UAAW,EACT,oBACA,EAAW,MACX,EAAW,KACb,EACA,KAAK,QANP,SAQG,IARH,qBASE,EACA,KACJ,SAAC,MAAD,CAAK,IAAK,IAAV,qBAAwB,IAjJ1B,qBAkJE,GAtKJ,qBAuKE,EACF,SAAC,GAAD,CACE,eACE,GACI,IAAY,CACV,GAAgB,QAAU,GAC1B,GAAoB,EAAK,EACzB,IAAM,EAAS,GAAgB,QAC/B,GAAI,EACF,EAAO,MAAM,CAAE,cAAe,EAAK,CAAC,EACpC,EAAO,UAAY,EAAO,cAG9B,OAEN,MAAO,EACP,QAAS,EACT,UAAW,EACX,QAAS,EACT,eAAgB,EAChB,cAAe,CAAC,IAAY,KAAK,GAAW,CAAC,CAAO,CAAC,EACrD,gBAAiB,CAAC,IAChB,GAAkB,CAAC,IACjB,EAAQ,OAAO,CAAC,IAAY,EAAQ,KAAO,CAAE,CAC/C,EAEF,QAAS,EACT,OAAQ,GACR,eAAgB,CAAC,IACf,EAAW,CAAC,IACV,EAAQ,OAAO,CAAC,IAAW,EAAO,KAAO,CAAE,CAC7C,EAEF,QAAS,GACT,SAAU,GACV,OACE,EAAgB,QACZ,IAAY,EAAgB,SAAS,MAAM,EAC3C,QArCR,qBAuCA,IA/SF,qBAgTE,IAjUJ,qBAkUE,IAxYJ,qBAyYE,IA7ZJ,qBA8ZE,IA/aJ,qBAgbE,EAIN,SAAS,EAAW,CAAC,EAaJ,CACf,OACE,SAoKE,QApKF,CACE,UACE,EAAM,MACF,EAAU,6BAA8B,EAAW,MAAM,EACzD,EAAU,uBAAwB,EAAW,QAAQ,EAE3D,aAAW,gBANb,SAoKE,CA5JC,EAAM,OACL,SA2BE,SA3BF,CACE,UAAW,EACT,4BACA,EAAW,UACb,EAJF,SA2BE,CArBA,SAYE,MAZF,CACE,UAAW,EAAU,wBAAyB,EAAW,QAAQ,EADnE,SAGE,SAQE,KARF,CACE,UAAW,EACT,6BACA,EAAW,WACX,GAAiB,OACnB,EALF,0CAQE,GAXJ,qBAYE,EACF,SAOE,SAPF,CACE,UAAW,EAAU,kBAAmB,EAAW,MAAM,EACzD,KAAK,SACL,aAAW,mBACX,QAAS,EAAM,MAJjB,mCAOE,IA1BJ,qBA2BE,EAEJ,SAoEE,MApEF,CACE,UAAW,EACT,+BACA,EAAW,eACb,EAJF,SAoEE,CA9DA,SAAC,GAAD,CACE,MAAM,uBACN,YAAY,uBACZ,MAAO,EAAM,OACb,SAAU,EAAM,UAJlB,qBAKA,EACA,SAcE,GAdF,CACE,OAAQ,EAAW,oBACnB,aAAW,qBACX,MAAO,EAAM,KAAK,SAAW,WAAa,SAC1C,SAAU,CAAC,IACT,EAAM,OAAO,IACR,EAAM,KACT,SAAU,EAAM,OAAO,QAAU,WACjC,OAAQ,CACV,CAAC,EATL,SAcE,CAFA,SAA6C,SAA7C,CAAQ,MAAM,SAAd,sDAA6C,EAC7C,SAAiD,SAAjD,CAAQ,MAAM,WAAd,wDAAiD,IAbnD,qBAcE,GACA,EAAM,KAAK,OAAS,GAAK,EAAM,SAAS,QAAU,KAClD,SA8BE,MA9BF,CACE,UAAW,EAAU,GAAI,EAAW,OAAO,EAC3C,aAAW,qBACX,KAAK,QAHP,SA8BE,CAzBA,SAaE,EAbF,CACE,KAAK,SACL,QAAQ,QACR,KAAK,KACL,SAAU,EAAM,SAAW,EAAM,KAAK,SAAW,EACjD,QAAS,IACP,EAAM,OAAO,IACR,EAAM,KACT,OAAQ,KAAK,IAAI,EAAG,EAAM,KAAK,OAAS,EAAE,CAC5C,CAAC,EATL,0CAaE,EACF,SAUE,EAVF,CACE,KAAK,SACL,QAAQ,QACR,KAAK,KACL,SAAU,EAAM,SAAW,EAAM,SAAS,OAAS,GACnD,QAAS,IACP,EAAM,OAAO,IAAK,EAAM,KAAM,OAAQ,EAAM,KAAK,OAAS,EAAG,CAAC,EANlE,sCAUE,IA7BJ,qBA8BE,EAEH,EAAM,OACL,SAKE,IALF,CAAG,KAAK,QAAR,SAKE,CAJC,EAAM,MAAO,IACd,SAEE,EAFF,CAAQ,KAAK,SAAS,QAAQ,QAAQ,QAAS,EAAM,QAArD,gDAEE,IAJJ,qBAKE,IAlEN,qBAoEE,EACF,SAwDE,MAxDF,CACE,UAAW,EACT,2BACA,EAAW,WACb,EAJF,SAwDE,CAlDC,EAAM,QACL,SAEE,IAFF,CAAG,UAAW,EAAU,oBAAqB,EAAW,KAAK,EAA7D,mDAEE,EACA,KACH,CAAC,EAAM,SAAW,CAAC,EAAM,OAAS,EAAM,SAAS,SAAW,EAC3D,SAQE,IARF,CAAG,UAAW,EAAU,oBAAqB,EAAW,KAAK,EAA7D,SACG,EAAM,KAAK,MACR,sCACA,EAAM,KAAK,OAAS,EAClB,yBACA,EAAM,KAAK,SACT,6BACA,yBAPV,qBAQE,EACA,KACH,EAAM,SAAS,IAAI,CAAC,IACnB,SA+BE,SA/BF,CACE,UAAW,EACT,sBACA,EAAW,QACX,EAAQ,KAAO,EAAM,iBAAmB,EAAW,aACrD,EACA,cACE,EAAQ,KAAO,EAAM,gBAAkB,OAAS,QAElD,KAAK,SAEL,QAAS,IAAM,EAAM,SAAS,EAAQ,EAAE,EAX1C,SA+BE,CAlBA,SAOE,SAPF,CACE,UAAW,EACT,4BACA,EAAW,YACb,EAJF,SAMG,EAAQ,OANX,qBAOE,EACF,SASE,OATF,CACE,UAAW,EACT,2BACA,EAAW,SACb,EACA,SAAU,EAAQ,aAClB,MAAO,EAAQ,aANjB,SAQG,GAAkB,EAAQ,YAAY,GARzC,qBASE,IApBG,EAAQ,GAVf,cA+BE,CACH,IAvDH,qBAwDE,IAnKJ,qBAoKE,EAIN,SAAS,EAAc,EAAiB,CACtC,OACE,SAWE,UAXF,CACE,UAAW,EACT,oBACA,EAAW,MACX,EAAW,iBACb,EACA,aAAW,mBANb,SAQE,SAEE,IAFF,CAAG,UAAW,EAAU,GAAI,EAAW,QAAQ,EAA/C,sGAEE,GAVJ,qBAWE,EAIN,SAAS,EAAQ,CAAC,EAQD,CACf,OACE,SAkDE,UAlDF,CACE,UAAW,EAAU,mBAAoB,EAAW,IAAI,EACxD,YAAW,EAAM,QAAQ,KAF3B,SAkDE,CA9CA,SAEE,OAFF,CAAM,UAAW,EAAU,yBAA0B,EAAW,OAAO,EAAvE,SACG,EAAM,QAAQ,OAAS,OAAS,MAAQ,SAD3C,qBAEE,EACF,SA0CE,MA1CF,CACE,UAAW,EACT,wBACA,EAAW,SACX,EAAM,QAAQ,OAAS,QAAU,EAAW,QAC9C,EALF,SA0CE,CAnCC,EAAM,QAAQ,QACb,EAAM,QAAQ,OAAS,YACrB,SAKE,GALF,CACE,UAAW,EAAU,oBAAqB,EAAW,KAAK,EAC1D,aAAa,OAFf,SAIG,EAAM,QAAQ,SAJjB,qBAKE,EAEF,SAEE,IAFF,CAAG,UAAW,EAAU,mBAAoB,EAAW,SAAS,EAAhE,SACG,EAAM,QAAQ,SADjB,qBAEE,EAEF,KACH,EAAM,QAAQ,aAAa,IAAI,CAAC,IAC/B,SAKE,IALF,CACE,UAAW,EAAU,qBAAsB,EAAW,MAAM,EAD9D,SAIG,EAAW,UAFP,GAAG,EAAW,YAAY,EAAW,YAF5C,cAKE,CACH,EACA,EAAM,QAAQ,OAAO,OACpB,SAUE,MAVF,CAAK,UAAW,EAAU,oBAAqB,EAAW,KAAK,EAA/D,SACG,EAAM,QAAQ,MAAM,IAAI,CAAC,IACxB,SAAC,GAAD,CACE,KAAM,EACN,OAAQ,EAAM,OAEd,SAAU,EAAM,SAChB,WAAY,EAAM,YAFb,GAAG,EAAK,QAAQ,EAAK,KAH5B,cAMA,CACD,GATH,qBAUE,EACA,OAzCN,qBA0CE,IAjDJ,qBAkDE,EAIN,SAAS,EAAW,CAAC,EAQJ,CACf,IAAQ,QAAS,EACjB,GAAI,EAAK,OAAS,UAChB,OACE,SAwBE,UAxBF,CAAS,UAAW,EAAU,mBAAoB,EAAW,IAAI,EAAjE,SAwBE,CAvBA,SAIE,OAJF,CACE,UAAW,EAAU,0BAA2B,EAAW,MAAM,EADnE,yCAIE,EACD,EAAK,MAAQ,SAAsB,SAAtB,UAAS,EAAK,OAAd,qBAAsB,EAAU,KAC9C,SAgBE,MAhBF,CACE,UAAW,EAAU,2BAA4B,EAAW,OAAO,EADrE,SAGG,EAAK,QAAQ,IAAI,CAAC,IACjB,SAUE,SAVF,CACE,UAAW,EACT,0BACA,EAAW,MACb,EACA,KAAK,SAEL,QAAS,IAAM,KAAK,EAAM,SAAS,CAAM,EAP3C,SASG,EAAO,OAHH,EAAO,GANd,cAUE,CACH,GAfH,qBAgBE,IAvBJ,qBAwBE,EAGN,GAAI,EAAK,OAAS,UAChB,OACE,SAiBE,UAjBF,CAAS,UAAW,EAAU,mBAAoB,EAAW,IAAI,EAAjE,SAiBE,CAhBA,SAIE,OAJF,CACE,UAAW,EAAU,0BAA2B,EAAW,MAAM,EADnE,yCAIE,EACF,SAUE,KAVF,UACG,EAAK,QAAQ,IAAI,CAAC,IACjB,SAME,KANF,UACG,EAAO,IACN,SAAsD,IAAtD,CAAG,KAAM,EAAO,IAAhB,SAAsB,EAAO,OAAS,EAAO,QAA7C,qBAAsD,EAErD,EAAO,OAAS,EAAO,QAJnB,EAAO,GAAhB,cAME,CACH,GATH,qBAUE,IAhBJ,qBAiBE,EAGN,GAAI,EAAK,OAAS,aAChB,OAAO,SAAC,GAAD,CAAsB,KAAM,EAAM,OAAQ,EAAM,QAAhD,qBAAwD,EAEjE,IAAM,EAAU,EAAK,QAAU,qBACzB,EAA+B,CACnC,WAAY,EAAK,GACjB,WAAY,EAAK,YAAc,EAAK,GACpC,SAAU,EAAK,YACX,EAAK,MAAQ,CAAE,MAAO,EAAK,KAAM,EAAI,CAAC,KACtC,EAAK,QAAU,CAAE,MAAO,EAAK,OAAQ,EAAI,CAAC,CAChD,EACA,OACE,SA8CE,UA9CF,CAAS,UAAW,EAAU,mBAAoB,EAAW,IAAI,EAAjE,SA8CE,CA7CA,SAEE,OAFF,CAAM,UAAW,EAAU,0BAA2B,EAAW,MAAM,EAAvE,SACG,EAAU,oBAAsB,mBADnC,qBAEE,EACF,SAAwB,SAAxB,UAAS,EAAK,SAAd,qBAAwB,EACvB,EAAK,QACJ,SAOE,IAPF,CACE,UAAW,EACT,2BACA,EAAW,SACb,EAJF,SAMG,EAAK,SANR,qBAOE,EACA,KACH,EACC,SA4BE,MA5BF,CACE,UAAW,EACT,+BACA,EAAW,OACb,EAJF,SA4BE,CAtBA,SASE,SATF,CACE,UAAW,EACT,8BACA,EAAW,MACb,EACA,KAAK,SACL,QAAS,IAAM,KAAK,EAAM,WAAW,EAAU,EAAK,EANtD,yCASE,EACF,SAWE,SAXF,CACE,UAAW,EACT,8BACA,EAAW,OACX,EAAW,aACb,EACA,eAAa,OACb,KAAK,SACL,QAAS,IAAM,KAAK,EAAM,WAAW,EAAU,EAAI,EARrD,yCAWE,IA3BJ,qBA4BE,EACA,OA7CN,qBA8CE,EAIN,SAAS,EAAY,CAAC,EAOL,CACf,OACE,SAoCE,UApCF,CAAS,UAAW,EAAU,uBAAwB,EAAW,IAAI,EAArE,SAoCE,CAnCA,SAEE,OAFF,CAAM,UAAW,EAAU,0BAA2B,EAAW,MAAM,EAAvE,mDAEE,EACF,SAA2D,SAA3D,UAAS,EAAM,SAAS,OAAS,EAAM,SAAS,UAAhD,qBAA2D,EAC3D,SA8BE,MA9BF,CACE,UAAW,EACT,+BACA,EAAW,OACb,EAJF,SA8BE,CAxBA,SAUE,SAVF,CACE,UAAW,EACT,8BACA,EAAW,MACb,EACA,KAAK,SACL,SAAU,EAAM,SAChB,QAAS,IAAM,KAAK,EAAM,WAAW,EAAM,SAAU,EAAK,EAP5D,yCAUE,EACF,SAYE,SAZF,CACE,UAAW,EACT,8BACA,EAAW,OACX,EAAW,aACb,EACA,eAAa,OACb,KAAK,SACL,SAAU,EAAM,SAChB,QAAS,IAAM,KAAK,EAAM,WAAW,EAAM,SAAU,EAAI,EAT3D,yCAYE,IA7BJ,qBA8BE,IAnCJ,qBAoCE,EAIN,SAAS,EAAQ,CAAC,EAeD,CACf,IAAM,EAAU,CAAC,IAAoD,CACnE,GACE,EAAM,MAAQ,SACd,CAAC,EAAM,UACP,CAAC,EAAM,YAAY,YAEnB,EAAM,eAAe,EACrB,EAAM,cAAc,MAAM,cAAc,GAG5C,OACE,SA+KE,SA/KF,CAAQ,UAAW,EAAU,uBAAwB,EAAW,QAAQ,EAAxE,SA+KE,CA9KC,EAAM,gBACL,SAEE,EAFF,CAAQ,KAAK,SAAS,QAAQ,QAAQ,QAAS,EAAM,eAArD,kDAEE,EAEH,EAAM,eAAe,OAAS,GAC7B,SA2CE,KA3CF,CACE,UAAW,EACT,0BACA,EAAW,UACb,EACA,aAAW,uBALb,SAOG,EAAM,eAAe,IAAI,CAAC,IACzB,SAiCE,KAjCF,CAEE,UAAW,EAAU,qBAAsB,EAAW,MAAM,EAF9D,SAiCE,CA7BA,SAKE,OALF,CAAM,KAAM,EAAQ,SAAW,SAAW,QAAU,SAApD,SAKE,CAJC,EAAQ,KAAK,KADhB,IACuB,IACpB,EAAQ,SAAW,YAChB,aACC,EAAQ,OAAS,kBAJxB,qBAKE,EACD,EAAQ,SAAW,UAClB,8BAoBE,CAnBA,SASE,EATF,CACE,KAAK,SACL,QAAQ,QACR,KAAK,KACL,aAAY,mBAAmB,EAAQ,KAAK,OAC5C,SAAU,EAAM,WAAa,EAAM,SAAW,EAAM,OACpD,QAAS,IAAM,EAAM,cAAc,CAAO,EAN5C,uCASE,EACF,SAQE,EARF,CACE,KAAK,SACL,QAAQ,QACR,KAAK,KACL,aAAY,yBAAyB,EAAQ,KAAK,OAClD,QAAS,IAAM,EAAM,gBAAgB,EAAQ,EAAE,EALjD,yCAQE,IAnBJ,qBAoBE,IA9BC,EAAQ,GADf,cAiCE,CACH,GA1CH,qBA2CE,EAEH,EAAM,QAAQ,OAAS,EACtB,SAwBE,MAxBF,CACE,UAAW,EACT,0BACA,EAAW,UACb,EAJF,SAMG,EAAM,QAAQ,IAAI,CAAC,IAClB,SAeE,OAfF,CACE,UAAW,EAAU,qBAAsB,EAAW,MAAM,EAD9D,SAeE,CAXC,EAAO,SAAU,IAClB,SASE,EATF,CACE,KAAK,SACL,QAAQ,QACR,KAAK,KACL,aAAY,UAAU,EAAO,wBAC7B,SAAU,EAAM,OAChB,QAAS,IAAM,EAAM,eAAe,EAAO,EAAE,EAN/C,mCASE,IAZG,EAAO,GAFd,cAeE,CACH,GAvBH,qBAwBE,EACA,KACJ,SA6EE,OA7EF,CACE,UAAW,EAAU,4BAA6B,EAAW,IAAI,EACjE,SAAU,EAAM,SAFlB,SA6EE,CAzEA,SAiBE,QAjBF,CACE,UAAW,EACT,4BACA,EAAW,UACb,EAJF,SAiBE,CAjBF,UAOE,SAAC,WAAD,CACE,UAAW,EAAU,sBAAuB,EAAW,KAAK,EAC5D,aAAW,UACX,mBAAiB,4BACjB,YAAY,uBACZ,MAAO,EAAM,MACb,SAAU,EAAM,OAChB,SAAU,CAAC,IAAU,EAAM,QAAQ,EAAM,OAAO,KAAK,EACrD,UAAW,GARb,qBASA,IAhBF,qBAiBE,EACF,SAsDE,MAtDF,CACE,UAAW,EACT,+BACA,EAAW,OACb,EAJF,SAsDE,CAhDA,SAmBE,QAnBF,CACE,UAAW,EACT,8BACA,EAAW,YACb,EAJF,SAmBE,CAbC,EAAM,UAAY,aAAe,eAClC,SAAC,QAAD,CACE,UAAW,EACT,2BACA,EAAW,WACb,EACA,KAAK,OACL,OAAQ,GACR,mBAAiB,8BACjB,SAAQ,GACR,SAAU,EAAM,QAAU,EAAM,SAAW,EAAM,UACjD,SAAU,CAAC,IAAU,KAAK,EAAM,QAAQ,CAAK,GAV/C,qBAWA,IAlBF,qBAmBE,EACD,EAAM,OACL,SAEE,EAFF,CAAQ,KAAK,SAAS,SAAQ,GAA9B,4CAEE,EACA,EAAM,QACR,SAQE,EARF,CACE,KAAK,SACL,QAAQ,UACR,QAAS,EAAM,OACf,SAAU,CAAC,EAAM,OACjB,MAAM,iEALR,sCAQE,EAEF,SAWE,EAXF,CACE,UAAU,8BACV,KAAK,SACL,aAAW,eACX,SACE,EAAM,WACN,EAAM,eAAe,OAAS,GAC7B,CAAC,EAAM,MAAM,KAAK,GAAK,EAAM,QAAQ,SAAW,EAPrD,sCAWE,IApDN,qBAsDE,IA5EJ,qBA6EE,EACF,SAQE,QARF,CACE,GAAG,4BACH,UAAW,EACT,4BACA,EAAW,YACb,EALF,4EAQE,EACF,SAQE,UARF,CACE,UAAW,EACT,8BACA,EAAW,YACb,EAJF,SAQE,CAFA,SAAgC,UAAhC,wDAAgC,EAChC,SAA4D,IAA5D,CAAG,GAAG,8BAAN,SAAqC,IAArC,qBAA4D,IAP9D,qBAQE,IA9KJ,qBA+KE,EAIN,SAAS,EAAU,CAAC,EAKH,CACf,OACE,SAgLE,QAhLF,CACE,UAAW,EAAU,sBAAuB,EAAW,WAAW,EAClE,SAAU,EACV,aAAW,cAHb,SAKE,SA0KE,MA1KF,CAAK,UAAW,EAAU,2BAA4B,EAAW,KAAK,EAAtE,SA0KE,CAzKC,EAAM,SAAS,eACd,SAgCE,UAhCF,CACE,UAAW,EACT,2BACA,EAAW,WACb,EAJF,SAgCE,CA1BA,SAOE,OAPF,CACE,UAAW,EACT,6BACA,EAAW,MACb,EAJF,gDAOE,EACF,SAQE,KARF,CACE,UAAW,EACT,iCACA,EAAW,YACX,GAAiB,OACnB,EALF,SAOG,EAAM,QAAQ,eAAe,WAPhC,qBAQE,EACF,SAQE,IARF,CACE,UAAW,EACT,gCACA,EAAW,QACb,EAJF,SAQE,CAFC,EAAM,QAAQ,eAAe,SANhC,KAM4C,IACzC,EAAM,QAAQ,eAAe,SAPhC,qBAQE,IA/BJ,qBAgCE,EACA,KACH,EAAM,MAAM,SAAW,GAAK,EAAM,SAAS,SAAW,EACrD,SAGE,IAHF,CAAG,UAAW,EAAU,oBAAqB,EAAW,KAAK,EAA7D,gHAGE,EACA,KACH,EAAM,MAAM,IAAI,CAAC,EAAM,IACtB,SAwDE,UAxDF,CACE,UAAW,EACT,2BACA,EAAW,WACb,EAJF,SAwDE,CAjDA,SAOE,OAPF,CACE,UAAW,EACT,6BACA,EAAW,MACb,EAJF,SAMG,EAAK,OAAS,UAAY,UAAY,YANzC,qBAOE,EACF,SAYE,KAZF,CACE,UAAW,EACT,iCACA,EAAW,YACX,GAAiB,OACnB,EALF,SAOG,EAAK,OAAS,UACV,EAAK,OAAS,GAAG,EAAK,QAAQ,mBAC/B,EAAK,OAAS,aACZ,EAAK,MACL,wBAXR,qBAYE,EACD,EAAK,OAAS,UACb,8BAgBE,CAfA,SAIE,KAJF,UACG,EAAK,QAAQ,MAAM,EAAG,CAAC,EAAE,IAAI,CAAC,IAC7B,SAAqD,KAArD,UAAqB,EAAO,OAAS,EAAO,QAAnC,EAAO,GAAhB,cAAqD,CACtD,GAHH,qBAIE,EACD,EAAK,QAAQ,OAAS,EACrB,SAOE,IAPF,CACE,UAAW,EACT,gCACA,EAAW,QACb,EAJF,SAOE,CADC,EAAK,QAAQ,OAAS,EANzB,4DAOE,EACA,OAfN,qBAgBE,EACA,EAAK,OAAS,cAAgB,EAAK,YACrC,SAOE,IAPF,CACE,UAAW,EACT,gCACA,EAAW,QACb,EAJF,SAMG,EAAK,aANR,qBAOE,EACA,OAlDC,GAAG,EAAK,QAAQ,EAAK,MAAM,IALlC,cAwDE,CACH,EACA,EAAM,SAAS,IAAI,CAAC,EAAM,IACzB,SAgCE,UAhCF,CACE,UAAW,EACT,2BACA,EAAW,WACb,EAJF,SAgCE,CAzBA,SAOE,OAPF,CACE,UAAW,EACT,6BACA,EAAW,MACb,EAJF,6CAOE,EACF,SAQE,KARF,CACE,UAAW,EACT,iCACA,EAAW,YACX,GAAiB,OACnB,EALF,SAOG,EAAK,iBAAmB,EAAK,eAPhC,qBAQE,EACF,SAOE,IAPF,CACE,UAAW,EACT,gCACA,EAAW,QACb,EAJF,SAMG,EAAK,SAAW,EAAK,QANxB,qBAOE,IA1BG,GAAG,EAAK,QAAQ,IALvB,cAgCE,CACH,EACA,EAAM,SAAS,OAAS,EACvB,SA+BE,UA/BF,CACE,UAAW,EACT,2BACA,EAAW,WACb,EAJF,SA+BE,CAzBA,SAOE,OAPF,CACE,UAAW,EACT,6BACA,EAAW,MACb,EAJF,0CAOE,EACF,SAQE,KARF,CACE,UAAW,EACT,iCACA,EAAW,YACX,GAAiB,OACnB,EALF,sDAQE,EACF,SAOE,IAPF,CACE,UAAW,EACT,gCACA,EAAW,QACb,EAJF,SAOE,CADC,EAAM,SAAS,OANlB,4CAOE,IA9BJ,qBA+BE,EACA,OAzKN,qBA0KE,GA/KJ,qBAgLE,EAIN,SAAS,EAAiB,CAAC,EAAuB,CAChD,IAAM,EAAO,IAAI,KAAK,CAAK,EAC3B,GAAI,OAAO,MAAM,EAAK,QAAQ,CAAC,EAAG,MAAO,GACzC,OAAO,IAAI,KAAK,eAAe,OAAW,CACxC,IAAK,UACL,KACE,EAAK,YAAY,IAAM,IAAI,KAAK,EAAE,YAAY,EAAI,OAAY,UAChE,MAAO,QACP,aAAc,QACd,KAAM,UACN,OAAQ,SACV,CAAC,EAAE,OAAO,CAAI,EAGhB,SAAS,EAAY,CAAC,EAAgB,EAA0B,CAC9D,OAAO,aAAiB,OAAS,EAAM,QAAU,EAAM,QAAU",
|
|
19
|
-
"debugId": "
|
|
18
|
+
"mappings": "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",
|
|
19
|
+
"debugId": "C837F93C0A7668B964756E2164756E21",
|
|
20
20
|
"names": []
|
|
21
21
|
}
|