@lemoncat7/dsh-partner 1.15.0 → 1.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +20 -1
  2. package/docs/channel-message-format.md +11 -0
  3. package/docs/notification-delivery.md +24 -0
  4. package/docs/releases/1.16.0.md +22 -0
  5. package/docs/releases/1.16.1.md +11 -0
  6. package/lib/api.js +26 -1
  7. package/lib/api.js.map +1 -1
  8. package/lib/channels/direct/discovery.d.ts.map +1 -1
  9. package/lib/channels/direct/discovery.js +17 -3
  10. package/lib/channels/direct/discovery.js.map +1 -1
  11. package/lib/channels/direct/message-format.d.ts +8 -0
  12. package/lib/channels/direct/message-format.d.ts.map +1 -0
  13. package/lib/channels/direct/message-format.js +10842 -0
  14. package/lib/channels/direct/message-format.js.map +7 -0
  15. package/lib/channels/direct/transport.d.ts +1 -0
  16. package/lib/channels/direct/transport.d.ts.map +1 -1
  17. package/lib/channels/direct/transport.js +5 -5
  18. package/lib/channels/direct/transport.js.map +1 -1
  19. package/lib/channels/manager.d.ts +3 -1
  20. package/lib/channels/manager.d.ts.map +1 -1
  21. package/lib/channels/manager.js +34 -17
  22. package/lib/channels/manager.js.map +1 -1
  23. package/lib/channels/notification-delivery.d.ts +28 -0
  24. package/lib/channels/notification-delivery.d.ts.map +1 -0
  25. package/lib/channels/notification-delivery.js +69 -0
  26. package/lib/channels/notification-delivery.js.map +1 -0
  27. package/lib/channels/notification-route.d.ts +4 -0
  28. package/lib/channels/notification-route.d.ts.map +1 -1
  29. package/lib/channels/notification-route.js +21 -0
  30. package/lib/channels/notification-route.js.map +1 -1
  31. package/lib/client-api.d.ts +7 -0
  32. package/lib/client-api.d.ts.map +1 -1
  33. package/lib/client-api.js.map +1 -1
  34. package/lib/client.d.ts.map +1 -1
  35. package/lib/client.js +562 -379
  36. package/lib/client.js.map +4 -4
  37. package/lib/domain.d.ts +8 -0
  38. package/lib/domain.d.ts.map +1 -1
  39. package/lib/domain.js.map +1 -1
  40. package/lib/heartbeat.d.ts +1 -0
  41. package/lib/heartbeat.d.ts.map +1 -1
  42. package/lib/heartbeat.js +16 -4
  43. package/lib/heartbeat.js.map +1 -1
  44. package/lib/store.js +15 -0
  45. package/lib/store.js.map +1 -1
  46. package/lib/ui/channels-panel.d.ts.map +1 -1
  47. package/lib/ui/channels-panel.js +4 -10
  48. package/lib/ui/channels-panel.js.map +1 -1
  49. package/lib/ui/notification-settings.d.ts +7 -0
  50. package/lib/ui/notification-settings.d.ts.map +1 -0
  51. package/lib/ui/notification-settings.js +33 -0
  52. package/lib/ui/notification-settings.js.map +1 -0
  53. package/package.json +9 -1
package/lib/client.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/client.tsx", "../src/workspace-ownership.ts", "../node_modules/qrcode.react/lib/esm/index.js", "../src/client.css", "../src/ui/workspace-ui.css", "../src/ui/requirement-board.css", "../src/ui/responsive-ui.css", "../src/ui/companion-picker.css", "../src/pendant/widget.css", "../src/pendant/settings-panel.css", "../src/ui/memory/memory-ui.css", "../src/ui/memory/memory-panel.tsx", "../src/client-api.ts", "../src/ui/workspace-components.tsx", "../src/ui/memory/memory-library.tsx", "../src/ui/partner-components.tsx", "../src/ui/memory/memory-detail.tsx", "../src/ui/memory/memory-cards.tsx", "../src/ui/memory/types.ts", "../src/ui/memory/memory-graph.tsx", "../src/ui/memory/history-view.tsx", "../src/ui/memory/experience-view.tsx", "../src/ui/memory/use-memory-resource.ts", "../src/ui/memory/automation-settings.tsx", "../src/ui/memory/job-feedback.tsx", "../src/ui/memory/concern-panel.tsx", "../src/ui/memory/concern-board.tsx", "../src/time-format.ts", "../src/ui/memory/concern-deletion.tsx", "../src/ui/memory/concern-editor.tsx", "../src/ui/memory/record-target-picker.tsx", "../src/ui/memory/concern-record-fields.tsx", "../src/pendant/settings-panel.tsx", "../src/pendant/settings.ts", "../src/pendant/use-settings.ts", "../src/pendant/card-image.ts", "../src/pendant/strap-preview.tsx", "../src/pendant/strap-style.ts", "../src/pendant/strap-geometry.ts", "../src/pendant/strap-texture.ts", "../src/pendant/widget.tsx", "../src/pendant/use-inbox.ts", "../src/pendant/use-placement.ts", "../src/pendant/reader.tsx", "../src/ui/companion-picker.tsx", "../src/sidebar-anchor.ts", "../src/glass-surface.tsx", "../src/ui/skills-panel.tsx", "../src/ui/skill-import-dialog.tsx", "../src/ui/requirement-board.tsx", "../src/ui/board-refresh.ts", "../src/ui/requirement-dialog.tsx", "../src/ui/requirement-tasks-panel.tsx", "../src/ui/task-board-stage.tsx", "../src/ui/task-contract-panel.tsx", "../src/ui/schedule-panel.tsx", "../src/ui/capability-editor.tsx", "../src/capabilities.ts", "../src/ui/companion-access-panel.tsx", "../src/ui/companion-draft.ts", "../src/ui/identity-editor.tsx", "../src/ui/channels-panel.tsx", "../src/ui/use-channel-status.ts", "../src/ui/identity-editor.css", "../src/ui/companion-create.tsx", "../src/main-panel-compat.ts", "../src/client-controller.tsx"],
4
- "sourcesContent": ["import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-theme/client'\nimport { observePluginWorkspace } from './workspace-ownership.js'\nimport {\n IconAgentPresetOutline16, IconChevronDownOutline14, IconChevronLeftOutline14,\n IconDataOutline16, IconEditOutline16, IconLinkOutline16, IconPlusOutline16,\n IconRefreshOutline16, IconUserOutline16, IconBrowseOutline16, IconListPenOutline16, IconPlayOutline16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { QRCodeSVG } from 'qrcode.react'\nimport baseCssText from './client.css'\nimport workspaceCssText from './ui/workspace-ui.css'\nimport requirementCssText from './ui/requirement-board.css'\nimport responsiveCssText from './ui/responsive-ui.css'\nimport pickerCssText from './ui/companion-picker.css'\nimport pendantCssText from './pendant/widget.css'\nimport pendantSettingsCssText from './pendant/settings-panel.css'\nimport memoryCssText from './ui/memory/memory-ui.css'\nimport {MemoryPanel} from './ui/memory/memory-panel.js'\nimport {ConcernPanel} from './ui/memory/concern-panel.js'\nimport { PendantSettingsPanel } from './pendant/settings-panel.js'\nimport { PartnerPendant } from './pendant/widget.js'\nimport { CompanionPicker } from './ui/companion-picker.js'\nimport { api, loadPartner, type ChannelView, type CompanionView, type LoginView, type PartnerSnapshot } from './client-api.js'\nimport { useWorkspaceTopAnchor } from './sidebar-anchor.js'\n\nimport { GlassSurface } from './glass-surface.js'\nimport { SkillsPanel } from './ui/skills-panel.js'\nimport { TaskBoardPanel } from './ui/task-board-panel.js'\nimport { SchedulePanel } from './ui/schedule-panel.js'\nimport { CapabilityEditor } from './ui/capability-editor.js'\nimport { IdentityEditor } from './ui/identity-editor.js'\nimport { ChannelsPanel } from './ui/channels-panel.js'\nimport { useChannelStatus } from './ui/use-channel-status.js'\nimport identityCssText from './ui/identity-editor.css'\nimport { Avatar, ChannelStatus as Status, ContentState as State, SectionHeading as Section, TabButton, WeixinGlyph, relativeTime } from './ui/partner-components.js'\nimport { errorMessage as message } from './ui/workspace-components.js'\nimport { CompanionCreateDialog, type NewCompanionDraft } from './ui/companion-create.js'\nimport { createPartnerController, type PartnerController as Controller } from './client-controller.js'\nimport { CAPABILITY_LABELS } from './capabilities.js'\n\nconst PLUGIN_ID = '@lemoncat7/dsh-partner'\nconst STYLE_ID = `${PLUGIN_ID}/client`\nconst cssText = `${baseCssText}\\n${workspaceCssText}\\n${pickerCssText}\\n${responsiveCssText}\\n${requirementCssText}\\n${pendantCssText}\\n${pendantSettingsCssText}\\n${memoryCssText}\\n${identityCssText}`\ntype SidebarProps = PropsRuntime<'sidebar.footer.action'>\ntype ConversationProps = PropsRuntime<'conversation'>\ntype CompanionTab = 'home' | 'identity' | 'capabilities' | 'weixin' | 'memory' | 'concerns'\ntype WorkspacePage = 'skills' | 'board' | 'schedules' | 'pendant'\ntype View = CompanionTab | WorkspacePage\n\nconst WORKSPACE_PAGES = new Set<View>(['skills', 'board', 'schedules', 'pendant'])\n\nexport const inject = ['slots', 'layout', 'sessions']\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(installStyles, 'dsh-partner: styles')\n const controller = createPartnerController(ctx, PLUGIN_ID, (props, current) => <PartnerWorkspace {...props} controller={current} />)\n ctx.slots.inject('shell.overlay', () => ctx.slots.register({ name: 'shell.overlay', id: 'partner-pendant', order: 30 }, () => <PartnerPendant controller={controller} />))\n ctx.effect(() => observePluginWorkspace(PLUGIN_ID, controller.close), 'dsh-partner: exclusive workspace')\n ctx.effect(() => () => controller.close(), 'dsh-partner: workspace lifecycle')\n ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register({\n name: 'sidebar.footer.action', id: 'partner', order: -120,\n }, props => <PartnerSidebar {...props} controller={controller} collapse={() => ctx.layout.toggleSidebar()} />))\n}\n\nfunction PartnerSidebar(props: SidebarProps & { controller: Controller; collapse(): void }): JSX.Element {\n const ref = useRef<HTMLElement>(null)\n useWorkspaceTopAnchor(ref)\n const [open, setOpen] = useState(true)\n const [snapshot, setSnapshot] = useState<PartnerSnapshot>()\n useChannelStatus(setSnapshot)\n const [, update] = useState(0)\n useEffect(() => props.controller.subscribe(() => update(value => value + 1)), [props.controller])\n useEffect(() => { void loadPartner().then(setSnapshot).catch(() => {}) }, [props.controller.isOpen()])\n const launch = (id?: string): void => {\n props.controller.open(id)\n if (props.wide && window.matchMedia('(max-width: 820px)').matches) props.collapse()\n }\n if (!props.wide) return <section ref={ref} className=\"dsh-partner-sidebar is-rail\"><button type=\"button\" className={`dsh-partner-rail${props.controller.isOpen() ? ' is-active' : ''}`} title=\"\u4F19\u4F34\" onClick={() => props.controller.toggle()}><IconAgentPresetOutline16 size={18} /></button></section>\n return <section ref={ref} className=\"dsh-partner-sidebar\">\n <div className=\"dsh-partner-sidebar-heading\">\n <button type=\"button\" className=\"dsh-partner-sidebar-title\" aria-expanded={open} onClick={() => setOpen(value => !value)}><span data-open={open}><IconChevronDownOutline14 size={14} /></span>\u4F19\u4F34</button>\n </div>\n <div className={`dsh-partner-sidebar-list${open ? ' is-open' : ''}`} aria-hidden={!open}>\n <div className=\"dsh-partner-sidebar-list-inner\">\n <button type=\"button\" tabIndex={open ? 0 : -1} className={`dsh-partner-sidebar-row${props.controller.isOpen() ? ' is-active' : ''}`} onClick={() => launch()}>\n <span className=\"dsh-partner-sidebar-symbol\"><IconAgentPresetOutline16 size={16} /></span><span><strong>\u4F19\u4F34\u9762\u677F</strong><small>{snapshot ? `${snapshot.companions.length} \u4F4D\u4F19\u4F34 \u00B7 ${snapshot.channels.filter(item => item.runtimeStatus === 'running').length} \u4E2A\u6E20\u9053\u5728\u7EBF` : '\u8EAB\u4EFD\u3001\u80FD\u529B\u4E0E\u6E20\u9053'}</small></span><i className={snapshot?.channels.some(item => item.runtimeStatus === 'running') ? 'is-online' : ''} />\n </button>\n </div>\n </div>\n </section>\n}\n\nfunction PartnerWorkspace({ controller }: ConversationProps & { controller: Controller }): JSX.Element {\n const [snapshot, setSnapshot] = useState<PartnerSnapshot>()\n useChannelStatus(setSnapshot)\n const [selectedId, setSelectedId] = useState(controller.selected())\n const [view, setView] = useState<View>(controller.destination()?.page ?? 'home')\n const [requestedDestination, setRequestedDestination] = useState(controller.destination())\n const [error, setError] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [creatingCompanion, setCreatingCompanion] = useState(false)\n const [notice, setNotice] = useState<string>()\n const selectionRef = useRef({ selectedId, companions: snapshot?.companions })\n selectionRef.current = { selectedId, companions: snapshot?.companions }\n const refresh = useCallback(async (throwOnError = false) => {\n try {\n const next = await loadPartner()\n setSnapshot(next)\n setSelectedId(current => next.companions.some(item => item.id === current) ? current : next.companions[0]?.id)\n setError(undefined)\n } catch (reason) { setError(message(reason)); if (throwOnError) throw reason } finally { setLoading(false) }\n }, [])\n useEffect(() => { void refresh() }, [refresh])\n useEffect(() => controller.subscribe(() => { const next = controller.selected(); if (next) setSelectedId(next); const destination = controller.destination(); if (destination) { setView(destination.page); setRequestedDestination(destination) } }), [controller])\n const selected = snapshot?.companions.find(item => item.id === selectedId)\n const companionRemoved = async (id: string): Promise<void> => {\n const current = selectionRef.current\n const name = current.companions?.find(item => item.id === id)?.name ?? '\u4F19\u4F34'\n setSnapshot(value => value ? { ...value, companions: value.companions.filter(item => item.id !== id), sessions: value.sessions.filter(item => item.companionId !== id) } : value)\n if (current.selectedId === id) {\n setSelectedId(current.companions?.find(item => item.id !== id)?.id)\n setView('home')\n }\n setNotice(`\u5DF2\u5220\u9664\u300C${name}\u300D\uFF0C\u5DF2\u9000\u51FA\u5220\u9664\u786E\u8BA4\u3002`)\n try { await refresh(true) }\n catch (reason) { setError(`\u4F19\u4F34\u5DF2\u5220\u9664\uFF0C\u4F46\u5237\u65B0\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\uFF0C\u65E0\u9700\u518D\u6B21\u5220\u9664\uFF1A${message(reason)}`) }\n }\n const create = async (draft: NewCompanionDraft): Promise<void> => {\n try {\n const companion = await api<CompanionView>('/companions', { method: 'POST', body: JSON.stringify({ companion: {\n ...draft, capabilities: [],\n } }) })\n await refresh(); setSelectedId(companion.id); setView('identity'); setCreatingCompanion(false)\n } catch (reason) { setError(message(reason)); throw reason }\n }\n const openSession = async (routeId: string, sessionId: string): Promise<void> => {\n try { setError(undefined); await controller.openSession(routeId, sessionId) }\n catch (reason) { setError(message(reason)) }\n }\n const startSession = async (companionId: string): Promise<void> => {\n try { setError(undefined); await controller.startSession(companionId) }\n catch (reason) { setError(message(reason)) }\n }\n const renewSession = async (routeId: string): Promise<void> => {\n try { setError(undefined); await controller.renewSession(routeId) }\n catch (reason) { setError(message(reason)) }\n }\n const workspacePage = WORKSPACE_PAGES.has(view)\n const openCompanion = (id: string): void => { setSelectedId(id); setView('home') }\n return <main className=\"dsh-partner-workspace\">\n {creatingCompanion && <CompanionCreateDialog close={() => setCreatingCompanion(false)} create={create} />}\n <header className=\"dsh-partner-topbar\">\n <div className=\"dsh-partner-topbar-brand\"><button type=\"button\" data-xiaohei-workspace-close onClick={controller.close} aria-label=\"\u8FD4\u56DE\u4F1A\u8BDD\" title=\"\u8FD4\u56DE\u4F1A\u8BDD\"><IconChevronLeftOutline14 size={15} /></button><IconAgentPresetOutline16 size={18} /><span><strong>\u4F19\u4F34</strong><small>\u957F\u671F\u8EAB\u4EFD\u4E0E\u6D88\u606F\u6E20\u9053</small></span></div>\n <MobileWorkspaceControls\n companions={snapshot?.companions ?? []}\n selectedId={selectedId}\n view={view}\n openCompanion={openCompanion}\n openPage={setView}\n createCompanion={() => setCreatingCompanion(true)}\n />\n </header>\n <div className=\"dsh-partner-grid\">\n <aside className=\"dsh-partner-roster\">\n <div className=\"dsh-partner-roster-title\"><span><small>COMPANIONS</small><strong>\u4F19\u4F34\u540D\u518C</strong></span><button type=\"button\" onClick={() => setCreatingCompanion(true)} aria-label=\"\u65B0\u5EFA\u4F19\u4F34\"><IconPlusOutline16 size={16} /></button></div>\n <div className=\"dsh-partner-roster-list\">{snapshot?.companions.map(companion => {\n const channel = snapshot.channels.find(item => item.companionId === companion.id)\n return <button type=\"button\" key={companion.id} className={!workspacePage && selectedId === companion.id ? 'is-active' : ''} onClick={() => openCompanion(companion.id)}>\n <Avatar name={companion.name} /><span><strong>{companion.name}</strong><small>{companion.role}</small></span><i className={channel?.runtimeStatus === 'running' ? 'is-online' : ''} title={channel ? channel.runtimeStatus : '\u672A\u8FDE\u63A5\u6E20\u9053'} />\n </button>\n })}</div>\n <nav className=\"dsh-partner-workspace-nav\" aria-label=\"\u4F19\u4F34\u5DE5\u4F5C\u533A\">\n <button type=\"button\" className={view === 'skills' ? 'is-active' : ''} aria-current={view === 'skills' ? 'page' : undefined} onClick={() => setView('skills')}><span><IconBrowseOutline16 size={16} /></span><strong>Skill \u5E02\u573A</strong><small>\u5B89\u88C5\u4E0E\u7BA1\u7406\u80FD\u529B</small></button>\n <button type=\"button\" className={view === 'board' ? 'is-active' : ''} aria-current={view === 'board' ? 'page' : undefined} onClick={() => setView('board')}><span><IconListPenOutline16 size={16} /></span><strong>\u4EFB\u52A1\u770B\u677F</strong><small>\u534F\u4F5C\u3001\u59D4\u6D3E\u4E0E\u9A8C\u6536</small></button>\n <button type=\"button\" className={view === 'schedules' ? 'is-active' : ''} aria-current={view === 'schedules' ? 'page' : undefined} onClick={() => setView('schedules')}><span><IconPlayOutline16 size={16} /></span><strong>\u5B9A\u65F6\u4EFB\u52A1</strong><small>\u9009\u62E9\u4F19\u4F34\u5468\u671F\u6267\u884C</small></button>\n <button type=\"button\" className={view === 'pendant' ? 'is-active' : ''} aria-current={view === 'pendant' ? 'page' : undefined} onClick={() => setView('pendant')}><span><IconEditOutline16 size={16} /></span><strong>\u5361\u7247\u8BBE\u7F6E</strong><small>\u6302\u9970\u3001\u7EF3\u5B50\u4E0E\u56FE\u6848</small></button>\n </nav>\n <div className=\"dsh-partner-roster-note\"><IconLinkOutline16 size={16} /><span><strong>\u8EAB\u4EFD\u4E0E\u6E20\u9053\u5206\u79BB</strong><small>\u6E20\u9053\u53EA\u8D1F\u8D23\u6536\u53D1\uFF0C\u6743\u9650\u4ECD\u7531 DSH \u5DE5\u5177\u51B3\u5B9A\u3002</small></span></div>\n </aside>\n <section className={`dsh-partner-stage${workspacePage ? ' is-workspace-page' : ''}`}>\n {loading ? <State title=\"\u6B63\u5728\u8BFB\u53D6\u4F19\u4F34\u2026\" /> : workspacePage ? <div className=\"dsh-partner-stage-scroll is-workspace-page\">\n {view === 'skills' && <SkillsPanel />}\n {view === 'board' && <TaskBoardPanel initialTaskId={requestedDestination?.taskId} openRequest={requestedDestination} />}\n {view === 'schedules' && <SchedulePanel companions={snapshot?.companions ?? []} />}\n {view === 'pendant' && <PendantSettingsPanel />}\n </div> : selected === undefined ? <State title=\"\u521B\u5EFA\u7B2C\u4E00\u4E2A\u4F19\u4F34\" detail=\"\u4F19\u4F34\u4F1A\u4FDD\u5B58\u72EC\u7ACB\u8EAB\u4EFD\u3001\u80FD\u529B\u548C\u5FAE\u4FE1\u4F1A\u8BDD\u3002\" action={<button onClick={() => setCreatingCompanion(true)}>\u65B0\u5EFA\u4F19\u4F34</button>} /> : <>\n <div className=\"dsh-partner-identity\"><Avatar name={selected.name} /><span><small>ACTIVE COMPANION</small><h1>{selected.name}</h1><p>{selected.description || selected.role}</p></span><Status channel={snapshot?.channels.find(item => item.companionId === selected.id)} /></div>\n <nav className=\"dsh-partner-tabs\" aria-label=\"\u4F19\u4F34\u914D\u7F6E\">\n <TabButton active={view === 'home'} onClick={() => setView('home')} icon={<IconAgentPresetOutline16 size={16} />}>\u603B\u89C8</TabButton>\n <TabButton active={view === 'identity'} onClick={() => setView('identity')} icon={<IconEditOutline16 size={16} />}>\u8EAB\u4EFD</TabButton>\n <TabButton active={view === 'capabilities'} onClick={() => setView('capabilities')} icon={<IconAgentPresetOutline16 size={16} />}>\u80FD\u529B</TabButton>\n <TabButton active={view === 'weixin'} onClick={() => setView('weixin')} icon={<IconLinkOutline16 size={16}/>}>\u6E20\u9053</TabButton>\n <TabButton active={view === 'memory'} onClick={() => setView('memory')} icon={<IconDataOutline16 size={16} />}>\u8BB0\u5FC6</TabButton>\n <TabButton active={view === 'concerns'} onClick={() => setView('concerns')} icon={<IconBrowseOutline16 size={16} />}>\u6301\u7EED\u5173\u6CE8</TabButton>\n </nav>\n <div className=\"dsh-partner-stage-scroll\">\n {notice && <p className=\"dsh-partner-inline-notice\" role=\"status\">{notice}</p>}\n {view === 'home' && <HomePanel companion={selected} snapshot={snapshot!} navigate={setView} openSession={openSession} startSession={startSession} renewSession={renewSession} />}\n {view === 'identity' && <IdentityEditor companion={selected} count={snapshot?.companions.length ?? 1} onChanged={() => refresh(true)} onRemoved={companionRemoved} />}\n {view === 'capabilities' && <CapabilityEditor key={selected.id} companion={selected} presets={snapshot?.presets ?? []} onChanged={() => refresh(true)} />}\n {view === 'weixin' && <ChannelsPanel key={selected.id} companion={selected} snapshot={snapshot!} onChanged={refresh} weixin={<WeixinPanel companion={selected} snapshot={snapshot!} onChanged={refresh} />} />}\n {view === 'memory' && <MemoryPanel key={selected.id} companion={selected} snapshot={snapshot!} openSession={openSession} startSession={startSession} renewSession={renewSession} onChanged={refresh} />}\n {view === 'concerns' && <ConcernPanel key={selected.id} companion={selected} snapshot={snapshot!} onChanged={refresh} />}\n </div>\n </>}\n {error && <p className=\"dsh-partner-error\" role=\"alert\">{error}</p>}\n </section>\n </div>\n </main>\n}\n\nfunction MobileWorkspaceControls({ companions, selectedId, view, openCompanion, openPage, createCompanion }: {\n companions: CompanionView[]\n selectedId: string | undefined\n view: View\n openCompanion(id: string): void\n openPage(page: WorkspacePage): void\n createCompanion(): void\n}): JSX.Element {\n return <div className=\"dsh-partner-mobile-controls\">\n <div className=\"dsh-partner-mobile-companion-row\">\n <CompanionPicker companions={companions} selectedId={selectedId} onChange={openCompanion} />\n <button type=\"button\" className=\"dsh-partner-mobile-create\" onClick={createCompanion} aria-label=\"\u65B0\u5EFA\u4F19\u4F34\"><IconPlusOutline16 size={17} /></button>\n </div>\n <nav className=\"dsh-partner-mobile-workspace-nav\" aria-label=\"\u4F19\u4F34\u5DE5\u4F5C\u533A\u5FEB\u6377\u5165\u53E3\">\n <button type=\"button\" className={view === 'skills' ? 'is-active' : ''} aria-pressed={view === 'skills'} onClick={() => openPage('skills')}><IconBrowseOutline16 size={16} /><span>Skill</span></button>\n <button type=\"button\" className={view === 'board' ? 'is-active' : ''} aria-pressed={view === 'board'} onClick={() => openPage('board')}><IconListPenOutline16 size={16} /><span>\u770B\u677F</span></button>\n <button type=\"button\" className={view === 'schedules' ? 'is-active' : ''} aria-pressed={view === 'schedules'} onClick={() => openPage('schedules')}><IconPlayOutline16 size={16} /><span>\u5B9A\u65F6</span></button>\n <button type=\"button\" className={view === 'pendant' ? 'is-active' : ''} aria-pressed={view === 'pendant'} onClick={() => openPage('pendant')}><IconEditOutline16 size={16} /><span>\u5361\u7247</span></button>\n </nav>\n </div>\n}\n\nfunction HomePanel({ companion, snapshot, navigate, openSession, startSession, renewSession }: { companion: CompanionView; snapshot: PartnerSnapshot; navigate(tab: CompanionTab): void; openSession(routeId: string, sessionId: string): Promise<void>; startSession(companionId: string): Promise<void>; renewSession(routeId: string): Promise<void> }): JSX.Element {\n const channel = snapshot.channels.find(item => item.companionId === companion.id)\n const sessions = snapshot.sessions.filter(item => item.companionId === companion.id)\n const localSession = sessions.find(item => item.kind === 'local')\n const pending = channel ? snapshot.pairings.filter(item => item.channelId === channel.id && item.status === 'pending').length : 0\n const approved = channel ? snapshot.pairings.filter(item => item.channelId === channel.id && item.status === 'approved').length : 0\n const capabilities = companion.capabilities.map(item => CAPABILITY_LABELS[item])\n const online = channel?.runtimeStatus === 'running'\n return <div className=\"dsh-partner-home\">\n <header className=\"dsh-partner-home-heading\">\n <span><small>\u5DE5\u4F5C\u53F0</small><h2>{online ? `${companion.name} \u6B63\u5728\u6E20\u9053\u5F85\u547D` : `${companion.name} \u5DF2\u51C6\u5907\u5C31\u7EEA`}</h2></span>\n <p>{online ? '\u6D88\u606F\u3001\u6388\u6743\u4E0E\u4E0A\u4E0B\u6587\u8FB9\u754C\u90FD\u5728\u8FD9\u91CC\u6C47\u603B\u3002' : '\u4F19\u4F34\u8EAB\u4EFD\u3001\u4F1A\u8BDD\u4E0E\u80FD\u529B\u5DF2\u7ECF\u51C6\u5907\u5B8C\u6210\u3002'}</p>\n </header>\n\n <section className={`dsh-partner-home-channel${online ? ' is-online' : ''}`}>\n <div className=\"dsh-partner-home-route\" aria-hidden=\"true\">\n <Avatar name={companion.name} />\n <span className=\"dsh-partner-route-line\"><i /></span>\n <span className=\"dsh-partner-route-weixin\"><WeixinGlyph large /></span>\n </div>\n <div className=\"dsh-partner-home-channel-copy\">\n <span className=\"dsh-partner-home-kicker\"><i />\u6D88\u606F\u6E20\u9053 \u00B7 {channel?.platform==='matrix'?'Matrix':channel?.platform==='mattermost'?'Mattermost':'\u5FAE\u4FE1'}</span>\n <h3>{!channel ? '\u7B49\u5F85\u626B\u7801\u8FDE\u63A5' : online ? '\u8FDE\u63A5\u6B63\u5E38\uFF0C\u6B63\u5728\u63A5\u6536\u6D88\u606F' : channel.runtimeStatus === 'error' ? '\u6E20\u9053\u8FDE\u63A5\u9700\u8981\u5904\u7406' : '\u6E20\u9053\u5F53\u524D\u5DF2\u505C\u7528'}</h3>\n <p>{!channel ? '\u8FDE\u63A5\u5FAE\u4FE1\u3001Matrix \u6216 Mattermost\uFF0C\u8054\u7CFB\u4EBA\u9996\u6B21\u53D1\u6D88\u606F\u9700\u6279\u51C6\u3002' : online ? '\u672C\u5730\u4E0E\u6240\u6709\u5DF2\u6388\u6743\u6E20\u9053\u5171\u7528\u4F19\u4F34\u4E3B\u5BF9\u8BDD\uFF0C\u56DE\u590D\u8FD4\u56DE\u6D88\u606F\u6765\u6E90\u3002' : channel.lastError || '\u6E20\u9053\u914D\u7F6E\u4ECD\u7136\u4FDD\u7559\uFF0C\u53EF\u4EE5\u968F\u65F6\u91CD\u65B0\u542F\u7528\u3002'}</p>\n <div className=\"dsh-partner-home-channel-actions\">\n <button type=\"button\" className=\"is-primary\" onClick={() => navigate('weixin')}>{!channel ? '\u8FDE\u63A5\u5FAE\u4FE1' : pending > 0 ? `\u5904\u7406 ${pending} \u4E2A\u8BF7\u6C42` : '\u7BA1\u7406\u6E20\u9053'}</button>\n <span>{!channel ? '\u9009\u62E9\u6E20\u9053\u5E76\u8FDE\u63A5\u8D26\u53F7' : `${approved} \u4F4D\u8054\u7CFB\u4EBA \u00B7 \u5171\u7528\u4E3B\u5BF9\u8BDD`}</span>\n </div>\n </div>\n </section>\n\n <div className=\"dsh-partner-home-details\">\n <section className=\"dsh-partner-home-profile\">\n <header><span><IconUserOutline16 size={16} /></span><div><small>\u4F19\u4F34\u5E95\u7A3F</small><strong>{companion.role}</strong></div><button type=\"button\" onClick={() => navigate('identity')}>\u7F16\u8F91</button></header>\n <blockquote>{companion.instructions || companion.description || '\u5C1A\u672A\u8BBE\u7F6E\u957F\u671F\u884C\u4E3A\u51C6\u5219\u3002'}</blockquote>\n </section>\n <section className=\"dsh-partner-home-runtime\">\n <header><span><IconAgentPresetOutline16 size={16} /></span><div><small>\u8FD0\u884C\u80FD\u529B</small><strong>{companion.presetId || 'DSH \u9ED8\u8BA4 Preset'}</strong></div><button type=\"button\" onClick={() => navigate('capabilities')}>\u8C03\u6574</button></header>\n <div className=\"dsh-partner-home-capability-list\">{capabilities.length ? capabilities.map(item => <em key={item}>{item}</em>) : <small>\u5C1A\u672A\u58F0\u660E\u80FD\u529B\u8303\u56F4</small>}</div>\n </section>\n <section className=\"dsh-partner-home-continuity\">\n <header><span><IconDataOutline16 size={16} /></span><div><small>\u4F19\u4F34\u5BF9\u8BDD</small><strong>{localSession?.archived ? '\u4F1A\u8BDD\u5DF2\u5F52\u6863' : '\u4F19\u4F34\u4F1A\u8BDD\u5DF2\u5EFA\u7ACB'}</strong></div><button type=\"button\" onClick={() => localSession === undefined ? void startSession(companion.id) : localSession.archived ? void renewSession(localSession.id) : void openSession(localSession.id, localSession.sessionId)}>{localSession === undefined ? '\u5F00\u59CB\u5BF9\u8BDD' : localSession.archived ? '\u5F00\u59CB\u65B0\u4F1A\u8BDD' : '\u6253\u5F00\u4F1A\u8BDD'}</button></header>\n <p>{localSession ? `\u6700\u8FD1\u6D3B\u52A8\u4E8E ${relativeTime(localSession.lastMessageAt)}\uFF1B\u672C\u5730\u4E0E\u6E20\u9053\u5728\u8FD9\u91CC\u63A5\u7740\u804A\u3002` : '\u4F19\u4F34\u4F1A\u8BDD\u6B63\u5728\u521D\u59CB\u5316\uFF0C\u7A0D\u540E\u5373\u53EF\u6253\u5F00\u3002'}</p>\n </section>\n </div>\n </div>\n}\n\nfunction WeixinPanel({ companion, snapshot, onChanged }: { companion: CompanionView; snapshot: PartnerSnapshot; onChanged(): Promise<void> }): JSX.Element {\n const channel = snapshot.channels.find(item => item.companionId === companion.id && (!item.platform || item.platform==='weixin'))\n const [login, setLogin] = useState<LoginView>()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n useEffect(() => {\n if (!login || login.phase === 'confirmed' || login.phase === 'expired' || login.phase === 'error') return\n const timer = window.setInterval(() => {\n void api<{ login: LoginView; channel?: ChannelView }>(`/weixin/login/${login.id}`).then(async result => {\n setLogin(result.login)\n if (result.channel) { setLogin(undefined); await onChanged() }\n }).catch(reason => setError(message(reason)))\n }, 2_000)\n return () => clearInterval(timer)\n }, [login?.id, login?.phase, onChanged])\n const begin = async (): Promise<void> => {\n setBusy(true); setError(undefined)\n try { setLogin(await api('/weixin/login', { method: 'POST', body: JSON.stringify({ companionId: companion.id }) })) }\n catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const toggle = async (): Promise<void> => {\n if (!channel) return\n setBusy(true); setError(undefined)\n try { await api(`/channels/${channel.id}/enabled`, { method: 'POST', body: JSON.stringify({ enabled: !channel.enabled }) }); await onChanged() }\n catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const pairings = channel ? snapshot.pairings.filter(item => item.channelId === channel.id) : []\n const actPairing = async (id: string, status: 'approved' | 'blocked'): Promise<void> => {\n try { await api(`/pairings/${id}/status`, { method: 'POST', body: JSON.stringify({ status }) }); await onChanged() } catch (reason) { setError(message(reason)) }\n }\n return <div className=\"dsh-partner-form is-channel\"><Section eyebrow=\"PRIMARY CHANNEL\" title=\"\u5FAE\u4FE1\u6E20\u9053\" detail=\"\u4F7F\u7528\u5FAE\u4FE1 iLink Bot \u626B\u7801\u63A5\u5165\u3002\u6BCF\u4E2A\u673A\u5668\u4EBA\u53EA\u7ED1\u5B9A\u4E00\u4E2A\u4F19\u4F34\uFF0C\u6BCF\u4F4D\u8054\u7CFB\u4EBA\u4FDD\u6301\u72EC\u7ACB DSH \u4F1A\u8BDD\u3002\" />\n {!channel && !login && <GlassSurface as=\"div\" interactive className=\"dsh-partner-weixin-connect\" borderRadius={15} distortionScale={-10} saturation={1.06}><div className=\"dsh-partner-weixin-mark\"><WeixinGlyph large /></div><span><strong>\u628A {companion.name} \u5E26\u5230\u5FAE\u4FE1</strong><p>\u626B\u7801\u540E\uFF0C\u673A\u5668\u4EBA\u51ED\u636E\u76F4\u63A5\u4FDD\u5B58\u8FDB DSH \u51ED\u636E\u5E93\uFF0C\u4E0D\u4F1A\u663E\u793A\u5728\u6D4F\u89C8\u5668\u6216\u666E\u901A\u914D\u7F6E\u6587\u4EF6\u4E2D\u3002</p><ul><li>\u79C1\u804A\u9996\u6B21\u8054\u7CFB\u5FC5\u987B\u5BA1\u6279</li><li>\u8054\u7CFB\u4EBA\u4E4B\u95F4\u4E0A\u4E0B\u6587\u5B8C\u5168\u9694\u79BB</li><li>\u5DE5\u5177\u6743\u9650\u4E0D\u4F1A\u56E0\u5FAE\u4FE1\u8EAB\u4EFD\u81EA\u52A8\u6269\u5927</li></ul></span><button type=\"button\" disabled={busy} onClick={() => { void begin() }}>{busy ? '\u6B63\u5728\u7533\u8BF7\u4E8C\u7EF4\u7801\u2026' : '\u626B\u7801\u8FDE\u63A5\u5FAE\u4FE1'}</button></GlassSurface>}\n {login && <GlassSurface as=\"div\" interactive className=\"dsh-partner-qr\" borderRadius={16} distortionScale={-10} saturation={1.06}><div className=\"dsh-partner-qr-code\">{login.qrContent && <QRCodeSVG value={login.qrContent} size={176} level=\"M\" />}</div><span><small>WECHAT ILINK BOT</small><strong>{login.phase === 'scanned' ? '\u5DF2\u626B\u7801\uFF0C\u8BF7\u5728\u5FAE\u4FE1\u786E\u8BA4' : login.phase === 'expired' ? '\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F' : login.phase === 'error' ? '\u8FDE\u63A5\u5931\u8D25' : '\u4F7F\u7528\u5FAE\u4FE1\u626B\u7801'}</strong><p>{login.error || (login.phase === 'scanned' ? '\u786E\u8BA4\u540E\u4F1A\u81EA\u52A8\u542F\u52A8\u6E20\u9053\uFF0C\u4E0D\u9700\u8981\u590D\u5236 Token\u3002' : '\u4E8C\u7EF4\u7801\u7EA6 5 \u5206\u949F\u6709\u6548\u3002\u6B64\u9875\u9762\u53EF\u4EE5\u5B89\u5168\u5730\u4FDD\u6301\u6253\u5F00\u3002')}</p>{(login.phase === 'expired' || login.phase === 'error') && <button type=\"button\" onClick={() => { setLogin(undefined); void begin() }}><IconRefreshOutline16 size={16} />\u91CD\u65B0\u751F\u6210</button>}</span></GlassSurface>}\n {channel && <>\n <GlassSurface as=\"div\" interactive className=\"dsh-partner-channel-card\" borderRadius={14} distortionScale={-10} saturation={1.06}><div className=\"dsh-partner-weixin-mark\"><WeixinGlyph large /></div><span><small>WECHAT CHANNEL</small><strong>{channel.name}</strong><p>{channel.accountId}</p></span><Status channel={channel} /><button type=\"button\" className=\"dsh-partner-switch\" data-on={channel.enabled} disabled={busy} aria-label={channel.enabled ? '\u505C\u7528\u5FAE\u4FE1\u6E20\u9053' : '\u542F\u7528\u5FAE\u4FE1\u6E20\u9053'} onClick={() => { void toggle() }}><i /></button></GlassSurface>\n {channel.lastError && <p className=\"dsh-partner-inline-error\">{channel.lastError}</p>}\n <div className=\"dsh-partner-pairing-heading\"><span><small>ACCESS</small><strong>\u79C1\u804A\u914D\u5BF9</strong></span><em>{pairings.filter(item => item.status === 'pending').length} \u4E2A\u5F85\u5904\u7406</em></div>\n <div className=\"dsh-partner-pairings\">{pairings.length === 0 ? <State title=\"\u8FD8\u6CA1\u6709\u8054\u7CFB\u4EBA\" detail=\"\u6709\u4EBA\u9996\u6B21\u5411\u673A\u5668\u4EBA\u53D1\u6D88\u606F\u540E\uFF0C\u914D\u5BF9\u8BF7\u6C42\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002\" compact /> : pairings.map(pairing => <article key={pairing.id}><span className={`is-${pairing.status}`}><IconUserOutline16 size={16} /></span><div><strong>{pairing.displayName}</strong><small>{pairing.status === 'pending' ? '\u7B49\u5F85\u5BA1\u6279' : pairing.status === 'approved' ? '\u5DF2\u6388\u6743\u72EC\u7ACB\u4F1A\u8BDD' : '\u5DF2\u963B\u6B62'} \u00B7 {new Date(pairing.updatedAt).toLocaleString()}</small></div>{pairing.status === 'pending' && <><button onClick={() => { void actPairing(pairing.id, 'blocked') }}>\u62D2\u7EDD</button><button className=\"is-primary\" onClick={() => { void actPairing(pairing.id, 'approved') }}>\u6279\u51C6</button></>}{pairing.status === 'approved' && <button onClick={() => { void actPairing(pairing.id, 'blocked') }}>\u64A4\u9500</button>}{pairing.status === 'blocked' && <button onClick={() => { void actPairing(pairing.id, 'approved') }}>\u91CD\u65B0\u6279\u51C6</button>}</article>)}</div>\n </>}\n {error && <p className=\"dsh-partner-inline-error\">{error}</p>}\n </div>\n}\n\nfunction installStyles(): () => void { let style = document.getElementById(STYLE_ID) as HTMLStyleElement | null; if (!style) { style = document.createElement('style'); style.id = STYLE_ID; style.textContent = cssText; document.head.append(style) } return () => style?.remove() }\n", "const WORKSPACE_ACTIVATE_EVENT = '@lemoncat7/dsh-plugin-ui/workspace-activate'\n\ninterface WorkspaceActivateDetail {\n pluginId: string\n}\n\n/** Claim the conversation workspace while remaining compatible with installed plugin versions. */\nexport function activatePluginWorkspace(pluginId: string): void {\n window.dispatchEvent(new CustomEvent<WorkspaceActivateDetail>(WORKSPACE_ACTIVATE_EVENT, {\n detail: { pluginId },\n }))\n}\n\n/** Close this workspace when another plugin claims the conversation area. */\nexport function observePluginWorkspace(pluginId: string, close: () => void): () => void {\n const onActivate = (event: Event): void => {\n const detail = (event as CustomEvent<WorkspaceActivateDetail>).detail\n if (detail?.pluginId !== pluginId) close()\n }\n window.addEventListener(WORKSPACE_ACTIVATE_EVENT, onActivate)\n return () => window.removeEventListener(WORKSPACE_ACTIVATE_EVENT, onActivate)\n}\n", "var __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\n\n// src/index.tsx\nimport React from \"react\";\n\n// src/third-party/qrcodegen/index.ts\n/**\n * @license QR Code generator library (TypeScript)\n * Copyright (c) Project Nayuki.\n * SPDX-License-Identifier: MIT\n */\nvar qrcodegen;\n((qrcodegen2) => {\n const _QrCode = class _QrCode {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code with the given version number,\n // error correction level, data codeword bytes, and mask number.\n // This is a low-level API that most users should not use directly.\n // A mid-level API is the encodeSegments() function.\n constructor(version, errorCorrectionLevel, dataCodewords, msk) {\n this.version = version;\n this.errorCorrectionLevel = errorCorrectionLevel;\n // The modules of this QR Code (false = light, true = dark).\n // Immutable after constructor finishes. Accessed through getModule().\n this.modules = [];\n // Indicates function modules that are not subjected to masking. Discarded when constructor finishes.\n this.isFunction = [];\n if (version < _QrCode.MIN_VERSION || version > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version value out of range\");\n if (msk < -1 || msk > 7)\n throw new RangeError(\"Mask value out of range\");\n this.size = version * 4 + 17;\n let row = [];\n for (let i = 0; i < this.size; i++)\n row.push(false);\n for (let i = 0; i < this.size; i++) {\n this.modules.push(row.slice());\n this.isFunction.push(row.slice());\n }\n this.drawFunctionPatterns();\n const allCodewords = this.addEccAndInterleave(dataCodewords);\n this.drawCodewords(allCodewords);\n if (msk == -1) {\n let minPenalty = 1e9;\n for (let i = 0; i < 8; i++) {\n this.applyMask(i);\n this.drawFormatBits(i);\n const penalty = this.getPenaltyScore();\n if (penalty < minPenalty) {\n msk = i;\n minPenalty = penalty;\n }\n this.applyMask(i);\n }\n }\n assert(0 <= msk && msk <= 7);\n this.mask = msk;\n this.applyMask(msk);\n this.drawFormatBits(msk);\n this.isFunction = [];\n }\n /*-- Static factory functions (high level) --*/\n // Returns a QR Code representing the given Unicode text string at the given error correction level.\n // As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer\n // Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible\n // QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the\n // ecl argument if it can be done without increasing the version.\n static encodeText(text, ecl) {\n const segs = qrcodegen2.QrSegment.makeSegments(text);\n return _QrCode.encodeSegments(segs, ecl);\n }\n // Returns a QR Code representing the given binary data at the given error correction level.\n // This function always encodes using the binary segment mode, not any text mode. The maximum number of\n // bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output.\n // The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version.\n static encodeBinary(data, ecl) {\n const seg = qrcodegen2.QrSegment.makeBytes(data);\n return _QrCode.encodeSegments([seg], ecl);\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a QR Code representing the given segments with the given encoding parameters.\n // The smallest possible QR Code version within the given range is automatically\n // chosen for the output. Iff boostEcl is true, then the ECC level of the result\n // may be higher than the ecl argument if it can be done without increasing the\n // version. The mask number is either between 0 to 7 (inclusive) to force that\n // mask, or -1 to automatically choose an appropriate mask (which may be slow).\n // This function allows the user to create a custom sequence of segments that switches\n // between modes (such as alphanumeric and byte) to encode text in less space.\n // This is a mid-level API; the high-level API is encodeText() and encodeBinary().\n static encodeSegments(segs, ecl, minVersion = 1, maxVersion = 40, mask = -1, boostEcl = true) {\n if (!(_QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= _QrCode.MAX_VERSION) || mask < -1 || mask > 7)\n throw new RangeError(\"Invalid value\");\n let version;\n let dataUsedBits;\n for (version = minVersion; ; version++) {\n const dataCapacityBits2 = _QrCode.getNumDataCodewords(version, ecl) * 8;\n const usedBits = QrSegment.getTotalBits(segs, version);\n if (usedBits <= dataCapacityBits2) {\n dataUsedBits = usedBits;\n break;\n }\n if (version >= maxVersion)\n throw new RangeError(\"Data too long\");\n }\n for (const newEcl of [_QrCode.Ecc.MEDIUM, _QrCode.Ecc.QUARTILE, _QrCode.Ecc.HIGH]) {\n if (boostEcl && dataUsedBits <= _QrCode.getNumDataCodewords(version, newEcl) * 8)\n ecl = newEcl;\n }\n let bb = [];\n for (const seg of segs) {\n appendBits(seg.mode.modeBits, 4, bb);\n appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb);\n for (const b of seg.getData())\n bb.push(b);\n }\n assert(bb.length == dataUsedBits);\n const dataCapacityBits = _QrCode.getNumDataCodewords(version, ecl) * 8;\n assert(bb.length <= dataCapacityBits);\n appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb);\n appendBits(0, (8 - bb.length % 8) % 8, bb);\n assert(bb.length % 8 == 0);\n for (let padByte = 236; bb.length < dataCapacityBits; padByte ^= 236 ^ 17)\n appendBits(padByte, 8, bb);\n let dataCodewords = [];\n while (dataCodewords.length * 8 < bb.length)\n dataCodewords.push(0);\n bb.forEach((b, i) => dataCodewords[i >>> 3] |= b << 7 - (i & 7));\n return new _QrCode(version, ecl, dataCodewords, mask);\n }\n /*-- Accessor methods --*/\n // Returns the color of the module (pixel) at the given coordinates, which is false\n // for light or true for dark. The top left corner has the coordinates (x=0, y=0).\n // If the given coordinates are out of bounds, then false (light) is returned.\n getModule(x, y) {\n return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x];\n }\n // Modified to expose modules for easy access\n getModules() {\n return this.modules;\n }\n /*-- Private helper methods for constructor: Drawing function modules --*/\n // Reads this object's version field, and draws and marks all function modules.\n drawFunctionPatterns() {\n for (let i = 0; i < this.size; i++) {\n this.setFunctionModule(6, i, i % 2 == 0);\n this.setFunctionModule(i, 6, i % 2 == 0);\n }\n this.drawFinderPattern(3, 3);\n this.drawFinderPattern(this.size - 4, 3);\n this.drawFinderPattern(3, this.size - 4);\n const alignPatPos = this.getAlignmentPatternPositions();\n const numAlign = alignPatPos.length;\n for (let i = 0; i < numAlign; i++) {\n for (let j = 0; j < numAlign; j++) {\n if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0))\n this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]);\n }\n }\n this.drawFormatBits(0);\n this.drawVersion();\n }\n // Draws two copies of the format bits (with its own error correction code)\n // based on the given mask and this object's error correction level field.\n drawFormatBits(mask) {\n const data = this.errorCorrectionLevel.formatBits << 3 | mask;\n let rem = data;\n for (let i = 0; i < 10; i++)\n rem = rem << 1 ^ (rem >>> 9) * 1335;\n const bits = (data << 10 | rem) ^ 21522;\n assert(bits >>> 15 == 0);\n for (let i = 0; i <= 5; i++)\n this.setFunctionModule(8, i, getBit(bits, i));\n this.setFunctionModule(8, 7, getBit(bits, 6));\n this.setFunctionModule(8, 8, getBit(bits, 7));\n this.setFunctionModule(7, 8, getBit(bits, 8));\n for (let i = 9; i < 15; i++)\n this.setFunctionModule(14 - i, 8, getBit(bits, i));\n for (let i = 0; i < 8; i++)\n this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i));\n for (let i = 8; i < 15; i++)\n this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i));\n this.setFunctionModule(8, this.size - 8, true);\n }\n // Draws two copies of the version bits (with its own error correction code),\n // based on this object's version field, iff 7 <= version <= 40.\n drawVersion() {\n if (this.version < 7)\n return;\n let rem = this.version;\n for (let i = 0; i < 12; i++)\n rem = rem << 1 ^ (rem >>> 11) * 7973;\n const bits = this.version << 12 | rem;\n assert(bits >>> 18 == 0);\n for (let i = 0; i < 18; i++) {\n const color = getBit(bits, i);\n const a = this.size - 11 + i % 3;\n const b = Math.floor(i / 3);\n this.setFunctionModule(a, b, color);\n this.setFunctionModule(b, a, color);\n }\n }\n // Draws a 9*9 finder pattern including the border separator,\n // with the center module at (x, y). Modules can be out of bounds.\n drawFinderPattern(x, y) {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n const xx = x + dx;\n const yy = y + dy;\n if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size)\n this.setFunctionModule(xx, yy, dist != 2 && dist != 4);\n }\n }\n }\n // Draws a 5*5 alignment pattern, with the center module\n // at (x, y). All modules must be in bounds.\n drawAlignmentPattern(x, y) {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++)\n this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1);\n }\n }\n // Sets the color of a module and marks it as a function module.\n // Only used by the constructor. Coordinates must be in bounds.\n setFunctionModule(x, y, isDark) {\n this.modules[y][x] = isDark;\n this.isFunction[y][x] = true;\n }\n /*-- Private helper methods for constructor: Codewords and masking --*/\n // Returns a new byte string representing the given data with the appropriate error correction\n // codewords appended to it, based on this object's version and error correction level.\n addEccAndInterleave(data) {\n const ver = this.version;\n const ecl = this.errorCorrectionLevel;\n if (data.length != _QrCode.getNumDataCodewords(ver, ecl))\n throw new RangeError(\"Invalid argument\");\n const numBlocks = _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n const blockEccLen = _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver];\n const rawCodewords = Math.floor(_QrCode.getNumRawDataModules(ver) / 8);\n const numShortBlocks = numBlocks - rawCodewords % numBlocks;\n const shortBlockLen = Math.floor(rawCodewords / numBlocks);\n let blocks = [];\n const rsDiv = _QrCode.reedSolomonComputeDivisor(blockEccLen);\n for (let i = 0, k = 0; i < numBlocks; i++) {\n let dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1));\n k += dat.length;\n const ecc = _QrCode.reedSolomonComputeRemainder(dat, rsDiv);\n if (i < numShortBlocks)\n dat.push(0);\n blocks.push(dat.concat(ecc));\n }\n let result = [];\n for (let i = 0; i < blocks[0].length; i++) {\n blocks.forEach((block, j) => {\n if (i != shortBlockLen - blockEccLen || j >= numShortBlocks)\n result.push(block[i]);\n });\n }\n assert(result.length == rawCodewords);\n return result;\n }\n // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire\n // data area of this QR Code. Function modules need to be marked off before this is called.\n drawCodewords(data) {\n if (data.length != Math.floor(_QrCode.getNumRawDataModules(this.version) / 8))\n throw new RangeError(\"Invalid argument\");\n let i = 0;\n for (let right = this.size - 1; right >= 1; right -= 2) {\n if (right == 6)\n right = 5;\n for (let vert = 0; vert < this.size; vert++) {\n for (let j = 0; j < 2; j++) {\n const x = right - j;\n const upward = (right + 1 & 2) == 0;\n const y = upward ? this.size - 1 - vert : vert;\n if (!this.isFunction[y][x] && i < data.length * 8) {\n this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7));\n i++;\n }\n }\n }\n }\n assert(i == data.length * 8);\n }\n // XORs the codeword modules in this QR Code with the given mask pattern.\n // The function modules must be marked and the codeword bits must be drawn\n // before masking. Due to the arithmetic of XOR, calling applyMask() with\n // the same mask value a second time will undo the mask. A final well-formed\n // QR Code needs exactly one (not zero, two, etc.) mask applied.\n applyMask(mask) {\n if (mask < 0 || mask > 7)\n throw new RangeError(\"Mask value out of range\");\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n let invert;\n switch (mask) {\n case 0:\n invert = (x + y) % 2 == 0;\n break;\n case 1:\n invert = y % 2 == 0;\n break;\n case 2:\n invert = x % 3 == 0;\n break;\n case 3:\n invert = (x + y) % 3 == 0;\n break;\n case 4:\n invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0;\n break;\n case 5:\n invert = x * y % 2 + x * y % 3 == 0;\n break;\n case 6:\n invert = (x * y % 2 + x * y % 3) % 2 == 0;\n break;\n case 7:\n invert = ((x + y) % 2 + x * y % 3) % 2 == 0;\n break;\n default:\n throw new Error(\"Unreachable\");\n }\n if (!this.isFunction[y][x] && invert)\n this.modules[y][x] = !this.modules[y][x];\n }\n }\n }\n // Calculates and returns the penalty score based on state of this QR Code's current modules.\n // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.\n getPenaltyScore() {\n let result = 0;\n for (let y = 0; y < this.size; y++) {\n let runColor = false;\n let runX = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let x = 0; x < this.size; x++) {\n if (this.modules[y][x] == runColor) {\n runX++;\n if (runX == 5)\n result += _QrCode.PENALTY_N1;\n else if (runX > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runX, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runX = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let x = 0; x < this.size; x++) {\n let runColor = false;\n let runY = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let y = 0; y < this.size; y++) {\n if (this.modules[y][x] == runColor) {\n runY++;\n if (runY == 5)\n result += _QrCode.PENALTY_N1;\n else if (runY > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runY, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runY = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let y = 0; y < this.size - 1; y++) {\n for (let x = 0; x < this.size - 1; x++) {\n const color = this.modules[y][x];\n if (color == this.modules[y][x + 1] && color == this.modules[y + 1][x] && color == this.modules[y + 1][x + 1])\n result += _QrCode.PENALTY_N2;\n }\n }\n let dark = 0;\n for (const row of this.modules)\n dark = row.reduce((sum, color) => sum + (color ? 1 : 0), dark);\n const total = this.size * this.size;\n const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;\n assert(0 <= k && k <= 9);\n result += k * _QrCode.PENALTY_N4;\n assert(0 <= result && result <= 2568888);\n return result;\n }\n /*-- Private helper functions --*/\n // Returns an ascending list of positions of alignment patterns for this version number.\n // Each position is in the range [0,177), and are used on both the x and y axes.\n // This could be implemented as lookup table of 40 variable-length lists of integers.\n getAlignmentPatternPositions() {\n if (this.version == 1)\n return [];\n else {\n const numAlign = Math.floor(this.version / 7) + 2;\n const step = this.version == 32 ? 26 : Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n let result = [6];\n for (let pos = this.size - 7; result.length < numAlign; pos -= step)\n result.splice(1, 0, pos);\n return result;\n }\n }\n // Returns the number of data bits that can be stored in a QR Code of the given version number, after\n // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.\n // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.\n static getNumRawDataModules(ver) {\n if (ver < _QrCode.MIN_VERSION || ver > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version number out of range\");\n let result = (16 * ver + 128) * ver + 64;\n if (ver >= 2) {\n const numAlign = Math.floor(ver / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (ver >= 7)\n result -= 36;\n }\n assert(208 <= result && result <= 29648);\n return result;\n }\n // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any\n // QR Code of the given version number and error correction level, with remainder bits discarded.\n // This stateless pure function could be implemented as a (40*4)-cell lookup table.\n static getNumDataCodewords(ver, ecl) {\n return Math.floor(_QrCode.getNumRawDataModules(ver) / 8) - _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n }\n // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be\n // implemented as a lookup table over all possible parameter values, instead of as an algorithm.\n static reedSolomonComputeDivisor(degree) {\n if (degree < 1 || degree > 255)\n throw new RangeError(\"Degree out of range\");\n let result = [];\n for (let i = 0; i < degree - 1; i++)\n result.push(0);\n result.push(1);\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < result.length; j++) {\n result[j] = _QrCode.reedSolomonMultiply(result[j], root);\n if (j + 1 < result.length)\n result[j] ^= result[j + 1];\n }\n root = _QrCode.reedSolomonMultiply(root, 2);\n }\n return result;\n }\n // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.\n static reedSolomonComputeRemainder(data, divisor) {\n let result = divisor.map((_) => 0);\n for (const b of data) {\n const factor = b ^ result.shift();\n result.push(0);\n divisor.forEach((coef, i) => result[i] ^= _QrCode.reedSolomonMultiply(coef, factor));\n }\n return result;\n }\n // Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result\n // are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.\n static reedSolomonMultiply(x, y) {\n if (x >>> 8 != 0 || y >>> 8 != 0)\n throw new RangeError(\"Byte out of range\");\n let z = 0;\n for (let i = 7; i >= 0; i--) {\n z = z << 1 ^ (z >>> 7) * 285;\n z ^= (y >>> i & 1) * x;\n }\n assert(z >>> 8 == 0);\n return z;\n }\n // Can only be called immediately after a light run is added, and\n // returns either 0, 1, or 2. A helper function for getPenaltyScore().\n finderPenaltyCountPatterns(runHistory) {\n const n = runHistory[1];\n assert(n <= this.size * 3);\n const core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n;\n return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) + (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0);\n }\n // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().\n finderPenaltyTerminateAndCount(currentRunColor, currentRunLength, runHistory) {\n if (currentRunColor) {\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n currentRunLength = 0;\n }\n currentRunLength += this.size;\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n return this.finderPenaltyCountPatterns(runHistory);\n }\n // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().\n finderPenaltyAddHistory(currentRunLength, runHistory) {\n if (runHistory[0] == 0)\n currentRunLength += this.size;\n runHistory.pop();\n runHistory.unshift(currentRunLength);\n }\n };\n /*-- Constants and tables --*/\n // The minimum version number supported in the QR Code Model 2 standard.\n _QrCode.MIN_VERSION = 1;\n // The maximum version number supported in the QR Code Model 2 standard.\n _QrCode.MAX_VERSION = 40;\n // For use in getPenaltyScore(), when evaluating which mask is best.\n _QrCode.PENALTY_N1 = 3;\n _QrCode.PENALTY_N2 = 3;\n _QrCode.PENALTY_N3 = 40;\n _QrCode.PENALTY_N4 = 10;\n _QrCode.ECC_CODEWORDS_PER_BLOCK = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Low\n [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n // Medium\n [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Quartile\n [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]\n // High\n ];\n _QrCode.NUM_ERROR_CORRECTION_BLOCKS = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n // Low\n [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n // Medium\n [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n // Quartile\n [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]\n // High\n ];\n let QrCode = _QrCode;\n qrcodegen2.QrCode = _QrCode;\n function appendBits(val, len, bb) {\n if (len < 0 || len > 31 || val >>> len != 0)\n throw new RangeError(\"Value out of range\");\n for (let i = len - 1; i >= 0; i--)\n bb.push(val >>> i & 1);\n }\n function getBit(x, i) {\n return (x >>> i & 1) != 0;\n }\n function assert(cond) {\n if (!cond)\n throw new Error(\"Assertion error\");\n }\n const _QrSegment = class _QrSegment {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code segment with the given attributes and data.\n // The character count (numChars) must agree with the mode and the bit buffer length,\n // but the constraint isn't checked. The given bit buffer is cloned and stored.\n constructor(mode, numChars, bitData) {\n this.mode = mode;\n this.numChars = numChars;\n this.bitData = bitData;\n if (numChars < 0)\n throw new RangeError(\"Invalid argument\");\n this.bitData = bitData.slice();\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a segment representing the given binary data encoded in\n // byte mode. All input byte arrays are acceptable. Any text string\n // can be converted to UTF-8 bytes and encoded as a byte mode segment.\n static makeBytes(data) {\n let bb = [];\n for (const b of data)\n appendBits(b, 8, bb);\n return new _QrSegment(_QrSegment.Mode.BYTE, data.length, bb);\n }\n // Returns a segment representing the given string of decimal digits encoded in numeric mode.\n static makeNumeric(digits) {\n if (!_QrSegment.isNumeric(digits))\n throw new RangeError(\"String contains non-numeric characters\");\n let bb = [];\n for (let i = 0; i < digits.length; ) {\n const n = Math.min(digits.length - i, 3);\n appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb);\n i += n;\n }\n return new _QrSegment(_QrSegment.Mode.NUMERIC, digits.length, bb);\n }\n // Returns a segment representing the given text string encoded in alphanumeric mode.\n // The characters allowed are: 0 to 9, A to Z (uppercase only), space,\n // dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static makeAlphanumeric(text) {\n if (!_QrSegment.isAlphanumeric(text))\n throw new RangeError(\"String contains unencodable characters in alphanumeric mode\");\n let bb = [];\n let i;\n for (i = 0; i + 2 <= text.length; i += 2) {\n let temp = _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45;\n temp += _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1));\n appendBits(temp, 11, bb);\n }\n if (i < text.length)\n appendBits(_QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb);\n return new _QrSegment(_QrSegment.Mode.ALPHANUMERIC, text.length, bb);\n }\n // Returns a new mutable list of zero or more segments to represent the given Unicode text string.\n // The result may use various segment modes and switch modes to optimize the length of the bit stream.\n static makeSegments(text) {\n if (text == \"\")\n return [];\n else if (_QrSegment.isNumeric(text))\n return [_QrSegment.makeNumeric(text)];\n else if (_QrSegment.isAlphanumeric(text))\n return [_QrSegment.makeAlphanumeric(text)];\n else\n return [_QrSegment.makeBytes(_QrSegment.toUtf8ByteArray(text))];\n }\n // Returns a segment representing an Extended Channel Interpretation\n // (ECI) designator with the given assignment value.\n static makeEci(assignVal) {\n let bb = [];\n if (assignVal < 0)\n throw new RangeError(\"ECI assignment value out of range\");\n else if (assignVal < 1 << 7)\n appendBits(assignVal, 8, bb);\n else if (assignVal < 1 << 14) {\n appendBits(2, 2, bb);\n appendBits(assignVal, 14, bb);\n } else if (assignVal < 1e6) {\n appendBits(6, 3, bb);\n appendBits(assignVal, 21, bb);\n } else\n throw new RangeError(\"ECI assignment value out of range\");\n return new _QrSegment(_QrSegment.Mode.ECI, 0, bb);\n }\n // Tests whether the given string can be encoded as a segment in numeric mode.\n // A string is encodable iff each character is in the range 0 to 9.\n static isNumeric(text) {\n return _QrSegment.NUMERIC_REGEX.test(text);\n }\n // Tests whether the given string can be encoded as a segment in alphanumeric mode.\n // A string is encodable iff each character is in the following set: 0 to 9, A to Z\n // (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static isAlphanumeric(text) {\n return _QrSegment.ALPHANUMERIC_REGEX.test(text);\n }\n /*-- Methods --*/\n // Returns a new copy of the data bits of this segment.\n getData() {\n return this.bitData.slice();\n }\n // (Package-private) Calculates and returns the number of bits needed to encode the given segments at\n // the given version. The result is infinity if a segment has too many characters to fit its length field.\n static getTotalBits(segs, version) {\n let result = 0;\n for (const seg of segs) {\n const ccbits = seg.mode.numCharCountBits(version);\n if (seg.numChars >= 1 << ccbits)\n return Infinity;\n result += 4 + ccbits + seg.bitData.length;\n }\n return result;\n }\n // Returns a new array of bytes representing the given string encoded in UTF-8.\n static toUtf8ByteArray(str) {\n str = encodeURI(str);\n let result = [];\n for (let i = 0; i < str.length; i++) {\n if (str.charAt(i) != \"%\")\n result.push(str.charCodeAt(i));\n else {\n result.push(parseInt(str.substring(i + 1, i + 3), 16));\n i += 2;\n }\n }\n return result;\n }\n };\n /*-- Constants --*/\n // Describes precisely all strings that are encodable in numeric mode.\n _QrSegment.NUMERIC_REGEX = /^[0-9]*$/;\n // Describes precisely all strings that are encodable in alphanumeric mode.\n _QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\\/:-]*$/;\n // The set of all legal characters in alphanumeric mode,\n // where each character value maps to the index in the string.\n _QrSegment.ALPHANUMERIC_CHARSET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:\";\n let QrSegment = _QrSegment;\n qrcodegen2.QrSegment = _QrSegment;\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrCode;\n ((QrCode2) => {\n const _Ecc = class _Ecc {\n // The QR Code can tolerate about 30% erroneous codewords\n /*-- Constructor and fields --*/\n constructor(ordinal, formatBits) {\n this.ordinal = ordinal;\n this.formatBits = formatBits;\n }\n };\n /*-- Constants --*/\n _Ecc.LOW = new _Ecc(0, 1);\n // The QR Code can tolerate about 7% erroneous codewords\n _Ecc.MEDIUM = new _Ecc(1, 0);\n // The QR Code can tolerate about 15% erroneous codewords\n _Ecc.QUARTILE = new _Ecc(2, 3);\n // The QR Code can tolerate about 25% erroneous codewords\n _Ecc.HIGH = new _Ecc(3, 2);\n let Ecc = _Ecc;\n QrCode2.Ecc = _Ecc;\n })(QrCode = qrcodegen2.QrCode || (qrcodegen2.QrCode = {}));\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrSegment;\n ((QrSegment2) => {\n const _Mode = class _Mode {\n /*-- Constructor and fields --*/\n constructor(modeBits, numBitsCharCount) {\n this.modeBits = modeBits;\n this.numBitsCharCount = numBitsCharCount;\n }\n /*-- Method --*/\n // (Package-private) Returns the bit width of the character count field for a segment in\n // this mode in a QR Code at the given version number. The result is in the range [0, 16].\n numCharCountBits(ver) {\n return this.numBitsCharCount[Math.floor((ver + 7) / 17)];\n }\n };\n /*-- Constants --*/\n _Mode.NUMERIC = new _Mode(1, [10, 12, 14]);\n _Mode.ALPHANUMERIC = new _Mode(2, [9, 11, 13]);\n _Mode.BYTE = new _Mode(4, [8, 16, 16]);\n _Mode.KANJI = new _Mode(8, [8, 10, 12]);\n _Mode.ECI = new _Mode(7, [0, 0, 0]);\n let Mode = _Mode;\n QrSegment2.Mode = _Mode;\n })(QrSegment = qrcodegen2.QrSegment || (qrcodegen2.QrSegment = {}));\n})(qrcodegen || (qrcodegen = {}));\nvar qrcodegen_default = qrcodegen;\n\n// src/index.tsx\n/**\n * @license qrcode.react\n * Copyright (c) Paul O'Shannessy\n * SPDX-License-Identifier: ISC\n */\nvar ERROR_LEVEL_MAP = {\n L: qrcodegen_default.QrCode.Ecc.LOW,\n M: qrcodegen_default.QrCode.Ecc.MEDIUM,\n Q: qrcodegen_default.QrCode.Ecc.QUARTILE,\n H: qrcodegen_default.QrCode.Ecc.HIGH\n};\nvar DEFAULT_SIZE = 128;\nvar DEFAULT_LEVEL = \"L\";\nvar DEFAULT_BGCOLOR = \"#FFFFFF\";\nvar DEFAULT_FGCOLOR = \"#000000\";\nvar DEFAULT_INCLUDEMARGIN = false;\nvar DEFAULT_MINVERSION = 1;\nvar SPEC_MARGIN_SIZE = 4;\nvar DEFAULT_MARGIN_SIZE = 0;\nvar DEFAULT_IMG_SCALE = 0.1;\nfunction generatePath(modules, margin = 0) {\n const ops = [];\n modules.forEach(function(row, y) {\n let start = null;\n row.forEach(function(cell, x) {\n if (!cell && start !== null) {\n ops.push(\n `M${start + margin} ${y + margin}h${x - start}v1H${start + margin}z`\n );\n start = null;\n return;\n }\n if (x === row.length - 1) {\n if (!cell) {\n return;\n }\n if (start === null) {\n ops.push(`M${x + margin},${y + margin} h1v1H${x + margin}z`);\n } else {\n ops.push(\n `M${start + margin},${y + margin} h${x + 1 - start}v1H${start + margin}z`\n );\n }\n return;\n }\n if (cell && start === null) {\n start = x;\n }\n });\n });\n return ops.join(\"\");\n}\nfunction excavateModules(modules, excavation) {\n return modules.slice().map((row, y) => {\n if (y < excavation.y || y >= excavation.y + excavation.h) {\n return row;\n }\n return row.map((cell, x) => {\n if (x < excavation.x || x >= excavation.x + excavation.w) {\n return cell;\n }\n return false;\n });\n });\n}\nfunction getImageSettings(cells, size, margin, imageSettings) {\n if (imageSettings == null) {\n return null;\n }\n const numCells = cells.length + margin * 2;\n const defaultSize = Math.floor(size * DEFAULT_IMG_SCALE);\n const scale = numCells / size;\n const w = (imageSettings.width || defaultSize) * scale;\n const h = (imageSettings.height || defaultSize) * scale;\n const x = imageSettings.x == null ? cells.length / 2 - w / 2 : imageSettings.x * scale;\n const y = imageSettings.y == null ? cells.length / 2 - h / 2 : imageSettings.y * scale;\n const opacity = imageSettings.opacity == null ? 1 : imageSettings.opacity;\n let excavation = null;\n if (imageSettings.excavate) {\n let floorX = Math.floor(x);\n let floorY = Math.floor(y);\n let ceilW = Math.ceil(w + x - floorX);\n let ceilH = Math.ceil(h + y - floorY);\n excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };\n }\n const crossOrigin = imageSettings.crossOrigin;\n return { x, y, h, w, excavation, opacity, crossOrigin };\n}\nfunction getMarginSize(includeMargin, marginSize) {\n if (marginSize != null) {\n return Math.max(Math.floor(marginSize), 0);\n }\n return includeMargin ? SPEC_MARGIN_SIZE : DEFAULT_MARGIN_SIZE;\n}\nfunction useQRCode({\n value,\n level,\n minVersion,\n includeMargin,\n marginSize,\n imageSettings,\n size,\n boostLevel\n}) {\n let qrcode = React.useMemo(() => {\n const values = Array.isArray(value) ? value : [value];\n const segments = values.reduce((accum, v) => {\n accum.push(...qrcodegen_default.QrSegment.makeSegments(v));\n return accum;\n }, []);\n return qrcodegen_default.QrCode.encodeSegments(\n segments,\n ERROR_LEVEL_MAP[level],\n minVersion,\n void 0,\n void 0,\n boostLevel\n );\n }, [value, level, minVersion, boostLevel]);\n const { cells, margin, numCells, calculatedImageSettings } = React.useMemo(() => {\n let cells2 = qrcode.getModules();\n const margin2 = getMarginSize(includeMargin, marginSize);\n const numCells2 = cells2.length + margin2 * 2;\n const calculatedImageSettings2 = getImageSettings(\n cells2,\n size,\n margin2,\n imageSettings\n );\n return {\n cells: cells2,\n margin: margin2,\n numCells: numCells2,\n calculatedImageSettings: calculatedImageSettings2\n };\n }, [qrcode, size, imageSettings, includeMargin, marginSize]);\n return {\n qrcode,\n margin,\n cells,\n numCells,\n calculatedImageSettings\n };\n}\nvar SUPPORTS_PATH2D = function() {\n try {\n new Path2D().addPath(new Path2D());\n } catch (e) {\n return false;\n }\n return true;\n}();\nvar QRCodeCanvas = React.forwardRef(\n function QRCodeCanvas2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n marginSize,\n imageSettings\n } = _a, extraProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const _b = extraProps, { style } = _b, otherProps = __objRest(_b, [\"style\"]);\n const imgSrc = imageSettings == null ? void 0 : imageSettings.src;\n const _canvas = React.useRef(null);\n const _image = React.useRef(null);\n const setCanvasRef = React.useCallback(\n (node) => {\n _canvas.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef]\n );\n const [isImgLoaded, setIsImageLoaded] = React.useState(false);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n React.useEffect(() => {\n if (_canvas.current != null) {\n const canvas = _canvas.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n let cellsToDraw = cells;\n const image = _image.current;\n const haveImageToRender = calculatedImageSettings != null && image !== null && image.complete && image.naturalHeight !== 0 && image.naturalWidth !== 0;\n if (haveImageToRender) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n }\n const pixelRatio = window.devicePixelRatio || 1;\n canvas.height = canvas.width = size * pixelRatio;\n const scale = size / numCells * pixelRatio;\n ctx.scale(scale, scale);\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, numCells, numCells);\n ctx.fillStyle = fgColor;\n if (SUPPORTS_PATH2D) {\n ctx.fill(new Path2D(generatePath(cellsToDraw, margin)));\n } else {\n cells.forEach(function(row, rdx) {\n row.forEach(function(cell, cdx) {\n if (cell) {\n ctx.fillRect(cdx + margin, rdx + margin, 1, 1);\n }\n });\n });\n }\n if (calculatedImageSettings) {\n ctx.globalAlpha = calculatedImageSettings.opacity;\n }\n if (haveImageToRender) {\n ctx.drawImage(\n image,\n calculatedImageSettings.x + margin,\n calculatedImageSettings.y + margin,\n calculatedImageSettings.w,\n calculatedImageSettings.h\n );\n }\n }\n });\n React.useEffect(() => {\n setIsImageLoaded(false);\n }, [imgSrc]);\n const canvasStyle = __spreadValues({ height: size, width: size }, style);\n let img = null;\n if (imgSrc != null) {\n img = /* @__PURE__ */ React.createElement(\n \"img\",\n {\n src: imgSrc,\n key: imgSrc,\n style: { display: \"none\" },\n onLoad: () => {\n setIsImageLoaded(true);\n },\n ref: _image,\n crossOrigin: calculatedImageSettings == null ? void 0 : calculatedImageSettings.crossOrigin\n }\n );\n }\n return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\n \"canvas\",\n __spreadValues({\n style: canvasStyle,\n height: size,\n width: size,\n ref: setCanvasRef,\n role: \"img\"\n }, otherProps)\n ), img);\n }\n);\nQRCodeCanvas.displayName = \"QRCodeCanvas\";\nvar QRCodeSVG = React.forwardRef(\n function QRCodeSVG2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n title,\n marginSize,\n imageSettings\n } = _a, otherProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"title\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n let cellsToDraw = cells;\n let image = null;\n if (imageSettings != null && calculatedImageSettings != null) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n image = /* @__PURE__ */ React.createElement(\n \"image\",\n {\n href: imageSettings.src,\n height: calculatedImageSettings.h,\n width: calculatedImageSettings.w,\n x: calculatedImageSettings.x + margin,\n y: calculatedImageSettings.y + margin,\n preserveAspectRatio: \"none\",\n opacity: calculatedImageSettings.opacity,\n crossOrigin: calculatedImageSettings.crossOrigin\n }\n );\n }\n const fgPath = generatePath(cellsToDraw, margin);\n return /* @__PURE__ */ React.createElement(\n \"svg\",\n __spreadValues({\n height: size,\n width: size,\n viewBox: `0 0 ${numCells} ${numCells}`,\n ref: forwardedRef,\n role: \"img\"\n }, otherProps),\n !!title && /* @__PURE__ */ React.createElement(\"title\", null, title),\n /* @__PURE__ */ React.createElement(\n \"path\",\n {\n fill: bgColor,\n d: `M0,0 h${numCells}v${numCells}H0z`,\n shapeRendering: \"crispEdges\"\n }\n ),\n /* @__PURE__ */ React.createElement(\"path\", { fill: fgColor, d: fgPath, shapeRendering: \"crispEdges\" }),\n image\n );\n }\n);\nQRCodeSVG.displayName = \"QRCodeSVG\";\nexport {\n QRCodeCanvas,\n QRCodeSVG\n};\n", ".dsh-partner-channel-toolbar { display:flex; align-items:center; justify-content:space-between; gap:16px; }\n.dsh-partner-channel-toolbar > button { flex-shrink:0; min-height:44px; }\n.dsh-partner-channel-list { display:grid; gap:12px; }\n.dsh-partner-channels > .dsh-partner-channel-notifications { margin-top:24px; padding-top:24px; border-top:1px solid var(--partner-separator); }\n.dsh-partner-workspace .dsh-partner-channel-form { display:grid; grid-template-columns:minmax(0,1fr); gap:18px; }\n.dsh-partner-workspace .dsh-partner-channel-form > .dsh-partner-channel-field { display:grid; grid-template-columns:minmax(0,1fr); gap:8px; min-width:0; margin:0; }\n.dsh-partner-channel-field > span { font-weight:600; }\n.dsh-partner-channel-field > small { color:var(--partner-text-secondary); line-height:1.5; text-align:start; overflow-wrap:anywhere; }\n.dsh-partner-workspace .dsh-partner-channel-field > :is(input,select) { width:100%; min-width:0; min-height:44px; box-sizing:border-box; }\n.dsh-partner-channel-form > footer { display:flex; flex-wrap:wrap; gap:8px; justify-content:flex-end; }\n.dsh-partner-channel-row { min-width:0; display:flex; align-items:center; gap:12px; padding:16px; border:1px solid var(--partner-border); border-radius:14px; background:var(--partner-card-surface); box-shadow:var(--partner-card-shadow); }\n.dsh-partner-channel-row > span:first-child { flex:1; min-width:0; display:grid; gap:4px; overflow-wrap:anywhere; }\n.dsh-partner-channel-row > span:first-child small { color:var(--partner-text-secondary); font-size:13px; }\n.dsh-partner-channel-row > button { flex-shrink:0; min-height:44px; padding-inline:18px; }\n.dsh-partner-channel-detail { padding:0 16px 16px; display:grid; gap:16px; overflow-wrap:anywhere; }\n.dsh-partner-channel-detail > form + form { border-top:1px solid var(--partner-border); padding-top:16px; }\n.dsh-partner-channel-manage { padding:0; gap:20px; }\n.dsh-partner-channel-connection { display:flex; align-items:center; gap:16px; }\n.dsh-partner-channel-connection > span:first-child { flex:1; min-width:0; display:grid; gap:6px; }\n.dsh-partner-channel-manage p { margin:0; color:var(--partner-text-secondary); line-height:1.6; }\n.dsh-partner-channel-manage small { color:var(--partner-text-secondary); }\n.dsh-partner-channel-manage .dsh-partner-form-actions { flex-wrap:wrap; gap:12px; }\n.dsh-partner-channel-manage button { flex-shrink:0; white-space:nowrap; min-height:44px; padding-inline:16px; }\n.dsh-partner-channel-access { padding-top:20px; border-top:1px solid var(--partner-separator); display:grid; gap:12px; }\n.dsh-partner-channel-access h3 { margin:0; font-size:var(--partner-font-label); }\n.dsh-partner-channel-person { display:flex; align-items:center; flex-wrap:wrap; gap:16px; padding:16px; border:1px solid var(--partner-border); border-radius:12px; background:var(--partner-control); }\n.dsh-partner-channel-person > div { display:grid; gap:6px; flex:1 1 200px; min-width:0; }\n.dsh-partner-channel-person code { font-size:16px; letter-spacing:.1em; font-weight:600; }\n.dsh-partner-sidebar,\n.dsh-partner-pendant,\n.dsh-partner-workspace {\n color-scheme: light;\n /* The host remains the canvas. Panes, cards and controls own progressively\n stronger materials, following the knowledge workspace contract. */\n --partner-surface: transparent;\n --partner-pane: rgba(255, 255, 255, .08);\n --partner-raised: rgba(255, 255, 255, .24);\n --partner-control: rgba(255, 255, 255, .27);\n --partner-control-hover: rgba(255, 255, 255, .38);\n --partner-card-surface: rgba(255, 255, 255, .24);\n --partner-card-highlight: rgba(255, 255, 255, .58);\n --partner-solid-panel: #f4f4f4;\n --partner-solid-raised: #fafafa;\n --partner-solid-control: #ffffff;\n --partner-dialog-veil: transparent;\n --partner-card-shadow:\n inset 0 1px 0 var(--partner-card-highlight),\n inset 0 -1px 0 rgba(60, 60, 67, .08),\n 0 9px 24px rgba(31, 31, 35, .075),\n 0 2px 6px rgba(31, 31, 35, .04);\n --partner-text: #1d1d1f;\n --partner-text-secondary: #515154;\n --partner-text-tertiary: #747478;\n --partner-accent: #6e6e73;\n --partner-accent-strong: #2c2c2e;\n --partner-on-accent: #ffffff;\n --partner-success: #248a3d;\n --partner-weixin: #248a52;\n --partner-warning: #c93400;\n --partner-danger: #d70015;\n --partner-border: rgba(60, 60, 67, .14);\n --partner-separator: rgba(60, 60, 67, .11);\n --partner-hover: rgba(118, 118, 128, .09);\n --partner-selected: rgba(60, 60, 67, .085);\n --partner-focus-ring: rgba(60, 60, 67, .46);\n --partner-glass-clear: rgba(255, 255, 255, .11);\n --partner-glass-regular: rgba(255, 255, 255, .24);\n --partner-glass-thick: rgba(255, 255, 255, .42);\n --partner-glass-highlight: rgba(255, 255, 255, .7);\n --partner-glass-rim-shadow: rgba(60, 60, 67, .11);\n --partner-glass-filter: saturate(.65) contrast(1.015) blur(24px);\n --partner-frosted-filter: saturate(.65) contrast(1.015) blur(24px);\n --partner-toolbar-filter: saturate(.18) contrast(1.015) blur(24px);\n --partner-shadow-sm: 0 1px 2px rgba(0, 0, 0, .055);\n --partner-shadow-md: 0 10px 28px rgba(31, 31, 35, .085);\n --partner-shadow-lg: 0 24px 64px rgba(31, 31, 35, .14);\n --partner-glass-shadow:\n inset 0 1px 0 var(--partner-glass-highlight),\n inset 0 -1px 0 var(--partner-glass-rim-shadow),\n var(--partner-shadow-sm);\n --partner-ease-out: cubic-bezier(.22, 1, .36, 1);\n --partner-font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, \"SF Pro Text\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n --partner-font-caption: 12px;\n --partner-font-body: 13px;\n --partner-font-label: 14px;\n --partner-font-title: 18px;\n --partner-font-heading: 22px;\n --partner-font-display: clamp(24px, 2.2vw, 28px);\n color: var(--partner-text);\n font-family: var(--partner-font-family);\n font-size: var(--partner-font-body);\n line-height: 1.5;\n}\n\nbody[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace, .dsh-partner-pendant) {\n color-scheme: dark;\n --partner-surface: transparent;\n --partner-pane: rgb(16 23 25 / 18%);\n --partner-raised: rgb(32 41 43 / 58%);\n --partner-control: rgb(39 50 53 / 72%);\n --partner-control-hover: rgb(39 50 53 / 84%);\n --partner-card-surface: rgb(32 41 43 / 58%);\n --partner-card-highlight: rgba(255, 255, 255, .11);\n --partner-solid-panel: #182022;\n --partner-solid-raised: #20292b;\n --partner-solid-control: #273235;\n --partner-dialog-veil: transparent;\n --partner-card-shadow:\n inset 0 1px 0 var(--partner-card-highlight),\n inset 0 -1px 0 rgba(0, 0, 0, .28),\n 0 12px 30px rgba(0, 0, 0, .28),\n 0 2px 7px rgba(0, 0, 0, .2);\n --partner-text: #e3eaeb;\n --partner-text-secondary: #bbc9cc;\n --partner-text-tertiary: #95a7ab;\n --partner-accent: #69b6ba;\n --partner-accent-strong: #8aced0;\n --partner-on-accent: #101819;\n --partner-success: #30d158;\n --partner-weixin: #30c96b;\n --partner-warning: #ff9f0a;\n --partner-danger: #ff453a;\n --partner-border: rgb(184 204 205 / 11%);\n --partner-separator: rgb(184 204 205 / 8%);\n --partner-hover: rgb(105 182 186 / 9%);\n --partner-selected: rgb(105 182 186 / 14%);\n --partner-focus-ring: rgb(105 182 186 / 72%);\n --partner-glass-clear: rgba(0, 0, 0, .1);\n --partner-glass-regular: rgba(0, 0, 0, .16);\n --partner-glass-thick: rgba(0, 0, 0, .26);\n --partner-glass-highlight: rgba(255, 255, 255, .16);\n --partner-glass-rim-shadow: rgba(0, 0, 0, .3);\n --partner-glass-filter: saturate(.55) contrast(1.02) blur(24px);\n --partner-frosted-filter: saturate(.55) contrast(1.02) blur(24px);\n --partner-toolbar-filter: saturate(.45) contrast(1.02) blur(24px);\n --partner-shadow-sm: 0 1px 2px rgba(0, 0, 0, .28);\n --partner-shadow-md: 0 12px 32px rgba(0, 0, 0, .34);\n --partner-shadow-lg: 0 28px 72px rgba(0, 0, 0, .48);\n}\n\n.dsh-partner-sidebar,\n.dsh-partner-sidebar *,\n.dsh-partner-workspace,\n.dsh-partner-workspace * { box-sizing: border-box; }\n\n.dsh-partner-sidebar :where(button, input, textarea, select),\n.dsh-partner-workspace :where(button, input, textarea, select) {\n margin: 0;\n border-radius: 0;\n appearance: none;\n color: inherit;\n font-family: var(--partner-font-family);\n font-size: inherit;\n font-weight: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n}\n\n.dsh-partner-sidebar :where(button, input, textarea, select):focus,\n.dsh-partner-workspace :where(button, input, textarea, select):focus { outline: none; }\n\n.dsh-partner-sidebar :where(button, input, textarea, select):focus-visible,\n.dsh-partner-workspace :where(button, input, textarea, select):focus-visible {\n outline: 2px solid var(--partner-focus-ring);\n outline-offset: 2px;\n}\n\n.dsh-partner-sidebar :where(button, input, textarea, select):disabled,\n.dsh-partner-workspace :where(button, input, textarea, select):disabled {\n opacity: .45;\n cursor: default;\n}\n\n.dsh-partner-workspace select {\n padding-right: 32px;\n background-image:\n linear-gradient(45deg, transparent 50%, currentColor 50%),\n linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position:\n calc(100% - 15px) calc(50% - 1px),\n calc(100% - 11px) calc(50% - 1px);\n background-repeat: no-repeat;\n background-size: 4px 4px, 4px 4px;\n}\n\n.dsh-partner-workspace input[type=\"number\"] { appearance: textfield; }\n.dsh-partner-workspace input[type=\"number\"]::-webkit-inner-spin-button,\n.dsh-partner-workspace input[type=\"number\"]::-webkit-outer-spin-button { margin: 0; appearance: none; }\n\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds) {\n scrollbar-width: thin;\n scrollbar-color: color-mix(in srgb, var(--partner-text) 20%, transparent) transparent;\n}\n\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar { width: 6px; height: 6px; }\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar-track { background: transparent; }\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar-thumb {\n border: 1px solid transparent;\n border-radius: 999px;\n background: color-mix(in srgb, var(--partner-text) 20%, transparent);\n background-clip: padding-box;\n}\n\n/* Skills, board and schedule modules share the partner workspace scale. */\n.dsh-partner-feature-page { display: grid; width: min(100%, 1180px); align-content: start; gap: 18px; margin: 0 auto; padding: 26px clamp(22px, 4vw, 52px) 52px; font: var(--partner-font-body)/1.5 var(--partner-font-family); }\n.dsh-partner-feature-page.is-board { width: min(100%, 1480px); gap: 12px; }\n.dsh-partner-feature-hero { display: flex; min-height: 86px; align-items: end; justify-content: space-between; gap: 24px; padding: 0 2px 16px 14px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-feature-hero > span { position: relative; display: grid; min-width: 0; gap: 4px; }\n.dsh-partner-feature-hero > span::before { position: absolute; top: 3px; bottom: 2px; left: -14px; width: 2px; border-radius: 2px; background: linear-gradient(var(--partner-text-secondary), transparent 92%); content: ''; }\n.dsh-partner-feature-hero small,\n.dsh-partner-capability-detail > header small { color: var(--partner-accent); font: 700 var(--partner-font-caption)/1.3 var(--partner-font-family); letter-spacing: .1em; }\n.dsh-partner-feature-hero h2 { margin: 0; color: var(--partner-text); font: 650 var(--partner-font-display)/1.18 var(--partner-font-family); letter-spacing: -.035em; }\n.dsh-partner-feature-hero p { max-width: 680px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-feature-hero > div { display: flex; align-items: end; gap: 8px; }\n.dsh-partner-feature-hero button,\n.dsh-partner-feature-block > header button,\n.dsh-partner-market-grid button,\n.dsh-partner-board button,\n:where(.dsh-partner-feature-page.is-board) button,\n.dsh-partner-schedule-list button,\n.dsh-partner-feature-form button,\n.dsh-partner-task-form button,\n.dsh-partner-schedule-form button { display: inline-flex; min-height: 36px; align-items: center; justify-content: center; gap: 6px; padding: 0 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease, transform .15s var(--partner-ease-out); }\n.dsh-partner-feature-page button:not(:disabled):hover { color: var(--partner-text); border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-feature-page button:not(:disabled):active { transform: translateY(1px); }\n.dsh-partner-feature-block,\n.dsh-partner-capability-detail { display: grid; gap: 14px; padding: 18px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n.dsh-partner-capability-detail { margin: 0 0 18px; }\n.dsh-partner-feature-block > header,\n.dsh-partner-capability-detail > header { display: flex; min-height: 36px; align-items: center; justify-content: space-between; gap: 16px; }\n.dsh-partner-feature-block > header > span,\n.dsh-partner-capability-detail > header > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-feature-block > header > div { display: flex; align-items: center; justify-content: flex-end; gap: 8px; }\n.dsh-partner-capability-actions { display: flex; align-items: center; justify-content: flex-end; gap: 10px; }\n.dsh-partner-capability-actions > button { display: inline-flex; min-height: 34px; align-items: center; justify-content: center; gap: 6px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease; }\n.dsh-partner-capability-actions > button:hover { color: var(--partner-text); border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-feature-block > header strong,\n.dsh-partner-capability-detail > header strong { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-feature-block > header small,\n.dsh-partner-capability-detail > header em { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; }\n.dsh-partner-feature-empty { margin: 0; padding: 24px 16px; border: 1px dashed var(--partner-border); border-radius: 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); line-height: 1.55; text-align: center; }\n.dsh-partner-inline-warning { margin: 0; padding: 9px 11px; border-radius: 9px; color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 8%, transparent); font-size: var(--partner-font-caption); }\n.dsh-partner-feature-error { margin: 0; padding: 10px 12px; border: 1px solid color-mix(in srgb, var(--partner-danger) 22%, transparent); border-radius: 10px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-raised)); font-size: var(--partner-font-body); line-height: 1.5; overflow-wrap: anywhere; }\n.dsh-partner-skill-installed { display: grid; gap: 8px; }\n.dsh-partner-skill-installed.is-binding { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-market-toolbar { display: grid; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 14px; background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n.dsh-partner-market-sources { display: flex; gap: 5px; overflow-x: auto; padding: 7px; border-top: 1px solid var(--partner-separator); background: color-mix(in srgb, var(--partner-control) 74%, transparent); scrollbar-width: thin; }\n.dsh-partner-market-sources > button { display: inline-flex; min-height: 34px; flex: 0 0 auto; align-items: center; gap: 7px; padding: 0 10px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease; }\n.dsh-partner-market-sources > button:hover { color: var(--partner-text-secondary); background: var(--partner-hover); }\n.dsh-partner-market-sources > button:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: -2px; }\n.dsh-partner-market-sources > button.is-active { border-color: var(--partner-separator); color: var(--partner-text); background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), 0 1px 3px color-mix(in srgb, #000 7%, transparent); }\n.dsh-partner-market-sources small { display: grid; min-width: 20px; height: 20px; place-items: center; padding: 0 5px; border-radius: 7px; color: var(--partner-text-tertiary); background: var(--partner-selected); font-size: var(--partner-font-caption); }\n.dsh-partner-skill-installed > article { display: grid; min-height: 72px; grid-template-columns: 36px minmax(0, 1fr) auto 32px; align-items: center; gap: 11px; padding: 11px 12px; border: 1px solid var(--partner-separator); border-radius: 12px; background: var(--partner-raised); }\n.dsh-partner-skill-installed.is-market > article { grid-template-columns: 36px minmax(0, 1fr) 32px; }\n.dsh-partner-skill-installed.is-binding > article { min-height: 122px; grid-template-columns: 36px minmax(0, 1fr) auto; align-content: start; align-items: start; padding: 13px; }\n.dsh-partner-skill-installed.is-binding .dsh-partner-skill-mark { margin-top: 1px; }\n.dsh-partner-skill-installed.is-binding article > span:nth-child(2) { gap: 5px; }\n.dsh-partner-skill-installed.is-binding p { display: -webkit-box; line-height: 1.5; white-space: normal; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-skill-mark { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 11px; color: var(--partner-text-secondary); background: var(--partner-selected); }\n.dsh-partner-skill-installed article > span:nth-child(2) { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-skill-installed strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-skill-installed p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-skill-installed .dsh-partner-skill-action-error { grid-column: 2 / -1; overflow: visible; padding: 8px 10px; border-radius: 8px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, transparent); font-size: var(--partner-font-caption); line-height: 1.45; text-overflow: clip; white-space: normal; overflow-wrap: anywhere; }\n.dsh-partner-skill-installed small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-feature-switch { position: relative; width: 38px; height: 22px; min-height: 22px !important; padding: 0 !important; border-radius: 999px !important; background: color-mix(in srgb, var(--partner-text) 9%, transparent) !important; box-shadow: none !important; }\n.dsh-partner-feature-switch i { position: absolute; top: 3px; left: 3px; width: 14px; height: 14px; border-radius: 50%; background: var(--partner-raised); box-shadow: 0 1px 3px color-mix(in srgb, #000 16%, transparent); transition: transform .18s var(--partner-ease-out); }\n.dsh-partner-feature-switch[data-on=\"true\"] { border-color: var(--partner-accent-strong) !important; background: var(--partner-accent-strong) !important; }\n.dsh-partner-feature-switch[data-on=\"true\"] i { transform: translateX(16px); }\n.dsh-partner-skill-binding-action,\n.dsh-partner-skill-picker button { display: inline-flex; min-height: 34px; align-items: center; justify-content: center; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease; }\n.dsh-partner-skill-binding-action:hover,\n.dsh-partner-skill-picker button:hover { color: var(--partner-text); border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-skill-binding-action:disabled,\n.dsh-partner-skill-picker button:disabled { cursor: wait; opacity: .56; }\n.dsh-partner-skill-disclosure { justify-self: center; min-height: 34px; padding: 0 12px; border-color: transparent; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font-size: var(--partner-font-body); }\n.dsh-partner-skill-disclosure:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-skill-picker { display: grid; gap: 10px; padding: 12px; border: 1px solid var(--partner-border); border-radius: 13px; background: color-mix(in srgb, var(--partner-control) 72%, transparent); animation: dsh-partner-reveal .16s ease-out; }\n.dsh-partner-skill-search { display: grid; min-height: 56px; grid-template-columns: 36px minmax(0, 1fr) auto auto; align-items: center; gap: 10px; padding: 9px 13px; color: var(--partner-text-tertiary); background: transparent; transition: background .15s ease, border-color .15s ease, box-shadow .15s ease; }\n.dsh-partner-skill-search:focus-within { background: color-mix(in srgb, var(--partner-selected) 28%, transparent); box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--partner-focus-ring) 62%, transparent); }\n.dsh-partner-skill-search-icon { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-control); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-skill-search input { min-width: 0; height: 36px; padding: 0; border: 0; border-radius: 0; outline: 0; appearance: none; color: var(--partner-text); background: transparent; box-shadow: none; font: 500 var(--partner-font-label)/1.4 var(--partner-font-family); }\n.dsh-partner-skill-search input::placeholder { color: var(--partner-text-tertiary); opacity: 1; }\n.dsh-partner-skill-search input::-webkit-search-cancel-button { display: none; appearance: none; }\n.dsh-partner-skill-search .dsh-partner-skill-search-clear { display: grid; width: 30px; min-height: 30px; place-items: center; padding: 0; border: 0; border-radius: 8px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; cursor: pointer; }\n.dsh-partner-skill-search .dsh-partner-skill-search-clear:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-skill-search .dsh-partner-skill-search-clear:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: -2px; }\n.dsh-partner-skill-search-count { min-width: 56px; padding-left: 11px; border-left: 1px solid var(--partner-separator); color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 580; line-height: 20px; text-align: right; white-space: nowrap; }\n.dsh-partner-skill-search.is-compact { min-height: 42px; grid-template-columns: 30px minmax(0, 1fr) auto auto; gap: 8px; padding: 5px 8px; border: 1px solid var(--partner-border); border-radius: 11px; background: var(--partner-raised); }\n.dsh-partner-skill-search.is-compact:focus-within { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 15%, transparent); }\n.dsh-partner-skill-search.is-compact .dsh-partner-skill-search-icon { width: 30px; height: 30px; border-radius: 8px; }\n.dsh-partner-skill-search.is-compact input { height: 30px; font-size: var(--partner-font-body); }\n.dsh-partner-skill-search.is-compact .dsh-partner-skill-search-count { min-width: 48px; padding-left: 8px; }\n.dsh-partner-skill-picker-list { display: grid; max-height: 360px; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; }\n.dsh-partner-skill-picker-list > article { display: grid; min-height: 112px; grid-template-rows: minmax(0, 1fr) auto; gap: 10px; padding: 11px; border: 1px solid var(--partner-separator); border-radius: 11px; background: var(--partner-raised); }\n.dsh-partner-skill-picker-list article > span { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-skill-picker-list strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-skill-picker-list p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-skill-picker-list button { justify-self: end; }\n.dsh-partner-skill-picker-list small,\n.dsh-partner-skill-picker-limit { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-skill-picker-empty { margin: 0; padding: 20px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); text-align: center; }\n.dsh-partner-access-note { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-access-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }\n.dsh-partner-access-list > button { display: grid; min-width: 0; min-height: 92px; grid-template-columns: 36px minmax(0, 1fr) 22px; align-items: start; gap: 11px; padding: 12px; border: 1px solid var(--partner-separator); border-radius: 12px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1.5 var(--partner-font-family); text-align: left; cursor: pointer; transition: border-color .15s ease, background .15s ease, transform .15s var(--partner-ease-out); }\n.dsh-partner-access-list > button:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-access-list > button.is-active { border-color: color-mix(in srgb, var(--partner-accent) 55%, var(--partner-border)); background: color-mix(in srgb, var(--partner-selected) 74%, var(--partner-raised)); }\n.dsh-partner-access-avatar { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 12px; color: var(--partner-text); background: var(--partner-selected); font-size: var(--partner-font-caption); font-weight: 650; }\n.dsh-partner-access-copy { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-access-copy > strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-access-copy > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-access-copy > p { margin: 3px 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.5; }\n.dsh-partner-access-copy > span { display: flex; flex-wrap: wrap; gap: 5px; }\n.dsh-partner-access-copy em { padding: 2px 7px; border: 1px solid var(--partner-separator); border-radius: 999px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: var(--partner-font-caption); font-style: normal; line-height: 1.4; }\n.dsh-partner-access-check { display: grid; width: 22px; height: 22px; place-items: center; border: 1px solid var(--partner-border); border-radius: 7px; color: transparent; background: var(--partner-control); }\n.dsh-partner-access-list > button.is-active .dsh-partner-access-check { border-color: var(--partner-accent-strong); color: var(--partner-on-accent); background: var(--partner-accent-strong); }\n.dsh-partner-feature-block .is-icon,\n.dsh-partner-board .is-icon,\n.dsh-partner-schedule-list .is-icon { width: 32px; min-height: 32px; padding: 0; border-color: transparent; background: transparent; box-shadow: none; }\n.dsh-partner-market-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 10px; }\n.dsh-partner-market-grid > article { display: flex; min-height: 164px; flex-direction: column; justify-content: space-between; gap: 14px; padding: 15px; border: 1px solid var(--partner-separator); border-radius: 13px; background: var(--partner-raised); transition: border-color .16s ease, transform .18s var(--partner-ease-out); }\n.dsh-partner-market-grid > article:hover { transform: translateY(-1px); border-color: color-mix(in srgb, var(--partner-text) 22%, var(--partner-border)); }\n.dsh-partner-market-grid article > span { display: grid; gap: 6px; }\n.dsh-partner-market-grid article > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }\n.dsh-partner-market-grid strong { font-size: var(--partner-font-label); }\n.dsh-partner-market-grid p { display: -webkit-box; overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; -webkit-box-orient: vertical; -webkit-line-clamp: 3; }\n.dsh-partner-market-grid .dsh-partner-market-card-error { display: block; overflow: visible; padding: 8px 10px; border-radius: 8px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, transparent); font-size: var(--partner-font-caption); line-height: 1.45; overflow-wrap: anywhere; -webkit-line-clamp: unset; }\n.dsh-partner-market-grid footer { display: flex; align-items: center; justify-content: space-between; gap: 10px; }\n.dsh-partner-market-grid footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-feature-form,\n.dsh-partner-task-form,\n.dsh-partner-schedule-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; padding: 18px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label { display: grid; min-width: 0; gap: 8px; color: var(--partner-text-secondary); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label > span { color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.45; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select) { width: 100%; min-height: 38px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text); background: var(--partner-control); font: var(--partner-font-label)/1.5 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease, background .15s ease; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select):focus { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), inset 0 1px 0 var(--partner-glass-highlight); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) textarea { resize: vertical; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) .is-wide { grid-column: 1 / -1; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer { display: flex; grid-column: 1 / -1; justify-content: flex-end; gap: 8px; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > p { grid-column: 1 / -1; margin: 0; padding: 9px 11px; border-radius: 9px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 6%, transparent); font-size: var(--partner-font-body); }\n.dsh-partner-feature-form > p.is-success { color: var(--partner-success); background: color-mix(in srgb, var(--partner-success) 7%, transparent); }\n.dsh-partner-board-live { display: inline-flex; min-height: 36px; align-items: center; gap: 7px; padding: 0 10px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-board-live > i { width: 7px; height: 7px; border-radius: 50%; background: var(--partner-success); box-shadow: 0 0 0 4px color-mix(in srgb, var(--partner-success) 10%, transparent); }\n.dsh-partner-board-tools { display: grid; grid-template-columns: minmax(220px, 1fr) minmax(140px, 180px) auto; align-items: center; gap: 8px; }\n.dsh-partner-board-search { position: relative; display: flex; min-width: 0; align-items: center; }\n.dsh-partner-feature-page.is-board .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n.dsh-partner-board-assignee.is-mobile-stage { display: none; }\n.dsh-partner-board-search > span:not(.sr-only) { position: absolute; z-index: 1; left: 11px; display: grid; place-items: center; color: var(--partner-text-tertiary); pointer-events: none; }\n.dsh-partner-board-search > input,\n.dsh-partner-board-assignee > select { width: 100%; min-height: 38px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text); background-color: var(--partner-control); font: var(--partner-font-body)/1.4 var(--partner-font-family); transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease; }\n.dsh-partner-board-search > input { padding: 8px 38px 8px 34px; }\n.dsh-partner-board-search > input::placeholder { color: var(--partner-text-tertiary); }\n.dsh-partner-board-search > input:hover,\n.dsh-partner-board-assignee > select:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background-color: var(--partner-hover); }\n.dsh-partner-board-search > input:focus-visible,\n.dsh-partner-board-assignee > select:focus-visible { outline: 0; border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent); }\n.dsh-partner-board-search > button { position: absolute; z-index: 1; right: 4px; display: grid; width: 30px; min-height: 30px; place-items: center; padding: 0; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; }\n.dsh-partner-board-search > button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-board-assignee > select { min-width: 0; padding: 8px 30px 8px 10px; }\n.dsh-partner-board-tools > small { justify-self: end; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; white-space: nowrap; }\n.dsh-partner-board-statuses { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; padding-bottom: 2px; }\n.dsh-partner-board-statuses > button { display: inline-flex; min-height: 32px; align-items: center; gap: 7px; padding: 0 9px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font: var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; transition: border-color 140ms ease, color 140ms ease, background-color 140ms ease; }\n.dsh-partner-board-statuses > button:hover { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-board-statuses > button.is-active { border-color: color-mix(in srgb, var(--partner-text) 18%, var(--partner-border)); color: var(--partner-text); background: var(--partner-selected); }\n.dsh-partner-board-statuses b { min-width: 18px; color: inherit; font-size: inherit; font-variant-numeric: tabular-nums; font-weight: 650; text-align: center; }\n.dsh-partner-board { display: grid; grid-template-columns: minmax(0, 1fr); align-items: start; gap: 10px; min-width: 0; }\n.dsh-partner-board > section { display: grid; min-width: 0; align-content: start; padding: 8px 10px 10px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); }\n.dsh-partner-board > section > header { display: flex; min-height: 36px; align-items: center; padding: 0 0 6px; }\n.dsh-partner-board .dsh-partner-board-stage-toggle { display: flex; width: 100%; min-height: 32px; align-items: center; justify-content: flex-start; gap: 8px; padding: 4px; border: 0; border-radius: 7px; color: var(--partner-text); background: transparent; text-align: left; box-shadow: none; }\n.dsh-partner-board-stage-toggle:hover:not(:disabled) { background: var(--partner-hover); }\n.dsh-partner-board-stage-toggle[aria-expanded=\"true\"] > svg { transform: rotate(90deg); }\n.dsh-partner-board > section > [hidden] { display: none; }\n.dsh-partner-board > section > header strong { font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-board > section > header b { display: grid; min-width: 22px; height: 22px; place-items: center; padding: 0 5px; border-radius: 7px; color: var(--partner-text-tertiary); background: var(--partner-selected); font-size: var(--partner-font-caption); }\n.dsh-partner-board-column-list { display: grid; min-width: 0; grid-template-columns: repeat(auto-fill, minmax(min(240px, 100%), 1fr)); align-items: stretch; align-content: start; gap: 8px; }\n.dsh-partner-board-empty { margin: 0; padding: 0 4px 2px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-board-more { display: block; margin: 8px auto 0; min-height: 32px; padding: 4px 12px; border: 1px solid var(--partner-border); border-radius: 8px; background: transparent; color: var(--partner-text-secondary); box-shadow: none !important; }\n.dsh-partner-board-more:hover { background: var(--partner-hover); }\n.dsh-partner-task-card { position: relative; display: grid; min-height: 82px; overflow: hidden; border: 1px solid var(--partner-separator); border-radius: 11px; background: var(--partner-raised); box-shadow: none; transition: border-color .16s ease; }\n.dsh-partner-task-card:hover { border-color: color-mix(in srgb, var(--partner-text) 22%, var(--partner-border)); }\n.dsh-partner-task-card:focus-within { border-color: var(--partner-focus-ring); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), var(--partner-shadow-md); }\n.dsh-partner-task-card[data-blocked=\"true\"] { border-left-color: color-mix(in srgb, var(--partner-warning) 55%, var(--partner-border)); }\n.dsh-partner-task-summary { display: grid !important; min-height: 82px !important; grid-template-columns: minmax(0, 1fr) 16px; align-items: center !important; gap: 8px !important; padding: 10px 10px 10px 11px !important; border: 0 !important; border-radius: 0 !important; appearance: none; color: var(--partner-text) !important; background: transparent !important; box-shadow: none !important; font-family: var(--partner-font-family); text-align: left; cursor: pointer; }\n.dsh-partner-task-summary:hover { background: var(--partner-hover) !important; }\n.dsh-partner-task-summary:focus-visible { outline: 0; }\n.dsh-partner-task-summary > span { display: grid; min-width: 0; gap: 4px; }\n.dsh-partner-task-card-title { display: flex; min-width: 0; align-items: flex-start; justify-content: space-between; gap: 8px; }\n.dsh-partner-task-card-title > strong { display: -webkit-box; min-width: 0; overflow: hidden; color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 620; line-height: 1.38; overflow-wrap: anywhere; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-task-card-title > em { flex: none; margin-top: 1px; padding: 2px 5px; border: 1px solid var(--partner-separator); border-radius: 6px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: 10px; font-style: normal; font-weight: 620; line-height: 1.25; }\n.dsh-partner-task-card[data-priority=\"high\"] .dsh-partner-task-card-title > em { border-color: color-mix(in srgb, var(--partner-warning) 35%, var(--partner-separator)); color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 7%, var(--partner-control)); }\n.dsh-partner-task-card[data-priority=\"urgent\"] .dsh-partner-task-card-title > em { border-color: color-mix(in srgb, var(--partner-danger) 34%, var(--partner-separator)); color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-control)); }\n.dsh-partner-task-card-owner { overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-relations { display: flex; min-width: 0; align-items: center; flex-wrap: wrap; gap: 4px; }\n.dsh-partner-task-relations > small { padding: 2px 6px; border-radius: 6px; color: var(--partner-text-secondary); background: var(--partner-selected); font-size: 10px; font-variant-numeric: tabular-nums; line-height: 1.3; }\n.dsh-partner-task-relations > small[data-blocked=\"true\"] { color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 8%, var(--partner-selected)); }\n.dsh-partner-task-summary > svg { color: var(--partner-text-tertiary); transition: transform .16s var(--partner-ease-out), color .16s ease; }\n.dsh-partner-task-summary:hover > svg { color: var(--partner-text); transform: translateX(2px); }\n.dsh-partner-task-detail { display: grid; gap: 13px; }\n.dsh-partner-task-description { display: grid; gap: 6px; padding: 12px; border: 1px solid var(--partner-separator); border-radius: 10px; background: color-mix(in srgb, var(--partner-raised) 78%, transparent); }\n.dsh-partner-task-description strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-description p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; white-space: pre-wrap; overflow-wrap: anywhere; }\n.dsh-partner-task-fields { display: grid; gap: 7px; }\n.dsh-partner-task-contract { display: grid; gap: 12px; min-width: 0; color: var(--partner-text); font: var(--partner-font-body)/1.6 var(--partner-font-family); }\n.dsh-partner-task-contract header, .dsh-partner-task-contract li, .dsh-partner-task-contract li > div { display: grid; gap: 6px; min-width: 0; }\n.dsh-partner-task-contract ol { display: grid; gap: 14px; margin: 0; padding: 0; list-style: none; counter-reset: criterion; }\n.dsh-partner-task-contract li { counter-increment: criterion; border-top: 1px solid var(--partner-border); padding-top: 10px; }\n.dsh-partner-task-contract li > p { margin: 0; overflow-wrap: anywhere; }\n.dsh-partner-task-contract li > p::before { content: counter(criterion) '. '; color: var(--partner-text-tertiary); }\n.dsh-partner-task-contract small { font-size: var(--partner-font-caption); color: var(--partner-text-secondary); overflow-wrap: anywhere; }\n.dsh-partner-task-contract code { display: block; white-space: pre-wrap; overflow-wrap: anywhere; font-size: var(--partner-font-caption); }\n.dsh-partner-task-contract .dsh-partner-task-fields label { grid-template-columns: minmax(0, 1fr); gap: 5px; }\n.dsh-partner-task-contract :is(select, textarea) { box-sizing: border-box; width: 100%; min-width: 0; min-height: 38px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text); background: var(--partner-control); font: var(--partner-font-label)/1.5 var(--partner-font-family); }\n.dsh-partner-task-contract textarea { resize: vertical; }\n.dsh-partner-task-contract :is(select, textarea):focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-task-fields label { display: grid; grid-template-columns: 58px minmax(0, 1fr); align-items: center; gap: 8px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-detail select { width: 100%; height: 34px; padding: 0 28px 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background-color: var(--partner-control); font: var(--partner-font-body)/1 var(--partner-font-family); }\n.dsh-partner-task-detail select:focus { border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 14%, transparent); }\n.dsh-partner-task-execution { display: grid; min-height: 48px; grid-template-columns: 9px minmax(0, 1fr); align-items: start; gap: 10px; padding: 10px 11px; border: 1px solid color-mix(in srgb, var(--partner-accent) 24%, var(--partner-separator)); border-radius: 9px; background: color-mix(in srgb, var(--partner-accent) 5%, var(--partner-raised)); }\n.dsh-partner-task-execution > i { width: 7px; height: 7px; margin-top: 5px; border-radius: 50%; background: var(--partner-success); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-success) 12%, transparent); }\n.dsh-partner-task-execution[data-state=\"queued\"] > i { background: var(--partner-warning); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-warning) 12%, transparent); }\n.dsh-partner-task-execution > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-task-execution strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-execution small { overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.45; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-dependency { display: grid; gap: 7px; padding: 10px; border: 1px solid var(--partner-separator); border-radius: 9px; background: color-mix(in srgb, var(--partner-control) 64%, transparent); }\n.dsh-partner-task-dependency > header { display: grid; gap: 2px; }\n.dsh-partner-task-dependency > header strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-dependency > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.4; }\n.dsh-partner-task-dependency > div { display: grid; gap: 5px; }\n.dsh-partner-task-dependency > div > span { display: grid; min-height: 30px; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; gap: 6px; }\n.dsh-partner-task-dependency > div i { display: grid; width: 16px; height: 16px; place-items: center; border: 1px solid var(--partner-border); border-radius: 5px; color: var(--partner-on-accent); background: var(--partner-control); font-style: normal; }\n.dsh-partner-task-dependency > div span[data-done=\"true\"] i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-task-dependency > div b { overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); font-weight: 560; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-dependency > div button { min-height: 26px; padding: 0 7px; border-color: transparent; background: transparent; box-shadow: none; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-result { display: grid; gap: 6px; padding: 10px; border: 1px solid var(--partner-separator); border-radius: 9px; background: color-mix(in srgb, var(--partner-raised) 78%, transparent); }\n.dsh-partner-task-result strong,\n.dsh-partner-task-activity > strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-result p { max-height: 220px; margin: 0; overflow-y: auto; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; }\n.dsh-partner-task-activity { display: grid; gap: 6px; }\n.dsh-partner-task-activity ol { display: grid; gap: 5px; margin: 0; padding: 0; list-style: none; }\n.dsh-partner-task-activity li { display: grid; gap: 2px; padding-left: 8px; border-left: 2px solid var(--partner-separator); color: var(--partner-text-secondary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-activity time { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-reject,\n.dsh-partner-task-delete-confirm { display: grid; gap: 9px; padding: 10px; border: 1px solid var(--partner-border); border-radius: 9px; background: var(--partner-control); }\n.dsh-partner-task-reject label { display: grid; gap: 6px; color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-task-reject textarea { width: 100%; min-height: 76px; resize: vertical; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1.5 var(--partner-font-family); }\n.dsh-partner-task-reject textarea:focus { border-color: var(--partner-focus-ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 15%, transparent); }\n.dsh-partner-task-reject > div,\n.dsh-partner-task-delete-confirm > div { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px; }\n.dsh-partner-task-reject button,\n.dsh-partner-task-delete-confirm button { min-height: 32px; padding-inline: 10px; font-size: var(--partner-font-caption); }\n.dsh-partner-task-delete-confirm { border-color: color-mix(in srgb, var(--partner-danger) 28%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 6%, var(--partner-control)); }\n.dsh-partner-task-delete-confirm > span { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; }\n.dsh-partner-task-delete-confirm .is-danger { color: var(--partner-on-accent); border-color: var(--partner-danger); background: var(--partner-danger); }\n.dsh-partner-task-actions { display: grid; gap: 8px; padding-top: 9px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-task-actions > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-actions > span { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 5px; }\n.dsh-partner-task-actions button { min-height: 32px; padding-inline: 9px; font-size: var(--partner-font-caption); }\n.dsh-partner-task-actions button.is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-task-form,\n.dsh-partner-schedule-form { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-task-form .is-wide,\n.dsh-partner-schedule-form .is-wide { grid-column: 1 / -1; }\n.dsh-partner-task-form-dependencies { display: grid; gap: 8px; }\n.dsh-partner-task-form-dependencies > span { color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-task-form-dependencies > span > small { margin-left: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 500; }\n.dsh-partner-task-form-dependencies > div { display: grid; max-height: 180px; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; overflow-y: auto; padding: 6px; border: 1px solid var(--partner-border); border-radius: 10px; background: var(--partner-control); }\n.dsh-partner-task-form-dependencies label { display: grid; min-height: 36px; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; gap: 7px; padding: 0 7px; border-radius: 7px; color: var(--partner-text-secondary); cursor: pointer; }\n.dsh-partner-task-form-dependencies label:hover { background: var(--partner-hover); }\n.dsh-partner-task-form-dependencies input { position: absolute; width: 1px !important; min-height: 1px !important; opacity: 0; pointer-events: none; }\n.dsh-partner-task-form-dependencies label > i { display: grid; width: 18px; height: 18px; place-items: center; border: 1px solid var(--partner-border); border-radius: 5px; background: var(--partner-raised); }\n.dsh-partner-task-form-dependencies input:checked + i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-task-form-dependencies input:checked + i::after { width: 7px; height: 4px; border-bottom: 2px solid var(--partner-on-accent); border-left: 2px solid var(--partner-on-accent); content: ''; transform: rotate(-45deg) translateY(-1px); }\n.dsh-partner-task-form-dependencies input:focus-visible + i { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-task-form-dependencies label > span { overflow: hidden; font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-form-dependencies label > small,\n.dsh-partner-task-form-dependencies > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-form-dependencies > p { margin: 0; padding: 12px; border: 1px dashed var(--partner-border); border-radius: 10px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: var(--partner-font-body); text-align: center; }\n.dsh-partner-schedule-time { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }\n.dsh-partner-schedule-time > label { display: grid; min-width: 0; gap: 8px; }\n.dsh-partner-schedule-time > label > span { color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-schedule-list { display: grid; gap: 8px; }\n.dsh-partner-schedule-list > article { display: grid; min-height: 76px; grid-template-columns: minmax(0, 1fr) auto auto 32px; align-items: center; gap: 11px; padding: 12px 13px; border: 1px solid var(--partner-separator); border-radius: 12px; background: var(--partner-raised); }\n.dsh-partner-schedule-list article > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-schedule-list strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-schedule-list p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-schedule-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-run-list { display: grid; gap: 3px; }\n.dsh-partner-run-list > article { display: grid; grid-template-columns: 10px minmax(0, 1fr); align-items: start; gap: 10px; padding: 10px 6px; border-bottom: 1px solid var(--partner-separator); }\n.dsh-partner-run-list article > i { width: 7px; height: 7px; margin-top: 7px; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-run-list article[data-status=\"completed\"] > i { background: var(--partner-success); }\n.dsh-partner-run-list article[data-status=\"failed\"] > i,\n.dsh-partner-run-list article[data-status=\"timed-out\"] > i { background: var(--partner-danger); }\n.dsh-partner-run-list article > span { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-run-list strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-run-list p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-run-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-check { display: flex !important; min-height: 38px; align-items: center; align-self: end; gap: 8px !important; cursor: pointer; }\n.dsh-partner-check input { position: absolute; width: 1px !important; min-height: 1px !important; opacity: 0; pointer-events: none; }\n.dsh-partner-check i { display: grid; width: 20px; height: 20px; place-items: center; border: 1px solid var(--partner-border); border-radius: 6px; background: var(--partner-control); }\n.dsh-partner-check input:checked + i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-check input:checked + i::after { width: 8px; height: 4px; border-bottom: 2px solid var(--partner-on-accent); border-left: 2px solid var(--partner-on-accent); content: ''; transform: rotate(-45deg) translateY(-1px); }\n.dsh-partner-check input:focus-visible + i { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n\n@media (max-width: 820px) {\n .dsh-partner-feature-hero { align-items: start; flex-direction: column; gap: 12px; }\n .dsh-partner-feature-hero > div { width: 100%; flex-wrap: wrap; }\n .dsh-partner-board-tools { grid-template-columns: minmax(0, 1fr) minmax(130px, 168px); }\n .dsh-partner-board-tools > small { grid-column: 1 / -1; justify-self: start; }\n .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form { grid-template-columns: 1fr 1fr; }\n .dsh-partner-schedule-list > article { grid-template-columns: minmax(0, 1fr) auto 30px; }\n .dsh-partner-schedule-list > article > button:not(.is-icon):not(.dsh-partner-feature-switch) { grid-column: 1 / -1; }\n}\n\n@media (max-width: 560px) {\n .dsh-partner-feature-page { padding: 20px 14px 36px; }\n .dsh-partner-feature-block, .dsh-partner-capability-detail { padding: 14px; }\n .dsh-partner-capability-detail > header { align-items: flex-start; flex-direction: column; }\n .dsh-partner-capability-actions { width: 100%; justify-content: space-between; }\n .dsh-partner-access-list { grid-template-columns: 1fr; }\n .dsh-partner-skill-installed > article { grid-template-columns: 36px minmax(0, 1fr) auto; }\n .dsh-partner-skill-installed.is-market > article { grid-template-columns: 36px minmax(0, 1fr) 32px; }\n .dsh-partner-skill-installed.is-binding,\n .dsh-partner-skill-picker-list { grid-template-columns: 1fr; }\n .dsh-partner-skill-installed > article > .is-icon { grid-column: 3; }\n .dsh-partner-feature-block > header { align-items: flex-start; flex-direction: column; }\n .dsh-partner-feature-block > header > div { width: 100%; flex-wrap: wrap; justify-content: flex-start; }\n .dsh-partner-board-tools { grid-template-columns: 1fr; }\n .dsh-partner-board-assignee, .dsh-partner-board-tools > small { grid-column: 1; }\n .dsh-partner-board-assignee > select { min-height: 42px; }\n .dsh-partner-board-statuses { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); }\n .dsh-partner-board-statuses > button { min-width: 0; justify-content: center; padding-inline: 6px; }\n .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form { grid-template-columns: 1fr; padding: 14px; }\n :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label { grid-column: 1 !important; }\n .dsh-partner-task-form-dependencies > div { grid-template-columns: 1fr; }\n}\n\n.dsh-partner-sidebar { box-sizing: border-box; flex: none; margin: 0 8px 8px 2px; padding: 4px 0 7px; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 62%, transparent); }\n.dsh-partner-sidebar.is-rail { width: 36px; margin: 0 0 8px; padding: 0; border: 0; }\n.dsh-partner-sidebar-heading { display: flex; align-items: stretch; height: 32px; padding: 0 4px 0 5px; }\n.dsh-partner-sidebar-title { display: flex; min-width: 0; min-height: 32px; flex: 1 1 auto; align-items: center; justify-content: flex-start; gap: 5px; padding: 0 5px; border: 0; border-radius: 7px; appearance: none; color: var(--partner-text-secondary); background: transparent; font: 600 var(--partner-font-body)/1 var(--partner-font-family); text-align: left; cursor: pointer; }\n.dsh-partner-sidebar-title > span { display: grid; place-items: center; transition: transform .16s ease; }\n.dsh-partner-sidebar-title > span[data-open=\"false\"] { transform: rotate(-90deg); }\n.dsh-partner-sidebar-title:hover,\n.dsh-partner-rail:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-sidebar-list { display: grid; grid-template-rows: 0fr; opacity: 0; transition: grid-template-rows 220ms var(--partner-ease-out), opacity 150ms ease; }\n.dsh-partner-sidebar-list.is-open { grid-template-rows: 1fr; opacity: 1; }\n.dsh-partner-sidebar-list-inner { display: grid; min-height: 0; gap: 2px; overflow: hidden; padding: 2px 1px 0; }\n.dsh-partner-sidebar-row { position: relative; isolation: isolate; display: grid; grid-template-columns: 26px minmax(0, 1fr) 7px; align-items: center; gap: 8px; width: 100%; min-height: 40px; padding: 4px 7px; overflow: hidden; border: 1px solid transparent; border-radius: 10px; color: inherit; background: transparent; text-align: left; cursor: pointer; transition: color 140ms ease, background-color 140ms ease, box-shadow 180ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-sidebar-row:hover { background: var(--partner-hover); transform: translateX(1px); }\n.dsh-partner-sidebar-row.is-active { border-color: transparent; background: var(--partner-selected); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n.dsh-partner-sidebar-row > span:nth-child(2) { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-sidebar-row strong,\n.dsh-partner-sidebar-row small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-sidebar-row strong { font-size: var(--partner-font-label); font-weight: 520; }\n.dsh-partner-sidebar-row small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-sidebar-row > i,\n.dsh-partner-roster-list button > i { width: 6px; height: 6px; border: 1px solid var(--partner-text-tertiary); border-radius: 50%; }\n.dsh-partner-sidebar-row > i.is-online,\n.dsh-partner-roster-list button > i.is-online { border-color: var(--partner-success); background: var(--partner-success); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-success) 12%, transparent); }\n.dsh-partner-sidebar-symbol { display: grid !important; place-items: center; width: 25px; height: 25px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-sidebar-empty { margin: 5px 9px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); }\n.dsh-partner-rail { display: grid; place-items: center; width: 36px; height: 36px; padding: 0; border: 0; border-radius: 10px; color: var(--partner-text); background: transparent; cursor: pointer; }\n.dsh-partner-rail.is-active { background: var(--partner-hover); }\n\n.dsh-partner-avatar { display: grid; place-items: center; flex: none; width: 36px; height: 36px; border: 1px solid var(--partner-border); border-radius: 12px; color: var(--partner-text); background: linear-gradient(145deg, var(--partner-glass-thick), var(--partner-control)); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); font-size: var(--partner-font-label); font-weight: 650; }\n.dsh-partner-avatar.is-small { width: 25px; height: 25px; border-radius: 8px; font-size: var(--partner-font-caption); }\n\n.dsh-partner-workspace { position: relative; isolation: isolate; display: grid; grid-template-rows: auto minmax(0, 1fr); width: 100%; height: 100%; min-width: 0; overflow: hidden; background: transparent; }\n.dsh-partner-glass-surface { position: relative; isolation: isolate; transition: opacity 180ms ease-out, border-color 180ms ease, box-shadow 220ms var(--partner-ease-out), transform 220ms var(--partner-ease-out); }\n.dsh-partner-glass-surface.is-svg { -webkit-backdrop-filter: var(--partner-glass-filter-id) saturate(var(--partner-glass-saturation)); backdrop-filter: var(--partner-glass-filter-id) saturate(var(--partner-glass-saturation)); }\n.dsh-partner-glass-surface.is-fallback { -webkit-backdrop-filter: var(--partner-glass-filter); backdrop-filter: var(--partner-glass-filter); }\n.dsh-partner-glass-filter { position: absolute; z-index: -1; inset: 0; width: 100%; height: 100%; opacity: 0; pointer-events: none; }\n.dsh-partner-glass-surface.is-interactive::after {\n position: absolute;\n z-index: 2;\n inset: 1px;\n border-radius: inherit;\n background: linear-gradient(112deg, transparent 20%, color-mix(in srgb, var(--partner-glass-highlight) 86%, transparent) 48%, transparent 76%);\n -webkit-mask-image: radial-gradient(circle 180px at var(--partner-glare-x) var(--partner-glare-y), #000 0, rgba(0, 0, 0, .72) 38%, transparent 74%);\n mask-image: radial-gradient(circle 180px at var(--partner-glare-x) var(--partner-glare-y), #000 0, rgba(0, 0, 0, .72) 38%, transparent 74%);\n opacity: 0;\n pointer-events: none;\n transition: opacity 180ms ease-out;\n content: \"\";\n}\n.dsh-partner-glass-surface.is-interactive > :not(.dsh-partner-glass-filter) { position: relative; z-index: 1; }\n@media (hover: hover) {\n .dsh-partner-glass-surface.is-interactive:hover {\n border-color: color-mix(in srgb, var(--partner-border) 70%, var(--partner-text-tertiary));\n box-shadow:\n inset 0 1px 0 var(--partner-card-highlight),\n inset 0 -1px 0 var(--partner-glass-rim-shadow),\n 0 14px 32px color-mix(in srgb, var(--partner-text) 9%, transparent);\n transform: translateY(-1px);\n }\n .dsh-partner-glass-surface.is-interactive:hover::after { opacity: .72; }\n}\n.dsh-partner-topbar { position: relative; z-index: 3; display: flex; align-items: center; justify-content: space-between; min-height: 52px; margin: 8px 10px 0; padding: 7px 14px; border: 1px solid var(--partner-border); border-radius: 14px 14px 11px 11px; background: transparent; -webkit-backdrop-filter: var(--partner-toolbar-filter); backdrop-filter: var(--partner-toolbar-filter); box-shadow: var(--partner-glass-shadow); }\n.dsh-partner-topbar > div { display: flex; align-items: center; gap: 10px; }\n.dsh-partner-topbar > div > span:last-child { display: grid; gap: 2px; }\n.dsh-partner-topbar strong { font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-topbar small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-topbar [data-xiaohei-workspace-close] {\n display: grid;\n place-items: center;\n flex: none;\n width: 30px;\n height: 30px;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 9px;\n color: var(--partner-text-secondary);\n background: transparent;\n line-height: 1;\n cursor: pointer;\n transition: color 140ms ease, background 140ms ease, border-color 140ms ease, transform 140ms ease;\n}\n.dsh-partner-topbar [data-xiaohei-workspace-close]:hover {\n border-color: var(--partner-border);\n color: var(--partner-text);\n background: var(--partner-hover);\n}\n.dsh-partner-topbar [data-xiaohei-workspace-close]:active { transform: scale(.96); }\n.dsh-partner-topbar [data-xiaohei-workspace-close] > svg { display: block; pointer-events: none; }\n.dsh-partner-mobile-workspace-nav { display: none; }\n.dsh-partner-grid { display: grid; grid-template-columns: 214px minmax(520px, 1fr); min-width: 0; min-height: 0; padding: 8px 10px 10px; gap: 8px; }\n\n.dsh-partner-roster { position: relative; display: flex; min-width: 0; min-height: 0; flex-direction: column; padding: 17px 10px 13px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 15px; background: var(--partner-pane); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: var(--partner-glass-shadow); }\n.dsh-partner-roster-title { display: flex; align-items: flex-start; justify-content: space-between; padding: 0 5px 13px; }\n.dsh-partner-roster-title > span { display: grid; gap: 5px; }\n.dsh-partner-roster-title small,\n.dsh-partner-section > small,\n.dsh-partner-identity small,\n.dsh-partner-channel-card small,\n.dsh-partner-pairing-heading small,\n.dsh-partner-qr small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .12em; }\n.dsh-partner-roster-title strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-roster-title button { display: grid; place-items: center; width: 30px; height: 30px; padding: 0; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); cursor: pointer; transition: color 140ms ease, background-color 140ms ease, transform 160ms var(--partner-ease-out), box-shadow 180ms ease; }\n.dsh-partner-roster-title button:hover { color: var(--partner-text); border-color: var(--partner-border); background: var(--partner-glass-thick); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); transform: translateY(-1px); }\n.dsh-partner-roster-list { display: grid; width: 100%; min-width: 0; min-height: 72px; flex: 1 1 auto; align-content: start; gap: 3px; overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; }\n.dsh-partner-roster-list button { display: grid; grid-template-columns: 36px minmax(0, 1fr) 7px; align-items: center; gap: 9px; width: 100%; min-height: 58px; padding: 9px 8px; border: 1px solid transparent; border-radius: 12px; color: inherit; background: transparent; text-align: left; cursor: pointer; transition: transform .17s cubic-bezier(.2,.8,.2,1), background .15s ease, border-color .15s ease; }\n.dsh-partner-roster-list button:hover { background: var(--partner-hover); transform: translateX(1px); }\n.dsh-partner-roster-list button.is-active { transform: translateX(2px); border-color: transparent; background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-text-secondary), inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-roster-list button > span:nth-child(2) { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-roster-list strong,\n.dsh-partner-roster-list small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-roster-list strong { font-size: var(--partner-font-label); font-weight: 580; }\n.dsh-partner-roster-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-workspace-nav { display: grid; gap: 3px; margin-top: 12px; padding: 12px 0 0; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-workspace-nav button { display: grid; grid-template-columns: 30px minmax(0, 1fr); grid-template-rows: auto auto; align-items: center; column-gap: 9px; width: 100%; min-height: 52px; padding: 7px 8px; border: 1px solid transparent; border-radius: 11px; color: var(--partner-text-secondary); background: transparent; text-align: left; cursor: pointer; transition: color 150ms ease, background-color 150ms ease, border-color 150ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-workspace-nav button:hover { color: var(--partner-text); background: var(--partner-hover); transform: translateX(1px); }\n.dsh-partner-workspace-nav button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent), inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-workspace-nav button > span { display: grid; grid-row: 1 / span 2; place-items: center; width: 29px; height: 29px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); }\n.dsh-partner-workspace-nav button.is-active > span { color: var(--partner-accent-strong); background: var(--partner-raised); }\n.dsh-partner-workspace-nav strong { align-self: end; overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-workspace-nav small { align-self: start; overflow: hidden; color: var(--partner-text-tertiary); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-roster-note { display: flex; align-items: flex-start; gap: 9px; margin-top: 0; padding: 12px 8px 2px; color: var(--partner-text-tertiary); }\n.dsh-partner-roster-note > svg { flex: none; margin-top: 1px; color: var(--partner-accent); }\n.dsh-partner-roster-note > span { display: grid; gap: 4px; }\n.dsh-partner-roster-note strong { color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-weight: 580; }\n.dsh-partner-roster-note small { font-size: var(--partner-font-caption); line-height: 1.5; }\n\n.dsh-partner-stage { position: relative; display: grid; grid-template-rows: auto auto minmax(0, 1fr); min-width: 0; min-height: 0; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 15px; background: var(--partner-pane); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: var(--partner-glass-shadow); }\n.dsh-partner-stage.is-workspace-page { grid-template-rows: minmax(0, 1fr); }\n.dsh-partner-identity { display: flex; align-items: center; gap: 12px; min-height: 86px; padding: 18px clamp(20px, 4vw, 46px) 13px; }\n.dsh-partner-identity > span:nth-child(2) { display: grid; min-width: 0; flex: 1; gap: 3px; }\n.dsh-partner-identity h1 { margin: 0; font-size: var(--partner-font-heading); line-height: 1.15; font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-identity p { margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-status { display: inline-flex; align-items: center; flex: none; gap: 6px; padding: 5px 8px; border: 1px solid var(--partner-border); border-radius: 999px; color: var(--partner-text-secondary); background: color-mix(in srgb, var(--partner-raised) 76%, transparent); font-size: var(--partner-font-caption); }\n.dsh-partner-status > i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-status.is-running > i { background: var(--partner-success); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-success) 13%, transparent); }\n.dsh-partner-status.is-starting > i { background: var(--partner-warning); }\n.dsh-partner-status.is-error > i { background: var(--partner-danger); }\n.dsh-partner-tabs { display: flex; align-items: center; gap: 3px; margin: 0 clamp(20px, 4vw, 46px); border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-tabs button { position: relative; display: inline-flex; align-items: center; gap: 6px; min-height: 37px; padding: 0 10px; border: 0; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-body); cursor: pointer; }\n.dsh-partner-tabs button::after { content: \"\"; position: absolute; right: 9px; bottom: -1px; left: 9px; height: 2px; border-radius: 99px; background: var(--partner-text); opacity: 0; transform: scaleX(.45); transition: opacity 150ms ease, transform 210ms var(--partner-ease-out); }\n.dsh-partner-tabs button:hover { color: var(--partner-text); }\n.dsh-partner-tabs button.is-active { color: var(--partner-accent-strong); }\n.dsh-partner-tabs button.is-active::after { opacity: 1; transform: scaleX(1); }\n.dsh-partner-stage-scroll { min-width: 0; min-height: 0; overflow: auto; padding: 26px clamp(22px, 4vw, 52px) 52px; overscroll-behavior: contain; }\n.dsh-partner-stage-scroll.is-workspace-page { padding: 0; }\n.dsh-partner-stage-scroll > * { animation: dsh-partner-content-enter 260ms var(--partner-ease-out) both; }\n\n.dsh-partner-home { width: min(100%, 1160px); margin: 0 auto; }\n.dsh-partner-home-heading { display: flex; align-items: end; justify-content: space-between; gap: 28px; margin: 0 2px 22px; }\n.dsh-partner-home-heading > span { display: grid; gap: 6px; }\n.dsh-partner-home-heading small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .08em; }\n.dsh-partner-home-heading h2 { margin: 0; font-size: var(--partner-font-display); line-height: 1.18; font-weight: 660; letter-spacing: -.035em; }\n.dsh-partner-home-heading p { max-width: 320px; margin: 0 0 2px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; text-align: right; }\n.dsh-partner-home-channel { display: grid; grid-template-columns: minmax(230px, .8fr) minmax(330px, 1.2fr); align-items: center; min-height: 238px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 20px; background: var(--partner-card-surface); box-shadow: var(--partner-card-shadow); }\n.dsh-partner-home-route { position: relative; display: flex; align-items: center; justify-content: center; min-height: 100%; padding: 28px; background: radial-gradient(circle at 42% 50%, color-mix(in srgb, var(--partner-glass-highlight) 44%, transparent), transparent 58%); }\n.dsh-partner-home-route > .dsh-partner-avatar { position: relative; z-index: 1; width: 58px; height: 58px; border-radius: 18px; background: var(--partner-raised); box-shadow: 0 9px 28px color-mix(in srgb, var(--partner-accent-strong) 10%, transparent); font-size: var(--partner-font-title); }\n.dsh-partner-route-line { position: relative; width: clamp(58px, 7vw, 94px); height: 1px; margin: 0 10px; overflow: hidden; background: repeating-linear-gradient(90deg, color-mix(in srgb, var(--partner-accent) 25%, transparent) 0 4px, transparent 4px 9px); }\n.dsh-partner-route-line > i { position: absolute; left: 0; top: -2px; width: 5px; height: 5px; border-radius: 50%; background: var(--partner-accent); opacity: 0; transform: translateX(0); }\n.dsh-partner-home-channel.is-online .dsh-partner-route-line > i { animation: dsh-partner-route-pulse 2.4s ease-in-out infinite; }\n.dsh-partner-route-weixin { position: relative; z-index: 1; display: grid; place-items: center; width: 58px; height: 58px; border: 1px solid color-mix(in srgb, var(--partner-weixin) 18%, var(--partner-border)); border-radius: 18px; color: var(--partner-weixin); background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); }\n.dsh-partner-home-channel-copy { position: relative; z-index: 1; display: grid; justify-items: start; gap: 8px; padding: 32px 36px 32px 12px; }\n.dsh-partner-home-kicker { display: inline-flex; align-items: center; gap: 7px; color: var(--partner-accent-strong); font-size: var(--partner-font-caption); font-weight: 680; letter-spacing: .06em; }\n.dsh-partner-home-kicker > i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-home-channel.is-online .dsh-partner-home-kicker > i { background: var(--partner-success); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-success) 11%, transparent); }\n.dsh-partner-home-channel-copy h3 { margin: 1px 0 0; font-size: var(--partner-font-title); line-height: 1.28; font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-home-channel-copy p { max-width: 510px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-home-channel-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; margin-top: 7px; }\n.dsh-partner-home-channel-actions button { min-height: 36px; padding: 0 16px; border: 1px solid color-mix(in srgb, var(--partner-accent-strong) 78%, var(--partner-glass-highlight)); border-radius: 10px; color: var(--partner-on-accent); background: var(--partner-accent-strong); box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-glass-highlight) 45%, transparent), var(--partner-shadow-sm); font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: transform 160ms var(--partner-ease-out), background-color 160ms ease, box-shadow 180ms ease; }\n.dsh-partner-home-channel-actions button:hover { background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); transform: translateY(-1px); }\n.dsh-partner-home-channel-actions button:active { transform: translateY(0) scale(.98); }\n.dsh-partner-home-channel-actions span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-home-details { display: grid; grid-template-columns: minmax(0, 1.18fr) minmax(260px, .82fr); gap: 12px; margin-top: 18px; }\n.dsh-partner-home-details > section {\n position: relative;\n min-width: 0;\n padding: 19px 18px 21px;\n overflow: hidden;\n border: 1px solid var(--partner-border);\n border-radius: 15px;\n background: var(--partner-card-surface);\n box-shadow: var(--partner-card-shadow);\n}\n.dsh-partner-home-details > section::after {\n position: absolute;\n top: 0;\n right: 16px;\n left: 16px;\n height: 1px;\n background: linear-gradient(90deg, transparent, var(--partner-glass-highlight), transparent);\n opacity: .72;\n pointer-events: none;\n content: \"\";\n}\n.dsh-partner-home-profile { grid-row: span 2; }\n.dsh-partner-home-details header { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto; align-items: center; gap: 10px; }\n.dsh-partner-home-details header > span { display: grid; place-items: center; width: 32px; height: 32px; border-radius: 10px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }\n.dsh-partner-home-details header > div { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-home-details header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-home-details header strong { overflow: hidden; font-size: var(--partner-font-label); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-home-details header button { padding: 5px 7px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-home-details header button:hover { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 6%, transparent); }\n.dsh-partner-home-profile blockquote { display: -webkit-box; margin: 17px 2px 0 44px; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.7; -webkit-box-orient: vertical; -webkit-line-clamp: 5; }\n.dsh-partner-home-capability-list { display: flex; flex-wrap: wrap; gap: 6px; margin: 14px 0 0 44px; }\n.dsh-partner-home-capability-list em { padding: 5px 8px; border-radius: 7px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); font-size: var(--partner-font-caption); font-style: normal; }\n.dsh-partner-home-capability-list small,\n.dsh-partner-home-continuity > p { margin: 13px 0 0 44px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }\n@keyframes dsh-partner-route-pulse { 0% { opacity: 0; transform: translateX(0); } 18% { opacity: .8; } 82% { opacity: .8; } 100% { opacity: 0; transform: translateX(clamp(58px, 7vw, 94px)); } }\n\n.dsh-partner-form { width: min(100%, 1120px); margin: 0 auto; }\n.dsh-partner-form.is-identity { width: min(100%, 980px); }\n.dsh-partner-form.is-capabilities,\n.dsh-partner-form.is-channel,\n.dsh-partner-form.is-memory { width: min(100%, 1180px); }\n.dsh-partner-form.is-memory { container: partner-memory / inline-size; }\n.dsh-partner-section { position: relative; margin-bottom: 27px; padding-left: 14px; }\n.dsh-partner-section::before { position: absolute; top: 3px; bottom: 2px; left: 0; width: 2px; border-radius: 2px; background: linear-gradient(var(--partner-text-secondary), transparent 92%); content: ''; }\n.dsh-partner-section h2 { margin: 5px 0 7px; font-size: var(--partner-font-display); font-weight: 650; letter-spacing: -.035em; }\n.dsh-partner-section p { max-width: 640px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-fields { display: grid; gap: 14px; }\n.dsh-partner-fields.two { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-runtime-fields { display: grid; grid-template-columns: minmax(190px, 1.15fr) minmax(160px, .85fr) minmax(190px, 1.15fr); gap: 14px; }\n.dsh-partner-runtime-fields > .dsh-partner-field { margin-bottom: 18px; }\n.dsh-partner-field { display: grid; min-width: 0; gap: 8px; margin-bottom: 16px; }\n.dsh-partner-field > span { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }\n.dsh-partner-field strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-field small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.35; text-align: right; }\n.dsh-partner-field input,\n.dsh-partner-field textarea,\n.dsh-partner-field select { box-sizing: border-box; width: 100%; min-height: 38px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 10px; outline: none; color: var(--partner-text); background: var(--partner-control); font: var(--partner-font-label)/1.5 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease, background .15s ease; }\n.dsh-partner-field textarea { resize: vertical; }\n.dsh-partner-field input:focus,\n.dsh-partner-field textarea:focus,\n.dsh-partner-field select:focus { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-form-actions { display: flex; align-items: center; justify-content: space-between; min-height: 40px; padding-top: 5px; }\n.dsh-partner-form-actions > span { display: inline-flex; align-items: center; gap: 5px; color: var(--partner-accent-strong); font-size: var(--partner-font-body); }\n.dsh-partner-form-actions.is-capability-save { flex-wrap: wrap; gap: 12px; }\n.dsh-partner-form-actions.is-capability-save > span { min-height: 24px; }\n.dsh-partner-form-actions.is-capability-save > span svg { flex-shrink: 0; }\n.dsh-partner-form-actions > button,\n.dsh-partner-state > button,\n.dsh-partner-weixin-connect > button { min-height: 34px; padding: 0 15px; border: 1px solid color-mix(in srgb, var(--partner-accent) 60%, transparent); border-radius: 10px; color: var(--partner-on-accent); background: var(--partner-accent-strong); font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-form-actions > button:hover,\n.dsh-partner-state > button:hover,\n.dsh-partner-weixin-connect > button:hover { background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); }\n.dsh-partner-form-actions > button:disabled,\n.dsh-partner-weixin-connect > button:disabled { opacity: .55; cursor: default; }\n.dsh-partner-identity-danger { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-top: 34px; padding-top: 17px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-identity-danger > span { display: grid; gap: 4px; }\n.dsh-partner-identity-danger strong { font-size: var(--partner-font-body); font-weight: 600; }\n.dsh-partner-identity-danger small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-identity-danger button { display: inline-flex; align-items: center; gap: 6px; min-height: 30px; padding: 0 10px; border: 1px solid color-mix(in srgb, var(--partner-danger) 24%, transparent); border-radius: 8px; color: var(--partner-danger); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-identity-danger button:disabled { opacity: .4; cursor: default; }\n.dsh-partner-inline-error,\n.dsh-partner-error { padding: 9px 11px; border: 1px solid color-mix(in srgb, var(--partner-danger) 20%, transparent); border-radius: 9px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 6%, transparent); font-size: var(--partner-font-body); }\n.dsh-partner-error { position: absolute; right: 18px; bottom: 14px; left: 18px; margin: 0; }\n\n.dsh-partner-capability-groups { display: grid; gap: 13px; margin: 3px 0 22px; }\n.dsh-partner-capability-group { padding: 14px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-pane) 84%, transparent); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-capability-group > header { display: flex; align-items: flex-start; justify-content: space-between; gap: 18px; padding: 1px 2px 12px; }\n.dsh-partner-capability-group > header > span { display: grid; gap: 3px; min-width: 0; }\n.dsh-partner-capability-group > header small { color: var(--partner-accent-strong); font-size: var(--partner-font-micro); font-weight: 650; letter-spacing: .12em; }\n.dsh-partner-capability-group > header strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-capability-group > header p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.45; }\n.dsh-partner-capability-group > header em { flex: none; padding: 5px 8px; border-radius: 7px; color: var(--partner-text-secondary); background: var(--partner-selected); font-size: var(--partner-font-caption); font-style: normal; font-variant-numeric: tabular-nums; }\n.dsh-partner-capabilities { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 8px; margin: 0; }\n.dsh-partner-capabilities button { position: relative; display: grid; grid-template-columns: 22px minmax(0, 1fr); gap: 3px 9px; min-height: 72px; padding: 12px; border: 1px solid var(--partner-border); border-radius: 11px; appearance: none; color: inherit; background: color-mix(in srgb, var(--partner-raised) 70%, transparent); font-family: var(--partner-font-family); text-align: left; cursor: pointer; transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease; }\n.dsh-partner-capabilities button:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: color-mix(in srgb, var(--partner-raised) 90%, var(--partner-selected)); }\n.dsh-partner-capabilities button:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-capabilities button.is-active { border-color: color-mix(in srgb, var(--partner-accent) 30%, transparent); background: color-mix(in srgb, var(--partner-accent) 7%, var(--partner-raised)); }\n.dsh-partner-capabilities button > span { display: grid; place-items: center; grid-row: 1 / span 2; width: 19px; height: 19px; margin-top: 1px; border: 1px solid var(--partner-border); border-radius: 6px; color: var(--partner-on-accent); }\n.dsh-partner-capabilities button.is-active > span { border-color: var(--partner-accent); background: var(--partner-accent); }\n.dsh-partner-capabilities strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-capabilities small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.5; }\n\n.dsh-partner-weixin-connect { display: grid; grid-template-columns: 54px minmax(0, 1fr) auto; align-items: center; gap: 17px; padding: 19px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }\n.dsh-partner-weixin-connect > span { display: grid; gap: 4px; }\n.dsh-partner-weixin-connect strong { font-size: var(--partner-font-label); }\n.dsh-partner-weixin-connect p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; }\n.dsh-partner-weixin-connect ul { display: flex; flex-wrap: wrap; gap: 6px 15px; margin: 7px 0 0; padding: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); list-style: none; }\n.dsh-partner-weixin-connect li::before { content: \"\u00B7\"; margin-right: 4px; color: var(--partner-accent); }\n.dsh-partner-weixin-mark { display: grid; place-items: center; width: 52px; height: 52px; border: 1px solid color-mix(in srgb, var(--partner-weixin) 18%, var(--partner-border)); border-radius: 16px; color: var(--partner-weixin); background: color-mix(in srgb, var(--partner-weixin) 7%, var(--partner-raised)); }\n.dsh-partner-weixin-glyph { position: relative; display: inline-block; width: 16px; height: 14px; }\n.dsh-partner-weixin-glyph::before,\n.dsh-partner-weixin-glyph::after { content: \"\"; position: absolute; border: 1.5px solid currentColor; border-radius: 48%; }\n.dsh-partner-weixin-glyph::before { left: 0; top: 0; width: 10px; height: 8px; }\n.dsh-partner-weixin-glyph::after { right: 0; bottom: 0; width: 9px; height: 7px; background: inherit; }\n.dsh-partner-weixin-glyph i,\n.dsh-partner-weixin-glyph b { position: absolute; z-index: 1; top: 4px; width: 1.5px; height: 1.5px; border-radius: 50%; background: currentColor; }\n.dsh-partner-weixin-glyph i { left: 3px; }\n.dsh-partner-weixin-glyph b { left: 7px; }\n.dsh-partner-weixin-glyph.is-large { transform: scale(1.55); }\n.dsh-partner-qr { display: grid; grid-template-columns: 206px minmax(0, 1fr); align-items: center; gap: 27px; padding: 22px; border: 1px solid var(--partner-border); border-radius: 16px; background: color-mix(in srgb, var(--partner-raised) 74%, transparent); }\n.dsh-partner-qr-code { display: grid; place-items: center; width: 196px; height: 196px; border-radius: 14px; background: #fff; box-shadow: 0 9px 28px color-mix(in srgb, #000 7%, transparent); }\n.dsh-partner-qr > span { display: grid; justify-items: start; gap: 7px; }\n.dsh-partner-qr strong { font-size: var(--partner-font-title); }\n.dsh-partner-qr p { max-width: 300px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-qr button { display: inline-flex; align-items: center; gap: 6px; min-height: 32px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: inherit; background: var(--partner-raised); cursor: pointer; }\n.dsh-partner-channel-card { display: grid; grid-template-columns: 52px minmax(0, 1fr) auto auto; align-items: center; gap: 14px; padding: 15px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }\n.dsh-partner-channel-card > span:nth-child(2) { display: grid; gap: 3px; }\n.dsh-partner-channel-card strong { font-size: var(--partner-font-label); }\n.dsh-partner-channel-card p { margin: 0; color: var(--partner-text-tertiary); font: var(--partner-font-caption)/1.4 ui-monospace, monospace; }\n.dsh-partner-switch { position: relative; width: 38px; height: 22px; padding: 0; border: 1px solid var(--partner-border); border-radius: 999px; background: color-mix(in srgb, var(--partner-text) 9%, transparent); cursor: pointer; transition: background .16s ease; }\n.dsh-partner-switch i { position: absolute; left: 3px; top: 3px; width: 14px; height: 14px; border-radius: 50%; background: var(--partner-raised); box-shadow: 0 1px 3px color-mix(in srgb, #000 16%, transparent); transition: transform .18s cubic-bezier(.2,.8,.2,1); }\n.dsh-partner-switch[data-on=\"true\"] { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-switch[data-on=\"true\"] i { transform: translateX(16px); }\n.dsh-partner-pairing-heading { display: flex; align-items: end; justify-content: space-between; margin: 25px 1px 10px; }\n.dsh-partner-pairing-heading > span { display: grid; gap: 4px; }\n.dsh-partner-pairing-heading strong { font-size: var(--partner-font-label); }\n.dsh-partner-pairing-heading em { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; }\n.dsh-partner-pairings { display: grid; gap: 5px; }\n.dsh-partner-pairings article { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto auto; align-items: center; gap: 9px; min-height: 52px; padding: 8px 9px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-pairings article > span { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; color: var(--partner-text-tertiary); background: var(--partner-hover); }\n.dsh-partner-pairings article > span.is-approved { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, transparent); }\n.dsh-partner-pairings article > div { display: grid; gap: 3px; }\n.dsh-partner-pairings strong { font-size: var(--partner-font-body); }\n.dsh-partner-pairings small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-pairings button { min-height: 29px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-pairings button.is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n\n.dsh-partner-metrics { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }\n.dsh-partner-metrics article { padding: 14px; border: 1px solid var(--partner-border); border-radius: 12px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); }\n.dsh-partner-metrics small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-metrics strong { display: block; margin: 8px 0 4px; font-size: var(--partner-font-title); font-weight: 640; }\n.dsh-partner-metrics p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-session-list { display: grid; gap: 4px; margin-top: 20px; }\n.dsh-partner-session-list article { display: flex; align-items: center; gap: 10px; min-height: 48px; padding: 7px 5px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-session-list article > span { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; color: var(--partner-accent); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }\n.dsh-partner-session-list article > div { display: grid; min-width: 0; flex: 1; gap: 3px; }\n.dsh-partner-session-list strong { font-size: var(--partner-font-body); }\n.dsh-partner-session-list small { overflow: hidden; color: var(--partner-text-tertiary); font: var(--partner-font-caption)/1.4 ui-monospace, monospace; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-session-list button { flex: none; min-height: 30px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-session-list button:hover { color: var(--partner-accent-strong); border-color: color-mix(in srgb, var(--partner-accent) 24%, var(--partner-border)); }\n.dsh-partner-automation { display: grid; min-width: 0; max-width: 100%; gap: 14px; margin-top: 16px; padding: 16px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }\n.dsh-partner-automation-grid { display: grid; min-width: 0; grid-template-columns: minmax(480px, .95fr) minmax(430px, 1.05fr); align-items: stretch; gap: 12px; margin-top: 17px; }\n.dsh-partner-automation-grid .dsh-partner-automation { align-content: start; margin-top: 0; }\n.dsh-partner-automation-grid .dsh-partner-automation:last-child .dsh-partner-automation-actions { margin-top: auto; }\n.dsh-partner-review-policy { display: grid; grid-template-columns: auto minmax(0, 1fr) 90px auto; align-items: center; gap: 10px; padding-top: 12px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-review-policy > span { display: grid; gap: 2px; }\n.dsh-partner-review-policy > span strong { font-size: var(--partner-font-body); }\n.dsh-partner-review-policy > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.4; }\n.dsh-partner-review-policy select { width: 100%; height: 32px; padding: 0 26px 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; background-color: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-review-policy > button:last-child { height: 32px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-automation > header { display: flex; align-items: center; justify-content: space-between; gap: 16px; }\n.dsh-partner-automation > header > span { display: grid; gap: 4px; }\n.dsh-partner-automation > header strong { font-size: var(--partner-font-body); }\n.dsh-partner-automation > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-automation-fields { display: grid; min-width: 0; grid-template-columns: minmax(120px, 180px); gap: 10px; }\n.dsh-partner-automation-fields.is-memory-model { grid-template-columns: minmax(110px, .7fr) minmax(130px, 1fr) minmax(150px, 1.25fr); }\n.dsh-partner-automation-fields.is-heartbeat { grid-template-columns: repeat(4, minmax(100px, 1fr)); }\n.dsh-partner-concern-board { position: relative; display: grid; min-width: 0; max-width: 100%; overflow: visible; border: 1px solid var(--partner-border); border-radius: 11px; background: color-mix(in srgb, var(--partner-raised) 42%, transparent); }\n.dsh-partner-concern-board > header { display: flex; min-height: 46px; align-items: center; justify-content: space-between; gap: 14px; padding: 7px 10px 7px 12px; }\n.dsh-partner-concern-board > header > span { display: flex; min-width: 0; align-items: baseline; gap: 8px; }\n.dsh-partner-concern-board > header strong { display: flex; align-items: center; gap: 6px; font-size: var(--partner-font-body); font-weight: 640; white-space: nowrap; }\n.dsh-partner-concern-board > header strong b { display: grid; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 999px; place-items: center; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, transparent); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-concern-board > header p { min-width: 0; margin: 0; overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-board > header > button { display: inline-flex; flex: none; height: 30px; align-items: center; gap: 5px; padding: 0 9px; border: 1px solid transparent; border-radius: 8px; color: var(--partner-text-secondary); background: transparent; font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-board > header > button:hover,\n.dsh-partner-concern-board > header > button[aria-expanded=\"true\"] { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); }\n.dsh-partner-concern-compose { display: grid; gap: 20px; padding: 24px; border-top: 1px solid var(--partner-border); background: color-mix(in srgb, var(--partner-control) 60%, transparent); animation: dsh-partner-reveal .16s ease-out; }\n.dsh-partner-concern-form-heading { display: grid; gap: 6px; }\n.dsh-partner-concern-form-heading p { margin: 0; color: var(--partner-text-secondary); }\n.dsh-partner-concern-compose label > small { color: var(--partner-text-secondary); line-height: 1.5; }\n.dsh-partner-concern-compose input { box-sizing: border-box; min-height: 44px; }\n.dsh-partner-concern-compose > div:last-child { gap: 12px; padding-top: 16px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-compose > div:last-child > button { min-height: 44px; padding-inline: 20px; }\n.dsh-partner-concern-archive-details { min-width: 0; }\n.dsh-partner-concern-archive-details > summary { display: flex; align-items: center; gap: 10px; min-height: 44px; list-style: none; cursor: pointer; color: var(--partner-text); }\n.dsh-partner-concern-archive-details > summary::-webkit-details-marker { display: none; }\n.dsh-partner-concern-archive-details > summary > svg { flex: 0 0 auto; transform: rotate(-90deg); transition: transform .16s ease; }\n.dsh-partner-concern-archive-details[open] > summary > svg { transform: rotate(0); }\n.dsh-partner-concern-archive-details > summary:focus-visible { outline: 2px solid var(--partner-text-muted); outline-offset: 3px; border-radius: 6px; }\n.dsh-partner-concern-archive-details strong { overflow-wrap: anywhere; }\n.dsh-partner-concern-archive-details dl { display: grid; gap: 8px; margin: 16px 0; }\n.dsh-partner-concern-archive-details dt { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-archive-details dd { margin: 0 0 8px; color: var(--partner-text); white-space: pre-wrap; overflow-wrap: anywhere; line-height: 1.6; }\n.dsh-partner-concern-archive-details > p { color: var(--partner-text-secondary); line-height: 1.5; }\n@media (max-width: 600px) { .dsh-partner-concern-compose { padding: 16px; } }\n@media (prefers-reduced-motion: reduce) { .dsh-partner-concern-archive-details > summary > svg { transition: none; } }\n.dsh-partner-concern-compose label { display: grid; gap: 6px; }\n.dsh-partner-concern-compose label > span { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); font-weight: 600; }\n.dsh-partner-concern-compose input { width: 100%; height: 36px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease; }\n.dsh-partner-concern-compose textarea { box-sizing: border-box; width: 100%; min-width: 0; resize: vertical; padding: 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1.5 var(--partner-font-family); }\n.dsh-partner-concern-compose textarea:focus-visible { outline: 2px solid var(--partner-text-muted); outline-offset: 2px; }\n.dsh-partner-concern-compose input:focus-visible { border-color: color-mix(in srgb, var(--partner-accent) 55%, var(--partner-border)); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-accent) 9%, transparent); }\n.dsh-partner-concern-input-wrap { position: relative; min-width: 0; }\n.dsh-partner-concern-compose-hint { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 400; line-height: 1.45; }\n.dsh-partner-concern-compose-hint b { color: var(--partner-accent-strong); font-weight: 700; }\n.dsh-partner-concern-sources {\n position: absolute;\n z-index: 40;\n top: calc(100% + 6px);\n right: 0;\n left: 0;\n display: grid;\n max-height: 264px;\n overflow-y: auto;\n padding: 5px;\n border: 1px solid color-mix(in srgb, var(--partner-border) 88%, var(--partner-text) 12%);\n border-radius: 10px;\n background: var(--partner-raised);\n box-shadow: 0 14px 34px color-mix(in srgb, var(--partner-text) 15%, transparent);\n scrollbar-width: thin;\n}\n.dsh-partner-concern-sources > p { margin: 0; padding: 14px 12px; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.45; }\n.dsh-partner-concern-sources > button {\n display: grid;\n min-height: 46px;\n grid-template-columns: 28px minmax(0, 1fr);\n grid-template-rows: auto auto;\n align-items: center;\n column-gap: 8px;\n padding: 6px 8px;\n border: 1px solid transparent;\n border-radius: 8px;\n color: var(--partner-text);\n background: transparent;\n text-align: left;\n cursor: pointer;\n}\n.dsh-partner-concern-sources > button > span { display: grid; grid-row: 1 / 3; width: 28px; height: 28px; place-items: center; border-radius: 8px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, var(--partner-control)); }\n.dsh-partner-concern-sources > button > strong { min-width: 0; overflow: hidden; font-size: var(--partner-font-body); font-weight: 610; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-sources > button > small { min-width: 0; overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 400; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-sources > button:hover,\n.dsh-partner-concern-sources > button[aria-selected=\"true\"] { border-color: color-mix(in srgb, var(--partner-accent) 22%, var(--partner-border)); background: color-mix(in srgb, var(--partner-accent) 8%, var(--partner-raised)); }\n.dsh-partner-concern-compose > div { display: flex; justify-content: flex-end; gap: 6px; }\n.dsh-partner-concern-compose button { min-height: 30px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-raised); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-compose button.is-primary { border-color: transparent; color: var(--partner-on-accent); background: var(--partner-accent-strong); }\n.dsh-partner-concern-list { display: grid; min-height: 0; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-list > article { min-width: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 72%, transparent); background: transparent; transition: background .15s ease; }\n.dsh-partner-concern-list > article:last-child { border-bottom: 0; }\n.dsh-partner-concern-list > article:hover,\n.dsh-partner-concern-list > article[data-expanded=\"true\"] { background: color-mix(in srgb, var(--partner-accent) 4.5%, transparent); }\n.dsh-partner-concern-row { display: grid; width: 100%; min-height: 49px; grid-template-columns: 76px minmax(0, 1fr) auto 14px; align-items: center; gap: 9px; padding: 6px 11px 6px 12px; border: 0; color: inherit; background: transparent; text-align: left; cursor: pointer; }\n.dsh-partner-concern-state { display: flex; align-items: center; gap: 7px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); white-space: nowrap; }\n.dsh-partner-concern-state i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-accent) 9%, transparent); }\n.dsh-partner-concern-copy { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-concern-copy strong,\n.dsh-partner-concern-copy small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-copy strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-concern-copy small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-time { display: grid; justify-items: end; gap: 2px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; line-height: 1.1; white-space: nowrap; }\n.dsh-partner-concern-time small { font: inherit; }\n.dsh-partner-concern-time strong { color: var(--partner-text-secondary); font: 590 var(--partner-font-caption)/1.1 var(--partner-font-family); }\n.dsh-partner-concern-row > svg { color: var(--partner-text-tertiary); transition: transform .16s ease, color .16s ease; }\n.dsh-partner-concern-list > article[data-expanded=\"true\"] .dsh-partner-concern-row > svg { color: var(--partner-accent); transform: rotate(180deg); }\n.dsh-partner-concern-detail { display: grid; gap: 7px; padding: 0 34px 11px 97px; animation: dsh-partner-reveal .16s ease-out; }\n.dsh-partner-concern-detail p,\n.dsh-partner-concern-detail blockquote { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-concern-detail blockquote { padding-left: 9px; border-left: 2px solid color-mix(in srgb, var(--partner-accent) 40%, transparent); }\n.dsh-partner-concern-detail > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-decision { display: grid; min-width: 0; grid-template-columns: auto minmax(0, 1fr); align-items: baseline; gap: 3px 8px; padding: 7px 9px; border: 1px solid var(--partner-border); border-radius: 8px; background: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-decision strong { color: var(--partner-accent-strong); font-weight: 620; white-space: nowrap; }\n.dsh-partner-concern-decision span { min-width: 0; color: var(--partner-text-secondary); line-height: 1.45; }\n.dsh-partner-concern-decision small { grid-column: 1 / -1; color: var(--partner-text-tertiary); line-height: 1.45; overflow-wrap: anywhere; }\n.dsh-partner-concern-resources { display: flex; flex-wrap: wrap; gap: 5px; }\n.dsh-partner-concern-resources span { max-width: 100%; overflow: hidden; padding: 4px 7px; border-radius: 6px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-actions { display: flex; flex-wrap: wrap; gap: 5px; padding-top: 2px; }\n.dsh-partner-concern-actions button,\n.dsh-partner-concern-resolved button { min-height: 28px; padding: 0 8px; border: 1px solid var(--partner-border); border-radius: 7px; color: var(--partner-text-secondary); background: var(--partner-control); font: 540 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-actions button:hover,\n.dsh-partner-concern-resolved button:hover { color: var(--partner-accent-strong); border-color: color-mix(in srgb, var(--partner-accent) 32%, var(--partner-border)); background: color-mix(in srgb, var(--partner-accent) 7%, var(--partner-control)); }\n.dsh-partner-concern-actions button.is-danger:hover { color: var(--partner-danger); border-color: color-mix(in srgb, var(--partner-danger) 35%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-control)); }\n.dsh-partner-concern-more { display: flex; justify-content: center; padding: 5px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-more button { min-height: 26px; padding: 0 9px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font: 540 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-more button:hover { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }\n.dsh-partner-concern-empty { margin: 0; padding: 13px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.5; }\n.dsh-partner-concern-resolved { border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-resolved summary { min-height: 34px; padding: 9px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); cursor: pointer; list-style: none; }\n.dsh-partner-concern-resolved summary::-webkit-details-marker { display: none; }\n.dsh-partner-concern-resolved summary::before { display: inline-block; margin-right: 7px; content: '\\203A'; transition: transform .15s ease; }\n.dsh-partner-concern-resolved[open] summary::before { transform: rotate(90deg); }\n.dsh-partner-concern-resolved summary b { margin-left: 4px; color: var(--partner-accent); font-variant-numeric: tabular-nums; }\n.dsh-partner-concern-resolved > div { display: grid; max-height: 170px; overflow-y: auto; border-top: 1px solid color-mix(in srgb, var(--partner-border) 72%, transparent); }\n.dsh-partner-concern-resolved article { display: grid; min-height: 38px; grid-template-columns: 22px minmax(0, 1fr) auto; align-items: center; gap: 7px; padding: 4px 10px; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 60%, transparent); }\n.dsh-partner-concern-resolved article > span { display: grid; width: 20px; height: 20px; border-radius: 7px; place-items: center; color: var(--partner-accent); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); }\n.dsh-partner-concern-resolved article strong { overflow: hidden; font-size: var(--partner-font-caption); font-weight: 560; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-archive { min-width: 0; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-archive-toggle { display: flex; align-items: center; justify-content: space-between; gap: 16px; width: 100%; min-height: 68px; padding: 14px 16px; border: 0; border-radius: 10px; text-align: left; color: var(--partner-text-secondary); background: transparent; font: inherit; cursor: pointer; transition: background .16s ease; }\n.dsh-partner-concern-archive-toggle > span { display: grid; gap: 5px; min-width: 0; }\n.dsh-partner-concern-archive-toggle strong { font-size: var(--partner-font-body); font-weight: 580; }\n.dsh-partner-concern-archive-toggle small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-archive-toggle > svg { flex: none; transition: transform .16s ease; }\n.dsh-partner-concern-archive-toggle[aria-expanded=\"true\"] > svg { transform: rotate(180deg); }\n.dsh-partner-concern-archive-toggle:hover { background: var(--partner-control); }\n.dsh-partner-concern-archive-content { min-width: 0; padding: 0 16px 12px; }\n.dsh-partner-concern-archive-content > p { padding: 12px 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); }\n.dsh-partner-concern-archive-list { display: grid; min-width: 0; }\n.dsh-partner-concern-archive-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 16px; min-height: 64px; padding: 12px 0; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-archive-row > strong { min-width: 0; color: var(--partner-text-secondary); font: 500 var(--partner-font-body)/1.6 var(--partner-font-family); overflow-wrap: anywhere; }\n.dsh-partner-concern-archive-action { min-width: 0; align-self: start; }\n.dsh-partner-concern-archive-action > button,\n.dsh-partner-concern-archive-pages button { display: inline-flex; align-items: center; justify-content: center; flex: none; min-height: 40px; min-width: 88px; padding: 8px 14px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-control); font: 500 var(--partner-font-caption)/1.4 var(--partner-font-family); white-space: nowrap; cursor: pointer; transition: background .16s ease, border-color .16s ease; }\n.dsh-partner-concern-archive-action > button:hover { color: var(--partner-danger); border-color: var(--partner-danger); }\n.dsh-partner-concern-archive-pages { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 12px; padding-top: 14px; border-top: 1px solid var(--partner-border); color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-archive-pages > div { display: flex; flex-wrap: wrap; gap: 10px; }\n.dsh-partner-concern-archive-pages button:hover:not(:disabled) { background: var(--partner-raised); }\n.dsh-partner-concern-archive-pages button:disabled { opacity: .45; cursor: not-allowed; }\n.dsh-partner-concern-archive button:focus-visible { outline: 2px solid var(--partner-text-secondary); outline-offset: 3px; }\n@media (max-width: 480px) {\n .dsh-partner-concern-archive-toggle { padding: 12px; }\n .dsh-partner-concern-archive-content { padding: 0 12px 12px; }\n .dsh-partner-concern-archive-row { gap: 12px; }\n .dsh-partner-concern-archive-action > button, .dsh-partner-concern-archive-pages button { min-height: 44px; padding-inline: 12px; }\n}\n@media (prefers-reduced-motion: reduce) {\n .dsh-partner-concern-archive-toggle, .dsh-partner-concern-archive-toggle > svg, .dsh-partner-concern-archive-action > button, .dsh-partner-concern-archive-pages button { transition: none; }\n}\n@keyframes dsh-partner-reveal { from { opacity: 0; transform: translateY(-3px); } to { opacity: 1; transform: translateY(0); } }\n.dsh-partner-automation-actions { display: flex; justify-content: flex-end; gap: 8px; padding-top: 12px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-automation-actions button, .dsh-partner-section-heading button { min-height: 32px; padding: 0 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-automation-actions button.is-primary { color: var(--partner-raised); border-color: transparent; background: var(--partner-accent-strong); }\n.dsh-partner-automation-actions button:disabled, .dsh-partner-section-heading button:disabled { opacity: .45; cursor: default; }\n.dsh-partner-inline-notice { display: flex; align-items: center; gap: 6px; margin: 12px 0 0; color: var(--partner-accent-strong); font-size: var(--partner-font-caption); }\n.dsh-partner-section-heading { display: flex; align-items: end; justify-content: space-between; gap: 12px; margin-top: 24px; padding-bottom: 8px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-section-heading span { display: grid; gap: 3px; }\n.dsh-partner-section-heading small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); letter-spacing: .12em; }\n.dsh-partner-section-heading strong { font-size: var(--partner-font-body); }\n.dsh-partner-memory-library { margin-top: 28px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 17px; background: color-mix(in srgb, var(--partner-raised) 58%, transparent); box-shadow: 0 22px 64px color-mix(in srgb, var(--partner-accent-strong) 5%, transparent), inset 0 1px color-mix(in srgb, white 6%, transparent); }\n.dsh-partner-library-header { display: flex; align-items: end; justify-content: space-between; gap: 24px; padding: 19px 20px 0; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-library-header > span { display: grid; gap: 4px; padding-bottom: 15px; }\n.dsh-partner-library-header > span small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .12em; }\n.dsh-partner-library-header > span strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.02em; }\n.dsh-partner-library-header > span p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-library-header nav { display: flex; align-self: stretch; gap: 4px; }\n.dsh-partner-library-header nav button { position: relative; padding: 0 8px; border: 0; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-library-header nav button::after { position: absolute; right: 7px; bottom: -1px; left: 7px; height: 2px; border-radius: 2px; background: var(--partner-accent); opacity: 0; content: ''; }\n.dsh-partner-library-header nav button.is-active { color: var(--partner-text); }\n.dsh-partner-library-header nav button.is-active::after { opacity: 1; }\n.dsh-partner-library-header nav b { margin-left: 4px; color: var(--partner-accent); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-library-tools { display: flex; align-items: center; gap: 12px; min-height: 53px; padding: 9px 12px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-library-tools > label { flex: 0 1 230px; }\n.dsh-partner-library-tools input { width: 100%; height: 34px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); background: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-library-tools input::placeholder { color: var(--partner-text-tertiary); }\n.dsh-partner-memory-kinds { display: flex; min-width: 0; gap: 3px; overflow-x: auto; }\n.dsh-partner-memory-kinds button { flex: none; height: 28px; padding: 0 8px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-memory-kinds button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-memory-kinds button.is-active { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 10%, transparent); }\n.dsh-partner-library-browser { display: grid; grid-template-columns: minmax(270px, 31%) minmax(0, 1fr); height: clamp(430px, 58vh, 640px); min-height: 0; overflow: hidden; }\n.dsh-partner-library-list { min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }\n.dsh-partner-library-list > button { display: grid; width: 100%; gap: 5px; padding: 12px 14px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; }\n.dsh-partner-library-list > button:hover { background: color-mix(in srgb, var(--partner-accent) 4%, transparent); }\n.dsh-partner-library-list > button.is-active { background: color-mix(in srgb, var(--partner-accent) 8%, transparent); box-shadow: inset 2px 0 var(--partner-accent); }\n.dsh-partner-library-list > button > span { width: max-content; color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }\n.dsh-partner-library-list > button > strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 610; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-library-list > button > p { display: -webkit-box; margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-library-list > button > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-library-list.is-diary time { color: var(--partner-accent); font: 600 var(--partner-font-caption)/1.2 var(--partner-font-family); font-variant-numeric: tabular-nums; }\n.dsh-partner-library-detail { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; padding: 24px clamp(20px, 3vw, 34px) 40px; background: radial-gradient(circle at 92% 4%, color-mix(in srgb, var(--partner-accent) 6%, transparent), transparent 34%); scrollbar-gutter: stable; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) { display: grid; align-content: start; gap: 13px; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header,\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header span { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .08em; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header > div { display: flex; gap: 10px; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header button { min-width: 28px; min-height: 28px; padding: 0 6px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header button:hover { color: var(--partner-accent); }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > p { max-width: 64ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.75; text-wrap: pretty; }\n.dsh-partner-library-detail progress { width: min(100px, 45%); height: 3px; overflow: hidden; border: 0; border-radius: 2px; appearance: none; background: var(--partner-border); }\n.dsh-partner-library-detail progress::-webkit-progress-bar { background: transparent; }\n.dsh-partner-library-detail progress::-webkit-progress-value { background: var(--partner-accent); }\n.dsh-partner-library-detail progress::-moz-progress-bar { background: var(--partner-accent); }\n.dsh-partner-library-detail footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-browser { display: grid; grid-template-columns: minmax(220px, 25%) minmax(0, 1fr); height: clamp(450px, 61vh, 660px); min-height: 0; overflow: hidden; }\n.dsh-partner-profile-people { min-height: 0; overflow-x: hidden; overflow-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }\n.dsh-partner-profile-people > button { display: grid; grid-template-columns: 32px minmax(0, 1fr) 7px; align-items: center; gap: 10px; width: 100%; min-height: 58px; padding: 9px 13px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; transition: background-color 150ms ease, box-shadow 180ms var(--partner-ease-out); }\n.dsh-partner-profile-people > button:hover { background: var(--partner-hover); }\n.dsh-partner-profile-people > button.is-active { background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent-strong); }\n.dsh-partner-profile-people > button > span { display: grid; place-items: center; width: 32px; height: 32px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-profile-people > button > div { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-profile-people strong, .dsh-partner-profile-people small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-profile-people strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-profile-people small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-people > button > i { width: 6px; height: 6px; border: 1px solid var(--partner-text-tertiary); border-radius: 50%; }\n.dsh-partner-profile-people > button.is-active > i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-profile-stage { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; padding: 25px clamp(20px, 3vw, 36px) 42px; scrollbar-gutter: stable; }\n.dsh-partner-profile-heading { display: flex; align-items: start; justify-content: space-between; gap: 24px; padding-bottom: 21px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-profile-heading > span { display: grid; max-width: 66ch; gap: 5px; }\n.dsh-partner-profile-heading > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .1em; }\n.dsh-partner-profile-heading > span strong { font-size: var(--partner-font-title); font-weight: 660; letter-spacing: -.025em; }\n.dsh-partner-profile-heading > span p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-profile-heading > div { display: flex; flex: none; align-items: center; gap: 6px; min-height: 28px; padding: 0 9px; border: 1px solid var(--partner-border); border-radius: 999px; color: var(--partner-text-tertiary); background: var(--partner-glass-clear); font-size: var(--partner-font-caption); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-profile-heading > div > i { width: 6px; height: 6px; border: 1px solid currentColor; border-radius: 50%; }\n.dsh-partner-profile-heading > div[data-ready=\"true\"] { color: var(--partner-text-secondary); }\n.dsh-partner-profile-heading > div[data-ready=\"true\"] > i { background: currentColor; }\n.dsh-partner-profile-meta { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 17px 0 8px; padding: 13px 0; border-block: 1px solid var(--partner-separator); }\n.dsh-partner-profile-meta > span { display: grid; min-width: 0; gap: 3px; padding: 0 14px; border-left: 1px solid var(--partner-separator); }\n.dsh-partner-profile-meta > span:first-child { padding-left: 0; border-left: 0; }\n.dsh-partner-profile-meta small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-meta strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-profile-entries { display: grid; }\n.dsh-partner-profile-entries > article, .dsh-partner-profile-pending > div > article { display: grid; gap: 11px; padding: 18px 0; border-bottom: 1px solid var(--partner-separator); }\n.dsh-partner-profile-entries > article > header, .dsh-partner-profile-entries > article > footer,\n.dsh-partner-profile-pending > div > article > header, .dsh-partner-profile-pending > div > article > footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n.dsh-partner-profile-entries article > header > span, .dsh-partner-profile-pending article > header > span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .07em; }\n.dsh-partner-profile-entries article > header > div, .dsh-partner-profile-pending article > header > div { display: flex; gap: 11px; }\n.dsh-partner-profile-entries article > header button, .dsh-partner-profile-pending article > header button { min-width: 28px; min-height: 28px; padding: 0 6px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-profile-entries article > header button:hover, .dsh-partner-profile-pending article > header button:hover { color: var(--partner-text); }\n.dsh-partner-profile-entries article > strong, .dsh-partner-profile-pending article > strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-profile-entries article > p, .dsh-partner-profile-pending article > p { max-width: 68ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; text-wrap: pretty; }\n.dsh-partner-profile-entries progress, .dsh-partner-profile-pending progress { width: min(100px, 45%); height: 3px; overflow: hidden; border: 0; border-radius: 2px; appearance: none; background: var(--partner-border); }\n.dsh-partner-profile-entries progress::-webkit-progress-bar, .dsh-partner-profile-pending progress::-webkit-progress-bar { background: transparent; }\n.dsh-partner-profile-entries progress::-webkit-progress-value, .dsh-partner-profile-pending progress::-webkit-progress-value { background: var(--partner-accent); }\n.dsh-partner-profile-entries progress::-moz-progress-bar, .dsh-partner-profile-pending progress::-moz-progress-bar { background: var(--partner-accent); }\n.dsh-partner-profile-entries footer small, .dsh-partner-profile-pending footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-pending { margin-top: 18px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-profile-pending > summary { display: flex; min-height: 40px; align-items: center; gap: 6px; padding: 8px 0 2px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-weight: 610; list-style: none; cursor: pointer; }\n.dsh-partner-profile-pending > summary::-webkit-details-marker, .dsh-partner-memory-evidence > summary::-webkit-details-marker { display: none; }\n.dsh-partner-profile-pending > summary::before, .dsh-partner-memory-evidence > summary::before { display: inline-block; color: var(--partner-text-tertiary); font-size: 10px; content: '\u203A'; transform: rotate(0); transition: transform 160ms var(--partner-ease-out); }\n.dsh-partner-profile-pending[open] > summary::before, .dsh-partner-memory-evidence[open] > summary::before { transform: rotate(90deg); }\n.dsh-partner-profile-pending > summary b { margin-left: 4px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-memory-evidence { margin-top: 2px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-memory-evidence > summary { display: flex; min-height: 34px; align-items: center; gap: 5px; padding-top: 6px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); list-style: none; cursor: pointer; }\n.dsh-partner-memory-evidence > summary b { margin-left: 3px; font-weight: 620; }\n.dsh-partner-memory-evidence > div { display: grid; gap: 7px; padding-top: 9px; }\n.dsh-partner-memory-evidence blockquote { margin: 0; padding: 9px 11px; border-left: 2px solid var(--partner-border); color: var(--partner-text-secondary); background: color-mix(in srgb, var(--partner-control) 50%, transparent); }\n.dsh-partner-memory-evidence blockquote p { margin: 0; font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-memory-evidence blockquote time { display: block; margin-top: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-memory-editor { display: grid; gap: 9px; }\n.dsh-partner-memory-editor input, .dsh-partner-memory-editor textarea { box-sizing: border-box; width: 100%; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); outline: none; background: var(--partner-control); font: 500 var(--partner-font-caption)/1.5 var(--partner-font-family); }\n.dsh-partner-memory-editor input { min-height: 32px; padding: 0 10px; }\n.dsh-partner-memory-editor textarea { min-height: 76px; padding: 8px 10px; resize: vertical; }\n.dsh-partner-memory-editor input:focus, .dsh-partner-memory-editor textarea:focus { border-color: color-mix(in srgb, var(--partner-accent) 48%, var(--partner-border)); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-accent) 8%, transparent); }\n.dsh-partner-memory-editor footer { display: flex; justify-content: flex-end; gap: 7px; }\n.dsh-partner-memory-editor button { min-height: 28px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-memory-editor button.is-primary { border-color: transparent; color: var(--partner-on-accent); background: var(--partner-accent-strong); }\n.dsh-partner-diary-detail { display: grid; align-content: start; gap: 20px; }\n.dsh-partner-diary-detail > header { display: grid; gap: 5px; padding-bottom: 16px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-diary-detail > header time { color: var(--partner-accent); font: 600 var(--partner-font-caption)/1 var(--partner-font-family); font-variant-numeric: tabular-nums; }\n.dsh-partner-diary-detail > header strong { font-size: var(--partner-font-title); letter-spacing: -.02em; }\n.dsh-partner-diary-detail > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-diary-detail > p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.75; text-wrap: pretty; }\n.dsh-partner-diary-detail > section { display: grid; gap: 8px; }\n.dsh-partner-diary-detail > section > strong { color: var(--partner-accent-strong); font-size: var(--partner-font-caption); }\n.dsh-partner-diary-detail ul { display: grid; gap: 6px; margin: 0; padding: 0; list-style: none; }\n.dsh-partner-diary-detail li { position: relative; padding-left: 12px; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-diary-detail li::before { position: absolute; top: .62em; left: 1px; width: 3px; height: 3px; border-radius: 50%; background: var(--partner-accent); content: ''; }\n.dsh-partner-graph-audit { min-height: 0; }\n.dsh-partner-graph-toolbar { display: flex; min-height: 78px; align-items: center; justify-content: space-between; gap: 20px; padding: 13px 18px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-graph-toolbar > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-graph-toolbar > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .1em; }\n.dsh-partner-graph-toolbar > span strong { overflow: hidden; font-size: var(--partner-font-label); font-weight: 650; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-graph-toolbar > span p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-toolbar > label { display: grid; flex: 0 1 220px; gap: 4px; }\n.dsh-partner-graph-toolbar > label > span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-toolbar select { width: 100%; height: 34px; padding: 0 30px 0 10px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); background-color: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-filters { display: flex; min-width: 0; gap: 4px; min-height: 45px; align-items: center; padding: 7px 12px; overflow-x: auto; border-bottom: 1px solid var(--partner-border); scrollbar-width: none; }\n.dsh-partner-graph-filters::-webkit-scrollbar { display: none; }\n.dsh-partner-graph-filters button { flex: none; min-height: 30px; padding: 0 9px; border: 1px solid transparent; border-radius: 8px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; transition: color 140ms ease, background-color 140ms ease, border-color 140ms ease; }\n.dsh-partner-graph-filters button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-graph-filters button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-graph-filters b { margin-left: 3px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-graph-browser { display: grid; grid-template-columns: minmax(270px, 33%) minmax(0, 1fr); height: clamp(430px, 56vh, 620px); min-height: 0; overflow: hidden; }\n.dsh-partner-graph-index { min-height: 0; overflow-x: hidden; overflow-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }\n.dsh-partner-graph-index > button { display: grid; width: 100%; gap: 5px; padding: 12px 14px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; transition: background-color 150ms ease, box-shadow 180ms var(--partner-ease-out); }\n.dsh-partner-graph-index > button:hover { background: var(--partner-hover); }\n.dsh-partner-graph-index > button.is-active { background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent-strong); }\n.dsh-partner-graph-index > button > span { width: max-content; padding: 3px 6px; border: 1px solid var(--partner-border); border-radius: 6px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); font-size: var(--partner-font-caption); font-weight: 630; }\n.dsh-partner-graph-index > button[data-kind=\"conflicts_with\"] > span { color: var(--partner-danger); border-color: color-mix(in srgb, var(--partner-danger) 26%, var(--partner-border)); }\n.dsh-partner-graph-index strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-graph-index strong i { color: var(--partner-text-tertiary); font-style: normal; }\n.dsh-partner-graph-index p { display: -webkit-box; margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-graph-index small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-stage { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; padding: 24px clamp(20px, 3vw, 36px) 40px; scrollbar-gutter: stable; }\n.dsh-partner-graph-stage > article { display: grid; gap: 20px; animation: dsh-partner-content-enter 220ms var(--partner-ease-out) both; }\n.dsh-partner-graph-stage > article > header { display: grid; gap: 6px; padding-bottom: 18px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-graph-stage > article > header > span { width: max-content; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }\n.dsh-partner-graph-stage > article[data-kind=\"conflicts_with\"] > header > span { color: var(--partner-danger); }\n.dsh-partner-graph-stage > article > header > strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-graph-stage > article > header > strong i { color: var(--partner-text-tertiary); font-style: normal; font-weight: 450; }\n.dsh-partner-graph-stage > article > header > p { max-width: 68ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-graph-stage > article > header > small { max-width: 72ch; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-graph-pair { display: grid; grid-template-columns: minmax(0, 1fr) 64px minmax(0, 1fr); align-items: stretch; }\n.dsh-partner-graph-pair > section { display: grid; align-content: start; gap: 9px; min-height: 170px; padding: 15px; border: 1px solid var(--partner-border); border-radius: 13px; }\n.dsh-partner-graph-pair > section > header { display: grid; gap: 3px; }\n.dsh-partner-graph-pair > section small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-pair > section strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-graph-pair > section p { margin: 0 0 8px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; overflow-wrap: anywhere; }\n.dsh-partner-graph-pair > section button { width: max-content; min-height: 30px; margin-top: auto; padding: 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-graph-pair > section button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-graph-pair > div { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-pair > div i { height: 1px; background: var(--partner-border); }\n.dsh-partner-graph-pair > div span { padding: 0 5px; white-space: nowrap; }\n.dsh-partner-graph-stage > article > footer { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; padding-top: 2px; }\n.dsh-partner-graph-stage > article > footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-stage > article > footer > strong { color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-variant-numeric: tabular-nums; }\n.dsh-partner-state { display: grid; place-items: center; align-content: center; min-height: 280px; padding: 30px; color: var(--partner-text-tertiary); text-align: center; }\n.dsh-partner-state > svg { margin-bottom: 10px; color: var(--partner-accent); }\n.dsh-partner-state strong { color: var(--partner-text-secondary); font-size: var(--partner-font-label); }\n.dsh-partner-state p { max-width: 330px; margin: 7px 0 14px; font-size: var(--partner-font-body); line-height: 1.55; }\n.dsh-partner-state.is-compact { min-height: 130px; }\n\n/* One material contract for every card surface in the partner workspace.\n Individual components own layout and state; this layer owns glass, edge\n refraction and elevation so visual treatment cannot drift between tabs. */\n:is(\n .dsh-partner-feature-block,\n .dsh-partner-capability-detail,\n .dsh-partner-feature-form,\n .dsh-partner-task-form,\n .dsh-partner-schedule-form,\n .dsh-partner-market-toolbar,\n .dsh-partner-skill-installed > article,\n .dsh-partner-skill-picker,\n .dsh-partner-skill-picker-list > article,\n .dsh-partner-access-list > button,\n .dsh-partner-market-grid > article,\n .dsh-partner-board > section,\n .dsh-partner-task-card,\n .dsh-partner-schedule-list > article,\n .dsh-partner-capability-group,\n .dsh-partner-home-details > section,\n .dsh-partner-capabilities button,\n .dsh-partner-weixin-connect,\n .dsh-partner-qr,\n .dsh-partner-channel-card,\n .dsh-partner-metrics article,\n .dsh-partner-automation,\n .dsh-partner-concern-board,\n .dsh-partner-memory-library,\n .dsh-partner-graph-pair > section\n) {\n border-color: var(--partner-border);\n background: var(--partner-card-surface);\n box-shadow: var(--partner-card-shadow);\n}\n\n/* Editable controls share one compact translucent material. Keeping this\n separate from cards preserves hierarchy while preventing theme defaults or\n platform form colors from leaking into the workspace. */\n:is(\n .dsh-partner-field input,\n .dsh-partner-field textarea,\n .dsh-partner-field select,\n .dsh-partner-review-policy select,\n .dsh-partner-concern-compose input,\n .dsh-partner-library-tools input,\n .dsh-partner-memory-editor input,\n .dsh-partner-memory-editor textarea,\n .dsh-partner-graph-toolbar select\n) {\n background-color: var(--partner-control);\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 54%, transparent),\n inset 0 -1px 0 var(--partner-glass-rim-shadow);\n}\n\n:is(\n .dsh-partner-field input,\n .dsh-partner-field textarea,\n .dsh-partner-field select,\n .dsh-partner-review-policy select,\n .dsh-partner-concern-compose input,\n .dsh-partner-library-tools input,\n .dsh-partner-memory-editor input,\n .dsh-partner-memory-editor textarea,\n .dsh-partner-graph-toolbar select\n):focus {\n border-color: var(--partner-focus-ring);\n background-color: var(--partner-raised);\n box-shadow:\n 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent),\n inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 66%, transparent);\n}\n\n.dsh-partner-concern-decision {\n background: color-mix(in srgb, var(--partner-card-surface) 76%, transparent);\n box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 68%, transparent);\n}\n\n.dsh-partner-capabilities button.is-active {\n border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border));\n background: var(--partner-control-hover);\n box-shadow: var(--partner-card-shadow), inset 2px 0 var(--partner-text-secondary);\n}\n\n/* Shared motion and material contract. Business components keep their own\n layout while interactive surfaces receive one consistent physical response. */\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button.is-primary,\n .dsh-partner-automation-actions button.is-primary,\n .dsh-partner-concern-compose button.is-primary,\n .dsh-partner-memory-editor button.is-primary\n) {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n}\n\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button.is-primary,\n .dsh-partner-automation-actions button.is-primary,\n .dsh-partner-concern-compose button.is-primary,\n .dsh-partner-memory-editor button.is-primary\n)::after {\n position: absolute;\n z-index: -1;\n top: -75%;\n bottom: -75%;\n left: -70%;\n width: 48%;\n border-radius: 45%;\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .24), transparent);\n opacity: 0;\n transform: skewX(-18deg) translate3d(0, 0, 0);\n pointer-events: none;\n transition: opacity 140ms ease, transform 680ms var(--partner-ease-out);\n content: \"\";\n}\n\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button.is-primary,\n .dsh-partner-automation-actions button.is-primary,\n .dsh-partner-concern-compose button.is-primary,\n .dsh-partner-memory-editor button.is-primary\n):hover:not(:disabled)::after {\n opacity: 1;\n transform: skewX(-18deg) translate3d(360%, 0, 0);\n}\n\n:is(\n .dsh-partner-roster-title button,\n .dsh-partner-home-details header button,\n .dsh-partner-qr button,\n .dsh-partner-pairings button,\n .dsh-partner-session-list button,\n .dsh-partner-review-policy > button:last-child,\n .dsh-partner-automation-actions button,\n .dsh-partner-section-heading button,\n .dsh-partner-concern-actions button,\n .dsh-partner-concern-resolved button,\n .dsh-partner-memory-editor button,\n .dsh-partner-graph-pair > section button\n) {\n transition:\n color 140ms ease,\n border-color 140ms ease,\n background-color 140ms ease,\n box-shadow 180ms ease,\n transform 160ms var(--partner-ease-out);\n}\n\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button,\n .dsh-partner-session-list button,\n .dsh-partner-review-policy > button:last-child,\n .dsh-partner-automation-actions button,\n .dsh-partner-section-heading button,\n .dsh-partner-concern-actions button,\n .dsh-partner-concern-resolved button,\n .dsh-partner-memory-editor button,\n .dsh-partner-graph-pair > section button\n):active:not(:disabled) {\n transform: scale(.97);\n}\n\n:is(.dsh-partner-library-list > button, .dsh-partner-graph-index > button):hover {\n border-color: var(--partner-border);\n background: var(--partner-hover);\n}\n\n.dsh-partner-home-details > section,\n.dsh-partner-metrics > article,\n.dsh-partner-automation-grid > section {\n animation: dsh-partner-item-enter 300ms var(--partner-ease-out) both;\n}\n.dsh-partner-home-details > section:nth-child(2),\n.dsh-partner-metrics > article:nth-child(2),\n.dsh-partner-automation-grid > section:nth-child(2) { animation-delay: 36ms; }\n.dsh-partner-home-details > section:nth-child(3),\n.dsh-partner-metrics > article:nth-child(3) { animation-delay: 72ms; }\n\n@keyframes dsh-partner-content-enter {\n from { opacity: 0; transform: translate3d(0, 6px, 0); }\n to { opacity: 1; transform: translate3d(0, 0, 0); }\n}\n@keyframes dsh-partner-item-enter {\n from { opacity: 0; transform: translate3d(0, 8px, 0) scale(.99); }\n to { opacity: 1; transform: translate3d(0, 0, 0) scale(1); }\n}\n\n@media (prefers-reduced-transparency: reduce) {\n /* Preserve the same surface hierarchy as Knowledge. Only remove the blur;\n replacing every token with an opaque fallback produces a white sheet. */\n .dsh-partner-topbar,\n .dsh-partner-roster,\n .dsh-partner-stage,\n .dsh-partner-home-channel,\n .dsh-partner-home-details > section,\n .dsh-partner-capabilities button,\n .dsh-partner-weixin-connect,\n .dsh-partner-qr,\n .dsh-partner-channel-card,\n .dsh-partner-metrics article,\n .dsh-partner-automation,\n .dsh-partner-concern-board,\n .dsh-partner-memory-library,\n .dsh-partner-graph-pair > section { -webkit-backdrop-filter: none; backdrop-filter: none; }\n .dsh-partner-glass-surface { -webkit-backdrop-filter: none; backdrop-filter: none; }\n}\n\n@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {\n :is(.dsh-partner-sidebar, .dsh-partner-workspace) {\n --partner-surface: var(--partner-solid-panel);\n --partner-pane: var(--partner-solid-panel);\n --partner-raised: var(--partner-solid-raised);\n --partner-control: var(--partner-solid-control);\n --partner-card-surface: var(--partner-solid-raised);\n }\n}\n\n@container partner-memory (max-width: 980px) {\n .dsh-partner-automation-grid { grid-template-columns: minmax(0, 1fr); }\n}\n\n@container partner-memory (max-width: 640px) {\n .dsh-partner-automation-fields.is-heartbeat { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-automation-fields.is-memory-model { grid-template-columns: minmax(0, 1fr); }\n .dsh-partner-review-policy { grid-template-columns: auto minmax(0, 1fr); }\n .dsh-partner-review-policy > label,\n .dsh-partner-review-policy > button:last-child { grid-column: span 1; }\n .dsh-partner-concern-board > header p { display: none; }\n .dsh-partner-concern-row { grid-template-columns: minmax(0, 1fr) auto 14px; gap: 7px; }\n .dsh-partner-concern-state { grid-column: 1; }\n .dsh-partner-concern-copy { grid-row: 2; grid-column: 1 / -1; padding-left: 13px; }\n .dsh-partner-concern-time { grid-row: 1; grid-column: 2; }\n .dsh-partner-concern-row > svg { grid-row: 1; grid-column: 3; }\n .dsh-partner-concern-detail { padding: 0 12px 11px 25px; }\n .dsh-partner-concern-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n}\n\n@media (max-width: 1080px) {\n .dsh-partner-grid { grid-template-columns: 190px minmax(400px, 1fr); }\n .dsh-partner-home-channel { grid-template-columns: minmax(190px, .7fr) minmax(300px, 1.3fr); }\n .dsh-partner-home-channel-copy { padding-right: 26px; }\n}\n@media (max-width: 760px) {\n .dsh-partner-access-list { grid-template-columns: 1fr; }\n .dsh-partner-runtime-fields { grid-template-columns: 1fr; }\n .dsh-partner-topbar { align-items: stretch; flex-direction: column; gap: 7px; padding: 7px 9px; }\n .dsh-partner-mobile-workspace-nav { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 4px; }\n .dsh-partner-mobile-workspace-nav button { display: inline-flex; min-height: 34px; align-items: center; justify-content: center; gap: 5px; padding: 0 8px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; font: 580 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n .dsh-partner-mobile-workspace-nav button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); }\n .dsh-partner-grid { grid-template-columns: 1fr; }\n .dsh-partner-roster { display: none; }\n .dsh-partner-identity { padding-inline: 16px; }\n .dsh-partner-tabs { margin-inline: 12px; overflow-x: auto; }\n .dsh-partner-tabs button { flex: none; }\n .dsh-partner-stage-scroll { padding: 19px 16px 38px; }\n .dsh-partner-stage-scroll.is-workspace-page { padding: 0; }\n .dsh-partner-fields.two,\n .dsh-partner-capabilities,\n .dsh-partner-metrics { grid-template-columns: 1fr; }\n .dsh-partner-capability-group { padding: 11px; }\n .dsh-partner-capability-group > header { display: grid; gap: 8px; }\n .dsh-partner-capability-group > header em { justify-self: start; }\n .dsh-partner-home-heading { display: grid; gap: 8px; }\n .dsh-partner-home-heading p { text-align: left; }\n .dsh-partner-home-channel { grid-template-columns: 1fr; }\n .dsh-partner-home-route { min-height: 128px; padding-bottom: 10px; }\n .dsh-partner-home-channel-copy { padding: 12px 22px 24px; }\n .dsh-partner-home-details { grid-template-columns: 1fr; }\n .dsh-partner-home-profile { grid-row: auto; }\n .dsh-partner-weixin-connect { grid-template-columns: 52px 1fr; }\n .dsh-partner-weixin-connect > button { grid-column: 1 / -1; }\n .dsh-partner-qr { grid-template-columns: 1fr; justify-items: center; text-align: center; }\n .dsh-partner-qr > span { justify-items: center; }\n .dsh-partner-channel-card { grid-template-columns: 45px minmax(0, 1fr) auto; }\n .dsh-partner-channel-card > .dsh-partner-status { display: none; }\n .dsh-partner-library-header { display: grid; gap: 0; }\n .dsh-partner-library-header nav { min-height: 38px; }\n .dsh-partner-library-tools { display: grid; }\n .dsh-partner-library-tools > label { width: 100%; }\n .dsh-partner-library-browser { grid-template-columns: 1fr; height: auto; overflow: visible; }\n .dsh-partner-library-list { max-height: 300px; border-right: 0; border-bottom: 1px solid var(--partner-border); }\n .dsh-partner-library-detail { min-height: 280px; }\n .dsh-partner-profile-browser { grid-template-columns: 1fr; height: auto; overflow: visible; }\n .dsh-partner-profile-people { max-height: 240px; border-right: 0; border-bottom: 1px solid var(--partner-border); }\n .dsh-partner-profile-stage { min-height: 330px; }\n .dsh-partner-profile-heading { display: grid; }\n .dsh-partner-profile-heading > div { width: max-content; }\n .dsh-partner-profile-meta { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-profile-meta > span:nth-child(3) { padding-left: 0; border-left: 0; }\n .dsh-partner-graph-toolbar { display: grid; min-height: 0; gap: 12px; }\n .dsh-partner-graph-toolbar > label { width: 100%; }\n .dsh-partner-graph-browser { grid-template-columns: 1fr; height: auto; }\n .dsh-partner-graph-index { max-height: 280px; border-right: 0; border-bottom: 1px solid var(--partner-border); }\n .dsh-partner-graph-stage { min-height: 320px; }\n .dsh-partner-graph-pair { grid-template-columns: 1fr; gap: 9px; }\n .dsh-partner-graph-pair > div { min-height: 20px; grid-template-columns: 1fr auto 1fr; }\n .dsh-partner-graph-stage > article > footer { display: grid; gap: 4px; }\n}\n@media (prefers-reduced-motion: reduce) {\n .dsh-partner-workspace *,\n .dsh-partner-sidebar * { scroll-behavior: auto !important; transition-duration: .01ms !important; animation-duration: .01ms !important; }\n}\n.dsh-partner-record-picker { display: grid; gap: 8px; min-width: 0; }\n.dsh-partner-record-options { display: grid; gap: 6px; max-height: 220px; overflow-y: auto; min-width: 0; padding: 4px; }\n.dsh-partner-record-options button { display: flex; align-items: center; gap: 10px; min-height: 44px; text-align: left; }\n.dsh-partner-record-options button span { min-width: 0; overflow-wrap: anywhere; }\n.dsh-partner-record-options button small { flex-shrink: 0; color: var(--partner-text-tertiary); }\n.dsh-partner-record-selection, .dsh-partner-record-summary { margin: 0; padding: 8px 12px; font-size: var(--partner-font-caption); color: var(--partner-text-secondary); overflow-wrap: anywhere; }\n.dsh-partner-record-selection { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }\n", ".dsh-partner-feature-hero-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 8px; }\n.dsh-partner-feature-page { gap: 20px; }\n.dsh-partner-feature-hero { min-height: 92px; padding-bottom: 18px; }\n.dsh-partner-feature-hero p { max-width: 62ch; text-wrap: pretty; }\n.dsh-partner-feature-block { gap: 16px; padding: 20px; border-radius: 18px; box-shadow: inset 0 1px 0 var(--partner-card-highlight), 0 5px 16px color-mix(in srgb, var(--partner-text) 4%, transparent); }\n.dsh-partner-feature-block > header { min-height: 40px; }\n.dsh-partner-feature-block > header strong { font-size: var(--partner-font-label); letter-spacing: -.01em; }\n.dsh-partner-feature-block > header small { margin-top: 1px; }\n\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select) { outline: 0; }\n.dsh-partner-workspace select:not([multiple]) {\n appearance: none;\n padding-right: 32px;\n border-color: var(--partner-border);\n border-radius: 9px;\n color: var(--partner-text);\n background-color: var(--partner-control);\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 15px) calc(50% - 1px), calc(100% - 11px) calc(50% - 1px);\n background-repeat: no-repeat;\n background-size: 4px 4px, 4px 4px;\n box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 54%, transparent), inset 0 -1px 0 var(--partner-glass-rim-shadow);\n font-family: var(--partner-font-family);\n font-size: var(--partner-font-body);\n font-weight: 520;\n cursor: pointer;\n transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease;\n}\n.dsh-partner-workspace select:not([multiple]):hover:not(:disabled) { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background-color: var(--partner-hover); }\n.dsh-partner-workspace select:not([multiple]):focus-visible { border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent), inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 66%, transparent); }\n.dsh-partner-workspace select:not([multiple]):disabled { cursor: not-allowed; }\n.dsh-partner-workspace select option { color: var(--partner-text); background: var(--partner-solid-control); font: inherit; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer { align-items: center; margin-top: 4px; padding-top: 16px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-form-footer-spacer { flex: 1; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer .is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer .is-primary:hover { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > .dsh-partner-workspace-notice { grid-column: 1 / -1; margin: 0; }\n.dsh-partner-feature-page button:disabled { cursor: not-allowed; opacity: .48; }\n.dsh-partner-identity-danger > div { display: flex; align-items: center; justify-content: flex-end; gap: 7px; }\n.dsh-partner-identity-danger[data-confirming=\"true\"] { margin-inline: -12px; padding: 16px 12px 0; border-top-color: color-mix(in srgb, var(--partner-danger) 30%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 4%, transparent); }\n.dsh-partner-identity-danger button.is-secondary { border-color: var(--partner-border); color: var(--partner-text-secondary); background: var(--partner-control); }\n.dsh-partner-identity-danger button.is-danger { color: var(--partner-on-accent); border-color: var(--partner-danger); background: var(--partner-danger); }\n.dsh-partner-profile-entries article > header button.is-danger { color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 8%, transparent); }\n\n.dsh-partner-skill-installed > article,\n.dsh-partner-market-grid > article,\n.dsh-partner-schedule-list > article { transition: border-color 150ms ease, background-color 150ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-skill-installed > article:hover,\n.dsh-partner-schedule-list > article:hover { border-color: color-mix(in srgb, var(--partner-text) 20%, var(--partner-border)); background: color-mix(in srgb, var(--partner-hover) 60%, var(--partner-raised)); transform: translate3d(0, -1px, 0); }\n.dsh-partner-schedule-meta { display: flex !important; align-items: center; flex-wrap: wrap; gap: 5px 10px !important; margin-top: 2px; }\n.dsh-partner-schedule-meta > em { position: relative; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; font-variant-numeric: tabular-nums; }\n.dsh-partner-schedule-meta > em + em::before { position: absolute; top: 50%; left: -6px; width: 2px; height: 2px; border-radius: 50%; background: var(--partner-text-tertiary); content: \"\"; }\n.dsh-partner-run-list > article { border-radius: 9px; transition: background-color 140ms ease; }\n.dsh-partner-run-list > article:hover { background: var(--partner-hover); }\n.dsh-partner-board > section { border-radius: 16px; box-shadow: none; }\n.dsh-partner-board .dsh-partner-task-card { box-shadow: none; }\n\n@media (hover: hover) {\n .dsh-partner-skill-installed .is-icon,\n .dsh-partner-schedule-list .is-icon { opacity: .34; transition: opacity 140ms ease, color 140ms ease, background-color 140ms ease; }\n .dsh-partner-skill-installed > article:hover .is-icon,\n .dsh-partner-schedule-list > article:hover .is-icon,\n .dsh-partner-skill-installed .is-icon:focus-visible,\n .dsh-partner-schedule-list .is-icon:focus-visible { opacity: 1; }\n}\n\n.dsh-partner-workspace-dialog-layer { position: absolute; z-index: 12; inset: 0; display: flex; align-items: center; justify-content: center; padding: clamp(16px, 3vw, 32px); background: var(--partner-dialog-veil); }\n.dsh-partner-workspace-dialog { position: relative; inset: auto; display: grid; grid-template-rows: auto minmax(0, 1fr); width: min(560px, 100%); max-width: none; height: auto; max-height: min(680px, 100%); margin: 0; padding: 0; overflow: hidden; border: 1px solid color-mix(in srgb, var(--partner-text) 18%, var(--partner-border)); border-radius: 16px; color: var(--partner-text); background: var(--partner-solid-panel); box-shadow: 0 22px 58px color-mix(in srgb, #000 18%, transparent), 0 4px 14px color-mix(in srgb, #000 8%, transparent), inset 0 1px 0 var(--partner-card-highlight); animation: dsh-partner-dialog-enter 200ms var(--partner-ease-out) both; }\n.dsh-partner-workspace-dialog.is-wide { width: min(680px, 100%); max-height: min(720px, 100%); }\n.dsh-partner-workspace-dialog > header { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 20px; padding: 22px 22px 18px; border-bottom: 1px solid var(--partner-separator); background: var(--partner-solid-raised); }\n.dsh-partner-workspace-dialog > header > span { display: grid; gap: 5px; min-width: 0; }\n.dsh-partner-workspace-dialog > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 680; letter-spacing: .09em; }\n.dsh-partner-workspace-dialog > header strong { font-size: var(--partner-font-title); line-height: 1.25; font-weight: 660; letter-spacing: -.025em; text-wrap: balance; }\n.dsh-partner-workspace-dialog > header p { max-width: 58ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; text-wrap: pretty; }\n.dsh-partner-workspace-dialog > header button { display: grid; place-items: center; width: 32px; min-height: 32px; padding: 0; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; cursor: pointer; transition: color 140ms ease, border-color 140ms ease, background-color 140ms ease, transform 140ms var(--partner-ease-out); }\n.dsh-partner-workspace-dialog > header button:hover { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-workspace-dialog > header button:active { transform: scale(.94); }\n.dsh-partner-workspace-dialog-body { min-width: 0; min-height: 0; overflow: auto; padding: 20px 22px 24px; overscroll-behavior: contain; scrollbar-gutter: stable; }\n.dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) { margin: 0; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; }\n.dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child { position: sticky; z-index: 2; bottom: -24px; margin: 4px -22px -24px; padding: 14px 22px; border-top: 1px solid var(--partner-separator); background: var(--partner-solid-raised); box-shadow: 0 -10px 24px color-mix(in srgb, #000 5%, transparent); }\n\n.dsh-partner-workspace-notice { display: grid; grid-template-columns: 7px minmax(0, 1fr); align-items: start; gap: 10px; margin: 0 0 14px; padding: 11px 13px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-body); line-height: 1.5; }\n.dsh-partner-workspace-notice > i { width: 7px; height: 7px; margin-top: .42em; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-workspace-notice.is-error { border-color: color-mix(in srgb, var(--partner-danger) 30%, var(--partner-border)); color: var(--partner-danger); }\n.dsh-partner-workspace-notice.is-error > i { background: var(--partner-danger); }\n.dsh-partner-workspace-notice.is-warning > i { background: var(--partner-warning); }\n.dsh-partner-workspace-notice.is-success > i { background: var(--partner-success); }\n\n.dsh-partner-collection-empty { display: grid; justify-items: center; padding: 38px 24px 42px; color: var(--partner-text-secondary); text-align: center; }\n.dsh-partner-collection-empty > span { display: grid; place-items: center; width: 42px; height: 42px; margin-bottom: 12px; border: 1px solid var(--partner-border); border-radius: 13px; color: var(--partner-text-tertiary); background: var(--partner-control); }\n.dsh-partner-collection-empty > strong { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-collection-empty > p { max-width: 46ch; margin: 6px 0 14px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); line-height: 1.55; text-wrap: pretty; }\n.dsh-partner-collection-empty > button { margin-top: 14px; }\n\n.dsh-partner-collection-skeleton { display: grid; gap: 8px; padding: 6px 0; }\n.dsh-partner-collection-skeleton > i { display: block; height: 68px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 12px; background: linear-gradient(100deg, var(--partner-control) 20%, var(--partner-hover) 38%, var(--partner-control) 56%); background-size: 220% 100%; animation: dsh-partner-skeleton 1.4s ease-in-out infinite; }\n\n.dsh-partner-count-label { display: inline-flex; align-items: baseline; gap: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-count-label > b { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 650; }\n\n@keyframes dsh-partner-dialog-enter { from { opacity: 0; transform: translate3d(0, 10px, 0) scale(.985); } to { opacity: 1; transform: translate3d(0, 0, 0) scale(1); } }\n@keyframes dsh-partner-skeleton { 0% { background-position: 120% 0; } 100% { background-position: -120% 0; } }\n\n@media (max-width: 760px) {\n .dsh-partner-workspace-dialog-layer { align-items: stretch; padding: 0; }\n .dsh-partner-workspace-dialog, .dsh-partner-workspace-dialog.is-wide { width: 100%; height: 100%; max-height: none; border-width: 0; border-radius: 0; }\n .dsh-partner-workspace-dialog > header { padding: 18px 18px 15px; }\n .dsh-partner-workspace-dialog-body { padding: 18px 18px 26px; }\n .dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child { bottom: -26px; margin: 4px -18px -26px; padding: 13px 18px max(13px, env(safe-area-inset-bottom)); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-partner-workspace-dialog, .dsh-partner-collection-skeleton > i { animation: none; }\n}\n.dsh-partner-feature-form > .dsh-partner-form-help { color: var(--partner-text-secondary); background: transparent; padding: 0; overflow-wrap: anywhere; line-height: 1.6; }\n", ".dsh-partner-requirement-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin-bottom: 18px; }\n.dsh-partner-requirement-toolbar .dsh-partner-board-statuses { margin: 0; flex: 1; }\n.dsh-partner-requirement-toolbar .dsh-partner-board-search { flex: 0 1 300px; }\n.dsh-partner-requirement-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr)); gap: 12px; }\n.dsh-partner-requirement-card { min-width: 0; border: 1px solid var(--partner-border); border-radius: 16px; overflow: hidden; background: var(--partner-raised); }\n.dsh-partner-feature-page .dsh-partner-requirement-open { display: flex; flex-direction: column; align-items: stretch; gap: 12px; width: 100%; min-height: 186px; padding: 18px; border: 0; border-radius: 0; background: transparent; color: var(--partner-text); text-align: left; box-shadow: none; }\n.dsh-partner-requirement-open:hover, .dsh-partner-requirement-open:focus-visible { background: var(--partner-hover); }\n.dsh-partner-requirement-open > strong { font-size: var(--partner-font-label); line-height: 1.5; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow-wrap: anywhere; }\n.dsh-partner-requirement-open > p { margin: 0; min-height: 3em; font-size: var(--partner-font-body); color: var(--partner-text-secondary); line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; }\n.dsh-partner-requirement-meta { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: var(--partner-font-caption); color: var(--partner-text-secondary); }\n.dsh-partner-requirement-meta > span { border-radius: 6px; padding: 3px 7px; background: var(--partner-control); color: var(--partner-text); }\n.dsh-partner-requirement-meta small { font: inherit; overflow-wrap: anywhere; }\n.dsh-partner-requirement-progress { height: 4px; width: 100%; border-radius: 4px; background: var(--partner-border); overflow: hidden; margin-top: auto; }\n.dsh-partner-requirement-progress > i { display: block; height: 100%; border-radius: inherit; background: var(--partner-text-secondary); }\n.dsh-partner-requirement-card > footer { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 8px 18px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-requirement-card > footer > small { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); }\n.dsh-partner-requirement-card > footer > button { border: 0; background: transparent; box-shadow: none; }\n.dsh-partner-requirement-legacy { width: 100%; display: flex; gap: 12px; margin-top: 20px; padding: 14px !important; text-align: left; }\n.dsh-partner-requirement-legacy > span { flex: 1; color: var(--partner-text-secondary); }\n.dsh-partner-requirement-breadcrumb { display: flex; align-items: center; gap: 8px; min-width: 0; margin-bottom: 12px; font-size: var(--partner-font-body); }\n.dsh-partner-requirement-breadcrumb > span { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }\n.dsh-partner-requirement-breadcrumb > button, .dsh-partner-requirement-breadcrumb > svg { flex-shrink: 0; }\n.dsh-partner-requirement-facts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; padding-block: 12px; border-block: 1px solid var(--partner-separator); }\n.dsh-partner-requirement-facts > span { display: grid; gap: 6px; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); }\n.dsh-partner-requirement-facts b { color: var(--partner-text); font-weight: 550; overflow-wrap: anywhere; }\n.dsh-partner-requirement-disclosure { border-top: 1px solid var(--partner-separator); padding-top: 8px; }\n.dsh-partner-requirement-disclosure > summary { display: flex; align-items: center; gap: 8px; min-height: 40px; cursor: pointer; color: var(--partner-text-secondary); font-size: var(--partner-font-body); list-style: none; }\n.dsh-partner-requirement-disclosure > summary::-webkit-details-marker { display: none; }\n.dsh-partner-requirement-disclosure > summary::before { content: ''; width: 6px; height: 6px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: rotate(-45deg); }\n.dsh-partner-requirement-disclosure[open] > summary::before { transform: rotate(45deg); }\n.dsh-partner-requirement-disclosure > p { color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-requirement-disclosure > label { display: grid; gap: 8px; margin-bottom: 12px; }\n.dsh-partner-requirement-actions { display: flex; flex-wrap: wrap; gap: 8px; }\n.dsh-partner-requirement-owner { display: grid; gap: 8px; font-size: var(--partner-font-body); }\n.dsh-partner-requirement-detail :is(textarea, select) { box-sizing: border-box; width: 100%; min-height: 40px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 9px; background: var(--partner-control); color: var(--partner-text); font: var(--partner-font-body)/1.5 var(--partner-font-family); }\n.dsh-partner-requirement-detail textarea { resize: vertical; }\n.dsh-partner-feature-page.is-board :is(button, summary, textarea):focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-feature-page.is-board button:not(:disabled):active { transform: none; }\n.dsh-partner-requirement-detail button.is-primary { background: var(--partner-accent-strong); color: var(--partner-on-accent); border-color: var(--partner-accent-strong); }\n.dsh-partner-requirement-detail button.is-danger { color: var(--partner-danger); }\n.dsh-partner-feature-page.is-board > .dsh-partner-feature-page.is-board { padding: 0; }\n.dsh-partner-requirement-detail > footer { display: flex; justify-content: flex-end; gap: 8px; }\n.dsh-partner-requirement-detail .dsh-partner-task-result { overflow-wrap: anywhere; }\n@media (max-width: 760px) {\n .dsh-partner-requirement-toolbar { align-items: stretch; }\n .dsh-partner-requirement-toolbar .dsh-partner-board-statuses { display: flex; }\n .dsh-partner-requirement-toolbar .dsh-partner-board-search { flex-basis: 100%; }\n .dsh-partner-requirement-facts { grid-template-columns: 1fr 1fr; }\n .dsh-partner-requirement-legacy { flex-wrap: wrap; }\n .dsh-partner-requirement-legacy > span { flex-basis: 100%; }\n .dsh-partner-requirement-detail button, .dsh-partner-requirement-card button, .dsh-partner-requirement-disclosure summary { min-height: 44px; }\n}\n", "/* Mobile composition lives separately from the desktop visual system so each\n layout can evolve without selector-specificity patches. */\n.dsh-partner-topbar > .dsh-partner-mobile-controls { display: none; }\n\n@media (max-width: 760px) {\n .dsh-partner-workspace {\n min-height: 0;\n height: 100%;\n max-height: 100dvh;\n overflow: hidden;\n font-size: 14px;\n }\n\n .dsh-partner-topbar {\n display: grid;\n grid-template-columns: 44px minmax(0, 1fr);\n align-items: center;\n gap: 8px;\n min-width: 0;\n margin: max(6px, env(safe-area-inset-top)) 6px 0;\n padding: 7px 8px 8px;\n border-radius: 14px 14px 10px 10px;\n }\n\n .dsh-partner-topbar > .dsh-partner-topbar-brand {\n display: flex;\n min-width: 0;\n min-height: 44px;\n gap: 9px;\n }\n\n .dsh-partner-topbar-brand > span:last-child { min-width: 0; }\n .dsh-partner-topbar-brand > :not(button) { display: none; }\n .dsh-partner-topbar-brand strong,\n .dsh-partner-topbar-brand small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .dsh-partner-topbar [data-xiaohei-workspace-close] { width: 44px; height: 44px; }\n\n .dsh-partner-topbar > .dsh-partner-mobile-controls {\n display: contents;\n }\n\n .dsh-partner-mobile-companion-row { display: grid; min-width: 0; grid-template-columns: minmax(0, 1fr) 44px; gap: 6px; }\n .dsh-partner-mobile-create {\n display: grid;\n width: 44px;\n min-height: 44px;\n place-items: center;\n padding: 0;\n border: 1px solid var(--partner-border);\n border-radius: 10px;\n color: var(--partner-text-secondary);\n background: var(--partner-control);\n box-shadow: inset 0 1px 0 var(--partner-glass-highlight);\n }\n\n .dsh-partner-mobile-workspace-nav { grid-column: 1 / -1; gap: 6px; }\n .dsh-partner-mobile-workspace-nav button {\n min-height: 44px;\n padding: 0 9px;\n border-radius: 10px;\n font-size: 13px;\n touch-action: manipulation;\n }\n\n .dsh-partner-grid { min-width: 0; padding: 6px 6px max(6px, env(safe-area-inset-bottom)); }\n .dsh-partner-stage { min-width: 0; border-radius: 13px; }\n .dsh-partner-stage-scroll { padding: 18px 14px max(36px, calc(20px + env(safe-area-inset-bottom))); }\n\n .dsh-partner-identity { min-width: 0; min-height: 76px; padding: 13px 14px 9px; }\n .dsh-partner-identity > span:nth-child(2) { overflow: hidden; }\n .dsh-partner-identity h1 { font-size: 20px; }\n .dsh-partner-identity .dsh-partner-status { max-width: 112px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .dsh-partner-tabs { min-height: 45px; margin-inline: 8px; gap: 0; scrollbar-width: none; }\n .dsh-partner-tabs::-webkit-scrollbar { display: none; }\n .dsh-partner-tabs button { min-height: 44px; padding-inline: 11px; touch-action: manipulation; }\n\n .dsh-partner-feature-page { width: 100%; gap: 14px; padding: 18px 12px max(34px, calc(18px + env(safe-area-inset-bottom))); }\n .dsh-partner-feature-hero { min-height: 0; gap: 13px; padding: 0 2px 14px 12px; }\n .dsh-partner-feature-hero h2 { font-size: 23px; }\n .dsh-partner-feature-hero p { font-size: 14px; line-height: 1.55; }\n .dsh-partner-feature-hero > div { align-items: center; }\n .dsh-partner-feature-block,\n .dsh-partner-capability-detail { gap: 13px; padding: 14px; border-radius: 14px; }\n\n .dsh-partner-workspace :where(input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select) { font-size: 16px; }\n .dsh-partner-field :where(input, select),\n :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, select),\n .dsh-partner-board-search > input,\n .dsh-partner-board-assignee > select,\n .dsh-partner-task-detail select { min-height: 44px; height: auto; }\n .dsh-partner-field textarea,\n :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) textarea { min-height: 96px; }\n\n .dsh-partner-workspace :where(button:not(.dsh-partner-feature-switch)) { touch-action: manipulation; }\n .dsh-partner-feature-page :where(button:not(.dsh-partner-feature-switch)),\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-home-channel-actions button,\n .dsh-partner-home-details header button,\n .dsh-partner-identity-danger button,\n .dsh-partner-library-header nav button,\n .dsh-partner-graph-filters button,\n .dsh-partner-graph-pair > section button { min-height: 44px; }\n .dsh-partner-feature-page .is-icon { width: 44px; min-width: 44px; min-height: 44px; }\n .dsh-partner-check { min-height: 44px; }\n .dsh-partner-feature-switch,\n .dsh-partner-feature-switch[data-on=\"true\"] {\n width: 44px;\n height: 44px;\n min-height: 44px !important;\n border-color: transparent !important;\n background: transparent !important;\n }\n .dsh-partner-feature-switch::before {\n position: absolute;\n top: 11px;\n left: 3px;\n width: 38px;\n height: 22px;\n border: 1px solid var(--partner-border);\n border-radius: 999px;\n background: color-mix(in srgb, var(--partner-text) 9%, transparent);\n content: '';\n }\n .dsh-partner-feature-switch[data-on=\"true\"]::before { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n .dsh-partner-feature-switch i { top: 15px; left: 6px; }\n\n .dsh-partner-home-heading { margin-bottom: 16px; }\n .dsh-partner-home-channel { min-height: 0; border-radius: 16px; }\n .dsh-partner-home-route { min-height: 116px; padding: 20px; }\n .dsh-partner-home-channel-copy { padding: 12px 18px 20px; }\n .dsh-partner-home-channel-actions { align-items: stretch; flex-direction: column; gap: 8px; width: 100%; }\n .dsh-partner-home-channel-actions button { width: 100%; }\n .dsh-partner-home-details { gap: 10px; margin-top: 12px; }\n .dsh-partner-home-details > section { padding: 16px 14px 17px; }\n .dsh-partner-home-details header { grid-template-columns: 34px minmax(0, 1fr) auto; }\n .dsh-partner-home-profile blockquote,\n .dsh-partner-home-capability-list,\n .dsh-partner-home-capability-list small,\n .dsh-partner-home-continuity > p { margin-left: 0; }\n\n .dsh-partner-form-actions,\n .dsh-partner-identity-danger { align-items: stretch; flex-direction: column; }\n .dsh-partner-form-actions > button,\n .dsh-partner-identity-danger > div,\n .dsh-partner-identity-danger button { width: 100%; }\n .dsh-partner-identity-danger > div { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n\n .dsh-partner-skill-search,\n .dsh-partner-skill-search.is-compact { min-height: 52px; grid-template-columns: 36px minmax(0, 1fr) 44px; gap: 6px; padding: 4px 5px 4px 8px; }\n .dsh-partner-skill-search input,\n .dsh-partner-skill-search.is-compact input { height: 44px; font-size: 16px; }\n .dsh-partner-skill-search .dsh-partner-skill-search-clear { width: 44px; min-height: 44px; }\n .dsh-partner-skill-search-count { grid-column: 2 / -1; min-width: 0; padding: 0 7px 3px 0; border-left: 0; line-height: 16px; text-align: left; }\n .dsh-partner-skill-search:not(:has(.dsh-partner-skill-search-clear)) { grid-template-columns: 36px minmax(0, 1fr); }\n .dsh-partner-market-sources > button { min-height: 44px; }\n .dsh-partner-market-grid { grid-template-columns: 1fr; }\n .dsh-partner-skill-installed > article,\n .dsh-partner-skill-installed.is-market > article { grid-template-columns: 36px minmax(0, 1fr) 44px; padding: 10px; }\n .dsh-partner-skill-installed.is-binding > article { min-height: 0; grid-template-columns: 36px minmax(0, 1fr); }\n .dsh-partner-skill-installed.is-binding .dsh-partner-skill-binding-action { grid-column: 1 / -1; width: 100%; }\n .dsh-partner-skill-picker-list { max-height: min(420px, 48dvh); grid-template-columns: 1fr; }\n .dsh-partner-skill-picker-list > article { min-height: 0; }\n .dsh-partner-skill-picker-list button { width: 100%; justify-self: stretch; }\n\n .dsh-partner-board-tools { grid-template-columns: 1fr; }\n .dsh-partner-board-assignee,\n .dsh-partner-board-tools > small { grid-column: 1; }\n .dsh-partner-board-tools > small { justify-self: start; }\n .dsh-partner-board-search > button { right: 0; width: 44px; min-height: 44px; }\n .dsh-partner-board-statuses { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 5px; }\n .dsh-partner-board-statuses > button { min-width: 0; min-height: 44px; justify-content: center; gap: 4px; padding-inline: 5px; }\n .dsh-partner-board { grid-template-columns: 1fr; }\n .dsh-partner-board .dsh-partner-board-stage-toggle, .dsh-partner-board-more { min-height: 44px; }\n .is-board .dsh-partner-board-tools { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .is-board .dsh-partner-board-search, .is-board .dsh-partner-board-tools > small { grid-column: 1 / -1; }\n .is-board .dsh-partner-board-assignee { grid-column: auto; }\n .dsh-partner-board-assignee.is-mobile-stage { display: block; }\n .is-board .dsh-partner-board-statuses { display: none; }\n .dsh-partner-task-fields label { grid-template-columns: 1fr; gap: 5px; }\n .dsh-partner-task-dependency > div > span { min-height: 44px; grid-template-columns: 18px minmax(0, 1fr) 52px; }\n .dsh-partner-task-dependency > div button { min-height: 44px; }\n .dsh-partner-task-actions > span { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-task-actions button { width: 100%; }\n\n .dsh-partner-schedule-time { grid-template-columns: 1fr; }\n .dsh-partner-schedule-list > article {\n min-height: 0;\n grid-template-columns: minmax(0, 1fr) 44px;\n align-items: center;\n gap: 8px;\n padding: 12px;\n }\n .dsh-partner-schedule-list > article > span:first-child { grid-column: 1 / -1; }\n .dsh-partner-schedule-list > article > .dsh-partner-feature-switch { grid-column: 1; justify-self: start; }\n .dsh-partner-schedule-list > article > button:not(.is-icon):not(.dsh-partner-feature-switch) { grid-column: 1; grid-row: 2; justify-self: end; }\n .dsh-partner-schedule-list > article > .is-icon { grid-column: 2; grid-row: 2; }\n .dsh-partner-schedule-list p,\n .dsh-partner-run-list p { white-space: normal; overflow-wrap: anywhere; }\n\n .dsh-partner-workspace-dialog > header {\n padding: max(14px, env(safe-area-inset-top)) 14px 13px;\n }\n .dsh-partner-workspace-dialog > header button { width: 44px; min-height: 44px; }\n .dsh-partner-workspace-dialog-body { padding: 16px 14px max(24px, env(safe-area-inset-bottom)); }\n .dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child {\n bottom: calc(-1 * max(24px, env(safe-area-inset-bottom)));\n margin: 4px -14px calc(-1 * max(24px, env(safe-area-inset-bottom)));\n padding: 12px 14px max(12px, env(safe-area-inset-bottom));\n }\n}\n\n@media (max-width: 420px) {\n .dsh-partner-topbar-brand small { display: none; }\n .dsh-partner-feature-page { padding-inline: 10px; }\n .dsh-partner-feature-block,\n .dsh-partner-capability-detail { padding: 12px; }\n .dsh-partner-board-statuses { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-profile-meta { grid-template-columns: 1fr; }\n .dsh-partner-profile-meta > span { padding-left: 0; border-left: 0; }\n}\n\n@media (max-width: 760px) and (max-height: 520px) and (orientation: landscape) {\n .dsh-partner-stage-scroll { padding-bottom: 20px; }\n .dsh-partner-workspace-dialog > header { padding-top: 10px; padding-bottom: 10px; }\n}\n", ".dsh-partner-companion-picker { position: relative; min-width: 0; }\n.dsh-partner-companion-trigger,\n.dsh-partner-companion-options > button {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n min-width: 0;\n min-height: 48px;\n padding: 6px 10px;\n border: 1px solid var(--partner-border);\n border-radius: 10px;\n color: var(--partner-text);\n background: var(--partner-control);\n font: 500 var(--partner-font-body)/1.4 var(--partner-font-family);\n text-align: left;\n cursor: pointer;\n}\n.dsh-partner-companion-copy { display: grid; flex: 1; min-width: 0; gap: 2px; }\n.dsh-partner-companion-copy > strong { overflow: hidden; font-size: var(--partner-font-label); font-weight: 600; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-companion-copy > small { overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); font-weight: 400; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-companion-picker .dsh-partner-avatar { flex: none; width: 30px; height: 30px; border-radius: 9px; background: var(--partner-selected); box-shadow: none; }\n.dsh-partner-companion-chevron,\n.dsh-partner-companion-check { display: grid; flex: none; width: 16px; place-items: center; color: var(--partner-text-secondary); }\n.dsh-partner-companion-trigger[aria-expanded=\"true\"] .dsh-partner-companion-chevron { transform: rotate(180deg); }\n.dsh-partner-companion-trigger:hover:not(:disabled),\n.dsh-partner-companion-trigger[aria-expanded=\"true\"] { background: var(--partner-control-hover); border-color: var(--partner-text-tertiary); }\n/* Host themes target #root [role=listbox] with !important. Keep this one\n owned overlay legible without changing the host theme or workspace canvas. */\n:is(#root, .dsh-partner-workspace) .dsh-partner-companion-options[role=\"listbox\"] {\n position: absolute;\n z-index: 10;\n top: calc(100% + 6px);\n left: 0;\n right: 0;\n display: grid;\n gap: 3px;\n max-height: min(320px, 45dvh);\n overflow-y: auto;\n overscroll-behavior: contain;\n scrollbar-width: thin;\n padding: 5px;\n border: 1px solid var(--partner-border) !important;\n border-radius: 12px !important;\n background: var(--partner-solid-panel) !important;\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n box-shadow: var(--partner-shadow-md) !important;\n}\n:is(#root, .dsh-partner-workspace) .dsh-partner-companion-options > [role=\"option\"] {\n border-color: transparent;\n border-radius: 8px;\n color: var(--partner-text);\n background: transparent;\n box-shadow: none;\n transform: none;\n transition: none;\n}\n:is(#root, .dsh-partner-workspace) .dsh-partner-companion-options > [role=\"option\"]:is(:hover, :focus-visible) { background: var(--partner-hover); }\n:is(#root, .dsh-partner-workspace) .dsh-partner-companion-options > [role=\"option\"][aria-selected=\"true\"] { background: var(--partner-selected); }\n:is(#root, .dsh-partner-workspace) .dsh-partner-companion-options > [role=\"option\"]:focus-visible { outline: 2px solid var(--partner-focus-ring) !important; outline-offset: -2px !important; }\n", ".dsh-partner-pendant { position: fixed; z-index: 12; top: 46px; right: 8px; width: 260px; height: min(310px, calc(100dvh - 56px)); pointer-events: none; color: var(--partner-text); font: 13px/1.5 var(--partner-font-family); }\n.dsh-partner-pendant * { box-sizing: border-box; }\n.dsh-partner-pendant button { appearance: none; -webkit-appearance: none; margin: 0; color: inherit; font: inherit; cursor: pointer; touch-action: manipulation; }\n.dsh-partner-pendant button:focus-visible { outline: 2px solid var(--partner-focus-ring) !important; outline-offset: 2px !important; }\n.dsh-partner-pendant button:disabled { opacity: .45; cursor: default; }\n.dsh-partner-pendant .dsh-partner-pendant-canvas { position: fixed; left: 0; top: 0; display: block; width: 164px; height: 164px; pointer-events: none; transition: none !important; background: transparent !important; opacity: 1 !important; filter: none !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; }\n.dsh-partner-pendant .dsh-partner-pendant-strap { position: fixed; left: 0; top: 0; width: 100vw; height: 100dvh; overflow: hidden; pointer-events: none; }\n.dsh-partner-pendant-hit { position: absolute; top: 0; left: 0; width: 84px; height: 116px; transform: translate(130px, 210px) translate(-50%, -50%); padding: 0; border: 0; border-radius: 12px; background: var(--partner-solid-panel); pointer-events: auto; touch-action: none !important; user-select: none; -webkit-user-select: none; cursor: grab !important; }\n.dsh-partner-pendant-hit:active, .dsh-partner-pendant-anchor:active { cursor: grabbing !important; }\n.dsh-partner-pendant button.dsh-partner-pendant-hit.is-rendered { background: transparent !important; border: 0 !important; box-shadow: none !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; transition: none !important; }\n.dsh-partner-pendant button.dsh-partner-pendant-hit.is-rendered:not(:focus-visible) { outline: none !important; }\n.dsh-partner-pendant-fallback { display: grid; gap: 8px; }\n.dsh-partner-pendant-fallback small { color: var(--partner-text-secondary); font-size: 12px; }\n.dsh-partner-pendant button.dsh-partner-pendant-anchor { position: absolute; left: 50%; top: 2.42%; transform: translate(-50%, -50%); display: grid; place-items: center; width: 36px; height: 36px; padding: 0; border: 0 !important; border-radius: 50%; background: transparent !important; box-shadow: none !important; pointer-events: auto; touch-action: none; cursor: grab; }\n.dsh-partner-pendant-anchor > span { width: 14px; height: 6px; border: 1px solid #71817e; border-radius: 4px; background: #c3ced0; }\n.dsh-partner-pendant-anchor:hover > span { background: #e4ece8; }\n.dsh-partner-pendant-unread { position: absolute; left: 0; top: 0; transform: translate(130px, 144px) translate(-50%, -100%); display: grid; place-items: center; min-width: 18px; height: 18px; padding: 0 4px; border: 1px solid rgb(255 255 255 / 70%); border-radius: 9px; background: #435950; color: #fff; font: 600 11px/1 var(--partner-font-family); font-variant-numeric: tabular-nums; white-space: nowrap; pointer-events: none; user-select: none; transition: none !important; }\n.dsh-partner-pendant-unread[hidden] { display: none; }\nbody[data-ds-dark-theme] .dsh-partner-pendant-unread { border-color: rgb(200 220 213 / 24%); background: #b0c6bd; color: #202e29; }\n.dsh-partner-pendant-announcement { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n/* Own the reader's surface even under host-wide important focus rules. */\n.dsh-partner-pendant section#dsh-partner-pendant-inbox.dsh-partner-pendant-inbox {\n --pendant-paper: rgb(246 248 249 / 96%);\n --pendant-ink: #283237;\n --pendant-muted: #626f76;\n --pendant-line: rgb(74 91 101 / 13%);\n --pendant-tint: rgb(75 104 98 / 9%);\n --pendant-highlight: rgb(255 255 255 / 80%);\n position: fixed; display: flex; flex-direction: column; min-height: 0; overflow: hidden;\n color: var(--pendant-ink); font: 13px/1.5 var(--partner-font-family);\n border: 1px solid var(--pendant-line); border-radius: 20px; outline: none !important;\n background: var(--pendant-paper); backdrop-filter: blur(16px) saturate(.65); -webkit-backdrop-filter: blur(16px) saturate(.65);\n box-shadow: inset 0 1px var(--pendant-highlight), 0 12px 36px rgb(20 32 40 / 13%), 0 2px 6px rgb(20 32 40 / 5%) !important;\n pointer-events: auto; animation: partner-pendant-read-in 150ms ease-out;\n}\nbody[data-ds-dark-theme] .dsh-partner-pendant section#dsh-partner-pendant-inbox.dsh-partner-pendant-inbox {\n --pendant-paper: rgb(29 35 39 / 97%); --pendant-ink: #e3e9ed; --pendant-muted: #acb7be;\n --pendant-line: rgb(190 207 218 / 13%); --pendant-tint: rgb(164 198 186 / 10%); --pendant-highlight: rgb(222 233 238 / 9%);\n}\n.dsh-partner-pendant-inbox header { display: flex; flex-shrink: 0; align-items: center; gap: 10px; padding: 14px 14px 12px; border-bottom: 1px solid var(--pendant-line); }\n.dsh-partner-pendant-reader-heading { flex: 1; min-width: 0; display: grid; gap: 2px; }\n.dsh-partner-pendant-reader-heading strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-pendant-reader-icon { display: grid; place-items: center; width: 36px; height: 36px; flex: none; border: 1px solid var(--pendant-line); border-radius: 12px; background: var(--pendant-tint); }\n.dsh-partner-pendant-reader-count { display: grid; place-items: center; min-width: 24px; height: 24px; padding: 0 6px; border-radius: 8px; background: var(--pendant-tint); font-size: 12px; font-weight: 600; font-variant-numeric: tabular-nums; }\n.dsh-partner-pendant-inbox strong { font-weight: 600; font-size: 14px; }\n.dsh-partner-pendant-inbox small { color: var(--pendant-muted); font-size: 12px; }\n.dsh-partner-pendant-inbox header > button { display: grid; place-items: center; flex: none; width: 32px; height: 32px; padding: 0; border: 0; border-radius: 10px; background: transparent; }\n.dsh-partner-pendant-inbox button { box-shadow: none; transition: background-color 120ms ease, border-color 120ms ease; }\n.dsh-partner-pendant #dsh-partner-pendant-inbox button:focus-visible { outline: 2px solid var(--pendant-muted) !important; outline-offset: 2px !important; }\n.dsh-partner-pendant-inbox header > button:hover { background: var(--pendant-tint); }\n.dsh-partner-pendant-back { transform: rotate(90deg); }\n.dsh-partner-pendant-list { min-height: 0; padding: 8px; overflow: auto; overscroll-behavior: contain; scrollbar-width: thin; }\n.dsh-partner-pendant-list > button { display: grid; width: 100%; gap: 6px; padding: 12px; border: 1px solid transparent; border-radius: 12px; background: transparent; text-align: left; }\n.dsh-partner-pendant-list > button + button { margin-top: 4px; }\n.dsh-partner-pendant-list > button[data-unread=\"true\"] { background: var(--pendant-tint); }\n.dsh-partner-pendant-list > button:hover { background: var(--pendant-tint); border-color: var(--pendant-line); }\n.dsh-partner-pendant-list > button > span { display: flex; align-items: center; justify-content: space-between; gap: 8px; }\n.dsh-partner-pendant-list > button > span strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-pendant-list > button[data-unread=\"true\"] strong::before { display: inline-block; width: 5px; height: 5px; margin-right: 6px; border-radius: 50%; background: var(--pendant-muted); content: ''; }\n.dsh-partner-pendant-list time { flex-shrink: 0; font-size: 12px; color: var(--pendant-muted); font-variant-numeric: tabular-nums; }\n.dsh-partner-pendant-list b { font-weight: 500; font-size: 13px; }\n.dsh-partner-pendant-list small { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; overflow-wrap: anywhere; }\n.dsh-partner-pendant-inbox footer { display: flex; flex-shrink: 0; justify-content: space-between; align-items: center; gap: 8px; padding: 12px 16px; border-top: 1px solid var(--pendant-line); }\n.dsh-partner-pendant-inbox footer button { display: inline-flex; justify-content: center; align-items: center; gap: 6px; min-height: 34px; padding: 6px 10px; border: 1px solid var(--pendant-line); border-radius: 10px; background: transparent; white-space: nowrap; }\n.dsh-partner-pendant-inbox footer button:hover { background: var(--pendant-tint); }\n.dsh-partner-pendant-inbox footer .dsh-partner-pendant-source { background: var(--pendant-tint); font-weight: 600; }\n.dsh-partner-pendant-inbox footer .dsh-partner-pendant-all-messages { padding-left: 0; border-color: transparent; color: var(--pendant-muted); }\n.dsh-partner-pendant-all-messages span { font-size: 12px; font-variant-numeric: tabular-nums; }\n.dsh-partner-pendant-detail { min-height: 0; padding: 18px 20px 22px; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; }\n.dsh-partner-pendant-reader-meta { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 12px; color: var(--pendant-muted); font-size: 12px; }\n.dsh-partner-pendant-reader-meta > span { padding: 3px 7px; border: 1px solid var(--pendant-line); border-radius: 6px; }\n.dsh-partner-pendant-detail h3 { margin: 0 0 14px; font-size: 15px; line-height: 1.5; font-weight: 600; overflow-wrap: anywhere; }\n.dsh-partner-pendant-detail p { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; font-size: 14px; line-height: 1.8; }\n.dsh-partner-pendant-empty { padding: 32px 12px; color: var(--pendant-muted); text-align: center; }\n.dsh-partner-pendant-error { margin: 8px 12px; color: var(--partner-danger); overflow-wrap: anywhere; }\n@keyframes partner-pendant-read-in { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; transform: translateY(0); } }\n@media (max-width: 760px) {\n .dsh-partner-pendant { top: max(48px, env(safe-area-inset-top)); right: 0; width: min(200px, calc(100vw - 24px)); height: min(248px, calc(100dvh - 56px)); }\n .dsh-partner-pendant button.dsh-partner-pendant-anchor { width: 44px; height: 44px; }\n .dsh-partner-pendant-inbox header > button, .dsh-partner-pendant-inbox footer button { min-height: 44px; min-width: 44px; }\n .dsh-partner-pendant-detail { padding: 16px; }\n}\n@media (prefers-reduced-motion: reduce) { .dsh-partner-pendant-inbox { animation: none; } }\n", ".dsh-partner-pendant-settings-layout { display: grid; grid-template-columns: minmax(0, 1fr) 260px; gap: 20px; align-items: start; }\n.dsh-partner-pendant-settings-fields { display: grid; min-width: 0; gap: 16px; }\n.dsh-partner-pendant-length { display: grid; gap: 8px; color: var(--partner-text); font: inherit; }\n.dsh-partner-pendant-length > span { display: flex; justify-content: space-between; }\n.dsh-partner-pendant-length small { color: var(--partner-text-secondary); font-size: 12px; }\n.dsh-partner-pendant-length input[type=\"range\"] { appearance: none; -webkit-appearance: none; width: 100%; min-height: 44px; margin: 0; padding: 0; border: 0; background: transparent; box-shadow: none; cursor: pointer; }\n.dsh-partner-pendant-length input::-webkit-slider-runnable-track { height: 4px; border-radius: 4px; background: var(--partner-border); }\n.dsh-partner-pendant-length input::-moz-range-track { height: 4px; border-radius: 4px; background: var(--partner-border); }\n.dsh-partner-pendant-length input::-webkit-slider-thumb { appearance: none; -webkit-appearance: none; width: 18px; height: 18px; margin-top: -7px; border: 2px solid var(--partner-control); border-radius: 50%; background: var(--partner-text-secondary); }\n.dsh-partner-pendant-length input::-moz-range-thumb { width: 14px; height: 14px; border: 2px solid var(--partner-control); border-radius: 50%; background: var(--partner-text-secondary); }\n.dsh-partner-pendant-length input:focus-visible { outline: 2px solid var(--partner-accent); outline-offset: 3px; }\n.dsh-partner-pendant-fps-row { display: grid; gap: 8px; font-size: 13px; }\n.dsh-partner-pendant-options { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 4px; padding: 4px; border: 1px solid var(--partner-border); border-radius: 12px; background: var(--partner-control); }\n.dsh-partner-pendant-options[data-columns=\"2\"] { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-pendant-options > button { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 4px 8px; min-width: 0; min-height: 44px; padding: 6px 8px; border: 1px solid transparent; border-radius: 8px; background: transparent; color: var(--partner-text-secondary); }\n.dsh-partner-pendant-settings .dsh-partner-pendant-options > button[aria-pressed=\"true\"] { border-color: var(--partner-border); background: var(--partner-selected); color: var(--partner-text); }\n.dsh-partner-pendant-options strong { font-size: 13px; font-weight: 600; white-space: nowrap; }\n.dsh-partner-pendant-options small { font-size: 12px; color: var(--partner-text-secondary); }\n.dsh-partner-pendant-fps-row small { color: var(--partner-text-secondary); font-size: 12px; line-height: 1.5; }\n.dsh-partner-pendant-setting-hint { margin: 0; color: var(--partner-text-secondary); font-size: 13px; line-height: 1.6; }\n.dsh-partner-pendant-materials { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }\n.dsh-partner-pendant-settings button { font: inherit; appearance: none; -webkit-appearance: none; cursor: pointer; }\n.dsh-partner-pendant-materials > button { display: grid; position: relative; align-content: center; gap: 4px; min-height: 66px; padding: 12px; border: 1px solid var(--partner-border); border-radius: 12px; color: var(--partner-text); background: var(--partner-control); text-align: left; }\n.dsh-partner-pendant-materials strong { font-size: 13px; font-weight: 600; }\n.dsh-partner-pendant-materials small { font-size: 12px; color: var(--partner-text-secondary); }\n.dsh-partner-pendant-materials > button > svg:not(.dsh-partner-strap-swatch) { position: absolute; right: 8px; bottom: 14px; }\n.dsh-partner-pendant-materials .dsh-partner-strap-swatch { display: block; width: 100%; height: 38px; margin: 0 0 4px; }\n.dsh-partner-pendant-settings .dsh-partner-pendant-materials > button[aria-pressed=\"true\"] { border-color: var(--partner-text-secondary); background: var(--partner-selected); }\n.dsh-partner-pendant-settings button:disabled { opacity: .45; cursor: default; }\n.dsh-partner-pendant-settings button:focus-visible, .dsh-partner-pendant-hex input:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-pendant-color-row { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-top: 4px; font-size: 13px; }\n.dsh-partner-pendant-swatches { display: flex; align-items: center; gap: 4px; }\n.dsh-partner-pendant-swatches button { position: relative; display: grid; place-items: center; width: 30px; height: 34px; padding: 3px; border: 1px solid transparent; border-radius: 8px; background: transparent; }\n.dsh-partner-pendant-swatches i { width: 22px; height: 22px; border: 1px solid var(--partner-border); border-radius: 50%; }\n.dsh-partner-pendant-swatches button[aria-pressed=\"true\"] { border-color: var(--partner-text-secondary); }\n.dsh-partner-pendant-swatches svg { position: absolute; color: white; filter: drop-shadow(0 1px 1px #222); }\n.dsh-partner-pendant-hex { min-width: 0; }\n.dsh-partner-pendant-hex input { width: 104px; min-height: 36px; padding: 6px 10px; appearance: none; border: 1px solid var(--partner-border); border-radius: 9px; background: var(--partner-control); color: var(--partner-text); font: 13px/1.5 var(--partner-font-family); }\n.dsh-partner-pendant-hex input[aria-invalid=\"true\"] { border-color: var(--partner-danger); }\n.dsh-partner-pendant-color-error { margin: 6px 0 0; color: var(--partner-danger); font-size: 12px; }\n.dsh-partner-pendant-image-actions { display: flex; flex-wrap: wrap; gap: 8px; }\n.dsh-partner-pendant-image-actions button, .dsh-partner-pendant-settings-footer button { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 36px; padding: 7px 12px; border: 1px solid var(--partner-border); border-radius: 10px; background: var(--partner-control); color: var(--partner-text); font-size: 13px; }\n.dsh-partner-pendant-settings button:not(:disabled):not(.dsh-partner-feature-switch):not([aria-pressed=\"true\"]):hover { background-color: var(--partner-hover); }\n.dsh-partner-pendant-settings input[type=\"file\"][hidden] { display: none !important; }\n.dsh-partner-pendant-settings-footer { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; }\n.dsh-partner-pendant-settings-footer small { font-size: 12px; color: var(--partner-text-secondary); }\n.dsh-partner-pendant-preview { position: sticky; top: 0; min-width: 0; padding: 20px; border: 1px solid var(--partner-border); border-radius: 18px; background: var(--partner-card-surface); }\n.dsh-partner-pendant-preview header { display: grid; gap: 4px; }\n.dsh-partner-pendant-preview header strong { font-size: 14px; font-weight: 600; }\n.dsh-partner-pendant-preview small { font-size: 12px; color: var(--partner-text-secondary); }\n.dsh-partner-pendant-preview-stage { display: flex; align-items: center; flex-direction: column; padding: 16px 0; }\n.dsh-partner-pendant-preview-stage > svg { width: 100px; height: 130px; flex: none; }\n.dsh-partner-pendant-preview-card { position: relative; width: 128px; aspect-ratio: 8 / 11; border: 2px solid #80908e; border-radius: 12px; background: #253235; color: #e3eae5; }\n.dsh-partner-pendant-preview-card::before { position: absolute; z-index: 1; top: -11px; left: calc(50% - 8px); width: 16px; height: 14px; border: 3px solid #c3ced0; border-radius: 6px; background: #465752; content: ''; }\n.dsh-partner-pendant-preview-card img { display: block; position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; border-radius: 10px; }\n.dsh-partner-pendant-preview-card > span { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; gap: 14px; }\n.dsh-partner-pendant-preview-card strong { font-size: 13px; }\n.dsh-partner-pendant-preview-card small { color: #b6cbc2; font-size: 11px; }\n.dsh-partner-pendant-preview > p { margin: 8px 0 0; font-size: 13px; text-align: center; line-height: 1.8; }\n.dsh-partner-pendant-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }\n.dsh-partner-pendant-settings-fields > .dsh-partner-feature-block:first-child > header { flex-direction: row; align-items: center; }\n.dsh-partner-pendant-settings-fields > .dsh-partner-feature-block:first-child > header > div { width: auto; flex: none; }\n@media (max-width: 1100px) { .dsh-partner-pendant-settings-layout { grid-template-columns: minmax(0, 1fr); } .dsh-partner-pendant-preview { position: static; } .dsh-partner-pendant-preview-stage { padding: 0; } .dsh-partner-pendant-preview-stage > svg { height: 70px; } }\n@media (max-width: 600px) { .dsh-partner-pendant-materials > button { padding: 12px 8px; } .dsh-partner-pendant-swatches button { width: 40px; height: 44px; } .dsh-partner-pendant-image-actions button, .dsh-partner-pendant-settings-footer button, .dsh-partner-pendant-hex input { min-height: 44px; } .dsh-partner-pendant-hex input { font-size: 16px; } }\n", "/* Memory workspace owns layout only; material, color and type come from Partner. */\n.dsh-partner-memory-page .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n.dsh-partner-memory-page { display: grid; gap: 18px; min-width: 0; color: var(--partner-text); font: var(--partner-font-body)/1.55 var(--partner-font-family); }\n.dsh-partner-memory-page .dsh-partner-feature-hero { min-height: 0; padding: 0 0 14px; }\n.dsh-partner-memory-page h3, .dsh-partner-memory-page h4 { margin: 0; font: 600 15px/1.5 var(--partner-font-family); }\n.dsh-partner-memory-page p { margin: 0; }\n.dsh-partner-memory-page :where(button, input, select), .dsh-partner-memory-settings :where(button, input, select) { font-family: var(--partner-font-family); }\n.dsh-partner-memory-page :where(button:not(.dsh-partner-concern-row)), .dsh-partner-memory-actions > button { display: inline-flex; align-items: center; justify-content: center; gap: 7px; min-height: 36px; padding: 7px 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-body); line-height: 1.4; cursor: pointer; box-shadow: none; }\n.dsh-partner-memory-page :where(button:not(.dsh-partner-concern-row)):hover:not(:disabled), .dsh-partner-memory-actions > button:hover:not(:disabled) { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-memory-page :where(button:not(.dsh-partner-concern-row)):disabled { opacity: .5; cursor: default; }\n.dsh-partner-memory-page :where(button, input, select, summary):focus-visible, .dsh-partner-memory-settings :where(button, input, select, summary):focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 3px; }\n.dsh-partner-memory-page :where(input, select) { min-width: 0; min-height: 38px; max-width: 100%; padding: 8px 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); background-color: var(--partner-control); font-size: var(--partner-font-body); }\n.dsh-partner-memory-page :where(small, time), .dsh-partner-memory-hint { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); }\n.dsh-partner-memory-context, .dsh-partner-memory-status { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; min-width: 0; }\n.dsh-partner-memory-context > label { display: flex; gap: 10px; align-items: center; min-width: 0; }\n.dsh-partner-memory-context > label > span { white-space: nowrap; color: var(--partner-text-secondary); }\n.dsh-partner-memory-context select { width: clamp(140px, 22vw, 260px); }\n.dsh-partner-memory-context > button, .dsh-partner-memory-status > button { margin-left: auto; }\n.dsh-partner-memory-badge { display: inline-flex; align-items: center; flex: none; padding: 3px 8px; border: 1px solid var(--partner-border); border-radius: 6px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); white-space: nowrap; }\n.dsh-partner-memory-library-v2 { display: grid; gap: 16px; min-width: 0; }\n.dsh-partner-memory-nav { display: flex; gap: 4px; align-items: center; min-width: 0; padding-bottom: 10px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-memory-nav > button { border-color: transparent; background: transparent; }\n.dsh-partner-memory-nav > button[aria-pressed=\"true\"], .dsh-partner-memory-segment > button[aria-pressed=\"true\"] { color: var(--partner-text); background: var(--partner-hover); border-color: var(--partner-border); }\n.dsh-partner-memory-more { position: relative; margin-left: auto; }\n.dsh-partner-memory-more > summary { display: flex; align-items: center; gap: 8px; min-height: 36px; padding: 6px 10px; border-radius: 9px; cursor: pointer; list-style: none; color: var(--partner-text-secondary); }\n.dsh-partner-memory-more > summary::-webkit-details-marker { display: none; }\n.dsh-partner-memory-more[open] > summary, .dsh-partner-memory-more > summary:hover { background: var(--partner-hover); color: var(--partner-text); }\n.dsh-partner-memory-more > div { position: absolute; right: 0; top: calc(100% + 6px); z-index: 12; display: grid; gap: 3px; width: 188px; padding: 6px; border: 1px solid var(--partner-border); border-radius: 12px; background: var(--partner-solid-panel); box-shadow: 0 6px 18px color-mix(in srgb, var(--partner-text) 10%, transparent); }\n.dsh-partner-memory-more > div > button { justify-content: flex-start; border-color: transparent; background: transparent; }\n.dsh-partner-memory-more > div > button > small { margin-left: auto; }\n.dsh-partner-memory-toolbar { display: flex; gap: 8px; flex-wrap: wrap; min-width: 0; }\n.dsh-partner-memory-toolbar > label { min-width: 0; }\n.dsh-partner-memory-search { flex: 1 1 200px; }\n.dsh-partner-memory-search input { width: 100%; }\n.dsh-partner-memory-segment { display: flex; gap: 6px; flex-wrap: wrap; }\n.dsh-partner-memory-segment > button { min-height: 32px; padding: 5px 10px; border-color: transparent; background: transparent; }\n.dsh-partner-memory-rows { display: grid; min-width: 0; border: 1px solid var(--partner-border); border-radius: 12px; overflow: hidden; background: var(--partner-raised); }\n.dsh-partner-memory-rows:empty { display: none; }\n.dsh-partner-memory-page button.dsh-partner-memory-row { display: flex; align-items: center; justify-content: space-between; gap: 14px; width: 100%; min-width: 0; padding: 14px 16px; border: 0; border-radius: 0; text-align: left; background: transparent; }\n.dsh-partner-memory-page button.dsh-partner-memory-row + button.dsh-partner-memory-row { border-top: 1px solid var(--partner-border); }\n.dsh-partner-memory-row > span:first-child { flex: 1; min-width: 0; }\n.dsh-partner-memory-row strong { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--partner-text); font-weight: 580; }\n.dsh-partner-memory-row p { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; margin: 4px 0; color: var(--partner-text-secondary); overflow-wrap: anywhere; }\n.dsh-partner-memory-profile { display: grid; gap: 22px; }\n.dsh-partner-memory-profile > header { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px; }\n.dsh-partner-memory-profile > section { display: grid; gap: 10px; }\n.dsh-partner-memory-records { display: grid; gap: 12px; min-width: 0; }\n.dsh-partner-memory-record, .dsh-partner-memory-jobs { min-width: 0; border: 1px solid var(--partner-border); border-radius: 12px; background: var(--partner-raised); }\n.dsh-partner-memory-record > summary, .dsh-partner-memory-jobs > summary { padding: 12px 14px; cursor: pointer; overflow-wrap: anywhere; }\n.dsh-partner-memory-record > summary > strong { font-weight: 550; }\n.dsh-partner-memory-record > summary > time { margin-right: 12px; }\n.dsh-partner-memory-record > summary > small, .dsh-partner-memory-jobs > summary > small { margin-left: 10px; }\n.dsh-partner-memory-record > div, .dsh-partner-memory-jobs > div { display: grid; gap: 12px; padding: 0 16px 16px; min-width: 0; }\n.dsh-partner-memory-record :where(p, blockquote), .dsh-partner-memory-procedure { white-space: pre-wrap; overflow-wrap: anywhere; font: var(--partner-font-body)/1.7 var(--partner-font-family); }\n.dsh-partner-memory-record blockquote { margin: 0; padding: 8px 12px; border-left: 2px solid var(--partner-border); }\n.dsh-partner-memory-jobs > div > div, .dsh-partner-memory-session { display: flex; justify-content: space-between; align-items: center; gap: 12px; }\n.dsh-partner-memory-session > span { display: grid; min-width: 0; }\n.dsh-partner-memory-settings { display: grid; gap: 16px; min-width: 0; }\n.dsh-partner-memory-settings .dsh-partner-automation { padding: 0; border: 0; background: transparent; box-shadow: none; }\n.dsh-partner-memory-settings .dsh-partner-automation-fields { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-memory-settings .dsh-partner-automation-fields.is-memory-model { grid-template-columns: minmax(0, 1fr); }\n.dsh-partner-memory-settings .dsh-partner-review-policy { flex-wrap: wrap; }\n.dsh-partner-memory-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; padding-top: 14px; }\n.dsh-partner-memory-page .dsh-partner-concern-board { margin: 0; }\n.dsh-partner-memory-page .dsh-partner-memory-nav svg, .dsh-partner-memory-more svg { flex-shrink: 0; }\n@media (max-width: 640px) {\n .dsh-partner-memory-page { gap: 14px; }\n .dsh-partner-memory-page :where(button, input, select), .dsh-partner-memory-settings :where(button, input, select) { min-height: 44px; }\n .dsh-partner-memory-page :where(input, select), .dsh-partner-memory-settings :where(input, select, textarea) { font-size: 16px; }\n .dsh-partner-memory-nav { gap: 2px; }\n .dsh-partner-memory-nav > button { padding-inline: 9px; gap: 5px; }\n .dsh-partner-memory-nav > button > svg { display: none; }\n .dsh-partner-memory-more > summary { min-height: 44px; padding-inline: 8px; }\n .dsh-partner-memory-context > label { flex: 1; }\n .dsh-partner-memory-context select { width: 100%; }\n .dsh-partner-memory-context > label > span { font-size: var(--partner-font-caption); }\n .dsh-partner-memory-context > .dsh-partner-memory-badge { order: 3; }\n .dsh-partner-memory-toolbar > .dsh-partner-memory-search { flex-basis: 100%; }\n .dsh-partner-memory-toolbar > label:not(.dsh-partner-memory-search) { flex: 1; }\n .dsh-partner-memory-toolbar select { width: 100%; }\n .dsh-partner-memory-page button.dsh-partner-memory-row { gap: 8px; padding: 12px; }\n .dsh-partner-memory-record > summary { line-height: 1.6; }\n .dsh-partner-memory-record > summary > time { display: block; }\n .dsh-partner-memory-settings .dsh-partner-automation-fields { grid-template-columns: minmax(0, 1fr); }\n}\n", "import {useRef, useState} from 'react'\nimport {IconRefreshOutline16} from '@deepseek-ai/dsh-client-ui-primitives'\nimport {api, type CompanionView, type PartnerSnapshot} from '../../client-api.js'\nimport {WorkspaceHero, WorkspaceNotice, CollectionEmpty, errorMessage} from '../workspace-components.js'\nimport {MemoryLibrary} from './memory-library.js'\nimport {AutomationSettings} from './automation-settings.js'\nimport {useMemoryResource} from './use-memory-resource.js'\nimport type {MemoryCollection, MemoryLayers} from './types.js'\nimport {MemoryJobFeedback} from './job-feedback.js'\n\nexport function MemoryPanel({companion, snapshot, openSession, startSession, renewSession, onChanged}: {\n companion: CompanionView; snapshot: PartnerSnapshot; openSession(routeId: string, sessionId: string): Promise<void>;\n startSession(companionId: string): Promise<void>; renewSession(routeId: string): Promise<void>; onChanged(): Promise<void>\n}): JSX.Element {\n const sessions = snapshot.sessions.filter(item => item.companionId === companion.id).sort((a, b) => Number(b.kind === 'local') - Number(a.kind === 'local') || b.lastMessageAt - a.lastMessageAt)\n const [requestedScope, setScope] = useState('')\n const [settings, setSettings] = useState(false)\n const [busy, setBusy] = useState(false)\n const lock = useRef(false)\n const [error, setError] = useState<string>()\n const [notice, setNotice] = useState<string>()\n const base = `/companions/${encodeURIComponent(companion.id)}`\n const initialScope = sessions[0] ? `${sessions[0].channelId}:${sessions[0].userId}` : ''\n const requested = requestedScope || initialScope\n const collection = useMemoryResource<MemoryCollection>(`${base}/memory${requested ? `?${new URLSearchParams({scopeId: requested})}` : ''}`, 15_000)\n const scopeId = requested || collection.data?.profiles[0]?.scopeId || ''\n const layers = useMemoryResource<MemoryLayers>(scopeId ? `${base}/memory/layers?${new URLSearchParams({scopeId})}` : undefined, 15_000)\n const reload = async (): Promise<void> => {await Promise.all([collection.reload(), layers.reload()])}\n const run = async (action: () => Promise<void>, success: string): Promise<void> => {\n if (lock.current) return\n lock.current = true; setBusy(true); setError(undefined); setNotice(undefined)\n try {await action(); setNotice(success); await reload()}\n catch (reason) {setError(errorMessage(reason))}\n finally {lock.current = false; setBusy(false)}\n }\n const retries = layers.data?.retryCount ?? layers.data?.jobs.filter(job => job.status === 'retrying').length ?? 0\n const [showAllJobs,setShowAllJobs] = useState(false)\n const scopes = collection.data?.profiles ?? []\n return <div className=\"dsh-partner-memory-page\">\n <WorkspaceHero eyebrow=\"MEMORY & CONTEXT\" title=\"\u8BB0\u5FC6\u5E93\" detail=\"\u77E5\u9053\u8BB0\u4F4F\u4E86\u4EC0\u4E48\u3001\u4F9D\u636E\u662F\u4EC0\u4E48\uFF0C\u4E5F\u80FD\u7EA0\u6B63\u5DF2\u7ECF\u8FC7\u65F6\u7684\u7406\u89E3\u3002\" actions={<button type=\"button\" onClick={() => setSettings(true)}>\u8BB0\u5FC6\u8BBE\u7F6E</button>} />\n <div className=\"dsh-partner-memory-context\"><label><span>\u5F53\u524D\u8054\u7CFB\u4EBA</span><select aria-label=\"\u5F53\u524D\u8054\u7CFB\u4EBA\" value={scopeId} onChange={event => {setScope(event.target.value); setError(undefined); setNotice(undefined)}}>\n {!scopes.length && <option value={scopeId}>{scopeId ? '\u672C\u5730\u5BF9\u8BDD' : '\u6682\u65E0\u8054\u7CFB\u4EBA'}</option>}\n {scopes.map(profile => <option value={profile.scopeId} key={profile.scopeId}>{sessions.some(session => session.kind === 'local' && `${session.channelId}:${session.userId}` === profile.scopeId) ? '\u672C\u5730\u5BF9\u8BDD' : profile.label}</option>)}\n </select></label><span className=\"dsh-partner-memory-badge\">{companion.automation.memory.enabled ? '\u5B66\u4E60\u5DF2\u5F00\u542F' : '\u5B66\u4E60\u5DF2\u6682\u505C'}</span><button type=\"button\" aria-label=\"\u5237\u65B0\u8BB0\u5FC6\" disabled={collection.loading || layers.loading} onClick={() => {void reload()}}><IconRefreshOutline16 size={16} /></button></div>\n {(error || collection.error || layers.error) && <WorkspaceNotice>{error || collection.error || layers.error}</WorkspaceNotice>}{notice && <WorkspaceNotice kind=\"success\">{notice}</WorkspaceNotice>}\n {!!layers.data?.jobs.length && <details className=\"dsh-partner-memory-jobs\"><summary>{layers.data.jobCount ?? layers.data.jobs.length} \u9879\u5C1A\u672A\u6574\u7406 \u00B7 {retries} \u9879\u5931\u8D25\u91CD\u8BD5<small>\u539F\u59CB\u5BF9\u8BDD\u5DF2\u4FDD\u5B58\uFF0C\u4E0D\u5F71\u54CD\u7EE7\u7EED\u804A\u5929</small></summary><div>{layers.data.jobs.slice(0, showAllJobs ? 100 : 10).map(job => <div key={job.id}><span>{job.at && <small>{new Date(job.at).toLocaleString()}</small>}{job.status === 'processing' ? '\u6B63\u5728\u6574\u7406' : job.status === 'retrying' ? `\u5DF2\u5931\u8D25 ${job.attempts} \u6B21 \u00B7 \u4E0B\u6B21 ${new Date(job.nextAt).toLocaleTimeString()}` : '\u7B49\u5F85\u6267\u884C\uFF0C\u65E0\u9700\u91CD\u590D\u63D0\u4EA4'}<MemoryJobFeedback status={job.status} {...(job.error ? {error:job.error} : {})} />{job.attempts >= 3 && job.status === 'retrying' && <small>\u9000\u907F\u671F\u95F4\u5141\u8BB8\u540E\u7EED\u4EFB\u52A1\u7EE7\u7EED\u6574\u7406</small>}</span>{job.status === 'retrying' && <button type=\"button\" disabled={busy} onClick={() => {void run(async () => {await api(`${base}/memory/jobs/${encodeURIComponent(job.id)}?${new URLSearchParams({scopeId})}`, {method: 'POST'})}, '\u5DF2\u5B89\u6392\u91CD\u8BD5\uFF0C\u5F53\u524D\u6267\u884C\u7ED3\u675F\u540E\u5904\u7406')}}>\u91CD\u65B0\u6392\u961F</button>}</div>)}{layers.data.jobs.length>10 && <button type=\"button\" onClick={()=>setShowAllJobs(!showAllJobs)}>{showAllJobs?'\u6536\u8D77':'\u663E\u793A\u66F4\u591A\u4EFB\u52A1'}</button>}{(layers.data.jobCount ?? 0)>100 && <p>\u4EC5\u5C55\u793A\u6700\u65E9100\u9879\uFF0C\u5B8C\u6210\u540E\u81EA\u52A8\u8865\u5145\u540E\u7EED\u4EFB\u52A1\u3002</p>}</div></details>}\n {!collection.data ? <CollectionEmpty title={collection.error ? '\u8BB0\u5FC6\u8BFB\u53D6\u5931\u8D25' : '\u6B63\u5728\u8BFB\u53D6\u8BB0\u5FC6'} action={collection.error ? <button type=\"button\" onClick={() => {void reload()}}>\u91CD\u8BD5</button> : undefined} /> : <MemoryLibrary key={scopeId} companionId={companion.id} scopeId={scopeId} collection={collection.data} layers={layers.data} changed={reload} />}\n <details className=\"dsh-partner-memory-record is-sessions\"><summary>\u4F19\u4F34\u4F1A\u8BDD <small>{sessions.length}</small></summary><div>{sessions.map(session => <div className=\"dsh-partner-memory-session\" key={session.id}><span><strong>{session.kind === 'local' ? '\u672C\u5730\u5BF9\u8BDD' : `\u6E20\u9053\u8054\u7CFB\u4EBA \u00B7 ${session.userId.slice(-6)}`}</strong><small>{session.archived ? '\u5DF2\u5F52\u6863' : '\u53EF\u7EE7\u7EED\u5BF9\u8BDD'}</small></span><button type=\"button\" disabled={busy} onClick={() => {void run(() => session.archived ? renewSession(session.id) : openSession(session.id, session.sessionId), session.archived ? '\u65B0\u4F1A\u8BDD\u5DF2\u521B\u5EFA' : '\u4F1A\u8BDD\u5DF2\u6253\u5F00')}}>{session.archived ? '\u65B0\u5EFA\u4F1A\u8BDD' : '\u6253\u5F00\u4F1A\u8BDD'}</button></div>)}{!sessions.length && <button type=\"button\" disabled={busy} onClick={() => {void run(() => startSession(companion.id), '\u4F1A\u8BDD\u5DF2\u521B\u5EFA')}}>\u5F00\u59CB\u5BF9\u8BDD</button>}</div></details>\n {settings && <AutomationSettings companion={companion} kind=\"memory\" close={() => setSettings(false)} onChanged={async () => {await onChanged(); await reload()}} />}\n </div>\n}\n", "export const PARTNER_API = '/partner-local/v1'\n\nexport type { CompanionCapability as Capability } from './capabilities.js'\nimport type { CompanionCapability as Capability } from './capabilities.js'\nexport interface AutomationView {\n memory: { enabled: boolean; retentionDays: number; provider?: string; model?: string; dailyReviewEnabled: boolean; dailyReviewHour: number }\n heartbeat: { enabled: boolean; intervalMinutes: number; quietStartHour: number; quietEndHour: number; dailyLimit: number }\n}\nexport interface CompanionView {\n id: string; name: string; role: string; description: string; instructions: string\n presetId?: string; provider?: string; model?: string; capabilities: Capability[]\n createdAt: number; updatedAt: number\n automation: AutomationView\n}\nexport interface ChannelView {\n platform?: 'weixin' | 'matrix' | 'mattermost'\n direct?: { baseUrl: string; targetId: string; peerId: string }\n id: string; companionId: string; accountId: string; name: string; enabled: boolean\n createdAt: number; updatedAt: number; runtimeStatus: 'stopped' | 'starting' | 'running' | 'error'\n lastError?: string; credentialConfigured: boolean\n}\nexport interface PairingView {\n directTargetId?: string\n pairingCode?: string\n contactKey?: string\n deliveryTarget?: {channelId: string; userId: string}\n id: string; channelId: string; userId: string; displayName: string\n status: 'pending' | 'approved' | 'blocked'; createdAt: number; updatedAt: number\n}\nexport interface ChannelSessionView {\n id: string; kind: 'local' | 'channel'; channelId: string; userId: string; companionId: string; sessionId: string; cwd?: string; lastMessageAt: number; archived: boolean\n}\nexport interface HeartbeatStateView {\n companionId: string; lastCheckedAt?: number; lastSentAt?: number; nextCheckAt: number\n sentDay: string; sentCount: number; consecutiveFailures: number; lastError?: string\n}\nexport type MemoryKindView = 'profile' | 'preference' | 'task' | 'event' | 'relationship' | 'emotion'\nexport interface MemoryEvidenceView { turnId: string; at: number; excerpt: string }\nexport interface MemoryView { id: string; scopeId: string; kind: MemoryKindView; subject: string; content: string; status: 'active' | 'completed' | 'superseded' | 'expired'; confidence: number; importance: number; updatedAt: number; locked?: boolean; evidence: MemoryEvidenceView[] }\nexport interface UserProfileSnapshotView { scopeId: string; label: string; version: string; updatedAt?: number; entries: MemoryView[]; preferences?: MemoryView[]; evidenceCount: number; lockedCount: number }\nexport interface MemoryRelationView { id: string; scopeId: string; sourceMemoryId: string; targetMemoryId: string; kind: 'supports' | 'depends_on' | 'about' | 'conflicts_with' | 'follows'; label: string; confidence: number; updatedAt: number }\nexport interface MemoryGraphView { memories: MemoryView[]; relations: MemoryRelationView[] }\nexport interface DailyReflectionView { scopeId: string; date: string; summary: string; events: string[]; openTasks: string[]; completedTasks: string[]; learnings: string[]; updatedAt: number; turnCount: number }\nexport interface ConcernView {\n recordingPending?: boolean\n recordTarget?: ConcernRecordTargetView\n id: string; subject: string; reason: string; origin: 'explicit' | 'implicit'; state: 'active' | 'watching' | 'snoozed' | 'resolved' | 'archived'\n priority: number; confidence: number; score: number; watchKind: 'auto' | 'knowledge' | 'workspace' | 'web'; updatedAt: number; nextCheckAt: number; lastCheckedAt?: number\n resources: Array<{ kind: 'file' | 'knowledge'; locator: string; label: string }>\n}\nexport interface ConcernRecordTargetView { kind: 'file' | 'note'; locator: string; label: string }\nexport interface ConcernObservationView {\n id: string; concernId: string; event: string; evidence: string; source: string; interruptScore: number\n decision: 'drop' | 'remember' | 'defer' | 'feed' | 'notify'; notificationRuleEffect: 'auto' | 'notify' | 'suppress'\n notificationRuleReason: string; decisionReason: string; createdAt: number; mentionedAt?: number\n}\nexport interface ConcernActivityView { concerns: ConcernView[]; observations: ConcernObservationView[] }\nexport interface ConcernSourceView { kind: 'file' | 'knowledge'; label: string; detail: string; token: string }\nexport interface PresetView { id: string; name: string; broken?: string }\nexport interface ModelCatalogView { providers: Array<{ id: string; name: string; models: Array<{ id: string; name: string }> }>; defaultSelection: { provider: string; model: string } }\nexport interface PartnerSnapshot {\n companions: CompanionView[]; channels: ChannelView[]; pairings: PairingView[]; sessions: ChannelSessionView[]; heartbeatStates: HeartbeatStateView[]; presets: PresetView[]\n}\nexport interface LoginView {\n id: string; companionId: string; phase: 'waiting' | 'scanned' | 'confirmed' | 'expired' | 'error'\n qrContent?: string; accountId?: string; baseUrl?: string; error?: string; expiresAt: number\n}\n\nexport interface SkillView {\n id: string; name: string; displayName: string; description: string; version: string\n source: 'builtin' | 'market' | 'local'; sourceId?: string; executionContext: 'inline' | 'fork'; trusted: boolean; updatedAt: number\n}\nexport interface SkillBindingView { companionId: string; skillId: string; enabled: boolean }\nexport interface SkillMarketSourceView { id: string; name: string; kind: 'dsh-index' | 'clawhub' | 'loophub' | 'skillhub'; indexUrl: string; enabled: boolean; trusted: boolean; builtin?: boolean }\nexport interface MarketSkillView { id: string; name: string; description: string; version: string; tags: string[]; sourceId: string }\nexport interface SkillCatalogView { installed: SkillView[]; bindings: SkillBindingView[]; sources: SkillMarketSourceView[] }\nexport interface SkillMarketView { sources: SkillMarketSourceView[]; entries: MarketSkillView[]; errors: Array<{ sourceId: string; error: string }> }\nexport interface SkillMarketNetworkView { proxyUrl?: string }\nexport interface SkillMarketNetworkTestView { ok: true; latencyMs: number; sourceCount: number; entryCount: number }\n\nexport type BoardTaskStatusView = 'backlog' | 'ready' | 'doing' | 'review' | 'done' | 'blocked'\nexport interface BoardTaskView {\n acceptanceCriteria?: string[]; resourceKeys?: string[]\n evidence?: import('./tasks/contract.js').TaskEvidence[]; reviewChecks?: import('./tasks/contract.js').TaskReviewCheck[]\n previousAttempt?: { reviewChecks?: import('./tasks/contract.js').TaskReviewCheck[] }\n scheduling?: import('./tasks/scheduling.js').TaskScheduling\n requirementId?: string\n autoRun?: boolean\n id: string; title: string; description: string; status: BoardTaskStatusView; priority: 'low' | 'normal' | 'high' | 'urgent'\n assigneeCompanionId?: string; reviewerCompanionId?: string; createdBy: 'user' | 'companion' | 'schedule'; revision: number; createdAt: number; updatedAt: number; completedAt?: number\n skillIds: string[]; dependencyTaskIds: string[]; resultAbstract?: string; resultSummary?: string; reviewHandoff?: string; reviewSummary?: string; dueAt?: number\n}\nexport interface TaskActivityView { id: string; taskId: string; actor: 'user' | 'companion' | 'schedule' | 'system'; actorCompanionId?: string; kind: string; message: string; at: number }\nexport type { BoardRequirement as RequirementView } from './requirements/domain.js'\nexport interface TaskBoardView { tasks: BoardTaskView[]; activities: TaskActivityView[]; requirements?: import('./requirements/domain.js').BoardRequirement[] }\nexport interface PartnerDirectoryEntryView { id: string; name: string; role: string; description: string; capabilities: string[]; enabledSkills: Array<{ id: string; name: string }>; availability: 'available' | 'busy' | 'offline' }\nexport interface PartnerDelegationView {\n id: string; kind?: 'task' | 'review'; taskId: string; toCompanionId: string; status: 'queued' | 'running' | 'completed' | 'failed' | 'canceled'\n attempts?: number; nextAttemptAt?: number; lastAttemptAt?: number; error?: string; createdAt: number\n}\nexport interface CompanionAccessView { targetIds: string[]; companions: PartnerDirectoryEntryView[] }\n\nexport interface ScheduledTaskView {\n id: string; companionId: string; title: string; prompt: string\n schedule: { kind: 'interval'; minutes: number } | { kind: 'daily'; hour: number; minute: number }\n enabled: boolean; destroySessionAfterRun: boolean; overlapPolicy: 'skip' | 'queue'; timeoutMinutes: number\n nextRunAt: number; lastRunAt?: number; lastRunStatus?: 'completed' | 'failed' | 'skipped'; createdAt: number; updatedAt: number\n}\nexport interface ExecutionRunView { id: string; kind: 'schedule' | 'delegation' | 'review' | 'skill' | 'observation'; ownerCompanionId: string; sessionId: string; sourceId: string; status: string; destroyAfterRun: boolean; startedAt: number; completedAt?: number; outputSummary?: string; error?: string }\n\nexport async function api<T>(path = '', init: RequestInit = {}): Promise<T> {\n const method = init.method ?? 'GET'\n const response = await fetch(`${PARTNER_API}${path}`, {\n ...init,\n headers: {\n Accept: 'application/json',\n ...(method === 'GET' ? {} : { 'Content-Type': 'application/json', 'X-DSH-Partner-Request': '1' }),\n ...init.headers,\n },\n })\n if (response.status === 204) return undefined as T\n const body = await response.json().catch(() => ({})) as Record<string, unknown>\n if (!response.ok) throw new Error(typeof body.error === 'string' ? body.error : `HTTP ${response.status}`)\n return body as T\n}\n\nexport function loadPartner(): Promise<PartnerSnapshot> { return api() }\n", "import { useEffect, useId, useRef, type KeyboardEvent, type ReactNode } from 'react'\nimport { IconAgentPresetOutline16, IconCloseOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\n\nexport function WorkspaceHero({ eyebrow, title, detail, actions }: { eyebrow: string; title: string; detail: string; actions?: ReactNode }): JSX.Element {\n return <header className=\"dsh-partner-feature-hero\">\n <span><small>{eyebrow}</small><h2>{title}</h2><p>{detail}</p></span>\n {actions && <div className=\"dsh-partner-feature-hero-actions\">{actions}</div>}\n </header>\n}\n\nexport function WorkspaceBlock({ title, detail, actions, children, className = '' }: { title: string; detail?: string; actions?: ReactNode; children: ReactNode; className?: string }): JSX.Element {\n return <section className={`dsh-partner-feature-block${className ? ` ${className}` : ''}`}>\n <header><span><strong>{title}</strong>{detail && <small>{detail}</small>}</span>{actions && <div>{actions}</div>}</header>\n {children}\n </section>\n}\n\nexport function WorkspaceDialog({ eyebrow = 'CREATE & CONFIGURE', title, detail, close, children, width = 'regular' }: { eyebrow?: string; title: string; detail: string; close(): void; children: ReactNode; width?: 'regular' | 'wide' }): JSX.Element {\n const titleId = useId()\n const detailId = useId()\n const panelRef = useRef<HTMLDialogElement>(null)\n useEffect(() => {\n const previous = document.activeElement instanceof HTMLElement ? document.activeElement : undefined\n const frame = requestAnimationFrame(() => {\n const panel = panelRef.current\n const target = panel?.querySelector<HTMLElement>('[autofocus]') ?? panel?.querySelector<HTMLElement>('input, textarea, select, button')\n target?.focus()\n })\n return () => { cancelAnimationFrame(frame); previous?.focus() }\n }, [])\n const keyDown = (event: KeyboardEvent<HTMLElement>): void => {\n if (event.key === 'Escape') { event.preventDefault(); close(); return }\n if (event.key !== 'Tab') return\n const focusable = [...(panelRef.current?.querySelectorAll<HTMLElement>('button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), summary, [tabindex]:not([tabindex=\"-1\"])') ?? [])].filter(node => node.getClientRects().length > 0)\n if (focusable.length === 0) return\n const first = focusable[0]; const last = focusable.at(-1)\n if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last?.focus() }\n else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first?.focus() }\n }\n return <div className=\"dsh-partner-workspace-dialog-layer\" onPointerDown={event => { if (event.target === event.currentTarget) close() }}>\n <dialog ref={panelRef} className={`dsh-partner-workspace-dialog is-${width}`} open aria-modal=\"true\" aria-labelledby={titleId} aria-describedby={detailId} onKeyDown={keyDown}>\n <header><span><small>{eyebrow}</small><strong id={titleId}>{title}</strong><p id={detailId}>{detail}</p></span><button type=\"button\" onClick={close} aria-label=\"\u5173\u95ED\"><IconCloseOutline16 size={16} /></button></header>\n <div className=\"dsh-partner-workspace-dialog-body\">{children}</div>\n </dialog>\n </div>\n}\n\nexport function WorkspaceNotice({ children, kind = 'error' }: { children: ReactNode; kind?: 'error' | 'warning' | 'success' }): JSX.Element {\n return <p className={`dsh-partner-workspace-notice is-${kind}`} role={kind === 'error' ? 'alert' : 'status'}><i />{children}</p>\n}\n\nexport function CollectionEmpty({ title, detail, action }: { title: string; detail?: string; action?: ReactNode }): JSX.Element {\n return <div className=\"dsh-partner-collection-empty\"><span><IconAgentPresetOutline16 size={18} /></span><strong>{title}</strong>{detail && <p>{detail}</p>}{action}</div>\n}\n\nexport function CollectionSkeleton({ rows = 3 }: { rows?: number }): JSX.Element {\n return <div className=\"dsh-partner-collection-skeleton\" aria-label=\"\u6B63\u5728\u52A0\u8F7D\" aria-busy=\"true\">{Array.from({ length: rows }, (_, index) => <i key={index} />)}</div>\n}\n\nexport function CountLabel({ value, label }: { value: number; label: string }): JSX.Element {\n return <span className=\"dsh-partner-count-label\"><b>{value}</b>{label}</span>\n}\n\nexport function errorMessage(value: unknown): string { return value instanceof Error ? value.message : String(value) }\n", "import {useMemo, useRef, useState} from 'react'\nimport {IconDataOutline16, IconUserOutline16, IconBrowseOutline16, IconListPenOutline16, IconLinkOutline16} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type {MemoryView, MemoryGraphView} from '../../client-api.js'\nimport {CollectionEmpty, WorkspaceDialog, WorkspaceNotice} from '../workspace-components.js'\nimport {relativeTime} from '../partner-components.js'\nimport {MemoryDetail} from './memory-detail.js'\nimport {DailyReflectionDetail, memoryKind} from './memory-cards.js'\nimport {MemoryGraph} from './memory-graph.js'\nimport {HistoryView} from './history-view.js'\nimport {ExperienceView} from './experience-view.js'\nimport {useMemoryResource} from './use-memory-resource.js'\nimport {MEMORY_STATUS, type MemoryCollection, type MemoryLayers, type MemoryMode} from './types.js'\n\nexport function MemoryLibrary({companionId, scopeId, collection, layers, changed}: {companionId: string; scopeId: string; collection: MemoryCollection; layers: MemoryLayers | undefined; changed(): Promise<void>}): JSX.Element {\n const [mode, setMode] = useState<MemoryMode>('profile')\n const [query, setQuery] = useState('')\n const [status, setStatus] = useState<MemoryView['status'] | 'all'>('active')\n const [kind, setKind] = useState<MemoryView['kind'] | 'all'>('all')\n const [limit, setLimit] = useState(20)\n const [inspecting, setInspecting] = useState<MemoryView>()\n const [date, setDate] = useState<string>()\n const more = useRef<HTMLDetailsElement>(null)\n const base = `/companions/${encodeURIComponent(companionId)}`\n const graph = useMemoryResource<MemoryGraphView>(mode === 'graph' ? `${base}/memory/graph` : undefined)\n const normalized = query.trim().toLocaleLowerCase()\n const profile = collection.profiles.find(item => item.scopeId === scopeId)\n const filtered = useMemo(() => collection.memories.filter(item => item.scopeId === scopeId && (status === 'all' || item.status === status)\n && (kind === 'all' || item.kind === kind) && (!normalized || `${item.subject} ${item.content}`.toLocaleLowerCase().includes(normalized))), [collection.memories, scopeId, status, kind, normalized])\n const reflections = collection.reflections.filter(item => item.scopeId === scopeId && (!normalized || `${item.date} ${item.summary}`.toLocaleLowerCase().includes(normalized)))\n const selectedDay = reflections.find(item => item.date === date)\n const selectMode = (value: MemoryMode): void => {setMode(value); setQuery(''); setLimit(20); if (more.current) more.current.open = false}\n const row = (item: MemoryView) => <button type=\"button\" className=\"dsh-partner-memory-row\" key={item.id} onClick={() => setInspecting(item)}>\n <span className=\"dsh-partner-memory-row-copy\"><strong>{item.subject}</strong><p>{item.content}</p><small>{memoryKind(item.kind)} \u00B7 {item.locked ? '\u7528\u6237\u786E\u8BA4' : `${Math.round(item.confidence * 100)}% \u53EF\u4FE1`} \u00B7 {relativeTime(item.updatedAt)}</small></span>\n <span className=\"dsh-partner-memory-badge\" data-status={item.status}>{MEMORY_STATUS[item.status]}</span>\n </button>\n return <section className=\"dsh-partner-memory-library-v2\">\n <nav className=\"dsh-partner-memory-nav\" aria-label=\"\u8BB0\u5FC6\u5185\u5BB9\">\n <button type=\"button\" aria-pressed={mode === 'profile'} onClick={() => selectMode('profile')}><IconUserOutline16 size={16} />\u753B\u50CF</button>\n <button type=\"button\" aria-pressed={mode === 'memory' || mode === 'scenes'} onClick={() => selectMode('memory')}><IconDataOutline16 size={16} />\u8BB0\u5FC6</button>\n <button type=\"button\" aria-pressed={mode === 'reflection' || mode === 'history'} onClick={() => selectMode('reflection')}><IconBrowseOutline16 size={16} />\u56DE\u987E</button>\n <details className=\"dsh-partner-memory-more\" ref={more} onKeyDown={event => {if (event.key === 'Escape' && more.current) {more.current.open = false; more.current.querySelector('summary')?.focus()}}}>\n <summary aria-label=\"\u66F4\u591A\u8BB0\u5FC6\u5185\u5BB9\">{mode === 'experiences' ? '\u7ECF\u9A8C\u5BA1\u6838' : mode === 'graph' ? '\u5173\u7CFB\u56FE\u8C31' : '\u66F4\u591A'} <span aria-hidden=\"true\">\u22EF</span></summary>\n <div><button type=\"button\" onClick={() => selectMode('experiences')}><IconListPenOutline16 size={16} />\u7ECF\u9A8C\u5BA1\u6838 <small>{layers?.experiences.filter(item => item.status === 'draft').length ?? 0}</small></button><button type=\"button\" onClick={() => selectMode('graph')}><IconLinkOutline16 size={16} />\u5173\u7CFB\u56FE\u8C31</button></div>\n </details>\n </nav>\n {(mode === 'memory' || mode === 'scenes') && <div className=\"dsh-partner-memory-segment\" aria-label=\"\u8BB0\u5FC6\u89C6\u56FE\"><button type=\"button\" aria-pressed={mode === 'memory'} onClick={() => selectMode('memory')}>\u8BB0\u5FC6\u6761\u76EE</button><button type=\"button\" aria-pressed={mode === 'scenes'} onClick={() => selectMode('scenes')}>\u573A\u666F\u6458\u8981</button></div>}\n {(mode === 'reflection' || mode === 'history') && <div className=\"dsh-partner-memory-segment\" aria-label=\"\u56DE\u987E\u89C6\u56FE\"><button type=\"button\" aria-pressed={mode === 'reflection'} onClick={() => selectMode('reflection')}>\u6BCF\u65E5\u56DE\u987E</button><button type=\"button\" aria-pressed={mode === 'history'} onClick={() => selectMode('history')}>\u5BF9\u8BDD\u5386\u53F2</button></div>}\n {mode !== 'profile' && mode !== 'experiences' && <div className=\"dsh-partner-memory-toolbar\"><label className=\"dsh-partner-memory-search\"><span className=\"sr-only\">\u641C\u7D22\u5F53\u524D\u5185\u5BB9</span><input type=\"search\" placeholder={mode === 'history' ? '\u641C\u7D22\u5DF2\u52A0\u8F7D\u7684\u5386\u53F2' : '\u641C\u7D22\u5F53\u524D\u5185\u5BB9'} value={query} onChange={event => {setQuery(event.target.value); setLimit(20)}} /></label>{mode === 'memory' && <>\n <label><span className=\"sr-only\">\u8BB0\u5FC6\u72B6\u6001</span><select aria-label=\"\u8BB0\u5FC6\u72B6\u6001\" value={status} onChange={event => {setStatus(event.target.value as typeof status); setLimit(20)}}><option value=\"all\">\u5168\u90E8\u72B6\u6001</option>{Object.entries(MEMORY_STATUS).map(([value, label]) => <option key={value} value={value}>{label}</option>)}</select></label>\n <label><span className=\"sr-only\">\u8BB0\u5FC6\u7C7B\u578B</span><select aria-label=\"\u8BB0\u5FC6\u7C7B\u578B\" value={kind} onChange={event => {setKind(event.target.value as typeof kind); setLimit(20)}}><option value=\"all\">\u5168\u90E8\u7C7B\u578B</option>{(['profile', 'preference', 'task', 'event', 'relationship', 'emotion'] as const).map(value => <option key={value} value={value}>{memoryKind(value)}</option>)}</select></label>\n </>}</div>}\n {mode === 'profile' && <div className=\"dsh-partner-memory-profile\"><header><span><small>\u57FA\u4E8E\u6709\u6548\u8BB0\u5FC6\uFF0C\u800C\u4E0D\u662F\u731C\u6D4B</small><h3>\u4F19\u4F34\u5BF9\u4F60\u7684\u7406\u89E3</h3></span><small>{profile?.updatedAt ? `\u66F4\u65B0\u4E8E ${relativeTime(profile.updatedAt)}` : '\u7B49\u5F85\u53EF\u9760\u4F9D\u636E'}</small></header>\n <section><h4>\u660E\u786E\u4E8B\u5B9E</h4><div className=\"dsh-partner-memory-rows\">{profile?.entries.map(row)}</div>{!profile?.entries.length && <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u8DB3\u591F\u7684\u8EAB\u4EFD\u4E0E\u80CC\u666F\u4FE1\u606F\" detail=\"\u53EA\u6536\u5F55\u4F60\u660E\u786E\u8868\u8FBE\u7684\u4E8B\u5B9E\uFF0C\u4E0D\u63A8\u6D4B\u804C\u4E1A\u3001\u6027\u683C\u6216\u9690\u79C1\u3002\" />}</section>\n <section><h4>\u7A33\u5B9A\u534F\u4F5C\u504F\u597D</h4><div className=\"dsh-partner-memory-rows\">{profile?.preferences?.map(row)}</div>{!profile?.preferences?.length && <CollectionEmpty title=\"\u8FD8\u5728\u79EF\u7D2F\u7A33\u5B9A\u504F\u597D\" detail=\"\u53CD\u590D\u786E\u8BA4\u6216\u624B\u52A8\u9501\u5B9A\u7684\u53EF\u9760\u504F\u597D\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002\" />}</section>\n {profile && <p className=\"dsh-partner-memory-hint\">{profile.evidenceCount} \u5904\u5BF9\u8BDD\u4F9D\u636E \u00B7 {profile.lockedCount} \u9879\u7528\u6237\u786E\u8BA4 <span title={profile.version}>\u00B7 \u753B\u50CF\u7248\u672C {profile.version.slice(0, 8)}</span></p>}\n </div>}\n {mode === 'memory' && <><p className=\"dsh-partner-memory-hint\">\u5F53\u524D\u8054\u7CFB\u4EBA\u6700\u8FD1 100 \u6761\u4E2D\uFF0C\u5339\u914D {filtered.length} \u6761\u3002\u70B9\u51FB\u6761\u76EE\u67E5\u770B\u4F9D\u636E\u6216\u4FEE\u6B63\u3002</p><div className=\"dsh-partner-memory-rows\">{filtered.slice(0, limit).map(row)}</div>{!filtered.length && <CollectionEmpty title=\"\u6CA1\u6709\u5339\u914D\u7684\u8BB0\u5FC6\" detail=\"\u53EF\u4EE5\u5207\u6362\u72B6\u6001\u67E5\u770B\u5DF2\u5B8C\u6210\u3001\u8FC7\u671F\u6216\u88AB\u66FF\u4EE3\u7684\u5185\u5BB9\u3002\" />}{filtered.length > limit && <button type=\"button\" onClick={() => setLimit(value => value + 20)}>\u518D\u663E\u793A 20 \u6761</button>}</>}\n {mode === 'scenes' && <><p className=\"dsh-partner-memory-hint\">\u6458\u8981\u5F15\u7528\u5F53\u524D\u6709\u6548\u8BB0\u5FC6\uFF0C\u539F\u8BB0\u5FC6\u4FEE\u6B63\u540E\u540C\u6B65\u53D8\u5316\u3002\u6BCF\u65E5\u7EC8\u5BA1\u65F6\u6574\u7406\u3002</p>{layers?.scenes.filter(scene => !normalized || `${scene.title} ${scene.summary}`.toLocaleLowerCase().includes(normalized)).map(scene => <details className=\"dsh-partner-memory-record\" key={scene.id}><summary><strong>{scene.title}</strong><small>{scene.memoryIds.length} \u6761\u4F9D\u636E</small></summary><div><p>{scene.summary}</p><small>{relativeTime(scene.updatedAt)}</small></div></details>)}{!layers?.scenes.some(scene => !normalized || (scene.title + ' ' + scene.summary).toLocaleLowerCase().includes(normalized)) && <CollectionEmpty title={normalized ? \"\u6CA1\u6709\u5339\u914D\u7684\u573A\u666F\u6458\u8981\" : \"\u8FD8\u6CA1\u6709\u573A\u666F\u6458\u8981\"} detail=\"\u5F00\u542F\u6BCF\u65E5\u7EC8\u5BA1\u540E\uFF0C\u4F1A\u9010\u6B65\u5C06\u76F8\u5173\u7684\u6709\u6548\u8BB0\u5FC6\u7EC4\u7EC7\u5728\u4E00\u8D77\u3002\" />}</>}\n {mode === 'reflection' && <><div className=\"dsh-partner-memory-rows\">{reflections.map(day => <button className=\"dsh-partner-memory-row\" type=\"button\" key={`${day.scopeId}:${day.date}`} onClick={() => setDate(day.date)}><span><strong>{day.date}</strong><p>{day.summary}</p><small>{day.turnCount} \u8F6E\u4EA4\u6D41 \u00B7 {day.completedTasks.length} \u9879\u5B8C\u6210</small></span><small>\u67E5\u770B</small></button>)}</div>{!reflections.length && <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u5339\u914D\u7684\u56DE\u987E\" detail=\"\u5B66\u4E60\u5F00\u542F\u540E\uFF0C\u5728\u540E\u53F0\u5B8C\u6210\u63D0\u70BC\u65F6\u66F4\u65B0\u3002\" />}</>}\n {mode === 'history' && <HistoryView key={scopeId} base={base} scopeId={scopeId} query={normalized} />}\n {mode === 'experiences' && <ExperienceView items={layers?.experiences ?? []} base={base} scopeId={scopeId} changed={changed} />}\n {mode === 'graph' && <>{graph.error && <WorkspaceNotice>{graph.error} <button type=\"button\" onClick={() => {void graph.reload()}}>\u91CD\u8BD5</button></WorkspaceNotice>}{graph.data ? <MemoryGraph graph={{memories: graph.data.memories.filter(item => item.scopeId === scopeId), relations: graph.data.relations.filter(item => item.scopeId === scopeId)}} profiles={collection.profiles.filter(item => item.scopeId === scopeId)} query={normalized} inspect={setInspecting} /> : !graph.error && <CollectionEmpty title=\"\u6B63\u5728\u8BFB\u53D6\u5173\u7CFB\u56FE\u8C31\" />}</>}\n {inspecting && <MemoryDetail key={inspecting.id} companionId={companionId} item={inspecting} close={() => setInspecting(undefined)} changed={changed} />}\n {selectedDay && <WorkspaceDialog title={`${selectedDay.date} \u6BCF\u65E5\u56DE\u987E`} detail=\"\u8FC7\u7A0B\u8BB0\u5F55\u4E0E\u5F53\u65E5\u603B\u7ED3\uFF0C\u4E0D\u76F4\u63A5\u4F5C\u4E3A\u957F\u671F\u4E8B\u5B9E\u3002\" close={() => setDate(undefined)}><DailyReflectionDetail entry={selectedDay} /></WorkspaceDialog>}\n </section>\n}\n", "import type { ReactNode } from 'react'\nimport { IconAgentPresetOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { ChannelView } from '../client-api.js'\n\nexport function ChannelStatus({ channel }: { channel: ChannelView | undefined }): JSX.Element {\n const status = channel?.runtimeStatus ?? 'unbound'\n return <span className={`dsh-partner-status is-${status}`}><i />{channel ? channelStatusLabel(channel.runtimeStatus) : '\u672A\u8FDE\u63A5'}</span>\n}\n\nexport function Avatar({ name, small = false }: { name: string; small?: boolean }): JSX.Element {\n return <span className={`dsh-partner-avatar${small ? ' is-small' : ''}`} aria-hidden=\"true\">{[...name][0] ?? '\u4F34'}</span>\n}\n\nexport function WeixinGlyph({ large = false }: { large?: boolean }): JSX.Element {\n return <span className={`dsh-partner-weixin-glyph${large ? ' is-large' : ''}`} aria-hidden=\"true\"><i /><b /></span>\n}\n\nexport function TabButton({ active, onClick, icon, children }: { active: boolean; onClick(): void; icon: ReactNode; children: ReactNode }): JSX.Element {\n return <button type=\"button\" className={active ? 'is-active' : ''} aria-current={active ? 'page' : undefined} onClick={onClick}>{icon}<span>{children}</span></button>\n}\n\nexport function FormField({ label, hint, children }: { label: string; hint?: string; children: ReactNode }): JSX.Element {\n return <label className=\"dsh-partner-field\"><span><strong>{label}</strong>{hint && <small>{hint}</small>}</span>{children}</label>\n}\n\nexport function SectionHeading({ eyebrow, title, detail }: { eyebrow: string; title: string; detail: string }): JSX.Element {\n return <header className=\"dsh-partner-section\"><small>{eyebrow}</small><h2>{title}</h2><p>{detail}</p></header>\n}\n\nexport function ContentState({ title, detail, action, compact = false }: { title: string; detail?: string; action?: ReactNode; compact?: boolean }): JSX.Element {\n return <div className={`dsh-partner-state${compact ? ' is-compact' : ''}`}><IconAgentPresetOutline16 size={20} /><strong>{title}</strong>{detail && <p>{detail}</p>}{action}</div>\n}\n\nexport function relativeTime(value: number): string {\n const minutes = Math.floor((Date.now() - value) / 60_000)\n return minutes < 1 ? '\u521A\u521A' : minutes < 60 ? `${minutes} \u5206\u949F\u524D` : minutes < 1440 ? `${Math.floor(minutes / 60)} \u5C0F\u65F6\u524D` : `${Math.floor(minutes / 1440)} \u5929\u524D`\n}\n\nfunction channelStatusLabel(status: ChannelView['runtimeStatus']): string {\n return status === 'running' ? '\u5DF2\u8FDE\u63A5' : status === 'starting' ? '\u8FDE\u63A5\u4E2D' : status === 'error' ? '\u8FDE\u63A5\u5F02\u5E38' : '\u5DF2\u505C\u7528'\n}\n", "import {useRef, useState} from 'react'\nimport {api, type MemoryView} from '../../client-api.js'\nimport {WorkspaceDialog, WorkspaceNotice, errorMessage} from '../workspace-components.js'\nimport {MemoryCard} from './memory-cards.js'\nimport {MEMORY_STATUS} from './types.js'\n\nexport function MemoryDetail({companionId, item, close, changed}: {companionId: string; item: MemoryView; close(): void; changed(): Promise<void>}): JSX.Element {\n const [current, setCurrent] = useState(item)\n const [editing, setEditing] = useState<MemoryView>()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n const [notice, setNotice] = useState<string>()\n const lock = useRef(false)\n const run = async (remove = false): Promise<void> => {\n if (lock.current || (!remove && !editing)) return\n lock.current = true; setBusy(true); setError(undefined)\n try {\n const path = `/companions/${encodeURIComponent(companionId)}/memory/${encodeURIComponent(current.id)}`\n if (remove) {await api(path, {method: 'DELETE'}); close()}\n else {\n const updated = await api<MemoryView>(path, {method: 'PUT', body: JSON.stringify({subject: editing!.subject, content: editing!.content})})\n setCurrent(updated); setEditing(undefined); setNotice('\u4FEE\u6B63\u5DF2\u4FDD\u5B58\uFF0C\u5E76\u9501\u5B9A\u4E3A\u7528\u6237\u786E\u8BA4\u7684\u5185\u5BB9')\n }\n await changed()\n } catch (reason) {setError(errorMessage(reason))}\n finally {lock.current = false; setBusy(false)}\n }\n return <WorkspaceDialog title=\"\u8BB0\u5FC6\u8BE6\u60C5\" detail={`${MEMORY_STATUS[current.status]} \u00B7 \u4FEE\u6539\u540E\u7684\u5185\u5BB9\u4F1A\u4F18\u5148\u4FDD\u7559\uFF1B\u5220\u9664\u9700\u8981\u518D\u6B21\u786E\u8BA4\u3002`} close={() => {if (!busy) close()}}>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}{notice && <WorkspaceNotice kind=\"success\">{notice}</WorkspaceNotice>}\n <div className=\"dsh-partner-library-detail\"><MemoryCard key={current.id} item={current} editing={editing} busy={busy} setEditing={setEditing} save={() => {void run()}} remove={() => {void run(true)}} /></div>\n </WorkspaceDialog>\n}\n", "import {useState} from 'react'\nimport type {MemoryView, DailyReflectionView} from '../../client-api.js'\nimport {relativeTime} from '../partner-components.js'\nexport function DailyReflectionDetail({ entry }: { entry: DailyReflectionView }): JSX.Element {\n return <article className=\"dsh-partner-diary-detail\"><header><time>{entry.date}</time><strong>{entry.turnCount} \u8F6E\u4EA4\u6D41\u540E\u7684\u7406\u89E3</strong><small>\u66F4\u65B0\u4E8E {new Date(entry.updatedAt).toLocaleString()}</small></header><p>{entry.summary}</p><ReflectionGroup title=\"\u5F85\u8DDF\u8FDB\" items={entry.openTasks} /><ReflectionGroup title=\"\u5F53\u5929\u4E8B\u4EF6\" items={entry.events} /><ReflectionGroup title=\"\u65B0\u7406\u89E3\" items={entry.learnings} /><ReflectionGroup title=\"\u5DF2\u5B8C\u6210\" items={entry.completedTasks} /></article>\n}\n\nfunction ReflectionGroup({ title, items }: { title: string; items: string[] }): JSX.Element | null {\n if (items.length === 0) return null\n return <section><strong>{title}</strong><ul>{items.map(item => <li key={item}>{item}</li>)}</ul></section>\n}\n\nexport function MemoryCard({ item, editing, busy, setEditing, save, remove }: { item: MemoryView; editing: MemoryView | undefined; busy: boolean; setEditing(value?: MemoryView): void; save(): void; remove(): void }): JSX.Element {\n const [confirmingRemove, setConfirmingRemove] = useState(false)\n return <article data-kind={item.kind}>{editing ? <div className=\"dsh-partner-memory-editor\">\n <input aria-label=\"\u8BB0\u5FC6\u4E3B\u9898\" value={editing.subject} onChange={event => setEditing({ ...editing, subject: event.target.value })} />\n <textarea aria-label=\"\u8BB0\u5FC6\u5185\u5BB9\" value={editing.content} onChange={event => setEditing({ ...editing, content: event.target.value })} />\n <footer><button type=\"button\" onClick={() => setEditing(undefined)}>\u53D6\u6D88</button><button type=\"button\" className=\"is-primary\" disabled={busy || !editing.subject.trim() || !editing.content.trim()} onClick={save}>\u4FDD\u5B58\u4FEE\u6B63</button></footer>\n </div> : <>\n <header><span>{memoryKind(item.kind)}</span><div>{confirmingRemove ? <><button type=\"button\" onClick={() => setConfirmingRemove(false)}>\u53D6\u6D88</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={remove}>\u786E\u8BA4\u5220\u9664</button></> : <><button type=\"button\" onClick={() => setEditing({ ...item })}>\u7F16\u8F91</button><button type=\"button\" onClick={() => setConfirmingRemove(true)}>\u5220\u9664</button></>}</div></header>\n <strong>{item.subject}</strong><p>{item.content}</p>\n <footer><progress max={1} value={item.confidence} aria-label={`\u7F6E\u4FE1\u5EA6 ${Math.round(item.confidence * 100)}%`} /><small>{item.locked ? '\u624B\u52A8\u786E\u8BA4' : `${Math.round(item.confidence * 100)}% \u53EF\u4FE1`} \u00B7 {relativeTime(item.updatedAt)}</small></footer>\n {item.evidence.length > 0 && <details className=\"dsh-partner-memory-evidence\"><summary>\u67E5\u770B\u5BF9\u8BDD\u4F9D\u636E <b>{item.evidence.length}</b></summary><div>{[...item.evidence].reverse().map(evidence => <blockquote key={`${evidence.turnId}:${evidence.at}`}><p>{evidence.excerpt}</p><time>{new Date(evidence.at).toLocaleString()}</time></blockquote>)}</div></details>}\n </>}</article>\n}\n\nexport function memoryKind(value: MemoryView['kind']): string { return ({ profile: '\u753B\u50CF', preference: '\u504F\u597D', task: '\u4EFB\u52A1', event: '\u4E8B\u4EF6', relationship: '\u5173\u7CFB', emotion: '\u60C5\u7EEA\u4FE1\u53F7' })[value] }\n\n", "import type {MemoryView, DailyReflectionView, UserProfileSnapshotView} from '../../client-api.js'\nexport interface MemoryCollection {memories: MemoryView[]; reflections: DailyReflectionView[]; profiles: UserProfileSnapshotView[]}\nexport interface SceneView {id: string; title: string; summary: string; memoryIds: string[]; updatedAt: number}\nexport interface ExperienceView {id: string; title: string; steps: string[]; evidence: Array<{turnId: string; quote: string}>; version: string; status: 'draft' | 'approved' | 'rejected'; updatedAt: number}\nexport interface MemoryLayers {scenes: SceneView[]; experiences: ExperienceView[]; jobCount?: number; retryCount?: number; jobs: Array<{id: string; status: string; attempts: number; nextAt: number; at?: number; error?: string}>}\nexport interface HistoryTurn {id: string; at: number; user: string; assistant: string}\nexport type MemoryMode = 'profile' | 'memory' | 'reflection' | 'history' | 'scenes' | 'experiences' | 'graph'\nexport const MEMORY_STATUS: Record<MemoryView['status'], string> = {active: '\u6709\u6548', completed: '\u5DF2\u5B8C\u6210', superseded: '\u5DF2\u66FF\u4EE3', expired: '\u5DF2\u8FC7\u671F'}\n", "import {useState} from 'react'\nimport type {MemoryView, MemoryRelationView, MemoryGraphView, UserProfileSnapshotView} from '../../client-api.js'\nimport {ContentState as State} from '../partner-components.js'\nimport {memoryKind} from './memory-cards.js'\ntype RelationFilter = MemoryRelationView['kind'] | 'all'\nconst RELATION_FILTERS: RelationFilter[] = ['all', 'conflicts_with', 'depends_on', 'supports', 'follows', 'about']\n\nexport function MemoryGraph({ graph, profiles, query, inspect }: { graph: MemoryGraphView; profiles: UserProfileSnapshotView[]; query: string; inspect(item: MemoryView): void }): JSX.Element {\n const byId = new Map(graph.memories.map(item => [item.id, item]))\n const scopeIds = [...new Set(graph.relations.map(item => item.scopeId))]\n const [requestedScopeId, setRequestedScopeId] = useState<string>()\n const scopeId = scopeIds.includes(requestedScopeId ?? '') ? requestedScopeId! : scopeIds[0]\n const [filter, setFilter] = useState<RelationFilter>('all')\n const scoped = graph.relations.filter(item => item.scopeId === scopeId)\n const visible = scoped.filter(item => {\n if (filter !== 'all' && item.kind !== filter) return false\n const source = byId.get(item.sourceMemoryId); const target = byId.get(item.targetMemoryId)\n return !query || `${source?.subject ?? ''} ${source?.content ?? ''} ${target?.subject ?? ''} ${target?.content ?? ''} ${item.label}`.toLocaleLowerCase().includes(query)\n }).sort((left, right) => Number(right.kind === 'conflicts_with') - Number(left.kind === 'conflicts_with') || right.confidence - left.confidence)\n const [selectedRelationId, setSelectedRelationId] = useState<string>()\n const selected = visible.find(item => item.id === selectedRelationId) ?? visible[0]\n const source = selected ? byId.get(selected.sourceMemoryId) : undefined\n const target = selected ? byId.get(selected.targetMemoryId) : undefined\n const label = profiles.find(item => item.scopeId === scopeId)?.label ?? (scopeId ? `\u8054\u7CFB\u4EBA ${scopeId.slice(-6)}` : '\u5F53\u524D\u8054\u7CFB\u4EBA')\n const conflictCount = scoped.filter(item => item.kind === 'conflicts_with').length\n if (graph.relations.length === 0) return <State title=\"\u8FD8\u6CA1\u6709\u53EF\u9760\u5173\u7CFB\" detail=\"\u6BCF\u65E5\u7EC8\u5BA1\u53EA\u4F1A\u4FDD\u5B58\u6709\u660E\u786E\u8BC1\u636E\u7684\u8BB0\u5FC6\u8054\u7CFB\uFF0C\u4E0D\u4F1A\u4E3A\u4E86\u586B\u6EE1\u56FE\u8C31\u800C\u731C\u6D4B\u3002\" />\n return <div className=\"dsh-partner-graph-audit\">\n <header className=\"dsh-partner-graph-toolbar\"><span><small>\u5173\u7CFB\u5BA1\u8BA1</small><strong>{label} \u7684\u7406\u89E3\u5173\u7CFB</strong><p>{scoped.length} \u6761\u53EF\u9760\u8054\u7CFB{conflictCount > 0 ? `\uFF0C\u5176\u4E2D ${conflictCount} \u6761\u9700\u8981\u786E\u8BA4` : '\uFF0C\u6682\u65E0\u5F85\u786E\u8BA4\u51B2\u7A81'}</p></span>{scopeIds.length > 1 && <label><span>\u8054\u7CFB\u4EBA</span><select value={scopeId} onChange={event => { setRequestedScopeId(event.target.value); setSelectedRelationId(undefined) }}>{scopeIds.map(value => <option value={value} key={value}>{profiles.find(item => item.scopeId === value)?.label ?? `\u8054\u7CFB\u4EBA ${value.slice(-6)}`}</option>)}</select></label>}</header>\n <nav className=\"dsh-partner-graph-filters\" aria-label=\"\u5173\u7CFB\u7C7B\u578B\">{RELATION_FILTERS.map(value => { const count = value === 'all' ? scoped.length : scoped.filter(item => item.kind === value).length; return <button type=\"button\" key={value} className={filter === value ? 'is-active' : ''} aria-pressed={filter === value} onClick={() => { setFilter(value); setSelectedRelationId(undefined) }}>{value === 'all' ? '\u5168\u90E8' : relationLabel(value)} <b>{count}</b></button> })}</nav>\n <div className=\"dsh-partner-graph-browser\"><div className=\"dsh-partner-graph-index\" role=\"list\">{visible.length === 0 ? <State title=\"\u6CA1\u6709\u5339\u914D\u7684\u5173\u7CFB\" detail=\"\u8C03\u6574\u5173\u7CFB\u7C7B\u578B\u6216\u641C\u7D22\u5173\u952E\u8BCD\u540E\u518D\u8BD5\u3002\" compact /> : visible.map(item => { const from = byId.get(item.sourceMemoryId); const to = byId.get(item.targetMemoryId); return <button type=\"button\" role=\"listitem\" key={item.id} data-kind={item.kind} className={selected?.id === item.id ? 'is-active' : ''} onClick={() => setSelectedRelationId(item.id)}><span>{relationLabel(item.kind)}</span><strong>{from?.subject ?? '\u5DF2\u5220\u9664\u8BB0\u5FC6'} <i aria-hidden=\"true\">\u2192</i> {to?.subject ?? '\u5DF2\u5220\u9664\u8BB0\u5FC6'}</strong><p>{item.label}</p><small>{Math.round(item.confidence * 100)}% \u53EF\u4FE1</small></button> })}</div>\n <div className=\"dsh-partner-graph-stage\">{selected && source && target ? <article data-kind={selected.kind}><header><span>{relationLabel(selected.kind)}</span><strong>{source.subject} <i aria-hidden=\"true\">\u2192</i> {target.subject}</strong><p>{selected.label}</p><small>{relationGuidance(selected.kind)}</small></header><div className=\"dsh-partner-graph-pair\"><GraphMemory item={source} side=\"\u8D77\u70B9\" inspect={inspect} /><div aria-hidden=\"true\"><i /><span>{relationLabel(selected.kind)}</span><i /></div><GraphMemory item={target} side=\"\u5173\u8054\u9879\" inspect={inspect} /></div><footer><small>\u6700\u8FD1\u7EC8\u5BA1\u4E8E {new Date(selected.updatedAt).toLocaleString()}</small><strong>\u5173\u7CFB\u7F6E\u4FE1\u5EA6 {Math.round(selected.confidence * 100)}%</strong></footer></article> : <State title=\"\u9009\u62E9\u4E00\u6761\u5173\u7CFB\" detail=\"\u5173\u7CFB\u4E24\u7AEF\u7684\u8BB0\u5FC6\u4E0E\u4F7F\u7528\u65B9\u5F0F\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\" compact />}</div>\n </div>\n </div>\n}\n\nfunction GraphMemory({ item, side, inspect }: { item: MemoryView; side: string; inspect(item: MemoryView): void }): JSX.Element {\n return <section><header><small>{side} \u00B7 {memoryKind(item.kind)}</small><strong>{item.subject}</strong></header><p>{item.content}</p><button type=\"button\" onClick={() => inspect(item)}>\u67E5\u770B\u5E76\u4FEE\u6B63</button></section>\n}\n\nfunction relationLabel(kind: MemoryRelationView['kind']): string { return ({ supports: '\u652F\u6301', depends_on: '\u4F9D\u8D56', about: '\u5173\u4E8E', conflicts_with: '\u51B2\u7A81', follows: '\u540E\u7EED' })[kind] }\nfunction relationGuidance(kind: MemoryRelationView['kind']): string {\n return ({\n supports: '\u56DE\u7B54\u6D89\u53CA\u76EE\u6807\u8BB0\u5FC6\u65F6\uFF0C\u53EF\u628A\u8D77\u70B9\u4F5C\u4E3A\u660E\u786E\u652F\u6301\u4F9D\u636E\uFF0C\u4F46\u4E0D\u80FD\u636E\u6B64\u8865\u5199\u65B0\u4E8B\u5B9E\u3002',\n depends_on: '\u5904\u7406\u8D77\u70B9\u4E8B\u9879\u65F6\uFF0C\u5E94\u540C\u65F6\u68C0\u67E5\u5173\u8054\u9879\u662F\u5426\u6210\u7ACB\u6216\u5DF2\u7ECF\u5B8C\u6210\u3002',\n about: '\u4E24\u6761\u8BB0\u5FC6\u5C5E\u4E8E\u540C\u4E00\u4E0A\u4E0B\u6587\uFF0C\u53EC\u56DE\u5176\u4E2D\u4E00\u6761\u65F6\u53EF\u4EE5\u8865\u5145\u53E6\u4E00\u6761\u5E2E\u52A9\u7406\u89E3\u3002',\n conflicts_with: '\u4E24\u6761\u7406\u89E3\u6682\u65F6\u4E0D\u80FD\u540C\u65F6\u4F5C\u4E3A\u4E8B\u5B9E\uFF1B\u4F19\u4F34\u5E94\u5728\u76F8\u5173\u8BDD\u9898\u51FA\u73B0\u65F6\u6307\u51FA\u5DEE\u5F02\u5E76\u8BF7\u6C42\u786E\u8BA4\u3002',\n follows: '\u5B83\u4EEC\u5B58\u5728\u660E\u786E\u5148\u540E\u5173\u7CFB\uFF0C\u540E\u7EED\u5224\u65AD\u9700\u8981\u4FDD\u7559\u8FD9\u4E2A\u987A\u5E8F\u3002',\n })[kind]\n}\n\n\n", "import {useEffect, useRef, useState} from 'react'\nimport {api} from '../../client-api.js'\nimport {CollectionEmpty, WorkspaceNotice, errorMessage} from '../workspace-components.js'\nimport type {HistoryTurn} from './types.js'\n\nexport function HistoryView({base, scopeId, query}: {base: string; scopeId: string; query: string}): JSX.Element {\n const [turns, setTurns] = useState<HistoryTurn[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string>()\n const [more, setMore] = useState(true)\n const [page, setPage] = useState(0)\n const cursor = useRef<HistoryTurn>()\n useEffect(() => {\n const controller = new AbortController()\n setLoading(true); setError(undefined)\n const params = new URLSearchParams({scopeId})\n if (cursor.current) {params.set('before', String(cursor.current.at)); params.set('beforeId', cursor.current.id)}\n void api<HistoryTurn[]>(`${base}/memory/history?${params}`, {signal: controller.signal}).then(items => {\n if (controller.signal.aborted) return\n setTurns(existing => [...new Map([...existing, ...items].map(turn => [turn.id, turn])).values()])\n setMore(items.length === 30); cursor.current = items.at(-1) ?? cursor.current\n }).catch(reason => {if (!controller.signal.aborted) setError(errorMessage(reason))})\n .finally(() => {if (!controller.signal.aborted) setLoading(false)})\n return () => controller.abort()\n }, [base, scopeId, page])\n const filtered = turns.filter(turn => !query || `${turn.user} ${turn.assistant}`.toLocaleLowerCase().includes(query))\n return <div className=\"dsh-partner-memory-records\">\n <p className=\"dsh-partner-memory-hint\">\u663E\u793A\u65B0\u7248\u8BB0\u5FC6\u6D41\u7A0B\u8BB0\u5F55\u7684\u5BF9\u8BDD\uFF1B\u65E7\u8BB0\u5F55\u4ECD\u4FDD\u7559\u5728\u539F\u4F1A\u8BDD\u4E2D\u3002\u641C\u7D22\u4EC5\u7B5B\u9009\u5DF2\u52A0\u8F7D\u7684\u5185\u5BB9\u3002</p>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {!filtered.length && <CollectionEmpty title={loading ? '\u6B63\u5728\u8BFB\u53D6\u5386\u53F2' : '\u6682\u65E0\u5339\u914D\u7684\u5386\u53F2\u8BB0\u5F55'} />}\n {filtered.map(turn => <HistoryRecord key={turn.id} turn={turn} />)}\n {(more || error) && <button type=\"button\" disabled={loading} onClick={() => setPage(value => value + 1)}>{loading ? '\u8BFB\u53D6\u4E2D\u2026' : error ? '\u91CD\u8BD5\u8BFB\u53D6' : '\u52A0\u8F7D\u66F4\u65E9\u7684 30 \u8F6E'}</button>}\n </div>\n}\n\nfunction HistoryRecord({turn}: {turn: HistoryTurn}): JSX.Element {\n const [open, setOpen] = useState(false)\n return <details className=\"dsh-partner-memory-record\" onToggle={event => setOpen(event.currentTarget.open)}><summary><time>{new Date(turn.at).toLocaleString()}</time><strong>{turn.user.slice(0, 120)}</strong></summary>{open && <div><h3>\u7528\u6237\u539F\u8BDD</h3><p>{turn.user}</p><h3>\u52A9\u624B\u5F53\u65F6\u7684\u56DE\u7B54</h3><p>{turn.assistant}</p><small>\u5386\u53F2\u56DE\u7B54\u4E0D\u4EE3\u8868\u5F53\u524D\u5DF2\u9A8C\u8BC1\u7684\u4E8B\u5B9E\u3002</small></div>}</details>\n}\n", "import {useRef, useState} from 'react'\nimport {api} from '../../client-api.js'\nimport {WorkspaceDialog, WorkspaceNotice, CollectionEmpty, errorMessage} from '../workspace-components.js'\nimport type {ExperienceView as Draft} from './types.js'\n\nexport function ExperienceView({items, base, scopeId, changed}: {items: Draft[]; base: string; scopeId: string; changed(): Promise<void>}): JSX.Element {\n const [selected, setSelected] = useState<string>()\n const [busy, setBusy] = useState(false)\n const lock = useRef(false)\n const [error, setError] = useState<string>()\n const [notice, setNotice] = useState<string>()\n const [filter, setFilter] = useState<Draft['status']>('draft')\n const item = items.find(entry => entry.id === selected)\n const review = async (action: 'approved' | 'rejected' | 'export'): Promise<void> => {\n if (!item || lock.current) return\n lock.current = true; setBusy(true); setError(undefined)\n const path = `${base}/memory/experiences/${encodeURIComponent(item.id)}?${new URLSearchParams({scopeId})}`\n try {\n if (action === 'export') {\n const {document} = await api<{document: string}>(path)\n const url = URL.createObjectURL(new Blob([document], {type: 'text/markdown;charset=utf-8'}))\n const anchor = window.document.createElement('a'); anchor.href = url; anchor.download = `${item.id}.md`; window.document.body.append(anchor); anchor.click(); anchor.remove()\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n setNotice('\u5DF2\u5BFC\u51FA\u8349\u7A3F\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u5B89\u88C5\u6216\u6388\u6743\u7ED9\u4F19\u4F34')\n } else {\n await api(path, {method: 'POST', body: JSON.stringify({action, version: item.version})})\n setSelected(undefined); setNotice(action === 'approved' ? '\u5DF2\u901A\u8FC7\u5BA1\u6838\uFF0C\u53EF\u5728\u5DF2\u901A\u8FC7\u5217\u8868\u4E2D\u5BFC\u51FA' : '\u5DF2\u62D2\u7EDD\u6B64\u8349\u7A3F')\n await changed()\n }\n } catch (reason) {setError(errorMessage(reason)); await changed()}\n finally {lock.current = false; setBusy(false)}\n }\n return <>\n <p className=\"dsh-partner-memory-hint\">\u4ECE\u6709\u6210\u529F\u4F9D\u636E\u7684\u7ECF\u5386\u4E2D\u63D0\u70BC\u3002\u5BA1\u6838\u901A\u8FC7\u540E\u4EC5\u5141\u8BB8\u5BFC\u51FA\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u5B89\u88C5 Skill\u3002</p>\n {notice && <WorkspaceNotice kind=\"success\">{notice}</WorkspaceNotice>}\n <div className=\"dsh-partner-memory-segment\" aria-label=\"\u7ECF\u9A8C\u72B6\u6001\">{(['draft', 'approved', 'rejected'] as const).map(status => <button type=\"button\" aria-pressed={filter === status} key={status} onClick={() => setFilter(status)}>{({draft: '\u5F85\u5BA1\u6838', approved: '\u5DF2\u901A\u8FC7', rejected: '\u5DF2\u62D2\u7EDD'})[status]} <small>{items.filter(draft => draft.status === status).length}</small></button>)}</div>\n <div className=\"dsh-partner-memory-rows\">{items.filter(draft => draft.status === filter).map(draft => <button className=\"dsh-partner-memory-row\" type=\"button\" key={draft.id} onClick={() => {setSelected(draft.id); setError(undefined)}}><span><strong>{draft.title}</strong><small>{draft.steps.length} \u4E2A\u6B65\u9AA4 \u00B7 {draft.evidence.length} \u5904\u4F9D\u636E</small></span><small>\u67E5\u770B</small></button>)}</div>\n {!items.some(draft => draft.status === filter) && <CollectionEmpty title=\"\u6CA1\u6709\u6B64\u72B6\u6001\u7684\u7ECF\u9A8C\u8349\u7A3F\" detail=\"\u53EA\u6709\u660E\u786E\u6210\u529F\u4E14\u53EF\u590D\u7528\u7684\u7ECF\u5386\u624D\u4F1A\u6210\u4E3A\u5019\u9009\uFF1B\u9700\u8981\u5F00\u542F\u6BCF\u65E5\u7EC8\u5BA1\u3002\" />}\n {item && <WorkspaceDialog title={item.title} detail=\"\u8BF7\u6838\u5BF9\u9002\u7528\u8303\u56F4\u3001\u64CD\u4F5C\u6B65\u9AA4\u53CA\u6210\u529F\u4F9D\u636E\uFF1B\u5386\u53F2\u6210\u529F\u4E0D\u4EE3\u8868\u6BCF\u6B21\u90FD\u9002\u7528\u3002\" close={() => {if (!busy) setSelected(undefined)}}>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <ol className=\"dsh-partner-memory-procedure\">{item.steps.map((step, index) => <li key={index}>{step}</li>)}</ol>\n <details className=\"dsh-partner-memory-record\"><summary>\u6210\u529F\u4F9D\u636E \u00B7 {item.evidence.length}</summary><div>{item.evidence.map(source => <blockquote key={`${source.turnId}:${source.quote}`}><p>{source.quote}</p><small>{source.turnId}</small></blockquote>)}</div></details>\n <footer className=\"dsh-partner-memory-actions\">{item.status === 'draft' ? <><button type=\"button\" disabled={busy} onClick={() => {void review('rejected')}}>\u62D2\u7EDD</button><button className=\"is-primary\" type=\"button\" disabled={busy} onClick={() => {void review('approved')}}>{busy ? '\u5904\u7406\u4E2D\u2026' : '\u901A\u8FC7\u5BA1\u6838'}</button></> : item.status === 'approved' ? <button type=\"button\" disabled={busy} onClick={() => {void review('export')}}>{busy ? '\u5BFC\u51FA\u4E2D\u2026' : '\u5BFC\u51FA Markdown'}</button> : <span>\u6B64\u8349\u7A3F\u5DF2\u62D2\u7EDD\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u542F\u7528\u3002</span>}</footer>\n </WorkspaceDialog>}\n </>\n}\n", "import {useCallback, useEffect, useRef, useState} from 'react'\nimport {api} from '../../client-api.js'\nimport {errorMessage} from '../workspace-components.js'\n\n/** Only the latest request may publish. Polls pause while the page is hidden,\n * never overlap, and never reset an editor's local draft. */\nexport function useMemoryResource<T>(path: string | undefined, pollMs = 0) {\n const [snapshot, setData] = useState<{path: string; value: T}>()\n const [error, setError] = useState<string>()\n const [loading, setLoading] = useState(false)\n const sequence = useRef(0)\n const request = useRef<AbortController>()\n const reload = useCallback(async (): Promise<void> => {\n if (!path) return\n request.current?.abort()\n const controller = new AbortController(); request.current = controller\n const revision = ++sequence.current\n setLoading(true)\n try {\n const result = await api<T>(path, {signal: controller.signal})\n if (revision === sequence.current && !controller.signal.aborted) {setData({path, value: result}); setError(undefined)}\n } catch (reason) {\n if (revision === sequence.current && !controller.signal.aborted) setError(errorMessage(reason))\n } finally {if (revision === sequence.current) setLoading(false)}\n }, [path])\n useEffect(() => {\n setData(undefined); setError(undefined); setLoading(Boolean(path))\n let disposed = false; let timer: ReturnType<typeof setTimeout> | undefined\n const schedule = (): void => {if (timer) clearTimeout(timer); if (!disposed && pollMs > 0) timer = setTimeout(() => {void tick()}, pollMs)}\n const tick = async (): Promise<void> => {\n if (disposed) return\n if (!document.hidden) await reload()\n schedule()\n }\n const visible = (): void => {if (!document.hidden) {if (timer) clearTimeout(timer); void tick()}}\n void reload().then(schedule)\n if (pollMs) document.addEventListener('visibilitychange', visible)\n return () => {disposed = true; if (timer) clearTimeout(timer); document.removeEventListener('visibilitychange', visible); ++sequence.current; request.current?.abort()}\n }, [reload, pollMs])\n return {data: snapshot?.path === path ? snapshot?.value : undefined, error, loading, reload}\n}\n", "import {useRef, useState} from 'react'\nimport {api, type CompanionView, type AutomationView, type ModelCatalogView} from '../../client-api.js'\nimport {FormField as Field} from '../partner-components.js'\nimport {WorkspaceDialog, WorkspaceNotice, errorMessage} from '../workspace-components.js'\nimport {useMemoryResource} from './use-memory-resource.js'\n\nexport function AutomationSettings({companion, kind, close, onChanged}: {companion: CompanionView; kind: 'memory' | 'heartbeat'; close(): void; onChanged(): Promise<void>}): JSX.Element {\n const [automation,setAutomation] = useState<AutomationView>(()=>structuredClone(companion.automation))\n const lock = useRef(false)\n const [busy,setBusy] = useState(false)\n const [error,setError] = useState<string>()\n const [notice,setNotice] = useState<string>()\n const {data: modelCatalog,error: catalogError} = useMemoryResource<ModelCatalogView>(kind==='memory'?'/models':undefined)\n const inheritedProvider=companion.provider || modelCatalog?.defaultSelection.provider || ''\n const selectedProvider=automation.memory.provider || inheritedProvider\n const modelOptions=modelCatalog?.providers.find(item=>item.id===selectedProvider)?.models ?? []\n const save=async ():Promise<void>=>{\n if(lock.current)return;lock.current=true;setBusy(true);setError(undefined);setNotice(undefined)\n try {await api('/companions/'+encodeURIComponent(companion.id)+'/automation',{method:'PUT',body:JSON.stringify({automation:{...companion.automation,[kind]:automation[kind]}})});setNotice('\u8BBE\u7F6E\u5DF2\u4FDD\u5B58');await onChanged()}\n catch(reason){setError(errorMessage(reason))}finally{lock.current=false;setBusy(false)}\n }\n const review=async ():Promise<void>=>{\n if(lock.current)return;lock.current=true;setBusy(true);setError(undefined);setNotice(undefined)\n try {const result=await api<{reviewed:number;failed:number;reason?:string}>('/companions/'+encodeURIComponent(companion.id)+'/memory/review',{method:'POST'});setNotice(result.reason ?? '\u7EC8\u5BA1\u5B8C\u6210 '+result.reviewed+' \u7BC7\uFF0C\u5931\u8D25 '+result.failed+' \u7BC7');await onChanged()}\n catch(reason){setError(errorMessage(reason))}finally{lock.current=false;setBusy(false)}\n }\n return <WorkspaceDialog title={kind==='memory'?'\u8BB0\u5FC6\u8BBE\u7F6E':'\u6301\u7EED\u5173\u6CE8\u8BBE\u7F6E'} detail={kind==='memory'?'\u7BA1\u7406\u5B66\u4E60\u3001\u5386\u53F2\u4FDD\u7559\u4E0E\u6BCF\u65E5\u6574\u7406\u3002\u6709\u6548\u7684\u957F\u671F\u8BA4\u8BC6\u72EC\u7ACB\u4FDD\u7559\u3002':'\u6301\u7EED\u5173\u6CE8\u7528\u4E8E\u89C2\u5BDF\u53D8\u5316\uFF1B\u5B9A\u65F6\u6267\u884C\u5DE5\u4F5C\u8BF7\u4F7F\u7528\u5B9A\u65F6\u4EFB\u52A1\u3002'} close={()=>{if(!busy)close()}}>\n <div className=\"dsh-partner-memory-settings\">{(error || catalogError) && <WorkspaceNotice>{error || catalogError}</WorkspaceNotice>}{notice && <WorkspaceNotice kind=\"success\">{notice}</WorkspaceNotice>}\n {kind==='memory'?(<section className=\"dsh-partner-automation\">\n <header><span><strong>\u5B66\u4E60\u4E0E\u957F\u671F\u8BB0\u5FC6</strong><small>\u6309\u8054\u7CFB\u4EBA\u5F52\u6863\u5B8C\u6574\u5BF9\u8BDD\uFF0C\u63D0\u70BC\u6BCF\u65E5\u56DE\u987E\u548C\u7ED3\u6784\u5316\u8BB0\u5FC6\uFF0C\u5E76\u5728\u76F8\u5173\u8BDD\u9898\u51FA\u73B0\u65F6\u53EC\u56DE\u3002</small></span><button type=\"button\" className=\"dsh-partner-switch\" disabled={busy} role=\"switch\" data-on={automation.memory.enabled} aria-checked={automation.memory.enabled} aria-label=\"\u542F\u7528\u4F19\u4F34\u5B66\u4E60\" onClick={() => setAutomation(current => ({ ...current, memory: { ...current.memory, enabled: !current.memory.enabled } }))}><i /></button></header>\n <div className=\"dsh-partner-automation-fields is-memory-model\"><Field label=\"\u5386\u53F2\u4FDD\u7559\u671F\u9650\" hint=\"\u4E0D\u4F1A\u5220\u9664\u4ECD\u6709\u6548\u7684\u957F\u671F\u504F\u597D\"><select value={automation.memory.retentionDays} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, retentionDays: Number(event.target.value) } }))}><option value={0}>\u6C38\u4E45\u4FDD\u7559</option><option value={30}>30 \u5929</option><option value={90}>90 \u5929</option><option value={180}>180 \u5929</option><option value={365}>1 \u5E74</option><option value={1095}>3 \u5E74</option></select></Field><Field label=\"\u63D0\u70BC Provider\" hint=\"\u9ED8\u8BA4\u7EE7\u627F\u4F19\u4F34\"><select value={automation.memory.provider ?? ''} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, provider: event.target.value, model: '' } }))}><option value=\"\">\u8DDF\u968F\u4F19\u4F34 \u00B7 {inheritedProvider || 'DSH \u9ED8\u8BA4'}</option>{modelCatalog?.providers.map(provider => <option value={provider.id} key={provider.id}>{provider.name || provider.id}</option>)}</select></Field><Field label=\"\u63D0\u70BC\u6A21\u578B\" hint=\"\u9ED8\u8BA4\u7EE7\u627F\u4F19\u4F34\"><select value={automation.memory.model ?? ''} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, model: event.target.value } }))}><option value=\"\">\u8DDF\u968F\u4F19\u4F34 \u00B7 {companion.model || modelCatalog?.defaultSelection.model || 'DSH \u9ED8\u8BA4'}</option>{modelOptions.map(model => <option value={model.id} key={model.id}>{model.name || model.id}</option>)}</select></Field></div>\n <div className=\"dsh-partner-review-policy\"><button type=\"button\" className=\"dsh-partner-switch\" disabled={busy} role=\"switch\" data-on={automation.memory.dailyReviewEnabled} aria-checked={automation.memory.dailyReviewEnabled} aria-label=\"\u542F\u7528\u6BCF\u65E5\u7EC8\u5BA1\" onClick={() => setAutomation(current => ({ ...current, memory: { ...current.memory, dailyReviewEnabled: !current.memory.dailyReviewEnabled } }))}><i /></button><span><strong>\u6BCF\u65E5\u7EC8\u5BA1</strong><small>\u6B21\u65E5\u81EA\u52A8\u5408\u5E76\u91CD\u590D\u3001\u7EA0\u6B63\u504F\u5DEE\u5E76\u5EFA\u7ACB\u8BB0\u5FC6\u5173\u7CFB</small></span><label><select aria-label=\"\u6BCF\u65E5\u7EC8\u5BA1\u65F6\u95F4\" value={automation.memory.dailyReviewHour} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, dailyReviewHour: Number(event.target.value) } }))}>{Array.from({ length: 24 }, (_, hour) => <option value={hour} key={hour}>{String(hour).padStart(2, '0')}:00</option>)}</select></label><button type=\"button\" disabled={busy} onClick={() => { void review() }}>\u7ACB\u5373\u7EC8\u5BA1</button></div>\n </section>):(<section className=\"dsh-partner-automation\">\n <header><span><strong>\u6301\u7EED\u611F\u77E5</strong><small>\u4F19\u4F34\u53EA\u89C2\u5BDF\u5C1A\u672A\u95ED\u73AF\u7684\u4E8B\u60C5\u662F\u5426\u51FA\u73B0\u65B0\u53D8\u5316\uFF0C\u5E76\u7531\u514B\u5236\u7684\u6253\u6270\u7B56\u7565\u51B3\u5B9A\u4F55\u65F6\u544A\u8BC9\u4F60\u3002</small></span><button type=\"button\" className=\"dsh-partner-switch\" disabled={busy} role=\"switch\" data-on={automation.heartbeat.enabled} aria-checked={automation.heartbeat.enabled} aria-label=\"\u542F\u7528\u4F19\u4F34\u5FC3\u8DF3\" onClick={() => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, enabled: !current.heartbeat.enabled } }))}><i /></button></header>\n <div className=\"dsh-partner-automation-fields is-heartbeat\">\n <Field label=\"\u68C0\u67E5\u95F4\u9694\"><select value={automation.heartbeat.intervalMinutes} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, intervalMinutes: Number(event.target.value) } }))}><option value={30}>30 \u5206\u949F</option><option value={60}>1 \u5C0F\u65F6</option><option value={180}>3 \u5C0F\u65F6</option><option value={360}>6 \u5C0F\u65F6</option><option value={720}>12 \u5C0F\u65F6</option><option value={1440}>24 \u5C0F\u65F6</option></select></Field>\n <Field label=\"\u514D\u6253\u6270\u5F00\u59CB\"><input type=\"number\" min={0} max={23} value={automation.heartbeat.quietStartHour} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, quietStartHour: Number(event.target.value) } }))} /></Field>\n <Field label=\"\u514D\u6253\u6270\u7ED3\u675F\"><input type=\"number\" min={0} max={23} value={automation.heartbeat.quietEndHour} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, quietEndHour: Number(event.target.value) } }))} /></Field>\n <Field label=\"\u6BCF\u65E5\u4E0A\u9650\"><select value={automation.heartbeat.dailyLimit} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, dailyLimit: Number(event.target.value) } }))}><option value={0}>\u4E0D\u9650</option><option value={1}>1 \u6B21</option><option value={2}>2 \u6B21</option><option value={3}>3 \u6B21</option><option value={5}>5 \u6B21</option><option value={8}>8 \u6B21</option></select></Field>\n </div>\n</section>)}\n <footer className=\"dsh-partner-memory-actions\"><button type=\"button\" disabled={busy} onClick={close}>\u5173\u95ED</button><button type=\"button\" className=\"is-primary\" disabled={busy} onClick={()=>{void save()}}>{busy?'\u6B63\u5728\u5904\u7406\u2026':'\u4FDD\u5B58\u8BBE\u7F6E'}</button></footer></div>\n </WorkspaceDialog>\n}\n", "export function MemoryJobFeedback({status, error}: {status: string; error?: string}) {\n if(!error)return null\n return <small className=\"dsh-partner-memory-job-error\">\u4E0A\u6B21\u5931\u8D25\uFF1A{error}{status==='processing'?'\uFF08\u5F53\u524D\u6B63\u5728\u91CD\u8BD5\uFF0C\u672C\u8F6E\u5C1A\u672A\u7ED3\u675F\uFF09':''}</small>\n}\n", "import {useEffect, useRef, useState} from 'react'\nimport {IconRefreshOutline16} from '@deepseek-ai/dsh-client-ui-primitives'\nimport {api, type CompanionView, type PartnerSnapshot, type ConcernActivityView, type ConcernView} from '../../client-api.js'\nimport {WorkspaceHero, WorkspaceNotice, CollectionEmpty, errorMessage} from '../workspace-components.js'\nimport {relativeTime} from '../partner-components.js'\nimport {useMemoryResource} from './use-memory-resource.js'\nimport {AutomationSettings} from './automation-settings.js'\nimport {ConcernBoard} from './concern-board.js'\n\nexport function ConcernPanel({companion, snapshot, onChanged}: {companion: CompanionView; snapshot: PartnerSnapshot; onChanged(): Promise<void>}): JSX.Element {\n const base = `/companions/${encodeURIComponent(companion.id)}`\n const resource = useMemoryResource<ConcernActivityView>(`${base}/concerns`, 15_000)\n const [settings, setSettings] = useState(false)\n const [value, setValue] = useState('')\n const [busy, setBusy] = useState(false)\n const [checking, setChecking] = useState(false)\n const awaitingCheck = useRef(false)\n const refresh = useRef({onChanged, reload: resource.reload})\n refresh.current = {onChanged, reload: resource.reload}\n useEffect(() => {\n let disposed = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const controller = new AbortController()\n awaitingCheck.current = false\n setChecking(false)\n const poll = async () => {\n try {\n if (document.hidden) return\n const status = await api<{running: boolean; result: {sent: boolean; reason?: string} | null}>(`${base}/heartbeat/status`, {signal: controller.signal})\n if (disposed) return\n setChecking(status.running)\n if (awaitingCheck.current && !status.running) {\n awaitingCheck.current = false\n setNotice(status.result?.reason ?? (status.result?.sent ? '\u68C0\u67E5\u5B8C\u6210\uFF0C\u5DF2\u53D1\u9001\u63D0\u9192' : '\u68C0\u67E5\u5DF2\u7ED3\u675F\uFF0C\u8BF7\u67E5\u770B\u5173\u6CE8\u6D3B\u52A8'))\n await Promise.all([refresh.current.onChanged(), refresh.current.reload()])\n }\n if (status.running) awaitingCheck.current = true\n } catch { /* A transient status failure must not restart a background task. */ }\n finally { if (!disposed) timer = setTimeout(() => {void poll()}, 3000) }\n }\n void poll()\n return () => {disposed = true; controller.abort(); clearTimeout(timer)}\n }, [base])\n const lock = useRef(false)\n const [notice, setNotice] = useState<string>()\n const [error, setError] = useState<string>()\n const heartbeat = snapshot.heartbeatStates.find(item => item.companionId === companion.id)\n const run = async (action: () => Promise<string>): Promise<boolean> => {\n if (lock.current) return false\n lock.current = true; setBusy(true); setError(undefined); setNotice(undefined)\n try {setNotice(await action()); await resource.reload(); return true}\n catch (reason) {setError(errorMessage(reason)); return false}\n finally {lock.current = false; setBusy(false)}\n }\n const check = (concernId?: string): void => {void run(async () => {\n if (checking) return '\u5FC3\u8DF3\u6B63\u5728\u6267\u884C\uFF0C\u8BF7\u7B49\u5F85\u672C\u8F6E\u7ED3\u679C'\n const result = await api<{running: boolean; reason?: string}>(`${base}/heartbeat/trigger`, {method: 'POST', body: JSON.stringify(concernId ? {concernId} : {})})\n setChecking(result.running)\n awaitingCheck.current = result.running\n await onChanged()\n return result.reason ?? '\u5DF2\u5F00\u59CB\u540E\u53F0\u68C0\u67E5\uFF0C\u53EF\u79BB\u5F00\u6B64\u9875\u9762\uFF0C\u7ED3\u679C\u4F1A\u4FDD\u7559\u5728\u5173\u6CE8\u6D3B\u52A8\u4E2D'\n })}\n const act = (item: ConcernView, action: 'watch' | 'ignore' | 'prioritize' | 'resolve'): void => {void run(async () => {\n await api(`${base}/concerns/${encodeURIComponent(item.id)}/action`, {method: 'POST', body: JSON.stringify({action})})\n return ({watch: '\u5DF2\u6062\u590D\u7559\u610F', ignore: '\u4E0D\u518D\u5173\u6CE8\u8FD9\u4EF6\u4E8B', prioritize: '\u5DF2\u63D0\u9AD8\u5173\u6CE8', resolve: '\u5DF2\u6807\u8BB0\u89E3\u51B3'})[action]\n })}\n return <div className=\"dsh-partner-memory-page is-concerns\">\n <WorkspaceHero eyebrow=\"ONGOING WATCHES\" title=\"\u6301\u7EED\u5173\u6CE8\" detail=\"\u53EA\u7559\u610F\u9700\u8981\u7EE7\u7EED\u89C2\u5BDF\u7684\u4E8B\uFF0C\u6709\u503C\u5F97\u544A\u8BC9\u4F60\u7684\u53D8\u5316\u65F6\u518D\u51FA\u73B0\u3002\" actions={<><button type=\"button\" disabled={busy || checking} aria-busy={checking} onClick={() => check()}>{checking ? '\u540E\u53F0\u68C0\u67E5\u4E2D\u2026' : '\u68C0\u67E5\u5230\u671F\u9879'}</button><button type=\"button\" onClick={() => setSettings(true)}>\u5173\u6CE8\u8BBE\u7F6E</button></>} />\n <div className=\"dsh-partner-memory-status\"><span>{companion.automation.heartbeat.enabled ? '\u6301\u7EED\u611F\u77E5\u5DF2\u5F00\u542F' : '\u6301\u7EED\u611F\u77E5\u5DF2\u6682\u505C'}</span><small>\u6700\u8FD1\u68C0\u67E5\uFF1A{heartbeat?.lastCheckedAt ? relativeTime(heartbeat.lastCheckedAt) : '\u5C1A\u672A'} \u00B7 \u4ECA\u65E5\u63D0\u9192 {heartbeat?.sentCount ?? 0} \u6B21</small><button type=\"button\" disabled={resource.loading} aria-label=\"\u5237\u65B0\u5173\u6CE8\" onClick={() => {void resource.reload()}}><IconRefreshOutline16 size={16} /></button></div>\n {(error || resource.error || heartbeat?.lastError) && <WorkspaceNotice>{error || resource.error || heartbeat?.lastError}</WorkspaceNotice>}\n {notice && <WorkspaceNotice kind=\"success\">{notice}</WorkspaceNotice>}\n {!resource.data ? <CollectionEmpty title={resource.error ? '\u5173\u6CE8\u8BFB\u53D6\u5931\u8D25' : '\u6B63\u5728\u8BFB\u53D6\u5173\u6CE8'} action={resource.error ? <button type=\"button\" onClick={() => {void resource.reload()}}>\u91CD\u8BD5</button> : undefined} /> : <ConcernBoard companionId={companion.id} activity={resource.data} onEdited={resource.reload} value={value} busy={busy || checking} onValue={setValue} onCheck={item => check(item.id)} onAct={act} onAdd={(recordTarget, reason) => run(async () => {\n if (!value.trim()) return '\u8BF7\u586B\u5199\u9700\u8981\u6301\u7EED\u5173\u6CE8\u7684\u4E8B\u60C5'\n await api(`${base}/concerns`, {method: 'POST', body: JSON.stringify({subject: value.trim(), reason, recordTarget})})\n setValue(''); return '\u5DF2\u52A0\u5165\u6301\u7EED\u5173\u6CE8'\n })} />}\n {settings && <AutomationSettings companion={companion} kind=\"heartbeat\" close={() => setSettings(false)} onChanged={onChanged} />}\n </div>\n}\n", "import {useEffect, useId, useRef, useState, type FormEvent} from 'react'\nimport {IconCheckOutline14, IconChevronDownOutline14, IconPlusOutline16, IconLinkOutline16, IconDataOutline16} from '@deepseek-ai/dsh-client-ui-primitives'\nimport {api, type ConcernActivityView, type ConcernView, type ConcernSourceView, type ConcernObservationView} from '../../client-api.js'\nimport {futureTime} from '../../time-format.js'\nimport {errorMessage as message} from '../workspace-components.js'\nimport {ConcernDeleteButton, ArchivedConcerns} from './concern-deletion.js'\nimport {ConcernEditor} from './concern-editor.js'\nimport { ConcernRecordFields } from './concern-record-fields.js'\nimport type { ConcernRecordTargetView } from '../../client-api.js'\nexport function ConcernBoard({ companionId, activity, value, busy, onValue, onAdd, onCheck, onAct, onEdited }: {\n companionId: string; activity: ConcernActivityView; value: string; busy: boolean; onValue(value: string): void; onAdd(target?: ConcernRecordTargetView, reason?: string): Promise<boolean>\n onEdited(): Promise<void>\n onCheck(item: ConcernView): void\n onAct(item: ConcernView, action: 'watch' | 'ignore' | 'prioritize' | 'resolve'): void\n}): JSX.Element {\n const visible = activity.concerns.filter(item => item.state !== 'archived')\n const active = visible.filter(item => item.state !== 'resolved')\n const resolved = visible.filter(item => item.state === 'resolved')\n const latest = new Map([...activity.observations].reverse().map(item => [item.concernId, item]))\n const [editing, setEditing] = useState<ConcernView>()\n const [composing, setComposing] = useState(false)\n const [reason, setReason] = useState('')\n const [recordTarget, setRecordTarget] = useState<ConcernRecordTargetView>()\n const [expandedId, setExpandedId] = useState<string>()\n const [visibleCount, setVisibleCount] = useState(5)\n const [mention, setMention] = useState<{ start: number; end: number; query: string }>()\n const [sources, setSources] = useState<ConcernSourceView[]>([])\n const [sourcesLoading, setSourcesLoading] = useState(false)\n const [sourceError, setSourceError] = useState<string>()\n const [activeSource, setActiveSource] = useState(0)\n const inputRef = useRef<HTMLInputElement>(null)\n const listboxId = useId()\n const shown = active.slice(0, visibleCount)\n const suggestionsOpen = composing && mention !== undefined\n useEffect(() => {\n if (!suggestionsOpen || mention === undefined) {\n setSources([]); setSourcesLoading(false); setSourceError(undefined); return\n }\n const controller = new AbortController()\n const timer = window.setTimeout(() => {\n setSourcesLoading(true); setSourceError(undefined)\n const params = new URLSearchParams({ q: mention.query })\n void api<{ items: ConcernSourceView[] }>(`/companions/${encodeURIComponent(companionId)}/concern-sources?${params}`, {signal: controller.signal}).then(result => {\n if (!controller.signal.aborted) { setSources(result.items); setActiveSource(0) }\n }).catch(reason => {\n if (!controller.signal.aborted) { setSources([]); setSourceError(message(reason)) }\n }).finally(() => { if (!controller.signal.aborted) setSourcesLoading(false) })\n }, 150)\n return () => { window.clearTimeout(timer); controller.abort() }\n }, [companionId, mention?.query, suggestionsOpen])\n const submit = (event: FormEvent): void => { event.preventDefault(); void onAdd(recordTarget, reason).then(ok => { if (ok) { setComposing(false); setMention(undefined); setRecordTarget(undefined); setReason('') } }) }\n const chooseSource = (source: ConcernSourceView): void => {\n if (mention === undefined) return\n const next = `${value.slice(0, mention.start)}${source.token} ${value.slice(mention.end)}`\n const cursor = mention.start + source.token.length + 1\n onValue(next); setMention(undefined); setSources([])\n window.requestAnimationFrame(() => { inputRef.current?.focus(); inputRef.current?.setSelectionRange(cursor, cursor) })\n }\n return <section className=\"dsh-partner-concern-board\" aria-labelledby=\"partner-concerns-title\">\n <header><span><strong id=\"partner-concerns-title\">\u4F19\u4F34\u5728\u610F\u7684\u4E8B <b>{active.length}</b></strong><p>\u5C1A\u672A\u95ED\u73AF\u3001\u503C\u5F97\u7EE7\u7EED\u7559\u610F\u7684\u4E8B\u60C5</p></span><button type=\"button\" aria-expanded={composing} onClick={() => {setEditing(undefined);setComposing(current => !current)}}><IconPlusOutline16 size={14} />\u4EA4\u4EE3\u4E00\u4EF6\u4E8B</button></header>\n {editing && <ConcernEditor key={editing.id} companionId={companionId} item={editing} close={()=>setEditing(undefined)} saved={onEdited} />}\n {composing && <form className=\"dsh-partner-concern-compose\" aria-label=\"\u65B0\u589E\u5173\u6CE8\" aria-busy={busy} onSubmit={submit}><header className=\"dsh-partner-concern-form-heading\"><strong>\u4EA4\u4EE3\u4E00\u4EF6\u4E8B</strong><p>\u5148\u8BF4\u8981\u5173\u6CE8\u4EC0\u4E48\uFF0C\u518D\u8865\u5145\u68C0\u67E5\u65B9\u5F0F\u548C\u8BB0\u5F55\u4F4D\u7F6E\u3002</p></header><label><span>\u9700\u8981\u7559\u610F\u7684\u4E8B</span><div className=\"dsh-partner-concern-input-wrap\"><input\n ref={inputRef} autoFocus value={value} maxLength={300} placeholder=\"\u8F93\u5165 @ \u9009\u62E9\u6587\u4EF6\u6216\u77E5\u8BC6\u6587\u6863\"\n role=\"combobox\" aria-autocomplete=\"list\" aria-expanded={suggestionsOpen} aria-controls={suggestionsOpen ? listboxId : undefined}\n aria-activedescendant={suggestionsOpen && sources[activeSource] ? `${listboxId}-option-${activeSource}` : undefined}\n onChange={event => { onValue(event.target.value); setMention(activeMention(event.target.value, event.target.selectionStart ?? event.target.value.length)) }}\n onClick={event => setMention(activeMention(event.currentTarget.value, event.currentTarget.selectionStart ?? event.currentTarget.value.length))}\n onKeyDown={event => {\n if (!suggestionsOpen) return\n if (event.key === 'ArrowDown') { event.preventDefault(); setActiveSource(index => sources.length === 0 ? 0 : (index + 1) % sources.length) }\n else if (event.key === 'ArrowUp') { event.preventDefault(); setActiveSource(index => sources.length === 0 ? 0 : (index - 1 + sources.length) % sources.length) }\n else if (event.key === 'Enter' && sources[activeSource]) { event.preventDefault(); chooseSource(sources[activeSource]) }\n else if (event.key === 'Escape') { event.preventDefault(); setMention(undefined) }\n }}\n />{suggestionsOpen && <div id={listboxId} className=\"dsh-partner-concern-sources\" role=\"listbox\" aria-label=\"\u53EF\u5F15\u7528\u7684\u6587\u4EF6\u4E0E\u77E5\u8BC6\u6587\u6863\">\n {sourcesLoading ? <p role=\"status\">\u6B63\u5728\u67E5\u627E\u53EF\u5F15\u7528\u5185\u5BB9\u2026</p> : sourceError ? <p role=\"status\">\u5019\u9009\u52A0\u8F7D\u5931\u8D25\uFF1A{sourceError}</p> : sources.length === 0 ? <p role=\"status\">\u6CA1\u6709\u627E\u5230\u5339\u914D\u7684\u6587\u4EF6\u6216\u5DF2\u6302\u8F7D\u77E5\u8BC6\u6587\u6863</p> : <>\n {sources.map((source, index) => <button\n type=\"button\" role=\"option\" id={`${listboxId}-option-${index}`} key={`${source.kind}:${source.token}`}\n aria-selected={index === activeSource} data-kind={source.kind} onMouseDown={event => event.preventDefault()}\n onMouseEnter={() => setActiveSource(index)} onClick={() => chooseSource(source)}\n ><span>{source.kind === 'file' ? <IconDataOutline16 size={15} /> : <IconLinkOutline16 size={15} />}</span><strong>{source.label}</strong><small>{source.detail}</small></button>)}\n </>}\n </div>}</div><small className=\"dsh-partner-concern-compose-hint\">\u8F93\u5165 <b>@</b> \u9009\u62E9\u68C0\u67E5\u4F9D\u636E\uFF1A\u5F53\u524D\u4F1A\u8BDD\u6587\u4EF6\u6216\u5DF2\u6302\u8F7D\u77E5\u8BC6\u6587\u6863\u3002\u4F9D\u636E\u53EA\u8BFB\uFF0C\u4E0D\u4F5C\u4E3A\u8BB0\u5F55\u4F4D\u7F6E\u3002</small></label>\n <ConcernRecordFields companionId={companionId} reason={reason} onReason={setReason} target={recordTarget} onTarget={setRecordTarget} />\n <div><button type=\"button\" onClick={() => { setComposing(false); setMention(undefined); setRecordTarget(undefined); setReason(''); onValue('') }}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy || !value.trim()}>\u8BA9\u4F19\u4F34\u8BB0\u7740</button></div></form>}\n <div className=\"dsh-partner-concern-list\" role=\"list\">\n {active.length === 0 ? <p className=\"dsh-partner-concern-empty\">\u6700\u8FD1\u6CA1\u6709\u672A\u95ED\u73AF\u7684\u4E8B\u3002\u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u5BF9\u4F19\u4F34\u8BF4\u201C\u8FD9\u4E2A\u5E2E\u6211\u7559\u610F\u201D\u3002</p> : shown.map(item => {\n const observation = latest.get(item.id)\n const expanded = expandedId === item.id\n const status = observation ? concernObservationStatus(observation) : item.state === 'active' ? '\u6B63\u5728\u7559\u610F' : '\u6682\u65F6\u8BB0\u7740'\n return <article key={item.id} role=\"listitem\" data-state={item.state} data-expanded={expanded}>\n {expanded && <p className=\"dsh-partner-record-summary\">\u8BB0\u5F55\u4F4D\u7F6E\uFF1A{item.recordTarget ? `${item.recordTarget.kind === 'file' ? '\u672C\u5730\u6587\u4EF6' : '\u7B14\u8BB0\u6587\u6863'} \u00B7 ${item.recordTarget.label}` : '\u4F19\u4F34\u5185\u90E8\u89C2\u5BDF\u8BB0\u5F55\uFF08\u4E0D\u521B\u5EFA\u6587\u6863\u3001\u4E0D\u56DE\u5199\u4F9D\u636E\uFF09'}</p>}\n <button type=\"button\" className=\"dsh-partner-concern-row\" aria-expanded={expanded} onClick={() => setExpandedId(current => current === item.id ? undefined : item.id)}>\n <span className=\"dsh-partner-concern-state\"><i />{status}</span><span className=\"dsh-partner-concern-copy\"><strong>{item.subject}</strong><small>{observation ? observation.event : item.reason}</small></span><span className=\"dsh-partner-concern-time\" title={`\u8BA1\u5212\u4E8E ${new Date(item.nextCheckAt).toLocaleString()} \u518D\u6B21\u7559\u610F`}><small>\u4E0B\u6B21\u7559\u610F</small><strong>{futureTime(item.nextCheckAt)}</strong></span><IconChevronDownOutline14 size={14} />\n </button>\n {expanded && <div className=\"dsh-partner-concern-detail\"><p>{item.reason}</p>{observation && <><blockquote>{observation.event}</blockquote><div className=\"dsh-partner-concern-decision\" data-decision={observation.decision}><strong>{concernObservationStatus(observation)}</strong><span>{observation.decisionReason || concernObservationExplanation(observation)}</span><small>\u6253\u6270\u5206\u6570 {Math.round(observation.interruptScore * 100)}{observation.notificationRuleEffect !== 'auto' && observation.notificationRuleReason ? ` \u00B7 \u77E5\u8BC6\u89C4\u5219\uFF1A${observation.notificationRuleReason}` : ''}</small></div></>}{item.resources.length > 0 && <div className=\"dsh-partner-concern-resources\">{item.resources.map(resource => <span key={`${resource.kind}:${resource.locator}`}>{resource.kind === 'file' ? '\u6587\u4EF6' : '\u77E5\u8BC6'} \u00B7 {resource.label}</span>)}</div>}<small>{item.origin === 'explicit' ? '\u4F60\u660E\u786E\u4EA4\u4EE3' : '\u4F19\u4F34\u4ECE\u5BF9\u8BDD\u4E2D\u6CE8\u610F\u5230'} \u00B7 {watchKindLabel(item.watchKind)}</small><div className=\"dsh-partner-concern-actions\" aria-label={`${item.subject} \u7684\u64CD\u4F5C`}><button type=\"button\" onClick={() => {setComposing(false);setEditing(item)}}>\u7F16\u8F91</button><button type=\"button\" disabled={busy} onClick={() => onCheck(item)}>\u7ACB\u5373\u68C0\u67E5\u8FD9\u6761</button><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'watch')}>\u7EE7\u7EED\u7559\u610F</button><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'prioritize')}>\u63D0\u9AD8\u5173\u6CE8</button><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'resolve')}>\u5DF2\u7ECF\u89E3\u51B3</button><ConcernDeleteButton companionId={companionId} item={item} disabled={busy} onDeleted={onEdited}/></div></div>}\n </article>\n })}\n </div>\n {(active.length > shown.length || visibleCount > 5) && <div className=\"dsh-partner-concern-more\">{active.length > shown.length ? <button type=\"button\" onClick={() => setVisibleCount(count => Math.min(active.length, count + 20))}>\u518D\u663E\u793A {Math.min(20, active.length - shown.length)} \u6761</button> : <button type=\"button\" onClick={() => setVisibleCount(5)}>\u6536\u8D77\u5217\u8868</button>}</div>}\n {resolved.length > 0 && <details className=\"dsh-partner-concern-resolved\"><summary>\u5DF2\u7ECF\u89E3\u51B3 <b>{resolved.length}</b></summary><div>{resolved.slice(0, 30).map(item => <article key={item.id}><span><IconCheckOutline14 size={13} /></span><strong>{item.subject}</strong><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'watch')}>\u91CD\u65B0\u7559\u610F</button><ConcernDeleteButton companionId={companionId} item={item} disabled={busy} onDeleted={onEdited}/></article>)}</div></details>}\n <ArchivedConcerns companionId={companionId} onChanged={onEdited}/>\n </section>\n}\n\nfunction activeMention(value: string, cursor: number): { start: number; end: number; query: string } | undefined {\n const prefix = value.slice(0, cursor)\n const start = prefix.lastIndexOf('@')\n if (start < 0 || (start > 0 && !/\\s/u.test(prefix[start - 1] ?? ''))) return undefined\n const fragment = prefix.slice(start + 1)\n if (fragment.startsWith('\u77E5\u8BC6\u5E93[')) {\n if (fragment.includes(']')) return undefined\n return { start, end: cursor, query: fragment.slice(4) }\n }\n if (fragment.startsWith('\"')) {\n if (fragment.slice(1).includes('\"')) return undefined\n return { start, end: cursor, query: fragment.slice(1) }\n }\n if (/\\s/u.test(fragment)) return undefined\n return { start, end: cursor, query: fragment }\n}\n\nfunction watchKindLabel(value: ConcernView['watchKind']): string {\n return value === 'knowledge' ? '\u77E5\u8BC6\u5E93\u53D8\u5316' : value === 'workspace' ? '\u9879\u76EE\u53D8\u5316' : value === 'web' ? '\u5916\u90E8\u53D8\u5316' : '\u6309\u4E8B\u60C5\u5224\u65AD\u6765\u6E90'\n}\n\nfunction concernObservationStatus(item: ConcernObservationView): string {\n if (item.decision === 'notify') return item.mentionedAt === undefined ? '\u5F85\u63D0\u9192' : '\u5DF2\u63D0\u9192'\n if (item.decision === 'feed') return '\u4F19\u4F34\u52A8\u6001'\n if (item.decision === 'defer') return item.mentionedAt === undefined ? '\u5F85\u987A\u5E26\u63D0' : '\u5DF2\u987A\u5E26\u63D0'\n return '\u9759\u9ED8\u8BB0\u4E0B'\n}\nfunction concernObservationExplanation(item: ConcernObservationView): string {\n if (item.decision === 'notify') return item.mentionedAt === undefined ? '\u8FBE\u5230\u4E3B\u52A8\u63D0\u9192\u6761\u4EF6\uFF0C\u7B49\u5F85\u6E20\u9053\u6295\u9012' : '\u5DF2\u7ECF\u901A\u8FC7\u6279\u51C6\u7684\u6E20\u9053\u4E3B\u52A8\u63D0\u9192'\n if (item.decision === 'feed') return '\u53EA\u663E\u793A\u5728\u4F19\u4F34\u52A8\u6001\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u8F6C\u6210\u4E3B\u52A8\u63D0\u9192'\n if (item.decision === 'defer') return item.mentionedAt === undefined ? '\u4E0B\u6B21\u51FA\u73B0\u76F8\u5173\u5BF9\u8BDD\u65F6\u987A\u5E26\u63D0\u53CA' : '\u5DF2\u7ECF\u5728\u76F8\u5173\u5BF9\u8BDD\u4E2D\u987A\u5E26\u63D0\u53CA'\n return '\u4EC5\u4FDD\u7559\u4E3A\u89C2\u5BDF\u8BB0\u5F55\uFF0C\u4E0D\u6253\u6270\u4F60'\n}\n", "export function futureTime(value: number, now = Date.now()): string {\n const minutes = Math.ceil((value - now) / 60_000)\n if (minutes <= 0) return '\u5373\u5C06\u68C0\u67E5'\n if (minutes < 60) return `${minutes} \u5206\u949F\u540E`\n const hours = Math.ceil(minutes / 60)\n if (hours < 24) return `${hours} \u5C0F\u65F6\u540E`\n const days = Math.ceil(hours / 24)\n if (days <= 7) return `${days} \u5929\u540E`\n const date = new Date(value)\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n const hour = String(date.getHours()).padStart(2, '0')\n const minute = String(date.getMinutes()).padStart(2, '0')\n return `${month}/${day} ${hour}:${minute}`\n}\n", "import {useId, useRef, useState} from 'react'\nimport {IconChevronDownOutline14} from '@deepseek-ai/dsh-client-ui-primitives'\nimport {api, type ConcernView} from '../../client-api.js'\nimport {WorkspaceDialog, WorkspaceNotice, errorMessage} from '../workspace-components.js'\nimport {useMemoryResource} from './use-memory-resource.js'\n\nexport function ConcernDeleteButton({companionId, item, disabled, onDeleted}: {companionId:string; item:ConcernView; disabled?:boolean; onDeleted():Promise<void>}) {\n const [open,setOpen]=useState(false)\n const [busy,setBusy]=useState(false)\n const [error,setError]=useState('')\n const lock=useRef(false)\n const close=()=>{if(!lock.current)setOpen(false)}\n const remove=async()=>{\n if(lock.current)return\n lock.current=true;setBusy(true);setError('')\n try{\n await api(`/companions/${encodeURIComponent(companionId)}/concerns/${encodeURIComponent(item.id)}`,{method:'DELETE',body:JSON.stringify({expectedUpdatedAt:item.updatedAt})})\n await onDeleted();setOpen(false)\n }catch(e){setError(errorMessage(e))}finally{lock.current=false;setBusy(false)}\n }\n return <><button type=\"button\" className=\"is-danger\" disabled={disabled} onClick={()=>{setError('');setOpen(true)}}>\u5220\u9664\u5173\u6CE8</button>{open && <WorkspaceDialog eyebrow=\"DELETE CONCERN\" title={`\u5220\u9664\u300C${item.subject}\u300D\uFF1F`} detail=\"\u5220\u9664\u5173\u6CE8\u53CA\u5176\u5185\u90E8\u89C2\u5BDF\u3001\u5BA1\u8BA1\u8BB0\u5F55\uFF0C\u4E0D\u80FD\u64A4\u9500\u3002\u5173\u8054\u7684\u77E5\u8BC6\u6587\u6863\u3001\u7B14\u8BB0\u548C\u6587\u4EF6\u4E0D\u4F1A\u5220\u9664\uFF1B\u5DF2\u53D1\u9001\u5230\u804A\u5929\u6216\u6E20\u9053\u7684\u6D88\u606F\u4ECD\u4F1A\u4FDD\u7559\u3002\" close={close}>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <div className=\"dsh-partner-concern-actions\"><button type=\"button\" autoFocus disabled={busy} onClick={close}>\u4FDD\u7559\u5173\u6CE8</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={()=>{void remove()}}>{busy?'\u5220\u9664\u4E2D\u2026':'\u786E\u8BA4\u5220\u9664'}</button></div>\n </WorkspaceDialog>}</>\n}\n\nexport function ArchivedConcerns({companionId, onChanged}: {companionId:string; onChanged():Promise<void>}) {\n const contentId=useId()\n const [open,setOpen]=useState(false)\n const [offset,setOffset]=useState(0)\n const resource=useMemoryResource<{items:ConcernView[];hasMore:boolean}>(open?`/companions/${encodeURIComponent(companionId)}/concerns/archived?offset=${offset}`:undefined)\n const refresh=async()=>{await resource.reload();await onChanged()}\n return <section className=\"dsh-partner-concern-archive\"><button type=\"button\" className=\"dsh-partner-concern-archive-toggle\" aria-label=\"\u5DF2\u5F52\u6863\u5173\u6CE8 \u00B7 \u67E5\u770B\u4E0E\u6E05\u7406\" aria-expanded={open} aria-controls={open?contentId:undefined} onClick={()=>setOpen(!open)}><span><strong>\u5DF2\u5F52\u6863\u5173\u6CE8</strong><small>\u5DF2\u505C\u6B62\u5173\u6CE8\uFF0C\u53EF\u6309\u9700\u6E05\u7406</small></span><IconChevronDownOutline14 size={16}/></button>{open && <div id={contentId} className=\"dsh-partner-concern-archive-content\">\n {resource.error && <WorkspaceNotice>{resource.error}<button type=\"button\" onClick={()=>{void resource.reload()}}>\u91CD\u8BD5</button></WorkspaceNotice>}\n {!resource.data ? !resource.error && <p role=\"status\">\u6B63\u5728\u8BFB\u53D6\u2026</p> : <>{resource.data.items.length===0 && <p>\u6B64\u9875\u6CA1\u6709\u5DF2\u5F52\u6863\u5173\u6CE8\u3002</p>}<div className=\"dsh-partner-concern-archive-list\">{resource.data.items.map(item=><article key={item.id} className=\"dsh-partner-concern-archive-row\"><details className=\"dsh-partner-concern-archive-details\"><summary><IconChevronDownOutline14 size={14}/><strong>{item.subject}</strong></summary><dl><dt>\u6267\u884C\u8BF4\u660E\u4E0E\u8BB0\u5F55\u683C\u5F0F</dt><dd>{item.reason || '\u672A\u586B\u5199'}</dd><dt>\u68C0\u67E5\u4F9D\u636E</dt><dd>{item.resources?.map(source=>source.label || source.locator).join('\u3001') || '\u672A\u5173\u8054'}</dd><dt>\u8BB0\u5F55\u4F4D\u7F6E</dt><dd>{item.recordTarget?.label || '\u4F19\u4F34\u5185\u90E8\u89C2\u5BDF\u8BB0\u5F55\uFF08\u672A\u6307\u5B9A\u6587\u6863\uFF09'}</dd></dl><p>\u5DF2\u505C\u6B62\u540E\u7EED\u68C0\u67E5\u3002\u5220\u9664\u5173\u6CE8\u4E0D\u4F1A\u5220\u9664\u5173\u8054\u6587\u6863\u3002</p></details><div className=\"dsh-partner-concern-archive-action\"><ConcernDeleteButton companionId={companionId} item={item} onDeleted={refresh}/></div></article>)}</div>\n {(offset>0 || resource.data.hasMore) && <nav className=\"dsh-partner-concern-archive-pages\" aria-label=\"\u5F52\u6863\u5173\u6CE8\u5206\u9875\"><span>\u7B2C {Math.floor(offset/50)+1} \u9875</span><div><button type=\"button\" disabled={offset===0 || resource.loading} onClick={()=>setOffset(Math.max(0,offset-50))}>\u4E0A\u4E00\u9875</button><button type=\"button\" disabled={!resource.data.hasMore || resource.loading} onClick={()=>setOffset(offset+50)}>\u4E0B\u4E00\u9875</button></div></nav>}</>}\n </div>}</section>\n}\n", "import {useRef, useState} from 'react'\nimport {api, type ConcernView, type ConcernRecordTargetView} from '../../client-api.js'\nimport {ConcernRecordFields} from './concern-record-fields.js'\nimport {errorMessage} from '../workspace-components.js'\n\nexport function ConcernEditor({companionId, item, close, saved}: {companionId:string; item:ConcernView; close():void; saved():Promise<void>}) {\n const [subject,setSubject] = useState(item.subject)\n const [reason,setReason] = useState(item.reason)\n const [sources,setSources] = useState(item.resources.map(r => r.kind === 'knowledge' ? `@\u77E5\u8BC6\u5E93[${r.locator}]` : `@\"${r.locator}\"`).join('\\n'))\n const [target,setTarget] = useState<ConcernRecordTargetView | undefined>(item.recordTarget)\n const [busy,setBusy] = useState(false)\n const [error,setError] = useState('')\n const lock=useRef(false)\n return <form className=\"dsh-partner-concern-compose\" aria-label=\"\u7F16\u8F91\u5173\u6CE8\" aria-busy={busy} onSubmit={event=>{event.preventDefault();if(lock.current)return;lock.current=true;setBusy(true);setError('');void (async()=>{\n try {await api(`/companions/${encodeURIComponent(companionId)}/concerns/${encodeURIComponent(item.id)}`,{method:'PATCH',body:JSON.stringify({subject,reason,sources,recordTarget:target??null,expectedUpdatedAt:item.updatedAt})});await saved();close()}\n catch(e){setError(errorMessage(e))}finally{lock.current=false;setBusy(false)}\n })()}}>\n <header className=\"dsh-partner-concern-form-heading\"><strong>\u7F16\u8F91\u5173\u6CE8</strong><p>\u8C03\u6574\u540E\u7EED\u68C0\u67E5\u65B9\u5F0F\uFF0C\u5DF2\u6709\u89C2\u5BDF\u8BB0\u5F55\u4FDD\u7559\u3002</p></header>\n <label><span>\u5173\u6CE8\u4E8B\u9879</span><input autoFocus required value={subject} maxLength={300} onChange={e=>setSubject(e.target.value)} /></label>\n <label><span>\u68C0\u67E5\u4F9D\u636E</span><textarea rows={3} value={sources} maxLength={4000} onChange={e=>setSources(e.target.value)} /><small>\u6BCF\u884C\u4E00\u4E2A @\u77E5\u8BC6\u5E93[\u5E93\u540D/\u6587\u6863\u540D] \u6216 @\"\u6587\u4EF6\u8DEF\u5F84\"\uFF1B\u5220\u9664\u5BF9\u5E94\u884C\u5373\u53EF\u53D6\u6D88\u5173\u8054\u3002\u4F9D\u636E\u53EA\u8BFB\u3002</small></label>\n <ConcernRecordFields companionId={companionId} reason={reason} onReason={setReason} target={target} onTarget={setTarget} />\n <small>\u4FDD\u7559\u5386\u53F2\u548C\u5173\u6CE8\u72B6\u6001\uFF1B\u6B63\u5728\u6267\u884C\u7684\u68C0\u67E5\u4F7F\u7528\u539F\u914D\u7F6E\uFF0C\u4FEE\u6539\u4ECE\u4E0B\u8F6E\u751F\u6548\u3002</small>\n {error && <p role=\"alert\">{error}</p>}\n <div><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy || !subject.trim()}>{busy?'\u4FDD\u5B58\u4E2D\u2026':'\u4FDD\u5B58\u4FEE\u6539'}</button></div>\n </form>\n}\n", "import { useEffect, useId, useState } from 'react'\nimport { api, type ConcernRecordTargetView } from '../../client-api.js'\n\nexport function RecordTargetPicker({ companionId, value, onChange }: {\n companionId: string; value: ConcernRecordTargetView | undefined; onChange(value?: ConcernRecordTargetView): void\n}): JSX.Element {\n const [query, setQuery] = useState('')\n const [open, setOpen] = useState(false)\n const [items, setItems] = useState<ConcernRecordTargetView[]>([])\n const [error, setError] = useState('')\n const [loading, setLoading] = useState(false)\n const hint = useId()\n useEffect(() => {\n if (!open) return\n const controller = new AbortController()\n setLoading(true); setError('')\n const timer = window.setTimeout(() => {\n api<{ items: ConcernRecordTargetView[] }>(`/companions/${encodeURIComponent(companionId)}/recording-sources?q=${encodeURIComponent(query)}`, { signal: controller.signal })\n .then(result => { if (!controller.signal.aborted) setItems(result.items) })\n .catch(() => { if (!controller.signal.aborted) { setItems([]); setError('\u8BB0\u5F55\u4F4D\u7F6E\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u641C\u7D22') } })\n .finally(() => { if (!controller.signal.aborted) setLoading(false) })\n }, 180)\n return () => { window.clearTimeout(timer); controller.abort() }\n }, [companionId, query, open])\n return <section className=\"dsh-partner-record-picker\" aria-label=\"\u9700\u8981\u8BB0\u5F55\u7684\u5730\u65B9\">\n <label><span>\u9700\u8981\u8BB0\u5F55\u7684\u5730\u65B9 \u00B7 \u53EF\u9009</span><input value={query} aria-describedby={hint} placeholder={value ? `${value.kind === 'note' ? '\u7B14\u8BB0' : '\u6587\u4EF6'} \u00B7 ${value.label}` : '\u641C\u7D22\u73B0\u6709\u672C\u5730\u6587\u4EF6\u6216\u7B14\u8BB0\u6587\u6863'} onFocus={() => setOpen(true)} onChange={event => { setQuery(event.target.value); setOpen(true) }} onKeyDown={event => { if (event.key === 'Escape') setOpen(false) }} /></label>\n <small id={hint} className=\"dsh-partner-concern-compose-hint\">\u7559\u7A7A\uFF1A\u89C2\u5BDF\u7ED3\u679C\u4FDD\u5B58\u5728\u4F19\u4F34\u5185\u90E8\u8BB0\u5F55\uFF0C\u4E0D\u521B\u5EFA\u6587\u6863\u3002\u9009\u62E9\u540E\uFF1A\u53E6\u5916\u6574\u7406\u5230\u6B64\u6587\u4EF6\u6216\u7B14\u8BB0\uFF1B\u68C0\u67E5\u4F9D\u636E\u59CB\u7EC8\u53EA\u8BFB\u3002</small>\n {value && <p className=\"dsh-partner-record-selection\">\u5DF2\u9009\u62E9\uFF1A{value.label}<button type=\"button\" onClick={() => { onChange(undefined); setQuery('') }}>\u53D6\u6D88\u8BB0\u5F55</button></p>}\n {open && <div className=\"dsh-partner-record-options\" aria-label=\"\u53EF\u9009\u8BB0\u5F55\u4F4D\u7F6E\">\n {loading ? <p role=\"status\">\u6B63\u5728\u67E5\u627E\u2026</p> : error ? <p role=\"alert\">{error}</p> : items.length === 0 ? <p>\u6CA1\u6709\u53EF\u7528\u4F4D\u7F6E\uFF0C\u8BF7\u5148\u521B\u5EFA\u6587\u4EF6\u6216\u7B14\u8BB0\u3002</p> : items.map(item => <button type=\"button\" key={`${item.kind}:${item.locator}`} aria-pressed={value?.kind === item.kind && value.locator === item.locator} onClick={() => { onChange(item); setQuery(''); setOpen(false) }}><small>{item.kind === 'file' ? '\u672C\u5730\u6587\u4EF6' : '\u7B14\u8BB0\u6587\u6863'}</small><span>{item.label}</span></button>)}\n <button type=\"button\" onClick={() => setOpen(false)}>\u6536\u8D77\u5019\u9009</button>\n </div>}\n </section>\n}\n", "import type {ConcernRecordTargetView} from '../../client-api.js'\nimport {RecordTargetPicker} from './record-target-picker.js'\n\n/** Shared by creation and editing, so recording semantics stay consistent. */\nexport function ConcernRecordFields({companionId, reason, onReason, target, onTarget}: {\n companionId: string; reason: string; onReason(value: string): void\n target: ConcernRecordTargetView | undefined; onTarget(value?: ConcernRecordTargetView): void\n}) {\n return <>\n <label><span>\u6267\u884C\u8BF4\u660E\u4E0E\u8BB0\u5F55\u683C\u5F0F</span><textarea rows={5} value={reason} maxLength={800} onChange={event => onReason(event.target.value)} placeholder=\"\u4F8B\u5982\uFF1A\u6309\u7167\u5173\u8054\u6587\u6863\u68C0\u67E5\uFF1B\u7ED3\u679C\u6309\u65E5\u671F\u6574\u7406\u6210\u8868\u683C\uFF0C\u66F4\u65B0\u5BF9\u5E94\u6761\u76EE\uFF0C\u4FDD\u7559\u4EBA\u5DE5\u5907\u6CE8\u3002\" /><small>\u8BF4\u660E\u5982\u4F55\u68C0\u67E5\u3001\u4F55\u65F6\u63D0\u9192\uFF0C\u4EE5\u53CA\u7ED3\u679C\u5982\u4F55\u6574\u7406\u3002\u53EF\u7559\u7A7A\uFF0C\u6700\u591A 800 \u5B57\u3002</small></label>\n <RecordTargetPicker companionId={companionId} value={target} onChange={onTarget} />\n </>\n}\n", "import { useEffect, useRef, useState, type ChangeEvent } from 'react'\nimport { IconAgentPresetOutline16, IconCheckOutline14, IconPlusOutline16, IconRefreshOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { WorkspaceBlock, WorkspaceHero, WorkspaceNotice, errorMessage } from '../ui/workspace-components.js'\nimport { DEFAULT_PENDANT_SETTINGS, normalizePendantSettings, samePendantSettings, type StrapMaterial, type PendantFps, type CardImageFit } from './settings.js'\nimport { savePendantSettings, usePendantSettings } from './use-settings.js'\nimport { prepareCardImage } from './card-image.js'\nimport { StrapPreview } from './strap-preview.js'\n\nconst MATERIALS: Array<{ id: StrapMaterial; name: string; detail: string }> = [\n { id: 'woven', name: '\u7EC7\u5E26', detail: '\u7EC6\u5BC6\u7EC7\u7EB9' }, { id: 'braided', name: '\u7F16\u7EC7\u7EF3', detail: '\u5706\u6DA6\u7EF3\u80A1' }, { id: 'leather', name: '\u76AE\u9769', detail: '\u5E73\u6574\u7F1D\u7EBF' },\n]\nconst FRAME_RATES: Array<{ fps: PendantFps; label: string }> = [{ fps: 24, label: '\u7701\u7535' }, { fps: 30, label: '\u5747\u8861' }, { fps: 60, label: '\u6D41\u7545' }]\nconst IMAGE_FITS: Array<{ fit: CardImageFit; label: string; detail: string }> = [{ fit: 'contain', label: '\u5B8C\u6574\u663E\u793A', detail: '\u81EA\u9002\u5E94 \u00B7 \u4E0D\u88C1\u5207' }, { fit: 'cover', label: '\u94FA\u6EE1\u88C1\u5207', detail: '\u5C45\u4E2D \u00B7 \u65E0\u7559\u767D' }]\nconst COLORS = ['#617e73', '#46515b', '#b7afa0', '#997365', '#647c98', '#807388']\n\nexport function PendantSettingsPanel(): JSX.Element {\n const settings = usePendantSettings(), [draft, setDraft] = useState(() => ({ ...settings }))\n const [error, setError] = useState(''), [saved, setSaved] = useState(false), [processing, setProcessing] = useState(false)\n const file = useRef<HTMLInputElement>(null), epoch = useRef(0)\n const strapFile = useRef<HTMLInputElement>(null)\n const previous = useRef(settings)\n useEffect(() => {\n const before = previous.current\n previous.current = settings\n // Follow other tabs when clean; never discard a local edit or pending image.\n setDraft(value => samePendantSettings(value, before) ? { ...settings } : value)\n }, [settings])\n useEffect(() => () => { epoch.current++ }, [])\n const update = (patch: Partial<typeof draft>): void => { setDraft(value => ({ ...value, ...patch })); setSaved(false); setError('') }\n const validColor = /^#[0-9a-f]{6}$/i.test(draft.color)\n const previewColor = validColor ? draft.color : DEFAULT_PENDANT_SETTINGS.color\n const dirty = !samePendantSettings(draft, settings)\n const upload = async (event: ChangeEvent<HTMLInputElement>, target: 'image' | 'strapImage' = 'image'): Promise<void> => {\n const selected = event.currentTarget.files?.[0]; event.currentTarget.value = ''\n if (!selected) return\n const request = ++epoch.current\n setProcessing(true); setError(''); setSaved(false)\n try { const image = await prepareCardImage(selected, target === 'strapImage' ? 256 : 1536); if (request === epoch.current) update({ [target]: image }) }\n catch (reason) { if (request === epoch.current) setError(errorMessage(reason)) }\n finally { if (request === epoch.current) setProcessing(false) }\n }\n const save = (): void => {\n if (!validColor) { setError('\u7EF3\u5B50\u989C\u8272\u5E94\u4E3A\u516D\u4F4D\u5341\u516D\u8FDB\u5236\u989C\u8272\uFF0C\u4F8B\u5982 #617e73\u3002'); return }\n try { savePendantSettings(draft); setDraft(normalizePendantSettings(draft)); setSaved(true); setError('') }\n catch (reason) { setError(errorMessage(reason)) }\n }\n return <div className=\"dsh-partner-feature-page dsh-partner-pendant-settings\">\n <WorkspaceHero eyebrow=\"PERSONAL TOUCH\" title=\"\u5361\u7247\u8BBE\u7F6E\" detail=\"\u8BA9\u6302\u9970\u6709\u81EA\u5DF1\u7684\u6837\u5B50\u3002\u5916\u89C2\u4EC5\u4FDD\u5B58\u5728\u5F53\u524D\u6D4F\u89C8\u5668\uFF0C\u4E0D\u5F71\u54CD\u4F19\u4F34\u6267\u884C\u548C\u6E20\u9053\u901A\u77E5\u3002\" actions={<button type=\"button\" disabled={!dirty || processing} onClick={save}><IconCheckOutline14 size={15} />\u4FDD\u5B58\u8BBE\u7F6E</button>} />\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {saved && <WorkspaceNotice kind=\"success\">\u5DF2\u4FDD\u5B58\uFF0C\u6302\u9970\u5DF2\u66F4\u65B0\u3002</WorkspaceNotice>}\n <div className=\"dsh-partner-pendant-settings-layout\">\n <div className=\"dsh-partner-pendant-settings-fields\">\n <WorkspaceBlock title=\"\u4E3B\u754C\u9762\u6302\u9970\" detail=\"\u5173\u95ED\u540E\u505C\u6B62\u6302\u9970\u6E32\u67D3\u4E0E\u6D88\u606F\u8F6E\u8BE2\uFF0C\u968F\u65F6\u53EF\u4EE5\u91CD\u65B0\u5F00\u542F\u3002\" actions={<button type=\"button\" className=\"dsh-partner-feature-switch\" data-on={draft.enabled} role=\"switch\" aria-label=\"\u663E\u793A\u5361\u7247\u6302\u9970\" aria-checked={draft.enabled} onClick={() => update({ enabled: !draft.enabled })}><i /></button>}><p className=\"dsh-partner-pendant-setting-hint\">\u6D88\u606F\u4FDD\u7559\u5728\u5361\u7247\u5185\u4FA7\uFF1B\u6B63\u9762\u5C55\u793A\u56FE\u6848\uFF0C\u65B0\u6D88\u606F\u5230\u8FBE\u65F6\u8F7B\u6446\u3001\u8F6C\u6B63\u5E76\u95EA\u5149\u3002</p>\n <div className=\"dsh-partner-pendant-fps-row\"><span>\u5E27\u7387\u4E0A\u9650</span><div className=\"dsh-partner-pendant-options\" role=\"group\" aria-label=\"\u6302\u9970\u5E27\u7387\">{FRAME_RATES.map(item => <button key={item.fps} type=\"button\" aria-pressed={draft.fps === item.fps} onClick={() => update({ fps: item.fps })}><strong>{item.fps} FPS</strong><small>{item.label}</small></button>)}</div><small>\u4EC5\u5F71\u54CD\u52A8\u753B\u7ED8\u5236\uFF0C\u5B9E\u9645\u5E27\u7387\u53D6\u51B3\u4E8E\u8BBE\u5907\uFF1B\u9759\u6B62\u65F6\u81EA\u52A8\u4F11\u7720\u3002</small></div>\n </WorkspaceBlock>\n <WorkspaceBlock title=\"\u7EF3\u5B50\u5916\u89C2\" detail=\"\u6750\u8D28\u53EA\u6539\u53D8\u5916\u89C2\uFF0C\u4FDD\u7559\u5F53\u524D\u7684\u62C9\u4F38\u4E0E\u56DE\u5F39\u624B\u611F\u3002\">\n <label className=\"dsh-partner-pendant-length\"><span>\u7EF3\u5B50\u957F\u5EA6 <output>{draft.strapLength}%</output></span><input type=\"range\" min=\"60\" max=\"160\" step=\"5\" aria-label=\"\u7EF3\u5B50\u957F\u5EA6\" value={draft.strapLength} onChange={event => update({ strapLength: Number(event.target.value) })} /><small>60% \u77ED\u7EF3 \u2014 100% \u9ED8\u8BA4 \u2014 160% \u957F\u7EF3\uFF1B\u4FDD\u5B58\u540E\u8C03\u6574\u5B9E\u9645\u60AC\u6302\u957F\u5EA6\u3002</small></label>\n <div className=\"dsh-partner-pendant-materials\" role=\"group\" aria-label=\"\u7EF3\u5B50\u6750\u8D28\">{MATERIALS.map(item => <button key={item.id} type=\"button\" aria-pressed={draft.material === item.id} onClick={() => update({ material: item.id })}><StrapPreview material={item.id} color={previewColor} swatch /><strong>{item.name}</strong><small>{item.detail}</small>{draft.material === item.id && <IconCheckOutline14 size={14} />}</button>)}</div>\n <div className=\"dsh-partner-pendant-color-row\"><span>\u7EF3\u5B50\u989C\u8272</span><div className=\"dsh-partner-pendant-swatches\" role=\"group\" aria-label=\"\u9884\u8BBE\u7EF3\u5B50\u989C\u8272\">{COLORS.map(color => <button key={color} type=\"button\" aria-label={`\u7EF3\u5B50\u989C\u8272 ${color}`} aria-pressed={draft.color.toLowerCase() === color} onClick={() => update({ color })}><i style={{ backgroundColor: color }} />{draft.color.toLowerCase() === color && <IconCheckOutline14 size={12} />}</button>)}</div><label className=\"dsh-partner-pendant-hex\"><span className=\"dsh-partner-pendant-sr\">\u81EA\u5B9A\u4E49\u7EF3\u5B50\u989C\u8272</span><input aria-label=\"\u81EA\u5B9A\u4E49\u7EF3\u5B50\u989C\u8272\" aria-invalid={!validColor} value={draft.color} maxLength={7} spellCheck={false} onChange={event => update({ color: event.target.value })} /></label></div>\n {!validColor && <p className=\"dsh-partner-pendant-color-error\">\u8BF7\u8F93\u5165 # \u5F00\u5934\u7684\u516D\u4F4D\u989C\u8272\u503C\u3002</p>}\n <input ref={strapFile} type=\"file\" accept=\"image/png,image/jpeg,image/webp\" hidden aria-label=\"\u4E0A\u4F20\u7EF3\u5B50\u7EB9\u7406\" onChange={event => { void upload(event, 'strapImage') }} />\n <div className=\"dsh-partner-pendant-image-actions\"><button type=\"button\" disabled={processing} onClick={() => strapFile.current?.click()}><IconPlusOutline16 size={15} />{draft.strapImage ? '\u66F4\u6362\u7EF3\u5B50\u7EB9\u7406' : '\u81EA\u5B9A\u4E49\u7EF3\u5B50\u7EB9\u7406'}</button><button type=\"button\" disabled={processing || !draft.strapImage} onClick={() => update({ strapImage: '' })}>\u79FB\u9664\u7EB9\u7406</button></div>\n <p className=\"dsh-partner-pendant-setting-hint\">\u7EB9\u7406\u6CBF\u7EF3\u5B50\u91CD\u590D\u8D34\u5408\uFF0C\u8DDF\u968F\u79FB\u52A8\u3001\u5F2F\u66F2\u548C\u62C9\u4F38\uFF1B\u5EFA\u8BAE\u4F7F\u7528\u65E0\u7F1D\u56FE\u6848\uFF0C\u4FDD\u7559\u6240\u9009\u6750\u8D28\u7684\u8FB9\u7F18\u548C\u7F16\u7EC7\u7EC6\u8282\u3002</p>\n </WorkspaceBlock>\n <WorkspaceBlock title=\"\u6B63\u9762\u56FE\u6848\" detail=\"\u652F\u6301 PNG\u3001JPEG\u3001WebP\uFF0C\u6700\u5927 5 MB\u3002\u4FDD\u7559\u56FE\u7247\u6BD4\u4F8B\uFF0C\u53EA\u5728\u672C\u673A\u5904\u7406\u3002\">\n <input ref={file} type=\"file\" accept=\"image/png,image/jpeg,image/webp\" hidden aria-label=\"\u4E0A\u4F20\u5361\u7247\u56FE\u7247\" onChange={event => { void upload(event) }} />\n <div className=\"dsh-partner-pendant-image-actions\"><button type=\"button\" disabled={processing} onClick={() => file.current?.click()}><IconPlusOutline16 size={15} />{processing ? '\u6B63\u5728\u5904\u7406\u2026' : draft.image ? '\u66F4\u6362\u56FE\u7247' : '\u9009\u62E9\u56FE\u7247'}</button><button type=\"button\" disabled={!draft.image || processing} onClick={() => update({ image: '' })}><IconRefreshOutline16 size={15} />\u6062\u590D\u9ED8\u8BA4\u56FE\u6848</button></div>\n <div className=\"dsh-partner-pendant-options\" data-columns=\"2\" role=\"group\" aria-label=\"\u56FE\u7247\u9002\u5E94\u65B9\u5F0F\">{IMAGE_FITS.map(item => <button key={item.fit} type=\"button\" disabled={processing} aria-pressed={draft.imageFit === item.fit} onClick={() => update({ imageFit: item.fit })}><strong>{item.label}</strong><small>{item.detail}</small></button>)}</div>\n <p className=\"dsh-partner-pendant-setting-hint\">\u5B8C\u6574\u663E\u793A\u4F1A\u6309\u6BD4\u4F8B\u7F29\u653E\uFF0C\u7A7A\u4F59\u90E8\u5206\u4F7F\u7528\u5361\u9762\u5E95\u8272\uFF1B\u94FA\u6EE1\u4F1A\u88C1\u5207\u8FB9\u7F18\uFF0C\u4E0D\u62C9\u4F38\u56FE\u7247\u3002\u65E7\u7248\u5DF2\u88C1\u5207\u7684\u56FE\u7247\u9700\u91CD\u65B0\u4E0A\u4F20\u624D\u80FD\u6062\u590D\u5B8C\u6574\u5185\u5BB9\u3002</p>\n <label className=\"dsh-partner-pendant-length\"><span>\u5361\u7247\u6E05\u6670\u5EA6 <output>{draft.quality}%</output></span><input type=\"range\" min=\"0\" max=\"100\" step=\"5\" value={draft.quality} aria-label=\"\u5361\u7247\u6E05\u6670\u5EA6\" onChange={event => update({ quality: Number(event.target.value) })} /><small>0% \u6807\u51C6\u3001\u7701\u8D44\u6E90 \u2014 100% \u9AD8\u6E05\uFF1B\u4FDD\u5B58\u540E\u751F\u6548\uFF0C\u4E0D\u6539\u53D8\u5E27\u7387\u4E0A\u9650\u3002</small></label>\n <p className=\"dsh-partner-pendant-setting-hint\">\u56FE\u6848\u4F18\u5148\u65E0\u635F\u4FDD\u5B58\uFF0C\u6700\u957F\u8FB9\u4FDD\u7559\u81F3 1536 \u50CF\u7D20\u3002\u5DF2\u538B\u7F29\u7684\u65E7\u56FE\u7247\u5EFA\u8BAE\u91CD\u65B0\u4E0A\u4F20\uFF1B\u9AD8\u6E05\u65E0\u6CD5\u6062\u590D\u539F\u56FE\u7F3A\u5931\u7684\u7EC6\u8282\u3002</p>\n </WorkspaceBlock>\n <div className=\"dsh-partner-pendant-settings-footer\"><button type=\"button\" disabled={processing} onClick={() => update({ ...DEFAULT_PENDANT_SETTINGS })}>\u91CD\u7F6E\u4E3A\u9ED8\u8BA4</button><small>{dirty ? '\u6709\u672A\u4FDD\u5B58\u7684\u66F4\u6539' : '\u8BBE\u7F6E\u5DF2\u540C\u6B65\u5230\u5F53\u524D\u6D4F\u89C8\u5668'}</small></div>\n </div>\n <aside className=\"dsh-partner-pendant-preview\" aria-label=\"\u5361\u7247\u5916\u89C2\u9884\u89C8\"><header><strong>\u5916\u89C2\u9884\u89C8</strong><small>{draft.enabled ? '\u4FDD\u5B58\u540E\u5E94\u7528\u5230\u4E3B\u754C\u9762' : '\u6302\u9970\u5C06\u9690\u85CF\uFF0C\u8BBE\u7F6E\u4ECD\u4F1A\u4FDD\u7559'}</small></header><div className=\"dsh-partner-pendant-preview-stage\"><StrapPreview material={draft.material} color={previewColor} image={draft.strapImage} length={draft.strapLength} /><div className=\"dsh-partner-pendant-preview-card\">{draft.image ? <img src={draft.image} style={{ objectFit: draft.imageFit }} alt=\"\u81EA\u5B9A\u4E49\u5361\u7247\u6B63\u9762\u9884\u89C8\" /> : <span><IconAgentPresetOutline16 size={38} /><strong>WITH YOU</strong><small>\u9ED8\u8BA4\u4F19\u4F34\u56FE\u6848</small></span>}</div></div><p>\u6B63\u9762 \u00B7 \u56FE\u6848<br /><small>\u5185\u4FA7 \u00B7 \u4F19\u4F34\u6D88\u606F</small></p></aside>\n </div>\n </div>\n}\n", "export type StrapMaterial = 'woven' | 'braided' | 'leather'\nexport type PendantFps = 24 | 30 | 60\nexport type CardImageFit = 'contain' | 'cover'\nexport interface PendantSettings { enabled: boolean; fps: PendantFps; material: StrapMaterial; color: string; image: string; imageFit: CardImageFit; strapLength: number; strapImage: string; quality: number }\nexport const PENDANT_SETTINGS_KEY = 'dsh-partner:pendant-settings:v1'\nexport const DEFAULT_PENDANT_SETTINGS: Readonly<PendantSettings> = Object.freeze({ enabled: true, fps: 30, material: 'woven', color: '#617e73', image: '', imageFit: 'contain', strapLength: 100, strapImage: '', quality: 100 })\nexport const MAX_CARD_IMAGE_LENGTH = 700_000\n\nexport function samePendantSettings(a: PendantSettings, b: PendantSettings): boolean {\n return a.enabled === b.enabled && a.fps === b.fps && a.material === b.material && a.color === b.color && a.image === b.image && a.imageFit === b.imageFit && a.strapLength === b.strapLength && a.strapImage === b.strapImage && a.quality === b.quality\n}\n\nexport function normalizeStrapLength(value: unknown): number { return typeof value === 'number' && Number.isFinite(value) ? Math.max(60, Math.min(160, Math.round(value))) : 100 }\nexport function normalizeCardQuality(value: unknown): number { return value === 'standard' ? 0 : typeof value === 'number' && Number.isFinite(value) ? Math.max(0, Math.min(100, Math.round(value))) : 100 }\nfunction safeImage(value: unknown): string { return typeof value === 'string' && value.length <= MAX_CARD_IMAGE_LENGTH && /^data:image\\/(jpeg|png|webp);base64,[a-z0-9+/]+={0,2}$/i.test(value) ? value : '' }\n\nexport function normalizePendantFps(value: unknown): PendantFps { return value === 24 || value === 60 ? value : 30 }\n\nexport function normalizePendantSettings(value: unknown): PendantSettings {\n const input = value && typeof value === 'object' ? value as Partial<PendantSettings> : {}\n return {\n enabled: typeof input.enabled === 'boolean' ? input.enabled : true,\n fps: normalizePendantFps(input.fps),\n strapLength: normalizeStrapLength(input.strapLength),\n strapImage: safeImage(input.strapImage),\n quality: normalizeCardQuality(input.quality),\n imageFit: input.imageFit === 'cover' ? 'cover' : 'contain',\n material: input.material === 'braided' || input.material === 'leather' ? input.material : 'woven',\n color: typeof input.color === 'string' && /^#[0-9a-f]{6}$/i.test(input.color) ? input.color.toLowerCase() : DEFAULT_PENDANT_SETTINGS.color,\n image: safeImage(input.image),\n }\n}\n", "import { useSyncExternalStore } from 'react'\nimport { DEFAULT_PENDANT_SETTINGS, normalizePendantSettings, PENDANT_SETTINGS_KEY, type PendantSettings } from './settings.js'\n\nlet current: PendantSettings | undefined\nconst listeners = new Set<() => void>()\nfunction load(): PendantSettings {\n try { return normalizePendantSettings(JSON.parse(localStorage.getItem(PENDANT_SETTINGS_KEY) ?? 'null')) }\n catch { return { ...DEFAULT_PENDANT_SETTINGS } }\n}\nfunction changed(): void { for (const listener of listeners) listener() }\nfunction storage(event: StorageEvent): void {\n if (event.key !== null && event.key !== PENDANT_SETTINGS_KEY) return\n current = load(); changed()\n}\nfunction subscribe(listener: () => void): () => void {\n if (!listeners.size) { current = load(); window.addEventListener('storage', storage) }\n listeners.add(listener)\n return () => { listeners.delete(listener); if (!listeners.size) window.removeEventListener('storage', storage) }\n}\nexport function usePendantSettings(): PendantSettings {\n return useSyncExternalStore(subscribe, () => current ??= load(), () => DEFAULT_PENDANT_SETTINGS)\n}\nexport function savePendantSettings(settings: PendantSettings): void {\n const next = normalizePendantSettings(settings)\n try { localStorage.setItem(PENDANT_SETTINGS_KEY, JSON.stringify(next)) }\n catch { throw new Error('\u65E0\u6CD5\u4FDD\u5B58\u5361\u7247\u8BBE\u7F6E\uFF0C\u8BF7\u68C0\u67E5\u6D4F\u89C8\u5668\u5B58\u50A8\u6743\u9650\u6216\u5269\u4F59\u7A7A\u95F4\u3002\u539F\u8BBE\u7F6E\u672A\u66F4\u6539\u3002') }\n current = next; changed()\n}\n", "import { MAX_CARD_IMAGE_LENGTH, type CardImageFit } from './settings.js'\n\nexport const CARD_IMAGE_BACKGROUND = '#253235'\n\n/** Keep aspect ratio in both modes; only cover may extend beyond the face. */\nexport function cardImageRect(width: number, height: number, targetWidth: number, targetHeight: number, fit: CardImageFit) {\n if (![width, height, targetWidth, targetHeight].every(value => Number.isFinite(value) && value > 0)) throw new Error('\u56FE\u7247\u5C3A\u5BF8\u65E0\u6548\u3002')\n const scale = (fit === 'cover' ? Math.max : Math.min)(targetWidth / width, targetHeight / height)\n return { x: (targetWidth - width * scale) / 2, y: (targetHeight - height * scale) / 2, width: width * scale, height: height * scale }\n}\n\nexport function drawCardImage(canvas: HTMLCanvasElement, image: HTMLImageElement, fit: CardImageFit): void {\n const context = canvas.getContext('2d')\n if (!context) throw new Error('\u5F53\u524D\u6D4F\u89C8\u5668\u65E0\u6CD5\u5904\u7406\u56FE\u7247\u3002')\n const rect = cardImageRect(image.naturalWidth, image.naturalHeight, canvas.width, canvas.height, fit)\n context.fillStyle = CARD_IMAGE_BACKGROUND\n context.imageSmoothingEnabled = true\n context.imageSmoothingQuality = 'high'\n context.fillRect(0, 0, canvas.width, canvas.height)\n context.drawImage(image, rect.x, rect.y, rect.width, rect.height)\n}\n\nexport function loadCardImage(source: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image()\n image.onload = () => { image.onload = image.onerror = null; resolve(image) }\n image.onerror = () => { image.onload = image.onerror = null; reject(new Error('\u56FE\u7247\u65E0\u6CD5\u89E3\u7801\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9 PNG\u3001JPEG \u6216 WebP \u56FE\u7247\u3002')) }\n image.src = source\n })\n}\n\n/** Persist a bounded source with its aspect ratio intact, so fitting remains\n * reversible. No remote URLs, SVG execution, server upload or full-size GPU textures.\n */\nexport async function prepareCardImage(file: File, maxDimension = 1536): Promise<string> {\n if (!['image/png', 'image/jpeg', 'image/webp'].includes(file.type)) throw new Error('\u8BF7\u9009\u62E9 PNG\u3001JPEG \u6216 WebP \u56FE\u7247\u3002')\n if (file.size > 5 * 1024 * 1024) throw new Error('\u56FE\u7247\u4E0D\u80FD\u8D85\u8FC7 5 MB\u3002')\n const url = URL.createObjectURL(file)\n try {\n const image = await loadCardImage(url)\n if (!image.naturalWidth || !image.naturalHeight || image.naturalWidth * image.naturalHeight > 25_000_000) throw new Error('\u56FE\u7247\u5206\u8FA8\u7387\u8FC7\u5927\uFF0C\u8BF7\u7F29\u5C0F\u81F3 2500 \u4E07\u50CF\u7D20\u4EE5\u5185\u3002')\n const scale = Math.min(1, maxDimension / Math.max(image.naturalWidth, image.naturalHeight))\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(image.naturalWidth * scale))\n canvas.height = Math.max(1, Math.round(image.naturalHeight * scale))\n const context = canvas.getContext('2d')\n if (!context) throw new Error('\u5F53\u524D\u6D4F\u89C8\u5668\u65E0\u6CD5\u5904\u7406\u56FE\u7247\u3002')\n context.imageSmoothingQuality = 'high'\n context.fillStyle = CARD_IMAGE_BACKGROUND; context.fillRect(0, 0, canvas.width, canvas.height)\n context.drawImage(image, 0, 0, canvas.width, canvas.height)\n // Prefer lossless for text/illustrations; bounded high-quality compression\n // for photos avoids silently consuming the browser's storage quota.\n const png = canvas.toDataURL('image/png')\n if (png.length <= MAX_CARD_IMAGE_LENGTH) return png\n for (const quality of [.94, .88, .8]) {\n const result = canvas.toDataURL('image/webp', quality)\n if (result.length <= MAX_CARD_IMAGE_LENGTH) return result\n }\n throw new Error('\u56FE\u7247\u538B\u7F29\u540E\u4ECD\u7136\u8FC7\u5927\uFF0C\u8BF7\u7F29\u5C0F\u56FE\u7247\u6216\u4F7F\u7528\u66F4\u7B80\u6D01\u7684\u56FE\u6848\u3002')\n } finally { URL.revokeObjectURL(url) }\n}\n", "import { Fragment, useId, useMemo } from 'react'\nimport type { PendantSettings } from './settings.js'\nimport { strapGeometry } from './strap-geometry.js'\nimport { STRAP_TEXTURE_SEGMENTS, strapTextureTransform } from './strap-texture.js'\n\nexport function StrapPreview({ material, color, swatch = false, image = '', length = 100 }: Pick<PendantSettings, 'material' | 'color'> & { swatch?: boolean; image?: string; length?: number }): JSX.Element {\n const id = useId().replace(/:/g, '')\n const points = useMemo(() => Array.from({ length: STRAP_TEXTURE_SEGMENTS + 1 }, (_, i) => swatch ? { x: 8 + 104 * i / STRAP_TEXTURE_SEGMENTS, y: 20 } : { x: 50, y: 6 + 121 * i / STRAP_TEXTURE_SEGMENTS }), [swatch])\n const layers = useMemo(() => strapGeometry(swatch ? [{ x: 8, y: 20 }, { x: 112, y: 20 }] : [{ x: 50, y: 6 }, { x: 50, y: 127 }], { material, color }, swatch ? 100 : 72), [material, color, swatch])\n return <svg className={swatch ? 'dsh-partner-strap-swatch' : undefined} style={swatch ? undefined : { height: `${130 * length / 100}px` }} viewBox={swatch ? '0 0 120 40' : '0 0 100 130'} preserveAspectRatio=\"none\" aria-hidden=\"true\">\n {image && <defs><pattern id={id} patternUnits=\"userSpaceOnUse\" width=\"1\" height=\"4\"><image href={image} width=\"1\" height=\"4\" preserveAspectRatio=\"none\" /></pattern></defs>}\n {layers.map(layer => <Fragment key={layer.id}><path d={layer.d} fill=\"none\" stroke={layer.stroke} strokeWidth={layer.width} opacity={layer.opacity} strokeLinecap=\"round\" strokeLinejoin=\"round\" />{image && layer.id === 'surface' && points.slice(0, -1).map((p, i) => <rect key={i} x=\"0\" y={i - .005} width=\"1\" height=\"1.01\" fill={`url(#${id})`} transform={strapTextureTransform(p, points[i + 1]!, layer.width, i)} />)}</Fragment>)}\n {!swatch && <rect x=\"42\" y=\"3\" width=\"16\" height=\"6\" rx=\"3\" fill=\"#c3ced0\" />}\n </svg>\n}\n", "import type { PendantSettings } from './settings.js'\n\nfunction mix(color: string, target: number, amount: number): string {\n const channels = [1, 3, 5].map(offset => Math.round(parseInt(color.slice(offset, offset + 2), 16) * (1 - amount) + target * amount))\n return '#' + channels.map(value => value.toString(16).padStart(2, '0')).join('')\n}\n\n/** World-unit width and color-relative textile lighting. */\nexport function strapStyle({ color, material }: Pick<PendantSettings, 'color' | 'material'>) {\n return {\n width: { woven: .17, braided: .145, leather: .195 }[material],\n band: color, edge: mix(color, 0, .52), shade: mix(color, 0, .3),\n light: mix(color, 255, .48), thread: mix(color, 255, .72),\n }\n}\n", "import type { PendantSettings } from './settings.js'\nimport { strapStyle } from './strap-style.js'\n\nexport interface StrapPoint { x: number; y: number }\nexport interface StrapLayer { id: string; d: string; stroke: string; width: number; opacity: number }\nconst point = (p: StrapPoint): string => p.x.toFixed(2) + ' ' + p.y.toFixed(2)\n\n/** Shared live/preview geometry. Texture follows arc distance/tangent, not\n * screen axes. At most 256 samples / 8 paths, no filters or per-thread nodes.\n */\nexport function strapGeometry(points: readonly StrapPoint[], settings: Pick<PendantSettings, 'material' | 'color'>, scale: number): StrapLayer[] {\n if (points.length < 2 || !Number.isFinite(scale) || scale <= 0 || points.some(p => !Number.isFinite(p.x) || !Number.isFinite(p.y))) return []\n const style = strapStyle(settings), width = style.width * scale\n const lengths = [0]\n for (let i = 1; i < points.length; i++) lengths.push(lengths[i - 1]! + Math.hypot(points[i]!.x - points[i - 1]!.x, points[i]!.y - points[i - 1]!.y))\n const total = lengths.at(-1)!\n if (total < .01) return []\n const count = Math.min(256, Math.max(2, Math.ceil(total / Math.max(1.5, width * .18))))\n let segment = 1\n const samples = Array.from({ length: count + 1 }, (_, i) => {\n const distance = total * i / count\n while (segment < points.length - 1 && lengths[segment]! < distance) segment++\n const a = points[segment - 1]!, b = points[segment]!, length = lengths[segment]! - lengths[segment - 1]!\n const t = length > 0 ? (distance - lengths[segment - 1]!) / length : 0\n return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t, nx: length ? -(b.y - a.y) / length : 1, ny: length ? (b.x - a.x) / length : 0, distance }\n })\n const at = (i: number, offset: number): StrapPoint => { const p = samples[i]!; return { x: p.x + p.nx * offset, y: p.y + p.ny * offset } }\n const line = (offset: number | ((distance: number) => number)): string => samples.map((p, i) => (i ? 'L' : 'M') + point(at(i, typeof offset === 'number' ? offset : offset(p.distance)))).join('')\n const layers: StrapLayer[] = []\n const add = (id: string, d: string, stroke: string, thickness: number, opacity = 1): void => { layers.push({ id, d, stroke, width: thickness, opacity }) }\n add('edge', line(0), style.edge, width)\n add('surface', line(0), style.band, width * .84)\n if (settings.material === 'woven') {\n add('selvedge', line(-width * .36) + line(width * .36), style.light, width * .065, .85)\n add('warp', line(-width * .15) + line(width * .15), style.shade, width * .075, .7)\n let ribs = ''\n for (let i = 1; i < count; i += 2) ribs += 'M' + point(at(i, -width * .3)) + 'L' + point(at(i, width * .3))\n add('weft', ribs, style.thread, Math.max(.55, width * .07), .6)\n } else if (settings.material === 'leather') {\n add('rolled-edge', line(-width * .37), style.light, width * .09, .75)\n add('polish', line(-width * .11), style.light, width * .22, .16)\n let stitches = ''\n for (let i = 1; i < count - 1; i += 4) for (const side of [-1, 1]) stitches += 'M' + point(at(i, side * width * .28)) + 'L' + point(at(i + 1, side * width * .28))\n add('seam-shadow', stitches, style.edge, width * .16, .85)\n add('double-stitch', stitches, style.thread, Math.max(.65, width * .085))\n } else {\n const pitch = width * 1.2\n const wave = (distance: number): number => Math.sin(distance / pitch * Math.PI * 2) * width * .27\n const left = line(wave), right = line(distance => -wave(distance))\n add('strand-grooves', left + right, style.edge, width * .42)\n add('strand-body', left + right, style.light, width * .27, .8)\n let over = '', lit = ''\n for (let i = 0; i < count; i++) {\n const s = samples[i]!, end = samples[i + 1]!\n const sign = Math.cos((s.distance + end.distance) / 2 / pitch * Math.PI * 2) >= 0 ? 1 : -1\n const a = wave(s.distance) * sign, b = wave(end.distance) * sign\n over += 'M' + point(at(i, a)) + 'L' + point(at(i + 1, b))\n lit += 'M' + point(at(i, a - width * .055)) + 'L' + point(at(i + 1, b - width * .055))\n }\n add('overpass', over, style.band, width * .25)\n add('strand-sheen', lit, style.thread, width * .095, .95)\n }\n return layers\n}\n", "import type { StrapPoint } from './strap-geometry.js'\n\nexport const STRAP_TEXTURE_SEGMENTS = 48\n\n/** Material coordinates stay attached to a fixed curve sample, never the viewport. */\nexport function strapTextureTransform(a: StrapPoint, b: StrapPoint, width: number, index: number): string {\n const dx = b.x - a.x, dy = b.y - a.y, distance = Math.hypot(dx, dy)\n const nx = distance > .0001 ? -dy / distance * width : width\n const ny = distance > .0001 ? dx / distance * width : 0\n return `matrix(${nx} ${ny} ${dx} ${dy} ${a.x - nx / 2 - dx * index} ${a.y - ny / 2 - dy * index})`\n}\n", "import { useCallback, useEffect, useRef, useState } from 'react'\nimport { PARTNER_API } from '../client-api.js'\nimport type { PartnerNotice } from '../notifications/domain.js'\nimport type { PartnerController } from '../client-controller.js'\nimport type { BadgeMessage, LanyardHandle, LanyardOptions } from './renderer.js'\nimport { usePartnerInbox } from './use-inbox.js'\nimport { usePendantPlacement } from './use-placement.js'\nimport { PendantReader } from './reader.js'\nimport { usePendantSettings } from './use-settings.js'\nimport type { PendantSettings } from './settings.js'\n\nfunction messageLabel(notice: PartnerNotice): string {\n if (notice.kind === 'reply') return '\u6709\u65B0\u56DE\u590D'\n if (notice.kind === 'task' && notice.title.startsWith('\u9047\u5230\u963B\u585E \u00B7 ')) return '\u4EFB\u52A1\u53D7\u963B'\n if (notice.kind === 'schedule' && notice.title.startsWith('\u672A\u5B8C\u6210 \u00B7 ')) return '\u5C1A\u672A\u5B8C\u6210'\n return notice.kind === 'task' ? '\u4EFB\u52A1\u5B8C\u6210' : '\u5B9A\u65F6\u5B8C\u6210'\n}\n\nexport function PartnerPendant({ controller }: { controller: PartnerController }): JSX.Element | null {\n const settings = usePendantSettings()\n return settings.enabled ? <ActivePendant controller={controller} settings={settings} /> : null\n}\n\nfunction ActivePendant({ controller, settings }: { controller: PartnerController; settings: PendantSettings }): JSX.Element {\n const root = useRef<HTMLElement>(null), canvas = useRef<HTMLCanvasElement>(null), hit = useRef<HTMLButtonElement>(null)\n const unreadBadge = useRef<HTMLSpanElement>(null)\n const handle = useRef<LanyardHandle>(), toggle = useRef(() => {})\n const [open, setOpen] = useState(false), [ready, setReady] = useState(false), [failed, setFailed] = useState(false)\n const [selected, setSelected] = useState<string>(), [navigationError, setNavigationError] = useState('')\n const { inbox, incoming, error, read } = usePartnerInbox()\n const latestUnread = inbox.items.find(item => item.readAt === undefined)\n const badgeMessage: BadgeMessage | undefined = latestUnread ? { id: latestUnread.id, count: inbox.unread, name: latestUnread.companionName, label: messageLabel(latestUnread) } : undefined\n const messageRef = useRef(badgeMessage)\n const settingsRef = useRef(settings)\n settingsRef.current = settings\n messageRef.current = badgeMessage\n const placement = usePendantPlacement(root, handle)\n const close = useCallback((keyboard = false): void => {\n setOpen(false)\n if (keyboard) requestAnimationFrame(() => hit.current?.focus({ preventScroll: true }))\n }, [])\n const inspect = (item?: PartnerNotice): void => { setSelected(item?.id); if (item && item.readAt === undefined) void read([item.id]) }\n toggle.current = () => {\n if (open) { close(); return }\n setNavigationError(''); inspect(latestUnread); setOpen(true)\n }\n useEffect(() => {\n const abort = new AbortController()\n const url = `${PARTNER_API}/pendant/renderer.js`\n void import(/* @vite-ignore */ url).then(async (module: { createLanyard(canvas: HTMLCanvasElement, hit: HTMLButtonElement, options: LanyardOptions): Promise<LanyardHandle> }) => {\n if (abort.signal.aborted || !canvas.current || !hit.current) return\n const instance = await module.createLanyard(canvas.current, hit.current, {\n signal: abort.signal, onTap: () => toggle.current(), onFailure: () => { handle.current?.destroy(); handle.current = undefined; setReady(false); setFailed(true) },\n ...(unreadBadge.current ? { unreadBadge: unreadBadge.current } : {}),\n })\n if (abort.signal.aborted) { instance.destroy(); return }\n handle.current = instance; instance.setAppearance(settingsRef.current); instance.setMessage(messageRef.current); setReady(true)\n }).catch(() => { if (!abort.signal.aborted) { setFailed(true); setReady(false) } })\n return () => { abort.abort(); handle.current?.destroy(); handle.current = undefined }\n }, [])\n useEffect(() => { handle.current?.setMessage(badgeMessage) }, [inbox, ready])\n useEffect(() => { handle.current?.setAppearance(settings) }, [settings, ready])\n const visit = async (item: PartnerNotice): Promise<void> => {\n setNavigationError('')\n try {\n if (item.routeId && item.sessionId) await controller.openSession(item.routeId, item.sessionId)\n else controller.open(item.companionId, { page: item.kind === 'task' ? 'board' : item.kind === 'schedule' ? 'schedules' : 'home', ...(item.taskId ? { taskId: item.taskId } : {}) })\n close()\n } catch (reason) { setNavigationError(reason instanceof Error ? reason.message : '\u65E0\u6CD5\u6253\u5F00\u6765\u6E90') }\n }\n const label = `\u4F19\u4F34\u6D88\u606F\uFF0C${inbox.unread} \u6761\u672A\u8BFB${latestUnread ? `\uFF0C${latestUnread.companionName}\uFF1A${latestUnread.title}` : ''}\uFF1B\u70B9\u51FB\u67E5\u770B\uFF0C\u62D6\u52A8\u5361\u724C\u73A9\u800D`\n return <aside ref={root} className=\"dsh-partner-pendant\" aria-label=\"\u4F19\u4F34\u6302\u9970\">\n <canvas ref={canvas} className=\"dsh-partner-pendant-canvas\" aria-hidden=\"true\" />\n <button ref={hit} type=\"button\" className={`dsh-partner-pendant-hit${ready ? ' is-rendered' : ''}`} aria-label={label} aria-expanded={open} aria-controls={open ? 'dsh-partner-pendant-inbox' : undefined} onClick={() => { if (!ready) toggle.current() }}>\n {!ready && <span className=\"dsh-partner-pendant-fallback\">\u4F19\u4F34<small>{failed ? inbox.unread ? `${inbox.unread} \u6761\u6D88\u606F` : '\u6D88\u606F' : '\u52A0\u8F7D\u6302\u9970\u2026'}</small></span>}\n </button>\n <button type=\"button\" className=\"dsh-partner-pendant-anchor\" aria-label=\"\u79FB\u52A8\u6302\u9970\u4F4D\u7F6E\uFF0C\u56DE\u8F66\u5438\u9644\u4FA7\u680F\" title=\"\u62D6\u8FD1\u4FA7\u680F\u677E\u624B\u5438\u9644\uFF1B\u65B9\u5411\u952E\u5FAE\u8C03\uFF0C\u56DE\u8F66\u5438\u9644\u4FA7\u680F\" {...placement}><span aria-hidden=\"true\" /></button>\n <span ref={unreadBadge} className=\"dsh-partner-pendant-unread\" hidden={inbox.unread === 0} aria-hidden=\"true\">{inbox.unread > 99 ? '99+' : inbox.unread}</span>\n <span className=\"dsh-partner-pendant-announcement\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">{incoming ? `${incoming.companionName}\uFF1A${incoming.title}` : ''}</span>\n {open && <PendantReader inbox={inbox} selected={selected} error={error || navigationError} anchor={hit} onSelect={inspect} onClose={close} onVisit={item => { void visit(item) }} onReadAll={() => { void read(inbox.items.filter(item => item.readAt === undefined).map(item => item.id)) }} />}\n </aside>\n}\n", "import { useCallback, useEffect, useRef, useState } from 'react'\nimport { PARTNER_API, api } from '../client-api.js'\nimport type { PartnerInbox, PartnerNotice } from '../notifications/domain.js'\n\n/** One conditional poll while visible, with bounded error backoff and cancellation. */\nexport function usePartnerInbox(): { inbox: PartnerInbox; incoming: PartnerNotice | undefined; error: string; read(ids: string[]): Promise<void> } {\n const [inbox, setInbox] = useState<PartnerInbox>({ items: [], unread: 0 })\n const [incoming, setIncoming] = useState<PartnerNotice>()\n const [error, setError] = useState('')\n const etag = useRef(''), latest = useRef<string>(), initialized = useRef(false), mounted = useRef(true), mutationEpoch = useRef(0)\n const apply = useCallback((value: PartnerInbox): void => {\n if (!mounted.current) return\n const first = value.items[0]\n if (initialized.current && first && first.id !== latest.current && first.readAt === undefined) setIncoming(first)\n initialized.current = true; latest.current = first?.id; setInbox(value); setError('')\n }, [])\n useEffect(() => {\n mounted.current = true\n let timer: ReturnType<typeof setTimeout> | undefined, request: AbortController | undefined, failures = 0, stopped = false\n const poll = async (): Promise<void> => {\n if (stopped || document.hidden || request) return\n clearTimeout(timer)\n request = new AbortController()\n const epoch = mutationEpoch.current\n const timeout = setTimeout(() => request?.abort(), 12_000)\n try {\n const response = await fetch(`${PARTNER_API}/pendant/inbox`, { signal: request.signal, headers: etag.current ? { 'If-None-Match': etag.current } : {} })\n if (response.status !== 304) {\n if (!response.ok) throw new Error(`\u6D88\u606F\u6682\u65F6\u4E0D\u53EF\u7528\uFF08${response.status}\uFF09`)\n const data = await response.json() as PartnerInbox\n if (!stopped && epoch === mutationEpoch.current) { etag.current = response.headers.get('etag') ?? ''; apply(data) }\n }\n failures = 0; if (!stopped) setError('')\n } catch (reason) { if (!stopped && !document.hidden) { failures++; setError(reason instanceof Error ? reason.message : '\u6D88\u606F\u8BFB\u53D6\u5931\u8D25') } }\n finally {\n clearTimeout(timeout); request = undefined\n if (!stopped && !document.hidden) timer = setTimeout(() => { void poll() }, Math.min(30_000, 4_000 * 2 ** failures))\n }\n }\n const visibility = (): void => { clearTimeout(timer); if (document.hidden) request?.abort(); else void poll() }\n document.addEventListener('visibilitychange', visibility); void poll()\n return () => { stopped = true; mounted.current = false; clearTimeout(timer); request?.abort(); document.removeEventListener('visibilitychange', visibility) }\n }, [apply])\n const read = useCallback(async (ids: string[]): Promise<void> => {\n mutationEpoch.current++\n try { const value = await api<PartnerInbox>('/pendant/read', { method: 'POST', body: JSON.stringify({ ids }) }); mutationEpoch.current++; etag.current = ''; apply(value) }\n catch (reason) { if (mounted.current) setError(reason instanceof Error ? reason.message : '\u6807\u8BB0\u5DF2\u8BFB\u5931\u8D25') }\n }, [apply])\n return { inbox, incoming, error, read }\n}\n", "import { useEffect, useRef, type RefObject, type MutableRefObject, type PointerEvent, type KeyboardEvent } from 'react'\nimport type { LanyardHandle } from './renderer.js'\n\nconst KEY = 'dsh-partner:pendant-position:v1'\ninterface Position { x: number; y: number; docked?: boolean }\nexport function snapPendantX(left: number, width: number, edge: number, force = false): number {\n return force || Math.abs(left + width / 2 - edge) <= 40 ? edge - width / 2 : left\n}\nconst clamp = (value: number, low: number, high: number): number => Math.max(low, Math.min(value, Math.max(low, high)))\n\nexport function readerPlacement(anchor: { x: number; y: number; width: number; height: number }, viewport: { width: number; height: number }) {\n const width = Math.min(360, viewport.width - 24), maxHeight = Math.min(480, viewport.height - 32), gap = 16\n const left = anchor.x - width - gap, right = anchor.x + anchor.width + gap\n if (left >= 12 || right + width <= viewport.width - 12) {\n return { width, maxHeight, left: clamp(left >= 12 ? left : right, 12, viewport.width - width - 12), top: clamp(anchor.y - 12, 16, viewport.height - maxHeight - 16) }\n }\n // Narrow screens: reserve the card's actual footprint, choose the larger\n // vertical space and scroll the message instead of covering the card.\n const below = clamp(anchor.y + anchor.height + gap, 16, viewport.height - 16)\n const above = clamp(anchor.y - gap, 16, viewport.height - 16)\n const useBelow = viewport.height - below - 16 >= above - 16\n const available = useBelow ? viewport.height - below - 16 : above - 16\n const height = Math.max(0, Math.min(maxHeight, available))\n return { width, maxHeight: height, left: clamp(anchor.x + anchor.width / 2 - width / 2, 12, viewport.width - width - 12), top: useBelow ? below : above - height }\n}\n\n/** Moving the hook changes placement, not the badge's elastic drag gesture.\n * Persist only at gesture completion; movement has no React render loop.\n */\nexport function usePendantPlacement(root: RefObject<HTMLElement>, handle: MutableRefObject<LanyardHandle | undefined>) {\n const handlers = useRef({ down: (_: PointerEvent<HTMLButtonElement>) => {}, move: (_: PointerEvent<HTMLButtonElement>) => {}, end: (_: PointerEvent<HTMLButtonElement>) => {}, key: (_: KeyboardEvent<HTMLButtonElement>) => {} })\n useEffect(() => {\n const element = root.current\n if (!element) return\n let saved: Position | undefined, pending: Position | undefined, frame = 0\n let docked = true\n const sidebar = document.querySelector<HTMLElement>(\"#root [data-slot='sidebar'] > div\")\n const edge = () => {\n const rect = sidebar?.getBoundingClientRect()\n return rect && rect.width > 0 && rect.right > 0 ? Math.max(48, Math.min(innerWidth - 48, rect.right)) : 48\n }\n let drag: { id: number; x: number; y: number; left: number; top: number; button: HTMLButtonElement } | undefined\n try {\n const value = JSON.parse(localStorage.getItem(KEY) ?? 'null') as Position | null\n if (value && Number.isFinite(value.x) && Number.isFinite(value.y)) {\n saved = { x: clamp(value.x, -1, 1), y: clamp(value.y, 0, 1) }\n docked = value.docked ?? false\n }\n } catch { /* Storage restrictions must not disable the pendant. */ }\n const limits = () => ({ x: Math.max(0, innerWidth - element.offsetWidth), y: Math.max(28, innerHeight - element.offsetHeight - 12) })\n const place = (p: Position): void => {\n const max = limits()\n element.style.left = `${clamp(p.x, 48 - element.offsetWidth / 2, max.x)}px`; element.style.top = `${clamp(p.y, 28, max.y)}px`; element.style.right = 'auto'\n element.dataset.docked = String(docked)\n handle.current?.relayout()\n }\n const restore = (): void => {\n const max = limits()\n const p = saved ? { x: saved.x * max.x, y: 28 + saved.y * (max.y - 28) } : { x: 0, y: 46 }\n if (docked) p.x = snapPendantX(p.x, element.offsetWidth, edge(), true)\n place(p)\n }\n const flush = (): void => { cancelAnimationFrame(frame); frame = 0; if (pending) { place(pending); pending = undefined } }\n const persist = (): void => {\n const max = limits()\n saved = { x: parseFloat(element.style.left) / (max.x || 1), y: (parseFloat(element.style.top) - 28) / (max.y - 28 || 1), docked }\n try { localStorage.setItem(KEY, JSON.stringify(saved)) } catch { /* In-memory movement still works. */ }\n }\n const finish = (): void => {\n if (!drag) return\n const previous = drag; drag = undefined; flush()\n const x = element.offsetLeft, snapped = snapPendantX(x, element.offsetWidth, edge())\n docked = Math.abs(snapped + element.offsetWidth / 2 - edge()) < 1\n place({ x: snapped, y: element.offsetTop }); persist()\n if (previous.button.hasPointerCapture(previous.id)) previous.button.releasePointerCapture(previous.id)\n }\n handlers.current = {\n down(event) {\n if (!event.isPrimary || event.button !== 0 || drag) return\n event.preventDefault()\n // CSS left/top are containing-block coordinates, not viewport pixels.\n drag = { id: event.pointerId, x: event.clientX, y: event.clientY, left: element.offsetLeft, top: element.offsetTop, button: event.currentTarget }\n event.currentTarget.setPointerCapture(event.pointerId)\n },\n move(event) {\n if (!drag || event.pointerId !== drag.id) return\n pending = { x: drag.left + event.clientX - drag.x, y: drag.top + event.clientY - drag.y }\n if (!frame) frame = requestAnimationFrame(flush)\n },\n end(event) { if (drag?.id === event.pointerId) finish() },\n key(event) {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault(); docked = true\n place({ x: snapPendantX(0, element.offsetWidth, edge(), true), y: element.offsetTop }); persist(); return\n }\n const step = event.shiftKey ? 32 : 12, delta = { ArrowLeft: [-step, 0], ArrowRight: [step, 0], ArrowUp: [0, -step], ArrowDown: [0, step] }[event.key]\n if (!delta) return\n event.preventDefault()\n docked = false\n place({ x: element.offsetLeft + delta[0]!, y: element.offsetTop + delta[1]! }); persist()\n },\n }\n const resize = (): void => { finish(); restore() }\n const observer = new ResizeObserver(resize); observer.observe(element)\n const sidebarObserver = new ResizeObserver(() => { if (docked && !drag) restore() })\n if (sidebar) sidebarObserver.observe(sidebar)\n window.addEventListener('resize', resize); window.addEventListener('blur', finish); restore()\n return () => { finish(); cancelAnimationFrame(frame); observer.disconnect(); sidebarObserver.disconnect(); window.removeEventListener('resize', resize); window.removeEventListener('blur', finish) }\n }, [root, handle])\n return { onPointerDown: (e: PointerEvent<HTMLButtonElement>) => handlers.current.down(e), onPointerMove: (e: PointerEvent<HTMLButtonElement>) => handlers.current.move(e), onPointerUp: (e: PointerEvent<HTMLButtonElement>) => handlers.current.end(e), onPointerCancel: (e: PointerEvent<HTMLButtonElement>) => handlers.current.end(e), onLostPointerCapture: (e: PointerEvent<HTMLButtonElement>) => handlers.current.end(e), onKeyDown: (e: KeyboardEvent<HTMLButtonElement>) => handlers.current.key(e) }\n}\n", "import { useEffect, useLayoutEffect, useRef, useState, type RefObject } from 'react'\nimport { IconCheckOutline14, IconChevronDownOutline14, IconCloseOutline16, IconLinkOutline16, IconNewChatOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PartnerInbox, PartnerNotice } from '../notifications/domain.js'\nimport { readerPlacement } from './use-placement.js'\n\ninterface Props {\n inbox: PartnerInbox; selected: string | undefined; error: string; anchor: RefObject<HTMLButtonElement>\n onSelect(item?: PartnerNotice): void; onClose(keyboard?: boolean): void; onVisit(item: PartnerNotice): void; onReadAll(): void\n}\nexport function PendantReader({ inbox, selected, error, anchor, onSelect, onClose, onVisit, onReadAll }: Props): JSX.Element {\n const panel = useRef<HTMLElement>(null), [visible, setVisible] = useState(8)\n const measure = () => readerPlacement(anchor.current?.getBoundingClientRect() ?? { x: innerWidth / 2, y: 16, width: 0, height: 0 }, { width: innerWidth, height: innerHeight })\n const [placement, setPlacement] = useState(measure)\n const detail = inbox.items.find(item => item.id === selected)\n useLayoutEffect(() => {\n setPlacement(measure())\n panel.current?.focus({ preventScroll: true })\n let frame = 0\n const resize = (): void => { cancelAnimationFrame(frame); frame = requestAnimationFrame(() => setPlacement(measure())) }\n window.addEventListener('resize', resize)\n return () => { cancelAnimationFrame(frame); window.removeEventListener('resize', resize) }\n }, [anchor])\n useEffect(() => {\n const outside = (event: PointerEvent): void => {\n // The card remains an operable toggle; do not close on pointerdown and\n // accidentally reopen on its pointerup. Dragging it is still playable.\n if (!panel.current?.contains(event.target as Node) && !anchor.current?.contains(event.target as Node)) onClose()\n }\n const escape = (event: KeyboardEvent): void => { if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); onClose(true) } }\n document.addEventListener('pointerdown', outside); document.addEventListener('keydown', escape)\n return () => { document.removeEventListener('pointerdown', outside); document.removeEventListener('keydown', escape) }\n }, [onClose, anchor])\n return <section ref={panel} id=\"dsh-partner-pendant-inbox\" className=\"dsh-partner-pendant-inbox\" aria-label=\"\u4F19\u4F34\u6D88\u606F\" tabIndex={-1} style={placement}>\n <header>\n {detail && <button type=\"button\" aria-label=\"\u8FD4\u56DE\u6D88\u606F\u5217\u8868\" onClick={() => onSelect()}><IconChevronDownOutline14 size={16} className=\"dsh-partner-pendant-back\" /></button>}\n {!detail && <span className=\"dsh-partner-pendant-reader-icon\" aria-hidden=\"true\"><IconNewChatOutline16 size={18} /></span>}\n <div className=\"dsh-partner-pendant-reader-heading\"><strong>{detail ? detail.companionName : '\u4F19\u4F34\u6D88\u606F'}</strong><small>{detail ? '\u6765\u81EA\u4F19\u4F34\u7684\u6D88\u606F' : '\u56DE\u590D\u4E0E\u4EFB\u52A1\u52A8\u6001'}</small></div>\n {!!inbox.unread && <span className=\"dsh-partner-pendant-reader-count\" aria-label={`${inbox.unread} \u6761\u672A\u8BFB`}>{inbox.unread}</span>}\n <button type=\"button\" aria-label=\"\u5173\u95ED\u4F19\u4F34\u6D88\u606F\" onClick={event => onClose(event.detail === 0)}><IconCloseOutline16 size={16} /></button>\n </header>\n {error && <p role=\"alert\" className=\"dsh-partner-pendant-error\">{error}</p>}\n {detail ? <><article className=\"dsh-partner-pendant-detail\"><div className=\"dsh-partner-pendant-reader-meta\"><span>{detail.kind === 'task' ? '\u4EFB\u52A1\u52A8\u6001' : detail.kind === 'schedule' ? '\u5B9A\u65F6\u4EFB\u52A1' : '\u4F1A\u8BDD\u56DE\u590D'}</span><time dateTime={new Date(detail.createdAt).toISOString()}>{new Date(detail.createdAt).toLocaleString([], { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' })}</time></div><h3>{detail.title}</h3><p>{detail.summary}</p></article><footer><button type=\"button\" className=\"dsh-partner-pendant-all-messages\" onClick={() => onSelect()}>\u5168\u90E8\u6D88\u606F<span>{inbox.items.length}</span></button><button type=\"button\" className=\"dsh-partner-pendant-source\" onClick={() => onVisit(detail)}><IconLinkOutline16 size={15} />{detail.kind === 'task' ? '\u67E5\u770B\u4EFB\u52A1' : detail.kind === 'schedule' ? '\u67E5\u770B\u5B9A\u65F6\u4EFB\u52A1' : '\u8FDB\u5165\u4F1A\u8BDD'}</button></footer></>\n : <><div className=\"dsh-partner-pendant-list\">{inbox.items.length ? inbox.items.slice(0, visible).map(item => <button type=\"button\" key={item.id} data-unread={item.readAt === undefined} onClick={() => onSelect(item)}><span><strong>{item.companionName}</strong><time>{new Date(item.createdAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</time></span><b>{item.title}</b><small>{item.summary.replace(/\\s+/g, ' ').slice(0, 100)}</small></button>) : <p className=\"dsh-partner-pendant-empty\">\u6682\u65F6\u6CA1\u6709\u65B0\u6D88\u606F</p>}{inbox.items.length > visible && <button type=\"button\" onClick={() => setVisible(count => count + 8)}>\u663E\u793A\u66F4\u591A\u6D88\u606F</button>}</div><footer><small>\u6700\u8FD1 {inbox.items.length} \u6761</small><button type=\"button\" disabled={!inbox.unread} onClick={onReadAll}><IconCheckOutline14 size={14} />\u5168\u90E8\u5DF2\u8BFB</button></footer></>}\n </section>\n}\n", "import { useEffect, useId, useRef, useState, type KeyboardEvent } from 'react'\nimport { IconCheckOutline14, IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { CompanionView } from '../client-api.js'\nimport { Avatar } from './partner-components.js'\n\n/** Local, themed listbox: no platform select popup or second CSS arrow. */\nexport function CompanionPicker({ companions, selectedId, onChange }: {\n companions: Pick<CompanionView, 'id' | 'name' | 'role'>[]\n selectedId: string | undefined\n onChange(id: string): void\n}): JSX.Element {\n const [open, setOpen] = useState(false)\n const root = useRef<HTMLDivElement>(null)\n const trigger = useRef<HTMLButtonElement>(null)\n const list = useRef<HTMLDivElement>(null)\n const listId = useId()\n const current = companions.find(item => item.id === selectedId) ?? companions[0]\n\n useEffect(() => {\n if (!open) return\n const options = list.current?.querySelectorAll<HTMLButtonElement>('[role=\"option\"]')\n const selected = Math.max(0, companions.findIndex(item => item.id === selectedId))\n options?.[selected]?.focus({ preventScroll: true })\n options?.[selected]?.scrollIntoView({ block: 'nearest' })\n const outside = (event: PointerEvent): void => {\n if (!root.current?.contains(event.target as Node)) setOpen(false)\n }\n const close = (): void => setOpen(false)\n const desktop = window.matchMedia('(min-width: 761px)')\n document.addEventListener('pointerdown', outside)\n window.addEventListener('blur', close)\n desktop.addEventListener('change', close)\n return () => {\n document.removeEventListener('pointerdown', outside)\n window.removeEventListener('blur', close)\n desktop.removeEventListener('change', close)\n }\n }, [open, companions, selectedId])\n\n const dismiss = (): void => { setOpen(false); trigger.current?.focus({ preventScroll: true }) }\n const navigate = (event: KeyboardEvent<HTMLDivElement>): void => {\n if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); dismiss(); return }\n const options = Array.from(list.current?.querySelectorAll<HTMLButtonElement>('[role=\"option\"]') ?? [])\n const index = options.indexOf(document.activeElement as HTMLButtonElement)\n let next: number\n if (event.key === 'ArrowDown') next = (index + 1) % options.length\n else if (event.key === 'ArrowUp') next = (index - 1 + options.length) % options.length\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = options.length - 1\n else return\n event.preventDefault()\n options[next]?.focus({ preventScroll: true })\n options[next]?.scrollIntoView({ block: 'nearest' })\n }\n\n return <div className=\"dsh-partner-companion-picker\" ref={root} onBlur={event => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setOpen(false)\n }}>\n <button ref={trigger} type=\"button\" className=\"dsh-partner-companion-trigger\" aria-label={`\u5207\u6362\u5F53\u524D\u4F19\u4F34${current ? `\uFF1A${current.name}` : ''}`} aria-haspopup=\"listbox\" aria-expanded={open} aria-controls={open ? listId : undefined} disabled={!current} onClick={() => setOpen(value => !value)} onKeyDown={event => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') { event.preventDefault(); setOpen(true) }\n }}>\n {current && <Avatar name={current.name} small />}\n <span className=\"dsh-partner-companion-copy\"><strong>{current?.name ?? '\u8FD8\u6CA1\u6709\u4F19\u4F34'}</strong><small>{current?.role || '\u9009\u62E9\u4F19\u4F34'}</small></span>\n <span className=\"dsh-partner-companion-chevron\" aria-hidden=\"true\"><IconChevronDownOutline14 size={14} /></span>\n </button>\n {open && <div ref={list} id={listId} role=\"listbox\" aria-label=\"\u9009\u62E9\u4F19\u4F34\" className=\"dsh-partner-companion-options\" onKeyDown={navigate}>\n {companions.map(item => <button type=\"button\" role=\"option\" aria-selected={item.id === current?.id} tabIndex={item.id === current?.id ? 0 : -1} key={item.id} onClick={() => { dismiss(); onChange(item.id) }}>\n <Avatar name={item.name} small />\n <span className=\"dsh-partner-companion-copy\"><strong>{item.name}</strong><small>{item.role}</small></span>\n <span className=\"dsh-partner-companion-check\" aria-hidden=\"true\">{item.id === current?.id && <IconCheckOutline14 size={14} />}</span>\n </button>)}\n </div>}\n </div>\n}\n", "import { useEffect, type RefObject } from 'react'\n\nexport function useWorkspaceTopAnchor(ref: RefObject<HTMLElement>): void {\n useEffect(() => {\n const element = ref.current\n const originalParent = element?.parentElement\n if (!element || !originalParent) return\n let moved = false\n let observer: MutationObserver | undefined\n const place = (): boolean => {\n let ancestor: HTMLElement | null = element.parentElement\n while (ancestor && ancestor !== document.body) {\n const candidate = ancestor.previousElementSibling\n if (candidate instanceof HTMLElement) {\n const style = getComputedStyle(candidate)\n if (style.display === 'flex' && style.flexDirection === 'column' && Number.parseFloat(style.flexGrow) > 0) {\n candidate.insertBefore(element, candidate.firstChild)\n moved = true\n return true\n }\n }\n ancestor = ancestor.parentElement\n }\n return false\n }\n if (!place()) {\n observer = new MutationObserver(() => { if (place()) observer?.disconnect() })\n observer.observe(document.body, { childList: true, subtree: true })\n }\n return () => {\n observer?.disconnect()\n if (moved && originalParent.isConnected) originalParent.append(element)\n }\n }, [ref])\n}\n", "import {\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\ntype GlassElement = 'header' | 'aside' | 'section' | 'article' | 'div' | 'button'\n\ninterface GlassSurfaceProps extends Omit<HTMLAttributes<HTMLElement>, 'children' | 'className'> {\n as: GlassElement\n children: ReactNode\n className: string\n borderRadius: number\n borderWidth?: number\n brightness?: number\n blur?: number\n distortionScale?: number\n interactive?: boolean\n opacity?: number\n saturation?: number\n type?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n}\n\ninterface GlassStyle extends CSSProperties {\n '--partner-glass-filter-id': string\n '--partner-glass-saturation': number\n '--partner-glare-x': string\n '--partner-glare-y': string\n}\n\nfunction supportsSvgBackdropFilter(filterId: string): boolean {\n if (typeof window === 'undefined' || typeof document === 'undefined') return false\n if (window.matchMedia('(prefers-reduced-transparency: reduce)').matches) return false\n const userAgent = navigator.userAgent\n if (/Firefox/i.test(userAgent) || (/Safari/i.test(userAgent) && !/(Chrome|Chromium|CriOS)/i.test(userAgent))) return false\n const probe = document.createElement('div')\n probe.style.backdropFilter = `url(#${filterId})`\n return probe.style.backdropFilter !== ''\n}\n\nfunction displacementMap(\n width: number,\n height: number,\n radius: number,\n borderWidth: number,\n brightness: number,\n opacity: number,\n blur: number,\n redGradientId: string,\n blueGradientId: string,\n): string {\n const edge = Math.max(1, Math.min(width, height) * borderWidth * .5)\n const innerWidth = Math.max(1, width - edge * 2)\n const innerHeight = Math.max(1, height - edge * 2)\n const svg = `<svg viewBox=\"0 0 ${width} ${height}\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <linearGradient id=\"${redGradientId}\" x1=\"100%\" y1=\"0%\" x2=\"0%\" y2=\"0%\"><stop offset=\"0%\" stop-color=\"#0000\"/><stop offset=\"100%\" stop-color=\"red\"/></linearGradient>\n <linearGradient id=\"${blueGradientId}\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"><stop offset=\"0%\" stop-color=\"#0000\"/><stop offset=\"100%\" stop-color=\"blue\"/></linearGradient>\n </defs>\n <rect width=\"${width}\" height=\"${height}\" fill=\"black\"/>\n <rect width=\"${width}\" height=\"${height}\" rx=\"${radius}\" fill=\"url(#${redGradientId})\"/>\n <rect width=\"${width}\" height=\"${height}\" rx=\"${radius}\" fill=\"url(#${blueGradientId})\" style=\"mix-blend-mode:difference\"/>\n <rect x=\"${edge}\" y=\"${edge}\" width=\"${innerWidth}\" height=\"${innerHeight}\" rx=\"${radius}\" fill=\"hsl(0 0% ${brightness}% / ${opacity})\" style=\"filter:blur(${blur}px)\"/>\n </svg>`\n return `data:image/svg+xml,${encodeURIComponent(svg)}`\n}\n\nexport function GlassSurface({\n as: Element,\n children,\n className,\n borderRadius,\n borderWidth = .07,\n brightness = 50,\n blur = 11,\n distortionScale = -26,\n interactive = false,\n opacity = .93,\n saturation = 1.16,\n ...elementProps\n}: GlassSurfaceProps): JSX.Element {\n const uniqueId = useId().replace(/:/g, '-')\n const filterId = `partner-glass-filter-${uniqueId}`\n const redGradientId = `partner-glass-red-${uniqueId}`\n const blueGradientId = `partner-glass-blue-${uniqueId}`\n const containerRef = useRef<HTMLElement>(null)\n const imageRef = useRef<SVGFEImageElement>(null)\n const redRef = useRef<SVGFEDisplacementMapElement>(null)\n const greenRef = useRef<SVGFEDisplacementMapElement>(null)\n const blueRef = useRef<SVGFEDisplacementMapElement>(null)\n const glareFrameRef = useRef(0)\n const glarePointerRef = useRef<{ clientX: number; clientY: number }>()\n const [svgSupported, setSvgSupported] = useState(false)\n\n useEffect(() => {\n setSvgSupported(supportsSvgBackdropFilter(filterId))\n }, [filterId])\n\n useEffect(() => {\n if (!svgSupported) return\n const element = containerRef.current\n const image = imageRef.current\n if (element === null || image === null) return\n let frame = 0\n let previousWidth = 0\n let previousHeight = 0\n const update = (): void => {\n frame = 0\n const rect = element.getBoundingClientRect()\n const width = Math.max(1, Math.round(rect.width))\n const height = Math.max(1, Math.round(rect.height))\n if (width === previousWidth && height === previousHeight) return\n previousWidth = width\n previousHeight = height\n image.setAttribute('href', displacementMap(\n width,\n height,\n Math.min(borderRadius, Math.min(width, height) / 2),\n borderWidth,\n brightness,\n opacity,\n blur,\n redGradientId,\n blueGradientId,\n ))\n }\n const schedule = (): void => {\n if (frame === 0) frame = requestAnimationFrame(update)\n }\n const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(schedule)\n observer?.observe(element)\n schedule()\n return () => {\n if (frame !== 0) cancelAnimationFrame(frame)\n observer?.disconnect()\n }\n }, [blueGradientId, blur, borderRadius, borderWidth, brightness, opacity, redGradientId, svgSupported])\n\n useEffect(() => {\n if (!svgSupported) return\n const channels = [redRef.current, greenRef.current, blueRef.current]\n const offsets = [0, 5, 10]\n channels.forEach((channel, index) => channel?.setAttribute('scale', String(distortionScale + (offsets[index] ?? 0))))\n }, [distortionScale, svgSupported])\n\n useEffect(() => () => {\n if (glareFrameRef.current !== 0) cancelAnimationFrame(glareFrameRef.current)\n }, [])\n\n const renderGlare = (): void => {\n glareFrameRef.current = 0\n const element = containerRef.current\n if (element === null) return\n const pointer = glarePointerRef.current\n if (pointer === undefined) {\n element.style.setProperty('--partner-glare-x', '50%')\n element.style.setProperty('--partner-glare-y', '50%')\n return\n }\n const rect = element.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) return\n const x = Math.max(0, Math.min(100, (pointer.clientX - rect.left) / rect.width * 100))\n const y = Math.max(0, Math.min(100, (pointer.clientY - rect.top) / rect.height * 100))\n element.style.setProperty('--partner-glare-x', `${x}%`)\n element.style.setProperty('--partner-glare-y', `${y}%`)\n }\n const scheduleGlare = (): void => {\n if (glareFrameRef.current === 0) glareFrameRef.current = requestAnimationFrame(renderGlare)\n }\n const moveGlare = (clientX: number, clientY: number): void => {\n if (!interactive) return\n glarePointerRef.current = { clientX, clientY }\n scheduleGlare()\n }\n const resetGlare = (): void => {\n if (!interactive) return\n glarePointerRef.current = undefined\n scheduleGlare()\n }\n\n const style: GlassStyle = {\n '--partner-glass-filter-id': `url(#${filterId})`,\n '--partner-glass-saturation': saturation,\n '--partner-glare-x': '50%',\n '--partner-glare-y': '50%',\n }\n\n return <Element\n {...elementProps}\n ref={containerRef as never}\n className={`dsh-partner-glass-surface ${svgSupported ? 'is-svg' : 'is-fallback'}${interactive ? ' is-interactive' : ''} ${className}`}\n style={style}\n onPointerMove={interactive ? event => moveGlare(event.clientX, event.clientY) : undefined}\n onPointerLeave={interactive ? resetGlare : undefined}\n >\n {svgSupported && <svg className=\"dsh-partner-glass-filter\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\">\n <defs>\n <filter id={filterId} colorInterpolationFilters=\"sRGB\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\">\n <feImage ref={imageRef} x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\" result=\"map\" />\n <feDisplacementMap ref={redRef} in=\"SourceGraphic\" in2=\"map\" result=\"displaced-red\" />\n <feColorMatrix in=\"displaced-red\" type=\"matrix\" values=\"1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0\" result=\"red\" />\n <feDisplacementMap ref={greenRef} in=\"SourceGraphic\" in2=\"map\" result=\"displaced-green\" />\n <feColorMatrix in=\"displaced-green\" type=\"matrix\" values=\"0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0\" result=\"green\" />\n <feDisplacementMap ref={blueRef} in=\"SourceGraphic\" in2=\"map\" result=\"displaced-blue\" />\n <feColorMatrix in=\"displaced-blue\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0\" result=\"blue\" />\n <feBlend in=\"red\" in2=\"green\" mode=\"screen\" result=\"red-green\" />\n <feBlend in=\"red-green\" in2=\"blue\" mode=\"screen\" result=\"output\" />\n <feGaussianBlur in=\"output\" stdDeviation=\".45\" />\n </filter>\n </defs>\n </svg>}\n {children}\n </Element>\n}\n", "import { useCallback, useEffect, useMemo, useState, type FormEvent } from 'react'\nimport { IconCheckOutline16, IconCloseOutline16, IconPlusOutline16, IconRefreshOutline16, IconSearchOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type MarketSkillView, type SkillCatalogView, type SkillMarketNetworkTestView, type SkillMarketNetworkView, type SkillMarketView } from '../client-api.js'\nimport { CollectionEmpty, CollectionSkeleton, WorkspaceBlock, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\nimport { SkillImportDialog } from './skill-import-dialog.js'\n\nexport function SkillsPanel(): JSX.Element {\n const [catalog, setCatalog] = useState<SkillCatalogView>({ installed: [], bindings: [], sources: [] })\n const [market, setMarket] = useState<SkillMarketView>({ sources: [], entries: [], errors: [] })\n const [query, setQuery] = useState('')\n const [activeSource, setActiveSource] = useState('market-clawhub')\n const [busy, setBusy] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n const [actionError, setActionError] = useState<{ kind: 'install' | 'uninstall'; id: string; message: string }>()\n const [addingSource, setAddingSource] = useState(false)\n const [creatingSkill, setCreatingSkill] = useState(false)\n const [importingSkill, setImportingSkill] = useState(false)\n const [editingNetwork, setEditingNetwork] = useState(false)\n const [showAllInstalled, setShowAllInstalled] = useState(false)\n const [network, setNetwork] = useState<SkillMarketNetworkView>({})\n const load = useCallback(async (refresh = false) => {\n try {\n const [nextCatalog, nextMarket, nextNetwork] = await Promise.all([\n api<SkillCatalogView>('/skills'), api<SkillMarketView>(`/skills/market${refresh ? '?refresh=1' : ''}`), api<SkillMarketNetworkView>('/skill-markets/network'),\n ])\n setCatalog(nextCatalog); setMarket(nextMarket); setNetwork(nextNetwork); setError(undefined)\n } catch (reason) { setError(errorMessage(reason)) } finally { setLoading(false) }\n }, [])\n useEffect(() => { void load() }, [load])\n const installed = new Map(catalog.installed.map(item => [item.id, item]))\n const visibleInstalled = showAllInstalled ? catalog.installed : catalog.installed.slice(0, 4)\n const visible = useMemo(() => {\n const normalized = query.trim().toLocaleLowerCase()\n return market.entries.filter(item => (item.sourceId === activeSource) && (!normalized || `${item.name} ${item.description} ${item.tags.join(' ')}`.toLocaleLowerCase().includes(normalized)))\n }, [activeSource, market.entries, query])\n const sources = [{ id: 'builtin', name: '\u5185\u7F6E\u7CBE\u9009' }, ...market.sources.map(source => ({ id: source.id, name: source.name }))]\n const sourceCounts = useMemo(() => market.entries.reduce((counts, entry) => {\n counts.set(entry.sourceId, (counts.get(entry.sourceId) ?? 0) + 1)\n return counts\n }, new Map<string, number>()), [market.entries])\n const install = async (entry: MarketSkillView): Promise<void> => {\n setBusy(entry.id); setActionError(undefined)\n try {\n await api('/skills/market/install', { method: 'POST', body: JSON.stringify({ sourceId: entry.sourceId, entryId: entry.id }) })\n await load()\n } catch (reason) { setActionError({ kind: 'install', id: entry.id, message: errorMessage(reason) }) } finally { setBusy(undefined) }\n }\n const uninstall = async (id: string): Promise<void> => {\n setBusy(id); setActionError(undefined)\n try { await api(`/skills/${encodeURIComponent(id)}`, { method: 'DELETE' }); await load() }\n catch (reason) { setActionError({ kind: 'uninstall', id, message: errorMessage(reason) }) } finally { setBusy(undefined) }\n }\n return <div className=\"dsh-partner-feature-page\">\n <WorkspaceHero eyebrow=\"Capability catalog\" title=\"Skill \u5E02\u573A\" detail=\"\u96C6\u4E2D\u5B89\u88C5\u548C\u7EF4\u62A4\u5DE5\u4F5C\u80FD\u529B\uFF1B\u5B89\u88C5\u540E\uFF0C\u518D\u4E3A\u9700\u8981\u5B83\u7684\u4F19\u4F34\u5355\u72EC\u542F\u7528\u3002\" actions={<button type=\"button\" disabled={loading} onClick={() => { void load(true) }}><IconRefreshOutline16 size={15} />{loading ? '\u540C\u6B65\u4E2D\u2026' : '\u5237\u65B0\u5E02\u573A'}</button>} />\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {importingSkill && <SkillImportDialog close={() => setImportingSkill(false)} changed={load} />}\n {creatingSkill && <WorkspaceDialog title=\"\u65B0\u5EFA Skill\" detail=\"\u521B\u5EFA\u4E00\u4E2A\u53EF\u590D\u7528\u7684\u5DE5\u4F5C\u6D41\u7A0B\uFF0C\u5E76\u660E\u786E\u6267\u884C\u4E0A\u4E0B\u6587\u3001\u5DE5\u5177\u8FB9\u754C\u548C\u9A8C\u6536\u6307\u4EE4\u3002\" close={() => setCreatingSkill(false)} width=\"wide\"><NewSkillForm existingIds={catalog.installed.map(skill => skill.id)} close={() => setCreatingSkill(false)} changed={load} /></WorkspaceDialog>}\n {editingNetwork && <WorkspaceDialog title=\"\u5E02\u573A\u7F51\u7EDC\u8BBE\u7F6E\" detail=\"\u914D\u7F6E Skill \u7D22\u5F15\u548C\u5B89\u88C5\u5305\u4E0B\u8F7D\u5171\u7528\u7684 HTTP \u4EE3\u7406\uFF0C\u5E76\u5728\u4FDD\u5B58\u524D\u6D4B\u8BD5\u8FDE\u901A\u6027\u3002\" close={() => setEditingNetwork(false)}><NetworkSettingsForm value={network} close={() => setEditingNetwork(false)} changed={async next => { setNetwork(next); await load(true) }} /></WorkspaceDialog>}\n {addingSource && <WorkspaceDialog title=\"\u6DFB\u52A0\u5E02\u573A\u6765\u6E90\" detail=\"\u63A5\u5165\u56E2\u961F\u6216\u4E2A\u4EBA\u7EF4\u62A4\u7684 Skill \u7D22\u5F15\u3002\u81EA\u5B9A\u4E49\u6765\u6E90\u9ED8\u8BA4\u6309\u4E0D\u53EF\u4FE1\u6765\u6E90\u9694\u79BB\u6267\u884C\u3002\" close={() => setAddingSource(false)}><MarketSourceForm close={() => setAddingSource(false)} changed={() => load(true)} /></WorkspaceDialog>}\n <WorkspaceBlock title=\"\u5DF2\u5B89\u88C5\" detail={`${catalog.installed.length} \u4E2A\u53EF\u4F9B\u4F19\u4F34\u4F7F\u7528`} actions={<><button type=\"button\" onClick={() => setImportingSkill(true)}>\u5BFC\u5165 Skill</button><button type=\"button\" onClick={() => setCreatingSkill(true)}><IconPlusOutline16 size={14} />\u65B0\u5EFA Skill</button></>}>\n {loading ? <CollectionSkeleton rows={2} /> : catalog.installed.length === 0 ? <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u5B89\u88C5 Skill\" detail=\"\u53EF\u4EE5\u521B\u5EFA\u81EA\u5DF1\u7684 Skill\uFF0C\u6216\u4ECE\u4E0B\u65B9\u5E02\u573A\u9009\u62E9\u3002\" action={<button type=\"button\" onClick={() => setCreatingSkill(true)}><IconPlusOutline16 size={14} />\u65B0\u5EFA\u7B2C\u4E00\u4E2A Skill</button>} /> : <><div className=\"dsh-partner-skill-installed is-market\">{visibleInstalled.map(skill => <article key={skill.id}>\n <span className=\"dsh-partner-skill-mark\"><IconCheckOutline16 size={16} /></span><span><strong>{skill.displayName}</strong><p>{skill.description}</p><small>{skill.version} \u00B7 {skill.executionContext === 'fork' ? '\u4E34\u65F6\u4F1A\u8BDD' : '\u5F53\u524D\u4F1A\u8BDD'} \u00B7 {skill.source}</small></span>\n <button type=\"button\" className=\"is-icon\" disabled={busy === skill.id} aria-label={`\u5378\u8F7D ${skill.displayName}`} onClick={() => { void uninstall(skill.id) }}><IconTrashOutline16 size={15} /></button>\n {actionError?.kind === 'uninstall' && actionError.id === skill.id && <p className=\"dsh-partner-skill-action-error\" role=\"alert\">\u5378\u8F7D\u5931\u8D25\uFF1A{actionError.message}</p>}\n </article>)}</div>{catalog.installed.length > 4 && <button type=\"button\" className=\"dsh-partner-skill-disclosure\" aria-expanded={showAllInstalled} onClick={() => setShowAllInstalled(value => !value)}>{showAllInstalled ? '\u6536\u8D77\u5DF2\u5B89\u88C5 Skill' : `\u67E5\u770B\u5168\u90E8 ${catalog.installed.length} \u4E2A\u5DF2\u5B89\u88C5 Skill`}</button>}</>}\n </WorkspaceBlock>\n <WorkspaceBlock title=\"\u5E02\u573A\u76EE\u5F55\" detail=\"\u5185\u7F6E ClawHub\u3001LoopHub\u3001SkillHub\uFF0C\u4E0E nomifun \u5F53\u524D Skill \u699C\u5355\u4E00\u81F4\" actions={<><button type=\"button\" onClick={() => setEditingNetwork(true)}>\u4EE3\u7406\u8BBE\u7F6E{network.proxyUrl ? ' \u00B7 \u5DF2\u542F\u7528' : ''}</button><button type=\"button\" onClick={() => setAddingSource(true)}><IconPlusOutline16 size={14} />\u81EA\u5B9A\u4E49\u6E90</button></>}>\n <div className=\"dsh-partner-market-toolbar\">\n <SkillSearch value={query} change={setQuery} count={visible.length} label=\"\u641C\u7D22 Skill \u5E02\u573A\" placeholder=\"\u641C\u7D22\u540D\u79F0\u3001\u8BF4\u660E\u6216\u6807\u7B7E\" loading={loading} />\n <nav className=\"dsh-partner-market-sources\" aria-label=\"Skill \u5E02\u573A\u6765\u6E90\">{sources.map(source => <button type=\"button\" key={source.id} className={activeSource === source.id ? 'is-active' : ''} aria-pressed={activeSource === source.id} onClick={() => setActiveSource(source.id)}><span>{source.name}</span><small>{sourceCounts.get(source.id) ?? 0}</small></button>)}</nav>\n </div>\n {market.errors.some(item => item.sourceId === activeSource) && <p className=\"dsh-partner-inline-warning\">{market.errors.filter(item => item.sourceId === activeSource).map(item => item.error).join('\uFF1B')}</p>}\n {loading ? <CollectionSkeleton rows={4} /> : <div className=\"dsh-partner-market-grid\">{visible.map(entry => {\n const current = installed.get(entry.id)\n const cardError = actionError?.kind === 'install' && actionError.id === entry.id ? actionError.message : undefined\n const errorId = cardError ? `dsh-partner-skill-error-${entry.id}` : undefined\n return <article key={`${entry.sourceId}:${entry.id}`}><span><small>{entry.tags.slice(0, 3).join(' \u00B7 ') || 'SKILL'}</small><strong>{entry.name}</strong><p>{entry.description}</p></span>{cardError && <p id={errorId} className=\"dsh-partner-market-card-error\" role=\"alert\">\u5B89\u88C5\u5931\u8D25\uFF1A{cardError}</p>}<footer><small>v{entry.version}</small>{current ? <button type=\"button\" disabled><IconCheckOutline16 size={14} />\u5DF2\u5B89\u88C5</button> : <button type=\"button\" disabled={busy === entry.id} aria-describedby={errorId} onClick={() => { void install(entry) }}>{busy === entry.id ? '\u5B89\u88C5\u4E2D\u2026' : cardError ? '\u91CD\u8BD5\u5B89\u88C5' : '\u5B89\u88C5'}</button>}</footer></article>\n })}</div>}\n {!loading && visible.length === 0 && <CollectionEmpty title={query ? '\u6CA1\u6709\u5339\u914D\u7684 Skill' : '\u5F53\u524D\u6765\u6E90\u6682\u65F6\u4E0D\u53EF\u7528'} detail={query ? '\u6362\u4E00\u4E2A\u5173\u952E\u8BCD\uFF0C\u6216\u5207\u6362\u5E02\u573A\u6765\u6E90\u3002' : '\u5237\u65B0\u5E02\u573A\uFF0C\u6216\u68C0\u67E5\u4EE3\u7406\u4E0E\u6765\u6E90\u914D\u7F6E\u3002'} />}\n </WorkspaceBlock>\n </div>\n}\n\nexport function CompanionSkillSettings({ companionId }: { companionId: string }): JSX.Element {\n const [catalog, setCatalog] = useState<SkillCatalogView>({ installed: [], bindings: [], sources: [] })\n const [busy, setBusy] = useState<string>()\n const [error, setError] = useState<string>()\n const [selecting, setSelecting] = useState(false)\n const [showAll, setShowAll] = useState(false)\n const [query, setQuery] = useState('')\n const load = useCallback(async () => {\n try { setCatalog(await api<SkillCatalogView>('/skills')); setError(undefined) }\n catch (reason) { setError(errorMessage(reason)) }\n }, [])\n useEffect(() => { void load() }, [load, companionId])\n useEffect(() => { setSelecting(false); setShowAll(false); setQuery(''); setError(undefined) }, [companionId])\n const enabled = useMemo(() => new Set(catalog.bindings.filter(item => item.companionId === companionId && item.enabled).map(item => item.skillId)), [catalog.bindings, companionId])\n const enabledSkills = useMemo(() => catalog.installed.filter(skill => enabled.has(skill.id)), [catalog.installed, enabled])\n const availableSkills = useMemo(() => {\n const normalized = query.trim().toLocaleLowerCase()\n return catalog.installed.filter(skill => !enabled.has(skill.id) && (!normalized || `${skill.displayName} ${skill.description} ${skill.id}`.toLocaleLowerCase().includes(normalized)))\n }, [catalog.installed, enabled, query])\n const visibleEnabledSkills = showAll ? enabledSkills : enabledSkills.slice(0, 4)\n const visibleAvailableSkills = availableSkills.slice(0, 80)\n const setBinding = async (skillId: string, nextEnabled: boolean): Promise<void> => {\n setBusy(skillId)\n setError(undefined)\n try {\n await api(`/companions/${encodeURIComponent(companionId)}/skills/${encodeURIComponent(skillId)}`, { method: 'PUT', body: JSON.stringify({ enabled: nextEnabled }) })\n await load()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n return <section className=\"dsh-partner-capability-detail\" aria-labelledby=\"dsh-partner-skill-capability-title\">\n <header><span><small>PARTNER SKILLS</small><strong id=\"dsh-partner-skill-capability-title\">\u5F53\u524D\u4F19\u4F34\u7684 Skill</strong></span><div className=\"dsh-partner-capability-actions\"><em>{enabledSkills.length} \u4E2A\u542F\u7528</em>{catalog.installed.length > 0 && <button type=\"button\" aria-expanded={selecting} onClick={() => setSelecting(value => !value)}><IconPlusOutline16 size={14} />\u6DFB\u52A0 Skill</button>}</div></header>\n {selecting && <div className=\"dsh-partner-skill-picker\" aria-label=\"\u6DFB\u52A0 Skill\">\n <SkillSearch value={query} change={setQuery} count={availableSkills.length} label=\"\u641C\u7D22\u53EF\u6DFB\u52A0\u7684 Skill\" placeholder=\"\u641C\u7D22\u540D\u79F0\u3001\u8BF4\u660E\u6216\u6807\u8BC6\" autoFocus compact />\n <div className=\"dsh-partner-skill-picker-list\">{visibleAvailableSkills.map(skill => <article key={skill.id}><span><strong>{skill.displayName}</strong><p>{skill.description}</p><small>{skill.executionContext === 'fork' ? '\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD\u6267\u884C' : '\u53EF\u4FE1\u5F53\u524D\u4F1A\u8BDD\u6267\u884C'}</small></span><button type=\"button\" disabled={busy === skill.id} onClick={() => { void setBinding(skill.id, true) }}>{busy === skill.id ? '\u6DFB\u52A0\u4E2D\u2026' : '\u6DFB\u52A0'}</button></article>)}{availableSkills.length === 0 && <p className=\"dsh-partner-skill-picker-empty\">{query ? '\u6CA1\u6709\u5339\u914D\u7684\u672A\u542F\u7528 Skill\u3002' : '\u6240\u6709\u5DF2\u5B89\u88C5 Skill \u90FD\u5DF2\u542F\u7528\u3002'}</p>}</div>\n {availableSkills.length > visibleAvailableSkills.length && <small className=\"dsh-partner-skill-picker-limit\">\u8FD8\u6709 {availableSkills.length - visibleAvailableSkills.length} \u4E2A\u7ED3\u679C\uFF0C\u8BF7\u8F93\u5165\u5173\u952E\u8BCD\u7EE7\u7EED\u7B5B\u9009\u3002</small>}\n </div>}\n {catalog.installed.length === 0 ? <p className=\"dsh-partner-feature-empty\">\u5C1A\u672A\u5B89\u88C5 Skill\uFF0C\u8BF7\u5148\u4ECE\u5DE6\u4FA7\u7684 Skill \u5E02\u573A\u5B89\u88C5\u3002</p> : enabledSkills.length === 0 ? <p className=\"dsh-partner-feature-empty\">\u5F53\u524D\u4F19\u4F34\u8FD8\u6CA1\u6709\u542F\u7528 Skill\u3002\u70B9\u51FB\u201C\u6DFB\u52A0 Skill\u201D\u9009\u62E9\u9700\u8981\u7684\u80FD\u529B\u3002</p> : <>\n <div className=\"dsh-partner-skill-installed is-binding\">{visibleEnabledSkills.map(skill => <article key={skill.id}>\n <span className=\"dsh-partner-skill-mark\"><IconCheckOutline16 size={16} /></span><span><strong>{skill.displayName}</strong><p>{skill.description}</p><small>{skill.executionContext === 'fork' ? '\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD\u6267\u884C' : '\u53EF\u4FE1\u5F53\u524D\u4F1A\u8BDD\u6267\u884C'}</small></span>\n <button type=\"button\" className=\"dsh-partner-skill-binding-action\" disabled={busy === skill.id} aria-label={`\u4ECE\u5F53\u524D\u4F19\u4F34\u505C\u7528 ${skill.displayName}`} onClick={() => { void setBinding(skill.id, false) }}>{busy === skill.id ? '\u5904\u7406\u4E2D\u2026' : '\u505C\u7528'}</button>\n </article>)}</div>\n {enabledSkills.length > 4 && <button type=\"button\" className=\"dsh-partner-skill-disclosure\" aria-expanded={showAll} onClick={() => setShowAll(value => !value)}>{showAll ? '\u6536\u8D77 Skill' : `\u67E5\u770B\u5168\u90E8 ${enabledSkills.length} \u4E2A Skill`}</button>}\n </>}\n {error && <p className=\"dsh-partner-inline-error\" role=\"alert\">{error}</p>}\n </section>\n}\n\nfunction SkillSearch({ value, change, count, label, placeholder, loading = false, autoFocus = false, compact = false }: {\n value: string\n change(value: string): void\n count: number\n label: string\n placeholder: string\n loading?: boolean\n autoFocus?: boolean\n compact?: boolean\n}): JSX.Element {\n return <div className={`dsh-partner-skill-search${compact ? ' is-compact' : ''}`} role=\"search\" aria-label={label}>\n <span className=\"dsh-partner-skill-search-icon\" aria-hidden=\"true\"><IconSearchOutline16 size={16} /></span>\n <input\n type=\"search\"\n value={value}\n autoFocus={autoFocus}\n aria-label={label}\n placeholder={placeholder}\n onChange={event => change(event.target.value)}\n onKeyDown={event => { if (event.key === 'Escape' && value) { event.preventDefault(); change('') } }}\n />\n {value && <button type=\"button\" className=\"dsh-partner-skill-search-clear\" aria-label=\"\u6E05\u7A7A\u641C\u7D22\" title=\"\u6E05\u7A7A\u641C\u7D22\" onClick={() => change('')}><IconCloseOutline16 size={14} /></button>}\n <span className=\"dsh-partner-skill-search-count\" aria-live=\"polite\">{loading ? '\u540C\u6B65\u4E2D' : `${count} \u9879`}</span>\n </div>\n}\n\nfunction NewSkillForm({ existingIds, close, changed }: { existingIds: string[]; close(): void; changed(): Promise<void> | void }): JSX.Element {\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n const id = String(data.get('id') ?? '').trim().toLocaleLowerCase()\n if (existingIds.includes(id)) { setError('\u8FD9\u4E2A Skill \u6807\u8BC6\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u6362\u4E00\u4E2A\u6807\u8BC6\u3002'); return }\n setBusy(true); setError(undefined)\n try {\n const document = skillDocument({\n id,\n displayName: String(data.get('displayName') ?? ''),\n description: String(data.get('description') ?? ''),\n context: String(data.get('context') ?? 'fork'),\n allowedTools: String(data.get('allowedTools') ?? ''),\n instructions: String(data.get('instructions') ?? ''),\n })\n await api('/skills/local', { method: 'POST', body: JSON.stringify({ id, document }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-feature-form dsh-partner-skill-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>Skill \u540D\u79F0</span><input name=\"displayName\" required maxLength={120} autoFocus placeholder=\"\u4F8B\u5982\uFF1A\u53D1\u5E03\u8BF4\u660E\u6574\u7406\" /></label><label><span>Skill \u6807\u8BC6</span><input name=\"id\" required maxLength={80} pattern=\"[A-Za-z0-9][A-Za-z0-9._-]{0,79}\" placeholder=\"release-notes\" /></label><label className=\"is-wide\"><span>\u4E00\u53E5\u8BDD\u8BF4\u660E</span><input name=\"description\" required maxLength={600} placeholder=\"\u8BF4\u660E\u4EC0\u4E48\u65F6\u5019\u4F7F\u7528\uFF0C\u4EE5\u53CA\u8981\u89E3\u51B3\u4EC0\u4E48\u95EE\u9898\" /></label><label><span>\u6267\u884C\u65B9\u5F0F</span><select name=\"context\" defaultValue=\"fork\"><option value=\"fork\">\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD</option><option value=\"inline\">\u53EF\u4FE1\u5F53\u524D\u4F1A\u8BDD</option></select></label><label><span>\u5141\u8BB8\u7684\u5DE5\u5177</span><input name=\"allowedTools\" maxLength={1000} placeholder=\"\u591A\u4E2A\u5DE5\u5177\u7528\u9017\u53F7\u5206\u9694\uFF0C\u53EF\u7559\u7A7A\" /></label><label className=\"is-wide\"><span>Skill \u6307\u4EE4</span><textarea name=\"instructions\" required maxLength={500000} rows={8} placeholder=\"\u5199\u6E05\u5DE5\u4F5C\u6B65\u9AA4\u3001\u8FB9\u754C\u3001\u8F93\u51FA\u683C\u5F0F\u548C\u9A8C\u6536\u6761\u4EF6\" /></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA Skill'}</button></footer></form>\n}\n\nfunction NetworkSettingsForm({ value, close, changed }: { value: SkillMarketNetworkView; close(): void; changed(value: SkillMarketNetworkView): Promise<void> | void }): JSX.Element {\n const [proxyUrl, setProxyUrl] = useState(value.proxyUrl ?? '')\n const [busy, setBusy] = useState<'save' | 'test'>()\n const [status, setStatus] = useState<string>()\n const [error, setError] = useState<string>()\n const test = async (): Promise<void> => {\n setBusy('test'); setError(undefined); setStatus(undefined)\n try {\n const result = await api<SkillMarketNetworkTestView>('/skill-markets/network', { method: 'POST', body: JSON.stringify({ proxyUrl: proxyUrl.trim() }) })\n setStatus(`\u8FDE\u63A5\u6B63\u5E38 \u00B7 ${result.sourceCount} \u4E2A\u6765\u6E90 \u00B7 ${result.entryCount} \u4E2A Skill \u00B7 ${result.latencyMs} ms`)\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const save = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); setBusy('save'); setError(undefined)\n try {\n const next = await api<SkillMarketNetworkView>('/skill-markets/network', { method: 'PUT', body: JSON.stringify({ proxyUrl: proxyUrl.trim() }) })\n await changed(next); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n return <form className=\"dsh-partner-feature-form dsh-partner-network-form\" aria-busy={busy !== undefined} onSubmit={event => { void save(event) }}><label className=\"is-wide\"><span>HTTP \u4EE3\u7406</span><input type=\"url\" autoFocus value={proxyUrl} onChange={event => setProxyUrl(event.target.value)} placeholder=\"http://host.docker.internal:7893\" /><small>\u7559\u7A7A\u4E3A\u76F4\u8FDE\uFF1B\u5E02\u573A\u5217\u8868\u548C\u5B89\u88C5\u5305\u4E0B\u8F7D\u5171\u7528\u8FD9\u4E2A\u4EE3\u7406\u3002</small></label>{status && <WorkspaceNotice kind=\"success\">{status}</WorkspaceNotice>}{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy !== undefined} onClick={() => { void test() }}>{busy === 'test' ? '\u6D4B\u8BD5\u4E2D\u2026' : '\u6D4B\u8BD5\u8FDE\u63A5'}</button><span className=\"dsh-partner-form-footer-spacer\" /><button type=\"button\" disabled={busy !== undefined} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy !== undefined}>{busy === 'save' ? '\u4FDD\u5B58\u4E2D\u2026' : '\u4FDD\u5B58\u8BBE\u7F6E'}</button></footer></form>\n}\n\nfunction MarketSourceForm({ close, changed }: { close(): void; changed(): Promise<void> | void }): JSX.Element {\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n setBusy(true); setError(undefined)\n try {\n await api('/skill-markets', { method: 'POST', body: JSON.stringify({ name: data.get('name'), indexUrl: data.get('indexUrl'), enabled: true, trusted: false }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-feature-form dsh-partner-market-source-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>\u6765\u6E90\u540D\u79F0</span><input name=\"name\" required maxLength={100} autoFocus placeholder=\"\u56E2\u961F Skill \u5E02\u573A\" /></label><label><span>\u7D22\u5F15 URL</span><input name=\"indexUrl\" required type=\"url\" placeholder=\"https://example.com/skills.json\" /></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}>{busy ? '\u6DFB\u52A0\u4E2D\u2026' : '\u6DFB\u52A0\u6765\u6E90'}</button></footer></form>\n}\nfunction skillDocument(value: { id: string; displayName: string; description: string; context: string; allowedTools: string; instructions: string }): string {\n const requestedTools = value.allowedTools.split(/[,\uFF0C\\s]+/).map(item => item.trim()).filter(Boolean)\n const invalidTool = requestedTools.find(item => !/^[a-zA-Z0-9._:-]+$/.test(item))\n if (invalidTool) throw new Error(`\u5DE5\u5177\u540D\u79F0\u683C\u5F0F\u4E0D\u6B63\u786E\uFF1A${invalidTool}`)\n const tools = [...new Set(requestedTools)].slice(0, 64)\n return `---\\nname: ${value.id}\\ndisplay-name: ${skillScalar(value.displayName)}\\ndescription: ${skillScalar(value.description)}\\nversion: 1.0.0\\ncontext: ${value.context === 'inline' ? 'inline' : 'fork'}\\nallowed-tools: [${tools.join(', ')}]\\n---\\n# ${value.displayName.replace(/[\\r\\n#]+/g, ' ').trim()}\\n\\n${value.instructions.trim()}\\n`\n}\nfunction skillScalar(value: string): string { return `\"${value.replace(/[\\r\\n]+/g, ' ').replace(/\"/g, \"'\").trim()}\"` }\n", "import { useRef, useState, type FormEvent } from 'react'\nimport { api } from '../client-api.js'\nimport { WorkspaceDialog, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nconst LIMIT = 32 * 1024 * 1024\nconst encodeFile = (file: File): Promise<string> => new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onerror = () => reject(new Error(`\u65E0\u6CD5\u8BFB\u53D6 ${file.name}`))\n reader.onload = () => resolve(String(reader.result).split(',')[1] ?? '')\n reader.readAsDataURL(file)\n})\n\nexport function SkillImportDialog({ close, changed }: { close(): void; changed(): Promise<void> | void }): JSX.Element {\n const zipInput = useRef<HTMLInputElement>(null), directoryInput = useRef<HTMLInputElement | null>(null)\n const [files, setFiles] = useState<File[]>([])\n const [kind, setKind] = useState<'zip' | 'directory'>('zip')\n const [busy, setBusy] = useState(false), [progress, setProgress] = useState('')\n const [error, setError] = useState<string>()\n const choose = (selected: FileList | null, nextKind: 'zip' | 'directory'): void => {\n if (!selected?.length || busy) return\n setError(undefined); setFiles([])\n const next = Array.from(selected).filter(file => !file.webkitRelativePath.split('/').some(part => ['.git', 'node_modules', '__MACOSX', '.DS_Store'].includes(part)))\n if (nextKind === 'zip' && !/\\.zip$/iu.test(next[0]?.name ?? '')) { setError('\u8BF7\u9009\u62E9 ZIP \u538B\u7F29\u5305\uFF1B\u5176\u4ED6\u683C\u5F0F\u8BF7\u5148\u89E3\u538B\uFF0C\u518D\u9009\u62E9\u76EE\u5F55\u5BFC\u5165\u3002'); return }\n if (!next.length || next.length > 512 || next.reduce((total, file) => total + file.size, 0) > LIMIT || nextKind === 'directory' && next.some(file => file.size > 8 * 1024 * 1024)) { setError('\u6700\u591A 512 \u4E2A\u6587\u4EF6\u3001\u603B\u8BA1 32 MiB\uFF1B\u76EE\u5F55\u4E2D\u7684\u5355\u4E2A\u6587\u4EF6\u4E0D\u80FD\u8D85\u8FC7 8 MiB\u3002'); return }\n setKind(nextKind); setFiles(next)\n }\n const submit = async (event: FormEvent): Promise<void> => {\n event.preventDefault()\n if (busy || !files.length) return\n setBusy(true); setError(undefined)\n try {\n let body: unknown\n if (kind === 'zip') { setProgress('\u6B63\u5728\u8BFB\u53D6\u538B\u7F29\u5305\u2026'); body = { kind, data: await encodeFile(files[0]!) } }\n else {\n const entries = []\n for (const [index, file] of files.entries()) {\n setProgress(`\u6B63\u5728\u8BFB\u53D6\u6587\u4EF6 ${index + 1}/${files.length}`)\n entries.push({ path: file.webkitRelativePath || file.name, data: await encodeFile(file) })\n }\n body = { kind, files: entries }\n }\n setProgress('\u6B63\u5728\u6821\u9A8C\u5E76\u5BFC\u5165\u2026')\n await api('/skills/import', { method: 'POST', body: JSON.stringify(body), signal: AbortSignal.timeout(120000) })\n setProgress('\u5BFC\u5165\u6210\u529F\uFF0C\u6B63\u5728\u66F4\u65B0\u5217\u8868\u2026')\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) }\n finally { setBusy(false); setProgress('') }\n }\n return <WorkspaceDialog title=\"\u5BFC\u5165 Skill\" detail=\"\u5BFC\u5165\u5B8C\u6574\u6280\u80FD\u5305\uFF0C\u4FDD\u7559 scripts\u3001references\u3001assets \u7B49\u914D\u5957\u6587\u4EF6\u3002\" close={() => { if (!busy) close() }}>\n <form className=\"dsh-partner-feature-form dsh-partner-skill-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}>\n <input hidden type=\"file\" accept=\".zip,application/zip\" ref={zipInput} onChange={event => { choose(event.target.files, 'zip'); event.target.value = '' }} />\n <input hidden type=\"file\" multiple ref={node => { directoryInput.current = node; node?.setAttribute('webkitdirectory', '') }} onChange={event => { choose(event.target.files, 'directory'); event.target.value = '' }} />\n <div className=\"is-wide dsh-partner-capability-actions\"><button type=\"button\" autoFocus disabled={busy} onClick={() => zipInput.current?.click()}>\u9009\u62E9 ZIP \u538B\u7F29\u5305</button><button type=\"button\" disabled={busy || !('webkitdirectory' in document.createElement('input'))} onClick={() => directoryInput.current?.click()}>\u9009\u62E9\u76EE\u5F55</button></div>\n <p className=\"is-wide dsh-partner-form-help\">\u6BCF\u6B21\u5BFC\u5165\u4E00\u4E2A Skill\uFF0C\u76EE\u5F55\u4E2D\u5E94\u6709 SKILL.md\u3002\u5B89\u88C5\u4E0D\u4F1A\u6267\u884C\u811A\u672C\uFF0C\u4E5F\u4E0D\u4F1A\u81EA\u52A8\u4E3A\u4F19\u4F34\u542F\u7528\u3002\u4EC5\u5BFC\u5165\u53EF\u4FE1\u6765\u6E90\uFF1B\u5176\u4ED6\u538B\u7F29\u683C\u5F0F\u53EF\u5148\u89E3\u538B\u540E\u5BFC\u5165\u76EE\u5F55\u3002</p>\n {files.length > 0 && <p className=\"is-wide dsh-partner-form-help\" role=\"status\">\u5DF2\u9009\u62E9\uFF1A{kind === 'zip' ? files[0]!.name : files[0]!.webkitRelativePath.split('/')[0]} \u00B7 {files.length} \u4E2A\u6587\u4EF6 \u00B7 {(files.reduce((total, file) => total + file.size, 0) / 1024 / 1024).toFixed(2)} MiB</p>}\n {progress && <p className=\"is-wide dsh-partner-form-help\" role=\"status\">{progress}</p>}\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy || !files.length}>{busy ? '\u5BFC\u5165\u4E2D\u2026' : '\u5BFC\u5165 Skill'}</button></footer>\n </form>\n </WorkspaceDialog>\n}\n", "import { useEffect, useMemo, useState } from 'react'\nimport { IconChevronRightOutline14, IconPlusOutline16, IconSearchOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type TaskBoardView, type PartnerDirectoryEntryView, type RequirementView } from '../client-api.js'\nimport { CollectionSkeleton, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\nimport { useBoardRefresh } from './board-refresh.js'\nimport { RequirementForm, RequirementDetail, requirementStatus } from './requirement-dialog.js'\nimport { RequirementTasksPanel } from './requirement-tasks-panel.js'\n\nexport function RequirementBoard({ initialTaskId, openRequest }: { initialTaskId?: string | undefined; openRequest?: object | undefined } = {}): JSX.Element {\n const [board, setBoard] = useState<TaskBoardView>({ tasks: [], activities: [], requirements: [] })\n const [directory, setDirectory] = useState<PartnerDirectoryEntryView[]>([])\n const [loading, setLoading] = useState(true), [error, setError] = useState<string>()\n const [selected, setSelected] = useState<string>(), [detailId, setDetailId] = useState<string>()\n const [creating, setCreating] = useState(false), [archived, setArchived] = useState(false)\n const [query, setQuery] = useState(''), [limit, setLimit] = useState(24)\n useEffect(() => { if (initialTaskId) { setSelected(undefined); setDetailId(undefined); setCreating(false) } }, [initialTaskId, openRequest])\n const load = useBoardRefresh(async () => {\n const [next, collaboration] = await Promise.all([api<TaskBoardView>('/tasks'), api<{ companions: PartnerDirectoryEntryView[] }>('/collaboration')])\n return () => { setBoard(next); setDirectory(collaboration.companions); setLoading(false); setError(undefined); setDetailId(id => next.requirements?.some(r => r.id === id) ? id : undefined) }\n }, reason => { setError(errorMessage(reason)); setLoading(false) }, !selected)\n const requirements = board.requirements ?? []\n const groups = useMemo(() => {\n const result = new Map<string, TaskBoardView['tasks']>()\n for (const task of board.tasks) { const id = task.requirementId ?? 'legacy'; const group = result.get(id) ?? []; group.push(task); result.set(id, group) }\n return result\n }, [board.tasks])\n const visible = requirements.filter(r => (r.status === 'done') === archived && [r.title, r.description, directory.find(c => c.id === r.ownerCompanionId)?.name].some(v => v?.toLocaleLowerCase().includes(query.trim().toLocaleLowerCase()))).sort((a, b) => b.updatedAt - a.updatedAt)\n const detail = requirements.find(r => r.id === detailId)\n if (selected) return <RequirementTasksPanel key={selected} requirementId={selected} back={() => { setSelected(undefined); void load() }} />\n return <div className=\"dsh-partner-feature-page is-board\">\n <WorkspaceHero eyebrow=\"Shared workspace\" title=\"\u9700\u6C42\u770B\u677F\" detail=\"\u6309\u9700\u6C42\u7EC4\u7EC7\u5DE5\u4F5C\uFF0C\u5B50\u4EFB\u52A1\u72EC\u7ACB\u63A8\u8FDB\uFF0C\u6574\u4F53\u5B8C\u6210\u540E\u7EDF\u4E00\u6C47\u603B\u3002\" actions={<button type=\"button\" onClick={() => setCreating(true)}><IconPlusOutline16 size={15} />\u65B0\u9700\u6C42</button>} />\n {error && <WorkspaceNotice>{error}<button type=\"button\" onClick={() => { void load() }}>\u91CD\u8BD5</button></WorkspaceNotice>}\n <div className=\"dsh-partner-requirement-toolbar\">\n <nav className=\"dsh-partner-board-statuses\" aria-label=\"\u9700\u6C42\u8303\u56F4\">{[false, true].map(value => <button type=\"button\" key={String(value)} aria-pressed={archived === value} className={archived === value ? 'is-active' : ''} onClick={() => { setArchived(value); setLimit(24) }}>{value ? '\u5DF2\u5F52\u6863' : '\u8FDB\u884C\u4E2D'}<b>{requirements.filter(r => (r.status === 'done') === value).length}</b></button>)}</nav>\n <label className=\"dsh-partner-board-search\"><span className=\"sr-only\">\u641C\u7D22\u9700\u6C42</span><span aria-hidden=\"true\"><IconSearchOutline16 size={16} /></span><input placeholder=\"\u641C\u7D22\u9700\u6C42\u6216\u8D1F\u8D23\u4EBA\" value={query} onChange={event => { setQuery(event.target.value); setLimit(24) }} /></label>\n </div>\n {loading ? <CollectionSkeleton rows={4} /> : <>\n <div className=\"dsh-partner-requirement-grid\">{visible.slice(0, limit).map(item => {\n const tasks = groups.get(item.id) ?? [], total = item.status === 'done' ? (item.results?.length ?? tasks.length) : tasks.length\n const done = item.status === 'done' ? total : tasks.filter(t => t.status === 'done').length\n const blocked = tasks.filter(t => t.status === 'blocked').length\n return <article key={item.id} className=\"dsh-partner-requirement-card\">\n <button type=\"button\" className=\"dsh-partner-requirement-open\" onClick={() => item.status === 'done' ? setDetailId(item.id) : setSelected(item.id)}>\n <span className=\"dsh-partner-requirement-meta\"><span>{requirementStatus(item)}</span><small>{directory.find(c => c.id === item.ownerCompanionId)?.name ?? '\u4EBA\u5DE5\u6536\u5C3E'}</small></span>\n <strong title={item.title}>{item.title}</strong><p>{item.summary || item.description || '\u5C1A\u672A\u8865\u5145\u9700\u6C42\u8BF4\u660E'}</p>\n <span className=\"dsh-partner-requirement-progress\" role=\"progressbar\" aria-label=\"\u5B50\u4EFB\u52A1\u9A8C\u6536\u8FDB\u5EA6\" aria-valuemin={0} aria-valuemax={Math.max(total, 1)} aria-valuenow={done}><i style={{ width: `${total ? done / total * 100 : 0}%` }} /></span>\n <span className=\"dsh-partner-requirement-meta\"><small>{done} / {total} \u5DF2\u9A8C\u6536{blocked ? ` \u00B7 ${blocked} \u53D7\u963B` : ''}</small><IconChevronRightOutline14 size={14} /></span>\n </button>\n <footer><small>{new Date(item.updatedAt).toLocaleDateString()} \u66F4\u65B0</small><button type=\"button\" onClick={() => setDetailId(item.id)} aria-haspopup=\"dialog\">{item.lastError ? '\u67E5\u770B\u5F02\u5E38' : '\u9700\u6C42\u8BE6\u60C5'}</button></footer>\n </article>\n })}</div>\n {!visible.length && <div className=\"dsh-partner-collection-empty\"><strong>{query ? '\u6CA1\u6709\u5339\u914D\u7684\u9700\u6C42' : archived ? '\u8FD8\u6CA1\u6709\u5F52\u6863\u9700\u6C42' : '\u4ECE\u4E00\u4E2A\u9700\u6C42\u5F00\u59CB'}</strong><p>{archived ? '\u5B50\u4EFB\u52A1\u5168\u90E8\u9A8C\u6536\u901A\u8FC7\u3001\u5B8C\u6210\u603B\u7ED3\u540E\uFF0C\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002' : '\u5148\u5199\u6E05\u4EA4\u4ED8\u76EE\u6807\uFF0C\u518D\u5B89\u6392\u8D1F\u8D23\u4EBA\u548C\u5B50\u4EFB\u52A1\u3002'}</p></div>}\n {visible.length > limit && <button type=\"button\" onClick={() => setLimit(n => n + 24)}>\u663E\u793A\u66F4\u591A\u9700\u6C42 \u00B7 \u8FD8\u6709 {visible.length - limit} \u9879</button>}\n {!archived && Boolean(groups.get('legacy')?.length) && <button type=\"button\" className=\"dsh-partner-requirement-legacy\" onClick={() => setSelected('legacy')}>\u672A\u5F52\u7C7B\u65E7\u4EFB\u52A1 <b>{groups.get('legacy')!.length}</b><span>\u4FDD\u7559\u539F\u8BB0\u5F55\uFF0C\u4E0D\u81EA\u52A8\u5408\u5E76</span><IconChevronRightOutline14 size={14} /></button>}\n </>}\n {creating && <WorkspaceDialog title=\"\u65B0\u5EFA\u9700\u6C42\" detail=\"\u4E00\u4E2A\u9700\u6C42\u5BF9\u5E94\u4E00\u4EFD\u6700\u7EC8\u4EA4\u4ED8\uFF0C\u7531\u8D1F\u8D23\u4EBA\u7EDF\u4E00\u6536\u5C3E\u3002\" close={() => setCreating(false)}><RequirementForm directory={directory} close={() => setCreating(false)} created={async (item: RequirementView) => { setCreating(false); await load(); setSelected(item.id) }} /></WorkspaceDialog>}\n {detail && <WorkspaceDialog title={detail.title} eyebrow=\"\u9700\u6C42\u8BE6\u60C5\" detail={requirementStatus(detail)} close={() => setDetailId(undefined)} width=\"wide\"><RequirementDetail key={detail.id} item={detail} tasks={groups.get(detail.id) ?? []} directory={directory} changed={load} close={() => setDetailId(undefined)} /></WorkspaceDialog>}\n {initialTaskId && <RequirementTasksPanel initialTaskId={initialTaskId} openRequest={openRequest} detailOnly />}\n </div>\n}\n", "import { useCallback, useEffect, useRef } from 'react'\n\n/** Polls without overlap. Explicit refresh invalidates any older response. */\nexport function useBoardRefresh(read: () => Promise<() => void>, failed: (error: unknown) => void, enabled = true): () => Promise<void> {\n const readRef = useRef(read), failedRef = useRef(failed)\n readRef.current = read; failedRef.current = failed\n const epoch = useRef(0), pending = useRef<Promise<void> | undefined>(), mounted = useRef(false)\n const refresh = useCallback(async () => {\n const version = ++epoch.current\n await pending.current\n if (!mounted.current || version !== epoch.current) return\n const request = (async () => {\n try { const commit = await readRef.current(); if (mounted.current && version === epoch.current) commit() }\n catch (error) { if (mounted.current && version === epoch.current) failedRef.current(error) }\n })()\n pending.current = request\n await request\n if (pending.current === request) pending.current = undefined\n }, [])\n useEffect(() => {\n if (!enabled) return\n mounted.current = true\n void refresh()\n const poll = () => { if (!pending.current && document.visibilityState === 'visible') void refresh() }\n const timer = window.setInterval(poll, 4000)\n document.addEventListener('visibilitychange', poll)\n return () => { mounted.current = false; epoch.current++; window.clearInterval(timer); document.removeEventListener('visibilitychange', poll) }\n }, [refresh, enabled])\n return refresh\n}\n", "import { useState, type FormEvent } from 'react'\nimport { IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type BoardTaskView, type PartnerDirectoryEntryView, type RequirementView } from '../client-api.js'\nimport { WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nexport function requirementStatus(item: RequirementView): string {\n if (item.lastError) return item.status === 'done' ? '\u5DF2\u5F52\u6863 \u00B7 \u901A\u77E5\u5F85\u91CD\u8BD5' : '\u6536\u5C3E\u5F85\u91CD\u8BD5'\n return { planning: '\u89C4\u5212\u4E2D', active: '\u63A8\u8FDB\u4E2D', review: '\u6C47\u603B\u4E2D', done: '\u5DF2\u5F52\u6863' }[item.status]\n}\n\nexport function RequirementForm({ directory, close, created }: { directory: PartnerDirectoryEntryView[]; close(): void; created(item: RequirementView): Promise<void> }): JSX.Element {\n const [busy, setBusy] = useState(false), [error, setError] = useState<string>()\n const submit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault(); const data = new FormData(event.currentTarget); setBusy(true); setError(undefined)\n try { const item = await api<RequirementView>('/requirements', { method: 'POST', body: JSON.stringify({ title: data.get('title'), description: data.get('description'), ownerCompanionId: data.get('owner') || undefined }) }); await created(item) }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-task-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <label className=\"is-wide\"><span>\u9700\u6C42\u540D\u79F0</span><input name=\"title\" autoFocus required maxLength={200} placeholder=\"\u8FD9\u6B21\u5E0C\u671B\u5B8C\u6210\u4EC0\u4E48\" /></label>\n <label className=\"is-wide\"><span>\u4EA4\u4ED8\u76EE\u6807</span><textarea name=\"description\" rows={5} maxLength={8000} placeholder=\"\u80CC\u666F\u3001\u9884\u671F\u6210\u679C\u4E0E\u6574\u4F53\u5B8C\u6210\u6807\u51C6\" /></label>\n <label className=\"is-wide\"><span>\u6536\u5C3E\u8D1F\u8D23\u4EBA</span><select name=\"owner\" defaultValue=\"\"><option value=\"\">\u4EBA\u5DE5\u6C47\u603B</option>{directory.map(c => <option value={c.id} key={c.id}>@{c.name}</option>)}</select><small>\u5B50\u4EFB\u52A1\u5168\u90E8\u901A\u8FC7\u9A8C\u6536\u540E\uFF0C\u7531\u8BE5\u4F19\u4F34\u603B\u7ED3\u5E76\u901A\u8FC7\u9700\u6C42\u6765\u6E90\u6E20\u9053\u901A\u77E5\u3002</small></label>\n <footer><button type=\"button\" onClick={close} disabled={busy}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}>{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA\u5E76\u5B89\u6392\u4EFB\u52A1'}</button></footer>\n </form>\n}\n\nexport function RequirementDetail({ item, tasks, directory, changed, close }: { item: RequirementView; tasks: BoardTaskView[]; directory: PartnerDirectoryEntryView[]; changed(): Promise<void>; close(): void }): JSX.Element {\n const [busy, setBusy] = useState(false), [error, setError] = useState<string>(), [confirming, setConfirming] = useState(false), [summary, setSummary] = useState('')\n const done = tasks.filter(t => t.status === 'done').length, ready = tasks.length > 0 && done === tasks.length && item.status !== 'planning'\n const act = async (action: string, body: Record<string, unknown> = {}) => {\n setBusy(true); setError(undefined)\n try { await api(`/requirements/${item.id}${action === 'remove' ? '' : `/${action}`}`, { method: action === 'remove' ? 'DELETE' : 'POST', body: JSON.stringify({ expectedRevision: item.revision, ...body }) }); if (action === 'remove') close(); await changed() }\n catch (reason) { await changed(); setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <div className=\"dsh-partner-task-detail dsh-partner-requirement-detail\" aria-busy={busy}>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <section className=\"dsh-partner-task-description\"><strong>\u4EA4\u4ED8\u76EE\u6807</strong><p>{item.description || '\u672A\u8865\u5145\u4EA4\u4ED8\u76EE\u6807'}</p></section>\n <div className=\"dsh-partner-requirement-facts\"><span>\u6536\u5C3E\u8D1F\u8D23\u4EBA<b>{directory.find(c => c.id === item.ownerCompanionId)?.name ?? '\u4EBA\u5DE5\u6C47\u603B'}</b></span><span>\u5B50\u4EFB\u52A1\u9A8C\u6536<b>{item.status === 'done' ? `${item.results?.length ?? done} \u9879\u5DF2\u5F52\u6863` : `${done} / ${tasks.length}`}</b></span><span>\u901A\u77E5\u65B9\u5F0F<b>{item.creatorSessionId ? '\u9700\u6C42\u6765\u6E90\u4F1A\u8BDD / \u6E20\u9053' : '\u770B\u677F\u5185\u67E5\u770B\u7ED3\u679C'}</b></span></div>\n {item.lastError && <WorkspaceNotice>{item.lastError} \u00B7 \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u91CD\u8BD5\uFF0C\u4E5F\u53EF\u7ACB\u5373\u91CD\u8BD5\u3002<button type=\"button\" disabled={busy} onClick={() => { void act('retry') }}>\u7ACB\u5373\u91CD\u8BD5</button></WorkspaceNotice>}\n {item.summary && <section className=\"dsh-partner-task-result\"><strong>\u6700\u7EC8\u7ED3\u8BBA</strong><p>{item.summary}</p></section>}\n {!!item.results?.length && <details className=\"dsh-partner-requirement-disclosure\"><summary>\u4EA4\u4ED8\u8BB0\u5F55 \u00B7 {item.results.length} \u9879</summary>{item.results.map(result => <section className=\"dsh-partner-task-result\" key={result.id}><strong>{result.title}</strong><p>{result.resultSummary || result.resultAbstract || '\u672A\u63D0\u4F9B\u7ED3\u679C\u6B63\u6587'}</p></section>)}</details>}\n {item.status !== 'done' && <>\n <label className=\"dsh-partner-requirement-owner\"><span>\u8C03\u6574\u6536\u5C3E\u8D1F\u8D23\u4EBA</span><select aria-label=\"\u6536\u5C3E\u8D1F\u8D23\u4EBA\" value={item.ownerCompanionId ?? ''} disabled={busy} onChange={event => { void act('owner', { ownerCompanionId: event.target.value }) }}><option value=\"\">\u4EBA\u5DE5\u6C47\u603B</option>{item.ownerCompanionId && !directory.some(c => c.id === item.ownerCompanionId) && <option value={item.ownerCompanionId}>\u539F\u8D1F\u8D23\u4EBA\u5DF2\u5220\u9664</option>}{directory.map(c => <option value={c.id} key={c.id}>@{c.name}</option>)}</select></label>\n <WorkspaceNotice kind=\"warning\">{item.status === 'planning' ? '\u5168\u90E8\u5B50\u4EFB\u52A1\u5B89\u6392\u597D\u540E\uFF0C\u63D0\u4EA4\u672C\u6B21\u89C4\u5212\uFF1B\u5220\u9664\u5B50\u4EFB\u52A1\u4F1A\u91CD\u65B0\u6253\u5F00\u89C4\u5212\uFF0C\u9700\u786E\u8BA4\u65B0\u7684\u4EA4\u4ED8\u8303\u56F4\u3002' : '\u5B50\u4EFB\u52A1\u7684\u6267\u884C\u548C\u9A8C\u6536\u53EA\u5728\u5185\u90E8\u6D41\u8F6C\uFF0C\u5168\u90E8\u5B8C\u6210\u540E\u624D\u6C47\u603B\u9700\u6C42\u7ED3\u679C\u3002'}</WorkspaceNotice>\n {ready && <details className=\"dsh-partner-requirement-disclosure\"><summary>\u4EBA\u5DE5\u5B8C\u6210\u6536\u5C3E</summary><label><span>\u6700\u7EC8\u7ED3\u8BBA</span><textarea rows={5} maxLength={12000} value={summary} onChange={event => setSummary(event.target.value)} placeholder=\"\u786E\u8BA4\u5B9E\u9645\u4EA4\u4ED8\u5185\u5BB9\u3001\u7ED3\u8BBA\u53CA\u9650\u5236\" /></label><button type=\"button\" disabled={busy || !summary.trim()} onClick={() => { void act('finish', { summary }) }}>\u4FDD\u5B58\u603B\u7ED3\u5E76\u5F52\u6863</button></details>}\n </>}\n <details className=\"dsh-partner-requirement-disclosure\"><summary>\u7BA1\u7406\u9700\u6C42</summary><p>\u5220\u9664\u9700\u6C42\u4F1A\u540C\u65F6\u79FB\u9664\u5B50\u4EFB\u52A1\uFF0C\u5E76\u53D6\u6D88\u5173\u8054\u6267\u884C\u3002\u4E0D\u80FD\u64A4\u9500\uFF0C\u4E0D\u4F1A\u5220\u9664\u5DF2\u751F\u6210\u7684\u4EA4\u4ED8\u6587\u4EF6\u3002</p>{confirming ? <div className=\"dsh-partner-requirement-actions\"><button type=\"button\" disabled={busy} onClick={() => setConfirming(false)}>\u4FDD\u7559\u9700\u6C42</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={() => { void act('remove') }}>\u786E\u8BA4\u5220\u9664\u9700\u6C42\u548C {tasks.length} \u4E2A\u4EFB\u52A1</button></div> : <button type=\"button\" className=\"is-danger\" onClick={() => setConfirming(true)}><IconTrashOutline16 size={14} />\u5220\u9664\u9700\u6C42</button>}</details>\n <footer><button type=\"button\" onClick={close} disabled={busy}>\u5173\u95ED</button>{item.status !== 'done' && <button type=\"button\" className=\"is-primary\" disabled={busy || (item.status === 'planning' && !tasks.length)} onClick={() => { void act(item.status === 'planning' ? 'submit' : 'reopen') }}>{busy ? '\u5904\u7406\u4E2D\u2026' : item.status === 'planning' ? '\u63D0\u4EA4\u89C4\u5212' : '\u8C03\u6574\u4EFB\u52A1\u8303\u56F4'}</button>}</footer>\n </div>\n}\n", "import { useDeferredValue, useEffect, useMemo, useState, type FormEvent } from 'react'\nimport { IconCheckOutline16, IconChevronRightOutline14, IconCloseOutline16, IconPlusOutline16, IconSearchOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type BoardTaskStatusView, type BoardTaskView, type PartnerDelegationView, type PartnerDirectoryEntryView, type TaskActivityView, type TaskBoardView } from '../client-api.js'\nimport { CollectionSkeleton, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\nimport { TaskBoardStage } from './task-board-stage.js'\nimport { useBoardRefresh } from './board-refresh.js'\nimport { RequirementDetail, requirementStatus } from './requirement-dialog.js'\nimport { TaskContractPanel } from './task-contract-panel.js'\nimport type { TaskReviewCheck } from '../tasks/contract.js'\n\nconst COLUMNS: Array<{ id: BoardTaskStatusView; label: string }> = [\n { id: 'backlog', label: '\u6536\u96C6\u7BB1' }, { id: 'ready', label: '\u5F85\u5F00\u59CB' }, { id: 'doing', label: '\u8FDB\u884C\u4E2D' },\n { id: 'review', label: '\u5F85\u9A8C\u6536' }, { id: 'blocked', label: '\u53D7\u963B' }, { id: 'done', label: '\u5DF2\u5B8C\u6210' },\n]\ntype BoardStatusFilter = BoardTaskStatusView | 'all'\n\nexport function RequirementTasksPanel({ initialTaskId, openRequest, requirementId, back, detailOnly = false }: { initialTaskId?: string | undefined; openRequest?: object | undefined; requirementId?: string; back?(): void; detailOnly?: boolean } = {}): JSX.Element {\n const [board, setBoard] = useState<TaskBoardView>({ tasks: [], activities: [] })\n const [directory, setDirectory] = useState<PartnerDirectoryEntryView[]>([])\n const [delegations, setDelegations] = useState<PartnerDelegationView[]>([])\n const [creating, setCreating] = useState(false)\n const [requirementDetail, setRequirementDetail] = useState(false)\n const [selectedTaskId, setSelectedTaskId] = useState<string | undefined>(initialTaskId)\n useEffect(() => { if (initialTaskId) setSelectedTaskId(initialTaskId) }, [initialTaskId, openRequest])\n const [busy, setBusy] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n const [syncedAt, setSyncedAt] = useState<number>()\n const [query, setQuery] = useState('')\n const [statusFilter, setStatusFilter] = useState<BoardStatusFilter>('all')\n const [assigneeFilter, setAssigneeFilter] = useState('all')\n const deferredQuery = useDeferredValue(query.trim().toLocaleLowerCase())\n const tasksById = useMemo(() => new Map(board.tasks.map(item => [item.id, item])), [board.tasks])\n const directoryById = useMemo(() => new Map(directory.map(item => [item.id, item])), [directory])\n const activeDelegationByTaskId = useMemo(() => {\n const result = new Map<string, PartnerDelegationView>()\n for (const delegation of delegations) {\n if ((delegation.status === 'queued' || delegation.status === 'running') && !result.has(delegation.taskId)) result.set(delegation.taskId, delegation)\n }\n return result\n }, [delegations])\n const selectedTask = selectedTaskId ? tasksById.get(selectedTaskId) : undefined\n const requirement = board.requirements?.find(item => item.id === requirementId)\n const requirementTasks = useMemo(() => board.tasks.filter(task => !requirementId || (requirementId === 'legacy' ? !task.requirementId : task.requirementId === requirementId)), [board.tasks, requirementId])\n const dependentsById = useMemo(() => {\n const result = new Map<string, number>()\n for (const task of board.tasks) for (const dependencyId of task.dependencyTaskIds) result.set(dependencyId, (result.get(dependencyId) ?? 0) + 1)\n return result\n }, [board.tasks])\n const scopedTasks = useMemo(() => requirementTasks.filter(task => {\n if (assigneeFilter !== 'all' && (task.assigneeCompanionId ?? 'unassigned') !== assigneeFilter) return false\n if (!deferredQuery) return true\n const dependencies = task.dependencyTaskIds.map(id => tasksById.get(id)?.title ?? '')\n return [task.title, task.description, task.resultAbstract, task.resultSummary, directoryById.get(task.assigneeCompanionId ?? '')?.name, ...dependencies]\n .some(value => value?.toLocaleLowerCase().includes(deferredQuery))\n }), [assigneeFilter, requirementTasks, deferredQuery, directoryById, tasksById])\n const statusCounts = useMemo(() => {\n const result = new Map<BoardTaskStatusView, number>(COLUMNS.map(column => [column.id, 0]))\n for (const task of scopedTasks) result.set(task.status, (result.get(task.status) ?? 0) + 1)\n return result\n }, [scopedTasks])\n const visibleColumns = statusFilter === 'all' ? COLUMNS.filter(column => (statusCounts.get(column.id) ?? 0) > 0) : COLUMNS.filter(column => column.id === statusFilter)\n const tasksByStatus = useMemo(() => {\n const priorityRank: Record<BoardTaskView['priority'], number> = { urgent: 3, high: 2, normal: 1, low: 0 }\n const result = new Map<BoardTaskStatusView, BoardTaskView[]>(COLUMNS.map(column => [column.id, []]))\n for (const task of scopedTasks) {\n if (statusFilter !== 'all' && task.status !== statusFilter) continue\n result.get(task.status)?.push(task)\n }\n for (const tasks of result.values()) tasks.sort((left, right) => priorityRank[right.priority] - priorityRank[left.priority] || right.updatedAt - left.updatedAt)\n return result\n }, [scopedTasks, statusFilter])\n const visibleTaskCount = statusFilter === 'all' ? scopedTasks.length : (statusCounts.get(statusFilter) ?? 0)\n const load = useBoardRefresh(async () => {\n const [next, collaboration] = await Promise.all([api<TaskBoardView>('/tasks'), api<{ companions: PartnerDirectoryEntryView[]; delegations: PartnerDelegationView[] }>('/collaboration')])\n return () => { setBoard(next); setDirectory(collaboration.companions); setDelegations(collaboration.delegations); setSyncedAt(Date.now()); setLoading(false); setSelectedTaskId(id => next.tasks.some(t => t.id === id) ? id : undefined) }\n }, reason => { setError(errorMessage(reason)); setLoading(false) })\n const update = async (task: BoardTaskView, change: Record<string, unknown>): Promise<void> => {\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}`, { method: 'PUT', body: JSON.stringify({ expectedRevision: task.revision, ...change }) }); await load() }\n catch (reason) { await load(); setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const delegate = async (task: BoardTaskView): Promise<void> => {\n if (!task.assigneeCompanionId) return\n setBusy(task.id); setError(undefined)\n try {\n await api(`/tasks/${task.id}/delegate`, { method: 'POST', body: JSON.stringify({ to: task.assigneeCompanionId, request: task.description || `\u5B8C\u6210\u4EFB\u52A1\uFF1A${task.title}` }) })\n await load()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const review = async (task: BoardTaskView): Promise<void> => {\n if (!task.reviewerCompanionId) return\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}/review`, { method: 'POST', body: JSON.stringify({ to: task.reviewerCompanionId }) }); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const accept = async (task: BoardTaskView, checks?: TaskReviewCheck[]): Promise<void> => {\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}/accept`, { method: 'POST', body: JSON.stringify({ expectedRevision: task.revision, checks }) }); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const reject = async (task: BoardTaskView, reason: string, checks?: TaskReviewCheck[]): Promise<void> => {\n if (!reason) return\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}/reject`, { method: 'POST', body: JSON.stringify({ reason, expectedRevision: task.revision, checks }) }); await load() }\n catch (cause) { setError(errorMessage(cause)) } finally { setBusy(undefined) }\n }\n const remove = async (task: BoardTaskView): Promise<void> => {\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}`, { method: 'DELETE' }); if (selectedTaskId === task.id) setSelectedTaskId(undefined); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n return <div className=\"dsh-partner-feature-page is-board\">\n {!detailOnly && <>{back && <nav className=\"dsh-partner-requirement-breadcrumb\"><button type=\"button\" onClick={back}>\u9700\u6C42\u770B\u677F</button><IconChevronRightOutline14 size={14} /><span>{requirement?.title ?? '\u672A\u5F52\u7C7B\u65E7\u4EFB\u52A1'}</span></nav>}<WorkspaceHero eyebrow={requirement ? requirementStatus(requirement) : '\u65E7\u4EFB\u52A1'} title={requirement?.title ?? '\u672A\u5F52\u7C7B\u65E7\u4EFB\u52A1'} detail={requirement?.description || '\u4EFB\u52A1\u6309\u9636\u6BB5\u5C55\u793A\uFF0C\u70B9\u51FB\u67E5\u770B\u4EA4\u4ED8\u3001\u4F9D\u8D56\u548C\u6267\u884C\u72B6\u6001\u3002'} actions={<><span className=\"dsh-partner-board-live\" title={syncedAt ? `\u6700\u8FD1\u540C\u6B65 ${new Date(syncedAt).toLocaleTimeString()}` : '\u6B63\u5728\u8FDE\u63A5'}><i />\u5B9E\u65F6\u540C\u6B65</span>{requirement && <button type=\"button\" onClick={() => setRequirementDetail(true)}>\u9700\u6C42\u8BE6\u60C5</button>}{requirement?.status === 'planning' && <button type=\"button\" onClick={() => setCreating(true)}><IconPlusOutline16 size={15} />\u65B0\u4EFB\u52A1</button>}</>} /></>}\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {requirementDetail && requirement && <WorkspaceDialog eyebrow=\"\u9700\u6C42\u8BE6\u60C5\" title={requirement.title} detail={requirementStatus(requirement)} close={() => setRequirementDetail(false)} width=\"wide\"><RequirementDetail key={requirement.id} item={requirement} tasks={requirementTasks} directory={directory} changed={load} close={() => setRequirementDetail(false)} /></WorkspaceDialog>}\n {creating && requirement && <WorkspaceDialog title=\"\u65B0\u5EFA\u5B50\u4EFB\u52A1\" detail={`\u6240\u5C5E\u9700\u6C42\uFF1A${requirement.title}`} close={() => setCreating(false)} width=\"wide\"><TaskForm requirementId={requirement.id} companions={directory} tasks={requirementTasks} close={() => setCreating(false)} changed={load} /></WorkspaceDialog>}\n {selectedTask && <WorkspaceDialog eyebrow=\"TASK DETAIL\" title={selectedTask.title} detail={taskDialogSummary(selectedTask, directory)} close={() => setSelectedTaskId(undefined)} width=\"wide\"><TaskDetail\n key={selectedTask.id} task={selectedTask} tasks={board.tasks} activities={board.activities.filter(item => item.taskId === selectedTask.id)} directory={directory}\n execution={activeDelegationByTaskId.get(selectedTask.id)}\n busy={busy === selectedTask.id} update={change => { void update(selectedTask, change) }} delegate={() => { void delegate(selectedTask) }} review={() => { void review(selectedTask) }}\n accept={checks => { void accept(selectedTask, checks) }} reject={(reason, checks) => { void reject(selectedTask, reason, checks) }} remove={() => { void remove(selectedTask) }}\n />{error && <WorkspaceNotice>{error}</WorkspaceNotice>}</WorkspaceDialog>}\n {!detailOnly && (loading ? <CollectionSkeleton rows={6} /> : <>\n <div className=\"dsh-partner-board-tools\">\n <label className=\"dsh-partner-board-search\"><span className=\"sr-only\">\u641C\u7D22\u4EFB\u52A1</span><span aria-hidden=\"true\"><IconSearchOutline16 size={16} /></span><input value={query} onChange={event => setQuery(event.target.value)} placeholder=\"\u641C\u7D22\u4EFB\u52A1\u3001\u8D1F\u8D23\u4EBA\u6216\u524D\u7F6E\u4EFB\u52A1\" />{query && <button type=\"button\" onClick={() => setQuery('')} aria-label=\"\u6E05\u9664\u4EFB\u52A1\u641C\u7D22\"><IconCloseOutline16 size={14} /></button>}</label>\n <label className=\"dsh-partner-board-assignee\"><span className=\"sr-only\">\u6309\u8D1F\u8D23\u4EBA\u7B5B\u9009</span><select value={assigneeFilter} onChange={event => setAssigneeFilter(event.target.value)}><option value=\"all\">\u5168\u90E8\u4F19\u4F34</option><option value=\"unassigned\">\u672A\u6307\u6D3E</option>{directory.map(item => <option value={item.id} key={item.id}>@{item.name}</option>)}</select></label>\n <label className=\"dsh-partner-board-assignee is-mobile-stage\"><span className=\"sr-only\">\u6309\u4EFB\u52A1\u9636\u6BB5\u7B5B\u9009</span><select value={statusFilter} onChange={event => setStatusFilter(event.target.value as BoardStatusFilter)}><option value=\"all\">\u5168\u90E8\u9636\u6BB5 \u00B7 {scopedTasks.length}</option>{COLUMNS.map(column => <option value={column.id} key={column.id}>{column.label} \u00B7 {statusCounts.get(column.id) ?? 0}</option>)}</select></label>\n <small aria-live=\"polite\">\u663E\u793A {visibleTaskCount} / {board.tasks.length}</small>\n </div>\n <nav className=\"dsh-partner-board-statuses\" aria-label=\"\u6309\u4EFB\u52A1\u72B6\u6001\u7B5B\u9009\"><button type=\"button\" className={statusFilter === 'all' ? 'is-active' : ''} aria-pressed={statusFilter === 'all'} onClick={() => setStatusFilter('all')}><span>\u5168\u90E8</span><b>{scopedTasks.length}</b></button>{COLUMNS.map(column => <button type=\"button\" key={column.id} className={statusFilter === column.id ? 'is-active' : ''} aria-pressed={statusFilter === column.id} onClick={() => setStatusFilter(column.id)}><span>{column.label}</span><b>{statusCounts.get(column.id) ?? 0}</b></button>)}</nav>\n <div className=\"dsh-partner-board\" data-focused={statusFilter !== 'all'} aria-label=\"\u4EFB\u52A1\u770B\u677F\">{visibleColumns.map(column => {\n const tasks = tasksByStatus.get(column.id) ?? []\n return <TaskBoardStage key={column.id} id={column.id} label={column.label} tasks={tasks} focused={statusFilter !== 'all'} filtered={Boolean(query || assigneeFilter !== 'all')} renderTask={task => <TaskCard\n key={task.id} task={task} tasksById={tasksById} directoryById={directoryById} dependentCount={dependentsById.get(task.id) ?? 0}\n execution={activeDelegationByTaskId.get(task.id)}\n open={() => setSelectedTaskId(task.id)}\n />} />\n })}</div>{!scopedTasks.length && <div className=\"dsh-partner-collection-empty\"><strong>{query || assigneeFilter !== 'all' ? '\u6CA1\u6709\u5339\u914D\u7684\u4EFB\u52A1' : '\u8FD8\u6CA1\u6709\u5B50\u4EFB\u52A1'}</strong><p>{requirement?.status === 'planning' ? '\u6DFB\u52A0\u5B50\u4EFB\u52A1\u5E76\u5B89\u6392\u8D1F\u8D23\u4EBA\uFF0C\u5B8C\u6210\u5206\u5DE5\u540E\u5728\u9700\u6C42\u8BE6\u60C5\u4E2D\u63D0\u4EA4\u89C4\u5212\u3002' : '\u53EF\u8FD4\u56DE\u9700\u6C42\u770B\u677F\u67E5\u770B\u5176\u4ED6\u9700\u6C42\u3002'}</p></div>}</>)}\n </div>\n}\n\nfunction TaskCard({ task, tasksById, directoryById, dependentCount, execution, open }: {\n task: BoardTaskView; tasksById: ReadonlyMap<string, BoardTaskView>; directoryById: ReadonlyMap<string, PartnerDirectoryEntryView>; dependentCount: number; execution: PartnerDelegationView | undefined; open(): void\n}): JSX.Element {\n const dependencies = task.dependencyTaskIds.map(id => tasksById.get(id)).filter((item): item is BoardTaskView => item !== undefined)\n const blockers = dependencies.filter(item => item.status !== 'done')\n const completedDependencies = dependencies.length - blockers.length\n const assignee = directoryById.get(task.assigneeCompanionId ?? '')\n const executionState = task.scheduling ? { label: task.scheduling.message } : execution ? delegationState(execution, blockers.length) : task.autoRun && task.status === 'ready' ? { label: blockers.length ? '\u7B49\u5F85\u524D\u7F6E\u5B8C\u6210' : '\u7B49\u5F85\u8C03\u5EA6' } : undefined\n return <article className=\"dsh-partner-task-card\" data-blocked={blockers.length > 0} data-priority={task.priority}>\n <button type=\"button\" className=\"dsh-partner-task-summary\" aria-haspopup=\"dialog\" onClick={open}><span><span className=\"dsh-partner-task-card-title\"><strong title={task.title}>{task.title}</strong><em>{priorityLabel(task.priority)}</em></span><small className=\"dsh-partner-task-card-owner\">{assignee ? `@${assignee.name}` : '\u672A\u6307\u6D3E'}{task.resultSummary ? ' \u00B7 \u5DF2\u6709\u7ED3\u679C' : ''}{executionState ? ` \u00B7 ${executionState.label}` : ''}</small>{(dependencies.length > 0 || dependentCount > 0) && <span className=\"dsh-partner-task-relations\">{dependencies.length > 0 && <small data-blocked={blockers.length > 0}>\u524D\u7F6E {completedDependencies}/{dependencies.length}</small>}{dependentCount > 0 && <small>\u5B8C\u6210\u540E\u89E3\u9501 {dependentCount}</small>}</span>}</span><IconChevronRightOutline14 size={14} /></button>\n </article>\n}\n\nfunction TaskDetail({ task, tasks, activities, directory, execution, busy, update, delegate, review, accept, reject, remove }: {\n task: BoardTaskView; tasks: BoardTaskView[]; activities: TaskActivityView[]; directory: PartnerDirectoryEntryView[]; execution: PartnerDelegationView | undefined; busy: boolean\n update(change: Record<string, unknown>): void; delegate(): void; review(): void; accept(checks?: TaskReviewCheck[]): void; reject(reason: string, checks?: TaskReviewCheck[]): void; remove(): void\n}): JSX.Element {\n const [rejecting, setRejecting] = useState(false)\n const [checks, setChecks] = useState<TaskReviewCheck[]>([])\n useEffect(() => { setChecks([]) }, [task.id, task.revision])\n const [rejectReason, setRejectReason] = useState('')\n useEffect(() => { if (task.status !== 'review') { setRejecting(false); setRejectReason('') } }, [task.status])\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const byId = useMemo(() => new Map(tasks.map(item => [item.id, item])), [tasks])\n const dependencies = task.dependencyTaskIds.map(id => byId.get(id)).filter((item): item is BoardTaskView => item !== undefined)\n const blockers = dependencies.filter(item => item.status !== 'done')\n const assignee = directory.find(item => item.id === task.assigneeCompanionId)\n const reviewer = directory.find(item => item.id === task.reviewerCompanionId)\n const dependencyCandidates = tasks.filter(item => item.id !== task.id && !task.dependencyTaskIds.includes(item.id) && !dependsOn(item.id, task.id, byId))\n const canExecute = Boolean(task.assigneeCompanionId) && !execution && !['doing', 'review', 'done'].includes(task.status)\n const recentActivities = [...activities].sort((left, right) => right.at - left.at).slice(0, 6)\n const executionState = execution ? delegationState(execution, blockers.length) : undefined\n return <div className=\"dsh-partner-task-detail\">\n <section className=\"dsh-partner-task-description\"><strong>\u4EFB\u52A1\u8BF4\u660E</strong><p>{task.description || '\u6CA1\u6709\u8865\u5145\u8BF4\u660E'}</p></section>\n {task.scheduling && task.status !== 'done' && <section className=\"dsh-partner-task-description\"><strong>{task.scheduling.message}</strong>{task.scheduling.taskIds?.length ? <p>{task.scheduling.taskIds.map(id => byId.get(id)?.title ?? '\u5DF2\u5220\u9664\u4EFB\u52A1').join('\u3001')}</p> : null}{task.scheduling.retryAt ? <small>\u4E0B\u6B21\u91CD\u8BD5\uFF1A{new Date(task.scheduling.retryAt).toLocaleString()}</small> : null}</section>}\n <TaskContractPanel task={task} checks={checks} setChecks={setChecks} busy={busy} />\n <div className=\"dsh-partner-task-fields\"><label><span>\u72B6\u6001</span><select value={task.status} disabled={busy} onChange={event => update({ status: event.target.value, ...(event.target.value === 'done' ? { checks } : {}) })}>{COLUMNS.map(item => <option key={item.id} value={item.id} disabled={(item.id === 'doing' || item.id === 'review' || item.id === 'done') && blockers.length > 0 || item.id === 'done' && task.status !== 'review' && task.status !== 'done'}>{item.label}</option>)}</select></label><label><span>\u8D1F\u8D23\u4EBA</span><select value={task.assigneeCompanionId ?? ''} disabled={busy || task.status === 'doing'} onChange={event => update({ assigneeCompanionId: event.target.value })}><option value=\"\">\u672A\u6307\u6D3E</option>{directory.map(item => <option key={item.id} value={item.id}>@{item.name} \u00B7 {item.availability === 'busy' ? '\u5FD9\u788C' : '\u53EF\u7528'}</option>)}</select></label><label><span>\u9A8C\u6536\u4F19\u4F34</span><select value={task.reviewerCompanionId ?? ''} disabled={busy} onChange={event => update({ reviewerCompanionId: event.target.value })}><option value=\"\">\u7559\u7A7A \u00B7 \u4EBA\u5DE5\u9A8C\u6536</option>{directory.map(item => <option key={item.id} value={item.id}>@{item.name}</option>)}</select></label></div>\n {executionState && <section className=\"dsh-partner-task-execution\" data-state={execution?.status}><i /><span><strong>{executionState.title}</strong><small>{executionState.detail}</small></span></section>}\n <section className=\"dsh-partner-task-dependency\"><header><strong>\u524D\u7F6E\u4EFB\u52A1</strong><small>{blockers.length ? `${blockers.length} \u9879\u672A\u5B8C\u6210\uFF0C\u5F53\u524D\u4EFB\u52A1\u4E0D\u80FD\u542F\u52A8` : dependencies.length ? '\u5DF2\u5168\u90E8\u5B8C\u6210\uFF0C\u53EF\u4EE5\u542F\u52A8' : '\u6CA1\u6709\u524D\u7F6E\u4F9D\u8D56'}</small></header>{dependencies.length > 0 && <div>{dependencies.map(item => <span key={item.id} data-done={item.status === 'done'}><i>{item.status === 'done' ? <IconCheckOutline16 size={12} /> : ''}</i><b>{item.title}</b><button type=\"button\" disabled={busy || ['doing', 'review', 'done'].includes(task.status)} aria-label={`\u79FB\u9664\u524D\u7F6E\u4EFB\u52A1 ${item.title}`} onClick={() => update({ dependencyTaskIds: task.dependencyTaskIds.filter(id => id !== item.id) })}>\u79FB\u9664</button></span>)}</div>}{dependencyCandidates.length > 0 && <label><span className=\"sr-only\">\u589E\u52A0\u524D\u7F6E\u4EFB\u52A1</span><select defaultValue=\"\" disabled={busy || ['doing', 'review', 'done'].includes(task.status)} onChange={event => { const id = event.currentTarget.value; if (id) update({ dependencyTaskIds: [...task.dependencyTaskIds, id] }); event.currentTarget.value = '' }}><option value=\"\">\u589E\u52A0\u524D\u7F6E\u4EFB\u52A1\u2026</option>{dependencyCandidates.map(item => <option value={item.id} key={item.id}>{item.title} \u00B7 {statusLabel(item.status)}</option>)}</select></label>}</section>\n {task.resultSummary && <ResultBlock label=\"\u6267\u884C\u7ED3\u679C\" value={task.resultSummary} />}\n {task.reviewSummary && <ResultBlock label={`\u6838\u9A8C\u610F\u89C1${reviewer ? ` \u00B7 @${reviewer.name}` : ''}`} value={task.reviewSummary} />}\n {recentActivities.length > 0 && <details className=\"dsh-partner-task-activity dsh-partner-requirement-disclosure\"><summary>\u6700\u8FD1\u6D3B\u52A8 \u00B7 {recentActivities.length}</summary><ol>{recentActivities.map(item => <li key={item.id}><span>{item.message}</span><time>{new Date(item.at).toLocaleString()}</time></li>)}</ol></details>}\n {rejecting && <form className=\"dsh-partner-task-reject\" onSubmit={event => { event.preventDefault(); const reason = rejectReason.trim(); if (!reason) return; reject(reason, checks) }}><label><span>\u6253\u56DE\u539F\u56E0</span><textarea autoFocus value={rejectReason} onChange={event => setRejectReason(event.target.value)} rows={3} maxLength={1200} placeholder=\"\u8BF4\u660E\u9700\u8981\u91CD\u505A\u6216\u8865\u5145\u7684\u5185\u5BB9\" /></label><div><button type=\"button\" onClick={() => { setRejecting(false); setRejectReason('') }}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy || !rejectReason.trim()}>\u786E\u8BA4\u6253\u56DE</button></div></form>}\n {confirmingDelete && <div className=\"dsh-partner-task-delete-confirm\" role=\"alert\"><span>\u5220\u9664\u4F1A\u53D6\u6D88\u5173\u8054\u6267\u884C\uFF0C\u4F9D\u8D56\u5B83\u7684\u672A\u5B8C\u6210\u4EFB\u52A1\u5C06\u6682\u505C\u3002\u9700\u6C42\u9700\u91CD\u65B0\u786E\u8BA4\u8303\u56F4\uFF1B\u4E0D\u80FD\u64A4\u9500\u3002</span><div><button type=\"button\" onClick={() => setConfirmingDelete(false)}>\u4FDD\u7559\u4EFB\u52A1</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={remove}>\u786E\u8BA4\u5220\u9664</button></div></div>}\n <footer className=\"dsh-partner-task-actions\"><small>r{task.revision} \u00B7 {new Date(task.updatedAt).toLocaleString()}</small><span>{task.status === 'review' ? <>{task.reviewerCompanionId && <button type=\"button\" disabled={busy} onClick={review}>{busy ? '\u6838\u9A8C\u4E2D\u2026' : `\u4EA4\u7ED9 @${reviewer?.name ?? '\u4F19\u4F34'} \u6838\u9A8C`}</button>}<button type=\"button\" disabled={busy} onClick={() => setRejecting(true)}>\u6253\u56DE\u91CD\u505A</button><button type=\"button\" className=\"is-primary\" disabled={busy || Boolean(task.acceptanceCriteria?.length && (checks.length !== task.acceptanceCriteria.length || checks.some(c => c.verdict !== 'passed' || !c.evidence?.trim())))} onClick={() => accept(checks)}>\u9A8C\u6536\u901A\u8FC7</button></> : <button type=\"button\" disabled={busy || !canExecute} title={blockers.length ? '\u53EF\u63D0\u524D\u6392\u961F\uFF0C\u4F9D\u8D56\u901A\u8FC7\u9A8C\u6536\u540E\u81EA\u52A8\u6267\u884C' : !task.assigneeCompanionId ? '\u8BF7\u5148\u9009\u62E9\u8D1F\u8D23\u4EBA' : undefined} onClick={delegate}>{busy ? '\u6267\u884C\u4E2D\u2026' : execution?.status === 'queued' ? '\u5DF2\u63D0\u4EA4\uFF0C\u7B49\u5F85\u6267\u884C' : task.status === 'doing' ? '\u6B63\u5728\u6267\u884C' : task.status === 'done' ? '\u5DF2\u7ECF\u5B8C\u6210' : `\u4EA4\u7ED9 @${assignee?.name ?? '\u4F19\u4F34'}`}</button>}<button type=\"button\" className=\"is-icon\" aria-label={`\u5220\u9664 ${task.title}`} aria-expanded={confirmingDelete} disabled={busy} onClick={() => setConfirmingDelete(true)}><IconTrashOutline16 size={14} /></button></span></footer>\n </div>\n}\n\nfunction ResultBlock({ label, value }: { label: string; value: string }): JSX.Element {\n return <section className=\"dsh-partner-task-result\"><strong>{label}</strong><p>{value}</p></section>\n}\n\nfunction TaskForm({ requirementId, companions, tasks, close, changed }: { requirementId: string; companions: PartnerDirectoryEntryView[]; tasks: BoardTaskView[]; close(): void; changed(): Promise<void> }): JSX.Element {\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const dependencyOptions = tasks.filter(item => item.status !== 'done')\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n setBusy(true); setError(undefined)\n try {\n await api('/tasks', { method: 'POST', body: JSON.stringify({\n requirementId,\n title: data.get('title'), description: data.get('description'), priority: data.get('priority'),\n autoRun: data.get('submission') === 'run' && Boolean(data.get('assignee')),\n assigneeCompanionId: data.get('assignee') || undefined, reviewerCompanionId: data.get('reviewer') || undefined,\n dependencyTaskIds: data.getAll('dependencyTaskId'),\n acceptanceCriteria: String(data.get('acceptanceCriteria') ?? '').split('\\n').map(s => s.trim()).filter(Boolean),\n resourceKeys: String(data.get('resourceKeys') ?? '').split('\\n').map(s => s.trim()).filter(Boolean),\n }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-task-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>\u4EFB\u52A1\u540D\u79F0</span><input name=\"title\" maxLength={200} required autoFocus placeholder=\"\u4E00\u53E5\u8BDD\u8BF4\u660E\u4EA4\u4ED8\u76EE\u6807\" /></label><label><span>\u8D1F\u8D23\u4EBA</span><select name=\"assignee\" defaultValue=\"\"><option value=\"\">\u672A\u6307\u6D3E</option>{companions.map(item => <option key={item.id} value={item.id}>@{item.name}</option>)}</select></label><label className=\"is-wide\"><span>\u4EFB\u52A1\u8BF4\u660E</span><textarea name=\"description\" maxLength={8000} rows={5} placeholder=\"\u8865\u5145\u80CC\u666F\u3001\u4EA4\u4ED8\u7269\u548C\u5B8C\u6210\u6761\u4EF6\" /></label><label className=\"is-wide\"><span>\u9A8C\u6536\u6E05\u5355 \u00B7 \u53EF\u9009</span><textarea name=\"acceptanceCriteria\" rows={3} maxLength={10000} placeholder=\"\u6BCF\u884C\u4E00\u9879\u53EF\u6838\u9A8C\u4EA4\u4ED8\uFF0C\u6700\u591A 20 \u9879\" /></label><label className=\"is-wide\"><span>\u72EC\u5360\u8D44\u6E90 \u00B7 \u53EF\u9009</span><textarea name=\"resourceKeys\" rows={2} maxLength={2400} placeholder=\"\u6BCF\u884C\u4E00\u4E2A\u4E00\u81F4\u7684\u8D44\u6E90\u6807\u8BC6\uFF0C\u4F8B\u5982 repo:team/api\uFF1B\u76F8\u540C\u8D44\u6E90\u4E0D\u4F1A\u540C\u65F6\u6267\u884C\" /></label><label><span>\u4F18\u5148\u7EA7</span><select name=\"priority\" defaultValue=\"normal\"><option value=\"low\">\u4F4E</option><option value=\"normal\">\u666E\u901A</option><option value=\"high\">\u9AD8</option><option value=\"urgent\">\u7D27\u6025</option></select></label><label><span>\u9A8C\u6536\u4F19\u4F34</span><select name=\"reviewer\" defaultValue=\"\"><option value=\"\">\u7559\u7A7A \u00B7 \u4EBA\u5DE5\u9A8C\u6536</option>{companions.map(item => <option key={item.id} value={item.id}>@{item.name}</option>)}</select></label><div className=\"dsh-partner-task-form-dependencies is-wide\"><span>\u4F9D\u8D56\u4EFB\u52A1 <small>\u53EF\u9009</small></span>{dependencyOptions.length > 0 ? <div>{dependencyOptions.map(item => <label key={item.id}><input type=\"checkbox\" name=\"dependencyTaskId\" value={item.id} /><i /><span>{item.title}</span><small>{statusLabel(item.status)}</small></label>)}</div> : <p>\u5F53\u524D\u6CA1\u6709\u53EF\u9009\u7684\u672A\u5B8C\u6210\u4EFB\u52A1</p>}<small>\u53EF\u4EE5\u9009\u62E9\u591A\u4E2A\uFF1B\u7559\u7A7A\u8868\u793A\u8BE5\u4EFB\u52A1\u4E0D\u4F9D\u8D56\u5176\u4ED6\u4EFB\u52A1\u3002</small></div><label className=\"is-wide\"><span>\u521B\u5EFA\u540E\u6267\u884C</span><select name=\"submission\" defaultValue=\"run\"><option value=\"run\">\u5DF2\u6307\u5B9A\u8D1F\u8D23\u4EBA\u5219\u81EA\u52A8\u6392\u961F\uFF0C\u7B49\u5F85\u4F9D\u8D56\u5B8C\u6210\u540E\u6267\u884C</option><option value=\"plan\">\u4EC5\u89C4\u5212\uFF0C\u7A0D\u540E\u624B\u52A8\u63D0\u4EA4</option></select></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA\u4EFB\u52A1'}</button></footer></form>\n}\n\nfunction dependsOn(candidateId: string, targetId: string, tasks: Map<string, BoardTaskView>, visited = new Set<string>()): boolean {\n if (candidateId === targetId) return true\n if (visited.has(candidateId)) return false\n visited.add(candidateId)\n return (tasks.get(candidateId)?.dependencyTaskIds ?? []).some(id => dependsOn(id, targetId, tasks, visited))\n}\nfunction statusLabel(value: BoardTaskStatusView): string { return COLUMNS.find(item => item.id === value)?.label ?? value }\nfunction taskDialogSummary(task: BoardTaskView, directory: PartnerDirectoryEntryView[]): string {\n const assignee = directory.find(item => item.id === task.assigneeCompanionId)\n return `${statusLabel(task.status)} \u00B7 ${assignee ? `\u8D1F\u8D23\u4EBA @${assignee.name}` : '\u5C1A\u672A\u6307\u6D3E\u8D1F\u8D23\u4EBA'} \u00B7 ${priorityLabel(task.priority)}`\n}\nfunction priorityLabel(value: BoardTaskView['priority']): string { return ({ low: '\u4F4E\u4F18\u5148\u7EA7', normal: '\u666E\u901A\u4F18\u5148\u7EA7', high: '\u9AD8\u4F18\u5148\u7EA7', urgent: '\u7D27\u6025' })[value] }\nfunction delegationState(value: PartnerDelegationView, blockers = 0): { label: string; title: string; detail: string } {\n const review = value.kind === 'review'\n if (value.status === 'queued') {\n if ((value.attempts ?? 0) === 0) return blockers\n ? { label: '\u7B49\u5F85\u524D\u7F6E\u5B8C\u6210', title: '\u4EFB\u52A1\u5DF2\u63D0\u4EA4\uFF0C\u7B49\u5F85\u4F9D\u8D56', detail: `\u8FD8\u6709 ${blockers} \u4E2A\u524D\u7F6E\u4EFB\u52A1\u672A\u901A\u8FC7\u9A8C\u6536\uFF1B\u5168\u90E8\u5B8C\u6210\u540E\u81EA\u52A8\u6267\u884C\uFF0C\u65E0\u9700\u518D\u6B21\u6307\u6D3E\u3002` }\n : { label: '\u6392\u961F\u4E2D', title: '\u4EFB\u52A1\u5DF2\u63D0\u4EA4', detail: '\u6B63\u5728\u7B49\u5F85\u53EF\u7528\u6267\u884C\u540D\u989D\uFF0C\u65E0\u9700\u518D\u6B21\u6307\u6D3E\u3002' }\n const at = value.nextAttemptAt ? new Date(value.nextAttemptAt).toLocaleString() : '\u7A0D\u540E'\n return { label: '\u7B49\u5F85\u81EA\u52A8\u6062\u590D', title: review ? '\u9A8C\u6536\u5C06\u5728\u8FDE\u63A5\u6062\u590D\u540E\u7EE7\u7EED' : '\u4EFB\u52A1\u5C06\u5728\u8FDE\u63A5\u6062\u590D\u540E\u7EE7\u7EED', detail: `${at} \u81EA\u52A8\u91CD\u8BD5${value.error ? ` \u00B7 ${value.error}` : ''}` }\n }\n const recovered = (value.attempts ?? 1) > 1\n return {\n label: recovered ? `\u7B2C ${value.attempts} \u6B21\u6062\u590D\u4E2D` : review ? '\u4F19\u4F34\u9A8C\u6536\u4E2D' : '\u4F19\u4F34\u6267\u884C\u4E2D',\n title: recovered ? (review ? '\u6B63\u5728\u6062\u590D\u4F19\u4F34\u9A8C\u6536' : '\u6B63\u5728\u6062\u590D\u4F19\u4F34\u4EFB\u52A1') : review ? '\u4F19\u4F34\u6B63\u5728\u6838\u9A8C\u7ED3\u679C' : '\u4F19\u4F34\u6B63\u5728\u6267\u884C\u4EFB\u52A1',\n detail: recovered ? '\u4F1A\u5148\u68C0\u67E5\u5DF2\u6709\u4EA7\u51FA\uFF0C\u907F\u514D\u91CD\u590D\u5199\u5165\u6216\u91CD\u590D\u53D1\u5E03\u3002' : '\u6267\u884C\u72B6\u6001\u4F1A\u81EA\u52A8\u540C\u6B65\uFF0C\u65E0\u9700\u624B\u52A8\u5237\u65B0\u3002',\n }\n}\n", "import { useState, type ReactNode } from 'react'\nimport { IconChevronRightOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { BoardTaskStatusView, BoardTaskView } from '../client-api.js'\n\n/** Bounded progressive disclosure; a single page scroll, no tiny inner scroll box. */\nexport function TaskBoardStage({ id, label, tasks, focused, filtered, renderTask }: {\n id: BoardTaskStatusView; label: string; tasks: BoardTaskView[]; focused: boolean; filtered: boolean\n renderTask(task: BoardTaskView): ReactNode\n}): JSX.Element {\n const [collapsed, setCollapsed] = useState(false)\n const [limit, setLimit] = useState(6)\n const count = Math.max(limit, focused ? 12 : 6)\n const titleId = `dsh-partner-board-${id}`, listId = `${titleId}-list`\n const expanded = !collapsed\n return <section data-status={id} data-empty={tasks.length === 0} aria-labelledby={titleId}>\n <header><button type=\"button\" className=\"dsh-partner-board-stage-toggle\" aria-expanded={expanded} aria-controls={listId} onClick={() => setCollapsed(value => !value)}>\n <IconChevronRightOutline14 size={14} /><strong id={titleId}>{label}</strong><b>{tasks.length}</b>\n </button></header>\n <div id={listId} hidden={!expanded}>\n {tasks.length > 0 ? <>\n <div className=\"dsh-partner-board-column-list\">{tasks.slice(0, count).map(renderTask)}</div>\n {tasks.length > count && <button type=\"button\" className=\"dsh-partner-board-more\" onClick={() => setLimit(count + 12)}>\u5C55\u5F00\u66F4\u591A \u00B7 \u8FD8\u6709 {tasks.length - count} \u9879</button>}\n </> : <p className=\"dsh-partner-board-empty\">{filtered ? '\u6CA1\u6709\u5339\u914D\u4EFB\u52A1' : '\u6682\u65E0\u4EFB\u52A1'}</p>}\n </div>\n </section>\n}\n", "import type { BoardTaskView } from '../client-api.js'\nimport type { TaskReviewCheck } from '../tasks/contract.js'\n\n/** Compact read view; only an explicit review exposes per-item controls. */\nexport function TaskContractPanel({ task, checks, setChecks, busy }: { task: BoardTaskView; checks: TaskReviewCheck[]; setChecks(value: TaskReviewCheck[]): void; busy: boolean }): JSX.Element | null {\n if (!task.acceptanceCriteria?.length && !task.resourceKeys?.length) return null\n const editing = task.status === 'review'\n const change = (criterion: number, patch: Partial<TaskReviewCheck>): void => setChecks((task.acceptanceCriteria ?? []).map((_, i) => ({ criterion: i + 1, verdict: 'unverified' as const, ...checks.find(c => c.criterion === i + 1), ...(criterion === i + 1 ? patch : {}) })))\n return <section className=\"dsh-partner-task-contract\">{Boolean(task.acceptanceCriteria?.length) && <header><strong>\u9A8C\u6536\u6E05\u5355 \u00B7 {task.acceptanceCriteria?.length}</strong><small>\u4F19\u4F34 / \u4EBA\u5DE5\u6838\u9A8C\uFF0C\u4E0D\u7B49\u4E8E\u7A0B\u5E8F\u9A8C\u8BC1</small></header>}\n <ol>{task.acceptanceCriteria?.map((text, i) => {\n const criterion = i + 1, check = checks.find(c => c.criterion === criterion)\n const saved = task.reviewChecks?.find(c => c.criterion === criterion)\n const previous = task.previousAttempt?.reviewChecks?.find(c => c.criterion === criterion)\n const evidence = (task.evidence ?? []).filter(e => e.criterion === criterion)\n return <li key={criterion}><p>{text}</p>\n {evidence.length > 0 && <details className=\"dsh-partner-requirement-disclosure\"><summary>\u6267\u884C\u8BC1\u636E \u00B7 {evidence.length} \u00B7 \u5C1A\u9700\u6838\u9A8C</summary>{evidence.map((e, j) => <div key={j}><code>{e.reference}</code>{e.note && <small>{e.note}</small>}</div>)}</details>}\n {previous?.reason && <small>\u4E0A\u6B21\u6838\u9A8C\uFF1A{previous.reason}</small>}\n {editing ? <div className=\"dsh-partner-task-fields\">\n <label><span>\u7B2C {criterion} \u9879\u7ED3\u8BBA</span><select disabled={busy} value={check?.verdict ?? 'unverified'} onChange={e => change(criterion, { verdict: e.target.value as TaskReviewCheck['verdict'] })}><option value=\"unverified\">\u672A\u9A8C\u8BC1</option><option value=\"passed\">\u5DF2\u6838\u9A8C\u901A\u8FC7</option><option value=\"failed\">\u672A\u901A\u8FC7</option></select></label>\n <label><span>{check?.verdict === 'passed' ? '\u5B9E\u9645\u6838\u9A8C\u8BC1\u636E' : '\u7F3A\u9879 / \u65E0\u6CD5\u6838\u9A8C\u7684\u539F\u56E0'}</span><textarea rows={2} maxLength={1000} disabled={busy} value={(check?.verdict === 'passed' ? check.evidence : check?.reason) ?? ''} onChange={e => change(criterion, check?.verdict === 'passed' ? { evidence: e.target.value } : { reason: e.target.value })} /></label>\n </div> : saved && <small>{saved.verdict === 'passed' ? '\u6838\u9A8C\u901A\u8FC7' : saved.verdict === 'failed' ? '\u672A\u901A\u8FC7' : '\u672A\u9A8C\u8BC1'} \u00B7 {saved.evidence ?? saved.reason}</small>}\n </li>\n })}</ol>\n {task.resourceKeys?.length ? <details className=\"dsh-partner-requirement-disclosure\"><summary>\u72EC\u5360\u8D44\u6E90\u58F0\u660E \u00B7 {task.resourceKeys.length}</summary>{task.resourceKeys.map(key => <code key={key}>{key}</code>)}<small>\u4EC5\u7EA6\u675F\u770B\u677F\u5185\u76F8\u540C\u58F0\u660E\uFF0C\u4E0D\u662F\u64CD\u4F5C\u7CFB\u7EDF\u9501\u3002</small></details> : null}\n </section>\n}\n", "import { useCallback, useEffect, useState, type FormEvent } from 'react'\nimport { IconPlayOutline16, IconPlusOutline16, IconRefreshOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type CompanionView, type ExecutionRunView, type ScheduledTaskView } from '../client-api.js'\nimport { CollectionEmpty, CollectionSkeleton, WorkspaceBlock, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nexport function SchedulePanel({ companions }: { companions: CompanionView[] }): JSX.Element {\n const [schedules, setSchedules] = useState<ScheduledTaskView[]>([])\n const [runs, setRuns] = useState<ExecutionRunView[]>([])\n const [creating, setCreating] = useState(false)\n const [busy, setBusy] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n const load = useCallback(async () => {\n try { const value = await api<{ schedules: ScheduledTaskView[]; runs: ExecutionRunView[] }>('/schedules'); setSchedules(value.schedules); setRuns(value.runs.filter(item => item.kind === 'schedule').slice(-50).reverse()); setError(undefined) }\n catch (reason) { setError(errorMessage(reason)) } finally { setLoading(false) }\n }, [])\n useEffect(() => { void load() }, [load])\n const update = async (entry: ScheduledTaskView, value: Record<string, unknown>): Promise<void> => { setBusy(entry.id); try { await api(`/schedules/${entry.id}`, { method: 'PUT', body: JSON.stringify(value) }); await load() } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) } }\n const run = async (entry: ScheduledTaskView): Promise<void> => { setBusy(entry.id); try { await api(`/schedules/${entry.id}/trigger`, { method: 'POST' }); await load() } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) } }\n const remove = async (entry: ScheduledTaskView): Promise<void> => { setBusy(entry.id); try { await api(`/schedules/${entry.id}`, { method: 'DELETE' }); await load() } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) } }\n return <div className=\"dsh-partner-feature-page\">\n <WorkspaceHero eyebrow=\"Ephemeral automation\" title=\"\u4F19\u4F34\u5B9A\u65F6\u4EFB\u52A1\" detail=\"\u7531\u6307\u5B9A\u4F19\u4F34\u5728\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD\u4E2D\u6267\u884C\uFF1B\u9ED8\u8BA4\u5B8C\u6210\u5373\u9500\u6BC1\uFF0C\u907F\u514D\u957F\u671F\u4F1A\u8BDD\u88AB\u540E\u53F0\u4EFB\u52A1\u6C61\u67D3\u3002\" actions={<><button type=\"button\" disabled={loading} onClick={() => { void load() }}><IconRefreshOutline16 size={15} />\u5237\u65B0</button><button type=\"button\" disabled={companions.length === 0} onClick={() => setCreating(true)}><IconPlusOutline16 size={15} />\u65B0\u8BA1\u5212</button></>} />\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {creating && <WorkspaceDialog title=\"\u65B0\u5EFA\u5B9A\u65F6\u4EFB\u52A1\" detail=\"\u9009\u62E9\u6267\u884C\u4F19\u4F34\u3001\u8FD0\u884C\u9891\u7387\u548C\u4F1A\u8BDD\u4FDD\u7559\u7B56\u7565\u3002\u8BA1\u5212\u521B\u5EFA\u540E\u53EF\u4EE5\u968F\u65F6\u505C\u7528\u6216\u7ACB\u5373\u6267\u884C\u3002\" close={() => setCreating(false)} width=\"wide\"><ScheduleForm companions={companions} close={() => setCreating(false)} changed={load} /></WorkspaceDialog>}\n <WorkspaceBlock title=\"\u6267\u884C\u8BA1\u5212\" detail={`${schedules.filter(item => item.enabled).length} \u4E2A\u542F\u7528`}>\n {loading ? <CollectionSkeleton rows={3} /> : schedules.length === 0 ? <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u5B9A\u65F6\u4EFB\u52A1\" detail=\"\u521B\u5EFA\u8BA1\u5212\u540E\uFF0C\u4F19\u4F34\u4F1A\u6309\u8BBE\u5B9A\u5728\u72EC\u7ACB\u4F1A\u8BDD\u4E2D\u6267\u884C\u3002\" action={<button type=\"button\" disabled={companions.length === 0} onClick={() => setCreating(true)}><IconPlusOutline16 size={14} />\u521B\u5EFA\u7B2C\u4E00\u4E2A\u8BA1\u5212</button>} /> : <div className=\"dsh-partner-schedule-list\">{schedules.map(entry => <article key={entry.id}><span><strong>{entry.title}</strong><p>{entry.prompt}</p><span className=\"dsh-partner-schedule-meta\"><em>@{companionName(companions, entry.companionId)}</em><em>{scheduleLabel(entry)}</em><em>\u4E0B\u6B21 {new Date(entry.nextRunAt).toLocaleString()}</em><em>{entry.destroySessionAfterRun ? '\u6267\u884C\u540E\u9500\u6BC1' : '\u4FDD\u7559\u4F1A\u8BDD'}</em></span></span><button type=\"button\" className=\"dsh-partner-feature-switch\" data-on={entry.enabled} aria-pressed={entry.enabled} disabled={busy === entry.id} onClick={() => { void update(entry, { enabled: !entry.enabled }) }}><i /></button><button type=\"button\" disabled={busy === entry.id} onClick={() => { void run(entry) }}><IconPlayOutline16 size={14} />{busy === entry.id ? '\u6267\u884C\u4E2D\u2026' : '\u7ACB\u5373\u6267\u884C'}</button><button type=\"button\" className=\"is-icon\" disabled={busy === entry.id} onClick={() => { void remove(entry) }} aria-label={`\u5220\u9664 ${entry.title}`}><IconTrashOutline16 size={14} /></button></article>)}</div>}\n </WorkspaceBlock>\n <WorkspaceBlock title=\"\u6700\u8FD1\u8FD0\u884C\" detail=\"\u4FDD\u7559\u6700\u8FD1\u7684\u72B6\u6001\u4E0E\u7ED3\u679C\u6458\u8981\"><div className=\"dsh-partner-run-list\">{runs.map(run => <article key={run.id} data-status={run.status}><i /><span><strong>{schedules.find(item => item.id === run.sourceId)?.title ?? '\u5DF2\u5220\u9664\u8BA1\u5212'} \u00B7 @{companionName(companions, run.ownerCompanionId)}</strong><p>{run.error || run.outputSummary || '\u7B49\u5F85\u7ED3\u679C'}</p><small>{new Date(run.startedAt).toLocaleString()} \u00B7 {run.status} \u00B7 {run.destroyAfterRun ? '\u4F1A\u8BDD\u5DF2\u9500\u6BC1' : '\u4F1A\u8BDD\u4FDD\u7559'}</small></span></article>)}</div>{!loading && runs.length === 0 && <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u6267\u884C\u8BB0\u5F55\" detail=\"\u8BA1\u5212\u7B2C\u4E00\u6B21\u6267\u884C\u540E\uFF0C\u7ED3\u679C\u548C\u8017\u65F6\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\" />}</WorkspaceBlock>\n </div>\n}\n\nfunction ScheduleForm({ companions, close, changed }: { companions: CompanionView[]; close(): void; changed(): Promise<void> }): JSX.Element {\n const [kind, setKind] = useState<'interval' | 'daily'>('interval')\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n const schedule = kind === 'interval' ? { kind, minutes: Number(data.get('minutes')) } : { kind, hour: Number(data.get('hour')), minute: Number(data.get('minute')) }\n setBusy(true); setError(undefined)\n try {\n await api('/schedules', { method: 'POST', body: JSON.stringify({ companionId: data.get('companionId'), title: data.get('title'), prompt: data.get('prompt'), schedule, enabled: true, destroySessionAfterRun: data.get('retain') !== 'on', overlapPolicy: data.get('overlapPolicy'), timeoutMinutes: Number(data.get('timeoutMinutes')) }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-schedule-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>\u8BA1\u5212\u540D\u79F0</span><input name=\"title\" required maxLength={160} autoFocus placeholder=\"\u4F8B\u5982\uFF1A\u6BCF\u65E5\u6574\u7406\u9879\u76EE\u53D8\u5316\" /></label><label><span>\u6267\u884C\u4F19\u4F34</span><select name=\"companionId\" required defaultValue={companions[0]?.id ?? ''}><option value=\"\" disabled>\u9009\u62E9\u4F19\u4F34</option>{companions.map(companion => <option key={companion.id} value={companion.id}>@{companion.name} \u00B7 {companion.role}</option>)}</select></label><label className=\"is-wide\"><span>\u6267\u884C\u5185\u5BB9</span><textarea name=\"prompt\" required maxLength={12000} rows={5} placeholder=\"\u660E\u786E\u8BF4\u660E\u8981\u68C0\u67E5\u3001\u6574\u7406\u6216\u5B8C\u6210\u4EC0\u4E48\uFF0C\u4EE5\u53CA\u5E0C\u671B\u8FD4\u56DE\u4EC0\u4E48\u7ED3\u679C\" /></label><label><span>\u9891\u7387</span><select value={kind} onChange={event => setKind(event.target.value as 'interval' | 'daily')}><option value=\"interval\">\u6BCF\u9694\u4E00\u6BB5\u65F6\u95F4</option><option value=\"daily\">\u6BCF\u5929\u56FA\u5B9A\u65F6\u95F4</option></select></label>{kind === 'interval' ? <label><span>\u95F4\u9694\u5206\u949F</span><input name=\"minutes\" type=\"number\" min={5} max={43200} defaultValue={60} /></label> : <div className=\"dsh-partner-schedule-time\"><label><span>\u5C0F\u65F6</span><input name=\"hour\" type=\"number\" min={0} max={23} defaultValue={9} /></label><label><span>\u5206\u949F</span><input name=\"minute\" type=\"number\" min={0} max={59} defaultValue={0} /></label></div>}<label><span>\u91CD\u53E0\u7B56\u7565</span><select name=\"overlapPolicy\" defaultValue=\"skip\"><option value=\"skip\">\u8DF3\u8FC7\u91CD\u53E0</option><option value=\"queue\">\u6392\u961F\u6267\u884C</option></select></label><label><span>\u8D85\u65F6\u5206\u949F</span><input name=\"timeoutMinutes\" type=\"number\" min={1} max={120} defaultValue={10} /></label><label className=\"dsh-partner-check is-wide\"><input name=\"retain\" type=\"checkbox\" /><i /><span>\u6267\u884C\u540E\u4FDD\u7559\u4E34\u65F6\u4F1A\u8BDD</span></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA\u8BA1\u5212'}</button></footer></form>\n}\nfunction scheduleLabel(entry: ScheduledTaskView): string { return entry.schedule.kind === 'interval' ? `\u6BCF ${entry.schedule.minutes} \u5206\u949F` : `\u6BCF\u5929 ${String(entry.schedule.hour).padStart(2, '0')}:${String(entry.schedule.minute).padStart(2, '0')}` }\nfunction companionName(companions: CompanionView[], id: string): string { return companions.find(item => item.id === id)?.name ?? '\u5DF2\u5220\u9664\u4F19\u4F34' }\n", "import { useEffect, useRef, useState } from 'react'\nimport { IconCheckOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type Capability, type CompanionView, type ModelCatalogView, type PartnerSnapshot } from '../client-api.js'\nimport { CAPABILITY_LABELS } from '../capabilities.js'\nimport { CompanionSkillSettings } from './skills-panel.js'\nimport { CompanionAccessPanel } from './companion-access-panel.js'\nimport { FormField as Field, SectionHeading as Section } from './partner-components.js'\nimport { errorMessage as message } from './workspace-components.js'\nimport { companionDraft } from './companion-draft.js'\n\nexport function CapabilityEditor({ companion, presets, onChanged }: { companion: CompanionView; presets: PartnerSnapshot['presets']; onChanged(): Promise<void> }): JSX.Element {\n const [form, setForm] = useState(() => companionDraft(companion))\n const [modelCatalog, setModelCatalog] = useState<ModelCatalogView>()\n const [saving, setSaving] = useState(false)\n const [saved, setSaved] = useState(false)\n const [error, setError] = useState<string>()\n const savingRef = useRef(false)\n const mounted = useRef(true)\n useEffect(() => { mounted.current = true; return () => { mounted.current = false } }, [])\n useEffect(() => { if (!savingRef.current) setForm(companionDraft(companion)) }, [companion.id, companion.updatedAt])\n useEffect(() => { void api<ModelCatalogView>('/models').then(value => { if (mounted.current) setModelCatalog(value) }).catch(reason => { if (mounted.current) setError(message(reason)) }) }, [])\n const edit = (next: typeof form): void => { if (savingRef.current) return; setForm(next); setSaved(false); setError(undefined) }\n const toggle = (capability: Capability): void => edit({ ...form, capabilities: form.capabilities.includes(capability) ? form.capabilities.filter(item => item !== capability) : [...form.capabilities, capability] })\n const save = async (): Promise<void> => {\n if (savingRef.current) return\n savingRef.current = true\n setSaving(true); setSaved(false); setError(undefined)\n try {\n await api(`/companions/${companion.id}`, { method: 'PUT', body: JSON.stringify({ companion: form }) })\n if (!mounted.current) return\n setSaved(true)\n try { await onChanged() }\n catch { if (mounted.current) setError('\u80FD\u529B\u5DF2\u4FDD\u5B58\uFF0C\u4F46\u5217\u8868\u5237\u65B0\u5931\u8D25\u3002\u5237\u65B0\u9875\u9762\u5373\u53EF\uFF0C\u65E0\u9700\u91CD\u590D\u5E94\u7528\u3002') }\n } catch (reason) { if (mounted.current) setError(`\u4FDD\u5B58\u5931\u8D25\uFF1A${message(reason)}\u3002\u5F53\u524D\u9009\u62E9\u5DF2\u4FDD\u7559\uFF0C\u53EF\u91CD\u8BD5\u3002`) }\n finally { savingRef.current = false; if (mounted.current) setSaving(false) }\n }\n const groups: Array<{ id: string; eyebrow: string; title: string; detail: string; choices: Array<{ id: Capability; title: string; detail: string }> }> = [\n { id: 'tools', eyebrow: 'TOOLS', title: '\u5DE5\u4F5C\u5DE5\u5177', detail: '\u8FDE\u63A5\u5F53\u524D\u4F19\u4F34\u80FD\u591F\u4F7F\u7528\u7684\u4E13\u4E1A\u5DE5\u5177\u3002', choices: [\n { id: 'knowledge', title: '\u77E5\u8BC6\u5E93', detail: '\u5728\u5DF2\u6302\u8F7D\u8303\u56F4\u5185\u68C0\u7D22\u4E0E\u56DE\u5199\u77E5\u8BC6\u3002' },\n { id: 'skills', title: 'Skill', detail: '\u4F7F\u7528\u5355\u72EC\u542F\u7528\u7684 Skill \u4E0E\u5DE5\u4F5C\u6D41\u7A0B\u3002' },\n { id: 'ssh', title: 'SSH', detail: '\u5728 SSH \u63D2\u4EF6\u6388\u6743\u8FB9\u754C\u5185\u64CD\u4F5C\u4E3B\u673A\u3002' },\n { id: 'git', title: 'Git', detail: '\u9884\u7559 Git \u80FD\u529B\uFF0C\u9700\u5BF9\u5E94\u63D2\u4EF6\u5B9E\u9645\u5B89\u88C5\u3002' },\n ] },\n { id: 'coordination', eyebrow: 'COORDINATION', title: '\u534F\u4F5C\u4E0E\u81EA\u52A8\u5316', detail: '\u63A7\u5236\u4F19\u4F34\u5EFA\u7ACB\u5173\u7CFB\u548C\u81EA\u4E3B\u5B89\u6392\u5DE5\u4F5C\u7684\u6743\u9650\u3002', choices: [\n { id: 'companions', title: '\u521B\u5EFA\u4F19\u4F34', detail: '\u6309\u660E\u786E\u9700\u6C42\u521B\u5EFA\u9ED8\u8BA4\u65E0\u6743\u9650\u7684\u65B0\u4F19\u4F34\u3002' },\n { id: 'access', title: '\u4F19\u4F34\u6388\u6743', detail: '\u6309\u660E\u786E\u8981\u6C42\u914D\u7F6E\u4F19\u4F34\u4E4B\u95F4\u7684\u5355\u5411\u8BBF\u95EE\u5173\u7CFB\u3002' },\n { id: 'schedules', title: '\u5B9A\u65F6\u4EFB\u52A1', detail: '\u521B\u5EFA\u5E76\u7BA1\u7406\u7531\u81EA\u5DF1\u6267\u884C\u7684\u5468\u671F\u4EFB\u52A1\u3002' },\n ] },\n { id: 'administration', eyebrow: 'ADMINISTRATION', title: '\u9AD8\u6743\u9650\u7BA1\u7406', detail: '\u4EC5\u6388\u4E88\u53EF\u4FE1\u7684\u7BA1\u7406\u4F19\u4F34\uFF1B\u666E\u901A\u534F\u4F5C\u6388\u6743\u4E0D\u5305\u542B\u4FEE\u6539\u6743\u9650\u3002', choices: [\n { id: 'administration', title: CAPABILITY_LABELS.administration, detail: '\u4FEE\u6539\u5176\u4ED6\u4F19\u4F34\u7684\u8EAB\u4EFD\u3001\u80FD\u529B\u4E0E Preset\u3001\u534F\u4F5C\u3001Skill \u548C\u77E5\u8BC6\u5E93\u6302\u8F7D\u3002\u4E0D\u5171\u4EAB\u4F1A\u8BDD\u3001\u8BB0\u5FC6\u6216\u51ED\u636E\uFF1B\u4E0D\u80FD\u81EA\u6539\u6216\u8F6C\u6388\u672C\u6743\u9650\u3002' },\n ] },\n ]\n const selectedProvider = form.provider || modelCatalog?.defaultSelection.provider || ''\n const modelOptions = modelCatalog?.providers.find(item => item.id === selectedProvider)?.models ?? []\n const currentModelMissing = Boolean(form.model) && !modelOptions.some(item => item.id === form.model)\n return <div className=\"dsh-partner-form is-capabilities\"><Section eyebrow=\"COMPOSITION\" title=\"\u80FD\u529B\u7EC4\u5408\" detail=\"\u4F19\u4F34\u58F0\u660E\u610F\u56FE\u8303\u56F4\uFF1B\u771F\u6B63\u53EF\u8C03\u7528\u7684\u5DE5\u5177\u4ECD\u6765\u81EA\u6240\u9009 Agent Preset\uFF0C\u5E76\u7EE7\u7EED\u6267\u884C\u5404\u63D2\u4EF6\u6743\u9650\u3002\" />\n <div className=\"dsh-partner-runtime-fields\"><Field label=\"Agent Preset\" hint=\"\u5DE5\u5177\u3001Skill \u4E0E\u7CFB\u7EDF\u63D0\u793A\"><select disabled={saving} value={form.presetId} onChange={event => edit({ ...form, presetId: event.target.value })}><option value=\"\">\u8DDF\u968F DSH \u9ED8\u8BA4 Preset</option>{presets.filter(item => !item.broken).map(item => <option value={item.id} key={item.id}>{item.name}</option>)}</select></Field><Field label=\"\u6A21\u578B\u63D0\u4F9B\u65B9\" hint=\"\u6765\u81EA\u5F53\u524D\u5BA2\u6237\u7AEF\"><select disabled={saving} value={form.provider} onChange={event => edit({ ...form, provider: event.target.value, model: '' })}><option value=\"\">\u8DDF\u968F DSH \u9ED8\u8BA4 \u00B7 {modelCatalog?.defaultSelection.provider || '\u6B63\u5728\u8BFB\u53D6'}</option>{modelCatalog?.providers.map(provider => <option value={provider.id} key={provider.id}>{provider.name || provider.id}</option>)}</select></Field><Field label=\"\u6A21\u578B\" hint=\"\u968F\u63D0\u4F9B\u65B9\u8054\u52A8\"><select disabled={saving} value={form.model} onChange={event => edit({ ...form, model: event.target.value })}><option value=\"\">\u8DDF\u968F DSH \u9ED8\u8BA4 \u00B7 {modelCatalog?.defaultSelection.model || '\u6B63\u5728\u8BFB\u53D6'}</option>{currentModelMissing && <option value={form.model}>\u5F53\u524D\u914D\u7F6E \u00B7 {form.model}</option>}{modelOptions.map(model => <option value={model.id} key={model.id}>{model.name || model.id}</option>)}</select></Field></div>\n <p className=\"dsh-partner-inline-note\">\u8EAB\u4EFD\u4E0E\u80FD\u529B\u5728\u4E0B\u4E00\u8F6E\u6267\u884C\u524D\u66F4\u65B0\uFF1BPreset \u4E0E\u6A21\u578B\u4F5C\u4E3A\u4F1A\u8BDD\u9ED8\u8BA4\u914D\u7F6E\uFF0C\u4E0D\u8986\u76D6\u5DF2\u6709\u4F1A\u8BDD\u7684\u9009\u62E9\u3002</p>\n <div className=\"dsh-partner-capability-groups\">{groups.map(group => {\n const enabled = group.choices.filter(choice => form.capabilities.includes(choice.id)).length\n return <section className=\"dsh-partner-capability-group\" key={group.id} aria-labelledby={`partner-capability-${group.id}`}><header><span><small>{group.eyebrow}</small><strong id={`partner-capability-${group.id}`}>{group.title}</strong><p>{group.detail}</p></span><em>{enabled} / {group.choices.length} \u5DF2\u542F\u7528</em></header><div className=\"dsh-partner-capabilities\">{group.choices.map(choice => {\n const active = form.capabilities.includes(choice.id)\n return <button type=\"button\" key={choice.id} disabled={saving} className={active ? 'is-active' : ''} aria-pressed={active} onClick={() => toggle(choice.id)}><span>{active && <IconCheckOutline14 size={14} />}</span><strong>{choice.title}</strong><small>{choice.detail}</small></button>\n })}</div></section>\n })}</div>\n {form.capabilities.includes('skills') && companion.capabilities.includes('skills') && <CompanionSkillSettings companionId={companion.id} />}\n {form.capabilities.includes('skills') && !companion.capabilities.includes('skills') && <p className=\"dsh-partner-inline-note\">\u5148\u5E94\u7528\u80FD\u529B\u7EC4\u5408\uFF0C\u518D\u4E3A\u5F53\u524D\u4F19\u4F34\u9009\u62E9\u5177\u4F53 Skill\u3002</p>}\n <CompanionAccessPanel companionId={companion.id} />\n {error && <p className=\"dsh-partner-inline-error\" role=\"alert\">{error}</p>}<div className=\"dsh-partner-form-actions is-capability-save\"><span role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">{saved && <><IconCheckOutline14 size={14} /><span>\u5DF2\u4FDD\u5B58\uFF0C\u4E0B\u4E00\u8F6E\u751F\u6548</span></>}</span><button type=\"button\" disabled={saving} aria-busy={saving} onClick={() => { void save() }}>{saving ? '\u6B63\u5728\u4FDD\u5B58\u2026' : '\u5E94\u7528\u80FD\u529B\u7EC4\u5408'}</button></div>\n </div>\n}\n", "export const COMPANION_CAPABILITIES = ['knowledge', 'skills', 'ssh', 'git', 'companions', 'schedules', 'access', 'administration'] as const\nexport type CompanionCapability = typeof COMPANION_CAPABILITIES[number]\n\nexport const CAPABILITY_LABELS: Record<CompanionCapability, string> = {\n knowledge: '\u77E5\u8BC6\u5E93', skills: 'Skill', ssh: 'SSH', git: 'Git', companions: '\u521B\u5EFA\u4F19\u4F34',\n schedules: '\u5B9A\u65F6\u4EFB\u52A1', access: '\u4F19\u4F34\u6388\u6743', administration: '\u4F19\u4F34\u7BA1\u7406\uFF08\u9AD8\u6743\u9650\uFF09',\n}\n\nexport function isCompanionCapability(value: string): value is CompanionCapability {\n return (COMPANION_CAPABILITIES as readonly string[]).includes(value)\n}\n", "import { useCallback, useEffect, useState } from 'react'\nimport { IconCheckOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type CompanionAccessView } from '../client-api.js'\nimport { CollectionEmpty, WorkspaceNotice, errorMessage } from './workspace-components.js'\nimport { CAPABILITY_LABELS, isCompanionCapability } from '../capabilities.js'\n\nexport function CompanionAccessPanel({ companionId }: { companionId: string }): JSX.Element {\n const [access, setAccess] = useState<CompanionAccessView>({ targetIds: [], companions: [] })\n const [busy, setBusy] = useState<string>()\n const [error, setError] = useState<string>()\n const load = useCallback(async () => {\n try { setAccess(await api<CompanionAccessView>(`/companions/${encodeURIComponent(companionId)}/access`)); setError(undefined) }\n catch (reason) { setError(errorMessage(reason)) }\n }, [companionId])\n useEffect(() => { void load() }, [load])\n\n const toggle = async (targetId: string): Promise<void> => {\n const previous = access.targetIds\n const targetIds = previous.includes(targetId) ? previous.filter(id => id !== targetId) : [...previous, targetId]\n setBusy(targetId); setAccess(current => ({ ...current, targetIds })); setError(undefined)\n try {\n const result = await api<{ targetIds: string[] }>(`/companions/${encodeURIComponent(companionId)}/access`, { method: 'PUT', body: JSON.stringify({ targetIds }) })\n setAccess(current => ({ ...current, targetIds: result.targetIds }))\n } catch (reason) { setAccess(current => ({ ...current, targetIds: previous })); setError(errorMessage(reason)) }\n finally { setBusy(undefined) }\n }\n\n return <section className=\"dsh-partner-capability-detail dsh-partner-access\" aria-labelledby=\"dsh-partner-access-title\">\n <header><span><small>DIRECTED ACCESS</small><strong id=\"dsh-partner-access-title\">\u53EF\u8BBF\u95EE\u7684\u4F19\u4F34</strong></span><em>{access.targetIds.length} \u4F4D\u5DF2\u6388\u6743</em></header>\n <p className=\"dsh-partner-access-note\">\u52FE\u9009\u540E\uFF0C\u5F53\u524D\u4F19\u4F34\u80FD\u4E86\u89E3\u5BF9\u65B9\u7684\u516C\u5F00\u80FD\u529B\uFF0C\u5E76\u5728\u4EFB\u52A1\u770B\u677F\u4E2D `@` \u5BF9\u65B9\u6267\u884C\u4EFB\u52A1\u3002\u6388\u6743\u53EA\u6CBF\u5F53\u524D\u65B9\u5411\u751F\u6548\uFF0C\u4E0D\u4F1A\u53CD\u5411\u6388\u6743\uFF0C\u4E5F\u4E0D\u4F1A\u5171\u4EAB\u4F1A\u8BDD\u3001\u8BB0\u5FC6\u3001\u6E20\u9053\u6216\u51ED\u636E\u3002</p>\n {access.companions.length === 0 ? <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u53EF\u6388\u6743\u7684\u4F19\u4F34\" detail=\"\u521B\u5EFA\u7B2C\u4E8C\u4F4D\u4F19\u4F34\u540E\uFF0C\u53EF\u4EE5\u5728\u8FD9\u91CC\u5EFA\u7ACB\u5355\u5411\u534F\u4F5C\u6388\u6743\u3002\" /> : <div className=\"dsh-partner-access-list\">{access.companions.map(companion => {\n const selected = access.targetIds.includes(companion.id)\n const abilities = companion.capabilities.map(capability => isCompanionCapability(capability) ? CAPABILITY_LABELS[capability] : capability)\n return <button type=\"button\" key={companion.id} className={selected ? 'is-active' : ''} aria-pressed={selected} disabled={busy === companion.id} onClick={() => { void toggle(companion.id) }}>\n <span className=\"dsh-partner-access-avatar\" aria-hidden=\"true\">{initials(companion.name)}</span>\n <span className=\"dsh-partner-access-copy\"><strong>@{companion.name}</strong><small>{companion.role}</small><p>{companion.description || '\u672A\u586B\u5199\u4F19\u4F34\u8BF4\u660E'}</p><span>{[...abilities, ...companion.enabledSkills.map(skill => skill.name)].map(item => <em key={item}>{item}</em>)}</span></span>\n <span className=\"dsh-partner-access-check\" aria-hidden=\"true\">{selected && <IconCheckOutline16 size={15} />}</span>\n </button>\n })}</div>}\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n </section>\n}\n\nfunction initials(name: string): string { return [...name.trim()].slice(0, 2).join('').toUpperCase() || 'AI' }\n", "import type { Capability, CompanionView } from '../client-api.js'\n\nexport function companionDraft(companion: CompanionView): { name: string; role: string; description: string; instructions: string; presetId: string; provider: string; model: string; capabilities: Capability[] } { return { name: companion.name, role: companion.role, description: companion.description, instructions: companion.instructions, presetId: companion.presetId ?? '', provider: companion.provider ?? '', model: companion.model ?? '', capabilities: [...companion.capabilities] } }\n", "import { useEffect, useRef, useState, type FormEvent } from 'react'\nimport { IconCheckOutline14, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type CompanionView } from '../client-api.js'\nimport { companionDraft } from './companion-draft.js'\nimport { FormField as Field, SectionHeading as Section } from './partner-components.js'\nimport { errorMessage } from './workspace-components.js'\n\ninterface Props {\n companion: CompanionView\n count: number\n onChanged(): Promise<void>\n onRemoved(id: string): Promise<void>\n}\n\n/** Identity-scoped lifetime prevents confirmations and late results crossing targets. */\nexport function IdentityEditor(props: Props): JSX.Element { return <IdentityEditorForm key={props.companion.id} {...props} /> }\n\nfunction IdentityEditorForm({ companion, count, onChanged, onRemoved }: Props): JSX.Element {\n const [form, setForm] = useState(() => companionDraft(companion))\n const [operation, setOperation] = useState<'save' | 'remove'>()\n const [saved, setSaved] = useState(false)\n const [removed, setRemoved] = useState(false)\n const [error, setError] = useState<string>()\n const [confirmationId, setConfirmationId] = useState<string>()\n const locked = useRef(false)\n const alive = useRef(true)\n useEffect(() => { alive.current = true; return () => { alive.current = false } }, [])\n useEffect(() => { setForm(companionDraft(companion)); setSaved(false); setConfirmationId(undefined) }, [companion.updatedAt])\n const confirming = confirmationId === companion.id\n const busy = operation !== undefined || removed\n const submit = async (event: FormEvent): Promise<void> => {\n event.preventDefault()\n if (locked.current || removed) return\n locked.current = true; setOperation('save'); setError(undefined); setConfirmationId(undefined)\n let committed = false\n try {\n await api(`/companions/${encodeURIComponent(companion.id)}`, { method: 'PUT', body: JSON.stringify({ companion: form }) })\n committed = true\n await onChanged()\n if (alive.current) setSaved(true)\n } catch (reason) {\n if (alive.current) setError(`${committed ? '\u8EAB\u4EFD\u5DF2\u4FDD\u5B58\uFF0C\u4F46\u5237\u65B0\u5931\u8D25\uFF0C\u65E0\u9700\u91CD\u590D\u4FDD\u5B58\uFF1A' : '\u4FDD\u5B58\u5931\u8D25\uFF1A'}${errorMessage(reason)}`)\n } finally { locked.current = false; if (alive.current) setOperation(undefined) }\n }\n const remove = async (): Promise<void> => {\n if (locked.current || removed || !confirming || count <= 1) return\n const targetId = confirmationId\n locked.current = true; setOperation('remove'); setError(undefined); setConfirmationId(undefined)\n let committed = false\n try {\n await api(`/companions/${encodeURIComponent(targetId)}?removeFiles=1`, { method: 'DELETE' })\n committed = true\n if (alive.current) setRemoved(true)\n // Always refresh the parent even if the user switched away during deletion.\n await onRemoved(targetId)\n } catch (reason) {\n if (alive.current) setError(`${committed ? '\u4F19\u4F34\u5DF2\u5220\u9664\uFF0C\u4F46\u9875\u9762\u5237\u65B0\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\uFF0C\u4E0D\u8981\u518D\u6B21\u5220\u9664\uFF1A' : '\u5220\u9664\u5931\u8D25\uFF1A'}${errorMessage(reason)}`)\n } finally { locked.current = false; if (alive.current) setOperation(undefined) }\n }\n return <form id=\"dsh-partner-identity-editor\" className=\"dsh-partner-form is-identity\" aria-busy={operation !== undefined} onSubmit={event => { void submit(event) }}>\n <Section eyebrow=\"IDENTITY\" title=\"\u5DE5\u4F5C\u8EAB\u4EFD\" detail=\"\u5B83\u4E0D\u662F\u4E00\u6B21\u5BF9\u8BDD\u7684\u63D0\u793A\u8BCD\uFF0C\u800C\u662F\u8FD9\u4E2A\u4F19\u4F34\u5728\u684C\u9762\u548C\u5FAE\u4FE1\u4E2D\u7684\u957F\u671F\u884C\u4E3A\u57FA\u7EBF\u3002\" />\n <section className=\"dsh-partner-identity-card\" aria-label=\"\u8EAB\u4EFD\u914D\u7F6E\">\n <div className=\"dsh-partner-fields two\"><Field label=\"\u540D\u5B57\"><input disabled={busy} required maxLength={60} value={form.name} onChange={event => setForm({ ...form, name: event.target.value })} /></Field><Field label=\"\u89D2\u8272\"><input disabled={busy} required maxLength={120} value={form.role} onChange={event => setForm({ ...form, role: event.target.value })} /></Field></div>\n <Field label=\"\u4E00\u53E5\u8BDD\u5B9A\u4F4D\" hint=\"\u7528\u4E8E\u540D\u518C\u8BC6\u522B\uFF0C\u4E0D\u4F1A\u66FF\u4EE3\u5B8C\u6574\u884C\u4E3A\u51C6\u5219\u3002\"><textarea disabled={busy} rows={2} maxLength={500} value={form.description} onChange={event => setForm({ ...form, description: event.target.value })} /></Field>\n <Field label=\"\u957F\u671F\u884C\u4E3A\u51C6\u5219\" hint=\"\u5EFA\u8BAE\u5199\u804C\u8D23\u3001\u8868\u8FBE\u65B9\u5F0F\u4E0E\u8FB9\u754C\uFF1B\u6E20\u9053\u3001\u5DE5\u5177\u548C\u6388\u6743\u7531\u7CFB\u7EDF\u5355\u72EC\u63A7\u5236\u3002\"><textarea disabled={busy} rows={9} maxLength={12000} value={form.instructions} onChange={event => setForm({ ...form, instructions: event.target.value })} /></Field>\n {error && <p className=\"dsh-partner-inline-error\" role=\"alert\">{error}</p>}\n <div className=\"dsh-partner-form-actions\"><span role=\"status\">{saved && <><IconCheckOutline14 size={14} />\u5DF2\u4FDD\u5B58\uFF0C\u4E0B\u4E00\u8F6E\u5C06\u4F7F\u7528\u65B0\u8EAB\u4EFD</>}</span><button disabled={busy}>{operation === 'save' ? '\u6B63\u5728\u4FDD\u5B58\u2026' : '\u4FDD\u5B58\u8EAB\u4EFD'}</button></div>\n </section>\n <div className=\"dsh-partner-identity-danger\" data-confirming={confirming}>\n <span><strong>{removed ? '\u4F19\u4F34\u5DF2\u5220\u9664' : confirming ? `\u786E\u8BA4\u5220\u9664\u300C${companion.name}\u300D\uFF1F` : '\u5220\u9664\u4F19\u4F34'}</strong><small>{confirming ? '\u5C06\u5220\u9664\u8BE5\u4F19\u4F34\u7684\u914D\u7F6E\u3001\u8BB0\u5FC6\u3001\u6302\u5FF5\u3001\u4E13\u5C5E\u76EE\u5F55\u53CA\u5176\u4E2D\u5168\u90E8\u6587\u4EF6\uFF0C\u6B64\u64CD\u4F5C\u4E0D\u53EF\u64A4\u9500\u3002\u5171\u4EAB\u6216\u5F02\u5E38\u76EE\u5F55\u4F1A\u62E6\u622A\uFF1BDSH \u539F\u4F1A\u8BDD\u65E5\u5FD7\u4ECD\u7531\u5BBF\u4E3B\u7BA1\u7406\uFF0C\u4E0D\u5728\u6B64\u6B21\u6E05\u7406\u8303\u56F4\u5185\u3002' : '\u5FC5\u987B\u5148\u89E3\u7ED1\u5FAE\u4FE1\u5E76\u7ED3\u675F\u8FD0\u884C\u4E2D\u7684\u4EFB\u52A1\u3002\u5220\u9664\u53EA\u9488\u5BF9\u672C\u6B21\u786E\u8BA4\u7684\u4F19\u4F34\uFF0C\u4E0D\u4F1A\u8F6C\u4EA4\u8054\u7CFB\u4EBA\u3002'}</small></span>\n <div>{confirming && <button type=\"button\" disabled={busy} className=\"is-secondary\" onClick={() => setConfirmationId(undefined)}>\u53D6\u6D88</button>}<button type=\"button\" className={confirming ? 'is-danger' : ''} disabled={busy || count <= 1} onClick={() => confirming ? void remove() : setConfirmationId(companion.id)}><IconTrashOutline16 size={16} />{operation === 'remove' ? '\u6B63\u5728\u5220\u9664\u2026' : removed ? '\u5DF2\u5220\u9664' : confirming ? '\u786E\u8BA4\u5220\u9664' : '\u5220\u9664'}</button></div>\n </div>\n </form>\n}\n", "import {useState, type ReactNode, type FormEvent} from 'react'\nimport {api, type CompanionView, type PartnerSnapshot, type PairingView} from '../client-api.js'\nimport {SectionHeading, ChannelStatus} from './partner-components.js'\nimport {errorMessage, WorkspaceDialog} from './workspace-components.js'\n\nexport function ChannelsPanel({companion,snapshot,onChanged,weixin}: {companion:CompanionView;snapshot:PartnerSnapshot;onChanged():Promise<void>;weixin:ReactNode}):JSX.Element {\n const [platform,setPlatform]=useState<'matrix'|'mattermost'>('matrix')\n const [name,setName]=useState('')\n const [baseUrl,setBaseUrl]=useState('')\n const [targetId,setTargetId]=useState('')\n const [botToken,setToken]=useState('')\n const [authMode,setAuthMode]=useState<'password'|'token'>('password')\n const [username,setUsername]=useState(''),[password,setPassword]=useState(''),[mfaToken,setMfaToken]=useState('')\n const [busy,setBusy]=useState(false)\n const [feedback,setFeedback]=useState('')\n const [deleting,setDeleting]=useState<string>()\n const [adding,setAdding]=useState(false)\n const [fixedPlatform,setFixedPlatform]=useState(false)\n const [configuring,setConfiguring]=useState<string>()\n const closeAdd=()=>{setAdding(false);setToken('');setPassword('');setMfaToken('')}\n const openAdd=(selected?:'matrix'|'mattermost')=>{\n setFixedPlatform(Boolean(selected));setPlatform(selected??'matrix');setName('');setBaseUrl('');setTargetId('');setUsername('');setPassword('');setToken('');setMfaToken('');setAuthMode('password');setFeedback('');setAdding(true)\n }\n const channels=snapshot.channels.filter(c=>c.companionId===companion.id)\n const pairings=snapshot.pairings.filter(p=>channels.some(c=>c.id===p.channelId))\n const run=async(action:()=>Promise<void>)=>{if(busy)return;setBusy(true);setFeedback('');try{await action()}catch(error){setFeedback(errorMessage(error))}finally{setBusy(false)}}\n const configure=async(save:boolean)=>run(async()=>{\n const body={companionId:companion.id,platform,name:name.trim()||platform,baseUrl:baseUrl.trim(),targetId:targetId.trim(),authMode,...(authMode==='password'?{username,password,mfaToken}:{botToken:botToken.trim()})}\n await api(save?'/channels':'/channels/test',{method:'POST',body:JSON.stringify(body)})\n if(save){await onChanged();closeAdd()}\n setFeedback(save?'\u8D26\u53F7\u5DF2\u4FDD\u5B58\u3002\u8BF7\u542F\u7528\u6E20\u9053\uFF0C\u518D\u5411\u673A\u5668\u4EBA\u53D1\u9001\u79C1\u804A\u6D88\u606F\uFF0C\u6838\u5BF9\u914D\u5BF9\u7801\u5E76\u6279\u51C6\u8054\u7CFB\u4EBA\u3002':'\u8D26\u53F7\u9A8C\u8BC1\u901A\u8FC7\uFF0C\u53EF\u4EE5\u4FDD\u5B58\u3002')\n })\n return <div className=\"dsh-partner-form is-channel dsh-partner-channels\">\n <div className=\"dsh-partner-channel-toolbar\">\n <SectionHeading eyebrow=\"CHANNELS\" title=\"\u6211\u7684\u6E20\u9053\" detail=\"\u67E5\u770B\u8FDE\u63A5\u72B6\u6001\uFF0C\u7BA1\u7406\u8054\u7CFB\u4EBA\u4E0E\u901A\u77E5\u6295\u9012\u3002\" />\n <button type=\"button\" onClick={()=>openAdd()}>\u6DFB\u52A0\u6E20\u9053</button>\n </div>\n {!adding&&feedback&&<p role=\"status\">{feedback}</p>}\n {adding&&<WorkspaceDialog title={fixedPlatform?`${platform==='matrix'?'Matrix':'Mattermost'} \u914D\u7F6E`:'\u6DFB\u52A0\u6E20\u9053'} detail={platform==='matrix'?'\u5148\u767B\u5F55\uFF0C\u518D\u9080\u8BF7\u673A\u5668\u4EBA\u8FDB\u5165\u672A\u52A0\u5BC6\u53CC\u4EBA\u623F\u95F4\u5E76\u53D1\u6D88\u606F\u914D\u5BF9\u3002':'\u5148\u767B\u5F55\uFF0C\u518D\u5411\u673A\u5668\u4EBA\u53D1\u79C1\u804A\u6D88\u606F\uFF0C\u6838\u5BF9\u914D\u5BF9\u7801\u540E\u6388\u6743\u3002'} close={()=>{if(!busy)closeAdd()}}>\n <form className=\"dsh-partner-feature-form dsh-partner-channel-form\" aria-busy={busy} onSubmit={(event:FormEvent)=>{event.preventDefault();void configure(true)}}>\n {!fixedPlatform&&<FormField label=\"\u5E73\u53F0\"><select autoFocus disabled={busy} value={platform} onChange={e=>{setPlatform(e.target.value as typeof platform);setPassword('');setToken('');setMfaToken('');setTargetId('');setFeedback('')}}><option value=\"matrix\">Matrix</option><option value=\"mattermost\">Mattermost</option></select></FormField>}\n <FormField label=\"\u6E20\u9053\u540D\u79F0\"><input autoFocus={fixedPlatform} disabled={busy} maxLength={80} value={name} onChange={e=>setName(e.target.value)} placeholder={`\u4F8B\u5982\uFF1A\u6211\u7684 ${platform==='matrix'?'Matrix':'Mattermost'}`} /></FormField>\n <FormField label=\"\u670D\u52A1\u5668\u5730\u5740\"><input disabled={busy} required type=\"url\" value={baseUrl} onChange={e=>setBaseUrl(e.target.value)} placeholder=\"https://chat.example.com\" /></FormField>\n <details><summary>\u9AD8\u7EA7\u914D\u7F6E\uFF08\u53EF\u9009\uFF09</summary><FormField label={platform==='matrix'?'\u56FA\u5B9A\u623F\u95F4 ID':'\u56FA\u5B9A DM \u4F1A\u8BDD ID'} hint=\"\u7559\u7A7A\u5219\u81EA\u52A8\u53D1\u73B0\u79C1\u804A\uFF0C\u901A\u8FC7\u914D\u5BF9\u6388\u6743\u3002\u586B\u5199\u540E\u4EC5\u76D1\u542C\u6307\u5B9A\u4F1A\u8BDD\u3002\"><input disabled={busy} value={targetId} onChange={e=>setTargetId(e.target.value)} placeholder={platform==='matrix'?'!room:example.com':'DM channel ID'} /></FormField></details>\n <FormField label=\"\u767B\u5F55\u65B9\u5F0F\"><select disabled={busy} value={authMode} onChange={e=>{setAuthMode(e.target.value as typeof authMode);setToken('');setPassword('');setMfaToken('')}}><option value=\"password\">\u8D26\u53F7\u5BC6\u7801</option><option value=\"token\">Access Token</option></select></FormField>\n {authMode==='password'?<>\n <FormField label=\"\u8D26\u53F7\"><input disabled={busy} required autoComplete=\"username\" value={username} onChange={e=>setUsername(e.target.value)} placeholder={platform==='matrix'?'@\u8D26\u53F7:\u670D\u52A1\u5668\u57DF\u540D':'\u7528\u6237\u540D\u6216\u90AE\u7BB1'}/></FormField>\n <FormField label=\"\u5BC6\u7801\" hint=\"\u4EC5\u7528\u4E8E\u6362\u53D6\u4EE4\u724C\uFF0C\u4E0D\u4FDD\u5B58\u5BC6\u7801\uFF1B\u8BF7\u4F18\u5148\u4F7F\u7528 HTTPS \u670D\u52A1\u5668\u3002\"><input disabled={busy} required type=\"password\" autoComplete=\"current-password\" value={password} onChange={e=>setPassword(e.target.value)}/></FormField>\n {platform==='mattermost'&&<FormField label=\"\u53CC\u91CD\u9A8C\u8BC1\u9A8C\u8BC1\u7801\uFF08\u5982\u5DF2\u5F00\u542F\uFF09\"><input disabled={busy} autoComplete=\"one-time-code\" inputMode=\"numeric\" value={mfaToken} onChange={e=>setMfaToken(e.target.value)}/></FormField>}\n </>:<FormField label=\"Access Token\" hint=\"\u4EC5\u4FDD\u5B58\u81F3 DSH \u51ED\u636E\u5E93\uFF1B\u5EFA\u8BAE HTTPS\uFF0CHTTP \u4F1A\u660E\u6587\u4F20\u8F93\u51ED\u636E\u3002\"><input disabled={busy} required type=\"password\" autoComplete=\"new-password\" value={botToken} onChange={e=>setToken(e.target.value)} /></FormField>}\n {feedback&&<p role=\"status\">{feedback}</p>}\n <footer><button type=\"button\" disabled={busy} onClick={closeAdd}>\u53D6\u6D88</button><button type=\"button\" disabled={busy||!(authMode==='password'?username&&password:botToken)||!baseUrl} onClick={()=>void configure(false)}>\u6D4B\u8BD5\u8FDE\u63A5</button><button className=\"is-primary\" disabled={busy}>{busy?'\u5904\u7406\u4E2D\u2026':'\u4FDD\u5B58\u6E20\u9053'}</button></footer>\n </form>\n </WorkspaceDialog>}\n <div className=\"dsh-partner-channel-list\">\n <div className=\"dsh-partner-channel-row\">\n <span><strong>\u5FAE\u4FE1</strong><small>{channels.some(c=>!c.platform||c.platform==='weixin')?'\u7BA1\u7406\u8FDE\u63A5\u4E0E\u79C1\u804A\u6388\u6743':'\u5C1A\u672A\u8FDE\u63A5 \u00B7 \u626B\u7801\u63A5\u5165'}</small></span>{channels.find(c=>!c.platform||c.platform==='weixin')&&<ChannelStatus channel={channels.find(c=>!c.platform||c.platform==='weixin')!}/>}<button type=\"button\" aria-label=\"\u914D\u7F6E\u5FAE\u4FE1\" onClick={()=>setConfiguring('weixin')}>\u914D\u7F6E</button>\n {configuring==='weixin'&&<WorkspaceDialog title=\"\u5FAE\u4FE1\u914D\u7F6E\" detail=\"\u7BA1\u7406\u626B\u7801\u767B\u5F55\u3001\u8FDE\u63A5\u4E0E\u8054\u7CFB\u4EBA\u6388\u6743\u3002\" close={()=>setConfiguring(undefined)}>{weixin}</WorkspaceDialog>}\n </div>\n {(['matrix','mattermost'] as const).filter(platform=>!channels.some(c=>c.platform===platform)).map(platform=><div className=\"dsh-partner-channel-row\" key={platform}><span><strong>{platform==='matrix'?'Matrix':'Mattermost'}</strong><small>\u5C1A\u672A\u8FDE\u63A5</small></span><button type=\"button\" aria-label={`\u914D\u7F6E ${platform}`} onClick={()=>openAdd(platform)}>\u914D\u7F6E</button></div>)}\n {channels.filter(c=>c.platform&&c.platform!=='weixin').map(channel=><div key={channel.id} className=\"dsh-partner-channel-row\">\n <span><strong>{channel.name}</strong><small>{channel.platform} \u00B7 {pairings.filter(p=>p.channelId===channel.id&&p.status==='pending').length} \u4E2A\u5F85\u6388\u6743</small></span><ChannelStatus channel={channel}/><button type=\"button\" aria-label={`\u914D\u7F6E ${channel.name}`} onClick={()=>{setFeedback('');setConfiguring(channel.id)}}>\u914D\u7F6E</button>\n {configuring===channel.id&&<WorkspaceDialog title={`${channel.name} \u00B7 \u914D\u7F6E`} detail=\"\u7BA1\u7406\u8FDE\u63A5\u72B6\u6001\u53CA\u8054\u7CFB\u4EBA\u8BBF\u95EE\u6743\u9650\u3002\" close={()=>{if(!busy){setConfiguring(undefined);setDeleting(undefined)}}}>\n <div className=\"dsh-partner-channel-detail dsh-partner-channel-manage\">\n <div className=\"dsh-partner-channel-connection\"><span><small>\u767B\u5F55\u8D26\u53F7</small><strong>{channel.accountId}</strong>{channel.direct?.targetId&&<small>{channel.direct.targetId}</small>}</span><ChannelStatus channel={channel}/></div>\n {!channel.direct?.targetId&&<p>\u5411\u673A\u5668\u4EBA\u53D1\u79C1\u804A\u6D88\u606F\uFF0C\u5728\u4E0B\u65B9\u6838\u5BF9\u914D\u5BF9\u7801\u540E\u6279\u51C6\u3002\u8BF7\u6C42\u4F1A\u81EA\u52A8\u66F4\u65B0\u3002</p>}\n {channel.lastError&&<p role=\"alert\">{channel.lastError}</p>}\n <div className=\"dsh-partner-form-actions\"><button disabled={busy} onClick={()=>void run(async()=>{await api(`/channels/${channel.id}/enabled`,{method:'POST',body:JSON.stringify({enabled:!channel.enabled})});await onChanged()})}>{channel.enabled?'\u505C\u7528':'\u542F\u7528'}</button>\n {channel.enabled&&channel.runtimeStatus==='error'&&<button disabled={busy} onClick={()=>void run(async()=>{await api(`/channels/${channel.id}/enabled`,{method:'POST',body:JSON.stringify({enabled:true})});await onChanged()})}>\u91CD\u8FDE</button>}\n <button disabled={busy} onClick={()=>deleting===channel.id?void run(async()=>{await api(`/channels/${channel.id}`,{method:'DELETE'});setDeleting(undefined);await onChanged()}):setDeleting(channel.id)}>{deleting===channel.id?'\u786E\u8BA4\u5220\u9664\u914D\u7F6E\u4E0E\u51ED\u636E':'\u5220\u9664\u6E20\u9053'}</button>\n {deleting===channel.id&&<button onClick={()=>setDeleting(undefined)}>\u53D6\u6D88</button>}\n </div>\n <section className=\"dsh-partner-channel-access\"><h3>\u8054\u7CFB\u4EBA\u6388\u6743</h3><p role=\"status\">{pairings.filter(p=>p.channelId===channel.id&&p.status==='pending').length} \u4E2A\u7B49\u5F85\u6279\u51C6 \u00B7 \u81EA\u52A8\u5237\u65B0</p>\n {pairings.filter(p=>p.channelId===channel.id).map(p=><div key={p.id} className=\"dsh-partner-channel-person\"><div><strong>{p.displayName}</strong><small>{p.status==='approved'?'\u5DF2\u6388\u6743':p.status==='pending'?'\u7B49\u5F85\u6279\u51C6':'\u5DF2\u963B\u6B62'}</small>{p.status==='pending'&&p.pairingCode&&<span>\u914D\u5BF9\u7801 <code>{p.pairingCode}</code></span>}</div><button disabled={busy} onClick={()=>void run(async()=>{await api(`/pairings/${p.id}/status`,{method:'POST',body:JSON.stringify({status:p.status==='approved'?'blocked':'approved'})});await onChanged()})}>{p.status==='approved'?'\u64A4\u9500\u6388\u6743':'\u6279\u51C6\u8054\u7CFB\u4EBA'}</button></div>)}\n </section>\n {feedback&&<p role=\"status\">{feedback}</p>}\n </div></WorkspaceDialog>}\n </div>)}\n </div>\n <section className=\"dsh-partner-channel-notifications\" aria-label=\"\u901A\u77E5\u8BBE\u7F6E\"><div className=\"dsh-partner-channel-row\"><span><strong>\u901A\u77E5\u4E0E\u4EA4\u4ED8</strong><small>\u9ED8\u8BA4\u8DDF\u968F\u6700\u8FD1\u6E20\u9053</small></span><button type=\"button\" onClick={()=>setConfiguring('delivery')}>\u914D\u7F6E</button></div></section>\n {configuring==='delivery'&&<WorkspaceDialog title=\"\u901A\u77E5\u4E0E\u4EA4\u4ED8\" detail=\"\u8BBE\u7F6E\u901A\u77E5\u6295\u9012\u76EE\u6807\u3002\" close={()=>setConfiguring(undefined)}><div className=\"dsh-partner-channel-detail\"><p>\u672C\u5730\u4E0E\u6240\u6709\u5DF2\u6388\u6743\u6E20\u9053\u5171\u7528\u4F19\u4F34\u4E3B\u5BF9\u8BDD\uFF0C\u65E0\u9700\u5173\u8054\u8054\u7CFB\u4EBA\u3002\u901A\u77E5\u9ED8\u8BA4\u8D70\u6700\u8FD1\u6536\u5230\u6D88\u606F\u7684\u6E20\u9053\uFF1B\u6307\u5B9A\u76EE\u6807\u4E0D\u53EF\u7528\u65F6\u7B49\u5F85\u91CD\u8BD5\uFF0C\u4E0D\u6539\u53D1\u5176\u4ED6\u6E20\u9053\u3002</p>\n {!pairings.some(p=>p.status==='approved')&&<p>\u6279\u51C6\u8054\u7CFB\u4EBA\u540E\uFF0C\u5373\u53EF\u8BBE\u7F6E\u901A\u77E5\u6295\u9012\u76EE\u6807\u3002</p>}\n {pairings.filter(p=>p.status==='approved').map(p=><DeliverySettings key={`${p.id}:${p.updatedAt}`} pairing={p} pairings={pairings} channels={channels} onChanged={onChanged}/>)}\n </div></WorkspaceDialog>}\n </div>\n}\n\nfunction FormField({label,hint,children}:{label:string;hint?:string;children:ReactNode}):JSX.Element {\n return <label className=\"dsh-partner-channel-field\"><span>{label}</span>{children}{hint&&<small>{hint}</small>}</label>\n}\n\nfunction DeliverySettings({pairing,pairings,channels,onChanged}:{pairing:PairingView;pairings:PairingView[];channels:PartnerSnapshot['channels'];onChanged():Promise<void>}):JSX.Element {\n const contactKey=pairing.contactKey??''\n const [target,setTarget]=useState(pairing.deliveryTarget ? pairings.find(p=>p.status==='approved'&&p.channelId===pairing.deliveryTarget?.channelId&&p.userId===pairing.deliveryTarget?.userId)?.id??'unavailable' : '')\n const [busy,setBusy]=useState(false),[error,setError]=useState('')\n return <form className=\"dsh-partner-feature-form dsh-partner-channel-form\" onSubmit={e=>{e.preventDefault();if(busy)return;setBusy(true);setError('');void api(`/pairings/${pairing.id}/delivery`,{method:'POST',body:JSON.stringify({contactKey,targetPairingId:target||null})}).then(onChanged).catch(e=>setError(errorMessage(e))).finally(()=>setBusy(false))}}>\n <h4>{channels.find(c=>c.id===pairing.channelId)?.name} \u00B7 {pairing.displayName}</h4>\n <FormField label=\"\u901A\u77E5\u6295\u9012\u76EE\u6807\"><select disabled={busy} value={target} onChange={e=>setTarget(e.target.value)}><option value=\"\">\u81EA\u52A8\uFF1A\u8BE5\u8054\u7CFB\u4EBA\u6700\u8FD1\u6E20\u9053</option>{target==='unavailable'&&<option value=\"unavailable\" disabled>\u539F\u6307\u5B9A\u76EE\u6807\u4E0D\u53EF\u7528\uFF0C\u8BF7\u660E\u786E\u91CD\u65B0\u9009\u62E9</option>}{pairings.filter(p=>p.status==='approved').map(p=><option key={p.id} value={p.id}>{channels.find(c=>c.id===p.channelId)?.name} \u00B7 {p.displayName}</option>)}</select></FormField>\n <div className=\"dsh-partner-form-actions\"><span role=\"alert\">{error}</span><button disabled={busy}>\u4FDD\u5B58\u6295\u9012\u8BBE\u7F6E</button></div>\n </form>\n}\n", "import {useEffect, type Dispatch, type SetStateAction} from 'react'\nimport {api, type PartnerSnapshot} from '../client-api.js'\n\ntype Status=Pick<PartnerSnapshot,'channels'|'pairings'>\nconst listeners=new Set<(value:Status)=>void>()\nlet timer:ReturnType<typeof setTimeout>|undefined\nlet active:AbortController|undefined\nlet lastValue=''\nasync function poll():Promise<void> {\n if(active||!listeners.size)return\n const controller=new AbortController();active=controller\n try {\n if(document.visibilityState!=='hidden') {\n const value=await api<Status>('/channels/status',{signal:AbortSignal.any([controller.signal,AbortSignal.timeout(10_000)])})\n const serialized=JSON.stringify(value)\n if(serialized!==lastValue){lastValue=serialized;listeners.forEach(listener=>listener(value))}\n }\n } catch { /* Preserve known state during brief network failures. */ }\n finally {\n if(active===controller)active=undefined\n if(listeners.size)timer=setTimeout(()=>void poll(),3000)\n }\n}\nexport function useChannelStatus(setSnapshot:Dispatch<SetStateAction<PartnerSnapshot|undefined>>):void {\n useEffect(()=>{\n const update=(value:Status)=>setSnapshot(previous=>previous?{...previous,...value}:previous)\n listeners.add(update)\n lastValue=''\n if(!active){clearTimeout(timer);void poll()}\n return ()=>{listeners.delete(update);if(!listeners.size){clearTimeout(timer);active?.abort();lastValue=''}}\n },[setSnapshot])\n}\n", "/* Own the identity form skin without changing host forms or theme tokens. */\n#dsh-partner-identity-editor.dsh-partner-form {\n min-width: 0;\n padding: 0;\n border: 0;\n background: transparent;\n box-shadow: none;\n color: var(--partner-text);\n font-family: var(--partner-font-family);\n}\n#dsh-partner-identity-editor .dsh-partner-identity-card {\n min-width: 0;\n padding: 20px;\n border: 1px solid var(--partner-border);\n border-radius: 15px;\n background: var(--partner-card-surface);\n box-shadow: var(--partner-card-shadow);\n}\n#dsh-partner-identity-editor .dsh-partner-field > span { flex-wrap: wrap; gap: 4px 12px; }\n#dsh-partner-identity-editor .dsh-partner-field small { text-align: start; }\n#dsh-partner-identity-editor .dsh-partner-field :is(input, textarea) {\n appearance: none;\n box-sizing: border-box;\n width: 100%;\n min-height: 40px;\n padding: 10px 12px;\n border: 1px solid var(--partner-border);\n border-radius: 10px;\n outline: none;\n color: var(--partner-text);\n background: var(--partner-control);\n font: var(--partner-font-label)/1.5 var(--partner-font-family);\n box-shadow: inset 0 1px 0 var(--partner-glass-highlight);\n}\n#dsh-partner-identity-editor .dsh-partner-field textarea { resize: vertical; }\n#dsh-partner-identity-editor .dsh-partner-field :is(input, textarea):focus {\n border-color: var(--partner-focus-ring);\n background: var(--partner-raised);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent);\n}\n#dsh-partner-identity-editor .dsh-partner-form-actions { flex-wrap: wrap; gap: 12px; }\n#dsh-partner-identity-editor .dsh-partner-form-actions > button {\n min-height: 40px;\n padding: 0 16px;\n border: 1px solid var(--partner-border);\n border-radius: 10px;\n color: var(--partner-on-accent);\n background: var(--partner-accent-strong);\n box-shadow: none;\n font: 600 var(--partner-font-body)/1.4 var(--partner-font-family);\n}\n#dsh-partner-identity-editor .dsh-partner-form-actions > button:hover:not(:disabled) { filter: brightness(.94); }\n#dsh-partner-identity-editor .dsh-partner-identity-danger { flex-wrap: wrap; }\n#dsh-partner-identity-editor .dsh-partner-identity-danger > span { flex: 1 1 250px; }\n#dsh-partner-identity-editor .dsh-partner-identity-danger > div { display: flex; flex-wrap: wrap; gap: 8px; }\n#dsh-partner-identity-editor .dsh-partner-identity-danger button {\n min-height: 36px;\n padding: 6px 12px;\n border: 1px solid color-mix(in srgb, var(--partner-danger) 24%, transparent);\n border-radius: 8px;\n color: var(--partner-danger);\n background: transparent;\n box-shadow: none;\n font: var(--partner-font-caption)/1.4 var(--partner-font-family);\n}\n#dsh-partner-identity-editor button:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 3px; }\n#dsh-partner-identity-editor :is(input, textarea, button):disabled { opacity: .55; cursor: default; }\n@media (max-width: 640px) {\n #dsh-partner-identity-editor .dsh-partner-identity-card { padding: 14px; }\n #dsh-partner-identity-editor .dsh-partner-fields.two { grid-template-columns: minmax(0, 1fr); }\n}\n@media (forced-colors: active) {\n #dsh-partner-identity-editor .dsh-partner-field :is(input, textarea):focus { outline: 2px solid Highlight; }\n}\n", "import { useState, type FormEvent } from 'react'\nimport { IconPlusOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { WorkspaceDialog, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nexport interface NewCompanionDraft {\n name: string\n role: string\n description: string\n instructions: string\n}\n\nexport function CompanionCreateDialog({ close, create }: { close(): void; create(value: NewCompanionDraft): Promise<void> }): JSX.Element {\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault()\n const data = new FormData(event.currentTarget)\n setBusy(true); setError(undefined)\n try {\n await create({\n name: String(data.get('name') ?? '').trim(),\n role: String(data.get('role') ?? '').trim(),\n description: String(data.get('description') ?? '').trim(),\n instructions: String(data.get('instructions') ?? '').trim(),\n })\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <WorkspaceDialog title=\"\u65B0\u5EFA\u4F19\u4F34\" detail=\"\u5148\u5EFA\u7ACB\u6E05\u6670\u7684\u8EAB\u4EFD\u548C\u804C\u8D23\u3002\u6A21\u578B\u3001\u5DE5\u5177\u3001Skill \u4E0E\u534F\u4F5C\u6743\u9650\u4F1A\u5728\u521B\u5EFA\u540E\u5355\u72EC\u914D\u7F6E\u3002\" close={close} width=\"wide\">\n <form className=\"dsh-partner-feature-form dsh-partner-companion-create-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}>\n <label><span>\u4F19\u4F34\u540D\u5B57</span><input name=\"name\" required maxLength={60} autoFocus placeholder=\"\u4F8B\u5982\uFF1A\u5C0F\u9ED1\" /></label>\n <label><span>\u4E3B\u8981\u89D2\u8272</span><input name=\"role\" required maxLength={120} placeholder=\"\u4F8B\u5982\uFF1A\u4EA7\u54C1\u4E0E\u5DE5\u7A0B\u534F\u4F5C\u4F19\u4F34\" /></label>\n <label className=\"is-wide\"><span>\u4E00\u53E5\u8BDD\u5B9A\u4F4D</span><input name=\"description\" maxLength={500} placeholder=\"\u5B83\u4E3B\u8981\u8D1F\u8D23\u4EC0\u4E48\uFF0C\u4EC0\u4E48\u65F6\u5019\u5E94\u8BE5\u627E\u5B83\" /></label>\n <label className=\"is-wide\"><span>\u521D\u59CB\u884C\u4E3A\u51C6\u5219</span><textarea name=\"instructions\" maxLength={12000} rows={7} placeholder=\"\u5199\u6E05\u804C\u8D23\u3001\u8868\u8FBE\u65B9\u5F0F\u3001\u5DE5\u4F5C\u8FB9\u754C\u548C\u4EA4\u4ED8\u6807\u51C6\uFF1B\u4E5F\u53EF\u4EE5\u521B\u5EFA\u540E\u518D\u5B8C\u5584\" /></label>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u6B63\u5728\u521B\u5EFA\u2026' : '\u521B\u5EFA\u4F19\u4F34'}</button></footer>\n </form>\n </WorkspaceDialog>\n}\n", "import { useEffect } from 'react'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\n\n/** Keep host-version differences at the navigation boundary, not in pages. */\nexport function registerMainPanel(\n ctx: Context,\n id: string,\n priority: number,\n render: (props: PropsRuntime<'conversation'>) => JSX.Element,\n onHidden: () => void = () => {},\n): () => void {\n const layout = ctx.layout as unknown as { selectPanel?: (id: string | null) => void }\n if (typeof layout.selectPanel !== 'function') {\n return ctx.slots.register({ name: 'conversation', priority }, render)\n }\n // 0.1.5 moves global panels from the session-scoped conversation seat to\n // root-scoped keyed main entries. This cast is confined to the version bridge.\n const slots = ctx.slots as unknown as {\n register(options: { name: 'main'; key: string }, component: typeof render): () => void\n }\n let disposed = false\n let generation = 0\n const Body = (props: PropsRuntime<'conversation'>): JSX.Element => {\n useEffect(() => {\n const current = ++generation\n return () => {\n // Ignore StrictMode's effect replay and our own explicit removal.\n queueMicrotask(() => { if (!disposed && generation === current) onHidden() })\n }\n }, [])\n return render(props)\n }\n const remove = slots.register({ name: 'main', key: id }, Body)\n const dispose = (): void => { if (disposed) return; disposed = true; remove() }\n try { layout.selectPanel(id) } catch (error) { dispose(); throw error }\n // The host retains registered keys and resets only a removed active key;\n // never select null here, which could close another plugin's newer panel.\n return dispose\n}\n", "import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type { ISessions } from '@deepseek-ai/dsh-api-session-controller/client'\nimport type { SessionId } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport { api } from './client-api.js'\nimport { registerMainPanel } from './main-panel-compat.js'\nimport { activatePluginWorkspace } from './workspace-ownership.js'\n\nexport interface PartnerDestination { page: 'home' | 'board' | 'schedules'; taskId?: string }\nexport interface PartnerController {\n open(companionId?: string, destination?: PartnerDestination): void\n destination(): PartnerDestination | undefined\n close(): void\n toggle(): void\n isOpen(): boolean\n selected(): string | undefined\n openSession(routeId: string, sessionId: string): Promise<void>\n startSession(companionId: string): Promise<void>\n renewSession(routeId: string): Promise<void>\n subscribe(listener: () => void): () => void\n}\n\nexport function createPartnerController(ctx: ClientContext, pluginId: string, render: (props: PropsRuntime<'conversation'>, controller: PartnerController) => JSX.Element): PartnerController {\n const listeners = new Set<() => void>()\n let selected: string | undefined\n let destination: PartnerDestination | undefined\n let dispose: (() => void) | undefined\n const notify = (): void => { for (const listener of listeners) listener() }\n const controller: PartnerController = {\n open(companionId, target) {\n destination = target ?? { page: 'home' }\n if (companionId !== undefined) selected = companionId\n if (dispose === undefined) {\n activatePluginWorkspace(pluginId)\n dispose = registerMainPanel(ctx, pluginId, -3, props => render(props, controller), () => controller.close())\n }\n notify()\n },\n close() { const current = dispose; dispose = undefined; current?.(); notify() },\n toggle() { if (dispose === undefined) controller.open(); else controller.close() },\n isOpen: () => dispose !== undefined,\n selected: () => selected,\n destination: () => destination,\n async openSession(routeId, sessionId) {\n const prepared = await api<{ sessionId: string }>(`/sessions/${encodeURIComponent(routeId)}/prepare`, { method: 'POST' })\n if (prepared.sessionId !== sessionId) throw new Error('\u4F19\u4F34\u4F1A\u8BDD\u6807\u8BC6\u4E0D\u4E00\u81F4')\n await waitForClientSession(ctx, sessionId)\n controller.close()\n sessions(ctx).open(sessionId as SessionId)\n },\n async startSession(companionId) {\n const created = await api<{ routeId: string; sessionId: string }>(`/companions/${encodeURIComponent(companionId)}/session`, { method: 'POST' })\n await waitForClientSession(ctx, created.sessionId)\n controller.close()\n sessions(ctx).open(created.sessionId as SessionId)\n },\n async renewSession(routeId) {\n const renewed = await api<{ routeId: string; sessionId: string }>(`/sessions/${encodeURIComponent(routeId)}/renew`, { method: 'POST' })\n await waitForClientSession(ctx, renewed.sessionId)\n controller.close()\n sessions(ctx).open(renewed.sessionId as SessionId)\n },\n subscribe(listener) { listeners.add(listener); return () => listeners.delete(listener) },\n }\n return controller\n}\n\nfunction waitForClientSession(ctx: ClientContext, sessionId: string): Promise<void> {\n const id = sessionId as SessionId\n const clientSessions = sessions(ctx)\n if (clientSessions.list.getSnapshot().byId[id] !== undefined) return Promise.resolve()\n return new Promise((resolve, reject) => {\n let stop = (): void => {}\n const timeout = window.setTimeout(() => { stop(); reject(new Error('\u4F19\u4F34\u4F1A\u8BDD\u5C1A\u672A\u540C\u6B65\u5230\u7F51\u9875\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5')) }, 5_000)\n stop = clientSessions.list.subscribe(() => {\n if (clientSessions.list.getSnapshot().byId[id] === undefined) return\n window.clearTimeout(timeout); stop(); resolve()\n })\n })\n}\n\nfunction sessions(ctx: ClientContext): ISessions { return ctx.sessions as unknown as ISessions }\n"],
5
- "mappings": "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AAA,MACtG;AAAA,IACF;AAAA,EACF;AACF;AACA,UAAU,cAAc;;;AC5mCxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;;;ACAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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",
6
- "names": ["import_react", "import_dsh_client_ui_primitives", "__defProp", "__hasOwnProp", "_QrCode", "_QrSegment", "React", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_react", "import_dsh_client_ui_primitives", "import_dsh_client_ui_primitives", "import_jsx_runtime", "active", "import_react", "import_react", "import_jsx_runtime", "import_jsx_runtime", "changed", "current", "import_react", "import_jsx_runtime", "source", "target", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "changed", "document", "import_react", "timer", "import_jsx_runtime", "changed", "import_react", "import_jsx_runtime", "current", "import_jsx_runtime", "import_jsx_runtime", "sessions", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "import_react", "import_jsx_runtime", "timer", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "active", "timer", "reason", "current", "import_jsx_runtime", "timer", "poll", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_react", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_react", "apply", "timer", "poll", "import_react", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_jsx_runtime", "module", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "current", "import_react", "import_react", "import_jsx_runtime", "innerWidth", "innerHeight", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_jsx_runtime", "changed", "import_jsx_runtime", "load", "current", "changed", "document", "import_react", "import_dsh_client_ui_primitives", "import_react", "poll", "timer", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "changed", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "load", "changed", "import_jsx_runtime", "load", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "load", "run", "changed", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "load", "current", "import_jsx_runtime", "active", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "import_jsx_runtime", "FormField", "platform", "e", "import_react", "listeners", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "current", "listeners", "current", "import_jsx_runtime", "current", "sessions", "timer"]
3
+ "sources": ["../src/client.tsx", "../src/workspace-ownership.ts", "../node_modules/qrcode.react/lib/esm/index.js", "../src/client.css", "../src/ui/workspace-ui.css", "../src/ui/requirement-board.css", "../src/ui/responsive-ui.css", "../src/ui/companion-picker.css", "../src/pendant/widget.css", "../src/pendant/settings-panel.css", "../src/ui/memory/memory-ui.css", "../src/ui/memory/memory-panel.tsx", "../src/client-api.ts", "../src/ui/workspace-components.tsx", "../src/ui/memory/memory-library.tsx", "../src/ui/partner-components.tsx", "../src/ui/memory/memory-detail.tsx", "../src/ui/memory/memory-cards.tsx", "../src/ui/memory/types.ts", "../src/ui/memory/memory-graph.tsx", "../src/ui/memory/history-view.tsx", "../src/ui/memory/experience-view.tsx", "../src/ui/memory/use-memory-resource.ts", "../src/ui/memory/automation-settings.tsx", "../src/ui/memory/job-feedback.tsx", "../src/ui/memory/concern-panel.tsx", "../src/ui/memory/concern-board.tsx", "../src/time-format.ts", "../src/ui/memory/concern-deletion.tsx", "../src/ui/memory/concern-editor.tsx", "../src/ui/memory/record-target-picker.tsx", "../src/ui/memory/concern-record-fields.tsx", "../src/pendant/settings-panel.tsx", "../src/pendant/settings.ts", "../src/pendant/use-settings.ts", "../src/pendant/card-image.ts", "../src/pendant/strap-preview.tsx", "../src/pendant/strap-style.ts", "../src/pendant/strap-geometry.ts", "../src/pendant/strap-texture.ts", "../src/pendant/widget.tsx", "../src/pendant/use-inbox.ts", "../src/pendant/use-placement.ts", "../src/pendant/reader.tsx", "../src/ui/companion-picker.tsx", "../src/sidebar-anchor.ts", "../src/glass-surface.tsx", "../src/ui/skills-panel.tsx", "../src/ui/skill-import-dialog.tsx", "../src/ui/requirement-board.tsx", "../src/ui/board-refresh.ts", "../src/ui/requirement-dialog.tsx", "../src/ui/requirement-tasks-panel.tsx", "../src/ui/task-board-stage.tsx", "../src/ui/task-contract-panel.tsx", "../src/ui/schedule-panel.tsx", "../src/ui/capability-editor.tsx", "../src/capabilities.ts", "../src/ui/companion-access-panel.tsx", "../src/ui/companion-draft.ts", "../src/ui/identity-editor.tsx", "../src/ui/channels-panel.tsx", "../src/ui/notification-settings.tsx", "../src/ui/use-channel-status.ts", "../src/ui/identity-editor.css", "../src/ui/form-surface.css", "../src/ui/companion-create.tsx", "../src/main-panel-compat.ts", "../src/client-controller.tsx"],
4
+ "sourcesContent": ["import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-theme/client'\nimport { observePluginWorkspace } from './workspace-ownership.js'\nimport {\n IconAgentPresetOutline16, IconChevronDownOutline14, IconChevronLeftOutline14,\n IconDataOutline16, IconEditOutline16, IconLinkOutline16, IconPlusOutline16,\n IconRefreshOutline16, IconUserOutline16, IconBrowseOutline16, IconListPenOutline16, IconPlayOutline16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { QRCodeSVG } from 'qrcode.react'\nimport baseCssText from './client.css'\nimport workspaceCssText from './ui/workspace-ui.css'\nimport requirementCssText from './ui/requirement-board.css'\nimport responsiveCssText from './ui/responsive-ui.css'\nimport pickerCssText from './ui/companion-picker.css'\nimport pendantCssText from './pendant/widget.css'\nimport pendantSettingsCssText from './pendant/settings-panel.css'\nimport memoryCssText from './ui/memory/memory-ui.css'\nimport {MemoryPanel} from './ui/memory/memory-panel.js'\nimport {ConcernPanel} from './ui/memory/concern-panel.js'\nimport { PendantSettingsPanel } from './pendant/settings-panel.js'\nimport { PartnerPendant } from './pendant/widget.js'\nimport { CompanionPicker } from './ui/companion-picker.js'\nimport { api, loadPartner, type ChannelView, type CompanionView, type LoginView, type PartnerSnapshot } from './client-api.js'\nimport { useWorkspaceTopAnchor } from './sidebar-anchor.js'\n\nimport { GlassSurface } from './glass-surface.js'\nimport { SkillsPanel } from './ui/skills-panel.js'\nimport { TaskBoardPanel } from './ui/task-board-panel.js'\nimport { SchedulePanel } from './ui/schedule-panel.js'\nimport { CapabilityEditor } from './ui/capability-editor.js'\nimport { IdentityEditor } from './ui/identity-editor.js'\nimport { ChannelsPanel } from './ui/channels-panel.js'\nimport { useChannelStatus } from './ui/use-channel-status.js'\nimport identityCssText from './ui/identity-editor.css'\nimport formSurfaceCssText from './ui/form-surface.css'\nimport { Avatar, ChannelStatus as Status, ContentState as State, SectionHeading as Section, TabButton, WeixinGlyph, relativeTime } from './ui/partner-components.js'\nimport { errorMessage as message } from './ui/workspace-components.js'\nimport { CompanionCreateDialog, type NewCompanionDraft } from './ui/companion-create.js'\nimport { createPartnerController, type PartnerController as Controller } from './client-controller.js'\nimport { CAPABILITY_LABELS } from './capabilities.js'\n\nconst PLUGIN_ID = '@lemoncat7/dsh-partner'\nconst STYLE_ID = `${PLUGIN_ID}/client`\nconst cssText = `${baseCssText}\\n${workspaceCssText}\\n${pickerCssText}\\n${responsiveCssText}\\n${requirementCssText}\\n${pendantCssText}\\n${pendantSettingsCssText}\\n${memoryCssText}\\n${identityCssText}\\n${formSurfaceCssText}`\ntype SidebarProps = PropsRuntime<'sidebar.footer.action'>\ntype ConversationProps = PropsRuntime<'conversation'>\ntype CompanionTab = 'home' | 'identity' | 'capabilities' | 'weixin' | 'memory' | 'concerns'\ntype WorkspacePage = 'skills' | 'board' | 'schedules' | 'pendant'\ntype View = CompanionTab | WorkspacePage\n\nconst WORKSPACE_PAGES = new Set<View>(['skills', 'board', 'schedules', 'pendant'])\n\nexport const inject = ['slots', 'layout', 'sessions']\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(installStyles, 'dsh-partner: styles')\n const controller = createPartnerController(ctx, PLUGIN_ID, (props, current) => <PartnerWorkspace {...props} controller={current} />)\n ctx.slots.inject('shell.overlay', () => ctx.slots.register({ name: 'shell.overlay', id: 'partner-pendant', order: 30 }, () => <PartnerPendant controller={controller} />))\n ctx.effect(() => observePluginWorkspace(PLUGIN_ID, controller.close), 'dsh-partner: exclusive workspace')\n ctx.effect(() => () => controller.close(), 'dsh-partner: workspace lifecycle')\n ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register({\n name: 'sidebar.footer.action', id: 'partner', order: -120,\n }, props => <PartnerSidebar {...props} controller={controller} collapse={() => ctx.layout.toggleSidebar()} />))\n}\n\nfunction PartnerSidebar(props: SidebarProps & { controller: Controller; collapse(): void }): JSX.Element {\n const ref = useRef<HTMLElement>(null)\n useWorkspaceTopAnchor(ref)\n const [open, setOpen] = useState(true)\n const [snapshot, setSnapshot] = useState<PartnerSnapshot>()\n useChannelStatus(setSnapshot)\n const [, update] = useState(0)\n useEffect(() => props.controller.subscribe(() => update(value => value + 1)), [props.controller])\n useEffect(() => { void loadPartner().then(setSnapshot).catch(() => {}) }, [props.controller.isOpen()])\n const launch = (id?: string): void => {\n props.controller.open(id)\n if (props.wide && window.matchMedia('(max-width: 820px)').matches) props.collapse()\n }\n if (!props.wide) return <section ref={ref} className=\"dsh-partner-sidebar is-rail\"><button type=\"button\" className={`dsh-partner-rail${props.controller.isOpen() ? ' is-active' : ''}`} title=\"\u4F19\u4F34\" onClick={() => props.controller.toggle()}><IconAgentPresetOutline16 size={18} /></button></section>\n return <section ref={ref} className=\"dsh-partner-sidebar\">\n <div className=\"dsh-partner-sidebar-heading\">\n <button type=\"button\" className=\"dsh-partner-sidebar-title\" aria-expanded={open} onClick={() => setOpen(value => !value)}><span data-open={open}><IconChevronDownOutline14 size={14} /></span>\u4F19\u4F34</button>\n </div>\n <div className={`dsh-partner-sidebar-list${open ? ' is-open' : ''}`} aria-hidden={!open}>\n <div className=\"dsh-partner-sidebar-list-inner\">\n <button type=\"button\" tabIndex={open ? 0 : -1} className={`dsh-partner-sidebar-row${props.controller.isOpen() ? ' is-active' : ''}`} onClick={() => launch()}>\n <span className=\"dsh-partner-sidebar-symbol\"><IconAgentPresetOutline16 size={16} /></span><span><strong>\u4F19\u4F34\u9762\u677F</strong><small>{snapshot ? `${snapshot.companions.length} \u4F4D\u4F19\u4F34 \u00B7 ${snapshot.channels.filter(item => item.runtimeStatus === 'running').length} \u4E2A\u6E20\u9053\u5728\u7EBF` : '\u8EAB\u4EFD\u3001\u80FD\u529B\u4E0E\u6E20\u9053'}</small></span><i className={snapshot?.channels.some(item => item.runtimeStatus === 'running') ? 'is-online' : ''} />\n </button>\n </div>\n </div>\n </section>\n}\n\nfunction PartnerWorkspace({ controller }: ConversationProps & { controller: Controller }): JSX.Element {\n const [snapshot, setSnapshot] = useState<PartnerSnapshot>()\n useChannelStatus(setSnapshot)\n const [selectedId, setSelectedId] = useState(controller.selected())\n const [view, setView] = useState<View>(controller.destination()?.page ?? 'home')\n const [requestedDestination, setRequestedDestination] = useState(controller.destination())\n const [error, setError] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [creatingCompanion, setCreatingCompanion] = useState(false)\n const [notice, setNotice] = useState<string>()\n const selectionRef = useRef({ selectedId, companions: snapshot?.companions })\n selectionRef.current = { selectedId, companions: snapshot?.companions }\n const refresh = useCallback(async (throwOnError = false) => {\n try {\n const next = await loadPartner()\n setSnapshot(next)\n setSelectedId(current => next.companions.some(item => item.id === current) ? current : next.companions[0]?.id)\n setError(undefined)\n } catch (reason) { setError(message(reason)); if (throwOnError) throw reason } finally { setLoading(false) }\n }, [])\n useEffect(() => { void refresh() }, [refresh])\n useEffect(() => controller.subscribe(() => { const next = controller.selected(); if (next) setSelectedId(next); const destination = controller.destination(); if (destination) { setView(destination.page); setRequestedDestination(destination) } }), [controller])\n const selected = snapshot?.companions.find(item => item.id === selectedId)\n const companionRemoved = async (id: string): Promise<void> => {\n const current = selectionRef.current\n const name = current.companions?.find(item => item.id === id)?.name ?? '\u4F19\u4F34'\n setSnapshot(value => value ? { ...value, companions: value.companions.filter(item => item.id !== id), sessions: value.sessions.filter(item => item.companionId !== id) } : value)\n if (current.selectedId === id) {\n setSelectedId(current.companions?.find(item => item.id !== id)?.id)\n setView('home')\n }\n setNotice(`\u5DF2\u5220\u9664\u300C${name}\u300D\uFF0C\u5DF2\u9000\u51FA\u5220\u9664\u786E\u8BA4\u3002`)\n try { await refresh(true) }\n catch (reason) { setError(`\u4F19\u4F34\u5DF2\u5220\u9664\uFF0C\u4F46\u5237\u65B0\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\uFF0C\u65E0\u9700\u518D\u6B21\u5220\u9664\uFF1A${message(reason)}`) }\n }\n const create = async (draft: NewCompanionDraft): Promise<void> => {\n try {\n const companion = await api<CompanionView>('/companions', { method: 'POST', body: JSON.stringify({ companion: {\n ...draft, capabilities: [],\n } }) })\n await refresh(); setSelectedId(companion.id); setView('identity'); setCreatingCompanion(false)\n } catch (reason) { setError(message(reason)); throw reason }\n }\n const openSession = async (routeId: string, sessionId: string): Promise<void> => {\n try { setError(undefined); await controller.openSession(routeId, sessionId) }\n catch (reason) { setError(message(reason)) }\n }\n const startSession = async (companionId: string): Promise<void> => {\n try { setError(undefined); await controller.startSession(companionId) }\n catch (reason) { setError(message(reason)) }\n }\n const renewSession = async (routeId: string): Promise<void> => {\n try { setError(undefined); await controller.renewSession(routeId) }\n catch (reason) { setError(message(reason)) }\n }\n const workspacePage = WORKSPACE_PAGES.has(view)\n const openCompanion = (id: string): void => { setSelectedId(id); setView('home') }\n return <main className=\"dsh-partner-workspace\">\n {creatingCompanion && <CompanionCreateDialog close={() => setCreatingCompanion(false)} create={create} />}\n <header className=\"dsh-partner-topbar\">\n <div className=\"dsh-partner-topbar-brand\"><button type=\"button\" data-xiaohei-workspace-close onClick={controller.close} aria-label=\"\u8FD4\u56DE\u4F1A\u8BDD\" title=\"\u8FD4\u56DE\u4F1A\u8BDD\"><IconChevronLeftOutline14 size={15} /></button><IconAgentPresetOutline16 size={18} /><span><strong>\u4F19\u4F34</strong><small>\u957F\u671F\u8EAB\u4EFD\u4E0E\u6D88\u606F\u6E20\u9053</small></span></div>\n <MobileWorkspaceControls\n companions={snapshot?.companions ?? []}\n selectedId={selectedId}\n view={view}\n openCompanion={openCompanion}\n openPage={setView}\n createCompanion={() => setCreatingCompanion(true)}\n />\n </header>\n <div className=\"dsh-partner-grid\">\n <aside className=\"dsh-partner-roster\">\n <div className=\"dsh-partner-roster-title\"><span><small>COMPANIONS</small><strong>\u4F19\u4F34\u540D\u518C</strong></span><button type=\"button\" onClick={() => setCreatingCompanion(true)} aria-label=\"\u65B0\u5EFA\u4F19\u4F34\"><IconPlusOutline16 size={16} /></button></div>\n <div className=\"dsh-partner-roster-list\">{snapshot?.companions.map(companion => {\n const channel = snapshot.channels.find(item => item.companionId === companion.id)\n return <button type=\"button\" key={companion.id} className={!workspacePage && selectedId === companion.id ? 'is-active' : ''} onClick={() => openCompanion(companion.id)}>\n <Avatar name={companion.name} /><span><strong>{companion.name}</strong><small>{companion.role}</small></span><i className={channel?.runtimeStatus === 'running' ? 'is-online' : ''} title={channel ? channel.runtimeStatus : '\u672A\u8FDE\u63A5\u6E20\u9053'} />\n </button>\n })}</div>\n <nav className=\"dsh-partner-workspace-nav\" aria-label=\"\u4F19\u4F34\u5DE5\u4F5C\u533A\">\n <button type=\"button\" className={view === 'skills' ? 'is-active' : ''} aria-current={view === 'skills' ? 'page' : undefined} onClick={() => setView('skills')}><span><IconBrowseOutline16 size={16} /></span><strong>Skill \u5E02\u573A</strong><small>\u5B89\u88C5\u4E0E\u7BA1\u7406\u80FD\u529B</small></button>\n <button type=\"button\" className={view === 'board' ? 'is-active' : ''} aria-current={view === 'board' ? 'page' : undefined} onClick={() => setView('board')}><span><IconListPenOutline16 size={16} /></span><strong>\u4EFB\u52A1\u770B\u677F</strong><small>\u534F\u4F5C\u3001\u59D4\u6D3E\u4E0E\u9A8C\u6536</small></button>\n <button type=\"button\" className={view === 'schedules' ? 'is-active' : ''} aria-current={view === 'schedules' ? 'page' : undefined} onClick={() => setView('schedules')}><span><IconPlayOutline16 size={16} /></span><strong>\u5B9A\u65F6\u4EFB\u52A1</strong><small>\u9009\u62E9\u4F19\u4F34\u5468\u671F\u6267\u884C</small></button>\n <button type=\"button\" className={view === 'pendant' ? 'is-active' : ''} aria-current={view === 'pendant' ? 'page' : undefined} onClick={() => setView('pendant')}><span><IconEditOutline16 size={16} /></span><strong>\u5361\u7247\u8BBE\u7F6E</strong><small>\u6302\u9970\u3001\u7EF3\u5B50\u4E0E\u56FE\u6848</small></button>\n </nav>\n <div className=\"dsh-partner-roster-note\"><IconLinkOutline16 size={16} /><span><strong>\u8EAB\u4EFD\u4E0E\u6E20\u9053\u5206\u79BB</strong><small>\u6E20\u9053\u53EA\u8D1F\u8D23\u6536\u53D1\uFF0C\u6743\u9650\u4ECD\u7531 DSH \u5DE5\u5177\u51B3\u5B9A\u3002</small></span></div>\n </aside>\n <section className={`dsh-partner-stage${workspacePage ? ' is-workspace-page' : ''}`}>\n {loading ? <State title=\"\u6B63\u5728\u8BFB\u53D6\u4F19\u4F34\u2026\" /> : workspacePage ? <div className=\"dsh-partner-stage-scroll is-workspace-page\">\n {view === 'skills' && <SkillsPanel />}\n {view === 'board' && <TaskBoardPanel initialTaskId={requestedDestination?.taskId} openRequest={requestedDestination} />}\n {view === 'schedules' && <SchedulePanel companions={snapshot?.companions ?? []} />}\n {view === 'pendant' && <PendantSettingsPanel />}\n </div> : selected === undefined ? <State title=\"\u521B\u5EFA\u7B2C\u4E00\u4E2A\u4F19\u4F34\" detail=\"\u4F19\u4F34\u4F1A\u4FDD\u5B58\u72EC\u7ACB\u8EAB\u4EFD\u3001\u80FD\u529B\u548C\u5FAE\u4FE1\u4F1A\u8BDD\u3002\" action={<button onClick={() => setCreatingCompanion(true)}>\u65B0\u5EFA\u4F19\u4F34</button>} /> : <>\n <div className=\"dsh-partner-identity\"><Avatar name={selected.name} /><span><small>ACTIVE COMPANION</small><h1>{selected.name}</h1><p>{selected.description || selected.role}</p></span><Status channel={snapshot?.channels.find(item => item.companionId === selected.id)} /></div>\n <nav className=\"dsh-partner-tabs\" aria-label=\"\u4F19\u4F34\u914D\u7F6E\">\n <TabButton active={view === 'home'} onClick={() => setView('home')} icon={<IconAgentPresetOutline16 size={16} />}>\u603B\u89C8</TabButton>\n <TabButton active={view === 'identity'} onClick={() => setView('identity')} icon={<IconEditOutline16 size={16} />}>\u8EAB\u4EFD</TabButton>\n <TabButton active={view === 'capabilities'} onClick={() => setView('capabilities')} icon={<IconAgentPresetOutline16 size={16} />}>\u80FD\u529B</TabButton>\n <TabButton active={view === 'weixin'} onClick={() => setView('weixin')} icon={<IconLinkOutline16 size={16}/>}>\u6E20\u9053</TabButton>\n <TabButton active={view === 'memory'} onClick={() => setView('memory')} icon={<IconDataOutline16 size={16} />}>\u8BB0\u5FC6</TabButton>\n <TabButton active={view === 'concerns'} onClick={() => setView('concerns')} icon={<IconBrowseOutline16 size={16} />}>\u6301\u7EED\u5173\u6CE8</TabButton>\n </nav>\n <div className=\"dsh-partner-stage-scroll\">\n {notice && <p className=\"dsh-partner-inline-notice\" role=\"status\">{notice}</p>}\n {view === 'home' && <HomePanel companion={selected} snapshot={snapshot!} navigate={setView} openSession={openSession} startSession={startSession} renewSession={renewSession} />}\n {view === 'identity' && <IdentityEditor companion={selected} count={snapshot?.companions.length ?? 1} onChanged={() => refresh(true)} onRemoved={companionRemoved} />}\n {view === 'capabilities' && <CapabilityEditor key={selected.id} companion={selected} presets={snapshot?.presets ?? []} onChanged={() => refresh(true)} />}\n {view === 'weixin' && <ChannelsPanel key={selected.id} companion={selected} snapshot={snapshot!} onChanged={refresh} weixin={<WeixinPanel companion={selected} snapshot={snapshot!} onChanged={refresh} />} />}\n {view === 'memory' && <MemoryPanel key={selected.id} companion={selected} snapshot={snapshot!} openSession={openSession} startSession={startSession} renewSession={renewSession} onChanged={refresh} />}\n {view === 'concerns' && <ConcernPanel key={selected.id} companion={selected} snapshot={snapshot!} onChanged={refresh} />}\n </div>\n </>}\n {error && <p className=\"dsh-partner-error\" role=\"alert\">{error}</p>}\n </section>\n </div>\n </main>\n}\n\nfunction MobileWorkspaceControls({ companions, selectedId, view, openCompanion, openPage, createCompanion }: {\n companions: CompanionView[]\n selectedId: string | undefined\n view: View\n openCompanion(id: string): void\n openPage(page: WorkspacePage): void\n createCompanion(): void\n}): JSX.Element {\n return <div className=\"dsh-partner-mobile-controls\">\n <div className=\"dsh-partner-mobile-companion-row\">\n <CompanionPicker companions={companions} selectedId={selectedId} onChange={openCompanion} />\n <button type=\"button\" className=\"dsh-partner-mobile-create\" onClick={createCompanion} aria-label=\"\u65B0\u5EFA\u4F19\u4F34\"><IconPlusOutline16 size={17} /></button>\n </div>\n <nav className=\"dsh-partner-mobile-workspace-nav\" aria-label=\"\u4F19\u4F34\u5DE5\u4F5C\u533A\u5FEB\u6377\u5165\u53E3\">\n <button type=\"button\" className={view === 'skills' ? 'is-active' : ''} aria-pressed={view === 'skills'} onClick={() => openPage('skills')}><IconBrowseOutline16 size={16} /><span>Skill</span></button>\n <button type=\"button\" className={view === 'board' ? 'is-active' : ''} aria-pressed={view === 'board'} onClick={() => openPage('board')}><IconListPenOutline16 size={16} /><span>\u770B\u677F</span></button>\n <button type=\"button\" className={view === 'schedules' ? 'is-active' : ''} aria-pressed={view === 'schedules'} onClick={() => openPage('schedules')}><IconPlayOutline16 size={16} /><span>\u5B9A\u65F6</span></button>\n <button type=\"button\" className={view === 'pendant' ? 'is-active' : ''} aria-pressed={view === 'pendant'} onClick={() => openPage('pendant')}><IconEditOutline16 size={16} /><span>\u5361\u7247</span></button>\n </nav>\n </div>\n}\n\nfunction HomePanel({ companion, snapshot, navigate, openSession, startSession, renewSession }: { companion: CompanionView; snapshot: PartnerSnapshot; navigate(tab: CompanionTab): void; openSession(routeId: string, sessionId: string): Promise<void>; startSession(companionId: string): Promise<void>; renewSession(routeId: string): Promise<void> }): JSX.Element {\n const channel = snapshot.channels.find(item => item.companionId === companion.id)\n const sessions = snapshot.sessions.filter(item => item.companionId === companion.id)\n const localSession = sessions.find(item => item.kind === 'local')\n const pending = channel ? snapshot.pairings.filter(item => item.channelId === channel.id && item.status === 'pending').length : 0\n const approved = channel ? snapshot.pairings.filter(item => item.channelId === channel.id && item.status === 'approved').length : 0\n const capabilities = companion.capabilities.map(item => CAPABILITY_LABELS[item])\n const online = channel?.runtimeStatus === 'running'\n return <div className=\"dsh-partner-home\">\n <header className=\"dsh-partner-home-heading\">\n <span><small>\u5DE5\u4F5C\u53F0</small><h2>{online ? `${companion.name} \u6B63\u5728\u6E20\u9053\u5F85\u547D` : `${companion.name} \u5DF2\u51C6\u5907\u5C31\u7EEA`}</h2></span>\n <p>{online ? '\u6D88\u606F\u3001\u6388\u6743\u4E0E\u4E0A\u4E0B\u6587\u8FB9\u754C\u90FD\u5728\u8FD9\u91CC\u6C47\u603B\u3002' : '\u4F19\u4F34\u8EAB\u4EFD\u3001\u4F1A\u8BDD\u4E0E\u80FD\u529B\u5DF2\u7ECF\u51C6\u5907\u5B8C\u6210\u3002'}</p>\n </header>\n\n <section className={`dsh-partner-home-channel${online ? ' is-online' : ''}`}>\n <div className=\"dsh-partner-home-route\" aria-hidden=\"true\">\n <Avatar name={companion.name} />\n <span className=\"dsh-partner-route-line\"><i /></span>\n <span className=\"dsh-partner-route-weixin\"><WeixinGlyph large /></span>\n </div>\n <div className=\"dsh-partner-home-channel-copy\">\n <span className=\"dsh-partner-home-kicker\"><i />\u6D88\u606F\u6E20\u9053 \u00B7 {channel?.platform==='matrix'?'Matrix':channel?.platform==='mattermost'?'Mattermost':'\u5FAE\u4FE1'}</span>\n <h3>{!channel ? '\u7B49\u5F85\u626B\u7801\u8FDE\u63A5' : online ? '\u8FDE\u63A5\u6B63\u5E38\uFF0C\u6B63\u5728\u63A5\u6536\u6D88\u606F' : channel.runtimeStatus === 'error' ? '\u6E20\u9053\u8FDE\u63A5\u9700\u8981\u5904\u7406' : '\u6E20\u9053\u5F53\u524D\u5DF2\u505C\u7528'}</h3>\n <p>{!channel ? '\u8FDE\u63A5\u5FAE\u4FE1\u3001Matrix \u6216 Mattermost\uFF0C\u8054\u7CFB\u4EBA\u9996\u6B21\u53D1\u6D88\u606F\u9700\u6279\u51C6\u3002' : online ? '\u672C\u5730\u4E0E\u6240\u6709\u5DF2\u6388\u6743\u6E20\u9053\u5171\u7528\u4F19\u4F34\u4E3B\u5BF9\u8BDD\uFF0C\u56DE\u590D\u8FD4\u56DE\u6D88\u606F\u6765\u6E90\u3002' : channel.lastError || '\u6E20\u9053\u914D\u7F6E\u4ECD\u7136\u4FDD\u7559\uFF0C\u53EF\u4EE5\u968F\u65F6\u91CD\u65B0\u542F\u7528\u3002'}</p>\n <div className=\"dsh-partner-home-channel-actions\">\n <button type=\"button\" className=\"is-primary\" onClick={() => navigate('weixin')}>{!channel ? '\u8FDE\u63A5\u5FAE\u4FE1' : pending > 0 ? `\u5904\u7406 ${pending} \u4E2A\u8BF7\u6C42` : '\u7BA1\u7406\u6E20\u9053'}</button>\n <span>{!channel ? '\u9009\u62E9\u6E20\u9053\u5E76\u8FDE\u63A5\u8D26\u53F7' : `${approved} \u4F4D\u8054\u7CFB\u4EBA \u00B7 \u5171\u7528\u4E3B\u5BF9\u8BDD`}</span>\n </div>\n </div>\n </section>\n\n <div className=\"dsh-partner-home-details\">\n <section className=\"dsh-partner-home-profile\">\n <header><span><IconUserOutline16 size={16} /></span><div><small>\u4F19\u4F34\u5E95\u7A3F</small><strong>{companion.role}</strong></div><button type=\"button\" onClick={() => navigate('identity')}>\u7F16\u8F91</button></header>\n <blockquote>{companion.instructions || companion.description || '\u5C1A\u672A\u8BBE\u7F6E\u957F\u671F\u884C\u4E3A\u51C6\u5219\u3002'}</blockquote>\n </section>\n <section className=\"dsh-partner-home-runtime\">\n <header><span><IconAgentPresetOutline16 size={16} /></span><div><small>\u8FD0\u884C\u80FD\u529B</small><strong>{companion.presetId || 'DSH \u9ED8\u8BA4 Preset'}</strong></div><button type=\"button\" onClick={() => navigate('capabilities')}>\u8C03\u6574</button></header>\n <div className=\"dsh-partner-home-capability-list\">{capabilities.length ? capabilities.map(item => <em key={item}>{item}</em>) : <small>\u5C1A\u672A\u58F0\u660E\u80FD\u529B\u8303\u56F4</small>}</div>\n </section>\n <section className=\"dsh-partner-home-continuity\">\n <header><span><IconDataOutline16 size={16} /></span><div><small>\u4F19\u4F34\u5BF9\u8BDD</small><strong>{localSession?.archived ? '\u4F1A\u8BDD\u5DF2\u5F52\u6863' : '\u4F19\u4F34\u4F1A\u8BDD\u5DF2\u5EFA\u7ACB'}</strong></div><button type=\"button\" onClick={() => localSession === undefined ? void startSession(companion.id) : localSession.archived ? void renewSession(localSession.id) : void openSession(localSession.id, localSession.sessionId)}>{localSession === undefined ? '\u5F00\u59CB\u5BF9\u8BDD' : localSession.archived ? '\u5F00\u59CB\u65B0\u4F1A\u8BDD' : '\u6253\u5F00\u4F1A\u8BDD'}</button></header>\n <p>{localSession ? `\u6700\u8FD1\u6D3B\u52A8\u4E8E ${relativeTime(localSession.lastMessageAt)}\uFF1B\u672C\u5730\u4E0E\u6E20\u9053\u5728\u8FD9\u91CC\u63A5\u7740\u804A\u3002` : '\u4F19\u4F34\u4F1A\u8BDD\u6B63\u5728\u521D\u59CB\u5316\uFF0C\u7A0D\u540E\u5373\u53EF\u6253\u5F00\u3002'}</p>\n </section>\n </div>\n </div>\n}\n\nfunction WeixinPanel({ companion, snapshot, onChanged }: { companion: CompanionView; snapshot: PartnerSnapshot; onChanged(): Promise<void> }): JSX.Element {\n const channel = snapshot.channels.find(item => item.companionId === companion.id && (!item.platform || item.platform==='weixin'))\n const [login, setLogin] = useState<LoginView>()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n useEffect(() => {\n if (!login || login.phase === 'confirmed' || login.phase === 'expired' || login.phase === 'error') return\n const timer = window.setInterval(() => {\n void api<{ login: LoginView; channel?: ChannelView }>(`/weixin/login/${login.id}`).then(async result => {\n setLogin(result.login)\n if (result.channel) { setLogin(undefined); await onChanged() }\n }).catch(reason => setError(message(reason)))\n }, 2_000)\n return () => clearInterval(timer)\n }, [login?.id, login?.phase, onChanged])\n const begin = async (): Promise<void> => {\n setBusy(true); setError(undefined)\n try { setLogin(await api('/weixin/login', { method: 'POST', body: JSON.stringify({ companionId: companion.id }) })) }\n catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const toggle = async (): Promise<void> => {\n if (!channel) return\n setBusy(true); setError(undefined)\n try { await api(`/channels/${channel.id}/enabled`, { method: 'POST', body: JSON.stringify({ enabled: !channel.enabled }) }); await onChanged() }\n catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const pairings = channel ? snapshot.pairings.filter(item => item.channelId === channel.id) : []\n const actPairing = async (id: string, status: 'approved' | 'blocked'): Promise<void> => {\n try { await api(`/pairings/${id}/status`, { method: 'POST', body: JSON.stringify({ status }) }); await onChanged() } catch (reason) { setError(message(reason)) }\n }\n return <div className=\"dsh-partner-form is-channel\"><Section eyebrow=\"PRIMARY CHANNEL\" title=\"\u5FAE\u4FE1\u6E20\u9053\" detail=\"\u4F7F\u7528\u5FAE\u4FE1 iLink Bot \u626B\u7801\u63A5\u5165\u3002\u6BCF\u4E2A\u673A\u5668\u4EBA\u53EA\u7ED1\u5B9A\u4E00\u4E2A\u4F19\u4F34\uFF0C\u6BCF\u4F4D\u8054\u7CFB\u4EBA\u4FDD\u6301\u72EC\u7ACB DSH \u4F1A\u8BDD\u3002\" />\n {!channel && !login && <GlassSurface as=\"div\" interactive className=\"dsh-partner-weixin-connect\" borderRadius={15} distortionScale={-10} saturation={1.06}><div className=\"dsh-partner-weixin-mark\"><WeixinGlyph large /></div><span><strong>\u628A {companion.name} \u5E26\u5230\u5FAE\u4FE1</strong><p>\u626B\u7801\u540E\uFF0C\u673A\u5668\u4EBA\u51ED\u636E\u76F4\u63A5\u4FDD\u5B58\u8FDB DSH \u51ED\u636E\u5E93\uFF0C\u4E0D\u4F1A\u663E\u793A\u5728\u6D4F\u89C8\u5668\u6216\u666E\u901A\u914D\u7F6E\u6587\u4EF6\u4E2D\u3002</p><ul><li>\u79C1\u804A\u9996\u6B21\u8054\u7CFB\u5FC5\u987B\u5BA1\u6279</li><li>\u8054\u7CFB\u4EBA\u4E4B\u95F4\u4E0A\u4E0B\u6587\u5B8C\u5168\u9694\u79BB</li><li>\u5DE5\u5177\u6743\u9650\u4E0D\u4F1A\u56E0\u5FAE\u4FE1\u8EAB\u4EFD\u81EA\u52A8\u6269\u5927</li></ul></span><button type=\"button\" disabled={busy} onClick={() => { void begin() }}>{busy ? '\u6B63\u5728\u7533\u8BF7\u4E8C\u7EF4\u7801\u2026' : '\u626B\u7801\u8FDE\u63A5\u5FAE\u4FE1'}</button></GlassSurface>}\n {login && <GlassSurface as=\"div\" interactive className=\"dsh-partner-qr\" borderRadius={16} distortionScale={-10} saturation={1.06}><div className=\"dsh-partner-qr-code\">{login.qrContent && <QRCodeSVG value={login.qrContent} size={176} level=\"M\" />}</div><span><small>WECHAT ILINK BOT</small><strong>{login.phase === 'scanned' ? '\u5DF2\u626B\u7801\uFF0C\u8BF7\u5728\u5FAE\u4FE1\u786E\u8BA4' : login.phase === 'expired' ? '\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F' : login.phase === 'error' ? '\u8FDE\u63A5\u5931\u8D25' : '\u4F7F\u7528\u5FAE\u4FE1\u626B\u7801'}</strong><p>{login.error || (login.phase === 'scanned' ? '\u786E\u8BA4\u540E\u4F1A\u81EA\u52A8\u542F\u52A8\u6E20\u9053\uFF0C\u4E0D\u9700\u8981\u590D\u5236 Token\u3002' : '\u4E8C\u7EF4\u7801\u7EA6 5 \u5206\u949F\u6709\u6548\u3002\u6B64\u9875\u9762\u53EF\u4EE5\u5B89\u5168\u5730\u4FDD\u6301\u6253\u5F00\u3002')}</p>{(login.phase === 'expired' || login.phase === 'error') && <button type=\"button\" onClick={() => { setLogin(undefined); void begin() }}><IconRefreshOutline16 size={16} />\u91CD\u65B0\u751F\u6210</button>}</span></GlassSurface>}\n {channel && <>\n <GlassSurface as=\"div\" interactive className=\"dsh-partner-channel-card\" borderRadius={14} distortionScale={-10} saturation={1.06}><div className=\"dsh-partner-weixin-mark\"><WeixinGlyph large /></div><span><small>WECHAT CHANNEL</small><strong>{channel.name}</strong><p>{channel.accountId}</p></span><Status channel={channel} /><button type=\"button\" className=\"dsh-partner-switch\" data-on={channel.enabled} disabled={busy} aria-label={channel.enabled ? '\u505C\u7528\u5FAE\u4FE1\u6E20\u9053' : '\u542F\u7528\u5FAE\u4FE1\u6E20\u9053'} onClick={() => { void toggle() }}><i /></button></GlassSurface>\n {channel.lastError && <p className=\"dsh-partner-inline-error\">{channel.lastError}</p>}\n <div className=\"dsh-partner-pairing-heading\"><span><small>ACCESS</small><strong>\u79C1\u804A\u914D\u5BF9</strong></span><em>{pairings.filter(item => item.status === 'pending').length} \u4E2A\u5F85\u5904\u7406</em></div>\n <div className=\"dsh-partner-pairings\">{pairings.length === 0 ? <State title=\"\u8FD8\u6CA1\u6709\u8054\u7CFB\u4EBA\" detail=\"\u6709\u4EBA\u9996\u6B21\u5411\u673A\u5668\u4EBA\u53D1\u6D88\u606F\u540E\uFF0C\u914D\u5BF9\u8BF7\u6C42\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002\" compact /> : pairings.map(pairing => <article key={pairing.id}><span className={`is-${pairing.status}`}><IconUserOutline16 size={16} /></span><div><strong>{pairing.displayName}</strong><small>{pairing.status === 'pending' ? '\u7B49\u5F85\u5BA1\u6279' : pairing.status === 'approved' ? '\u5DF2\u6388\u6743\u72EC\u7ACB\u4F1A\u8BDD' : '\u5DF2\u963B\u6B62'} \u00B7 {new Date(pairing.updatedAt).toLocaleString()}</small></div>{pairing.status === 'pending' && <><button onClick={() => { void actPairing(pairing.id, 'blocked') }}>\u62D2\u7EDD</button><button className=\"is-primary\" onClick={() => { void actPairing(pairing.id, 'approved') }}>\u6279\u51C6</button></>}{pairing.status === 'approved' && <button onClick={() => { void actPairing(pairing.id, 'blocked') }}>\u64A4\u9500</button>}{pairing.status === 'blocked' && <button onClick={() => { void actPairing(pairing.id, 'approved') }}>\u91CD\u65B0\u6279\u51C6</button>}</article>)}</div>\n </>}\n {error && <p className=\"dsh-partner-inline-error\">{error}</p>}\n </div>\n}\n\nfunction installStyles(): () => void { let style = document.getElementById(STYLE_ID) as HTMLStyleElement | null; if (!style) { style = document.createElement('style'); style.id = STYLE_ID; style.textContent = cssText; document.head.append(style) } return () => style?.remove() }\n", "const WORKSPACE_ACTIVATE_EVENT = '@lemoncat7/dsh-plugin-ui/workspace-activate'\n\ninterface WorkspaceActivateDetail {\n pluginId: string\n}\n\n/** Claim the conversation workspace while remaining compatible with installed plugin versions. */\nexport function activatePluginWorkspace(pluginId: string): void {\n window.dispatchEvent(new CustomEvent<WorkspaceActivateDetail>(WORKSPACE_ACTIVATE_EVENT, {\n detail: { pluginId },\n }))\n}\n\n/** Close this workspace when another plugin claims the conversation area. */\nexport function observePluginWorkspace(pluginId: string, close: () => void): () => void {\n const onActivate = (event: Event): void => {\n const detail = (event as CustomEvent<WorkspaceActivateDetail>).detail\n if (detail?.pluginId !== pluginId) close()\n }\n window.addEventListener(WORKSPACE_ACTIVATE_EVENT, onActivate)\n return () => window.removeEventListener(WORKSPACE_ACTIVATE_EVENT, onActivate)\n}\n", "var __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\n\n// src/index.tsx\nimport React from \"react\";\n\n// src/third-party/qrcodegen/index.ts\n/**\n * @license QR Code generator library (TypeScript)\n * Copyright (c) Project Nayuki.\n * SPDX-License-Identifier: MIT\n */\nvar qrcodegen;\n((qrcodegen2) => {\n const _QrCode = class _QrCode {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code with the given version number,\n // error correction level, data codeword bytes, and mask number.\n // This is a low-level API that most users should not use directly.\n // A mid-level API is the encodeSegments() function.\n constructor(version, errorCorrectionLevel, dataCodewords, msk) {\n this.version = version;\n this.errorCorrectionLevel = errorCorrectionLevel;\n // The modules of this QR Code (false = light, true = dark).\n // Immutable after constructor finishes. Accessed through getModule().\n this.modules = [];\n // Indicates function modules that are not subjected to masking. Discarded when constructor finishes.\n this.isFunction = [];\n if (version < _QrCode.MIN_VERSION || version > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version value out of range\");\n if (msk < -1 || msk > 7)\n throw new RangeError(\"Mask value out of range\");\n this.size = version * 4 + 17;\n let row = [];\n for (let i = 0; i < this.size; i++)\n row.push(false);\n for (let i = 0; i < this.size; i++) {\n this.modules.push(row.slice());\n this.isFunction.push(row.slice());\n }\n this.drawFunctionPatterns();\n const allCodewords = this.addEccAndInterleave(dataCodewords);\n this.drawCodewords(allCodewords);\n if (msk == -1) {\n let minPenalty = 1e9;\n for (let i = 0; i < 8; i++) {\n this.applyMask(i);\n this.drawFormatBits(i);\n const penalty = this.getPenaltyScore();\n if (penalty < minPenalty) {\n msk = i;\n minPenalty = penalty;\n }\n this.applyMask(i);\n }\n }\n assert(0 <= msk && msk <= 7);\n this.mask = msk;\n this.applyMask(msk);\n this.drawFormatBits(msk);\n this.isFunction = [];\n }\n /*-- Static factory functions (high level) --*/\n // Returns a QR Code representing the given Unicode text string at the given error correction level.\n // As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer\n // Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible\n // QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the\n // ecl argument if it can be done without increasing the version.\n static encodeText(text, ecl) {\n const segs = qrcodegen2.QrSegment.makeSegments(text);\n return _QrCode.encodeSegments(segs, ecl);\n }\n // Returns a QR Code representing the given binary data at the given error correction level.\n // This function always encodes using the binary segment mode, not any text mode. The maximum number of\n // bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output.\n // The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version.\n static encodeBinary(data, ecl) {\n const seg = qrcodegen2.QrSegment.makeBytes(data);\n return _QrCode.encodeSegments([seg], ecl);\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a QR Code representing the given segments with the given encoding parameters.\n // The smallest possible QR Code version within the given range is automatically\n // chosen for the output. Iff boostEcl is true, then the ECC level of the result\n // may be higher than the ecl argument if it can be done without increasing the\n // version. The mask number is either between 0 to 7 (inclusive) to force that\n // mask, or -1 to automatically choose an appropriate mask (which may be slow).\n // This function allows the user to create a custom sequence of segments that switches\n // between modes (such as alphanumeric and byte) to encode text in less space.\n // This is a mid-level API; the high-level API is encodeText() and encodeBinary().\n static encodeSegments(segs, ecl, minVersion = 1, maxVersion = 40, mask = -1, boostEcl = true) {\n if (!(_QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= _QrCode.MAX_VERSION) || mask < -1 || mask > 7)\n throw new RangeError(\"Invalid value\");\n let version;\n let dataUsedBits;\n for (version = minVersion; ; version++) {\n const dataCapacityBits2 = _QrCode.getNumDataCodewords(version, ecl) * 8;\n const usedBits = QrSegment.getTotalBits(segs, version);\n if (usedBits <= dataCapacityBits2) {\n dataUsedBits = usedBits;\n break;\n }\n if (version >= maxVersion)\n throw new RangeError(\"Data too long\");\n }\n for (const newEcl of [_QrCode.Ecc.MEDIUM, _QrCode.Ecc.QUARTILE, _QrCode.Ecc.HIGH]) {\n if (boostEcl && dataUsedBits <= _QrCode.getNumDataCodewords(version, newEcl) * 8)\n ecl = newEcl;\n }\n let bb = [];\n for (const seg of segs) {\n appendBits(seg.mode.modeBits, 4, bb);\n appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb);\n for (const b of seg.getData())\n bb.push(b);\n }\n assert(bb.length == dataUsedBits);\n const dataCapacityBits = _QrCode.getNumDataCodewords(version, ecl) * 8;\n assert(bb.length <= dataCapacityBits);\n appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb);\n appendBits(0, (8 - bb.length % 8) % 8, bb);\n assert(bb.length % 8 == 0);\n for (let padByte = 236; bb.length < dataCapacityBits; padByte ^= 236 ^ 17)\n appendBits(padByte, 8, bb);\n let dataCodewords = [];\n while (dataCodewords.length * 8 < bb.length)\n dataCodewords.push(0);\n bb.forEach((b, i) => dataCodewords[i >>> 3] |= b << 7 - (i & 7));\n return new _QrCode(version, ecl, dataCodewords, mask);\n }\n /*-- Accessor methods --*/\n // Returns the color of the module (pixel) at the given coordinates, which is false\n // for light or true for dark. The top left corner has the coordinates (x=0, y=0).\n // If the given coordinates are out of bounds, then false (light) is returned.\n getModule(x, y) {\n return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x];\n }\n // Modified to expose modules for easy access\n getModules() {\n return this.modules;\n }\n /*-- Private helper methods for constructor: Drawing function modules --*/\n // Reads this object's version field, and draws and marks all function modules.\n drawFunctionPatterns() {\n for (let i = 0; i < this.size; i++) {\n this.setFunctionModule(6, i, i % 2 == 0);\n this.setFunctionModule(i, 6, i % 2 == 0);\n }\n this.drawFinderPattern(3, 3);\n this.drawFinderPattern(this.size - 4, 3);\n this.drawFinderPattern(3, this.size - 4);\n const alignPatPos = this.getAlignmentPatternPositions();\n const numAlign = alignPatPos.length;\n for (let i = 0; i < numAlign; i++) {\n for (let j = 0; j < numAlign; j++) {\n if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0))\n this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]);\n }\n }\n this.drawFormatBits(0);\n this.drawVersion();\n }\n // Draws two copies of the format bits (with its own error correction code)\n // based on the given mask and this object's error correction level field.\n drawFormatBits(mask) {\n const data = this.errorCorrectionLevel.formatBits << 3 | mask;\n let rem = data;\n for (let i = 0; i < 10; i++)\n rem = rem << 1 ^ (rem >>> 9) * 1335;\n const bits = (data << 10 | rem) ^ 21522;\n assert(bits >>> 15 == 0);\n for (let i = 0; i <= 5; i++)\n this.setFunctionModule(8, i, getBit(bits, i));\n this.setFunctionModule(8, 7, getBit(bits, 6));\n this.setFunctionModule(8, 8, getBit(bits, 7));\n this.setFunctionModule(7, 8, getBit(bits, 8));\n for (let i = 9; i < 15; i++)\n this.setFunctionModule(14 - i, 8, getBit(bits, i));\n for (let i = 0; i < 8; i++)\n this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i));\n for (let i = 8; i < 15; i++)\n this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i));\n this.setFunctionModule(8, this.size - 8, true);\n }\n // Draws two copies of the version bits (with its own error correction code),\n // based on this object's version field, iff 7 <= version <= 40.\n drawVersion() {\n if (this.version < 7)\n return;\n let rem = this.version;\n for (let i = 0; i < 12; i++)\n rem = rem << 1 ^ (rem >>> 11) * 7973;\n const bits = this.version << 12 | rem;\n assert(bits >>> 18 == 0);\n for (let i = 0; i < 18; i++) {\n const color = getBit(bits, i);\n const a = this.size - 11 + i % 3;\n const b = Math.floor(i / 3);\n this.setFunctionModule(a, b, color);\n this.setFunctionModule(b, a, color);\n }\n }\n // Draws a 9*9 finder pattern including the border separator,\n // with the center module at (x, y). Modules can be out of bounds.\n drawFinderPattern(x, y) {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n const xx = x + dx;\n const yy = y + dy;\n if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size)\n this.setFunctionModule(xx, yy, dist != 2 && dist != 4);\n }\n }\n }\n // Draws a 5*5 alignment pattern, with the center module\n // at (x, y). All modules must be in bounds.\n drawAlignmentPattern(x, y) {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++)\n this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1);\n }\n }\n // Sets the color of a module and marks it as a function module.\n // Only used by the constructor. Coordinates must be in bounds.\n setFunctionModule(x, y, isDark) {\n this.modules[y][x] = isDark;\n this.isFunction[y][x] = true;\n }\n /*-- Private helper methods for constructor: Codewords and masking --*/\n // Returns a new byte string representing the given data with the appropriate error correction\n // codewords appended to it, based on this object's version and error correction level.\n addEccAndInterleave(data) {\n const ver = this.version;\n const ecl = this.errorCorrectionLevel;\n if (data.length != _QrCode.getNumDataCodewords(ver, ecl))\n throw new RangeError(\"Invalid argument\");\n const numBlocks = _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n const blockEccLen = _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver];\n const rawCodewords = Math.floor(_QrCode.getNumRawDataModules(ver) / 8);\n const numShortBlocks = numBlocks - rawCodewords % numBlocks;\n const shortBlockLen = Math.floor(rawCodewords / numBlocks);\n let blocks = [];\n const rsDiv = _QrCode.reedSolomonComputeDivisor(blockEccLen);\n for (let i = 0, k = 0; i < numBlocks; i++) {\n let dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1));\n k += dat.length;\n const ecc = _QrCode.reedSolomonComputeRemainder(dat, rsDiv);\n if (i < numShortBlocks)\n dat.push(0);\n blocks.push(dat.concat(ecc));\n }\n let result = [];\n for (let i = 0; i < blocks[0].length; i++) {\n blocks.forEach((block, j) => {\n if (i != shortBlockLen - blockEccLen || j >= numShortBlocks)\n result.push(block[i]);\n });\n }\n assert(result.length == rawCodewords);\n return result;\n }\n // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire\n // data area of this QR Code. Function modules need to be marked off before this is called.\n drawCodewords(data) {\n if (data.length != Math.floor(_QrCode.getNumRawDataModules(this.version) / 8))\n throw new RangeError(\"Invalid argument\");\n let i = 0;\n for (let right = this.size - 1; right >= 1; right -= 2) {\n if (right == 6)\n right = 5;\n for (let vert = 0; vert < this.size; vert++) {\n for (let j = 0; j < 2; j++) {\n const x = right - j;\n const upward = (right + 1 & 2) == 0;\n const y = upward ? this.size - 1 - vert : vert;\n if (!this.isFunction[y][x] && i < data.length * 8) {\n this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7));\n i++;\n }\n }\n }\n }\n assert(i == data.length * 8);\n }\n // XORs the codeword modules in this QR Code with the given mask pattern.\n // The function modules must be marked and the codeword bits must be drawn\n // before masking. Due to the arithmetic of XOR, calling applyMask() with\n // the same mask value a second time will undo the mask. A final well-formed\n // QR Code needs exactly one (not zero, two, etc.) mask applied.\n applyMask(mask) {\n if (mask < 0 || mask > 7)\n throw new RangeError(\"Mask value out of range\");\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n let invert;\n switch (mask) {\n case 0:\n invert = (x + y) % 2 == 0;\n break;\n case 1:\n invert = y % 2 == 0;\n break;\n case 2:\n invert = x % 3 == 0;\n break;\n case 3:\n invert = (x + y) % 3 == 0;\n break;\n case 4:\n invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0;\n break;\n case 5:\n invert = x * y % 2 + x * y % 3 == 0;\n break;\n case 6:\n invert = (x * y % 2 + x * y % 3) % 2 == 0;\n break;\n case 7:\n invert = ((x + y) % 2 + x * y % 3) % 2 == 0;\n break;\n default:\n throw new Error(\"Unreachable\");\n }\n if (!this.isFunction[y][x] && invert)\n this.modules[y][x] = !this.modules[y][x];\n }\n }\n }\n // Calculates and returns the penalty score based on state of this QR Code's current modules.\n // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.\n getPenaltyScore() {\n let result = 0;\n for (let y = 0; y < this.size; y++) {\n let runColor = false;\n let runX = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let x = 0; x < this.size; x++) {\n if (this.modules[y][x] == runColor) {\n runX++;\n if (runX == 5)\n result += _QrCode.PENALTY_N1;\n else if (runX > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runX, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runX = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let x = 0; x < this.size; x++) {\n let runColor = false;\n let runY = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let y = 0; y < this.size; y++) {\n if (this.modules[y][x] == runColor) {\n runY++;\n if (runY == 5)\n result += _QrCode.PENALTY_N1;\n else if (runY > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runY, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runY = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let y = 0; y < this.size - 1; y++) {\n for (let x = 0; x < this.size - 1; x++) {\n const color = this.modules[y][x];\n if (color == this.modules[y][x + 1] && color == this.modules[y + 1][x] && color == this.modules[y + 1][x + 1])\n result += _QrCode.PENALTY_N2;\n }\n }\n let dark = 0;\n for (const row of this.modules)\n dark = row.reduce((sum, color) => sum + (color ? 1 : 0), dark);\n const total = this.size * this.size;\n const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;\n assert(0 <= k && k <= 9);\n result += k * _QrCode.PENALTY_N4;\n assert(0 <= result && result <= 2568888);\n return result;\n }\n /*-- Private helper functions --*/\n // Returns an ascending list of positions of alignment patterns for this version number.\n // Each position is in the range [0,177), and are used on both the x and y axes.\n // This could be implemented as lookup table of 40 variable-length lists of integers.\n getAlignmentPatternPositions() {\n if (this.version == 1)\n return [];\n else {\n const numAlign = Math.floor(this.version / 7) + 2;\n const step = this.version == 32 ? 26 : Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n let result = [6];\n for (let pos = this.size - 7; result.length < numAlign; pos -= step)\n result.splice(1, 0, pos);\n return result;\n }\n }\n // Returns the number of data bits that can be stored in a QR Code of the given version number, after\n // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.\n // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.\n static getNumRawDataModules(ver) {\n if (ver < _QrCode.MIN_VERSION || ver > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version number out of range\");\n let result = (16 * ver + 128) * ver + 64;\n if (ver >= 2) {\n const numAlign = Math.floor(ver / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (ver >= 7)\n result -= 36;\n }\n assert(208 <= result && result <= 29648);\n return result;\n }\n // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any\n // QR Code of the given version number and error correction level, with remainder bits discarded.\n // This stateless pure function could be implemented as a (40*4)-cell lookup table.\n static getNumDataCodewords(ver, ecl) {\n return Math.floor(_QrCode.getNumRawDataModules(ver) / 8) - _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n }\n // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be\n // implemented as a lookup table over all possible parameter values, instead of as an algorithm.\n static reedSolomonComputeDivisor(degree) {\n if (degree < 1 || degree > 255)\n throw new RangeError(\"Degree out of range\");\n let result = [];\n for (let i = 0; i < degree - 1; i++)\n result.push(0);\n result.push(1);\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < result.length; j++) {\n result[j] = _QrCode.reedSolomonMultiply(result[j], root);\n if (j + 1 < result.length)\n result[j] ^= result[j + 1];\n }\n root = _QrCode.reedSolomonMultiply(root, 2);\n }\n return result;\n }\n // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.\n static reedSolomonComputeRemainder(data, divisor) {\n let result = divisor.map((_) => 0);\n for (const b of data) {\n const factor = b ^ result.shift();\n result.push(0);\n divisor.forEach((coef, i) => result[i] ^= _QrCode.reedSolomonMultiply(coef, factor));\n }\n return result;\n }\n // Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result\n // are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.\n static reedSolomonMultiply(x, y) {\n if (x >>> 8 != 0 || y >>> 8 != 0)\n throw new RangeError(\"Byte out of range\");\n let z = 0;\n for (let i = 7; i >= 0; i--) {\n z = z << 1 ^ (z >>> 7) * 285;\n z ^= (y >>> i & 1) * x;\n }\n assert(z >>> 8 == 0);\n return z;\n }\n // Can only be called immediately after a light run is added, and\n // returns either 0, 1, or 2. A helper function for getPenaltyScore().\n finderPenaltyCountPatterns(runHistory) {\n const n = runHistory[1];\n assert(n <= this.size * 3);\n const core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n;\n return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) + (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0);\n }\n // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().\n finderPenaltyTerminateAndCount(currentRunColor, currentRunLength, runHistory) {\n if (currentRunColor) {\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n currentRunLength = 0;\n }\n currentRunLength += this.size;\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n return this.finderPenaltyCountPatterns(runHistory);\n }\n // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().\n finderPenaltyAddHistory(currentRunLength, runHistory) {\n if (runHistory[0] == 0)\n currentRunLength += this.size;\n runHistory.pop();\n runHistory.unshift(currentRunLength);\n }\n };\n /*-- Constants and tables --*/\n // The minimum version number supported in the QR Code Model 2 standard.\n _QrCode.MIN_VERSION = 1;\n // The maximum version number supported in the QR Code Model 2 standard.\n _QrCode.MAX_VERSION = 40;\n // For use in getPenaltyScore(), when evaluating which mask is best.\n _QrCode.PENALTY_N1 = 3;\n _QrCode.PENALTY_N2 = 3;\n _QrCode.PENALTY_N3 = 40;\n _QrCode.PENALTY_N4 = 10;\n _QrCode.ECC_CODEWORDS_PER_BLOCK = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Low\n [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n // Medium\n [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Quartile\n [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]\n // High\n ];\n _QrCode.NUM_ERROR_CORRECTION_BLOCKS = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n // Low\n [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n // Medium\n [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n // Quartile\n [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]\n // High\n ];\n let QrCode = _QrCode;\n qrcodegen2.QrCode = _QrCode;\n function appendBits(val, len, bb) {\n if (len < 0 || len > 31 || val >>> len != 0)\n throw new RangeError(\"Value out of range\");\n for (let i = len - 1; i >= 0; i--)\n bb.push(val >>> i & 1);\n }\n function getBit(x, i) {\n return (x >>> i & 1) != 0;\n }\n function assert(cond) {\n if (!cond)\n throw new Error(\"Assertion error\");\n }\n const _QrSegment = class _QrSegment {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code segment with the given attributes and data.\n // The character count (numChars) must agree with the mode and the bit buffer length,\n // but the constraint isn't checked. The given bit buffer is cloned and stored.\n constructor(mode, numChars, bitData) {\n this.mode = mode;\n this.numChars = numChars;\n this.bitData = bitData;\n if (numChars < 0)\n throw new RangeError(\"Invalid argument\");\n this.bitData = bitData.slice();\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a segment representing the given binary data encoded in\n // byte mode. All input byte arrays are acceptable. Any text string\n // can be converted to UTF-8 bytes and encoded as a byte mode segment.\n static makeBytes(data) {\n let bb = [];\n for (const b of data)\n appendBits(b, 8, bb);\n return new _QrSegment(_QrSegment.Mode.BYTE, data.length, bb);\n }\n // Returns a segment representing the given string of decimal digits encoded in numeric mode.\n static makeNumeric(digits) {\n if (!_QrSegment.isNumeric(digits))\n throw new RangeError(\"String contains non-numeric characters\");\n let bb = [];\n for (let i = 0; i < digits.length; ) {\n const n = Math.min(digits.length - i, 3);\n appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb);\n i += n;\n }\n return new _QrSegment(_QrSegment.Mode.NUMERIC, digits.length, bb);\n }\n // Returns a segment representing the given text string encoded in alphanumeric mode.\n // The characters allowed are: 0 to 9, A to Z (uppercase only), space,\n // dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static makeAlphanumeric(text) {\n if (!_QrSegment.isAlphanumeric(text))\n throw new RangeError(\"String contains unencodable characters in alphanumeric mode\");\n let bb = [];\n let i;\n for (i = 0; i + 2 <= text.length; i += 2) {\n let temp = _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45;\n temp += _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1));\n appendBits(temp, 11, bb);\n }\n if (i < text.length)\n appendBits(_QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb);\n return new _QrSegment(_QrSegment.Mode.ALPHANUMERIC, text.length, bb);\n }\n // Returns a new mutable list of zero or more segments to represent the given Unicode text string.\n // The result may use various segment modes and switch modes to optimize the length of the bit stream.\n static makeSegments(text) {\n if (text == \"\")\n return [];\n else if (_QrSegment.isNumeric(text))\n return [_QrSegment.makeNumeric(text)];\n else if (_QrSegment.isAlphanumeric(text))\n return [_QrSegment.makeAlphanumeric(text)];\n else\n return [_QrSegment.makeBytes(_QrSegment.toUtf8ByteArray(text))];\n }\n // Returns a segment representing an Extended Channel Interpretation\n // (ECI) designator with the given assignment value.\n static makeEci(assignVal) {\n let bb = [];\n if (assignVal < 0)\n throw new RangeError(\"ECI assignment value out of range\");\n else if (assignVal < 1 << 7)\n appendBits(assignVal, 8, bb);\n else if (assignVal < 1 << 14) {\n appendBits(2, 2, bb);\n appendBits(assignVal, 14, bb);\n } else if (assignVal < 1e6) {\n appendBits(6, 3, bb);\n appendBits(assignVal, 21, bb);\n } else\n throw new RangeError(\"ECI assignment value out of range\");\n return new _QrSegment(_QrSegment.Mode.ECI, 0, bb);\n }\n // Tests whether the given string can be encoded as a segment in numeric mode.\n // A string is encodable iff each character is in the range 0 to 9.\n static isNumeric(text) {\n return _QrSegment.NUMERIC_REGEX.test(text);\n }\n // Tests whether the given string can be encoded as a segment in alphanumeric mode.\n // A string is encodable iff each character is in the following set: 0 to 9, A to Z\n // (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static isAlphanumeric(text) {\n return _QrSegment.ALPHANUMERIC_REGEX.test(text);\n }\n /*-- Methods --*/\n // Returns a new copy of the data bits of this segment.\n getData() {\n return this.bitData.slice();\n }\n // (Package-private) Calculates and returns the number of bits needed to encode the given segments at\n // the given version. The result is infinity if a segment has too many characters to fit its length field.\n static getTotalBits(segs, version) {\n let result = 0;\n for (const seg of segs) {\n const ccbits = seg.mode.numCharCountBits(version);\n if (seg.numChars >= 1 << ccbits)\n return Infinity;\n result += 4 + ccbits + seg.bitData.length;\n }\n return result;\n }\n // Returns a new array of bytes representing the given string encoded in UTF-8.\n static toUtf8ByteArray(str) {\n str = encodeURI(str);\n let result = [];\n for (let i = 0; i < str.length; i++) {\n if (str.charAt(i) != \"%\")\n result.push(str.charCodeAt(i));\n else {\n result.push(parseInt(str.substring(i + 1, i + 3), 16));\n i += 2;\n }\n }\n return result;\n }\n };\n /*-- Constants --*/\n // Describes precisely all strings that are encodable in numeric mode.\n _QrSegment.NUMERIC_REGEX = /^[0-9]*$/;\n // Describes precisely all strings that are encodable in alphanumeric mode.\n _QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\\/:-]*$/;\n // The set of all legal characters in alphanumeric mode,\n // where each character value maps to the index in the string.\n _QrSegment.ALPHANUMERIC_CHARSET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:\";\n let QrSegment = _QrSegment;\n qrcodegen2.QrSegment = _QrSegment;\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrCode;\n ((QrCode2) => {\n const _Ecc = class _Ecc {\n // The QR Code can tolerate about 30% erroneous codewords\n /*-- Constructor and fields --*/\n constructor(ordinal, formatBits) {\n this.ordinal = ordinal;\n this.formatBits = formatBits;\n }\n };\n /*-- Constants --*/\n _Ecc.LOW = new _Ecc(0, 1);\n // The QR Code can tolerate about 7% erroneous codewords\n _Ecc.MEDIUM = new _Ecc(1, 0);\n // The QR Code can tolerate about 15% erroneous codewords\n _Ecc.QUARTILE = new _Ecc(2, 3);\n // The QR Code can tolerate about 25% erroneous codewords\n _Ecc.HIGH = new _Ecc(3, 2);\n let Ecc = _Ecc;\n QrCode2.Ecc = _Ecc;\n })(QrCode = qrcodegen2.QrCode || (qrcodegen2.QrCode = {}));\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrSegment;\n ((QrSegment2) => {\n const _Mode = class _Mode {\n /*-- Constructor and fields --*/\n constructor(modeBits, numBitsCharCount) {\n this.modeBits = modeBits;\n this.numBitsCharCount = numBitsCharCount;\n }\n /*-- Method --*/\n // (Package-private) Returns the bit width of the character count field for a segment in\n // this mode in a QR Code at the given version number. The result is in the range [0, 16].\n numCharCountBits(ver) {\n return this.numBitsCharCount[Math.floor((ver + 7) / 17)];\n }\n };\n /*-- Constants --*/\n _Mode.NUMERIC = new _Mode(1, [10, 12, 14]);\n _Mode.ALPHANUMERIC = new _Mode(2, [9, 11, 13]);\n _Mode.BYTE = new _Mode(4, [8, 16, 16]);\n _Mode.KANJI = new _Mode(8, [8, 10, 12]);\n _Mode.ECI = new _Mode(7, [0, 0, 0]);\n let Mode = _Mode;\n QrSegment2.Mode = _Mode;\n })(QrSegment = qrcodegen2.QrSegment || (qrcodegen2.QrSegment = {}));\n})(qrcodegen || (qrcodegen = {}));\nvar qrcodegen_default = qrcodegen;\n\n// src/index.tsx\n/**\n * @license qrcode.react\n * Copyright (c) Paul O'Shannessy\n * SPDX-License-Identifier: ISC\n */\nvar ERROR_LEVEL_MAP = {\n L: qrcodegen_default.QrCode.Ecc.LOW,\n M: qrcodegen_default.QrCode.Ecc.MEDIUM,\n Q: qrcodegen_default.QrCode.Ecc.QUARTILE,\n H: qrcodegen_default.QrCode.Ecc.HIGH\n};\nvar DEFAULT_SIZE = 128;\nvar DEFAULT_LEVEL = \"L\";\nvar DEFAULT_BGCOLOR = \"#FFFFFF\";\nvar DEFAULT_FGCOLOR = \"#000000\";\nvar DEFAULT_INCLUDEMARGIN = false;\nvar DEFAULT_MINVERSION = 1;\nvar SPEC_MARGIN_SIZE = 4;\nvar DEFAULT_MARGIN_SIZE = 0;\nvar DEFAULT_IMG_SCALE = 0.1;\nfunction generatePath(modules, margin = 0) {\n const ops = [];\n modules.forEach(function(row, y) {\n let start = null;\n row.forEach(function(cell, x) {\n if (!cell && start !== null) {\n ops.push(\n `M${start + margin} ${y + margin}h${x - start}v1H${start + margin}z`\n );\n start = null;\n return;\n }\n if (x === row.length - 1) {\n if (!cell) {\n return;\n }\n if (start === null) {\n ops.push(`M${x + margin},${y + margin} h1v1H${x + margin}z`);\n } else {\n ops.push(\n `M${start + margin},${y + margin} h${x + 1 - start}v1H${start + margin}z`\n );\n }\n return;\n }\n if (cell && start === null) {\n start = x;\n }\n });\n });\n return ops.join(\"\");\n}\nfunction excavateModules(modules, excavation) {\n return modules.slice().map((row, y) => {\n if (y < excavation.y || y >= excavation.y + excavation.h) {\n return row;\n }\n return row.map((cell, x) => {\n if (x < excavation.x || x >= excavation.x + excavation.w) {\n return cell;\n }\n return false;\n });\n });\n}\nfunction getImageSettings(cells, size, margin, imageSettings) {\n if (imageSettings == null) {\n return null;\n }\n const numCells = cells.length + margin * 2;\n const defaultSize = Math.floor(size * DEFAULT_IMG_SCALE);\n const scale = numCells / size;\n const w = (imageSettings.width || defaultSize) * scale;\n const h = (imageSettings.height || defaultSize) * scale;\n const x = imageSettings.x == null ? cells.length / 2 - w / 2 : imageSettings.x * scale;\n const y = imageSettings.y == null ? cells.length / 2 - h / 2 : imageSettings.y * scale;\n const opacity = imageSettings.opacity == null ? 1 : imageSettings.opacity;\n let excavation = null;\n if (imageSettings.excavate) {\n let floorX = Math.floor(x);\n let floorY = Math.floor(y);\n let ceilW = Math.ceil(w + x - floorX);\n let ceilH = Math.ceil(h + y - floorY);\n excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };\n }\n const crossOrigin = imageSettings.crossOrigin;\n return { x, y, h, w, excavation, opacity, crossOrigin };\n}\nfunction getMarginSize(includeMargin, marginSize) {\n if (marginSize != null) {\n return Math.max(Math.floor(marginSize), 0);\n }\n return includeMargin ? SPEC_MARGIN_SIZE : DEFAULT_MARGIN_SIZE;\n}\nfunction useQRCode({\n value,\n level,\n minVersion,\n includeMargin,\n marginSize,\n imageSettings,\n size,\n boostLevel\n}) {\n let qrcode = React.useMemo(() => {\n const values = Array.isArray(value) ? value : [value];\n const segments = values.reduce((accum, v) => {\n accum.push(...qrcodegen_default.QrSegment.makeSegments(v));\n return accum;\n }, []);\n return qrcodegen_default.QrCode.encodeSegments(\n segments,\n ERROR_LEVEL_MAP[level],\n minVersion,\n void 0,\n void 0,\n boostLevel\n );\n }, [value, level, minVersion, boostLevel]);\n const { cells, margin, numCells, calculatedImageSettings } = React.useMemo(() => {\n let cells2 = qrcode.getModules();\n const margin2 = getMarginSize(includeMargin, marginSize);\n const numCells2 = cells2.length + margin2 * 2;\n const calculatedImageSettings2 = getImageSettings(\n cells2,\n size,\n margin2,\n imageSettings\n );\n return {\n cells: cells2,\n margin: margin2,\n numCells: numCells2,\n calculatedImageSettings: calculatedImageSettings2\n };\n }, [qrcode, size, imageSettings, includeMargin, marginSize]);\n return {\n qrcode,\n margin,\n cells,\n numCells,\n calculatedImageSettings\n };\n}\nvar SUPPORTS_PATH2D = function() {\n try {\n new Path2D().addPath(new Path2D());\n } catch (e) {\n return false;\n }\n return true;\n}();\nvar QRCodeCanvas = React.forwardRef(\n function QRCodeCanvas2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n marginSize,\n imageSettings\n } = _a, extraProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const _b = extraProps, { style } = _b, otherProps = __objRest(_b, [\"style\"]);\n const imgSrc = imageSettings == null ? void 0 : imageSettings.src;\n const _canvas = React.useRef(null);\n const _image = React.useRef(null);\n const setCanvasRef = React.useCallback(\n (node) => {\n _canvas.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef]\n );\n const [isImgLoaded, setIsImageLoaded] = React.useState(false);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n React.useEffect(() => {\n if (_canvas.current != null) {\n const canvas = _canvas.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n let cellsToDraw = cells;\n const image = _image.current;\n const haveImageToRender = calculatedImageSettings != null && image !== null && image.complete && image.naturalHeight !== 0 && image.naturalWidth !== 0;\n if (haveImageToRender) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n }\n const pixelRatio = window.devicePixelRatio || 1;\n canvas.height = canvas.width = size * pixelRatio;\n const scale = size / numCells * pixelRatio;\n ctx.scale(scale, scale);\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, numCells, numCells);\n ctx.fillStyle = fgColor;\n if (SUPPORTS_PATH2D) {\n ctx.fill(new Path2D(generatePath(cellsToDraw, margin)));\n } else {\n cells.forEach(function(row, rdx) {\n row.forEach(function(cell, cdx) {\n if (cell) {\n ctx.fillRect(cdx + margin, rdx + margin, 1, 1);\n }\n });\n });\n }\n if (calculatedImageSettings) {\n ctx.globalAlpha = calculatedImageSettings.opacity;\n }\n if (haveImageToRender) {\n ctx.drawImage(\n image,\n calculatedImageSettings.x + margin,\n calculatedImageSettings.y + margin,\n calculatedImageSettings.w,\n calculatedImageSettings.h\n );\n }\n }\n });\n React.useEffect(() => {\n setIsImageLoaded(false);\n }, [imgSrc]);\n const canvasStyle = __spreadValues({ height: size, width: size }, style);\n let img = null;\n if (imgSrc != null) {\n img = /* @__PURE__ */ React.createElement(\n \"img\",\n {\n src: imgSrc,\n key: imgSrc,\n style: { display: \"none\" },\n onLoad: () => {\n setIsImageLoaded(true);\n },\n ref: _image,\n crossOrigin: calculatedImageSettings == null ? void 0 : calculatedImageSettings.crossOrigin\n }\n );\n }\n return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\n \"canvas\",\n __spreadValues({\n style: canvasStyle,\n height: size,\n width: size,\n ref: setCanvasRef,\n role: \"img\"\n }, otherProps)\n ), img);\n }\n);\nQRCodeCanvas.displayName = \"QRCodeCanvas\";\nvar QRCodeSVG = React.forwardRef(\n function QRCodeSVG2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n title,\n marginSize,\n imageSettings\n } = _a, otherProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"title\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n let cellsToDraw = cells;\n let image = null;\n if (imageSettings != null && calculatedImageSettings != null) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n image = /* @__PURE__ */ React.createElement(\n \"image\",\n {\n href: imageSettings.src,\n height: calculatedImageSettings.h,\n width: calculatedImageSettings.w,\n x: calculatedImageSettings.x + margin,\n y: calculatedImageSettings.y + margin,\n preserveAspectRatio: \"none\",\n opacity: calculatedImageSettings.opacity,\n crossOrigin: calculatedImageSettings.crossOrigin\n }\n );\n }\n const fgPath = generatePath(cellsToDraw, margin);\n return /* @__PURE__ */ React.createElement(\n \"svg\",\n __spreadValues({\n height: size,\n width: size,\n viewBox: `0 0 ${numCells} ${numCells}`,\n ref: forwardedRef,\n role: \"img\"\n }, otherProps),\n !!title && /* @__PURE__ */ React.createElement(\"title\", null, title),\n /* @__PURE__ */ React.createElement(\n \"path\",\n {\n fill: bgColor,\n d: `M0,0 h${numCells}v${numCells}H0z`,\n shapeRendering: \"crispEdges\"\n }\n ),\n /* @__PURE__ */ React.createElement(\"path\", { fill: fgColor, d: fgPath, shapeRendering: \"crispEdges\" }),\n image\n );\n }\n);\nQRCodeSVG.displayName = \"QRCodeSVG\";\nexport {\n QRCodeCanvas,\n QRCodeSVG\n};\n", ".dsh-partner-channel-toolbar { display:flex; align-items:center; justify-content:space-between; gap:16px; }\n.dsh-partner-channel-toolbar > button { flex-shrink:0; min-height:44px; }\n.dsh-partner-channel-list { display:grid; gap:12px; }\n.dsh-partner-channels > .dsh-partner-channel-notifications { margin-top:24px; padding-top:24px; border-top:1px solid var(--partner-separator); }\n.dsh-partner-workspace .dsh-partner-channel-form { display:grid; grid-template-columns:minmax(0,1fr); gap:18px; }\n.dsh-partner-workspace .dsh-partner-channel-form > .dsh-partner-channel-field { display:grid; grid-template-columns:minmax(0,1fr); gap:8px; min-width:0; margin:0; }\n.dsh-partner-channel-field > span { font-weight:600; }\n.dsh-partner-channel-field > small { color:var(--partner-text-secondary); line-height:1.5; text-align:start; overflow-wrap:anywhere; }\n.dsh-partner-workspace .dsh-partner-channel-field > :is(input,select) { width:100%; min-width:0; min-height:44px; box-sizing:border-box; }\n.dsh-partner-channel-form > footer { display:flex; flex-wrap:wrap; gap:8px; justify-content:flex-end; }\n.dsh-partner-channel-row { min-width:0; display:flex; align-items:center; gap:12px; padding:16px; border:1px solid var(--partner-border); border-radius:14px; background:var(--partner-card-surface); box-shadow:var(--partner-card-shadow); }\n.dsh-partner-channel-row > span:first-child { flex:1; min-width:0; display:grid; gap:4px; overflow-wrap:anywhere; }\n.dsh-partner-channel-row > span:first-child small { color:var(--partner-text-secondary); font-size:13px; }\n.dsh-partner-channel-row > button { flex-shrink:0; min-height:44px; padding-inline:18px; }\n.dsh-partner-channel-detail { padding:0 16px 16px; display:grid; gap:16px; overflow-wrap:anywhere; }\n.dsh-partner-channel-detail > form + form { border-top:1px solid var(--partner-border); padding-top:16px; }\n.dsh-partner-channel-manage { padding:0; gap:20px; }\n.dsh-partner-channel-connection { display:flex; align-items:center; gap:16px; }\n.dsh-partner-channel-connection > span:first-child { flex:1; min-width:0; display:grid; gap:6px; }\n.dsh-partner-channel-manage p { margin:0; color:var(--partner-text-secondary); line-height:1.6; }\n.dsh-partner-channel-manage small { color:var(--partner-text-secondary); }\n.dsh-partner-channel-manage .dsh-partner-form-actions { flex-wrap:wrap; gap:12px; }\n.dsh-partner-channel-manage button { flex-shrink:0; white-space:nowrap; min-height:44px; padding-inline:16px; }\n.dsh-partner-channel-access { padding-top:20px; border-top:1px solid var(--partner-separator); display:grid; gap:12px; }\n.dsh-partner-channel-access h3 { margin:0; font-size:var(--partner-font-label); }\n.dsh-partner-channel-person { display:flex; align-items:center; flex-wrap:wrap; gap:16px; padding:16px; border:1px solid var(--partner-border); border-radius:12px; background:var(--partner-control); }\n.dsh-partner-channel-person > div { display:grid; gap:6px; flex:1 1 200px; min-width:0; }\n.dsh-partner-channel-person code { font-size:16px; letter-spacing:.1em; font-weight:600; }\n.dsh-partner-sidebar,\n.dsh-partner-pendant,\n.dsh-partner-workspace {\n color-scheme: light;\n /* The host remains the canvas. Panes, cards and controls own progressively\n stronger materials, following the knowledge workspace contract. */\n --partner-surface: transparent;\n --partner-pane: rgba(255, 255, 255, .08);\n --partner-raised: rgba(255, 255, 255, .24);\n --partner-control: rgba(255, 255, 255, .27);\n --partner-control-hover: rgba(255, 255, 255, .38);\n --partner-card-surface: rgba(255, 255, 255, .24);\n --partner-card-highlight: rgba(255, 255, 255, .58);\n --partner-solid-panel: #f4f4f4;\n --partner-solid-raised: #fafafa;\n --partner-solid-control: #ffffff;\n --partner-dialog-veil: transparent;\n --partner-card-shadow:\n inset 0 1px 0 var(--partner-card-highlight),\n inset 0 -1px 0 rgba(60, 60, 67, .08),\n 0 9px 24px rgba(31, 31, 35, .075),\n 0 2px 6px rgba(31, 31, 35, .04);\n --partner-text: #1d1d1f;\n --partner-text-secondary: #515154;\n --partner-text-tertiary: #747478;\n --partner-accent: #6e6e73;\n --partner-accent-strong: #2c2c2e;\n --partner-on-accent: #ffffff;\n --partner-success: #248a3d;\n --partner-weixin: #248a52;\n --partner-warning: #c93400;\n --partner-danger: #d70015;\n --partner-border: rgba(60, 60, 67, .14);\n --partner-separator: rgba(60, 60, 67, .11);\n --partner-hover: rgba(118, 118, 128, .09);\n --partner-selected: rgba(60, 60, 67, .085);\n --partner-focus-ring: rgba(60, 60, 67, .46);\n --partner-glass-clear: rgba(255, 255, 255, .11);\n --partner-glass-regular: rgba(255, 255, 255, .24);\n --partner-glass-thick: rgba(255, 255, 255, .42);\n --partner-glass-highlight: rgba(255, 255, 255, .7);\n --partner-glass-rim-shadow: rgba(60, 60, 67, .11);\n --partner-glass-filter: saturate(.65) contrast(1.015) blur(24px);\n --partner-frosted-filter: saturate(.65) contrast(1.015) blur(24px);\n --partner-toolbar-filter: saturate(.18) contrast(1.015) blur(24px);\n --partner-shadow-sm: 0 1px 2px rgba(0, 0, 0, .055);\n --partner-shadow-md: 0 10px 28px rgba(31, 31, 35, .085);\n --partner-shadow-lg: 0 24px 64px rgba(31, 31, 35, .14);\n --partner-glass-shadow:\n inset 0 1px 0 var(--partner-glass-highlight),\n inset 0 -1px 0 var(--partner-glass-rim-shadow),\n var(--partner-shadow-sm);\n --partner-ease-out: cubic-bezier(.22, 1, .36, 1);\n --partner-font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, \"SF Pro Text\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n --partner-font-caption: 12px;\n --partner-font-body: 13px;\n --partner-font-label: 14px;\n --partner-font-title: 18px;\n --partner-font-heading: 22px;\n --partner-font-display: clamp(24px, 2.2vw, 28px);\n color: var(--partner-text);\n font-family: var(--partner-font-family);\n font-size: var(--partner-font-body);\n line-height: 1.5;\n}\n\nbody[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace, .dsh-partner-pendant) {\n color-scheme: dark;\n --partner-surface: transparent;\n --partner-pane: rgb(16 23 25 / 18%);\n --partner-raised: rgb(32 41 43 / 58%);\n --partner-control: rgb(39 50 53 / 72%);\n --partner-control-hover: rgb(39 50 53 / 84%);\n --partner-card-surface: rgb(32 41 43 / 58%);\n --partner-card-highlight: rgba(255, 255, 255, .11);\n --partner-solid-panel: #182022;\n --partner-solid-raised: #20292b;\n --partner-solid-control: #273235;\n --partner-dialog-veil: transparent;\n --partner-card-shadow:\n inset 0 1px 0 var(--partner-card-highlight),\n inset 0 -1px 0 rgba(0, 0, 0, .28),\n 0 12px 30px rgba(0, 0, 0, .28),\n 0 2px 7px rgba(0, 0, 0, .2);\n --partner-text: #e3eaeb;\n --partner-text-secondary: #bbc9cc;\n --partner-text-tertiary: #95a7ab;\n --partner-accent: #69b6ba;\n --partner-accent-strong: #8aced0;\n --partner-on-accent: #101819;\n --partner-success: #30d158;\n --partner-weixin: #30c96b;\n --partner-warning: #ff9f0a;\n --partner-danger: #ff453a;\n --partner-border: rgb(184 204 205 / 11%);\n --partner-separator: rgb(184 204 205 / 8%);\n --partner-hover: rgb(105 182 186 / 9%);\n --partner-selected: rgb(105 182 186 / 14%);\n --partner-focus-ring: rgb(105 182 186 / 72%);\n --partner-glass-clear: rgba(0, 0, 0, .1);\n --partner-glass-regular: rgba(0, 0, 0, .16);\n --partner-glass-thick: rgba(0, 0, 0, .26);\n --partner-glass-highlight: rgba(255, 255, 255, .16);\n --partner-glass-rim-shadow: rgba(0, 0, 0, .3);\n --partner-glass-filter: saturate(.55) contrast(1.02) blur(24px);\n --partner-frosted-filter: saturate(.55) contrast(1.02) blur(24px);\n --partner-toolbar-filter: saturate(.45) contrast(1.02) blur(24px);\n --partner-shadow-sm: 0 1px 2px rgba(0, 0, 0, .28);\n --partner-shadow-md: 0 12px 32px rgba(0, 0, 0, .34);\n --partner-shadow-lg: 0 28px 72px rgba(0, 0, 0, .48);\n}\n\n.dsh-partner-sidebar,\n.dsh-partner-sidebar *,\n.dsh-partner-workspace,\n.dsh-partner-workspace * { box-sizing: border-box; }\n\n.dsh-partner-sidebar :where(button, input, textarea, select),\n.dsh-partner-workspace :where(button, input, textarea, select) {\n margin: 0;\n border-radius: 0;\n appearance: none;\n color: inherit;\n font-family: var(--partner-font-family);\n font-size: inherit;\n font-weight: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n}\n\n.dsh-partner-sidebar :where(button, input, textarea, select):focus,\n.dsh-partner-workspace :where(button, input, textarea, select):focus { outline: none; }\n\n.dsh-partner-sidebar :where(button, input, textarea, select):focus-visible,\n.dsh-partner-workspace :where(button, input, textarea, select):focus-visible {\n outline: 2px solid var(--partner-focus-ring);\n outline-offset: 2px;\n}\n\n.dsh-partner-sidebar :where(button, input, textarea, select):disabled,\n.dsh-partner-workspace :where(button, input, textarea, select):disabled {\n opacity: .45;\n cursor: default;\n}\n\n.dsh-partner-workspace select {\n padding-right: 32px;\n background-image:\n linear-gradient(45deg, transparent 50%, currentColor 50%),\n linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position:\n calc(100% - 15px) calc(50% - 1px),\n calc(100% - 11px) calc(50% - 1px);\n background-repeat: no-repeat;\n background-size: 4px 4px, 4px 4px;\n}\n\n.dsh-partner-workspace input[type=\"number\"] { appearance: textfield; }\n.dsh-partner-workspace input[type=\"number\"]::-webkit-inner-spin-button,\n.dsh-partner-workspace input[type=\"number\"]::-webkit-outer-spin-button { margin: 0; appearance: none; }\n\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds) {\n scrollbar-width: thin;\n scrollbar-color: color-mix(in srgb, var(--partner-text) 20%, transparent) transparent;\n}\n\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar { width: 6px; height: 6px; }\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar-track { background: transparent; }\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar-thumb {\n border: 1px solid transparent;\n border-radius: 999px;\n background: color-mix(in srgb, var(--partner-text) 20%, transparent);\n background-clip: padding-box;\n}\n\n/* Skills, board and schedule modules share the partner workspace scale. */\n.dsh-partner-feature-page { display: grid; width: min(100%, 1180px); align-content: start; gap: 18px; margin: 0 auto; padding: 26px clamp(22px, 4vw, 52px) 52px; font: var(--partner-font-body)/1.5 var(--partner-font-family); }\n.dsh-partner-feature-page.is-board { width: min(100%, 1480px); gap: 12px; }\n.dsh-partner-feature-hero { display: flex; min-height: 86px; align-items: end; justify-content: space-between; gap: 24px; padding: 0 2px 16px 14px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-feature-hero > span { position: relative; display: grid; min-width: 0; gap: 4px; }\n.dsh-partner-feature-hero > span::before { position: absolute; top: 3px; bottom: 2px; left: -14px; width: 2px; border-radius: 2px; background: linear-gradient(var(--partner-text-secondary), transparent 92%); content: ''; }\n.dsh-partner-feature-hero small,\n.dsh-partner-capability-detail > header small { color: var(--partner-accent); font: 700 var(--partner-font-caption)/1.3 var(--partner-font-family); letter-spacing: .1em; }\n.dsh-partner-feature-hero h2 { margin: 0; color: var(--partner-text); font: 650 var(--partner-font-display)/1.18 var(--partner-font-family); letter-spacing: -.035em; }\n.dsh-partner-feature-hero p { max-width: 680px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-feature-hero > div { display: flex; align-items: end; gap: 8px; }\n.dsh-partner-feature-hero button,\n.dsh-partner-feature-block > header button,\n.dsh-partner-market-grid button,\n.dsh-partner-board button,\n:where(.dsh-partner-feature-page.is-board) button,\n.dsh-partner-schedule-list button,\n.dsh-partner-feature-form button,\n.dsh-partner-task-form button,\n.dsh-partner-schedule-form button { display: inline-flex; min-height: 36px; align-items: center; justify-content: center; gap: 6px; padding: 0 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease, transform .15s var(--partner-ease-out); }\n.dsh-partner-feature-page button:not(:disabled):hover { color: var(--partner-text); border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-feature-page button:not(:disabled):active { transform: translateY(1px); }\n.dsh-partner-feature-block,\n.dsh-partner-capability-detail { display: grid; gap: 14px; padding: 18px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n.dsh-partner-capability-detail { margin: 0 0 18px; }\n.dsh-partner-feature-block > header,\n.dsh-partner-capability-detail > header { display: flex; min-height: 36px; align-items: center; justify-content: space-between; gap: 16px; }\n.dsh-partner-feature-block > header > span,\n.dsh-partner-capability-detail > header > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-feature-block > header > div { display: flex; align-items: center; justify-content: flex-end; gap: 8px; }\n.dsh-partner-capability-actions { display: flex; align-items: center; justify-content: flex-end; gap: 10px; }\n.dsh-partner-capability-actions > button { display: inline-flex; min-height: 34px; align-items: center; justify-content: center; gap: 6px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease; }\n.dsh-partner-capability-actions > button:hover { color: var(--partner-text); border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-feature-block > header strong,\n.dsh-partner-capability-detail > header strong { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-feature-block > header small,\n.dsh-partner-capability-detail > header em { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; }\n.dsh-partner-feature-empty { margin: 0; padding: 24px 16px; border: 1px dashed var(--partner-border); border-radius: 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); line-height: 1.55; text-align: center; }\n.dsh-partner-inline-warning { margin: 0; padding: 9px 11px; border-radius: 9px; color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 8%, transparent); font-size: var(--partner-font-caption); }\n.dsh-partner-feature-error { margin: 0; padding: 10px 12px; border: 1px solid color-mix(in srgb, var(--partner-danger) 22%, transparent); border-radius: 10px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-raised)); font-size: var(--partner-font-body); line-height: 1.5; overflow-wrap: anywhere; }\n.dsh-partner-skill-installed { display: grid; gap: 8px; }\n.dsh-partner-skill-installed.is-binding { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-market-toolbar { display: grid; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 14px; background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n.dsh-partner-market-sources { display: flex; gap: 5px; overflow-x: auto; padding: 7px; border-top: 1px solid var(--partner-separator); background: color-mix(in srgb, var(--partner-control) 74%, transparent); scrollbar-width: thin; }\n.dsh-partner-market-sources > button { display: inline-flex; min-height: 34px; flex: 0 0 auto; align-items: center; gap: 7px; padding: 0 10px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease; }\n.dsh-partner-market-sources > button:hover { color: var(--partner-text-secondary); background: var(--partner-hover); }\n.dsh-partner-market-sources > button:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: -2px; }\n.dsh-partner-market-sources > button.is-active { border-color: var(--partner-separator); color: var(--partner-text); background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), 0 1px 3px color-mix(in srgb, #000 7%, transparent); }\n.dsh-partner-market-sources small { display: grid; min-width: 20px; height: 20px; place-items: center; padding: 0 5px; border-radius: 7px; color: var(--partner-text-tertiary); background: var(--partner-selected); font-size: var(--partner-font-caption); }\n.dsh-partner-skill-installed > article { display: grid; min-height: 72px; grid-template-columns: 36px minmax(0, 1fr) auto 32px; align-items: center; gap: 11px; padding: 11px 12px; border: 1px solid var(--partner-separator); border-radius: 12px; background: var(--partner-raised); }\n.dsh-partner-skill-installed.is-market > article { grid-template-columns: 36px minmax(0, 1fr) 32px; }\n.dsh-partner-skill-installed.is-binding > article { min-height: 122px; grid-template-columns: 36px minmax(0, 1fr) auto; align-content: start; align-items: start; padding: 13px; }\n.dsh-partner-skill-installed.is-binding .dsh-partner-skill-mark { margin-top: 1px; }\n.dsh-partner-skill-installed.is-binding article > span:nth-child(2) { gap: 5px; }\n.dsh-partner-skill-installed.is-binding p { display: -webkit-box; line-height: 1.5; white-space: normal; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-skill-mark { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 11px; color: var(--partner-text-secondary); background: var(--partner-selected); }\n.dsh-partner-skill-installed article > span:nth-child(2) { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-skill-installed strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-skill-installed p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-skill-installed .dsh-partner-skill-action-error { grid-column: 2 / -1; overflow: visible; padding: 8px 10px; border-radius: 8px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, transparent); font-size: var(--partner-font-caption); line-height: 1.45; text-overflow: clip; white-space: normal; overflow-wrap: anywhere; }\n.dsh-partner-skill-installed small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-feature-switch { position: relative; width: 38px; height: 22px; min-height: 22px !important; padding: 0 !important; border-radius: 999px !important; background: color-mix(in srgb, var(--partner-text) 9%, transparent) !important; box-shadow: none !important; }\n.dsh-partner-feature-switch i { position: absolute; top: 3px; left: 3px; width: 14px; height: 14px; border-radius: 50%; background: var(--partner-raised); box-shadow: 0 1px 3px color-mix(in srgb, #000 16%, transparent); transition: transform .18s var(--partner-ease-out); }\n.dsh-partner-feature-switch[data-on=\"true\"] { border-color: var(--partner-accent-strong) !important; background: var(--partner-accent-strong) !important; }\n.dsh-partner-feature-switch[data-on=\"true\"] i { transform: translateX(16px); }\n.dsh-partner-skill-binding-action,\n.dsh-partner-skill-picker button { display: inline-flex; min-height: 34px; align-items: center; justify-content: center; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease; }\n.dsh-partner-skill-binding-action:hover,\n.dsh-partner-skill-picker button:hover { color: var(--partner-text); border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-skill-binding-action:disabled,\n.dsh-partner-skill-picker button:disabled { cursor: wait; opacity: .56; }\n.dsh-partner-skill-disclosure { justify-self: center; min-height: 34px; padding: 0 12px; border-color: transparent; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font-size: var(--partner-font-body); }\n.dsh-partner-skill-disclosure:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-skill-picker { display: grid; gap: 10px; padding: 12px; border: 1px solid var(--partner-border); border-radius: 13px; background: color-mix(in srgb, var(--partner-control) 72%, transparent); animation: dsh-partner-reveal .16s ease-out; }\n.dsh-partner-skill-search { display: grid; min-height: 56px; grid-template-columns: 36px minmax(0, 1fr) auto auto; align-items: center; gap: 10px; padding: 9px 13px; color: var(--partner-text-tertiary); background: transparent; transition: background .15s ease, border-color .15s ease, box-shadow .15s ease; }\n.dsh-partner-skill-search:focus-within { background: color-mix(in srgb, var(--partner-selected) 28%, transparent); box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--partner-focus-ring) 62%, transparent); }\n.dsh-partner-skill-search-icon { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-control); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-skill-search input { min-width: 0; height: 36px; padding: 0; border: 0; border-radius: 0; outline: 0; appearance: none; color: var(--partner-text); background: transparent; box-shadow: none; font: 500 var(--partner-font-label)/1.4 var(--partner-font-family); }\n.dsh-partner-skill-search input::placeholder { color: var(--partner-text-tertiary); opacity: 1; }\n.dsh-partner-skill-search input::-webkit-search-cancel-button { display: none; appearance: none; }\n.dsh-partner-skill-search .dsh-partner-skill-search-clear { display: grid; width: 30px; min-height: 30px; place-items: center; padding: 0; border: 0; border-radius: 8px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; cursor: pointer; }\n.dsh-partner-skill-search .dsh-partner-skill-search-clear:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-skill-search .dsh-partner-skill-search-clear:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: -2px; }\n.dsh-partner-skill-search-count { min-width: 56px; padding-left: 11px; border-left: 1px solid var(--partner-separator); color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 580; line-height: 20px; text-align: right; white-space: nowrap; }\n.dsh-partner-skill-search.is-compact { min-height: 42px; grid-template-columns: 30px minmax(0, 1fr) auto auto; gap: 8px; padding: 5px 8px; border: 1px solid var(--partner-border); border-radius: 11px; background: var(--partner-raised); }\n.dsh-partner-skill-search.is-compact:focus-within { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 15%, transparent); }\n.dsh-partner-skill-search.is-compact .dsh-partner-skill-search-icon { width: 30px; height: 30px; border-radius: 8px; }\n.dsh-partner-skill-search.is-compact input { height: 30px; font-size: var(--partner-font-body); }\n.dsh-partner-skill-search.is-compact .dsh-partner-skill-search-count { min-width: 48px; padding-left: 8px; }\n.dsh-partner-skill-picker-list { display: grid; max-height: 360px; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; }\n.dsh-partner-skill-picker-list > article { display: grid; min-height: 112px; grid-template-rows: minmax(0, 1fr) auto; gap: 10px; padding: 11px; border: 1px solid var(--partner-separator); border-radius: 11px; background: var(--partner-raised); }\n.dsh-partner-skill-picker-list article > span { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-skill-picker-list strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-skill-picker-list p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-skill-picker-list button { justify-self: end; }\n.dsh-partner-skill-picker-list small,\n.dsh-partner-skill-picker-limit { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-skill-picker-empty { margin: 0; padding: 20px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); text-align: center; }\n.dsh-partner-access-note { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-access-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }\n.dsh-partner-access-list > button { display: grid; min-width: 0; min-height: 92px; grid-template-columns: 36px minmax(0, 1fr) 22px; align-items: start; gap: 11px; padding: 12px; border: 1px solid var(--partner-separator); border-radius: 12px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1.5 var(--partner-font-family); text-align: left; cursor: pointer; transition: border-color .15s ease, background .15s ease, transform .15s var(--partner-ease-out); }\n.dsh-partner-access-list > button:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-access-list > button.is-active { border-color: color-mix(in srgb, var(--partner-accent) 55%, var(--partner-border)); background: color-mix(in srgb, var(--partner-selected) 74%, var(--partner-raised)); }\n.dsh-partner-access-avatar { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 12px; color: var(--partner-text); background: var(--partner-selected); font-size: var(--partner-font-caption); font-weight: 650; }\n.dsh-partner-access-copy { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-access-copy > strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-access-copy > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-access-copy > p { margin: 3px 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.5; }\n.dsh-partner-access-copy > span { display: flex; flex-wrap: wrap; gap: 5px; }\n.dsh-partner-access-copy em { padding: 2px 7px; border: 1px solid var(--partner-separator); border-radius: 999px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: var(--partner-font-caption); font-style: normal; line-height: 1.4; }\n.dsh-partner-access-check { display: grid; width: 22px; height: 22px; place-items: center; border: 1px solid var(--partner-border); border-radius: 7px; color: transparent; background: var(--partner-control); }\n.dsh-partner-access-list > button.is-active .dsh-partner-access-check { border-color: var(--partner-accent-strong); color: var(--partner-on-accent); background: var(--partner-accent-strong); }\n.dsh-partner-feature-block .is-icon,\n.dsh-partner-board .is-icon,\n.dsh-partner-schedule-list .is-icon { width: 32px; min-height: 32px; padding: 0; border-color: transparent; background: transparent; box-shadow: none; }\n.dsh-partner-market-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 10px; }\n.dsh-partner-market-grid > article { display: flex; min-height: 164px; flex-direction: column; justify-content: space-between; gap: 14px; padding: 15px; border: 1px solid var(--partner-separator); border-radius: 13px; background: var(--partner-raised); transition: border-color .16s ease, transform .18s var(--partner-ease-out); }\n.dsh-partner-market-grid > article:hover { transform: translateY(-1px); border-color: color-mix(in srgb, var(--partner-text) 22%, var(--partner-border)); }\n.dsh-partner-market-grid article > span { display: grid; gap: 6px; }\n.dsh-partner-market-grid article > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }\n.dsh-partner-market-grid strong { font-size: var(--partner-font-label); }\n.dsh-partner-market-grid p { display: -webkit-box; overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; -webkit-box-orient: vertical; -webkit-line-clamp: 3; }\n.dsh-partner-market-grid .dsh-partner-market-card-error { display: block; overflow: visible; padding: 8px 10px; border-radius: 8px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, transparent); font-size: var(--partner-font-caption); line-height: 1.45; overflow-wrap: anywhere; -webkit-line-clamp: unset; }\n.dsh-partner-market-grid footer { display: flex; align-items: center; justify-content: space-between; gap: 10px; }\n.dsh-partner-market-grid footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-feature-form,\n.dsh-partner-task-form,\n.dsh-partner-schedule-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; padding: 18px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label { display: grid; min-width: 0; gap: 8px; color: var(--partner-text-secondary); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label > span { color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.45; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select) { width: 100%; min-height: 38px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text); background: var(--partner-control); font: var(--partner-font-label)/1.5 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease, background .15s ease; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select):focus { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), inset 0 1px 0 var(--partner-glass-highlight); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) textarea { resize: vertical; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) .is-wide { grid-column: 1 / -1; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer { display: flex; grid-column: 1 / -1; justify-content: flex-end; gap: 8px; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > p { grid-column: 1 / -1; margin: 0; padding: 9px 11px; border-radius: 9px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 6%, transparent); font-size: var(--partner-font-body); }\n.dsh-partner-feature-form > p.is-success { color: var(--partner-success); background: color-mix(in srgb, var(--partner-success) 7%, transparent); }\n.dsh-partner-board-live { display: inline-flex; min-height: 36px; align-items: center; gap: 7px; padding: 0 10px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-board-live > i { width: 7px; height: 7px; border-radius: 50%; background: var(--partner-success); box-shadow: 0 0 0 4px color-mix(in srgb, var(--partner-success) 10%, transparent); }\n.dsh-partner-board-tools { display: grid; grid-template-columns: minmax(220px, 1fr) minmax(140px, 180px) auto; align-items: center; gap: 8px; }\n.dsh-partner-board-search { position: relative; display: flex; min-width: 0; align-items: center; }\n.dsh-partner-feature-page.is-board .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n.dsh-partner-board-assignee.is-mobile-stage { display: none; }\n.dsh-partner-board-search > span:not(.sr-only) { position: absolute; z-index: 1; left: 11px; display: grid; place-items: center; color: var(--partner-text-tertiary); pointer-events: none; }\n.dsh-partner-board-search > input,\n.dsh-partner-board-assignee > select { width: 100%; min-height: 38px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text); background-color: var(--partner-control); font: var(--partner-font-body)/1.4 var(--partner-font-family); transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease; }\n.dsh-partner-board-search > input { padding: 8px 38px 8px 34px; }\n.dsh-partner-board-search > input::placeholder { color: var(--partner-text-tertiary); }\n.dsh-partner-board-search > input:hover,\n.dsh-partner-board-assignee > select:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background-color: var(--partner-hover); }\n.dsh-partner-board-search > input:focus-visible,\n.dsh-partner-board-assignee > select:focus-visible { outline: 0; border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent); }\n.dsh-partner-board-search > button { position: absolute; z-index: 1; right: 4px; display: grid; width: 30px; min-height: 30px; place-items: center; padding: 0; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; }\n.dsh-partner-board-search > button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-board-assignee > select { min-width: 0; padding: 8px 30px 8px 10px; }\n.dsh-partner-board-tools > small { justify-self: end; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; white-space: nowrap; }\n.dsh-partner-board-statuses { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; padding-bottom: 2px; }\n.dsh-partner-board-statuses > button { display: inline-flex; min-height: 32px; align-items: center; gap: 7px; padding: 0 9px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font: var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; transition: border-color 140ms ease, color 140ms ease, background-color 140ms ease; }\n.dsh-partner-board-statuses > button:hover { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-board-statuses > button.is-active { border-color: color-mix(in srgb, var(--partner-text) 18%, var(--partner-border)); color: var(--partner-text); background: var(--partner-selected); }\n.dsh-partner-board-statuses b { min-width: 18px; color: inherit; font-size: inherit; font-variant-numeric: tabular-nums; font-weight: 650; text-align: center; }\n.dsh-partner-board { display: grid; grid-template-columns: minmax(0, 1fr); align-items: start; gap: 10px; min-width: 0; }\n.dsh-partner-board > section { display: grid; min-width: 0; align-content: start; padding: 8px 10px 10px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); }\n.dsh-partner-board > section > header { display: flex; min-height: 36px; align-items: center; padding: 0 0 6px; }\n.dsh-partner-board .dsh-partner-board-stage-toggle { display: flex; width: 100%; min-height: 32px; align-items: center; justify-content: flex-start; gap: 8px; padding: 4px; border: 0; border-radius: 7px; color: var(--partner-text); background: transparent; text-align: left; box-shadow: none; }\n.dsh-partner-board-stage-toggle:hover:not(:disabled) { background: var(--partner-hover); }\n.dsh-partner-board-stage-toggle[aria-expanded=\"true\"] > svg { transform: rotate(90deg); }\n.dsh-partner-board > section > [hidden] { display: none; }\n.dsh-partner-board > section > header strong { font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-board > section > header b { display: grid; min-width: 22px; height: 22px; place-items: center; padding: 0 5px; border-radius: 7px; color: var(--partner-text-tertiary); background: var(--partner-selected); font-size: var(--partner-font-caption); }\n.dsh-partner-board-column-list { display: grid; min-width: 0; grid-template-columns: repeat(auto-fill, minmax(min(240px, 100%), 1fr)); align-items: stretch; align-content: start; gap: 8px; }\n.dsh-partner-board-empty { margin: 0; padding: 0 4px 2px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-board-more { display: block; margin: 8px auto 0; min-height: 32px; padding: 4px 12px; border: 1px solid var(--partner-border); border-radius: 8px; background: transparent; color: var(--partner-text-secondary); box-shadow: none !important; }\n.dsh-partner-board-more:hover { background: var(--partner-hover); }\n.dsh-partner-task-card { position: relative; display: grid; min-height: 82px; overflow: hidden; border: 1px solid var(--partner-separator); border-radius: 11px; background: var(--partner-raised); box-shadow: none; transition: border-color .16s ease; }\n.dsh-partner-task-card:hover { border-color: color-mix(in srgb, var(--partner-text) 22%, var(--partner-border)); }\n.dsh-partner-task-card:focus-within { border-color: var(--partner-focus-ring); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), var(--partner-shadow-md); }\n.dsh-partner-task-card[data-blocked=\"true\"] { border-left-color: color-mix(in srgb, var(--partner-warning) 55%, var(--partner-border)); }\n.dsh-partner-task-summary { display: grid !important; min-height: 82px !important; grid-template-columns: minmax(0, 1fr) 16px; align-items: center !important; gap: 8px !important; padding: 10px 10px 10px 11px !important; border: 0 !important; border-radius: 0 !important; appearance: none; color: var(--partner-text) !important; background: transparent !important; box-shadow: none !important; font-family: var(--partner-font-family); text-align: left; cursor: pointer; }\n.dsh-partner-task-summary:hover { background: var(--partner-hover) !important; }\n.dsh-partner-task-summary:focus-visible { outline: 0; }\n.dsh-partner-task-summary > span { display: grid; min-width: 0; gap: 4px; }\n.dsh-partner-task-card-title { display: flex; min-width: 0; align-items: flex-start; justify-content: space-between; gap: 8px; }\n.dsh-partner-task-card-title > strong { display: -webkit-box; min-width: 0; overflow: hidden; color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 620; line-height: 1.38; overflow-wrap: anywhere; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-task-card-title > em { flex: none; margin-top: 1px; padding: 2px 5px; border: 1px solid var(--partner-separator); border-radius: 6px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: 10px; font-style: normal; font-weight: 620; line-height: 1.25; }\n.dsh-partner-task-card[data-priority=\"high\"] .dsh-partner-task-card-title > em { border-color: color-mix(in srgb, var(--partner-warning) 35%, var(--partner-separator)); color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 7%, var(--partner-control)); }\n.dsh-partner-task-card[data-priority=\"urgent\"] .dsh-partner-task-card-title > em { border-color: color-mix(in srgb, var(--partner-danger) 34%, var(--partner-separator)); color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-control)); }\n.dsh-partner-task-card-owner { overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-relations { display: flex; min-width: 0; align-items: center; flex-wrap: wrap; gap: 4px; }\n.dsh-partner-task-relations > small { padding: 2px 6px; border-radius: 6px; color: var(--partner-text-secondary); background: var(--partner-selected); font-size: 10px; font-variant-numeric: tabular-nums; line-height: 1.3; }\n.dsh-partner-task-relations > small[data-blocked=\"true\"] { color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 8%, var(--partner-selected)); }\n.dsh-partner-task-summary > svg { color: var(--partner-text-tertiary); transition: transform .16s var(--partner-ease-out), color .16s ease; }\n.dsh-partner-task-summary:hover > svg { color: var(--partner-text); transform: translateX(2px); }\n.dsh-partner-task-detail { display: grid; gap: 13px; }\n.dsh-partner-task-description { display: grid; gap: 6px; padding: 12px; border: 1px solid var(--partner-separator); border-radius: 10px; background: color-mix(in srgb, var(--partner-raised) 78%, transparent); }\n.dsh-partner-task-description strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-description p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; white-space: pre-wrap; overflow-wrap: anywhere; }\n.dsh-partner-task-fields { display: grid; gap: 7px; }\n.dsh-partner-task-contract { display: grid; gap: 12px; min-width: 0; color: var(--partner-text); font: var(--partner-font-body)/1.6 var(--partner-font-family); }\n.dsh-partner-task-contract header, .dsh-partner-task-contract li, .dsh-partner-task-contract li > div { display: grid; gap: 6px; min-width: 0; }\n.dsh-partner-task-contract ol { display: grid; gap: 14px; margin: 0; padding: 0; list-style: none; counter-reset: criterion; }\n.dsh-partner-task-contract li { counter-increment: criterion; border-top: 1px solid var(--partner-border); padding-top: 10px; }\n.dsh-partner-task-contract li > p { margin: 0; overflow-wrap: anywhere; }\n.dsh-partner-task-contract li > p::before { content: counter(criterion) '. '; color: var(--partner-text-tertiary); }\n.dsh-partner-task-contract small { font-size: var(--partner-font-caption); color: var(--partner-text-secondary); overflow-wrap: anywhere; }\n.dsh-partner-task-contract code { display: block; white-space: pre-wrap; overflow-wrap: anywhere; font-size: var(--partner-font-caption); }\n.dsh-partner-task-contract .dsh-partner-task-fields label { grid-template-columns: minmax(0, 1fr); gap: 5px; }\n.dsh-partner-task-contract :is(select, textarea) { box-sizing: border-box; width: 100%; min-width: 0; min-height: 38px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text); background: var(--partner-control); font: var(--partner-font-label)/1.5 var(--partner-font-family); }\n.dsh-partner-task-contract textarea { resize: vertical; }\n.dsh-partner-task-contract :is(select, textarea):focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-task-fields label { display: grid; grid-template-columns: 58px minmax(0, 1fr); align-items: center; gap: 8px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-detail select { width: 100%; height: 34px; padding: 0 28px 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background-color: var(--partner-control); font: var(--partner-font-body)/1 var(--partner-font-family); }\n.dsh-partner-task-detail select:focus { border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 14%, transparent); }\n.dsh-partner-task-execution { display: grid; min-height: 48px; grid-template-columns: 9px minmax(0, 1fr); align-items: start; gap: 10px; padding: 10px 11px; border: 1px solid color-mix(in srgb, var(--partner-accent) 24%, var(--partner-separator)); border-radius: 9px; background: color-mix(in srgb, var(--partner-accent) 5%, var(--partner-raised)); }\n.dsh-partner-task-execution > i { width: 7px; height: 7px; margin-top: 5px; border-radius: 50%; background: var(--partner-success); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-success) 12%, transparent); }\n.dsh-partner-task-execution[data-state=\"queued\"] > i { background: var(--partner-warning); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-warning) 12%, transparent); }\n.dsh-partner-task-execution > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-task-execution strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-execution small { overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.45; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-dependency { display: grid; gap: 7px; padding: 10px; border: 1px solid var(--partner-separator); border-radius: 9px; background: color-mix(in srgb, var(--partner-control) 64%, transparent); }\n.dsh-partner-task-dependency > header { display: grid; gap: 2px; }\n.dsh-partner-task-dependency > header strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-dependency > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.4; }\n.dsh-partner-task-dependency > div { display: grid; gap: 5px; }\n.dsh-partner-task-dependency > div > span { display: grid; min-height: 30px; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; gap: 6px; }\n.dsh-partner-task-dependency > div i { display: grid; width: 16px; height: 16px; place-items: center; border: 1px solid var(--partner-border); border-radius: 5px; color: var(--partner-on-accent); background: var(--partner-control); font-style: normal; }\n.dsh-partner-task-dependency > div span[data-done=\"true\"] i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-task-dependency > div b { overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); font-weight: 560; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-dependency > div button { min-height: 26px; padding: 0 7px; border-color: transparent; background: transparent; box-shadow: none; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-result { display: grid; gap: 6px; padding: 10px; border: 1px solid var(--partner-separator); border-radius: 9px; background: color-mix(in srgb, var(--partner-raised) 78%, transparent); }\n.dsh-partner-task-result strong,\n.dsh-partner-task-activity > strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-result p { max-height: 220px; margin: 0; overflow-y: auto; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; }\n.dsh-partner-task-activity { display: grid; gap: 6px; }\n.dsh-partner-task-activity ol { display: grid; gap: 5px; margin: 0; padding: 0; list-style: none; }\n.dsh-partner-task-activity li { display: grid; gap: 2px; padding-left: 8px; border-left: 2px solid var(--partner-separator); color: var(--partner-text-secondary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-activity time { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-reject,\n.dsh-partner-task-delete-confirm { display: grid; gap: 9px; padding: 10px; border: 1px solid var(--partner-border); border-radius: 9px; background: var(--partner-control); }\n.dsh-partner-task-reject label { display: grid; gap: 6px; color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-task-reject textarea { width: 100%; min-height: 76px; resize: vertical; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1.5 var(--partner-font-family); }\n.dsh-partner-task-reject textarea:focus { border-color: var(--partner-focus-ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 15%, transparent); }\n.dsh-partner-task-reject > div,\n.dsh-partner-task-delete-confirm > div { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px; }\n.dsh-partner-task-reject button,\n.dsh-partner-task-delete-confirm button { min-height: 32px; padding-inline: 10px; font-size: var(--partner-font-caption); }\n.dsh-partner-task-delete-confirm { border-color: color-mix(in srgb, var(--partner-danger) 28%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 6%, var(--partner-control)); }\n.dsh-partner-task-delete-confirm > span { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; }\n.dsh-partner-task-delete-confirm .is-danger { color: var(--partner-on-accent); border-color: var(--partner-danger); background: var(--partner-danger); }\n.dsh-partner-task-actions { display: grid; gap: 8px; padding-top: 9px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-task-actions > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-actions > span { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 5px; }\n.dsh-partner-task-actions button { min-height: 32px; padding-inline: 9px; font-size: var(--partner-font-caption); }\n.dsh-partner-task-actions button.is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-task-form,\n.dsh-partner-schedule-form { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-task-form .is-wide,\n.dsh-partner-schedule-form .is-wide { grid-column: 1 / -1; }\n.dsh-partner-task-form-dependencies { display: grid; gap: 8px; }\n.dsh-partner-task-form-dependencies > span { color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-task-form-dependencies > span > small { margin-left: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 500; }\n.dsh-partner-task-form-dependencies > div { display: grid; max-height: 180px; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; overflow-y: auto; padding: 6px; border: 1px solid var(--partner-border); border-radius: 10px; background: var(--partner-control); }\n.dsh-partner-task-form-dependencies label { display: grid; min-height: 36px; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; gap: 7px; padding: 0 7px; border-radius: 7px; color: var(--partner-text-secondary); cursor: pointer; }\n.dsh-partner-task-form-dependencies label:hover { background: var(--partner-hover); }\n.dsh-partner-task-form-dependencies input { position: absolute; width: 1px !important; min-height: 1px !important; opacity: 0; pointer-events: none; }\n.dsh-partner-task-form-dependencies label > i { display: grid; width: 18px; height: 18px; place-items: center; border: 1px solid var(--partner-border); border-radius: 5px; background: var(--partner-raised); }\n.dsh-partner-task-form-dependencies input:checked + i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-task-form-dependencies input:checked + i::after { width: 7px; height: 4px; border-bottom: 2px solid var(--partner-on-accent); border-left: 2px solid var(--partner-on-accent); content: ''; transform: rotate(-45deg) translateY(-1px); }\n.dsh-partner-task-form-dependencies input:focus-visible + i { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-task-form-dependencies label > span { overflow: hidden; font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-form-dependencies label > small,\n.dsh-partner-task-form-dependencies > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-form-dependencies > p { margin: 0; padding: 12px; border: 1px dashed var(--partner-border); border-radius: 10px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: var(--partner-font-body); text-align: center; }\n.dsh-partner-schedule-time { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }\n.dsh-partner-schedule-time > label { display: grid; min-width: 0; gap: 8px; }\n.dsh-partner-schedule-time > label > span { color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-schedule-list { display: grid; gap: 8px; }\n.dsh-partner-schedule-list > article { display: grid; min-height: 76px; grid-template-columns: minmax(0, 1fr) auto auto 32px; align-items: center; gap: 11px; padding: 12px 13px; border: 1px solid var(--partner-separator); border-radius: 12px; background: var(--partner-raised); }\n.dsh-partner-schedule-list article > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-schedule-list strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-schedule-list p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-schedule-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-run-list { display: grid; gap: 3px; }\n.dsh-partner-run-list > article { display: grid; grid-template-columns: 10px minmax(0, 1fr); align-items: start; gap: 10px; padding: 10px 6px; border-bottom: 1px solid var(--partner-separator); }\n.dsh-partner-run-list article > i { width: 7px; height: 7px; margin-top: 7px; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-run-list article[data-status=\"completed\"] > i { background: var(--partner-success); }\n.dsh-partner-run-list article[data-status=\"failed\"] > i,\n.dsh-partner-run-list article[data-status=\"timed-out\"] > i { background: var(--partner-danger); }\n.dsh-partner-run-list article > span { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-run-list strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-run-list p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-run-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-check { display: flex !important; min-height: 38px; align-items: center; align-self: end; gap: 8px !important; cursor: pointer; }\n.dsh-partner-check input { position: absolute; width: 1px !important; min-height: 1px !important; opacity: 0; pointer-events: none; }\n.dsh-partner-check i { display: grid; width: 20px; height: 20px; place-items: center; border: 1px solid var(--partner-border); border-radius: 6px; background: var(--partner-control); }\n.dsh-partner-check input:checked + i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-check input:checked + i::after { width: 8px; height: 4px; border-bottom: 2px solid var(--partner-on-accent); border-left: 2px solid var(--partner-on-accent); content: ''; transform: rotate(-45deg) translateY(-1px); }\n.dsh-partner-check input:focus-visible + i { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n\n@media (max-width: 820px) {\n .dsh-partner-feature-hero { align-items: start; flex-direction: column; gap: 12px; }\n .dsh-partner-feature-hero > div { width: 100%; flex-wrap: wrap; }\n .dsh-partner-board-tools { grid-template-columns: minmax(0, 1fr) minmax(130px, 168px); }\n .dsh-partner-board-tools > small { grid-column: 1 / -1; justify-self: start; }\n .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form { grid-template-columns: 1fr 1fr; }\n .dsh-partner-schedule-list > article { grid-template-columns: minmax(0, 1fr) auto 30px; }\n .dsh-partner-schedule-list > article > button:not(.is-icon):not(.dsh-partner-feature-switch) { grid-column: 1 / -1; }\n}\n\n@media (max-width: 560px) {\n .dsh-partner-feature-page { padding: 20px 14px 36px; }\n .dsh-partner-feature-block, .dsh-partner-capability-detail { padding: 14px; }\n .dsh-partner-capability-detail > header { align-items: flex-start; flex-direction: column; }\n .dsh-partner-capability-actions { width: 100%; justify-content: space-between; }\n .dsh-partner-access-list { grid-template-columns: 1fr; }\n .dsh-partner-skill-installed > article { grid-template-columns: 36px minmax(0, 1fr) auto; }\n .dsh-partner-skill-installed.is-market > article { grid-template-columns: 36px minmax(0, 1fr) 32px; }\n .dsh-partner-skill-installed.is-binding,\n .dsh-partner-skill-picker-list { grid-template-columns: 1fr; }\n .dsh-partner-skill-installed > article > .is-icon { grid-column: 3; }\n .dsh-partner-feature-block > header { align-items: flex-start; flex-direction: column; }\n .dsh-partner-feature-block > header > div { width: 100%; flex-wrap: wrap; justify-content: flex-start; }\n .dsh-partner-board-tools { grid-template-columns: 1fr; }\n .dsh-partner-board-assignee, .dsh-partner-board-tools > small { grid-column: 1; }\n .dsh-partner-board-assignee > select { min-height: 42px; }\n .dsh-partner-board-statuses { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); }\n .dsh-partner-board-statuses > button { min-width: 0; justify-content: center; padding-inline: 6px; }\n .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form { grid-template-columns: 1fr; padding: 14px; }\n :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label { grid-column: 1 !important; }\n .dsh-partner-task-form-dependencies > div { grid-template-columns: 1fr; }\n}\n\n.dsh-partner-sidebar { box-sizing: border-box; flex: none; margin: 0 8px 8px 2px; padding: 4px 0 7px; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 62%, transparent); }\n.dsh-partner-sidebar.is-rail { width: 36px; margin: 0 0 8px; padding: 0; border: 0; }\n.dsh-partner-sidebar-heading { display: flex; align-items: stretch; height: 32px; padding: 0 4px 0 5px; }\n.dsh-partner-sidebar-title { display: flex; min-width: 0; min-height: 32px; flex: 1 1 auto; align-items: center; justify-content: flex-start; gap: 5px; padding: 0 5px; border: 0; border-radius: 7px; appearance: none; color: var(--partner-text-secondary); background: transparent; font: 600 var(--partner-font-body)/1 var(--partner-font-family); text-align: left; cursor: pointer; }\n.dsh-partner-sidebar-title > span { display: grid; place-items: center; transition: transform .16s ease; }\n.dsh-partner-sidebar-title > span[data-open=\"false\"] { transform: rotate(-90deg); }\n.dsh-partner-sidebar-title:hover,\n.dsh-partner-rail:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-sidebar-list { display: grid; grid-template-rows: 0fr; opacity: 0; transition: grid-template-rows 220ms var(--partner-ease-out), opacity 150ms ease; }\n.dsh-partner-sidebar-list.is-open { grid-template-rows: 1fr; opacity: 1; }\n.dsh-partner-sidebar-list-inner { display: grid; min-height: 0; gap: 2px; overflow: hidden; padding: 2px 1px 0; }\n.dsh-partner-sidebar-row { position: relative; isolation: isolate; display: grid; grid-template-columns: 26px minmax(0, 1fr) 7px; align-items: center; gap: 8px; width: 100%; min-height: 40px; padding: 4px 7px; overflow: hidden; border: 1px solid transparent; border-radius: 10px; color: inherit; background: transparent; text-align: left; cursor: pointer; transition: color 140ms ease, background-color 140ms ease, box-shadow 180ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-sidebar-row:hover { background: var(--partner-hover); transform: translateX(1px); }\n.dsh-partner-sidebar-row.is-active { border-color: transparent; background: var(--partner-selected); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n.dsh-partner-sidebar-row > span:nth-child(2) { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-sidebar-row strong,\n.dsh-partner-sidebar-row small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-sidebar-row strong { font-size: var(--partner-font-label); font-weight: 520; }\n.dsh-partner-sidebar-row small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-sidebar-row > i,\n.dsh-partner-roster-list button > i { width: 6px; height: 6px; border: 1px solid var(--partner-text-tertiary); border-radius: 50%; }\n.dsh-partner-sidebar-row > i.is-online,\n.dsh-partner-roster-list button > i.is-online { border-color: var(--partner-success); background: var(--partner-success); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-success) 12%, transparent); }\n.dsh-partner-sidebar-symbol { display: grid !important; place-items: center; width: 25px; height: 25px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-sidebar-empty { margin: 5px 9px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); }\n.dsh-partner-rail { display: grid; place-items: center; width: 36px; height: 36px; padding: 0; border: 0; border-radius: 10px; color: var(--partner-text); background: transparent; cursor: pointer; }\n.dsh-partner-rail.is-active { background: var(--partner-hover); }\n\n.dsh-partner-avatar { display: grid; place-items: center; flex: none; width: 36px; height: 36px; border: 1px solid var(--partner-border); border-radius: 12px; color: var(--partner-text); background: linear-gradient(145deg, var(--partner-glass-thick), var(--partner-control)); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); font-size: var(--partner-font-label); font-weight: 650; }\n.dsh-partner-avatar.is-small { width: 25px; height: 25px; border-radius: 8px; font-size: var(--partner-font-caption); }\n\n.dsh-partner-workspace { position: relative; isolation: isolate; display: grid; grid-template-rows: auto minmax(0, 1fr); width: 100%; height: 100%; min-width: 0; overflow: hidden; background: transparent; }\n.dsh-partner-glass-surface { position: relative; isolation: isolate; transition: opacity 180ms ease-out, border-color 180ms ease, box-shadow 220ms var(--partner-ease-out), transform 220ms var(--partner-ease-out); }\n.dsh-partner-glass-surface.is-svg { -webkit-backdrop-filter: var(--partner-glass-filter-id) saturate(var(--partner-glass-saturation)); backdrop-filter: var(--partner-glass-filter-id) saturate(var(--partner-glass-saturation)); }\n.dsh-partner-glass-surface.is-fallback { -webkit-backdrop-filter: var(--partner-glass-filter); backdrop-filter: var(--partner-glass-filter); }\n.dsh-partner-glass-filter { position: absolute; z-index: -1; inset: 0; width: 100%; height: 100%; opacity: 0; pointer-events: none; }\n.dsh-partner-glass-surface.is-interactive::after {\n position: absolute;\n z-index: 2;\n inset: 1px;\n border-radius: inherit;\n background: linear-gradient(112deg, transparent 20%, color-mix(in srgb, var(--partner-glass-highlight) 86%, transparent) 48%, transparent 76%);\n -webkit-mask-image: radial-gradient(circle 180px at var(--partner-glare-x) var(--partner-glare-y), #000 0, rgba(0, 0, 0, .72) 38%, transparent 74%);\n mask-image: radial-gradient(circle 180px at var(--partner-glare-x) var(--partner-glare-y), #000 0, rgba(0, 0, 0, .72) 38%, transparent 74%);\n opacity: 0;\n pointer-events: none;\n transition: opacity 180ms ease-out;\n content: \"\";\n}\n.dsh-partner-glass-surface.is-interactive > :not(.dsh-partner-glass-filter) { position: relative; z-index: 1; }\n@media (hover: hover) {\n .dsh-partner-glass-surface.is-interactive:hover {\n border-color: color-mix(in srgb, var(--partner-border) 70%, var(--partner-text-tertiary));\n box-shadow:\n inset 0 1px 0 var(--partner-card-highlight),\n inset 0 -1px 0 var(--partner-glass-rim-shadow),\n 0 14px 32px color-mix(in srgb, var(--partner-text) 9%, transparent);\n transform: translateY(-1px);\n }\n .dsh-partner-glass-surface.is-interactive:hover::after { opacity: .72; }\n}\n.dsh-partner-topbar { position: relative; z-index: 3; display: flex; align-items: center; justify-content: space-between; min-height: 52px; margin: 8px 10px 0; padding: 7px 14px; border: 1px solid var(--partner-border); border-radius: 14px 14px 11px 11px; background: transparent; -webkit-backdrop-filter: var(--partner-toolbar-filter); backdrop-filter: var(--partner-toolbar-filter); box-shadow: var(--partner-glass-shadow); }\n.dsh-partner-topbar > div { display: flex; align-items: center; gap: 10px; }\n.dsh-partner-topbar > div > span:last-child { display: grid; gap: 2px; }\n.dsh-partner-topbar strong { font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-topbar small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-topbar [data-xiaohei-workspace-close] {\n display: grid;\n place-items: center;\n flex: none;\n width: 30px;\n height: 30px;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 9px;\n color: var(--partner-text-secondary);\n background: transparent;\n line-height: 1;\n cursor: pointer;\n transition: color 140ms ease, background 140ms ease, border-color 140ms ease, transform 140ms ease;\n}\n.dsh-partner-topbar [data-xiaohei-workspace-close]:hover {\n border-color: var(--partner-border);\n color: var(--partner-text);\n background: var(--partner-hover);\n}\n.dsh-partner-topbar [data-xiaohei-workspace-close]:active { transform: scale(.96); }\n.dsh-partner-topbar [data-xiaohei-workspace-close] > svg { display: block; pointer-events: none; }\n.dsh-partner-mobile-workspace-nav { display: none; }\n.dsh-partner-grid { display: grid; grid-template-columns: 214px minmax(520px, 1fr); min-width: 0; min-height: 0; padding: 8px 10px 10px; gap: 8px; }\n\n.dsh-partner-roster { position: relative; display: flex; min-width: 0; min-height: 0; flex-direction: column; padding: 17px 10px 13px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 15px; background: var(--partner-pane); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: var(--partner-glass-shadow); }\n.dsh-partner-roster-title { display: flex; align-items: flex-start; justify-content: space-between; padding: 0 5px 13px; }\n.dsh-partner-roster-title > span { display: grid; gap: 5px; }\n.dsh-partner-roster-title small,\n.dsh-partner-section > small,\n.dsh-partner-identity small,\n.dsh-partner-channel-card small,\n.dsh-partner-pairing-heading small,\n.dsh-partner-qr small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .12em; }\n.dsh-partner-roster-title strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-roster-title button { display: grid; place-items: center; width: 30px; height: 30px; padding: 0; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); cursor: pointer; transition: color 140ms ease, background-color 140ms ease, transform 160ms var(--partner-ease-out), box-shadow 180ms ease; }\n.dsh-partner-roster-title button:hover { color: var(--partner-text); border-color: var(--partner-border); background: var(--partner-glass-thick); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); transform: translateY(-1px); }\n.dsh-partner-roster-list { display: grid; width: 100%; min-width: 0; min-height: 72px; flex: 1 1 auto; align-content: start; gap: 3px; overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; }\n.dsh-partner-roster-list button { display: grid; grid-template-columns: 36px minmax(0, 1fr) 7px; align-items: center; gap: 9px; width: 100%; min-height: 58px; padding: 9px 8px; border: 1px solid transparent; border-radius: 12px; color: inherit; background: transparent; text-align: left; cursor: pointer; transition: transform .17s cubic-bezier(.2,.8,.2,1), background .15s ease, border-color .15s ease; }\n.dsh-partner-roster-list button:hover { background: var(--partner-hover); transform: translateX(1px); }\n.dsh-partner-roster-list button.is-active { transform: translateX(2px); border-color: transparent; background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-text-secondary), inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-roster-list button > span:nth-child(2) { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-roster-list strong,\n.dsh-partner-roster-list small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-roster-list strong { font-size: var(--partner-font-label); font-weight: 580; }\n.dsh-partner-roster-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-workspace-nav { display: grid; gap: 3px; margin-top: 12px; padding: 12px 0 0; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-workspace-nav button { display: grid; grid-template-columns: 30px minmax(0, 1fr); grid-template-rows: auto auto; align-items: center; column-gap: 9px; width: 100%; min-height: 52px; padding: 7px 8px; border: 1px solid transparent; border-radius: 11px; color: var(--partner-text-secondary); background: transparent; text-align: left; cursor: pointer; transition: color 150ms ease, background-color 150ms ease, border-color 150ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-workspace-nav button:hover { color: var(--partner-text); background: var(--partner-hover); transform: translateX(1px); }\n.dsh-partner-workspace-nav button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent), inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-workspace-nav button > span { display: grid; grid-row: 1 / span 2; place-items: center; width: 29px; height: 29px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); }\n.dsh-partner-workspace-nav button.is-active > span { color: var(--partner-accent-strong); background: var(--partner-raised); }\n.dsh-partner-workspace-nav strong { align-self: end; overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-workspace-nav small { align-self: start; overflow: hidden; color: var(--partner-text-tertiary); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-roster-note { display: flex; align-items: flex-start; gap: 9px; margin-top: 0; padding: 12px 8px 2px; color: var(--partner-text-tertiary); }\n.dsh-partner-roster-note > svg { flex: none; margin-top: 1px; color: var(--partner-accent); }\n.dsh-partner-roster-note > span { display: grid; gap: 4px; }\n.dsh-partner-roster-note strong { color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-weight: 580; }\n.dsh-partner-roster-note small { font-size: var(--partner-font-caption); line-height: 1.5; }\n\n.dsh-partner-stage { position: relative; display: grid; grid-template-rows: auto auto minmax(0, 1fr); min-width: 0; min-height: 0; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 15px; background: var(--partner-pane); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: var(--partner-glass-shadow); }\n.dsh-partner-stage.is-workspace-page { grid-template-rows: minmax(0, 1fr); }\n.dsh-partner-identity { display: flex; align-items: center; gap: 12px; min-height: 86px; padding: 18px clamp(20px, 4vw, 46px) 13px; }\n.dsh-partner-identity > span:nth-child(2) { display: grid; min-width: 0; flex: 1; gap: 3px; }\n.dsh-partner-identity h1 { margin: 0; font-size: var(--partner-font-heading); line-height: 1.15; font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-identity p { margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-status { display: inline-flex; align-items: center; flex: none; gap: 6px; padding: 5px 8px; border: 1px solid var(--partner-border); border-radius: 999px; color: var(--partner-text-secondary); background: color-mix(in srgb, var(--partner-raised) 76%, transparent); font-size: var(--partner-font-caption); }\n.dsh-partner-status > i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-status.is-running > i { background: var(--partner-success); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-success) 13%, transparent); }\n.dsh-partner-status.is-starting > i { background: var(--partner-warning); }\n.dsh-partner-status.is-error > i { background: var(--partner-danger); }\n.dsh-partner-tabs { display: flex; align-items: center; gap: 3px; margin: 0 clamp(20px, 4vw, 46px); border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-tabs button { position: relative; display: inline-flex; align-items: center; gap: 6px; min-height: 37px; padding: 0 10px; border: 0; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-body); cursor: pointer; }\n.dsh-partner-tabs button::after { content: \"\"; position: absolute; right: 9px; bottom: -1px; left: 9px; height: 2px; border-radius: 99px; background: var(--partner-text); opacity: 0; transform: scaleX(.45); transition: opacity 150ms ease, transform 210ms var(--partner-ease-out); }\n.dsh-partner-tabs button:hover { color: var(--partner-text); }\n.dsh-partner-tabs button.is-active { color: var(--partner-accent-strong); }\n.dsh-partner-tabs button.is-active::after { opacity: 1; transform: scaleX(1); }\n.dsh-partner-stage-scroll { min-width: 0; min-height: 0; overflow: auto; padding: 26px clamp(22px, 4vw, 52px) 52px; overscroll-behavior: contain; }\n.dsh-partner-stage-scroll.is-workspace-page { padding: 0; }\n.dsh-partner-stage-scroll > * { animation: dsh-partner-content-enter 260ms var(--partner-ease-out) both; }\n\n.dsh-partner-home { width: min(100%, 1160px); margin: 0 auto; }\n.dsh-partner-home-heading { display: flex; align-items: end; justify-content: space-between; gap: 28px; margin: 0 2px 22px; }\n.dsh-partner-home-heading > span { display: grid; gap: 6px; }\n.dsh-partner-home-heading small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .08em; }\n.dsh-partner-home-heading h2 { margin: 0; font-size: var(--partner-font-display); line-height: 1.18; font-weight: 660; letter-spacing: -.035em; }\n.dsh-partner-home-heading p { max-width: 320px; margin: 0 0 2px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; text-align: right; }\n.dsh-partner-home-channel { display: grid; grid-template-columns: minmax(230px, .8fr) minmax(330px, 1.2fr); align-items: center; min-height: 238px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 20px; background: var(--partner-card-surface); box-shadow: var(--partner-card-shadow); }\n.dsh-partner-home-route { position: relative; display: flex; align-items: center; justify-content: center; min-height: 100%; padding: 28px; background: radial-gradient(circle at 42% 50%, color-mix(in srgb, var(--partner-glass-highlight) 44%, transparent), transparent 58%); }\n.dsh-partner-home-route > .dsh-partner-avatar { position: relative; z-index: 1; width: 58px; height: 58px; border-radius: 18px; background: var(--partner-raised); box-shadow: 0 9px 28px color-mix(in srgb, var(--partner-accent-strong) 10%, transparent); font-size: var(--partner-font-title); }\n.dsh-partner-route-line { position: relative; width: clamp(58px, 7vw, 94px); height: 1px; margin: 0 10px; overflow: hidden; background: repeating-linear-gradient(90deg, color-mix(in srgb, var(--partner-accent) 25%, transparent) 0 4px, transparent 4px 9px); }\n.dsh-partner-route-line > i { position: absolute; left: 0; top: -2px; width: 5px; height: 5px; border-radius: 50%; background: var(--partner-accent); opacity: 0; transform: translateX(0); }\n.dsh-partner-home-channel.is-online .dsh-partner-route-line > i { animation: dsh-partner-route-pulse 2.4s ease-in-out infinite; }\n.dsh-partner-route-weixin { position: relative; z-index: 1; display: grid; place-items: center; width: 58px; height: 58px; border: 1px solid color-mix(in srgb, var(--partner-weixin) 18%, var(--partner-border)); border-radius: 18px; color: var(--partner-weixin); background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); }\n.dsh-partner-home-channel-copy { position: relative; z-index: 1; display: grid; justify-items: start; gap: 8px; padding: 32px 36px 32px 12px; }\n.dsh-partner-home-kicker { display: inline-flex; align-items: center; gap: 7px; color: var(--partner-accent-strong); font-size: var(--partner-font-caption); font-weight: 680; letter-spacing: .06em; }\n.dsh-partner-home-kicker > i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-home-channel.is-online .dsh-partner-home-kicker > i { background: var(--partner-success); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-success) 11%, transparent); }\n.dsh-partner-home-channel-copy h3 { margin: 1px 0 0; font-size: var(--partner-font-title); line-height: 1.28; font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-home-channel-copy p { max-width: 510px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-home-channel-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; margin-top: 7px; }\n.dsh-partner-home-channel-actions button { min-height: 36px; padding: 0 16px; border: 1px solid color-mix(in srgb, var(--partner-accent-strong) 78%, var(--partner-glass-highlight)); border-radius: 10px; color: var(--partner-on-accent); background: var(--partner-accent-strong); box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-glass-highlight) 45%, transparent), var(--partner-shadow-sm); font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: transform 160ms var(--partner-ease-out), background-color 160ms ease, box-shadow 180ms ease; }\n.dsh-partner-home-channel-actions button:hover { background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); transform: translateY(-1px); }\n.dsh-partner-home-channel-actions button:active { transform: translateY(0) scale(.98); }\n.dsh-partner-home-channel-actions span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-home-details { display: grid; grid-template-columns: minmax(0, 1.18fr) minmax(260px, .82fr); gap: 12px; margin-top: 18px; }\n.dsh-partner-home-details > section {\n position: relative;\n min-width: 0;\n padding: 19px 18px 21px;\n overflow: hidden;\n border: 1px solid var(--partner-border);\n border-radius: 15px;\n background: var(--partner-card-surface);\n box-shadow: var(--partner-card-shadow);\n}\n.dsh-partner-home-details > section::after {\n position: absolute;\n top: 0;\n right: 16px;\n left: 16px;\n height: 1px;\n background: linear-gradient(90deg, transparent, var(--partner-glass-highlight), transparent);\n opacity: .72;\n pointer-events: none;\n content: \"\";\n}\n.dsh-partner-home-profile { grid-row: span 2; }\n.dsh-partner-home-details header { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto; align-items: center; gap: 10px; }\n.dsh-partner-home-details header > span { display: grid; place-items: center; width: 32px; height: 32px; border-radius: 10px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }\n.dsh-partner-home-details header > div { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-home-details header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-home-details header strong { overflow: hidden; font-size: var(--partner-font-label); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-home-details header button { padding: 5px 7px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-home-details header button:hover { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 6%, transparent); }\n.dsh-partner-home-profile blockquote { display: -webkit-box; margin: 17px 2px 0 44px; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.7; -webkit-box-orient: vertical; -webkit-line-clamp: 5; }\n.dsh-partner-home-capability-list { display: flex; flex-wrap: wrap; gap: 6px; margin: 14px 0 0 44px; }\n.dsh-partner-home-capability-list em { padding: 5px 8px; border-radius: 7px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); font-size: var(--partner-font-caption); font-style: normal; }\n.dsh-partner-home-capability-list small,\n.dsh-partner-home-continuity > p { margin: 13px 0 0 44px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }\n@keyframes dsh-partner-route-pulse { 0% { opacity: 0; transform: translateX(0); } 18% { opacity: .8; } 82% { opacity: .8; } 100% { opacity: 0; transform: translateX(clamp(58px, 7vw, 94px)); } }\n\n.dsh-partner-form { width: min(100%, 1120px); margin: 0 auto; }\n.dsh-partner-form.is-identity { width: min(100%, 980px); }\n.dsh-partner-form.is-capabilities,\n.dsh-partner-form.is-channel,\n.dsh-partner-form.is-memory { width: min(100%, 1180px); }\n.dsh-partner-form.is-memory { container: partner-memory / inline-size; }\n.dsh-partner-section { position: relative; margin-bottom: 27px; padding-left: 14px; }\n.dsh-partner-section::before { position: absolute; top: 3px; bottom: 2px; left: 0; width: 2px; border-radius: 2px; background: linear-gradient(var(--partner-text-secondary), transparent 92%); content: ''; }\n.dsh-partner-section h2 { margin: 5px 0 7px; font-size: var(--partner-font-display); font-weight: 650; letter-spacing: -.035em; }\n.dsh-partner-section p { max-width: 640px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-fields { display: grid; gap: 14px; }\n.dsh-partner-fields.two { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-runtime-fields { display: grid; grid-template-columns: minmax(190px, 1.15fr) minmax(160px, .85fr) minmax(190px, 1.15fr); gap: 14px; }\n.dsh-partner-runtime-fields > .dsh-partner-field { margin-bottom: 18px; }\n.dsh-partner-field { display: grid; min-width: 0; gap: 8px; margin-bottom: 16px; }\n.dsh-partner-field > span { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }\n.dsh-partner-field strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-field small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.35; text-align: right; }\n.dsh-partner-field input,\n.dsh-partner-field textarea,\n.dsh-partner-field select { box-sizing: border-box; width: 100%; min-height: 38px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 10px; outline: none; color: var(--partner-text); background: var(--partner-control); font: var(--partner-font-label)/1.5 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease, background .15s ease; }\n.dsh-partner-field textarea { resize: vertical; }\n.dsh-partner-field input:focus,\n.dsh-partner-field textarea:focus,\n.dsh-partner-field select:focus { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-form-actions { display: flex; align-items: center; justify-content: space-between; min-height: 40px; padding-top: 5px; }\n.dsh-partner-form-actions > span { display: inline-flex; align-items: center; gap: 5px; color: var(--partner-accent-strong); font-size: var(--partner-font-body); }\n.dsh-partner-form-actions.is-capability-save { flex-wrap: wrap; gap: 12px; }\n.dsh-partner-form-actions.is-capability-save > span { min-height: 24px; }\n.dsh-partner-form-actions.is-capability-save > span svg { flex-shrink: 0; }\n.dsh-partner-form-actions > button,\n.dsh-partner-state > button,\n.dsh-partner-weixin-connect > button { min-height: 34px; padding: 0 15px; border: 1px solid color-mix(in srgb, var(--partner-accent) 60%, transparent); border-radius: 10px; color: var(--partner-on-accent); background: var(--partner-accent-strong); font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-form-actions > button:hover,\n.dsh-partner-state > button:hover,\n.dsh-partner-weixin-connect > button:hover { background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); }\n.dsh-partner-form-actions > button:disabled,\n.dsh-partner-weixin-connect > button:disabled { opacity: .55; cursor: default; }\n.dsh-partner-identity-danger { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-top: 34px; padding-top: 17px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-identity-danger > span { display: grid; gap: 4px; }\n.dsh-partner-identity-danger strong { font-size: var(--partner-font-body); font-weight: 600; }\n.dsh-partner-identity-danger small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-identity-danger button { display: inline-flex; align-items: center; gap: 6px; min-height: 30px; padding: 0 10px; border: 1px solid color-mix(in srgb, var(--partner-danger) 24%, transparent); border-radius: 8px; color: var(--partner-danger); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-identity-danger button:disabled { opacity: .4; cursor: default; }\n.dsh-partner-inline-error,\n.dsh-partner-error { padding: 9px 11px; border: 1px solid color-mix(in srgb, var(--partner-danger) 20%, transparent); border-radius: 9px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 6%, transparent); font-size: var(--partner-font-body); }\n.dsh-partner-error { position: absolute; right: 18px; bottom: 14px; left: 18px; margin: 0; }\n\n.dsh-partner-capability-groups { display: grid; gap: 13px; margin: 3px 0 22px; }\n.dsh-partner-capability-group { padding: 14px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-pane) 84%, transparent); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-capability-group > header { display: flex; align-items: flex-start; justify-content: space-between; gap: 18px; padding: 1px 2px 12px; }\n.dsh-partner-capability-group > header > span { display: grid; gap: 3px; min-width: 0; }\n.dsh-partner-capability-group > header small { color: var(--partner-accent-strong); font-size: var(--partner-font-micro); font-weight: 650; letter-spacing: .12em; }\n.dsh-partner-capability-group > header strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-capability-group > header p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.45; }\n.dsh-partner-capability-group > header em { flex: none; padding: 5px 8px; border-radius: 7px; color: var(--partner-text-secondary); background: var(--partner-selected); font-size: var(--partner-font-caption); font-style: normal; font-variant-numeric: tabular-nums; }\n.dsh-partner-capabilities { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 8px; margin: 0; }\n.dsh-partner-capabilities button { position: relative; display: grid; grid-template-columns: 22px minmax(0, 1fr); gap: 3px 9px; min-height: 72px; padding: 12px; border: 1px solid var(--partner-border); border-radius: 11px; appearance: none; color: inherit; background: color-mix(in srgb, var(--partner-raised) 70%, transparent); font-family: var(--partner-font-family); text-align: left; cursor: pointer; transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease; }\n.dsh-partner-capabilities button:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: color-mix(in srgb, var(--partner-raised) 90%, var(--partner-selected)); }\n.dsh-partner-capabilities button:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-capabilities button.is-active { border-color: color-mix(in srgb, var(--partner-accent) 30%, transparent); background: color-mix(in srgb, var(--partner-accent) 7%, var(--partner-raised)); }\n.dsh-partner-capabilities button > span { display: grid; place-items: center; grid-row: 1 / span 2; width: 19px; height: 19px; margin-top: 1px; border: 1px solid var(--partner-border); border-radius: 6px; color: var(--partner-on-accent); }\n.dsh-partner-capabilities button.is-active > span { border-color: var(--partner-accent); background: var(--partner-accent); }\n.dsh-partner-capabilities strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-capabilities small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.5; }\n\n.dsh-partner-weixin-connect { display: grid; grid-template-columns: 54px minmax(0, 1fr) auto; align-items: center; gap: 17px; padding: 19px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }\n.dsh-partner-weixin-connect > span { display: grid; gap: 4px; }\n.dsh-partner-weixin-connect strong { font-size: var(--partner-font-label); }\n.dsh-partner-weixin-connect p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; }\n.dsh-partner-weixin-connect ul { display: flex; flex-wrap: wrap; gap: 6px 15px; margin: 7px 0 0; padding: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); list-style: none; }\n.dsh-partner-weixin-connect li::before { content: \"\u00B7\"; margin-right: 4px; color: var(--partner-accent); }\n.dsh-partner-weixin-mark { display: grid; place-items: center; width: 52px; height: 52px; border: 1px solid color-mix(in srgb, var(--partner-weixin) 18%, var(--partner-border)); border-radius: 16px; color: var(--partner-weixin); background: color-mix(in srgb, var(--partner-weixin) 7%, var(--partner-raised)); }\n.dsh-partner-weixin-glyph { position: relative; display: inline-block; width: 16px; height: 14px; }\n.dsh-partner-weixin-glyph::before,\n.dsh-partner-weixin-glyph::after { content: \"\"; position: absolute; border: 1.5px solid currentColor; border-radius: 48%; }\n.dsh-partner-weixin-glyph::before { left: 0; top: 0; width: 10px; height: 8px; }\n.dsh-partner-weixin-glyph::after { right: 0; bottom: 0; width: 9px; height: 7px; background: inherit; }\n.dsh-partner-weixin-glyph i,\n.dsh-partner-weixin-glyph b { position: absolute; z-index: 1; top: 4px; width: 1.5px; height: 1.5px; border-radius: 50%; background: currentColor; }\n.dsh-partner-weixin-glyph i { left: 3px; }\n.dsh-partner-weixin-glyph b { left: 7px; }\n.dsh-partner-weixin-glyph.is-large { transform: scale(1.55); }\n.dsh-partner-qr { display: grid; grid-template-columns: 206px minmax(0, 1fr); align-items: center; gap: 27px; padding: 22px; border: 1px solid var(--partner-border); border-radius: 16px; background: color-mix(in srgb, var(--partner-raised) 74%, transparent); }\n.dsh-partner-qr-code { display: grid; place-items: center; width: 196px; height: 196px; border-radius: 14px; background: #fff; box-shadow: 0 9px 28px color-mix(in srgb, #000 7%, transparent); }\n.dsh-partner-qr > span { display: grid; justify-items: start; gap: 7px; }\n.dsh-partner-qr strong { font-size: var(--partner-font-title); }\n.dsh-partner-qr p { max-width: 300px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-qr button { display: inline-flex; align-items: center; gap: 6px; min-height: 32px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: inherit; background: var(--partner-raised); cursor: pointer; }\n.dsh-partner-channel-card { display: grid; grid-template-columns: 52px minmax(0, 1fr) auto auto; align-items: center; gap: 14px; padding: 15px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }\n.dsh-partner-channel-card > span:nth-child(2) { display: grid; gap: 3px; }\n.dsh-partner-channel-card strong { font-size: var(--partner-font-label); }\n.dsh-partner-channel-card p { margin: 0; color: var(--partner-text-tertiary); font: var(--partner-font-caption)/1.4 ui-monospace, monospace; }\n.dsh-partner-switch { position: relative; width: 38px; height: 22px; padding: 0; border: 1px solid var(--partner-border); border-radius: 999px; background: color-mix(in srgb, var(--partner-text) 9%, transparent); cursor: pointer; transition: background .16s ease; }\n.dsh-partner-switch i { position: absolute; left: 3px; top: 3px; width: 14px; height: 14px; border-radius: 50%; background: var(--partner-raised); box-shadow: 0 1px 3px color-mix(in srgb, #000 16%, transparent); transition: transform .18s cubic-bezier(.2,.8,.2,1); }\n.dsh-partner-switch[data-on=\"true\"] { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-switch[data-on=\"true\"] i { transform: translateX(16px); }\n.dsh-partner-pairing-heading { display: flex; align-items: end; justify-content: space-between; margin: 25px 1px 10px; }\n.dsh-partner-pairing-heading > span { display: grid; gap: 4px; }\n.dsh-partner-pairing-heading strong { font-size: var(--partner-font-label); }\n.dsh-partner-pairing-heading em { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; }\n.dsh-partner-pairings { display: grid; gap: 5px; }\n.dsh-partner-pairings article { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto auto; align-items: center; gap: 9px; min-height: 52px; padding: 8px 9px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-pairings article > span { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; color: var(--partner-text-tertiary); background: var(--partner-hover); }\n.dsh-partner-pairings article > span.is-approved { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, transparent); }\n.dsh-partner-pairings article > div { display: grid; gap: 3px; }\n.dsh-partner-pairings strong { font-size: var(--partner-font-body); }\n.dsh-partner-pairings small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-pairings button { min-height: 29px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-pairings button.is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n\n.dsh-partner-metrics { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }\n.dsh-partner-metrics article { padding: 14px; border: 1px solid var(--partner-border); border-radius: 12px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); }\n.dsh-partner-metrics small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-metrics strong { display: block; margin: 8px 0 4px; font-size: var(--partner-font-title); font-weight: 640; }\n.dsh-partner-metrics p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-session-list { display: grid; gap: 4px; margin-top: 20px; }\n.dsh-partner-session-list article { display: flex; align-items: center; gap: 10px; min-height: 48px; padding: 7px 5px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-session-list article > span { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; color: var(--partner-accent); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }\n.dsh-partner-session-list article > div { display: grid; min-width: 0; flex: 1; gap: 3px; }\n.dsh-partner-session-list strong { font-size: var(--partner-font-body); }\n.dsh-partner-session-list small { overflow: hidden; color: var(--partner-text-tertiary); font: var(--partner-font-caption)/1.4 ui-monospace, monospace; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-session-list button { flex: none; min-height: 30px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-session-list button:hover { color: var(--partner-accent-strong); border-color: color-mix(in srgb, var(--partner-accent) 24%, var(--partner-border)); }\n.dsh-partner-automation { display: grid; min-width: 0; max-width: 100%; gap: 14px; margin-top: 16px; padding: 16px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }\n.dsh-partner-automation-grid { display: grid; min-width: 0; grid-template-columns: minmax(480px, .95fr) minmax(430px, 1.05fr); align-items: stretch; gap: 12px; margin-top: 17px; }\n.dsh-partner-automation-grid .dsh-partner-automation { align-content: start; margin-top: 0; }\n.dsh-partner-automation-grid .dsh-partner-automation:last-child .dsh-partner-automation-actions { margin-top: auto; }\n.dsh-partner-review-policy { display: grid; grid-template-columns: auto minmax(0, 1fr) 90px auto; align-items: center; gap: 10px; padding-top: 12px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-review-policy > span { display: grid; gap: 2px; }\n.dsh-partner-review-policy > span strong { font-size: var(--partner-font-body); }\n.dsh-partner-review-policy > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.4; }\n.dsh-partner-review-policy select { width: 100%; height: 32px; padding: 0 26px 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; background-color: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-review-policy > button:last-child { height: 32px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-automation > header { display: flex; align-items: center; justify-content: space-between; gap: 16px; }\n.dsh-partner-automation > header > span { display: grid; gap: 4px; }\n.dsh-partner-automation > header strong { font-size: var(--partner-font-body); }\n.dsh-partner-automation > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-automation-fields { display: grid; min-width: 0; grid-template-columns: minmax(120px, 180px); gap: 10px; }\n.dsh-partner-automation-fields.is-memory-model { grid-template-columns: minmax(110px, .7fr) minmax(130px, 1fr) minmax(150px, 1.25fr); }\n.dsh-partner-automation-fields.is-heartbeat { grid-template-columns: repeat(4, minmax(100px, 1fr)); }\n.dsh-partner-concern-board { position: relative; display: grid; min-width: 0; max-width: 100%; overflow: visible; border: 1px solid var(--partner-border); border-radius: 11px; background: color-mix(in srgb, var(--partner-raised) 42%, transparent); }\n.dsh-partner-concern-board > header { display: flex; min-height: 46px; align-items: center; justify-content: space-between; gap: 14px; padding: 7px 10px 7px 12px; }\n.dsh-partner-concern-board > header > span { display: flex; min-width: 0; align-items: baseline; gap: 8px; }\n.dsh-partner-concern-board > header strong { display: flex; align-items: center; gap: 6px; font-size: var(--partner-font-body); font-weight: 640; white-space: nowrap; }\n.dsh-partner-concern-board > header strong b { display: grid; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 999px; place-items: center; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, transparent); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-concern-board > header p { min-width: 0; margin: 0; overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-board > header > button { display: inline-flex; flex: none; height: 30px; align-items: center; gap: 5px; padding: 0 9px; border: 1px solid transparent; border-radius: 8px; color: var(--partner-text-secondary); background: transparent; font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-board > header > button:hover,\n.dsh-partner-concern-board > header > button[aria-expanded=\"true\"] { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); }\n.dsh-partner-concern-compose { display: grid; gap: 20px; padding: 24px; border-top: 1px solid var(--partner-border); background: color-mix(in srgb, var(--partner-control) 60%, transparent); animation: dsh-partner-reveal .16s ease-out; }\n.dsh-partner-concern-form-heading { display: grid; gap: 6px; }\n.dsh-partner-concern-form-heading p { margin: 0; color: var(--partner-text-secondary); }\n.dsh-partner-concern-compose label > small { color: var(--partner-text-secondary); line-height: 1.5; }\n.dsh-partner-concern-compose input { box-sizing: border-box; min-height: 44px; }\n.dsh-partner-concern-compose > div:last-child { gap: 12px; padding-top: 16px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-compose > div:last-child > button { min-height: 44px; padding-inline: 20px; }\n.dsh-partner-concern-archive-details { min-width: 0; }\n.dsh-partner-concern-archive-details > summary { display: flex; align-items: center; gap: 10px; min-height: 44px; list-style: none; cursor: pointer; color: var(--partner-text); }\n.dsh-partner-concern-archive-details > summary::-webkit-details-marker { display: none; }\n.dsh-partner-concern-archive-details > summary > svg { flex: 0 0 auto; transform: rotate(-90deg); transition: transform .16s ease; }\n.dsh-partner-concern-archive-details[open] > summary > svg { transform: rotate(0); }\n.dsh-partner-concern-archive-details > summary:focus-visible { outline: 2px solid var(--partner-text-muted); outline-offset: 3px; border-radius: 6px; }\n.dsh-partner-concern-archive-details strong { overflow-wrap: anywhere; }\n.dsh-partner-concern-archive-details dl { display: grid; gap: 8px; margin: 16px 0; }\n.dsh-partner-concern-archive-details dt { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-archive-details dd { margin: 0 0 8px; color: var(--partner-text); white-space: pre-wrap; overflow-wrap: anywhere; line-height: 1.6; }\n.dsh-partner-concern-archive-details > p { color: var(--partner-text-secondary); line-height: 1.5; }\n@media (max-width: 600px) { .dsh-partner-concern-compose { padding: 16px; } }\n@media (prefers-reduced-motion: reduce) { .dsh-partner-concern-archive-details > summary > svg { transition: none; } }\n.dsh-partner-concern-compose label { display: grid; gap: 6px; }\n.dsh-partner-concern-compose label > span { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); font-weight: 600; }\n.dsh-partner-concern-compose input { width: 100%; height: 36px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease; }\n.dsh-partner-concern-compose textarea { box-sizing: border-box; width: 100%; min-width: 0; resize: vertical; padding: 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1.5 var(--partner-font-family); }\n.dsh-partner-concern-compose textarea:focus-visible { outline: 2px solid var(--partner-text-muted); outline-offset: 2px; }\n.dsh-partner-concern-compose input:focus-visible { border-color: color-mix(in srgb, var(--partner-accent) 55%, var(--partner-border)); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-accent) 9%, transparent); }\n.dsh-partner-concern-input-wrap { position: relative; min-width: 0; }\n.dsh-partner-concern-compose-hint { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 400; line-height: 1.45; }\n.dsh-partner-concern-compose-hint b { color: var(--partner-accent-strong); font-weight: 700; }\n.dsh-partner-concern-sources {\n position: absolute;\n z-index: 40;\n top: calc(100% + 6px);\n right: 0;\n left: 0;\n display: grid;\n max-height: 264px;\n overflow-y: auto;\n padding: 5px;\n border: 1px solid color-mix(in srgb, var(--partner-border) 88%, var(--partner-text) 12%);\n border-radius: 10px;\n background: var(--partner-raised);\n box-shadow: 0 14px 34px color-mix(in srgb, var(--partner-text) 15%, transparent);\n scrollbar-width: thin;\n}\n.dsh-partner-concern-sources > p { margin: 0; padding: 14px 12px; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.45; }\n.dsh-partner-concern-sources > button {\n display: grid;\n min-height: 46px;\n grid-template-columns: 28px minmax(0, 1fr);\n grid-template-rows: auto auto;\n align-items: center;\n column-gap: 8px;\n padding: 6px 8px;\n border: 1px solid transparent;\n border-radius: 8px;\n color: var(--partner-text);\n background: transparent;\n text-align: left;\n cursor: pointer;\n}\n.dsh-partner-concern-sources > button > span { display: grid; grid-row: 1 / 3; width: 28px; height: 28px; place-items: center; border-radius: 8px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, var(--partner-control)); }\n.dsh-partner-concern-sources > button > strong { min-width: 0; overflow: hidden; font-size: var(--partner-font-body); font-weight: 610; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-sources > button > small { min-width: 0; overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 400; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-sources > button:hover,\n.dsh-partner-concern-sources > button[aria-selected=\"true\"] { border-color: color-mix(in srgb, var(--partner-accent) 22%, var(--partner-border)); background: color-mix(in srgb, var(--partner-accent) 8%, var(--partner-raised)); }\n.dsh-partner-concern-compose > div { display: flex; justify-content: flex-end; gap: 6px; }\n.dsh-partner-concern-compose button { min-height: 30px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-raised); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-compose button.is-primary { border-color: transparent; color: var(--partner-on-accent); background: var(--partner-accent-strong); }\n.dsh-partner-concern-list { display: grid; min-height: 0; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-list > article { min-width: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 72%, transparent); background: transparent; transition: background .15s ease; }\n.dsh-partner-concern-list > article:last-child { border-bottom: 0; }\n.dsh-partner-concern-list > article:hover,\n.dsh-partner-concern-list > article[data-expanded=\"true\"] { background: color-mix(in srgb, var(--partner-accent) 4.5%, transparent); }\n.dsh-partner-concern-row { display: grid; width: 100%; min-height: 49px; grid-template-columns: 76px minmax(0, 1fr) auto 14px; align-items: center; gap: 9px; padding: 6px 11px 6px 12px; border: 0; color: inherit; background: transparent; text-align: left; cursor: pointer; }\n.dsh-partner-concern-state { display: flex; align-items: center; gap: 7px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); white-space: nowrap; }\n.dsh-partner-concern-state i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-accent) 9%, transparent); }\n.dsh-partner-concern-copy { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-concern-copy strong,\n.dsh-partner-concern-copy small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-copy strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-concern-copy small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-time { display: grid; justify-items: end; gap: 2px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; line-height: 1.1; white-space: nowrap; }\n.dsh-partner-concern-time small { font: inherit; }\n.dsh-partner-concern-time strong { color: var(--partner-text-secondary); font: 590 var(--partner-font-caption)/1.1 var(--partner-font-family); }\n.dsh-partner-concern-row > svg { color: var(--partner-text-tertiary); transition: transform .16s ease, color .16s ease; }\n.dsh-partner-concern-list > article[data-expanded=\"true\"] .dsh-partner-concern-row > svg { color: var(--partner-accent); transform: rotate(180deg); }\n.dsh-partner-concern-detail { display: grid; gap: 7px; padding: 0 34px 11px 97px; animation: dsh-partner-reveal .16s ease-out; }\n.dsh-partner-concern-detail p,\n.dsh-partner-concern-detail blockquote { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-concern-detail blockquote { padding-left: 9px; border-left: 2px solid color-mix(in srgb, var(--partner-accent) 40%, transparent); }\n.dsh-partner-concern-detail > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-decision { display: grid; min-width: 0; grid-template-columns: auto minmax(0, 1fr); align-items: baseline; gap: 3px 8px; padding: 7px 9px; border: 1px solid var(--partner-border); border-radius: 8px; background: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-decision strong { color: var(--partner-accent-strong); font-weight: 620; white-space: nowrap; }\n.dsh-partner-concern-decision span { min-width: 0; color: var(--partner-text-secondary); line-height: 1.45; }\n.dsh-partner-concern-decision small { grid-column: 1 / -1; color: var(--partner-text-tertiary); line-height: 1.45; overflow-wrap: anywhere; }\n.dsh-partner-concern-resources { display: flex; flex-wrap: wrap; gap: 5px; }\n.dsh-partner-concern-resources span { max-width: 100%; overflow: hidden; padding: 4px 7px; border-radius: 6px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-actions { display: flex; flex-wrap: wrap; gap: 5px; padding-top: 2px; }\n.dsh-partner-concern-actions button,\n.dsh-partner-concern-resolved button { min-height: 28px; padding: 0 8px; border: 1px solid var(--partner-border); border-radius: 7px; color: var(--partner-text-secondary); background: var(--partner-control); font: 540 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-actions button:hover,\n.dsh-partner-concern-resolved button:hover { color: var(--partner-accent-strong); border-color: color-mix(in srgb, var(--partner-accent) 32%, var(--partner-border)); background: color-mix(in srgb, var(--partner-accent) 7%, var(--partner-control)); }\n.dsh-partner-concern-actions button.is-danger:hover { color: var(--partner-danger); border-color: color-mix(in srgb, var(--partner-danger) 35%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-control)); }\n.dsh-partner-concern-more { display: flex; justify-content: center; padding: 5px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-more button { min-height: 26px; padding: 0 9px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font: 540 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-more button:hover { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }\n.dsh-partner-concern-empty { margin: 0; padding: 13px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.5; }\n.dsh-partner-concern-resolved { border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-resolved summary { min-height: 34px; padding: 9px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); cursor: pointer; list-style: none; }\n.dsh-partner-concern-resolved summary::-webkit-details-marker { display: none; }\n.dsh-partner-concern-resolved summary::before { display: inline-block; margin-right: 7px; content: '\\203A'; transition: transform .15s ease; }\n.dsh-partner-concern-resolved[open] summary::before { transform: rotate(90deg); }\n.dsh-partner-concern-resolved summary b { margin-left: 4px; color: var(--partner-accent); font-variant-numeric: tabular-nums; }\n.dsh-partner-concern-resolved > div { display: grid; max-height: 170px; overflow-y: auto; border-top: 1px solid color-mix(in srgb, var(--partner-border) 72%, transparent); }\n.dsh-partner-concern-resolved article { display: grid; min-height: 38px; grid-template-columns: 22px minmax(0, 1fr) auto; align-items: center; gap: 7px; padding: 4px 10px; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 60%, transparent); }\n.dsh-partner-concern-resolved article > span { display: grid; width: 20px; height: 20px; border-radius: 7px; place-items: center; color: var(--partner-accent); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); }\n.dsh-partner-concern-resolved article strong { overflow: hidden; font-size: var(--partner-font-caption); font-weight: 560; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-archive { min-width: 0; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-archive-toggle { display: flex; align-items: center; justify-content: space-between; gap: 16px; width: 100%; min-height: 68px; padding: 14px 16px; border: 0; border-radius: 10px; text-align: left; color: var(--partner-text-secondary); background: transparent; font: inherit; cursor: pointer; transition: background .16s ease; }\n.dsh-partner-concern-archive-toggle > span { display: grid; gap: 5px; min-width: 0; }\n.dsh-partner-concern-archive-toggle strong { font-size: var(--partner-font-body); font-weight: 580; }\n.dsh-partner-concern-archive-toggle small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-archive-toggle > svg { flex: none; transition: transform .16s ease; }\n.dsh-partner-concern-archive-toggle[aria-expanded=\"true\"] > svg { transform: rotate(180deg); }\n.dsh-partner-concern-archive-toggle:hover { background: var(--partner-control); }\n.dsh-partner-concern-archive-content { min-width: 0; padding: 0 16px 12px; }\n.dsh-partner-concern-archive-content > p { padding: 12px 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); }\n.dsh-partner-concern-archive-list { display: grid; min-width: 0; }\n.dsh-partner-concern-archive-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 16px; min-height: 64px; padding: 12px 0; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-archive-row > strong { min-width: 0; color: var(--partner-text-secondary); font: 500 var(--partner-font-body)/1.6 var(--partner-font-family); overflow-wrap: anywhere; }\n.dsh-partner-concern-archive-action { min-width: 0; align-self: start; }\n.dsh-partner-concern-archive-action > button,\n.dsh-partner-concern-archive-pages button { display: inline-flex; align-items: center; justify-content: center; flex: none; min-height: 40px; min-width: 88px; padding: 8px 14px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-control); font: 500 var(--partner-font-caption)/1.4 var(--partner-font-family); white-space: nowrap; cursor: pointer; transition: background .16s ease, border-color .16s ease; }\n.dsh-partner-concern-archive-action > button:hover { color: var(--partner-danger); border-color: var(--partner-danger); }\n.dsh-partner-concern-archive-pages { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 12px; padding-top: 14px; border-top: 1px solid var(--partner-border); color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-archive-pages > div { display: flex; flex-wrap: wrap; gap: 10px; }\n.dsh-partner-concern-archive-pages button:hover:not(:disabled) { background: var(--partner-raised); }\n.dsh-partner-concern-archive-pages button:disabled { opacity: .45; cursor: not-allowed; }\n.dsh-partner-concern-archive button:focus-visible { outline: 2px solid var(--partner-text-secondary); outline-offset: 3px; }\n@media (max-width: 480px) {\n .dsh-partner-concern-archive-toggle { padding: 12px; }\n .dsh-partner-concern-archive-content { padding: 0 12px 12px; }\n .dsh-partner-concern-archive-row { gap: 12px; }\n .dsh-partner-concern-archive-action > button, .dsh-partner-concern-archive-pages button { min-height: 44px; padding-inline: 12px; }\n}\n@media (prefers-reduced-motion: reduce) {\n .dsh-partner-concern-archive-toggle, .dsh-partner-concern-archive-toggle > svg, .dsh-partner-concern-archive-action > button, .dsh-partner-concern-archive-pages button { transition: none; }\n}\n@keyframes dsh-partner-reveal { from { opacity: 0; transform: translateY(-3px); } to { opacity: 1; transform: translateY(0); } }\n.dsh-partner-automation-actions { display: flex; justify-content: flex-end; gap: 8px; padding-top: 12px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-automation-actions button, .dsh-partner-section-heading button { min-height: 32px; padding: 0 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-automation-actions button.is-primary { color: var(--partner-raised); border-color: transparent; background: var(--partner-accent-strong); }\n.dsh-partner-automation-actions button:disabled, .dsh-partner-section-heading button:disabled { opacity: .45; cursor: default; }\n.dsh-partner-inline-notice { display: flex; align-items: center; gap: 6px; margin: 12px 0 0; color: var(--partner-accent-strong); font-size: var(--partner-font-caption); }\n.dsh-partner-section-heading { display: flex; align-items: end; justify-content: space-between; gap: 12px; margin-top: 24px; padding-bottom: 8px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-section-heading span { display: grid; gap: 3px; }\n.dsh-partner-section-heading small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); letter-spacing: .12em; }\n.dsh-partner-section-heading strong { font-size: var(--partner-font-body); }\n.dsh-partner-memory-library { margin-top: 28px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 17px; background: color-mix(in srgb, var(--partner-raised) 58%, transparent); box-shadow: 0 22px 64px color-mix(in srgb, var(--partner-accent-strong) 5%, transparent), inset 0 1px color-mix(in srgb, white 6%, transparent); }\n.dsh-partner-library-header { display: flex; align-items: end; justify-content: space-between; gap: 24px; padding: 19px 20px 0; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-library-header > span { display: grid; gap: 4px; padding-bottom: 15px; }\n.dsh-partner-library-header > span small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .12em; }\n.dsh-partner-library-header > span strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.02em; }\n.dsh-partner-library-header > span p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-library-header nav { display: flex; align-self: stretch; gap: 4px; }\n.dsh-partner-library-header nav button { position: relative; padding: 0 8px; border: 0; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-library-header nav button::after { position: absolute; right: 7px; bottom: -1px; left: 7px; height: 2px; border-radius: 2px; background: var(--partner-accent); opacity: 0; content: ''; }\n.dsh-partner-library-header nav button.is-active { color: var(--partner-text); }\n.dsh-partner-library-header nav button.is-active::after { opacity: 1; }\n.dsh-partner-library-header nav b { margin-left: 4px; color: var(--partner-accent); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-library-tools { display: flex; align-items: center; gap: 12px; min-height: 53px; padding: 9px 12px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-library-tools > label { flex: 0 1 230px; }\n.dsh-partner-library-tools input { width: 100%; height: 34px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); background: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-library-tools input::placeholder { color: var(--partner-text-tertiary); }\n.dsh-partner-memory-kinds { display: flex; min-width: 0; gap: 3px; overflow-x: auto; }\n.dsh-partner-memory-kinds button { flex: none; height: 28px; padding: 0 8px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-memory-kinds button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-memory-kinds button.is-active { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 10%, transparent); }\n.dsh-partner-library-browser { display: grid; grid-template-columns: minmax(270px, 31%) minmax(0, 1fr); height: clamp(430px, 58vh, 640px); min-height: 0; overflow: hidden; }\n.dsh-partner-library-list { min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }\n.dsh-partner-library-list > button { display: grid; width: 100%; gap: 5px; padding: 12px 14px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; }\n.dsh-partner-library-list > button:hover { background: color-mix(in srgb, var(--partner-accent) 4%, transparent); }\n.dsh-partner-library-list > button.is-active { background: color-mix(in srgb, var(--partner-accent) 8%, transparent); box-shadow: inset 2px 0 var(--partner-accent); }\n.dsh-partner-library-list > button > span { width: max-content; color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }\n.dsh-partner-library-list > button > strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 610; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-library-list > button > p { display: -webkit-box; margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-library-list > button > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-library-list.is-diary time { color: var(--partner-accent); font: 600 var(--partner-font-caption)/1.2 var(--partner-font-family); font-variant-numeric: tabular-nums; }\n.dsh-partner-library-detail { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; padding: 24px clamp(20px, 3vw, 34px) 40px; background: radial-gradient(circle at 92% 4%, color-mix(in srgb, var(--partner-accent) 6%, transparent), transparent 34%); scrollbar-gutter: stable; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) { display: grid; align-content: start; gap: 13px; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header,\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header span { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .08em; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header > div { display: flex; gap: 10px; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header button { min-width: 28px; min-height: 28px; padding: 0 6px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header button:hover { color: var(--partner-accent); }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > p { max-width: 64ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.75; text-wrap: pretty; }\n.dsh-partner-library-detail progress { width: min(100px, 45%); height: 3px; overflow: hidden; border: 0; border-radius: 2px; appearance: none; background: var(--partner-border); }\n.dsh-partner-library-detail progress::-webkit-progress-bar { background: transparent; }\n.dsh-partner-library-detail progress::-webkit-progress-value { background: var(--partner-accent); }\n.dsh-partner-library-detail progress::-moz-progress-bar { background: var(--partner-accent); }\n.dsh-partner-library-detail footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-browser { display: grid; grid-template-columns: minmax(220px, 25%) minmax(0, 1fr); height: clamp(450px, 61vh, 660px); min-height: 0; overflow: hidden; }\n.dsh-partner-profile-people { min-height: 0; overflow-x: hidden; overflow-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }\n.dsh-partner-profile-people > button { display: grid; grid-template-columns: 32px minmax(0, 1fr) 7px; align-items: center; gap: 10px; width: 100%; min-height: 58px; padding: 9px 13px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; transition: background-color 150ms ease, box-shadow 180ms var(--partner-ease-out); }\n.dsh-partner-profile-people > button:hover { background: var(--partner-hover); }\n.dsh-partner-profile-people > button.is-active { background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent-strong); }\n.dsh-partner-profile-people > button > span { display: grid; place-items: center; width: 32px; height: 32px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-profile-people > button > div { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-profile-people strong, .dsh-partner-profile-people small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-profile-people strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-profile-people small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-people > button > i { width: 6px; height: 6px; border: 1px solid var(--partner-text-tertiary); border-radius: 50%; }\n.dsh-partner-profile-people > button.is-active > i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-profile-stage { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; padding: 25px clamp(20px, 3vw, 36px) 42px; scrollbar-gutter: stable; }\n.dsh-partner-profile-heading { display: flex; align-items: start; justify-content: space-between; gap: 24px; padding-bottom: 21px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-profile-heading > span { display: grid; max-width: 66ch; gap: 5px; }\n.dsh-partner-profile-heading > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .1em; }\n.dsh-partner-profile-heading > span strong { font-size: var(--partner-font-title); font-weight: 660; letter-spacing: -.025em; }\n.dsh-partner-profile-heading > span p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-profile-heading > div { display: flex; flex: none; align-items: center; gap: 6px; min-height: 28px; padding: 0 9px; border: 1px solid var(--partner-border); border-radius: 999px; color: var(--partner-text-tertiary); background: var(--partner-glass-clear); font-size: var(--partner-font-caption); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-profile-heading > div > i { width: 6px; height: 6px; border: 1px solid currentColor; border-radius: 50%; }\n.dsh-partner-profile-heading > div[data-ready=\"true\"] { color: var(--partner-text-secondary); }\n.dsh-partner-profile-heading > div[data-ready=\"true\"] > i { background: currentColor; }\n.dsh-partner-profile-meta { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 17px 0 8px; padding: 13px 0; border-block: 1px solid var(--partner-separator); }\n.dsh-partner-profile-meta > span { display: grid; min-width: 0; gap: 3px; padding: 0 14px; border-left: 1px solid var(--partner-separator); }\n.dsh-partner-profile-meta > span:first-child { padding-left: 0; border-left: 0; }\n.dsh-partner-profile-meta small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-meta strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-profile-entries { display: grid; }\n.dsh-partner-profile-entries > article, .dsh-partner-profile-pending > div > article { display: grid; gap: 11px; padding: 18px 0; border-bottom: 1px solid var(--partner-separator); }\n.dsh-partner-profile-entries > article > header, .dsh-partner-profile-entries > article > footer,\n.dsh-partner-profile-pending > div > article > header, .dsh-partner-profile-pending > div > article > footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n.dsh-partner-profile-entries article > header > span, .dsh-partner-profile-pending article > header > span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .07em; }\n.dsh-partner-profile-entries article > header > div, .dsh-partner-profile-pending article > header > div { display: flex; gap: 11px; }\n.dsh-partner-profile-entries article > header button, .dsh-partner-profile-pending article > header button { min-width: 28px; min-height: 28px; padding: 0 6px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-profile-entries article > header button:hover, .dsh-partner-profile-pending article > header button:hover { color: var(--partner-text); }\n.dsh-partner-profile-entries article > strong, .dsh-partner-profile-pending article > strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-profile-entries article > p, .dsh-partner-profile-pending article > p { max-width: 68ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; text-wrap: pretty; }\n.dsh-partner-profile-entries progress, .dsh-partner-profile-pending progress { width: min(100px, 45%); height: 3px; overflow: hidden; border: 0; border-radius: 2px; appearance: none; background: var(--partner-border); }\n.dsh-partner-profile-entries progress::-webkit-progress-bar, .dsh-partner-profile-pending progress::-webkit-progress-bar { background: transparent; }\n.dsh-partner-profile-entries progress::-webkit-progress-value, .dsh-partner-profile-pending progress::-webkit-progress-value { background: var(--partner-accent); }\n.dsh-partner-profile-entries progress::-moz-progress-bar, .dsh-partner-profile-pending progress::-moz-progress-bar { background: var(--partner-accent); }\n.dsh-partner-profile-entries footer small, .dsh-partner-profile-pending footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-pending { margin-top: 18px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-profile-pending > summary { display: flex; min-height: 40px; align-items: center; gap: 6px; padding: 8px 0 2px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-weight: 610; list-style: none; cursor: pointer; }\n.dsh-partner-profile-pending > summary::-webkit-details-marker, .dsh-partner-memory-evidence > summary::-webkit-details-marker { display: none; }\n.dsh-partner-profile-pending > summary::before, .dsh-partner-memory-evidence > summary::before { display: inline-block; color: var(--partner-text-tertiary); font-size: 10px; content: '\u203A'; transform: rotate(0); transition: transform 160ms var(--partner-ease-out); }\n.dsh-partner-profile-pending[open] > summary::before, .dsh-partner-memory-evidence[open] > summary::before { transform: rotate(90deg); }\n.dsh-partner-profile-pending > summary b { margin-left: 4px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-memory-evidence { margin-top: 2px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-memory-evidence > summary { display: flex; min-height: 34px; align-items: center; gap: 5px; padding-top: 6px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); list-style: none; cursor: pointer; }\n.dsh-partner-memory-evidence > summary b { margin-left: 3px; font-weight: 620; }\n.dsh-partner-memory-evidence > div { display: grid; gap: 7px; padding-top: 9px; }\n.dsh-partner-memory-evidence blockquote { margin: 0; padding: 9px 11px; border-left: 2px solid var(--partner-border); color: var(--partner-text-secondary); background: color-mix(in srgb, var(--partner-control) 50%, transparent); }\n.dsh-partner-memory-evidence blockquote p { margin: 0; font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-memory-evidence blockquote time { display: block; margin-top: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-memory-editor { display: grid; gap: 9px; }\n.dsh-partner-memory-editor input, .dsh-partner-memory-editor textarea { box-sizing: border-box; width: 100%; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); outline: none; background: var(--partner-control); font: 500 var(--partner-font-caption)/1.5 var(--partner-font-family); }\n.dsh-partner-memory-editor input { min-height: 32px; padding: 0 10px; }\n.dsh-partner-memory-editor textarea { min-height: 76px; padding: 8px 10px; resize: vertical; }\n.dsh-partner-memory-editor input:focus, .dsh-partner-memory-editor textarea:focus { border-color: color-mix(in srgb, var(--partner-accent) 48%, var(--partner-border)); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-accent) 8%, transparent); }\n.dsh-partner-memory-editor footer { display: flex; justify-content: flex-end; gap: 7px; }\n.dsh-partner-memory-editor button { min-height: 28px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-memory-editor button.is-primary { border-color: transparent; color: var(--partner-on-accent); background: var(--partner-accent-strong); }\n.dsh-partner-diary-detail { display: grid; align-content: start; gap: 20px; }\n.dsh-partner-diary-detail > header { display: grid; gap: 5px; padding-bottom: 16px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-diary-detail > header time { color: var(--partner-accent); font: 600 var(--partner-font-caption)/1 var(--partner-font-family); font-variant-numeric: tabular-nums; }\n.dsh-partner-diary-detail > header strong { font-size: var(--partner-font-title); letter-spacing: -.02em; }\n.dsh-partner-diary-detail > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-diary-detail > p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.75; text-wrap: pretty; }\n.dsh-partner-diary-detail > section { display: grid; gap: 8px; }\n.dsh-partner-diary-detail > section > strong { color: var(--partner-accent-strong); font-size: var(--partner-font-caption); }\n.dsh-partner-diary-detail ul { display: grid; gap: 6px; margin: 0; padding: 0; list-style: none; }\n.dsh-partner-diary-detail li { position: relative; padding-left: 12px; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-diary-detail li::before { position: absolute; top: .62em; left: 1px; width: 3px; height: 3px; border-radius: 50%; background: var(--partner-accent); content: ''; }\n.dsh-partner-graph-audit { min-height: 0; }\n.dsh-partner-graph-toolbar { display: flex; min-height: 78px; align-items: center; justify-content: space-between; gap: 20px; padding: 13px 18px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-graph-toolbar > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-graph-toolbar > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .1em; }\n.dsh-partner-graph-toolbar > span strong { overflow: hidden; font-size: var(--partner-font-label); font-weight: 650; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-graph-toolbar > span p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-toolbar > label { display: grid; flex: 0 1 220px; gap: 4px; }\n.dsh-partner-graph-toolbar > label > span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-toolbar select { width: 100%; height: 34px; padding: 0 30px 0 10px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); background-color: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-filters { display: flex; min-width: 0; gap: 4px; min-height: 45px; align-items: center; padding: 7px 12px; overflow-x: auto; border-bottom: 1px solid var(--partner-border); scrollbar-width: none; }\n.dsh-partner-graph-filters::-webkit-scrollbar { display: none; }\n.dsh-partner-graph-filters button { flex: none; min-height: 30px; padding: 0 9px; border: 1px solid transparent; border-radius: 8px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; transition: color 140ms ease, background-color 140ms ease, border-color 140ms ease; }\n.dsh-partner-graph-filters button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-graph-filters button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-graph-filters b { margin-left: 3px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-graph-browser { display: grid; grid-template-columns: minmax(270px, 33%) minmax(0, 1fr); height: clamp(430px, 56vh, 620px); min-height: 0; overflow: hidden; }\n.dsh-partner-graph-index { min-height: 0; overflow-x: hidden; overflow-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }\n.dsh-partner-graph-index > button { display: grid; width: 100%; gap: 5px; padding: 12px 14px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; transition: background-color 150ms ease, box-shadow 180ms var(--partner-ease-out); }\n.dsh-partner-graph-index > button:hover { background: var(--partner-hover); }\n.dsh-partner-graph-index > button.is-active { background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent-strong); }\n.dsh-partner-graph-index > button > span { width: max-content; padding: 3px 6px; border: 1px solid var(--partner-border); border-radius: 6px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); font-size: var(--partner-font-caption); font-weight: 630; }\n.dsh-partner-graph-index > button[data-kind=\"conflicts_with\"] > span { color: var(--partner-danger); border-color: color-mix(in srgb, var(--partner-danger) 26%, var(--partner-border)); }\n.dsh-partner-graph-index strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-graph-index strong i { color: var(--partner-text-tertiary); font-style: normal; }\n.dsh-partner-graph-index p { display: -webkit-box; margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-graph-index small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-stage { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; padding: 24px clamp(20px, 3vw, 36px) 40px; scrollbar-gutter: stable; }\n.dsh-partner-graph-stage > article { display: grid; gap: 20px; animation: dsh-partner-content-enter 220ms var(--partner-ease-out) both; }\n.dsh-partner-graph-stage > article > header { display: grid; gap: 6px; padding-bottom: 18px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-graph-stage > article > header > span { width: max-content; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }\n.dsh-partner-graph-stage > article[data-kind=\"conflicts_with\"] > header > span { color: var(--partner-danger); }\n.dsh-partner-graph-stage > article > header > strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-graph-stage > article > header > strong i { color: var(--partner-text-tertiary); font-style: normal; font-weight: 450; }\n.dsh-partner-graph-stage > article > header > p { max-width: 68ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-graph-stage > article > header > small { max-width: 72ch; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-graph-pair { display: grid; grid-template-columns: minmax(0, 1fr) 64px minmax(0, 1fr); align-items: stretch; }\n.dsh-partner-graph-pair > section { display: grid; align-content: start; gap: 9px; min-height: 170px; padding: 15px; border: 1px solid var(--partner-border); border-radius: 13px; }\n.dsh-partner-graph-pair > section > header { display: grid; gap: 3px; }\n.dsh-partner-graph-pair > section small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-pair > section strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-graph-pair > section p { margin: 0 0 8px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; overflow-wrap: anywhere; }\n.dsh-partner-graph-pair > section button { width: max-content; min-height: 30px; margin-top: auto; padding: 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-graph-pair > section button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-graph-pair > div { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-pair > div i { height: 1px; background: var(--partner-border); }\n.dsh-partner-graph-pair > div span { padding: 0 5px; white-space: nowrap; }\n.dsh-partner-graph-stage > article > footer { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; padding-top: 2px; }\n.dsh-partner-graph-stage > article > footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-stage > article > footer > strong { color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-variant-numeric: tabular-nums; }\n.dsh-partner-state { display: grid; place-items: center; align-content: center; min-height: 280px; padding: 30px; color: var(--partner-text-tertiary); text-align: center; }\n.dsh-partner-state > svg { margin-bottom: 10px; color: var(--partner-accent); }\n.dsh-partner-state strong { color: var(--partner-text-secondary); font-size: var(--partner-font-label); }\n.dsh-partner-state p { max-width: 330px; margin: 7px 0 14px; font-size: var(--partner-font-body); line-height: 1.55; }\n.dsh-partner-state.is-compact { min-height: 130px; }\n\n/* One material contract for every card surface in the partner workspace.\n Individual components own layout and state; this layer owns glass, edge\n refraction and elevation so visual treatment cannot drift between tabs. */\n:is(\n .dsh-partner-feature-block,\n .dsh-partner-capability-detail,\n .dsh-partner-feature-form,\n .dsh-partner-task-form,\n .dsh-partner-schedule-form,\n .dsh-partner-market-toolbar,\n .dsh-partner-skill-installed > article,\n .dsh-partner-skill-picker,\n .dsh-partner-skill-picker-list > article,\n .dsh-partner-access-list > button,\n .dsh-partner-market-grid > article,\n .dsh-partner-board > section,\n .dsh-partner-task-card,\n .dsh-partner-schedule-list > article,\n .dsh-partner-capability-group,\n .dsh-partner-home-details > section,\n .dsh-partner-capabilities button,\n .dsh-partner-weixin-connect,\n .dsh-partner-qr,\n .dsh-partner-channel-card,\n .dsh-partner-metrics article,\n .dsh-partner-automation,\n .dsh-partner-concern-board,\n .dsh-partner-memory-library,\n .dsh-partner-graph-pair > section\n) {\n border-color: var(--partner-border);\n background: var(--partner-card-surface);\n box-shadow: var(--partner-card-shadow);\n}\n\n/* Editable controls share one compact translucent material. Keeping this\n separate from cards preserves hierarchy while preventing theme defaults or\n platform form colors from leaking into the workspace. */\n:is(\n .dsh-partner-field input,\n .dsh-partner-field textarea,\n .dsh-partner-field select,\n .dsh-partner-review-policy select,\n .dsh-partner-concern-compose input,\n .dsh-partner-library-tools input,\n .dsh-partner-memory-editor input,\n .dsh-partner-memory-editor textarea,\n .dsh-partner-graph-toolbar select\n) {\n background-color: var(--partner-control);\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 54%, transparent),\n inset 0 -1px 0 var(--partner-glass-rim-shadow);\n}\n\n:is(\n .dsh-partner-field input,\n .dsh-partner-field textarea,\n .dsh-partner-field select,\n .dsh-partner-review-policy select,\n .dsh-partner-concern-compose input,\n .dsh-partner-library-tools input,\n .dsh-partner-memory-editor input,\n .dsh-partner-memory-editor textarea,\n .dsh-partner-graph-toolbar select\n):focus {\n border-color: var(--partner-focus-ring);\n background-color: var(--partner-raised);\n box-shadow:\n 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent),\n inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 66%, transparent);\n}\n\n.dsh-partner-concern-decision {\n background: color-mix(in srgb, var(--partner-card-surface) 76%, transparent);\n box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 68%, transparent);\n}\n\n.dsh-partner-capabilities button.is-active {\n border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border));\n background: var(--partner-control-hover);\n box-shadow: var(--partner-card-shadow), inset 2px 0 var(--partner-text-secondary);\n}\n\n/* Shared motion and material contract. Business components keep their own\n layout while interactive surfaces receive one consistent physical response. */\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button.is-primary,\n .dsh-partner-automation-actions button.is-primary,\n .dsh-partner-concern-compose button.is-primary,\n .dsh-partner-memory-editor button.is-primary\n) {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n}\n\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button.is-primary,\n .dsh-partner-automation-actions button.is-primary,\n .dsh-partner-concern-compose button.is-primary,\n .dsh-partner-memory-editor button.is-primary\n)::after {\n position: absolute;\n z-index: -1;\n top: -75%;\n bottom: -75%;\n left: -70%;\n width: 48%;\n border-radius: 45%;\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .24), transparent);\n opacity: 0;\n transform: skewX(-18deg) translate3d(0, 0, 0);\n pointer-events: none;\n transition: opacity 140ms ease, transform 680ms var(--partner-ease-out);\n content: \"\";\n}\n\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button.is-primary,\n .dsh-partner-automation-actions button.is-primary,\n .dsh-partner-concern-compose button.is-primary,\n .dsh-partner-memory-editor button.is-primary\n):hover:not(:disabled)::after {\n opacity: 1;\n transform: skewX(-18deg) translate3d(360%, 0, 0);\n}\n\n:is(\n .dsh-partner-roster-title button,\n .dsh-partner-home-details header button,\n .dsh-partner-qr button,\n .dsh-partner-pairings button,\n .dsh-partner-session-list button,\n .dsh-partner-review-policy > button:last-child,\n .dsh-partner-automation-actions button,\n .dsh-partner-section-heading button,\n .dsh-partner-concern-actions button,\n .dsh-partner-concern-resolved button,\n .dsh-partner-memory-editor button,\n .dsh-partner-graph-pair > section button\n) {\n transition:\n color 140ms ease,\n border-color 140ms ease,\n background-color 140ms ease,\n box-shadow 180ms ease,\n transform 160ms var(--partner-ease-out);\n}\n\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button,\n .dsh-partner-session-list button,\n .dsh-partner-review-policy > button:last-child,\n .dsh-partner-automation-actions button,\n .dsh-partner-section-heading button,\n .dsh-partner-concern-actions button,\n .dsh-partner-concern-resolved button,\n .dsh-partner-memory-editor button,\n .dsh-partner-graph-pair > section button\n):active:not(:disabled) {\n transform: scale(.97);\n}\n\n:is(.dsh-partner-library-list > button, .dsh-partner-graph-index > button):hover {\n border-color: var(--partner-border);\n background: var(--partner-hover);\n}\n\n.dsh-partner-home-details > section,\n.dsh-partner-metrics > article,\n.dsh-partner-automation-grid > section {\n animation: dsh-partner-item-enter 300ms var(--partner-ease-out) both;\n}\n.dsh-partner-home-details > section:nth-child(2),\n.dsh-partner-metrics > article:nth-child(2),\n.dsh-partner-automation-grid > section:nth-child(2) { animation-delay: 36ms; }\n.dsh-partner-home-details > section:nth-child(3),\n.dsh-partner-metrics > article:nth-child(3) { animation-delay: 72ms; }\n\n@keyframes dsh-partner-content-enter {\n from { opacity: 0; transform: translate3d(0, 6px, 0); }\n to { opacity: 1; transform: translate3d(0, 0, 0); }\n}\n@keyframes dsh-partner-item-enter {\n from { opacity: 0; transform: translate3d(0, 8px, 0) scale(.99); }\n to { opacity: 1; transform: translate3d(0, 0, 0) scale(1); }\n}\n\n@media (prefers-reduced-transparency: reduce) {\n /* Preserve the same surface hierarchy as Knowledge. Only remove the blur;\n replacing every token with an opaque fallback produces a white sheet. */\n .dsh-partner-topbar,\n .dsh-partner-roster,\n .dsh-partner-stage,\n .dsh-partner-home-channel,\n .dsh-partner-home-details > section,\n .dsh-partner-capabilities button,\n .dsh-partner-weixin-connect,\n .dsh-partner-qr,\n .dsh-partner-channel-card,\n .dsh-partner-metrics article,\n .dsh-partner-automation,\n .dsh-partner-concern-board,\n .dsh-partner-memory-library,\n .dsh-partner-graph-pair > section { -webkit-backdrop-filter: none; backdrop-filter: none; }\n .dsh-partner-glass-surface { -webkit-backdrop-filter: none; backdrop-filter: none; }\n}\n\n@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {\n :is(.dsh-partner-sidebar, .dsh-partner-workspace) {\n --partner-surface: var(--partner-solid-panel);\n --partner-pane: var(--partner-solid-panel);\n --partner-raised: var(--partner-solid-raised);\n --partner-control: var(--partner-solid-control);\n --partner-card-surface: var(--partner-solid-raised);\n }\n}\n\n@container partner-memory (max-width: 980px) {\n .dsh-partner-automation-grid { grid-template-columns: minmax(0, 1fr); }\n}\n\n@container partner-memory (max-width: 640px) {\n .dsh-partner-automation-fields.is-heartbeat { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-automation-fields.is-memory-model { grid-template-columns: minmax(0, 1fr); }\n .dsh-partner-review-policy { grid-template-columns: auto minmax(0, 1fr); }\n .dsh-partner-review-policy > label,\n .dsh-partner-review-policy > button:last-child { grid-column: span 1; }\n .dsh-partner-concern-board > header p { display: none; }\n .dsh-partner-concern-row { grid-template-columns: minmax(0, 1fr) auto 14px; gap: 7px; }\n .dsh-partner-concern-state { grid-column: 1; }\n .dsh-partner-concern-copy { grid-row: 2; grid-column: 1 / -1; padding-left: 13px; }\n .dsh-partner-concern-time { grid-row: 1; grid-column: 2; }\n .dsh-partner-concern-row > svg { grid-row: 1; grid-column: 3; }\n .dsh-partner-concern-detail { padding: 0 12px 11px 25px; }\n .dsh-partner-concern-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n}\n\n@media (max-width: 1080px) {\n .dsh-partner-grid { grid-template-columns: 190px minmax(400px, 1fr); }\n .dsh-partner-home-channel { grid-template-columns: minmax(190px, .7fr) minmax(300px, 1.3fr); }\n .dsh-partner-home-channel-copy { padding-right: 26px; }\n}\n@media (max-width: 760px) {\n .dsh-partner-access-list { grid-template-columns: 1fr; }\n .dsh-partner-runtime-fields { grid-template-columns: 1fr; }\n .dsh-partner-topbar { align-items: stretch; flex-direction: column; gap: 7px; padding: 7px 9px; }\n .dsh-partner-mobile-workspace-nav { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 4px; }\n .dsh-partner-mobile-workspace-nav button { display: inline-flex; min-height: 34px; align-items: center; justify-content: center; gap: 5px; padding: 0 8px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; font: 580 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n .dsh-partner-mobile-workspace-nav button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); }\n .dsh-partner-grid { grid-template-columns: 1fr; }\n .dsh-partner-roster { display: none; }\n .dsh-partner-identity { padding-inline: 16px; }\n .dsh-partner-tabs { margin-inline: 12px; overflow-x: auto; }\n .dsh-partner-tabs button { flex: none; }\n .dsh-partner-stage-scroll { padding: 19px 16px 38px; }\n .dsh-partner-stage-scroll.is-workspace-page { padding: 0; }\n .dsh-partner-fields.two,\n .dsh-partner-capabilities,\n .dsh-partner-metrics { grid-template-columns: 1fr; }\n .dsh-partner-capability-group { padding: 11px; }\n .dsh-partner-capability-group > header { display: grid; gap: 8px; }\n .dsh-partner-capability-group > header em { justify-self: start; }\n .dsh-partner-home-heading { display: grid; gap: 8px; }\n .dsh-partner-home-heading p { text-align: left; }\n .dsh-partner-home-channel { grid-template-columns: 1fr; }\n .dsh-partner-home-route { min-height: 128px; padding-bottom: 10px; }\n .dsh-partner-home-channel-copy { padding: 12px 22px 24px; }\n .dsh-partner-home-details { grid-template-columns: 1fr; }\n .dsh-partner-home-profile { grid-row: auto; }\n .dsh-partner-weixin-connect { grid-template-columns: 52px 1fr; }\n .dsh-partner-weixin-connect > button { grid-column: 1 / -1; }\n .dsh-partner-qr { grid-template-columns: 1fr; justify-items: center; text-align: center; }\n .dsh-partner-qr > span { justify-items: center; }\n .dsh-partner-channel-card { grid-template-columns: 45px minmax(0, 1fr) auto; }\n .dsh-partner-channel-card > .dsh-partner-status { display: none; }\n .dsh-partner-library-header { display: grid; gap: 0; }\n .dsh-partner-library-header nav { min-height: 38px; }\n .dsh-partner-library-tools { display: grid; }\n .dsh-partner-library-tools > label { width: 100%; }\n .dsh-partner-library-browser { grid-template-columns: 1fr; height: auto; overflow: visible; }\n .dsh-partner-library-list { max-height: 300px; border-right: 0; border-bottom: 1px solid var(--partner-border); }\n .dsh-partner-library-detail { min-height: 280px; }\n .dsh-partner-profile-browser { grid-template-columns: 1fr; height: auto; overflow: visible; }\n .dsh-partner-profile-people { max-height: 240px; border-right: 0; border-bottom: 1px solid var(--partner-border); }\n .dsh-partner-profile-stage { min-height: 330px; }\n .dsh-partner-profile-heading { display: grid; }\n .dsh-partner-profile-heading > div { width: max-content; }\n .dsh-partner-profile-meta { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-profile-meta > span:nth-child(3) { padding-left: 0; border-left: 0; }\n .dsh-partner-graph-toolbar { display: grid; min-height: 0; gap: 12px; }\n .dsh-partner-graph-toolbar > label { width: 100%; }\n .dsh-partner-graph-browser { grid-template-columns: 1fr; height: auto; }\n .dsh-partner-graph-index { max-height: 280px; border-right: 0; border-bottom: 1px solid var(--partner-border); }\n .dsh-partner-graph-stage { min-height: 320px; }\n .dsh-partner-graph-pair { grid-template-columns: 1fr; gap: 9px; }\n .dsh-partner-graph-pair > div { min-height: 20px; grid-template-columns: 1fr auto 1fr; }\n .dsh-partner-graph-stage > article > footer { display: grid; gap: 4px; }\n}\n@media (prefers-reduced-motion: reduce) {\n .dsh-partner-workspace *,\n .dsh-partner-sidebar * { scroll-behavior: auto !important; transition-duration: .01ms !important; animation-duration: .01ms !important; }\n}\n.dsh-partner-record-picker { display: grid; gap: 8px; min-width: 0; }\n.dsh-partner-record-options { display: grid; gap: 6px; max-height: 220px; overflow-y: auto; min-width: 0; padding: 4px; }\n.dsh-partner-record-options button { display: flex; align-items: center; gap: 10px; min-height: 44px; text-align: left; }\n.dsh-partner-record-options button span { min-width: 0; overflow-wrap: anywhere; }\n.dsh-partner-record-options button small { flex-shrink: 0; color: var(--partner-text-tertiary); }\n.dsh-partner-record-selection, .dsh-partner-record-summary { margin: 0; padding: 8px 12px; font-size: var(--partner-font-caption); color: var(--partner-text-secondary); overflow-wrap: anywhere; }\n.dsh-partner-record-selection { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }\n", ".dsh-partner-feature-hero-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 8px; }\n.dsh-partner-feature-page { gap: 20px; }\n.dsh-partner-feature-hero { min-height: 92px; padding-bottom: 18px; }\n.dsh-partner-feature-hero p { max-width: 62ch; text-wrap: pretty; }\n.dsh-partner-feature-block { gap: 16px; padding: 20px; border-radius: 18px; box-shadow: inset 0 1px 0 var(--partner-card-highlight), 0 5px 16px color-mix(in srgb, var(--partner-text) 4%, transparent); }\n.dsh-partner-feature-block > header { min-height: 40px; }\n.dsh-partner-feature-block > header strong { font-size: var(--partner-font-label); letter-spacing: -.01em; }\n.dsh-partner-feature-block > header small { margin-top: 1px; }\n\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select) { outline: 0; }\n.dsh-partner-workspace select:not([multiple]) {\n appearance: none;\n padding-right: 32px;\n border-color: var(--partner-border);\n border-radius: 9px;\n color: var(--partner-text);\n background-color: var(--partner-control);\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 15px) calc(50% - 1px), calc(100% - 11px) calc(50% - 1px);\n background-repeat: no-repeat;\n background-size: 4px 4px, 4px 4px;\n box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 54%, transparent), inset 0 -1px 0 var(--partner-glass-rim-shadow);\n font-family: var(--partner-font-family);\n font-size: var(--partner-font-body);\n font-weight: 520;\n cursor: pointer;\n transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease;\n}\n.dsh-partner-workspace select:not([multiple]):hover:not(:disabled) { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background-color: var(--partner-hover); }\n.dsh-partner-workspace select:not([multiple]):focus-visible { border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent), inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 66%, transparent); }\n.dsh-partner-workspace select:not([multiple]):disabled { cursor: not-allowed; }\n.dsh-partner-workspace select option { color: var(--partner-text); background: var(--partner-solid-control); font: inherit; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer { align-items: center; margin-top: 4px; padding-top: 16px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-form-footer-spacer { flex: 1; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer .is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer .is-primary:hover { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > .dsh-partner-workspace-notice { grid-column: 1 / -1; margin: 0; }\n.dsh-partner-feature-page button:disabled { cursor: not-allowed; opacity: .48; }\n.dsh-partner-identity-danger > div { display: flex; align-items: center; justify-content: flex-end; gap: 7px; }\n.dsh-partner-identity-danger[data-confirming=\"true\"] { margin-inline: -12px; padding: 16px 12px 0; border-top-color: color-mix(in srgb, var(--partner-danger) 30%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 4%, transparent); }\n.dsh-partner-identity-danger button.is-secondary { border-color: var(--partner-border); color: var(--partner-text-secondary); background: var(--partner-control); }\n.dsh-partner-identity-danger button.is-danger { color: var(--partner-on-accent); border-color: var(--partner-danger); background: var(--partner-danger); }\n.dsh-partner-profile-entries article > header button.is-danger { color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 8%, transparent); }\n\n.dsh-partner-skill-installed > article,\n.dsh-partner-market-grid > article,\n.dsh-partner-schedule-list > article { transition: border-color 150ms ease, background-color 150ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-skill-installed > article:hover,\n.dsh-partner-schedule-list > article:hover { border-color: color-mix(in srgb, var(--partner-text) 20%, var(--partner-border)); background: color-mix(in srgb, var(--partner-hover) 60%, var(--partner-raised)); transform: translate3d(0, -1px, 0); }\n.dsh-partner-schedule-meta { display: flex !important; align-items: center; flex-wrap: wrap; gap: 5px 10px !important; margin-top: 2px; }\n.dsh-partner-schedule-meta > em { position: relative; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; font-variant-numeric: tabular-nums; }\n.dsh-partner-schedule-meta > em + em::before { position: absolute; top: 50%; left: -6px; width: 2px; height: 2px; border-radius: 50%; background: var(--partner-text-tertiary); content: \"\"; }\n.dsh-partner-run-list > article { border-radius: 9px; transition: background-color 140ms ease; }\n.dsh-partner-run-list > article:hover { background: var(--partner-hover); }\n.dsh-partner-board > section { border-radius: 16px; box-shadow: none; }\n.dsh-partner-board .dsh-partner-task-card { box-shadow: none; }\n\n@media (hover: hover) {\n .dsh-partner-skill-installed .is-icon,\n .dsh-partner-schedule-list .is-icon { opacity: .34; transition: opacity 140ms ease, color 140ms ease, background-color 140ms ease; }\n .dsh-partner-skill-installed > article:hover .is-icon,\n .dsh-partner-schedule-list > article:hover .is-icon,\n .dsh-partner-skill-installed .is-icon:focus-visible,\n .dsh-partner-schedule-list .is-icon:focus-visible { opacity: 1; }\n}\n\n.dsh-partner-workspace-dialog-layer { position: absolute; z-index: 12; inset: 0; display: flex; align-items: center; justify-content: center; padding: clamp(16px, 3vw, 32px); background: var(--partner-dialog-veil); }\n.dsh-partner-workspace-dialog { position: relative; inset: auto; display: grid; grid-template-rows: auto minmax(0, 1fr); width: min(560px, 100%); max-width: none; height: auto; max-height: min(680px, 100%); margin: 0; padding: 0; overflow: hidden; border: 1px solid color-mix(in srgb, var(--partner-text) 18%, var(--partner-border)); border-radius: 16px; color: var(--partner-text); background: var(--partner-solid-panel); box-shadow: 0 22px 58px color-mix(in srgb, #000 18%, transparent), 0 4px 14px color-mix(in srgb, #000 8%, transparent), inset 0 1px 0 var(--partner-card-highlight); animation: dsh-partner-dialog-enter 200ms var(--partner-ease-out) both; }\n.dsh-partner-workspace-dialog.is-wide { width: min(680px, 100%); max-height: min(720px, 100%); }\n.dsh-partner-workspace-dialog > header { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 20px; padding: 22px 22px 18px; border-bottom: 1px solid var(--partner-separator); background: var(--partner-solid-raised); }\n.dsh-partner-workspace-dialog > header > span { display: grid; gap: 5px; min-width: 0; }\n.dsh-partner-workspace-dialog > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 680; letter-spacing: .09em; }\n.dsh-partner-workspace-dialog > header strong { font-size: var(--partner-font-title); line-height: 1.25; font-weight: 660; letter-spacing: -.025em; text-wrap: balance; }\n.dsh-partner-workspace-dialog > header p { max-width: 58ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; text-wrap: pretty; }\n.dsh-partner-workspace-dialog > header button { display: grid; place-items: center; width: 32px; min-height: 32px; padding: 0; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; cursor: pointer; transition: color 140ms ease, border-color 140ms ease, background-color 140ms ease, transform 140ms var(--partner-ease-out); }\n.dsh-partner-workspace-dialog > header button:hover { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-workspace-dialog > header button:active { transform: scale(.94); }\n.dsh-partner-workspace-dialog-body { min-width: 0; min-height: 0; overflow: auto; padding: 20px 22px 24px; overscroll-behavior: contain; scrollbar-gutter: stable; }\n.dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) { margin: 0; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; }\n.dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child { position: sticky; z-index: 2; bottom: -24px; margin: 4px -22px -24px; padding: 14px 22px; border-top: 1px solid var(--partner-separator); background: var(--partner-solid-raised); box-shadow: 0 -10px 24px color-mix(in srgb, #000 5%, transparent); }\n\n.dsh-partner-workspace-notice { display: grid; grid-template-columns: 7px minmax(0, 1fr); align-items: start; gap: 10px; margin: 0 0 14px; padding: 11px 13px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-body); line-height: 1.5; }\n.dsh-partner-workspace-notice > i { width: 7px; height: 7px; margin-top: .42em; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-workspace-notice.is-error { border-color: color-mix(in srgb, var(--partner-danger) 30%, var(--partner-border)); color: var(--partner-danger); }\n.dsh-partner-workspace-notice.is-error > i { background: var(--partner-danger); }\n.dsh-partner-workspace-notice.is-warning > i { background: var(--partner-warning); }\n.dsh-partner-workspace-notice.is-success > i { background: var(--partner-success); }\n\n.dsh-partner-collection-empty { display: grid; justify-items: center; padding: 38px 24px 42px; color: var(--partner-text-secondary); text-align: center; }\n.dsh-partner-collection-empty > span { display: grid; place-items: center; width: 42px; height: 42px; margin-bottom: 12px; border: 1px solid var(--partner-border); border-radius: 13px; color: var(--partner-text-tertiary); background: var(--partner-control); }\n.dsh-partner-collection-empty > strong { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-collection-empty > p { max-width: 46ch; margin: 6px 0 14px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); line-height: 1.55; text-wrap: pretty; }\n.dsh-partner-collection-empty > button { margin-top: 14px; }\n\n.dsh-partner-collection-skeleton { display: grid; gap: 8px; padding: 6px 0; }\n.dsh-partner-collection-skeleton > i { display: block; height: 68px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 12px; background: linear-gradient(100deg, var(--partner-control) 20%, var(--partner-hover) 38%, var(--partner-control) 56%); background-size: 220% 100%; animation: dsh-partner-skeleton 1.4s ease-in-out infinite; }\n\n.dsh-partner-count-label { display: inline-flex; align-items: baseline; gap: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-count-label > b { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 650; }\n\n@keyframes dsh-partner-dialog-enter { from { opacity: 0; transform: translate3d(0, 10px, 0) scale(.985); } to { opacity: 1; transform: translate3d(0, 0, 0) scale(1); } }\n@keyframes dsh-partner-skeleton { 0% { background-position: 120% 0; } 100% { background-position: -120% 0; } }\n\n@media (max-width: 760px) {\n .dsh-partner-workspace-dialog-layer { align-items: stretch; padding: 0; }\n .dsh-partner-workspace-dialog, .dsh-partner-workspace-dialog.is-wide { width: 100%; height: 100%; max-height: none; border-width: 0; border-radius: 0; }\n .dsh-partner-workspace-dialog > header { padding: 18px 18px 15px; }\n .dsh-partner-workspace-dialog-body { padding: 18px 18px 26px; }\n .dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child { bottom: -26px; margin: 4px -18px -26px; padding: 13px 18px max(13px, env(safe-area-inset-bottom)); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-partner-workspace-dialog, .dsh-partner-collection-skeleton > i { animation: none; }\n}\n.dsh-partner-feature-form > .dsh-partner-form-help { color: var(--partner-text-secondary); background: transparent; padding: 0; overflow-wrap: anywhere; line-height: 1.6; }\n", ".dsh-partner-requirement-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin-bottom: 18px; }\n.dsh-partner-requirement-toolbar .dsh-partner-board-statuses { margin: 0; flex: 1; }\n.dsh-partner-requirement-toolbar .dsh-partner-board-search { flex: 0 1 300px; }\n.dsh-partner-requirement-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr)); gap: 12px; }\n.dsh-partner-requirement-card { min-width: 0; border: 1px solid var(--partner-border); border-radius: 16px; overflow: hidden; background: var(--partner-raised); }\n.dsh-partner-feature-page .dsh-partner-requirement-open { display: flex; flex-direction: column; align-items: stretch; gap: 12px; width: 100%; min-height: 186px; padding: 18px; border: 0; border-radius: 0; background: transparent; color: var(--partner-text); text-align: left; box-shadow: none; }\n.dsh-partner-requirement-open:hover, .dsh-partner-requirement-open:focus-visible { background: var(--partner-hover); }\n.dsh-partner-requirement-open > strong { font-size: var(--partner-font-label); line-height: 1.5; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow-wrap: anywhere; }\n.dsh-partner-requirement-open > p { margin: 0; min-height: 3em; font-size: var(--partner-font-body); color: var(--partner-text-secondary); line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; }\n.dsh-partner-requirement-meta { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: var(--partner-font-caption); color: var(--partner-text-secondary); }\n.dsh-partner-requirement-meta > span { border-radius: 6px; padding: 3px 7px; background: var(--partner-control); color: var(--partner-text); }\n.dsh-partner-requirement-meta small { font: inherit; overflow-wrap: anywhere; }\n.dsh-partner-requirement-progress { height: 4px; width: 100%; border-radius: 4px; background: var(--partner-border); overflow: hidden; margin-top: auto; }\n.dsh-partner-requirement-progress > i { display: block; height: 100%; border-radius: inherit; background: var(--partner-text-secondary); }\n.dsh-partner-requirement-card > footer { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 8px 18px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-requirement-card > footer > small { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); }\n.dsh-partner-requirement-card > footer > button { border: 0; background: transparent; box-shadow: none; }\n.dsh-partner-requirement-legacy { width: 100%; display: flex; gap: 12px; margin-top: 20px; padding: 14px !important; text-align: left; }\n.dsh-partner-requirement-legacy > span { flex: 1; color: var(--partner-text-secondary); }\n.dsh-partner-requirement-breadcrumb { display: flex; align-items: center; gap: 8px; min-width: 0; margin-bottom: 12px; font-size: var(--partner-font-body); }\n.dsh-partner-requirement-breadcrumb > span { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }\n.dsh-partner-requirement-breadcrumb > button, .dsh-partner-requirement-breadcrumb > svg { flex-shrink: 0; }\n.dsh-partner-requirement-facts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; padding-block: 12px; border-block: 1px solid var(--partner-separator); }\n.dsh-partner-requirement-facts > span { display: grid; gap: 6px; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); }\n.dsh-partner-requirement-facts b { color: var(--partner-text); font-weight: 550; overflow-wrap: anywhere; }\n.dsh-partner-requirement-disclosure { border-top: 1px solid var(--partner-separator); padding-top: 8px; }\n.dsh-partner-requirement-disclosure > summary { display: flex; align-items: center; gap: 8px; min-height: 40px; cursor: pointer; color: var(--partner-text-secondary); font-size: var(--partner-font-body); list-style: none; }\n.dsh-partner-requirement-disclosure > summary::-webkit-details-marker { display: none; }\n.dsh-partner-requirement-disclosure > summary::before { content: ''; width: 6px; height: 6px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: rotate(-45deg); }\n.dsh-partner-requirement-disclosure[open] > summary::before { transform: rotate(45deg); }\n.dsh-partner-requirement-disclosure > p { color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-requirement-disclosure > label { display: grid; gap: 8px; margin-bottom: 12px; }\n.dsh-partner-requirement-actions { display: flex; flex-wrap: wrap; gap: 8px; }\n.dsh-partner-requirement-owner { display: grid; gap: 8px; font-size: var(--partner-font-body); }\n.dsh-partner-requirement-detail :is(textarea, select) { box-sizing: border-box; width: 100%; min-height: 40px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 9px; background: var(--partner-control); color: var(--partner-text); font: var(--partner-font-body)/1.5 var(--partner-font-family); }\n.dsh-partner-requirement-detail textarea { resize: vertical; }\n.dsh-partner-feature-page.is-board :is(button, summary, textarea):focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-feature-page.is-board button:not(:disabled):active { transform: none; }\n.dsh-partner-requirement-detail button.is-primary { background: var(--partner-accent-strong); color: var(--partner-on-accent); border-color: var(--partner-accent-strong); }\n.dsh-partner-requirement-detail button.is-danger { color: var(--partner-danger); }\n.dsh-partner-feature-page.is-board > .dsh-partner-feature-page.is-board { padding: 0; }\n.dsh-partner-requirement-detail > footer { display: flex; justify-content: flex-end; gap: 8px; }\n.dsh-partner-requirement-detail .dsh-partner-task-result { overflow-wrap: anywhere; }\n@media (max-width: 760px) {\n .dsh-partner-requirement-toolbar { align-items: stretch; }\n .dsh-partner-requirement-toolbar .dsh-partner-board-statuses { display: flex; }\n .dsh-partner-requirement-toolbar .dsh-partner-board-search { flex-basis: 100%; }\n .dsh-partner-requirement-facts { grid-template-columns: 1fr 1fr; }\n .dsh-partner-requirement-legacy { flex-wrap: wrap; }\n .dsh-partner-requirement-legacy > span { flex-basis: 100%; }\n .dsh-partner-requirement-detail button, .dsh-partner-requirement-card button, .dsh-partner-requirement-disclosure summary { min-height: 44px; }\n}\n", "/* Mobile composition lives separately from the desktop visual system so each\n layout can evolve without selector-specificity patches. */\n.dsh-partner-topbar > .dsh-partner-mobile-controls { display: none; }\n\n@media (max-width: 760px) {\n .dsh-partner-workspace {\n min-height: 0;\n height: 100%;\n max-height: 100dvh;\n overflow: hidden;\n font-size: 14px;\n }\n\n .dsh-partner-topbar {\n display: grid;\n grid-template-columns: 44px minmax(0, 1fr);\n align-items: center;\n gap: 8px;\n min-width: 0;\n margin: max(6px, env(safe-area-inset-top)) 6px 0;\n padding: 7px 8px 8px;\n border-radius: 14px 14px 10px 10px;\n }\n\n .dsh-partner-topbar > .dsh-partner-topbar-brand {\n display: flex;\n min-width: 0;\n min-height: 44px;\n gap: 9px;\n }\n\n .dsh-partner-topbar-brand > span:last-child { min-width: 0; }\n .dsh-partner-topbar-brand > :not(button) { display: none; }\n .dsh-partner-topbar-brand strong,\n .dsh-partner-topbar-brand small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .dsh-partner-topbar [data-xiaohei-workspace-close] { width: 44px; height: 44px; }\n\n .dsh-partner-topbar > .dsh-partner-mobile-controls {\n display: contents;\n }\n\n .dsh-partner-mobile-companion-row { display: grid; min-width: 0; grid-template-columns: minmax(0, 1fr) 44px; gap: 6px; }\n .dsh-partner-mobile-create {\n display: grid;\n width: 44px;\n min-height: 44px;\n place-items: center;\n padding: 0;\n border: 1px solid var(--partner-border);\n border-radius: 10px;\n color: var(--partner-text-secondary);\n background: var(--partner-control);\n box-shadow: inset 0 1px 0 var(--partner-glass-highlight);\n }\n\n .dsh-partner-mobile-workspace-nav { grid-column: 1 / -1; gap: 6px; }\n .dsh-partner-mobile-workspace-nav button {\n min-height: 44px;\n padding: 0 9px;\n border-radius: 10px;\n font-size: 13px;\n touch-action: manipulation;\n }\n\n .dsh-partner-grid { min-width: 0; padding: 6px 6px max(6px, env(safe-area-inset-bottom)); }\n .dsh-partner-stage { min-width: 0; border-radius: 13px; }\n .dsh-partner-stage-scroll { padding: 18px 14px max(36px, calc(20px + env(safe-area-inset-bottom))); }\n\n .dsh-partner-identity { min-width: 0; min-height: 76px; padding: 13px 14px 9px; }\n .dsh-partner-identity > span:nth-child(2) { overflow: hidden; }\n .dsh-partner-identity h1 { font-size: 20px; }\n .dsh-partner-identity .dsh-partner-status { max-width: 112px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .dsh-partner-tabs { min-height: 45px; margin-inline: 8px; gap: 0; scrollbar-width: none; }\n .dsh-partner-tabs::-webkit-scrollbar { display: none; }\n .dsh-partner-tabs button { min-height: 44px; padding-inline: 11px; touch-action: manipulation; }\n\n .dsh-partner-feature-page { width: 100%; gap: 14px; padding: 18px 12px max(34px, calc(18px + env(safe-area-inset-bottom))); }\n .dsh-partner-feature-hero { min-height: 0; gap: 13px; padding: 0 2px 14px 12px; }\n .dsh-partner-feature-hero h2 { font-size: 23px; }\n .dsh-partner-feature-hero p { font-size: 14px; line-height: 1.55; }\n .dsh-partner-feature-hero > div { align-items: center; }\n .dsh-partner-feature-block,\n .dsh-partner-capability-detail { gap: 13px; padding: 14px; border-radius: 14px; }\n\n .dsh-partner-workspace :where(input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select) { font-size: 16px; }\n .dsh-partner-field :where(input, select),\n :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, select),\n .dsh-partner-board-search > input,\n .dsh-partner-board-assignee > select,\n .dsh-partner-task-detail select { min-height: 44px; height: auto; }\n .dsh-partner-field textarea,\n :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) textarea { min-height: 96px; }\n\n .dsh-partner-workspace :where(button:not(.dsh-partner-feature-switch)) { touch-action: manipulation; }\n .dsh-partner-feature-page :where(button:not(.dsh-partner-feature-switch)),\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-home-channel-actions button,\n .dsh-partner-home-details header button,\n .dsh-partner-identity-danger button,\n .dsh-partner-library-header nav button,\n .dsh-partner-graph-filters button,\n .dsh-partner-graph-pair > section button { min-height: 44px; }\n .dsh-partner-feature-page .is-icon { width: 44px; min-width: 44px; min-height: 44px; }\n .dsh-partner-check { min-height: 44px; }\n .dsh-partner-feature-switch,\n .dsh-partner-feature-switch[data-on=\"true\"] {\n width: 44px;\n height: 44px;\n min-height: 44px !important;\n border-color: transparent !important;\n background: transparent !important;\n }\n .dsh-partner-feature-switch::before {\n position: absolute;\n top: 11px;\n left: 3px;\n width: 38px;\n height: 22px;\n border: 1px solid var(--partner-border);\n border-radius: 999px;\n background: color-mix(in srgb, var(--partner-text) 9%, transparent);\n content: '';\n }\n .dsh-partner-feature-switch[data-on=\"true\"]::before { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n .dsh-partner-feature-switch i { top: 15px; left: 6px; }\n\n .dsh-partner-home-heading { margin-bottom: 16px; }\n .dsh-partner-home-channel { min-height: 0; border-radius: 16px; }\n .dsh-partner-home-route { min-height: 116px; padding: 20px; }\n .dsh-partner-home-channel-copy { padding: 12px 18px 20px; }\n .dsh-partner-home-channel-actions { align-items: stretch; flex-direction: column; gap: 8px; width: 100%; }\n .dsh-partner-home-channel-actions button { width: 100%; }\n .dsh-partner-home-details { gap: 10px; margin-top: 12px; }\n .dsh-partner-home-details > section { padding: 16px 14px 17px; }\n .dsh-partner-home-details header { grid-template-columns: 34px minmax(0, 1fr) auto; }\n .dsh-partner-home-profile blockquote,\n .dsh-partner-home-capability-list,\n .dsh-partner-home-capability-list small,\n .dsh-partner-home-continuity > p { margin-left: 0; }\n\n .dsh-partner-form-actions,\n .dsh-partner-identity-danger { align-items: stretch; flex-direction: column; }\n .dsh-partner-form-actions > button,\n .dsh-partner-identity-danger > div,\n .dsh-partner-identity-danger button { width: 100%; }\n .dsh-partner-identity-danger > div { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n\n .dsh-partner-skill-search,\n .dsh-partner-skill-search.is-compact { min-height: 52px; grid-template-columns: 36px minmax(0, 1fr) 44px; gap: 6px; padding: 4px 5px 4px 8px; }\n .dsh-partner-skill-search input,\n .dsh-partner-skill-search.is-compact input { height: 44px; font-size: 16px; }\n .dsh-partner-skill-search .dsh-partner-skill-search-clear { width: 44px; min-height: 44px; }\n .dsh-partner-skill-search-count { grid-column: 2 / -1; min-width: 0; padding: 0 7px 3px 0; border-left: 0; line-height: 16px; text-align: left; }\n .dsh-partner-skill-search:not(:has(.dsh-partner-skill-search-clear)) { grid-template-columns: 36px minmax(0, 1fr); }\n .dsh-partner-market-sources > button { min-height: 44px; }\n .dsh-partner-market-grid { grid-template-columns: 1fr; }\n .dsh-partner-skill-installed > article,\n .dsh-partner-skill-installed.is-market > article { grid-template-columns: 36px minmax(0, 1fr) 44px; padding: 10px; }\n .dsh-partner-skill-installed.is-binding > article { min-height: 0; grid-template-columns: 36px minmax(0, 1fr); }\n .dsh-partner-skill-installed.is-binding .dsh-partner-skill-binding-action { grid-column: 1 / -1; width: 100%; }\n .dsh-partner-skill-picker-list { max-height: min(420px, 48dvh); grid-template-columns: 1fr; }\n .dsh-partner-skill-picker-list > article { min-height: 0; }\n .dsh-partner-skill-picker-list button { width: 100%; justify-self: stretch; }\n\n .dsh-partner-board-tools { grid-template-columns: 1fr; }\n .dsh-partner-board-assignee,\n .dsh-partner-board-tools > small { grid-column: 1; }\n .dsh-partner-board-tools > small { justify-self: start; }\n .dsh-partner-board-search > button { right: 0; width: 44px; min-height: 44px; }\n .dsh-partner-board-statuses { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 5px; }\n .dsh-partner-board-statuses > button { min-width: 0; min-height: 44px; justify-content: center; gap: 4px; padding-inline: 5px; }\n .dsh-partner-board { grid-template-columns: 1fr; }\n .dsh-partner-board .dsh-partner-board-stage-toggle, .dsh-partner-board-more { min-height: 44px; }\n .is-board .dsh-partner-board-tools { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .is-board .dsh-partner-board-search, .is-board .dsh-partner-board-tools > small { grid-column: 1 / -1; }\n .is-board .dsh-partner-board-assignee { grid-column: auto; }\n .dsh-partner-board-assignee.is-mobile-stage { display: block; }\n .is-board .dsh-partner-board-statuses { display: none; }\n .dsh-partner-task-fields label { grid-template-columns: 1fr; gap: 5px; }\n .dsh-partner-task-dependency > div > span { min-height: 44px; grid-template-columns: 18px minmax(0, 1fr) 52px; }\n .dsh-partner-task-dependency > div button { min-height: 44px; }\n .dsh-partner-task-actions > span { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-task-actions button { width: 100%; }\n\n .dsh-partner-schedule-time { grid-template-columns: 1fr; }\n .dsh-partner-schedule-list > article {\n min-height: 0;\n grid-template-columns: minmax(0, 1fr) 44px;\n align-items: center;\n gap: 8px;\n padding: 12px;\n }\n .dsh-partner-schedule-list > article > span:first-child { grid-column: 1 / -1; }\n .dsh-partner-schedule-list > article > .dsh-partner-feature-switch { grid-column: 1; justify-self: start; }\n .dsh-partner-schedule-list > article > button:not(.is-icon):not(.dsh-partner-feature-switch) { grid-column: 1; grid-row: 2; justify-self: end; }\n .dsh-partner-schedule-list > article > .is-icon { grid-column: 2; grid-row: 2; }\n .dsh-partner-schedule-list p,\n .dsh-partner-run-list p { white-space: normal; overflow-wrap: anywhere; }\n\n .dsh-partner-workspace-dialog > header {\n padding: max(14px, env(safe-area-inset-top)) 14px 13px;\n }\n .dsh-partner-workspace-dialog > header button { width: 44px; min-height: 44px; }\n .dsh-partner-workspace-dialog-body { padding: 16px 14px max(24px, env(safe-area-inset-bottom)); }\n .dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child {\n bottom: calc(-1 * max(24px, env(safe-area-inset-bottom)));\n margin: 4px -14px calc(-1 * max(24px, env(safe-area-inset-bottom)));\n padding: 12px 14px max(12px, env(safe-area-inset-bottom));\n }\n}\n\n@media (max-width: 420px) {\n .dsh-partner-topbar-brand small { display: none; }\n .dsh-partner-feature-page { padding-inline: 10px; }\n .dsh-partner-feature-block,\n .dsh-partner-capability-detail { padding: 12px; }\n .dsh-partner-board-statuses { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-profile-meta { grid-template-columns: 1fr; }\n .dsh-partner-profile-meta > span { padding-left: 0; border-left: 0; }\n}\n\n@media (max-width: 760px) and (max-height: 520px) and (orientation: landscape) {\n .dsh-partner-stage-scroll { padding-bottom: 20px; }\n .dsh-partner-workspace-dialog > header { padding-top: 10px; padding-bottom: 10px; }\n}\n", ".dsh-partner-companion-picker { position: relative; min-width: 0; }\n.dsh-partner-companion-trigger,\n.dsh-partner-companion-options > button {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n min-width: 0;\n min-height: 48px;\n padding: 6px 10px;\n border: 1px solid var(--partner-border);\n border-radius: 10px;\n color: var(--partner-text);\n background: var(--partner-control);\n font: 500 var(--partner-font-body)/1.4 var(--partner-font-family);\n text-align: left;\n cursor: pointer;\n}\n.dsh-partner-companion-copy { display: grid; flex: 1; min-width: 0; gap: 2px; }\n.dsh-partner-companion-copy > strong { overflow: hidden; font-size: var(--partner-font-label); font-weight: 600; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-companion-copy > small { overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); font-weight: 400; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-companion-picker .dsh-partner-avatar { flex: none; width: 30px; height: 30px; border-radius: 9px; background: var(--partner-selected); box-shadow: none; }\n.dsh-partner-companion-chevron,\n.dsh-partner-companion-check { display: grid; flex: none; width: 16px; place-items: center; color: var(--partner-text-secondary); }\n.dsh-partner-companion-trigger[aria-expanded=\"true\"] .dsh-partner-companion-chevron { transform: rotate(180deg); }\n.dsh-partner-companion-trigger:hover:not(:disabled),\n.dsh-partner-companion-trigger[aria-expanded=\"true\"] { background: var(--partner-control-hover); border-color: var(--partner-text-tertiary); }\n/* Host themes target #root [role=listbox] with !important. Keep this one\n owned overlay legible without changing the host theme or workspace canvas. */\n:is(#root, .dsh-partner-workspace) .dsh-partner-companion-options[role=\"listbox\"] {\n position: absolute;\n z-index: 10;\n top: calc(100% + 6px);\n left: 0;\n right: 0;\n display: grid;\n gap: 3px;\n max-height: min(320px, 45dvh);\n overflow-y: auto;\n overscroll-behavior: contain;\n scrollbar-width: thin;\n padding: 5px;\n border: 1px solid var(--partner-border) !important;\n border-radius: 12px !important;\n background: var(--partner-solid-panel) !important;\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n box-shadow: var(--partner-shadow-md) !important;\n}\n:is(#root, .dsh-partner-workspace) .dsh-partner-companion-options > [role=\"option\"] {\n border-color: transparent;\n border-radius: 8px;\n color: var(--partner-text);\n background: transparent;\n box-shadow: none;\n transform: none;\n transition: none;\n}\n:is(#root, .dsh-partner-workspace) .dsh-partner-companion-options > [role=\"option\"]:is(:hover, :focus-visible) { background: var(--partner-hover); }\n:is(#root, .dsh-partner-workspace) .dsh-partner-companion-options > [role=\"option\"][aria-selected=\"true\"] { background: var(--partner-selected); }\n:is(#root, .dsh-partner-workspace) .dsh-partner-companion-options > [role=\"option\"]:focus-visible { outline: 2px solid var(--partner-focus-ring) !important; outline-offset: -2px !important; }\n", ".dsh-partner-pendant { position: fixed; z-index: 12; top: 46px; right: 8px; width: 260px; height: min(310px, calc(100dvh - 56px)); pointer-events: none; color: var(--partner-text); font: 13px/1.5 var(--partner-font-family); }\n.dsh-partner-pendant * { box-sizing: border-box; }\n.dsh-partner-pendant button { appearance: none; -webkit-appearance: none; margin: 0; color: inherit; font: inherit; cursor: pointer; touch-action: manipulation; }\n.dsh-partner-pendant button:focus-visible { outline: 2px solid var(--partner-focus-ring) !important; outline-offset: 2px !important; }\n.dsh-partner-pendant button:disabled { opacity: .45; cursor: default; }\n.dsh-partner-pendant .dsh-partner-pendant-canvas { position: fixed; left: 0; top: 0; display: block; width: 164px; height: 164px; pointer-events: none; transition: none !important; background: transparent !important; opacity: 1 !important; filter: none !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; }\n.dsh-partner-pendant .dsh-partner-pendant-strap { position: fixed; left: 0; top: 0; width: 100vw; height: 100dvh; overflow: hidden; pointer-events: none; }\n.dsh-partner-pendant-hit { position: absolute; top: 0; left: 0; width: 84px; height: 116px; transform: translate(130px, 210px) translate(-50%, -50%); padding: 0; border: 0; border-radius: 12px; background: var(--partner-solid-panel); pointer-events: auto; touch-action: none !important; user-select: none; -webkit-user-select: none; cursor: grab !important; }\n.dsh-partner-pendant-hit:active, .dsh-partner-pendant-anchor:active { cursor: grabbing !important; }\n.dsh-partner-pendant button.dsh-partner-pendant-hit.is-rendered { background: transparent !important; border: 0 !important; box-shadow: none !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; transition: none !important; }\n.dsh-partner-pendant button.dsh-partner-pendant-hit.is-rendered:not(:focus-visible) { outline: none !important; }\n.dsh-partner-pendant-fallback { display: grid; gap: 8px; }\n.dsh-partner-pendant-fallback small { color: var(--partner-text-secondary); font-size: 12px; }\n.dsh-partner-pendant button.dsh-partner-pendant-anchor { position: absolute; left: 50%; top: 2.42%; transform: translate(-50%, -50%); display: grid; place-items: center; width: 36px; height: 36px; padding: 0; border: 0 !important; border-radius: 50%; background: transparent !important; box-shadow: none !important; pointer-events: auto; touch-action: none; cursor: grab; }\n.dsh-partner-pendant-anchor > span { width: 14px; height: 6px; border: 1px solid #71817e; border-radius: 4px; background: #c3ced0; }\n.dsh-partner-pendant-anchor:hover > span { background: #e4ece8; }\n.dsh-partner-pendant-unread { position: absolute; left: 0; top: 0; transform: translate(130px, 144px) translate(-50%, -100%); display: grid; place-items: center; min-width: 18px; height: 18px; padding: 0 4px; border: 1px solid rgb(255 255 255 / 70%); border-radius: 9px; background: #435950; color: #fff; font: 600 11px/1 var(--partner-font-family); font-variant-numeric: tabular-nums; white-space: nowrap; pointer-events: none; user-select: none; transition: none !important; }\n.dsh-partner-pendant-unread[hidden] { display: none; }\nbody[data-ds-dark-theme] .dsh-partner-pendant-unread { border-color: rgb(200 220 213 / 24%); background: #b0c6bd; color: #202e29; }\n.dsh-partner-pendant-announcement { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n/* Own the reader's surface even under host-wide important focus rules. */\n.dsh-partner-pendant section#dsh-partner-pendant-inbox.dsh-partner-pendant-inbox {\n --pendant-paper: rgb(246 248 249 / 96%);\n --pendant-ink: #283237;\n --pendant-muted: #626f76;\n --pendant-line: rgb(74 91 101 / 13%);\n --pendant-tint: rgb(75 104 98 / 9%);\n --pendant-highlight: rgb(255 255 255 / 80%);\n position: fixed; display: flex; flex-direction: column; min-height: 0; overflow: hidden;\n color: var(--pendant-ink); font: 13px/1.5 var(--partner-font-family);\n border: 1px solid var(--pendant-line); border-radius: 20px; outline: none !important;\n background: var(--pendant-paper); backdrop-filter: blur(16px) saturate(.65); -webkit-backdrop-filter: blur(16px) saturate(.65);\n box-shadow: inset 0 1px var(--pendant-highlight), 0 12px 36px rgb(20 32 40 / 13%), 0 2px 6px rgb(20 32 40 / 5%) !important;\n pointer-events: auto; animation: partner-pendant-read-in 150ms ease-out;\n}\nbody[data-ds-dark-theme] .dsh-partner-pendant section#dsh-partner-pendant-inbox.dsh-partner-pendant-inbox {\n --pendant-paper: rgb(29 35 39 / 97%); --pendant-ink: #e3e9ed; --pendant-muted: #acb7be;\n --pendant-line: rgb(190 207 218 / 13%); --pendant-tint: rgb(164 198 186 / 10%); --pendant-highlight: rgb(222 233 238 / 9%);\n}\n.dsh-partner-pendant-inbox header { display: flex; flex-shrink: 0; align-items: center; gap: 10px; padding: 14px 14px 12px; border-bottom: 1px solid var(--pendant-line); }\n.dsh-partner-pendant-reader-heading { flex: 1; min-width: 0; display: grid; gap: 2px; }\n.dsh-partner-pendant-reader-heading strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-pendant-reader-icon { display: grid; place-items: center; width: 36px; height: 36px; flex: none; border: 1px solid var(--pendant-line); border-radius: 12px; background: var(--pendant-tint); }\n.dsh-partner-pendant-reader-count { display: grid; place-items: center; min-width: 24px; height: 24px; padding: 0 6px; border-radius: 8px; background: var(--pendant-tint); font-size: 12px; font-weight: 600; font-variant-numeric: tabular-nums; }\n.dsh-partner-pendant-inbox strong { font-weight: 600; font-size: 14px; }\n.dsh-partner-pendant-inbox small { color: var(--pendant-muted); font-size: 12px; }\n.dsh-partner-pendant-inbox header > button { display: grid; place-items: center; flex: none; width: 32px; height: 32px; padding: 0; border: 0; border-radius: 10px; background: transparent; }\n.dsh-partner-pendant-inbox button { box-shadow: none; transition: background-color 120ms ease, border-color 120ms ease; }\n.dsh-partner-pendant #dsh-partner-pendant-inbox button:focus-visible { outline: 2px solid var(--pendant-muted) !important; outline-offset: 2px !important; }\n.dsh-partner-pendant-inbox header > button:hover { background: var(--pendant-tint); }\n.dsh-partner-pendant-back { transform: rotate(90deg); }\n.dsh-partner-pendant-list { min-height: 0; padding: 8px; overflow: auto; overscroll-behavior: contain; scrollbar-width: thin; }\n.dsh-partner-pendant-list > button { display: grid; width: 100%; gap: 6px; padding: 12px; border: 1px solid transparent; border-radius: 12px; background: transparent; text-align: left; }\n.dsh-partner-pendant-list > button + button { margin-top: 4px; }\n.dsh-partner-pendant-list > button[data-unread=\"true\"] { background: var(--pendant-tint); }\n.dsh-partner-pendant-list > button:hover { background: var(--pendant-tint); border-color: var(--pendant-line); }\n.dsh-partner-pendant-list > button > span { display: flex; align-items: center; justify-content: space-between; gap: 8px; }\n.dsh-partner-pendant-list > button > span strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-pendant-list > button[data-unread=\"true\"] strong::before { display: inline-block; width: 5px; height: 5px; margin-right: 6px; border-radius: 50%; background: var(--pendant-muted); content: ''; }\n.dsh-partner-pendant-list time { flex-shrink: 0; font-size: 12px; color: var(--pendant-muted); font-variant-numeric: tabular-nums; }\n.dsh-partner-pendant-list b { font-weight: 500; font-size: 13px; }\n.dsh-partner-pendant-list small { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; overflow-wrap: anywhere; }\n.dsh-partner-pendant-inbox footer { display: flex; flex-shrink: 0; justify-content: space-between; align-items: center; gap: 8px; padding: 12px 16px; border-top: 1px solid var(--pendant-line); }\n.dsh-partner-pendant-inbox footer button { display: inline-flex; justify-content: center; align-items: center; gap: 6px; min-height: 34px; padding: 6px 10px; border: 1px solid var(--pendant-line); border-radius: 10px; background: transparent; white-space: nowrap; }\n.dsh-partner-pendant-inbox footer button:hover { background: var(--pendant-tint); }\n.dsh-partner-pendant-inbox footer .dsh-partner-pendant-source { background: var(--pendant-tint); font-weight: 600; }\n.dsh-partner-pendant-inbox footer .dsh-partner-pendant-all-messages { padding-left: 0; border-color: transparent; color: var(--pendant-muted); }\n.dsh-partner-pendant-all-messages span { font-size: 12px; font-variant-numeric: tabular-nums; }\n.dsh-partner-pendant-detail { min-height: 0; padding: 18px 20px 22px; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; }\n.dsh-partner-pendant-reader-meta { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 12px; color: var(--pendant-muted); font-size: 12px; }\n.dsh-partner-pendant-reader-meta > span { padding: 3px 7px; border: 1px solid var(--pendant-line); border-radius: 6px; }\n.dsh-partner-pendant-detail h3 { margin: 0 0 14px; font-size: 15px; line-height: 1.5; font-weight: 600; overflow-wrap: anywhere; }\n.dsh-partner-pendant-detail p { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; font-size: 14px; line-height: 1.8; }\n.dsh-partner-pendant-empty { padding: 32px 12px; color: var(--pendant-muted); text-align: center; }\n.dsh-partner-pendant-error { margin: 8px 12px; color: var(--partner-danger); overflow-wrap: anywhere; }\n@keyframes partner-pendant-read-in { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; transform: translateY(0); } }\n@media (max-width: 760px) {\n .dsh-partner-pendant { top: max(48px, env(safe-area-inset-top)); right: 0; width: min(200px, calc(100vw - 24px)); height: min(248px, calc(100dvh - 56px)); }\n .dsh-partner-pendant button.dsh-partner-pendant-anchor { width: 44px; height: 44px; }\n .dsh-partner-pendant-inbox header > button, .dsh-partner-pendant-inbox footer button { min-height: 44px; min-width: 44px; }\n .dsh-partner-pendant-detail { padding: 16px; }\n}\n@media (prefers-reduced-motion: reduce) { .dsh-partner-pendant-inbox { animation: none; } }\n", ".dsh-partner-pendant-settings-layout { display: grid; grid-template-columns: minmax(0, 1fr) 260px; gap: 20px; align-items: start; }\n.dsh-partner-pendant-settings-fields { display: grid; min-width: 0; gap: 16px; }\n.dsh-partner-pendant-length { display: grid; gap: 8px; color: var(--partner-text); font: inherit; }\n.dsh-partner-pendant-length > span { display: flex; justify-content: space-between; }\n.dsh-partner-pendant-length small { color: var(--partner-text-secondary); font-size: 12px; }\n.dsh-partner-pendant-length input[type=\"range\"] { appearance: none; -webkit-appearance: none; width: 100%; min-height: 44px; margin: 0; padding: 0; border: 0; background: transparent; box-shadow: none; cursor: pointer; }\n.dsh-partner-pendant-length input::-webkit-slider-runnable-track { height: 4px; border-radius: 4px; background: var(--partner-border); }\n.dsh-partner-pendant-length input::-moz-range-track { height: 4px; border-radius: 4px; background: var(--partner-border); }\n.dsh-partner-pendant-length input::-webkit-slider-thumb { appearance: none; -webkit-appearance: none; width: 18px; height: 18px; margin-top: -7px; border: 2px solid var(--partner-control); border-radius: 50%; background: var(--partner-text-secondary); }\n.dsh-partner-pendant-length input::-moz-range-thumb { width: 14px; height: 14px; border: 2px solid var(--partner-control); border-radius: 50%; background: var(--partner-text-secondary); }\n.dsh-partner-pendant-length input:focus-visible { outline: 2px solid var(--partner-accent); outline-offset: 3px; }\n.dsh-partner-pendant-fps-row { display: grid; gap: 8px; font-size: 13px; }\n.dsh-partner-pendant-options { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 4px; padding: 4px; border: 1px solid var(--partner-border); border-radius: 12px; background: var(--partner-control); }\n.dsh-partner-pendant-options[data-columns=\"2\"] { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-pendant-options > button { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 4px 8px; min-width: 0; min-height: 44px; padding: 6px 8px; border: 1px solid transparent; border-radius: 8px; background: transparent; color: var(--partner-text-secondary); }\n.dsh-partner-pendant-settings .dsh-partner-pendant-options > button[aria-pressed=\"true\"] { border-color: var(--partner-border); background: var(--partner-selected); color: var(--partner-text); }\n.dsh-partner-pendant-options strong { font-size: 13px; font-weight: 600; white-space: nowrap; }\n.dsh-partner-pendant-options small { font-size: 12px; color: var(--partner-text-secondary); }\n.dsh-partner-pendant-fps-row small { color: var(--partner-text-secondary); font-size: 12px; line-height: 1.5; }\n.dsh-partner-pendant-setting-hint { margin: 0; color: var(--partner-text-secondary); font-size: 13px; line-height: 1.6; }\n.dsh-partner-pendant-materials { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }\n.dsh-partner-pendant-settings button { font: inherit; appearance: none; -webkit-appearance: none; cursor: pointer; }\n.dsh-partner-pendant-materials > button { display: grid; position: relative; align-content: center; gap: 4px; min-height: 66px; padding: 12px; border: 1px solid var(--partner-border); border-radius: 12px; color: var(--partner-text); background: var(--partner-control); text-align: left; }\n.dsh-partner-pendant-materials strong { font-size: 13px; font-weight: 600; }\n.dsh-partner-pendant-materials small { font-size: 12px; color: var(--partner-text-secondary); }\n.dsh-partner-pendant-materials > button > svg:not(.dsh-partner-strap-swatch) { position: absolute; right: 8px; bottom: 14px; }\n.dsh-partner-pendant-materials .dsh-partner-strap-swatch { display: block; width: 100%; height: 38px; margin: 0 0 4px; }\n.dsh-partner-pendant-settings .dsh-partner-pendant-materials > button[aria-pressed=\"true\"] { border-color: var(--partner-text-secondary); background: var(--partner-selected); }\n.dsh-partner-pendant-settings button:disabled { opacity: .45; cursor: default; }\n.dsh-partner-pendant-settings button:focus-visible, .dsh-partner-pendant-hex input:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-pendant-color-row { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-top: 4px; font-size: 13px; }\n.dsh-partner-pendant-swatches { display: flex; align-items: center; gap: 4px; }\n.dsh-partner-pendant-swatches button { position: relative; display: grid; place-items: center; width: 30px; height: 34px; padding: 3px; border: 1px solid transparent; border-radius: 8px; background: transparent; }\n.dsh-partner-pendant-swatches i { width: 22px; height: 22px; border: 1px solid var(--partner-border); border-radius: 50%; }\n.dsh-partner-pendant-swatches button[aria-pressed=\"true\"] { border-color: var(--partner-text-secondary); }\n.dsh-partner-pendant-swatches svg { position: absolute; color: white; filter: drop-shadow(0 1px 1px #222); }\n.dsh-partner-pendant-hex { min-width: 0; }\n.dsh-partner-pendant-hex input { width: 104px; min-height: 36px; padding: 6px 10px; appearance: none; border: 1px solid var(--partner-border); border-radius: 9px; background: var(--partner-control); color: var(--partner-text); font: 13px/1.5 var(--partner-font-family); }\n.dsh-partner-pendant-hex input[aria-invalid=\"true\"] { border-color: var(--partner-danger); }\n.dsh-partner-pendant-color-error { margin: 6px 0 0; color: var(--partner-danger); font-size: 12px; }\n.dsh-partner-pendant-image-actions { display: flex; flex-wrap: wrap; gap: 8px; }\n.dsh-partner-pendant-image-actions button, .dsh-partner-pendant-settings-footer button { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 36px; padding: 7px 12px; border: 1px solid var(--partner-border); border-radius: 10px; background: var(--partner-control); color: var(--partner-text); font-size: 13px; }\n.dsh-partner-pendant-settings button:not(:disabled):not(.dsh-partner-feature-switch):not([aria-pressed=\"true\"]):hover { background-color: var(--partner-hover); }\n.dsh-partner-pendant-settings input[type=\"file\"][hidden] { display: none !important; }\n.dsh-partner-pendant-settings-footer { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; }\n.dsh-partner-pendant-settings-footer small { font-size: 12px; color: var(--partner-text-secondary); }\n.dsh-partner-pendant-preview { position: sticky; top: 0; min-width: 0; padding: 20px; border: 1px solid var(--partner-border); border-radius: 18px; background: var(--partner-card-surface); }\n.dsh-partner-pendant-preview header { display: grid; gap: 4px; }\n.dsh-partner-pendant-preview header strong { font-size: 14px; font-weight: 600; }\n.dsh-partner-pendant-preview small { font-size: 12px; color: var(--partner-text-secondary); }\n.dsh-partner-pendant-preview-stage { display: flex; align-items: center; flex-direction: column; padding: 16px 0; }\n.dsh-partner-pendant-preview-stage > svg { width: 100px; height: 130px; flex: none; }\n.dsh-partner-pendant-preview-card { position: relative; width: 128px; aspect-ratio: 8 / 11; border: 2px solid #80908e; border-radius: 12px; background: #253235; color: #e3eae5; }\n.dsh-partner-pendant-preview-card::before { position: absolute; z-index: 1; top: -11px; left: calc(50% - 8px); width: 16px; height: 14px; border: 3px solid #c3ced0; border-radius: 6px; background: #465752; content: ''; }\n.dsh-partner-pendant-preview-card img { display: block; position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; border-radius: 10px; }\n.dsh-partner-pendant-preview-card > span { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; gap: 14px; }\n.dsh-partner-pendant-preview-card strong { font-size: 13px; }\n.dsh-partner-pendant-preview-card small { color: #b6cbc2; font-size: 11px; }\n.dsh-partner-pendant-preview > p { margin: 8px 0 0; font-size: 13px; text-align: center; line-height: 1.8; }\n.dsh-partner-pendant-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }\n.dsh-partner-pendant-settings-fields > .dsh-partner-feature-block:first-child > header { flex-direction: row; align-items: center; }\n.dsh-partner-pendant-settings-fields > .dsh-partner-feature-block:first-child > header > div { width: auto; flex: none; }\n@media (max-width: 1100px) { .dsh-partner-pendant-settings-layout { grid-template-columns: minmax(0, 1fr); } .dsh-partner-pendant-preview { position: static; } .dsh-partner-pendant-preview-stage { padding: 0; } .dsh-partner-pendant-preview-stage > svg { height: 70px; } }\n@media (max-width: 600px) { .dsh-partner-pendant-materials > button { padding: 12px 8px; } .dsh-partner-pendant-swatches button { width: 40px; height: 44px; } .dsh-partner-pendant-image-actions button, .dsh-partner-pendant-settings-footer button, .dsh-partner-pendant-hex input { min-height: 44px; } .dsh-partner-pendant-hex input { font-size: 16px; } }\n", "/* Memory workspace owns layout only; material, color and type come from Partner. */\n.dsh-partner-memory-page .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n.dsh-partner-memory-page { display: grid; gap: 18px; min-width: 0; color: var(--partner-text); font: var(--partner-font-body)/1.55 var(--partner-font-family); }\n.dsh-partner-memory-page .dsh-partner-feature-hero { min-height: 0; padding: 0 0 14px; }\n.dsh-partner-memory-page h3, .dsh-partner-memory-page h4 { margin: 0; font: 600 15px/1.5 var(--partner-font-family); }\n.dsh-partner-memory-page p { margin: 0; }\n.dsh-partner-memory-page :where(button, input, select), .dsh-partner-memory-settings :where(button, input, select) { font-family: var(--partner-font-family); }\n.dsh-partner-memory-page :where(button:not(.dsh-partner-concern-row)), .dsh-partner-memory-actions > button { display: inline-flex; align-items: center; justify-content: center; gap: 7px; min-height: 36px; padding: 7px 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-body); line-height: 1.4; cursor: pointer; box-shadow: none; }\n.dsh-partner-memory-page :where(button:not(.dsh-partner-concern-row)):hover:not(:disabled), .dsh-partner-memory-actions > button:hover:not(:disabled) { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-memory-page :where(button:not(.dsh-partner-concern-row)):disabled { opacity: .5; cursor: default; }\n.dsh-partner-memory-page :where(button, input, select, summary):focus-visible, .dsh-partner-memory-settings :where(button, input, select, summary):focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 3px; }\n.dsh-partner-memory-page :where(input, select) { min-width: 0; min-height: 38px; max-width: 100%; padding: 8px 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); background-color: var(--partner-control); font-size: var(--partner-font-body); }\n.dsh-partner-memory-page :where(small, time), .dsh-partner-memory-hint { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); }\n.dsh-partner-memory-context, .dsh-partner-memory-status { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; min-width: 0; }\n.dsh-partner-memory-context > label { display: flex; gap: 10px; align-items: center; min-width: 0; }\n.dsh-partner-memory-context > label > span { white-space: nowrap; color: var(--partner-text-secondary); }\n.dsh-partner-memory-context select { width: clamp(140px, 22vw, 260px); }\n.dsh-partner-memory-context > button, .dsh-partner-memory-status > button { margin-left: auto; }\n.dsh-partner-memory-badge { display: inline-flex; align-items: center; flex: none; padding: 3px 8px; border: 1px solid var(--partner-border); border-radius: 6px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); white-space: nowrap; }\n.dsh-partner-memory-library-v2 { display: grid; gap: 16px; min-width: 0; }\n.dsh-partner-memory-nav { display: flex; gap: 4px; align-items: center; min-width: 0; padding-bottom: 10px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-memory-nav > button { border-color: transparent; background: transparent; }\n.dsh-partner-memory-nav > button[aria-pressed=\"true\"], .dsh-partner-memory-segment > button[aria-pressed=\"true\"] { color: var(--partner-text); background: var(--partner-hover); border-color: var(--partner-border); }\n.dsh-partner-memory-more { position: relative; margin-left: auto; }\n.dsh-partner-memory-more > summary { display: flex; align-items: center; gap: 8px; min-height: 36px; padding: 6px 10px; border-radius: 9px; cursor: pointer; list-style: none; color: var(--partner-text-secondary); }\n.dsh-partner-memory-more > summary::-webkit-details-marker { display: none; }\n.dsh-partner-memory-more[open] > summary, .dsh-partner-memory-more > summary:hover { background: var(--partner-hover); color: var(--partner-text); }\n.dsh-partner-memory-more > div { position: absolute; right: 0; top: calc(100% + 6px); z-index: 12; display: grid; gap: 3px; width: 188px; padding: 6px; border: 1px solid var(--partner-border); border-radius: 12px; background: var(--partner-solid-panel); box-shadow: 0 6px 18px color-mix(in srgb, var(--partner-text) 10%, transparent); }\n.dsh-partner-memory-more > div > button { justify-content: flex-start; border-color: transparent; background: transparent; }\n.dsh-partner-memory-more > div > button > small { margin-left: auto; }\n.dsh-partner-memory-toolbar { display: flex; gap: 8px; flex-wrap: wrap; min-width: 0; }\n.dsh-partner-memory-toolbar > label { min-width: 0; }\n.dsh-partner-memory-search { flex: 1 1 200px; }\n.dsh-partner-memory-search input { width: 100%; }\n.dsh-partner-memory-segment { display: flex; gap: 6px; flex-wrap: wrap; }\n.dsh-partner-memory-segment > button { min-height: 32px; padding: 5px 10px; border-color: transparent; background: transparent; }\n.dsh-partner-memory-rows { display: grid; min-width: 0; border: 1px solid var(--partner-border); border-radius: 12px; overflow: hidden; background: var(--partner-raised); }\n.dsh-partner-memory-rows:empty { display: none; }\n.dsh-partner-memory-page button.dsh-partner-memory-row { display: flex; align-items: center; justify-content: space-between; gap: 14px; width: 100%; min-width: 0; padding: 14px 16px; border: 0; border-radius: 0; text-align: left; background: transparent; }\n.dsh-partner-memory-page button.dsh-partner-memory-row + button.dsh-partner-memory-row { border-top: 1px solid var(--partner-border); }\n.dsh-partner-memory-row > span:first-child { flex: 1; min-width: 0; }\n.dsh-partner-memory-row strong { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--partner-text); font-weight: 580; }\n.dsh-partner-memory-row p { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; margin: 4px 0; color: var(--partner-text-secondary); overflow-wrap: anywhere; }\n.dsh-partner-memory-profile { display: grid; gap: 22px; }\n.dsh-partner-memory-profile > header { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px; }\n.dsh-partner-memory-profile > section { display: grid; gap: 10px; }\n.dsh-partner-memory-records { display: grid; gap: 12px; min-width: 0; }\n.dsh-partner-memory-record, .dsh-partner-memory-jobs { min-width: 0; border: 1px solid var(--partner-border); border-radius: 12px; background: var(--partner-raised); }\n.dsh-partner-memory-record > summary, .dsh-partner-memory-jobs > summary { padding: 12px 14px; cursor: pointer; overflow-wrap: anywhere; }\n.dsh-partner-memory-record > summary > strong { font-weight: 550; }\n.dsh-partner-memory-record > summary > time { margin-right: 12px; }\n.dsh-partner-memory-record > summary > small, .dsh-partner-memory-jobs > summary > small { margin-left: 10px; }\n.dsh-partner-memory-record > div, .dsh-partner-memory-jobs > div { display: grid; gap: 12px; padding: 0 16px 16px; min-width: 0; }\n.dsh-partner-memory-record :where(p, blockquote), .dsh-partner-memory-procedure { white-space: pre-wrap; overflow-wrap: anywhere; font: var(--partner-font-body)/1.7 var(--partner-font-family); }\n.dsh-partner-memory-record blockquote { margin: 0; padding: 8px 12px; border-left: 2px solid var(--partner-border); }\n.dsh-partner-memory-jobs > div > div, .dsh-partner-memory-session { display: flex; justify-content: space-between; align-items: center; gap: 12px; }\n.dsh-partner-memory-session > span { display: grid; min-width: 0; }\n.dsh-partner-memory-settings { display: grid; gap: 16px; min-width: 0; }\n.dsh-partner-memory-settings .dsh-partner-automation { padding: 0; border: 0; background: transparent; box-shadow: none; }\n.dsh-partner-memory-settings .dsh-partner-automation-fields { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-memory-settings .dsh-partner-automation-fields.is-memory-model { grid-template-columns: minmax(0, 1fr); }\n.dsh-partner-memory-settings .dsh-partner-review-policy { flex-wrap: wrap; }\n.dsh-partner-memory-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; padding-top: 14px; }\n.dsh-partner-memory-page .dsh-partner-concern-board { margin: 0; }\n.dsh-partner-memory-page .dsh-partner-memory-nav svg, .dsh-partner-memory-more svg { flex-shrink: 0; }\n@media (max-width: 640px) {\n .dsh-partner-memory-page { gap: 14px; }\n .dsh-partner-memory-page :where(button, input, select), .dsh-partner-memory-settings :where(button, input, select) { min-height: 44px; }\n .dsh-partner-memory-page :where(input, select), .dsh-partner-memory-settings :where(input, select, textarea) { font-size: 16px; }\n .dsh-partner-memory-nav { gap: 2px; }\n .dsh-partner-memory-nav > button { padding-inline: 9px; gap: 5px; }\n .dsh-partner-memory-nav > button > svg { display: none; }\n .dsh-partner-memory-more > summary { min-height: 44px; padding-inline: 8px; }\n .dsh-partner-memory-context > label { flex: 1; }\n .dsh-partner-memory-context select { width: 100%; }\n .dsh-partner-memory-context > label > span { font-size: var(--partner-font-caption); }\n .dsh-partner-memory-context > .dsh-partner-memory-badge { order: 3; }\n .dsh-partner-memory-toolbar > .dsh-partner-memory-search { flex-basis: 100%; }\n .dsh-partner-memory-toolbar > label:not(.dsh-partner-memory-search) { flex: 1; }\n .dsh-partner-memory-toolbar select { width: 100%; }\n .dsh-partner-memory-page button.dsh-partner-memory-row { gap: 8px; padding: 12px; }\n .dsh-partner-memory-record > summary { line-height: 1.6; }\n .dsh-partner-memory-record > summary > time { display: block; }\n .dsh-partner-memory-settings .dsh-partner-automation-fields { grid-template-columns: minmax(0, 1fr); }\n}\n", "import {useRef, useState} from 'react'\nimport {IconRefreshOutline16} from '@deepseek-ai/dsh-client-ui-primitives'\nimport {api, type CompanionView, type PartnerSnapshot} from '../../client-api.js'\nimport {WorkspaceHero, WorkspaceNotice, CollectionEmpty, errorMessage} from '../workspace-components.js'\nimport {MemoryLibrary} from './memory-library.js'\nimport {AutomationSettings} from './automation-settings.js'\nimport {useMemoryResource} from './use-memory-resource.js'\nimport type {MemoryCollection, MemoryLayers} from './types.js'\nimport {MemoryJobFeedback} from './job-feedback.js'\n\nexport function MemoryPanel({companion, snapshot, openSession, startSession, renewSession, onChanged}: {\n companion: CompanionView; snapshot: PartnerSnapshot; openSession(routeId: string, sessionId: string): Promise<void>;\n startSession(companionId: string): Promise<void>; renewSession(routeId: string): Promise<void>; onChanged(): Promise<void>\n}): JSX.Element {\n const sessions = snapshot.sessions.filter(item => item.companionId === companion.id).sort((a, b) => Number(b.kind === 'local') - Number(a.kind === 'local') || b.lastMessageAt - a.lastMessageAt)\n const [requestedScope, setScope] = useState('')\n const [settings, setSettings] = useState(false)\n const [busy, setBusy] = useState(false)\n const lock = useRef(false)\n const [error, setError] = useState<string>()\n const [notice, setNotice] = useState<string>()\n const base = `/companions/${encodeURIComponent(companion.id)}`\n const initialScope = sessions[0] ? `${sessions[0].channelId}:${sessions[0].userId}` : ''\n const requested = requestedScope || initialScope\n const collection = useMemoryResource<MemoryCollection>(`${base}/memory${requested ? `?${new URLSearchParams({scopeId: requested})}` : ''}`, 15_000)\n const scopeId = requested || collection.data?.profiles[0]?.scopeId || ''\n const layers = useMemoryResource<MemoryLayers>(scopeId ? `${base}/memory/layers?${new URLSearchParams({scopeId})}` : undefined, 15_000)\n const reload = async (): Promise<void> => {await Promise.all([collection.reload(), layers.reload()])}\n const run = async (action: () => Promise<void>, success: string): Promise<void> => {\n if (lock.current) return\n lock.current = true; setBusy(true); setError(undefined); setNotice(undefined)\n try {await action(); setNotice(success); await reload()}\n catch (reason) {setError(errorMessage(reason))}\n finally {lock.current = false; setBusy(false)}\n }\n const retries = layers.data?.retryCount ?? layers.data?.jobs.filter(job => job.status === 'retrying').length ?? 0\n const [showAllJobs,setShowAllJobs] = useState(false)\n const scopes = collection.data?.profiles ?? []\n return <div className=\"dsh-partner-memory-page\">\n <WorkspaceHero eyebrow=\"MEMORY & CONTEXT\" title=\"\u8BB0\u5FC6\u5E93\" detail=\"\u77E5\u9053\u8BB0\u4F4F\u4E86\u4EC0\u4E48\u3001\u4F9D\u636E\u662F\u4EC0\u4E48\uFF0C\u4E5F\u80FD\u7EA0\u6B63\u5DF2\u7ECF\u8FC7\u65F6\u7684\u7406\u89E3\u3002\" actions={<button type=\"button\" onClick={() => setSettings(true)}>\u8BB0\u5FC6\u8BBE\u7F6E</button>} />\n <div className=\"dsh-partner-memory-context\"><label><span>\u5F53\u524D\u8054\u7CFB\u4EBA</span><select aria-label=\"\u5F53\u524D\u8054\u7CFB\u4EBA\" value={scopeId} onChange={event => {setScope(event.target.value); setError(undefined); setNotice(undefined)}}>\n {!scopes.length && <option value={scopeId}>{scopeId ? '\u672C\u5730\u5BF9\u8BDD' : '\u6682\u65E0\u8054\u7CFB\u4EBA'}</option>}\n {scopes.map(profile => <option value={profile.scopeId} key={profile.scopeId}>{sessions.some(session => session.kind === 'local' && `${session.channelId}:${session.userId}` === profile.scopeId) ? '\u672C\u5730\u5BF9\u8BDD' : profile.label}</option>)}\n </select></label><span className=\"dsh-partner-memory-badge\">{companion.automation.memory.enabled ? '\u5B66\u4E60\u5DF2\u5F00\u542F' : '\u5B66\u4E60\u5DF2\u6682\u505C'}</span><button type=\"button\" aria-label=\"\u5237\u65B0\u8BB0\u5FC6\" disabled={collection.loading || layers.loading} onClick={() => {void reload()}}><IconRefreshOutline16 size={16} /></button></div>\n {(error || collection.error || layers.error) && <WorkspaceNotice>{error || collection.error || layers.error}</WorkspaceNotice>}{notice && <WorkspaceNotice kind=\"success\">{notice}</WorkspaceNotice>}\n {!!layers.data?.jobs.length && <details className=\"dsh-partner-memory-jobs\"><summary>{layers.data.jobCount ?? layers.data.jobs.length} \u9879\u5C1A\u672A\u6574\u7406 \u00B7 {retries} \u9879\u5931\u8D25\u91CD\u8BD5<small>\u539F\u59CB\u5BF9\u8BDD\u5DF2\u4FDD\u5B58\uFF0C\u4E0D\u5F71\u54CD\u7EE7\u7EED\u804A\u5929</small></summary><div>{layers.data.jobs.slice(0, showAllJobs ? 100 : 10).map(job => <div key={job.id}><span>{job.at && <small>{new Date(job.at).toLocaleString()}</small>}{job.status === 'processing' ? '\u6B63\u5728\u6574\u7406' : job.status === 'retrying' ? `\u5DF2\u5931\u8D25 ${job.attempts} \u6B21 \u00B7 \u4E0B\u6B21 ${new Date(job.nextAt).toLocaleTimeString()}` : '\u7B49\u5F85\u6267\u884C\uFF0C\u65E0\u9700\u91CD\u590D\u63D0\u4EA4'}<MemoryJobFeedback status={job.status} {...(job.error ? {error:job.error} : {})} />{job.attempts >= 3 && job.status === 'retrying' && <small>\u9000\u907F\u671F\u95F4\u5141\u8BB8\u540E\u7EED\u4EFB\u52A1\u7EE7\u7EED\u6574\u7406</small>}</span>{job.status === 'retrying' && <button type=\"button\" disabled={busy} onClick={() => {void run(async () => {await api(`${base}/memory/jobs/${encodeURIComponent(job.id)}?${new URLSearchParams({scopeId})}`, {method: 'POST'})}, '\u5DF2\u5B89\u6392\u91CD\u8BD5\uFF0C\u5F53\u524D\u6267\u884C\u7ED3\u675F\u540E\u5904\u7406')}}>\u91CD\u65B0\u6392\u961F</button>}</div>)}{layers.data.jobs.length>10 && <button type=\"button\" onClick={()=>setShowAllJobs(!showAllJobs)}>{showAllJobs?'\u6536\u8D77':'\u663E\u793A\u66F4\u591A\u4EFB\u52A1'}</button>}{(layers.data.jobCount ?? 0)>100 && <p>\u4EC5\u5C55\u793A\u6700\u65E9100\u9879\uFF0C\u5B8C\u6210\u540E\u81EA\u52A8\u8865\u5145\u540E\u7EED\u4EFB\u52A1\u3002</p>}</div></details>}\n {!collection.data ? <CollectionEmpty title={collection.error ? '\u8BB0\u5FC6\u8BFB\u53D6\u5931\u8D25' : '\u6B63\u5728\u8BFB\u53D6\u8BB0\u5FC6'} action={collection.error ? <button type=\"button\" onClick={() => {void reload()}}>\u91CD\u8BD5</button> : undefined} /> : <MemoryLibrary key={scopeId} companionId={companion.id} scopeId={scopeId} collection={collection.data} layers={layers.data} changed={reload} />}\n <details className=\"dsh-partner-memory-record is-sessions\"><summary>\u4F19\u4F34\u4F1A\u8BDD <small>{sessions.length}</small></summary><div>{sessions.map(session => <div className=\"dsh-partner-memory-session\" key={session.id}><span><strong>{session.kind === 'local' ? '\u672C\u5730\u5BF9\u8BDD' : `\u6E20\u9053\u8054\u7CFB\u4EBA \u00B7 ${session.userId.slice(-6)}`}</strong><small>{session.archived ? '\u5DF2\u5F52\u6863' : '\u53EF\u7EE7\u7EED\u5BF9\u8BDD'}</small></span><button type=\"button\" disabled={busy} onClick={() => {void run(() => session.archived ? renewSession(session.id) : openSession(session.id, session.sessionId), session.archived ? '\u65B0\u4F1A\u8BDD\u5DF2\u521B\u5EFA' : '\u4F1A\u8BDD\u5DF2\u6253\u5F00')}}>{session.archived ? '\u65B0\u5EFA\u4F1A\u8BDD' : '\u6253\u5F00\u4F1A\u8BDD'}</button></div>)}{!sessions.length && <button type=\"button\" disabled={busy} onClick={() => {void run(() => startSession(companion.id), '\u4F1A\u8BDD\u5DF2\u521B\u5EFA')}}>\u5F00\u59CB\u5BF9\u8BDD</button>}</div></details>\n {settings && <AutomationSettings companion={companion} kind=\"memory\" close={() => setSettings(false)} onChanged={async () => {await onChanged(); await reload()}} />}\n </div>\n}\n", "export const PARTNER_API = '/partner-local/v1'\n\nexport type { CompanionCapability as Capability } from './capabilities.js'\nimport type { CompanionCapability as Capability } from './capabilities.js'\nexport interface AutomationView {\n memory: { enabled: boolean; retentionDays: number; provider?: string; model?: string; dailyReviewEnabled: boolean; dailyReviewHour: number }\n heartbeat: { enabled: boolean; intervalMinutes: number; quietStartHour: number; quietEndHour: number; dailyLimit: number }\n}\nexport interface CompanionView {\n notificationDelivery?: { mode: 'recent' | 'selected'; targets: {channelId: string; userId: string}[] }\n id: string; name: string; role: string; description: string; instructions: string\n presetId?: string; provider?: string; model?: string; capabilities: Capability[]\n createdAt: number; updatedAt: number\n automation: AutomationView\n}\nexport interface ChannelView {\n platform?: 'weixin' | 'matrix' | 'mattermost'\n direct?: { baseUrl: string; targetId: string; peerId: string }\n id: string; companionId: string; accountId: string; name: string; enabled: boolean\n createdAt: number; updatedAt: number; runtimeStatus: 'stopped' | 'starting' | 'running' | 'error'\n lastError?: string; credentialConfigured: boolean\n}\nexport interface PairingView {\n directTargetId?: string\n pairingCode?: string\n contactKey?: string\n deliveryTarget?: {channelId: string; userId: string}\n id: string; channelId: string; userId: string; displayName: string\n status: 'pending' | 'approved' | 'blocked'; createdAt: number; updatedAt: number\n}\nexport interface ChannelSessionView {\n id: string; kind: 'local' | 'channel'; channelId: string; userId: string; companionId: string; sessionId: string; cwd?: string; lastMessageAt: number; archived: boolean\n}\nexport interface HeartbeatStateView {\n companionId: string; lastCheckedAt?: number; lastSentAt?: number; nextCheckAt: number\n sentDay: string; sentCount: number; consecutiveFailures: number; lastError?: string\n}\nexport type MemoryKindView = 'profile' | 'preference' | 'task' | 'event' | 'relationship' | 'emotion'\nexport interface MemoryEvidenceView { turnId: string; at: number; excerpt: string }\nexport interface MemoryView { id: string; scopeId: string; kind: MemoryKindView; subject: string; content: string; status: 'active' | 'completed' | 'superseded' | 'expired'; confidence: number; importance: number; updatedAt: number; locked?: boolean; evidence: MemoryEvidenceView[] }\nexport interface UserProfileSnapshotView { scopeId: string; label: string; version: string; updatedAt?: number; entries: MemoryView[]; preferences?: MemoryView[]; evidenceCount: number; lockedCount: number }\nexport interface MemoryRelationView { id: string; scopeId: string; sourceMemoryId: string; targetMemoryId: string; kind: 'supports' | 'depends_on' | 'about' | 'conflicts_with' | 'follows'; label: string; confidence: number; updatedAt: number }\nexport interface MemoryGraphView { memories: MemoryView[]; relations: MemoryRelationView[] }\nexport interface DailyReflectionView { scopeId: string; date: string; summary: string; events: string[]; openTasks: string[]; completedTasks: string[]; learnings: string[]; updatedAt: number; turnCount: number }\nexport interface ConcernView {\n recordingPending?: boolean\n recordTarget?: ConcernRecordTargetView\n id: string; subject: string; reason: string; origin: 'explicit' | 'implicit'; state: 'active' | 'watching' | 'snoozed' | 'resolved' | 'archived'\n priority: number; confidence: number; score: number; watchKind: 'auto' | 'knowledge' | 'workspace' | 'web'; updatedAt: number; nextCheckAt: number; lastCheckedAt?: number\n resources: Array<{ kind: 'file' | 'knowledge'; locator: string; label: string }>\n}\nexport interface ConcernRecordTargetView { kind: 'file' | 'note'; locator: string; label: string }\nexport interface ConcernObservationView {\n id: string; concernId: string; event: string; evidence: string; source: string; interruptScore: number\n decision: 'drop' | 'remember' | 'defer' | 'feed' | 'notify'; notificationRuleEffect: 'auto' | 'notify' | 'suppress'\n notificationRuleReason: string; decisionReason: string; createdAt: number; mentionedAt?: number\n}\nexport interface ConcernActivityView { concerns: ConcernView[]; observations: ConcernObservationView[] }\nexport interface ConcernSourceView { kind: 'file' | 'knowledge'; label: string; detail: string; token: string }\nexport interface PresetView { id: string; name: string; broken?: string }\nexport interface ModelCatalogView { providers: Array<{ id: string; name: string; models: Array<{ id: string; name: string }> }>; defaultSelection: { provider: string; model: string } }\nexport interface PartnerSnapshot {\n companions: CompanionView[]; channels: ChannelView[]; pairings: PairingView[]; sessions: ChannelSessionView[]; heartbeatStates: HeartbeatStateView[]; presets: PresetView[]\n}\nexport interface LoginView {\n id: string; companionId: string; phase: 'waiting' | 'scanned' | 'confirmed' | 'expired' | 'error'\n qrContent?: string; accountId?: string; baseUrl?: string; error?: string; expiresAt: number\n}\n\nexport interface SkillView {\n id: string; name: string; displayName: string; description: string; version: string\n source: 'builtin' | 'market' | 'local'; sourceId?: string; executionContext: 'inline' | 'fork'; trusted: boolean; updatedAt: number\n}\nexport interface SkillBindingView { companionId: string; skillId: string; enabled: boolean }\nexport interface SkillMarketSourceView { id: string; name: string; kind: 'dsh-index' | 'clawhub' | 'loophub' | 'skillhub'; indexUrl: string; enabled: boolean; trusted: boolean; builtin?: boolean }\nexport interface MarketSkillView { id: string; name: string; description: string; version: string; tags: string[]; sourceId: string }\nexport interface SkillCatalogView { installed: SkillView[]; bindings: SkillBindingView[]; sources: SkillMarketSourceView[] }\nexport interface SkillMarketView { sources: SkillMarketSourceView[]; entries: MarketSkillView[]; errors: Array<{ sourceId: string; error: string }> }\nexport interface SkillMarketNetworkView { proxyUrl?: string }\nexport interface SkillMarketNetworkTestView { ok: true; latencyMs: number; sourceCount: number; entryCount: number }\n\nexport type BoardTaskStatusView = 'backlog' | 'ready' | 'doing' | 'review' | 'done' | 'blocked'\nexport interface BoardTaskView {\n acceptanceCriteria?: string[]; resourceKeys?: string[]\n evidence?: import('./tasks/contract.js').TaskEvidence[]; reviewChecks?: import('./tasks/contract.js').TaskReviewCheck[]\n previousAttempt?: { reviewChecks?: import('./tasks/contract.js').TaskReviewCheck[] }\n scheduling?: import('./tasks/scheduling.js').TaskScheduling\n requirementId?: string\n autoRun?: boolean\n id: string; title: string; description: string; status: BoardTaskStatusView; priority: 'low' | 'normal' | 'high' | 'urgent'\n assigneeCompanionId?: string; reviewerCompanionId?: string; createdBy: 'user' | 'companion' | 'schedule'; revision: number; createdAt: number; updatedAt: number; completedAt?: number\n skillIds: string[]; dependencyTaskIds: string[]; resultAbstract?: string; resultSummary?: string; reviewHandoff?: string; reviewSummary?: string; dueAt?: number\n}\nexport interface TaskActivityView { id: string; taskId: string; actor: 'user' | 'companion' | 'schedule' | 'system'; actorCompanionId?: string; kind: string; message: string; at: number }\nexport type { BoardRequirement as RequirementView } from './requirements/domain.js'\nexport interface TaskBoardView { tasks: BoardTaskView[]; activities: TaskActivityView[]; requirements?: import('./requirements/domain.js').BoardRequirement[] }\nexport interface PartnerDirectoryEntryView { id: string; name: string; role: string; description: string; capabilities: string[]; enabledSkills: Array<{ id: string; name: string }>; availability: 'available' | 'busy' | 'offline' }\nexport interface PartnerDelegationView {\n id: string; kind?: 'task' | 'review'; taskId: string; toCompanionId: string; status: 'queued' | 'running' | 'completed' | 'failed' | 'canceled'\n attempts?: number; nextAttemptAt?: number; lastAttemptAt?: number; error?: string; createdAt: number\n}\nexport interface CompanionAccessView { targetIds: string[]; companions: PartnerDirectoryEntryView[] }\n\nexport interface ScheduledTaskView {\n id: string; companionId: string; title: string; prompt: string\n schedule: { kind: 'interval'; minutes: number } | { kind: 'daily'; hour: number; minute: number }\n enabled: boolean; destroySessionAfterRun: boolean; overlapPolicy: 'skip' | 'queue'; timeoutMinutes: number\n nextRunAt: number; lastRunAt?: number; lastRunStatus?: 'completed' | 'failed' | 'skipped'; createdAt: number; updatedAt: number\n}\nexport interface ExecutionRunView { id: string; kind: 'schedule' | 'delegation' | 'review' | 'skill' | 'observation'; ownerCompanionId: string; sessionId: string; sourceId: string; status: string; destroyAfterRun: boolean; startedAt: number; completedAt?: number; outputSummary?: string; error?: string }\n\nexport async function api<T>(path = '', init: RequestInit = {}): Promise<T> {\n const method = init.method ?? 'GET'\n const response = await fetch(`${PARTNER_API}${path}`, {\n ...init,\n headers: {\n Accept: 'application/json',\n ...(method === 'GET' ? {} : { 'Content-Type': 'application/json', 'X-DSH-Partner-Request': '1' }),\n ...init.headers,\n },\n })\n if (response.status === 204) return undefined as T\n const body = await response.json().catch(() => ({})) as Record<string, unknown>\n if (!response.ok) throw new Error(typeof body.error === 'string' ? body.error : `HTTP ${response.status}`)\n return body as T\n}\n\nexport function loadPartner(): Promise<PartnerSnapshot> { return api() }\n", "import { useEffect, useId, useRef, type KeyboardEvent, type ReactNode } from 'react'\nimport { IconAgentPresetOutline16, IconCloseOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\n\nexport function WorkspaceHero({ eyebrow, title, detail, actions }: { eyebrow: string; title: string; detail: string; actions?: ReactNode }): JSX.Element {\n return <header className=\"dsh-partner-feature-hero\">\n <span><small>{eyebrow}</small><h2>{title}</h2><p>{detail}</p></span>\n {actions && <div className=\"dsh-partner-feature-hero-actions\">{actions}</div>}\n </header>\n}\n\nexport function WorkspaceBlock({ title, detail, actions, children, className = '' }: { title: string; detail?: string; actions?: ReactNode; children: ReactNode; className?: string }): JSX.Element {\n return <section className={`dsh-partner-feature-block${className ? ` ${className}` : ''}`}>\n <header><span><strong>{title}</strong>{detail && <small>{detail}</small>}</span>{actions && <div>{actions}</div>}</header>\n {children}\n </section>\n}\n\nexport function WorkspaceDialog({ eyebrow = 'CREATE & CONFIGURE', title, detail, close, children, width = 'regular' }: { eyebrow?: string; title: string; detail: string; close(): void; children: ReactNode; width?: 'regular' | 'wide' }): JSX.Element {\n const titleId = useId()\n const detailId = useId()\n const panelRef = useRef<HTMLDialogElement>(null)\n useEffect(() => {\n const previous = document.activeElement instanceof HTMLElement ? document.activeElement : undefined\n const frame = requestAnimationFrame(() => {\n const panel = panelRef.current\n const target = panel?.querySelector<HTMLElement>('[autofocus]') ?? panel?.querySelector<HTMLElement>('input, textarea, select, button')\n target?.focus()\n })\n return () => { cancelAnimationFrame(frame); previous?.focus() }\n }, [])\n const keyDown = (event: KeyboardEvent<HTMLElement>): void => {\n if (event.key === 'Escape') { event.preventDefault(); close(); return }\n if (event.key !== 'Tab') return\n const focusable = [...(panelRef.current?.querySelectorAll<HTMLElement>('button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), summary, [tabindex]:not([tabindex=\"-1\"])') ?? [])].filter(node => node.getClientRects().length > 0)\n if (focusable.length === 0) return\n const first = focusable[0]; const last = focusable.at(-1)\n if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last?.focus() }\n else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first?.focus() }\n }\n return <div className=\"dsh-partner-workspace-dialog-layer\" onPointerDown={event => { if (event.target === event.currentTarget) close() }}>\n <dialog ref={panelRef} className={`dsh-partner-workspace-dialog is-${width}`} open aria-modal=\"true\" aria-labelledby={titleId} aria-describedby={detailId} onKeyDown={keyDown}>\n <header><span><small>{eyebrow}</small><strong id={titleId}>{title}</strong><p id={detailId}>{detail}</p></span><button type=\"button\" onClick={close} aria-label=\"\u5173\u95ED\"><IconCloseOutline16 size={16} /></button></header>\n <div className=\"dsh-partner-workspace-dialog-body\">{children}</div>\n </dialog>\n </div>\n}\n\nexport function WorkspaceNotice({ children, kind = 'error' }: { children: ReactNode; kind?: 'error' | 'warning' | 'success' }): JSX.Element {\n return <p className={`dsh-partner-workspace-notice is-${kind}`} role={kind === 'error' ? 'alert' : 'status'}><i />{children}</p>\n}\n\nexport function CollectionEmpty({ title, detail, action }: { title: string; detail?: string; action?: ReactNode }): JSX.Element {\n return <div className=\"dsh-partner-collection-empty\"><span><IconAgentPresetOutline16 size={18} /></span><strong>{title}</strong>{detail && <p>{detail}</p>}{action}</div>\n}\n\nexport function CollectionSkeleton({ rows = 3 }: { rows?: number }): JSX.Element {\n return <div className=\"dsh-partner-collection-skeleton\" aria-label=\"\u6B63\u5728\u52A0\u8F7D\" aria-busy=\"true\">{Array.from({ length: rows }, (_, index) => <i key={index} />)}</div>\n}\n\nexport function CountLabel({ value, label }: { value: number; label: string }): JSX.Element {\n return <span className=\"dsh-partner-count-label\"><b>{value}</b>{label}</span>\n}\n\nexport function errorMessage(value: unknown): string { return value instanceof Error ? value.message : String(value) }\n", "import {useMemo, useRef, useState} from 'react'\nimport {IconDataOutline16, IconUserOutline16, IconBrowseOutline16, IconListPenOutline16, IconLinkOutline16} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type {MemoryView, MemoryGraphView} from '../../client-api.js'\nimport {CollectionEmpty, WorkspaceDialog, WorkspaceNotice} from '../workspace-components.js'\nimport {relativeTime} from '../partner-components.js'\nimport {MemoryDetail} from './memory-detail.js'\nimport {DailyReflectionDetail, memoryKind} from './memory-cards.js'\nimport {MemoryGraph} from './memory-graph.js'\nimport {HistoryView} from './history-view.js'\nimport {ExperienceView} from './experience-view.js'\nimport {useMemoryResource} from './use-memory-resource.js'\nimport {MEMORY_STATUS, type MemoryCollection, type MemoryLayers, type MemoryMode} from './types.js'\n\nexport function MemoryLibrary({companionId, scopeId, collection, layers, changed}: {companionId: string; scopeId: string; collection: MemoryCollection; layers: MemoryLayers | undefined; changed(): Promise<void>}): JSX.Element {\n const [mode, setMode] = useState<MemoryMode>('profile')\n const [query, setQuery] = useState('')\n const [status, setStatus] = useState<MemoryView['status'] | 'all'>('active')\n const [kind, setKind] = useState<MemoryView['kind'] | 'all'>('all')\n const [limit, setLimit] = useState(20)\n const [inspecting, setInspecting] = useState<MemoryView>()\n const [date, setDate] = useState<string>()\n const more = useRef<HTMLDetailsElement>(null)\n const base = `/companions/${encodeURIComponent(companionId)}`\n const graph = useMemoryResource<MemoryGraphView>(mode === 'graph' ? `${base}/memory/graph` : undefined)\n const normalized = query.trim().toLocaleLowerCase()\n const profile = collection.profiles.find(item => item.scopeId === scopeId)\n const filtered = useMemo(() => collection.memories.filter(item => item.scopeId === scopeId && (status === 'all' || item.status === status)\n && (kind === 'all' || item.kind === kind) && (!normalized || `${item.subject} ${item.content}`.toLocaleLowerCase().includes(normalized))), [collection.memories, scopeId, status, kind, normalized])\n const reflections = collection.reflections.filter(item => item.scopeId === scopeId && (!normalized || `${item.date} ${item.summary}`.toLocaleLowerCase().includes(normalized)))\n const selectedDay = reflections.find(item => item.date === date)\n const selectMode = (value: MemoryMode): void => {setMode(value); setQuery(''); setLimit(20); if (more.current) more.current.open = false}\n const row = (item: MemoryView) => <button type=\"button\" className=\"dsh-partner-memory-row\" key={item.id} onClick={() => setInspecting(item)}>\n <span className=\"dsh-partner-memory-row-copy\"><strong>{item.subject}</strong><p>{item.content}</p><small>{memoryKind(item.kind)} \u00B7 {item.locked ? '\u7528\u6237\u786E\u8BA4' : `${Math.round(item.confidence * 100)}% \u53EF\u4FE1`} \u00B7 {relativeTime(item.updatedAt)}</small></span>\n <span className=\"dsh-partner-memory-badge\" data-status={item.status}>{MEMORY_STATUS[item.status]}</span>\n </button>\n return <section className=\"dsh-partner-memory-library-v2\">\n <nav className=\"dsh-partner-memory-nav\" aria-label=\"\u8BB0\u5FC6\u5185\u5BB9\">\n <button type=\"button\" aria-pressed={mode === 'profile'} onClick={() => selectMode('profile')}><IconUserOutline16 size={16} />\u753B\u50CF</button>\n <button type=\"button\" aria-pressed={mode === 'memory' || mode === 'scenes'} onClick={() => selectMode('memory')}><IconDataOutline16 size={16} />\u8BB0\u5FC6</button>\n <button type=\"button\" aria-pressed={mode === 'reflection' || mode === 'history'} onClick={() => selectMode('reflection')}><IconBrowseOutline16 size={16} />\u56DE\u987E</button>\n <details className=\"dsh-partner-memory-more\" ref={more} onKeyDown={event => {if (event.key === 'Escape' && more.current) {more.current.open = false; more.current.querySelector('summary')?.focus()}}}>\n <summary aria-label=\"\u66F4\u591A\u8BB0\u5FC6\u5185\u5BB9\">{mode === 'experiences' ? '\u7ECF\u9A8C\u5BA1\u6838' : mode === 'graph' ? '\u5173\u7CFB\u56FE\u8C31' : '\u66F4\u591A'} <span aria-hidden=\"true\">\u22EF</span></summary>\n <div><button type=\"button\" onClick={() => selectMode('experiences')}><IconListPenOutline16 size={16} />\u7ECF\u9A8C\u5BA1\u6838 <small>{layers?.experiences.filter(item => item.status === 'draft').length ?? 0}</small></button><button type=\"button\" onClick={() => selectMode('graph')}><IconLinkOutline16 size={16} />\u5173\u7CFB\u56FE\u8C31</button></div>\n </details>\n </nav>\n {(mode === 'memory' || mode === 'scenes') && <div className=\"dsh-partner-memory-segment\" aria-label=\"\u8BB0\u5FC6\u89C6\u56FE\"><button type=\"button\" aria-pressed={mode === 'memory'} onClick={() => selectMode('memory')}>\u8BB0\u5FC6\u6761\u76EE</button><button type=\"button\" aria-pressed={mode === 'scenes'} onClick={() => selectMode('scenes')}>\u573A\u666F\u6458\u8981</button></div>}\n {(mode === 'reflection' || mode === 'history') && <div className=\"dsh-partner-memory-segment\" aria-label=\"\u56DE\u987E\u89C6\u56FE\"><button type=\"button\" aria-pressed={mode === 'reflection'} onClick={() => selectMode('reflection')}>\u6BCF\u65E5\u56DE\u987E</button><button type=\"button\" aria-pressed={mode === 'history'} onClick={() => selectMode('history')}>\u5BF9\u8BDD\u5386\u53F2</button></div>}\n {mode !== 'profile' && mode !== 'experiences' && <div className=\"dsh-partner-memory-toolbar\"><label className=\"dsh-partner-memory-search\"><span className=\"sr-only\">\u641C\u7D22\u5F53\u524D\u5185\u5BB9</span><input type=\"search\" placeholder={mode === 'history' ? '\u641C\u7D22\u5DF2\u52A0\u8F7D\u7684\u5386\u53F2' : '\u641C\u7D22\u5F53\u524D\u5185\u5BB9'} value={query} onChange={event => {setQuery(event.target.value); setLimit(20)}} /></label>{mode === 'memory' && <>\n <label><span className=\"sr-only\">\u8BB0\u5FC6\u72B6\u6001</span><select aria-label=\"\u8BB0\u5FC6\u72B6\u6001\" value={status} onChange={event => {setStatus(event.target.value as typeof status); setLimit(20)}}><option value=\"all\">\u5168\u90E8\u72B6\u6001</option>{Object.entries(MEMORY_STATUS).map(([value, label]) => <option key={value} value={value}>{label}</option>)}</select></label>\n <label><span className=\"sr-only\">\u8BB0\u5FC6\u7C7B\u578B</span><select aria-label=\"\u8BB0\u5FC6\u7C7B\u578B\" value={kind} onChange={event => {setKind(event.target.value as typeof kind); setLimit(20)}}><option value=\"all\">\u5168\u90E8\u7C7B\u578B</option>{(['profile', 'preference', 'task', 'event', 'relationship', 'emotion'] as const).map(value => <option key={value} value={value}>{memoryKind(value)}</option>)}</select></label>\n </>}</div>}\n {mode === 'profile' && <div className=\"dsh-partner-memory-profile\"><header><span><small>\u57FA\u4E8E\u6709\u6548\u8BB0\u5FC6\uFF0C\u800C\u4E0D\u662F\u731C\u6D4B</small><h3>\u4F19\u4F34\u5BF9\u4F60\u7684\u7406\u89E3</h3></span><small>{profile?.updatedAt ? `\u66F4\u65B0\u4E8E ${relativeTime(profile.updatedAt)}` : '\u7B49\u5F85\u53EF\u9760\u4F9D\u636E'}</small></header>\n <section><h4>\u660E\u786E\u4E8B\u5B9E</h4><div className=\"dsh-partner-memory-rows\">{profile?.entries.map(row)}</div>{!profile?.entries.length && <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u8DB3\u591F\u7684\u8EAB\u4EFD\u4E0E\u80CC\u666F\u4FE1\u606F\" detail=\"\u53EA\u6536\u5F55\u4F60\u660E\u786E\u8868\u8FBE\u7684\u4E8B\u5B9E\uFF0C\u4E0D\u63A8\u6D4B\u804C\u4E1A\u3001\u6027\u683C\u6216\u9690\u79C1\u3002\" />}</section>\n <section><h4>\u7A33\u5B9A\u534F\u4F5C\u504F\u597D</h4><div className=\"dsh-partner-memory-rows\">{profile?.preferences?.map(row)}</div>{!profile?.preferences?.length && <CollectionEmpty title=\"\u8FD8\u5728\u79EF\u7D2F\u7A33\u5B9A\u504F\u597D\" detail=\"\u53CD\u590D\u786E\u8BA4\u6216\u624B\u52A8\u9501\u5B9A\u7684\u53EF\u9760\u504F\u597D\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002\" />}</section>\n {profile && <p className=\"dsh-partner-memory-hint\">{profile.evidenceCount} \u5904\u5BF9\u8BDD\u4F9D\u636E \u00B7 {profile.lockedCount} \u9879\u7528\u6237\u786E\u8BA4 <span title={profile.version}>\u00B7 \u753B\u50CF\u7248\u672C {profile.version.slice(0, 8)}</span></p>}\n </div>}\n {mode === 'memory' && <><p className=\"dsh-partner-memory-hint\">\u5F53\u524D\u8054\u7CFB\u4EBA\u6700\u8FD1 100 \u6761\u4E2D\uFF0C\u5339\u914D {filtered.length} \u6761\u3002\u70B9\u51FB\u6761\u76EE\u67E5\u770B\u4F9D\u636E\u6216\u4FEE\u6B63\u3002</p><div className=\"dsh-partner-memory-rows\">{filtered.slice(0, limit).map(row)}</div>{!filtered.length && <CollectionEmpty title=\"\u6CA1\u6709\u5339\u914D\u7684\u8BB0\u5FC6\" detail=\"\u53EF\u4EE5\u5207\u6362\u72B6\u6001\u67E5\u770B\u5DF2\u5B8C\u6210\u3001\u8FC7\u671F\u6216\u88AB\u66FF\u4EE3\u7684\u5185\u5BB9\u3002\" />}{filtered.length > limit && <button type=\"button\" onClick={() => setLimit(value => value + 20)}>\u518D\u663E\u793A 20 \u6761</button>}</>}\n {mode === 'scenes' && <><p className=\"dsh-partner-memory-hint\">\u6458\u8981\u5F15\u7528\u5F53\u524D\u6709\u6548\u8BB0\u5FC6\uFF0C\u539F\u8BB0\u5FC6\u4FEE\u6B63\u540E\u540C\u6B65\u53D8\u5316\u3002\u6BCF\u65E5\u7EC8\u5BA1\u65F6\u6574\u7406\u3002</p>{layers?.scenes.filter(scene => !normalized || `${scene.title} ${scene.summary}`.toLocaleLowerCase().includes(normalized)).map(scene => <details className=\"dsh-partner-memory-record\" key={scene.id}><summary><strong>{scene.title}</strong><small>{scene.memoryIds.length} \u6761\u4F9D\u636E</small></summary><div><p>{scene.summary}</p><small>{relativeTime(scene.updatedAt)}</small></div></details>)}{!layers?.scenes.some(scene => !normalized || (scene.title + ' ' + scene.summary).toLocaleLowerCase().includes(normalized)) && <CollectionEmpty title={normalized ? \"\u6CA1\u6709\u5339\u914D\u7684\u573A\u666F\u6458\u8981\" : \"\u8FD8\u6CA1\u6709\u573A\u666F\u6458\u8981\"} detail=\"\u5F00\u542F\u6BCF\u65E5\u7EC8\u5BA1\u540E\uFF0C\u4F1A\u9010\u6B65\u5C06\u76F8\u5173\u7684\u6709\u6548\u8BB0\u5FC6\u7EC4\u7EC7\u5728\u4E00\u8D77\u3002\" />}</>}\n {mode === 'reflection' && <><div className=\"dsh-partner-memory-rows\">{reflections.map(day => <button className=\"dsh-partner-memory-row\" type=\"button\" key={`${day.scopeId}:${day.date}`} onClick={() => setDate(day.date)}><span><strong>{day.date}</strong><p>{day.summary}</p><small>{day.turnCount} \u8F6E\u4EA4\u6D41 \u00B7 {day.completedTasks.length} \u9879\u5B8C\u6210</small></span><small>\u67E5\u770B</small></button>)}</div>{!reflections.length && <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u5339\u914D\u7684\u56DE\u987E\" detail=\"\u5B66\u4E60\u5F00\u542F\u540E\uFF0C\u5728\u540E\u53F0\u5B8C\u6210\u63D0\u70BC\u65F6\u66F4\u65B0\u3002\" />}</>}\n {mode === 'history' && <HistoryView key={scopeId} base={base} scopeId={scopeId} query={normalized} />}\n {mode === 'experiences' && <ExperienceView items={layers?.experiences ?? []} base={base} scopeId={scopeId} changed={changed} />}\n {mode === 'graph' && <>{graph.error && <WorkspaceNotice>{graph.error} <button type=\"button\" onClick={() => {void graph.reload()}}>\u91CD\u8BD5</button></WorkspaceNotice>}{graph.data ? <MemoryGraph graph={{memories: graph.data.memories.filter(item => item.scopeId === scopeId), relations: graph.data.relations.filter(item => item.scopeId === scopeId)}} profiles={collection.profiles.filter(item => item.scopeId === scopeId)} query={normalized} inspect={setInspecting} /> : !graph.error && <CollectionEmpty title=\"\u6B63\u5728\u8BFB\u53D6\u5173\u7CFB\u56FE\u8C31\" />}</>}\n {inspecting && <MemoryDetail key={inspecting.id} companionId={companionId} item={inspecting} close={() => setInspecting(undefined)} changed={changed} />}\n {selectedDay && <WorkspaceDialog title={`${selectedDay.date} \u6BCF\u65E5\u56DE\u987E`} detail=\"\u8FC7\u7A0B\u8BB0\u5F55\u4E0E\u5F53\u65E5\u603B\u7ED3\uFF0C\u4E0D\u76F4\u63A5\u4F5C\u4E3A\u957F\u671F\u4E8B\u5B9E\u3002\" close={() => setDate(undefined)}><DailyReflectionDetail entry={selectedDay} /></WorkspaceDialog>}\n </section>\n}\n", "import type { ReactNode } from 'react'\nimport { IconAgentPresetOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { ChannelView } from '../client-api.js'\n\nexport function ChannelStatus({ channel }: { channel: ChannelView | undefined }): JSX.Element {\n const status = channel?.runtimeStatus ?? 'unbound'\n return <span className={`dsh-partner-status is-${status}`}><i />{channel ? channelStatusLabel(channel.runtimeStatus) : '\u672A\u8FDE\u63A5'}</span>\n}\n\nexport function Avatar({ name, small = false }: { name: string; small?: boolean }): JSX.Element {\n return <span className={`dsh-partner-avatar${small ? ' is-small' : ''}`} aria-hidden=\"true\">{[...name][0] ?? '\u4F34'}</span>\n}\n\nexport function WeixinGlyph({ large = false }: { large?: boolean }): JSX.Element {\n return <span className={`dsh-partner-weixin-glyph${large ? ' is-large' : ''}`} aria-hidden=\"true\"><i /><b /></span>\n}\n\nexport function TabButton({ active, onClick, icon, children }: { active: boolean; onClick(): void; icon: ReactNode; children: ReactNode }): JSX.Element {\n return <button type=\"button\" className={active ? 'is-active' : ''} aria-current={active ? 'page' : undefined} onClick={onClick}>{icon}<span>{children}</span></button>\n}\n\nexport function FormField({ label, hint, children }: { label: string; hint?: string; children: ReactNode }): JSX.Element {\n return <label className=\"dsh-partner-field\"><span><strong>{label}</strong>{hint && <small>{hint}</small>}</span>{children}</label>\n}\n\nexport function SectionHeading({ eyebrow, title, detail }: { eyebrow: string; title: string; detail: string }): JSX.Element {\n return <header className=\"dsh-partner-section\"><small>{eyebrow}</small><h2>{title}</h2><p>{detail}</p></header>\n}\n\nexport function ContentState({ title, detail, action, compact = false }: { title: string; detail?: string; action?: ReactNode; compact?: boolean }): JSX.Element {\n return <div className={`dsh-partner-state${compact ? ' is-compact' : ''}`}><IconAgentPresetOutline16 size={20} /><strong>{title}</strong>{detail && <p>{detail}</p>}{action}</div>\n}\n\nexport function relativeTime(value: number): string {\n const minutes = Math.floor((Date.now() - value) / 60_000)\n return minutes < 1 ? '\u521A\u521A' : minutes < 60 ? `${minutes} \u5206\u949F\u524D` : minutes < 1440 ? `${Math.floor(minutes / 60)} \u5C0F\u65F6\u524D` : `${Math.floor(minutes / 1440)} \u5929\u524D`\n}\n\nfunction channelStatusLabel(status: ChannelView['runtimeStatus']): string {\n return status === 'running' ? '\u5DF2\u8FDE\u63A5' : status === 'starting' ? '\u8FDE\u63A5\u4E2D' : status === 'error' ? '\u8FDE\u63A5\u5F02\u5E38' : '\u5DF2\u505C\u7528'\n}\n", "import {useRef, useState} from 'react'\nimport {api, type MemoryView} from '../../client-api.js'\nimport {WorkspaceDialog, WorkspaceNotice, errorMessage} from '../workspace-components.js'\nimport {MemoryCard} from './memory-cards.js'\nimport {MEMORY_STATUS} from './types.js'\n\nexport function MemoryDetail({companionId, item, close, changed}: {companionId: string; item: MemoryView; close(): void; changed(): Promise<void>}): JSX.Element {\n const [current, setCurrent] = useState(item)\n const [editing, setEditing] = useState<MemoryView>()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n const [notice, setNotice] = useState<string>()\n const lock = useRef(false)\n const run = async (remove = false): Promise<void> => {\n if (lock.current || (!remove && !editing)) return\n lock.current = true; setBusy(true); setError(undefined)\n try {\n const path = `/companions/${encodeURIComponent(companionId)}/memory/${encodeURIComponent(current.id)}`\n if (remove) {await api(path, {method: 'DELETE'}); close()}\n else {\n const updated = await api<MemoryView>(path, {method: 'PUT', body: JSON.stringify({subject: editing!.subject, content: editing!.content})})\n setCurrent(updated); setEditing(undefined); setNotice('\u4FEE\u6B63\u5DF2\u4FDD\u5B58\uFF0C\u5E76\u9501\u5B9A\u4E3A\u7528\u6237\u786E\u8BA4\u7684\u5185\u5BB9')\n }\n await changed()\n } catch (reason) {setError(errorMessage(reason))}\n finally {lock.current = false; setBusy(false)}\n }\n return <WorkspaceDialog title=\"\u8BB0\u5FC6\u8BE6\u60C5\" detail={`${MEMORY_STATUS[current.status]} \u00B7 \u4FEE\u6539\u540E\u7684\u5185\u5BB9\u4F1A\u4F18\u5148\u4FDD\u7559\uFF1B\u5220\u9664\u9700\u8981\u518D\u6B21\u786E\u8BA4\u3002`} close={() => {if (!busy) close()}}>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}{notice && <WorkspaceNotice kind=\"success\">{notice}</WorkspaceNotice>}\n <div className=\"dsh-partner-library-detail\"><MemoryCard key={current.id} item={current} editing={editing} busy={busy} setEditing={setEditing} save={() => {void run()}} remove={() => {void run(true)}} /></div>\n </WorkspaceDialog>\n}\n", "import {useState} from 'react'\nimport type {MemoryView, DailyReflectionView} from '../../client-api.js'\nimport {relativeTime} from '../partner-components.js'\nexport function DailyReflectionDetail({ entry }: { entry: DailyReflectionView }): JSX.Element {\n return <article className=\"dsh-partner-diary-detail\"><header><time>{entry.date}</time><strong>{entry.turnCount} \u8F6E\u4EA4\u6D41\u540E\u7684\u7406\u89E3</strong><small>\u66F4\u65B0\u4E8E {new Date(entry.updatedAt).toLocaleString()}</small></header><p>{entry.summary}</p><ReflectionGroup title=\"\u5F85\u8DDF\u8FDB\" items={entry.openTasks} /><ReflectionGroup title=\"\u5F53\u5929\u4E8B\u4EF6\" items={entry.events} /><ReflectionGroup title=\"\u65B0\u7406\u89E3\" items={entry.learnings} /><ReflectionGroup title=\"\u5DF2\u5B8C\u6210\" items={entry.completedTasks} /></article>\n}\n\nfunction ReflectionGroup({ title, items }: { title: string; items: string[] }): JSX.Element | null {\n if (items.length === 0) return null\n return <section><strong>{title}</strong><ul>{items.map(item => <li key={item}>{item}</li>)}</ul></section>\n}\n\nexport function MemoryCard({ item, editing, busy, setEditing, save, remove }: { item: MemoryView; editing: MemoryView | undefined; busy: boolean; setEditing(value?: MemoryView): void; save(): void; remove(): void }): JSX.Element {\n const [confirmingRemove, setConfirmingRemove] = useState(false)\n return <article data-kind={item.kind}>{editing ? <div className=\"dsh-partner-memory-editor\">\n <input aria-label=\"\u8BB0\u5FC6\u4E3B\u9898\" value={editing.subject} onChange={event => setEditing({ ...editing, subject: event.target.value })} />\n <textarea aria-label=\"\u8BB0\u5FC6\u5185\u5BB9\" value={editing.content} onChange={event => setEditing({ ...editing, content: event.target.value })} />\n <footer><button type=\"button\" onClick={() => setEditing(undefined)}>\u53D6\u6D88</button><button type=\"button\" className=\"is-primary\" disabled={busy || !editing.subject.trim() || !editing.content.trim()} onClick={save}>\u4FDD\u5B58\u4FEE\u6B63</button></footer>\n </div> : <>\n <header><span>{memoryKind(item.kind)}</span><div>{confirmingRemove ? <><button type=\"button\" onClick={() => setConfirmingRemove(false)}>\u53D6\u6D88</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={remove}>\u786E\u8BA4\u5220\u9664</button></> : <><button type=\"button\" onClick={() => setEditing({ ...item })}>\u7F16\u8F91</button><button type=\"button\" onClick={() => setConfirmingRemove(true)}>\u5220\u9664</button></>}</div></header>\n <strong>{item.subject}</strong><p>{item.content}</p>\n <footer><progress max={1} value={item.confidence} aria-label={`\u7F6E\u4FE1\u5EA6 ${Math.round(item.confidence * 100)}%`} /><small>{item.locked ? '\u624B\u52A8\u786E\u8BA4' : `${Math.round(item.confidence * 100)}% \u53EF\u4FE1`} \u00B7 {relativeTime(item.updatedAt)}</small></footer>\n {item.evidence.length > 0 && <details className=\"dsh-partner-memory-evidence\"><summary>\u67E5\u770B\u5BF9\u8BDD\u4F9D\u636E <b>{item.evidence.length}</b></summary><div>{[...item.evidence].reverse().map(evidence => <blockquote key={`${evidence.turnId}:${evidence.at}`}><p>{evidence.excerpt}</p><time>{new Date(evidence.at).toLocaleString()}</time></blockquote>)}</div></details>}\n </>}</article>\n}\n\nexport function memoryKind(value: MemoryView['kind']): string { return ({ profile: '\u753B\u50CF', preference: '\u504F\u597D', task: '\u4EFB\u52A1', event: '\u4E8B\u4EF6', relationship: '\u5173\u7CFB', emotion: '\u60C5\u7EEA\u4FE1\u53F7' })[value] }\n\n", "import type {MemoryView, DailyReflectionView, UserProfileSnapshotView} from '../../client-api.js'\nexport interface MemoryCollection {memories: MemoryView[]; reflections: DailyReflectionView[]; profiles: UserProfileSnapshotView[]}\nexport interface SceneView {id: string; title: string; summary: string; memoryIds: string[]; updatedAt: number}\nexport interface ExperienceView {id: string; title: string; steps: string[]; evidence: Array<{turnId: string; quote: string}>; version: string; status: 'draft' | 'approved' | 'rejected'; updatedAt: number}\nexport interface MemoryLayers {scenes: SceneView[]; experiences: ExperienceView[]; jobCount?: number; retryCount?: number; jobs: Array<{id: string; status: string; attempts: number; nextAt: number; at?: number; error?: string}>}\nexport interface HistoryTurn {id: string; at: number; user: string; assistant: string}\nexport type MemoryMode = 'profile' | 'memory' | 'reflection' | 'history' | 'scenes' | 'experiences' | 'graph'\nexport const MEMORY_STATUS: Record<MemoryView['status'], string> = {active: '\u6709\u6548', completed: '\u5DF2\u5B8C\u6210', superseded: '\u5DF2\u66FF\u4EE3', expired: '\u5DF2\u8FC7\u671F'}\n", "import {useState} from 'react'\nimport type {MemoryView, MemoryRelationView, MemoryGraphView, UserProfileSnapshotView} from '../../client-api.js'\nimport {ContentState as State} from '../partner-components.js'\nimport {memoryKind} from './memory-cards.js'\ntype RelationFilter = MemoryRelationView['kind'] | 'all'\nconst RELATION_FILTERS: RelationFilter[] = ['all', 'conflicts_with', 'depends_on', 'supports', 'follows', 'about']\n\nexport function MemoryGraph({ graph, profiles, query, inspect }: { graph: MemoryGraphView; profiles: UserProfileSnapshotView[]; query: string; inspect(item: MemoryView): void }): JSX.Element {\n const byId = new Map(graph.memories.map(item => [item.id, item]))\n const scopeIds = [...new Set(graph.relations.map(item => item.scopeId))]\n const [requestedScopeId, setRequestedScopeId] = useState<string>()\n const scopeId = scopeIds.includes(requestedScopeId ?? '') ? requestedScopeId! : scopeIds[0]\n const [filter, setFilter] = useState<RelationFilter>('all')\n const scoped = graph.relations.filter(item => item.scopeId === scopeId)\n const visible = scoped.filter(item => {\n if (filter !== 'all' && item.kind !== filter) return false\n const source = byId.get(item.sourceMemoryId); const target = byId.get(item.targetMemoryId)\n return !query || `${source?.subject ?? ''} ${source?.content ?? ''} ${target?.subject ?? ''} ${target?.content ?? ''} ${item.label}`.toLocaleLowerCase().includes(query)\n }).sort((left, right) => Number(right.kind === 'conflicts_with') - Number(left.kind === 'conflicts_with') || right.confidence - left.confidence)\n const [selectedRelationId, setSelectedRelationId] = useState<string>()\n const selected = visible.find(item => item.id === selectedRelationId) ?? visible[0]\n const source = selected ? byId.get(selected.sourceMemoryId) : undefined\n const target = selected ? byId.get(selected.targetMemoryId) : undefined\n const label = profiles.find(item => item.scopeId === scopeId)?.label ?? (scopeId ? `\u8054\u7CFB\u4EBA ${scopeId.slice(-6)}` : '\u5F53\u524D\u8054\u7CFB\u4EBA')\n const conflictCount = scoped.filter(item => item.kind === 'conflicts_with').length\n if (graph.relations.length === 0) return <State title=\"\u8FD8\u6CA1\u6709\u53EF\u9760\u5173\u7CFB\" detail=\"\u6BCF\u65E5\u7EC8\u5BA1\u53EA\u4F1A\u4FDD\u5B58\u6709\u660E\u786E\u8BC1\u636E\u7684\u8BB0\u5FC6\u8054\u7CFB\uFF0C\u4E0D\u4F1A\u4E3A\u4E86\u586B\u6EE1\u56FE\u8C31\u800C\u731C\u6D4B\u3002\" />\n return <div className=\"dsh-partner-graph-audit\">\n <header className=\"dsh-partner-graph-toolbar\"><span><small>\u5173\u7CFB\u5BA1\u8BA1</small><strong>{label} \u7684\u7406\u89E3\u5173\u7CFB</strong><p>{scoped.length} \u6761\u53EF\u9760\u8054\u7CFB{conflictCount > 0 ? `\uFF0C\u5176\u4E2D ${conflictCount} \u6761\u9700\u8981\u786E\u8BA4` : '\uFF0C\u6682\u65E0\u5F85\u786E\u8BA4\u51B2\u7A81'}</p></span>{scopeIds.length > 1 && <label><span>\u8054\u7CFB\u4EBA</span><select value={scopeId} onChange={event => { setRequestedScopeId(event.target.value); setSelectedRelationId(undefined) }}>{scopeIds.map(value => <option value={value} key={value}>{profiles.find(item => item.scopeId === value)?.label ?? `\u8054\u7CFB\u4EBA ${value.slice(-6)}`}</option>)}</select></label>}</header>\n <nav className=\"dsh-partner-graph-filters\" aria-label=\"\u5173\u7CFB\u7C7B\u578B\">{RELATION_FILTERS.map(value => { const count = value === 'all' ? scoped.length : scoped.filter(item => item.kind === value).length; return <button type=\"button\" key={value} className={filter === value ? 'is-active' : ''} aria-pressed={filter === value} onClick={() => { setFilter(value); setSelectedRelationId(undefined) }}>{value === 'all' ? '\u5168\u90E8' : relationLabel(value)} <b>{count}</b></button> })}</nav>\n <div className=\"dsh-partner-graph-browser\"><div className=\"dsh-partner-graph-index\" role=\"list\">{visible.length === 0 ? <State title=\"\u6CA1\u6709\u5339\u914D\u7684\u5173\u7CFB\" detail=\"\u8C03\u6574\u5173\u7CFB\u7C7B\u578B\u6216\u641C\u7D22\u5173\u952E\u8BCD\u540E\u518D\u8BD5\u3002\" compact /> : visible.map(item => { const from = byId.get(item.sourceMemoryId); const to = byId.get(item.targetMemoryId); return <button type=\"button\" role=\"listitem\" key={item.id} data-kind={item.kind} className={selected?.id === item.id ? 'is-active' : ''} onClick={() => setSelectedRelationId(item.id)}><span>{relationLabel(item.kind)}</span><strong>{from?.subject ?? '\u5DF2\u5220\u9664\u8BB0\u5FC6'} <i aria-hidden=\"true\">\u2192</i> {to?.subject ?? '\u5DF2\u5220\u9664\u8BB0\u5FC6'}</strong><p>{item.label}</p><small>{Math.round(item.confidence * 100)}% \u53EF\u4FE1</small></button> })}</div>\n <div className=\"dsh-partner-graph-stage\">{selected && source && target ? <article data-kind={selected.kind}><header><span>{relationLabel(selected.kind)}</span><strong>{source.subject} <i aria-hidden=\"true\">\u2192</i> {target.subject}</strong><p>{selected.label}</p><small>{relationGuidance(selected.kind)}</small></header><div className=\"dsh-partner-graph-pair\"><GraphMemory item={source} side=\"\u8D77\u70B9\" inspect={inspect} /><div aria-hidden=\"true\"><i /><span>{relationLabel(selected.kind)}</span><i /></div><GraphMemory item={target} side=\"\u5173\u8054\u9879\" inspect={inspect} /></div><footer><small>\u6700\u8FD1\u7EC8\u5BA1\u4E8E {new Date(selected.updatedAt).toLocaleString()}</small><strong>\u5173\u7CFB\u7F6E\u4FE1\u5EA6 {Math.round(selected.confidence * 100)}%</strong></footer></article> : <State title=\"\u9009\u62E9\u4E00\u6761\u5173\u7CFB\" detail=\"\u5173\u7CFB\u4E24\u7AEF\u7684\u8BB0\u5FC6\u4E0E\u4F7F\u7528\u65B9\u5F0F\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\" compact />}</div>\n </div>\n </div>\n}\n\nfunction GraphMemory({ item, side, inspect }: { item: MemoryView; side: string; inspect(item: MemoryView): void }): JSX.Element {\n return <section><header><small>{side} \u00B7 {memoryKind(item.kind)}</small><strong>{item.subject}</strong></header><p>{item.content}</p><button type=\"button\" onClick={() => inspect(item)}>\u67E5\u770B\u5E76\u4FEE\u6B63</button></section>\n}\n\nfunction relationLabel(kind: MemoryRelationView['kind']): string { return ({ supports: '\u652F\u6301', depends_on: '\u4F9D\u8D56', about: '\u5173\u4E8E', conflicts_with: '\u51B2\u7A81', follows: '\u540E\u7EED' })[kind] }\nfunction relationGuidance(kind: MemoryRelationView['kind']): string {\n return ({\n supports: '\u56DE\u7B54\u6D89\u53CA\u76EE\u6807\u8BB0\u5FC6\u65F6\uFF0C\u53EF\u628A\u8D77\u70B9\u4F5C\u4E3A\u660E\u786E\u652F\u6301\u4F9D\u636E\uFF0C\u4F46\u4E0D\u80FD\u636E\u6B64\u8865\u5199\u65B0\u4E8B\u5B9E\u3002',\n depends_on: '\u5904\u7406\u8D77\u70B9\u4E8B\u9879\u65F6\uFF0C\u5E94\u540C\u65F6\u68C0\u67E5\u5173\u8054\u9879\u662F\u5426\u6210\u7ACB\u6216\u5DF2\u7ECF\u5B8C\u6210\u3002',\n about: '\u4E24\u6761\u8BB0\u5FC6\u5C5E\u4E8E\u540C\u4E00\u4E0A\u4E0B\u6587\uFF0C\u53EC\u56DE\u5176\u4E2D\u4E00\u6761\u65F6\u53EF\u4EE5\u8865\u5145\u53E6\u4E00\u6761\u5E2E\u52A9\u7406\u89E3\u3002',\n conflicts_with: '\u4E24\u6761\u7406\u89E3\u6682\u65F6\u4E0D\u80FD\u540C\u65F6\u4F5C\u4E3A\u4E8B\u5B9E\uFF1B\u4F19\u4F34\u5E94\u5728\u76F8\u5173\u8BDD\u9898\u51FA\u73B0\u65F6\u6307\u51FA\u5DEE\u5F02\u5E76\u8BF7\u6C42\u786E\u8BA4\u3002',\n follows: '\u5B83\u4EEC\u5B58\u5728\u660E\u786E\u5148\u540E\u5173\u7CFB\uFF0C\u540E\u7EED\u5224\u65AD\u9700\u8981\u4FDD\u7559\u8FD9\u4E2A\u987A\u5E8F\u3002',\n })[kind]\n}\n\n\n", "import {useEffect, useRef, useState} from 'react'\nimport {api} from '../../client-api.js'\nimport {CollectionEmpty, WorkspaceNotice, errorMessage} from '../workspace-components.js'\nimport type {HistoryTurn} from './types.js'\n\nexport function HistoryView({base, scopeId, query}: {base: string; scopeId: string; query: string}): JSX.Element {\n const [turns, setTurns] = useState<HistoryTurn[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string>()\n const [more, setMore] = useState(true)\n const [page, setPage] = useState(0)\n const cursor = useRef<HistoryTurn>()\n useEffect(() => {\n const controller = new AbortController()\n setLoading(true); setError(undefined)\n const params = new URLSearchParams({scopeId})\n if (cursor.current) {params.set('before', String(cursor.current.at)); params.set('beforeId', cursor.current.id)}\n void api<HistoryTurn[]>(`${base}/memory/history?${params}`, {signal: controller.signal}).then(items => {\n if (controller.signal.aborted) return\n setTurns(existing => [...new Map([...existing, ...items].map(turn => [turn.id, turn])).values()])\n setMore(items.length === 30); cursor.current = items.at(-1) ?? cursor.current\n }).catch(reason => {if (!controller.signal.aborted) setError(errorMessage(reason))})\n .finally(() => {if (!controller.signal.aborted) setLoading(false)})\n return () => controller.abort()\n }, [base, scopeId, page])\n const filtered = turns.filter(turn => !query || `${turn.user} ${turn.assistant}`.toLocaleLowerCase().includes(query))\n return <div className=\"dsh-partner-memory-records\">\n <p className=\"dsh-partner-memory-hint\">\u663E\u793A\u65B0\u7248\u8BB0\u5FC6\u6D41\u7A0B\u8BB0\u5F55\u7684\u5BF9\u8BDD\uFF1B\u65E7\u8BB0\u5F55\u4ECD\u4FDD\u7559\u5728\u539F\u4F1A\u8BDD\u4E2D\u3002\u641C\u7D22\u4EC5\u7B5B\u9009\u5DF2\u52A0\u8F7D\u7684\u5185\u5BB9\u3002</p>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {!filtered.length && <CollectionEmpty title={loading ? '\u6B63\u5728\u8BFB\u53D6\u5386\u53F2' : '\u6682\u65E0\u5339\u914D\u7684\u5386\u53F2\u8BB0\u5F55'} />}\n {filtered.map(turn => <HistoryRecord key={turn.id} turn={turn} />)}\n {(more || error) && <button type=\"button\" disabled={loading} onClick={() => setPage(value => value + 1)}>{loading ? '\u8BFB\u53D6\u4E2D\u2026' : error ? '\u91CD\u8BD5\u8BFB\u53D6' : '\u52A0\u8F7D\u66F4\u65E9\u7684 30 \u8F6E'}</button>}\n </div>\n}\n\nfunction HistoryRecord({turn}: {turn: HistoryTurn}): JSX.Element {\n const [open, setOpen] = useState(false)\n return <details className=\"dsh-partner-memory-record\" onToggle={event => setOpen(event.currentTarget.open)}><summary><time>{new Date(turn.at).toLocaleString()}</time><strong>{turn.user.slice(0, 120)}</strong></summary>{open && <div><h3>\u7528\u6237\u539F\u8BDD</h3><p>{turn.user}</p><h3>\u52A9\u624B\u5F53\u65F6\u7684\u56DE\u7B54</h3><p>{turn.assistant}</p><small>\u5386\u53F2\u56DE\u7B54\u4E0D\u4EE3\u8868\u5F53\u524D\u5DF2\u9A8C\u8BC1\u7684\u4E8B\u5B9E\u3002</small></div>}</details>\n}\n", "import {useRef, useState} from 'react'\nimport {api} from '../../client-api.js'\nimport {WorkspaceDialog, WorkspaceNotice, CollectionEmpty, errorMessage} from '../workspace-components.js'\nimport type {ExperienceView as Draft} from './types.js'\n\nexport function ExperienceView({items, base, scopeId, changed}: {items: Draft[]; base: string; scopeId: string; changed(): Promise<void>}): JSX.Element {\n const [selected, setSelected] = useState<string>()\n const [busy, setBusy] = useState(false)\n const lock = useRef(false)\n const [error, setError] = useState<string>()\n const [notice, setNotice] = useState<string>()\n const [filter, setFilter] = useState<Draft['status']>('draft')\n const item = items.find(entry => entry.id === selected)\n const review = async (action: 'approved' | 'rejected' | 'export'): Promise<void> => {\n if (!item || lock.current) return\n lock.current = true; setBusy(true); setError(undefined)\n const path = `${base}/memory/experiences/${encodeURIComponent(item.id)}?${new URLSearchParams({scopeId})}`\n try {\n if (action === 'export') {\n const {document} = await api<{document: string}>(path)\n const url = URL.createObjectURL(new Blob([document], {type: 'text/markdown;charset=utf-8'}))\n const anchor = window.document.createElement('a'); anchor.href = url; anchor.download = `${item.id}.md`; window.document.body.append(anchor); anchor.click(); anchor.remove()\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n setNotice('\u5DF2\u5BFC\u51FA\u8349\u7A3F\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u5B89\u88C5\u6216\u6388\u6743\u7ED9\u4F19\u4F34')\n } else {\n await api(path, {method: 'POST', body: JSON.stringify({action, version: item.version})})\n setSelected(undefined); setNotice(action === 'approved' ? '\u5DF2\u901A\u8FC7\u5BA1\u6838\uFF0C\u53EF\u5728\u5DF2\u901A\u8FC7\u5217\u8868\u4E2D\u5BFC\u51FA' : '\u5DF2\u62D2\u7EDD\u6B64\u8349\u7A3F')\n await changed()\n }\n } catch (reason) {setError(errorMessage(reason)); await changed()}\n finally {lock.current = false; setBusy(false)}\n }\n return <>\n <p className=\"dsh-partner-memory-hint\">\u4ECE\u6709\u6210\u529F\u4F9D\u636E\u7684\u7ECF\u5386\u4E2D\u63D0\u70BC\u3002\u5BA1\u6838\u901A\u8FC7\u540E\u4EC5\u5141\u8BB8\u5BFC\u51FA\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u5B89\u88C5 Skill\u3002</p>\n {notice && <WorkspaceNotice kind=\"success\">{notice}</WorkspaceNotice>}\n <div className=\"dsh-partner-memory-segment\" aria-label=\"\u7ECF\u9A8C\u72B6\u6001\">{(['draft', 'approved', 'rejected'] as const).map(status => <button type=\"button\" aria-pressed={filter === status} key={status} onClick={() => setFilter(status)}>{({draft: '\u5F85\u5BA1\u6838', approved: '\u5DF2\u901A\u8FC7', rejected: '\u5DF2\u62D2\u7EDD'})[status]} <small>{items.filter(draft => draft.status === status).length}</small></button>)}</div>\n <div className=\"dsh-partner-memory-rows\">{items.filter(draft => draft.status === filter).map(draft => <button className=\"dsh-partner-memory-row\" type=\"button\" key={draft.id} onClick={() => {setSelected(draft.id); setError(undefined)}}><span><strong>{draft.title}</strong><small>{draft.steps.length} \u4E2A\u6B65\u9AA4 \u00B7 {draft.evidence.length} \u5904\u4F9D\u636E</small></span><small>\u67E5\u770B</small></button>)}</div>\n {!items.some(draft => draft.status === filter) && <CollectionEmpty title=\"\u6CA1\u6709\u6B64\u72B6\u6001\u7684\u7ECF\u9A8C\u8349\u7A3F\" detail=\"\u53EA\u6709\u660E\u786E\u6210\u529F\u4E14\u53EF\u590D\u7528\u7684\u7ECF\u5386\u624D\u4F1A\u6210\u4E3A\u5019\u9009\uFF1B\u9700\u8981\u5F00\u542F\u6BCF\u65E5\u7EC8\u5BA1\u3002\" />}\n {item && <WorkspaceDialog title={item.title} detail=\"\u8BF7\u6838\u5BF9\u9002\u7528\u8303\u56F4\u3001\u64CD\u4F5C\u6B65\u9AA4\u53CA\u6210\u529F\u4F9D\u636E\uFF1B\u5386\u53F2\u6210\u529F\u4E0D\u4EE3\u8868\u6BCF\u6B21\u90FD\u9002\u7528\u3002\" close={() => {if (!busy) setSelected(undefined)}}>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <ol className=\"dsh-partner-memory-procedure\">{item.steps.map((step, index) => <li key={index}>{step}</li>)}</ol>\n <details className=\"dsh-partner-memory-record\"><summary>\u6210\u529F\u4F9D\u636E \u00B7 {item.evidence.length}</summary><div>{item.evidence.map(source => <blockquote key={`${source.turnId}:${source.quote}`}><p>{source.quote}</p><small>{source.turnId}</small></blockquote>)}</div></details>\n <footer className=\"dsh-partner-memory-actions\">{item.status === 'draft' ? <><button type=\"button\" disabled={busy} onClick={() => {void review('rejected')}}>\u62D2\u7EDD</button><button className=\"is-primary\" type=\"button\" disabled={busy} onClick={() => {void review('approved')}}>{busy ? '\u5904\u7406\u4E2D\u2026' : '\u901A\u8FC7\u5BA1\u6838'}</button></> : item.status === 'approved' ? <button type=\"button\" disabled={busy} onClick={() => {void review('export')}}>{busy ? '\u5BFC\u51FA\u4E2D\u2026' : '\u5BFC\u51FA Markdown'}</button> : <span>\u6B64\u8349\u7A3F\u5DF2\u62D2\u7EDD\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u542F\u7528\u3002</span>}</footer>\n </WorkspaceDialog>}\n </>\n}\n", "import {useCallback, useEffect, useRef, useState} from 'react'\nimport {api} from '../../client-api.js'\nimport {errorMessage} from '../workspace-components.js'\n\n/** Only the latest request may publish. Polls pause while the page is hidden,\n * never overlap, and never reset an editor's local draft. */\nexport function useMemoryResource<T>(path: string | undefined, pollMs = 0) {\n const [snapshot, setData] = useState<{path: string; value: T}>()\n const [error, setError] = useState<string>()\n const [loading, setLoading] = useState(false)\n const sequence = useRef(0)\n const request = useRef<AbortController>()\n const reload = useCallback(async (): Promise<void> => {\n if (!path) return\n request.current?.abort()\n const controller = new AbortController(); request.current = controller\n const revision = ++sequence.current\n setLoading(true)\n try {\n const result = await api<T>(path, {signal: controller.signal})\n if (revision === sequence.current && !controller.signal.aborted) {setData({path, value: result}); setError(undefined)}\n } catch (reason) {\n if (revision === sequence.current && !controller.signal.aborted) setError(errorMessage(reason))\n } finally {if (revision === sequence.current) setLoading(false)}\n }, [path])\n useEffect(() => {\n setData(undefined); setError(undefined); setLoading(Boolean(path))\n let disposed = false; let timer: ReturnType<typeof setTimeout> | undefined\n const schedule = (): void => {if (timer) clearTimeout(timer); if (!disposed && pollMs > 0) timer = setTimeout(() => {void tick()}, pollMs)}\n const tick = async (): Promise<void> => {\n if (disposed) return\n if (!document.hidden) await reload()\n schedule()\n }\n const visible = (): void => {if (!document.hidden) {if (timer) clearTimeout(timer); void tick()}}\n void reload().then(schedule)\n if (pollMs) document.addEventListener('visibilitychange', visible)\n return () => {disposed = true; if (timer) clearTimeout(timer); document.removeEventListener('visibilitychange', visible); ++sequence.current; request.current?.abort()}\n }, [reload, pollMs])\n return {data: snapshot?.path === path ? snapshot?.value : undefined, error, loading, reload}\n}\n", "import {useRef, useState} from 'react'\nimport {api, type CompanionView, type AutomationView, type ModelCatalogView} from '../../client-api.js'\nimport {FormField as Field} from '../partner-components.js'\nimport {WorkspaceDialog, WorkspaceNotice, errorMessage} from '../workspace-components.js'\nimport {useMemoryResource} from './use-memory-resource.js'\n\nexport function AutomationSettings({companion, kind, close, onChanged}: {companion: CompanionView; kind: 'memory' | 'heartbeat'; close(): void; onChanged(): Promise<void>}): JSX.Element {\n const [automation,setAutomation] = useState<AutomationView>(()=>structuredClone(companion.automation))\n const lock = useRef(false)\n const [busy,setBusy] = useState(false)\n const [error,setError] = useState<string>()\n const [notice,setNotice] = useState<string>()\n const {data: modelCatalog,error: catalogError} = useMemoryResource<ModelCatalogView>(kind==='memory'?'/models':undefined)\n const inheritedProvider=companion.provider || modelCatalog?.defaultSelection.provider || ''\n const selectedProvider=automation.memory.provider || inheritedProvider\n const modelOptions=modelCatalog?.providers.find(item=>item.id===selectedProvider)?.models ?? []\n const save=async ():Promise<void>=>{\n if(lock.current)return;lock.current=true;setBusy(true);setError(undefined);setNotice(undefined)\n try {await api('/companions/'+encodeURIComponent(companion.id)+'/automation',{method:'PUT',body:JSON.stringify({automation:{...companion.automation,[kind]:automation[kind]}})});setNotice('\u8BBE\u7F6E\u5DF2\u4FDD\u5B58');await onChanged()}\n catch(reason){setError(errorMessage(reason))}finally{lock.current=false;setBusy(false)}\n }\n const review=async ():Promise<void>=>{\n if(lock.current)return;lock.current=true;setBusy(true);setError(undefined);setNotice(undefined)\n try {const result=await api<{reviewed:number;failed:number;reason?:string}>('/companions/'+encodeURIComponent(companion.id)+'/memory/review',{method:'POST'});setNotice(result.reason ?? '\u7EC8\u5BA1\u5B8C\u6210 '+result.reviewed+' \u7BC7\uFF0C\u5931\u8D25 '+result.failed+' \u7BC7');await onChanged()}\n catch(reason){setError(errorMessage(reason))}finally{lock.current=false;setBusy(false)}\n }\n return <WorkspaceDialog title={kind==='memory'?'\u8BB0\u5FC6\u8BBE\u7F6E':'\u6301\u7EED\u5173\u6CE8\u8BBE\u7F6E'} detail={kind==='memory'?'\u7BA1\u7406\u5B66\u4E60\u3001\u5386\u53F2\u4FDD\u7559\u4E0E\u6BCF\u65E5\u6574\u7406\u3002\u6709\u6548\u7684\u957F\u671F\u8BA4\u8BC6\u72EC\u7ACB\u4FDD\u7559\u3002':'\u6301\u7EED\u5173\u6CE8\u7528\u4E8E\u89C2\u5BDF\u53D8\u5316\uFF1B\u5B9A\u65F6\u6267\u884C\u5DE5\u4F5C\u8BF7\u4F7F\u7528\u5B9A\u65F6\u4EFB\u52A1\u3002'} close={()=>{if(!busy)close()}}>\n <div className=\"dsh-partner-memory-settings\">{(error || catalogError) && <WorkspaceNotice>{error || catalogError}</WorkspaceNotice>}{notice && <WorkspaceNotice kind=\"success\">{notice}</WorkspaceNotice>}\n {kind==='memory'?(<section className=\"dsh-partner-automation\">\n <header><span><strong>\u5B66\u4E60\u4E0E\u957F\u671F\u8BB0\u5FC6</strong><small>\u6309\u8054\u7CFB\u4EBA\u5F52\u6863\u5B8C\u6574\u5BF9\u8BDD\uFF0C\u63D0\u70BC\u6BCF\u65E5\u56DE\u987E\u548C\u7ED3\u6784\u5316\u8BB0\u5FC6\uFF0C\u5E76\u5728\u76F8\u5173\u8BDD\u9898\u51FA\u73B0\u65F6\u53EC\u56DE\u3002</small></span><button type=\"button\" className=\"dsh-partner-switch\" disabled={busy} role=\"switch\" data-on={automation.memory.enabled} aria-checked={automation.memory.enabled} aria-label=\"\u542F\u7528\u4F19\u4F34\u5B66\u4E60\" onClick={() => setAutomation(current => ({ ...current, memory: { ...current.memory, enabled: !current.memory.enabled } }))}><i /></button></header>\n <div className=\"dsh-partner-automation-fields is-memory-model\"><Field label=\"\u5386\u53F2\u4FDD\u7559\u671F\u9650\" hint=\"\u4E0D\u4F1A\u5220\u9664\u4ECD\u6709\u6548\u7684\u957F\u671F\u504F\u597D\"><select value={automation.memory.retentionDays} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, retentionDays: Number(event.target.value) } }))}><option value={0}>\u6C38\u4E45\u4FDD\u7559</option><option value={30}>30 \u5929</option><option value={90}>90 \u5929</option><option value={180}>180 \u5929</option><option value={365}>1 \u5E74</option><option value={1095}>3 \u5E74</option></select></Field><Field label=\"\u63D0\u70BC Provider\" hint=\"\u9ED8\u8BA4\u7EE7\u627F\u4F19\u4F34\"><select value={automation.memory.provider ?? ''} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, provider: event.target.value, model: '' } }))}><option value=\"\">\u8DDF\u968F\u4F19\u4F34 \u00B7 {inheritedProvider || 'DSH \u9ED8\u8BA4'}</option>{modelCatalog?.providers.map(provider => <option value={provider.id} key={provider.id}>{provider.name || provider.id}</option>)}</select></Field><Field label=\"\u63D0\u70BC\u6A21\u578B\" hint=\"\u9ED8\u8BA4\u7EE7\u627F\u4F19\u4F34\"><select value={automation.memory.model ?? ''} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, model: event.target.value } }))}><option value=\"\">\u8DDF\u968F\u4F19\u4F34 \u00B7 {companion.model || modelCatalog?.defaultSelection.model || 'DSH \u9ED8\u8BA4'}</option>{modelOptions.map(model => <option value={model.id} key={model.id}>{model.name || model.id}</option>)}</select></Field></div>\n <div className=\"dsh-partner-review-policy\"><button type=\"button\" className=\"dsh-partner-switch\" disabled={busy} role=\"switch\" data-on={automation.memory.dailyReviewEnabled} aria-checked={automation.memory.dailyReviewEnabled} aria-label=\"\u542F\u7528\u6BCF\u65E5\u7EC8\u5BA1\" onClick={() => setAutomation(current => ({ ...current, memory: { ...current.memory, dailyReviewEnabled: !current.memory.dailyReviewEnabled } }))}><i /></button><span><strong>\u6BCF\u65E5\u7EC8\u5BA1</strong><small>\u6B21\u65E5\u81EA\u52A8\u5408\u5E76\u91CD\u590D\u3001\u7EA0\u6B63\u504F\u5DEE\u5E76\u5EFA\u7ACB\u8BB0\u5FC6\u5173\u7CFB</small></span><label><select aria-label=\"\u6BCF\u65E5\u7EC8\u5BA1\u65F6\u95F4\" value={automation.memory.dailyReviewHour} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, dailyReviewHour: Number(event.target.value) } }))}>{Array.from({ length: 24 }, (_, hour) => <option value={hour} key={hour}>{String(hour).padStart(2, '0')}:00</option>)}</select></label><button type=\"button\" disabled={busy} onClick={() => { void review() }}>\u7ACB\u5373\u7EC8\u5BA1</button></div>\n </section>):(<section className=\"dsh-partner-automation\">\n <header><span><strong>\u6301\u7EED\u611F\u77E5</strong><small>\u4F19\u4F34\u53EA\u89C2\u5BDF\u5C1A\u672A\u95ED\u73AF\u7684\u4E8B\u60C5\u662F\u5426\u51FA\u73B0\u65B0\u53D8\u5316\uFF0C\u5E76\u7531\u514B\u5236\u7684\u6253\u6270\u7B56\u7565\u51B3\u5B9A\u4F55\u65F6\u544A\u8BC9\u4F60\u3002</small></span><button type=\"button\" className=\"dsh-partner-switch\" disabled={busy} role=\"switch\" data-on={automation.heartbeat.enabled} aria-checked={automation.heartbeat.enabled} aria-label=\"\u542F\u7528\u4F19\u4F34\u5FC3\u8DF3\" onClick={() => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, enabled: !current.heartbeat.enabled } }))}><i /></button></header>\n <div className=\"dsh-partner-automation-fields is-heartbeat\">\n <Field label=\"\u68C0\u67E5\u95F4\u9694\"><select value={automation.heartbeat.intervalMinutes} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, intervalMinutes: Number(event.target.value) } }))}><option value={30}>30 \u5206\u949F</option><option value={60}>1 \u5C0F\u65F6</option><option value={180}>3 \u5C0F\u65F6</option><option value={360}>6 \u5C0F\u65F6</option><option value={720}>12 \u5C0F\u65F6</option><option value={1440}>24 \u5C0F\u65F6</option></select></Field>\n <Field label=\"\u514D\u6253\u6270\u5F00\u59CB\"><input type=\"number\" min={0} max={23} value={automation.heartbeat.quietStartHour} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, quietStartHour: Number(event.target.value) } }))} /></Field>\n <Field label=\"\u514D\u6253\u6270\u7ED3\u675F\"><input type=\"number\" min={0} max={23} value={automation.heartbeat.quietEndHour} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, quietEndHour: Number(event.target.value) } }))} /></Field>\n <Field label=\"\u6BCF\u65E5\u4E0A\u9650\"><select value={automation.heartbeat.dailyLimit} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, dailyLimit: Number(event.target.value) } }))}><option value={0}>\u4E0D\u9650</option><option value={1}>1 \u6B21</option><option value={2}>2 \u6B21</option><option value={3}>3 \u6B21</option><option value={5}>5 \u6B21</option><option value={8}>8 \u6B21</option></select></Field>\n </div>\n</section>)}\n <footer className=\"dsh-partner-memory-actions\"><button type=\"button\" disabled={busy} onClick={close}>\u5173\u95ED</button><button type=\"button\" className=\"is-primary\" disabled={busy} onClick={()=>{void save()}}>{busy?'\u6B63\u5728\u5904\u7406\u2026':'\u4FDD\u5B58\u8BBE\u7F6E'}</button></footer></div>\n </WorkspaceDialog>\n}\n", "export function MemoryJobFeedback({status, error}: {status: string; error?: string}) {\n if(!error)return null\n return <small className=\"dsh-partner-memory-job-error\">\u4E0A\u6B21\u5931\u8D25\uFF1A{error}{status==='processing'?'\uFF08\u5F53\u524D\u6B63\u5728\u91CD\u8BD5\uFF0C\u672C\u8F6E\u5C1A\u672A\u7ED3\u675F\uFF09':''}</small>\n}\n", "import {useEffect, useRef, useState} from 'react'\nimport {IconRefreshOutline16} from '@deepseek-ai/dsh-client-ui-primitives'\nimport {api, type CompanionView, type PartnerSnapshot, type ConcernActivityView, type ConcernView} from '../../client-api.js'\nimport {WorkspaceHero, WorkspaceNotice, CollectionEmpty, errorMessage} from '../workspace-components.js'\nimport {relativeTime} from '../partner-components.js'\nimport {useMemoryResource} from './use-memory-resource.js'\nimport {AutomationSettings} from './automation-settings.js'\nimport {ConcernBoard} from './concern-board.js'\n\nexport function ConcernPanel({companion, snapshot, onChanged}: {companion: CompanionView; snapshot: PartnerSnapshot; onChanged(): Promise<void>}): JSX.Element {\n const base = `/companions/${encodeURIComponent(companion.id)}`\n const resource = useMemoryResource<ConcernActivityView>(`${base}/concerns`, 15_000)\n const [settings, setSettings] = useState(false)\n const [value, setValue] = useState('')\n const [busy, setBusy] = useState(false)\n const [checking, setChecking] = useState(false)\n const awaitingCheck = useRef(false)\n const refresh = useRef({onChanged, reload: resource.reload})\n refresh.current = {onChanged, reload: resource.reload}\n useEffect(() => {\n let disposed = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const controller = new AbortController()\n awaitingCheck.current = false\n setChecking(false)\n const poll = async () => {\n try {\n if (document.hidden) return\n const status = await api<{running: boolean; result: {sent: boolean; reason?: string} | null}>(`${base}/heartbeat/status`, {signal: controller.signal})\n if (disposed) return\n setChecking(status.running)\n if (awaitingCheck.current && !status.running) {\n awaitingCheck.current = false\n setNotice(status.result?.reason ?? (status.result?.sent ? '\u68C0\u67E5\u5B8C\u6210\uFF0C\u5DF2\u53D1\u9001\u63D0\u9192' : '\u68C0\u67E5\u5DF2\u7ED3\u675F\uFF0C\u8BF7\u67E5\u770B\u5173\u6CE8\u6D3B\u52A8'))\n await Promise.all([refresh.current.onChanged(), refresh.current.reload()])\n }\n if (status.running) awaitingCheck.current = true\n } catch { /* A transient status failure must not restart a background task. */ }\n finally { if (!disposed) timer = setTimeout(() => {void poll()}, 3000) }\n }\n void poll()\n return () => {disposed = true; controller.abort(); clearTimeout(timer)}\n }, [base])\n const lock = useRef(false)\n const [notice, setNotice] = useState<string>()\n const [error, setError] = useState<string>()\n const heartbeat = snapshot.heartbeatStates.find(item => item.companionId === companion.id)\n const run = async (action: () => Promise<string>): Promise<boolean> => {\n if (lock.current) return false\n lock.current = true; setBusy(true); setError(undefined); setNotice(undefined)\n try {setNotice(await action()); await resource.reload(); return true}\n catch (reason) {setError(errorMessage(reason)); return false}\n finally {lock.current = false; setBusy(false)}\n }\n const check = (concernId?: string): void => {void run(async () => {\n if (checking) return '\u5FC3\u8DF3\u6B63\u5728\u6267\u884C\uFF0C\u8BF7\u7B49\u5F85\u672C\u8F6E\u7ED3\u679C'\n const result = await api<{running: boolean; reason?: string}>(`${base}/heartbeat/trigger`, {method: 'POST', body: JSON.stringify(concernId ? {concernId} : {})})\n setChecking(result.running)\n awaitingCheck.current = result.running\n await onChanged()\n return result.reason ?? '\u5DF2\u5F00\u59CB\u540E\u53F0\u68C0\u67E5\uFF0C\u53EF\u79BB\u5F00\u6B64\u9875\u9762\uFF0C\u7ED3\u679C\u4F1A\u4FDD\u7559\u5728\u5173\u6CE8\u6D3B\u52A8\u4E2D'\n })}\n const act = (item: ConcernView, action: 'watch' | 'ignore' | 'prioritize' | 'resolve'): void => {void run(async () => {\n await api(`${base}/concerns/${encodeURIComponent(item.id)}/action`, {method: 'POST', body: JSON.stringify({action})})\n return ({watch: '\u5DF2\u6062\u590D\u7559\u610F', ignore: '\u4E0D\u518D\u5173\u6CE8\u8FD9\u4EF6\u4E8B', prioritize: '\u5DF2\u63D0\u9AD8\u5173\u6CE8', resolve: '\u5DF2\u6807\u8BB0\u89E3\u51B3'})[action]\n })}\n return <div className=\"dsh-partner-memory-page is-concerns\">\n <WorkspaceHero eyebrow=\"ONGOING WATCHES\" title=\"\u6301\u7EED\u5173\u6CE8\" detail=\"\u53EA\u7559\u610F\u9700\u8981\u7EE7\u7EED\u89C2\u5BDF\u7684\u4E8B\uFF0C\u6709\u503C\u5F97\u544A\u8BC9\u4F60\u7684\u53D8\u5316\u65F6\u518D\u51FA\u73B0\u3002\" actions={<><button type=\"button\" disabled={busy || checking} aria-busy={checking} onClick={() => check()}>{checking ? '\u540E\u53F0\u68C0\u67E5\u4E2D\u2026' : '\u68C0\u67E5\u5230\u671F\u9879'}</button><button type=\"button\" onClick={() => setSettings(true)}>\u5173\u6CE8\u8BBE\u7F6E</button></>} />\n <div className=\"dsh-partner-memory-status\"><span>{companion.automation.heartbeat.enabled ? '\u6301\u7EED\u611F\u77E5\u5DF2\u5F00\u542F' : '\u6301\u7EED\u611F\u77E5\u5DF2\u6682\u505C'}</span><small>\u6700\u8FD1\u68C0\u67E5\uFF1A{heartbeat?.lastCheckedAt ? relativeTime(heartbeat.lastCheckedAt) : '\u5C1A\u672A'} \u00B7 \u4ECA\u65E5\u63D0\u9192 {heartbeat?.sentCount ?? 0} \u6B21</small><button type=\"button\" disabled={resource.loading} aria-label=\"\u5237\u65B0\u5173\u6CE8\" onClick={() => {void resource.reload()}}><IconRefreshOutline16 size={16} /></button></div>\n {(error || resource.error || heartbeat?.lastError) && <WorkspaceNotice>{error || resource.error || heartbeat?.lastError}</WorkspaceNotice>}\n {notice && <WorkspaceNotice kind=\"success\">{notice}</WorkspaceNotice>}\n {!resource.data ? <CollectionEmpty title={resource.error ? '\u5173\u6CE8\u8BFB\u53D6\u5931\u8D25' : '\u6B63\u5728\u8BFB\u53D6\u5173\u6CE8'} action={resource.error ? <button type=\"button\" onClick={() => {void resource.reload()}}>\u91CD\u8BD5</button> : undefined} /> : <ConcernBoard companionId={companion.id} activity={resource.data} onEdited={resource.reload} value={value} busy={busy || checking} onValue={setValue} onCheck={item => check(item.id)} onAct={act} onAdd={(recordTarget, reason) => run(async () => {\n if (!value.trim()) return '\u8BF7\u586B\u5199\u9700\u8981\u6301\u7EED\u5173\u6CE8\u7684\u4E8B\u60C5'\n await api(`${base}/concerns`, {method: 'POST', body: JSON.stringify({subject: value.trim(), reason, recordTarget})})\n setValue(''); return '\u5DF2\u52A0\u5165\u6301\u7EED\u5173\u6CE8'\n })} />}\n {settings && <AutomationSettings companion={companion} kind=\"heartbeat\" close={() => setSettings(false)} onChanged={onChanged} />}\n </div>\n}\n", "import {useEffect, useId, useRef, useState, type FormEvent} from 'react'\nimport {IconCheckOutline14, IconChevronDownOutline14, IconPlusOutline16, IconLinkOutline16, IconDataOutline16} from '@deepseek-ai/dsh-client-ui-primitives'\nimport {api, type ConcernActivityView, type ConcernView, type ConcernSourceView, type ConcernObservationView} from '../../client-api.js'\nimport {futureTime} from '../../time-format.js'\nimport {errorMessage as message} from '../workspace-components.js'\nimport {ConcernDeleteButton, ArchivedConcerns} from './concern-deletion.js'\nimport {ConcernEditor} from './concern-editor.js'\nimport { ConcernRecordFields } from './concern-record-fields.js'\nimport type { ConcernRecordTargetView } from '../../client-api.js'\nexport function ConcernBoard({ companionId, activity, value, busy, onValue, onAdd, onCheck, onAct, onEdited }: {\n companionId: string; activity: ConcernActivityView; value: string; busy: boolean; onValue(value: string): void; onAdd(target?: ConcernRecordTargetView, reason?: string): Promise<boolean>\n onEdited(): Promise<void>\n onCheck(item: ConcernView): void\n onAct(item: ConcernView, action: 'watch' | 'ignore' | 'prioritize' | 'resolve'): void\n}): JSX.Element {\n const visible = activity.concerns.filter(item => item.state !== 'archived')\n const active = visible.filter(item => item.state !== 'resolved')\n const resolved = visible.filter(item => item.state === 'resolved')\n const latest = new Map([...activity.observations].reverse().map(item => [item.concernId, item]))\n const [editing, setEditing] = useState<ConcernView>()\n const [composing, setComposing] = useState(false)\n const [reason, setReason] = useState('')\n const [recordTarget, setRecordTarget] = useState<ConcernRecordTargetView>()\n const [expandedId, setExpandedId] = useState<string>()\n const [visibleCount, setVisibleCount] = useState(5)\n const [mention, setMention] = useState<{ start: number; end: number; query: string }>()\n const [sources, setSources] = useState<ConcernSourceView[]>([])\n const [sourcesLoading, setSourcesLoading] = useState(false)\n const [sourceError, setSourceError] = useState<string>()\n const [activeSource, setActiveSource] = useState(0)\n const inputRef = useRef<HTMLInputElement>(null)\n const listboxId = useId()\n const shown = active.slice(0, visibleCount)\n const suggestionsOpen = composing && mention !== undefined\n useEffect(() => {\n if (!suggestionsOpen || mention === undefined) {\n setSources([]); setSourcesLoading(false); setSourceError(undefined); return\n }\n const controller = new AbortController()\n const timer = window.setTimeout(() => {\n setSourcesLoading(true); setSourceError(undefined)\n const params = new URLSearchParams({ q: mention.query })\n void api<{ items: ConcernSourceView[] }>(`/companions/${encodeURIComponent(companionId)}/concern-sources?${params}`, {signal: controller.signal}).then(result => {\n if (!controller.signal.aborted) { setSources(result.items); setActiveSource(0) }\n }).catch(reason => {\n if (!controller.signal.aborted) { setSources([]); setSourceError(message(reason)) }\n }).finally(() => { if (!controller.signal.aborted) setSourcesLoading(false) })\n }, 150)\n return () => { window.clearTimeout(timer); controller.abort() }\n }, [companionId, mention?.query, suggestionsOpen])\n const submit = (event: FormEvent): void => { event.preventDefault(); void onAdd(recordTarget, reason).then(ok => { if (ok) { setComposing(false); setMention(undefined); setRecordTarget(undefined); setReason('') } }) }\n const chooseSource = (source: ConcernSourceView): void => {\n if (mention === undefined) return\n const next = `${value.slice(0, mention.start)}${source.token} ${value.slice(mention.end)}`\n const cursor = mention.start + source.token.length + 1\n onValue(next); setMention(undefined); setSources([])\n window.requestAnimationFrame(() => { inputRef.current?.focus(); inputRef.current?.setSelectionRange(cursor, cursor) })\n }\n return <section className=\"dsh-partner-concern-board\" aria-labelledby=\"partner-concerns-title\">\n <header><span><strong id=\"partner-concerns-title\">\u4F19\u4F34\u5728\u610F\u7684\u4E8B <b>{active.length}</b></strong><p>\u5C1A\u672A\u95ED\u73AF\u3001\u503C\u5F97\u7EE7\u7EED\u7559\u610F\u7684\u4E8B\u60C5</p></span><button type=\"button\" aria-expanded={composing} onClick={() => {setEditing(undefined);setComposing(current => !current)}}><IconPlusOutline16 size={14} />\u4EA4\u4EE3\u4E00\u4EF6\u4E8B</button></header>\n {editing && <ConcernEditor key={editing.id} companionId={companionId} item={editing} close={()=>setEditing(undefined)} saved={onEdited} />}\n {composing && <form className=\"dsh-partner-concern-compose\" aria-label=\"\u65B0\u589E\u5173\u6CE8\" aria-busy={busy} onSubmit={submit}><header className=\"dsh-partner-concern-form-heading\"><strong>\u4EA4\u4EE3\u4E00\u4EF6\u4E8B</strong><p>\u5148\u8BF4\u8981\u5173\u6CE8\u4EC0\u4E48\uFF0C\u518D\u8865\u5145\u68C0\u67E5\u65B9\u5F0F\u548C\u8BB0\u5F55\u4F4D\u7F6E\u3002</p></header><label><span>\u9700\u8981\u7559\u610F\u7684\u4E8B</span><div className=\"dsh-partner-concern-input-wrap\"><input\n ref={inputRef} autoFocus value={value} maxLength={300} placeholder=\"\u8F93\u5165 @ \u9009\u62E9\u6587\u4EF6\u6216\u77E5\u8BC6\u6587\u6863\"\n role=\"combobox\" aria-autocomplete=\"list\" aria-expanded={suggestionsOpen} aria-controls={suggestionsOpen ? listboxId : undefined}\n aria-activedescendant={suggestionsOpen && sources[activeSource] ? `${listboxId}-option-${activeSource}` : undefined}\n onChange={event => { onValue(event.target.value); setMention(activeMention(event.target.value, event.target.selectionStart ?? event.target.value.length)) }}\n onClick={event => setMention(activeMention(event.currentTarget.value, event.currentTarget.selectionStart ?? event.currentTarget.value.length))}\n onKeyDown={event => {\n if (!suggestionsOpen) return\n if (event.key === 'ArrowDown') { event.preventDefault(); setActiveSource(index => sources.length === 0 ? 0 : (index + 1) % sources.length) }\n else if (event.key === 'ArrowUp') { event.preventDefault(); setActiveSource(index => sources.length === 0 ? 0 : (index - 1 + sources.length) % sources.length) }\n else if (event.key === 'Enter' && sources[activeSource]) { event.preventDefault(); chooseSource(sources[activeSource]) }\n else if (event.key === 'Escape') { event.preventDefault(); setMention(undefined) }\n }}\n />{suggestionsOpen && <div id={listboxId} className=\"dsh-partner-concern-sources\" role=\"listbox\" aria-label=\"\u53EF\u5F15\u7528\u7684\u6587\u4EF6\u4E0E\u77E5\u8BC6\u6587\u6863\">\n {sourcesLoading ? <p role=\"status\">\u6B63\u5728\u67E5\u627E\u53EF\u5F15\u7528\u5185\u5BB9\u2026</p> : sourceError ? <p role=\"status\">\u5019\u9009\u52A0\u8F7D\u5931\u8D25\uFF1A{sourceError}</p> : sources.length === 0 ? <p role=\"status\">\u6CA1\u6709\u627E\u5230\u5339\u914D\u7684\u6587\u4EF6\u6216\u5DF2\u6302\u8F7D\u77E5\u8BC6\u6587\u6863</p> : <>\n {sources.map((source, index) => <button\n type=\"button\" role=\"option\" id={`${listboxId}-option-${index}`} key={`${source.kind}:${source.token}`}\n aria-selected={index === activeSource} data-kind={source.kind} onMouseDown={event => event.preventDefault()}\n onMouseEnter={() => setActiveSource(index)} onClick={() => chooseSource(source)}\n ><span>{source.kind === 'file' ? <IconDataOutline16 size={15} /> : <IconLinkOutline16 size={15} />}</span><strong>{source.label}</strong><small>{source.detail}</small></button>)}\n </>}\n </div>}</div><small className=\"dsh-partner-concern-compose-hint\">\u8F93\u5165 <b>@</b> \u9009\u62E9\u68C0\u67E5\u4F9D\u636E\uFF1A\u5F53\u524D\u4F1A\u8BDD\u6587\u4EF6\u6216\u5DF2\u6302\u8F7D\u77E5\u8BC6\u6587\u6863\u3002\u4F9D\u636E\u53EA\u8BFB\uFF0C\u4E0D\u4F5C\u4E3A\u8BB0\u5F55\u4F4D\u7F6E\u3002</small></label>\n <ConcernRecordFields companionId={companionId} reason={reason} onReason={setReason} target={recordTarget} onTarget={setRecordTarget} />\n <div><button type=\"button\" onClick={() => { setComposing(false); setMention(undefined); setRecordTarget(undefined); setReason(''); onValue('') }}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy || !value.trim()}>\u8BA9\u4F19\u4F34\u8BB0\u7740</button></div></form>}\n <div className=\"dsh-partner-concern-list\" role=\"list\">\n {active.length === 0 ? <p className=\"dsh-partner-concern-empty\">\u6700\u8FD1\u6CA1\u6709\u672A\u95ED\u73AF\u7684\u4E8B\u3002\u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u5BF9\u4F19\u4F34\u8BF4\u201C\u8FD9\u4E2A\u5E2E\u6211\u7559\u610F\u201D\u3002</p> : shown.map(item => {\n const observation = latest.get(item.id)\n const expanded = expandedId === item.id\n const status = observation ? concernObservationStatus(observation) : item.state === 'active' ? '\u6B63\u5728\u7559\u610F' : '\u6682\u65F6\u8BB0\u7740'\n return <article key={item.id} role=\"listitem\" data-state={item.state} data-expanded={expanded}>\n {expanded && <p className=\"dsh-partner-record-summary\">\u8BB0\u5F55\u4F4D\u7F6E\uFF1A{item.recordTarget ? `${item.recordTarget.kind === 'file' ? '\u672C\u5730\u6587\u4EF6' : '\u7B14\u8BB0\u6587\u6863'} \u00B7 ${item.recordTarget.label}` : '\u4F19\u4F34\u5185\u90E8\u89C2\u5BDF\u8BB0\u5F55\uFF08\u4E0D\u521B\u5EFA\u6587\u6863\u3001\u4E0D\u56DE\u5199\u4F9D\u636E\uFF09'}</p>}\n <button type=\"button\" className=\"dsh-partner-concern-row\" aria-expanded={expanded} onClick={() => setExpandedId(current => current === item.id ? undefined : item.id)}>\n <span className=\"dsh-partner-concern-state\"><i />{status}</span><span className=\"dsh-partner-concern-copy\"><strong>{item.subject}</strong><small>{observation ? observation.event : item.reason}</small></span><span className=\"dsh-partner-concern-time\" title={`\u8BA1\u5212\u4E8E ${new Date(item.nextCheckAt).toLocaleString()} \u518D\u6B21\u7559\u610F`}><small>\u4E0B\u6B21\u7559\u610F</small><strong>{futureTime(item.nextCheckAt)}</strong></span><IconChevronDownOutline14 size={14} />\n </button>\n {expanded && <div className=\"dsh-partner-concern-detail\"><p>{item.reason}</p>{observation && <><blockquote>{observation.event}</blockquote><div className=\"dsh-partner-concern-decision\" data-decision={observation.decision}><strong>{concernObservationStatus(observation)}</strong><span>{observation.decisionReason || concernObservationExplanation(observation)}</span><small>\u6253\u6270\u5206\u6570 {Math.round(observation.interruptScore * 100)}{observation.notificationRuleEffect !== 'auto' && observation.notificationRuleReason ? ` \u00B7 \u77E5\u8BC6\u89C4\u5219\uFF1A${observation.notificationRuleReason}` : ''}</small></div></>}{item.resources.length > 0 && <div className=\"dsh-partner-concern-resources\">{item.resources.map(resource => <span key={`${resource.kind}:${resource.locator}`}>{resource.kind === 'file' ? '\u6587\u4EF6' : '\u77E5\u8BC6'} \u00B7 {resource.label}</span>)}</div>}<small>{item.origin === 'explicit' ? '\u4F60\u660E\u786E\u4EA4\u4EE3' : '\u4F19\u4F34\u4ECE\u5BF9\u8BDD\u4E2D\u6CE8\u610F\u5230'} \u00B7 {watchKindLabel(item.watchKind)}</small><div className=\"dsh-partner-concern-actions\" aria-label={`${item.subject} \u7684\u64CD\u4F5C`}><button type=\"button\" onClick={() => {setComposing(false);setEditing(item)}}>\u7F16\u8F91</button><button type=\"button\" disabled={busy} onClick={() => onCheck(item)}>\u7ACB\u5373\u68C0\u67E5\u8FD9\u6761</button><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'watch')}>\u7EE7\u7EED\u7559\u610F</button><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'prioritize')}>\u63D0\u9AD8\u5173\u6CE8</button><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'resolve')}>\u5DF2\u7ECF\u89E3\u51B3</button><ConcernDeleteButton companionId={companionId} item={item} disabled={busy} onDeleted={onEdited}/></div></div>}\n </article>\n })}\n </div>\n {(active.length > shown.length || visibleCount > 5) && <div className=\"dsh-partner-concern-more\">{active.length > shown.length ? <button type=\"button\" onClick={() => setVisibleCount(count => Math.min(active.length, count + 20))}>\u518D\u663E\u793A {Math.min(20, active.length - shown.length)} \u6761</button> : <button type=\"button\" onClick={() => setVisibleCount(5)}>\u6536\u8D77\u5217\u8868</button>}</div>}\n {resolved.length > 0 && <details className=\"dsh-partner-concern-resolved\"><summary>\u5DF2\u7ECF\u89E3\u51B3 <b>{resolved.length}</b></summary><div>{resolved.slice(0, 30).map(item => <article key={item.id}><span><IconCheckOutline14 size={13} /></span><strong>{item.subject}</strong><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'watch')}>\u91CD\u65B0\u7559\u610F</button><ConcernDeleteButton companionId={companionId} item={item} disabled={busy} onDeleted={onEdited}/></article>)}</div></details>}\n <ArchivedConcerns companionId={companionId} onChanged={onEdited}/>\n </section>\n}\n\nfunction activeMention(value: string, cursor: number): { start: number; end: number; query: string } | undefined {\n const prefix = value.slice(0, cursor)\n const start = prefix.lastIndexOf('@')\n if (start < 0 || (start > 0 && !/\\s/u.test(prefix[start - 1] ?? ''))) return undefined\n const fragment = prefix.slice(start + 1)\n if (fragment.startsWith('\u77E5\u8BC6\u5E93[')) {\n if (fragment.includes(']')) return undefined\n return { start, end: cursor, query: fragment.slice(4) }\n }\n if (fragment.startsWith('\"')) {\n if (fragment.slice(1).includes('\"')) return undefined\n return { start, end: cursor, query: fragment.slice(1) }\n }\n if (/\\s/u.test(fragment)) return undefined\n return { start, end: cursor, query: fragment }\n}\n\nfunction watchKindLabel(value: ConcernView['watchKind']): string {\n return value === 'knowledge' ? '\u77E5\u8BC6\u5E93\u53D8\u5316' : value === 'workspace' ? '\u9879\u76EE\u53D8\u5316' : value === 'web' ? '\u5916\u90E8\u53D8\u5316' : '\u6309\u4E8B\u60C5\u5224\u65AD\u6765\u6E90'\n}\n\nfunction concernObservationStatus(item: ConcernObservationView): string {\n if (item.decision === 'notify') return item.mentionedAt === undefined ? '\u5F85\u63D0\u9192' : '\u5DF2\u63D0\u9192'\n if (item.decision === 'feed') return '\u4F19\u4F34\u52A8\u6001'\n if (item.decision === 'defer') return item.mentionedAt === undefined ? '\u5F85\u987A\u5E26\u63D0' : '\u5DF2\u987A\u5E26\u63D0'\n return '\u9759\u9ED8\u8BB0\u4E0B'\n}\nfunction concernObservationExplanation(item: ConcernObservationView): string {\n if (item.decision === 'notify') return item.mentionedAt === undefined ? '\u8FBE\u5230\u4E3B\u52A8\u63D0\u9192\u6761\u4EF6\uFF0C\u7B49\u5F85\u6E20\u9053\u6295\u9012' : '\u5DF2\u7ECF\u901A\u8FC7\u6279\u51C6\u7684\u6E20\u9053\u4E3B\u52A8\u63D0\u9192'\n if (item.decision === 'feed') return '\u53EA\u663E\u793A\u5728\u4F19\u4F34\u52A8\u6001\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u8F6C\u6210\u4E3B\u52A8\u63D0\u9192'\n if (item.decision === 'defer') return item.mentionedAt === undefined ? '\u4E0B\u6B21\u51FA\u73B0\u76F8\u5173\u5BF9\u8BDD\u65F6\u987A\u5E26\u63D0\u53CA' : '\u5DF2\u7ECF\u5728\u76F8\u5173\u5BF9\u8BDD\u4E2D\u987A\u5E26\u63D0\u53CA'\n return '\u4EC5\u4FDD\u7559\u4E3A\u89C2\u5BDF\u8BB0\u5F55\uFF0C\u4E0D\u6253\u6270\u4F60'\n}\n", "export function futureTime(value: number, now = Date.now()): string {\n const minutes = Math.ceil((value - now) / 60_000)\n if (minutes <= 0) return '\u5373\u5C06\u68C0\u67E5'\n if (minutes < 60) return `${minutes} \u5206\u949F\u540E`\n const hours = Math.ceil(minutes / 60)\n if (hours < 24) return `${hours} \u5C0F\u65F6\u540E`\n const days = Math.ceil(hours / 24)\n if (days <= 7) return `${days} \u5929\u540E`\n const date = new Date(value)\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n const hour = String(date.getHours()).padStart(2, '0')\n const minute = String(date.getMinutes()).padStart(2, '0')\n return `${month}/${day} ${hour}:${minute}`\n}\n", "import {useId, useRef, useState} from 'react'\nimport {IconChevronDownOutline14} from '@deepseek-ai/dsh-client-ui-primitives'\nimport {api, type ConcernView} from '../../client-api.js'\nimport {WorkspaceDialog, WorkspaceNotice, errorMessage} from '../workspace-components.js'\nimport {useMemoryResource} from './use-memory-resource.js'\n\nexport function ConcernDeleteButton({companionId, item, disabled, onDeleted}: {companionId:string; item:ConcernView; disabled?:boolean; onDeleted():Promise<void>}) {\n const [open,setOpen]=useState(false)\n const [busy,setBusy]=useState(false)\n const [error,setError]=useState('')\n const lock=useRef(false)\n const close=()=>{if(!lock.current)setOpen(false)}\n const remove=async()=>{\n if(lock.current)return\n lock.current=true;setBusy(true);setError('')\n try{\n await api(`/companions/${encodeURIComponent(companionId)}/concerns/${encodeURIComponent(item.id)}`,{method:'DELETE',body:JSON.stringify({expectedUpdatedAt:item.updatedAt})})\n await onDeleted();setOpen(false)\n }catch(e){setError(errorMessage(e))}finally{lock.current=false;setBusy(false)}\n }\n return <><button type=\"button\" className=\"is-danger\" disabled={disabled} onClick={()=>{setError('');setOpen(true)}}>\u5220\u9664\u5173\u6CE8</button>{open && <WorkspaceDialog eyebrow=\"DELETE CONCERN\" title={`\u5220\u9664\u300C${item.subject}\u300D\uFF1F`} detail=\"\u5220\u9664\u5173\u6CE8\u53CA\u5176\u5185\u90E8\u89C2\u5BDF\u3001\u5BA1\u8BA1\u8BB0\u5F55\uFF0C\u4E0D\u80FD\u64A4\u9500\u3002\u5173\u8054\u7684\u77E5\u8BC6\u6587\u6863\u3001\u7B14\u8BB0\u548C\u6587\u4EF6\u4E0D\u4F1A\u5220\u9664\uFF1B\u5DF2\u53D1\u9001\u5230\u804A\u5929\u6216\u6E20\u9053\u7684\u6D88\u606F\u4ECD\u4F1A\u4FDD\u7559\u3002\" close={close}>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <div className=\"dsh-partner-concern-actions\"><button type=\"button\" autoFocus disabled={busy} onClick={close}>\u4FDD\u7559\u5173\u6CE8</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={()=>{void remove()}}>{busy?'\u5220\u9664\u4E2D\u2026':'\u786E\u8BA4\u5220\u9664'}</button></div>\n </WorkspaceDialog>}</>\n}\n\nexport function ArchivedConcerns({companionId, onChanged}: {companionId:string; onChanged():Promise<void>}) {\n const contentId=useId()\n const [open,setOpen]=useState(false)\n const [offset,setOffset]=useState(0)\n const resource=useMemoryResource<{items:ConcernView[];hasMore:boolean}>(open?`/companions/${encodeURIComponent(companionId)}/concerns/archived?offset=${offset}`:undefined)\n const refresh=async()=>{await resource.reload();await onChanged()}\n return <section className=\"dsh-partner-concern-archive\"><button type=\"button\" className=\"dsh-partner-concern-archive-toggle\" aria-label=\"\u5DF2\u5F52\u6863\u5173\u6CE8 \u00B7 \u67E5\u770B\u4E0E\u6E05\u7406\" aria-expanded={open} aria-controls={open?contentId:undefined} onClick={()=>setOpen(!open)}><span><strong>\u5DF2\u5F52\u6863\u5173\u6CE8</strong><small>\u5DF2\u505C\u6B62\u5173\u6CE8\uFF0C\u53EF\u6309\u9700\u6E05\u7406</small></span><IconChevronDownOutline14 size={16}/></button>{open && <div id={contentId} className=\"dsh-partner-concern-archive-content\">\n {resource.error && <WorkspaceNotice>{resource.error}<button type=\"button\" onClick={()=>{void resource.reload()}}>\u91CD\u8BD5</button></WorkspaceNotice>}\n {!resource.data ? !resource.error && <p role=\"status\">\u6B63\u5728\u8BFB\u53D6\u2026</p> : <>{resource.data.items.length===0 && <p>\u6B64\u9875\u6CA1\u6709\u5DF2\u5F52\u6863\u5173\u6CE8\u3002</p>}<div className=\"dsh-partner-concern-archive-list\">{resource.data.items.map(item=><article key={item.id} className=\"dsh-partner-concern-archive-row\"><details className=\"dsh-partner-concern-archive-details\"><summary><IconChevronDownOutline14 size={14}/><strong>{item.subject}</strong></summary><dl><dt>\u6267\u884C\u8BF4\u660E\u4E0E\u8BB0\u5F55\u683C\u5F0F</dt><dd>{item.reason || '\u672A\u586B\u5199'}</dd><dt>\u68C0\u67E5\u4F9D\u636E</dt><dd>{item.resources?.map(source=>source.label || source.locator).join('\u3001') || '\u672A\u5173\u8054'}</dd><dt>\u8BB0\u5F55\u4F4D\u7F6E</dt><dd>{item.recordTarget?.label || '\u4F19\u4F34\u5185\u90E8\u89C2\u5BDF\u8BB0\u5F55\uFF08\u672A\u6307\u5B9A\u6587\u6863\uFF09'}</dd></dl><p>\u5DF2\u505C\u6B62\u540E\u7EED\u68C0\u67E5\u3002\u5220\u9664\u5173\u6CE8\u4E0D\u4F1A\u5220\u9664\u5173\u8054\u6587\u6863\u3002</p></details><div className=\"dsh-partner-concern-archive-action\"><ConcernDeleteButton companionId={companionId} item={item} onDeleted={refresh}/></div></article>)}</div>\n {(offset>0 || resource.data.hasMore) && <nav className=\"dsh-partner-concern-archive-pages\" aria-label=\"\u5F52\u6863\u5173\u6CE8\u5206\u9875\"><span>\u7B2C {Math.floor(offset/50)+1} \u9875</span><div><button type=\"button\" disabled={offset===0 || resource.loading} onClick={()=>setOffset(Math.max(0,offset-50))}>\u4E0A\u4E00\u9875</button><button type=\"button\" disabled={!resource.data.hasMore || resource.loading} onClick={()=>setOffset(offset+50)}>\u4E0B\u4E00\u9875</button></div></nav>}</>}\n </div>}</section>\n}\n", "import {useRef, useState} from 'react'\nimport {api, type ConcernView, type ConcernRecordTargetView} from '../../client-api.js'\nimport {ConcernRecordFields} from './concern-record-fields.js'\nimport {errorMessage} from '../workspace-components.js'\n\nexport function ConcernEditor({companionId, item, close, saved}: {companionId:string; item:ConcernView; close():void; saved():Promise<void>}) {\n const [subject,setSubject] = useState(item.subject)\n const [reason,setReason] = useState(item.reason)\n const [sources,setSources] = useState(item.resources.map(r => r.kind === 'knowledge' ? `@\u77E5\u8BC6\u5E93[${r.locator}]` : `@\"${r.locator}\"`).join('\\n'))\n const [target,setTarget] = useState<ConcernRecordTargetView | undefined>(item.recordTarget)\n const [busy,setBusy] = useState(false)\n const [error,setError] = useState('')\n const lock=useRef(false)\n return <form className=\"dsh-partner-concern-compose\" aria-label=\"\u7F16\u8F91\u5173\u6CE8\" aria-busy={busy} onSubmit={event=>{event.preventDefault();if(lock.current)return;lock.current=true;setBusy(true);setError('');void (async()=>{\n try {await api(`/companions/${encodeURIComponent(companionId)}/concerns/${encodeURIComponent(item.id)}`,{method:'PATCH',body:JSON.stringify({subject,reason,sources,recordTarget:target??null,expectedUpdatedAt:item.updatedAt})});await saved();close()}\n catch(e){setError(errorMessage(e))}finally{lock.current=false;setBusy(false)}\n })()}}>\n <header className=\"dsh-partner-concern-form-heading\"><strong>\u7F16\u8F91\u5173\u6CE8</strong><p>\u8C03\u6574\u540E\u7EED\u68C0\u67E5\u65B9\u5F0F\uFF0C\u5DF2\u6709\u89C2\u5BDF\u8BB0\u5F55\u4FDD\u7559\u3002</p></header>\n <label><span>\u5173\u6CE8\u4E8B\u9879</span><input autoFocus required value={subject} maxLength={300} onChange={e=>setSubject(e.target.value)} /></label>\n <label><span>\u68C0\u67E5\u4F9D\u636E</span><textarea rows={3} value={sources} maxLength={4000} onChange={e=>setSources(e.target.value)} /><small>\u6BCF\u884C\u4E00\u4E2A @\u77E5\u8BC6\u5E93[\u5E93\u540D/\u6587\u6863\u540D] \u6216 @\"\u6587\u4EF6\u8DEF\u5F84\"\uFF1B\u5220\u9664\u5BF9\u5E94\u884C\u5373\u53EF\u53D6\u6D88\u5173\u8054\u3002\u4F9D\u636E\u53EA\u8BFB\u3002</small></label>\n <ConcernRecordFields companionId={companionId} reason={reason} onReason={setReason} target={target} onTarget={setTarget} />\n <small>\u4FDD\u7559\u5386\u53F2\u548C\u5173\u6CE8\u72B6\u6001\uFF1B\u6B63\u5728\u6267\u884C\u7684\u68C0\u67E5\u4F7F\u7528\u539F\u914D\u7F6E\uFF0C\u4FEE\u6539\u4ECE\u4E0B\u8F6E\u751F\u6548\u3002</small>\n {error && <p role=\"alert\">{error}</p>}\n <div><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy || !subject.trim()}>{busy?'\u4FDD\u5B58\u4E2D\u2026':'\u4FDD\u5B58\u4FEE\u6539'}</button></div>\n </form>\n}\n", "import { useEffect, useId, useState } from 'react'\nimport { api, type ConcernRecordTargetView } from '../../client-api.js'\n\nexport function RecordTargetPicker({ companionId, value, onChange }: {\n companionId: string; value: ConcernRecordTargetView | undefined; onChange(value?: ConcernRecordTargetView): void\n}): JSX.Element {\n const [query, setQuery] = useState('')\n const [open, setOpen] = useState(false)\n const [items, setItems] = useState<ConcernRecordTargetView[]>([])\n const [error, setError] = useState('')\n const [loading, setLoading] = useState(false)\n const hint = useId()\n useEffect(() => {\n if (!open) return\n const controller = new AbortController()\n setLoading(true); setError('')\n const timer = window.setTimeout(() => {\n api<{ items: ConcernRecordTargetView[] }>(`/companions/${encodeURIComponent(companionId)}/recording-sources?q=${encodeURIComponent(query)}`, { signal: controller.signal })\n .then(result => { if (!controller.signal.aborted) setItems(result.items) })\n .catch(() => { if (!controller.signal.aborted) { setItems([]); setError('\u8BB0\u5F55\u4F4D\u7F6E\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u641C\u7D22') } })\n .finally(() => { if (!controller.signal.aborted) setLoading(false) })\n }, 180)\n return () => { window.clearTimeout(timer); controller.abort() }\n }, [companionId, query, open])\n return <section className=\"dsh-partner-record-picker\" aria-label=\"\u9700\u8981\u8BB0\u5F55\u7684\u5730\u65B9\">\n <label><span>\u9700\u8981\u8BB0\u5F55\u7684\u5730\u65B9 \u00B7 \u53EF\u9009</span><input value={query} aria-describedby={hint} placeholder={value ? `${value.kind === 'note' ? '\u7B14\u8BB0' : '\u6587\u4EF6'} \u00B7 ${value.label}` : '\u641C\u7D22\u73B0\u6709\u672C\u5730\u6587\u4EF6\u6216\u7B14\u8BB0\u6587\u6863'} onFocus={() => setOpen(true)} onChange={event => { setQuery(event.target.value); setOpen(true) }} onKeyDown={event => { if (event.key === 'Escape') setOpen(false) }} /></label>\n <small id={hint} className=\"dsh-partner-concern-compose-hint\">\u7559\u7A7A\uFF1A\u89C2\u5BDF\u7ED3\u679C\u4FDD\u5B58\u5728\u4F19\u4F34\u5185\u90E8\u8BB0\u5F55\uFF0C\u4E0D\u521B\u5EFA\u6587\u6863\u3002\u9009\u62E9\u540E\uFF1A\u53E6\u5916\u6574\u7406\u5230\u6B64\u6587\u4EF6\u6216\u7B14\u8BB0\uFF1B\u68C0\u67E5\u4F9D\u636E\u59CB\u7EC8\u53EA\u8BFB\u3002</small>\n {value && <p className=\"dsh-partner-record-selection\">\u5DF2\u9009\u62E9\uFF1A{value.label}<button type=\"button\" onClick={() => { onChange(undefined); setQuery('') }}>\u53D6\u6D88\u8BB0\u5F55</button></p>}\n {open && <div className=\"dsh-partner-record-options\" aria-label=\"\u53EF\u9009\u8BB0\u5F55\u4F4D\u7F6E\">\n {loading ? <p role=\"status\">\u6B63\u5728\u67E5\u627E\u2026</p> : error ? <p role=\"alert\">{error}</p> : items.length === 0 ? <p>\u6CA1\u6709\u53EF\u7528\u4F4D\u7F6E\uFF0C\u8BF7\u5148\u521B\u5EFA\u6587\u4EF6\u6216\u7B14\u8BB0\u3002</p> : items.map(item => <button type=\"button\" key={`${item.kind}:${item.locator}`} aria-pressed={value?.kind === item.kind && value.locator === item.locator} onClick={() => { onChange(item); setQuery(''); setOpen(false) }}><small>{item.kind === 'file' ? '\u672C\u5730\u6587\u4EF6' : '\u7B14\u8BB0\u6587\u6863'}</small><span>{item.label}</span></button>)}\n <button type=\"button\" onClick={() => setOpen(false)}>\u6536\u8D77\u5019\u9009</button>\n </div>}\n </section>\n}\n", "import type {ConcernRecordTargetView} from '../../client-api.js'\nimport {RecordTargetPicker} from './record-target-picker.js'\n\n/** Shared by creation and editing, so recording semantics stay consistent. */\nexport function ConcernRecordFields({companionId, reason, onReason, target, onTarget}: {\n companionId: string; reason: string; onReason(value: string): void\n target: ConcernRecordTargetView | undefined; onTarget(value?: ConcernRecordTargetView): void\n}) {\n return <>\n <label><span>\u6267\u884C\u8BF4\u660E\u4E0E\u8BB0\u5F55\u683C\u5F0F</span><textarea rows={5} value={reason} maxLength={800} onChange={event => onReason(event.target.value)} placeholder=\"\u4F8B\u5982\uFF1A\u6309\u7167\u5173\u8054\u6587\u6863\u68C0\u67E5\uFF1B\u7ED3\u679C\u6309\u65E5\u671F\u6574\u7406\u6210\u8868\u683C\uFF0C\u66F4\u65B0\u5BF9\u5E94\u6761\u76EE\uFF0C\u4FDD\u7559\u4EBA\u5DE5\u5907\u6CE8\u3002\" /><small>\u8BF4\u660E\u5982\u4F55\u68C0\u67E5\u3001\u4F55\u65F6\u63D0\u9192\uFF0C\u4EE5\u53CA\u7ED3\u679C\u5982\u4F55\u6574\u7406\u3002\u53EF\u7559\u7A7A\uFF0C\u6700\u591A 800 \u5B57\u3002</small></label>\n <RecordTargetPicker companionId={companionId} value={target} onChange={onTarget} />\n </>\n}\n", "import { useEffect, useRef, useState, type ChangeEvent } from 'react'\nimport { IconAgentPresetOutline16, IconCheckOutline14, IconPlusOutline16, IconRefreshOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { WorkspaceBlock, WorkspaceHero, WorkspaceNotice, errorMessage } from '../ui/workspace-components.js'\nimport { DEFAULT_PENDANT_SETTINGS, normalizePendantSettings, samePendantSettings, type StrapMaterial, type PendantFps, type CardImageFit } from './settings.js'\nimport { savePendantSettings, usePendantSettings } from './use-settings.js'\nimport { prepareCardImage } from './card-image.js'\nimport { StrapPreview } from './strap-preview.js'\n\nconst MATERIALS: Array<{ id: StrapMaterial; name: string; detail: string }> = [\n { id: 'woven', name: '\u7EC7\u5E26', detail: '\u7EC6\u5BC6\u7EC7\u7EB9' }, { id: 'braided', name: '\u7F16\u7EC7\u7EF3', detail: '\u5706\u6DA6\u7EF3\u80A1' }, { id: 'leather', name: '\u76AE\u9769', detail: '\u5E73\u6574\u7F1D\u7EBF' },\n]\nconst FRAME_RATES: Array<{ fps: PendantFps; label: string }> = [{ fps: 24, label: '\u7701\u7535' }, { fps: 30, label: '\u5747\u8861' }, { fps: 60, label: '\u6D41\u7545' }]\nconst IMAGE_FITS: Array<{ fit: CardImageFit; label: string; detail: string }> = [{ fit: 'contain', label: '\u5B8C\u6574\u663E\u793A', detail: '\u81EA\u9002\u5E94 \u00B7 \u4E0D\u88C1\u5207' }, { fit: 'cover', label: '\u94FA\u6EE1\u88C1\u5207', detail: '\u5C45\u4E2D \u00B7 \u65E0\u7559\u767D' }]\nconst COLORS = ['#617e73', '#46515b', '#b7afa0', '#997365', '#647c98', '#807388']\n\nexport function PendantSettingsPanel(): JSX.Element {\n const settings = usePendantSettings(), [draft, setDraft] = useState(() => ({ ...settings }))\n const [error, setError] = useState(''), [saved, setSaved] = useState(false), [processing, setProcessing] = useState(false)\n const file = useRef<HTMLInputElement>(null), epoch = useRef(0)\n const strapFile = useRef<HTMLInputElement>(null)\n const previous = useRef(settings)\n useEffect(() => {\n const before = previous.current\n previous.current = settings\n // Follow other tabs when clean; never discard a local edit or pending image.\n setDraft(value => samePendantSettings(value, before) ? { ...settings } : value)\n }, [settings])\n useEffect(() => () => { epoch.current++ }, [])\n const update = (patch: Partial<typeof draft>): void => { setDraft(value => ({ ...value, ...patch })); setSaved(false); setError('') }\n const validColor = /^#[0-9a-f]{6}$/i.test(draft.color)\n const previewColor = validColor ? draft.color : DEFAULT_PENDANT_SETTINGS.color\n const dirty = !samePendantSettings(draft, settings)\n const upload = async (event: ChangeEvent<HTMLInputElement>, target: 'image' | 'strapImage' = 'image'): Promise<void> => {\n const selected = event.currentTarget.files?.[0]; event.currentTarget.value = ''\n if (!selected) return\n const request = ++epoch.current\n setProcessing(true); setError(''); setSaved(false)\n try { const image = await prepareCardImage(selected, target === 'strapImage' ? 256 : 1536); if (request === epoch.current) update({ [target]: image }) }\n catch (reason) { if (request === epoch.current) setError(errorMessage(reason)) }\n finally { if (request === epoch.current) setProcessing(false) }\n }\n const save = (): void => {\n if (!validColor) { setError('\u7EF3\u5B50\u989C\u8272\u5E94\u4E3A\u516D\u4F4D\u5341\u516D\u8FDB\u5236\u989C\u8272\uFF0C\u4F8B\u5982 #617e73\u3002'); return }\n try { savePendantSettings(draft); setDraft(normalizePendantSettings(draft)); setSaved(true); setError('') }\n catch (reason) { setError(errorMessage(reason)) }\n }\n return <div className=\"dsh-partner-feature-page dsh-partner-pendant-settings\">\n <WorkspaceHero eyebrow=\"PERSONAL TOUCH\" title=\"\u5361\u7247\u8BBE\u7F6E\" detail=\"\u8BA9\u6302\u9970\u6709\u81EA\u5DF1\u7684\u6837\u5B50\u3002\u5916\u89C2\u4EC5\u4FDD\u5B58\u5728\u5F53\u524D\u6D4F\u89C8\u5668\uFF0C\u4E0D\u5F71\u54CD\u4F19\u4F34\u6267\u884C\u548C\u6E20\u9053\u901A\u77E5\u3002\" actions={<button type=\"button\" disabled={!dirty || processing} onClick={save}><IconCheckOutline14 size={15} />\u4FDD\u5B58\u8BBE\u7F6E</button>} />\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {saved && <WorkspaceNotice kind=\"success\">\u5DF2\u4FDD\u5B58\uFF0C\u6302\u9970\u5DF2\u66F4\u65B0\u3002</WorkspaceNotice>}\n <div className=\"dsh-partner-pendant-settings-layout\">\n <div className=\"dsh-partner-pendant-settings-fields\">\n <WorkspaceBlock title=\"\u4E3B\u754C\u9762\u6302\u9970\" detail=\"\u5173\u95ED\u540E\u505C\u6B62\u6302\u9970\u6E32\u67D3\u4E0E\u6D88\u606F\u8F6E\u8BE2\uFF0C\u968F\u65F6\u53EF\u4EE5\u91CD\u65B0\u5F00\u542F\u3002\" actions={<button type=\"button\" className=\"dsh-partner-feature-switch\" data-on={draft.enabled} role=\"switch\" aria-label=\"\u663E\u793A\u5361\u7247\u6302\u9970\" aria-checked={draft.enabled} onClick={() => update({ enabled: !draft.enabled })}><i /></button>}><p className=\"dsh-partner-pendant-setting-hint\">\u6D88\u606F\u4FDD\u7559\u5728\u5361\u7247\u5185\u4FA7\uFF1B\u6B63\u9762\u5C55\u793A\u56FE\u6848\uFF0C\u65B0\u6D88\u606F\u5230\u8FBE\u65F6\u8F7B\u6446\u3001\u8F6C\u6B63\u5E76\u95EA\u5149\u3002</p>\n <div className=\"dsh-partner-pendant-fps-row\"><span>\u5E27\u7387\u4E0A\u9650</span><div className=\"dsh-partner-pendant-options\" role=\"group\" aria-label=\"\u6302\u9970\u5E27\u7387\">{FRAME_RATES.map(item => <button key={item.fps} type=\"button\" aria-pressed={draft.fps === item.fps} onClick={() => update({ fps: item.fps })}><strong>{item.fps} FPS</strong><small>{item.label}</small></button>)}</div><small>\u4EC5\u5F71\u54CD\u52A8\u753B\u7ED8\u5236\uFF0C\u5B9E\u9645\u5E27\u7387\u53D6\u51B3\u4E8E\u8BBE\u5907\uFF1B\u9759\u6B62\u65F6\u81EA\u52A8\u4F11\u7720\u3002</small></div>\n </WorkspaceBlock>\n <WorkspaceBlock title=\"\u7EF3\u5B50\u5916\u89C2\" detail=\"\u6750\u8D28\u53EA\u6539\u53D8\u5916\u89C2\uFF0C\u4FDD\u7559\u5F53\u524D\u7684\u62C9\u4F38\u4E0E\u56DE\u5F39\u624B\u611F\u3002\">\n <label className=\"dsh-partner-pendant-length\"><span>\u7EF3\u5B50\u957F\u5EA6 <output>{draft.strapLength}%</output></span><input type=\"range\" min=\"60\" max=\"160\" step=\"5\" aria-label=\"\u7EF3\u5B50\u957F\u5EA6\" value={draft.strapLength} onChange={event => update({ strapLength: Number(event.target.value) })} /><small>60% \u77ED\u7EF3 \u2014 100% \u9ED8\u8BA4 \u2014 160% \u957F\u7EF3\uFF1B\u4FDD\u5B58\u540E\u8C03\u6574\u5B9E\u9645\u60AC\u6302\u957F\u5EA6\u3002</small></label>\n <div className=\"dsh-partner-pendant-materials\" role=\"group\" aria-label=\"\u7EF3\u5B50\u6750\u8D28\">{MATERIALS.map(item => <button key={item.id} type=\"button\" aria-pressed={draft.material === item.id} onClick={() => update({ material: item.id })}><StrapPreview material={item.id} color={previewColor} swatch /><strong>{item.name}</strong><small>{item.detail}</small>{draft.material === item.id && <IconCheckOutline14 size={14} />}</button>)}</div>\n <div className=\"dsh-partner-pendant-color-row\"><span>\u7EF3\u5B50\u989C\u8272</span><div className=\"dsh-partner-pendant-swatches\" role=\"group\" aria-label=\"\u9884\u8BBE\u7EF3\u5B50\u989C\u8272\">{COLORS.map(color => <button key={color} type=\"button\" aria-label={`\u7EF3\u5B50\u989C\u8272 ${color}`} aria-pressed={draft.color.toLowerCase() === color} onClick={() => update({ color })}><i style={{ backgroundColor: color }} />{draft.color.toLowerCase() === color && <IconCheckOutline14 size={12} />}</button>)}</div><label className=\"dsh-partner-pendant-hex\"><span className=\"dsh-partner-pendant-sr\">\u81EA\u5B9A\u4E49\u7EF3\u5B50\u989C\u8272</span><input aria-label=\"\u81EA\u5B9A\u4E49\u7EF3\u5B50\u989C\u8272\" aria-invalid={!validColor} value={draft.color} maxLength={7} spellCheck={false} onChange={event => update({ color: event.target.value })} /></label></div>\n {!validColor && <p className=\"dsh-partner-pendant-color-error\">\u8BF7\u8F93\u5165 # \u5F00\u5934\u7684\u516D\u4F4D\u989C\u8272\u503C\u3002</p>}\n <input ref={strapFile} type=\"file\" accept=\"image/png,image/jpeg,image/webp\" hidden aria-label=\"\u4E0A\u4F20\u7EF3\u5B50\u7EB9\u7406\" onChange={event => { void upload(event, 'strapImage') }} />\n <div className=\"dsh-partner-pendant-image-actions\"><button type=\"button\" disabled={processing} onClick={() => strapFile.current?.click()}><IconPlusOutline16 size={15} />{draft.strapImage ? '\u66F4\u6362\u7EF3\u5B50\u7EB9\u7406' : '\u81EA\u5B9A\u4E49\u7EF3\u5B50\u7EB9\u7406'}</button><button type=\"button\" disabled={processing || !draft.strapImage} onClick={() => update({ strapImage: '' })}>\u79FB\u9664\u7EB9\u7406</button></div>\n <p className=\"dsh-partner-pendant-setting-hint\">\u7EB9\u7406\u6CBF\u7EF3\u5B50\u91CD\u590D\u8D34\u5408\uFF0C\u8DDF\u968F\u79FB\u52A8\u3001\u5F2F\u66F2\u548C\u62C9\u4F38\uFF1B\u5EFA\u8BAE\u4F7F\u7528\u65E0\u7F1D\u56FE\u6848\uFF0C\u4FDD\u7559\u6240\u9009\u6750\u8D28\u7684\u8FB9\u7F18\u548C\u7F16\u7EC7\u7EC6\u8282\u3002</p>\n </WorkspaceBlock>\n <WorkspaceBlock title=\"\u6B63\u9762\u56FE\u6848\" detail=\"\u652F\u6301 PNG\u3001JPEG\u3001WebP\uFF0C\u6700\u5927 5 MB\u3002\u4FDD\u7559\u56FE\u7247\u6BD4\u4F8B\uFF0C\u53EA\u5728\u672C\u673A\u5904\u7406\u3002\">\n <input ref={file} type=\"file\" accept=\"image/png,image/jpeg,image/webp\" hidden aria-label=\"\u4E0A\u4F20\u5361\u7247\u56FE\u7247\" onChange={event => { void upload(event) }} />\n <div className=\"dsh-partner-pendant-image-actions\"><button type=\"button\" disabled={processing} onClick={() => file.current?.click()}><IconPlusOutline16 size={15} />{processing ? '\u6B63\u5728\u5904\u7406\u2026' : draft.image ? '\u66F4\u6362\u56FE\u7247' : '\u9009\u62E9\u56FE\u7247'}</button><button type=\"button\" disabled={!draft.image || processing} onClick={() => update({ image: '' })}><IconRefreshOutline16 size={15} />\u6062\u590D\u9ED8\u8BA4\u56FE\u6848</button></div>\n <div className=\"dsh-partner-pendant-options\" data-columns=\"2\" role=\"group\" aria-label=\"\u56FE\u7247\u9002\u5E94\u65B9\u5F0F\">{IMAGE_FITS.map(item => <button key={item.fit} type=\"button\" disabled={processing} aria-pressed={draft.imageFit === item.fit} onClick={() => update({ imageFit: item.fit })}><strong>{item.label}</strong><small>{item.detail}</small></button>)}</div>\n <p className=\"dsh-partner-pendant-setting-hint\">\u5B8C\u6574\u663E\u793A\u4F1A\u6309\u6BD4\u4F8B\u7F29\u653E\uFF0C\u7A7A\u4F59\u90E8\u5206\u4F7F\u7528\u5361\u9762\u5E95\u8272\uFF1B\u94FA\u6EE1\u4F1A\u88C1\u5207\u8FB9\u7F18\uFF0C\u4E0D\u62C9\u4F38\u56FE\u7247\u3002\u65E7\u7248\u5DF2\u88C1\u5207\u7684\u56FE\u7247\u9700\u91CD\u65B0\u4E0A\u4F20\u624D\u80FD\u6062\u590D\u5B8C\u6574\u5185\u5BB9\u3002</p>\n <label className=\"dsh-partner-pendant-length\"><span>\u5361\u7247\u6E05\u6670\u5EA6 <output>{draft.quality}%</output></span><input type=\"range\" min=\"0\" max=\"100\" step=\"5\" value={draft.quality} aria-label=\"\u5361\u7247\u6E05\u6670\u5EA6\" onChange={event => update({ quality: Number(event.target.value) })} /><small>0% \u6807\u51C6\u3001\u7701\u8D44\u6E90 \u2014 100% \u9AD8\u6E05\uFF1B\u4FDD\u5B58\u540E\u751F\u6548\uFF0C\u4E0D\u6539\u53D8\u5E27\u7387\u4E0A\u9650\u3002</small></label>\n <p className=\"dsh-partner-pendant-setting-hint\">\u56FE\u6848\u4F18\u5148\u65E0\u635F\u4FDD\u5B58\uFF0C\u6700\u957F\u8FB9\u4FDD\u7559\u81F3 1536 \u50CF\u7D20\u3002\u5DF2\u538B\u7F29\u7684\u65E7\u56FE\u7247\u5EFA\u8BAE\u91CD\u65B0\u4E0A\u4F20\uFF1B\u9AD8\u6E05\u65E0\u6CD5\u6062\u590D\u539F\u56FE\u7F3A\u5931\u7684\u7EC6\u8282\u3002</p>\n </WorkspaceBlock>\n <div className=\"dsh-partner-pendant-settings-footer\"><button type=\"button\" disabled={processing} onClick={() => update({ ...DEFAULT_PENDANT_SETTINGS })}>\u91CD\u7F6E\u4E3A\u9ED8\u8BA4</button><small>{dirty ? '\u6709\u672A\u4FDD\u5B58\u7684\u66F4\u6539' : '\u8BBE\u7F6E\u5DF2\u540C\u6B65\u5230\u5F53\u524D\u6D4F\u89C8\u5668'}</small></div>\n </div>\n <aside className=\"dsh-partner-pendant-preview\" aria-label=\"\u5361\u7247\u5916\u89C2\u9884\u89C8\"><header><strong>\u5916\u89C2\u9884\u89C8</strong><small>{draft.enabled ? '\u4FDD\u5B58\u540E\u5E94\u7528\u5230\u4E3B\u754C\u9762' : '\u6302\u9970\u5C06\u9690\u85CF\uFF0C\u8BBE\u7F6E\u4ECD\u4F1A\u4FDD\u7559'}</small></header><div className=\"dsh-partner-pendant-preview-stage\"><StrapPreview material={draft.material} color={previewColor} image={draft.strapImage} length={draft.strapLength} /><div className=\"dsh-partner-pendant-preview-card\">{draft.image ? <img src={draft.image} style={{ objectFit: draft.imageFit }} alt=\"\u81EA\u5B9A\u4E49\u5361\u7247\u6B63\u9762\u9884\u89C8\" /> : <span><IconAgentPresetOutline16 size={38} /><strong>WITH YOU</strong><small>\u9ED8\u8BA4\u4F19\u4F34\u56FE\u6848</small></span>}</div></div><p>\u6B63\u9762 \u00B7 \u56FE\u6848<br /><small>\u5185\u4FA7 \u00B7 \u4F19\u4F34\u6D88\u606F</small></p></aside>\n </div>\n </div>\n}\n", "export type StrapMaterial = 'woven' | 'braided' | 'leather'\nexport type PendantFps = 24 | 30 | 60\nexport type CardImageFit = 'contain' | 'cover'\nexport interface PendantSettings { enabled: boolean; fps: PendantFps; material: StrapMaterial; color: string; image: string; imageFit: CardImageFit; strapLength: number; strapImage: string; quality: number }\nexport const PENDANT_SETTINGS_KEY = 'dsh-partner:pendant-settings:v1'\nexport const DEFAULT_PENDANT_SETTINGS: Readonly<PendantSettings> = Object.freeze({ enabled: true, fps: 30, material: 'woven', color: '#617e73', image: '', imageFit: 'contain', strapLength: 100, strapImage: '', quality: 100 })\nexport const MAX_CARD_IMAGE_LENGTH = 700_000\n\nexport function samePendantSettings(a: PendantSettings, b: PendantSettings): boolean {\n return a.enabled === b.enabled && a.fps === b.fps && a.material === b.material && a.color === b.color && a.image === b.image && a.imageFit === b.imageFit && a.strapLength === b.strapLength && a.strapImage === b.strapImage && a.quality === b.quality\n}\n\nexport function normalizeStrapLength(value: unknown): number { return typeof value === 'number' && Number.isFinite(value) ? Math.max(60, Math.min(160, Math.round(value))) : 100 }\nexport function normalizeCardQuality(value: unknown): number { return value === 'standard' ? 0 : typeof value === 'number' && Number.isFinite(value) ? Math.max(0, Math.min(100, Math.round(value))) : 100 }\nfunction safeImage(value: unknown): string { return typeof value === 'string' && value.length <= MAX_CARD_IMAGE_LENGTH && /^data:image\\/(jpeg|png|webp);base64,[a-z0-9+/]+={0,2}$/i.test(value) ? value : '' }\n\nexport function normalizePendantFps(value: unknown): PendantFps { return value === 24 || value === 60 ? value : 30 }\n\nexport function normalizePendantSettings(value: unknown): PendantSettings {\n const input = value && typeof value === 'object' ? value as Partial<PendantSettings> : {}\n return {\n enabled: typeof input.enabled === 'boolean' ? input.enabled : true,\n fps: normalizePendantFps(input.fps),\n strapLength: normalizeStrapLength(input.strapLength),\n strapImage: safeImage(input.strapImage),\n quality: normalizeCardQuality(input.quality),\n imageFit: input.imageFit === 'cover' ? 'cover' : 'contain',\n material: input.material === 'braided' || input.material === 'leather' ? input.material : 'woven',\n color: typeof input.color === 'string' && /^#[0-9a-f]{6}$/i.test(input.color) ? input.color.toLowerCase() : DEFAULT_PENDANT_SETTINGS.color,\n image: safeImage(input.image),\n }\n}\n", "import { useSyncExternalStore } from 'react'\nimport { DEFAULT_PENDANT_SETTINGS, normalizePendantSettings, PENDANT_SETTINGS_KEY, type PendantSettings } from './settings.js'\n\nlet current: PendantSettings | undefined\nconst listeners = new Set<() => void>()\nfunction load(): PendantSettings {\n try { return normalizePendantSettings(JSON.parse(localStorage.getItem(PENDANT_SETTINGS_KEY) ?? 'null')) }\n catch { return { ...DEFAULT_PENDANT_SETTINGS } }\n}\nfunction changed(): void { for (const listener of listeners) listener() }\nfunction storage(event: StorageEvent): void {\n if (event.key !== null && event.key !== PENDANT_SETTINGS_KEY) return\n current = load(); changed()\n}\nfunction subscribe(listener: () => void): () => void {\n if (!listeners.size) { current = load(); window.addEventListener('storage', storage) }\n listeners.add(listener)\n return () => { listeners.delete(listener); if (!listeners.size) window.removeEventListener('storage', storage) }\n}\nexport function usePendantSettings(): PendantSettings {\n return useSyncExternalStore(subscribe, () => current ??= load(), () => DEFAULT_PENDANT_SETTINGS)\n}\nexport function savePendantSettings(settings: PendantSettings): void {\n const next = normalizePendantSettings(settings)\n try { localStorage.setItem(PENDANT_SETTINGS_KEY, JSON.stringify(next)) }\n catch { throw new Error('\u65E0\u6CD5\u4FDD\u5B58\u5361\u7247\u8BBE\u7F6E\uFF0C\u8BF7\u68C0\u67E5\u6D4F\u89C8\u5668\u5B58\u50A8\u6743\u9650\u6216\u5269\u4F59\u7A7A\u95F4\u3002\u539F\u8BBE\u7F6E\u672A\u66F4\u6539\u3002') }\n current = next; changed()\n}\n", "import { MAX_CARD_IMAGE_LENGTH, type CardImageFit } from './settings.js'\n\nexport const CARD_IMAGE_BACKGROUND = '#253235'\n\n/** Keep aspect ratio in both modes; only cover may extend beyond the face. */\nexport function cardImageRect(width: number, height: number, targetWidth: number, targetHeight: number, fit: CardImageFit) {\n if (![width, height, targetWidth, targetHeight].every(value => Number.isFinite(value) && value > 0)) throw new Error('\u56FE\u7247\u5C3A\u5BF8\u65E0\u6548\u3002')\n const scale = (fit === 'cover' ? Math.max : Math.min)(targetWidth / width, targetHeight / height)\n return { x: (targetWidth - width * scale) / 2, y: (targetHeight - height * scale) / 2, width: width * scale, height: height * scale }\n}\n\nexport function drawCardImage(canvas: HTMLCanvasElement, image: HTMLImageElement, fit: CardImageFit): void {\n const context = canvas.getContext('2d')\n if (!context) throw new Error('\u5F53\u524D\u6D4F\u89C8\u5668\u65E0\u6CD5\u5904\u7406\u56FE\u7247\u3002')\n const rect = cardImageRect(image.naturalWidth, image.naturalHeight, canvas.width, canvas.height, fit)\n context.fillStyle = CARD_IMAGE_BACKGROUND\n context.imageSmoothingEnabled = true\n context.imageSmoothingQuality = 'high'\n context.fillRect(0, 0, canvas.width, canvas.height)\n context.drawImage(image, rect.x, rect.y, rect.width, rect.height)\n}\n\nexport function loadCardImage(source: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image()\n image.onload = () => { image.onload = image.onerror = null; resolve(image) }\n image.onerror = () => { image.onload = image.onerror = null; reject(new Error('\u56FE\u7247\u65E0\u6CD5\u89E3\u7801\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9 PNG\u3001JPEG \u6216 WebP \u56FE\u7247\u3002')) }\n image.src = source\n })\n}\n\n/** Persist a bounded source with its aspect ratio intact, so fitting remains\n * reversible. No remote URLs, SVG execution, server upload or full-size GPU textures.\n */\nexport async function prepareCardImage(file: File, maxDimension = 1536): Promise<string> {\n if (!['image/png', 'image/jpeg', 'image/webp'].includes(file.type)) throw new Error('\u8BF7\u9009\u62E9 PNG\u3001JPEG \u6216 WebP \u56FE\u7247\u3002')\n if (file.size > 5 * 1024 * 1024) throw new Error('\u56FE\u7247\u4E0D\u80FD\u8D85\u8FC7 5 MB\u3002')\n const url = URL.createObjectURL(file)\n try {\n const image = await loadCardImage(url)\n if (!image.naturalWidth || !image.naturalHeight || image.naturalWidth * image.naturalHeight > 25_000_000) throw new Error('\u56FE\u7247\u5206\u8FA8\u7387\u8FC7\u5927\uFF0C\u8BF7\u7F29\u5C0F\u81F3 2500 \u4E07\u50CF\u7D20\u4EE5\u5185\u3002')\n const scale = Math.min(1, maxDimension / Math.max(image.naturalWidth, image.naturalHeight))\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(image.naturalWidth * scale))\n canvas.height = Math.max(1, Math.round(image.naturalHeight * scale))\n const context = canvas.getContext('2d')\n if (!context) throw new Error('\u5F53\u524D\u6D4F\u89C8\u5668\u65E0\u6CD5\u5904\u7406\u56FE\u7247\u3002')\n context.imageSmoothingQuality = 'high'\n context.fillStyle = CARD_IMAGE_BACKGROUND; context.fillRect(0, 0, canvas.width, canvas.height)\n context.drawImage(image, 0, 0, canvas.width, canvas.height)\n // Prefer lossless for text/illustrations; bounded high-quality compression\n // for photos avoids silently consuming the browser's storage quota.\n const png = canvas.toDataURL('image/png')\n if (png.length <= MAX_CARD_IMAGE_LENGTH) return png\n for (const quality of [.94, .88, .8]) {\n const result = canvas.toDataURL('image/webp', quality)\n if (result.length <= MAX_CARD_IMAGE_LENGTH) return result\n }\n throw new Error('\u56FE\u7247\u538B\u7F29\u540E\u4ECD\u7136\u8FC7\u5927\uFF0C\u8BF7\u7F29\u5C0F\u56FE\u7247\u6216\u4F7F\u7528\u66F4\u7B80\u6D01\u7684\u56FE\u6848\u3002')\n } finally { URL.revokeObjectURL(url) }\n}\n", "import { Fragment, useId, useMemo } from 'react'\nimport type { PendantSettings } from './settings.js'\nimport { strapGeometry } from './strap-geometry.js'\nimport { STRAP_TEXTURE_SEGMENTS, strapTextureTransform } from './strap-texture.js'\n\nexport function StrapPreview({ material, color, swatch = false, image = '', length = 100 }: Pick<PendantSettings, 'material' | 'color'> & { swatch?: boolean; image?: string; length?: number }): JSX.Element {\n const id = useId().replace(/:/g, '')\n const points = useMemo(() => Array.from({ length: STRAP_TEXTURE_SEGMENTS + 1 }, (_, i) => swatch ? { x: 8 + 104 * i / STRAP_TEXTURE_SEGMENTS, y: 20 } : { x: 50, y: 6 + 121 * i / STRAP_TEXTURE_SEGMENTS }), [swatch])\n const layers = useMemo(() => strapGeometry(swatch ? [{ x: 8, y: 20 }, { x: 112, y: 20 }] : [{ x: 50, y: 6 }, { x: 50, y: 127 }], { material, color }, swatch ? 100 : 72), [material, color, swatch])\n return <svg className={swatch ? 'dsh-partner-strap-swatch' : undefined} style={swatch ? undefined : { height: `${130 * length / 100}px` }} viewBox={swatch ? '0 0 120 40' : '0 0 100 130'} preserveAspectRatio=\"none\" aria-hidden=\"true\">\n {image && <defs><pattern id={id} patternUnits=\"userSpaceOnUse\" width=\"1\" height=\"4\"><image href={image} width=\"1\" height=\"4\" preserveAspectRatio=\"none\" /></pattern></defs>}\n {layers.map(layer => <Fragment key={layer.id}><path d={layer.d} fill=\"none\" stroke={layer.stroke} strokeWidth={layer.width} opacity={layer.opacity} strokeLinecap=\"round\" strokeLinejoin=\"round\" />{image && layer.id === 'surface' && points.slice(0, -1).map((p, i) => <rect key={i} x=\"0\" y={i - .005} width=\"1\" height=\"1.01\" fill={`url(#${id})`} transform={strapTextureTransform(p, points[i + 1]!, layer.width, i)} />)}</Fragment>)}\n {!swatch && <rect x=\"42\" y=\"3\" width=\"16\" height=\"6\" rx=\"3\" fill=\"#c3ced0\" />}\n </svg>\n}\n", "import type { PendantSettings } from './settings.js'\n\nfunction mix(color: string, target: number, amount: number): string {\n const channels = [1, 3, 5].map(offset => Math.round(parseInt(color.slice(offset, offset + 2), 16) * (1 - amount) + target * amount))\n return '#' + channels.map(value => value.toString(16).padStart(2, '0')).join('')\n}\n\n/** World-unit width and color-relative textile lighting. */\nexport function strapStyle({ color, material }: Pick<PendantSettings, 'color' | 'material'>) {\n return {\n width: { woven: .17, braided: .145, leather: .195 }[material],\n band: color, edge: mix(color, 0, .52), shade: mix(color, 0, .3),\n light: mix(color, 255, .48), thread: mix(color, 255, .72),\n }\n}\n", "import type { PendantSettings } from './settings.js'\nimport { strapStyle } from './strap-style.js'\n\nexport interface StrapPoint { x: number; y: number }\nexport interface StrapLayer { id: string; d: string; stroke: string; width: number; opacity: number }\nconst point = (p: StrapPoint): string => p.x.toFixed(2) + ' ' + p.y.toFixed(2)\n\n/** Shared live/preview geometry. Texture follows arc distance/tangent, not\n * screen axes. At most 256 samples / 8 paths, no filters or per-thread nodes.\n */\nexport function strapGeometry(points: readonly StrapPoint[], settings: Pick<PendantSettings, 'material' | 'color'>, scale: number): StrapLayer[] {\n if (points.length < 2 || !Number.isFinite(scale) || scale <= 0 || points.some(p => !Number.isFinite(p.x) || !Number.isFinite(p.y))) return []\n const style = strapStyle(settings), width = style.width * scale\n const lengths = [0]\n for (let i = 1; i < points.length; i++) lengths.push(lengths[i - 1]! + Math.hypot(points[i]!.x - points[i - 1]!.x, points[i]!.y - points[i - 1]!.y))\n const total = lengths.at(-1)!\n if (total < .01) return []\n const count = Math.min(256, Math.max(2, Math.ceil(total / Math.max(1.5, width * .18))))\n let segment = 1\n const samples = Array.from({ length: count + 1 }, (_, i) => {\n const distance = total * i / count\n while (segment < points.length - 1 && lengths[segment]! < distance) segment++\n const a = points[segment - 1]!, b = points[segment]!, length = lengths[segment]! - lengths[segment - 1]!\n const t = length > 0 ? (distance - lengths[segment - 1]!) / length : 0\n return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t, nx: length ? -(b.y - a.y) / length : 1, ny: length ? (b.x - a.x) / length : 0, distance }\n })\n const at = (i: number, offset: number): StrapPoint => { const p = samples[i]!; return { x: p.x + p.nx * offset, y: p.y + p.ny * offset } }\n const line = (offset: number | ((distance: number) => number)): string => samples.map((p, i) => (i ? 'L' : 'M') + point(at(i, typeof offset === 'number' ? offset : offset(p.distance)))).join('')\n const layers: StrapLayer[] = []\n const add = (id: string, d: string, stroke: string, thickness: number, opacity = 1): void => { layers.push({ id, d, stroke, width: thickness, opacity }) }\n add('edge', line(0), style.edge, width)\n add('surface', line(0), style.band, width * .84)\n if (settings.material === 'woven') {\n add('selvedge', line(-width * .36) + line(width * .36), style.light, width * .065, .85)\n add('warp', line(-width * .15) + line(width * .15), style.shade, width * .075, .7)\n let ribs = ''\n for (let i = 1; i < count; i += 2) ribs += 'M' + point(at(i, -width * .3)) + 'L' + point(at(i, width * .3))\n add('weft', ribs, style.thread, Math.max(.55, width * .07), .6)\n } else if (settings.material === 'leather') {\n add('rolled-edge', line(-width * .37), style.light, width * .09, .75)\n add('polish', line(-width * .11), style.light, width * .22, .16)\n let stitches = ''\n for (let i = 1; i < count - 1; i += 4) for (const side of [-1, 1]) stitches += 'M' + point(at(i, side * width * .28)) + 'L' + point(at(i + 1, side * width * .28))\n add('seam-shadow', stitches, style.edge, width * .16, .85)\n add('double-stitch', stitches, style.thread, Math.max(.65, width * .085))\n } else {\n const pitch = width * 1.2\n const wave = (distance: number): number => Math.sin(distance / pitch * Math.PI * 2) * width * .27\n const left = line(wave), right = line(distance => -wave(distance))\n add('strand-grooves', left + right, style.edge, width * .42)\n add('strand-body', left + right, style.light, width * .27, .8)\n let over = '', lit = ''\n for (let i = 0; i < count; i++) {\n const s = samples[i]!, end = samples[i + 1]!\n const sign = Math.cos((s.distance + end.distance) / 2 / pitch * Math.PI * 2) >= 0 ? 1 : -1\n const a = wave(s.distance) * sign, b = wave(end.distance) * sign\n over += 'M' + point(at(i, a)) + 'L' + point(at(i + 1, b))\n lit += 'M' + point(at(i, a - width * .055)) + 'L' + point(at(i + 1, b - width * .055))\n }\n add('overpass', over, style.band, width * .25)\n add('strand-sheen', lit, style.thread, width * .095, .95)\n }\n return layers\n}\n", "import type { StrapPoint } from './strap-geometry.js'\n\nexport const STRAP_TEXTURE_SEGMENTS = 48\n\n/** Material coordinates stay attached to a fixed curve sample, never the viewport. */\nexport function strapTextureTransform(a: StrapPoint, b: StrapPoint, width: number, index: number): string {\n const dx = b.x - a.x, dy = b.y - a.y, distance = Math.hypot(dx, dy)\n const nx = distance > .0001 ? -dy / distance * width : width\n const ny = distance > .0001 ? dx / distance * width : 0\n return `matrix(${nx} ${ny} ${dx} ${dy} ${a.x - nx / 2 - dx * index} ${a.y - ny / 2 - dy * index})`\n}\n", "import { useCallback, useEffect, useRef, useState } from 'react'\nimport { PARTNER_API } from '../client-api.js'\nimport type { PartnerNotice } from '../notifications/domain.js'\nimport type { PartnerController } from '../client-controller.js'\nimport type { BadgeMessage, LanyardHandle, LanyardOptions } from './renderer.js'\nimport { usePartnerInbox } from './use-inbox.js'\nimport { usePendantPlacement } from './use-placement.js'\nimport { PendantReader } from './reader.js'\nimport { usePendantSettings } from './use-settings.js'\nimport type { PendantSettings } from './settings.js'\n\nfunction messageLabel(notice: PartnerNotice): string {\n if (notice.kind === 'reply') return '\u6709\u65B0\u56DE\u590D'\n if (notice.kind === 'task' && notice.title.startsWith('\u9047\u5230\u963B\u585E \u00B7 ')) return '\u4EFB\u52A1\u53D7\u963B'\n if (notice.kind === 'schedule' && notice.title.startsWith('\u672A\u5B8C\u6210 \u00B7 ')) return '\u5C1A\u672A\u5B8C\u6210'\n return notice.kind === 'task' ? '\u4EFB\u52A1\u5B8C\u6210' : '\u5B9A\u65F6\u5B8C\u6210'\n}\n\nexport function PartnerPendant({ controller }: { controller: PartnerController }): JSX.Element | null {\n const settings = usePendantSettings()\n return settings.enabled ? <ActivePendant controller={controller} settings={settings} /> : null\n}\n\nfunction ActivePendant({ controller, settings }: { controller: PartnerController; settings: PendantSettings }): JSX.Element {\n const root = useRef<HTMLElement>(null), canvas = useRef<HTMLCanvasElement>(null), hit = useRef<HTMLButtonElement>(null)\n const unreadBadge = useRef<HTMLSpanElement>(null)\n const handle = useRef<LanyardHandle>(), toggle = useRef(() => {})\n const [open, setOpen] = useState(false), [ready, setReady] = useState(false), [failed, setFailed] = useState(false)\n const [selected, setSelected] = useState<string>(), [navigationError, setNavigationError] = useState('')\n const { inbox, incoming, error, read } = usePartnerInbox()\n const latestUnread = inbox.items.find(item => item.readAt === undefined)\n const badgeMessage: BadgeMessage | undefined = latestUnread ? { id: latestUnread.id, count: inbox.unread, name: latestUnread.companionName, label: messageLabel(latestUnread) } : undefined\n const messageRef = useRef(badgeMessage)\n const settingsRef = useRef(settings)\n settingsRef.current = settings\n messageRef.current = badgeMessage\n const placement = usePendantPlacement(root, handle)\n const close = useCallback((keyboard = false): void => {\n setOpen(false)\n if (keyboard) requestAnimationFrame(() => hit.current?.focus({ preventScroll: true }))\n }, [])\n const inspect = (item?: PartnerNotice): void => { setSelected(item?.id); if (item && item.readAt === undefined) void read([item.id]) }\n toggle.current = () => {\n if (open) { close(); return }\n setNavigationError(''); inspect(latestUnread); setOpen(true)\n }\n useEffect(() => {\n const abort = new AbortController()\n const url = `${PARTNER_API}/pendant/renderer.js`\n void import(/* @vite-ignore */ url).then(async (module: { createLanyard(canvas: HTMLCanvasElement, hit: HTMLButtonElement, options: LanyardOptions): Promise<LanyardHandle> }) => {\n if (abort.signal.aborted || !canvas.current || !hit.current) return\n const instance = await module.createLanyard(canvas.current, hit.current, {\n signal: abort.signal, onTap: () => toggle.current(), onFailure: () => { handle.current?.destroy(); handle.current = undefined; setReady(false); setFailed(true) },\n ...(unreadBadge.current ? { unreadBadge: unreadBadge.current } : {}),\n })\n if (abort.signal.aborted) { instance.destroy(); return }\n handle.current = instance; instance.setAppearance(settingsRef.current); instance.setMessage(messageRef.current); setReady(true)\n }).catch(() => { if (!abort.signal.aborted) { setFailed(true); setReady(false) } })\n return () => { abort.abort(); handle.current?.destroy(); handle.current = undefined }\n }, [])\n useEffect(() => { handle.current?.setMessage(badgeMessage) }, [inbox, ready])\n useEffect(() => { handle.current?.setAppearance(settings) }, [settings, ready])\n const visit = async (item: PartnerNotice): Promise<void> => {\n setNavigationError('')\n try {\n if (item.routeId && item.sessionId) await controller.openSession(item.routeId, item.sessionId)\n else controller.open(item.companionId, { page: item.kind === 'task' ? 'board' : item.kind === 'schedule' ? 'schedules' : 'home', ...(item.taskId ? { taskId: item.taskId } : {}) })\n close()\n } catch (reason) { setNavigationError(reason instanceof Error ? reason.message : '\u65E0\u6CD5\u6253\u5F00\u6765\u6E90') }\n }\n const label = `\u4F19\u4F34\u6D88\u606F\uFF0C${inbox.unread} \u6761\u672A\u8BFB${latestUnread ? `\uFF0C${latestUnread.companionName}\uFF1A${latestUnread.title}` : ''}\uFF1B\u70B9\u51FB\u67E5\u770B\uFF0C\u62D6\u52A8\u5361\u724C\u73A9\u800D`\n return <aside ref={root} className=\"dsh-partner-pendant\" aria-label=\"\u4F19\u4F34\u6302\u9970\">\n <canvas ref={canvas} className=\"dsh-partner-pendant-canvas\" aria-hidden=\"true\" />\n <button ref={hit} type=\"button\" className={`dsh-partner-pendant-hit${ready ? ' is-rendered' : ''}`} aria-label={label} aria-expanded={open} aria-controls={open ? 'dsh-partner-pendant-inbox' : undefined} onClick={() => { if (!ready) toggle.current() }}>\n {!ready && <span className=\"dsh-partner-pendant-fallback\">\u4F19\u4F34<small>{failed ? inbox.unread ? `${inbox.unread} \u6761\u6D88\u606F` : '\u6D88\u606F' : '\u52A0\u8F7D\u6302\u9970\u2026'}</small></span>}\n </button>\n <button type=\"button\" className=\"dsh-partner-pendant-anchor\" aria-label=\"\u79FB\u52A8\u6302\u9970\u4F4D\u7F6E\uFF0C\u56DE\u8F66\u5438\u9644\u4FA7\u680F\" title=\"\u62D6\u8FD1\u4FA7\u680F\u677E\u624B\u5438\u9644\uFF1B\u65B9\u5411\u952E\u5FAE\u8C03\uFF0C\u56DE\u8F66\u5438\u9644\u4FA7\u680F\" {...placement}><span aria-hidden=\"true\" /></button>\n <span ref={unreadBadge} className=\"dsh-partner-pendant-unread\" hidden={inbox.unread === 0} aria-hidden=\"true\">{inbox.unread > 99 ? '99+' : inbox.unread}</span>\n <span className=\"dsh-partner-pendant-announcement\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">{incoming ? `${incoming.companionName}\uFF1A${incoming.title}` : ''}</span>\n {open && <PendantReader inbox={inbox} selected={selected} error={error || navigationError} anchor={hit} onSelect={inspect} onClose={close} onVisit={item => { void visit(item) }} onReadAll={() => { void read(inbox.items.filter(item => item.readAt === undefined).map(item => item.id)) }} />}\n </aside>\n}\n", "import { useCallback, useEffect, useRef, useState } from 'react'\nimport { PARTNER_API, api } from '../client-api.js'\nimport type { PartnerInbox, PartnerNotice } from '../notifications/domain.js'\n\n/** One conditional poll while visible, with bounded error backoff and cancellation. */\nexport function usePartnerInbox(): { inbox: PartnerInbox; incoming: PartnerNotice | undefined; error: string; read(ids: string[]): Promise<void> } {\n const [inbox, setInbox] = useState<PartnerInbox>({ items: [], unread: 0 })\n const [incoming, setIncoming] = useState<PartnerNotice>()\n const [error, setError] = useState('')\n const etag = useRef(''), latest = useRef<string>(), initialized = useRef(false), mounted = useRef(true), mutationEpoch = useRef(0)\n const apply = useCallback((value: PartnerInbox): void => {\n if (!mounted.current) return\n const first = value.items[0]\n if (initialized.current && first && first.id !== latest.current && first.readAt === undefined) setIncoming(first)\n initialized.current = true; latest.current = first?.id; setInbox(value); setError('')\n }, [])\n useEffect(() => {\n mounted.current = true\n let timer: ReturnType<typeof setTimeout> | undefined, request: AbortController | undefined, failures = 0, stopped = false\n const poll = async (): Promise<void> => {\n if (stopped || document.hidden || request) return\n clearTimeout(timer)\n request = new AbortController()\n const epoch = mutationEpoch.current\n const timeout = setTimeout(() => request?.abort(), 12_000)\n try {\n const response = await fetch(`${PARTNER_API}/pendant/inbox`, { signal: request.signal, headers: etag.current ? { 'If-None-Match': etag.current } : {} })\n if (response.status !== 304) {\n if (!response.ok) throw new Error(`\u6D88\u606F\u6682\u65F6\u4E0D\u53EF\u7528\uFF08${response.status}\uFF09`)\n const data = await response.json() as PartnerInbox\n if (!stopped && epoch === mutationEpoch.current) { etag.current = response.headers.get('etag') ?? ''; apply(data) }\n }\n failures = 0; if (!stopped) setError('')\n } catch (reason) { if (!stopped && !document.hidden) { failures++; setError(reason instanceof Error ? reason.message : '\u6D88\u606F\u8BFB\u53D6\u5931\u8D25') } }\n finally {\n clearTimeout(timeout); request = undefined\n if (!stopped && !document.hidden) timer = setTimeout(() => { void poll() }, Math.min(30_000, 4_000 * 2 ** failures))\n }\n }\n const visibility = (): void => { clearTimeout(timer); if (document.hidden) request?.abort(); else void poll() }\n document.addEventListener('visibilitychange', visibility); void poll()\n return () => { stopped = true; mounted.current = false; clearTimeout(timer); request?.abort(); document.removeEventListener('visibilitychange', visibility) }\n }, [apply])\n const read = useCallback(async (ids: string[]): Promise<void> => {\n mutationEpoch.current++\n try { const value = await api<PartnerInbox>('/pendant/read', { method: 'POST', body: JSON.stringify({ ids }) }); mutationEpoch.current++; etag.current = ''; apply(value) }\n catch (reason) { if (mounted.current) setError(reason instanceof Error ? reason.message : '\u6807\u8BB0\u5DF2\u8BFB\u5931\u8D25') }\n }, [apply])\n return { inbox, incoming, error, read }\n}\n", "import { useEffect, useRef, type RefObject, type MutableRefObject, type PointerEvent, type KeyboardEvent } from 'react'\nimport type { LanyardHandle } from './renderer.js'\n\nconst KEY = 'dsh-partner:pendant-position:v1'\ninterface Position { x: number; y: number; docked?: boolean }\nexport function snapPendantX(left: number, width: number, edge: number, force = false): number {\n return force || Math.abs(left + width / 2 - edge) <= 40 ? edge - width / 2 : left\n}\nconst clamp = (value: number, low: number, high: number): number => Math.max(low, Math.min(value, Math.max(low, high)))\n\nexport function readerPlacement(anchor: { x: number; y: number; width: number; height: number }, viewport: { width: number; height: number }) {\n const width = Math.min(360, viewport.width - 24), maxHeight = Math.min(480, viewport.height - 32), gap = 16\n const left = anchor.x - width - gap, right = anchor.x + anchor.width + gap\n if (left >= 12 || right + width <= viewport.width - 12) {\n return { width, maxHeight, left: clamp(left >= 12 ? left : right, 12, viewport.width - width - 12), top: clamp(anchor.y - 12, 16, viewport.height - maxHeight - 16) }\n }\n // Narrow screens: reserve the card's actual footprint, choose the larger\n // vertical space and scroll the message instead of covering the card.\n const below = clamp(anchor.y + anchor.height + gap, 16, viewport.height - 16)\n const above = clamp(anchor.y - gap, 16, viewport.height - 16)\n const useBelow = viewport.height - below - 16 >= above - 16\n const available = useBelow ? viewport.height - below - 16 : above - 16\n const height = Math.max(0, Math.min(maxHeight, available))\n return { width, maxHeight: height, left: clamp(anchor.x + anchor.width / 2 - width / 2, 12, viewport.width - width - 12), top: useBelow ? below : above - height }\n}\n\n/** Moving the hook changes placement, not the badge's elastic drag gesture.\n * Persist only at gesture completion; movement has no React render loop.\n */\nexport function usePendantPlacement(root: RefObject<HTMLElement>, handle: MutableRefObject<LanyardHandle | undefined>) {\n const handlers = useRef({ down: (_: PointerEvent<HTMLButtonElement>) => {}, move: (_: PointerEvent<HTMLButtonElement>) => {}, end: (_: PointerEvent<HTMLButtonElement>) => {}, key: (_: KeyboardEvent<HTMLButtonElement>) => {} })\n useEffect(() => {\n const element = root.current\n if (!element) return\n let saved: Position | undefined, pending: Position | undefined, frame = 0\n let docked = true\n const sidebar = document.querySelector<HTMLElement>(\"#root [data-slot='sidebar'] > div\")\n const edge = () => {\n const rect = sidebar?.getBoundingClientRect()\n return rect && rect.width > 0 && rect.right > 0 ? Math.max(48, Math.min(innerWidth - 48, rect.right)) : 48\n }\n let drag: { id: number; x: number; y: number; left: number; top: number; button: HTMLButtonElement } | undefined\n try {\n const value = JSON.parse(localStorage.getItem(KEY) ?? 'null') as Position | null\n if (value && Number.isFinite(value.x) && Number.isFinite(value.y)) {\n saved = { x: clamp(value.x, -1, 1), y: clamp(value.y, 0, 1) }\n docked = value.docked ?? false\n }\n } catch { /* Storage restrictions must not disable the pendant. */ }\n const limits = () => ({ x: Math.max(0, innerWidth - element.offsetWidth), y: Math.max(28, innerHeight - element.offsetHeight - 12) })\n const place = (p: Position): void => {\n const max = limits()\n element.style.left = `${clamp(p.x, 48 - element.offsetWidth / 2, max.x)}px`; element.style.top = `${clamp(p.y, 28, max.y)}px`; element.style.right = 'auto'\n element.dataset.docked = String(docked)\n handle.current?.relayout()\n }\n const restore = (): void => {\n const max = limits()\n const p = saved ? { x: saved.x * max.x, y: 28 + saved.y * (max.y - 28) } : { x: 0, y: 46 }\n if (docked) p.x = snapPendantX(p.x, element.offsetWidth, edge(), true)\n place(p)\n }\n const flush = (): void => { cancelAnimationFrame(frame); frame = 0; if (pending) { place(pending); pending = undefined } }\n const persist = (): void => {\n const max = limits()\n saved = { x: parseFloat(element.style.left) / (max.x || 1), y: (parseFloat(element.style.top) - 28) / (max.y - 28 || 1), docked }\n try { localStorage.setItem(KEY, JSON.stringify(saved)) } catch { /* In-memory movement still works. */ }\n }\n const finish = (): void => {\n if (!drag) return\n const previous = drag; drag = undefined; flush()\n const x = element.offsetLeft, snapped = snapPendantX(x, element.offsetWidth, edge())\n docked = Math.abs(snapped + element.offsetWidth / 2 - edge()) < 1\n place({ x: snapped, y: element.offsetTop }); persist()\n if (previous.button.hasPointerCapture(previous.id)) previous.button.releasePointerCapture(previous.id)\n }\n handlers.current = {\n down(event) {\n if (!event.isPrimary || event.button !== 0 || drag) return\n event.preventDefault()\n // CSS left/top are containing-block coordinates, not viewport pixels.\n drag = { id: event.pointerId, x: event.clientX, y: event.clientY, left: element.offsetLeft, top: element.offsetTop, button: event.currentTarget }\n event.currentTarget.setPointerCapture(event.pointerId)\n },\n move(event) {\n if (!drag || event.pointerId !== drag.id) return\n pending = { x: drag.left + event.clientX - drag.x, y: drag.top + event.clientY - drag.y }\n if (!frame) frame = requestAnimationFrame(flush)\n },\n end(event) { if (drag?.id === event.pointerId) finish() },\n key(event) {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault(); docked = true\n place({ x: snapPendantX(0, element.offsetWidth, edge(), true), y: element.offsetTop }); persist(); return\n }\n const step = event.shiftKey ? 32 : 12, delta = { ArrowLeft: [-step, 0], ArrowRight: [step, 0], ArrowUp: [0, -step], ArrowDown: [0, step] }[event.key]\n if (!delta) return\n event.preventDefault()\n docked = false\n place({ x: element.offsetLeft + delta[0]!, y: element.offsetTop + delta[1]! }); persist()\n },\n }\n const resize = (): void => { finish(); restore() }\n const observer = new ResizeObserver(resize); observer.observe(element)\n const sidebarObserver = new ResizeObserver(() => { if (docked && !drag) restore() })\n if (sidebar) sidebarObserver.observe(sidebar)\n window.addEventListener('resize', resize); window.addEventListener('blur', finish); restore()\n return () => { finish(); cancelAnimationFrame(frame); observer.disconnect(); sidebarObserver.disconnect(); window.removeEventListener('resize', resize); window.removeEventListener('blur', finish) }\n }, [root, handle])\n return { onPointerDown: (e: PointerEvent<HTMLButtonElement>) => handlers.current.down(e), onPointerMove: (e: PointerEvent<HTMLButtonElement>) => handlers.current.move(e), onPointerUp: (e: PointerEvent<HTMLButtonElement>) => handlers.current.end(e), onPointerCancel: (e: PointerEvent<HTMLButtonElement>) => handlers.current.end(e), onLostPointerCapture: (e: PointerEvent<HTMLButtonElement>) => handlers.current.end(e), onKeyDown: (e: KeyboardEvent<HTMLButtonElement>) => handlers.current.key(e) }\n}\n", "import { useEffect, useLayoutEffect, useRef, useState, type RefObject } from 'react'\nimport { IconCheckOutline14, IconChevronDownOutline14, IconCloseOutline16, IconLinkOutline16, IconNewChatOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PartnerInbox, PartnerNotice } from '../notifications/domain.js'\nimport { readerPlacement } from './use-placement.js'\n\ninterface Props {\n inbox: PartnerInbox; selected: string | undefined; error: string; anchor: RefObject<HTMLButtonElement>\n onSelect(item?: PartnerNotice): void; onClose(keyboard?: boolean): void; onVisit(item: PartnerNotice): void; onReadAll(): void\n}\nexport function PendantReader({ inbox, selected, error, anchor, onSelect, onClose, onVisit, onReadAll }: Props): JSX.Element {\n const panel = useRef<HTMLElement>(null), [visible, setVisible] = useState(8)\n const measure = () => readerPlacement(anchor.current?.getBoundingClientRect() ?? { x: innerWidth / 2, y: 16, width: 0, height: 0 }, { width: innerWidth, height: innerHeight })\n const [placement, setPlacement] = useState(measure)\n const detail = inbox.items.find(item => item.id === selected)\n useLayoutEffect(() => {\n setPlacement(measure())\n panel.current?.focus({ preventScroll: true })\n let frame = 0\n const resize = (): void => { cancelAnimationFrame(frame); frame = requestAnimationFrame(() => setPlacement(measure())) }\n window.addEventListener('resize', resize)\n return () => { cancelAnimationFrame(frame); window.removeEventListener('resize', resize) }\n }, [anchor])\n useEffect(() => {\n const outside = (event: PointerEvent): void => {\n // The card remains an operable toggle; do not close on pointerdown and\n // accidentally reopen on its pointerup. Dragging it is still playable.\n if (!panel.current?.contains(event.target as Node) && !anchor.current?.contains(event.target as Node)) onClose()\n }\n const escape = (event: KeyboardEvent): void => { if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); onClose(true) } }\n document.addEventListener('pointerdown', outside); document.addEventListener('keydown', escape)\n return () => { document.removeEventListener('pointerdown', outside); document.removeEventListener('keydown', escape) }\n }, [onClose, anchor])\n return <section ref={panel} id=\"dsh-partner-pendant-inbox\" className=\"dsh-partner-pendant-inbox\" aria-label=\"\u4F19\u4F34\u6D88\u606F\" tabIndex={-1} style={placement}>\n <header>\n {detail && <button type=\"button\" aria-label=\"\u8FD4\u56DE\u6D88\u606F\u5217\u8868\" onClick={() => onSelect()}><IconChevronDownOutline14 size={16} className=\"dsh-partner-pendant-back\" /></button>}\n {!detail && <span className=\"dsh-partner-pendant-reader-icon\" aria-hidden=\"true\"><IconNewChatOutline16 size={18} /></span>}\n <div className=\"dsh-partner-pendant-reader-heading\"><strong>{detail ? detail.companionName : '\u4F19\u4F34\u6D88\u606F'}</strong><small>{detail ? '\u6765\u81EA\u4F19\u4F34\u7684\u6D88\u606F' : '\u56DE\u590D\u4E0E\u4EFB\u52A1\u52A8\u6001'}</small></div>\n {!!inbox.unread && <span className=\"dsh-partner-pendant-reader-count\" aria-label={`${inbox.unread} \u6761\u672A\u8BFB`}>{inbox.unread}</span>}\n <button type=\"button\" aria-label=\"\u5173\u95ED\u4F19\u4F34\u6D88\u606F\" onClick={event => onClose(event.detail === 0)}><IconCloseOutline16 size={16} /></button>\n </header>\n {error && <p role=\"alert\" className=\"dsh-partner-pendant-error\">{error}</p>}\n {detail ? <><article className=\"dsh-partner-pendant-detail\"><div className=\"dsh-partner-pendant-reader-meta\"><span>{detail.kind === 'task' ? '\u4EFB\u52A1\u52A8\u6001' : detail.kind === 'schedule' ? '\u5B9A\u65F6\u4EFB\u52A1' : '\u4F1A\u8BDD\u56DE\u590D'}</span><time dateTime={new Date(detail.createdAt).toISOString()}>{new Date(detail.createdAt).toLocaleString([], { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' })}</time></div><h3>{detail.title}</h3><p>{detail.summary}</p></article><footer><button type=\"button\" className=\"dsh-partner-pendant-all-messages\" onClick={() => onSelect()}>\u5168\u90E8\u6D88\u606F<span>{inbox.items.length}</span></button><button type=\"button\" className=\"dsh-partner-pendant-source\" onClick={() => onVisit(detail)}><IconLinkOutline16 size={15} />{detail.kind === 'task' ? '\u67E5\u770B\u4EFB\u52A1' : detail.kind === 'schedule' ? '\u67E5\u770B\u5B9A\u65F6\u4EFB\u52A1' : '\u8FDB\u5165\u4F1A\u8BDD'}</button></footer></>\n : <><div className=\"dsh-partner-pendant-list\">{inbox.items.length ? inbox.items.slice(0, visible).map(item => <button type=\"button\" key={item.id} data-unread={item.readAt === undefined} onClick={() => onSelect(item)}><span><strong>{item.companionName}</strong><time>{new Date(item.createdAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</time></span><b>{item.title}</b><small>{item.summary.replace(/\\s+/g, ' ').slice(0, 100)}</small></button>) : <p className=\"dsh-partner-pendant-empty\">\u6682\u65F6\u6CA1\u6709\u65B0\u6D88\u606F</p>}{inbox.items.length > visible && <button type=\"button\" onClick={() => setVisible(count => count + 8)}>\u663E\u793A\u66F4\u591A\u6D88\u606F</button>}</div><footer><small>\u6700\u8FD1 {inbox.items.length} \u6761</small><button type=\"button\" disabled={!inbox.unread} onClick={onReadAll}><IconCheckOutline14 size={14} />\u5168\u90E8\u5DF2\u8BFB</button></footer></>}\n </section>\n}\n", "import { useEffect, useId, useRef, useState, type KeyboardEvent } from 'react'\nimport { IconCheckOutline14, IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { CompanionView } from '../client-api.js'\nimport { Avatar } from './partner-components.js'\n\n/** Local, themed listbox: no platform select popup or second CSS arrow. */\nexport function CompanionPicker({ companions, selectedId, onChange }: {\n companions: Pick<CompanionView, 'id' | 'name' | 'role'>[]\n selectedId: string | undefined\n onChange(id: string): void\n}): JSX.Element {\n const [open, setOpen] = useState(false)\n const root = useRef<HTMLDivElement>(null)\n const trigger = useRef<HTMLButtonElement>(null)\n const list = useRef<HTMLDivElement>(null)\n const listId = useId()\n const current = companions.find(item => item.id === selectedId) ?? companions[0]\n\n useEffect(() => {\n if (!open) return\n const options = list.current?.querySelectorAll<HTMLButtonElement>('[role=\"option\"]')\n const selected = Math.max(0, companions.findIndex(item => item.id === selectedId))\n options?.[selected]?.focus({ preventScroll: true })\n options?.[selected]?.scrollIntoView({ block: 'nearest' })\n const outside = (event: PointerEvent): void => {\n if (!root.current?.contains(event.target as Node)) setOpen(false)\n }\n const close = (): void => setOpen(false)\n const desktop = window.matchMedia('(min-width: 761px)')\n document.addEventListener('pointerdown', outside)\n window.addEventListener('blur', close)\n desktop.addEventListener('change', close)\n return () => {\n document.removeEventListener('pointerdown', outside)\n window.removeEventListener('blur', close)\n desktop.removeEventListener('change', close)\n }\n }, [open, companions, selectedId])\n\n const dismiss = (): void => { setOpen(false); trigger.current?.focus({ preventScroll: true }) }\n const navigate = (event: KeyboardEvent<HTMLDivElement>): void => {\n if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); dismiss(); return }\n const options = Array.from(list.current?.querySelectorAll<HTMLButtonElement>('[role=\"option\"]') ?? [])\n const index = options.indexOf(document.activeElement as HTMLButtonElement)\n let next: number\n if (event.key === 'ArrowDown') next = (index + 1) % options.length\n else if (event.key === 'ArrowUp') next = (index - 1 + options.length) % options.length\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = options.length - 1\n else return\n event.preventDefault()\n options[next]?.focus({ preventScroll: true })\n options[next]?.scrollIntoView({ block: 'nearest' })\n }\n\n return <div className=\"dsh-partner-companion-picker\" ref={root} onBlur={event => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setOpen(false)\n }}>\n <button ref={trigger} type=\"button\" className=\"dsh-partner-companion-trigger\" aria-label={`\u5207\u6362\u5F53\u524D\u4F19\u4F34${current ? `\uFF1A${current.name}` : ''}`} aria-haspopup=\"listbox\" aria-expanded={open} aria-controls={open ? listId : undefined} disabled={!current} onClick={() => setOpen(value => !value)} onKeyDown={event => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') { event.preventDefault(); setOpen(true) }\n }}>\n {current && <Avatar name={current.name} small />}\n <span className=\"dsh-partner-companion-copy\"><strong>{current?.name ?? '\u8FD8\u6CA1\u6709\u4F19\u4F34'}</strong><small>{current?.role || '\u9009\u62E9\u4F19\u4F34'}</small></span>\n <span className=\"dsh-partner-companion-chevron\" aria-hidden=\"true\"><IconChevronDownOutline14 size={14} /></span>\n </button>\n {open && <div ref={list} id={listId} role=\"listbox\" aria-label=\"\u9009\u62E9\u4F19\u4F34\" className=\"dsh-partner-companion-options\" onKeyDown={navigate}>\n {companions.map(item => <button type=\"button\" role=\"option\" aria-selected={item.id === current?.id} tabIndex={item.id === current?.id ? 0 : -1} key={item.id} onClick={() => { dismiss(); onChange(item.id) }}>\n <Avatar name={item.name} small />\n <span className=\"dsh-partner-companion-copy\"><strong>{item.name}</strong><small>{item.role}</small></span>\n <span className=\"dsh-partner-companion-check\" aria-hidden=\"true\">{item.id === current?.id && <IconCheckOutline14 size={14} />}</span>\n </button>)}\n </div>}\n </div>\n}\n", "import { useEffect, type RefObject } from 'react'\n\nexport function useWorkspaceTopAnchor(ref: RefObject<HTMLElement>): void {\n useEffect(() => {\n const element = ref.current\n const originalParent = element?.parentElement\n if (!element || !originalParent) return\n let moved = false\n let observer: MutationObserver | undefined\n const place = (): boolean => {\n let ancestor: HTMLElement | null = element.parentElement\n while (ancestor && ancestor !== document.body) {\n const candidate = ancestor.previousElementSibling\n if (candidate instanceof HTMLElement) {\n const style = getComputedStyle(candidate)\n if (style.display === 'flex' && style.flexDirection === 'column' && Number.parseFloat(style.flexGrow) > 0) {\n candidate.insertBefore(element, candidate.firstChild)\n moved = true\n return true\n }\n }\n ancestor = ancestor.parentElement\n }\n return false\n }\n if (!place()) {\n observer = new MutationObserver(() => { if (place()) observer?.disconnect() })\n observer.observe(document.body, { childList: true, subtree: true })\n }\n return () => {\n observer?.disconnect()\n if (moved && originalParent.isConnected) originalParent.append(element)\n }\n }, [ref])\n}\n", "import {\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\ntype GlassElement = 'header' | 'aside' | 'section' | 'article' | 'div' | 'button'\n\ninterface GlassSurfaceProps extends Omit<HTMLAttributes<HTMLElement>, 'children' | 'className'> {\n as: GlassElement\n children: ReactNode\n className: string\n borderRadius: number\n borderWidth?: number\n brightness?: number\n blur?: number\n distortionScale?: number\n interactive?: boolean\n opacity?: number\n saturation?: number\n type?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n}\n\ninterface GlassStyle extends CSSProperties {\n '--partner-glass-filter-id': string\n '--partner-glass-saturation': number\n '--partner-glare-x': string\n '--partner-glare-y': string\n}\n\nfunction supportsSvgBackdropFilter(filterId: string): boolean {\n if (typeof window === 'undefined' || typeof document === 'undefined') return false\n if (window.matchMedia('(prefers-reduced-transparency: reduce)').matches) return false\n const userAgent = navigator.userAgent\n if (/Firefox/i.test(userAgent) || (/Safari/i.test(userAgent) && !/(Chrome|Chromium|CriOS)/i.test(userAgent))) return false\n const probe = document.createElement('div')\n probe.style.backdropFilter = `url(#${filterId})`\n return probe.style.backdropFilter !== ''\n}\n\nfunction displacementMap(\n width: number,\n height: number,\n radius: number,\n borderWidth: number,\n brightness: number,\n opacity: number,\n blur: number,\n redGradientId: string,\n blueGradientId: string,\n): string {\n const edge = Math.max(1, Math.min(width, height) * borderWidth * .5)\n const innerWidth = Math.max(1, width - edge * 2)\n const innerHeight = Math.max(1, height - edge * 2)\n const svg = `<svg viewBox=\"0 0 ${width} ${height}\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <linearGradient id=\"${redGradientId}\" x1=\"100%\" y1=\"0%\" x2=\"0%\" y2=\"0%\"><stop offset=\"0%\" stop-color=\"#0000\"/><stop offset=\"100%\" stop-color=\"red\"/></linearGradient>\n <linearGradient id=\"${blueGradientId}\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"><stop offset=\"0%\" stop-color=\"#0000\"/><stop offset=\"100%\" stop-color=\"blue\"/></linearGradient>\n </defs>\n <rect width=\"${width}\" height=\"${height}\" fill=\"black\"/>\n <rect width=\"${width}\" height=\"${height}\" rx=\"${radius}\" fill=\"url(#${redGradientId})\"/>\n <rect width=\"${width}\" height=\"${height}\" rx=\"${radius}\" fill=\"url(#${blueGradientId})\" style=\"mix-blend-mode:difference\"/>\n <rect x=\"${edge}\" y=\"${edge}\" width=\"${innerWidth}\" height=\"${innerHeight}\" rx=\"${radius}\" fill=\"hsl(0 0% ${brightness}% / ${opacity})\" style=\"filter:blur(${blur}px)\"/>\n </svg>`\n return `data:image/svg+xml,${encodeURIComponent(svg)}`\n}\n\nexport function GlassSurface({\n as: Element,\n children,\n className,\n borderRadius,\n borderWidth = .07,\n brightness = 50,\n blur = 11,\n distortionScale = -26,\n interactive = false,\n opacity = .93,\n saturation = 1.16,\n ...elementProps\n}: GlassSurfaceProps): JSX.Element {\n const uniqueId = useId().replace(/:/g, '-')\n const filterId = `partner-glass-filter-${uniqueId}`\n const redGradientId = `partner-glass-red-${uniqueId}`\n const blueGradientId = `partner-glass-blue-${uniqueId}`\n const containerRef = useRef<HTMLElement>(null)\n const imageRef = useRef<SVGFEImageElement>(null)\n const redRef = useRef<SVGFEDisplacementMapElement>(null)\n const greenRef = useRef<SVGFEDisplacementMapElement>(null)\n const blueRef = useRef<SVGFEDisplacementMapElement>(null)\n const glareFrameRef = useRef(0)\n const glarePointerRef = useRef<{ clientX: number; clientY: number }>()\n const [svgSupported, setSvgSupported] = useState(false)\n\n useEffect(() => {\n setSvgSupported(supportsSvgBackdropFilter(filterId))\n }, [filterId])\n\n useEffect(() => {\n if (!svgSupported) return\n const element = containerRef.current\n const image = imageRef.current\n if (element === null || image === null) return\n let frame = 0\n let previousWidth = 0\n let previousHeight = 0\n const update = (): void => {\n frame = 0\n const rect = element.getBoundingClientRect()\n const width = Math.max(1, Math.round(rect.width))\n const height = Math.max(1, Math.round(rect.height))\n if (width === previousWidth && height === previousHeight) return\n previousWidth = width\n previousHeight = height\n image.setAttribute('href', displacementMap(\n width,\n height,\n Math.min(borderRadius, Math.min(width, height) / 2),\n borderWidth,\n brightness,\n opacity,\n blur,\n redGradientId,\n blueGradientId,\n ))\n }\n const schedule = (): void => {\n if (frame === 0) frame = requestAnimationFrame(update)\n }\n const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(schedule)\n observer?.observe(element)\n schedule()\n return () => {\n if (frame !== 0) cancelAnimationFrame(frame)\n observer?.disconnect()\n }\n }, [blueGradientId, blur, borderRadius, borderWidth, brightness, opacity, redGradientId, svgSupported])\n\n useEffect(() => {\n if (!svgSupported) return\n const channels = [redRef.current, greenRef.current, blueRef.current]\n const offsets = [0, 5, 10]\n channels.forEach((channel, index) => channel?.setAttribute('scale', String(distortionScale + (offsets[index] ?? 0))))\n }, [distortionScale, svgSupported])\n\n useEffect(() => () => {\n if (glareFrameRef.current !== 0) cancelAnimationFrame(glareFrameRef.current)\n }, [])\n\n const renderGlare = (): void => {\n glareFrameRef.current = 0\n const element = containerRef.current\n if (element === null) return\n const pointer = glarePointerRef.current\n if (pointer === undefined) {\n element.style.setProperty('--partner-glare-x', '50%')\n element.style.setProperty('--partner-glare-y', '50%')\n return\n }\n const rect = element.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) return\n const x = Math.max(0, Math.min(100, (pointer.clientX - rect.left) / rect.width * 100))\n const y = Math.max(0, Math.min(100, (pointer.clientY - rect.top) / rect.height * 100))\n element.style.setProperty('--partner-glare-x', `${x}%`)\n element.style.setProperty('--partner-glare-y', `${y}%`)\n }\n const scheduleGlare = (): void => {\n if (glareFrameRef.current === 0) glareFrameRef.current = requestAnimationFrame(renderGlare)\n }\n const moveGlare = (clientX: number, clientY: number): void => {\n if (!interactive) return\n glarePointerRef.current = { clientX, clientY }\n scheduleGlare()\n }\n const resetGlare = (): void => {\n if (!interactive) return\n glarePointerRef.current = undefined\n scheduleGlare()\n }\n\n const style: GlassStyle = {\n '--partner-glass-filter-id': `url(#${filterId})`,\n '--partner-glass-saturation': saturation,\n '--partner-glare-x': '50%',\n '--partner-glare-y': '50%',\n }\n\n return <Element\n {...elementProps}\n ref={containerRef as never}\n className={`dsh-partner-glass-surface ${svgSupported ? 'is-svg' : 'is-fallback'}${interactive ? ' is-interactive' : ''} ${className}`}\n style={style}\n onPointerMove={interactive ? event => moveGlare(event.clientX, event.clientY) : undefined}\n onPointerLeave={interactive ? resetGlare : undefined}\n >\n {svgSupported && <svg className=\"dsh-partner-glass-filter\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\">\n <defs>\n <filter id={filterId} colorInterpolationFilters=\"sRGB\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\">\n <feImage ref={imageRef} x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\" result=\"map\" />\n <feDisplacementMap ref={redRef} in=\"SourceGraphic\" in2=\"map\" result=\"displaced-red\" />\n <feColorMatrix in=\"displaced-red\" type=\"matrix\" values=\"1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0\" result=\"red\" />\n <feDisplacementMap ref={greenRef} in=\"SourceGraphic\" in2=\"map\" result=\"displaced-green\" />\n <feColorMatrix in=\"displaced-green\" type=\"matrix\" values=\"0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0\" result=\"green\" />\n <feDisplacementMap ref={blueRef} in=\"SourceGraphic\" in2=\"map\" result=\"displaced-blue\" />\n <feColorMatrix in=\"displaced-blue\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0\" result=\"blue\" />\n <feBlend in=\"red\" in2=\"green\" mode=\"screen\" result=\"red-green\" />\n <feBlend in=\"red-green\" in2=\"blue\" mode=\"screen\" result=\"output\" />\n <feGaussianBlur in=\"output\" stdDeviation=\".45\" />\n </filter>\n </defs>\n </svg>}\n {children}\n </Element>\n}\n", "import { useCallback, useEffect, useMemo, useState, type FormEvent } from 'react'\nimport { IconCheckOutline16, IconCloseOutline16, IconPlusOutline16, IconRefreshOutline16, IconSearchOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type MarketSkillView, type SkillCatalogView, type SkillMarketNetworkTestView, type SkillMarketNetworkView, type SkillMarketView } from '../client-api.js'\nimport { CollectionEmpty, CollectionSkeleton, WorkspaceBlock, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\nimport { SkillImportDialog } from './skill-import-dialog.js'\n\nexport function SkillsPanel(): JSX.Element {\n const [catalog, setCatalog] = useState<SkillCatalogView>({ installed: [], bindings: [], sources: [] })\n const [market, setMarket] = useState<SkillMarketView>({ sources: [], entries: [], errors: [] })\n const [query, setQuery] = useState('')\n const [activeSource, setActiveSource] = useState('market-clawhub')\n const [busy, setBusy] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n const [actionError, setActionError] = useState<{ kind: 'install' | 'uninstall'; id: string; message: string }>()\n const [addingSource, setAddingSource] = useState(false)\n const [creatingSkill, setCreatingSkill] = useState(false)\n const [importingSkill, setImportingSkill] = useState(false)\n const [editingNetwork, setEditingNetwork] = useState(false)\n const [showAllInstalled, setShowAllInstalled] = useState(false)\n const [network, setNetwork] = useState<SkillMarketNetworkView>({})\n const load = useCallback(async (refresh = false) => {\n try {\n const [nextCatalog, nextMarket, nextNetwork] = await Promise.all([\n api<SkillCatalogView>('/skills'), api<SkillMarketView>(`/skills/market${refresh ? '?refresh=1' : ''}`), api<SkillMarketNetworkView>('/skill-markets/network'),\n ])\n setCatalog(nextCatalog); setMarket(nextMarket); setNetwork(nextNetwork); setError(undefined)\n } catch (reason) { setError(errorMessage(reason)) } finally { setLoading(false) }\n }, [])\n useEffect(() => { void load() }, [load])\n const installed = new Map(catalog.installed.map(item => [item.id, item]))\n const visibleInstalled = showAllInstalled ? catalog.installed : catalog.installed.slice(0, 4)\n const visible = useMemo(() => {\n const normalized = query.trim().toLocaleLowerCase()\n return market.entries.filter(item => (item.sourceId === activeSource) && (!normalized || `${item.name} ${item.description} ${item.tags.join(' ')}`.toLocaleLowerCase().includes(normalized)))\n }, [activeSource, market.entries, query])\n const sources = [{ id: 'builtin', name: '\u5185\u7F6E\u7CBE\u9009' }, ...market.sources.map(source => ({ id: source.id, name: source.name }))]\n const sourceCounts = useMemo(() => market.entries.reduce((counts, entry) => {\n counts.set(entry.sourceId, (counts.get(entry.sourceId) ?? 0) + 1)\n return counts\n }, new Map<string, number>()), [market.entries])\n const install = async (entry: MarketSkillView): Promise<void> => {\n setBusy(entry.id); setActionError(undefined)\n try {\n await api('/skills/market/install', { method: 'POST', body: JSON.stringify({ sourceId: entry.sourceId, entryId: entry.id }) })\n await load()\n } catch (reason) { setActionError({ kind: 'install', id: entry.id, message: errorMessage(reason) }) } finally { setBusy(undefined) }\n }\n const uninstall = async (id: string): Promise<void> => {\n setBusy(id); setActionError(undefined)\n try { await api(`/skills/${encodeURIComponent(id)}`, { method: 'DELETE' }); await load() }\n catch (reason) { setActionError({ kind: 'uninstall', id, message: errorMessage(reason) }) } finally { setBusy(undefined) }\n }\n return <div className=\"dsh-partner-feature-page\">\n <WorkspaceHero eyebrow=\"Capability catalog\" title=\"Skill \u5E02\u573A\" detail=\"\u96C6\u4E2D\u5B89\u88C5\u548C\u7EF4\u62A4\u5DE5\u4F5C\u80FD\u529B\uFF1B\u5B89\u88C5\u540E\uFF0C\u518D\u4E3A\u9700\u8981\u5B83\u7684\u4F19\u4F34\u5355\u72EC\u542F\u7528\u3002\" actions={<button type=\"button\" disabled={loading} onClick={() => { void load(true) }}><IconRefreshOutline16 size={15} />{loading ? '\u540C\u6B65\u4E2D\u2026' : '\u5237\u65B0\u5E02\u573A'}</button>} />\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {importingSkill && <SkillImportDialog close={() => setImportingSkill(false)} changed={load} />}\n {creatingSkill && <WorkspaceDialog title=\"\u65B0\u5EFA Skill\" detail=\"\u521B\u5EFA\u4E00\u4E2A\u53EF\u590D\u7528\u7684\u5DE5\u4F5C\u6D41\u7A0B\uFF0C\u5E76\u660E\u786E\u6267\u884C\u4E0A\u4E0B\u6587\u3001\u5DE5\u5177\u8FB9\u754C\u548C\u9A8C\u6536\u6307\u4EE4\u3002\" close={() => setCreatingSkill(false)} width=\"wide\"><NewSkillForm existingIds={catalog.installed.map(skill => skill.id)} close={() => setCreatingSkill(false)} changed={load} /></WorkspaceDialog>}\n {editingNetwork && <WorkspaceDialog title=\"\u5E02\u573A\u7F51\u7EDC\u8BBE\u7F6E\" detail=\"\u914D\u7F6E Skill \u7D22\u5F15\u548C\u5B89\u88C5\u5305\u4E0B\u8F7D\u5171\u7528\u7684 HTTP \u4EE3\u7406\uFF0C\u5E76\u5728\u4FDD\u5B58\u524D\u6D4B\u8BD5\u8FDE\u901A\u6027\u3002\" close={() => setEditingNetwork(false)}><NetworkSettingsForm value={network} close={() => setEditingNetwork(false)} changed={async next => { setNetwork(next); await load(true) }} /></WorkspaceDialog>}\n {addingSource && <WorkspaceDialog title=\"\u6DFB\u52A0\u5E02\u573A\u6765\u6E90\" detail=\"\u63A5\u5165\u56E2\u961F\u6216\u4E2A\u4EBA\u7EF4\u62A4\u7684 Skill \u7D22\u5F15\u3002\u81EA\u5B9A\u4E49\u6765\u6E90\u9ED8\u8BA4\u6309\u4E0D\u53EF\u4FE1\u6765\u6E90\u9694\u79BB\u6267\u884C\u3002\" close={() => setAddingSource(false)}><MarketSourceForm close={() => setAddingSource(false)} changed={() => load(true)} /></WorkspaceDialog>}\n <WorkspaceBlock title=\"\u5DF2\u5B89\u88C5\" detail={`${catalog.installed.length} \u4E2A\u53EF\u4F9B\u4F19\u4F34\u4F7F\u7528`} actions={<><button type=\"button\" onClick={() => setImportingSkill(true)}>\u5BFC\u5165 Skill</button><button type=\"button\" onClick={() => setCreatingSkill(true)}><IconPlusOutline16 size={14} />\u65B0\u5EFA Skill</button></>}>\n {loading ? <CollectionSkeleton rows={2} /> : catalog.installed.length === 0 ? <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u5B89\u88C5 Skill\" detail=\"\u53EF\u4EE5\u521B\u5EFA\u81EA\u5DF1\u7684 Skill\uFF0C\u6216\u4ECE\u4E0B\u65B9\u5E02\u573A\u9009\u62E9\u3002\" action={<button type=\"button\" onClick={() => setCreatingSkill(true)}><IconPlusOutline16 size={14} />\u65B0\u5EFA\u7B2C\u4E00\u4E2A Skill</button>} /> : <><div className=\"dsh-partner-skill-installed is-market\">{visibleInstalled.map(skill => <article key={skill.id}>\n <span className=\"dsh-partner-skill-mark\"><IconCheckOutline16 size={16} /></span><span><strong>{skill.displayName}</strong><p>{skill.description}</p><small>{skill.version} \u00B7 {skill.executionContext === 'fork' ? '\u4E34\u65F6\u4F1A\u8BDD' : '\u5F53\u524D\u4F1A\u8BDD'} \u00B7 {skill.source}</small></span>\n <button type=\"button\" className=\"is-icon\" disabled={busy === skill.id} aria-label={`\u5378\u8F7D ${skill.displayName}`} onClick={() => { void uninstall(skill.id) }}><IconTrashOutline16 size={15} /></button>\n {actionError?.kind === 'uninstall' && actionError.id === skill.id && <p className=\"dsh-partner-skill-action-error\" role=\"alert\">\u5378\u8F7D\u5931\u8D25\uFF1A{actionError.message}</p>}\n </article>)}</div>{catalog.installed.length > 4 && <button type=\"button\" className=\"dsh-partner-skill-disclosure\" aria-expanded={showAllInstalled} onClick={() => setShowAllInstalled(value => !value)}>{showAllInstalled ? '\u6536\u8D77\u5DF2\u5B89\u88C5 Skill' : `\u67E5\u770B\u5168\u90E8 ${catalog.installed.length} \u4E2A\u5DF2\u5B89\u88C5 Skill`}</button>}</>}\n </WorkspaceBlock>\n <WorkspaceBlock title=\"\u5E02\u573A\u76EE\u5F55\" detail=\"\u5185\u7F6E ClawHub\u3001LoopHub\u3001SkillHub\uFF0C\u4E0E nomifun \u5F53\u524D Skill \u699C\u5355\u4E00\u81F4\" actions={<><button type=\"button\" onClick={() => setEditingNetwork(true)}>\u4EE3\u7406\u8BBE\u7F6E{network.proxyUrl ? ' \u00B7 \u5DF2\u542F\u7528' : ''}</button><button type=\"button\" onClick={() => setAddingSource(true)}><IconPlusOutline16 size={14} />\u81EA\u5B9A\u4E49\u6E90</button></>}>\n <div className=\"dsh-partner-market-toolbar\">\n <SkillSearch value={query} change={setQuery} count={visible.length} label=\"\u641C\u7D22 Skill \u5E02\u573A\" placeholder=\"\u641C\u7D22\u540D\u79F0\u3001\u8BF4\u660E\u6216\u6807\u7B7E\" loading={loading} />\n <nav className=\"dsh-partner-market-sources\" aria-label=\"Skill \u5E02\u573A\u6765\u6E90\">{sources.map(source => <button type=\"button\" key={source.id} className={activeSource === source.id ? 'is-active' : ''} aria-pressed={activeSource === source.id} onClick={() => setActiveSource(source.id)}><span>{source.name}</span><small>{sourceCounts.get(source.id) ?? 0}</small></button>)}</nav>\n </div>\n {market.errors.some(item => item.sourceId === activeSource) && <p className=\"dsh-partner-inline-warning\">{market.errors.filter(item => item.sourceId === activeSource).map(item => item.error).join('\uFF1B')}</p>}\n {loading ? <CollectionSkeleton rows={4} /> : <div className=\"dsh-partner-market-grid\">{visible.map(entry => {\n const current = installed.get(entry.id)\n const cardError = actionError?.kind === 'install' && actionError.id === entry.id ? actionError.message : undefined\n const errorId = cardError ? `dsh-partner-skill-error-${entry.id}` : undefined\n return <article key={`${entry.sourceId}:${entry.id}`}><span><small>{entry.tags.slice(0, 3).join(' \u00B7 ') || 'SKILL'}</small><strong>{entry.name}</strong><p>{entry.description}</p></span>{cardError && <p id={errorId} className=\"dsh-partner-market-card-error\" role=\"alert\">\u5B89\u88C5\u5931\u8D25\uFF1A{cardError}</p>}<footer><small>v{entry.version}</small>{current ? <button type=\"button\" disabled><IconCheckOutline16 size={14} />\u5DF2\u5B89\u88C5</button> : <button type=\"button\" disabled={busy === entry.id} aria-describedby={errorId} onClick={() => { void install(entry) }}>{busy === entry.id ? '\u5B89\u88C5\u4E2D\u2026' : cardError ? '\u91CD\u8BD5\u5B89\u88C5' : '\u5B89\u88C5'}</button>}</footer></article>\n })}</div>}\n {!loading && visible.length === 0 && <CollectionEmpty title={query ? '\u6CA1\u6709\u5339\u914D\u7684 Skill' : '\u5F53\u524D\u6765\u6E90\u6682\u65F6\u4E0D\u53EF\u7528'} detail={query ? '\u6362\u4E00\u4E2A\u5173\u952E\u8BCD\uFF0C\u6216\u5207\u6362\u5E02\u573A\u6765\u6E90\u3002' : '\u5237\u65B0\u5E02\u573A\uFF0C\u6216\u68C0\u67E5\u4EE3\u7406\u4E0E\u6765\u6E90\u914D\u7F6E\u3002'} />}\n </WorkspaceBlock>\n </div>\n}\n\nexport function CompanionSkillSettings({ companionId }: { companionId: string }): JSX.Element {\n const [catalog, setCatalog] = useState<SkillCatalogView>({ installed: [], bindings: [], sources: [] })\n const [busy, setBusy] = useState<string>()\n const [error, setError] = useState<string>()\n const [selecting, setSelecting] = useState(false)\n const [showAll, setShowAll] = useState(false)\n const [query, setQuery] = useState('')\n const load = useCallback(async () => {\n try { setCatalog(await api<SkillCatalogView>('/skills')); setError(undefined) }\n catch (reason) { setError(errorMessage(reason)) }\n }, [])\n useEffect(() => { void load() }, [load, companionId])\n useEffect(() => { setSelecting(false); setShowAll(false); setQuery(''); setError(undefined) }, [companionId])\n const enabled = useMemo(() => new Set(catalog.bindings.filter(item => item.companionId === companionId && item.enabled).map(item => item.skillId)), [catalog.bindings, companionId])\n const enabledSkills = useMemo(() => catalog.installed.filter(skill => enabled.has(skill.id)), [catalog.installed, enabled])\n const availableSkills = useMemo(() => {\n const normalized = query.trim().toLocaleLowerCase()\n return catalog.installed.filter(skill => !enabled.has(skill.id) && (!normalized || `${skill.displayName} ${skill.description} ${skill.id}`.toLocaleLowerCase().includes(normalized)))\n }, [catalog.installed, enabled, query])\n const visibleEnabledSkills = showAll ? enabledSkills : enabledSkills.slice(0, 4)\n const visibleAvailableSkills = availableSkills.slice(0, 80)\n const setBinding = async (skillId: string, nextEnabled: boolean): Promise<void> => {\n setBusy(skillId)\n setError(undefined)\n try {\n await api(`/companions/${encodeURIComponent(companionId)}/skills/${encodeURIComponent(skillId)}`, { method: 'PUT', body: JSON.stringify({ enabled: nextEnabled }) })\n await load()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n return <section className=\"dsh-partner-capability-detail\" aria-labelledby=\"dsh-partner-skill-capability-title\">\n <header><span><small>PARTNER SKILLS</small><strong id=\"dsh-partner-skill-capability-title\">\u5F53\u524D\u4F19\u4F34\u7684 Skill</strong></span><div className=\"dsh-partner-capability-actions\"><em>{enabledSkills.length} \u4E2A\u542F\u7528</em>{catalog.installed.length > 0 && <button type=\"button\" aria-expanded={selecting} onClick={() => setSelecting(value => !value)}><IconPlusOutline16 size={14} />\u6DFB\u52A0 Skill</button>}</div></header>\n {selecting && <div className=\"dsh-partner-skill-picker\" aria-label=\"\u6DFB\u52A0 Skill\">\n <SkillSearch value={query} change={setQuery} count={availableSkills.length} label=\"\u641C\u7D22\u53EF\u6DFB\u52A0\u7684 Skill\" placeholder=\"\u641C\u7D22\u540D\u79F0\u3001\u8BF4\u660E\u6216\u6807\u8BC6\" autoFocus compact />\n <div className=\"dsh-partner-skill-picker-list\">{visibleAvailableSkills.map(skill => <article key={skill.id}><span><strong>{skill.displayName}</strong><p>{skill.description}</p><small>{skill.executionContext === 'fork' ? '\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD\u6267\u884C' : '\u53EF\u4FE1\u5F53\u524D\u4F1A\u8BDD\u6267\u884C'}</small></span><button type=\"button\" disabled={busy === skill.id} onClick={() => { void setBinding(skill.id, true) }}>{busy === skill.id ? '\u6DFB\u52A0\u4E2D\u2026' : '\u6DFB\u52A0'}</button></article>)}{availableSkills.length === 0 && <p className=\"dsh-partner-skill-picker-empty\">{query ? '\u6CA1\u6709\u5339\u914D\u7684\u672A\u542F\u7528 Skill\u3002' : '\u6240\u6709\u5DF2\u5B89\u88C5 Skill \u90FD\u5DF2\u542F\u7528\u3002'}</p>}</div>\n {availableSkills.length > visibleAvailableSkills.length && <small className=\"dsh-partner-skill-picker-limit\">\u8FD8\u6709 {availableSkills.length - visibleAvailableSkills.length} \u4E2A\u7ED3\u679C\uFF0C\u8BF7\u8F93\u5165\u5173\u952E\u8BCD\u7EE7\u7EED\u7B5B\u9009\u3002</small>}\n </div>}\n {catalog.installed.length === 0 ? <p className=\"dsh-partner-feature-empty\">\u5C1A\u672A\u5B89\u88C5 Skill\uFF0C\u8BF7\u5148\u4ECE\u5DE6\u4FA7\u7684 Skill \u5E02\u573A\u5B89\u88C5\u3002</p> : enabledSkills.length === 0 ? <p className=\"dsh-partner-feature-empty\">\u5F53\u524D\u4F19\u4F34\u8FD8\u6CA1\u6709\u542F\u7528 Skill\u3002\u70B9\u51FB\u201C\u6DFB\u52A0 Skill\u201D\u9009\u62E9\u9700\u8981\u7684\u80FD\u529B\u3002</p> : <>\n <div className=\"dsh-partner-skill-installed is-binding\">{visibleEnabledSkills.map(skill => <article key={skill.id}>\n <span className=\"dsh-partner-skill-mark\"><IconCheckOutline16 size={16} /></span><span><strong>{skill.displayName}</strong><p>{skill.description}</p><small>{skill.executionContext === 'fork' ? '\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD\u6267\u884C' : '\u53EF\u4FE1\u5F53\u524D\u4F1A\u8BDD\u6267\u884C'}</small></span>\n <button type=\"button\" className=\"dsh-partner-skill-binding-action\" disabled={busy === skill.id} aria-label={`\u4ECE\u5F53\u524D\u4F19\u4F34\u505C\u7528 ${skill.displayName}`} onClick={() => { void setBinding(skill.id, false) }}>{busy === skill.id ? '\u5904\u7406\u4E2D\u2026' : '\u505C\u7528'}</button>\n </article>)}</div>\n {enabledSkills.length > 4 && <button type=\"button\" className=\"dsh-partner-skill-disclosure\" aria-expanded={showAll} onClick={() => setShowAll(value => !value)}>{showAll ? '\u6536\u8D77 Skill' : `\u67E5\u770B\u5168\u90E8 ${enabledSkills.length} \u4E2A Skill`}</button>}\n </>}\n {error && <p className=\"dsh-partner-inline-error\" role=\"alert\">{error}</p>}\n </section>\n}\n\nfunction SkillSearch({ value, change, count, label, placeholder, loading = false, autoFocus = false, compact = false }: {\n value: string\n change(value: string): void\n count: number\n label: string\n placeholder: string\n loading?: boolean\n autoFocus?: boolean\n compact?: boolean\n}): JSX.Element {\n return <div className={`dsh-partner-skill-search${compact ? ' is-compact' : ''}`} role=\"search\" aria-label={label}>\n <span className=\"dsh-partner-skill-search-icon\" aria-hidden=\"true\"><IconSearchOutline16 size={16} /></span>\n <input\n type=\"search\"\n value={value}\n autoFocus={autoFocus}\n aria-label={label}\n placeholder={placeholder}\n onChange={event => change(event.target.value)}\n onKeyDown={event => { if (event.key === 'Escape' && value) { event.preventDefault(); change('') } }}\n />\n {value && <button type=\"button\" className=\"dsh-partner-skill-search-clear\" aria-label=\"\u6E05\u7A7A\u641C\u7D22\" title=\"\u6E05\u7A7A\u641C\u7D22\" onClick={() => change('')}><IconCloseOutline16 size={14} /></button>}\n <span className=\"dsh-partner-skill-search-count\" aria-live=\"polite\">{loading ? '\u540C\u6B65\u4E2D' : `${count} \u9879`}</span>\n </div>\n}\n\nfunction NewSkillForm({ existingIds, close, changed }: { existingIds: string[]; close(): void; changed(): Promise<void> | void }): JSX.Element {\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n const id = String(data.get('id') ?? '').trim().toLocaleLowerCase()\n if (existingIds.includes(id)) { setError('\u8FD9\u4E2A Skill \u6807\u8BC6\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u6362\u4E00\u4E2A\u6807\u8BC6\u3002'); return }\n setBusy(true); setError(undefined)\n try {\n const document = skillDocument({\n id,\n displayName: String(data.get('displayName') ?? ''),\n description: String(data.get('description') ?? ''),\n context: String(data.get('context') ?? 'fork'),\n allowedTools: String(data.get('allowedTools') ?? ''),\n instructions: String(data.get('instructions') ?? ''),\n })\n await api('/skills/local', { method: 'POST', body: JSON.stringify({ id, document }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-feature-form dsh-partner-skill-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>Skill \u540D\u79F0</span><input name=\"displayName\" required maxLength={120} autoFocus placeholder=\"\u4F8B\u5982\uFF1A\u53D1\u5E03\u8BF4\u660E\u6574\u7406\" /></label><label><span>Skill \u6807\u8BC6</span><input name=\"id\" required maxLength={80} pattern=\"[A-Za-z0-9][A-Za-z0-9._-]{0,79}\" placeholder=\"release-notes\" /></label><label className=\"is-wide\"><span>\u4E00\u53E5\u8BDD\u8BF4\u660E</span><input name=\"description\" required maxLength={600} placeholder=\"\u8BF4\u660E\u4EC0\u4E48\u65F6\u5019\u4F7F\u7528\uFF0C\u4EE5\u53CA\u8981\u89E3\u51B3\u4EC0\u4E48\u95EE\u9898\" /></label><label><span>\u6267\u884C\u65B9\u5F0F</span><select name=\"context\" defaultValue=\"fork\"><option value=\"fork\">\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD</option><option value=\"inline\">\u53EF\u4FE1\u5F53\u524D\u4F1A\u8BDD</option></select></label><label><span>\u5141\u8BB8\u7684\u5DE5\u5177</span><input name=\"allowedTools\" maxLength={1000} placeholder=\"\u591A\u4E2A\u5DE5\u5177\u7528\u9017\u53F7\u5206\u9694\uFF0C\u53EF\u7559\u7A7A\" /></label><label className=\"is-wide\"><span>Skill \u6307\u4EE4</span><textarea name=\"instructions\" required maxLength={500000} rows={8} placeholder=\"\u5199\u6E05\u5DE5\u4F5C\u6B65\u9AA4\u3001\u8FB9\u754C\u3001\u8F93\u51FA\u683C\u5F0F\u548C\u9A8C\u6536\u6761\u4EF6\" /></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA Skill'}</button></footer></form>\n}\n\nfunction NetworkSettingsForm({ value, close, changed }: { value: SkillMarketNetworkView; close(): void; changed(value: SkillMarketNetworkView): Promise<void> | void }): JSX.Element {\n const [proxyUrl, setProxyUrl] = useState(value.proxyUrl ?? '')\n const [busy, setBusy] = useState<'save' | 'test'>()\n const [status, setStatus] = useState<string>()\n const [error, setError] = useState<string>()\n const test = async (): Promise<void> => {\n setBusy('test'); setError(undefined); setStatus(undefined)\n try {\n const result = await api<SkillMarketNetworkTestView>('/skill-markets/network', { method: 'POST', body: JSON.stringify({ proxyUrl: proxyUrl.trim() }) })\n setStatus(`\u8FDE\u63A5\u6B63\u5E38 \u00B7 ${result.sourceCount} \u4E2A\u6765\u6E90 \u00B7 ${result.entryCount} \u4E2A Skill \u00B7 ${result.latencyMs} ms`)\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const save = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); setBusy('save'); setError(undefined)\n try {\n const next = await api<SkillMarketNetworkView>('/skill-markets/network', { method: 'PUT', body: JSON.stringify({ proxyUrl: proxyUrl.trim() }) })\n await changed(next); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n return <form className=\"dsh-partner-feature-form dsh-partner-network-form\" aria-busy={busy !== undefined} onSubmit={event => { void save(event) }}><label className=\"is-wide\"><span>HTTP \u4EE3\u7406</span><input type=\"url\" autoFocus value={proxyUrl} onChange={event => setProxyUrl(event.target.value)} placeholder=\"http://host.docker.internal:7893\" /><small>\u7559\u7A7A\u4E3A\u76F4\u8FDE\uFF1B\u5E02\u573A\u5217\u8868\u548C\u5B89\u88C5\u5305\u4E0B\u8F7D\u5171\u7528\u8FD9\u4E2A\u4EE3\u7406\u3002</small></label>{status && <WorkspaceNotice kind=\"success\">{status}</WorkspaceNotice>}{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy !== undefined} onClick={() => { void test() }}>{busy === 'test' ? '\u6D4B\u8BD5\u4E2D\u2026' : '\u6D4B\u8BD5\u8FDE\u63A5'}</button><span className=\"dsh-partner-form-footer-spacer\" /><button type=\"button\" disabled={busy !== undefined} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy !== undefined}>{busy === 'save' ? '\u4FDD\u5B58\u4E2D\u2026' : '\u4FDD\u5B58\u8BBE\u7F6E'}</button></footer></form>\n}\n\nfunction MarketSourceForm({ close, changed }: { close(): void; changed(): Promise<void> | void }): JSX.Element {\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n setBusy(true); setError(undefined)\n try {\n await api('/skill-markets', { method: 'POST', body: JSON.stringify({ name: data.get('name'), indexUrl: data.get('indexUrl'), enabled: true, trusted: false }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-feature-form dsh-partner-market-source-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>\u6765\u6E90\u540D\u79F0</span><input name=\"name\" required maxLength={100} autoFocus placeholder=\"\u56E2\u961F Skill \u5E02\u573A\" /></label><label><span>\u7D22\u5F15 URL</span><input name=\"indexUrl\" required type=\"url\" placeholder=\"https://example.com/skills.json\" /></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}>{busy ? '\u6DFB\u52A0\u4E2D\u2026' : '\u6DFB\u52A0\u6765\u6E90'}</button></footer></form>\n}\nfunction skillDocument(value: { id: string; displayName: string; description: string; context: string; allowedTools: string; instructions: string }): string {\n const requestedTools = value.allowedTools.split(/[,\uFF0C\\s]+/).map(item => item.trim()).filter(Boolean)\n const invalidTool = requestedTools.find(item => !/^[a-zA-Z0-9._:-]+$/.test(item))\n if (invalidTool) throw new Error(`\u5DE5\u5177\u540D\u79F0\u683C\u5F0F\u4E0D\u6B63\u786E\uFF1A${invalidTool}`)\n const tools = [...new Set(requestedTools)].slice(0, 64)\n return `---\\nname: ${value.id}\\ndisplay-name: ${skillScalar(value.displayName)}\\ndescription: ${skillScalar(value.description)}\\nversion: 1.0.0\\ncontext: ${value.context === 'inline' ? 'inline' : 'fork'}\\nallowed-tools: [${tools.join(', ')}]\\n---\\n# ${value.displayName.replace(/[\\r\\n#]+/g, ' ').trim()}\\n\\n${value.instructions.trim()}\\n`\n}\nfunction skillScalar(value: string): string { return `\"${value.replace(/[\\r\\n]+/g, ' ').replace(/\"/g, \"'\").trim()}\"` }\n", "import { useRef, useState, type FormEvent } from 'react'\nimport { api } from '../client-api.js'\nimport { WorkspaceDialog, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nconst LIMIT = 32 * 1024 * 1024\nconst encodeFile = (file: File): Promise<string> => new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onerror = () => reject(new Error(`\u65E0\u6CD5\u8BFB\u53D6 ${file.name}`))\n reader.onload = () => resolve(String(reader.result).split(',')[1] ?? '')\n reader.readAsDataURL(file)\n})\n\nexport function SkillImportDialog({ close, changed }: { close(): void; changed(): Promise<void> | void }): JSX.Element {\n const zipInput = useRef<HTMLInputElement>(null), directoryInput = useRef<HTMLInputElement | null>(null)\n const [files, setFiles] = useState<File[]>([])\n const [kind, setKind] = useState<'zip' | 'directory'>('zip')\n const [busy, setBusy] = useState(false), [progress, setProgress] = useState('')\n const [error, setError] = useState<string>()\n const choose = (selected: FileList | null, nextKind: 'zip' | 'directory'): void => {\n if (!selected?.length || busy) return\n setError(undefined); setFiles([])\n const next = Array.from(selected).filter(file => !file.webkitRelativePath.split('/').some(part => ['.git', 'node_modules', '__MACOSX', '.DS_Store'].includes(part)))\n if (nextKind === 'zip' && !/\\.zip$/iu.test(next[0]?.name ?? '')) { setError('\u8BF7\u9009\u62E9 ZIP \u538B\u7F29\u5305\uFF1B\u5176\u4ED6\u683C\u5F0F\u8BF7\u5148\u89E3\u538B\uFF0C\u518D\u9009\u62E9\u76EE\u5F55\u5BFC\u5165\u3002'); return }\n if (!next.length || next.length > 512 || next.reduce((total, file) => total + file.size, 0) > LIMIT || nextKind === 'directory' && next.some(file => file.size > 8 * 1024 * 1024)) { setError('\u6700\u591A 512 \u4E2A\u6587\u4EF6\u3001\u603B\u8BA1 32 MiB\uFF1B\u76EE\u5F55\u4E2D\u7684\u5355\u4E2A\u6587\u4EF6\u4E0D\u80FD\u8D85\u8FC7 8 MiB\u3002'); return }\n setKind(nextKind); setFiles(next)\n }\n const submit = async (event: FormEvent): Promise<void> => {\n event.preventDefault()\n if (busy || !files.length) return\n setBusy(true); setError(undefined)\n try {\n let body: unknown\n if (kind === 'zip') { setProgress('\u6B63\u5728\u8BFB\u53D6\u538B\u7F29\u5305\u2026'); body = { kind, data: await encodeFile(files[0]!) } }\n else {\n const entries = []\n for (const [index, file] of files.entries()) {\n setProgress(`\u6B63\u5728\u8BFB\u53D6\u6587\u4EF6 ${index + 1}/${files.length}`)\n entries.push({ path: file.webkitRelativePath || file.name, data: await encodeFile(file) })\n }\n body = { kind, files: entries }\n }\n setProgress('\u6B63\u5728\u6821\u9A8C\u5E76\u5BFC\u5165\u2026')\n await api('/skills/import', { method: 'POST', body: JSON.stringify(body), signal: AbortSignal.timeout(120000) })\n setProgress('\u5BFC\u5165\u6210\u529F\uFF0C\u6B63\u5728\u66F4\u65B0\u5217\u8868\u2026')\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) }\n finally { setBusy(false); setProgress('') }\n }\n return <WorkspaceDialog title=\"\u5BFC\u5165 Skill\" detail=\"\u5BFC\u5165\u5B8C\u6574\u6280\u80FD\u5305\uFF0C\u4FDD\u7559 scripts\u3001references\u3001assets \u7B49\u914D\u5957\u6587\u4EF6\u3002\" close={() => { if (!busy) close() }}>\n <form className=\"dsh-partner-feature-form dsh-partner-skill-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}>\n <input hidden type=\"file\" accept=\".zip,application/zip\" ref={zipInput} onChange={event => { choose(event.target.files, 'zip'); event.target.value = '' }} />\n <input hidden type=\"file\" multiple ref={node => { directoryInput.current = node; node?.setAttribute('webkitdirectory', '') }} onChange={event => { choose(event.target.files, 'directory'); event.target.value = '' }} />\n <div className=\"is-wide dsh-partner-capability-actions\"><button type=\"button\" autoFocus disabled={busy} onClick={() => zipInput.current?.click()}>\u9009\u62E9 ZIP \u538B\u7F29\u5305</button><button type=\"button\" disabled={busy || !('webkitdirectory' in document.createElement('input'))} onClick={() => directoryInput.current?.click()}>\u9009\u62E9\u76EE\u5F55</button></div>\n <p className=\"is-wide dsh-partner-form-help\">\u6BCF\u6B21\u5BFC\u5165\u4E00\u4E2A Skill\uFF0C\u76EE\u5F55\u4E2D\u5E94\u6709 SKILL.md\u3002\u5B89\u88C5\u4E0D\u4F1A\u6267\u884C\u811A\u672C\uFF0C\u4E5F\u4E0D\u4F1A\u81EA\u52A8\u4E3A\u4F19\u4F34\u542F\u7528\u3002\u4EC5\u5BFC\u5165\u53EF\u4FE1\u6765\u6E90\uFF1B\u5176\u4ED6\u538B\u7F29\u683C\u5F0F\u53EF\u5148\u89E3\u538B\u540E\u5BFC\u5165\u76EE\u5F55\u3002</p>\n {files.length > 0 && <p className=\"is-wide dsh-partner-form-help\" role=\"status\">\u5DF2\u9009\u62E9\uFF1A{kind === 'zip' ? files[0]!.name : files[0]!.webkitRelativePath.split('/')[0]} \u00B7 {files.length} \u4E2A\u6587\u4EF6 \u00B7 {(files.reduce((total, file) => total + file.size, 0) / 1024 / 1024).toFixed(2)} MiB</p>}\n {progress && <p className=\"is-wide dsh-partner-form-help\" role=\"status\">{progress}</p>}\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy || !files.length}>{busy ? '\u5BFC\u5165\u4E2D\u2026' : '\u5BFC\u5165 Skill'}</button></footer>\n </form>\n </WorkspaceDialog>\n}\n", "import { useEffect, useMemo, useState } from 'react'\nimport { IconChevronRightOutline14, IconPlusOutline16, IconSearchOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type TaskBoardView, type PartnerDirectoryEntryView, type RequirementView } from '../client-api.js'\nimport { CollectionSkeleton, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\nimport { useBoardRefresh } from './board-refresh.js'\nimport { RequirementForm, RequirementDetail, requirementStatus } from './requirement-dialog.js'\nimport { RequirementTasksPanel } from './requirement-tasks-panel.js'\n\nexport function RequirementBoard({ initialTaskId, openRequest }: { initialTaskId?: string | undefined; openRequest?: object | undefined } = {}): JSX.Element {\n const [board, setBoard] = useState<TaskBoardView>({ tasks: [], activities: [], requirements: [] })\n const [directory, setDirectory] = useState<PartnerDirectoryEntryView[]>([])\n const [loading, setLoading] = useState(true), [error, setError] = useState<string>()\n const [selected, setSelected] = useState<string>(), [detailId, setDetailId] = useState<string>()\n const [creating, setCreating] = useState(false), [archived, setArchived] = useState(false)\n const [query, setQuery] = useState(''), [limit, setLimit] = useState(24)\n useEffect(() => { if (initialTaskId) { setSelected(undefined); setDetailId(undefined); setCreating(false) } }, [initialTaskId, openRequest])\n const load = useBoardRefresh(async () => {\n const [next, collaboration] = await Promise.all([api<TaskBoardView>('/tasks'), api<{ companions: PartnerDirectoryEntryView[] }>('/collaboration')])\n return () => { setBoard(next); setDirectory(collaboration.companions); setLoading(false); setError(undefined); setDetailId(id => next.requirements?.some(r => r.id === id) ? id : undefined) }\n }, reason => { setError(errorMessage(reason)); setLoading(false) }, !selected)\n const requirements = board.requirements ?? []\n const groups = useMemo(() => {\n const result = new Map<string, TaskBoardView['tasks']>()\n for (const task of board.tasks) { const id = task.requirementId ?? 'legacy'; const group = result.get(id) ?? []; group.push(task); result.set(id, group) }\n return result\n }, [board.tasks])\n const visible = requirements.filter(r => (r.status === 'done') === archived && [r.title, r.description, directory.find(c => c.id === r.ownerCompanionId)?.name].some(v => v?.toLocaleLowerCase().includes(query.trim().toLocaleLowerCase()))).sort((a, b) => b.updatedAt - a.updatedAt)\n const detail = requirements.find(r => r.id === detailId)\n if (selected) return <RequirementTasksPanel key={selected} requirementId={selected} back={() => { setSelected(undefined); void load() }} />\n return <div className=\"dsh-partner-feature-page is-board\">\n <WorkspaceHero eyebrow=\"Shared workspace\" title=\"\u9700\u6C42\u770B\u677F\" detail=\"\u6309\u9700\u6C42\u7EC4\u7EC7\u5DE5\u4F5C\uFF0C\u5B50\u4EFB\u52A1\u72EC\u7ACB\u63A8\u8FDB\uFF0C\u6574\u4F53\u5B8C\u6210\u540E\u7EDF\u4E00\u6C47\u603B\u3002\" actions={<button type=\"button\" onClick={() => setCreating(true)}><IconPlusOutline16 size={15} />\u65B0\u9700\u6C42</button>} />\n {error && <WorkspaceNotice>{error}<button type=\"button\" onClick={() => { void load() }}>\u91CD\u8BD5</button></WorkspaceNotice>}\n <div className=\"dsh-partner-requirement-toolbar\">\n <nav className=\"dsh-partner-board-statuses\" aria-label=\"\u9700\u6C42\u8303\u56F4\">{[false, true].map(value => <button type=\"button\" key={String(value)} aria-pressed={archived === value} className={archived === value ? 'is-active' : ''} onClick={() => { setArchived(value); setLimit(24) }}>{value ? '\u5DF2\u5F52\u6863' : '\u8FDB\u884C\u4E2D'}<b>{requirements.filter(r => (r.status === 'done') === value).length}</b></button>)}</nav>\n <label className=\"dsh-partner-board-search\"><span className=\"sr-only\">\u641C\u7D22\u9700\u6C42</span><span aria-hidden=\"true\"><IconSearchOutline16 size={16} /></span><input placeholder=\"\u641C\u7D22\u9700\u6C42\u6216\u8D1F\u8D23\u4EBA\" value={query} onChange={event => { setQuery(event.target.value); setLimit(24) }} /></label>\n </div>\n {loading ? <CollectionSkeleton rows={4} /> : <>\n <div className=\"dsh-partner-requirement-grid\">{visible.slice(0, limit).map(item => {\n const tasks = groups.get(item.id) ?? [], total = item.status === 'done' ? (item.results?.length ?? tasks.length) : tasks.length\n const done = item.status === 'done' ? total : tasks.filter(t => t.status === 'done').length\n const blocked = tasks.filter(t => t.status === 'blocked').length\n return <article key={item.id} className=\"dsh-partner-requirement-card\">\n <button type=\"button\" className=\"dsh-partner-requirement-open\" onClick={() => item.status === 'done' ? setDetailId(item.id) : setSelected(item.id)}>\n <span className=\"dsh-partner-requirement-meta\"><span>{requirementStatus(item)}</span><small>{directory.find(c => c.id === item.ownerCompanionId)?.name ?? '\u4EBA\u5DE5\u6536\u5C3E'}</small></span>\n <strong title={item.title}>{item.title}</strong><p>{item.summary || item.description || '\u5C1A\u672A\u8865\u5145\u9700\u6C42\u8BF4\u660E'}</p>\n <span className=\"dsh-partner-requirement-progress\" role=\"progressbar\" aria-label=\"\u5B50\u4EFB\u52A1\u9A8C\u6536\u8FDB\u5EA6\" aria-valuemin={0} aria-valuemax={Math.max(total, 1)} aria-valuenow={done}><i style={{ width: `${total ? done / total * 100 : 0}%` }} /></span>\n <span className=\"dsh-partner-requirement-meta\"><small>{done} / {total} \u5DF2\u9A8C\u6536{blocked ? ` \u00B7 ${blocked} \u53D7\u963B` : ''}</small><IconChevronRightOutline14 size={14} /></span>\n </button>\n <footer><small>{new Date(item.updatedAt).toLocaleDateString()} \u66F4\u65B0</small><button type=\"button\" onClick={() => setDetailId(item.id)} aria-haspopup=\"dialog\">{item.lastError ? '\u67E5\u770B\u5F02\u5E38' : '\u9700\u6C42\u8BE6\u60C5'}</button></footer>\n </article>\n })}</div>\n {!visible.length && <div className=\"dsh-partner-collection-empty\"><strong>{query ? '\u6CA1\u6709\u5339\u914D\u7684\u9700\u6C42' : archived ? '\u8FD8\u6CA1\u6709\u5F52\u6863\u9700\u6C42' : '\u4ECE\u4E00\u4E2A\u9700\u6C42\u5F00\u59CB'}</strong><p>{archived ? '\u5B50\u4EFB\u52A1\u5168\u90E8\u9A8C\u6536\u901A\u8FC7\u3001\u5B8C\u6210\u603B\u7ED3\u540E\uFF0C\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002' : '\u5148\u5199\u6E05\u4EA4\u4ED8\u76EE\u6807\uFF0C\u518D\u5B89\u6392\u8D1F\u8D23\u4EBA\u548C\u5B50\u4EFB\u52A1\u3002'}</p></div>}\n {visible.length > limit && <button type=\"button\" onClick={() => setLimit(n => n + 24)}>\u663E\u793A\u66F4\u591A\u9700\u6C42 \u00B7 \u8FD8\u6709 {visible.length - limit} \u9879</button>}\n {!archived && Boolean(groups.get('legacy')?.length) && <button type=\"button\" className=\"dsh-partner-requirement-legacy\" onClick={() => setSelected('legacy')}>\u672A\u5F52\u7C7B\u65E7\u4EFB\u52A1 <b>{groups.get('legacy')!.length}</b><span>\u4FDD\u7559\u539F\u8BB0\u5F55\uFF0C\u4E0D\u81EA\u52A8\u5408\u5E76</span><IconChevronRightOutline14 size={14} /></button>}\n </>}\n {creating && <WorkspaceDialog title=\"\u65B0\u5EFA\u9700\u6C42\" detail=\"\u4E00\u4E2A\u9700\u6C42\u5BF9\u5E94\u4E00\u4EFD\u6700\u7EC8\u4EA4\u4ED8\uFF0C\u7531\u8D1F\u8D23\u4EBA\u7EDF\u4E00\u6536\u5C3E\u3002\" close={() => setCreating(false)}><RequirementForm directory={directory} close={() => setCreating(false)} created={async (item: RequirementView) => { setCreating(false); await load(); setSelected(item.id) }} /></WorkspaceDialog>}\n {detail && <WorkspaceDialog title={detail.title} eyebrow=\"\u9700\u6C42\u8BE6\u60C5\" detail={requirementStatus(detail)} close={() => setDetailId(undefined)} width=\"wide\"><RequirementDetail key={detail.id} item={detail} tasks={groups.get(detail.id) ?? []} directory={directory} changed={load} close={() => setDetailId(undefined)} /></WorkspaceDialog>}\n {initialTaskId && <RequirementTasksPanel initialTaskId={initialTaskId} openRequest={openRequest} detailOnly />}\n </div>\n}\n", "import { useCallback, useEffect, useRef } from 'react'\n\n/** Polls without overlap. Explicit refresh invalidates any older response. */\nexport function useBoardRefresh(read: () => Promise<() => void>, failed: (error: unknown) => void, enabled = true): () => Promise<void> {\n const readRef = useRef(read), failedRef = useRef(failed)\n readRef.current = read; failedRef.current = failed\n const epoch = useRef(0), pending = useRef<Promise<void> | undefined>(), mounted = useRef(false)\n const refresh = useCallback(async () => {\n const version = ++epoch.current\n await pending.current\n if (!mounted.current || version !== epoch.current) return\n const request = (async () => {\n try { const commit = await readRef.current(); if (mounted.current && version === epoch.current) commit() }\n catch (error) { if (mounted.current && version === epoch.current) failedRef.current(error) }\n })()\n pending.current = request\n await request\n if (pending.current === request) pending.current = undefined\n }, [])\n useEffect(() => {\n if (!enabled) return\n mounted.current = true\n void refresh()\n const poll = () => { if (!pending.current && document.visibilityState === 'visible') void refresh() }\n const timer = window.setInterval(poll, 4000)\n document.addEventListener('visibilitychange', poll)\n return () => { mounted.current = false; epoch.current++; window.clearInterval(timer); document.removeEventListener('visibilitychange', poll) }\n }, [refresh, enabled])\n return refresh\n}\n", "import { useState, type FormEvent } from 'react'\nimport { IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type BoardTaskView, type PartnerDirectoryEntryView, type RequirementView } from '../client-api.js'\nimport { WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nexport function requirementStatus(item: RequirementView): string {\n if (item.lastError) return item.status === 'done' ? '\u5DF2\u5F52\u6863 \u00B7 \u901A\u77E5\u5F85\u91CD\u8BD5' : '\u6536\u5C3E\u5F85\u91CD\u8BD5'\n return { planning: '\u89C4\u5212\u4E2D', active: '\u63A8\u8FDB\u4E2D', review: '\u6C47\u603B\u4E2D', done: '\u5DF2\u5F52\u6863' }[item.status]\n}\n\nexport function RequirementForm({ directory, close, created }: { directory: PartnerDirectoryEntryView[]; close(): void; created(item: RequirementView): Promise<void> }): JSX.Element {\n const [busy, setBusy] = useState(false), [error, setError] = useState<string>()\n const submit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault(); const data = new FormData(event.currentTarget); setBusy(true); setError(undefined)\n try { const item = await api<RequirementView>('/requirements', { method: 'POST', body: JSON.stringify({ title: data.get('title'), description: data.get('description'), ownerCompanionId: data.get('owner') || undefined }) }); await created(item) }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-task-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <label className=\"is-wide\"><span>\u9700\u6C42\u540D\u79F0</span><input name=\"title\" autoFocus required maxLength={200} placeholder=\"\u8FD9\u6B21\u5E0C\u671B\u5B8C\u6210\u4EC0\u4E48\" /></label>\n <label className=\"is-wide\"><span>\u4EA4\u4ED8\u76EE\u6807</span><textarea name=\"description\" rows={5} maxLength={8000} placeholder=\"\u80CC\u666F\u3001\u9884\u671F\u6210\u679C\u4E0E\u6574\u4F53\u5B8C\u6210\u6807\u51C6\" /></label>\n <label className=\"is-wide\"><span>\u6536\u5C3E\u8D1F\u8D23\u4EBA</span><select name=\"owner\" defaultValue=\"\"><option value=\"\">\u4EBA\u5DE5\u6C47\u603B</option>{directory.map(c => <option value={c.id} key={c.id}>@{c.name}</option>)}</select><small>\u5B50\u4EFB\u52A1\u5168\u90E8\u901A\u8FC7\u9A8C\u6536\u540E\uFF0C\u7531\u8BE5\u4F19\u4F34\u603B\u7ED3\u5E76\u901A\u8FC7\u9700\u6C42\u6765\u6E90\u6E20\u9053\u901A\u77E5\u3002</small></label>\n <footer><button type=\"button\" onClick={close} disabled={busy}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}>{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA\u5E76\u5B89\u6392\u4EFB\u52A1'}</button></footer>\n </form>\n}\n\nexport function RequirementDetail({ item, tasks, directory, changed, close }: { item: RequirementView; tasks: BoardTaskView[]; directory: PartnerDirectoryEntryView[]; changed(): Promise<void>; close(): void }): JSX.Element {\n const [busy, setBusy] = useState(false), [error, setError] = useState<string>(), [confirming, setConfirming] = useState(false), [summary, setSummary] = useState('')\n const done = tasks.filter(t => t.status === 'done').length, ready = tasks.length > 0 && done === tasks.length && item.status !== 'planning'\n const act = async (action: string, body: Record<string, unknown> = {}) => {\n setBusy(true); setError(undefined)\n try { await api(`/requirements/${item.id}${action === 'remove' ? '' : `/${action}`}`, { method: action === 'remove' ? 'DELETE' : 'POST', body: JSON.stringify({ expectedRevision: item.revision, ...body }) }); if (action === 'remove') close(); await changed() }\n catch (reason) { await changed(); setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <div className=\"dsh-partner-task-detail dsh-partner-requirement-detail\" aria-busy={busy}>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <section className=\"dsh-partner-task-description\"><strong>\u4EA4\u4ED8\u76EE\u6807</strong><p>{item.description || '\u672A\u8865\u5145\u4EA4\u4ED8\u76EE\u6807'}</p></section>\n <div className=\"dsh-partner-requirement-facts\"><span>\u6536\u5C3E\u8D1F\u8D23\u4EBA<b>{directory.find(c => c.id === item.ownerCompanionId)?.name ?? '\u4EBA\u5DE5\u6C47\u603B'}</b></span><span>\u5B50\u4EFB\u52A1\u9A8C\u6536<b>{item.status === 'done' ? `${item.results?.length ?? done} \u9879\u5DF2\u5F52\u6863` : `${done} / ${tasks.length}`}</b></span><span>\u901A\u77E5\u65B9\u5F0F<b>{item.creatorSessionId ? '\u9700\u6C42\u6765\u6E90\u4F1A\u8BDD / \u6E20\u9053' : '\u770B\u677F\u5185\u67E5\u770B\u7ED3\u679C'}</b></span></div>\n {item.lastError && <WorkspaceNotice>{item.lastError} \u00B7 \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u91CD\u8BD5\uFF0C\u4E5F\u53EF\u7ACB\u5373\u91CD\u8BD5\u3002<button type=\"button\" disabled={busy} onClick={() => { void act('retry') }}>\u7ACB\u5373\u91CD\u8BD5</button></WorkspaceNotice>}\n {item.summary && <section className=\"dsh-partner-task-result\"><strong>\u6700\u7EC8\u7ED3\u8BBA</strong><p>{item.summary}</p></section>}\n {!!item.results?.length && <details className=\"dsh-partner-requirement-disclosure\"><summary>\u4EA4\u4ED8\u8BB0\u5F55 \u00B7 {item.results.length} \u9879</summary>{item.results.map(result => <section className=\"dsh-partner-task-result\" key={result.id}><strong>{result.title}</strong><p>{result.resultSummary || result.resultAbstract || '\u672A\u63D0\u4F9B\u7ED3\u679C\u6B63\u6587'}</p></section>)}</details>}\n {item.status !== 'done' && <>\n <label className=\"dsh-partner-requirement-owner\"><span>\u8C03\u6574\u6536\u5C3E\u8D1F\u8D23\u4EBA</span><select aria-label=\"\u6536\u5C3E\u8D1F\u8D23\u4EBA\" value={item.ownerCompanionId ?? ''} disabled={busy} onChange={event => { void act('owner', { ownerCompanionId: event.target.value }) }}><option value=\"\">\u4EBA\u5DE5\u6C47\u603B</option>{item.ownerCompanionId && !directory.some(c => c.id === item.ownerCompanionId) && <option value={item.ownerCompanionId}>\u539F\u8D1F\u8D23\u4EBA\u5DF2\u5220\u9664</option>}{directory.map(c => <option value={c.id} key={c.id}>@{c.name}</option>)}</select></label>\n <WorkspaceNotice kind=\"warning\">{item.status === 'planning' ? '\u5168\u90E8\u5B50\u4EFB\u52A1\u5B89\u6392\u597D\u540E\uFF0C\u63D0\u4EA4\u672C\u6B21\u89C4\u5212\uFF1B\u5220\u9664\u5B50\u4EFB\u52A1\u4F1A\u91CD\u65B0\u6253\u5F00\u89C4\u5212\uFF0C\u9700\u786E\u8BA4\u65B0\u7684\u4EA4\u4ED8\u8303\u56F4\u3002' : '\u5B50\u4EFB\u52A1\u7684\u6267\u884C\u548C\u9A8C\u6536\u53EA\u5728\u5185\u90E8\u6D41\u8F6C\uFF0C\u5168\u90E8\u5B8C\u6210\u540E\u624D\u6C47\u603B\u9700\u6C42\u7ED3\u679C\u3002'}</WorkspaceNotice>\n {ready && <details className=\"dsh-partner-requirement-disclosure\"><summary>\u4EBA\u5DE5\u5B8C\u6210\u6536\u5C3E</summary><label><span>\u6700\u7EC8\u7ED3\u8BBA</span><textarea rows={5} maxLength={12000} value={summary} onChange={event => setSummary(event.target.value)} placeholder=\"\u786E\u8BA4\u5B9E\u9645\u4EA4\u4ED8\u5185\u5BB9\u3001\u7ED3\u8BBA\u53CA\u9650\u5236\" /></label><button type=\"button\" disabled={busy || !summary.trim()} onClick={() => { void act('finish', { summary }) }}>\u4FDD\u5B58\u603B\u7ED3\u5E76\u5F52\u6863</button></details>}\n </>}\n <details className=\"dsh-partner-requirement-disclosure\"><summary>\u7BA1\u7406\u9700\u6C42</summary><p>\u5220\u9664\u9700\u6C42\u4F1A\u540C\u65F6\u79FB\u9664\u5B50\u4EFB\u52A1\uFF0C\u5E76\u53D6\u6D88\u5173\u8054\u6267\u884C\u3002\u4E0D\u80FD\u64A4\u9500\uFF0C\u4E0D\u4F1A\u5220\u9664\u5DF2\u751F\u6210\u7684\u4EA4\u4ED8\u6587\u4EF6\u3002</p>{confirming ? <div className=\"dsh-partner-requirement-actions\"><button type=\"button\" disabled={busy} onClick={() => setConfirming(false)}>\u4FDD\u7559\u9700\u6C42</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={() => { void act('remove') }}>\u786E\u8BA4\u5220\u9664\u9700\u6C42\u548C {tasks.length} \u4E2A\u4EFB\u52A1</button></div> : <button type=\"button\" className=\"is-danger\" onClick={() => setConfirming(true)}><IconTrashOutline16 size={14} />\u5220\u9664\u9700\u6C42</button>}</details>\n <footer><button type=\"button\" onClick={close} disabled={busy}>\u5173\u95ED</button>{item.status !== 'done' && <button type=\"button\" className=\"is-primary\" disabled={busy || (item.status === 'planning' && !tasks.length)} onClick={() => { void act(item.status === 'planning' ? 'submit' : 'reopen') }}>{busy ? '\u5904\u7406\u4E2D\u2026' : item.status === 'planning' ? '\u63D0\u4EA4\u89C4\u5212' : '\u8C03\u6574\u4EFB\u52A1\u8303\u56F4'}</button>}</footer>\n </div>\n}\n", "import { useDeferredValue, useEffect, useMemo, useState, type FormEvent } from 'react'\nimport { IconCheckOutline16, IconChevronRightOutline14, IconCloseOutline16, IconPlusOutline16, IconSearchOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type BoardTaskStatusView, type BoardTaskView, type PartnerDelegationView, type PartnerDirectoryEntryView, type TaskActivityView, type TaskBoardView } from '../client-api.js'\nimport { CollectionSkeleton, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\nimport { TaskBoardStage } from './task-board-stage.js'\nimport { useBoardRefresh } from './board-refresh.js'\nimport { RequirementDetail, requirementStatus } from './requirement-dialog.js'\nimport { TaskContractPanel } from './task-contract-panel.js'\nimport type { TaskReviewCheck } from '../tasks/contract.js'\n\nconst COLUMNS: Array<{ id: BoardTaskStatusView; label: string }> = [\n { id: 'backlog', label: '\u6536\u96C6\u7BB1' }, { id: 'ready', label: '\u5F85\u5F00\u59CB' }, { id: 'doing', label: '\u8FDB\u884C\u4E2D' },\n { id: 'review', label: '\u5F85\u9A8C\u6536' }, { id: 'blocked', label: '\u53D7\u963B' }, { id: 'done', label: '\u5DF2\u5B8C\u6210' },\n]\ntype BoardStatusFilter = BoardTaskStatusView | 'all'\n\nexport function RequirementTasksPanel({ initialTaskId, openRequest, requirementId, back, detailOnly = false }: { initialTaskId?: string | undefined; openRequest?: object | undefined; requirementId?: string; back?(): void; detailOnly?: boolean } = {}): JSX.Element {\n const [board, setBoard] = useState<TaskBoardView>({ tasks: [], activities: [] })\n const [directory, setDirectory] = useState<PartnerDirectoryEntryView[]>([])\n const [delegations, setDelegations] = useState<PartnerDelegationView[]>([])\n const [creating, setCreating] = useState(false)\n const [requirementDetail, setRequirementDetail] = useState(false)\n const [selectedTaskId, setSelectedTaskId] = useState<string | undefined>(initialTaskId)\n useEffect(() => { if (initialTaskId) setSelectedTaskId(initialTaskId) }, [initialTaskId, openRequest])\n const [busy, setBusy] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n const [syncedAt, setSyncedAt] = useState<number>()\n const [query, setQuery] = useState('')\n const [statusFilter, setStatusFilter] = useState<BoardStatusFilter>('all')\n const [assigneeFilter, setAssigneeFilter] = useState('all')\n const deferredQuery = useDeferredValue(query.trim().toLocaleLowerCase())\n const tasksById = useMemo(() => new Map(board.tasks.map(item => [item.id, item])), [board.tasks])\n const directoryById = useMemo(() => new Map(directory.map(item => [item.id, item])), [directory])\n const activeDelegationByTaskId = useMemo(() => {\n const result = new Map<string, PartnerDelegationView>()\n for (const delegation of delegations) {\n if ((delegation.status === 'queued' || delegation.status === 'running') && !result.has(delegation.taskId)) result.set(delegation.taskId, delegation)\n }\n return result\n }, [delegations])\n const selectedTask = selectedTaskId ? tasksById.get(selectedTaskId) : undefined\n const requirement = board.requirements?.find(item => item.id === requirementId)\n const requirementTasks = useMemo(() => board.tasks.filter(task => !requirementId || (requirementId === 'legacy' ? !task.requirementId : task.requirementId === requirementId)), [board.tasks, requirementId])\n const dependentsById = useMemo(() => {\n const result = new Map<string, number>()\n for (const task of board.tasks) for (const dependencyId of task.dependencyTaskIds) result.set(dependencyId, (result.get(dependencyId) ?? 0) + 1)\n return result\n }, [board.tasks])\n const scopedTasks = useMemo(() => requirementTasks.filter(task => {\n if (assigneeFilter !== 'all' && (task.assigneeCompanionId ?? 'unassigned') !== assigneeFilter) return false\n if (!deferredQuery) return true\n const dependencies = task.dependencyTaskIds.map(id => tasksById.get(id)?.title ?? '')\n return [task.title, task.description, task.resultAbstract, task.resultSummary, directoryById.get(task.assigneeCompanionId ?? '')?.name, ...dependencies]\n .some(value => value?.toLocaleLowerCase().includes(deferredQuery))\n }), [assigneeFilter, requirementTasks, deferredQuery, directoryById, tasksById])\n const statusCounts = useMemo(() => {\n const result = new Map<BoardTaskStatusView, number>(COLUMNS.map(column => [column.id, 0]))\n for (const task of scopedTasks) result.set(task.status, (result.get(task.status) ?? 0) + 1)\n return result\n }, [scopedTasks])\n const visibleColumns = statusFilter === 'all' ? COLUMNS.filter(column => (statusCounts.get(column.id) ?? 0) > 0) : COLUMNS.filter(column => column.id === statusFilter)\n const tasksByStatus = useMemo(() => {\n const priorityRank: Record<BoardTaskView['priority'], number> = { urgent: 3, high: 2, normal: 1, low: 0 }\n const result = new Map<BoardTaskStatusView, BoardTaskView[]>(COLUMNS.map(column => [column.id, []]))\n for (const task of scopedTasks) {\n if (statusFilter !== 'all' && task.status !== statusFilter) continue\n result.get(task.status)?.push(task)\n }\n for (const tasks of result.values()) tasks.sort((left, right) => priorityRank[right.priority] - priorityRank[left.priority] || right.updatedAt - left.updatedAt)\n return result\n }, [scopedTasks, statusFilter])\n const visibleTaskCount = statusFilter === 'all' ? scopedTasks.length : (statusCounts.get(statusFilter) ?? 0)\n const load = useBoardRefresh(async () => {\n const [next, collaboration] = await Promise.all([api<TaskBoardView>('/tasks'), api<{ companions: PartnerDirectoryEntryView[]; delegations: PartnerDelegationView[] }>('/collaboration')])\n return () => { setBoard(next); setDirectory(collaboration.companions); setDelegations(collaboration.delegations); setSyncedAt(Date.now()); setLoading(false); setSelectedTaskId(id => next.tasks.some(t => t.id === id) ? id : undefined) }\n }, reason => { setError(errorMessage(reason)); setLoading(false) })\n const update = async (task: BoardTaskView, change: Record<string, unknown>): Promise<void> => {\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}`, { method: 'PUT', body: JSON.stringify({ expectedRevision: task.revision, ...change }) }); await load() }\n catch (reason) { await load(); setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const delegate = async (task: BoardTaskView): Promise<void> => {\n if (!task.assigneeCompanionId) return\n setBusy(task.id); setError(undefined)\n try {\n await api(`/tasks/${task.id}/delegate`, { method: 'POST', body: JSON.stringify({ to: task.assigneeCompanionId, request: task.description || `\u5B8C\u6210\u4EFB\u52A1\uFF1A${task.title}` }) })\n await load()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const review = async (task: BoardTaskView): Promise<void> => {\n if (!task.reviewerCompanionId) return\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}/review`, { method: 'POST', body: JSON.stringify({ to: task.reviewerCompanionId }) }); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const accept = async (task: BoardTaskView, checks?: TaskReviewCheck[]): Promise<void> => {\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}/accept`, { method: 'POST', body: JSON.stringify({ expectedRevision: task.revision, checks }) }); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const reject = async (task: BoardTaskView, reason: string, checks?: TaskReviewCheck[]): Promise<void> => {\n if (!reason) return\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}/reject`, { method: 'POST', body: JSON.stringify({ reason, expectedRevision: task.revision, checks }) }); await load() }\n catch (cause) { setError(errorMessage(cause)) } finally { setBusy(undefined) }\n }\n const remove = async (task: BoardTaskView): Promise<void> => {\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}`, { method: 'DELETE' }); if (selectedTaskId === task.id) setSelectedTaskId(undefined); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n return <div className=\"dsh-partner-feature-page is-board\">\n {!detailOnly && <>{back && <nav className=\"dsh-partner-requirement-breadcrumb\"><button type=\"button\" onClick={back}>\u9700\u6C42\u770B\u677F</button><IconChevronRightOutline14 size={14} /><span>{requirement?.title ?? '\u672A\u5F52\u7C7B\u65E7\u4EFB\u52A1'}</span></nav>}<WorkspaceHero eyebrow={requirement ? requirementStatus(requirement) : '\u65E7\u4EFB\u52A1'} title={requirement?.title ?? '\u672A\u5F52\u7C7B\u65E7\u4EFB\u52A1'} detail={requirement?.description || '\u4EFB\u52A1\u6309\u9636\u6BB5\u5C55\u793A\uFF0C\u70B9\u51FB\u67E5\u770B\u4EA4\u4ED8\u3001\u4F9D\u8D56\u548C\u6267\u884C\u72B6\u6001\u3002'} actions={<><span className=\"dsh-partner-board-live\" title={syncedAt ? `\u6700\u8FD1\u540C\u6B65 ${new Date(syncedAt).toLocaleTimeString()}` : '\u6B63\u5728\u8FDE\u63A5'}><i />\u5B9E\u65F6\u540C\u6B65</span>{requirement && <button type=\"button\" onClick={() => setRequirementDetail(true)}>\u9700\u6C42\u8BE6\u60C5</button>}{requirement?.status === 'planning' && <button type=\"button\" onClick={() => setCreating(true)}><IconPlusOutline16 size={15} />\u65B0\u4EFB\u52A1</button>}</>} /></>}\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {requirementDetail && requirement && <WorkspaceDialog eyebrow=\"\u9700\u6C42\u8BE6\u60C5\" title={requirement.title} detail={requirementStatus(requirement)} close={() => setRequirementDetail(false)} width=\"wide\"><RequirementDetail key={requirement.id} item={requirement} tasks={requirementTasks} directory={directory} changed={load} close={() => setRequirementDetail(false)} /></WorkspaceDialog>}\n {creating && requirement && <WorkspaceDialog title=\"\u65B0\u5EFA\u5B50\u4EFB\u52A1\" detail={`\u6240\u5C5E\u9700\u6C42\uFF1A${requirement.title}`} close={() => setCreating(false)} width=\"wide\"><TaskForm requirementId={requirement.id} companions={directory} tasks={requirementTasks} close={() => setCreating(false)} changed={load} /></WorkspaceDialog>}\n {selectedTask && <WorkspaceDialog eyebrow=\"TASK DETAIL\" title={selectedTask.title} detail={taskDialogSummary(selectedTask, directory)} close={() => setSelectedTaskId(undefined)} width=\"wide\"><TaskDetail\n key={selectedTask.id} task={selectedTask} tasks={board.tasks} activities={board.activities.filter(item => item.taskId === selectedTask.id)} directory={directory}\n execution={activeDelegationByTaskId.get(selectedTask.id)}\n busy={busy === selectedTask.id} update={change => { void update(selectedTask, change) }} delegate={() => { void delegate(selectedTask) }} review={() => { void review(selectedTask) }}\n accept={checks => { void accept(selectedTask, checks) }} reject={(reason, checks) => { void reject(selectedTask, reason, checks) }} remove={() => { void remove(selectedTask) }}\n />{error && <WorkspaceNotice>{error}</WorkspaceNotice>}</WorkspaceDialog>}\n {!detailOnly && (loading ? <CollectionSkeleton rows={6} /> : <>\n <div className=\"dsh-partner-board-tools\">\n <label className=\"dsh-partner-board-search\"><span className=\"sr-only\">\u641C\u7D22\u4EFB\u52A1</span><span aria-hidden=\"true\"><IconSearchOutline16 size={16} /></span><input value={query} onChange={event => setQuery(event.target.value)} placeholder=\"\u641C\u7D22\u4EFB\u52A1\u3001\u8D1F\u8D23\u4EBA\u6216\u524D\u7F6E\u4EFB\u52A1\" />{query && <button type=\"button\" onClick={() => setQuery('')} aria-label=\"\u6E05\u9664\u4EFB\u52A1\u641C\u7D22\"><IconCloseOutline16 size={14} /></button>}</label>\n <label className=\"dsh-partner-board-assignee\"><span className=\"sr-only\">\u6309\u8D1F\u8D23\u4EBA\u7B5B\u9009</span><select value={assigneeFilter} onChange={event => setAssigneeFilter(event.target.value)}><option value=\"all\">\u5168\u90E8\u4F19\u4F34</option><option value=\"unassigned\">\u672A\u6307\u6D3E</option>{directory.map(item => <option value={item.id} key={item.id}>@{item.name}</option>)}</select></label>\n <label className=\"dsh-partner-board-assignee is-mobile-stage\"><span className=\"sr-only\">\u6309\u4EFB\u52A1\u9636\u6BB5\u7B5B\u9009</span><select value={statusFilter} onChange={event => setStatusFilter(event.target.value as BoardStatusFilter)}><option value=\"all\">\u5168\u90E8\u9636\u6BB5 \u00B7 {scopedTasks.length}</option>{COLUMNS.map(column => <option value={column.id} key={column.id}>{column.label} \u00B7 {statusCounts.get(column.id) ?? 0}</option>)}</select></label>\n <small aria-live=\"polite\">\u663E\u793A {visibleTaskCount} / {board.tasks.length}</small>\n </div>\n <nav className=\"dsh-partner-board-statuses\" aria-label=\"\u6309\u4EFB\u52A1\u72B6\u6001\u7B5B\u9009\"><button type=\"button\" className={statusFilter === 'all' ? 'is-active' : ''} aria-pressed={statusFilter === 'all'} onClick={() => setStatusFilter('all')}><span>\u5168\u90E8</span><b>{scopedTasks.length}</b></button>{COLUMNS.map(column => <button type=\"button\" key={column.id} className={statusFilter === column.id ? 'is-active' : ''} aria-pressed={statusFilter === column.id} onClick={() => setStatusFilter(column.id)}><span>{column.label}</span><b>{statusCounts.get(column.id) ?? 0}</b></button>)}</nav>\n <div className=\"dsh-partner-board\" data-focused={statusFilter !== 'all'} aria-label=\"\u4EFB\u52A1\u770B\u677F\">{visibleColumns.map(column => {\n const tasks = tasksByStatus.get(column.id) ?? []\n return <TaskBoardStage key={column.id} id={column.id} label={column.label} tasks={tasks} focused={statusFilter !== 'all'} filtered={Boolean(query || assigneeFilter !== 'all')} renderTask={task => <TaskCard\n key={task.id} task={task} tasksById={tasksById} directoryById={directoryById} dependentCount={dependentsById.get(task.id) ?? 0}\n execution={activeDelegationByTaskId.get(task.id)}\n open={() => setSelectedTaskId(task.id)}\n />} />\n })}</div>{!scopedTasks.length && <div className=\"dsh-partner-collection-empty\"><strong>{query || assigneeFilter !== 'all' ? '\u6CA1\u6709\u5339\u914D\u7684\u4EFB\u52A1' : '\u8FD8\u6CA1\u6709\u5B50\u4EFB\u52A1'}</strong><p>{requirement?.status === 'planning' ? '\u6DFB\u52A0\u5B50\u4EFB\u52A1\u5E76\u5B89\u6392\u8D1F\u8D23\u4EBA\uFF0C\u5B8C\u6210\u5206\u5DE5\u540E\u5728\u9700\u6C42\u8BE6\u60C5\u4E2D\u63D0\u4EA4\u89C4\u5212\u3002' : '\u53EF\u8FD4\u56DE\u9700\u6C42\u770B\u677F\u67E5\u770B\u5176\u4ED6\u9700\u6C42\u3002'}</p></div>}</>)}\n </div>\n}\n\nfunction TaskCard({ task, tasksById, directoryById, dependentCount, execution, open }: {\n task: BoardTaskView; tasksById: ReadonlyMap<string, BoardTaskView>; directoryById: ReadonlyMap<string, PartnerDirectoryEntryView>; dependentCount: number; execution: PartnerDelegationView | undefined; open(): void\n}): JSX.Element {\n const dependencies = task.dependencyTaskIds.map(id => tasksById.get(id)).filter((item): item is BoardTaskView => item !== undefined)\n const blockers = dependencies.filter(item => item.status !== 'done')\n const completedDependencies = dependencies.length - blockers.length\n const assignee = directoryById.get(task.assigneeCompanionId ?? '')\n const executionState = task.scheduling ? { label: task.scheduling.message } : execution ? delegationState(execution, blockers.length) : task.autoRun && task.status === 'ready' ? { label: blockers.length ? '\u7B49\u5F85\u524D\u7F6E\u5B8C\u6210' : '\u7B49\u5F85\u8C03\u5EA6' } : undefined\n return <article className=\"dsh-partner-task-card\" data-blocked={blockers.length > 0} data-priority={task.priority}>\n <button type=\"button\" className=\"dsh-partner-task-summary\" aria-haspopup=\"dialog\" onClick={open}><span><span className=\"dsh-partner-task-card-title\"><strong title={task.title}>{task.title}</strong><em>{priorityLabel(task.priority)}</em></span><small className=\"dsh-partner-task-card-owner\">{assignee ? `@${assignee.name}` : '\u672A\u6307\u6D3E'}{task.resultSummary ? ' \u00B7 \u5DF2\u6709\u7ED3\u679C' : ''}{executionState ? ` \u00B7 ${executionState.label}` : ''}</small>{(dependencies.length > 0 || dependentCount > 0) && <span className=\"dsh-partner-task-relations\">{dependencies.length > 0 && <small data-blocked={blockers.length > 0}>\u524D\u7F6E {completedDependencies}/{dependencies.length}</small>}{dependentCount > 0 && <small>\u5B8C\u6210\u540E\u89E3\u9501 {dependentCount}</small>}</span>}</span><IconChevronRightOutline14 size={14} /></button>\n </article>\n}\n\nfunction TaskDetail({ task, tasks, activities, directory, execution, busy, update, delegate, review, accept, reject, remove }: {\n task: BoardTaskView; tasks: BoardTaskView[]; activities: TaskActivityView[]; directory: PartnerDirectoryEntryView[]; execution: PartnerDelegationView | undefined; busy: boolean\n update(change: Record<string, unknown>): void; delegate(): void; review(): void; accept(checks?: TaskReviewCheck[]): void; reject(reason: string, checks?: TaskReviewCheck[]): void; remove(): void\n}): JSX.Element {\n const [rejecting, setRejecting] = useState(false)\n const [checks, setChecks] = useState<TaskReviewCheck[]>([])\n useEffect(() => { setChecks([]) }, [task.id, task.revision])\n const [rejectReason, setRejectReason] = useState('')\n useEffect(() => { if (task.status !== 'review') { setRejecting(false); setRejectReason('') } }, [task.status])\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const byId = useMemo(() => new Map(tasks.map(item => [item.id, item])), [tasks])\n const dependencies = task.dependencyTaskIds.map(id => byId.get(id)).filter((item): item is BoardTaskView => item !== undefined)\n const blockers = dependencies.filter(item => item.status !== 'done')\n const assignee = directory.find(item => item.id === task.assigneeCompanionId)\n const reviewer = directory.find(item => item.id === task.reviewerCompanionId)\n const dependencyCandidates = tasks.filter(item => item.id !== task.id && !task.dependencyTaskIds.includes(item.id) && !dependsOn(item.id, task.id, byId))\n const canExecute = Boolean(task.assigneeCompanionId) && !execution && !['doing', 'review', 'done'].includes(task.status)\n const recentActivities = [...activities].sort((left, right) => right.at - left.at).slice(0, 6)\n const executionState = execution ? delegationState(execution, blockers.length) : undefined\n return <div className=\"dsh-partner-task-detail\">\n <section className=\"dsh-partner-task-description\"><strong>\u4EFB\u52A1\u8BF4\u660E</strong><p>{task.description || '\u6CA1\u6709\u8865\u5145\u8BF4\u660E'}</p></section>\n {task.scheduling && task.status !== 'done' && <section className=\"dsh-partner-task-description\"><strong>{task.scheduling.message}</strong>{task.scheduling.taskIds?.length ? <p>{task.scheduling.taskIds.map(id => byId.get(id)?.title ?? '\u5DF2\u5220\u9664\u4EFB\u52A1').join('\u3001')}</p> : null}{task.scheduling.retryAt ? <small>\u4E0B\u6B21\u91CD\u8BD5\uFF1A{new Date(task.scheduling.retryAt).toLocaleString()}</small> : null}</section>}\n <TaskContractPanel task={task} checks={checks} setChecks={setChecks} busy={busy} />\n <div className=\"dsh-partner-task-fields\"><label><span>\u72B6\u6001</span><select value={task.status} disabled={busy} onChange={event => update({ status: event.target.value, ...(event.target.value === 'done' ? { checks } : {}) })}>{COLUMNS.map(item => <option key={item.id} value={item.id} disabled={(item.id === 'doing' || item.id === 'review' || item.id === 'done') && blockers.length > 0 || item.id === 'done' && task.status !== 'review' && task.status !== 'done'}>{item.label}</option>)}</select></label><label><span>\u8D1F\u8D23\u4EBA</span><select value={task.assigneeCompanionId ?? ''} disabled={busy || task.status === 'doing'} onChange={event => update({ assigneeCompanionId: event.target.value })}><option value=\"\">\u672A\u6307\u6D3E</option>{directory.map(item => <option key={item.id} value={item.id}>@{item.name} \u00B7 {item.availability === 'busy' ? '\u5FD9\u788C' : '\u53EF\u7528'}</option>)}</select></label><label><span>\u9A8C\u6536\u4F19\u4F34</span><select value={task.reviewerCompanionId ?? ''} disabled={busy} onChange={event => update({ reviewerCompanionId: event.target.value })}><option value=\"\">\u7559\u7A7A \u00B7 \u4EBA\u5DE5\u9A8C\u6536</option>{directory.map(item => <option key={item.id} value={item.id}>@{item.name}</option>)}</select></label></div>\n {executionState && <section className=\"dsh-partner-task-execution\" data-state={execution?.status}><i /><span><strong>{executionState.title}</strong><small>{executionState.detail}</small></span></section>}\n <section className=\"dsh-partner-task-dependency\"><header><strong>\u524D\u7F6E\u4EFB\u52A1</strong><small>{blockers.length ? `${blockers.length} \u9879\u672A\u5B8C\u6210\uFF0C\u5F53\u524D\u4EFB\u52A1\u4E0D\u80FD\u542F\u52A8` : dependencies.length ? '\u5DF2\u5168\u90E8\u5B8C\u6210\uFF0C\u53EF\u4EE5\u542F\u52A8' : '\u6CA1\u6709\u524D\u7F6E\u4F9D\u8D56'}</small></header>{dependencies.length > 0 && <div>{dependencies.map(item => <span key={item.id} data-done={item.status === 'done'}><i>{item.status === 'done' ? <IconCheckOutline16 size={12} /> : ''}</i><b>{item.title}</b><button type=\"button\" disabled={busy || ['doing', 'review', 'done'].includes(task.status)} aria-label={`\u79FB\u9664\u524D\u7F6E\u4EFB\u52A1 ${item.title}`} onClick={() => update({ dependencyTaskIds: task.dependencyTaskIds.filter(id => id !== item.id) })}>\u79FB\u9664</button></span>)}</div>}{dependencyCandidates.length > 0 && <label><span className=\"sr-only\">\u589E\u52A0\u524D\u7F6E\u4EFB\u52A1</span><select defaultValue=\"\" disabled={busy || ['doing', 'review', 'done'].includes(task.status)} onChange={event => { const id = event.currentTarget.value; if (id) update({ dependencyTaskIds: [...task.dependencyTaskIds, id] }); event.currentTarget.value = '' }}><option value=\"\">\u589E\u52A0\u524D\u7F6E\u4EFB\u52A1\u2026</option>{dependencyCandidates.map(item => <option value={item.id} key={item.id}>{item.title} \u00B7 {statusLabel(item.status)}</option>)}</select></label>}</section>\n {task.resultSummary && <ResultBlock label=\"\u6267\u884C\u7ED3\u679C\" value={task.resultSummary} />}\n {task.reviewSummary && <ResultBlock label={`\u6838\u9A8C\u610F\u89C1${reviewer ? ` \u00B7 @${reviewer.name}` : ''}`} value={task.reviewSummary} />}\n {recentActivities.length > 0 && <details className=\"dsh-partner-task-activity dsh-partner-requirement-disclosure\"><summary>\u6700\u8FD1\u6D3B\u52A8 \u00B7 {recentActivities.length}</summary><ol>{recentActivities.map(item => <li key={item.id}><span>{item.message}</span><time>{new Date(item.at).toLocaleString()}</time></li>)}</ol></details>}\n {rejecting && <form className=\"dsh-partner-task-reject\" onSubmit={event => { event.preventDefault(); const reason = rejectReason.trim(); if (!reason) return; reject(reason, checks) }}><label><span>\u6253\u56DE\u539F\u56E0</span><textarea autoFocus value={rejectReason} onChange={event => setRejectReason(event.target.value)} rows={3} maxLength={1200} placeholder=\"\u8BF4\u660E\u9700\u8981\u91CD\u505A\u6216\u8865\u5145\u7684\u5185\u5BB9\" /></label><div><button type=\"button\" onClick={() => { setRejecting(false); setRejectReason('') }}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy || !rejectReason.trim()}>\u786E\u8BA4\u6253\u56DE</button></div></form>}\n {confirmingDelete && <div className=\"dsh-partner-task-delete-confirm\" role=\"alert\"><span>\u5220\u9664\u4F1A\u53D6\u6D88\u5173\u8054\u6267\u884C\uFF0C\u4F9D\u8D56\u5B83\u7684\u672A\u5B8C\u6210\u4EFB\u52A1\u5C06\u6682\u505C\u3002\u9700\u6C42\u9700\u91CD\u65B0\u786E\u8BA4\u8303\u56F4\uFF1B\u4E0D\u80FD\u64A4\u9500\u3002</span><div><button type=\"button\" onClick={() => setConfirmingDelete(false)}>\u4FDD\u7559\u4EFB\u52A1</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={remove}>\u786E\u8BA4\u5220\u9664</button></div></div>}\n <footer className=\"dsh-partner-task-actions\"><small>r{task.revision} \u00B7 {new Date(task.updatedAt).toLocaleString()}</small><span>{task.status === 'review' ? <>{task.reviewerCompanionId && <button type=\"button\" disabled={busy} onClick={review}>{busy ? '\u6838\u9A8C\u4E2D\u2026' : `\u4EA4\u7ED9 @${reviewer?.name ?? '\u4F19\u4F34'} \u6838\u9A8C`}</button>}<button type=\"button\" disabled={busy} onClick={() => setRejecting(true)}>\u6253\u56DE\u91CD\u505A</button><button type=\"button\" className=\"is-primary\" disabled={busy || Boolean(task.acceptanceCriteria?.length && (checks.length !== task.acceptanceCriteria.length || checks.some(c => c.verdict !== 'passed' || !c.evidence?.trim())))} onClick={() => accept(checks)}>\u9A8C\u6536\u901A\u8FC7</button></> : <button type=\"button\" disabled={busy || !canExecute} title={blockers.length ? '\u53EF\u63D0\u524D\u6392\u961F\uFF0C\u4F9D\u8D56\u901A\u8FC7\u9A8C\u6536\u540E\u81EA\u52A8\u6267\u884C' : !task.assigneeCompanionId ? '\u8BF7\u5148\u9009\u62E9\u8D1F\u8D23\u4EBA' : undefined} onClick={delegate}>{busy ? '\u6267\u884C\u4E2D\u2026' : execution?.status === 'queued' ? '\u5DF2\u63D0\u4EA4\uFF0C\u7B49\u5F85\u6267\u884C' : task.status === 'doing' ? '\u6B63\u5728\u6267\u884C' : task.status === 'done' ? '\u5DF2\u7ECF\u5B8C\u6210' : `\u4EA4\u7ED9 @${assignee?.name ?? '\u4F19\u4F34'}`}</button>}<button type=\"button\" className=\"is-icon\" aria-label={`\u5220\u9664 ${task.title}`} aria-expanded={confirmingDelete} disabled={busy} onClick={() => setConfirmingDelete(true)}><IconTrashOutline16 size={14} /></button></span></footer>\n </div>\n}\n\nfunction ResultBlock({ label, value }: { label: string; value: string }): JSX.Element {\n return <section className=\"dsh-partner-task-result\"><strong>{label}</strong><p>{value}</p></section>\n}\n\nfunction TaskForm({ requirementId, companions, tasks, close, changed }: { requirementId: string; companions: PartnerDirectoryEntryView[]; tasks: BoardTaskView[]; close(): void; changed(): Promise<void> }): JSX.Element {\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const dependencyOptions = tasks.filter(item => item.status !== 'done')\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n setBusy(true); setError(undefined)\n try {\n await api('/tasks', { method: 'POST', body: JSON.stringify({\n requirementId,\n title: data.get('title'), description: data.get('description'), priority: data.get('priority'),\n autoRun: data.get('submission') === 'run' && Boolean(data.get('assignee')),\n assigneeCompanionId: data.get('assignee') || undefined, reviewerCompanionId: data.get('reviewer') || undefined,\n dependencyTaskIds: data.getAll('dependencyTaskId'),\n acceptanceCriteria: String(data.get('acceptanceCriteria') ?? '').split('\\n').map(s => s.trim()).filter(Boolean),\n resourceKeys: String(data.get('resourceKeys') ?? '').split('\\n').map(s => s.trim()).filter(Boolean),\n }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-task-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>\u4EFB\u52A1\u540D\u79F0</span><input name=\"title\" maxLength={200} required autoFocus placeholder=\"\u4E00\u53E5\u8BDD\u8BF4\u660E\u4EA4\u4ED8\u76EE\u6807\" /></label><label><span>\u8D1F\u8D23\u4EBA</span><select name=\"assignee\" defaultValue=\"\"><option value=\"\">\u672A\u6307\u6D3E</option>{companions.map(item => <option key={item.id} value={item.id}>@{item.name}</option>)}</select></label><label className=\"is-wide\"><span>\u4EFB\u52A1\u8BF4\u660E</span><textarea name=\"description\" maxLength={8000} rows={5} placeholder=\"\u8865\u5145\u80CC\u666F\u3001\u4EA4\u4ED8\u7269\u548C\u5B8C\u6210\u6761\u4EF6\" /></label><label className=\"is-wide\"><span>\u9A8C\u6536\u6E05\u5355 \u00B7 \u53EF\u9009</span><textarea name=\"acceptanceCriteria\" rows={3} maxLength={10000} placeholder=\"\u6BCF\u884C\u4E00\u9879\u53EF\u6838\u9A8C\u4EA4\u4ED8\uFF0C\u6700\u591A 20 \u9879\" /></label><label className=\"is-wide\"><span>\u72EC\u5360\u8D44\u6E90 \u00B7 \u53EF\u9009</span><textarea name=\"resourceKeys\" rows={2} maxLength={2400} placeholder=\"\u6BCF\u884C\u4E00\u4E2A\u4E00\u81F4\u7684\u8D44\u6E90\u6807\u8BC6\uFF0C\u4F8B\u5982 repo:team/api\uFF1B\u76F8\u540C\u8D44\u6E90\u4E0D\u4F1A\u540C\u65F6\u6267\u884C\" /></label><label><span>\u4F18\u5148\u7EA7</span><select name=\"priority\" defaultValue=\"normal\"><option value=\"low\">\u4F4E</option><option value=\"normal\">\u666E\u901A</option><option value=\"high\">\u9AD8</option><option value=\"urgent\">\u7D27\u6025</option></select></label><label><span>\u9A8C\u6536\u4F19\u4F34</span><select name=\"reviewer\" defaultValue=\"\"><option value=\"\">\u7559\u7A7A \u00B7 \u4EBA\u5DE5\u9A8C\u6536</option>{companions.map(item => <option key={item.id} value={item.id}>@{item.name}</option>)}</select></label><div className=\"dsh-partner-task-form-dependencies is-wide\"><span>\u4F9D\u8D56\u4EFB\u52A1 <small>\u53EF\u9009</small></span>{dependencyOptions.length > 0 ? <div>{dependencyOptions.map(item => <label key={item.id}><input type=\"checkbox\" name=\"dependencyTaskId\" value={item.id} /><i /><span>{item.title}</span><small>{statusLabel(item.status)}</small></label>)}</div> : <p>\u5F53\u524D\u6CA1\u6709\u53EF\u9009\u7684\u672A\u5B8C\u6210\u4EFB\u52A1</p>}<small>\u53EF\u4EE5\u9009\u62E9\u591A\u4E2A\uFF1B\u7559\u7A7A\u8868\u793A\u8BE5\u4EFB\u52A1\u4E0D\u4F9D\u8D56\u5176\u4ED6\u4EFB\u52A1\u3002</small></div><label className=\"is-wide\"><span>\u521B\u5EFA\u540E\u6267\u884C</span><select name=\"submission\" defaultValue=\"run\"><option value=\"run\">\u5DF2\u6307\u5B9A\u8D1F\u8D23\u4EBA\u5219\u81EA\u52A8\u6392\u961F\uFF0C\u7B49\u5F85\u4F9D\u8D56\u5B8C\u6210\u540E\u6267\u884C</option><option value=\"plan\">\u4EC5\u89C4\u5212\uFF0C\u7A0D\u540E\u624B\u52A8\u63D0\u4EA4</option></select></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA\u4EFB\u52A1'}</button></footer></form>\n}\n\nfunction dependsOn(candidateId: string, targetId: string, tasks: Map<string, BoardTaskView>, visited = new Set<string>()): boolean {\n if (candidateId === targetId) return true\n if (visited.has(candidateId)) return false\n visited.add(candidateId)\n return (tasks.get(candidateId)?.dependencyTaskIds ?? []).some(id => dependsOn(id, targetId, tasks, visited))\n}\nfunction statusLabel(value: BoardTaskStatusView): string { return COLUMNS.find(item => item.id === value)?.label ?? value }\nfunction taskDialogSummary(task: BoardTaskView, directory: PartnerDirectoryEntryView[]): string {\n const assignee = directory.find(item => item.id === task.assigneeCompanionId)\n return `${statusLabel(task.status)} \u00B7 ${assignee ? `\u8D1F\u8D23\u4EBA @${assignee.name}` : '\u5C1A\u672A\u6307\u6D3E\u8D1F\u8D23\u4EBA'} \u00B7 ${priorityLabel(task.priority)}`\n}\nfunction priorityLabel(value: BoardTaskView['priority']): string { return ({ low: '\u4F4E\u4F18\u5148\u7EA7', normal: '\u666E\u901A\u4F18\u5148\u7EA7', high: '\u9AD8\u4F18\u5148\u7EA7', urgent: '\u7D27\u6025' })[value] }\nfunction delegationState(value: PartnerDelegationView, blockers = 0): { label: string; title: string; detail: string } {\n const review = value.kind === 'review'\n if (value.status === 'queued') {\n if ((value.attempts ?? 0) === 0) return blockers\n ? { label: '\u7B49\u5F85\u524D\u7F6E\u5B8C\u6210', title: '\u4EFB\u52A1\u5DF2\u63D0\u4EA4\uFF0C\u7B49\u5F85\u4F9D\u8D56', detail: `\u8FD8\u6709 ${blockers} \u4E2A\u524D\u7F6E\u4EFB\u52A1\u672A\u901A\u8FC7\u9A8C\u6536\uFF1B\u5168\u90E8\u5B8C\u6210\u540E\u81EA\u52A8\u6267\u884C\uFF0C\u65E0\u9700\u518D\u6B21\u6307\u6D3E\u3002` }\n : { label: '\u6392\u961F\u4E2D', title: '\u4EFB\u52A1\u5DF2\u63D0\u4EA4', detail: '\u6B63\u5728\u7B49\u5F85\u53EF\u7528\u6267\u884C\u540D\u989D\uFF0C\u65E0\u9700\u518D\u6B21\u6307\u6D3E\u3002' }\n const at = value.nextAttemptAt ? new Date(value.nextAttemptAt).toLocaleString() : '\u7A0D\u540E'\n return { label: '\u7B49\u5F85\u81EA\u52A8\u6062\u590D', title: review ? '\u9A8C\u6536\u5C06\u5728\u8FDE\u63A5\u6062\u590D\u540E\u7EE7\u7EED' : '\u4EFB\u52A1\u5C06\u5728\u8FDE\u63A5\u6062\u590D\u540E\u7EE7\u7EED', detail: `${at} \u81EA\u52A8\u91CD\u8BD5${value.error ? ` \u00B7 ${value.error}` : ''}` }\n }\n const recovered = (value.attempts ?? 1) > 1\n return {\n label: recovered ? `\u7B2C ${value.attempts} \u6B21\u6062\u590D\u4E2D` : review ? '\u4F19\u4F34\u9A8C\u6536\u4E2D' : '\u4F19\u4F34\u6267\u884C\u4E2D',\n title: recovered ? (review ? '\u6B63\u5728\u6062\u590D\u4F19\u4F34\u9A8C\u6536' : '\u6B63\u5728\u6062\u590D\u4F19\u4F34\u4EFB\u52A1') : review ? '\u4F19\u4F34\u6B63\u5728\u6838\u9A8C\u7ED3\u679C' : '\u4F19\u4F34\u6B63\u5728\u6267\u884C\u4EFB\u52A1',\n detail: recovered ? '\u4F1A\u5148\u68C0\u67E5\u5DF2\u6709\u4EA7\u51FA\uFF0C\u907F\u514D\u91CD\u590D\u5199\u5165\u6216\u91CD\u590D\u53D1\u5E03\u3002' : '\u6267\u884C\u72B6\u6001\u4F1A\u81EA\u52A8\u540C\u6B65\uFF0C\u65E0\u9700\u624B\u52A8\u5237\u65B0\u3002',\n }\n}\n", "import { useState, type ReactNode } from 'react'\nimport { IconChevronRightOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { BoardTaskStatusView, BoardTaskView } from '../client-api.js'\n\n/** Bounded progressive disclosure; a single page scroll, no tiny inner scroll box. */\nexport function TaskBoardStage({ id, label, tasks, focused, filtered, renderTask }: {\n id: BoardTaskStatusView; label: string; tasks: BoardTaskView[]; focused: boolean; filtered: boolean\n renderTask(task: BoardTaskView): ReactNode\n}): JSX.Element {\n const [collapsed, setCollapsed] = useState(false)\n const [limit, setLimit] = useState(6)\n const count = Math.max(limit, focused ? 12 : 6)\n const titleId = `dsh-partner-board-${id}`, listId = `${titleId}-list`\n const expanded = !collapsed\n return <section data-status={id} data-empty={tasks.length === 0} aria-labelledby={titleId}>\n <header><button type=\"button\" className=\"dsh-partner-board-stage-toggle\" aria-expanded={expanded} aria-controls={listId} onClick={() => setCollapsed(value => !value)}>\n <IconChevronRightOutline14 size={14} /><strong id={titleId}>{label}</strong><b>{tasks.length}</b>\n </button></header>\n <div id={listId} hidden={!expanded}>\n {tasks.length > 0 ? <>\n <div className=\"dsh-partner-board-column-list\">{tasks.slice(0, count).map(renderTask)}</div>\n {tasks.length > count && <button type=\"button\" className=\"dsh-partner-board-more\" onClick={() => setLimit(count + 12)}>\u5C55\u5F00\u66F4\u591A \u00B7 \u8FD8\u6709 {tasks.length - count} \u9879</button>}\n </> : <p className=\"dsh-partner-board-empty\">{filtered ? '\u6CA1\u6709\u5339\u914D\u4EFB\u52A1' : '\u6682\u65E0\u4EFB\u52A1'}</p>}\n </div>\n </section>\n}\n", "import type { BoardTaskView } from '../client-api.js'\nimport type { TaskReviewCheck } from '../tasks/contract.js'\n\n/** Compact read view; only an explicit review exposes per-item controls. */\nexport function TaskContractPanel({ task, checks, setChecks, busy }: { task: BoardTaskView; checks: TaskReviewCheck[]; setChecks(value: TaskReviewCheck[]): void; busy: boolean }): JSX.Element | null {\n if (!task.acceptanceCriteria?.length && !task.resourceKeys?.length) return null\n const editing = task.status === 'review'\n const change = (criterion: number, patch: Partial<TaskReviewCheck>): void => setChecks((task.acceptanceCriteria ?? []).map((_, i) => ({ criterion: i + 1, verdict: 'unverified' as const, ...checks.find(c => c.criterion === i + 1), ...(criterion === i + 1 ? patch : {}) })))\n return <section className=\"dsh-partner-task-contract\">{Boolean(task.acceptanceCriteria?.length) && <header><strong>\u9A8C\u6536\u6E05\u5355 \u00B7 {task.acceptanceCriteria?.length}</strong><small>\u4F19\u4F34 / \u4EBA\u5DE5\u6838\u9A8C\uFF0C\u4E0D\u7B49\u4E8E\u7A0B\u5E8F\u9A8C\u8BC1</small></header>}\n <ol>{task.acceptanceCriteria?.map((text, i) => {\n const criterion = i + 1, check = checks.find(c => c.criterion === criterion)\n const saved = task.reviewChecks?.find(c => c.criterion === criterion)\n const previous = task.previousAttempt?.reviewChecks?.find(c => c.criterion === criterion)\n const evidence = (task.evidence ?? []).filter(e => e.criterion === criterion)\n return <li key={criterion}><p>{text}</p>\n {evidence.length > 0 && <details className=\"dsh-partner-requirement-disclosure\"><summary>\u6267\u884C\u8BC1\u636E \u00B7 {evidence.length} \u00B7 \u5C1A\u9700\u6838\u9A8C</summary>{evidence.map((e, j) => <div key={j}><code>{e.reference}</code>{e.note && <small>{e.note}</small>}</div>)}</details>}\n {previous?.reason && <small>\u4E0A\u6B21\u6838\u9A8C\uFF1A{previous.reason}</small>}\n {editing ? <div className=\"dsh-partner-task-fields\">\n <label><span>\u7B2C {criterion} \u9879\u7ED3\u8BBA</span><select disabled={busy} value={check?.verdict ?? 'unverified'} onChange={e => change(criterion, { verdict: e.target.value as TaskReviewCheck['verdict'] })}><option value=\"unverified\">\u672A\u9A8C\u8BC1</option><option value=\"passed\">\u5DF2\u6838\u9A8C\u901A\u8FC7</option><option value=\"failed\">\u672A\u901A\u8FC7</option></select></label>\n <label><span>{check?.verdict === 'passed' ? '\u5B9E\u9645\u6838\u9A8C\u8BC1\u636E' : '\u7F3A\u9879 / \u65E0\u6CD5\u6838\u9A8C\u7684\u539F\u56E0'}</span><textarea rows={2} maxLength={1000} disabled={busy} value={(check?.verdict === 'passed' ? check.evidence : check?.reason) ?? ''} onChange={e => change(criterion, check?.verdict === 'passed' ? { evidence: e.target.value } : { reason: e.target.value })} /></label>\n </div> : saved && <small>{saved.verdict === 'passed' ? '\u6838\u9A8C\u901A\u8FC7' : saved.verdict === 'failed' ? '\u672A\u901A\u8FC7' : '\u672A\u9A8C\u8BC1'} \u00B7 {saved.evidence ?? saved.reason}</small>}\n </li>\n })}</ol>\n {task.resourceKeys?.length ? <details className=\"dsh-partner-requirement-disclosure\"><summary>\u72EC\u5360\u8D44\u6E90\u58F0\u660E \u00B7 {task.resourceKeys.length}</summary>{task.resourceKeys.map(key => <code key={key}>{key}</code>)}<small>\u4EC5\u7EA6\u675F\u770B\u677F\u5185\u76F8\u540C\u58F0\u660E\uFF0C\u4E0D\u662F\u64CD\u4F5C\u7CFB\u7EDF\u9501\u3002</small></details> : null}\n </section>\n}\n", "import { useCallback, useEffect, useState, type FormEvent } from 'react'\nimport { IconPlayOutline16, IconPlusOutline16, IconRefreshOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type CompanionView, type ExecutionRunView, type ScheduledTaskView } from '../client-api.js'\nimport { CollectionEmpty, CollectionSkeleton, WorkspaceBlock, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nexport function SchedulePanel({ companions }: { companions: CompanionView[] }): JSX.Element {\n const [schedules, setSchedules] = useState<ScheduledTaskView[]>([])\n const [runs, setRuns] = useState<ExecutionRunView[]>([])\n const [creating, setCreating] = useState(false)\n const [busy, setBusy] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n const load = useCallback(async () => {\n try { const value = await api<{ schedules: ScheduledTaskView[]; runs: ExecutionRunView[] }>('/schedules'); setSchedules(value.schedules); setRuns(value.runs.filter(item => item.kind === 'schedule').slice(-50).reverse()); setError(undefined) }\n catch (reason) { setError(errorMessage(reason)) } finally { setLoading(false) }\n }, [])\n useEffect(() => { void load() }, [load])\n const update = async (entry: ScheduledTaskView, value: Record<string, unknown>): Promise<void> => { setBusy(entry.id); try { await api(`/schedules/${entry.id}`, { method: 'PUT', body: JSON.stringify(value) }); await load() } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) } }\n const run = async (entry: ScheduledTaskView): Promise<void> => { setBusy(entry.id); try { await api(`/schedules/${entry.id}/trigger`, { method: 'POST' }); await load() } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) } }\n const remove = async (entry: ScheduledTaskView): Promise<void> => { setBusy(entry.id); try { await api(`/schedules/${entry.id}`, { method: 'DELETE' }); await load() } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) } }\n return <div className=\"dsh-partner-feature-page\">\n <WorkspaceHero eyebrow=\"Ephemeral automation\" title=\"\u4F19\u4F34\u5B9A\u65F6\u4EFB\u52A1\" detail=\"\u7531\u6307\u5B9A\u4F19\u4F34\u5728\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD\u4E2D\u6267\u884C\uFF1B\u9ED8\u8BA4\u5B8C\u6210\u5373\u9500\u6BC1\uFF0C\u907F\u514D\u957F\u671F\u4F1A\u8BDD\u88AB\u540E\u53F0\u4EFB\u52A1\u6C61\u67D3\u3002\" actions={<><button type=\"button\" disabled={loading} onClick={() => { void load() }}><IconRefreshOutline16 size={15} />\u5237\u65B0</button><button type=\"button\" disabled={companions.length === 0} onClick={() => setCreating(true)}><IconPlusOutline16 size={15} />\u65B0\u8BA1\u5212</button></>} />\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {creating && <WorkspaceDialog title=\"\u65B0\u5EFA\u5B9A\u65F6\u4EFB\u52A1\" detail=\"\u9009\u62E9\u6267\u884C\u4F19\u4F34\u3001\u8FD0\u884C\u9891\u7387\u548C\u4F1A\u8BDD\u4FDD\u7559\u7B56\u7565\u3002\u8BA1\u5212\u521B\u5EFA\u540E\u53EF\u4EE5\u968F\u65F6\u505C\u7528\u6216\u7ACB\u5373\u6267\u884C\u3002\" close={() => setCreating(false)} width=\"wide\"><ScheduleForm companions={companions} close={() => setCreating(false)} changed={load} /></WorkspaceDialog>}\n <WorkspaceBlock title=\"\u6267\u884C\u8BA1\u5212\" detail={`${schedules.filter(item => item.enabled).length} \u4E2A\u542F\u7528`}>\n {loading ? <CollectionSkeleton rows={3} /> : schedules.length === 0 ? <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u5B9A\u65F6\u4EFB\u52A1\" detail=\"\u521B\u5EFA\u8BA1\u5212\u540E\uFF0C\u4F19\u4F34\u4F1A\u6309\u8BBE\u5B9A\u5728\u72EC\u7ACB\u4F1A\u8BDD\u4E2D\u6267\u884C\u3002\" action={<button type=\"button\" disabled={companions.length === 0} onClick={() => setCreating(true)}><IconPlusOutline16 size={14} />\u521B\u5EFA\u7B2C\u4E00\u4E2A\u8BA1\u5212</button>} /> : <div className=\"dsh-partner-schedule-list\">{schedules.map(entry => <article key={entry.id}><span><strong>{entry.title}</strong><p>{entry.prompt}</p><span className=\"dsh-partner-schedule-meta\"><em>@{companionName(companions, entry.companionId)}</em><em>{scheduleLabel(entry)}</em><em>\u4E0B\u6B21 {new Date(entry.nextRunAt).toLocaleString()}</em><em>{entry.destroySessionAfterRun ? '\u6267\u884C\u540E\u9500\u6BC1' : '\u4FDD\u7559\u4F1A\u8BDD'}</em></span></span><button type=\"button\" className=\"dsh-partner-feature-switch\" data-on={entry.enabled} aria-pressed={entry.enabled} disabled={busy === entry.id} onClick={() => { void update(entry, { enabled: !entry.enabled }) }}><i /></button><button type=\"button\" disabled={busy === entry.id} onClick={() => { void run(entry) }}><IconPlayOutline16 size={14} />{busy === entry.id ? '\u6267\u884C\u4E2D\u2026' : '\u7ACB\u5373\u6267\u884C'}</button><button type=\"button\" className=\"is-icon\" disabled={busy === entry.id} onClick={() => { void remove(entry) }} aria-label={`\u5220\u9664 ${entry.title}`}><IconTrashOutline16 size={14} /></button></article>)}</div>}\n </WorkspaceBlock>\n <WorkspaceBlock title=\"\u6700\u8FD1\u8FD0\u884C\" detail=\"\u4FDD\u7559\u6700\u8FD1\u7684\u72B6\u6001\u4E0E\u7ED3\u679C\u6458\u8981\"><div className=\"dsh-partner-run-list\">{runs.map(run => <article key={run.id} data-status={run.status}><i /><span><strong>{schedules.find(item => item.id === run.sourceId)?.title ?? '\u5DF2\u5220\u9664\u8BA1\u5212'} \u00B7 @{companionName(companions, run.ownerCompanionId)}</strong><p>{run.error || run.outputSummary || '\u7B49\u5F85\u7ED3\u679C'}</p><small>{new Date(run.startedAt).toLocaleString()} \u00B7 {run.status} \u00B7 {run.destroyAfterRun ? '\u4F1A\u8BDD\u5DF2\u9500\u6BC1' : '\u4F1A\u8BDD\u4FDD\u7559'}</small></span></article>)}</div>{!loading && runs.length === 0 && <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u6267\u884C\u8BB0\u5F55\" detail=\"\u8BA1\u5212\u7B2C\u4E00\u6B21\u6267\u884C\u540E\uFF0C\u7ED3\u679C\u548C\u8017\u65F6\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\" />}</WorkspaceBlock>\n </div>\n}\n\nfunction ScheduleForm({ companions, close, changed }: { companions: CompanionView[]; close(): void; changed(): Promise<void> }): JSX.Element {\n const [kind, setKind] = useState<'interval' | 'daily'>('interval')\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n const schedule = kind === 'interval' ? { kind, minutes: Number(data.get('minutes')) } : { kind, hour: Number(data.get('hour')), minute: Number(data.get('minute')) }\n setBusy(true); setError(undefined)\n try {\n await api('/schedules', { method: 'POST', body: JSON.stringify({ companionId: data.get('companionId'), title: data.get('title'), prompt: data.get('prompt'), schedule, enabled: true, destroySessionAfterRun: data.get('retain') !== 'on', overlapPolicy: data.get('overlapPolicy'), timeoutMinutes: Number(data.get('timeoutMinutes')) }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-schedule-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>\u8BA1\u5212\u540D\u79F0</span><input name=\"title\" required maxLength={160} autoFocus placeholder=\"\u4F8B\u5982\uFF1A\u6BCF\u65E5\u6574\u7406\u9879\u76EE\u53D8\u5316\" /></label><label><span>\u6267\u884C\u4F19\u4F34</span><select name=\"companionId\" required defaultValue={companions[0]?.id ?? ''}><option value=\"\" disabled>\u9009\u62E9\u4F19\u4F34</option>{companions.map(companion => <option key={companion.id} value={companion.id}>@{companion.name} \u00B7 {companion.role}</option>)}</select></label><label className=\"is-wide\"><span>\u6267\u884C\u5185\u5BB9</span><textarea name=\"prompt\" required maxLength={12000} rows={5} placeholder=\"\u660E\u786E\u8BF4\u660E\u8981\u68C0\u67E5\u3001\u6574\u7406\u6216\u5B8C\u6210\u4EC0\u4E48\uFF0C\u4EE5\u53CA\u5E0C\u671B\u8FD4\u56DE\u4EC0\u4E48\u7ED3\u679C\" /></label><label><span>\u9891\u7387</span><select value={kind} onChange={event => setKind(event.target.value as 'interval' | 'daily')}><option value=\"interval\">\u6BCF\u9694\u4E00\u6BB5\u65F6\u95F4</option><option value=\"daily\">\u6BCF\u5929\u56FA\u5B9A\u65F6\u95F4</option></select></label>{kind === 'interval' ? <label><span>\u95F4\u9694\u5206\u949F</span><input name=\"minutes\" type=\"number\" min={5} max={43200} defaultValue={60} /></label> : <div className=\"dsh-partner-schedule-time\"><label><span>\u5C0F\u65F6</span><input name=\"hour\" type=\"number\" min={0} max={23} defaultValue={9} /></label><label><span>\u5206\u949F</span><input name=\"minute\" type=\"number\" min={0} max={59} defaultValue={0} /></label></div>}<label><span>\u91CD\u53E0\u7B56\u7565</span><select name=\"overlapPolicy\" defaultValue=\"skip\"><option value=\"skip\">\u8DF3\u8FC7\u91CD\u53E0</option><option value=\"queue\">\u6392\u961F\u6267\u884C</option></select></label><label><span>\u8D85\u65F6\u5206\u949F</span><input name=\"timeoutMinutes\" type=\"number\" min={1} max={120} defaultValue={10} /></label><label className=\"dsh-partner-check is-wide\"><input name=\"retain\" type=\"checkbox\" /><i /><span>\u6267\u884C\u540E\u4FDD\u7559\u4E34\u65F6\u4F1A\u8BDD</span></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA\u8BA1\u5212'}</button></footer></form>\n}\nfunction scheduleLabel(entry: ScheduledTaskView): string { return entry.schedule.kind === 'interval' ? `\u6BCF ${entry.schedule.minutes} \u5206\u949F` : `\u6BCF\u5929 ${String(entry.schedule.hour).padStart(2, '0')}:${String(entry.schedule.minute).padStart(2, '0')}` }\nfunction companionName(companions: CompanionView[], id: string): string { return companions.find(item => item.id === id)?.name ?? '\u5DF2\u5220\u9664\u4F19\u4F34' }\n", "import { useEffect, useRef, useState } from 'react'\nimport { IconCheckOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type Capability, type CompanionView, type ModelCatalogView, type PartnerSnapshot } from '../client-api.js'\nimport { CAPABILITY_LABELS } from '../capabilities.js'\nimport { CompanionSkillSettings } from './skills-panel.js'\nimport { CompanionAccessPanel } from './companion-access-panel.js'\nimport { FormField as Field, SectionHeading as Section } from './partner-components.js'\nimport { errorMessage as message } from './workspace-components.js'\nimport { companionDraft } from './companion-draft.js'\n\nexport function CapabilityEditor({ companion, presets, onChanged }: { companion: CompanionView; presets: PartnerSnapshot['presets']; onChanged(): Promise<void> }): JSX.Element {\n const [form, setForm] = useState(() => companionDraft(companion))\n const [modelCatalog, setModelCatalog] = useState<ModelCatalogView>()\n const [saving, setSaving] = useState(false)\n const [saved, setSaved] = useState(false)\n const [error, setError] = useState<string>()\n const savingRef = useRef(false)\n const mounted = useRef(true)\n useEffect(() => { mounted.current = true; return () => { mounted.current = false } }, [])\n useEffect(() => { if (!savingRef.current) setForm(companionDraft(companion)) }, [companion.id, companion.updatedAt])\n useEffect(() => { void api<ModelCatalogView>('/models').then(value => { if (mounted.current) setModelCatalog(value) }).catch(reason => { if (mounted.current) setError(message(reason)) }) }, [])\n const edit = (next: typeof form): void => { if (savingRef.current) return; setForm(next); setSaved(false); setError(undefined) }\n const toggle = (capability: Capability): void => edit({ ...form, capabilities: form.capabilities.includes(capability) ? form.capabilities.filter(item => item !== capability) : [...form.capabilities, capability] })\n const save = async (): Promise<void> => {\n if (savingRef.current) return\n savingRef.current = true\n setSaving(true); setSaved(false); setError(undefined)\n try {\n await api(`/companions/${companion.id}`, { method: 'PUT', body: JSON.stringify({ companion: form }) })\n if (!mounted.current) return\n setSaved(true)\n try { await onChanged() }\n catch { if (mounted.current) setError('\u80FD\u529B\u5DF2\u4FDD\u5B58\uFF0C\u4F46\u5217\u8868\u5237\u65B0\u5931\u8D25\u3002\u5237\u65B0\u9875\u9762\u5373\u53EF\uFF0C\u65E0\u9700\u91CD\u590D\u5E94\u7528\u3002') }\n } catch (reason) { if (mounted.current) setError(`\u4FDD\u5B58\u5931\u8D25\uFF1A${message(reason)}\u3002\u5F53\u524D\u9009\u62E9\u5DF2\u4FDD\u7559\uFF0C\u53EF\u91CD\u8BD5\u3002`) }\n finally { savingRef.current = false; if (mounted.current) setSaving(false) }\n }\n const groups: Array<{ id: string; eyebrow: string; title: string; detail: string; choices: Array<{ id: Capability; title: string; detail: string }> }> = [\n { id: 'tools', eyebrow: 'TOOLS', title: '\u5DE5\u4F5C\u5DE5\u5177', detail: '\u8FDE\u63A5\u5F53\u524D\u4F19\u4F34\u80FD\u591F\u4F7F\u7528\u7684\u4E13\u4E1A\u5DE5\u5177\u3002', choices: [\n { id: 'knowledge', title: '\u77E5\u8BC6\u5E93', detail: '\u5728\u5DF2\u6302\u8F7D\u8303\u56F4\u5185\u68C0\u7D22\u4E0E\u56DE\u5199\u77E5\u8BC6\u3002' },\n { id: 'skills', title: 'Skill', detail: '\u4F7F\u7528\u5355\u72EC\u542F\u7528\u7684 Skill \u4E0E\u5DE5\u4F5C\u6D41\u7A0B\u3002' },\n { id: 'ssh', title: 'SSH', detail: '\u5728 SSH \u63D2\u4EF6\u6388\u6743\u8FB9\u754C\u5185\u64CD\u4F5C\u4E3B\u673A\u3002' },\n { id: 'git', title: 'Git', detail: '\u9884\u7559 Git \u80FD\u529B\uFF0C\u9700\u5BF9\u5E94\u63D2\u4EF6\u5B9E\u9645\u5B89\u88C5\u3002' },\n ] },\n { id: 'coordination', eyebrow: 'COORDINATION', title: '\u534F\u4F5C\u4E0E\u81EA\u52A8\u5316', detail: '\u63A7\u5236\u4F19\u4F34\u5EFA\u7ACB\u5173\u7CFB\u548C\u81EA\u4E3B\u5B89\u6392\u5DE5\u4F5C\u7684\u6743\u9650\u3002', choices: [\n { id: 'companions', title: '\u521B\u5EFA\u4F19\u4F34', detail: '\u6309\u660E\u786E\u9700\u6C42\u521B\u5EFA\u9ED8\u8BA4\u65E0\u6743\u9650\u7684\u65B0\u4F19\u4F34\u3002' },\n { id: 'access', title: '\u4F19\u4F34\u6388\u6743', detail: '\u6309\u660E\u786E\u8981\u6C42\u914D\u7F6E\u4F19\u4F34\u4E4B\u95F4\u7684\u5355\u5411\u8BBF\u95EE\u5173\u7CFB\u3002' },\n { id: 'schedules', title: '\u5B9A\u65F6\u4EFB\u52A1', detail: '\u521B\u5EFA\u5E76\u7BA1\u7406\u7531\u81EA\u5DF1\u6267\u884C\u7684\u5468\u671F\u4EFB\u52A1\u3002' },\n ] },\n { id: 'administration', eyebrow: 'ADMINISTRATION', title: '\u9AD8\u6743\u9650\u7BA1\u7406', detail: '\u4EC5\u6388\u4E88\u53EF\u4FE1\u7684\u7BA1\u7406\u4F19\u4F34\uFF1B\u666E\u901A\u534F\u4F5C\u6388\u6743\u4E0D\u5305\u542B\u4FEE\u6539\u6743\u9650\u3002', choices: [\n { id: 'administration', title: CAPABILITY_LABELS.administration, detail: '\u4FEE\u6539\u5176\u4ED6\u4F19\u4F34\u7684\u8EAB\u4EFD\u3001\u80FD\u529B\u4E0E Preset\u3001\u534F\u4F5C\u3001Skill \u548C\u77E5\u8BC6\u5E93\u6302\u8F7D\u3002\u4E0D\u5171\u4EAB\u4F1A\u8BDD\u3001\u8BB0\u5FC6\u6216\u51ED\u636E\uFF1B\u4E0D\u80FD\u81EA\u6539\u6216\u8F6C\u6388\u672C\u6743\u9650\u3002' },\n ] },\n ]\n const selectedProvider = form.provider || modelCatalog?.defaultSelection.provider || ''\n const modelOptions = modelCatalog?.providers.find(item => item.id === selectedProvider)?.models ?? []\n const currentModelMissing = Boolean(form.model) && !modelOptions.some(item => item.id === form.model)\n return <div className=\"dsh-partner-form is-capabilities\"><Section eyebrow=\"COMPOSITION\" title=\"\u80FD\u529B\u7EC4\u5408\" detail=\"\u4F19\u4F34\u58F0\u660E\u610F\u56FE\u8303\u56F4\uFF1B\u771F\u6B63\u53EF\u8C03\u7528\u7684\u5DE5\u5177\u4ECD\u6765\u81EA\u6240\u9009 Agent Preset\uFF0C\u5E76\u7EE7\u7EED\u6267\u884C\u5404\u63D2\u4EF6\u6743\u9650\u3002\" />\n <div className=\"dsh-partner-runtime-fields\"><Field label=\"Agent Preset\" hint=\"\u5DE5\u5177\u3001Skill \u4E0E\u7CFB\u7EDF\u63D0\u793A\"><select disabled={saving} value={form.presetId} onChange={event => edit({ ...form, presetId: event.target.value })}><option value=\"\">\u8DDF\u968F DSH \u9ED8\u8BA4 Preset</option>{presets.filter(item => !item.broken).map(item => <option value={item.id} key={item.id}>{item.name}</option>)}</select></Field><Field label=\"\u6A21\u578B\u63D0\u4F9B\u65B9\" hint=\"\u6765\u81EA\u5F53\u524D\u5BA2\u6237\u7AEF\"><select disabled={saving} value={form.provider} onChange={event => edit({ ...form, provider: event.target.value, model: '' })}><option value=\"\">\u8DDF\u968F DSH \u9ED8\u8BA4 \u00B7 {modelCatalog?.defaultSelection.provider || '\u6B63\u5728\u8BFB\u53D6'}</option>{modelCatalog?.providers.map(provider => <option value={provider.id} key={provider.id}>{provider.name || provider.id}</option>)}</select></Field><Field label=\"\u6A21\u578B\" hint=\"\u968F\u63D0\u4F9B\u65B9\u8054\u52A8\"><select disabled={saving} value={form.model} onChange={event => edit({ ...form, model: event.target.value })}><option value=\"\">\u8DDF\u968F DSH \u9ED8\u8BA4 \u00B7 {modelCatalog?.defaultSelection.model || '\u6B63\u5728\u8BFB\u53D6'}</option>{currentModelMissing && <option value={form.model}>\u5F53\u524D\u914D\u7F6E \u00B7 {form.model}</option>}{modelOptions.map(model => <option value={model.id} key={model.id}>{model.name || model.id}</option>)}</select></Field></div>\n <p className=\"dsh-partner-inline-note\">\u8EAB\u4EFD\u4E0E\u80FD\u529B\u5728\u4E0B\u4E00\u8F6E\u6267\u884C\u524D\u66F4\u65B0\uFF1BPreset \u4E0E\u6A21\u578B\u4F5C\u4E3A\u4F1A\u8BDD\u9ED8\u8BA4\u914D\u7F6E\uFF0C\u4E0D\u8986\u76D6\u5DF2\u6709\u4F1A\u8BDD\u7684\u9009\u62E9\u3002</p>\n <div className=\"dsh-partner-capability-groups\">{groups.map(group => {\n const enabled = group.choices.filter(choice => form.capabilities.includes(choice.id)).length\n return <section className=\"dsh-partner-capability-group\" key={group.id} aria-labelledby={`partner-capability-${group.id}`}><header><span><small>{group.eyebrow}</small><strong id={`partner-capability-${group.id}`}>{group.title}</strong><p>{group.detail}</p></span><em>{enabled} / {group.choices.length} \u5DF2\u542F\u7528</em></header><div className=\"dsh-partner-capabilities\">{group.choices.map(choice => {\n const active = form.capabilities.includes(choice.id)\n return <button type=\"button\" key={choice.id} disabled={saving} className={active ? 'is-active' : ''} aria-pressed={active} onClick={() => toggle(choice.id)}><span>{active && <IconCheckOutline14 size={14} />}</span><strong>{choice.title}</strong><small>{choice.detail}</small></button>\n })}</div></section>\n })}</div>\n {form.capabilities.includes('skills') && companion.capabilities.includes('skills') && <CompanionSkillSettings companionId={companion.id} />}\n {form.capabilities.includes('skills') && !companion.capabilities.includes('skills') && <p className=\"dsh-partner-inline-note\">\u5148\u5E94\u7528\u80FD\u529B\u7EC4\u5408\uFF0C\u518D\u4E3A\u5F53\u524D\u4F19\u4F34\u9009\u62E9\u5177\u4F53 Skill\u3002</p>}\n <CompanionAccessPanel companionId={companion.id} />\n {error && <p className=\"dsh-partner-inline-error\" role=\"alert\">{error}</p>}<div className=\"dsh-partner-form-actions is-capability-save\"><span role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">{saved && <><IconCheckOutline14 size={14} /><span>\u5DF2\u4FDD\u5B58\uFF0C\u4E0B\u4E00\u8F6E\u751F\u6548</span></>}</span><button type=\"button\" disabled={saving} aria-busy={saving} onClick={() => { void save() }}>{saving ? '\u6B63\u5728\u4FDD\u5B58\u2026' : '\u5E94\u7528\u80FD\u529B\u7EC4\u5408'}</button></div>\n </div>\n}\n", "export const COMPANION_CAPABILITIES = ['knowledge', 'skills', 'ssh', 'git', 'companions', 'schedules', 'access', 'administration'] as const\nexport type CompanionCapability = typeof COMPANION_CAPABILITIES[number]\n\nexport const CAPABILITY_LABELS: Record<CompanionCapability, string> = {\n knowledge: '\u77E5\u8BC6\u5E93', skills: 'Skill', ssh: 'SSH', git: 'Git', companions: '\u521B\u5EFA\u4F19\u4F34',\n schedules: '\u5B9A\u65F6\u4EFB\u52A1', access: '\u4F19\u4F34\u6388\u6743', administration: '\u4F19\u4F34\u7BA1\u7406\uFF08\u9AD8\u6743\u9650\uFF09',\n}\n\nexport function isCompanionCapability(value: string): value is CompanionCapability {\n return (COMPANION_CAPABILITIES as readonly string[]).includes(value)\n}\n", "import { useCallback, useEffect, useState } from 'react'\nimport { IconCheckOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type CompanionAccessView } from '../client-api.js'\nimport { CollectionEmpty, WorkspaceNotice, errorMessage } from './workspace-components.js'\nimport { CAPABILITY_LABELS, isCompanionCapability } from '../capabilities.js'\n\nexport function CompanionAccessPanel({ companionId }: { companionId: string }): JSX.Element {\n const [access, setAccess] = useState<CompanionAccessView>({ targetIds: [], companions: [] })\n const [busy, setBusy] = useState<string>()\n const [error, setError] = useState<string>()\n const load = useCallback(async () => {\n try { setAccess(await api<CompanionAccessView>(`/companions/${encodeURIComponent(companionId)}/access`)); setError(undefined) }\n catch (reason) { setError(errorMessage(reason)) }\n }, [companionId])\n useEffect(() => { void load() }, [load])\n\n const toggle = async (targetId: string): Promise<void> => {\n const previous = access.targetIds\n const targetIds = previous.includes(targetId) ? previous.filter(id => id !== targetId) : [...previous, targetId]\n setBusy(targetId); setAccess(current => ({ ...current, targetIds })); setError(undefined)\n try {\n const result = await api<{ targetIds: string[] }>(`/companions/${encodeURIComponent(companionId)}/access`, { method: 'PUT', body: JSON.stringify({ targetIds }) })\n setAccess(current => ({ ...current, targetIds: result.targetIds }))\n } catch (reason) { setAccess(current => ({ ...current, targetIds: previous })); setError(errorMessage(reason)) }\n finally { setBusy(undefined) }\n }\n\n return <section className=\"dsh-partner-capability-detail dsh-partner-access\" aria-labelledby=\"dsh-partner-access-title\">\n <header><span><small>DIRECTED ACCESS</small><strong id=\"dsh-partner-access-title\">\u53EF\u8BBF\u95EE\u7684\u4F19\u4F34</strong></span><em>{access.targetIds.length} \u4F4D\u5DF2\u6388\u6743</em></header>\n <p className=\"dsh-partner-access-note\">\u52FE\u9009\u540E\uFF0C\u5F53\u524D\u4F19\u4F34\u80FD\u4E86\u89E3\u5BF9\u65B9\u7684\u516C\u5F00\u80FD\u529B\uFF0C\u5E76\u5728\u4EFB\u52A1\u770B\u677F\u4E2D `@` \u5BF9\u65B9\u6267\u884C\u4EFB\u52A1\u3002\u6388\u6743\u53EA\u6CBF\u5F53\u524D\u65B9\u5411\u751F\u6548\uFF0C\u4E0D\u4F1A\u53CD\u5411\u6388\u6743\uFF0C\u4E5F\u4E0D\u4F1A\u5171\u4EAB\u4F1A\u8BDD\u3001\u8BB0\u5FC6\u3001\u6E20\u9053\u6216\u51ED\u636E\u3002</p>\n {access.companions.length === 0 ? <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u53EF\u6388\u6743\u7684\u4F19\u4F34\" detail=\"\u521B\u5EFA\u7B2C\u4E8C\u4F4D\u4F19\u4F34\u540E\uFF0C\u53EF\u4EE5\u5728\u8FD9\u91CC\u5EFA\u7ACB\u5355\u5411\u534F\u4F5C\u6388\u6743\u3002\" /> : <div className=\"dsh-partner-access-list\">{access.companions.map(companion => {\n const selected = access.targetIds.includes(companion.id)\n const abilities = companion.capabilities.map(capability => isCompanionCapability(capability) ? CAPABILITY_LABELS[capability] : capability)\n return <button type=\"button\" key={companion.id} className={selected ? 'is-active' : ''} aria-pressed={selected} disabled={busy === companion.id} onClick={() => { void toggle(companion.id) }}>\n <span className=\"dsh-partner-access-avatar\" aria-hidden=\"true\">{initials(companion.name)}</span>\n <span className=\"dsh-partner-access-copy\"><strong>@{companion.name}</strong><small>{companion.role}</small><p>{companion.description || '\u672A\u586B\u5199\u4F19\u4F34\u8BF4\u660E'}</p><span>{[...abilities, ...companion.enabledSkills.map(skill => skill.name)].map(item => <em key={item}>{item}</em>)}</span></span>\n <span className=\"dsh-partner-access-check\" aria-hidden=\"true\">{selected && <IconCheckOutline16 size={15} />}</span>\n </button>\n })}</div>}\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n </section>\n}\n\nfunction initials(name: string): string { return [...name.trim()].slice(0, 2).join('').toUpperCase() || 'AI' }\n", "import type { Capability, CompanionView } from '../client-api.js'\n\nexport function companionDraft(companion: CompanionView): { name: string; role: string; description: string; instructions: string; presetId: string; provider: string; model: string; capabilities: Capability[] } { return { name: companion.name, role: companion.role, description: companion.description, instructions: companion.instructions, presetId: companion.presetId ?? '', provider: companion.provider ?? '', model: companion.model ?? '', capabilities: [...companion.capabilities] } }\n", "import { useEffect, useRef, useState, type FormEvent } from 'react'\nimport { IconCheckOutline14, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type CompanionView } from '../client-api.js'\nimport { companionDraft } from './companion-draft.js'\nimport { FormField as Field, SectionHeading as Section } from './partner-components.js'\nimport { errorMessage } from './workspace-components.js'\n\ninterface Props {\n companion: CompanionView\n count: number\n onChanged(): Promise<void>\n onRemoved(id: string): Promise<void>\n}\n\n/** Identity-scoped lifetime prevents confirmations and late results crossing targets. */\nexport function IdentityEditor(props: Props): JSX.Element { return <IdentityEditorForm key={props.companion.id} {...props} /> }\n\nfunction IdentityEditorForm({ companion, count, onChanged, onRemoved }: Props): JSX.Element {\n const [form, setForm] = useState(() => companionDraft(companion))\n const [operation, setOperation] = useState<'save' | 'remove'>()\n const [saved, setSaved] = useState(false)\n const [removed, setRemoved] = useState(false)\n const [error, setError] = useState<string>()\n const [confirmationId, setConfirmationId] = useState<string>()\n const locked = useRef(false)\n const alive = useRef(true)\n useEffect(() => { alive.current = true; return () => { alive.current = false } }, [])\n useEffect(() => { setForm(companionDraft(companion)); setSaved(false); setConfirmationId(undefined) }, [companion.updatedAt])\n const confirming = confirmationId === companion.id\n const busy = operation !== undefined || removed\n const submit = async (event: FormEvent): Promise<void> => {\n event.preventDefault()\n if (locked.current || removed) return\n locked.current = true; setOperation('save'); setError(undefined); setConfirmationId(undefined)\n let committed = false\n try {\n await api(`/companions/${encodeURIComponent(companion.id)}`, { method: 'PUT', body: JSON.stringify({ companion: form }) })\n committed = true\n await onChanged()\n if (alive.current) setSaved(true)\n } catch (reason) {\n if (alive.current) setError(`${committed ? '\u8EAB\u4EFD\u5DF2\u4FDD\u5B58\uFF0C\u4F46\u5237\u65B0\u5931\u8D25\uFF0C\u65E0\u9700\u91CD\u590D\u4FDD\u5B58\uFF1A' : '\u4FDD\u5B58\u5931\u8D25\uFF1A'}${errorMessage(reason)}`)\n } finally { locked.current = false; if (alive.current) setOperation(undefined) }\n }\n const remove = async (): Promise<void> => {\n if (locked.current || removed || !confirming || count <= 1) return\n const targetId = confirmationId\n locked.current = true; setOperation('remove'); setError(undefined); setConfirmationId(undefined)\n let committed = false\n try {\n await api(`/companions/${encodeURIComponent(targetId)}?removeFiles=1`, { method: 'DELETE' })\n committed = true\n if (alive.current) setRemoved(true)\n // Always refresh the parent even if the user switched away during deletion.\n await onRemoved(targetId)\n } catch (reason) {\n if (alive.current) setError(`${committed ? '\u4F19\u4F34\u5DF2\u5220\u9664\uFF0C\u4F46\u9875\u9762\u5237\u65B0\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\uFF0C\u4E0D\u8981\u518D\u6B21\u5220\u9664\uFF1A' : '\u5220\u9664\u5931\u8D25\uFF1A'}${errorMessage(reason)}`)\n } finally { locked.current = false; if (alive.current) setOperation(undefined) }\n }\n return <form id=\"dsh-partner-identity-editor\" className=\"dsh-partner-form is-identity\" aria-busy={operation !== undefined} onSubmit={event => { void submit(event) }}>\n <Section eyebrow=\"IDENTITY\" title=\"\u5DE5\u4F5C\u8EAB\u4EFD\" detail=\"\u5B83\u4E0D\u662F\u4E00\u6B21\u5BF9\u8BDD\u7684\u63D0\u793A\u8BCD\uFF0C\u800C\u662F\u8FD9\u4E2A\u4F19\u4F34\u5728\u684C\u9762\u548C\u5FAE\u4FE1\u4E2D\u7684\u957F\u671F\u884C\u4E3A\u57FA\u7EBF\u3002\" />\n <section className=\"dsh-partner-identity-card\" aria-label=\"\u8EAB\u4EFD\u914D\u7F6E\">\n <div className=\"dsh-partner-fields two\"><Field label=\"\u540D\u5B57\"><input disabled={busy} required maxLength={60} value={form.name} onChange={event => setForm({ ...form, name: event.target.value })} /></Field><Field label=\"\u89D2\u8272\"><input disabled={busy} required maxLength={120} value={form.role} onChange={event => setForm({ ...form, role: event.target.value })} /></Field></div>\n <Field label=\"\u4E00\u53E5\u8BDD\u5B9A\u4F4D\" hint=\"\u7528\u4E8E\u540D\u518C\u8BC6\u522B\uFF0C\u4E0D\u4F1A\u66FF\u4EE3\u5B8C\u6574\u884C\u4E3A\u51C6\u5219\u3002\"><textarea disabled={busy} rows={2} maxLength={500} value={form.description} onChange={event => setForm({ ...form, description: event.target.value })} /></Field>\n <Field label=\"\u957F\u671F\u884C\u4E3A\u51C6\u5219\" hint=\"\u5EFA\u8BAE\u5199\u804C\u8D23\u3001\u8868\u8FBE\u65B9\u5F0F\u4E0E\u8FB9\u754C\uFF1B\u6E20\u9053\u3001\u5DE5\u5177\u548C\u6388\u6743\u7531\u7CFB\u7EDF\u5355\u72EC\u63A7\u5236\u3002\"><textarea disabled={busy} rows={9} maxLength={12000} value={form.instructions} onChange={event => setForm({ ...form, instructions: event.target.value })} /></Field>\n {error && <p className=\"dsh-partner-inline-error\" role=\"alert\">{error}</p>}\n <div className=\"dsh-partner-form-actions\"><span role=\"status\">{saved && <><IconCheckOutline14 size={14} />\u5DF2\u4FDD\u5B58\uFF0C\u4E0B\u4E00\u8F6E\u5C06\u4F7F\u7528\u65B0\u8EAB\u4EFD</>}</span><button disabled={busy}>{operation === 'save' ? '\u6B63\u5728\u4FDD\u5B58\u2026' : '\u4FDD\u5B58\u8EAB\u4EFD'}</button></div>\n </section>\n <div className=\"dsh-partner-identity-danger\" data-confirming={confirming}>\n <span><strong>{removed ? '\u4F19\u4F34\u5DF2\u5220\u9664' : confirming ? `\u786E\u8BA4\u5220\u9664\u300C${companion.name}\u300D\uFF1F` : '\u5220\u9664\u4F19\u4F34'}</strong><small>{confirming ? '\u5C06\u5220\u9664\u8BE5\u4F19\u4F34\u7684\u914D\u7F6E\u3001\u8BB0\u5FC6\u3001\u6302\u5FF5\u3001\u4E13\u5C5E\u76EE\u5F55\u53CA\u5176\u4E2D\u5168\u90E8\u6587\u4EF6\uFF0C\u6B64\u64CD\u4F5C\u4E0D\u53EF\u64A4\u9500\u3002\u5171\u4EAB\u6216\u5F02\u5E38\u76EE\u5F55\u4F1A\u62E6\u622A\uFF1BDSH \u539F\u4F1A\u8BDD\u65E5\u5FD7\u4ECD\u7531\u5BBF\u4E3B\u7BA1\u7406\uFF0C\u4E0D\u5728\u6B64\u6B21\u6E05\u7406\u8303\u56F4\u5185\u3002' : '\u5FC5\u987B\u5148\u89E3\u7ED1\u5FAE\u4FE1\u5E76\u7ED3\u675F\u8FD0\u884C\u4E2D\u7684\u4EFB\u52A1\u3002\u5220\u9664\u53EA\u9488\u5BF9\u672C\u6B21\u786E\u8BA4\u7684\u4F19\u4F34\uFF0C\u4E0D\u4F1A\u8F6C\u4EA4\u8054\u7CFB\u4EBA\u3002'}</small></span>\n <div>{confirming && <button type=\"button\" disabled={busy} className=\"is-secondary\" onClick={() => setConfirmationId(undefined)}>\u53D6\u6D88</button>}<button type=\"button\" className={confirming ? 'is-danger' : ''} disabled={busy || count <= 1} onClick={() => confirming ? void remove() : setConfirmationId(companion.id)}><IconTrashOutline16 size={16} />{operation === 'remove' ? '\u6B63\u5728\u5220\u9664\u2026' : removed ? '\u5DF2\u5220\u9664' : confirming ? '\u786E\u8BA4\u5220\u9664' : '\u5220\u9664'}</button></div>\n </div>\n </form>\n}\n", "import {useState, type ReactNode, type FormEvent} from 'react'\nimport {api, type CompanionView, type PartnerSnapshot} from '../client-api.js'\nimport {NotificationSettings} from './notification-settings.js'\nimport {SectionHeading, ChannelStatus} from './partner-components.js'\nimport {errorMessage, WorkspaceDialog} from './workspace-components.js'\n\nexport function ChannelsPanel({companion,snapshot,onChanged,weixin}: {companion:CompanionView;snapshot:PartnerSnapshot;onChanged():Promise<void>;weixin:ReactNode}):JSX.Element {\n const [platform,setPlatform]=useState<'matrix'|'mattermost'>('matrix')\n const [name,setName]=useState('')\n const [baseUrl,setBaseUrl]=useState('')\n const [targetId,setTargetId]=useState('')\n const [botToken,setToken]=useState('')\n const [authMode,setAuthMode]=useState<'password'|'token'>('password')\n const [username,setUsername]=useState(''),[password,setPassword]=useState(''),[mfaToken,setMfaToken]=useState('')\n const [busy,setBusy]=useState(false)\n const [feedback,setFeedback]=useState('')\n const [deleting,setDeleting]=useState<string>()\n const [adding,setAdding]=useState(false)\n const [fixedPlatform,setFixedPlatform]=useState(false)\n const [configuring,setConfiguring]=useState<string>()\n const closeAdd=()=>{setAdding(false);setToken('');setPassword('');setMfaToken('')}\n const openAdd=(selected?:'matrix'|'mattermost')=>{\n setFixedPlatform(Boolean(selected));setPlatform(selected??'matrix');setName('');setBaseUrl('');setTargetId('');setUsername('');setPassword('');setToken('');setMfaToken('');setAuthMode('password');setFeedback('');setAdding(true)\n }\n const channels=snapshot.channels.filter(c=>c.companionId===companion.id)\n const pairings=snapshot.pairings.filter(p=>channels.some(c=>c.id===p.channelId))\n const run=async(action:()=>Promise<void>)=>{if(busy)return;setBusy(true);setFeedback('');try{await action()}catch(error){setFeedback(errorMessage(error))}finally{setBusy(false)}}\n const configure=async(save:boolean)=>run(async()=>{\n const body={companionId:companion.id,platform,name:name.trim()||platform,baseUrl:baseUrl.trim(),targetId:targetId.trim(),authMode,...(authMode==='password'?{username,password,mfaToken}:{botToken:botToken.trim()})}\n await api(save?'/channels':'/channels/test',{method:'POST',body:JSON.stringify(body)})\n if(save){await onChanged();closeAdd()}\n setFeedback(save?'\u8D26\u53F7\u5DF2\u4FDD\u5B58\u3002\u8BF7\u542F\u7528\u6E20\u9053\uFF0C\u518D\u5411\u673A\u5668\u4EBA\u53D1\u9001\u79C1\u804A\u6D88\u606F\uFF0C\u6838\u5BF9\u914D\u5BF9\u7801\u5E76\u6279\u51C6\u8054\u7CFB\u4EBA\u3002':'\u8D26\u53F7\u9A8C\u8BC1\u901A\u8FC7\uFF0C\u53EF\u4EE5\u4FDD\u5B58\u3002')\n })\n return <div id=\"dsh-partner-channels\" className=\"dsh-partner-form is-channel dsh-partner-channels\">\n <div className=\"dsh-partner-channel-toolbar\">\n <SectionHeading eyebrow=\"CHANNELS\" title=\"\u6211\u7684\u6E20\u9053\" detail=\"\u67E5\u770B\u8FDE\u63A5\u72B6\u6001\uFF0C\u7BA1\u7406\u8054\u7CFB\u4EBA\u4E0E\u901A\u77E5\u6295\u9012\u3002\" />\n <button type=\"button\" onClick={()=>openAdd()}>\u6DFB\u52A0\u6E20\u9053</button>\n </div>\n {!adding&&feedback&&<p role=\"status\">{feedback}</p>}\n {adding&&<WorkspaceDialog title={fixedPlatform?`${platform==='matrix'?'Matrix':'Mattermost'} \u914D\u7F6E`:'\u6DFB\u52A0\u6E20\u9053'} detail={platform==='matrix'?'\u4EC5\u672A\u52A0\u5BC6\u7684\u53CC\u4EBA\u4F1A\u8BDD\u53EF\u83B7\u53D6\u914D\u5BF9\u7801\u3002\u8BF7\u65B0\u5EFA\u672A\u5F00\u542F\u7AEF\u5230\u7AEF\u52A0\u5BC6\u7684\u4F1A\u8BDD\uFF0C\u9080\u8BF7\u673A\u5668\u4EBA\u540E\u53D1\u9001\u6587\u5B57\u6D88\u606F\u3002':'\u5148\u767B\u5F55\uFF0C\u518D\u5411\u673A\u5668\u4EBA\u53D1\u79C1\u804A\u6D88\u606F\uFF0C\u6838\u5BF9\u914D\u5BF9\u7801\u540E\u6388\u6743\u3002'} close={()=>{if(!busy)closeAdd()}}>\n <form className=\"dsh-partner-feature-form dsh-partner-channel-form\" aria-busy={busy} onSubmit={(event:FormEvent)=>{event.preventDefault();void configure(true)}}>\n {!fixedPlatform&&<FormField label=\"\u5E73\u53F0\"><select autoFocus disabled={busy} value={platform} onChange={e=>{setPlatform(e.target.value as typeof platform);setPassword('');setToken('');setMfaToken('');setTargetId('');setFeedback('')}}><option value=\"matrix\">Matrix</option><option value=\"mattermost\">Mattermost</option></select></FormField>}\n <FormField label=\"\u6E20\u9053\u540D\u79F0\"><input autoFocus={fixedPlatform} disabled={busy} maxLength={80} value={name} onChange={e=>setName(e.target.value)} placeholder={`\u4F8B\u5982\uFF1A\u6211\u7684 ${platform==='matrix'?'Matrix':'Mattermost'}`} /></FormField>\n <FormField label=\"\u670D\u52A1\u5668\u5730\u5740\"><input disabled={busy} required type=\"url\" value={baseUrl} onChange={e=>setBaseUrl(e.target.value)} placeholder=\"https://chat.example.com\" /></FormField>\n <details><summary>\u9AD8\u7EA7\u914D\u7F6E\uFF08\u53EF\u9009\uFF09</summary><FormField label={platform==='matrix'?'\u56FA\u5B9A\u623F\u95F4 ID':'\u56FA\u5B9A DM \u4F1A\u8BDD ID'} hint=\"\u7559\u7A7A\u5219\u81EA\u52A8\u53D1\u73B0\u79C1\u804A\uFF0C\u901A\u8FC7\u914D\u5BF9\u6388\u6743\u3002\u586B\u5199\u540E\u4EC5\u76D1\u542C\u6307\u5B9A\u4F1A\u8BDD\u3002\"><input disabled={busy} value={targetId} onChange={e=>setTargetId(e.target.value)} placeholder={platform==='matrix'?'!room:example.com':'DM channel ID'} /></FormField></details>\n <FormField label=\"\u767B\u5F55\u65B9\u5F0F\"><select disabled={busy} value={authMode} onChange={e=>{setAuthMode(e.target.value as typeof authMode);setToken('');setPassword('');setMfaToken('')}}><option value=\"password\">\u8D26\u53F7\u5BC6\u7801</option><option value=\"token\">Access Token</option></select></FormField>\n {authMode==='password'?<>\n <FormField label=\"\u8D26\u53F7\"><input disabled={busy} required autoComplete=\"username\" value={username} onChange={e=>setUsername(e.target.value)} placeholder={platform==='matrix'?'@\u8D26\u53F7:\u670D\u52A1\u5668\u57DF\u540D':'\u7528\u6237\u540D\u6216\u90AE\u7BB1'}/></FormField>\n <FormField label=\"\u5BC6\u7801\" hint=\"\u4EC5\u7528\u4E8E\u6362\u53D6\u4EE4\u724C\uFF0C\u4E0D\u4FDD\u5B58\u5BC6\u7801\uFF1B\u8BF7\u4F18\u5148\u4F7F\u7528 HTTPS \u670D\u52A1\u5668\u3002\"><input disabled={busy} required type=\"password\" autoComplete=\"current-password\" value={password} onChange={e=>setPassword(e.target.value)}/></FormField>\n {platform==='mattermost'&&<FormField label=\"\u53CC\u91CD\u9A8C\u8BC1\u9A8C\u8BC1\u7801\uFF08\u5982\u5DF2\u5F00\u542F\uFF09\"><input disabled={busy} autoComplete=\"one-time-code\" inputMode=\"numeric\" value={mfaToken} onChange={e=>setMfaToken(e.target.value)}/></FormField>}\n </>:<FormField label=\"Access Token\" hint=\"\u4EC5\u4FDD\u5B58\u81F3 DSH \u51ED\u636E\u5E93\uFF1B\u5EFA\u8BAE HTTPS\uFF0CHTTP \u4F1A\u660E\u6587\u4F20\u8F93\u51ED\u636E\u3002\"><input disabled={busy} required type=\"password\" autoComplete=\"new-password\" value={botToken} onChange={e=>setToken(e.target.value)} /></FormField>}\n {feedback&&<p role=\"status\">{feedback}</p>}\n <footer><button type=\"button\" disabled={busy} onClick={closeAdd}>\u53D6\u6D88</button><button type=\"button\" disabled={busy||!(authMode==='password'?username&&password:botToken)||!baseUrl} onClick={()=>void configure(false)}>\u6D4B\u8BD5\u8FDE\u63A5</button><button className=\"is-primary\" disabled={busy}>{busy?'\u5904\u7406\u4E2D\u2026':'\u4FDD\u5B58\u6E20\u9053'}</button></footer>\n </form>\n </WorkspaceDialog>}\n <div className=\"dsh-partner-channel-list\">\n <div className=\"dsh-partner-channel-row\">\n <span><strong>\u5FAE\u4FE1</strong><small>{channels.some(c=>!c.platform||c.platform==='weixin')?'\u7BA1\u7406\u8FDE\u63A5\u4E0E\u79C1\u804A\u6388\u6743':'\u5C1A\u672A\u8FDE\u63A5 \u00B7 \u626B\u7801\u63A5\u5165'}</small></span>{channels.find(c=>!c.platform||c.platform==='weixin')&&<ChannelStatus channel={channels.find(c=>!c.platform||c.platform==='weixin')!}/>}<button type=\"button\" aria-label=\"\u914D\u7F6E\u5FAE\u4FE1\" onClick={()=>setConfiguring('weixin')}>\u914D\u7F6E</button>\n {configuring==='weixin'&&<WorkspaceDialog title=\"\u5FAE\u4FE1\u914D\u7F6E\" detail=\"\u7BA1\u7406\u626B\u7801\u767B\u5F55\u3001\u8FDE\u63A5\u4E0E\u8054\u7CFB\u4EBA\u6388\u6743\u3002\" close={()=>setConfiguring(undefined)}>{weixin}</WorkspaceDialog>}\n </div>\n {(['matrix','mattermost'] as const).filter(platform=>!channels.some(c=>c.platform===platform)).map(platform=><div className=\"dsh-partner-channel-row\" key={platform}><span><strong>{platform==='matrix'?'Matrix':'Mattermost'}</strong><small>\u5C1A\u672A\u8FDE\u63A5</small></span><button type=\"button\" aria-label={`\u914D\u7F6E ${platform}`} onClick={()=>openAdd(platform)}>\u914D\u7F6E</button></div>)}\n {channels.filter(c=>c.platform&&c.platform!=='weixin').map(channel=><div key={channel.id} className=\"dsh-partner-channel-row has-notice-slot\">\n <span><strong>{channel.name}</strong><small>{channel.platform} \u00B7 {pairings.filter(p=>p.channelId===channel.id&&p.status==='pending').length} \u4E2A\u5F85\u6388\u6743</small></span><ChannelStatus channel={channel}/><button type=\"button\" aria-label={`\u914D\u7F6E ${channel.name}`} onClick={()=>{setFeedback('');setConfiguring(channel.id)}}>\u914D\u7F6E</button>\n {configuring===channel.id&&<WorkspaceDialog title={`${channel.name} \u00B7 \u914D\u7F6E`} detail=\"\u7BA1\u7406\u8FDE\u63A5\u72B6\u6001\u53CA\u8054\u7CFB\u4EBA\u8BBF\u95EE\u6743\u9650\u3002\" close={()=>{if(!busy){setConfiguring(undefined);setDeleting(undefined)}}}>\n <div className=\"dsh-partner-channel-detail dsh-partner-channel-manage\">\n <div className=\"dsh-partner-channel-connection\"><span><small>\u767B\u5F55\u8D26\u53F7</small><strong>{channel.accountId}</strong>{channel.direct?.targetId&&<small>{channel.direct.targetId}</small>}</span><ChannelStatus channel={channel}/></div>\n {channel.platform==='matrix'&&<p>\u4EC5\u652F\u6301\u672A\u52A0\u5BC6\u7684\u53CC\u4EBA\u4F1A\u8BDD\u3002\u52A0\u5BC6\u4F1A\u8BDD\u65E0\u6CD5\u8BFB\u53D6\u6D88\u606F\u6216\u53D1\u9001\u914D\u5BF9\u7801\uFF1B\u8BF7\u65B0\u5EFA\u672A\u5F00\u542F\u7AEF\u5230\u7AEF\u52A0\u5BC6\u7684\u4F1A\u8BDD\uFF0C\u9080\u8BF7\u673A\u5668\u4EBA\u540E\u53D1\u9001\u6587\u5B57\u6D88\u606F\u3002\u68C0\u6D4B\u5230\u52A0\u5BC6\u4F1A\u8BDD\u65F6\u4F1A\u5728\u6B64\u63D0\u793A\uFF0C\u4E0D\u5F71\u54CD\u5176\u4ED6\u672A\u52A0\u5BC6\u4F1A\u8BDD\u3002</p>}\n {!channel.direct?.targetId&&<p>\u5411\u673A\u5668\u4EBA\u53D1\u79C1\u804A\u6D88\u606F\uFF0C\u5728\u4E0B\u65B9\u6838\u5BF9\u914D\u5BF9\u7801\u540E\u6279\u51C6\u3002\u8BF7\u6C42\u4F1A\u81EA\u52A8\u66F4\u65B0\u3002</p>}\n {channel.lastError&&<p role=\"alert\">{channel.lastError}</p>}\n <div className=\"dsh-partner-form-actions\"><button disabled={busy} onClick={()=>void run(async()=>{await api(`/channels/${channel.id}/enabled`,{method:'POST',body:JSON.stringify({enabled:!channel.enabled})});await onChanged()})}>{channel.enabled?'\u505C\u7528':'\u542F\u7528'}</button>\n {channel.enabled&&channel.runtimeStatus==='error'&&<button disabled={busy} onClick={()=>void run(async()=>{await api(`/channels/${channel.id}/enabled`,{method:'POST',body:JSON.stringify({enabled:true})});await onChanged()})}>\u91CD\u8FDE</button>}\n <button disabled={busy} onClick={()=>deleting===channel.id?void run(async()=>{await api(`/channels/${channel.id}`,{method:'DELETE'});setDeleting(undefined);await onChanged()}):setDeleting(channel.id)}>{deleting===channel.id?'\u786E\u8BA4\u5220\u9664\u914D\u7F6E\u4E0E\u51ED\u636E':'\u5220\u9664\u6E20\u9053'}</button>\n {deleting===channel.id&&<button onClick={()=>setDeleting(undefined)}>\u53D6\u6D88</button>}\n </div>\n <section className=\"dsh-partner-channel-access\"><h3>\u8054\u7CFB\u4EBA\u6388\u6743</h3><p role=\"status\">{pairings.filter(p=>p.channelId===channel.id&&p.status==='pending').length} \u4E2A\u7B49\u5F85\u6279\u51C6 \u00B7 \u81EA\u52A8\u5237\u65B0</p>\n {pairings.filter(p=>p.channelId===channel.id).map(p=><div key={p.id} className=\"dsh-partner-channel-person\"><div><strong>{p.displayName}</strong><small>{p.status==='approved'?'\u5DF2\u6388\u6743':p.status==='pending'?'\u7B49\u5F85\u6279\u51C6':'\u5DF2\u963B\u6B62'}</small>{p.status==='pending'&&p.pairingCode&&<span>\u914D\u5BF9\u7801 <code>{p.pairingCode}</code></span>}</div><button disabled={busy} onClick={()=>void run(async()=>{await api(`/pairings/${p.id}/status`,{method:'POST',body:JSON.stringify({status:p.status==='approved'?'blocked':'approved'})});await onChanged()})}>{p.status==='approved'?'\u64A4\u9500\u6388\u6743':'\u6279\u51C6\u8054\u7CFB\u4EBA'}</button></div>)}\n </section>\n {feedback&&<p role=\"status\">{feedback}</p>}\n </div></WorkspaceDialog>}\n {channel.lastError&&<div className=\"dsh-partner-channel-inline-notice\" role=\"status\" aria-atomic=\"true\"><strong>{channel.runtimeStatus==='running'?'\u4F1A\u8BDD\u63D0\u793A':'\u8FDE\u63A5\u63D0\u793A'}</strong><p>{channel.lastError}</p></div>}\n </div>)}\n </div>\n <section className=\"dsh-partner-channel-notifications\" aria-label=\"\u901A\u77E5\u8BBE\u7F6E\"><div className=\"dsh-partner-channel-row\"><span><strong>\u901A\u77E5\u4E0E\u4EA4\u4ED8</strong><small>{companion.notificationDelivery?.mode==='selected'?`\u5DF2\u6307\u5B9A ${companion.notificationDelivery.targets.length} \u4F4D\u63A5\u6536\u4EBA`:'\u9ED8\u8BA4\u8DDF\u968F\u6700\u8FD1\u6E20\u9053\u4E0E\u7528\u6237'}</small></span><button type=\"button\" onClick={()=>setConfiguring('delivery')}>\u914D\u7F6E</button></div></section>\n {configuring==='delivery'&&<WorkspaceDialog title=\"\u901A\u77E5\u4E0E\u4EA4\u4ED8\" detail=\"\u9009\u62E9\u901A\u77E5\u6E20\u9053\uFF0C\u518D\u9009\u62E9\u5404\u6E20\u9053\u7684\u63A5\u6536\u4EBA\uFF1B\u652F\u6301\u540C\u65F6\u6295\u9012\u3002\" close={()=>setConfiguring(undefined)}><NotificationSettings companion={companion} snapshot={snapshot} onChanged={onChanged}/></WorkspaceDialog>}\n </div>\n}\n\nfunction FormField({label,hint,children}:{label:string;hint?:string;children:ReactNode}):JSX.Element {\n return <label className=\"dsh-partner-channel-field\"><span>{label}</span>{children}{hint&&<small>{hint}</small>}</label>\n}\n", "import {useState, useRef, useEffect} from 'react'\nimport {api, type CompanionView, type PartnerSnapshot} from '../client-api.js'\nimport {errorMessage} from './workspace-components.js'\n\nexport function NotificationSettings({companion,snapshot,onChanged}:{companion:CompanionView;snapshot:PartnerSnapshot;onChanged():Promise<void>}):JSX.Element {\n const channels=snapshot.channels.filter(c=>c.companionId===companion.id)\n const pairings=snapshot.pairings.filter(p=>channels.some(c=>c.id===p.channelId))\n const [mode,setMode]=useState(companion.notificationDelivery?.mode??'recent')\n const [targets,setTargets]=useState(companion.notificationDelivery?.targets??[])\n const [selectedChannels,setSelectedChannels]=useState(targets.map(t=>t.channelId))\n const [busy,setBusy]=useState(false),[feedback,setFeedback]=useState(''),[failed,setFailed]=useState(false)\n const saveRef=useRef<HTMLButtonElement>(null)\n useEffect(()=>{if(!busy&&feedback&&document.activeElement===document.body)saveRef.current?.focus()},[busy,feedback])\n const unavailable=targets.filter(t=>!pairings.some(p=>p.channelId===t.channelId&&p.userId===t.userId&&p.status==='approved')||!channels.some(c=>c.id===t.channelId&&c.enabled))\n const emptyChannel=selectedChannels.some(id=>!targets.some(t=>t.channelId===id))\n return <form className=\"dsh-partner-feature-form dsh-partner-channel-form dsh-partner-delivery-form\" aria-busy={busy} onSubmit={e=>{\n e.preventDefault();if(busy)return;setBusy(true);setFeedback('');setFailed(false)\n const targetPairingIds=targets.map(t=>pairings.find(p=>p.channelId===t.channelId&&p.userId===t.userId)?.id)\n void api(`/companions/${companion.id}/notifications`,{method:'PUT',body:JSON.stringify({mode,targetPairingIds:mode==='recent'?[]:targetPairingIds})}).then(async()=>{await onChanged();setFeedback('\u901A\u77E5\u8BBE\u7F6E\u5DF2\u4FDD\u5B58')}).catch(error=>{setFailed(true);setFeedback(errorMessage(error))}).finally(()=>setBusy(false))\n }}>\n <label className=\"dsh-partner-channel-field\"><span>\u901A\u77E5\u53D1\u9001\u5230</span><select disabled={busy} value={mode} onChange={e=>setMode(e.target.value as typeof mode)}><option value=\"recent\">\u6700\u8FD1\u8054\u7CFB\u7684\u6E20\u9053\u4E0E\u7528\u6237</option><option value=\"selected\">\u6307\u5B9A\u6E20\u9053\u4E0E\u63A5\u6536\u4EBA</option></select></label>\n <p>\u4EC5\u5F71\u54CD\u4E3B\u52A8\u901A\u77E5\u4E0E\u7ED3\u679C\u4EA4\u4ED8\u3002\u5BF9\u8BDD\u56DE\u590D\u4ECD\u53D1\u9001\u5230\u6D88\u606F\u6765\u6E90\u6E20\u9053\u3002</p>\n {!companion.notificationDelivery&&pairings.some(p=>p.deliveryTarget)&&<p role=\"status\">\u5F53\u524D\u4ECD\u4F7F\u7528\u65E7\u7684\u8054\u7CFB\u4EBA\u6295\u9012\u89C4\u5219\uFF0C\u4FDD\u5B58\u540E\u7EDF\u4E00\u4F7F\u7528\u8FD9\u91CC\u7684\u901A\u77E5\u8BBE\u7F6E\u3002</p>}\n {mode==='selected'&&<div className=\"dsh-partner-notification-choices\">\n <p>\u53EF\u9009\u62E9\u591A\u4E2A\u6E20\u9053\uFF1B\u6BCF\u4E2A\u6E20\u9053\u81F3\u5C11\u9009\u62E9\u4E00\u4F4D\u5DF2\u6388\u6743\u63A5\u6536\u4EBA\u3002\u4FDD\u5B58\u540E\u5BF9\u65B0\u901A\u77E5\u751F\u6548\uFF0C\u5F85\u91CD\u8BD5\u901A\u77E5\u4FDD\u7559\u539F\u63A5\u6536\u4EBA\u3002</p>\n {!channels.length&&<p>\u8BF7\u5148\u6DFB\u52A0\u6E20\u9053\u5E76\u6388\u6743\u8054\u7CFB\u4EBA\u3002</p>}\n {channels.map(channel=><fieldset key={channel.id} disabled={busy} className=\"dsh-partner-notification-channel\">\n <legend><label><input type=\"checkbox\" checked={selectedChannels.includes(channel.id)} onChange={e=>{\n setSelectedChannels(ids=>e.target.checked?[...ids,channel.id]:ids.filter(id=>id!==channel.id))\n if(!e.target.checked)setTargets(items=>items.filter(t=>t.channelId!==channel.id))\n }}/>{channel.name}{!channel.enabled?'\uFF08\u5DF2\u505C\u7528\uFF09':''}</label></legend>\n {selectedChannels.includes(channel.id)&&<div className=\"dsh-partner-notification-users\">\n {!pairings.some(p=>p.channelId===channel.id&&p.status==='approved')&&<p>\u6682\u65E0\u5DF2\u6388\u6743\u63A5\u6536\u4EBA\uFF0C\u8BF7\u5148\u5728\u6E20\u9053\u914D\u7F6E\u4E2D\u6279\u51C6\u8054\u7CFB\u4EBA\u3002</p>}\n {pairings.filter(p=>p.channelId===channel.id&&p.status==='approved').map(p=><label key={p.id}><input type=\"checkbox\" checked={targets.some(t=>t.channelId===p.channelId&&t.userId===p.userId)} onChange={e=>setTargets(items=>e.target.checked?[...items,{channelId:p.channelId,userId:p.userId}]:items.filter(t=>t.channelId!==p.channelId||t.userId!==p.userId))}/><span>{p.displayName}<small>{p.userId}</small></span></label>)}\n </div>}\n </fieldset>)}\n {unavailable.length>0&&<div role=\"alert\"><p>\u90E8\u5206\u5DF2\u9009\u63A5\u6536\u4EBA\u5DF2\u5931\u6548\u6216\u6E20\u9053\u5DF2\u505C\u7528\u3002\u8BF7\u79FB\u9664\u6216\u6062\u590D\u6388\u6743\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u6539\u53D1\u5176\u4ED6\u4EBA\u3002</p>{unavailable.map(t=><button type=\"button\" disabled={busy} key={JSON.stringify(t)} onClick={()=>{setTargets(items=>items.filter(x=>x.channelId!==t.channelId||x.userId!==t.userId));if(!targets.some(x=>x.channelId===t.channelId&&x.userId!==t.userId))setSelectedChannels(ids=>ids.filter(id=>id!==t.channelId))}}>\u79FB\u9664 {t.userId}</button>)}</div>}\n </div>}\n {feedback&&<p role={failed?'alert':'status'}>{feedback}</p>}\n <footer><button ref={saveRef} className=\"is-primary\" disabled={busy||(mode==='selected'&&(!targets.length||unavailable.length>0||emptyChannel))}>{busy?'\u4FDD\u5B58\u4E2D\u2026':'\u4FDD\u5B58\u901A\u77E5\u8BBE\u7F6E'}</button></footer>\n </form>\n}\n", "import {useEffect, type Dispatch, type SetStateAction} from 'react'\nimport {api, type PartnerSnapshot} from '../client-api.js'\n\ntype Status=Pick<PartnerSnapshot,'channels'|'pairings'>\nconst listeners=new Set<(value:Status)=>void>()\nlet timer:ReturnType<typeof setTimeout>|undefined\nlet active:AbortController|undefined\nlet lastValue=''\nasync function poll():Promise<void> {\n if(active||!listeners.size)return\n const controller=new AbortController();active=controller\n try {\n if(document.visibilityState!=='hidden') {\n const value=await api<Status>('/channels/status',{signal:AbortSignal.any([controller.signal,AbortSignal.timeout(10_000)])})\n const serialized=JSON.stringify(value)\n if(serialized!==lastValue){lastValue=serialized;listeners.forEach(listener=>listener(value))}\n }\n } catch { /* Preserve known state during brief network failures. */ }\n finally {\n if(active===controller)active=undefined\n if(listeners.size)timer=setTimeout(()=>void poll(),3000)\n }\n}\nexport function useChannelStatus(setSnapshot:Dispatch<SetStateAction<PartnerSnapshot|undefined>>):void {\n useEffect(()=>{\n const update=(value:Status)=>setSnapshot(previous=>previous?{...previous,...value}:previous)\n listeners.add(update)\n lastValue=''\n if(!active){clearTimeout(timer);void poll()}\n return ()=>{listeners.delete(update);if(!listeners.size){clearTimeout(timer);active?.abort();lastValue=''}}\n },[setSnapshot])\n}\n", "/* Own the identity form skin without changing host forms or theme tokens. */\n#dsh-partner-identity-editor.dsh-partner-form {\n min-width: 0;\n padding: 0;\n border: 0;\n background: transparent;\n box-shadow: none;\n color: var(--partner-text);\n font-family: var(--partner-font-family);\n}\n#dsh-partner-identity-editor .dsh-partner-identity-card {\n min-width: 0;\n padding: 20px;\n border: 1px solid var(--partner-border);\n border-radius: 15px;\n background: var(--partner-card-surface);\n box-shadow: var(--partner-card-shadow);\n}\n#dsh-partner-identity-editor .dsh-partner-field > span { flex-wrap: wrap; gap: 4px 12px; }\n#dsh-partner-identity-editor .dsh-partner-field small { text-align: start; }\n#dsh-partner-identity-editor .dsh-partner-field :is(input, textarea) {\n appearance: none;\n box-sizing: border-box;\n width: 100%;\n min-height: 40px;\n padding: 10px 12px;\n border: 1px solid var(--partner-border);\n border-radius: 10px;\n outline: none;\n color: var(--partner-text);\n background: var(--partner-control);\n font: var(--partner-font-label)/1.5 var(--partner-font-family);\n box-shadow: inset 0 1px 0 var(--partner-glass-highlight);\n}\n#dsh-partner-identity-editor .dsh-partner-field textarea { resize: vertical; }\n#dsh-partner-identity-editor .dsh-partner-field :is(input, textarea):focus {\n border-color: var(--partner-focus-ring);\n background: var(--partner-raised);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent);\n}\n#dsh-partner-identity-editor .dsh-partner-form-actions { flex-wrap: wrap; gap: 12px; }\n#dsh-partner-identity-editor .dsh-partner-form-actions > button {\n min-height: 40px;\n padding: 0 16px;\n border: 1px solid var(--partner-border);\n border-radius: 10px;\n color: var(--partner-on-accent);\n background: var(--partner-accent-strong);\n box-shadow: none;\n font: 600 var(--partner-font-body)/1.4 var(--partner-font-family);\n}\n#dsh-partner-identity-editor .dsh-partner-form-actions > button:hover:not(:disabled) { filter: brightness(.94); }\n#dsh-partner-identity-editor .dsh-partner-identity-danger { flex-wrap: wrap; }\n#dsh-partner-identity-editor .dsh-partner-identity-danger > span { flex: 1 1 250px; }\n#dsh-partner-identity-editor .dsh-partner-identity-danger > div { display: flex; flex-wrap: wrap; gap: 8px; }\n#dsh-partner-identity-editor .dsh-partner-identity-danger button {\n min-height: 36px;\n padding: 6px 12px;\n border: 1px solid color-mix(in srgb, var(--partner-danger) 24%, transparent);\n border-radius: 8px;\n color: var(--partner-danger);\n background: transparent;\n box-shadow: none;\n font: var(--partner-font-caption)/1.4 var(--partner-font-family);\n}\n#dsh-partner-identity-editor button:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 3px; }\n#dsh-partner-identity-editor :is(input, textarea, button):disabled { opacity: .55; cursor: default; }\n@media (max-width: 640px) {\n #dsh-partner-identity-editor .dsh-partner-identity-card { padding: 14px; }\n #dsh-partner-identity-editor .dsh-partner-fields.two { grid-template-columns: minmax(0, 1fr); }\n}\n@media (forced-colors: active) {\n #dsh-partner-identity-editor .dsh-partner-field :is(input, textarea):focus { outline: 2px solid Highlight; }\n}\n", "/* Deliberate, local boundary against host themes with global !important form rules.\n Keep layout responsive and use the plugin's light/dark material tokens. */\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-delivery-settings { display: grid; gap: 10px; }\n.dsh-partner-workspace #dsh-partner-channels :is(.dsh-partner-delivery-hint, .dsh-partner-delivery-empty) { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-delivery-contact { padding: 0; border: 1px solid var(--partner-border); border-radius: 10px; background: var(--partner-control); }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-delivery-contact > summary { padding: 12px; cursor: pointer; color: var(--partner-text); }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-delivery-contact > summary > span { display: inline-flex; flex-wrap: wrap; gap: 4px 10px; align-items: baseline; vertical-align: middle; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-delivery-contact small { color: var(--partner-text-secondary); }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-delivery-form { display: grid; grid-template-columns: minmax(0, 1fr); align-items: start; gap: 16px; margin: 0; padding: 0; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-delivery-form > p:not([role=\"alert\"]) { color: var(--partner-text-secondary); background: transparent; padding: 0; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-delivery-form > p { grid-column: 1 / -1; margin: 0; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-workspace-dialog:has(.dsh-partner-delivery-form) { width: min(560px, 100%); height: auto; align-self: center; max-height: calc(100% - 24px); border-radius: 16px !important; }\n.dsh-partner-workspace #dsh-partner-identity-editor.dsh-partner-form,\n.dsh-partner-workspace #dsh-partner-channels.dsh-partner-form {\n background: transparent !important;\n background-image: none !important;\n border: 0 !important;\n box-shadow: none !important;\n font-family: var(--partner-font-family) !important;\n color: var(--partner-text) !important;\n}\n.dsh-partner-workspace #dsh-partner-identity-editor .dsh-partner-identity-card {\n background: var(--partner-card-surface) !important;\n border: 1px solid var(--partner-border) !important;\n border-radius: 15px !important;\n box-shadow: var(--partner-card-shadow) !important;\n}\n.dsh-partner-workspace #dsh-partner-identity-editor .dsh-partner-field :is(input, textarea),\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-channel-field > :is(input, select) {\n appearance: none !important;\n box-sizing: border-box;\n min-width: 0;\n width: 100%;\n min-height: 40px;\n padding: 10px 12px !important;\n color: var(--partner-text) !important;\n background-color: var(--partner-control) !important;\n border: 1px solid var(--partner-border) !important;\n border-radius: 10px !important;\n box-shadow: inset 0 1px 0 var(--partner-glass-highlight) !important;\n font: var(--partner-font-label)/1.5 var(--partner-font-family) !important;\n}\n.dsh-partner-workspace #dsh-partner-identity-editor .dsh-partner-field :is(input, textarea),\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-channel-field > input { background-image: none !important; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-channel-field > select {\n padding-right: 36px !important;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath d='m4 6 4 4 4-4' fill='none' stroke='%23909095' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\") !important;\n background-repeat: no-repeat !important;\n background-position: right 12px center !important;\n}\n.dsh-partner-workspace #dsh-partner-identity-editor button,\n.dsh-partner-workspace #dsh-partner-channels button {\n appearance: none !important;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n min-height: 40px;\n padding: 8px 14px !important;\n border: 1px solid var(--partner-border) !important;\n border-radius: 10px !important;\n color: var(--partner-text) !important;\n background: var(--partner-control) !important;\n box-shadow: none !important;\n font: 600 var(--partner-font-body)/1.4 var(--partner-font-family) !important;\n cursor: pointer;\n}\n.dsh-partner-workspace #dsh-partner-identity-editor .dsh-partner-form-actions > button,\n.dsh-partner-workspace #dsh-partner-channels button.is-primary {\n color: var(--partner-on-accent) !important;\n background: var(--partner-accent-strong) !important;\n}\n.dsh-partner-workspace #dsh-partner-identity-editor .dsh-partner-identity-danger button:not(.is-secondary) {\n color: var(--partner-danger) !important;\n border-color: color-mix(in srgb, var(--partner-danger) 30%, transparent) !important;\n}\n.dsh-partner-workspace #dsh-partner-identity-editor .dsh-partner-identity-danger button.is-danger {\n background: var(--partner-danger) !important;\n color: var(--partner-on-accent) !important;\n}\n.dsh-partner-workspace #dsh-partner-identity-editor button:hover:not(:disabled),\n.dsh-partner-workspace #dsh-partner-channels button:hover:not(:disabled) { filter: brightness(.94); }\n.dsh-partner-workspace #dsh-partner-identity-editor :is(input, textarea, button):focus-visible,\n.dsh-partner-workspace #dsh-partner-channels :is(input, select, button, summary):focus-visible {\n outline: 2px solid var(--partner-focus-ring) !important;\n outline-offset: 2px;\n}\n.dsh-partner-workspace #dsh-partner-identity-editor :disabled,\n.dsh-partner-workspace #dsh-partner-channels :disabled { opacity: .55; cursor: not-allowed; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-workspace-dialog {\n background: var(--partner-solid-panel) !important;\n color: var(--partner-text) !important;\n border: 1px solid var(--partner-border) !important;\n border-radius: 16px !important;\n font-family: var(--partner-font-family) !important;\n box-shadow: 0 22px 58px color-mix(in srgb, #000 18%, transparent), 0 4px 14px color-mix(in srgb, #000 8%, transparent), inset 0 1px 0 var(--partner-card-highlight) !important;\n}\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-workspace-dialog > header {\n background: var(--partner-solid-raised) !important;\n color: var(--partner-text) !important;\n}\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-workspace-dialog > header button {\n width: 32px; min-height: 32px; padding: 0 !important;\n background: transparent !important; border-color: transparent !important;\n}\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-channel-form {\n background: transparent !important; box-shadow: none !important; border: 0 !important;\n color: var(--partner-text) !important;\n font: var(--partner-font-body)/1.5 var(--partner-font-family) !important;\n}\n@media (max-width: 640px) {\n .dsh-partner-workspace #dsh-partner-channels button,\n .dsh-partner-workspace #dsh-partner-identity-editor button { min-height: 44px; }\n .dsh-partner-workspace #dsh-partner-channels .dsh-partner-workspace-dialog { border-radius: 0 !important; border-width: 0 !important; }\n .dsh-partner-workspace #dsh-partner-channels .dsh-partner-channel-toolbar { align-items: flex-start; flex-wrap: wrap; }\n}\n\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-notification-choices { display: grid; gap: 16px; min-width: 0; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-notification-channel { margin: 0; padding: 8px 16px; min-width: 0; border: 1px solid var(--partner-border); border-radius: 12px; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-notification-channel label { display: flex; align-items: center; gap: 12px; min-height: 44px; cursor: pointer; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-notification-channel input[type=\"checkbox\"] { appearance: auto !important; width: 18px !important; height: 18px !important; min-height: 0 !important; flex: 0 0 18px; padding: 0 !important; margin: 0 !important; box-shadow: none !important; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-notification-users { display: grid; gap: 8px; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-notification-users span { min-width: 0; overflow-wrap: anywhere; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-notification-users small { display: block; color: var(--partner-text-secondary); }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-channel-row.has-notice-slot { display: grid; grid-template-columns: minmax(0,1fr) auto auto; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-channel-inline-notice { grid-column: 1 / -1; min-width: 0; padding-top: 12px; border-top: 1px solid var(--partner-border); color: var(--partner-text); font-size: var(--partner-font-body); line-height: 1.6; overflow-wrap: anywhere; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-channel-inline-notice strong { font-weight: 600; }\n.dsh-partner-workspace #dsh-partner-channels .dsh-partner-channel-inline-notice p { margin: 4px 0 0; color: var(--partner-text-secondary); }\n", "import { useState, type FormEvent } from 'react'\nimport { IconPlusOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { WorkspaceDialog, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nexport interface NewCompanionDraft {\n name: string\n role: string\n description: string\n instructions: string\n}\n\nexport function CompanionCreateDialog({ close, create }: { close(): void; create(value: NewCompanionDraft): Promise<void> }): JSX.Element {\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault()\n const data = new FormData(event.currentTarget)\n setBusy(true); setError(undefined)\n try {\n await create({\n name: String(data.get('name') ?? '').trim(),\n role: String(data.get('role') ?? '').trim(),\n description: String(data.get('description') ?? '').trim(),\n instructions: String(data.get('instructions') ?? '').trim(),\n })\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <WorkspaceDialog title=\"\u65B0\u5EFA\u4F19\u4F34\" detail=\"\u5148\u5EFA\u7ACB\u6E05\u6670\u7684\u8EAB\u4EFD\u548C\u804C\u8D23\u3002\u6A21\u578B\u3001\u5DE5\u5177\u3001Skill \u4E0E\u534F\u4F5C\u6743\u9650\u4F1A\u5728\u521B\u5EFA\u540E\u5355\u72EC\u914D\u7F6E\u3002\" close={close} width=\"wide\">\n <form className=\"dsh-partner-feature-form dsh-partner-companion-create-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}>\n <label><span>\u4F19\u4F34\u540D\u5B57</span><input name=\"name\" required maxLength={60} autoFocus placeholder=\"\u4F8B\u5982\uFF1A\u5C0F\u9ED1\" /></label>\n <label><span>\u4E3B\u8981\u89D2\u8272</span><input name=\"role\" required maxLength={120} placeholder=\"\u4F8B\u5982\uFF1A\u4EA7\u54C1\u4E0E\u5DE5\u7A0B\u534F\u4F5C\u4F19\u4F34\" /></label>\n <label className=\"is-wide\"><span>\u4E00\u53E5\u8BDD\u5B9A\u4F4D</span><input name=\"description\" maxLength={500} placeholder=\"\u5B83\u4E3B\u8981\u8D1F\u8D23\u4EC0\u4E48\uFF0C\u4EC0\u4E48\u65F6\u5019\u5E94\u8BE5\u627E\u5B83\" /></label>\n <label className=\"is-wide\"><span>\u521D\u59CB\u884C\u4E3A\u51C6\u5219</span><textarea name=\"instructions\" maxLength={12000} rows={7} placeholder=\"\u5199\u6E05\u804C\u8D23\u3001\u8868\u8FBE\u65B9\u5F0F\u3001\u5DE5\u4F5C\u8FB9\u754C\u548C\u4EA4\u4ED8\u6807\u51C6\uFF1B\u4E5F\u53EF\u4EE5\u521B\u5EFA\u540E\u518D\u5B8C\u5584\" /></label>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u6B63\u5728\u521B\u5EFA\u2026' : '\u521B\u5EFA\u4F19\u4F34'}</button></footer>\n </form>\n </WorkspaceDialog>\n}\n", "import { useEffect } from 'react'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\n\n/** Keep host-version differences at the navigation boundary, not in pages. */\nexport function registerMainPanel(\n ctx: Context,\n id: string,\n priority: number,\n render: (props: PropsRuntime<'conversation'>) => JSX.Element,\n onHidden: () => void = () => {},\n): () => void {\n const layout = ctx.layout as unknown as { selectPanel?: (id: string | null) => void }\n if (typeof layout.selectPanel !== 'function') {\n return ctx.slots.register({ name: 'conversation', priority }, render)\n }\n // 0.1.5 moves global panels from the session-scoped conversation seat to\n // root-scoped keyed main entries. This cast is confined to the version bridge.\n const slots = ctx.slots as unknown as {\n register(options: { name: 'main'; key: string }, component: typeof render): () => void\n }\n let disposed = false\n let generation = 0\n const Body = (props: PropsRuntime<'conversation'>): JSX.Element => {\n useEffect(() => {\n const current = ++generation\n return () => {\n // Ignore StrictMode's effect replay and our own explicit removal.\n queueMicrotask(() => { if (!disposed && generation === current) onHidden() })\n }\n }, [])\n return render(props)\n }\n const remove = slots.register({ name: 'main', key: id }, Body)\n const dispose = (): void => { if (disposed) return; disposed = true; remove() }\n try { layout.selectPanel(id) } catch (error) { dispose(); throw error }\n // The host retains registered keys and resets only a removed active key;\n // never select null here, which could close another plugin's newer panel.\n return dispose\n}\n", "import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type { ISessions } from '@deepseek-ai/dsh-api-session-controller/client'\nimport type { SessionId } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport { api } from './client-api.js'\nimport { registerMainPanel } from './main-panel-compat.js'\nimport { activatePluginWorkspace } from './workspace-ownership.js'\n\nexport interface PartnerDestination { page: 'home' | 'board' | 'schedules'; taskId?: string }\nexport interface PartnerController {\n open(companionId?: string, destination?: PartnerDestination): void\n destination(): PartnerDestination | undefined\n close(): void\n toggle(): void\n isOpen(): boolean\n selected(): string | undefined\n openSession(routeId: string, sessionId: string): Promise<void>\n startSession(companionId: string): Promise<void>\n renewSession(routeId: string): Promise<void>\n subscribe(listener: () => void): () => void\n}\n\nexport function createPartnerController(ctx: ClientContext, pluginId: string, render: (props: PropsRuntime<'conversation'>, controller: PartnerController) => JSX.Element): PartnerController {\n const listeners = new Set<() => void>()\n let selected: string | undefined\n let destination: PartnerDestination | undefined\n let dispose: (() => void) | undefined\n const notify = (): void => { for (const listener of listeners) listener() }\n const controller: PartnerController = {\n open(companionId, target) {\n destination = target ?? { page: 'home' }\n if (companionId !== undefined) selected = companionId\n if (dispose === undefined) {\n activatePluginWorkspace(pluginId)\n dispose = registerMainPanel(ctx, pluginId, -3, props => render(props, controller), () => controller.close())\n }\n notify()\n },\n close() { const current = dispose; dispose = undefined; current?.(); notify() },\n toggle() { if (dispose === undefined) controller.open(); else controller.close() },\n isOpen: () => dispose !== undefined,\n selected: () => selected,\n destination: () => destination,\n async openSession(routeId, sessionId) {\n const prepared = await api<{ sessionId: string }>(`/sessions/${encodeURIComponent(routeId)}/prepare`, { method: 'POST' })\n if (prepared.sessionId !== sessionId) throw new Error('\u4F19\u4F34\u4F1A\u8BDD\u6807\u8BC6\u4E0D\u4E00\u81F4')\n await waitForClientSession(ctx, sessionId)\n controller.close()\n sessions(ctx).open(sessionId as SessionId)\n },\n async startSession(companionId) {\n const created = await api<{ routeId: string; sessionId: string }>(`/companions/${encodeURIComponent(companionId)}/session`, { method: 'POST' })\n await waitForClientSession(ctx, created.sessionId)\n controller.close()\n sessions(ctx).open(created.sessionId as SessionId)\n },\n async renewSession(routeId) {\n const renewed = await api<{ routeId: string; sessionId: string }>(`/sessions/${encodeURIComponent(routeId)}/renew`, { method: 'POST' })\n await waitForClientSession(ctx, renewed.sessionId)\n controller.close()\n sessions(ctx).open(renewed.sessionId as SessionId)\n },\n subscribe(listener) { listeners.add(listener); return () => listeners.delete(listener) },\n }\n return controller\n}\n\nfunction waitForClientSession(ctx: ClientContext, sessionId: string): Promise<void> {\n const id = sessionId as SessionId\n const clientSessions = sessions(ctx)\n if (clientSessions.list.getSnapshot().byId[id] !== undefined) return Promise.resolve()\n return new Promise((resolve, reject) => {\n let stop = (): void => {}\n const timeout = window.setTimeout(() => { stop(); reject(new Error('\u4F19\u4F34\u4F1A\u8BDD\u5C1A\u672A\u540C\u6B65\u5230\u7F51\u9875\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5')) }, 5_000)\n stop = clientSessions.list.subscribe(() => {\n if (clientSessions.list.getSnapshot().byId[id] === undefined) return\n window.clearTimeout(timeout); stop(); resolve()\n })\n })\n}\n\nfunction sessions(ctx: ClientContext): ISessions { return ctx.sessions as unknown as ISessions }\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,iBAAyD;;;ACAzD,IAAM,2BAA2B;AAO1B,SAAS,wBAAwB,UAAwB;AAC9D,SAAO,cAAc,IAAI,YAAqC,0BAA0B;AAAA,IACtF,QAAQ,EAAE,SAAS;AAAA,EACrB,CAAC,CAAC;AACJ;AAGO,SAAS,uBAAuB,UAAkB,OAA+B;AACtF,QAAM,aAAa,CAAC,UAAuB;AACzC,UAAM,SAAU,MAA+C;AAC/D,QAAI,QAAQ,aAAa,SAAU,OAAM;AAAA,EAC3C;AACA,SAAO,iBAAiB,0BAA0B,UAAU;AAC5D,SAAO,MAAM,OAAO,oBAAoB,0BAA0B,UAAU;AAC9E;;;ADZA,IAAAC,oCAIO;;;AEiBP,mBAAkB;AA9BlB,IAAIC,aAAY,OAAO;AACvB,IAAI,sBAAsB,OAAO;AACjC,IAAIC,gBAAe,OAAO,UAAU;AACpC,IAAI,eAAe,OAAO,UAAU;AACpC,IAAI,kBAAkB,CAAC,KAAK,KAAK,UAAU,OAAO,MAAMD,WAAU,KAAK,KAAK,EAAE,YAAY,MAAM,cAAc,MAAM,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI,GAAG,IAAI;AAC1J,IAAI,iBAAiB,CAAC,GAAG,MAAM;AAC7B,WAAS,QAAQ,MAAM,IAAI,CAAC;AAC1B,QAAIC,cAAa,KAAK,GAAG,IAAI;AAC3B,sBAAgB,GAAG,MAAM,EAAE,IAAI,CAAC;AACpC,MAAI;AACF,aAAS,QAAQ,oBAAoB,CAAC,GAAG;AACvC,UAAI,aAAa,KAAK,GAAG,IAAI;AAC3B,wBAAgB,GAAG,MAAM,EAAE,IAAI,CAAC;AAAA,IACpC;AACF,SAAO;AACT;AACA,IAAI,YAAY,CAAC,QAAQ,YAAY;AACnC,MAAI,SAAS,CAAC;AACd,WAAS,QAAQ;AACf,QAAIA,cAAa,KAAK,QAAQ,IAAI,KAAK,QAAQ,QAAQ,IAAI,IAAI;AAC7D,aAAO,IAAI,IAAI,OAAO,IAAI;AAC9B,MAAI,UAAU,QAAQ;AACpB,aAAS,QAAQ,oBAAoB,MAAM,GAAG;AAC5C,UAAI,QAAQ,QAAQ,IAAI,IAAI,KAAK,aAAa,KAAK,QAAQ,IAAI;AAC7D,eAAO,IAAI,IAAI,OAAO,IAAI;AAAA,IAC9B;AACF,SAAO;AACT;AAWA,IAAI;AAAA,CACH,CAAC,eAAe;AACf,QAAM,UAAU,MAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM5B,YAAY,SAAS,sBAAsB,eAAe,KAAK;AAC7D,WAAK,UAAU;AACf,WAAK,uBAAuB;AAG5B,WAAK,UAAU,CAAC;AAEhB,WAAK,aAAa,CAAC;AACnB,UAAI,UAAUA,SAAQ,eAAe,UAAUA,SAAQ;AACrD,cAAM,IAAI,WAAW,4BAA4B;AACnD,UAAI,MAAM,MAAM,MAAM;AACpB,cAAM,IAAI,WAAW,yBAAyB;AAChD,WAAK,OAAO,UAAU,IAAI;AAC1B,UAAI,MAAM,CAAC;AACX,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM;AAC7B,YAAI,KAAK,KAAK;AAChB,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,aAAK,QAAQ,KAAK,IAAI,MAAM,CAAC;AAC7B,aAAK,WAAW,KAAK,IAAI,MAAM,CAAC;AAAA,MAClC;AACA,WAAK,qBAAqB;AAC1B,YAAM,eAAe,KAAK,oBAAoB,aAAa;AAC3D,WAAK,cAAc,YAAY;AAC/B,UAAI,OAAO,IAAI;AACb,YAAI,aAAa;AACjB,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,eAAK,UAAU,CAAC;AAChB,eAAK,eAAe,CAAC;AACrB,gBAAM,UAAU,KAAK,gBAAgB;AACrC,cAAI,UAAU,YAAY;AACxB,kBAAM;AACN,yBAAa;AAAA,UACf;AACA,eAAK,UAAU,CAAC;AAAA,QAClB;AAAA,MACF;AACA,aAAO,KAAK,OAAO,OAAO,CAAC;AAC3B,WAAK,OAAO;AACZ,WAAK,UAAU,GAAG;AAClB,WAAK,eAAe,GAAG;AACvB,WAAK,aAAa,CAAC;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,OAAO,WAAW,MAAM,KAAK;AAC3B,YAAM,OAAO,WAAW,UAAU,aAAa,IAAI;AACnD,aAAOA,SAAQ,eAAe,MAAM,GAAG;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,aAAa,MAAM,KAAK;AAC7B,YAAM,MAAM,WAAW,UAAU,UAAU,IAAI;AAC/C,aAAOA,SAAQ,eAAe,CAAC,GAAG,GAAG,GAAG;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,OAAO,eAAe,MAAM,KAAK,aAAa,GAAG,aAAa,IAAI,OAAO,IAAI,WAAW,MAAM;AAC5F,UAAI,EAAEA,SAAQ,eAAe,cAAc,cAAc,cAAc,cAAcA,SAAQ,gBAAgB,OAAO,MAAM,OAAO;AAC/H,cAAM,IAAI,WAAW,eAAe;AACtC,UAAI;AACJ,UAAI;AACJ,WAAK,UAAU,cAAc,WAAW;AACtC,cAAM,oBAAoBA,SAAQ,oBAAoB,SAAS,GAAG,IAAI;AACtE,cAAM,WAAW,UAAU,aAAa,MAAM,OAAO;AACrD,YAAI,YAAY,mBAAmB;AACjC,yBAAe;AACf;AAAA,QACF;AACA,YAAI,WAAW;AACb,gBAAM,IAAI,WAAW,eAAe;AAAA,MACxC;AACA,iBAAW,UAAU,CAACA,SAAQ,IAAI,QAAQA,SAAQ,IAAI,UAAUA,SAAQ,IAAI,IAAI,GAAG;AACjF,YAAI,YAAY,gBAAgBA,SAAQ,oBAAoB,SAAS,MAAM,IAAI;AAC7E,gBAAM;AAAA,MACV;AACA,UAAI,KAAK,CAAC;AACV,iBAAW,OAAO,MAAM;AACtB,mBAAW,IAAI,KAAK,UAAU,GAAG,EAAE;AACnC,mBAAW,IAAI,UAAU,IAAI,KAAK,iBAAiB,OAAO,GAAG,EAAE;AAC/D,mBAAW,KAAK,IAAI,QAAQ;AAC1B,aAAG,KAAK,CAAC;AAAA,MACb;AACA,aAAO,GAAG,UAAU,YAAY;AAChC,YAAM,mBAAmBA,SAAQ,oBAAoB,SAAS,GAAG,IAAI;AACrE,aAAO,GAAG,UAAU,gBAAgB;AACpC,iBAAW,GAAG,KAAK,IAAI,GAAG,mBAAmB,GAAG,MAAM,GAAG,EAAE;AAC3D,iBAAW,IAAI,IAAI,GAAG,SAAS,KAAK,GAAG,EAAE;AACzC,aAAO,GAAG,SAAS,KAAK,CAAC;AACzB,eAAS,UAAU,KAAK,GAAG,SAAS,kBAAkB,WAAW,MAAM;AACrE,mBAAW,SAAS,GAAG,EAAE;AAC3B,UAAI,gBAAgB,CAAC;AACrB,aAAO,cAAc,SAAS,IAAI,GAAG;AACnC,sBAAc,KAAK,CAAC;AACtB,SAAG,QAAQ,CAAC,GAAG,MAAM,cAAc,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE;AAC/D,aAAO,IAAIA,SAAQ,SAAS,KAAK,eAAe,IAAI;AAAA,IACtD;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,UAAU,GAAG,GAAG;AACd,aAAO,KAAK,KAAK,IAAI,KAAK,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC;AAAA,IAChF;AAAA;AAAA,IAEA,aAAa;AACX,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA,IAGA,uBAAuB;AACrB,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,aAAK,kBAAkB,GAAG,GAAG,IAAI,KAAK,CAAC;AACvC,aAAK,kBAAkB,GAAG,GAAG,IAAI,KAAK,CAAC;AAAA,MACzC;AACA,WAAK,kBAAkB,GAAG,CAAC;AAC3B,WAAK,kBAAkB,KAAK,OAAO,GAAG,CAAC;AACvC,WAAK,kBAAkB,GAAG,KAAK,OAAO,CAAC;AACvC,YAAM,cAAc,KAAK,6BAA6B;AACtD,YAAM,WAAW,YAAY;AAC7B,eAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,iBAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,cAAI,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,WAAW,KAAK,KAAK,WAAW,KAAK,KAAK;AACjF,iBAAK,qBAAqB,YAAY,CAAC,GAAG,YAAY,CAAC,CAAC;AAAA,QAC5D;AAAA,MACF;AACA,WAAK,eAAe,CAAC;AACrB,WAAK,YAAY;AAAA,IACnB;AAAA;AAAA;AAAA,IAGA,eAAe,MAAM;AACnB,YAAM,OAAO,KAAK,qBAAqB,cAAc,IAAI;AACzD,UAAI,MAAM;AACV,eAAS,IAAI,GAAG,IAAI,IAAI;AACtB,cAAM,OAAO,KAAK,QAAQ,KAAK;AACjC,YAAM,QAAQ,QAAQ,KAAK,OAAO;AAClC,aAAO,SAAS,MAAM,CAAC;AACvB,eAAS,IAAI,GAAG,KAAK,GAAG;AACtB,aAAK,kBAAkB,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC;AAC9C,WAAK,kBAAkB,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC;AAC5C,WAAK,kBAAkB,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC;AAC5C,WAAK,kBAAkB,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC;AAC5C,eAAS,IAAI,GAAG,IAAI,IAAI;AACtB,aAAK,kBAAkB,KAAK,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC;AACnD,eAAS,IAAI,GAAG,IAAI,GAAG;AACrB,aAAK,kBAAkB,KAAK,OAAO,IAAI,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC;AAC9D,eAAS,IAAI,GAAG,IAAI,IAAI;AACtB,aAAK,kBAAkB,GAAG,KAAK,OAAO,KAAK,GAAG,OAAO,MAAM,CAAC,CAAC;AAC/D,WAAK,kBAAkB,GAAG,KAAK,OAAO,GAAG,IAAI;AAAA,IAC/C;AAAA;AAAA;AAAA,IAGA,cAAc;AACZ,UAAI,KAAK,UAAU;AACjB;AACF,UAAI,MAAM,KAAK;AACf,eAAS,IAAI,GAAG,IAAI,IAAI;AACtB,cAAM,OAAO,KAAK,QAAQ,MAAM;AAClC,YAAM,OAAO,KAAK,WAAW,KAAK;AAClC,aAAO,SAAS,MAAM,CAAC;AACvB,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,QAAQ,OAAO,MAAM,CAAC;AAC5B,cAAM,IAAI,KAAK,OAAO,KAAK,IAAI;AAC/B,cAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAC1B,aAAK,kBAAkB,GAAG,GAAG,KAAK;AAClC,aAAK,kBAAkB,GAAG,GAAG,KAAK;AAAA,MACpC;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,kBAAkB,GAAG,GAAG;AACtB,eAAS,KAAK,IAAI,MAAM,GAAG,MAAM;AAC/B,iBAAS,KAAK,IAAI,MAAM,GAAG,MAAM;AAC/B,gBAAM,OAAO,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;AAChD,gBAAM,KAAK,IAAI;AACf,gBAAM,KAAK,IAAI;AACf,cAAI,KAAK,MAAM,KAAK,KAAK,QAAQ,KAAK,MAAM,KAAK,KAAK;AACpD,iBAAK,kBAAkB,IAAI,IAAI,QAAQ,KAAK,QAAQ,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,qBAAqB,GAAG,GAAG;AACzB,eAAS,KAAK,IAAI,MAAM,GAAG,MAAM;AAC/B,iBAAS,KAAK,IAAI,MAAM,GAAG;AACzB,eAAK,kBAAkB,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC;AAAA,MACpF;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,kBAAkB,GAAG,GAAG,QAAQ;AAC9B,WAAK,QAAQ,CAAC,EAAE,CAAC,IAAI;AACrB,WAAK,WAAW,CAAC,EAAE,CAAC,IAAI;AAAA,IAC1B;AAAA;AAAA;AAAA;AAAA,IAIA,oBAAoB,MAAM;AACxB,YAAM,MAAM,KAAK;AACjB,YAAM,MAAM,KAAK;AACjB,UAAI,KAAK,UAAUA,SAAQ,oBAAoB,KAAK,GAAG;AACrD,cAAM,IAAI,WAAW,kBAAkB;AACzC,YAAM,YAAYA,SAAQ,4BAA4B,IAAI,OAAO,EAAE,GAAG;AACtE,YAAM,cAAcA,SAAQ,wBAAwB,IAAI,OAAO,EAAE,GAAG;AACpE,YAAM,eAAe,KAAK,MAAMA,SAAQ,qBAAqB,GAAG,IAAI,CAAC;AACrE,YAAM,iBAAiB,YAAY,eAAe;AAClD,YAAM,gBAAgB,KAAK,MAAM,eAAe,SAAS;AACzD,UAAI,SAAS,CAAC;AACd,YAAM,QAAQA,SAAQ,0BAA0B,WAAW;AAC3D,eAAS,IAAI,GAAG,IAAI,GAAG,IAAI,WAAW,KAAK;AACzC,YAAI,MAAM,KAAK,MAAM,GAAG,IAAI,gBAAgB,eAAe,IAAI,iBAAiB,IAAI,EAAE;AACtF,aAAK,IAAI;AACT,cAAM,MAAMA,SAAQ,4BAA4B,KAAK,KAAK;AAC1D,YAAI,IAAI;AACN,cAAI,KAAK,CAAC;AACZ,eAAO,KAAK,IAAI,OAAO,GAAG,CAAC;AAAA,MAC7B;AACA,UAAI,SAAS,CAAC;AACd,eAAS,IAAI,GAAG,IAAI,OAAO,CAAC,EAAE,QAAQ,KAAK;AACzC,eAAO,QAAQ,CAAC,OAAO,MAAM;AAC3B,cAAI,KAAK,gBAAgB,eAAe,KAAK;AAC3C,mBAAO,KAAK,MAAM,CAAC,CAAC;AAAA,QACxB,CAAC;AAAA,MACH;AACA,aAAO,OAAO,UAAU,YAAY;AACpC,aAAO;AAAA,IACT;AAAA;AAAA;AAAA,IAGA,cAAc,MAAM;AAClB,UAAI,KAAK,UAAU,KAAK,MAAMA,SAAQ,qBAAqB,KAAK,OAAO,IAAI,CAAC;AAC1E,cAAM,IAAI,WAAW,kBAAkB;AACzC,UAAI,IAAI;AACR,eAAS,QAAQ,KAAK,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG;AACtD,YAAI,SAAS;AACX,kBAAQ;AACV,iBAAS,OAAO,GAAG,OAAO,KAAK,MAAM,QAAQ;AAC3C,mBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,kBAAM,IAAI,QAAQ;AAClB,kBAAM,UAAU,QAAQ,IAAI,MAAM;AAClC,kBAAM,IAAI,SAAS,KAAK,OAAO,IAAI,OAAO;AAC1C,gBAAI,CAAC,KAAK,WAAW,CAAC,EAAE,CAAC,KAAK,IAAI,KAAK,SAAS,GAAG;AACjD,mBAAK,QAAQ,CAAC,EAAE,CAAC,IAAI,OAAO,KAAK,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE;AACtD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO,KAAK,KAAK,SAAS,CAAC;AAAA,IAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,UAAU,MAAM;AACd,UAAI,OAAO,KAAK,OAAO;AACrB,cAAM,IAAI,WAAW,yBAAyB;AAChD,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,iBAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,cAAI;AACJ,kBAAQ,MAAM;AAAA,YACZ,KAAK;AACH,wBAAU,IAAI,KAAK,KAAK;AACxB;AAAA,YACF,KAAK;AACH,uBAAS,IAAI,KAAK;AAClB;AAAA,YACF,KAAK;AACH,uBAAS,IAAI,KAAK;AAClB;AAAA,YACF,KAAK;AACH,wBAAU,IAAI,KAAK,KAAK;AACxB;AAAA,YACF,KAAK;AACH,wBAAU,KAAK,MAAM,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK;AACxD;AAAA,YACF,KAAK;AACH,uBAAS,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK;AAClC;AAAA,YACF,KAAK;AACH,wBAAU,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK;AACxC;AAAA,YACF,KAAK;AACH,yBAAW,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;AAC1C;AAAA,YACF;AACE,oBAAM,IAAI,MAAM,aAAa;AAAA,UACjC;AACA,cAAI,CAAC,KAAK,WAAW,CAAC,EAAE,CAAC,KAAK;AAC5B,iBAAK,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,kBAAkB;AAChB,UAAI,SAAS;AACb,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,YAAI,WAAW;AACf,YAAI,OAAO;AACX,YAAI,aAAa,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACrC,iBAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,cAAI,KAAK,QAAQ,CAAC,EAAE,CAAC,KAAK,UAAU;AAClC;AACA,gBAAI,QAAQ;AACV,wBAAUA,SAAQ;AAAA,qBACX,OAAO;AACd;AAAA,UACJ,OAAO;AACL,iBAAK,wBAAwB,MAAM,UAAU;AAC7C,gBAAI,CAAC;AACH,wBAAU,KAAK,2BAA2B,UAAU,IAAIA,SAAQ;AAClE,uBAAW,KAAK,QAAQ,CAAC,EAAE,CAAC;AAC5B,mBAAO;AAAA,UACT;AAAA,QACF;AACA,kBAAU,KAAK,+BAA+B,UAAU,MAAM,UAAU,IAAIA,SAAQ;AAAA,MACtF;AACA,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,YAAI,WAAW;AACf,YAAI,OAAO;AACX,YAAI,aAAa,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACrC,iBAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,cAAI,KAAK,QAAQ,CAAC,EAAE,CAAC,KAAK,UAAU;AAClC;AACA,gBAAI,QAAQ;AACV,wBAAUA,SAAQ;AAAA,qBACX,OAAO;AACd;AAAA,UACJ,OAAO;AACL,iBAAK,wBAAwB,MAAM,UAAU;AAC7C,gBAAI,CAAC;AACH,wBAAU,KAAK,2BAA2B,UAAU,IAAIA,SAAQ;AAClE,uBAAW,KAAK,QAAQ,CAAC,EAAE,CAAC;AAC5B,mBAAO;AAAA,UACT;AAAA,QACF;AACA,kBAAU,KAAK,+BAA+B,UAAU,MAAM,UAAU,IAAIA,SAAQ;AAAA,MACtF;AACA,eAAS,IAAI,GAAG,IAAI,KAAK,OAAO,GAAG,KAAK;AACtC,iBAAS,IAAI,GAAG,IAAI,KAAK,OAAO,GAAG,KAAK;AACtC,gBAAM,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC;AAC/B,cAAI,SAAS,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC,KAAK,SAAS,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,KAAK,SAAS,KAAK,QAAQ,IAAI,CAAC,EAAE,IAAI,CAAC;AAC1G,sBAAUA,SAAQ;AAAA,QACtB;AAAA,MACF;AACA,UAAI,OAAO;AACX,iBAAW,OAAO,KAAK;AACrB,eAAO,IAAI,OAAO,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,IAAI,IAAI;AAC/D,YAAM,QAAQ,KAAK,OAAO,KAAK;AAC/B,YAAM,IAAI,KAAK,KAAK,KAAK,IAAI,OAAO,KAAK,QAAQ,EAAE,IAAI,KAAK,IAAI;AAChE,aAAO,KAAK,KAAK,KAAK,CAAC;AACvB,gBAAU,IAAIA,SAAQ;AACtB,aAAO,KAAK,UAAU,UAAU,OAAO;AACvC,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,+BAA+B;AAC7B,UAAI,KAAK,WAAW;AAClB,eAAO,CAAC;AAAA,WACL;AACH,cAAM,WAAW,KAAK,MAAM,KAAK,UAAU,CAAC,IAAI;AAChD,cAAM,OAAO,KAAK,WAAW,KAAK,KAAK,KAAK,MAAM,KAAK,UAAU,IAAI,MAAM,WAAW,IAAI,EAAE,IAAI;AAChG,YAAI,SAAS,CAAC,CAAC;AACf,iBAAS,MAAM,KAAK,OAAO,GAAG,OAAO,SAAS,UAAU,OAAO;AAC7D,iBAAO,OAAO,GAAG,GAAG,GAAG;AACzB,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAIA,OAAO,qBAAqB,KAAK;AAC/B,UAAI,MAAMA,SAAQ,eAAe,MAAMA,SAAQ;AAC7C,cAAM,IAAI,WAAW,6BAA6B;AACpD,UAAI,UAAU,KAAK,MAAM,OAAO,MAAM;AACtC,UAAI,OAAO,GAAG;AACZ,cAAM,WAAW,KAAK,MAAM,MAAM,CAAC,IAAI;AACvC,mBAAW,KAAK,WAAW,MAAM,WAAW;AAC5C,YAAI,OAAO;AACT,oBAAU;AAAA,MACd;AACA,aAAO,OAAO,UAAU,UAAU,KAAK;AACvC,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAIA,OAAO,oBAAoB,KAAK,KAAK;AACnC,aAAO,KAAK,MAAMA,SAAQ,qBAAqB,GAAG,IAAI,CAAC,IAAIA,SAAQ,wBAAwB,IAAI,OAAO,EAAE,GAAG,IAAIA,SAAQ,4BAA4B,IAAI,OAAO,EAAE,GAAG;AAAA,IACrK;AAAA;AAAA;AAAA,IAGA,OAAO,0BAA0B,QAAQ;AACvC,UAAI,SAAS,KAAK,SAAS;AACzB,cAAM,IAAI,WAAW,qBAAqB;AAC5C,UAAI,SAAS,CAAC;AACd,eAAS,IAAI,GAAG,IAAI,SAAS,GAAG;AAC9B,eAAO,KAAK,CAAC;AACf,aAAO,KAAK,CAAC;AACb,UAAI,OAAO;AACX,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,iBAAO,CAAC,IAAIA,SAAQ,oBAAoB,OAAO,CAAC,GAAG,IAAI;AACvD,cAAI,IAAI,IAAI,OAAO;AACjB,mBAAO,CAAC,KAAK,OAAO,IAAI,CAAC;AAAA,QAC7B;AACA,eAAOA,SAAQ,oBAAoB,MAAM,CAAC;AAAA,MAC5C;AACA,aAAO;AAAA,IACT;AAAA;AAAA,IAEA,OAAO,4BAA4B,MAAM,SAAS;AAChD,UAAI,SAAS,QAAQ,IAAI,CAAC,MAAM,CAAC;AACjC,iBAAW,KAAK,MAAM;AACpB,cAAM,SAAS,IAAI,OAAO,MAAM;AAChC,eAAO,KAAK,CAAC;AACb,gBAAQ,QAAQ,CAAC,MAAM,MAAM,OAAO,CAAC,KAAKA,SAAQ,oBAAoB,MAAM,MAAM,CAAC;AAAA,MACrF;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA,IAGA,OAAO,oBAAoB,GAAG,GAAG;AAC/B,UAAI,MAAM,KAAK,KAAK,MAAM,KAAK;AAC7B,cAAM,IAAI,WAAW,mBAAmB;AAC1C,UAAI,IAAI;AACR,eAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,YAAI,KAAK,KAAK,MAAM,KAAK;AACzB,cAAM,MAAM,IAAI,KAAK;AAAA,MACvB;AACA,aAAO,MAAM,KAAK,CAAC;AACnB,aAAO;AAAA,IACT;AAAA;AAAA;AAAA,IAGA,2BAA2B,YAAY;AACrC,YAAM,IAAI,WAAW,CAAC;AACtB,aAAO,KAAK,KAAK,OAAO,CAAC;AACzB,YAAM,OAAO,IAAI,KAAK,WAAW,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,IAAI,KAAK,WAAW,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK;AAC7G,cAAQ,QAAQ,WAAW,CAAC,KAAK,IAAI,KAAK,WAAW,CAAC,KAAK,IAAI,IAAI,MAAM,QAAQ,WAAW,CAAC,KAAK,IAAI,KAAK,WAAW,CAAC,KAAK,IAAI,IAAI;AAAA,IACtI;AAAA;AAAA,IAEA,+BAA+B,iBAAiB,kBAAkB,YAAY;AAC5E,UAAI,iBAAiB;AACnB,aAAK,wBAAwB,kBAAkB,UAAU;AACzD,2BAAmB;AAAA,MACrB;AACA,0BAAoB,KAAK;AACzB,WAAK,wBAAwB,kBAAkB,UAAU;AACzD,aAAO,KAAK,2BAA2B,UAAU;AAAA,IACnD;AAAA;AAAA,IAEA,wBAAwB,kBAAkB,YAAY;AACpD,UAAI,WAAW,CAAC,KAAK;AACnB,4BAAoB,KAAK;AAC3B,iBAAW,IAAI;AACf,iBAAW,QAAQ,gBAAgB;AAAA,IACrC;AAAA,EACF;AAGA,UAAQ,cAAc;AAEtB,UAAQ,cAAc;AAEtB,UAAQ,aAAa;AACrB,UAAQ,aAAa;AACrB,UAAQ,aAAa;AACrB,UAAQ,aAAa;AACrB,UAAQ,0BAA0B;AAAA;AAAA;AAAA,IAGhC,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,IAElK,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,IAEnK,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,IAEnK,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,EAErK;AACA,UAAQ,8BAA8B;AAAA;AAAA;AAAA,IAGpC,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,IAE5I,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,IAErJ,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,IAExJ,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,EAE3J;AACA,MAAI,SAAS;AACb,aAAW,SAAS;AACpB,WAAS,WAAW,KAAK,KAAK,IAAI;AAChC,QAAI,MAAM,KAAK,MAAM,MAAM,QAAQ,OAAO;AACxC,YAAM,IAAI,WAAW,oBAAoB;AAC3C,aAAS,IAAI,MAAM,GAAG,KAAK,GAAG;AAC5B,SAAG,KAAK,QAAQ,IAAI,CAAC;AAAA,EACzB;AACA,WAAS,OAAO,GAAG,GAAG;AACpB,YAAQ,MAAM,IAAI,MAAM;AAAA,EAC1B;AACA,WAAS,OAAO,MAAM;AACpB,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,iBAAiB;AAAA,EACrC;AACA,QAAM,aAAa,MAAMC,YAAW;AAAA;AAAA;AAAA;AAAA;AAAA,IAKlC,YAAY,MAAM,UAAU,SAAS;AACnC,WAAK,OAAO;AACZ,WAAK,WAAW;AAChB,WAAK,UAAU;AACf,UAAI,WAAW;AACb,cAAM,IAAI,WAAW,kBAAkB;AACzC,WAAK,UAAU,QAAQ,MAAM;AAAA,IAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,UAAU,MAAM;AACrB,UAAI,KAAK,CAAC;AACV,iBAAW,KAAK;AACd,mBAAW,GAAG,GAAG,EAAE;AACrB,aAAO,IAAIA,YAAWA,YAAW,KAAK,MAAM,KAAK,QAAQ,EAAE;AAAA,IAC7D;AAAA;AAAA,IAEA,OAAO,YAAY,QAAQ;AACzB,UAAI,CAACA,YAAW,UAAU,MAAM;AAC9B,cAAM,IAAI,WAAW,wCAAwC;AAC/D,UAAI,KAAK,CAAC;AACV,eAAS,IAAI,GAAG,IAAI,OAAO,UAAU;AACnC,cAAM,IAAI,KAAK,IAAI,OAAO,SAAS,GAAG,CAAC;AACvC,mBAAW,SAAS,OAAO,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE;AAClE,aAAK;AAAA,MACP;AACA,aAAO,IAAIA,YAAWA,YAAW,KAAK,SAAS,OAAO,QAAQ,EAAE;AAAA,IAClE;AAAA;AAAA;AAAA;AAAA,IAIA,OAAO,iBAAiB,MAAM;AAC5B,UAAI,CAACA,YAAW,eAAe,IAAI;AACjC,cAAM,IAAI,WAAW,6DAA6D;AACpF,UAAI,KAAK,CAAC;AACV,UAAI;AACJ,WAAK,IAAI,GAAG,IAAI,KAAK,KAAK,QAAQ,KAAK,GAAG;AACxC,YAAI,OAAOA,YAAW,qBAAqB,QAAQ,KAAK,OAAO,CAAC,CAAC,IAAI;AACrE,gBAAQA,YAAW,qBAAqB,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC;AAClE,mBAAW,MAAM,IAAI,EAAE;AAAA,MACzB;AACA,UAAI,IAAI,KAAK;AACX,mBAAWA,YAAW,qBAAqB,QAAQ,KAAK,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE;AAC3E,aAAO,IAAIA,YAAWA,YAAW,KAAK,cAAc,KAAK,QAAQ,EAAE;AAAA,IACrE;AAAA;AAAA;AAAA,IAGA,OAAO,aAAa,MAAM;AACxB,UAAI,QAAQ;AACV,eAAO,CAAC;AAAA,eACDA,YAAW,UAAU,IAAI;AAChC,eAAO,CAACA,YAAW,YAAY,IAAI,CAAC;AAAA,eAC7BA,YAAW,eAAe,IAAI;AACrC,eAAO,CAACA,YAAW,iBAAiB,IAAI,CAAC;AAAA;AAEzC,eAAO,CAACA,YAAW,UAAUA,YAAW,gBAAgB,IAAI,CAAC,CAAC;AAAA,IAClE;AAAA;AAAA;AAAA,IAGA,OAAO,QAAQ,WAAW;AACxB,UAAI,KAAK,CAAC;AACV,UAAI,YAAY;AACd,cAAM,IAAI,WAAW,mCAAmC;AAAA,eACjD,YAAY,KAAK;AACxB,mBAAW,WAAW,GAAG,EAAE;AAAA,eACpB,YAAY,KAAK,IAAI;AAC5B,mBAAW,GAAG,GAAG,EAAE;AACnB,mBAAW,WAAW,IAAI,EAAE;AAAA,MAC9B,WAAW,YAAY,KAAK;AAC1B,mBAAW,GAAG,GAAG,EAAE;AACnB,mBAAW,WAAW,IAAI,EAAE;AAAA,MAC9B;AACE,cAAM,IAAI,WAAW,mCAAmC;AAC1D,aAAO,IAAIA,YAAWA,YAAW,KAAK,KAAK,GAAG,EAAE;AAAA,IAClD;AAAA;AAAA;AAAA,IAGA,OAAO,UAAU,MAAM;AACrB,aAAOA,YAAW,cAAc,KAAK,IAAI;AAAA,IAC3C;AAAA;AAAA;AAAA;AAAA,IAIA,OAAO,eAAe,MAAM;AAC1B,aAAOA,YAAW,mBAAmB,KAAK,IAAI;AAAA,IAChD;AAAA;AAAA;AAAA,IAGA,UAAU;AACR,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC5B;AAAA;AAAA;AAAA,IAGA,OAAO,aAAa,MAAM,SAAS;AACjC,UAAI,SAAS;AACb,iBAAW,OAAO,MAAM;AACtB,cAAM,SAAS,IAAI,KAAK,iBAAiB,OAAO;AAChD,YAAI,IAAI,YAAY,KAAK;AACvB,iBAAO;AACT,kBAAU,IAAI,SAAS,IAAI,QAAQ;AAAA,MACrC;AACA,aAAO;AAAA,IACT;AAAA;AAAA,IAEA,OAAO,gBAAgB,KAAK;AAC1B,YAAM,UAAU,GAAG;AACnB,UAAI,SAAS,CAAC;AACd,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAI,IAAI,OAAO,CAAC,KAAK;AACnB,iBAAO,KAAK,IAAI,WAAW,CAAC,CAAC;AAAA,aAC1B;AACH,iBAAO,KAAK,SAAS,IAAI,UAAU,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACrD,eAAK;AAAA,QACP;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAGA,aAAW,gBAAgB;AAE3B,aAAW,qBAAqB;AAGhC,aAAW,uBAAuB;AAClC,MAAI,YAAY;AAChB,aAAW,YAAY;AACzB,GAAG,cAAc,YAAY,CAAC,EAAE;AAAA,CAC/B,CAAC,eAAe;AACf,MAAI;AACJ,GAAC,CAAC,YAAY;AACZ,UAAM,OAAO,MAAM,KAAK;AAAA;AAAA;AAAA,MAGtB,YAAY,SAAS,YAAY;AAC/B,aAAK,UAAU;AACf,aAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAEA,SAAK,MAAM,IAAI,KAAK,GAAG,CAAC;AAExB,SAAK,SAAS,IAAI,KAAK,GAAG,CAAC;AAE3B,SAAK,WAAW,IAAI,KAAK,GAAG,CAAC;AAE7B,SAAK,OAAO,IAAI,KAAK,GAAG,CAAC;AACzB,QAAI,MAAM;AACV,YAAQ,MAAM;AAAA,EAChB,GAAG,SAAS,WAAW,WAAW,WAAW,SAAS,CAAC,EAAE;AAC3D,GAAG,cAAc,YAAY,CAAC,EAAE;AAAA,CAC/B,CAAC,eAAe;AACf,MAAI;AACJ,GAAC,CAAC,eAAe;AACf,UAAM,QAAQ,MAAM,MAAM;AAAA;AAAA,MAExB,YAAY,UAAU,kBAAkB;AACtC,aAAK,WAAW;AAChB,aAAK,mBAAmB;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA,MAIA,iBAAiB,KAAK;AACpB,eAAO,KAAK,iBAAiB,KAAK,OAAO,MAAM,KAAK,EAAE,CAAC;AAAA,MACzD;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;AACzC,UAAM,eAAe,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;AAC7C,UAAM,OAAO,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;AACrC,UAAM,QAAQ,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;AACtC,UAAM,MAAM,IAAI,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AAClC,QAAI,OAAO;AACX,eAAW,OAAO;AAAA,EACpB,GAAG,YAAY,WAAW,cAAc,WAAW,YAAY,CAAC,EAAE;AACpE,GAAG,cAAc,YAAY,CAAC,EAAE;AAChC,IAAI,oBAAoB;AAQxB,IAAI,kBAAkB;AAAA,EACpB,GAAG,kBAAkB,OAAO,IAAI;AAAA,EAChC,GAAG,kBAAkB,OAAO,IAAI;AAAA,EAChC,GAAG,kBAAkB,OAAO,IAAI;AAAA,EAChC,GAAG,kBAAkB,OAAO,IAAI;AAClC;AACA,IAAI,eAAe;AACnB,IAAI,gBAAgB;AACpB,IAAI,kBAAkB;AACtB,IAAI,kBAAkB;AACtB,IAAI,wBAAwB;AAC5B,IAAI,qBAAqB;AACzB,IAAI,mBAAmB;AACvB,IAAI,sBAAsB;AAC1B,IAAI,oBAAoB;AACxB,SAAS,aAAa,SAAS,SAAS,GAAG;AACzC,QAAM,MAAM,CAAC;AACb,UAAQ,QAAQ,SAAS,KAAK,GAAG;AAC/B,QAAI,QAAQ;AACZ,QAAI,QAAQ,SAAS,MAAM,GAAG;AAC5B,UAAI,CAAC,QAAQ,UAAU,MAAM;AAC3B,YAAI;AAAA,UACF,IAAI,QAAQ,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,KAAK,MAAM,QAAQ,MAAM;AAAA,QACnE;AACA,gBAAQ;AACR;AAAA,MACF;AACA,UAAI,MAAM,IAAI,SAAS,GAAG;AACxB,YAAI,CAAC,MAAM;AACT;AAAA,QACF;AACA,YAAI,UAAU,MAAM;AAClB,cAAI,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,SAAS,IAAI,MAAM,GAAG;AAAA,QAC7D,OAAO;AACL,cAAI;AAAA,YACF,IAAI,QAAQ,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,MAAM,QAAQ,MAAM;AAAA,UACxE;AAAA,QACF;AACA;AAAA,MACF;AACA,UAAI,QAAQ,UAAU,MAAM;AAC1B,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,SAAO,IAAI,KAAK,EAAE;AACpB;AACA,SAAS,gBAAgB,SAAS,YAAY;AAC5C,SAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,KAAK,MAAM;AACrC,QAAI,IAAI,WAAW,KAAK,KAAK,WAAW,IAAI,WAAW,GAAG;AACxD,aAAO;AAAA,IACT;AACA,WAAO,IAAI,IAAI,CAAC,MAAM,MAAM;AAC1B,UAAI,IAAI,WAAW,KAAK,KAAK,WAAW,IAAI,WAAW,GAAG;AACxD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AACH;AACA,SAAS,iBAAiB,OAAO,MAAM,QAAQ,eAAe;AAC5D,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAM,SAAS,SAAS;AACzC,QAAM,cAAc,KAAK,MAAM,OAAO,iBAAiB;AACvD,QAAM,QAAQ,WAAW;AACzB,QAAM,KAAK,cAAc,SAAS,eAAe;AACjD,QAAM,KAAK,cAAc,UAAU,eAAe;AAClD,QAAM,IAAI,cAAc,KAAK,OAAO,MAAM,SAAS,IAAI,IAAI,IAAI,cAAc,IAAI;AACjF,QAAM,IAAI,cAAc,KAAK,OAAO,MAAM,SAAS,IAAI,IAAI,IAAI,cAAc,IAAI;AACjF,QAAM,UAAU,cAAc,WAAW,OAAO,IAAI,cAAc;AAClE,MAAI,aAAa;AACjB,MAAI,cAAc,UAAU;AAC1B,QAAI,SAAS,KAAK,MAAM,CAAC;AACzB,QAAI,SAAS,KAAK,MAAM,CAAC;AACzB,QAAI,QAAQ,KAAK,KAAK,IAAI,IAAI,MAAM;AACpC,QAAI,QAAQ,KAAK,KAAK,IAAI,IAAI,MAAM;AACpC,iBAAa,EAAE,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM;AAAA,EAC1D;AACA,QAAM,cAAc,cAAc;AAClC,SAAO,EAAE,GAAG,GAAG,GAAG,GAAG,YAAY,SAAS,YAAY;AACxD;AACA,SAAS,cAAc,eAAe,YAAY;AAChD,MAAI,cAAc,MAAM;AACtB,WAAO,KAAK,IAAI,KAAK,MAAM,UAAU,GAAG,CAAC;AAAA,EAC3C;AACA,SAAO,gBAAgB,mBAAmB;AAC5C;AACA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAG;AACD,MAAI,SAAS,aAAAC,QAAM,QAAQ,MAAM;AAC/B,UAAM,SAAS,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACpD,UAAM,WAAW,OAAO,OAAO,CAAC,OAAO,MAAM;AAC3C,YAAM,KAAK,GAAG,kBAAkB,UAAU,aAAa,CAAC,CAAC;AACzD,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AACL,WAAO,kBAAkB,OAAO;AAAA,MAC9B;AAAA,MACA,gBAAgB,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,OAAO,YAAY,UAAU,CAAC;AACzC,QAAM,EAAE,OAAO,QAAQ,UAAU,wBAAwB,IAAI,aAAAA,QAAM,QAAQ,MAAM;AAC/E,QAAI,SAAS,OAAO,WAAW;AAC/B,UAAM,UAAU,cAAc,eAAe,UAAU;AACvD,UAAM,YAAY,OAAO,SAAS,UAAU;AAC5C,UAAM,2BAA2B;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,yBAAyB;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,QAAQ,MAAM,eAAe,eAAe,UAAU,CAAC;AAC3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AACA,IAAI,mBAAkB,WAAW;AAC/B,MAAI;AACF,QAAI,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC;AAAA,EACnC,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AACA,SAAO;AACT,GAAE;AACF,IAAI,eAAe,aAAAA,QAAM;AAAA,EACvB,SAAS,cAAc,OAAO,cAAc;AAC1C,UAAM,KAAK,OAAO;AAAA,MAChB;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,IAAI,aAAa,UAAU,IAAI;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,KAAK,YAAY,EAAE,MAAM,IAAI,IAAI,aAAa,UAAU,IAAI,CAAC,OAAO,CAAC;AAC3E,UAAM,SAAS,iBAAiB,OAAO,SAAS,cAAc;AAC9D,UAAM,UAAU,aAAAA,QAAM,OAAO,IAAI;AACjC,UAAM,SAAS,aAAAA,QAAM,OAAO,IAAI;AAChC,UAAM,eAAe,aAAAA,QAAM;AAAA,MACzB,CAAC,SAAS;AACR,gBAAQ,UAAU;AAClB,YAAI,OAAO,iBAAiB,YAAY;AACtC,uBAAa,IAAI;AAAA,QACnB,WAAW,cAAc;AACvB,uBAAa,UAAU;AAAA,QACzB;AAAA,MACF;AAAA,MACA,CAAC,YAAY;AAAA,IACf;AACA,UAAM,CAAC,aAAa,gBAAgB,IAAI,aAAAA,QAAM,SAAS,KAAK;AAC5D,UAAM,EAAE,QAAQ,OAAO,UAAU,wBAAwB,IAAI,UAAU;AAAA,MACrE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,iBAAAA,QAAM,UAAU,MAAM;AACpB,UAAI,QAAQ,WAAW,MAAM;AAC3B,cAAM,SAAS,QAAQ;AACvB,cAAM,MAAM,OAAO,WAAW,IAAI;AAClC,YAAI,CAAC,KAAK;AACR;AAAA,QACF;AACA,YAAI,cAAc;AAClB,cAAM,QAAQ,OAAO;AACrB,cAAM,oBAAoB,2BAA2B,QAAQ,UAAU,QAAQ,MAAM,YAAY,MAAM,kBAAkB,KAAK,MAAM,iBAAiB;AACrJ,YAAI,mBAAmB;AACrB,cAAI,wBAAwB,cAAc,MAAM;AAC9C,0BAAc;AAAA,cACZ;AAAA,cACA,wBAAwB;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AACA,cAAM,aAAa,OAAO,oBAAoB;AAC9C,eAAO,SAAS,OAAO,QAAQ,OAAO;AACtC,cAAM,QAAQ,OAAO,WAAW;AAChC,YAAI,MAAM,OAAO,KAAK;AACtB,YAAI,YAAY;AAChB,YAAI,SAAS,GAAG,GAAG,UAAU,QAAQ;AACrC,YAAI,YAAY;AAChB,YAAI,iBAAiB;AACnB,cAAI,KAAK,IAAI,OAAO,aAAa,aAAa,MAAM,CAAC,CAAC;AAAA,QACxD,OAAO;AACL,gBAAM,QAAQ,SAAS,KAAK,KAAK;AAC/B,gBAAI,QAAQ,SAAS,MAAM,KAAK;AAC9B,kBAAI,MAAM;AACR,oBAAI,SAAS,MAAM,QAAQ,MAAM,QAAQ,GAAG,CAAC;AAAA,cAC/C;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AACA,YAAI,yBAAyB;AAC3B,cAAI,cAAc,wBAAwB;AAAA,QAC5C;AACA,YAAI,mBAAmB;AACrB,cAAI;AAAA,YACF;AAAA,YACA,wBAAwB,IAAI;AAAA,YAC5B,wBAAwB,IAAI;AAAA,YAC5B,wBAAwB;AAAA,YACxB,wBAAwB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,iBAAAA,QAAM,UAAU,MAAM;AACpB,uBAAiB,KAAK;AAAA,IACxB,GAAG,CAAC,MAAM,CAAC;AACX,UAAM,cAAc,eAAe,EAAE,QAAQ,MAAM,OAAO,KAAK,GAAG,KAAK;AACvE,QAAI,MAAM;AACV,QAAI,UAAU,MAAM;AAClB,YAAsB,6BAAAA,QAAM;AAAA,QAC1B;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO,EAAE,SAAS,OAAO;AAAA,UACzB,QAAQ,MAAM;AACZ,6BAAiB,IAAI;AAAA,UACvB;AAAA,UACA,KAAK;AAAA,UACL,aAAa,2BAA2B,OAAO,SAAS,wBAAwB;AAAA,QAClF;AAAA,MACF;AAAA,IACF;AACA,WAAuB,6BAAAA,QAAM,cAAc,aAAAA,QAAM,UAAU,MAAsB,6BAAAA,QAAM;AAAA,MACrF;AAAA,MACA,eAAe;AAAA,QACb,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,KAAK;AAAA,QACL,MAAM;AAAA,MACR,GAAG,UAAU;AAAA,IACf,GAAG,GAAG;AAAA,EACR;AACF;AACA,aAAa,cAAc;AAC3B,IAAI,YAAY,aAAAA,QAAM;AAAA,EACpB,SAAS,WAAW,OAAO,cAAc;AACvC,UAAM,KAAK,OAAO;AAAA,MAChB;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,IAAI,aAAa,UAAU,IAAI;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,EAAE,QAAQ,OAAO,UAAU,wBAAwB,IAAI,UAAU;AAAA,MACrE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,cAAc;AAClB,QAAI,QAAQ;AACZ,QAAI,iBAAiB,QAAQ,2BAA2B,MAAM;AAC5D,UAAI,wBAAwB,cAAc,MAAM;AAC9C,sBAAc;AAAA,UACZ;AAAA,UACA,wBAAwB;AAAA,QAC1B;AAAA,MACF;AACA,cAAwB,6BAAAA,QAAM;AAAA,QAC5B;AAAA,QACA;AAAA,UACE,MAAM,cAAc;AAAA,UACpB,QAAQ,wBAAwB;AAAA,UAChC,OAAO,wBAAwB;AAAA,UAC/B,GAAG,wBAAwB,IAAI;AAAA,UAC/B,GAAG,wBAAwB,IAAI;AAAA,UAC/B,qBAAqB;AAAA,UACrB,SAAS,wBAAwB;AAAA,UACjC,aAAa,wBAAwB;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS,aAAa,aAAa,MAAM;AAC/C,WAAuB,6BAAAA,QAAM;AAAA,MAC3B;AAAA,MACA,eAAe;AAAA,QACb,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,SAAS,OAAO,QAAQ,IAAI,QAAQ;AAAA,QACpC,KAAK;AAAA,QACL,MAAM;AAAA,MACR,GAAG,UAAU;AAAA,MACb,CAAC,CAAC,SAAyB,6BAAAA,QAAM,cAAc,SAAS,MAAM,KAAK;AAAA,MACnD,6BAAAA,QAAM;AAAA,QACpB;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,GAAG,SAAS,QAAQ,IAAI,QAAQ;AAAA,UAChC,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACgB,6BAAAA,QAAM,cAAc,QAAQ,EAAE,MAAM,SAAS,GAAG,QAAQ,gBAAgB,aAAa,CAAC;AAAA,MACtG;AAAA,IACF;AAAA,EACF;AACF;AACA,UAAU,cAAc;;;AC5mCxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;;;ACAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;;;ACAA,IAAAC,iBAA+B;AAC/B,IAAAC,mCAAmC;;;ACD5B,IAAM,cAAc;AA+G3B,eAAsB,IAAO,OAAO,IAAI,OAAoB,CAAC,GAAe;AAC1E,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,WAAW,MAAM,MAAM,GAAG,WAAW,GAAG,IAAI,IAAI;AAAA,IACpD,GAAG;AAAA,IACH,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,GAAI,WAAW,QAAQ,CAAC,IAAI,EAAE,gBAAgB,oBAAoB,yBAAyB,IAAI;AAAA,MAC/F,GAAG,KAAK;AAAA,IACV;AAAA,EACF,CAAC;AACD,MAAI,SAAS,WAAW,IAAK,QAAO;AACpC,QAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,QAAQ,SAAS,MAAM,EAAE;AACzG,SAAO;AACT;AAEO,SAAS,cAAwC;AAAE,SAAO,IAAI;AAAE;;;AC/HvE,IAAAC,gBAA6E;AAC7E,sCAA6D;AAIzD;AAFG,SAAS,cAAc,EAAE,SAAS,OAAO,QAAQ,QAAQ,GAAyF;AACvJ,SAAO,6CAAC,YAAO,WAAU,4BACvB;AAAA,iDAAC,UAAK;AAAA,kDAAC,WAAO,mBAAQ;AAAA,MAAQ,4CAAC,QAAI,iBAAM;AAAA,MAAK,4CAAC,OAAG,kBAAO;AAAA,OAAI;AAAA,IAC5D,WAAW,4CAAC,SAAI,WAAU,oCAAoC,mBAAQ;AAAA,KACzE;AACF;AAEO,SAAS,eAAe,EAAE,OAAO,QAAQ,SAAS,UAAU,YAAY,GAAG,GAAkH;AAClM,SAAO,6CAAC,aAAQ,WAAW,4BAA4B,YAAY,IAAI,SAAS,KAAK,EAAE,IACrF;AAAA,iDAAC,YAAO;AAAA,mDAAC,UAAK;AAAA,oDAAC,YAAQ,iBAAM;AAAA,QAAU,UAAU,4CAAC,WAAO,kBAAO;AAAA,SAAS;AAAA,MAAQ,WAAW,4CAAC,SAAK,mBAAQ;AAAA,OAAO;AAAA,IAChH;AAAA,KACH;AACF;AAEO,SAAS,gBAAgB,EAAE,UAAU,sBAAsB,OAAO,QAAQ,OAAO,UAAU,QAAQ,UAAU,GAAqI;AACvP,QAAM,cAAU,qBAAM;AACtB,QAAM,eAAW,qBAAM;AACvB,QAAM,eAAW,sBAA0B,IAAI;AAC/C,+BAAU,MAAM;AACd,UAAM,WAAW,SAAS,yBAAyB,cAAc,SAAS,gBAAgB;AAC1F,UAAM,QAAQ,sBAAsB,MAAM;AACxC,YAAM,QAAQ,SAAS;AACvB,YAAM,SAAS,OAAO,cAA2B,aAAa,KAAK,OAAO,cAA2B,iCAAiC;AACtI,cAAQ,MAAM;AAAA,IAChB,CAAC;AACD,WAAO,MAAM;AAAE,2BAAqB,KAAK;AAAG,gBAAU,MAAM;AAAA,IAAE;AAAA,EAChE,GAAG,CAAC,CAAC;AACL,QAAM,UAAU,CAAC,UAA4C;AAC3D,QAAI,MAAM,QAAQ,UAAU;AAAE,YAAM,eAAe;AAAG,YAAM;AAAG;AAAA,IAAO;AACtE,QAAI,MAAM,QAAQ,MAAO;AACzB,UAAM,YAAY,CAAC,GAAI,SAAS,SAAS,iBAA8B,2IAA2I,KAAK,CAAC,CAAE,EAAE,OAAO,UAAQ,KAAK,eAAe,EAAE,SAAS,CAAC;AAC3Q,QAAI,UAAU,WAAW,EAAG;AAC5B,UAAM,QAAQ,UAAU,CAAC;AAAG,UAAM,OAAO,UAAU,GAAG,EAAE;AACxD,QAAI,MAAM,YAAY,SAAS,kBAAkB,OAAO;AAAE,YAAM,eAAe;AAAG,YAAM,MAAM;AAAA,IAAE,WACvF,CAAC,MAAM,YAAY,SAAS,kBAAkB,MAAM;AAAE,YAAM,eAAe;AAAG,aAAO,MAAM;AAAA,IAAE;AAAA,EACxG;AACA,SAAO,4CAAC,SAAI,WAAU,sCAAqC,eAAe,WAAS;AAAE,QAAI,MAAM,WAAW,MAAM,cAAe,OAAM;AAAA,EAAE,GACrI,uDAAC,YAAO,KAAK,UAAU,WAAW,mCAAmC,KAAK,IAAI,MAAI,MAAC,cAAW,QAAO,mBAAiB,SAAS,oBAAkB,UAAU,WAAW,SACpK;AAAA,iDAAC,YAAO;AAAA,mDAAC,UAAK;AAAA,oDAAC,WAAO,mBAAQ;AAAA,QAAQ,4CAAC,YAAO,IAAI,SAAU,iBAAM;AAAA,QAAS,4CAAC,OAAE,IAAI,UAAW,kBAAO;AAAA,SAAI;AAAA,MAAO,4CAAC,YAAO,MAAK,UAAS,SAAS,OAAO,cAAW,gBAAK,sDAAC,sDAAmB,MAAM,IAAI,GAAE;AAAA,OAAS;AAAA,IAC9M,4CAAC,SAAI,WAAU,qCAAqC,UAAS;AAAA,KAC/D,GACF;AACF;AAEO,SAAS,gBAAgB,EAAE,UAAU,OAAO,QAAQ,GAAiF;AAC1I,SAAO,6CAAC,OAAE,WAAW,mCAAmC,IAAI,IAAI,MAAM,SAAS,UAAU,UAAU,UAAU;AAAA,gDAAC,OAAE;AAAA,IAAG;AAAA,KAAS;AAC9H;AAEO,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,GAAwE;AAC9H,SAAO,6CAAC,SAAI,WAAU,gCAA+B;AAAA,gDAAC,UAAK,sDAAC,4DAAyB,MAAM,IAAI,GAAE;AAAA,IAAO,4CAAC,YAAQ,iBAAM;AAAA,IAAU,UAAU,4CAAC,OAAG,kBAAO;AAAA,IAAM;AAAA,KAAO;AACrK;AAEO,SAAS,mBAAmB,EAAE,OAAO,EAAE,GAAmC;AAC/E,SAAO,4CAAC,SAAI,WAAU,mCAAkC,cAAW,4BAAO,aAAU,QAAQ,gBAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,UAAU,4CAAC,SAAO,KAAO,CAAE,GAAE;AAC5J;AAMO,SAAS,aAAa,OAAwB;AAAE,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAE;;;AC/DrH,IAAAC,gBAAwC;AACxC,IAAAC,mCAAiH;;;ACAjH,IAAAC,mCAAyC;AAKhC,IAAAC,sBAAA;AAFF,SAAS,cAAc,EAAE,QAAQ,GAAsD;AAC5F,QAAM,SAAS,SAAS,iBAAiB;AACzC,SAAO,8CAAC,UAAK,WAAW,yBAAyB,MAAM,IAAI;AAAA,iDAAC,OAAE;AAAA,IAAG,UAAU,mBAAmB,QAAQ,aAAa,IAAI;AAAA,KAAM;AAC/H;AAEO,SAAS,OAAO,EAAE,MAAM,QAAQ,MAAM,GAAmD;AAC9F,SAAO,6CAAC,UAAK,WAAW,qBAAqB,QAAQ,cAAc,EAAE,IAAI,eAAY,QAAQ,WAAC,GAAG,IAAI,EAAE,CAAC,KAAK,UAAI;AACnH;AAEO,SAAS,YAAY,EAAE,QAAQ,MAAM,GAAqC;AAC/E,SAAO,8CAAC,UAAK,WAAW,2BAA2B,QAAQ,cAAc,EAAE,IAAI,eAAY,QAAO;AAAA,iDAAC,OAAE;AAAA,IAAE,6CAAC,OAAE;AAAA,KAAE;AAC9G;AAEO,SAAS,UAAU,EAAE,QAAAC,SAAQ,SAAS,MAAM,SAAS,GAA4F;AACtJ,SAAO,8CAAC,YAAO,MAAK,UAAS,WAAWA,UAAS,cAAc,IAAI,gBAAcA,UAAS,SAAS,QAAW,SAAmB;AAAA;AAAA,IAAK,6CAAC,UAAM,UAAS;AAAA,KAAO;AAC/J;AAEO,SAAS,UAAU,EAAE,OAAO,MAAM,SAAS,GAAuE;AACvH,SAAO,8CAAC,WAAM,WAAU,qBAAoB;AAAA,kDAAC,UAAK;AAAA,mDAAC,YAAQ,iBAAM;AAAA,MAAU,QAAQ,6CAAC,WAAO,gBAAK;AAAA,OAAS;AAAA,IAAQ;AAAA,KAAS;AAC5H;AAEO,SAAS,eAAe,EAAE,SAAS,OAAO,OAAO,GAAoE;AAC1H,SAAO,8CAAC,YAAO,WAAU,uBAAsB;AAAA,iDAAC,WAAO,mBAAQ;AAAA,IAAQ,6CAAC,QAAI,iBAAM;AAAA,IAAK,6CAAC,OAAG,kBAAO;AAAA,KAAI;AACxG;AAEO,SAAS,aAAa,EAAE,OAAO,QAAQ,QAAQ,UAAU,MAAM,GAA2F;AAC/J,SAAO,8CAAC,SAAI,WAAW,oBAAoB,UAAU,gBAAgB,EAAE,IAAI;AAAA,iDAAC,6DAAyB,MAAM,IAAI;AAAA,IAAE,6CAAC,YAAQ,iBAAM;AAAA,IAAU,UAAU,6CAAC,OAAG,kBAAO;AAAA,IAAM;AAAA,KAAO;AAC9K;AAEO,SAAS,aAAa,OAAuB;AAClD,QAAM,UAAU,KAAK,OAAO,KAAK,IAAI,IAAI,SAAS,GAAM;AACxD,SAAO,UAAU,IAAI,iBAAO,UAAU,KAAK,GAAG,OAAO,wBAAS,UAAU,OAAO,GAAG,KAAK,MAAM,UAAU,EAAE,CAAC,wBAAS,GAAG,KAAK,MAAM,UAAU,IAAI,CAAC;AAClJ;AAEA,SAAS,mBAAmB,QAA8C;AACxE,SAAO,WAAW,YAAY,uBAAQ,WAAW,aAAa,uBAAQ,WAAW,UAAU,6BAAS;AACtG;;;ACxCA,IAAAC,gBAA+B;;;ACA/B,IAAAC,gBAAuB;AAIwC,IAAAC,sBAAA;AADxD,SAAS,sBAAsB,EAAE,MAAM,GAAgD;AAC5F,SAAO,8CAAC,aAAQ,WAAU,4BAA2B;AAAA,kDAAC,YAAO;AAAA,mDAAC,UAAM,gBAAM,MAAK;AAAA,MAAO,8CAAC,YAAQ;AAAA,cAAM;AAAA,QAAU;AAAA,SAAQ;AAAA,MAAS,8CAAC,WAAM;AAAA;AAAA,QAAK,IAAI,KAAK,MAAM,SAAS,EAAE,eAAe;AAAA,SAAE;AAAA,OAAQ;AAAA,IAAS,6CAAC,OAAG,gBAAM,SAAQ;AAAA,IAAI,6CAAC,mBAAgB,OAAM,sBAAM,OAAO,MAAM,WAAW;AAAA,IAAE,6CAAC,mBAAgB,OAAM,4BAAO,OAAO,MAAM,QAAQ;AAAA,IAAE,6CAAC,mBAAgB,OAAM,sBAAM,OAAO,MAAM,WAAW;AAAA,IAAE,6CAAC,mBAAgB,OAAM,sBAAM,OAAO,MAAM,gBAAgB;AAAA,KAAE;AAC/b;AAEA,SAAS,gBAAgB,EAAE,OAAO,MAAM,GAA2D;AACjG,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,8CAAC,aAAQ;AAAA,iDAAC,YAAQ,iBAAM;AAAA,IAAS,6CAAC,QAAI,gBAAM,IAAI,UAAQ,6CAAC,QAAe,kBAAP,IAAY,CAAK,GAAE;AAAA,KAAK;AAClG;AAEO,SAAS,WAAW,EAAE,MAAM,SAAS,MAAM,YAAY,MAAM,OAAO,GAA0J;AACnO,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAS,KAAK;AAC9D,SAAO,6CAAC,aAAQ,aAAW,KAAK,MAAO,oBAAU,8CAAC,SAAI,WAAU,6BAC9D;AAAA,iDAAC,WAAM,cAAW,4BAAO,OAAO,QAAQ,SAAS,UAAU,WAAS,WAAW,EAAE,GAAG,SAAS,SAAS,MAAM,OAAO,MAAM,CAAC,GAAG;AAAA,IAC7H,6CAAC,cAAS,cAAW,4BAAO,OAAO,QAAQ,SAAS,UAAU,WAAS,WAAW,EAAE,GAAG,SAAS,SAAS,MAAM,OAAO,MAAM,CAAC,GAAG;AAAA,IAChI,8CAAC,YAAO;AAAA,mDAAC,YAAO,MAAK,UAAS,SAAS,MAAM,WAAW,MAAS,GAAG,0BAAE;AAAA,MAAS,6CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,QAAQ,CAAC,QAAQ,QAAQ,KAAK,KAAK,CAAC,QAAQ,QAAQ,KAAK,GAAG,SAAS,MAAM,sCAAI;AAAA,OAAS;AAAA,KAChO,IAAS,8EACP;AAAA,kDAAC,YAAO;AAAA,mDAAC,UAAM,qBAAW,KAAK,IAAI,GAAE;AAAA,MAAO,6CAAC,SAAK,6BAAmB,8EAAE;AAAA,qDAAC,YAAO,MAAK,UAAS,SAAS,MAAM,oBAAoB,KAAK,GAAG,0BAAE;AAAA,QAAS,6CAAC,YAAO,MAAK,UAAS,WAAU,aAAY,UAAU,MAAM,SAAS,QAAQ,sCAAI;AAAA,SAAS,IAAM,8EAAE;AAAA,qDAAC,YAAO,MAAK,UAAS,SAAS,MAAM,WAAW,EAAE,GAAG,KAAK,CAAC,GAAG,0BAAE;AAAA,QAAS,6CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,oBAAoB,IAAI,GAAG,0BAAE;AAAA,SAAS,GAAI;AAAA,OAAM;AAAA,IACnZ,6CAAC,YAAQ,eAAK,SAAQ;AAAA,IAAS,6CAAC,OAAG,eAAK,SAAQ;AAAA,IAChD,8CAAC,YAAO;AAAA,mDAAC,cAAS,KAAK,GAAG,OAAO,KAAK,YAAY,cAAY,sBAAO,KAAK,MAAM,KAAK,aAAa,GAAG,CAAC,KAAK;AAAA,MAAE,8CAAC,WAAO;AAAA,aAAK,SAAS,6BAAS,GAAG,KAAK,MAAM,KAAK,aAAa,GAAG,CAAC;AAAA,QAAO;AAAA,QAAI,aAAa,KAAK,SAAS;AAAA,SAAE;AAAA,OAAQ;AAAA,IAC/N,KAAK,SAAS,SAAS,KAAK,8CAAC,aAAQ,WAAU,+BAA8B;AAAA,oDAAC,aAAQ;AAAA;AAAA,QAAO,6CAAC,OAAG,eAAK,SAAS,QAAO;AAAA,SAAI;AAAA,MAAU,6CAAC,SAAK,WAAC,GAAG,KAAK,QAAQ,EAAE,QAAQ,EAAE,IAAI,cAAY,8CAAC,gBAAqD;AAAA,qDAAC,OAAG,mBAAS,SAAQ;AAAA,QAAI,6CAAC,UAAM,cAAI,KAAK,SAAS,EAAE,EAAE,eAAe,GAAE;AAAA,WAA5G,GAAG,SAAS,MAAM,IAAI,SAAS,EAAE,EAAkF,CAAa,GAAE;AAAA,OAAM;AAAA,KACnV,GAAI;AACN;AAEO,SAAS,WAAW,OAAmC;AAAE,SAAQ,EAAE,SAAS,gBAAM,YAAY,gBAAM,MAAM,gBAAM,OAAO,gBAAM,cAAc,gBAAM,SAAS,2BAAO,EAAG,KAAK;AAAE;;;ACnB3K,IAAM,gBAAsD,EAAC,QAAQ,gBAAM,WAAW,sBAAO,YAAY,sBAAO,SAAS,qBAAK;;;AFoB5H,IAAAC,sBAAA;AArBF,SAAS,aAAa,EAAC,aAAa,MAAM,OAAO,SAAAC,SAAO,GAAkG;AAC/J,QAAM,CAACC,UAAS,UAAU,QAAI,wBAAS,IAAI;AAC3C,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAqB;AACnD,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAiB;AAC3C,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAiB;AAC7C,QAAM,WAAO,sBAAO,KAAK;AACzB,QAAM,MAAM,OAAO,SAAS,UAAyB;AACnD,QAAI,KAAK,WAAY,CAAC,UAAU,CAAC,QAAU;AAC3C,SAAK,UAAU;AAAM,YAAQ,IAAI;AAAG,aAAS,MAAS;AACtD,QAAI;AACF,YAAM,OAAO,eAAe,mBAAmB,WAAW,CAAC,WAAW,mBAAmBA,SAAQ,EAAE,CAAC;AACpG,UAAI,QAAQ;AAAC,cAAM,IAAI,MAAM,EAAC,QAAQ,SAAQ,CAAC;AAAG,cAAM;AAAA,MAAC,OACpD;AACH,cAAM,UAAU,MAAM,IAAgB,MAAM,EAAC,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAC,SAAS,QAAS,SAAS,SAAS,QAAS,QAAO,CAAC,EAAC,CAAC;AACzI,mBAAW,OAAO;AAAG,mBAAW,MAAS;AAAG,kBAAU,wGAAmB;AAAA,MAC3E;AACA,YAAMD,SAAQ;AAAA,IAChB,SAAS,QAAQ;AAAC,eAAS,aAAa,MAAM,CAAC;AAAA,IAAC,UAChD;AAAS,WAAK,UAAU;AAAO,cAAQ,KAAK;AAAA,IAAC;AAAA,EAC/C;AACA,SAAO,8CAAC,mBAAgB,OAAM,4BAAO,QAAQ,GAAG,cAAcC,SAAQ,MAAM,CAAC,wIAA4B,OAAO,MAAM;AAAC,QAAI,CAAC,KAAM,OAAM;AAAA,EAAC,GACtI;AAAA,aAAS,6CAAC,mBAAiB,iBAAM;AAAA,IAAoB,UAAU,6CAAC,mBAAgB,MAAK,WAAW,kBAAO;AAAA,IACxG,6CAAC,SAAI,WAAU,8BAA6B,uDAAC,cAA4B,MAAMA,UAAS,SAAkB,MAAY,YAAwB,MAAM,MAAM;AAAC,WAAK,IAAI;AAAA,IAAC,GAAG,QAAQ,MAAM;AAAC,WAAK,IAAI,IAAI;AAAA,IAAC,KAAxIA,SAAQ,EAAmI,GAAE;AAAA,KAC5M;AACF;;;AG/BA,IAAAC,gBAAuB;AAyBoB,IAAAC,sBAAA;AApB3C,IAAM,mBAAqC,CAAC,OAAO,kBAAkB,cAAc,YAAY,WAAW,OAAO;AAE1G,SAAS,YAAY,EAAE,OAAO,UAAU,OAAO,QAAQ,GAAiI;AAC7L,QAAM,OAAO,IAAI,IAAI,MAAM,SAAS,IAAI,UAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AAChE,QAAM,WAAW,CAAC,GAAG,IAAI,IAAI,MAAM,UAAU,IAAI,UAAQ,KAAK,OAAO,CAAC,CAAC;AACvE,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAiB;AACjE,QAAM,UAAU,SAAS,SAAS,oBAAoB,EAAE,IAAI,mBAAoB,SAAS,CAAC;AAC1F,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAyB,KAAK;AAC1D,QAAM,SAAS,MAAM,UAAU,OAAO,UAAQ,KAAK,YAAY,OAAO;AACtE,QAAM,UAAU,OAAO,OAAO,UAAQ;AACpC,QAAI,WAAW,SAAS,KAAK,SAAS,OAAQ,QAAO;AACrD,UAAMC,UAAS,KAAK,IAAI,KAAK,cAAc;AAAG,UAAMC,UAAS,KAAK,IAAI,KAAK,cAAc;AACzF,WAAO,CAAC,SAAS,GAAGD,SAAQ,WAAW,EAAE,IAAIA,SAAQ,WAAW,EAAE,IAAIC,SAAQ,WAAW,EAAE,IAAIA,SAAQ,WAAW,EAAE,IAAI,KAAK,KAAK,GAAG,kBAAkB,EAAE,SAAS,KAAK;AAAA,EACzK,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU,OAAO,MAAM,SAAS,gBAAgB,IAAI,OAAO,KAAK,SAAS,gBAAgB,KAAK,MAAM,aAAa,KAAK,UAAU;AAC/I,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAiB;AACrE,QAAM,WAAW,QAAQ,KAAK,UAAQ,KAAK,OAAO,kBAAkB,KAAK,QAAQ,CAAC;AAClF,QAAM,SAAS,WAAW,KAAK,IAAI,SAAS,cAAc,IAAI;AAC9D,QAAM,SAAS,WAAW,KAAK,IAAI,SAAS,cAAc,IAAI;AAC9D,QAAM,QAAQ,SAAS,KAAK,UAAQ,KAAK,YAAY,OAAO,GAAG,UAAU,UAAU,sBAAO,QAAQ,MAAM,EAAE,CAAC,KAAK;AAChH,QAAM,gBAAgB,OAAO,OAAO,UAAQ,KAAK,SAAS,gBAAgB,EAAE;AAC5E,MAAI,MAAM,UAAU,WAAW,EAAG,QAAO,6CAAC,gBAAM,OAAM,8CAAU,QAAO,8LAAkC;AACzG,SAAO,8CAAC,SAAI,WAAU,2BACpB;AAAA,kDAAC,YAAO,WAAU,6BAA4B;AAAA,oDAAC,UAAK;AAAA,qDAAC,WAAM,sCAAI;AAAA,QAAQ,8CAAC,YAAQ;AAAA;AAAA,UAAM;AAAA,WAAM;AAAA,QAAS,8CAAC,OAAG;AAAA,iBAAO;AAAA,UAAO;AAAA,UAAO,gBAAgB,IAAI,sBAAO,aAAa,oCAAW;AAAA,WAAW;AAAA,SAAI;AAAA,MAAQ,SAAS,SAAS,KAAK,8CAAC,WAAM;AAAA,qDAAC,UAAK,gCAAG;AAAA,QAAO,6CAAC,YAAO,OAAO,SAAS,UAAU,WAAS;AAAE,8BAAoB,MAAM,OAAO,KAAK;AAAG,gCAAsB,MAAS;AAAA,QAAE,GAAI,mBAAS,IAAI,WAAS,6CAAC,YAAO,OAA2B,mBAAS,KAAK,UAAQ,KAAK,YAAY,KAAK,GAAG,SAAS,sBAAO,MAAM,MAAM,EAAE,CAAC,MAAtF,KAAyF,CAAS,GAAE;AAAA,SAAS;AAAA,OAAS;AAAA,IACxhB,6CAAC,SAAI,WAAU,6BAA4B,cAAW,4BAAQ,2BAAiB,IAAI,WAAS;AAAE,YAAM,QAAQ,UAAU,QAAQ,OAAO,SAAS,OAAO,OAAO,UAAQ,KAAK,SAAS,KAAK,EAAE;AAAQ,aAAO,8CAAC,YAAO,MAAK,UAAqB,WAAW,WAAW,QAAQ,cAAc,IAAI,gBAAc,WAAW,OAAO,SAAS,MAAM;AAAE,kBAAU,KAAK;AAAG,8BAAsB,MAAS;AAAA,MAAE,GAAI;AAAA,kBAAU,QAAQ,iBAAO,cAAc,KAAK;AAAA,QAAE;AAAA,QAAC,6CAAC,OAAG,iBAAM;AAAA,WAAxN,KAA4N;AAAA,IAAU,CAAC,GAAE;AAAA,IAC5c,8CAAC,SAAI,WAAU,6BAA4B;AAAA,mDAAC,SAAI,WAAU,2BAA0B,MAAK,QAAQ,kBAAQ,WAAW,IAAI,6CAAC,gBAAM,OAAM,8CAAU,QAAO,oGAAmB,SAAO,MAAC,IAAK,QAAQ,IAAI,UAAQ;AAAE,cAAM,OAAO,KAAK,IAAI,KAAK,cAAc;AAAG,cAAM,KAAK,KAAK,IAAI,KAAK,cAAc;AAAG,eAAO,8CAAC,YAAO,MAAK,UAAS,MAAK,YAAyB,aAAW,KAAK,MAAM,WAAW,UAAU,OAAO,KAAK,KAAK,cAAc,IAAI,SAAS,MAAM,sBAAsB,KAAK,EAAE,GAAG;AAAA,uDAAC,UAAM,wBAAc,KAAK,IAAI,GAAE;AAAA,UAAO,8CAAC,YAAQ;AAAA,kBAAM,WAAW;AAAA,YAAQ;AAAA,YAAC,6CAAC,OAAE,eAAY,QAAO,oBAAC;AAAA,YAAI;AAAA,YAAE,IAAI,WAAW;AAAA,aAAQ;AAAA,UAAS,6CAAC,OAAG,eAAK,OAAM;AAAA,UAAI,8CAAC,WAAO;AAAA,iBAAK,MAAM,KAAK,aAAa,GAAG;AAAA,YAAE;AAAA,aAAI;AAAA,aAA9U,KAAK,EAAiV;AAAA,MAAU,CAAC,GAAE;AAAA,MACrrB,6CAAC,SAAI,WAAU,2BAA2B,sBAAY,UAAU,SAAS,8CAAC,aAAQ,aAAW,SAAS,MAAM;AAAA,sDAAC,YAAO;AAAA,uDAAC,UAAM,wBAAc,SAAS,IAAI,GAAE;AAAA,UAAO,8CAAC,YAAQ;AAAA,mBAAO;AAAA,YAAQ;AAAA,YAAC,6CAAC,OAAE,eAAY,QAAO,oBAAC;AAAA,YAAI;AAAA,YAAE,OAAO;AAAA,aAAQ;AAAA,UAAS,6CAAC,OAAG,mBAAS,OAAM;AAAA,UAAI,6CAAC,WAAO,2BAAiB,SAAS,IAAI,GAAE;AAAA,WAAQ;AAAA,QAAS,8CAAC,SAAI,WAAU,0BAAyB;AAAA,uDAAC,eAAY,MAAM,QAAQ,MAAK,gBAAK,SAAkB;AAAA,UAAE,8CAAC,SAAI,eAAY,QAAO;AAAA,yDAAC,OAAE;AAAA,YAAE,6CAAC,UAAM,wBAAc,SAAS,IAAI,GAAE;AAAA,YAAO,6CAAC,OAAE;AAAA,aAAE;AAAA,UAAM,6CAAC,eAAY,MAAM,QAAQ,MAAK,sBAAM,SAAkB;AAAA,WAAE;AAAA,QAAM,8CAAC,YAAO;AAAA,wDAAC,WAAM;AAAA;AAAA,YAAO,IAAI,KAAK,SAAS,SAAS,EAAE,eAAe;AAAA,aAAE;AAAA,UAAQ,8CAAC,YAAO;AAAA;AAAA,YAAO,KAAK,MAAM,SAAS,aAAa,GAAG;AAAA,YAAE;AAAA,aAAC;AAAA,WAAS;AAAA,SAAS,IAAa,6CAAC,gBAAM,OAAM,wCAAS,QAAO,sHAAsB,SAAO,MAAC,GAAG;AAAA,OAClxB;AAAA,KACF;AACF;AAEA,SAAS,YAAY,EAAE,MAAM,MAAM,QAAQ,GAAqF;AAC9H,SAAO,8CAAC,aAAQ;AAAA,kDAAC,YAAO;AAAA,oDAAC,WAAO;AAAA;AAAA,QAAK;AAAA,QAAI,WAAW,KAAK,IAAI;AAAA,SAAE;AAAA,MAAQ,6CAAC,YAAQ,eAAK,SAAQ;AAAA,OAAS;AAAA,IAAS,6CAAC,OAAG,eAAK,SAAQ;AAAA,IAAI,6CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,QAAQ,IAAI,GAAG,4CAAK;AAAA,KAAS;AACxM;AAEA,SAAS,cAAc,MAA0C;AAAE,SAAQ,EAAE,UAAU,gBAAM,YAAY,gBAAM,OAAO,gBAAM,gBAAgB,gBAAM,SAAS,eAAK,EAAG,IAAI;AAAE;AACzK,SAAS,iBAAiB,MAA0C;AAClE,SAAQ;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,SAAS;AAAA,EACX,EAAG,IAAI;AACT;;;AChDA,IAAAC,gBAA0C;AA0BjC,IAAAC,sBAAA;AArBF,SAAS,YAAY,EAAC,MAAM,SAAS,MAAK,GAAgE;AAC/G,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAwB,CAAC,CAAC;AACpD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAiB;AAC3C,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,IAAI;AACrC,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,CAAC;AAClC,QAAM,aAAS,sBAAoB;AACnC,+BAAU,MAAM;AACd,UAAM,aAAa,IAAI,gBAAgB;AACvC,eAAW,IAAI;AAAG,aAAS,MAAS;AACpC,UAAM,SAAS,IAAI,gBAAgB,EAAC,QAAO,CAAC;AAC5C,QAAI,OAAO,SAAS;AAAC,aAAO,IAAI,UAAU,OAAO,OAAO,QAAQ,EAAE,CAAC;AAAG,aAAO,IAAI,YAAY,OAAO,QAAQ,EAAE;AAAA,IAAC;AAC/G,SAAK,IAAmB,GAAG,IAAI,mBAAmB,MAAM,IAAI,EAAC,QAAQ,WAAW,OAAM,CAAC,EAAE,KAAK,WAAS;AACrG,UAAI,WAAW,OAAO,QAAS;AAC/B,eAAS,cAAY,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,UAAU,GAAG,KAAK,EAAE,IAAI,UAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAChG,cAAQ,MAAM,WAAW,EAAE;AAAG,aAAO,UAAU,MAAM,GAAG,EAAE,KAAK,OAAO;AAAA,IACxE,CAAC,EAAE,MAAM,YAAU;AAAC,UAAI,CAAC,WAAW,OAAO,QAAS,UAAS,aAAa,MAAM,CAAC;AAAA,IAAC,CAAC,EAChF,QAAQ,MAAM;AAAC,UAAI,CAAC,WAAW,OAAO,QAAS,YAAW,KAAK;AAAA,IAAC,CAAC;AACpE,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC,GAAG,CAAC,MAAM,SAAS,IAAI,CAAC;AACxB,QAAM,WAAW,MAAM,OAAO,UAAQ,CAAC,SAAS,GAAG,KAAK,IAAI,IAAI,KAAK,SAAS,GAAG,kBAAkB,EAAE,SAAS,KAAK,CAAC;AACpH,SAAO,8CAAC,SAAI,WAAU,8BACpB;AAAA,iDAAC,OAAE,WAAU,2BAA0B,kPAAsC;AAAA,IAC5E,SAAS,6CAAC,mBAAiB,iBAAM;AAAA,IACjC,CAAC,SAAS,UAAU,6CAAC,mBAAgB,OAAO,UAAU,yCAAW,0DAAa;AAAA,IAC9E,SAAS,IAAI,UAAQ,6CAAC,iBAA4B,QAAT,KAAK,EAAgB,CAAE;AAAA,KAC/D,QAAQ,UAAU,6CAAC,YAAO,MAAK,UAAS,UAAU,SAAS,SAAS,MAAM,QAAQ,WAAS,QAAQ,CAAC,GAAI,oBAAU,6BAAS,QAAQ,6BAAS,4CAAa;AAAA,KAC7J;AACF;AAEA,SAAS,cAAc,EAAC,KAAI,GAAqC;AAC/D,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,SAAO,8CAAC,aAAQ,WAAU,6BAA4B,UAAU,WAAS,QAAQ,MAAM,cAAc,IAAI,GAAG;AAAA,kDAAC,aAAQ;AAAA,mDAAC,UAAM,cAAI,KAAK,KAAK,EAAE,EAAE,eAAe,GAAE;AAAA,MAAO,6CAAC,YAAQ,eAAK,KAAK,MAAM,GAAG,GAAG,GAAE;AAAA,OAAS;AAAA,IAAW,QAAQ,8CAAC,SAAI;AAAA,mDAAC,QAAG,sCAAI;AAAA,MAAK,6CAAC,OAAG,eAAK,MAAK;AAAA,MAAI,6CAAC,QAAG,wDAAO;AAAA,MAAK,6CAAC,OAAG,eAAK,WAAU;AAAA,MAAI,6CAAC,WAAM,8GAAgB;AAAA,OAAQ;AAAA,KAAO;AACtV;;;ACtCA,IAAAC,gBAA+B;AAiC3B,IAAAC,sBAAA;AA5BG,SAAS,eAAe,EAAC,OAAO,MAAM,SAAS,SAAAC,SAAO,GAA2F;AACtJ,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAiB;AACjD,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,WAAO,sBAAO,KAAK;AACzB,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAiB;AAC3C,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAiB;AAC7C,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAA0B,OAAO;AAC7D,QAAM,OAAO,MAAM,KAAK,WAAS,MAAM,OAAO,QAAQ;AACtD,QAAM,SAAS,OAAO,WAA8D;AAClF,QAAI,CAAC,QAAQ,KAAK,QAAS;AAC3B,SAAK,UAAU;AAAM,YAAQ,IAAI;AAAG,aAAS,MAAS;AACtD,UAAM,OAAO,GAAG,IAAI,uBAAuB,mBAAmB,KAAK,EAAE,CAAC,IAAI,IAAI,gBAAgB,EAAC,QAAO,CAAC,CAAC;AACxG,QAAI;AACF,UAAI,WAAW,UAAU;AACvB,cAAM,EAAC,UAAAC,UAAQ,IAAI,MAAM,IAAwB,IAAI;AACrD,cAAM,MAAM,IAAI,gBAAgB,IAAI,KAAK,CAACA,SAAQ,GAAG,EAAC,MAAM,8BAA6B,CAAC,CAAC;AAC3F,cAAM,SAAS,OAAO,SAAS,cAAc,GAAG;AAAG,eAAO,OAAO;AAAK,eAAO,WAAW,GAAG,KAAK,EAAE;AAAO,eAAO,SAAS,KAAK,OAAO,MAAM;AAAG,eAAO,MAAM;AAAG,eAAO,OAAO;AAC5K,mBAAW,MAAM,IAAI,gBAAgB,GAAG,GAAG,GAAI;AAC/C,kBAAU,8GAAoB;AAAA,MAChC,OAAO;AACL,cAAM,IAAI,MAAM,EAAC,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAC,QAAQ,SAAS,KAAK,QAAO,CAAC,EAAC,CAAC;AACvF,oBAAY,MAAS;AAAG,kBAAU,WAAW,aAAa,qGAAqB,sCAAQ;AACvF,cAAMD,SAAQ;AAAA,MAChB;AAAA,IACF,SAAS,QAAQ;AAAC,eAAS,aAAa,MAAM,CAAC;AAAG,YAAMA,SAAQ;AAAA,IAAC,UACjE;AAAS,WAAK,UAAU;AAAO,cAAQ,KAAK;AAAA,IAAC;AAAA,EAC/C;AACA,SAAO,8EACL;AAAA,iDAAC,OAAE,WAAU,2BAA0B,8MAAqC;AAAA,IAC3E,UAAU,6CAAC,mBAAgB,MAAK,WAAW,kBAAO;AAAA,IACnD,6CAAC,SAAI,WAAU,8BAA6B,cAAW,4BAAS,WAAC,SAAS,YAAY,UAAU,EAAY,IAAI,YAAU,8CAAC,YAAO,MAAK,UAAS,gBAAc,WAAW,QAAqB,SAAS,MAAM,UAAU,MAAM,GAAK;AAAA,QAAC,OAAO,sBAAO,UAAU,sBAAO,UAAU,qBAAK,EAAG,MAAM;AAAA,MAAE;AAAA,MAAC,6CAAC,WAAO,gBAAM,OAAO,WAAS,MAAM,WAAW,MAAM,EAAE,QAAO;AAAA,SAArK,MAA6K,CAAS,GAAE;AAAA,IAC9W,6CAAC,SAAI,WAAU,2BAA2B,gBAAM,OAAO,WAAS,MAAM,WAAW,MAAM,EAAE,IAAI,WAAS,8CAAC,YAAO,WAAU,0BAAyB,MAAK,UAAwB,SAAS,MAAM;AAAC,kBAAY,MAAM,EAAE;AAAG,eAAS,MAAS;AAAA,IAAC,GAAG;AAAA,oDAAC,UAAK;AAAA,qDAAC,YAAQ,gBAAM,OAAM;AAAA,QAAS,8CAAC,WAAO;AAAA,gBAAM,MAAM;AAAA,UAAO;AAAA,UAAQ,MAAM,SAAS;AAAA,UAAO;AAAA,WAAI;AAAA,SAAQ;AAAA,MAAO,6CAAC,WAAM,0BAAE;AAAA,SAAhM,MAAM,EAAkM,CAAS,GAAE;AAAA,IACtX,CAAC,MAAM,KAAK,WAAS,MAAM,WAAW,MAAM,KAAK,6CAAC,mBAAgB,OAAM,gEAAa,QAAO,kLAAgC;AAAA,IAC5H,QAAQ,8CAAC,mBAAgB,OAAO,KAAK,OAAO,QAAO,8LAAkC,OAAO,MAAM;AAAC,UAAI,CAAC,KAAM,aAAY,MAAS;AAAA,IAAC,GAClI;AAAA,eAAS,6CAAC,mBAAiB,iBAAM;AAAA,MAClC,6CAAC,QAAG,WAAU,gCAAgC,eAAK,MAAM,IAAI,CAAC,MAAM,UAAU,6CAAC,QAAgB,kBAAR,KAAa,CAAK,GAAE;AAAA,MAC3G,8CAAC,aAAQ,WAAU,6BAA4B;AAAA,sDAAC,aAAQ;AAAA;AAAA,UAAQ,KAAK,SAAS;AAAA,WAAO;AAAA,QAAU,6CAAC,SAAK,eAAK,SAAS,IAAI,YAAU,8CAAC,gBAAoD;AAAA,uDAAC,OAAG,iBAAO,OAAM;AAAA,UAAI,6CAAC,WAAO,iBAAO,QAAO;AAAA,aAA/E,GAAG,OAAO,MAAM,IAAI,OAAO,KAAK,EAAuD,CAAa,GAAE;AAAA,SAAM;AAAA,MAC9P,6CAAC,YAAO,WAAU,8BAA8B,eAAK,WAAW,UAAU,8EAAE;AAAA,qDAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM;AAAC,eAAK,OAAO,UAAU;AAAA,QAAC,GAAG,0BAAE;AAAA,QAAS,6CAAC,YAAO,WAAU,cAAa,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM;AAAC,eAAK,OAAO,UAAU;AAAA,QAAC,GAAI,iBAAO,6BAAS,4BAAO;AAAA,SAAS,IAAM,KAAK,WAAW,aAAa,6CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM;AAAC,aAAK,OAAO,QAAQ;AAAA,MAAC,GAAI,iBAAO,6BAAS,yBAAc,IAAY,6CAAC,UAAK,kGAAc,GAAQ;AAAA,OACze;AAAA,KACF;AACF;;;AC7CA,IAAAE,gBAAuD;AAMhD,SAAS,kBAAqB,MAA0B,SAAS,GAAG;AACzE,QAAM,CAAC,UAAU,OAAO,QAAI,wBAAmC;AAC/D,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAiB;AAC3C,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,eAAW,sBAAO,CAAC;AACzB,QAAM,cAAU,sBAAwB;AACxC,QAAM,aAAS,2BAAY,YAA2B;AACpD,QAAI,CAAC,KAAM;AACX,YAAQ,SAAS,MAAM;AACvB,UAAM,aAAa,IAAI,gBAAgB;AAAG,YAAQ,UAAU;AAC5D,UAAM,WAAW,EAAE,SAAS;AAC5B,eAAW,IAAI;AACf,QAAI;AACF,YAAM,SAAS,MAAM,IAAO,MAAM,EAAC,QAAQ,WAAW,OAAM,CAAC;AAC7D,UAAI,aAAa,SAAS,WAAW,CAAC,WAAW,OAAO,SAAS;AAAC,gBAAQ,EAAC,MAAM,OAAO,OAAM,CAAC;AAAG,iBAAS,MAAS;AAAA,MAAC;AAAA,IACvH,SAAS,QAAQ;AACf,UAAI,aAAa,SAAS,WAAW,CAAC,WAAW,OAAO,QAAS,UAAS,aAAa,MAAM,CAAC;AAAA,IAChG,UAAE;AAAS,UAAI,aAAa,SAAS,QAAS,YAAW,KAAK;AAAA,IAAC;AAAA,EACjE,GAAG,CAAC,IAAI,CAAC;AACT,+BAAU,MAAM;AACd,YAAQ,MAAS;AAAG,aAAS,MAAS;AAAG,eAAW,QAAQ,IAAI,CAAC;AACjE,QAAI,WAAW;AAAO,QAAIC;AAC1B,UAAM,WAAW,MAAY;AAAC,UAAIA,OAAO,cAAaA,MAAK;AAAG,UAAI,CAAC,YAAY,SAAS,EAAG,CAAAA,SAAQ,WAAW,MAAM;AAAC,aAAK,KAAK;AAAA,MAAC,GAAG,MAAM;AAAA,IAAC;AAC1I,UAAM,OAAO,YAA2B;AACtC,UAAI,SAAU;AACd,UAAI,CAAC,SAAS,OAAQ,OAAM,OAAO;AACnC,eAAS;AAAA,IACX;AACA,UAAM,UAAU,MAAY;AAAC,UAAI,CAAC,SAAS,QAAQ;AAAC,YAAIA,OAAO,cAAaA,MAAK;AAAG,aAAK,KAAK;AAAA,MAAC;AAAA,IAAC;AAChG,SAAK,OAAO,EAAE,KAAK,QAAQ;AAC3B,QAAI,OAAQ,UAAS,iBAAiB,oBAAoB,OAAO;AACjE,WAAO,MAAM;AAAC,iBAAW;AAAM,UAAIA,OAAO,cAAaA,MAAK;AAAG,eAAS,oBAAoB,oBAAoB,OAAO;AAAG,QAAE,SAAS;AAAS,cAAQ,SAAS,MAAM;AAAA,IAAC;AAAA,EACxK,GAAG,CAAC,QAAQ,MAAM,CAAC;AACnB,SAAO,EAAC,MAAM,UAAU,SAAS,OAAO,UAAU,QAAQ,QAAW,OAAO,SAAS,OAAM;AAC7F;;;ARRkD,IAAAC,sBAAA;AAnB3C,SAAS,cAAc,EAAC,aAAa,SAAS,YAAY,QAAQ,SAAAC,SAAO,GAAkJ;AAChO,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAqB,SAAS;AACtD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AACrC,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAuC,QAAQ;AAC3E,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAqC,KAAK;AAClE,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AACrC,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAqB;AACzD,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAiB;AACzC,QAAM,WAAO,sBAA2B,IAAI;AAC5C,QAAM,OAAO,eAAe,mBAAmB,WAAW,CAAC;AAC3D,QAAM,QAAQ,kBAAmC,SAAS,UAAU,GAAG,IAAI,kBAAkB,MAAS;AACtG,QAAM,aAAa,MAAM,KAAK,EAAE,kBAAkB;AAClD,QAAM,UAAU,WAAW,SAAS,KAAK,UAAQ,KAAK,YAAY,OAAO;AACzE,QAAM,eAAW,uBAAQ,MAAM,WAAW,SAAS,OAAO,UAAQ,KAAK,YAAY,YAAY,WAAW,SAAS,KAAK,WAAW,YAC7H,SAAS,SAAS,KAAK,SAAS,UAAU,CAAC,cAAc,GAAG,KAAK,OAAO,IAAI,KAAK,OAAO,GAAG,kBAAkB,EAAE,SAAS,UAAU,EAAE,GAAG,CAAC,WAAW,UAAU,SAAS,QAAQ,MAAM,UAAU,CAAC;AACrM,QAAM,cAAc,WAAW,YAAY,OAAO,UAAQ,KAAK,YAAY,YAAY,CAAC,cAAc,GAAG,KAAK,IAAI,IAAI,KAAK,OAAO,GAAG,kBAAkB,EAAE,SAAS,UAAU,EAAE;AAC9K,QAAM,cAAc,YAAY,KAAK,UAAQ,KAAK,SAAS,IAAI;AAC/D,QAAM,aAAa,CAAC,UAA4B;AAAC,YAAQ,KAAK;AAAG,aAAS,EAAE;AAAG,aAAS,EAAE;AAAG,QAAI,KAAK,QAAS,MAAK,QAAQ,OAAO;AAAA,EAAK;AACxI,QAAM,MAAM,CAAC,SAAqB,8CAAC,YAAO,MAAK,UAAS,WAAU,0BAAuC,SAAS,MAAM,cAAc,IAAI,GACxI;AAAA,kDAAC,UAAK,WAAU,+BAA8B;AAAA,mDAAC,YAAQ,eAAK,SAAQ;AAAA,MAAS,6CAAC,OAAG,eAAK,SAAQ;AAAA,MAAI,8CAAC,WAAO;AAAA,mBAAW,KAAK,IAAI;AAAA,QAAE;AAAA,QAAI,KAAK,SAAS,6BAAS,GAAG,KAAK,MAAM,KAAK,aAAa,GAAG,CAAC;AAAA,QAAO;AAAA,QAAI,aAAa,KAAK,SAAS;AAAA,SAAE;AAAA,OAAQ;AAAA,IAC/O,6CAAC,UAAK,WAAU,4BAA2B,eAAa,KAAK,QAAS,wBAAc,KAAK,MAAM,GAAE;AAAA,OAFH,KAAK,EAGrG;AACA,SAAO,8CAAC,aAAQ,WAAU,iCACxB;AAAA,kDAAC,SAAI,WAAU,0BAAyB,cAAW,4BACjD;AAAA,oDAAC,YAAO,MAAK,UAAS,gBAAc,SAAS,WAAW,SAAS,MAAM,WAAW,SAAS,GAAG;AAAA,qDAAC,sDAAkB,MAAM,IAAI;AAAA,QAAE;AAAA,SAAE;AAAA,MAC/H,8CAAC,YAAO,MAAK,UAAS,gBAAc,SAAS,YAAY,SAAS,UAAU,SAAS,MAAM,WAAW,QAAQ,GAAG;AAAA,qDAAC,sDAAkB,MAAM,IAAI;AAAA,QAAE;AAAA,SAAE;AAAA,MAClJ,8CAAC,YAAO,MAAK,UAAS,gBAAc,SAAS,gBAAgB,SAAS,WAAW,SAAS,MAAM,WAAW,YAAY,GAAG;AAAA,qDAAC,wDAAoB,MAAM,IAAI;AAAA,QAAE;AAAA,SAAE;AAAA,MAC7J,8CAAC,aAAQ,WAAU,2BAA0B,KAAK,MAAM,WAAW,WAAS;AAAC,YAAI,MAAM,QAAQ,YAAY,KAAK,SAAS;AAAC,eAAK,QAAQ,OAAO;AAAO,eAAK,QAAQ,cAAc,SAAS,GAAG,MAAM;AAAA,QAAC;AAAA,MAAC,GAClM;AAAA,sDAAC,aAAQ,cAAW,wCAAU;AAAA,mBAAS,gBAAgB,6BAAS,SAAS,UAAU,6BAAS;AAAA,UAAK;AAAA,UAAC,6CAAC,UAAK,eAAY,QAAO,oBAAC;AAAA,WAAO;AAAA,QACnI,8CAAC,SAAI;AAAA,wDAAC,YAAO,MAAK,UAAS,SAAS,MAAM,WAAW,aAAa,GAAG;AAAA,yDAAC,yDAAqB,MAAM,IAAI;AAAA,YAAE;AAAA,YAAK,6CAAC,WAAO,kBAAQ,YAAY,OAAO,UAAQ,KAAK,WAAW,OAAO,EAAE,UAAU,GAAE;AAAA,aAAQ;AAAA,UAAS,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,WAAW,OAAO,GAAG;AAAA,yDAAC,sDAAkB,MAAM,IAAI;AAAA,YAAE;AAAA,aAAI;AAAA,WAAS;AAAA,SACrT;AAAA,OACF;AAAA,KACE,SAAS,YAAY,SAAS,aAAa,8CAAC,SAAI,WAAU,8BAA6B,cAAW,4BAAO;AAAA,mDAAC,YAAO,MAAK,UAAS,gBAAc,SAAS,UAAU,SAAS,MAAM,WAAW,QAAQ,GAAG,sCAAI;AAAA,MAAS,6CAAC,YAAO,MAAK,UAAS,gBAAc,SAAS,UAAU,SAAS,MAAM,WAAW,QAAQ,GAAG,sCAAI;AAAA,OAAS;AAAA,KAC3T,SAAS,gBAAgB,SAAS,cAAc,8CAAC,SAAI,WAAU,8BAA6B,cAAW,4BAAO;AAAA,mDAAC,YAAO,MAAK,UAAS,gBAAc,SAAS,cAAc,SAAS,MAAM,WAAW,YAAY,GAAG,sCAAI;AAAA,MAAS,6CAAC,YAAO,MAAK,UAAS,gBAAc,SAAS,WAAW,SAAS,MAAM,WAAW,SAAS,GAAG,sCAAI;AAAA,OAAS;AAAA,IAC3U,SAAS,aAAa,SAAS,iBAAiB,8CAAC,SAAI,WAAU,8BAA6B;AAAA,oDAAC,WAAM,WAAU,6BAA4B;AAAA,qDAAC,UAAK,WAAU,WAAU,kDAAM;AAAA,QAAO,6CAAC,WAAM,MAAK,UAAS,aAAa,SAAS,YAAY,qDAAa,wCAAU,OAAO,OAAO,UAAU,WAAS;AAAC,mBAAS,MAAM,OAAO,KAAK;AAAG,mBAAS,EAAE;AAAA,QAAC,GAAG;AAAA,SAAE;AAAA,MAAS,SAAS,YAAY,8EAC5W;AAAA,sDAAC,WAAM;AAAA,uDAAC,UAAK,WAAU,WAAU,sCAAI;AAAA,UAAO,8CAAC,YAAO,cAAW,4BAAO,OAAO,QAAQ,UAAU,WAAS;AAAC,sBAAU,MAAM,OAAO,KAAsB;AAAG,qBAAS,EAAE;AAAA,UAAC,GAAG;AAAA,yDAAC,YAAO,OAAM,OAAM,sCAAI;AAAA,YAAU,OAAO,QAAQ,aAAa,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,6CAAC,YAAmB,OAAe,mBAAtB,KAA4B,CAAS;AAAA,aAAE;AAAA,WAAS;AAAA,QAC7T,8CAAC,WAAM;AAAA,uDAAC,UAAK,WAAU,WAAU,sCAAI;AAAA,UAAO,8CAAC,YAAO,cAAW,4BAAO,OAAO,MAAM,UAAU,WAAS;AAAC,oBAAQ,MAAM,OAAO,KAAoB;AAAG,qBAAS,EAAE;AAAA,UAAC,GAAG;AAAA,yDAAC,YAAO,OAAM,OAAM,sCAAI;AAAA,YAAW,CAAC,WAAW,cAAc,QAAQ,SAAS,gBAAgB,SAAS,EAAY,IAAI,WAAS,6CAAC,YAAmB,OAAe,qBAAW,KAAK,KAAtC,KAAwC,CAAS;AAAA,aAAE;AAAA,WAAS;AAAA,SAC7W;AAAA,OAAI;AAAA,IACH,SAAS,aAAa,8CAAC,SAAI,WAAU,8BAA6B;AAAA,oDAAC,YAAO;AAAA,sDAAC,UAAK;AAAA,uDAAC,WAAM,sFAAY;AAAA,UAAQ,6CAAC,QAAG,wDAAO;AAAA,WAAK;AAAA,QAAO,6CAAC,WAAO,mBAAS,YAAY,sBAAO,aAAa,QAAQ,SAAS,CAAC,KAAK,wCAAS;AAAA,SAAQ;AAAA,MAC1N,8CAAC,aAAQ;AAAA,qDAAC,QAAG,sCAAI;AAAA,QAAK,6CAAC,SAAI,WAAU,2BAA2B,mBAAS,QAAQ,IAAI,GAAG,GAAE;AAAA,QAAO,CAAC,SAAS,QAAQ,UAAU,6CAAC,mBAAgB,OAAM,kFAAgB,QAAO,oJAA2B;AAAA,SAAG;AAAA,MACzM,8CAAC,aAAQ;AAAA,qDAAC,QAAG,kDAAM;AAAA,QAAK,6CAAC,SAAI,WAAU,2BAA2B,mBAAS,aAAa,IAAI,GAAG,GAAE;AAAA,QAAO,CAAC,SAAS,aAAa,UAAU,6CAAC,mBAAgB,OAAM,oDAAW,QAAO,kIAAwB;AAAA,SAAG;AAAA,MAC5M,WAAW,8CAAC,OAAE,WAAU,2BAA2B;AAAA,gBAAQ;AAAA,QAAc;AAAA,QAAU,QAAQ;AAAA,QAAY;AAAA,QAAO,8CAAC,UAAK,OAAO,QAAQ,SAAS;AAAA;AAAA,UAAQ,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAAA,WAAE;AAAA,SAAO;AAAA,OAC1L;AAAA,IACC,SAAS,YAAY,8EAAE;AAAA,oDAAC,OAAE,WAAU,2BAA0B;AAAA;AAAA,QAAmB,SAAS;AAAA,QAAO;AAAA,SAAe;AAAA,MAAI,6CAAC,SAAI,WAAU,2BAA2B,mBAAS,MAAM,GAAG,KAAK,EAAE,IAAI,GAAG,GAAE;AAAA,MAAO,CAAC,SAAS,UAAU,6CAAC,mBAAgB,OAAM,8CAAU,QAAO,wIAAyB;AAAA,MAAI,SAAS,SAAS,SAAS,6CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,SAAS,WAAS,QAAQ,EAAE,GAAG,0CAAQ;AAAA,OAAU;AAAA,IACjZ,SAAS,YAAY,8EAAE;AAAA,mDAAC,OAAE,WAAU,2BAA0B,kMAA8B;AAAA,MAAK,QAAQ,OAAO,OAAO,WAAS,CAAC,cAAc,GAAG,MAAM,KAAK,IAAI,MAAM,OAAO,GAAG,kBAAkB,EAAE,SAAS,UAAU,CAAC,EAAE,IAAI,WAAS,8CAAC,aAAQ,WAAU,6BAA2C;AAAA,sDAAC,aAAQ;AAAA,uDAAC,YAAQ,gBAAM,OAAM;AAAA,UAAS,8CAAC,WAAO;AAAA,kBAAM,UAAU;AAAA,YAAO;AAAA,aAAI;AAAA,WAAQ;AAAA,QAAU,8CAAC,SAAI;AAAA,uDAAC,OAAG,gBAAM,SAAQ;AAAA,UAAI,6CAAC,WAAO,uBAAa,MAAM,SAAS,GAAE;AAAA,WAAQ;AAAA,WAA/K,MAAM,EAA+K,CAAU;AAAA,MAAG,CAAC,QAAQ,OAAO,KAAK,WAAS,CAAC,eAAe,MAAM,QAAQ,MAAM,MAAM,SAAS,kBAAkB,EAAE,SAAS,UAAU,CAAC,KAAK,6CAAC,mBAAgB,OAAO,aAAa,2DAAc,8CAAW,QAAO,0JAA4B;AAAA,OAAG;AAAA,IAChsB,SAAS,gBAAgB,8EAAE;AAAA,mDAAC,SAAI,WAAU,2BAA2B,sBAAY,IAAI,SAAO,8CAAC,YAAO,WAAU,0BAAyB,MAAK,UAA4C,SAAS,MAAM,QAAQ,IAAI,IAAI,GAAG;AAAA,sDAAC,UAAK;AAAA,uDAAC,YAAQ,cAAI,MAAK;AAAA,UAAS,6CAAC,OAAG,cAAI,SAAQ;AAAA,UAAI,8CAAC,WAAO;AAAA,gBAAI;AAAA,YAAU;AAAA,YAAQ,IAAI,eAAe;AAAA,YAAO;AAAA,aAAI;AAAA,WAAQ;AAAA,QAAO,6CAAC,WAAM,0BAAE;AAAA,WAAzM,GAAG,IAAI,OAAO,IAAI,IAAI,IAAI,EAAuL,CAAS,GAAE;AAAA,MAAO,CAAC,YAAY,UAAU,6CAAC,mBAAgB,OAAM,oDAAW,QAAO,0GAAoB;AAAA,OAAG;AAAA,IACpd,SAAS,aAAa,6CAAC,eAA0B,MAAY,SAAkB,OAAO,cAA9C,OAA0D;AAAA,IAClG,SAAS,iBAAiB,6CAAC,kBAAe,OAAO,QAAQ,eAAe,CAAC,GAAG,MAAY,SAAkB,SAASA,UAAS;AAAA,IAC5H,SAAS,WAAW,8EAAG;AAAA,YAAM,SAAS,8CAAC,mBAAiB;AAAA,cAAM;AAAA,QAAM;AAAA,QAAC,6CAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAAC,eAAK,MAAM,OAAO;AAAA,QAAC,GAAG,0BAAE;AAAA,SAAS;AAAA,MAAoB,MAAM,OAAO,6CAAC,eAAY,OAAO,EAAC,UAAU,MAAM,KAAK,SAAS,OAAO,UAAQ,KAAK,YAAY,OAAO,GAAG,WAAW,MAAM,KAAK,UAAU,OAAO,UAAQ,KAAK,YAAY,OAAO,EAAC,GAAG,UAAU,WAAW,SAAS,OAAO,UAAQ,KAAK,YAAY,OAAO,GAAG,OAAO,YAAY,SAAS,eAAe,IAAK,CAAC,MAAM,SAAS,6CAAC,mBAAgB,OAAM,oDAAW;AAAA,OAAG;AAAA,IAClgB,cAAc,6CAAC,gBAAiC,aAA0B,MAAM,YAAY,OAAO,MAAM,cAAc,MAAS,GAAG,SAASA,YAA3G,WAAW,EAAyG;AAAA,IACrJ,eAAe,6CAAC,mBAAgB,OAAO,GAAG,YAAY,IAAI,6BAAS,QAAO,4HAAuB,OAAO,MAAM,QAAQ,MAAS,GAAG,uDAAC,yBAAsB,OAAO,aAAa,GAAE;AAAA,KAClL;AACF;;;ASjEA,IAAAC,iBAA+B;AA2B4C,IAAAC,sBAAA;AArBpE,SAAS,mBAAmB,EAAC,WAAW,MAAM,OAAO,UAAS,GAAqH;AACzL,QAAM,CAAC,YAAW,aAAa,QAAI,yBAAyB,MAAI,gBAAgB,UAAU,UAAU,CAAC;AACrG,QAAM,WAAO,uBAAO,KAAK;AACzB,QAAM,CAAC,MAAK,OAAO,QAAI,yBAAS,KAAK;AACrC,QAAM,CAAC,OAAM,QAAQ,QAAI,yBAAiB;AAC1C,QAAM,CAAC,QAAO,SAAS,QAAI,yBAAiB;AAC5C,QAAM,EAAC,MAAM,cAAa,OAAO,aAAY,IAAI,kBAAoC,SAAO,WAAS,YAAU,MAAS;AACxH,QAAM,oBAAkB,UAAU,YAAY,cAAc,iBAAiB,YAAY;AACzF,QAAM,mBAAiB,WAAW,OAAO,YAAY;AACrD,QAAM,eAAa,cAAc,UAAU,KAAK,UAAM,KAAK,OAAK,gBAAgB,GAAG,UAAU,CAAC;AAC9F,QAAM,OAAK,YAAwB;AAClC,QAAG,KAAK,QAAQ;AAAO,SAAK,UAAQ;AAAK,YAAQ,IAAI;AAAE,aAAS,MAAS;AAAE,cAAU,MAAS;AAC9F,QAAI;AAAC,YAAM,IAAI,iBAAe,mBAAmB,UAAU,EAAE,IAAE,eAAc,EAAC,QAAO,OAAM,MAAK,KAAK,UAAU,EAAC,YAAW,EAAC,GAAG,UAAU,YAAW,CAAC,IAAI,GAAE,WAAW,IAAI,EAAC,EAAC,CAAC,EAAC,CAAC;AAAE,gBAAU,gCAAO;AAAE,YAAM,UAAU;AAAA,IAAC,SAC/M,QAAO;AAAC,eAAS,aAAa,MAAM,CAAC;AAAA,IAAC,UAAC;AAAQ,WAAK,UAAQ;AAAM,cAAQ,KAAK;AAAA,IAAC;AAAA,EACvF;AACA,QAAM,SAAO,YAAwB;AACpC,QAAG,KAAK,QAAQ;AAAO,SAAK,UAAQ;AAAK,YAAQ,IAAI;AAAE,aAAS,MAAS;AAAE,cAAU,MAAS;AAC9F,QAAI;AAAC,YAAM,SAAO,MAAM,IAAoD,iBAAe,mBAAmB,UAAU,EAAE,IAAE,kBAAiB,EAAC,QAAO,OAAM,CAAC;AAAE,gBAAU,OAAO,UAAU,8BAAQ,OAAO,WAAS,+BAAS,OAAO,SAAO,SAAI;AAAE,YAAM,UAAU;AAAA,IAAC,SACzP,QAAO;AAAC,eAAS,aAAa,MAAM,CAAC;AAAA,IAAC,UAAC;AAAQ,WAAK,UAAQ;AAAM,cAAQ,KAAK;AAAA,IAAC;AAAA,EACvF;AACA,SAAO,6CAAC,mBAAgB,OAAO,SAAO,WAAS,6BAAO,wCAAU,QAAQ,SAAO,WAAS,uKAA8B,0JAA6B,OAAO,MAAI;AAAC,QAAG,CAAC,KAAK,OAAM;AAAA,EAAC,GAC9K,wDAAC,SAAI,WAAU,+BAAgC;AAAA,cAAS,iBAAiB,6CAAC,mBAAiB,mBAAS,cAAa;AAAA,IAAoB,UAAU,6CAAC,mBAAgB,MAAK,WAAW,kBAAO;AAAA,IACtL,SAAO,WAAU,8CAAC,aAAQ,WAAU,0BACjC;AAAA,oDAAC,YAAO;AAAA,sDAAC,UAAK;AAAA,uDAAC,YAAO,wDAAO;AAAA,UAAS,6CAAC,WAAM,sOAAoC;AAAA,WAAQ;AAAA,QAAO,6CAAC,YAAO,MAAK,UAAS,WAAU,sBAAqB,UAAU,MAAM,MAAK,UAAS,WAAS,WAAW,OAAO,SAAS,gBAAc,WAAW,OAAO,SAAS,cAAW,wCAAS,SAAS,MAAM,cAAc,CAAAC,cAAY,EAAE,GAAGA,UAAS,QAAQ,EAAE,GAAGA,SAAQ,QAAQ,SAAS,CAACA,SAAQ,OAAO,QAAQ,EAAE,EAAE,GAAG,uDAAC,OAAE,GAAE;AAAA,SAAS;AAAA,MAC9Z,8CAAC,SAAI,WAAU,iDAAgD;AAAA,qDAAC,aAAM,OAAM,wCAAS,MAAK,4EAAe,wDAAC,YAAO,OAAO,WAAW,OAAO,eAAe,UAAU,WAAS,cAAc,CAAAA,cAAY,EAAE,GAAGA,UAAS,QAAQ,EAAE,GAAGA,SAAQ,QAAQ,eAAe,OAAO,MAAM,OAAO,KAAK,EAAE,EAAE,EAAE,GAAG;AAAA,uDAAC,YAAO,OAAO,GAAG,sCAAI;AAAA,UAAS,6CAAC,YAAO,OAAO,IAAI,uBAAI;AAAA,UAAS,6CAAC,YAAO,OAAO,IAAI,uBAAI;AAAA,UAAS,6CAAC,YAAO,OAAO,KAAK,wBAAK;AAAA,UAAS,6CAAC,YAAO,OAAO,KAAK,sBAAG;AAAA,UAAS,6CAAC,YAAO,OAAO,MAAM,sBAAG;AAAA,WAAS,GAAS;AAAA,QAAQ,6CAAC,aAAM,OAAM,yBAAc,MAAK,wCAAS,wDAAC,YAAO,OAAO,WAAW,OAAO,YAAY,IAAI,UAAU,WAAS,cAAc,CAAAA,cAAY,EAAE,GAAGA,UAAS,QAAQ,EAAE,GAAGA,SAAQ,QAAQ,UAAU,MAAM,OAAO,OAAO,OAAO,GAAG,EAAE,EAAE,GAAG;AAAA,wDAAC,YAAO,OAAM,IAAG;AAAA;AAAA,YAAQ,qBAAqB;AAAA,aAAS;AAAA,UAAU,cAAc,UAAU,IAAI,cAAY,6CAAC,YAAO,OAAO,SAAS,IAAuB,mBAAS,QAAQ,SAAS,MAAxC,SAAS,EAAkC,CAAS;AAAA,WAAE,GAAS;AAAA,QAAQ,6CAAC,aAAM,OAAM,4BAAO,MAAK,wCAAS,wDAAC,YAAO,OAAO,WAAW,OAAO,SAAS,IAAI,UAAU,WAAS,cAAc,CAAAA,cAAY,EAAE,GAAGA,UAAS,QAAQ,EAAE,GAAGA,SAAQ,QAAQ,OAAO,MAAM,OAAO,MAAM,EAAE,EAAE,GAAG;AAAA,wDAAC,YAAO,OAAM,IAAG;AAAA;AAAA,YAAQ,UAAU,SAAS,cAAc,iBAAiB,SAAS;AAAA,aAAS;AAAA,UAAU,aAAa,IAAI,WAAS,6CAAC,YAAO,OAAO,MAAM,IAAoB,gBAAM,QAAQ,MAAM,MAA/B,MAAM,EAA4B,CAAS;AAAA,WAAE,GAAS;AAAA,SAAQ;AAAA,MAC70C,8CAAC,SAAI,WAAU,6BAA4B;AAAA,qDAAC,YAAO,MAAK,UAAS,WAAU,sBAAqB,UAAU,MAAM,MAAK,UAAS,WAAS,WAAW,OAAO,oBAAoB,gBAAc,WAAW,OAAO,oBAAoB,cAAW,wCAAS,SAAS,MAAM,cAAc,CAAAA,cAAY,EAAE,GAAGA,UAAS,QAAQ,EAAE,GAAGA,SAAQ,QAAQ,oBAAoB,CAACA,SAAQ,OAAO,mBAAmB,EAAE,EAAE,GAAG,uDAAC,OAAE,GAAE;AAAA,QAAS,8CAAC,UAAK;AAAA,uDAAC,YAAO,sCAAI;AAAA,UAAS,6CAAC,WAAM,sIAAoB;AAAA,WAAQ;AAAA,QAAO,6CAAC,WAAM,uDAAC,YAAO,cAAW,wCAAS,OAAO,WAAW,OAAO,iBAAiB,UAAU,WAAS,cAAc,CAAAA,cAAY,EAAE,GAAGA,UAAS,QAAQ,EAAE,GAAGA,SAAQ,QAAQ,iBAAiB,OAAO,MAAM,OAAO,KAAK,EAAE,EAAE,EAAE,GAAI,gBAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,SAAS,8CAAC,YAAO,OAAO,MAAkB;AAAA,iBAAO,IAAI,EAAE,SAAS,GAAG,GAAG;AAAA,UAAE;AAAA,aAArC,IAAwC,CAAS,GAAE,GAAS;AAAA,QAAQ,6CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM;AAAE,eAAK,OAAO;AAAA,QAAE,GAAG,sCAAI;AAAA,SAAS;AAAA,OACh5B,IAAa,8CAAC,aAAQ,WAAU,0BAC9B;AAAA,oDAAC,YAAO;AAAA,sDAAC,UAAK;AAAA,uDAAC,YAAO,sCAAI;AAAA,UAAS,6CAAC,WAAM,4OAAqC;AAAA,WAAQ;AAAA,QAAO,6CAAC,YAAO,MAAK,UAAS,WAAU,sBAAqB,UAAU,MAAM,MAAK,UAAS,WAAS,WAAW,UAAU,SAAS,gBAAc,WAAW,UAAU,SAAS,cAAW,wCAAS,SAAS,MAAM,cAAc,CAAAA,cAAY,EAAE,GAAGA,UAAS,WAAW,EAAE,GAAGA,SAAQ,WAAW,SAAS,CAACA,SAAQ,UAAU,QAAQ,EAAE,EAAE,GAAG,uDAAC,OAAE,GAAE;AAAA,SAAS;AAAA,MAC3a,8CAAC,SAAI,WAAU,8CACb;AAAA,qDAAC,aAAM,OAAM,4BAAO,wDAAC,YAAO,OAAO,WAAW,UAAU,iBAAiB,UAAU,WAAS,cAAc,CAAAA,cAAY,EAAE,GAAGA,UAAS,WAAW,EAAE,GAAGA,SAAQ,WAAW,iBAAiB,OAAO,MAAM,OAAO,KAAK,EAAE,EAAE,EAAE,GAAG;AAAA,uDAAC,YAAO,OAAO,IAAI,6BAAK;AAAA,UAAS,6CAAC,YAAO,OAAO,IAAI,4BAAI;AAAA,UAAS,6CAAC,YAAO,OAAO,KAAK,4BAAI;AAAA,UAAS,6CAAC,YAAO,OAAO,KAAK,4BAAI;AAAA,UAAS,6CAAC,YAAO,OAAO,KAAK,6BAAK;AAAA,UAAS,6CAAC,YAAO,OAAO,MAAM,6BAAK;AAAA,WAAS,GAAS;AAAA,QAC3a,6CAAC,aAAM,OAAM,kCAAQ,uDAAC,WAAM,MAAK,UAAS,KAAK,GAAG,KAAK,IAAI,OAAO,WAAW,UAAU,gBAAgB,UAAU,WAAS,cAAc,CAAAA,cAAY,EAAE,GAAGA,UAAS,WAAW,EAAE,GAAGA,SAAQ,WAAW,gBAAgB,OAAO,MAAM,OAAO,KAAK,EAAE,EAAE,EAAE,GAAG,GAAE;AAAA,QACzP,6CAAC,aAAM,OAAM,kCAAQ,uDAAC,WAAM,MAAK,UAAS,KAAK,GAAG,KAAK,IAAI,OAAO,WAAW,UAAU,cAAc,UAAU,WAAS,cAAc,CAAAA,cAAY,EAAE,GAAGA,UAAS,WAAW,EAAE,GAAGA,SAAQ,WAAW,cAAc,OAAO,MAAM,OAAO,KAAK,EAAE,EAAE,EAAE,GAAG,GAAE;AAAA,QACrP,6CAAC,aAAM,OAAM,4BAAO,wDAAC,YAAO,OAAO,WAAW,UAAU,YAAY,UAAU,WAAS,cAAc,CAAAA,cAAY,EAAE,GAAGA,UAAS,WAAW,EAAE,GAAGA,SAAQ,WAAW,YAAY,OAAO,MAAM,OAAO,KAAK,EAAE,EAAE,EAAE,GAAG;AAAA,uDAAC,YAAO,OAAO,GAAG,0BAAE;AAAA,UAAS,6CAAC,YAAO,OAAO,GAAG,sBAAG;AAAA,UAAS,6CAAC,YAAO,OAAO,GAAG,sBAAG;AAAA,UAAS,6CAAC,YAAO,OAAO,GAAG,sBAAG;AAAA,UAAS,6CAAC,YAAO,OAAO,GAAG,sBAAG;AAAA,UAAS,6CAAC,YAAO,OAAO,GAAG,sBAAG;AAAA,WAAS,GAAS;AAAA,SAC9Y;AAAA,OACN;AAAA,IACE,8CAAC,YAAO,WAAU,8BAA6B;AAAA,mDAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,OAAO,0BAAE;AAAA,MAAS,6CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,MAAM,SAAS,MAAI;AAAC,aAAK,KAAK;AAAA,MAAC,GAAI,iBAAK,mCAAQ,4BAAO;AAAA,OAAS;AAAA,KAAS,GACjP;AACD;;;ACzCS,IAAAC,uBAAA;AAFF,SAAS,kBAAkB,EAAC,QAAQ,MAAK,GAAqC;AACnF,MAAG,CAAC,MAAM,QAAO;AACjB,SAAO,+CAAC,WAAM,WAAU,gCAA+B;AAAA;AAAA,IAAM;AAAA,IAAO,WAAS,eAAa,+FAAkB;AAAA,KAAG;AACjH;;;AboCuG,IAAAC,uBAAA;AA7BhG,SAAS,YAAY,EAAC,WAAW,UAAU,aAAa,cAAc,cAAc,UAAS,GAGpF;AACd,QAAMC,YAAW,SAAS,SAAS,OAAO,UAAQ,KAAK,gBAAgB,UAAU,EAAE,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE,SAAS,OAAO,IAAI,OAAO,EAAE,SAAS,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa;AAChM,QAAM,CAAC,gBAAgB,QAAQ,QAAI,yBAAS,EAAE;AAC9C,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AAC9C,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,WAAO,uBAAO,KAAK;AACzB,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAiB;AAC7C,QAAM,OAAO,eAAe,mBAAmB,UAAU,EAAE,CAAC;AAC5D,QAAM,eAAeA,UAAS,CAAC,IAAI,GAAGA,UAAS,CAAC,EAAE,SAAS,IAAIA,UAAS,CAAC,EAAE,MAAM,KAAK;AACtF,QAAM,YAAY,kBAAkB;AACpC,QAAM,aAAa,kBAAoC,GAAG,IAAI,UAAU,YAAY,IAAI,IAAI,gBAAgB,EAAC,SAAS,UAAS,CAAC,CAAC,KAAK,EAAE,IAAI,IAAM;AAClJ,QAAM,UAAU,aAAa,WAAW,MAAM,SAAS,CAAC,GAAG,WAAW;AACtE,QAAM,SAAS,kBAAgC,UAAU,GAAG,IAAI,kBAAkB,IAAI,gBAAgB,EAAC,QAAO,CAAC,CAAC,KAAK,QAAW,IAAM;AACtI,QAAM,SAAS,YAA2B;AAAC,UAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,GAAG,OAAO,OAAO,CAAC,CAAC;AAAA,EAAC;AACpG,QAAM,MAAM,OAAO,QAA6B,YAAmC;AACjF,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AAAM,YAAQ,IAAI;AAAG,aAAS,MAAS;AAAG,cAAU,MAAS;AAC5E,QAAI;AAAC,YAAM,OAAO;AAAG,gBAAU,OAAO;AAAG,YAAM,OAAO;AAAA,IAAC,SAChD,QAAQ;AAAC,eAAS,aAAa,MAAM,CAAC;AAAA,IAAC,UAC9C;AAAS,WAAK,UAAU;AAAO,cAAQ,KAAK;AAAA,IAAC;AAAA,EAC/C;AACA,QAAM,UAAU,OAAO,MAAM,cAAc,OAAO,MAAM,KAAK,OAAO,SAAO,IAAI,WAAW,UAAU,EAAE,UAAU;AAChH,QAAM,CAAC,aAAY,cAAc,QAAI,yBAAS,KAAK;AACnD,QAAM,SAAS,WAAW,MAAM,YAAY,CAAC;AAC7C,SAAO,+CAAC,SAAI,WAAU,2BACpB;AAAA,kDAAC,iBAAc,SAAQ,oBAAmB,OAAM,sBAAM,QAAO,gKAA6B,SAAS,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,YAAY,IAAI,GAAG,sCAAI,GAAW;AAAA,IAC1K,+CAAC,SAAI,WAAU,8BAA6B;AAAA,qDAAC,WAAM;AAAA,sDAAC,UAAK,4CAAK;AAAA,QAAO,+CAAC,YAAO,cAAW,kCAAQ,OAAO,SAAS,UAAU,WAAS;AAAC,mBAAS,MAAM,OAAO,KAAK;AAAG,mBAAS,MAAS;AAAG,oBAAU,MAAS;AAAA,QAAC,GACxM;AAAA,WAAC,OAAO,UAAU,8CAAC,YAAO,OAAO,SAAU,oBAAU,6BAAS,kCAAQ;AAAA,UACtE,OAAO,IAAI,aAAW,8CAAC,YAAO,OAAO,QAAQ,SAAgC,UAAAA,UAAS,KAAK,aAAW,QAAQ,SAAS,WAAW,GAAG,QAAQ,SAAS,IAAI,QAAQ,MAAM,OAAO,QAAQ,OAAO,IAAI,6BAAS,QAAQ,SAAxJ,QAAQ,OAAsJ,CAAS;AAAA,WACrO;AAAA,SAAS;AAAA,MAAQ,8CAAC,UAAK,WAAU,4BAA4B,oBAAU,WAAW,OAAO,UAAU,mCAAU,kCAAQ;AAAA,MAAO,8CAAC,YAAO,MAAK,UAAS,cAAW,4BAAO,UAAU,WAAW,WAAW,OAAO,SAAS,SAAS,MAAM;AAAC,aAAK,OAAO;AAAA,MAAC,GAAG,wDAAC,yDAAqB,MAAM,IAAI,GAAE;AAAA,OAAS;AAAA,KAC7R,SAAS,WAAW,SAAS,OAAO,UAAU,8CAAC,mBAAiB,mBAAS,WAAW,SAAS,OAAO,OAAM;AAAA,IAAoB,UAAU,8CAAC,mBAAgB,MAAK,WAAW,kBAAO;AAAA,IACjL,CAAC,CAAC,OAAO,MAAM,KAAK,UAAU,+CAAC,aAAQ,WAAU,2BAA0B;AAAA,qDAAC,aAAS;AAAA,eAAO,KAAK,YAAY,OAAO,KAAK,KAAK;AAAA,QAAO;AAAA,QAAU;AAAA,QAAQ;AAAA,QAAM,8CAAC,WAAM,wGAAe;AAAA,SAAQ;AAAA,MAAU,+CAAC,SAAK;AAAA,eAAO,KAAK,KAAK,MAAM,GAAG,cAAc,MAAM,EAAE,EAAE,IAAI,SAAO,+CAAC,SAAiB;AAAA,yDAAC,UAAM;AAAA,gBAAI,MAAM,8CAAC,WAAO,cAAI,KAAK,IAAI,EAAE,EAAE,eAAe,GAAE;AAAA,YAAU,IAAI,WAAW,eAAe,6BAAS,IAAI,WAAW,aAAa,sBAAO,IAAI,QAAQ,6BAAW,IAAI,KAAK,IAAI,MAAM,EAAE,mBAAmB,CAAC,KAAK;AAAA,YAAc,8CAAC,qBAAkB,QAAQ,IAAI,QAAS,GAAI,IAAI,QAAQ,EAAC,OAAM,IAAI,MAAK,IAAI,CAAC,GAAI;AAAA,YAAG,IAAI,YAAY,KAAK,IAAI,WAAW,cAAc,8CAAC,WAAM,kGAAc;AAAA,aAAS;AAAA,UAAQ,IAAI,WAAW,cAAc,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM;AAAC,iBAAK,IAAI,YAAY;AAAC,oBAAM,IAAI,GAAG,IAAI,gBAAgB,mBAAmB,IAAI,EAAE,CAAC,IAAI,IAAI,gBAAgB,EAAC,QAAO,CAAC,CAAC,IAAI,EAAC,QAAQ,OAAM,CAAC;AAAA,YAAC,GAAG,4FAAiB;AAAA,UAAC,GAAG,sCAAI;AAAA,aAA7oB,IAAI,EAAmpB,CAAM;AAAA,QAAG,OAAO,KAAK,KAAK,SAAO,MAAM,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAI,eAAe,CAAC,WAAW,GAAI,wBAAY,iBAAK,wCAAS;AAAA,SAAY,OAAO,KAAK,YAAY,KAAG,OAAO,8CAAC,OAAE,mIAAsB;AAAA,SAAK;AAAA,OAAM;AAAA,IAC9nC,CAAC,WAAW,OAAO,8CAAC,mBAAgB,OAAO,WAAW,QAAQ,yCAAW,wCAAU,QAAQ,WAAW,QAAQ,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAAC,WAAK,OAAO;AAAA,IAAC,GAAG,0BAAE,IAAY,QAAW,IAAK,8CAAC,iBAA4B,aAAa,UAAU,IAAI,SAAkB,YAAY,WAAW,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAjH,OAAyH;AAAA,IAChV,+CAAC,aAAQ,WAAU,yCAAwC;AAAA,qDAAC,aAAQ;AAAA;AAAA,QAAK,8CAAC,WAAO,UAAAA,UAAS,QAAO;AAAA,SAAQ;AAAA,MAAU,+CAAC,SAAK;AAAA,QAAAA,UAAS,IAAI,aAAW,+CAAC,SAAI,WAAU,8BAA8C;AAAA,yDAAC,UAAK;AAAA,0DAAC,YAAQ,kBAAQ,SAAS,UAAU,6BAAS,uCAAW,QAAQ,OAAO,MAAM,EAAE,CAAC,IAAG;AAAA,YAAS,8CAAC,WAAO,kBAAQ,WAAW,uBAAQ,kCAAQ;AAAA,aAAQ;AAAA,UAAO,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM;AAAC,iBAAK,IAAI,MAAM,QAAQ,WAAW,aAAa,QAAQ,EAAE,IAAI,YAAY,QAAQ,IAAI,QAAQ,SAAS,GAAG,QAAQ,WAAW,yCAAW,gCAAO;AAAA,UAAC,GAAI,kBAAQ,WAAW,6BAAS,4BAAO;AAAA,aAApZ,QAAQ,EAAqZ,CAAM;AAAA,QAAG,CAACA,UAAS,UAAU,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM;AAAC,eAAK,IAAI,MAAM,aAAa,UAAU,EAAE,GAAG,gCAAO;AAAA,QAAC,GAAG,sCAAI;AAAA,SAAU;AAAA,OAAM;AAAA,IAC3vB,YAAY,8CAAC,sBAAmB,WAAsB,MAAK,UAAS,OAAO,MAAM,YAAY,KAAK,GAAG,WAAW,YAAY;AAAC,YAAM,UAAU;AAAG,YAAM,OAAO;AAAA,IAAC,GAAG;AAAA,KACpK;AACF;;;AclDA,IAAAC,iBAA0C;AAC1C,IAAAC,mCAAmC;;;ACDnC,IAAAC,iBAAiE;AACjE,IAAAC,mCAAoH;;;ACD7G,SAAS,WAAW,OAAe,MAAM,KAAK,IAAI,GAAW;AAClE,QAAM,UAAU,KAAK,MAAM,QAAQ,OAAO,GAAM;AAChD,MAAI,WAAW,EAAG,QAAO;AACzB,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,QAAQ,KAAK,KAAK,UAAU,EAAE;AACpC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK;AAC/B,QAAM,OAAO,KAAK,KAAK,QAAQ,EAAE;AACjC,MAAI,QAAQ,EAAG,QAAO,GAAG,IAAI;AAC7B,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,QAAM,QAAQ,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,QAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,QAAM,OAAO,OAAO,KAAK,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,QAAM,SAAS,OAAO,KAAK,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACxD,SAAO,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,MAAM;AAC1C;;;ACdA,IAAAC,iBAAsC;AACtC,IAAAC,mCAAuC;AAmB9B,IAAAC,uBAAA;AAdF,SAAS,oBAAoB,EAAC,aAAa,MAAM,UAAU,UAAS,GAAyF;AAClK,QAAM,CAAC,MAAK,OAAO,QAAE,yBAAS,KAAK;AACnC,QAAM,CAAC,MAAK,OAAO,QAAE,yBAAS,KAAK;AACnC,QAAM,CAAC,OAAM,QAAQ,QAAE,yBAAS,EAAE;AAClC,QAAM,WAAK,uBAAO,KAAK;AACvB,QAAM,QAAM,MAAI;AAAC,QAAG,CAAC,KAAK,QAAQ,SAAQ,KAAK;AAAA,EAAC;AAChD,QAAM,SAAO,YAAS;AACpB,QAAG,KAAK,QAAQ;AAChB,SAAK,UAAQ;AAAK,YAAQ,IAAI;AAAE,aAAS,EAAE;AAC3C,QAAG;AACD,YAAM,IAAI,eAAe,mBAAmB,WAAW,CAAC,aAAa,mBAAmB,KAAK,EAAE,CAAC,IAAG,EAAC,QAAO,UAAS,MAAK,KAAK,UAAU,EAAC,mBAAkB,KAAK,UAAS,CAAC,EAAC,CAAC;AAC5K,YAAM,UAAU;AAAE,cAAQ,KAAK;AAAA,IACjC,SAAO,GAAE;AAAC,eAAS,aAAa,CAAC,CAAC;AAAA,IAAC,UAAC;AAAQ,WAAK,UAAQ;AAAM,cAAQ,KAAK;AAAA,IAAC;AAAA,EAC/E;AACA,SAAO,gFAAE;AAAA,kDAAC,YAAO,MAAK,UAAS,WAAU,aAAY,UAAoB,SAAS,MAAI;AAAC,eAAS,EAAE;AAAE,cAAQ,IAAI;AAAA,IAAC,GAAG,sCAAI;AAAA,IAAU,QAAQ,+CAAC,mBAAgB,SAAQ,kBAAiB,OAAO,qBAAM,KAAK,OAAO,gBAAM,QAAO,oVAA2D,OAClR;AAAA,eAAS,8CAAC,mBAAiB,iBAAM;AAAA,MAClC,+CAAC,SAAI,WAAU,+BAA8B;AAAA,sDAAC,YAAO,MAAK,UAAS,WAAS,MAAC,UAAU,MAAM,SAAS,OAAO,sCAAI;AAAA,QAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,aAAY,UAAU,MAAM,SAAS,MAAI;AAAC,eAAK,OAAO;AAAA,QAAC,GAAI,iBAAK,6BAAO,4BAAO;AAAA,SAAS;AAAA,OACnP;AAAA,KAAmB;AACrB;AAEO,SAAS,iBAAiB,EAAC,aAAa,UAAS,GAAoD;AAC1G,QAAM,gBAAU,sBAAM;AACtB,QAAM,CAAC,MAAK,OAAO,QAAE,yBAAS,KAAK;AACnC,QAAM,CAAC,QAAO,SAAS,QAAE,yBAAS,CAAC;AACnC,QAAM,WAAS,kBAAyD,OAAK,eAAe,mBAAmB,WAAW,CAAC,6BAA6B,MAAM,KAAG,MAAS;AAC1K,QAAM,UAAQ,YAAS;AAAC,UAAM,SAAS,OAAO;AAAE,UAAM,UAAU;AAAA,EAAC;AACjE,SAAO,+CAAC,aAAQ,WAAU,+BAA8B;AAAA,mDAAC,YAAO,MAAK,UAAS,WAAU,sCAAqC,cAAW,sEAAgB,iBAAe,MAAM,iBAAe,OAAK,YAAU,QAAW,SAAS,MAAI,QAAQ,CAAC,IAAI,GAAG;AAAA,qDAAC,UAAK;AAAA,sDAAC,YAAO,4CAAK;AAAA,QAAS,8CAAC,WAAM,gFAAW;AAAA,SAAQ;AAAA,MAAO,8CAAC,6DAAyB,MAAM,IAAG;AAAA,OAAE;AAAA,IAAU,QAAQ,+CAAC,SAAI,IAAI,WAAW,WAAU,uCAClY;AAAA,eAAS,SAAS,+CAAC,mBAAiB;AAAA,iBAAS;AAAA,QAAM,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAI;AAAC,eAAK,SAAS,OAAO;AAAA,QAAC,GAAG,0BAAE;AAAA,SAAS;AAAA,MAC3H,CAAC,SAAS,OAAO,CAAC,SAAS,SAAS,8CAAC,OAAE,MAAK,UAAS,4CAAK,IAAO,gFAAG;AAAA,iBAAS,KAAK,MAAM,WAAS,KAAK,8CAAC,OAAE,0EAAU;AAAA,QAAK,8CAAC,SAAI,WAAU,oCAAoC,mBAAS,KAAK,MAAM,IAAI,UAAM,+CAAC,aAAsB,WAAU,mCAAkC;AAAA,yDAAC,aAAQ,WAAU,uCAAsC;AAAA,2DAAC,aAAQ;AAAA,4DAAC,6DAAyB,MAAM,IAAG;AAAA,cAAE,8CAAC,YAAQ,eAAK,SAAQ;AAAA,eAAS;AAAA,YAAU,+CAAC,QAAG;AAAA,4DAAC,QAAG,oEAAS;AAAA,cAAK,8CAAC,QAAI,eAAK,UAAU,sBAAM;AAAA,cAAK,8CAAC,QAAG,sCAAI;AAAA,cAAK,8CAAC,QAAI,eAAK,WAAW,IAAI,YAAQ,OAAO,SAAS,OAAO,OAAO,EAAE,KAAK,QAAG,KAAK,sBAAM;AAAA,cAAK,8CAAC,QAAG,sCAAI;AAAA,cAAK,8CAAC,QAAI,eAAK,cAAc,SAAS,8FAAkB;AAAA,eAAK;AAAA,YAAK,8CAAC,OAAE,4IAAqB;AAAA,aAAI;AAAA,UAAU,8CAAC,SAAI,WAAU,sCAAqC,wDAAC,uBAAoB,aAA0B,MAAY,WAAW,SAAQ,GAAE;AAAA,aAAplB,KAAK,EAAqlB,CAAU,GAAE;AAAA,SAC5zB,SAAO,KAAK,SAAS,KAAK,YAAY,+CAAC,SAAI,WAAU,qCAAoC,cAAW,wCAAS;AAAA,yDAAC,UAAK;AAAA;AAAA,YAAG,KAAK,MAAM,SAAO,EAAE,IAAE;AAAA,YAAE;AAAA,aAAE;AAAA,UAAO,+CAAC,SAAI;AAAA,0DAAC,YAAO,MAAK,UAAS,UAAU,WAAS,KAAK,SAAS,SAAS,SAAS,MAAI,UAAU,KAAK,IAAI,GAAE,SAAO,EAAE,CAAC,GAAG,gCAAG;AAAA,YAAS,8CAAC,YAAO,MAAK,UAAS,UAAU,CAAC,SAAS,KAAK,WAAW,SAAS,SAAS,SAAS,MAAI,UAAU,SAAO,EAAE,GAAG,gCAAG;AAAA,aAAS;AAAA,WAAM;AAAA,SAAO;AAAA,OACna;AAAA,KAAO;AACT;;;ACrCA,IAAAC,iBAA+B;;;ACA/B,IAAAC,iBAA2C;AAyBvC,IAAAC,uBAAA;AAtBG,SAAS,mBAAmB,EAAE,aAAa,OAAO,SAAS,GAElD;AACd,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAoC,CAAC,CAAC;AAChE,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,WAAO,sBAAM;AACnB,gCAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,aAAa,IAAI,gBAAgB;AACvC,eAAW,IAAI;AAAG,aAAS,EAAE;AAC7B,UAAMC,SAAQ,OAAO,WAAW,MAAM;AACpC,UAA0C,eAAe,mBAAmB,WAAW,CAAC,wBAAwB,mBAAmB,KAAK,CAAC,IAAI,EAAE,QAAQ,WAAW,OAAO,CAAC,EACvK,KAAK,YAAU;AAAE,YAAI,CAAC,WAAW,OAAO,QAAS,UAAS,OAAO,KAAK;AAAA,MAAE,CAAC,EACzE,MAAM,MAAM;AAAE,YAAI,CAAC,WAAW,OAAO,SAAS;AAAE,mBAAS,CAAC,CAAC;AAAG,mBAAS,sFAAgB;AAAA,QAAE;AAAA,MAAE,CAAC,EAC5F,QAAQ,MAAM;AAAE,YAAI,CAAC,WAAW,OAAO,QAAS,YAAW,KAAK;AAAA,MAAE,CAAC;AAAA,IACxE,GAAG,GAAG;AACN,WAAO,MAAM;AAAE,aAAO,aAAaA,MAAK;AAAG,iBAAW,MAAM;AAAA,IAAE;AAAA,EAChE,GAAG,CAAC,aAAa,OAAO,IAAI,CAAC;AAC7B,SAAO,+CAAC,aAAQ,WAAU,6BAA4B,cAAW,8CAC/D;AAAA,mDAAC,WAAM;AAAA,oDAAC,UAAK,0EAAY;AAAA,MAAO,8CAAC,WAAM,OAAO,OAAO,oBAAkB,MAAM,aAAa,QAAQ,GAAG,MAAM,SAAS,SAAS,iBAAO,cAAI,SAAM,MAAM,KAAK,KAAK,kFAAiB,SAAS,MAAM,QAAQ,IAAI,GAAG,UAAU,WAAS;AAAE,iBAAS,MAAM,OAAO,KAAK;AAAG,gBAAQ,IAAI;AAAA,MAAE,GAAG,WAAW,WAAS;AAAE,YAAI,MAAM,QAAQ,SAAU,SAAQ,KAAK;AAAA,MAAE,GAAG;AAAA,OAAE;AAAA,IACvV,8CAAC,WAAM,IAAI,MAAM,WAAU,oCAAmC,8SAAgD;AAAA,IAC7G,SAAS,+CAAC,OAAE,WAAU,gCAA+B;AAAA;AAAA,MAAK,MAAM;AAAA,MAAM,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAAE,iBAAS,MAAS;AAAG,iBAAS,EAAE;AAAA,MAAE,GAAG,sCAAI;AAAA,OAAS;AAAA,IAC/J,QAAQ,+CAAC,SAAI,WAAU,8BAA6B,cAAW,wCAC7D;AAAA,gBAAU,8CAAC,OAAE,MAAK,UAAS,4CAAK,IAAO,QAAQ,8CAAC,OAAE,MAAK,SAAS,iBAAM,IAAO,MAAM,WAAW,IAAI,8CAAC,OAAE,oHAAiB,IAAO,MAAM,IAAI,UAAQ,+CAAC,YAAO,MAAK,UAA8C,gBAAc,OAAO,SAAS,KAAK,QAAQ,MAAM,YAAY,KAAK,SAAS,SAAS,MAAM;AAAE,iBAAS,IAAI;AAAG,iBAAS,EAAE;AAAG,gBAAQ,KAAK;AAAA,MAAE,GAAG;AAAA,sDAAC,WAAO,eAAK,SAAS,SAAS,6BAAS,4BAAO;AAAA,QAAQ,8CAAC,UAAM,eAAK,OAAM;AAAA,WAArP,GAAG,KAAK,IAAI,IAAI,KAAK,OAAO,EAAgO,CAAS;AAAA,MAChb,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,QAAQ,KAAK,GAAG,sCAAI;AAAA,OAC3D;AAAA,KACF;AACF;;;ACzBS,IAAAC,uBAAA;AAJF,SAAS,oBAAoB,EAAC,aAAa,QAAQ,UAAU,QAAQ,SAAQ,GAGjF;AACD,SAAO,gFACL;AAAA,mDAAC,WAAM;AAAA,oDAAC,UAAK,oEAAS;AAAA,MAAO,8CAAC,cAAS,MAAM,GAAG,OAAO,QAAQ,WAAW,KAAK,UAAU,WAAS,SAAS,MAAM,OAAO,KAAK,GAAG,aAAY,kOAAwC;AAAA,MAAE,8CAAC,WAAM,iMAAkC;AAAA,OAAQ;AAAA,IACvO,8CAAC,sBAAmB,aAA0B,OAAO,QAAQ,UAAU,UAAU;AAAA,KACnF;AACF;;;AFKI,IAAAC,uBAAA;AAZG,SAAS,cAAc,EAAC,aAAa,MAAM,OAAO,MAAK,GAAgF;AAC5I,QAAM,CAAC,SAAQ,UAAU,QAAI,yBAAS,KAAK,OAAO;AAClD,QAAM,CAAC,QAAO,SAAS,QAAI,yBAAS,KAAK,MAAM;AAC/C,QAAM,CAAC,SAAQ,UAAU,QAAI,yBAAS,KAAK,UAAU,IAAI,OAAK,EAAE,SAAS,cAAc,uBAAQ,EAAE,OAAO,MAAM,KAAK,EAAE,OAAO,GAAG,EAAE,KAAK,IAAI,CAAC;AAC3I,QAAM,CAAC,QAAO,SAAS,QAAI,yBAA8C,KAAK,YAAY;AAC1F,QAAM,CAAC,MAAK,OAAO,QAAI,yBAAS,KAAK;AACrC,QAAM,CAAC,OAAM,QAAQ,QAAI,yBAAS,EAAE;AACpC,QAAM,WAAK,uBAAO,KAAK;AACvB,SAAO,+CAAC,UAAK,WAAU,+BAA8B,cAAW,4BAAO,aAAW,MAAM,UAAU,WAAO;AAAC,UAAM,eAAe;AAAE,QAAG,KAAK,QAAQ;AAAO,SAAK,UAAQ;AAAK,YAAQ,IAAI;AAAE,aAAS,EAAE;AAAE,UAAM,YAAS;AAClN,UAAI;AAAC,cAAM,IAAI,eAAe,mBAAmB,WAAW,CAAC,aAAa,mBAAmB,KAAK,EAAE,CAAC,IAAG,EAAC,QAAO,SAAQ,MAAK,KAAK,UAAU,EAAC,SAAQ,QAAO,SAAQ,cAAa,UAAQ,MAAK,mBAAkB,KAAK,UAAS,CAAC,EAAC,CAAC;AAAE,cAAM,MAAM;AAAE,cAAM;AAAA,MAAC,SAClP,GAAE;AAAC,iBAAS,aAAa,CAAC,CAAC;AAAA,MAAC,UAAC;AAAQ,aAAK,UAAQ;AAAM,gBAAQ,KAAK;AAAA,MAAC;AAAA,IAC9E,GAAG;AAAA,EAAC,GACF;AAAA,mDAAC,YAAO,WAAU,oCAAmC;AAAA,oDAAC,YAAO,sCAAI;AAAA,MAAS,8CAAC,OAAE,0HAAkB;AAAA,OAAI;AAAA,IACnG,+CAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,WAAM,WAAS,MAAC,UAAQ,MAAC,OAAO,SAAS,WAAW,KAAK,UAAU,OAAG,WAAW,EAAE,OAAO,KAAK,GAAG;AAAA,OAAE;AAAA,IAC7H,+CAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,cAAS,MAAM,GAAG,OAAO,SAAS,WAAW,KAAM,UAAU,OAAG,WAAW,EAAE,OAAO,KAAK,GAAG;AAAA,MAAE,8CAAC,WAAM,0OAA6C;AAAA,OAAQ;AAAA,IACnL,8CAAC,uBAAoB,aAA0B,QAAgB,UAAU,WAAW,QAAgB,UAAU,WAAW;AAAA,IACzH,8CAAC,WAAM,wMAA+B;AAAA,IACrC,SAAS,8CAAC,OAAE,MAAK,SAAS,iBAAM;AAAA,IACjC,+CAAC,SAAI;AAAA,oDAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,OAAO,0BAAE;AAAA,MAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,QAAQ,CAAC,QAAQ,KAAK,GAAI,iBAAK,6BAAO,4BAAO;AAAA,OAAS;AAAA,KACrL;AACF;;;AHkCkB,IAAAC,uBAAA;AAlDX,SAAS,aAAa,EAAE,aAAa,UAAU,OAAO,MAAM,SAAS,OAAO,SAAS,OAAO,SAAS,GAK5F;AACd,QAAM,UAAU,SAAS,SAAS,OAAO,UAAQ,KAAK,UAAU,UAAU;AAC1E,QAAMC,UAAS,QAAQ,OAAO,UAAQ,KAAK,UAAU,UAAU;AAC/D,QAAM,WAAW,QAAQ,OAAO,UAAQ,KAAK,UAAU,UAAU;AACjE,QAAM,SAAS,IAAI,IAAI,CAAC,GAAG,SAAS,YAAY,EAAE,QAAQ,EAAE,IAAI,UAAQ,CAAC,KAAK,WAAW,IAAI,CAAC,CAAC;AAC/F,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAsB;AACpD,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,EAAE;AACvC,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAkC;AAC1E,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAiB;AACrD,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAwD;AACtF,QAAM,CAAC,SAAS,UAAU,QAAI,yBAA8B,CAAC,CAAC;AAC9D,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAS,KAAK;AAC1D,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAiB;AACvD,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,CAAC;AAClD,QAAM,eAAW,uBAAyB,IAAI;AAC9C,QAAM,gBAAY,sBAAM;AACxB,QAAM,QAAQA,QAAO,MAAM,GAAG,YAAY;AAC1C,QAAM,kBAAkB,aAAa,YAAY;AACjD,gCAAU,MAAM;AACd,QAAI,CAAC,mBAAmB,YAAY,QAAW;AAC7C,iBAAW,CAAC,CAAC;AAAG,wBAAkB,KAAK;AAAG,qBAAe,MAAS;AAAG;AAAA,IACvE;AACA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAMC,SAAQ,OAAO,WAAW,MAAM;AACpC,wBAAkB,IAAI;AAAG,qBAAe,MAAS;AACjD,YAAM,SAAS,IAAI,gBAAgB,EAAE,GAAG,QAAQ,MAAM,CAAC;AACvD,WAAK,IAAoC,eAAe,mBAAmB,WAAW,CAAC,oBAAoB,MAAM,IAAI,EAAC,QAAQ,WAAW,OAAM,CAAC,EAAE,KAAK,YAAU;AAC/J,YAAI,CAAC,WAAW,OAAO,SAAS;AAAE,qBAAW,OAAO,KAAK;AAAG,0BAAgB,CAAC;AAAA,QAAE;AAAA,MACjF,CAAC,EAAE,MAAM,CAAAC,YAAU;AACjB,YAAI,CAAC,WAAW,OAAO,SAAS;AAAE,qBAAW,CAAC,CAAC;AAAG,yBAAe,aAAQA,OAAM,CAAC;AAAA,QAAE;AAAA,MACpF,CAAC,EAAE,QAAQ,MAAM;AAAE,YAAI,CAAC,WAAW,OAAO,QAAS,mBAAkB,KAAK;AAAA,MAAE,CAAC;AAAA,IAC/E,GAAG,GAAG;AACN,WAAO,MAAM;AAAE,aAAO,aAAaD,MAAK;AAAG,iBAAW,MAAM;AAAA,IAAE;AAAA,EAChE,GAAG,CAAC,aAAa,SAAS,OAAO,eAAe,CAAC;AACjD,QAAM,SAAS,CAAC,UAA2B;AAAE,UAAM,eAAe;AAAG,SAAK,MAAM,cAAc,MAAM,EAAE,KAAK,QAAM;AAAE,UAAI,IAAI;AAAE,qBAAa,KAAK;AAAG,mBAAW,MAAS;AAAG,wBAAgB,MAAS;AAAG,kBAAU,EAAE;AAAA,MAAE;AAAA,IAAE,CAAC;AAAA,EAAE;AACxN,QAAM,eAAe,CAAC,WAAoC;AACxD,QAAI,YAAY,OAAW;AAC3B,UAAM,OAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,KAAK,CAAC,GAAG,OAAO,KAAK,IAAI,MAAM,MAAM,QAAQ,GAAG,CAAC;AACxF,UAAM,SAAS,QAAQ,QAAQ,OAAO,MAAM,SAAS;AACrD,YAAQ,IAAI;AAAG,eAAW,MAAS;AAAG,eAAW,CAAC,CAAC;AACnD,WAAO,sBAAsB,MAAM;AAAE,eAAS,SAAS,MAAM;AAAG,eAAS,SAAS,kBAAkB,QAAQ,MAAM;AAAA,IAAE,CAAC;AAAA,EACvH;AACA,SAAO,+CAAC,aAAQ,WAAU,6BAA4B,mBAAgB,0BACpE;AAAA,mDAAC,YAAO;AAAA,qDAAC,UAAK;AAAA,uDAAC,YAAO,IAAG,0BAAyB;AAAA;AAAA,UAAO,8CAAC,OAAG,UAAAD,QAAO,QAAO;AAAA,WAAI;AAAA,QAAS,8CAAC,OAAE,kGAAc;AAAA,SAAI;AAAA,MAAO,+CAAC,YAAO,MAAK,UAAS,iBAAe,WAAW,SAAS,MAAM;AAAC,mBAAW,MAAS;AAAE,qBAAa,CAAAG,aAAW,CAACA,QAAO;AAAA,MAAC,GAAG;AAAA,sDAAC,sDAAkB,MAAM,IAAI;AAAA,QAAE;AAAA,SAAK;AAAA,OAAS;AAAA,IAC1R,WAAW,8CAAC,iBAA+B,aAA0B,MAAM,SAAS,OAAO,MAAI,WAAW,MAAS,GAAG,OAAO,YAA9F,QAAQ,EAAgG;AAAA,IACvI,aAAa,+CAAC,UAAK,WAAU,+BAA8B,cAAW,4BAAO,aAAW,MAAM,UAAU,QAAQ;AAAA,qDAAC,YAAO,WAAU,oCAAmC;AAAA,sDAAC,YAAO,4CAAK;AAAA,QAAS,8CAAC,OAAE,4IAAqB;AAAA,SAAI;AAAA,MAAS,+CAAC,WAAM;AAAA,sDAAC,UAAK,kDAAM;AAAA,QAAO,+CAAC,SAAI,WAAU,kCAAiC;AAAA;AAAA,YAAC;AAAA;AAAA,cAC1S,KAAK;AAAA,cAAU,WAAS;AAAA,cAAC;AAAA,cAAc,WAAW;AAAA,cAAK,aAAY;AAAA,cACnE,MAAK;AAAA,cAAW,qBAAkB;AAAA,cAAO,iBAAe;AAAA,cAAiB,iBAAe,kBAAkB,YAAY;AAAA,cACtH,yBAAuB,mBAAmB,QAAQ,YAAY,IAAI,GAAG,SAAS,WAAW,YAAY,KAAK;AAAA,cAC1G,UAAU,WAAS;AAAE,wBAAQ,MAAM,OAAO,KAAK;AAAG,2BAAW,cAAc,MAAM,OAAO,OAAO,MAAM,OAAO,kBAAkB,MAAM,OAAO,MAAM,MAAM,CAAC;AAAA,cAAE;AAAA,cAC1J,SAAS,WAAS,WAAW,cAAc,MAAM,cAAc,OAAO,MAAM,cAAc,kBAAkB,MAAM,cAAc,MAAM,MAAM,CAAC;AAAA,cAC7I,WAAW,WAAS;AAClB,oBAAI,CAAC,gBAAiB;AACtB,oBAAI,MAAM,QAAQ,aAAa;AAAE,wBAAM,eAAe;AAAG,kCAAgB,WAAS,QAAQ,WAAW,IAAI,KAAK,QAAQ,KAAK,QAAQ,MAAM;AAAA,gBAAE,WAClI,MAAM,QAAQ,WAAW;AAAE,wBAAM,eAAe;AAAG,kCAAgB,WAAS,QAAQ,WAAW,IAAI,KAAK,QAAQ,IAAI,QAAQ,UAAU,QAAQ,MAAM;AAAA,gBAAE,WACtJ,MAAM,QAAQ,WAAW,QAAQ,YAAY,GAAG;AAAE,wBAAM,eAAe;AAAG,+BAAa,QAAQ,YAAY,CAAC;AAAA,gBAAE,WAC9G,MAAM,QAAQ,UAAU;AAAE,wBAAM,eAAe;AAAG,6BAAW,MAAS;AAAA,gBAAE;AAAA,cACnF;AAAA;AAAA,UACF;AAAA,UAAG,mBAAmB,8CAAC,SAAI,IAAI,WAAW,WAAU,+BAA8B,MAAK,WAAU,cAAW,sEACzG,2BAAiB,8CAAC,OAAE,MAAK,UAAS,0EAAU,IAAO,cAAc,+CAAC,OAAE,MAAK,UAAS;AAAA;AAAA,YAAQ;AAAA,aAAY,IAAO,QAAQ,WAAW,IAAI,8CAAC,OAAE,MAAK,UAAS,oHAAiB,IAAO,+EAC3K,kBAAQ,IAAI,CAAC,QAAQ,UAAU;AAAA,YAAC;AAAA;AAAA,cAC/B,MAAK;AAAA,cAAS,MAAK;AAAA,cAAS,IAAI,GAAG,SAAS,WAAW,KAAK;AAAA,cAC5D,iBAAe,UAAU;AAAA,cAAc,aAAW,OAAO;AAAA,cAAM,aAAa,WAAS,MAAM,eAAe;AAAA,cAC1G,cAAc,MAAM,gBAAgB,KAAK;AAAA,cAAG,SAAS,MAAM,aAAa,MAAM;AAAA,cAC/E;AAAA,8DAAC,UAAM,iBAAO,SAAS,SAAS,8CAAC,sDAAkB,MAAM,IAAI,IAAK,8CAAC,sDAAkB,MAAM,IAAI,GAAG;AAAA,gBAAO,8CAAC,YAAQ,iBAAO,OAAM;AAAA,gBAAS,8CAAC,WAAO,iBAAO,QAAO;AAAA;AAAA;AAAA,YAHxF,GAAG,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,UAGkE,CAAS,GAClL,GACF;AAAA,WAAO;AAAA,QAAM,+CAAC,WAAM,WAAU,oCAAmC;AAAA;AAAA,UAAG,8CAAC,OAAE,eAAC;AAAA,UAAI;AAAA,WAAoC;AAAA,SAAQ;AAAA,MACxH,8CAAC,uBAAoB,aAA0B,QAAgB,UAAU,WAAW,QAAQ,cAAc,UAAU,iBAAiB;AAAA,MACrI,+CAAC,SAAI;AAAA,sDAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAAE,uBAAa,KAAK;AAAG,qBAAW,MAAS;AAAG,0BAAgB,MAAS;AAAG,oBAAU,EAAE;AAAG,kBAAQ,EAAE;AAAA,QAAE,GAAG,0BAAE;AAAA,QAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,QAAQ,CAAC,MAAM,KAAK,GAAG,4CAAK;AAAA,SAAS;AAAA,OAAM;AAAA,IAC/P,8CAAC,SAAI,WAAU,4BAA2B,MAAK,QAC5C,UAAAH,QAAO,WAAW,IAAI,8CAAC,OAAE,WAAU,6BAA4B,4LAA6B,IAAO,MAAM,IAAI,UAAQ;AACpH,YAAM,cAAc,OAAO,IAAI,KAAK,EAAE;AACtC,YAAM,WAAW,eAAe,KAAK;AACrC,YAAM,SAAS,cAAc,yBAAyB,WAAW,IAAI,KAAK,UAAU,WAAW,6BAAS;AACxG,aAAO,+CAAC,aAAsB,MAAK,YAAW,cAAY,KAAK,OAAO,iBAAe,UAClF;AAAA,oBAAY,+CAAC,OAAE,WAAU,8BAA6B;AAAA;AAAA,UAAM,KAAK,eAAe,GAAG,KAAK,aAAa,SAAS,SAAS,6BAAS,0BAAM,SAAM,KAAK,aAAa,KAAK,KAAK;AAAA,WAAwB;AAAA,QACjM,+CAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,iBAAe,UAAU,SAAS,MAAM,cAAc,CAAAG,aAAWA,aAAY,KAAK,KAAK,SAAY,KAAK,EAAE,GAClK;AAAA,yDAAC,UAAK,WAAU,6BAA4B;AAAA,0DAAC,OAAE;AAAA,YAAG;AAAA,aAAO;AAAA,UAAO,+CAAC,UAAK,WAAU,4BAA2B;AAAA,0DAAC,YAAQ,eAAK,SAAQ;AAAA,YAAS,8CAAC,WAAO,wBAAc,YAAY,QAAQ,KAAK,QAAO;AAAA,aAAQ;AAAA,UAAO,+CAAC,UAAK,WAAU,4BAA2B,OAAO,sBAAO,IAAI,KAAK,KAAK,WAAW,EAAE,eAAe,CAAC,6BAAS;AAAA,0DAAC,WAAM,sCAAI;AAAA,YAAQ,8CAAC,YAAQ,qBAAW,KAAK,WAAW,GAAE;AAAA,aAAS;AAAA,UAAO,8CAAC,6DAAyB,MAAM,IAAI;AAAA,WAC3a;AAAA,QACC,YAAY,+CAAC,SAAI,WAAU,8BAA6B;AAAA,wDAAC,OAAG,eAAK,QAAO;AAAA,UAAK,eAAe,gFAAE;AAAA,0DAAC,gBAAY,sBAAY,OAAM;AAAA,YAAa,+CAAC,SAAI,WAAU,gCAA+B,iBAAe,YAAY,UAAU;AAAA,4DAAC,YAAQ,mCAAyB,WAAW,GAAE;AAAA,cAAS,8CAAC,UAAM,sBAAY,kBAAkB,8BAA8B,WAAW,GAAE;AAAA,cAAO,+CAAC,WAAM;AAAA;AAAA,gBAAM,KAAK,MAAM,YAAY,iBAAiB,GAAG;AAAA,gBAAG,YAAY,2BAA2B,UAAU,YAAY,yBAAyB,uCAAW,YAAY,sBAAsB,KAAK;AAAA,iBAAG;AAAA,eAAQ;AAAA,aAAM;AAAA,UAAK,KAAK,UAAU,SAAS,KAAK,8CAAC,SAAI,WAAU,iCAAiC,eAAK,UAAU,IAAI,cAAY,+CAAC,UAAmD;AAAA,qBAAS,SAAS,SAAS,iBAAO;AAAA,YAAK;AAAA,YAAI,SAAS;AAAA,eAA7F,GAAG,SAAS,IAAI,IAAI,SAAS,OAAO,EAA+D,CAAO,GAAE;AAAA,UAAO,+CAAC,WAAO;AAAA,iBAAK,WAAW,aAAa,mCAAU;AAAA,YAAY;AAAA,YAAI,eAAe,KAAK,SAAS;AAAA,aAAE;AAAA,UAAQ,+CAAC,SAAI,WAAU,+BAA8B,cAAY,GAAG,KAAK,OAAO,uBAAQ;AAAA,0DAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAAC,2BAAa,KAAK;AAAE,yBAAW,IAAI;AAAA,YAAC,GAAG,0BAAE;AAAA,YAAS,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,QAAQ,IAAI,GAAG,kDAAM;AAAA,YAAS,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,MAAM,MAAM,OAAO,GAAG,sCAAI;AAAA,YAAS,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,MAAM,MAAM,YAAY,GAAG,sCAAI;AAAA,YAAS,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,MAAM,MAAM,SAAS,GAAG,sCAAI;AAAA,YAAS,8CAAC,uBAAoB,aAA0B,MAAY,UAAU,MAAM,WAAW,UAAS;AAAA,aAAE;AAAA,WAAM;AAAA,WALp/C,KAAK,EAM1B;AAAA,IACF,CAAC,GACH;AAAA,KACEH,QAAO,SAAS,MAAM,UAAU,eAAe,MAAM,8CAAC,SAAI,WAAU,4BAA4B,UAAAA,QAAO,SAAS,MAAM,SAAS,+CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,gBAAgB,WAAS,KAAK,IAAIA,QAAO,QAAQ,QAAQ,EAAE,CAAC,GAAG;AAAA;AAAA,MAAK,KAAK,IAAI,IAAIA,QAAO,SAAS,MAAM,MAAM;AAAA,MAAE;AAAA,OAAE,IAAY,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,gBAAgB,CAAC,GAAG,sCAAI,GAAU;AAAA,IACzW,SAAS,SAAS,KAAK,+CAAC,aAAQ,WAAU,gCAA+B;AAAA,qDAAC,aAAQ;AAAA;AAAA,QAAK,8CAAC,OAAG,mBAAS,QAAO;AAAA,SAAI;AAAA,MAAU,8CAAC,SAAK,mBAAS,MAAM,GAAG,EAAE,EAAE,IAAI,UAAQ,+CAAC,aAAsB;AAAA,sDAAC,UAAK,wDAAC,uDAAmB,MAAM,IAAI,GAAE;AAAA,QAAO,8CAAC,YAAQ,eAAK,SAAQ;AAAA,QAAS,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,MAAM,MAAM,OAAO,GAAG,sCAAI;AAAA,QAAS,8CAAC,uBAAoB,aAA0B,MAAY,UAAU,MAAM,WAAW,UAAS;AAAA,WAA5Q,KAAK,EAAyQ,CAAU,GAAE;AAAA,OAAM;AAAA,IAChd,8CAAC,oBAAiB,aAA0B,WAAW,UAAS;AAAA,KAClE;AACF;AAEA,SAAS,cAAc,OAAe,QAA2E;AAC/G,QAAM,SAAS,MAAM,MAAM,GAAG,MAAM;AACpC,QAAM,QAAQ,OAAO,YAAY,GAAG;AACpC,MAAI,QAAQ,KAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAI,QAAO;AAC7E,QAAM,WAAW,OAAO,MAAM,QAAQ,CAAC;AACvC,MAAI,SAAS,WAAW,qBAAM,GAAG;AAC/B,QAAI,SAAS,SAAS,GAAG,EAAG,QAAO;AACnC,WAAO,EAAE,OAAO,KAAK,QAAQ,OAAO,SAAS,MAAM,CAAC,EAAE;AAAA,EACxD;AACA,MAAI,SAAS,WAAW,GAAG,GAAG;AAC5B,QAAI,SAAS,MAAM,CAAC,EAAE,SAAS,GAAG,EAAG,QAAO;AAC5C,WAAO,EAAE,OAAO,KAAK,QAAQ,OAAO,SAAS,MAAM,CAAC,EAAE;AAAA,EACxD;AACA,MAAI,MAAM,KAAK,QAAQ,EAAG,QAAO;AACjC,SAAO,EAAE,OAAO,KAAK,QAAQ,OAAO,SAAS;AAC/C;AAEA,SAAS,eAAe,OAAyC;AAC/D,SAAO,UAAU,cAAc,mCAAU,UAAU,cAAc,6BAAS,UAAU,QAAQ,6BAAS;AACvG;AAEA,SAAS,yBAAyB,MAAsC;AACtE,MAAI,KAAK,aAAa,SAAU,QAAO,KAAK,gBAAgB,SAAY,uBAAQ;AAChF,MAAI,KAAK,aAAa,OAAQ,QAAO;AACrC,MAAI,KAAK,aAAa,QAAS,QAAO,KAAK,gBAAgB,SAAY,6BAAS;AAChF,SAAO;AACT;AACA,SAAS,8BAA8B,MAAsC;AAC3E,MAAI,KAAK,aAAa,SAAU,QAAO,KAAK,gBAAgB,SAAY,+FAAoB;AAC5F,MAAI,KAAK,aAAa,OAAQ,QAAO;AACrC,MAAI,KAAK,aAAa,QAAS,QAAO,KAAK,gBAAgB,SAAY,mFAAkB;AACzF,SAAO;AACT;;;ADtEuG,IAAAI,uBAAA;AA1DhG,SAAS,aAAa,EAAC,WAAW,UAAU,UAAS,GAAmG;AAC7J,QAAM,OAAO,eAAe,mBAAmB,UAAU,EAAE,CAAC;AAC5D,QAAM,WAAW,kBAAuC,GAAG,IAAI,aAAa,IAAM;AAClF,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AAC9C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AAC9C,QAAM,oBAAgB,uBAAO,KAAK;AAClC,QAAM,cAAU,uBAAO,EAAC,WAAW,QAAQ,SAAS,OAAM,CAAC;AAC3D,UAAQ,UAAU,EAAC,WAAW,QAAQ,SAAS,OAAM;AACrD,gCAAU,MAAM;AACd,QAAI,WAAW;AACf,QAAIC;AACJ,UAAM,aAAa,IAAI,gBAAgB;AACvC,kBAAc,UAAU;AACxB,gBAAY,KAAK;AACjB,UAAMC,QAAO,YAAY;AACvB,UAAI;AACF,YAAI,SAAS,OAAQ;AACrB,cAAM,SAAS,MAAM,IAAyE,GAAG,IAAI,qBAAqB,EAAC,QAAQ,WAAW,OAAM,CAAC;AACrJ,YAAI,SAAU;AACd,oBAAY,OAAO,OAAO;AAC1B,YAAI,cAAc,WAAW,CAAC,OAAO,SAAS;AAC5C,wBAAc,UAAU;AACxB,oBAAU,OAAO,QAAQ,WAAW,OAAO,QAAQ,OAAO,iEAAe,iFAAgB;AACzF,gBAAM,QAAQ,IAAI,CAAC,QAAQ,QAAQ,UAAU,GAAG,QAAQ,QAAQ,OAAO,CAAC,CAAC;AAAA,QAC3E;AACA,YAAI,OAAO,QAAS,eAAc,UAAU;AAAA,MAC9C,QAAQ;AAAA,MAAuE,UAC/E;AAAU,YAAI,CAAC,SAAU,CAAAD,SAAQ,WAAW,MAAM;AAAC,eAAKC,MAAK;AAAA,QAAC,GAAG,GAAI;AAAA,MAAE;AAAA,IACzE;AACA,SAAKA,MAAK;AACV,WAAO,MAAM;AAAC,iBAAW;AAAM,iBAAW,MAAM;AAAG,mBAAaD,MAAK;AAAA,IAAC;AAAA,EACxE,GAAG,CAAC,IAAI,CAAC;AACT,QAAM,WAAO,uBAAO,KAAK;AACzB,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAiB;AAC7C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,YAAY,SAAS,gBAAgB,KAAK,UAAQ,KAAK,gBAAgB,UAAU,EAAE;AACzF,QAAM,MAAM,OAAO,WAAoD;AACrE,QAAI,KAAK,QAAS,QAAO;AACzB,SAAK,UAAU;AAAM,YAAQ,IAAI;AAAG,aAAS,MAAS;AAAG,cAAU,MAAS;AAC5E,QAAI;AAAC,gBAAU,MAAM,OAAO,CAAC;AAAG,YAAM,SAAS,OAAO;AAAG,aAAO;AAAA,IAAI,SAC7D,QAAQ;AAAC,eAAS,aAAa,MAAM,CAAC;AAAG,aAAO;AAAA,IAAK,UAC5D;AAAS,WAAK,UAAU;AAAO,cAAQ,KAAK;AAAA,IAAC;AAAA,EAC/C;AACA,QAAM,QAAQ,CAAC,cAA6B;AAAC,SAAK,IAAI,YAAY;AAChE,UAAI,SAAU,QAAO;AACrB,YAAM,SAAS,MAAM,IAAyC,GAAG,IAAI,sBAAsB,EAAC,QAAQ,QAAQ,MAAM,KAAK,UAAU,YAAY,EAAC,UAAS,IAAI,CAAC,CAAC,EAAC,CAAC;AAC/J,kBAAY,OAAO,OAAO;AAC1B,oBAAc,UAAU,OAAO;AAC/B,YAAM,UAAU;AAChB,aAAO,OAAO,UAAU;AAAA,IAC1B,CAAC;AAAA,EAAC;AACF,QAAM,MAAM,CAAC,MAAmB,WAAgE;AAAC,SAAK,IAAI,YAAY;AACpH,YAAM,IAAI,GAAG,IAAI,aAAa,mBAAmB,KAAK,EAAE,CAAC,WAAW,EAAC,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAC,OAAM,CAAC,EAAC,CAAC;AACpH,aAAQ,EAAC,OAAO,kCAAS,QAAQ,8CAAW,YAAY,kCAAS,SAAS,iCAAO,EAAG,MAAM;AAAA,IAC5F,CAAC;AAAA,EAAC;AACF,SAAO,+CAAC,SAAI,WAAU,uCACpB;AAAA,kDAAC,iBAAc,SAAQ,mBAAkB,OAAM,4BAAO,QAAO,gKAA6B,SAAS,gFAAE;AAAA,oDAAC,YAAO,MAAK,UAAS,UAAU,QAAQ,UAAU,aAAW,UAAU,SAAS,MAAM,MAAM,GAAI,qBAAW,yCAAW,kCAAQ;AAAA,MAAS,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,YAAY,IAAI,GAAG,sCAAI;AAAA,OAAS,GAAK;AAAA,IACtT,+CAAC,SAAI,WAAU,6BAA4B;AAAA,oDAAC,UAAM,oBAAU,WAAW,UAAU,UAAU,+CAAY,8CAAU;AAAA,MAAO,+CAAC,WAAM;AAAA;AAAA,QAAM,WAAW,gBAAgB,aAAa,UAAU,aAAa,IAAI;AAAA,QAAK;AAAA,QAAS,WAAW,aAAa;AAAA,QAAE;AAAA,SAAE;AAAA,MAAQ,8CAAC,YAAO,MAAK,UAAS,UAAU,SAAS,SAAS,cAAW,4BAAO,SAAS,MAAM;AAAC,aAAK,SAAS,OAAO;AAAA,MAAC,GAAG,wDAAC,yDAAqB,MAAM,IAAI,GAAE;AAAA,OAAS;AAAA,KAChZ,SAAS,SAAS,SAAS,WAAW,cAAc,8CAAC,mBAAiB,mBAAS,SAAS,SAAS,WAAW,WAAU;AAAA,IACvH,UAAU,8CAAC,mBAAgB,MAAK,WAAW,kBAAO;AAAA,IAClD,CAAC,SAAS,OAAO,8CAAC,mBAAgB,OAAO,SAAS,QAAQ,yCAAW,wCAAU,QAAQ,SAAS,QAAQ,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAAC,WAAK,SAAS,OAAO;AAAA,IAAC,GAAG,0BAAE,IAAY,QAAW,IAAK,8CAAC,gBAAa,aAAa,UAAU,IAAI,UAAU,SAAS,MAAM,UAAU,SAAS,QAAQ,OAAc,MAAM,QAAQ,UAAU,SAAS,UAAU,SAAS,UAAQ,MAAM,KAAK,EAAE,GAAG,OAAO,KAAK,OAAO,CAAC,cAAc,WAAW,IAAI,YAAY;AACxb,UAAI,CAAC,MAAM,KAAK,EAAG,QAAO;AAC1B,YAAM,IAAI,GAAG,IAAI,aAAa,EAAC,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAC,SAAS,MAAM,KAAK,GAAG,QAAQ,aAAY,CAAC,EAAC,CAAC;AACnH,eAAS,EAAE;AAAG,aAAO;AAAA,IACvB,CAAC,GAAG;AAAA,IACH,YAAY,8CAAC,sBAAmB,WAAsB,MAAK,aAAY,OAAO,MAAM,YAAY,KAAK,GAAG,WAAsB;AAAA,KACjI;AACF;;;AO9EA,IAAAE,iBAA8D;AAC9D,IAAAC,mCAAsG;;;ACG/F,IAAM,uBAAuB;AAC7B,IAAM,2BAAsD,OAAO,OAAO,EAAE,SAAS,MAAM,KAAK,IAAI,UAAU,SAAS,OAAO,WAAW,OAAO,IAAI,UAAU,WAAW,aAAa,KAAK,YAAY,IAAI,SAAS,IAAI,CAAC;AACzN,IAAM,wBAAwB;AAE9B,SAAS,oBAAoB,GAAoB,GAA6B;AACnF,SAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE;AACnP;AAEO,SAAS,qBAAqB,OAAwB;AAAE,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,IAAI;AAAI;AAC1K,SAAS,qBAAqB,OAAwB;AAAE,SAAO,UAAU,aAAa,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,IAAI;AAAI;AAC3M,SAAS,UAAU,OAAwB;AAAE,SAAO,OAAO,UAAU,YAAY,MAAM,UAAU,yBAAyB,0DAA0D,KAAK,KAAK,IAAI,QAAQ;AAAG;AAEtM,SAAS,oBAAoB,OAA4B;AAAE,SAAO,UAAU,MAAM,UAAU,KAAK,QAAQ;AAAG;AAE5G,SAAS,yBAAyB,OAAiC;AACxE,QAAM,QAAQ,SAAS,OAAO,UAAU,WAAW,QAAoC,CAAC;AACxF,SAAO;AAAA,IACL,SAAS,OAAO,MAAM,YAAY,YAAY,MAAM,UAAU;AAAA,IAC9D,KAAK,oBAAoB,MAAM,GAAG;AAAA,IAClC,aAAa,qBAAqB,MAAM,WAAW;AAAA,IACnD,YAAY,UAAU,MAAM,UAAU;AAAA,IACtC,SAAS,qBAAqB,MAAM,OAAO;AAAA,IAC3C,UAAU,MAAM,aAAa,UAAU,UAAU;AAAA,IACjD,UAAU,MAAM,aAAa,aAAa,MAAM,aAAa,YAAY,MAAM,WAAW;AAAA,IAC1F,OAAO,OAAO,MAAM,UAAU,YAAY,kBAAkB,KAAK,MAAM,KAAK,IAAI,MAAM,MAAM,YAAY,IAAI,yBAAyB;AAAA,IACrI,OAAO,UAAU,MAAM,KAAK;AAAA,EAC9B;AACF;;;AC/BA,IAAAC,iBAAqC;AAGrC,IAAI;AACJ,IAAM,YAAY,oBAAI,IAAgB;AACtC,SAAS,OAAwB;AAC/B,MAAI;AAAE,WAAO,yBAAyB,KAAK,MAAM,aAAa,QAAQ,oBAAoB,KAAK,MAAM,CAAC;AAAA,EAAE,QAClG;AAAE,WAAO,EAAE,GAAG,yBAAyB;AAAA,EAAE;AACjD;AACA,SAAS,UAAgB;AAAE,aAAW,YAAY,UAAW,UAAS;AAAE;AACxE,SAAS,QAAQ,OAA2B;AAC1C,MAAI,MAAM,QAAQ,QAAQ,MAAM,QAAQ,qBAAsB;AAC9D,YAAU,KAAK;AAAG,UAAQ;AAC5B;AACA,SAAS,UAAU,UAAkC;AACnD,MAAI,CAAC,UAAU,MAAM;AAAE,cAAU,KAAK;AAAG,WAAO,iBAAiB,WAAW,OAAO;AAAA,EAAE;AACrF,YAAU,IAAI,QAAQ;AACtB,SAAO,MAAM;AAAE,cAAU,OAAO,QAAQ;AAAG,QAAI,CAAC,UAAU,KAAM,QAAO,oBAAoB,WAAW,OAAO;AAAA,EAAE;AACjH;AACO,SAAS,qBAAsC;AACpD,aAAO,qCAAqB,WAAW,MAAM,YAAY,KAAK,GAAG,MAAM,wBAAwB;AACjG;AACO,SAAS,oBAAoB,UAAiC;AACnE,QAAM,OAAO,yBAAyB,QAAQ;AAC9C,MAAI;AAAE,iBAAa,QAAQ,sBAAsB,KAAK,UAAU,IAAI,CAAC;AAAA,EAAE,QACjE;AAAE,UAAM,IAAI,MAAM,kMAAkC;AAAA,EAAE;AAC5D,YAAU;AAAM,UAAQ;AAC1B;;;ACzBO,IAAM,wBAAwB;AAoB9B,SAAS,cAAc,QAA2C;AACvE,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,IAAI,MAAM;AACxB,UAAM,SAAS,MAAM;AAAE,YAAM,SAAS,MAAM,UAAU;AAAM,cAAQ,KAAK;AAAA,IAAE;AAC3E,UAAM,UAAU,MAAM;AAAE,YAAM,SAAS,MAAM,UAAU;AAAM,aAAO,IAAI,MAAM,uHAAkC,CAAC;AAAA,IAAE;AACnH,UAAM,MAAM;AAAA,EACd,CAAC;AACH;AAKA,eAAsB,iBAAiB,MAAY,eAAe,MAAuB;AACvF,MAAI,CAAC,CAAC,aAAa,cAAc,YAAY,EAAE,SAAS,KAAK,IAAI,EAAG,OAAM,IAAI,MAAM,iEAAyB;AAC7G,MAAI,KAAK,OAAO,IAAI,OAAO,KAAM,OAAM,IAAI,MAAM,iDAAc;AAC/D,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,MAAI;AACF,UAAM,QAAQ,MAAM,cAAc,GAAG;AACrC,QAAI,CAAC,MAAM,gBAAgB,CAAC,MAAM,iBAAiB,MAAM,eAAe,MAAM,gBAAgB,KAAY,OAAM,IAAI,MAAM,oHAA0B;AACpJ,UAAM,QAAQ,KAAK,IAAI,GAAG,eAAe,KAAK,IAAI,MAAM,cAAc,MAAM,aAAa,CAAC;AAC1F,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,eAAe,KAAK,CAAC;AACjE,WAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,gBAAgB,KAAK,CAAC;AACnE,UAAM,UAAU,OAAO,WAAW,IAAI;AACtC,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,0EAAc;AAC5C,YAAQ,wBAAwB;AAChC,YAAQ,YAAY;AAAuB,YAAQ,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC7F,YAAQ,UAAU,OAAO,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAG1D,UAAM,MAAM,OAAO,UAAU,WAAW;AACxC,QAAI,IAAI,UAAU,sBAAuB,QAAO;AAChD,eAAW,WAAW,CAAC,MAAK,MAAK,GAAE,GAAG;AACpC,YAAM,SAAS,OAAO,UAAU,cAAc,OAAO;AACrD,UAAI,OAAO,UAAU,sBAAuB,QAAO;AAAA,IACrD;AACA,UAAM,IAAI,MAAM,wJAA2B;AAAA,EAC7C,UAAE;AAAU,QAAI,gBAAgB,GAAG;AAAA,EAAE;AACvC;;;AC5DA,IAAAC,iBAAyC;;;ACEzC,SAAS,IAAI,OAAe,QAAgB,QAAwB;AAClE,QAAM,WAAW,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,YAAU,KAAK,MAAM,SAAS,MAAM,MAAM,QAAQ,SAAS,CAAC,GAAG,EAAE,KAAK,IAAI,UAAU,SAAS,MAAM,CAAC;AACnI,SAAO,MAAM,SAAS,IAAI,WAAS,MAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACjF;AAGO,SAAS,WAAW,EAAE,OAAO,SAAS,GAAgD;AAC3F,SAAO;AAAA,IACL,OAAO,EAAE,OAAO,MAAK,SAAS,OAAM,SAAS,MAAK,EAAE,QAAQ;AAAA,IAC5D,MAAM;AAAA,IAAO,MAAM,IAAI,OAAO,GAAG,IAAG;AAAA,IAAG,OAAO,IAAI,OAAO,GAAG,GAAE;AAAA,IAC9D,OAAO,IAAI,OAAO,KAAK,IAAG;AAAA,IAAG,QAAQ,IAAI,OAAO,KAAK,IAAG;AAAA,EAC1D;AACF;;;ACTA,IAAM,QAAQ,CAAC,MAA0B,EAAE,EAAE,QAAQ,CAAC,IAAI,MAAM,EAAE,EAAE,QAAQ,CAAC;AAKtE,SAAS,cAAc,QAA+B,UAAuD,OAA6B;AAC/I,MAAI,OAAO,SAAS,KAAK,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,KAAK,OAAO,KAAK,OAAK,CAAC,OAAO,SAAS,EAAE,CAAC,KAAK,CAAC,OAAO,SAAS,EAAE,CAAC,CAAC,EAAG,QAAO,CAAC;AAC5I,QAAM,QAAQ,WAAW,QAAQ,GAAG,QAAQ,MAAM,QAAQ;AAC1D,QAAM,UAAU,CAAC,CAAC;AAClB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,SAAQ,KAAK,QAAQ,IAAI,CAAC,IAAK,KAAK,MAAM,OAAO,CAAC,EAAG,IAAI,OAAO,IAAI,CAAC,EAAG,GAAG,OAAO,CAAC,EAAG,IAAI,OAAO,IAAI,CAAC,EAAG,CAAC,CAAC;AACnJ,QAAM,QAAQ,QAAQ,GAAG,EAAE;AAC3B,MAAI,QAAQ,KAAK,QAAO,CAAC;AACzB,QAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,IAAG,CAAC,CAAC,CAAC;AACtF,MAAI,UAAU;AACd,QAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM;AAC1D,UAAM,WAAW,QAAQ,IAAI;AAC7B,WAAO,UAAU,OAAO,SAAS,KAAK,QAAQ,OAAO,IAAK,SAAU;AACpE,UAAM,IAAI,OAAO,UAAU,CAAC,GAAI,IAAI,OAAO,OAAO,GAAI,SAAS,QAAQ,OAAO,IAAK,QAAQ,UAAU,CAAC;AACtG,UAAM,IAAI,SAAS,KAAK,WAAW,QAAQ,UAAU,CAAC,KAAM,SAAS;AACrE,WAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,SAAS,GAAG,IAAI,UAAU,EAAE,IAAI,EAAE,KAAK,SAAS,GAAG,SAAS;AAAA,EACvJ,CAAC;AACD,QAAM,KAAK,CAAC,GAAW,WAA+B;AAAE,UAAM,IAAI,QAAQ,CAAC;AAAI,WAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,QAAQ,GAAG,EAAE,IAAI,EAAE,KAAK,OAAO;AAAA,EAAE;AACzI,QAAM,OAAO,CAAC,WAA4D,QAAQ,IAAI,CAAC,GAAG,OAAO,IAAI,MAAM,OAAO,MAAM,GAAG,GAAG,OAAO,WAAW,WAAW,SAAS,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;AACjM,QAAM,SAAuB,CAAC;AAC9B,QAAM,MAAM,CAAC,IAAY,GAAW,QAAgB,WAAmB,UAAU,MAAY;AAAE,WAAO,KAAK,EAAE,IAAI,GAAG,QAAQ,OAAO,WAAW,QAAQ,CAAC;AAAA,EAAE;AACzJ,MAAI,QAAQ,KAAK,CAAC,GAAG,MAAM,MAAM,KAAK;AACtC,MAAI,WAAW,KAAK,CAAC,GAAG,MAAM,MAAM,QAAQ,IAAG;AAC/C,MAAI,SAAS,aAAa,SAAS;AACjC,QAAI,YAAY,KAAK,CAAC,QAAQ,IAAG,IAAI,KAAK,QAAQ,IAAG,GAAG,MAAM,OAAO,QAAQ,OAAM,IAAG;AACtF,QAAI,QAAQ,KAAK,CAAC,QAAQ,IAAG,IAAI,KAAK,QAAQ,IAAG,GAAG,MAAM,OAAO,QAAQ,OAAM,GAAE;AACjF,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK,EAAG,SAAQ,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,GAAE,CAAC,IAAI,MAAM,MAAM,GAAG,GAAG,QAAQ,GAAE,CAAC;AAC1G,QAAI,QAAQ,MAAM,MAAM,QAAQ,KAAK,IAAI,MAAK,QAAQ,IAAG,GAAG,GAAE;AAAA,EAChE,WAAW,SAAS,aAAa,WAAW;AAC1C,QAAI,eAAe,KAAK,CAAC,QAAQ,IAAG,GAAG,MAAM,OAAO,QAAQ,MAAK,IAAG;AACpE,QAAI,UAAU,KAAK,CAAC,QAAQ,IAAG,GAAG,MAAM,OAAO,QAAQ,MAAK,IAAG;AAC/D,QAAI,WAAW;AACf,aAAS,IAAI,GAAG,IAAI,QAAQ,GAAG,KAAK,EAAG,YAAW,QAAQ,CAAC,IAAI,CAAC,EAAG,aAAY,MAAM,MAAM,GAAG,GAAG,OAAO,QAAQ,IAAG,CAAC,IAAI,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,QAAQ,IAAG,CAAC;AACjK,QAAI,eAAe,UAAU,MAAM,MAAM,QAAQ,MAAK,IAAG;AACzD,QAAI,iBAAiB,UAAU,MAAM,QAAQ,KAAK,IAAI,MAAK,QAAQ,KAAI,CAAC;AAAA,EAC1E,OAAO;AACL,UAAM,QAAQ,QAAQ;AACtB,UAAM,OAAO,CAAC,aAA6B,KAAK,IAAI,WAAW,QAAQ,KAAK,KAAK,CAAC,IAAI,QAAQ;AAC9F,UAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,KAAK,cAAY,CAAC,KAAK,QAAQ,CAAC;AACjE,QAAI,kBAAkB,OAAO,OAAO,MAAM,MAAM,QAAQ,IAAG;AAC3D,QAAI,eAAe,OAAO,OAAO,MAAM,OAAO,QAAQ,MAAK,GAAE;AAC7D,QAAI,OAAO,IAAI,MAAM;AACrB,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,IAAI,QAAQ,CAAC,GAAI,MAAM,QAAQ,IAAI,CAAC;AAC1C,YAAM,OAAO,KAAK,KAAK,EAAE,WAAW,IAAI,YAAY,IAAI,QAAQ,KAAK,KAAK,CAAC,KAAK,IAAI,IAAI;AACxF,YAAM,IAAI,KAAK,EAAE,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,QAAQ,IAAI;AAC5D,cAAQ,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC;AACxD,aAAO,MAAM,MAAM,GAAG,GAAG,IAAI,QAAQ,KAAI,CAAC,IAAI,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,QAAQ,KAAI,CAAC;AAAA,IACvF;AACA,QAAI,YAAY,MAAM,MAAM,MAAM,QAAQ,IAAG;AAC7C,QAAI,gBAAgB,KAAK,MAAM,QAAQ,QAAQ,OAAM,IAAG;AAAA,EAC1D;AACA,SAAO;AACT;;;AC7DO,IAAM,yBAAyB;AAG/B,SAAS,sBAAsB,GAAe,GAAe,OAAe,OAAuB;AACxG,QAAM,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,KAAK,MAAM,IAAI,EAAE;AAClE,QAAM,KAAK,WAAW,OAAQ,CAAC,KAAK,WAAW,QAAQ;AACvD,QAAM,KAAK,WAAW,OAAQ,KAAK,WAAW,QAAQ;AACtD,SAAO,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,KAAK;AACjG;;;AHAwF,IAAAC,uBAAA;AALjF,SAAS,aAAa,EAAE,UAAU,OAAO,SAAS,OAAO,QAAQ,IAAI,SAAS,IAAI,GAAqH;AAC5M,QAAM,SAAK,sBAAM,EAAE,QAAQ,MAAM,EAAE;AACnC,QAAM,aAAS,wBAAQ,MAAM,MAAM,KAAK,EAAE,QAAQ,yBAAyB,EAAE,GAAG,CAAC,GAAG,MAAM,SAAS,EAAE,GAAG,IAAI,MAAM,IAAI,wBAAwB,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,MAAM,IAAI,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC;AACrN,QAAM,aAAS,wBAAQ,MAAM,cAAc,SAAS,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,CAAC,UAAU,OAAO,MAAM,CAAC;AACnM,SAAO,+CAAC,SAAI,WAAW,SAAS,6BAA6B,QAAW,OAAO,SAAS,SAAY,EAAE,QAAQ,GAAG,MAAM,SAAS,GAAG,KAAK,GAAG,SAAS,SAAS,eAAe,eAAe,qBAAoB,QAAO,eAAY,QAC/N;AAAA,aAAS,8CAAC,UAAK,wDAAC,aAAQ,IAAQ,cAAa,kBAAiB,OAAM,KAAI,QAAO,KAAI,wDAAC,WAAM,MAAM,OAAO,OAAM,KAAI,QAAO,KAAI,qBAAoB,QAAO,GAAE,GAAU;AAAA,IACnK,OAAO,IAAI,WAAS,+CAAC,2BAAwB;AAAA,oDAAC,UAAK,GAAG,MAAM,GAAG,MAAK,QAAO,QAAQ,MAAM,QAAQ,aAAa,MAAM,OAAO,SAAS,MAAM,SAAS,eAAc,SAAQ,gBAAe,SAAQ;AAAA,MAAG,SAAS,MAAM,OAAO,aAAa,OAAO,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,MAAM,8CAAC,UAAa,GAAE,KAAI,GAAG,IAAI,MAAM,OAAM,KAAI,QAAO,QAAO,MAAM,QAAQ,EAAE,KAAK,WAAW,sBAAsB,GAAG,OAAO,IAAI,CAAC,GAAI,MAAM,OAAO,CAAC,KAArI,CAAwI,CAAE;AAAA,SAA1X,MAAM,EAAsX,CAAW;AAAA,IAC1a,CAAC,UAAU,8CAAC,UAAK,GAAE,MAAK,GAAE,KAAI,OAAM,MAAK,QAAO,KAAI,IAAG,KAAI,MAAK,WAAU;AAAA,KAC7E;AACF;;;AJiC+G,IAAAC,uBAAA;AAvC/G,IAAM,YAAwE;AAAA,EAC5E,EAAE,IAAI,SAAS,MAAM,gBAAM,QAAQ,2BAAO;AAAA,EAAG,EAAE,IAAI,WAAW,MAAM,sBAAO,QAAQ,2BAAO;AAAA,EAAG,EAAE,IAAI,WAAW,MAAM,gBAAM,QAAQ,2BAAO;AAC3I;AACA,IAAM,cAAyD,CAAC,EAAE,KAAK,IAAI,OAAO,eAAK,GAAG,EAAE,KAAK,IAAI,OAAO,eAAK,GAAG,EAAE,KAAK,IAAI,OAAO,eAAK,CAAC;AAC5I,IAAM,aAA0E,CAAC,EAAE,KAAK,WAAW,OAAO,4BAAQ,QAAQ,6CAAY,GAAG,EAAE,KAAK,SAAS,OAAO,4BAAQ,QAAQ,uCAAW,CAAC;AAC5L,IAAM,SAAS,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAEzE,SAAS,uBAAoC;AAClD,QAAM,WAAW,mBAAmB,GAAG,CAAC,OAAO,QAAQ,QAAI,yBAAS,OAAO,EAAE,GAAG,SAAS,EAAE;AAC3F,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE,GAAG,CAAC,OAAO,QAAQ,QAAI,yBAAS,KAAK,GAAG,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AACzH,QAAM,WAAO,uBAAyB,IAAI,GAAG,YAAQ,uBAAO,CAAC;AAC7D,QAAM,gBAAY,uBAAyB,IAAI;AAC/C,QAAM,eAAW,uBAAO,QAAQ;AAChC,gCAAU,MAAM;AACd,UAAM,SAAS,SAAS;AACxB,aAAS,UAAU;AAEnB,aAAS,WAAS,oBAAoB,OAAO,MAAM,IAAI,EAAE,GAAG,SAAS,IAAI,KAAK;AAAA,EAChF,GAAG,CAAC,QAAQ,CAAC;AACb,gCAAU,MAAM,MAAM;AAAE,UAAM;AAAA,EAAU,GAAG,CAAC,CAAC;AAC7C,QAAM,SAAS,CAAC,UAAuC;AAAE,aAAS,YAAU,EAAE,GAAG,OAAO,GAAG,MAAM,EAAE;AAAG,aAAS,KAAK;AAAG,aAAS,EAAE;AAAA,EAAE;AACpI,QAAM,aAAa,kBAAkB,KAAK,MAAM,KAAK;AACrD,QAAM,eAAe,aAAa,MAAM,QAAQ,yBAAyB;AACzE,QAAM,QAAQ,CAAC,oBAAoB,OAAO,QAAQ;AAClD,QAAM,SAAS,OAAO,OAAsC,SAAiC,YAA2B;AACtH,UAAM,WAAW,MAAM,cAAc,QAAQ,CAAC;AAAG,UAAM,cAAc,QAAQ;AAC7E,QAAI,CAAC,SAAU;AACf,UAAM,UAAU,EAAE,MAAM;AACxB,kBAAc,IAAI;AAAG,aAAS,EAAE;AAAG,aAAS,KAAK;AACjD,QAAI;AAAE,YAAM,QAAQ,MAAM,iBAAiB,UAAU,WAAW,eAAe,MAAM,IAAI;AAAG,UAAI,YAAY,MAAM,QAAS,QAAO,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;AAAA,IAAE,SAChJ,QAAQ;AAAE,UAAI,YAAY,MAAM,QAAS,UAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAC/E;AAAU,UAAI,YAAY,MAAM,QAAS,eAAc,KAAK;AAAA,IAAE;AAAA,EAChE;AACA,QAAM,OAAO,MAAY;AACvB,QAAI,CAAC,YAAY;AAAE,eAAS,sHAA4B;AAAG;AAAA,IAAO;AAClE,QAAI;AAAE,0BAAoB,KAAK;AAAG,eAAS,yBAAyB,KAAK,CAAC;AAAG,eAAS,IAAI;AAAG,eAAS,EAAE;AAAA,IAAE,SACnG,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE;AAAA,EAClD;AACA,SAAO,+CAAC,SAAI,WAAU,yDACpB;AAAA,kDAAC,iBAAc,SAAQ,kBAAiB,OAAM,4BAAO,QAAO,sNAAsC,SAAS,+CAAC,YAAO,MAAK,UAAS,UAAU,CAAC,SAAS,YAAY,SAAS,MAAM;AAAA,oDAAC,uDAAmB,MAAM,IAAI;AAAA,MAAE;AAAA,OAAI,GAAW;AAAA,IAC9N,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,IACjC,SAAS,8CAAC,mBAAgB,MAAK,WAAU,0EAAU;AAAA,IACpD,+CAAC,SAAI,WAAU,uCACb;AAAA,qDAAC,SAAI,WAAU,uCACb;AAAA,uDAAC,kBAAe,OAAM,kCAAQ,QAAO,oJAA2B,SAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,8BAA6B,WAAS,MAAM,SAAS,MAAK,UAAS,cAAW,wCAAS,gBAAc,MAAM,SAAS,SAAS,MAAM,OAAO,EAAE,SAAS,CAAC,MAAM,QAAQ,CAAC,GAAG,wDAAC,OAAE,GAAE,GAAW;AAAA,wDAAC,OAAE,WAAU,oCAAmC,8MAAgC;AAAA,UAC/W,+CAAC,SAAI,WAAU,+BAA8B;AAAA,0DAAC,UAAK,sCAAI;AAAA,YAAO,8CAAC,SAAI,WAAU,+BAA8B,MAAK,SAAQ,cAAW,4BAAQ,sBAAY,IAAI,UAAQ,+CAAC,YAAsB,MAAK,UAAS,gBAAc,MAAM,QAAQ,KAAK,KAAK,SAAS,MAAM,OAAO,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG;AAAA,6DAAC,YAAQ;AAAA,qBAAK;AAAA,gBAAI;AAAA,iBAAI;AAAA,cAAS,8CAAC,WAAO,eAAK,OAAM;AAAA,iBAA1J,KAAK,GAA6J,CAAS,GAAE;AAAA,YAAM,8CAAC,WAAM,0KAA0B;AAAA,aAAQ;AAAA,WAC9Y;AAAA,QACA,+CAAC,kBAAe,OAAM,4BAAO,QAAO,kIAClC;AAAA,yDAAC,WAAM,WAAU,8BAA6B;AAAA,2DAAC,UAAK;AAAA;AAAA,cAAK,+CAAC,YAAQ;AAAA,sBAAM;AAAA,gBAAY;AAAA,iBAAC;AAAA,eAAS;AAAA,YAAO,8CAAC,WAAM,MAAK,SAAQ,KAAI,MAAK,KAAI,OAAM,MAAK,KAAI,cAAW,4BAAO,OAAO,MAAM,aAAa,UAAU,WAAS,OAAO,EAAE,aAAa,OAAO,MAAM,OAAO,KAAK,EAAE,CAAC,GAAG;AAAA,YAAE,8CAAC,WAAM,8JAAuC;AAAA,aAAQ;AAAA,UACjU,8CAAC,SAAI,WAAU,iCAAgC,MAAK,SAAQ,cAAW,4BAAQ,oBAAU,IAAI,UAAQ,+CAAC,YAAqB,MAAK,UAAS,gBAAc,MAAM,aAAa,KAAK,IAAI,SAAS,MAAM,OAAO,EAAE,UAAU,KAAK,GAAG,CAAC,GAAG;AAAA,0DAAC,gBAAa,UAAU,KAAK,IAAI,OAAO,cAAc,QAAM,MAAC;AAAA,YAAE,8CAAC,YAAQ,eAAK,MAAK;AAAA,YAAS,8CAAC,WAAO,eAAK,QAAO;AAAA,YAAS,MAAM,aAAa,KAAK,MAAM,8CAAC,uDAAmB,MAAM,IAAI;AAAA,eAAnS,KAAK,EAAiS,CAAS,GAAE;AAAA,UACna,+CAAC,SAAI,WAAU,iCAAgC;AAAA,0DAAC,UAAK,sCAAI;AAAA,YAAO,8CAAC,SAAI,WAAU,gCAA+B,MAAK,SAAQ,cAAW,wCAAU,iBAAO,IAAI,WAAS,+CAAC,YAAmB,MAAK,UAAS,cAAY,4BAAQ,KAAK,IAAI,gBAAc,MAAM,MAAM,YAAY,MAAM,OAAO,SAAS,MAAM,OAAO,EAAE,MAAM,CAAC,GAAG;AAAA,4DAAC,OAAE,OAAO,EAAE,iBAAiB,MAAM,GAAG;AAAA,cAAG,MAAM,MAAM,YAAY,MAAM,SAAS,8CAAC,uDAAmB,MAAM,IAAI;AAAA,iBAArP,KAAwP,CAAS,GAAE;AAAA,YAAM,+CAAC,WAAM,WAAU,2BAA0B;AAAA,4DAAC,UAAK,WAAU,0BAAyB,wDAAO;AAAA,cAAO,8CAAC,WAAM,cAAW,8CAAU,gBAAc,CAAC,YAAY,OAAO,MAAM,OAAO,WAAW,GAAG,YAAY,OAAO,UAAU,WAAS,OAAO,EAAE,OAAO,MAAM,OAAO,MAAM,CAAC,GAAG;AAAA,eAAE;AAAA,aAAQ;AAAA,UAC3sB,CAAC,cAAc,8CAAC,OAAE,WAAU,mCAAkC,yFAAe;AAAA,UAC9E,8CAAC,WAAM,KAAK,WAAW,MAAK,QAAO,QAAO,mCAAkC,QAAM,MAAC,cAAW,wCAAS,UAAU,WAAS;AAAE,iBAAK,OAAO,OAAO,YAAY;AAAA,UAAE,GAAG;AAAA,UAChK,+CAAC,SAAI,WAAU,qCAAoC;AAAA,2DAAC,YAAO,MAAK,UAAS,UAAU,YAAY,SAAS,MAAM,UAAU,SAAS,MAAM,GAAG;AAAA,4DAAC,sDAAkB,MAAM,IAAI;AAAA,cAAG,MAAM,aAAa,yCAAW;AAAA,eAAU;AAAA,YAAS,8CAAC,YAAO,MAAK,UAAS,UAAU,cAAc,CAAC,MAAM,YAAY,SAAS,MAAM,OAAO,EAAE,YAAY,GAAG,CAAC,GAAG,sCAAI;AAAA,aAAS;AAAA,UACpV,8CAAC,OAAE,WAAU,oCAAmC,4RAA6C;AAAA,WAC/F;AAAA,QACA,+CAAC,kBAAe,OAAM,4BAAO,QAAO,yJAClC;AAAA,wDAAC,WAAM,KAAK,MAAM,MAAK,QAAO,QAAO,mCAAkC,QAAM,MAAC,cAAW,wCAAS,UAAU,WAAS;AAAE,iBAAK,OAAO,KAAK;AAAA,UAAE,GAAG;AAAA,UAC7I,+CAAC,SAAI,WAAU,qCAAoC;AAAA,2DAAC,YAAO,MAAK,UAAS,UAAU,YAAY,SAAS,MAAM,KAAK,SAAS,MAAM,GAAG;AAAA,4DAAC,sDAAkB,MAAM,IAAI;AAAA,cAAG,aAAa,mCAAU,MAAM,QAAQ,6BAAS;AAAA,eAAO;AAAA,YAAS,+CAAC,YAAO,MAAK,UAAS,UAAU,CAAC,MAAM,SAAS,YAAY,SAAS,MAAM,OAAO,EAAE,OAAO,GAAG,CAAC,GAAG;AAAA,4DAAC,yDAAqB,MAAM,IAAI;AAAA,cAAE;AAAA,eAAM;AAAA,aAAS;AAAA,UACtX,8CAAC,SAAI,WAAU,+BAA8B,gBAAa,KAAI,MAAK,SAAQ,cAAW,wCAAU,qBAAW,IAAI,UAAQ,+CAAC,YAAsB,MAAK,UAAS,UAAU,YAAY,gBAAc,MAAM,aAAa,KAAK,KAAK,SAAS,MAAM,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG;AAAA,0DAAC,YAAQ,eAAK,OAAM;AAAA,YAAS,8CAAC,WAAO,eAAK,QAAO;AAAA,eAAzL,KAAK,GAA4L,CAAS,GAAE;AAAA,UAChV,8CAAC,OAAE,WAAU,oCAAmC,0WAA0D;AAAA,UAC1G,+CAAC,WAAM,WAAU,8BAA6B;AAAA,2DAAC,UAAK;AAAA;AAAA,cAAM,+CAAC,YAAQ;AAAA,sBAAM;AAAA,gBAAQ;AAAA,iBAAC;AAAA,eAAS;AAAA,YAAO,8CAAC,WAAM,MAAK,SAAQ,KAAI,KAAI,KAAI,OAAM,MAAK,KAAI,OAAO,MAAM,SAAS,cAAW,kCAAQ,UAAU,WAAS,OAAO,EAAE,SAAS,OAAO,MAAM,OAAO,KAAK,EAAE,CAAC,GAAG;AAAA,YAAE,8CAAC,WAAM,wKAAkC;AAAA,aAAQ;AAAA,UACjT,8CAAC,OAAE,WAAU,oCAAmC,wSAAoD;AAAA,WACtG;AAAA,QACA,+CAAC,SAAI,WAAU,uCAAsC;AAAA,wDAAC,YAAO,MAAK,UAAS,UAAU,YAAY,SAAS,MAAM,OAAO,EAAE,GAAG,yBAAyB,CAAC,GAAG,4CAAK;AAAA,UAAS,8CAAC,WAAO,kBAAQ,+CAAY,sEAAc;AAAA,WAAQ;AAAA,SAC3N;AAAA,MACA,+CAAC,WAAM,WAAU,+BAA8B,cAAW,wCAAS;AAAA,uDAAC,YAAO;AAAA,wDAAC,YAAO,sCAAI;AAAA,UAAS,8CAAC,WAAO,gBAAM,UAAU,2DAAc,4EAAe;AAAA,WAAQ;AAAA,QAAS,+CAAC,SAAI,WAAU,qCAAoC;AAAA,wDAAC,gBAAa,UAAU,MAAM,UAAU,OAAO,cAAc,OAAO,MAAM,YAAY,QAAQ,MAAM,aAAa;AAAA,UAAE,8CAAC,SAAI,WAAU,oCAAoC,gBAAM,QAAQ,8CAAC,SAAI,KAAK,MAAM,OAAO,OAAO,EAAE,WAAW,MAAM,SAAS,GAAG,KAAI,0DAAY,IAAK,+CAAC,UAAK;AAAA,0DAAC,6DAAyB,MAAM,IAAI;AAAA,YAAE,8CAAC,YAAO,sBAAQ;AAAA,YAAS,8CAAC,WAAM,kDAAM;AAAA,aAAQ,GAAQ;AAAA,WAAM;AAAA,QAAM,+CAAC,OAAE;AAAA;AAAA,UAAO,8CAAC,QAAG;AAAA,UAAE,8CAAC,WAAM,wDAAS;AAAA,WAAQ;AAAA,SAAI;AAAA,OAC3nB;AAAA,KACF;AACF;;;AQ7EA,IAAAC,iBAAyD;;;ACAzD,IAAAC,iBAAyD;AAKlD,SAAS,kBAAmI;AACjJ,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAuB,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAE,CAAC;AACzE,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAwB;AACxD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,QAAM,WAAO,uBAAO,EAAE,GAAG,aAAS,uBAAe,GAAG,kBAAc,uBAAO,KAAK,GAAG,cAAU,uBAAO,IAAI,GAAG,oBAAgB,uBAAO,CAAC;AACjI,QAAMC,aAAQ,4BAAY,CAAC,UAA8B;AACvD,QAAI,CAAC,QAAQ,QAAS;AACtB,UAAM,QAAQ,MAAM,MAAM,CAAC;AAC3B,QAAI,YAAY,WAAW,SAAS,MAAM,OAAO,OAAO,WAAW,MAAM,WAAW,OAAW,aAAY,KAAK;AAChH,gBAAY,UAAU;AAAM,WAAO,UAAU,OAAO;AAAI,aAAS,KAAK;AAAG,aAAS,EAAE;AAAA,EACtF,GAAG,CAAC,CAAC;AACL,gCAAU,MAAM;AACd,YAAQ,UAAU;AAClB,QAAIC,QAAkD,SAAsC,WAAW,GAAG,UAAU;AACpH,UAAMC,QAAO,YAA2B;AACtC,UAAI,WAAW,SAAS,UAAU,QAAS;AAC3C,mBAAaD,MAAK;AAClB,gBAAU,IAAI,gBAAgB;AAC9B,YAAM,QAAQ,cAAc;AAC5B,YAAM,UAAU,WAAW,MAAM,SAAS,MAAM,GAAG,IAAM;AACzD,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,GAAG,WAAW,kBAAkB,EAAE,QAAQ,QAAQ,QAAQ,SAAS,KAAK,UAAU,EAAE,iBAAiB,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC;AACvJ,YAAI,SAAS,WAAW,KAAK;AAC3B,cAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,mDAAW,SAAS,MAAM,QAAG;AAC/D,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,cAAI,CAAC,WAAW,UAAU,cAAc,SAAS;AAAE,iBAAK,UAAU,SAAS,QAAQ,IAAI,MAAM,KAAK;AAAI,YAAAD,OAAM,IAAI;AAAA,UAAE;AAAA,QACpH;AACA,mBAAW;AAAG,YAAI,CAAC,QAAS,UAAS,EAAE;AAAA,MACzC,SAAS,QAAQ;AAAE,YAAI,CAAC,WAAW,CAAC,SAAS,QAAQ;AAAE;AAAY,mBAAS,kBAAkB,QAAQ,OAAO,UAAU,sCAAQ;AAAA,QAAE;AAAA,MAAE,UACnI;AACE,qBAAa,OAAO;AAAG,kBAAU;AACjC,YAAI,CAAC,WAAW,CAAC,SAAS,OAAQ,CAAAC,SAAQ,WAAW,MAAM;AAAE,eAAKC,MAAK;AAAA,QAAE,GAAG,KAAK,IAAI,KAAQ,MAAQ,KAAK,QAAQ,CAAC;AAAA,MACrH;AAAA,IACF;AACA,UAAM,aAAa,MAAY;AAAE,mBAAaD,MAAK;AAAG,UAAI,SAAS,OAAQ,UAAS,MAAM;AAAA,UAAQ,MAAKC,MAAK;AAAA,IAAE;AAC9G,aAAS,iBAAiB,oBAAoB,UAAU;AAAG,SAAKA,MAAK;AACrE,WAAO,MAAM;AAAE,gBAAU;AAAM,cAAQ,UAAU;AAAO,mBAAaD,MAAK;AAAG,eAAS,MAAM;AAAG,eAAS,oBAAoB,oBAAoB,UAAU;AAAA,IAAE;AAAA,EAC9J,GAAG,CAACD,MAAK,CAAC;AACV,QAAM,WAAO,4BAAY,OAAO,QAAiC;AAC/D,kBAAc;AACd,QAAI;AAAE,YAAM,QAAQ,MAAM,IAAkB,iBAAiB,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC;AAAG,oBAAc;AAAW,WAAK,UAAU;AAAI,MAAAA,OAAM,KAAK;AAAA,IAAE,SACnK,QAAQ;AAAE,UAAI,QAAQ,QAAS,UAAS,kBAAkB,QAAQ,OAAO,UAAU,sCAAQ;AAAA,IAAE;AAAA,EACtG,GAAG,CAACA,MAAK,CAAC;AACV,SAAO,EAAE,OAAO,UAAU,OAAO,KAAK;AACxC;;;ACjDA,IAAAG,iBAAgH;AAGhH,IAAM,MAAM;AAEL,SAAS,aAAa,MAAc,OAAe,MAAc,QAAQ,OAAe;AAC7F,SAAO,SAAS,KAAK,IAAI,OAAO,QAAQ,IAAI,IAAI,KAAK,KAAK,OAAO,QAAQ,IAAI;AAC/E;AACA,IAAM,QAAQ,CAAC,OAAe,KAAa,SAAyB,KAAK,IAAI,KAAK,KAAK,IAAI,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAE/G,SAAS,gBAAgB,QAAiE,UAA6C;AAC5I,QAAM,QAAQ,KAAK,IAAI,KAAK,SAAS,QAAQ,EAAE,GAAG,YAAY,KAAK,IAAI,KAAK,SAAS,SAAS,EAAE,GAAG,MAAM;AACzG,QAAM,OAAO,OAAO,IAAI,QAAQ,KAAK,QAAQ,OAAO,IAAI,OAAO,QAAQ;AACvE,MAAI,QAAQ,MAAM,QAAQ,SAAS,SAAS,QAAQ,IAAI;AACtD,WAAO,EAAE,OAAO,WAAW,MAAM,MAAM,QAAQ,KAAK,OAAO,OAAO,IAAI,SAAS,QAAQ,QAAQ,EAAE,GAAG,KAAK,MAAM,OAAO,IAAI,IAAI,IAAI,SAAS,SAAS,YAAY,EAAE,EAAE;AAAA,EACtK;AAGA,QAAM,QAAQ,MAAM,OAAO,IAAI,OAAO,SAAS,KAAK,IAAI,SAAS,SAAS,EAAE;AAC5E,QAAM,QAAQ,MAAM,OAAO,IAAI,KAAK,IAAI,SAAS,SAAS,EAAE;AAC5D,QAAM,WAAW,SAAS,SAAS,QAAQ,MAAM,QAAQ;AACzD,QAAM,YAAY,WAAW,SAAS,SAAS,QAAQ,KAAK,QAAQ;AACpE,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,SAAS,CAAC;AACzD,SAAO,EAAE,OAAO,WAAW,QAAQ,MAAM,MAAM,OAAO,IAAI,OAAO,QAAQ,IAAI,QAAQ,GAAG,IAAI,SAAS,QAAQ,QAAQ,EAAE,GAAG,KAAK,WAAW,QAAQ,QAAQ,OAAO;AACnK;AAKO,SAAS,oBAAoB,MAA8B,QAAqD;AACrH,QAAM,eAAW,uBAAO,EAAE,MAAM,CAAC,MAAuC;AAAA,EAAC,GAAG,MAAM,CAAC,MAAuC;AAAA,EAAC,GAAG,KAAK,CAAC,MAAuC;AAAA,EAAC,GAAG,KAAK,CAAC,MAAwC;AAAA,EAAC,EAAE,CAAC;AACjO,gCAAU,MAAM;AACd,UAAM,UAAU,KAAK;AACrB,QAAI,CAAC,QAAS;AACd,QAAI,OAA6B,SAA+B,QAAQ;AACxE,QAAI,SAAS;AACb,UAAM,UAAU,SAAS,cAA2B,mCAAmC;AACvF,UAAM,OAAO,MAAM;AACjB,YAAM,OAAO,SAAS,sBAAsB;AAC5C,aAAO,QAAQ,KAAK,QAAQ,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,aAAa,IAAI,KAAK,KAAK,CAAC,IAAI;AAAA,IAC1G;AACA,QAAI;AACJ,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,aAAa,QAAQ,GAAG,KAAK,MAAM;AAC5D,UAAI,SAAS,OAAO,SAAS,MAAM,CAAC,KAAK,OAAO,SAAS,MAAM,CAAC,GAAG;AACjE,gBAAQ,EAAE,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE;AAC5D,iBAAS,MAAM,UAAU;AAAA,MAC3B;AAAA,IACF,QAAQ;AAAA,IAA2D;AACnE,UAAM,SAAS,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,aAAa,QAAQ,WAAW,GAAG,GAAG,KAAK,IAAI,IAAI,cAAc,QAAQ,eAAe,EAAE,EAAE;AACnI,UAAM,QAAQ,CAAC,MAAsB;AACnC,YAAM,MAAM,OAAO;AACnB,cAAQ,MAAM,OAAO,GAAG,MAAM,EAAE,GAAG,KAAK,QAAQ,cAAc,GAAG,IAAI,CAAC,CAAC;AAAM,cAAQ,MAAM,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;AAAM,cAAQ,MAAM,QAAQ;AACrJ,cAAQ,QAAQ,SAAS,OAAO,MAAM;AACtC,aAAO,SAAS,SAAS;AAAA,IAC3B;AACA,UAAM,UAAU,MAAY;AAC1B,YAAM,MAAM,OAAO;AACnB,YAAM,IAAI,QAAQ,EAAE,GAAG,MAAM,IAAI,IAAI,GAAG,GAAG,KAAK,MAAM,KAAK,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG;AACzF,UAAI,OAAQ,GAAE,IAAI,aAAa,EAAE,GAAG,QAAQ,aAAa,KAAK,GAAG,IAAI;AACrE,YAAM,CAAC;AAAA,IACT;AACA,UAAM,QAAQ,MAAY;AAAE,2BAAqB,KAAK;AAAG,cAAQ;AAAG,UAAI,SAAS;AAAE,cAAM,OAAO;AAAG,kBAAU;AAAA,MAAU;AAAA,IAAE;AACzH,UAAM,UAAU,MAAY;AAC1B,YAAM,MAAM,OAAO;AACnB,cAAQ,EAAE,GAAG,WAAW,QAAQ,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,WAAW,QAAQ,MAAM,GAAG,IAAI,OAAO,IAAI,IAAI,MAAM,IAAI,OAAO;AAChI,UAAI;AAAE,qBAAa,QAAQ,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAwC;AAAA,IACzG;AACA,UAAM,SAAS,MAAY;AACzB,UAAI,CAAC,KAAM;AACX,YAAM,WAAW;AAAM,aAAO;AAAW,YAAM;AAC/C,YAAM,IAAI,QAAQ,YAAY,UAAU,aAAa,GAAG,QAAQ,aAAa,KAAK,CAAC;AACnF,eAAS,KAAK,IAAI,UAAU,QAAQ,cAAc,IAAI,KAAK,CAAC,IAAI;AAChE,YAAM,EAAE,GAAG,SAAS,GAAG,QAAQ,UAAU,CAAC;AAAG,cAAQ;AACrD,UAAI,SAAS,OAAO,kBAAkB,SAAS,EAAE,EAAG,UAAS,OAAO,sBAAsB,SAAS,EAAE;AAAA,IACvG;AACA,aAAS,UAAU;AAAA,MACjB,KAAK,OAAO;AACV,YAAI,CAAC,MAAM,aAAa,MAAM,WAAW,KAAK,KAAM;AACpD,cAAM,eAAe;AAErB,eAAO,EAAE,IAAI,MAAM,WAAW,GAAG,MAAM,SAAS,GAAG,MAAM,SAAS,MAAM,QAAQ,YAAY,KAAK,QAAQ,WAAW,QAAQ,MAAM,cAAc;AAChJ,cAAM,cAAc,kBAAkB,MAAM,SAAS;AAAA,MACvD;AAAA,MACA,KAAK,OAAO;AACV,YAAI,CAAC,QAAQ,MAAM,cAAc,KAAK,GAAI;AAC1C,kBAAU,EAAE,GAAG,KAAK,OAAO,MAAM,UAAU,KAAK,GAAG,GAAG,KAAK,MAAM,MAAM,UAAU,KAAK,EAAE;AACxF,YAAI,CAAC,MAAO,SAAQ,sBAAsB,KAAK;AAAA,MACjD;AAAA,MACA,IAAI,OAAO;AAAE,YAAI,MAAM,OAAO,MAAM,UAAW,QAAO;AAAA,MAAE;AAAA,MACxD,IAAI,OAAO;AACT,YAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,gBAAM,eAAe;AAAG,mBAAS;AACjC,gBAAM,EAAE,GAAG,aAAa,GAAG,QAAQ,aAAa,KAAK,GAAG,IAAI,GAAG,GAAG,QAAQ,UAAU,CAAC;AAAG,kBAAQ;AAAG;AAAA,QACrG;AACA,cAAM,OAAO,MAAM,WAAW,KAAK,IAAI,QAAQ,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,IAAI,EAAE,EAAE,MAAM,GAAG;AACpJ,YAAI,CAAC,MAAO;AACZ,cAAM,eAAe;AACrB,iBAAS;AACT,cAAM,EAAE,GAAG,QAAQ,aAAa,MAAM,CAAC,GAAI,GAAG,QAAQ,YAAY,MAAM,CAAC,EAAG,CAAC;AAAG,gBAAQ;AAAA,MAC1F;AAAA,IACF;AACA,UAAM,SAAS,MAAY;AAAE,aAAO;AAAG,cAAQ;AAAA,IAAE;AACjD,UAAM,WAAW,IAAI,eAAe,MAAM;AAAG,aAAS,QAAQ,OAAO;AACrE,UAAM,kBAAkB,IAAI,eAAe,MAAM;AAAE,UAAI,UAAU,CAAC,KAAM,SAAQ;AAAA,IAAE,CAAC;AACnF,QAAI,QAAS,iBAAgB,QAAQ,OAAO;AAC5C,WAAO,iBAAiB,UAAU,MAAM;AAAG,WAAO,iBAAiB,QAAQ,MAAM;AAAG,YAAQ;AAC5F,WAAO,MAAM;AAAE,aAAO;AAAG,2BAAqB,KAAK;AAAG,eAAS,WAAW;AAAG,sBAAgB,WAAW;AAAG,aAAO,oBAAoB,UAAU,MAAM;AAAG,aAAO,oBAAoB,QAAQ,MAAM;AAAA,IAAE;AAAA,EACtM,GAAG,CAAC,MAAM,MAAM,CAAC;AACjB,SAAO,EAAE,eAAe,CAAC,MAAuC,SAAS,QAAQ,KAAK,CAAC,GAAG,eAAe,CAAC,MAAuC,SAAS,QAAQ,KAAK,CAAC,GAAG,aAAa,CAAC,MAAuC,SAAS,QAAQ,IAAI,CAAC,GAAG,iBAAiB,CAAC,MAAuC,SAAS,QAAQ,IAAI,CAAC,GAAG,sBAAsB,CAAC,MAAuC,SAAS,QAAQ,IAAI,CAAC,GAAG,WAAW,CAAC,MAAwC,SAAS,QAAQ,IAAI,CAAC,EAAE;AAChf;;;AC9GA,IAAAC,iBAA6E;AAC7E,IAAAC,mCAA0H;AAiCpC,IAAAC,uBAAA;AAzB/E,SAAS,cAAc,EAAE,OAAO,UAAU,OAAO,QAAQ,UAAU,SAAS,SAAS,UAAU,GAAuB;AAC3H,QAAM,YAAQ,uBAAoB,IAAI,GAAG,CAAC,SAAS,UAAU,QAAI,yBAAS,CAAC;AAC3E,QAAM,UAAU,MAAM,gBAAgB,OAAO,SAAS,sBAAsB,KAAK,EAAE,GAAG,aAAa,GAAG,GAAG,IAAI,OAAO,GAAG,QAAQ,EAAE,GAAG,EAAE,OAAO,YAAY,QAAQ,YAAY,CAAC;AAC9K,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,OAAO;AAClD,QAAM,SAAS,MAAM,MAAM,KAAK,UAAQ,KAAK,OAAO,QAAQ;AAC5D,sCAAgB,MAAM;AACpB,iBAAa,QAAQ,CAAC;AACtB,UAAM,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAC5C,QAAI,QAAQ;AACZ,UAAM,SAAS,MAAY;AAAE,2BAAqB,KAAK;AAAG,cAAQ,sBAAsB,MAAM,aAAa,QAAQ,CAAC,CAAC;AAAA,IAAE;AACvH,WAAO,iBAAiB,UAAU,MAAM;AACxC,WAAO,MAAM;AAAE,2BAAqB,KAAK;AAAG,aAAO,oBAAoB,UAAU,MAAM;AAAA,IAAE;AAAA,EAC3F,GAAG,CAAC,MAAM,CAAC;AACX,gCAAU,MAAM;AACd,UAAM,UAAU,CAAC,UAA8B;AAG7C,UAAI,CAAC,MAAM,SAAS,SAAS,MAAM,MAAc,KAAK,CAAC,OAAO,SAAS,SAAS,MAAM,MAAc,EAAG,SAAQ;AAAA,IACjH;AACA,UAAM,SAAS,CAAC,UAA+B;AAAE,UAAI,MAAM,QAAQ,UAAU;AAAE,cAAM,eAAe;AAAG,cAAM,gBAAgB;AAAG,gBAAQ,IAAI;AAAA,MAAE;AAAA,IAAE;AAChJ,aAAS,iBAAiB,eAAe,OAAO;AAAG,aAAS,iBAAiB,WAAW,MAAM;AAC9F,WAAO,MAAM;AAAE,eAAS,oBAAoB,eAAe,OAAO;AAAG,eAAS,oBAAoB,WAAW,MAAM;AAAA,IAAE;AAAA,EACvH,GAAG,CAAC,SAAS,MAAM,CAAC;AACpB,SAAO,+CAAC,aAAQ,KAAK,OAAO,IAAG,6BAA4B,WAAU,6BAA4B,cAAW,4BAAO,UAAU,IAAI,OAAO,WACtI;AAAA,mDAAC,YACE;AAAA,gBAAU,8CAAC,YAAO,MAAK,UAAS,cAAW,wCAAS,SAAS,MAAM,SAAS,GAAG,wDAAC,6DAAyB,MAAM,IAAI,WAAU,4BAA2B,GAAE;AAAA,MAC1J,CAAC,UAAU,8CAAC,UAAK,WAAU,mCAAkC,eAAY,QAAO,wDAAC,yDAAqB,MAAM,IAAI,GAAE;AAAA,MACnH,+CAAC,SAAI,WAAU,sCAAqC;AAAA,sDAAC,YAAQ,mBAAS,OAAO,gBAAgB,4BAAO;AAAA,QAAS,8CAAC,WAAO,mBAAS,+CAAY,8CAAU;AAAA,SAAQ;AAAA,MAC3J,CAAC,CAAC,MAAM,UAAU,8CAAC,UAAK,WAAU,oCAAmC,cAAY,GAAG,MAAM,MAAM,uBAAS,gBAAM,QAAO;AAAA,MACvH,8CAAC,YAAO,MAAK,UAAS,cAAW,wCAAS,SAAS,WAAS,QAAQ,MAAM,WAAW,CAAC,GAAG,wDAAC,uDAAmB,MAAM,IAAI,GAAE;AAAA,OAC3H;AAAA,IACC,SAAS,8CAAC,OAAE,MAAK,SAAQ,WAAU,6BAA6B,iBAAM;AAAA,IACtE,SAAS,gFAAE;AAAA,qDAAC,aAAQ,WAAU,8BAA6B;AAAA,uDAAC,SAAI,WAAU,mCAAkC;AAAA,wDAAC,UAAM,iBAAO,SAAS,SAAS,6BAAS,OAAO,SAAS,aAAa,6BAAS,4BAAO;AAAA,UAAO,8CAAC,UAAK,UAAU,IAAI,KAAK,OAAO,SAAS,EAAE,YAAY,GAAI,cAAI,KAAK,OAAO,SAAS,EAAE,eAAe,CAAC,GAAG,EAAE,OAAO,WAAW,KAAK,WAAW,MAAM,WAAW,QAAQ,UAAU,CAAC,GAAE;AAAA,WAAO;AAAA,QAAM,8CAAC,QAAI,iBAAO,OAAM;AAAA,QAAK,8CAAC,OAAG,iBAAO,SAAQ;AAAA,SAAI;AAAA,MAAU,+CAAC,YAAO;AAAA,uDAAC,YAAO,MAAK,UAAS,WAAU,oCAAmC,SAAS,MAAM,SAAS,GAAG;AAAA;AAAA,UAAI,8CAAC,UAAM,gBAAM,MAAM,QAAO;AAAA,WAAO;AAAA,QAAS,+CAAC,YAAO,MAAK,UAAS,WAAU,8BAA6B,SAAS,MAAM,QAAQ,MAAM,GAAG;AAAA,wDAAC,sDAAkB,MAAM,IAAI;AAAA,UAAG,OAAO,SAAS,SAAS,6BAAS,OAAO,SAAS,aAAa,yCAAW;AAAA,WAAO;AAAA,SAAS;AAAA,OAAS,IAClzB,gFAAE;AAAA,qDAAC,SAAI,WAAU,4BAA4B;AAAA,cAAM,MAAM,SAAS,MAAM,MAAM,MAAM,GAAG,OAAO,EAAE,IAAI,UAAQ,+CAAC,YAAO,MAAK,UAAuB,eAAa,KAAK,WAAW,QAAW,SAAS,MAAM,SAAS,IAAI,GAAG;AAAA,yDAAC,UAAK;AAAA,0DAAC,YAAQ,eAAK,eAAc;AAAA,YAAS,8CAAC,UAAM,cAAI,KAAK,KAAK,SAAS,EAAE,mBAAmB,CAAC,GAAG,EAAE,MAAM,WAAW,QAAQ,UAAU,CAAC,GAAE;AAAA,aAAO;AAAA,UAAO,8CAAC,OAAG,eAAK,OAAM;AAAA,UAAI,8CAAC,WAAO,eAAK,QAAQ,QAAQ,QAAQ,GAAG,EAAE,MAAM,GAAG,GAAG,GAAE;AAAA,aAAnT,KAAK,EAAsT,CAAS,IAAI,8CAAC,OAAE,WAAU,6BAA4B,wDAAO;AAAA,QAAM,MAAM,MAAM,SAAS,WAAW,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,WAAW,WAAS,QAAQ,CAAC,GAAG,kDAAM;AAAA,SAAU;AAAA,MAAM,+CAAC,YAAO;AAAA,uDAAC,WAAM;AAAA;AAAA,UAAI,MAAM,MAAM;AAAA,UAAO;AAAA,WAAE;AAAA,QAAQ,+CAAC,YAAO,MAAK,UAAS,UAAU,CAAC,MAAM,QAAQ,SAAS,WAAW;AAAA,wDAAC,uDAAmB,MAAM,IAAI;AAAA,UAAE;AAAA,WAAI;AAAA,SAAS;AAAA,OAAS;AAAA,KAC/yB;AACF;;;AHxB4B,IAAAC,uBAAA;AAT5B,SAAS,aAAa,QAA+B;AACnD,MAAI,OAAO,SAAS,QAAS,QAAO;AACpC,MAAI,OAAO,SAAS,UAAU,OAAO,MAAM,WAAW,gCAAS,EAAG,QAAO;AACzE,MAAI,OAAO,SAAS,cAAc,OAAO,MAAM,WAAW,0BAAQ,EAAG,QAAO;AAC5E,SAAO,OAAO,SAAS,SAAS,6BAAS;AAC3C;AAEO,SAAS,eAAe,EAAE,WAAW,GAA0D;AACpG,QAAM,WAAW,mBAAmB;AACpC,SAAO,SAAS,UAAU,8CAAC,iBAAc,YAAwB,UAAoB,IAAK;AAC5F;AAEA,SAAS,cAAc,EAAE,YAAY,SAAS,GAA8E;AAC1H,QAAM,WAAO,uBAAoB,IAAI,GAAG,aAAS,uBAA0B,IAAI,GAAG,UAAM,uBAA0B,IAAI;AACtH,QAAM,kBAAc,uBAAwB,IAAI;AAChD,QAAM,aAAS,uBAAsB,GAAG,aAAS,uBAAO,MAAM;AAAA,EAAC,CAAC;AAChE,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK,GAAG,CAAC,OAAO,QAAQ,QAAI,yBAAS,KAAK,GAAG,CAAC,QAAQ,SAAS,QAAI,yBAAS,KAAK;AAClH,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAiB,GAAG,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,EAAE;AACvG,QAAM,EAAE,OAAO,UAAU,OAAO,KAAK,IAAI,gBAAgB;AACzD,QAAM,eAAe,MAAM,MAAM,KAAK,UAAQ,KAAK,WAAW,MAAS;AACvE,QAAM,eAAyC,eAAe,EAAE,IAAI,aAAa,IAAI,OAAO,MAAM,QAAQ,MAAM,aAAa,eAAe,OAAO,aAAa,YAAY,EAAE,IAAI;AAClL,QAAM,iBAAa,uBAAO,YAAY;AACtC,QAAM,kBAAc,uBAAO,QAAQ;AACnC,cAAY,UAAU;AACtB,aAAW,UAAU;AACrB,QAAM,YAAY,oBAAoB,MAAM,MAAM;AAClD,QAAM,YAAQ,4BAAY,CAAC,WAAW,UAAgB;AACpD,YAAQ,KAAK;AACb,QAAI,SAAU,uBAAsB,MAAM,IAAI,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC,CAAC;AAAA,EACvF,GAAG,CAAC,CAAC;AACL,QAAM,UAAU,CAAC,SAA+B;AAAE,gBAAY,MAAM,EAAE;AAAG,QAAI,QAAQ,KAAK,WAAW,OAAW,MAAK,KAAK,CAAC,KAAK,EAAE,CAAC;AAAA,EAAE;AACrI,SAAO,UAAU,MAAM;AACrB,QAAI,MAAM;AAAE,YAAM;AAAG;AAAA,IAAO;AAC5B,uBAAmB,EAAE;AAAG,YAAQ,YAAY;AAAG,YAAQ,IAAI;AAAA,EAC7D;AACA,gCAAU,MAAM;AACd,UAAM,QAAQ,IAAI,gBAAgB;AAClC,UAAM,MAAM,GAAG,WAAW;AAC1B,SAAK;AAAA;AAAA,MAA0B;AAAA,MAAK,KAAK,OAAOC,YAAkI;AAChL,UAAI,MAAM,OAAO,WAAW,CAAC,OAAO,WAAW,CAAC,IAAI,QAAS;AAC7D,YAAM,WAAW,MAAMA,QAAO,cAAc,OAAO,SAAS,IAAI,SAAS;AAAA,QACvE,QAAQ,MAAM;AAAA,QAAQ,OAAO,MAAM,OAAO,QAAQ;AAAA,QAAG,WAAW,MAAM;AAAE,iBAAO,SAAS,QAAQ;AAAG,iBAAO,UAAU;AAAW,mBAAS,KAAK;AAAG,oBAAU,IAAI;AAAA,QAAE;AAAA,QAChK,GAAI,YAAY,UAAU,EAAE,aAAa,YAAY,QAAQ,IAAI,CAAC;AAAA,MACpE,CAAC;AACD,UAAI,MAAM,OAAO,SAAS;AAAE,iBAAS,QAAQ;AAAG;AAAA,MAAO;AACvD,aAAO,UAAU;AAAU,eAAS,cAAc,YAAY,OAAO;AAAG,eAAS,WAAW,WAAW,OAAO;AAAG,eAAS,IAAI;AAAA,IAChI,CAAC,EAAE,MAAM,MAAM;AAAE,UAAI,CAAC,MAAM,OAAO,SAAS;AAAE,kBAAU,IAAI;AAAG,iBAAS,KAAK;AAAA,MAAE;AAAA,IAAE,CAAC;AAClF,WAAO,MAAM;AAAE,YAAM,MAAM;AAAG,aAAO,SAAS,QAAQ;AAAG,aAAO,UAAU;AAAA,IAAU;AAAA,EACtF,GAAG,CAAC,CAAC;AACL,gCAAU,MAAM;AAAE,WAAO,SAAS,WAAW,YAAY;AAAA,EAAE,GAAG,CAAC,OAAO,KAAK,CAAC;AAC5E,gCAAU,MAAM;AAAE,WAAO,SAAS,cAAc,QAAQ;AAAA,EAAE,GAAG,CAAC,UAAU,KAAK,CAAC;AAC9E,QAAM,QAAQ,OAAO,SAAuC;AAC1D,uBAAmB,EAAE;AACrB,QAAI;AACF,UAAI,KAAK,WAAW,KAAK,UAAW,OAAM,WAAW,YAAY,KAAK,SAAS,KAAK,SAAS;AAAA,UACxF,YAAW,KAAK,KAAK,aAAa,EAAE,MAAM,KAAK,SAAS,SAAS,UAAU,KAAK,SAAS,aAAa,cAAc,QAAQ,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC,EAAG,CAAC;AAClL,YAAM;AAAA,IACR,SAAS,QAAQ;AAAE,yBAAmB,kBAAkB,QAAQ,OAAO,UAAU,sCAAQ;AAAA,IAAE;AAAA,EAC7F;AACA,QAAM,QAAQ,iCAAQ,MAAM,MAAM,sBAAO,eAAe,SAAI,aAAa,aAAa,SAAI,aAAa,KAAK,KAAK,EAAE;AACnH,SAAO,+CAAC,WAAM,KAAK,MAAM,WAAU,uBAAsB,cAAW,4BAClE;AAAA,kDAAC,YAAO,KAAK,QAAQ,WAAU,8BAA6B,eAAY,QAAO;AAAA,IAC/E,8CAAC,YAAO,KAAK,KAAK,MAAK,UAAS,WAAW,0BAA0B,QAAQ,iBAAiB,EAAE,IAAI,cAAY,OAAO,iBAAe,MAAM,iBAAe,OAAO,8BAA8B,QAAW,SAAS,MAAM;AAAE,UAAI,CAAC,MAAO,QAAO,QAAQ;AAAA,IAAE,GACtP,WAAC,SAAS,+CAAC,UAAK,WAAU,gCAA+B;AAAA;AAAA,MAAE,8CAAC,WAAO,mBAAS,MAAM,SAAS,GAAG,MAAM,MAAM,wBAAS,iBAAO,kCAAQ;AAAA,OAAQ,GAC7I;AAAA,IACA,8CAAC,YAAO,MAAK,UAAS,WAAU,8BAA6B,cAAW,kFAAgB,OAAM,kIAAyB,GAAG,WAAW,wDAAC,UAAK,eAAY,QAAO,GAAE;AAAA,IAChK,8CAAC,UAAK,KAAK,aAAa,WAAU,8BAA6B,QAAQ,MAAM,WAAW,GAAG,eAAY,QAAQ,gBAAM,SAAS,KAAK,QAAQ,MAAM,QAAO;AAAA,IACxJ,8CAAC,UAAK,WAAU,oCAAmC,MAAK,UAAS,aAAU,UAAS,eAAY,QAAQ,qBAAW,GAAG,SAAS,aAAa,SAAI,SAAS,KAAK,KAAK,IAAG;AAAA,IACrK,QAAQ,8CAAC,iBAAc,OAAc,UAAoB,OAAO,SAAS,iBAAiB,QAAQ,KAAK,UAAU,SAAS,SAAS,OAAO,SAAS,UAAQ;AAAE,WAAK,MAAM,IAAI;AAAA,IAAE,GAAG,WAAW,MAAM;AAAE,WAAK,KAAK,MAAM,MAAM,OAAO,UAAQ,KAAK,WAAW,MAAS,EAAE,IAAI,UAAQ,KAAK,EAAE,CAAC;AAAA,IAAE,GAAG;AAAA,KAChS;AACF;;;AIjFA,IAAAC,iBAAuE;AACvE,IAAAC,oCAA6D;AA4D3C,IAAAC,uBAAA;AAvDX,SAAS,gBAAgB,EAAE,YAAY,YAAY,SAAS,GAInD;AACd,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,WAAO,uBAAuB,IAAI;AACxC,QAAM,cAAU,uBAA0B,IAAI;AAC9C,QAAM,WAAO,uBAAuB,IAAI;AACxC,QAAM,aAAS,sBAAM;AACrB,QAAMC,WAAU,WAAW,KAAK,UAAQ,KAAK,OAAO,UAAU,KAAK,WAAW,CAAC;AAE/E,gCAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,UAAU,KAAK,SAAS,iBAAoC,iBAAiB;AACnF,UAAM,WAAW,KAAK,IAAI,GAAG,WAAW,UAAU,UAAQ,KAAK,OAAO,UAAU,CAAC;AACjF,cAAU,QAAQ,GAAG,MAAM,EAAE,eAAe,KAAK,CAAC;AAClD,cAAU,QAAQ,GAAG,eAAe,EAAE,OAAO,UAAU,CAAC;AACxD,UAAM,UAAU,CAAC,UAA8B;AAC7C,UAAI,CAAC,KAAK,SAAS,SAAS,MAAM,MAAc,EAAG,SAAQ,KAAK;AAAA,IAClE;AACA,UAAM,QAAQ,MAAY,QAAQ,KAAK;AACvC,UAAM,UAAU,OAAO,WAAW,oBAAoB;AACtD,aAAS,iBAAiB,eAAe,OAAO;AAChD,WAAO,iBAAiB,QAAQ,KAAK;AACrC,YAAQ,iBAAiB,UAAU,KAAK;AACxC,WAAO,MAAM;AACX,eAAS,oBAAoB,eAAe,OAAO;AACnD,aAAO,oBAAoB,QAAQ,KAAK;AACxC,cAAQ,oBAAoB,UAAU,KAAK;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,UAAU,CAAC;AAEjC,QAAM,UAAU,MAAY;AAAE,YAAQ,KAAK;AAAG,YAAQ,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EAAE;AAC9F,QAAM,WAAW,CAAC,UAA+C;AAC/D,QAAI,MAAM,QAAQ,UAAU;AAAE,YAAM,eAAe;AAAG,YAAM,gBAAgB;AAAG,cAAQ;AAAG;AAAA,IAAO;AACjG,UAAM,UAAU,MAAM,KAAK,KAAK,SAAS,iBAAoC,iBAAiB,KAAK,CAAC,CAAC;AACrG,UAAM,QAAQ,QAAQ,QAAQ,SAAS,aAAkC;AACzE,QAAI;AACJ,QAAI,MAAM,QAAQ,YAAa,SAAQ,QAAQ,KAAK,QAAQ;AAAA,aACnD,MAAM,QAAQ,UAAW,SAAQ,QAAQ,IAAI,QAAQ,UAAU,QAAQ;AAAA,aACvE,MAAM,QAAQ,OAAQ,QAAO;AAAA,aAC7B,MAAM,QAAQ,MAAO,QAAO,QAAQ,SAAS;AAAA,QACjD;AACL,UAAM,eAAe;AACrB,YAAQ,IAAI,GAAG,MAAM,EAAE,eAAe,KAAK,CAAC;AAC5C,YAAQ,IAAI,GAAG,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,EACpD;AAEA,SAAO,+CAAC,SAAI,WAAU,gCAA+B,KAAK,MAAM,QAAQ,WAAS;AAC/E,QAAI,CAAC,MAAM,cAAc,SAAS,MAAM,aAA4B,EAAG,SAAQ,KAAK;AAAA,EACtF,GACE;AAAA,mDAAC,YAAO,KAAK,SAAS,MAAK,UAAS,WAAU,iCAAgC,cAAY,uCAASA,WAAU,SAAIA,SAAQ,IAAI,KAAK,EAAE,IAAI,iBAAc,WAAU,iBAAe,MAAM,iBAAe,OAAO,SAAS,QAAW,UAAU,CAACA,UAAS,SAAS,MAAM,QAAQ,WAAS,CAAC,KAAK,GAAG,WAAW,WAAS;AAC9S,UAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AAAE,cAAM,eAAe;AAAG,gBAAQ,IAAI;AAAA,MAAE;AAAA,IACpG,GACG;AAAA,MAAAA,YAAW,8CAAC,UAAO,MAAMA,SAAQ,MAAM,OAAK,MAAC;AAAA,MAC9C,+CAAC,UAAK,WAAU,8BAA6B;AAAA,sDAAC,YAAQ,UAAAA,UAAS,QAAQ,kCAAQ;AAAA,QAAS,8CAAC,WAAO,UAAAA,UAAS,QAAQ,4BAAO;AAAA,SAAQ;AAAA,MAChI,8CAAC,UAAK,WAAU,iCAAgC,eAAY,QAAO,wDAAC,8DAAyB,MAAM,IAAI,GAAE;AAAA,OAC3G;AAAA,IACC,QAAQ,8CAAC,SAAI,KAAK,MAAM,IAAI,QAAQ,MAAK,WAAU,cAAW,4BAAO,WAAU,iCAAgC,WAAW,UACxH,qBAAW,IAAI,UAAQ,+CAAC,YAAO,MAAK,UAAS,MAAK,UAAS,iBAAe,KAAK,OAAOA,UAAS,IAAI,UAAU,KAAK,OAAOA,UAAS,KAAK,IAAI,IAAkB,SAAS,MAAM;AAAE,cAAQ;AAAG,eAAS,KAAK,EAAE;AAAA,IAAE,GAC1M;AAAA,oDAAC,UAAO,MAAM,KAAK,MAAM,OAAK,MAAC;AAAA,MAC/B,+CAAC,UAAK,WAAU,8BAA6B;AAAA,sDAAC,YAAQ,eAAK,MAAK;AAAA,QAAS,8CAAC,WAAO,eAAK,MAAK;AAAA,SAAQ;AAAA,MACnG,8CAAC,UAAK,WAAU,+BAA8B,eAAY,QAAQ,eAAK,OAAOA,UAAS,MAAM,8CAAC,wDAAmB,MAAM,IAAI,GAAG;AAAA,SAHqB,KAAK,EAI1J,CAAS,GACX;AAAA,KACF;AACF;;;ACzEA,IAAAC,iBAA0C;AAEnC,SAAS,sBAAsB,KAAmC;AACvE,gCAAU,MAAM;AACd,UAAM,UAAU,IAAI;AACpB,UAAM,iBAAiB,SAAS;AAChC,QAAI,CAAC,WAAW,CAAC,eAAgB;AACjC,QAAI,QAAQ;AACZ,QAAI;AACJ,UAAM,QAAQ,MAAe;AAC3B,UAAI,WAA+B,QAAQ;AAC3C,aAAO,YAAY,aAAa,SAAS,MAAM;AAC7C,cAAM,YAAY,SAAS;AAC3B,YAAI,qBAAqB,aAAa;AACpC,gBAAM,QAAQ,iBAAiB,SAAS;AACxC,cAAI,MAAM,YAAY,UAAU,MAAM,kBAAkB,YAAY,OAAO,WAAW,MAAM,QAAQ,IAAI,GAAG;AACzG,sBAAU,aAAa,SAAS,UAAU,UAAU;AACpD,oBAAQ;AACR,mBAAO;AAAA,UACT;AAAA,QACF;AACA,mBAAW,SAAS;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AACA,QAAI,CAAC,MAAM,GAAG;AACZ,iBAAW,IAAI,iBAAiB,MAAM;AAAE,YAAI,MAAM,EAAG,WAAU,WAAW;AAAA,MAAE,CAAC;AAC7E,eAAS,QAAQ,SAAS,MAAM,EAAE,WAAW,MAAM,SAAS,KAAK,CAAC;AAAA,IACpE;AACA,WAAO,MAAM;AACX,gBAAU,WAAW;AACrB,UAAI,SAAS,eAAe,YAAa,gBAAe,OAAO,OAAO;AAAA,IACxE;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AACV;;;AClCA,IAAAC,iBAQO;AAkMC,IAAAC,uBAAA;AAvKR,SAAS,0BAA0B,UAA2B;AAC5D,MAAI,OAAO,WAAW,eAAe,OAAO,aAAa,YAAa,QAAO;AAC7E,MAAI,OAAO,WAAW,wCAAwC,EAAE,QAAS,QAAO;AAChF,QAAM,YAAY,UAAU;AAC5B,MAAI,WAAW,KAAK,SAAS,KAAM,UAAU,KAAK,SAAS,KAAK,CAAC,2BAA2B,KAAK,SAAS,EAAI,QAAO;AACrH,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,MAAM,iBAAiB,QAAQ,QAAQ;AAC7C,SAAO,MAAM,MAAM,mBAAmB;AACxC;AAEA,SAAS,gBACP,OACA,QACA,QACA,aACA,YACA,SACA,MACA,eACA,gBACQ;AACR,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,MAAM,IAAI,cAAc,GAAE;AACnE,QAAMC,cAAa,KAAK,IAAI,GAAG,QAAQ,OAAO,CAAC;AAC/C,QAAMC,eAAc,KAAK,IAAI,GAAG,SAAS,OAAO,CAAC;AACjD,QAAM,MAAM,qBAAqB,KAAK,IAAI,MAAM;AAAA;AAAA,4BAEtB,aAAa;AAAA,4BACb,cAAc;AAAA;AAAA,mBAEvB,KAAK,aAAa,MAAM;AAAA,mBACxB,KAAK,aAAa,MAAM,SAAS,MAAM,gBAAgB,aAAa;AAAA,mBACpE,KAAK,aAAa,MAAM,SAAS,MAAM,gBAAgB,cAAc;AAAA,eACzE,IAAI,QAAQ,IAAI,YAAYD,WAAU,aAAaC,YAAW,SAAS,MAAM,oBAAoB,UAAU,OAAO,OAAO,yBAAyB,IAAI;AAAA;AAEnK,SAAO,sBAAsB,mBAAmB,GAAG,CAAC;AACtD;AAEO,SAAS,aAAa;AAAA,EAC3B,IAAI;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AAAA,EACb,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,UAAU;AAAA,EACV,aAAa;AAAA,EACb,GAAG;AACL,GAAmC;AACjC,QAAM,eAAW,sBAAM,EAAE,QAAQ,MAAM,GAAG;AAC1C,QAAM,WAAW,wBAAwB,QAAQ;AACjD,QAAM,gBAAgB,qBAAqB,QAAQ;AACnD,QAAM,iBAAiB,sBAAsB,QAAQ;AACrD,QAAM,mBAAe,uBAAoB,IAAI;AAC7C,QAAM,eAAW,uBAA0B,IAAI;AAC/C,QAAM,aAAS,uBAAoC,IAAI;AACvD,QAAM,eAAW,uBAAoC,IAAI;AACzD,QAAM,cAAU,uBAAoC,IAAI;AACxD,QAAM,oBAAgB,uBAAO,CAAC;AAC9B,QAAM,sBAAkB,uBAA6C;AACrE,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,KAAK;AAEtD,gCAAU,MAAM;AACd,oBAAgB,0BAA0B,QAAQ,CAAC;AAAA,EACrD,GAAG,CAAC,QAAQ,CAAC;AAEb,gCAAU,MAAM;AACd,QAAI,CAAC,aAAc;AACnB,UAAM,UAAU,aAAa;AAC7B,UAAM,QAAQ,SAAS;AACvB,QAAI,YAAY,QAAQ,UAAU,KAAM;AACxC,QAAI,QAAQ;AACZ,QAAI,gBAAgB;AACpB,QAAI,iBAAiB;AACrB,UAAM,SAAS,MAAY;AACzB,cAAQ;AACR,YAAM,OAAO,QAAQ,sBAAsB;AAC3C,YAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC;AAChD,YAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC;AAClD,UAAI,UAAU,iBAAiB,WAAW,eAAgB;AAC1D,sBAAgB;AAChB,uBAAiB;AACjB,YAAM,aAAa,QAAQ;AAAA,QACzB;AAAA,QACA;AAAA,QACA,KAAK,IAAI,cAAc,KAAK,IAAI,OAAO,MAAM,IAAI,CAAC;AAAA,QAClD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,WAAW,MAAY;AAC3B,UAAI,UAAU,EAAG,SAAQ,sBAAsB,MAAM;AAAA,IACvD;AACA,UAAM,WAAW,OAAO,mBAAmB,cAAc,SAAY,IAAI,eAAe,QAAQ;AAChG,cAAU,QAAQ,OAAO;AACzB,aAAS;AACT,WAAO,MAAM;AACX,UAAI,UAAU,EAAG,sBAAqB,KAAK;AAC3C,gBAAU,WAAW;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,gBAAgB,MAAM,cAAc,aAAa,YAAY,SAAS,eAAe,YAAY,CAAC;AAEtG,gCAAU,MAAM;AACd,QAAI,CAAC,aAAc;AACnB,UAAM,WAAW,CAAC,OAAO,SAAS,SAAS,SAAS,QAAQ,OAAO;AACnE,UAAM,UAAU,CAAC,GAAG,GAAG,EAAE;AACzB,aAAS,QAAQ,CAAC,SAAS,UAAU,SAAS,aAAa,SAAS,OAAO,mBAAmB,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;AAAA,EACtH,GAAG,CAAC,iBAAiB,YAAY,CAAC;AAElC,gCAAU,MAAM,MAAM;AACpB,QAAI,cAAc,YAAY,EAAG,sBAAqB,cAAc,OAAO;AAAA,EAC7E,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,MAAY;AAC9B,kBAAc,UAAU;AACxB,UAAM,UAAU,aAAa;AAC7B,QAAI,YAAY,KAAM;AACtB,UAAM,UAAU,gBAAgB;AAChC,QAAI,YAAY,QAAW;AACzB,cAAQ,MAAM,YAAY,qBAAqB,KAAK;AACpD,cAAQ,MAAM,YAAY,qBAAqB,KAAK;AACpD;AAAA,IACF;AACA,UAAM,OAAO,QAAQ,sBAAsB;AAC3C,QAAI,KAAK,UAAU,KAAK,KAAK,WAAW,EAAG;AAC3C,UAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,QAAQ,UAAU,KAAK,QAAQ,KAAK,QAAQ,GAAG,CAAC;AACrF,UAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,QAAQ,UAAU,KAAK,OAAO,KAAK,SAAS,GAAG,CAAC;AACrF,YAAQ,MAAM,YAAY,qBAAqB,GAAG,CAAC,GAAG;AACtD,YAAQ,MAAM,YAAY,qBAAqB,GAAG,CAAC,GAAG;AAAA,EACxD;AACA,QAAM,gBAAgB,MAAY;AAChC,QAAI,cAAc,YAAY,EAAG,eAAc,UAAU,sBAAsB,WAAW;AAAA,EAC5F;AACA,QAAM,YAAY,CAAC,SAAiB,YAA0B;AAC5D,QAAI,CAAC,YAAa;AAClB,oBAAgB,UAAU,EAAE,SAAS,QAAQ;AAC7C,kBAAc;AAAA,EAChB;AACA,QAAM,aAAa,MAAY;AAC7B,QAAI,CAAC,YAAa;AAClB,oBAAgB,UAAU;AAC1B,kBAAc;AAAA,EAChB;AAEA,QAAM,QAAoB;AAAA,IACxB,6BAA6B,QAAQ,QAAQ;AAAA,IAC7C,8BAA8B;AAAA,IAC9B,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,EACvB;AAEA,SAAO;AAAA,IAAC;AAAA;AAAA,MACL,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,WAAW,6BAA6B,eAAe,WAAW,aAAa,GAAG,cAAc,oBAAoB,EAAE,IAAI,SAAS;AAAA,MACnI;AAAA,MACA,eAAe,cAAc,WAAS,UAAU,MAAM,SAAS,MAAM,OAAO,IAAI;AAAA,MAChF,gBAAgB,cAAc,aAAa;AAAA,MAE1C;AAAA,wBAAgB,8CAAC,SAAI,WAAU,4BAA2B,OAAM,8BAA6B,eAAY,QAAO,WAAU,SACzH,wDAAC,UACC,yDAAC,YAAO,IAAI,UAAU,2BAA0B,QAAO,GAAE,MAAK,GAAE,MAAK,OAAM,QAAO,QAAO,QACvF;AAAA,wDAAC,aAAQ,KAAK,UAAU,GAAE,KAAI,GAAE,KAAI,OAAM,QAAO,QAAO,QAAO,qBAAoB,QAAO,QAAO,OAAM;AAAA,UACvG,8CAAC,uBAAkB,KAAK,QAAQ,IAAG,iBAAgB,KAAI,OAAM,QAAO,iBAAgB;AAAA,UACpF,8CAAC,mBAAc,IAAG,iBAAgB,MAAK,UAAS,QAAO,8CAA6C,QAAO,OAAM;AAAA,UACjH,8CAAC,uBAAkB,KAAK,UAAU,IAAG,iBAAgB,KAAI,OAAM,QAAO,mBAAkB;AAAA,UACxF,8CAAC,mBAAc,IAAG,mBAAkB,MAAK,UAAS,QAAO,8CAA6C,QAAO,SAAQ;AAAA,UACrH,8CAAC,uBAAkB,KAAK,SAAS,IAAG,iBAAgB,KAAI,OAAM,QAAO,kBAAiB;AAAA,UACtF,8CAAC,mBAAc,IAAG,kBAAiB,MAAK,UAAS,QAAO,8CAA6C,QAAO,QAAO;AAAA,UACnH,8CAAC,aAAQ,IAAG,OAAM,KAAI,SAAQ,MAAK,UAAS,QAAO,aAAY;AAAA,UAC/D,8CAAC,aAAQ,IAAG,aAAY,KAAI,QAAO,MAAK,UAAS,QAAO,UAAS;AAAA,UACjE,8CAAC,oBAAe,IAAG,UAAS,cAAa,OAAM;AAAA,WACjD,GACF,GACF;AAAA,QACC;AAAA;AAAA;AAAA,EACH;AACF;;;AC1NA,IAAAC,iBAA0E;AAC1E,IAAAC,oCAAyI;;;ACDzI,IAAAC,iBAAiD;AAkD3C,IAAAC,uBAAA;AA9CN,IAAM,QAAQ,KAAK,OAAO;AAC1B,IAAM,aAAa,CAAC,SAAgC,IAAI,QAAQ,CAAC,SAAS,WAAW;AACnF,QAAM,SAAS,IAAI,WAAW;AAC9B,SAAO,UAAU,MAAM,OAAO,IAAI,MAAM,4BAAQ,KAAK,IAAI,EAAE,CAAC;AAC5D,SAAO,SAAS,MAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE;AACvE,SAAO,cAAc,IAAI;AAC3B,CAAC;AAEM,SAAS,kBAAkB,EAAE,OAAO,SAAAC,SAAQ,GAAoE;AACrH,QAAM,eAAW,uBAAyB,IAAI,GAAG,qBAAiB,uBAAgC,IAAI;AACtG,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB,CAAC,CAAC;AAC7C,QAAM,CAAC,MAAM,OAAO,QAAI,yBAA8B,KAAK;AAC3D,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK,GAAG,CAAC,UAAU,WAAW,QAAI,yBAAS,EAAE;AAC9E,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,SAAS,CAAC,UAA2B,aAAwC;AACjF,QAAI,CAAC,UAAU,UAAU,KAAM;AAC/B,aAAS,MAAS;AAAG,aAAS,CAAC,CAAC;AAChC,UAAM,OAAO,MAAM,KAAK,QAAQ,EAAE,OAAO,UAAQ,CAAC,KAAK,mBAAmB,MAAM,GAAG,EAAE,KAAK,UAAQ,CAAC,QAAQ,gBAAgB,YAAY,WAAW,EAAE,SAAS,IAAI,CAAC,CAAC;AACnK,QAAI,aAAa,SAAS,CAAC,WAAW,KAAK,KAAK,CAAC,GAAG,QAAQ,EAAE,GAAG;AAAE,eAAS,uJAA+B;AAAG;AAAA,IAAO;AACrH,QAAI,CAAC,KAAK,UAAU,KAAK,SAAS,OAAO,KAAK,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,CAAC,IAAI,SAAS,aAAa,eAAe,KAAK,KAAK,UAAQ,KAAK,OAAO,IAAI,OAAO,IAAI,GAAG;AAAE,eAAS,wJAA0C;AAAG;AAAA,IAAO;AAClP,YAAQ,QAAQ;AAAG,aAAS,IAAI;AAAA,EAClC;AACA,QAAM,SAAS,OAAO,UAAoC;AACxD,UAAM,eAAe;AACrB,QAAI,QAAQ,CAAC,MAAM,OAAQ;AAC3B,YAAQ,IAAI;AAAG,aAAS,MAAS;AACjC,QAAI;AACF,UAAI;AACJ,UAAI,SAAS,OAAO;AAAE,oBAAY,kDAAU;AAAG,eAAO,EAAE,MAAM,MAAM,MAAM,WAAW,MAAM,CAAC,CAAE,EAAE;AAAA,MAAE,OAC7F;AACH,cAAM,UAAU,CAAC;AACjB,mBAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,sBAAY,wCAAU,QAAQ,CAAC,IAAI,MAAM,MAAM,EAAE;AACjD,kBAAQ,KAAK,EAAE,MAAM,KAAK,sBAAsB,KAAK,MAAM,MAAM,MAAM,WAAW,IAAI,EAAE,CAAC;AAAA,QAC3F;AACA,eAAO,EAAE,MAAM,OAAO,QAAQ;AAAA,MAChC;AACA,kBAAY,kDAAU;AACtB,YAAM,IAAI,kBAAkB,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,QAAQ,YAAY,QAAQ,IAAM,EAAE,CAAC;AAC/G,kBAAY,0EAAc;AAC1B,YAAMA,SAAQ;AAAG,YAAM;AAAA,IACzB,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAClD;AAAU,cAAQ,KAAK;AAAG,kBAAY,EAAE;AAAA,IAAE;AAAA,EAC5C;AACA,SAAO,8CAAC,mBAAgB,OAAM,sBAAW,QAAO,yIAA8C,OAAO,MAAM;AAAE,QAAI,CAAC,KAAM,OAAM;AAAA,EAAE,GAC9H,yDAAC,UAAK,WAAU,mDAAkD,aAAW,MAAM,UAAU,WAAS;AAAE,SAAK,OAAO,KAAK;AAAA,EAAE,GACzH;AAAA,kDAAC,WAAM,QAAM,MAAC,MAAK,QAAO,QAAO,wBAAuB,KAAK,UAAU,UAAU,WAAS;AAAE,aAAO,MAAM,OAAO,OAAO,KAAK;AAAG,YAAM,OAAO,QAAQ;AAAA,IAAG,GAAG;AAAA,IAC1J,8CAAC,WAAM,QAAM,MAAC,MAAK,QAAO,UAAQ,MAAC,KAAK,UAAQ;AAAE,qBAAe,UAAU;AAAM,YAAM,aAAa,mBAAmB,EAAE;AAAA,IAAE,GAAG,UAAU,WAAS;AAAE,aAAO,MAAM,OAAO,OAAO,WAAW;AAAG,YAAM,OAAO,QAAQ;AAAA,IAAG,GAAG;AAAA,IACvN,+CAAC,SAAI,WAAU,0CAAyC;AAAA,oDAAC,YAAO,MAAK,UAAS,WAAS,MAAC,UAAU,MAAM,SAAS,MAAM,SAAS,SAAS,MAAM,GAAG,iDAAU;AAAA,MAAS,8CAAC,YAAO,MAAK,UAAS,UAAU,QAAQ,EAAE,qBAAqB,SAAS,cAAc,OAAO,IAAI,SAAS,MAAM,eAAe,SAAS,MAAM,GAAG,sCAAI;AAAA,OAAS;AAAA,IACnU,8CAAC,OAAE,WAAU,iCAAgC,mXAAwE;AAAA,IACpH,MAAM,SAAS,KAAK,+CAAC,OAAE,WAAU,iCAAgC,MAAK,UAAS;AAAA;AAAA,MAAK,SAAS,QAAQ,MAAM,CAAC,EAAG,OAAO,MAAM,CAAC,EAAG,mBAAmB,MAAM,GAAG,EAAE,CAAC;AAAA,MAAE;AAAA,MAAI,MAAM;AAAA,MAAO;AAAA,OAAS,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,CAAC,IAAI,OAAO,MAAM,QAAQ,CAAC;AAAA,MAAE;AAAA,OAAI;AAAA,IAC7Q,YAAY,8CAAC,OAAE,WAAU,iCAAgC,MAAK,UAAU,oBAAS;AAAA,IACjF,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,IAClC,+CAAC,YAAO;AAAA,oDAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,OAAO,0BAAE;AAAA,MAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,QAAQ,CAAC,MAAM,QAAS,iBAAO,6BAAS,sBAAW;AAAA,OAAS;AAAA,KAC9L,GACF;AACF;;;ADNiH,IAAAC,uBAAA;AAhD1G,SAAS,cAA2B;AACzC,QAAM,CAAC,SAAS,UAAU,QAAI,yBAA2B,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;AACrG,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAA0B,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAC9F,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,gBAAgB;AACjE,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAiB;AACzC,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAyE;AAC/G,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,KAAK;AACtD,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,KAAK;AACxD,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAS,KAAK;AAC1D,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAS,KAAK;AAC1D,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,yBAAS,KAAK;AAC9D,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAiC,CAAC,CAAC;AACjE,QAAMC,YAAO,4BAAY,OAAO,UAAU,UAAU;AAClD,QAAI;AACF,YAAM,CAAC,aAAa,YAAY,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC/D,IAAsB,SAAS;AAAA,QAAG,IAAqB,iBAAiB,UAAU,eAAe,EAAE,EAAE;AAAA,QAAG,IAA4B,wBAAwB;AAAA,MAC9J,CAAC;AACD,iBAAW,WAAW;AAAG,gBAAU,UAAU;AAAG,iBAAW,WAAW;AAAG,eAAS,MAAS;AAAA,IAC7F,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,iBAAW,KAAK;AAAA,IAAE;AAAA,EAClF,GAAG,CAAC,CAAC;AACL,gCAAU,MAAM;AAAE,SAAKA,MAAK;AAAA,EAAE,GAAG,CAACA,KAAI,CAAC;AACvC,QAAM,YAAY,IAAI,IAAI,QAAQ,UAAU,IAAI,UAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AACxE,QAAM,mBAAmB,mBAAmB,QAAQ,YAAY,QAAQ,UAAU,MAAM,GAAG,CAAC;AAC5F,QAAM,cAAU,wBAAQ,MAAM;AAC5B,UAAM,aAAa,MAAM,KAAK,EAAE,kBAAkB;AAClD,WAAO,OAAO,QAAQ,OAAO,UAAS,KAAK,aAAa,iBAAkB,CAAC,cAAc,GAAG,KAAK,IAAI,IAAI,KAAK,WAAW,IAAI,KAAK,KAAK,KAAK,GAAG,CAAC,GAAG,kBAAkB,EAAE,SAAS,UAAU,EAAE;AAAA,EAC9L,GAAG,CAAC,cAAc,OAAO,SAAS,KAAK,CAAC;AACxC,QAAM,UAAU,CAAC,EAAE,IAAI,WAAW,MAAM,2BAAO,GAAG,GAAG,OAAO,QAAQ,IAAI,aAAW,EAAE,IAAI,OAAO,IAAI,MAAM,OAAO,KAAK,EAAE,CAAC;AACzH,QAAM,mBAAe,wBAAQ,MAAM,OAAO,QAAQ,OAAO,CAAC,QAAQ,UAAU;AAC1E,WAAO,IAAI,MAAM,WAAW,OAAO,IAAI,MAAM,QAAQ,KAAK,KAAK,CAAC;AAChE,WAAO;AAAA,EACT,GAAG,oBAAI,IAAoB,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC;AAC/C,QAAM,UAAU,OAAO,UAA0C;AAC/D,YAAQ,MAAM,EAAE;AAAG,mBAAe,MAAS;AAC3C,QAAI;AACF,YAAM,IAAI,0BAA0B,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,UAAU,MAAM,UAAU,SAAS,MAAM,GAAG,CAAC,EAAE,CAAC;AAC7H,YAAMA,MAAK;AAAA,IACb,SAAS,QAAQ;AAAE,qBAAe,EAAE,MAAM,WAAW,IAAI,MAAM,IAAI,SAAS,aAAa,MAAM,EAAE,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EACrI;AACA,QAAM,YAAY,OAAO,OAA8B;AACrD,YAAQ,EAAE;AAAG,mBAAe,MAAS;AACrC,QAAI;AAAE,YAAM,IAAI,WAAW,mBAAmB,EAAE,CAAC,IAAI,EAAE,QAAQ,SAAS,CAAC;AAAG,YAAMA,MAAK;AAAA,IAAE,SAClF,QAAQ;AAAE,qBAAe,EAAE,MAAM,aAAa,IAAI,SAAS,aAAa,MAAM,EAAE,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EAC3H;AACA,SAAO,+CAAC,SAAI,WAAU,4BACpB;AAAA,kDAAC,iBAAc,SAAQ,sBAAqB,OAAM,sBAAW,QAAO,kLAAgC,SAAS,+CAAC,YAAO,MAAK,UAAS,UAAU,SAAS,SAAS,MAAM;AAAE,WAAKA,MAAK,IAAI;AAAA,IAAE,GAAG;AAAA,oDAAC,0DAAqB,MAAM,IAAI;AAAA,MAAG,UAAU,6BAAS;AAAA,OAAO,GAAW;AAAA,IACjQ,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,IACjC,kBAAkB,8CAAC,qBAAkB,OAAO,MAAM,kBAAkB,KAAK,GAAG,SAASA,OAAM;AAAA,IAC3F,iBAAiB,8CAAC,mBAAgB,OAAM,sBAAW,QAAO,oMAAmC,OAAO,MAAM,iBAAiB,KAAK,GAAG,OAAM,QAAO,wDAAC,gBAAa,aAAa,QAAQ,UAAU,IAAI,WAAS,MAAM,EAAE,GAAG,OAAO,MAAM,iBAAiB,KAAK,GAAG,SAASA,OAAM,GAAE;AAAA,IAC5Q,kBAAkB,8CAAC,mBAAgB,OAAM,wCAAS,QAAO,mLAA2C,OAAO,MAAM,kBAAkB,KAAK,GAAG,wDAAC,uBAAoB,OAAO,SAAS,OAAO,MAAM,kBAAkB,KAAK,GAAG,SAAS,OAAM,SAAQ;AAAE,iBAAW,IAAI;AAAG,YAAMA,MAAK,IAAI;AAAA,IAAE,GAAG,GAAE;AAAA,IACxR,gBAAgB,8CAAC,mBAAgB,OAAM,wCAAS,QAAO,qMAAyC,OAAO,MAAM,gBAAgB,KAAK,GAAG,wDAAC,oBAAiB,OAAO,MAAM,gBAAgB,KAAK,GAAG,SAAS,MAAMA,MAAK,IAAI,GAAG,GAAE;AAAA,IAC1N,8CAAC,kBAAe,OAAM,sBAAM,QAAQ,GAAG,QAAQ,UAAU,MAAM,+CAAY,SAAS,gFAAE;AAAA,oDAAC,YAAO,MAAK,UAAS,SAAS,MAAM,kBAAkB,IAAI,GAAG,gCAAQ;AAAA,MAAS,+CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,iBAAiB,IAAI,GAAG;AAAA,sDAAC,uDAAkB,MAAM,IAAI;AAAA,QAAE;AAAA,SAAQ;AAAA,OAAS,GAC/Q,oBAAU,8CAAC,sBAAmB,MAAM,GAAG,IAAK,QAAQ,UAAU,WAAW,IAAI,8CAAC,mBAAgB,OAAM,wCAAc,QAAO,gHAA0B,QAAQ,+CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,iBAAiB,IAAI,GAAG;AAAA,oDAAC,uDAAkB,MAAM,IAAI;AAAA,MAAE;AAAA,OAAW,GAAW,IAAK,gFAAE;AAAA,oDAAC,SAAI,WAAU,yCAAyC,2BAAiB,IAAI,WAAS,+CAAC,aAC1W;AAAA,sDAAC,UAAK,WAAU,0BAAyB,wDAAC,wDAAmB,MAAM,IAAI,GAAE;AAAA,QAAO,+CAAC,UAAK;AAAA,wDAAC,YAAQ,gBAAM,aAAY;AAAA,UAAS,8CAAC,OAAG,gBAAM,aAAY;AAAA,UAAI,+CAAC,WAAO;AAAA,kBAAM;AAAA,YAAQ;AAAA,YAAI,MAAM,qBAAqB,SAAS,6BAAS;AAAA,YAAO;AAAA,YAAI,MAAM;AAAA,aAAO;AAAA,WAAQ;AAAA,QAC3P,8CAAC,YAAO,MAAK,UAAS,WAAU,WAAU,UAAU,SAAS,MAAM,IAAI,cAAY,gBAAM,MAAM,WAAW,IAAI,SAAS,MAAM;AAAE,eAAK,UAAU,MAAM,EAAE;AAAA,QAAE,GAAG,wDAAC,wDAAmB,MAAM,IAAI,GAAE;AAAA,QAC1L,aAAa,SAAS,eAAe,YAAY,OAAO,MAAM,MAAM,+CAAC,OAAE,WAAU,kCAAiC,MAAK,SAAQ;AAAA;AAAA,UAAM,YAAY;AAAA,WAAQ;AAAA,WAH6N,MAAM,EAI/X,CAAU,GAAE;AAAA,MAAO,QAAQ,UAAU,SAAS,KAAK,8CAAC,YAAO,MAAK,UAAS,WAAU,gCAA+B,iBAAe,kBAAkB,SAAS,MAAM,oBAAoB,WAAS,CAAC,KAAK,GAAI,6BAAmB,yCAAgB,4BAAQ,QAAQ,UAAU,MAAM,mCAAc;AAAA,OAAU,GACtS;AAAA,IACA,+CAAC,kBAAe,OAAM,4BAAO,QAAO,mHAAsD,SAAS,gFAAE;AAAA,qDAAC,YAAO,MAAK,UAAS,SAAS,MAAM,kBAAkB,IAAI,GAAG;AAAA;AAAA,QAAK,QAAQ,WAAW,6BAAW;AAAA,SAAG;AAAA,MAAS,+CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,gBAAgB,IAAI,GAAG;AAAA,sDAAC,uDAAkB,MAAM,IAAI;AAAA,QAAE;AAAA,SAAI;AAAA,OAAS,GACxT;AAAA,qDAAC,SAAI,WAAU,8BACb;AAAA,sDAAC,eAAY,OAAO,OAAO,QAAQ,UAAU,OAAO,QAAQ,QAAQ,OAAM,mCAAc,aAAY,gEAAa,SAAkB;AAAA,QACnI,8CAAC,SAAI,WAAU,8BAA6B,cAAW,kCAAc,kBAAQ,IAAI,YAAU,+CAAC,YAAO,MAAK,UAAyB,WAAW,iBAAiB,OAAO,KAAK,cAAc,IAAI,gBAAc,iBAAiB,OAAO,IAAI,SAAS,MAAM,gBAAgB,OAAO,EAAE,GAAG;AAAA,wDAAC,UAAM,iBAAO,MAAK;AAAA,UAAO,8CAAC,WAAO,uBAAa,IAAI,OAAO,EAAE,KAAK,GAAE;AAAA,aAA7N,OAAO,EAA8N,CAAS,GAAE;AAAA,SACxW;AAAA,MACC,OAAO,OAAO,KAAK,UAAQ,KAAK,aAAa,YAAY,KAAK,8CAAC,OAAE,WAAU,8BAA8B,iBAAO,OAAO,OAAO,UAAQ,KAAK,aAAa,YAAY,EAAE,IAAI,UAAQ,KAAK,KAAK,EAAE,KAAK,QAAG,GAAE;AAAA,MACxM,UAAU,8CAAC,sBAAmB,MAAM,GAAG,IAAK,8CAAC,SAAI,WAAU,2BAA2B,kBAAQ,IAAI,WAAS;AAC1G,cAAMC,WAAU,UAAU,IAAI,MAAM,EAAE;AACtC,cAAM,YAAY,aAAa,SAAS,aAAa,YAAY,OAAO,MAAM,KAAK,YAAY,UAAU;AACzG,cAAM,UAAU,YAAY,2BAA2B,MAAM,EAAE,KAAK;AACpE,eAAO,+CAAC,aAA8C;AAAA,yDAAC,UAAK;AAAA,0DAAC,WAAO,gBAAM,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,QAAK,KAAK,SAAQ;AAAA,YAAQ,8CAAC,YAAQ,gBAAM,MAAK;AAAA,YAAS,8CAAC,OAAG,gBAAM,aAAY;AAAA,aAAI;AAAA,UAAQ,aAAa,+CAAC,OAAE,IAAI,SAAS,WAAU,iCAAgC,MAAK,SAAQ;AAAA;AAAA,YAAM;AAAA,aAAU;AAAA,UAAK,+CAAC,YAAO;AAAA,2DAAC,WAAM;AAAA;AAAA,cAAE,MAAM;AAAA,eAAQ;AAAA,YAASA,WAAU,+CAAC,YAAO,MAAK,UAAS,UAAQ,MAAC;AAAA,4DAAC,wDAAmB,MAAM,IAAI;AAAA,cAAE;AAAA,eAAG,IAAY,8CAAC,YAAO,MAAK,UAAS,UAAU,SAAS,MAAM,IAAI,oBAAkB,SAAS,SAAS,MAAM;AAAE,mBAAK,QAAQ,KAAK;AAAA,YAAE,GAAI,mBAAS,MAAM,KAAK,6BAAS,YAAY,6BAAS,gBAAK;AAAA,aAAU;AAAA,aAArkB,GAAG,MAAM,QAAQ,IAAI,MAAM,EAAE,EAAijB;AAAA,MACrmB,CAAC,GAAE;AAAA,MACF,CAAC,WAAW,QAAQ,WAAW,KAAK,8CAAC,mBAAgB,OAAO,QAAQ,yCAAgB,0DAAa,QAAQ,QAAQ,+FAAoB,oGAAoB;AAAA,OAC5J;AAAA,KACF;AACF;AAEO,SAAS,uBAAuB,EAAE,YAAY,GAAyC;AAC5F,QAAM,CAAC,SAAS,UAAU,QAAI,yBAA2B,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;AACrG,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAiB;AACzC,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,QAAMD,YAAO,4BAAY,YAAY;AACnC,QAAI;AAAE,iBAAW,MAAM,IAAsB,SAAS,CAAC;AAAG,eAAS,MAAS;AAAA,IAAE,SACvE,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE;AAAA,EAClD,GAAG,CAAC,CAAC;AACL,gCAAU,MAAM;AAAE,SAAKA,MAAK;AAAA,EAAE,GAAG,CAACA,OAAM,WAAW,CAAC;AACpD,gCAAU,MAAM;AAAE,iBAAa,KAAK;AAAG,eAAW,KAAK;AAAG,aAAS,EAAE;AAAG,aAAS,MAAS;AAAA,EAAE,GAAG,CAAC,WAAW,CAAC;AAC5G,QAAM,cAAU,wBAAQ,MAAM,IAAI,IAAI,QAAQ,SAAS,OAAO,UAAQ,KAAK,gBAAgB,eAAe,KAAK,OAAO,EAAE,IAAI,UAAQ,KAAK,OAAO,CAAC,GAAG,CAAC,QAAQ,UAAU,WAAW,CAAC;AACnL,QAAM,oBAAgB,wBAAQ,MAAM,QAAQ,UAAU,OAAO,WAAS,QAAQ,IAAI,MAAM,EAAE,CAAC,GAAG,CAAC,QAAQ,WAAW,OAAO,CAAC;AAC1H,QAAM,sBAAkB,wBAAQ,MAAM;AACpC,UAAM,aAAa,MAAM,KAAK,EAAE,kBAAkB;AAClD,WAAO,QAAQ,UAAU,OAAO,WAAS,CAAC,QAAQ,IAAI,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,MAAM,WAAW,IAAI,MAAM,WAAW,IAAI,MAAM,EAAE,GAAG,kBAAkB,EAAE,SAAS,UAAU,EAAE;AAAA,EACtL,GAAG,CAAC,QAAQ,WAAW,SAAS,KAAK,CAAC;AACtC,QAAM,uBAAuB,UAAU,gBAAgB,cAAc,MAAM,GAAG,CAAC;AAC/E,QAAM,yBAAyB,gBAAgB,MAAM,GAAG,EAAE;AAC1D,QAAM,aAAa,OAAO,SAAiB,gBAAwC;AACjF,YAAQ,OAAO;AACf,aAAS,MAAS;AAClB,QAAI;AACF,YAAM,IAAI,eAAe,mBAAmB,WAAW,CAAC,WAAW,mBAAmB,OAAO,CAAC,IAAI,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,SAAS,YAAY,CAAC,EAAE,CAAC;AACnK,YAAMA,MAAK;AAAA,IACb,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EACnF;AACA,SAAO,+CAAC,aAAQ,WAAU,iCAAgC,mBAAgB,sCACxE;AAAA,mDAAC,YAAO;AAAA,qDAAC,UAAK;AAAA,sDAAC,WAAM,4BAAc;AAAA,QAAQ,8CAAC,YAAO,IAAG,sCAAqC,kDAAW;AAAA,SAAS;AAAA,MAAO,+CAAC,SAAI,WAAU,kCAAiC;AAAA,uDAAC,QAAI;AAAA,wBAAc;AAAA,UAAO;AAAA,WAAI;AAAA,QAAM,QAAQ,UAAU,SAAS,KAAK,+CAAC,YAAO,MAAK,UAAS,iBAAe,WAAW,SAAS,MAAM,aAAa,WAAS,CAAC,KAAK,GAAG;AAAA,wDAAC,uDAAkB,MAAM,IAAI;AAAA,UAAE;AAAA,WAAQ;AAAA,SAAU;AAAA,OAAM;AAAA,IAC9X,aAAa,+CAAC,SAAI,WAAU,4BAA2B,cAAW,sBACjE;AAAA,oDAAC,eAAY,OAAO,OAAO,QAAQ,UAAU,OAAO,gBAAgB,QAAQ,OAAM,8CAAe,aAAY,gEAAa,WAAS,MAAC,SAAO,MAAC;AAAA,MAC5I,+CAAC,SAAI,WAAU,iCAAiC;AAAA,+BAAuB,IAAI,WAAS,+CAAC,aAAuB;AAAA,yDAAC,UAAK;AAAA,0DAAC,YAAQ,gBAAM,aAAY;AAAA,YAAS,8CAAC,OAAG,gBAAM,aAAY;AAAA,YAAI,8CAAC,WAAO,gBAAM,qBAAqB,SAAS,qDAAa,oDAAW;AAAA,aAAQ;AAAA,UAAO,8CAAC,YAAO,MAAK,UAAS,UAAU,SAAS,MAAM,IAAI,SAAS,MAAM;AAAE,iBAAK,WAAW,MAAM,IAAI,IAAI;AAAA,UAAE,GAAI,mBAAS,MAAM,KAAK,6BAAS,gBAAK;AAAA,aAA3S,MAAM,EAA8S,CAAU;AAAA,QAAG,gBAAgB,WAAW,KAAK,8CAAC,OAAE,WAAU,kCAAkC,kBAAQ,iEAAoB,uEAAoB;AAAA,SAAK;AAAA,MACtiB,gBAAgB,SAAS,uBAAuB,UAAU,+CAAC,WAAM,WAAU,kCAAiC;AAAA;AAAA,QAAI,gBAAgB,SAAS,uBAAuB;AAAA,QAAO;AAAA,SAAgB;AAAA,OAC1L;AAAA,IACC,QAAQ,UAAU,WAAW,IAAI,8CAAC,OAAE,WAAU,6BAA4B,2HAA6B,IAAO,cAAc,WAAW,IAAI,8CAAC,OAAE,WAAU,6BAA4B,0KAAoC,IAAO,gFAC9N;AAAA,oDAAC,SAAI,WAAU,0CAA0C,+BAAqB,IAAI,WAAS,+CAAC,aAC1F;AAAA,sDAAC,UAAK,WAAU,0BAAyB,wDAAC,wDAAmB,MAAM,IAAI,GAAE;AAAA,QAAO,+CAAC,UAAK;AAAA,wDAAC,YAAQ,gBAAM,aAAY;AAAA,UAAS,8CAAC,OAAG,gBAAM,aAAY;AAAA,UAAI,8CAAC,WAAO,gBAAM,qBAAqB,SAAS,qDAAa,oDAAW;AAAA,WAAQ;AAAA,QAChO,8CAAC,YAAO,MAAK,UAAS,WAAU,oCAAmC,UAAU,SAAS,MAAM,IAAI,cAAY,8CAAW,MAAM,WAAW,IAAI,SAAS,MAAM;AAAE,eAAK,WAAW,MAAM,IAAI,KAAK;AAAA,QAAE,GAAI,mBAAS,MAAM,KAAK,6BAAS,gBAAK;AAAA,WAF7H,MAAM,EAG/G,CAAU,GAAE;AAAA,MACX,cAAc,SAAS,KAAK,8CAAC,YAAO,MAAK,UAAS,WAAU,gCAA+B,iBAAe,SAAS,SAAS,MAAM,WAAW,WAAS,CAAC,KAAK,GAAI,oBAAU,uBAAa,4BAAQ,cAAc,MAAM,iBAAW;AAAA,OACjO;AAAA,IACC,SAAS,8CAAC,OAAE,WAAU,4BAA2B,MAAK,SAAS,iBAAM;AAAA,KACxE;AACF;AAEA,SAAS,YAAY,EAAE,OAAO,QAAQ,OAAO,OAAO,aAAa,UAAU,OAAO,YAAY,OAAO,UAAU,MAAM,GASrG;AACd,SAAO,+CAAC,SAAI,WAAW,2BAA2B,UAAU,gBAAgB,EAAE,IAAI,MAAK,UAAS,cAAY,OAC1G;AAAA,kDAAC,UAAK,WAAU,iCAAgC,eAAY,QAAO,wDAAC,yDAAoB,MAAM,IAAI,GAAE;AAAA,IACpG;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,cAAY;AAAA,QACZ;AAAA,QACA,UAAU,WAAS,OAAO,MAAM,OAAO,KAAK;AAAA,QAC5C,WAAW,WAAS;AAAE,cAAI,MAAM,QAAQ,YAAY,OAAO;AAAE,kBAAM,eAAe;AAAG,mBAAO,EAAE;AAAA,UAAE;AAAA,QAAE;AAAA;AAAA,IACpG;AAAA,IACC,SAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,kCAAiC,cAAW,4BAAO,OAAM,4BAAO,SAAS,MAAM,OAAO,EAAE,GAAG,wDAAC,wDAAmB,MAAM,IAAI,GAAE;AAAA,IACrK,8CAAC,UAAK,WAAU,kCAAiC,aAAU,UAAU,oBAAU,uBAAQ,GAAG,KAAK,WAAK;AAAA,KACtG;AACF;AAEA,SAAS,aAAa,EAAE,aAAa,OAAO,SAAAE,SAAQ,GAA2F;AAC7I,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,SAAS,OAAO,UAAqD;AACzE,UAAM,eAAe;AAAG,UAAM,OAAO,IAAI,SAAS,MAAM,aAAa;AACrE,UAAM,KAAK,OAAO,KAAK,IAAI,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,kBAAkB;AACjE,QAAI,YAAY,SAAS,EAAE,GAAG;AAAE,eAAS,yGAAyB;AAAG;AAAA,IAAO;AAC5E,YAAQ,IAAI;AAAG,aAAS,MAAS;AACjC,QAAI;AACF,YAAMC,YAAW,cAAc;AAAA,QAC7B;AAAA,QACA,aAAa,OAAO,KAAK,IAAI,aAAa,KAAK,EAAE;AAAA,QACjD,aAAa,OAAO,KAAK,IAAI,aAAa,KAAK,EAAE;AAAA,QACjD,SAAS,OAAO,KAAK,IAAI,SAAS,KAAK,MAAM;AAAA,QAC7C,cAAc,OAAO,KAAK,IAAI,cAAc,KAAK,EAAE;AAAA,QACnD,cAAc,OAAO,KAAK,IAAI,cAAc,KAAK,EAAE;AAAA,MACrD,CAAC;AACD,YAAM,IAAI,iBAAiB,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,IAAI,UAAAA,UAAS,CAAC,EAAE,CAAC;AACrF,YAAMD,SAAQ;AAAG,YAAM;AAAA,IACzB,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,KAAK;AAAA,IAAE;AAAA,EAC/E;AACA,SAAO,+CAAC,UAAK,WAAU,mDAAkD,aAAW,MAAM,UAAU,WAAS;AAAE,SAAK,OAAO,KAAK;AAAA,EAAE,GAAG;AAAA,mDAAC,WAAM;AAAA,oDAAC,UAAK,gCAAQ;AAAA,MAAO,8CAAC,WAAM,MAAK,eAAc,UAAQ,MAAC,WAAW,KAAK,WAAS,MAAC,aAAY,0DAAY;AAAA,OAAE;AAAA,IAAQ,+CAAC,WAAM;AAAA,oDAAC,UAAK,gCAAQ;AAAA,MAAO,8CAAC,WAAM,MAAK,MAAK,UAAQ,MAAC,WAAW,IAAI,SAAQ,mCAAkC,aAAY,iBAAgB;AAAA,OAAE;AAAA,IAAQ,+CAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,4CAAK;AAAA,MAAO,8CAAC,WAAM,MAAK,eAAc,UAAQ,MAAC,WAAW,KAAK,aAAY,gHAAqB;AAAA,OAAE;AAAA,IAAQ,+CAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,+CAAC,YAAO,MAAK,WAAU,cAAa,QAAO;AAAA,sDAAC,YAAO,OAAM,QAAO,kDAAM;AAAA,QAAS,8CAAC,YAAO,OAAM,UAAS,kDAAM;AAAA,SAAS;AAAA,OAAS;AAAA,IAAQ,+CAAC,WAAM;AAAA,oDAAC,UAAK,4CAAK;AAAA,MAAO,8CAAC,WAAM,MAAK,gBAAe,WAAW,KAAM,aAAY,kFAAgB;AAAA,OAAE;AAAA,IAAQ,+CAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,gCAAQ;AAAA,MAAO,8CAAC,cAAS,MAAK,gBAAe,UAAQ,MAAC,WAAW,KAAQ,MAAM,GAAG,aAAY,sHAAsB;AAAA,OAAE;AAAA,IAAS,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,IAAmB,+CAAC,YAAO;AAAA,oDAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,OAAO,0BAAE;AAAA,MAAS,+CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,MAAM;AAAA,sDAAC,uDAAkB,MAAM,IAAI;AAAA,QAAG,OAAO,6BAAS;AAAA,SAAW;AAAA,OAAS;AAAA,KAAS;AACltC;AAEA,SAAS,oBAAoB,EAAE,OAAO,OAAO,SAAAA,SAAQ,GAAgI;AACnL,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,MAAM,YAAY,EAAE;AAC7D,QAAM,CAAC,MAAM,OAAO,QAAI,yBAA0B;AAClD,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAiB;AAC7C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,OAAO,YAA2B;AACtC,YAAQ,MAAM;AAAG,aAAS,MAAS;AAAG,cAAU,MAAS;AACzD,QAAI;AACF,YAAM,SAAS,MAAM,IAAgC,0BAA0B,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,UAAU,SAAS,KAAK,EAAE,CAAC,EAAE,CAAC;AACtJ,gBAAU,iCAAU,OAAO,WAAW,4BAAU,OAAO,UAAU,sBAAc,OAAO,SAAS,KAAK;AAAA,IACtG,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EACnF;AACA,QAAM,OAAO,OAAO,UAAqD;AACvE,UAAM,eAAe;AAAG,YAAQ,MAAM;AAAG,aAAS,MAAS;AAC3D,QAAI;AACF,YAAM,OAAO,MAAM,IAA4B,0BAA0B,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,UAAU,SAAS,KAAK,EAAE,CAAC,EAAE,CAAC;AAC/I,YAAMA,SAAQ,IAAI;AAAG,YAAM;AAAA,IAC7B,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EACnF;AACA,SAAO,+CAAC,UAAK,WAAU,qDAAoD,aAAW,SAAS,QAAW,UAAU,WAAS;AAAE,SAAK,KAAK,KAAK;AAAA,EAAE,GAAG;AAAA,mDAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,+BAAO;AAAA,MAAO,8CAAC,WAAM,MAAK,OAAM,WAAS,MAAC,OAAO,UAAU,UAAU,WAAS,YAAY,MAAM,OAAO,KAAK,GAAG,aAAY,oCAAmC;AAAA,MAAE,8CAAC,WAAM,wJAAuB;AAAA,OAAQ;AAAA,IAAS,UAAU,8CAAC,mBAAgB,MAAK,WAAW,kBAAO;AAAA,IAAoB,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,IAAmB,+CAAC,YAAO;AAAA,oDAAC,YAAO,MAAK,UAAS,UAAU,SAAS,QAAW,SAAS,MAAM;AAAE,aAAK,KAAK;AAAA,MAAE,GAAI,mBAAS,SAAS,6BAAS,4BAAO;AAAA,MAAS,8CAAC,UAAK,WAAU,kCAAiC;AAAA,MAAE,8CAAC,YAAO,MAAK,UAAS,UAAU,SAAS,QAAW,SAAS,OAAO,0BAAE;AAAA,MAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,SAAS,QAAY,mBAAS,SAAS,6BAAS,4BAAO;AAAA,OAAS;AAAA,KAAS;AACz4B;AAEA,SAAS,iBAAiB,EAAE,OAAO,SAAAA,SAAQ,GAAoE;AAC7G,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,SAAS,OAAO,UAAqD;AACzE,UAAM,eAAe;AAAG,UAAM,OAAO,IAAI,SAAS,MAAM,aAAa;AACrE,YAAQ,IAAI;AAAG,aAAS,MAAS;AACjC,QAAI;AACF,YAAM,IAAI,kBAAkB,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,MAAM,KAAK,IAAI,MAAM,GAAG,UAAU,KAAK,IAAI,UAAU,GAAG,SAAS,MAAM,SAAS,MAAM,CAAC,EAAE,CAAC;AAC/J,YAAMA,SAAQ;AAAG,YAAM;AAAA,IACzB,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,KAAK;AAAA,IAAE;AAAA,EAC/E;AACA,SAAO,+CAAC,UAAK,WAAU,2DAA0D,aAAW,MAAM,UAAU,WAAS;AAAE,SAAK,OAAO,KAAK;AAAA,EAAE,GAAG;AAAA,mDAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,WAAM,MAAK,QAAO,UAAQ,MAAC,WAAW,KAAK,WAAS,MAAC,aAAY,mCAAc;AAAA,OAAE;AAAA,IAAQ,+CAAC,WAAM;AAAA,oDAAC,UAAK,8BAAM;AAAA,MAAO,8CAAC,WAAM,MAAK,YAAW,UAAQ,MAAC,MAAK,OAAM,aAAY,mCAAkC;AAAA,OAAE;AAAA,IAAS,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,IAAmB,+CAAC,YAAO;AAAA,oDAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,OAAO,0BAAE;AAAA,MAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,MAAO,iBAAO,6BAAS,4BAAO;AAAA,OAAS;AAAA,KAAS;AACnmB;AACA,SAAS,cAAc,OAAsI;AAC3J,QAAM,iBAAiB,MAAM,aAAa,MAAM,SAAS,EAAE,IAAI,UAAQ,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AAClG,QAAM,cAAc,eAAe,KAAK,UAAQ,CAAC,qBAAqB,KAAK,IAAI,CAAC;AAChF,MAAI,YAAa,OAAM,IAAI,MAAM,+DAAa,WAAW,EAAE;AAC3D,QAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,cAAc,CAAC,EAAE,MAAM,GAAG,EAAE;AACtD,SAAO;AAAA,QAAc,MAAM,EAAE;AAAA,gBAAmB,YAAY,MAAM,WAAW,CAAC;AAAA,eAAkB,YAAY,MAAM,WAAW,CAAC;AAAA;AAAA,WAA8B,MAAM,YAAY,WAAW,WAAW,MAAM;AAAA,kBAAqB,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA,IAAa,MAAM,YAAY,QAAQ,aAAa,GAAG,EAAE,KAAK,CAAC;AAAA;AAAA,EAAO,MAAM,aAAa,KAAK,CAAC;AAAA;AAChV;AACA,SAAS,YAAY,OAAuB;AAAE,SAAO,IAAI,MAAM,QAAQ,YAAY,GAAG,EAAE,QAAQ,MAAM,GAAG,EAAE,KAAK,CAAC;AAAI;;;AE/NrH,IAAAE,iBAA6C;AAC7C,IAAAC,oCAAkF;;;ACDlF,IAAAC,iBAA+C;AAGxC,SAAS,gBAAgB,MAAiC,QAAkC,UAAU,MAA2B;AACtI,QAAM,cAAU,uBAAO,IAAI,GAAG,gBAAY,uBAAO,MAAM;AACvD,UAAQ,UAAU;AAAM,YAAU,UAAU;AAC5C,QAAM,YAAQ,uBAAO,CAAC,GAAG,cAAU,uBAAkC,GAAG,cAAU,uBAAO,KAAK;AAC9F,QAAM,cAAU,4BAAY,YAAY;AACtC,UAAM,UAAU,EAAE,MAAM;AACxB,UAAM,QAAQ;AACd,QAAI,CAAC,QAAQ,WAAW,YAAY,MAAM,QAAS;AACnD,UAAM,WAAW,YAAY;AAC3B,UAAI;AAAE,cAAM,SAAS,MAAM,QAAQ,QAAQ;AAAG,YAAI,QAAQ,WAAW,YAAY,MAAM,QAAS,QAAO;AAAA,MAAE,SAClG,OAAO;AAAE,YAAI,QAAQ,WAAW,YAAY,MAAM,QAAS,WAAU,QAAQ,KAAK;AAAA,MAAE;AAAA,IAC7F,GAAG;AACH,YAAQ,UAAU;AAClB,UAAM;AACN,QAAI,QAAQ,YAAY,QAAS,SAAQ,UAAU;AAAA,EACrD,GAAG,CAAC,CAAC;AACL,gCAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,YAAQ,UAAU;AAClB,SAAK,QAAQ;AACb,UAAMC,QAAO,MAAM;AAAE,UAAI,CAAC,QAAQ,WAAW,SAAS,oBAAoB,UAAW,MAAK,QAAQ;AAAA,IAAE;AACpG,UAAMC,SAAQ,OAAO,YAAYD,OAAM,GAAI;AAC3C,aAAS,iBAAiB,oBAAoBA,KAAI;AAClD,WAAO,MAAM;AAAE,cAAQ,UAAU;AAAO,YAAM;AAAW,aAAO,cAAcC,MAAK;AAAG,eAAS,oBAAoB,oBAAoBD,KAAI;AAAA,IAAE;AAAA,EAC/I,GAAG,CAAC,SAAS,OAAO,CAAC;AACrB,SAAO;AACT;;;AC7BA,IAAAE,iBAAyC;AACzC,IAAAC,oCAAmC;AAiBrB,IAAAC,uBAAA;AAbP,SAAS,kBAAkB,MAA+B;AAC/D,MAAI,KAAK,UAAW,QAAO,KAAK,WAAW,SAAS,2DAAgB;AACpE,SAAO,EAAE,UAAU,sBAAO,QAAQ,sBAAO,QAAQ,sBAAO,MAAM,qBAAM,EAAE,KAAK,MAAM;AACnF;AAEO,SAAS,gBAAgB,EAAE,WAAW,OAAO,QAAQ,GAA0H;AACpL,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK,GAAG,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC9E,QAAM,SAAS,OAAO,UAAsC;AAC1D,UAAM,eAAe;AAAG,UAAM,OAAO,IAAI,SAAS,MAAM,aAAa;AAAG,YAAQ,IAAI;AAAG,aAAS,MAAS;AACzG,QAAI;AAAE,YAAM,OAAO,MAAM,IAAqB,iBAAiB,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK,IAAI,OAAO,GAAG,aAAa,KAAK,IAAI,aAAa,GAAG,kBAAkB,KAAK,IAAI,OAAO,KAAK,OAAU,CAAC,EAAE,CAAC;AAAG,YAAM,QAAQ,IAAI;AAAA,IAAE,SAC7O,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,KAAK;AAAA,IAAE;AAAA,EAC7E;AACA,SAAO,+CAAC,UAAK,WAAU,yBAAwB,aAAW,MAAM,UAAU,WAAS;AAAE,SAAK,OAAO,KAAK;AAAA,EAAE,GACrG;AAAA,aAAS,8CAAC,mBAAiB,iBAAM;AAAA,IAClC,+CAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,WAAM,MAAK,SAAQ,WAAS,MAAC,UAAQ,MAAC,WAAW,KAAK,aAAY,oDAAW;AAAA,OAAE;AAAA,IAC5H,+CAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,cAAS,MAAK,eAAc,MAAM,GAAG,WAAW,KAAM,aAAY,wFAAiB;AAAA,OAAE;AAAA,IAClI,+CAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,4CAAK;AAAA,MAAO,+CAAC,YAAO,MAAK,SAAQ,cAAa,IAAG;AAAA,sDAAC,YAAO,OAAM,IAAG,sCAAI;AAAA,QAAU,UAAU,IAAI,OAAK,+CAAC,YAAO,OAAO,EAAE,IAAe;AAAA;AAAA,UAAE,EAAE;AAAA,aAAV,EAAE,EAAa,CAAS;AAAA,SAAE;AAAA,MAAS,8CAAC,WAAM,4LAA6B;AAAA,OAAQ;AAAA,IAC7O,+CAAC,YAAO;AAAA,oDAAC,YAAO,MAAK,UAAS,SAAS,OAAO,UAAU,MAAM,0BAAE;AAAA,MAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,MAAO,iBAAO,6BAAS,8CAAU;AAAA,OAAS;AAAA,KAC5K;AACF;AAEO,SAAS,kBAAkB,EAAE,MAAM,OAAO,WAAW,SAAAC,UAAS,MAAM,GAAoJ;AAC7N,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK,GAAG,CAAC,OAAO,QAAQ,QAAI,yBAAiB,GAAG,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK,GAAG,CAAC,SAAS,UAAU,QAAI,yBAAS,EAAE;AACnK,QAAM,OAAO,MAAM,OAAO,OAAK,EAAE,WAAW,MAAM,EAAE,QAAQ,QAAQ,MAAM,SAAS,KAAK,SAAS,MAAM,UAAU,KAAK,WAAW;AACjI,QAAM,MAAM,OAAO,QAAgB,OAAgC,CAAC,MAAM;AACxE,YAAQ,IAAI;AAAG,aAAS,MAAS;AACjC,QAAI;AAAE,YAAM,IAAI,iBAAiB,KAAK,EAAE,GAAG,WAAW,WAAW,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,QAAQ,WAAW,WAAW,WAAW,QAAQ,MAAM,KAAK,UAAU,EAAE,kBAAkB,KAAK,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC;AAAG,UAAI,WAAW,SAAU,OAAM;AAAG,YAAMA,SAAQ;AAAA,IAAE,SAC3P,QAAQ;AAAE,YAAMA,SAAQ;AAAG,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,KAAK;AAAA,IAAE;AAAA,EAC9F;AACA,SAAO,+CAAC,SAAI,WAAU,0DAAyD,aAAW,MACvF;AAAA,aAAS,8CAAC,mBAAiB,iBAAM;AAAA,IAClC,+CAAC,aAAQ,WAAU,gCAA+B;AAAA,oDAAC,YAAO,sCAAI;AAAA,MAAS,8CAAC,OAAG,eAAK,eAAe,8CAAU;AAAA,OAAI;AAAA,IAC7G,+CAAC,SAAI,WAAU,iCAAgC;AAAA,qDAAC,UAAK;AAAA;AAAA,QAAK,8CAAC,OAAG,oBAAU,KAAK,OAAK,EAAE,OAAO,KAAK,gBAAgB,GAAG,QAAQ,4BAAO;AAAA,SAAI;AAAA,MAAO,+CAAC,UAAK;AAAA;AAAA,QAAK,8CAAC,OAAG,eAAK,WAAW,SAAS,GAAG,KAAK,SAAS,UAAU,IAAI,8BAAU,GAAG,IAAI,MAAM,MAAM,MAAM,IAAG;AAAA,SAAI;AAAA,MAAO,+CAAC,UAAK;AAAA;AAAA,QAAI,8CAAC,OAAG,eAAK,mBAAmB,wDAAgB,8CAAU;AAAA,SAAI;AAAA,OAAO;AAAA,IAC/U,KAAK,aAAa,+CAAC,mBAAiB;AAAA,WAAK;AAAA,MAAU;AAAA,MAAkB,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM;AAAE,aAAK,IAAI,OAAO;AAAA,MAAE,GAAG,sCAAI;AAAA,OAAS;AAAA,IAC9J,KAAK,WAAW,+CAAC,aAAQ,WAAU,2BAA0B;AAAA,oDAAC,YAAO,sCAAI;AAAA,MAAS,8CAAC,OAAG,eAAK,SAAQ;AAAA,OAAI;AAAA,IACvG,CAAC,CAAC,KAAK,SAAS,UAAU,+CAAC,aAAQ,WAAU,sCAAqC;AAAA,qDAAC,aAAQ;AAAA;AAAA,QAAQ,KAAK,QAAQ;AAAA,QAAO;AAAA,SAAE;AAAA,MAAW,KAAK,QAAQ,IAAI,YAAU,+CAAC,aAAQ,WAAU,2BAA0C;AAAA,sDAAC,YAAQ,iBAAO,OAAM;AAAA,QAAS,8CAAC,OAAG,iBAAO,iBAAiB,OAAO,kBAAkB,8CAAU;AAAA,WAAzG,OAAO,EAAsG,CAAU;AAAA,OAAE;AAAA,IAC1U,KAAK,WAAW,UAAU,gFACzB;AAAA,qDAAC,WAAM,WAAU,iCAAgC;AAAA,sDAAC,UAAK,wDAAO;AAAA,QAAO,+CAAC,YAAO,cAAW,kCAAQ,OAAO,KAAK,oBAAoB,IAAI,UAAU,MAAM,UAAU,WAAS;AAAE,eAAK,IAAI,SAAS,EAAE,kBAAkB,MAAM,OAAO,MAAM,CAAC;AAAA,QAAE,GAAG;AAAA,wDAAC,YAAO,OAAM,IAAG,sCAAI;AAAA,UAAU,KAAK,oBAAoB,CAAC,UAAU,KAAK,OAAK,EAAE,OAAO,KAAK,gBAAgB,KAAK,8CAAC,YAAO,OAAO,KAAK,kBAAkB,wDAAO;AAAA,UAAW,UAAU,IAAI,OAAK,+CAAC,YAAO,OAAO,EAAE,IAAe;AAAA;AAAA,YAAE,EAAE;AAAA,eAAV,EAAE,EAAa,CAAS;AAAA,WAAE;AAAA,SAAS;AAAA,MAChe,8CAAC,mBAAgB,MAAK,WAAW,eAAK,WAAW,aAAa,qPAA6C,kLAAgC;AAAA,MAC1I,SAAS,+CAAC,aAAQ,WAAU,sCAAqC;AAAA,sDAAC,aAAQ,kDAAM;AAAA,QAAU,+CAAC,WAAM;AAAA,wDAAC,UAAK,sCAAI;AAAA,UAAO,8CAAC,cAAS,MAAM,GAAG,WAAW,MAAO,OAAO,SAAS,UAAU,WAAS,WAAW,MAAM,OAAO,KAAK,GAAG,aAAY,wFAAiB;AAAA,WAAE;AAAA,QAAQ,8CAAC,YAAO,MAAK,UAAS,UAAU,QAAQ,CAAC,QAAQ,KAAK,GAAG,SAAS,MAAM;AAAE,eAAK,IAAI,UAAU,EAAE,QAAQ,CAAC;AAAA,QAAE,GAAG,wDAAO;AAAA,SAAS;AAAA,OACjY;AAAA,IACA,+CAAC,aAAQ,WAAU,sCAAqC;AAAA,oDAAC,aAAQ,sCAAI;AAAA,MAAU,8CAAC,OAAE,wPAAuC;AAAA,MAAK,aAAa,+CAAC,SAAI,WAAU,mCAAkC;AAAA,sDAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,cAAc,KAAK,GAAG,sCAAI;AAAA,QAAS,+CAAC,YAAO,MAAK,UAAS,WAAU,aAAY,UAAU,MAAM,SAAS,MAAM;AAAE,eAAK,IAAI,QAAQ;AAAA,QAAE,GAAG;AAAA;AAAA,UAAS,MAAM;AAAA,UAAO;AAAA,WAAI;AAAA,SAAS,IAAS,+CAAC,YAAO,MAAK,UAAS,WAAU,aAAY,SAAS,MAAM,cAAc,IAAI,GAAG;AAAA,sDAAC,wDAAmB,MAAM,IAAI;AAAA,QAAE;AAAA,SAAI;AAAA,OAAU;AAAA,IACjiB,+CAAC,YAAO;AAAA,oDAAC,YAAO,MAAK,UAAS,SAAS,OAAO,UAAU,MAAM,0BAAE;AAAA,MAAU,KAAK,WAAW,UAAU,8CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,QAAS,KAAK,WAAW,cAAc,CAAC,MAAM,QAAS,SAAS,MAAM;AAAE,aAAK,IAAI,KAAK,WAAW,aAAa,WAAW,QAAQ;AAAA,MAAE,GAAI,iBAAO,6BAAS,KAAK,WAAW,aAAa,6BAAS,wCAAS;AAAA,OAAU;AAAA,KAC7W;AACF;;;ACjDA,IAAAC,iBAA+E;AAC/E,IAAAC,oCAA8I;;;ACD9I,IAAAC,iBAAyC;AACzC,IAAAC,oCAA0C;AAc9B,IAAAC,uBAAA;AAVL,SAAS,eAAe,EAAE,IAAI,OAAO,OAAO,SAAS,UAAU,WAAW,GAGjE;AACd,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,CAAC;AACpC,QAAM,QAAQ,KAAK,IAAI,OAAO,UAAU,KAAK,CAAC;AAC9C,QAAM,UAAU,qBAAqB,EAAE,IAAI,SAAS,GAAG,OAAO;AAC9D,QAAM,WAAW,CAAC;AAClB,SAAO,+CAAC,aAAQ,eAAa,IAAI,cAAY,MAAM,WAAW,GAAG,mBAAiB,SAChF;AAAA,kDAAC,YAAO,yDAAC,YAAO,MAAK,UAAS,WAAU,kCAAiC,iBAAe,UAAU,iBAAe,QAAQ,SAAS,MAAM,aAAa,WAAS,CAAC,KAAK,GAClK;AAAA,oDAAC,+DAA0B,MAAM,IAAI;AAAA,MAAE,8CAAC,YAAO,IAAI,SAAU,iBAAM;AAAA,MAAS,8CAAC,OAAG,gBAAM,QAAO;AAAA,OAC/F,GAAS;AAAA,IACT,8CAAC,SAAI,IAAI,QAAQ,QAAQ,CAAC,UACvB,gBAAM,SAAS,IAAI,gFAClB;AAAA,oDAAC,SAAI,WAAU,iCAAiC,gBAAM,MAAM,GAAG,KAAK,EAAE,IAAI,UAAU,GAAE;AAAA,MACrF,MAAM,SAAS,SAAS,+CAAC,YAAO,MAAK,UAAS,WAAU,0BAAyB,SAAS,MAAM,SAAS,QAAQ,EAAE,GAAG;AAAA;AAAA,QAAW,MAAM,SAAS;AAAA,QAAM;AAAA,SAAE;AAAA,OAC3J,IAAM,8CAAC,OAAE,WAAU,2BAA2B,qBAAW,yCAAW,4BAAO,GAC7E;AAAA,KACF;AACF;;;ACjB6G,IAAAC,uBAAA;AAJtG,SAAS,kBAAkB,EAAE,MAAM,QAAQ,WAAW,KAAK,GAAqI;AACrM,MAAI,CAAC,KAAK,oBAAoB,UAAU,CAAC,KAAK,cAAc,OAAQ,QAAO;AAC3E,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,SAAS,CAAC,WAAmB,UAA0C,WAAW,KAAK,sBAAsB,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,EAAE,WAAW,IAAI,GAAG,SAAS,cAAuB,GAAG,OAAO,KAAK,OAAK,EAAE,cAAc,IAAI,CAAC,GAAG,GAAI,cAAc,IAAI,IAAI,QAAQ,CAAC,EAAG,EAAE,CAAC;AAC/Q,SAAO,+CAAC,aAAQ,WAAU,6BAA6B;AAAA,YAAQ,KAAK,oBAAoB,MAAM,KAAK,+CAAC,YAAO;AAAA,qDAAC,YAAO;AAAA;AAAA,QAAQ,KAAK,oBAAoB;AAAA,SAAO;AAAA,MAAS,8CAAC,WAAM,qGAAiB;AAAA,OAAQ;AAAA,IAClM,8CAAC,QAAI,eAAK,oBAAoB,IAAI,CAAC,MAAM,MAAM;AAC7C,YAAM,YAAY,IAAI,GAAG,QAAQ,OAAO,KAAK,OAAK,EAAE,cAAc,SAAS;AAC3E,YAAM,QAAQ,KAAK,cAAc,KAAK,OAAK,EAAE,cAAc,SAAS;AACpE,YAAM,WAAW,KAAK,iBAAiB,cAAc,KAAK,OAAK,EAAE,cAAc,SAAS;AACxF,YAAM,YAAY,KAAK,YAAY,CAAC,GAAG,OAAO,OAAK,EAAE,cAAc,SAAS;AAC5E,aAAO,+CAAC,QAAmB;AAAA,sDAAC,OAAG,gBAAK;AAAA,QACjC,SAAS,SAAS,KAAK,+CAAC,aAAQ,WAAU,sCAAqC;AAAA,yDAAC,aAAQ;AAAA;AAAA,YAAQ,SAAS;AAAA,YAAO;AAAA,aAAO;AAAA,UAAW,SAAS,IAAI,CAAC,GAAG,MAAM,+CAAC,SAAY;AAAA,0DAAC,UAAM,YAAE,WAAU;AAAA,YAAQ,EAAE,QAAQ,8CAAC,WAAO,YAAE,MAAK;AAAA,eAAvD,CAAgE,CAAM;AAAA,WAAE;AAAA,QAC3O,UAAU,UAAU,+CAAC,WAAM;AAAA;AAAA,UAAM,SAAS;AAAA,WAAO;AAAA,QACjD,UAAU,+CAAC,SAAI,WAAU,2BACxB;AAAA,yDAAC,WAAM;AAAA,2DAAC,UAAK;AAAA;AAAA,cAAG;AAAA,cAAU;AAAA,eAAI;AAAA,YAAO,+CAAC,YAAO,UAAU,MAAM,OAAO,OAAO,WAAW,cAAc,UAAU,OAAK,OAAO,WAAW,EAAE,SAAS,EAAE,OAAO,MAAoC,CAAC,GAAG;AAAA,4DAAC,YAAO,OAAM,cAAa,gCAAG;AAAA,cAAS,8CAAC,YAAO,OAAM,UAAS,4CAAK;AAAA,cAAS,8CAAC,YAAO,OAAM,UAAS,gCAAG;AAAA,eAAS;AAAA,aAAS;AAAA,UACzT,+CAAC,WAAM;AAAA,0DAAC,UAAM,iBAAO,YAAY,WAAW,yCAAW,6DAAe;AAAA,YAAO,8CAAC,cAAS,MAAM,GAAG,WAAW,KAAM,UAAU,MAAM,QAAQ,OAAO,YAAY,WAAW,MAAM,WAAW,OAAO,WAAW,IAAI,UAAU,OAAK,OAAO,WAAW,OAAO,YAAY,WAAW,EAAE,UAAU,EAAE,OAAO,MAAM,IAAI,EAAE,QAAQ,EAAE,OAAO,MAAM,CAAC,GAAG;AAAA,aAAE;AAAA,WAC7U,IAAS,SAAS,+CAAC,WAAO;AAAA,gBAAM,YAAY,WAAW,6BAAS,MAAM,YAAY,WAAW,uBAAQ;AAAA,UAAM;AAAA,UAAI,MAAM,YAAY,MAAM;AAAA,WAAO;AAAA,WANhI,SAOhB;AAAA,IACF,CAAC,GAAE;AAAA,IACF,KAAK,cAAc,SAAS,+CAAC,aAAQ,WAAU,sCAAqC;AAAA,qDAAC,aAAQ;AAAA;AAAA,QAAU,KAAK,aAAa;AAAA,SAAO;AAAA,MAAW,KAAK,aAAa,IAAI,SAAO,8CAAC,UAAgB,iBAAN,GAAU,CAAO;AAAA,MAAE,8CAAC,WAAM,gIAAmB;AAAA,OAAQ,IAAa;AAAA,KACxP;AACF;;;AFwF+B,IAAAC,uBAAA;AAvG/B,IAAM,UAA6D;AAAA,EACjE,EAAE,IAAI,WAAW,OAAO,qBAAM;AAAA,EAAG,EAAE,IAAI,SAAS,OAAO,qBAAM;AAAA,EAAG,EAAE,IAAI,SAAS,OAAO,qBAAM;AAAA,EAC5F,EAAE,IAAI,UAAU,OAAO,qBAAM;AAAA,EAAG,EAAE,IAAI,WAAW,OAAO,eAAK;AAAA,EAAG,EAAE,IAAI,QAAQ,OAAO,qBAAM;AAC7F;AAGO,SAAS,sBAAsB,EAAE,eAAe,aAAa,eAAe,MAAM,aAAa,MAAM,IAA2I,CAAC,GAAgB;AACtQ,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAwB,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;AAC/E,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAsC,CAAC,CAAC;AAC1E,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAkC,CAAC,CAAC;AAC1E,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AAC9C,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAS,KAAK;AAChE,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAA6B,aAAa;AACtF,gCAAU,MAAM;AAAE,QAAI,cAAe,mBAAkB,aAAa;AAAA,EAAE,GAAG,CAAC,eAAe,WAAW,CAAC;AACrG,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAiB;AACzC,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAiB;AACjD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,QAAI,yBAA4B,KAAK;AACzE,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAS,KAAK;AAC1D,QAAM,oBAAgB,iCAAiB,MAAM,KAAK,EAAE,kBAAkB,CAAC;AACvE,QAAM,gBAAY,wBAAQ,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI,UAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;AAChG,QAAM,oBAAgB,wBAAQ,MAAM,IAAI,IAAI,UAAU,IAAI,UAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;AAChG,QAAM,+BAA2B,wBAAQ,MAAM;AAC7C,UAAM,SAAS,oBAAI,IAAmC;AACtD,eAAW,cAAc,aAAa;AACpC,WAAK,WAAW,WAAW,YAAY,WAAW,WAAW,cAAc,CAAC,OAAO,IAAI,WAAW,MAAM,EAAG,QAAO,IAAI,WAAW,QAAQ,UAAU;AAAA,IACrJ;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,CAAC;AAChB,QAAM,eAAe,iBAAiB,UAAU,IAAI,cAAc,IAAI;AACtE,QAAM,cAAc,MAAM,cAAc,KAAK,UAAQ,KAAK,OAAO,aAAa;AAC9E,QAAM,uBAAmB,wBAAQ,MAAM,MAAM,MAAM,OAAO,UAAQ,CAAC,kBAAkB,kBAAkB,WAAW,CAAC,KAAK,gBAAgB,KAAK,kBAAkB,cAAc,GAAG,CAAC,MAAM,OAAO,aAAa,CAAC;AAC5M,QAAM,qBAAiB,wBAAQ,MAAM;AACnC,UAAM,SAAS,oBAAI,IAAoB;AACvC,eAAW,QAAQ,MAAM,MAAO,YAAW,gBAAgB,KAAK,kBAAmB,QAAO,IAAI,eAAe,OAAO,IAAI,YAAY,KAAK,KAAK,CAAC;AAC/I,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,KAAK,CAAC;AAChB,QAAM,kBAAc,wBAAQ,MAAM,iBAAiB,OAAO,UAAQ;AAChE,QAAI,mBAAmB,UAAU,KAAK,uBAAuB,kBAAkB,eAAgB,QAAO;AACtG,QAAI,CAAC,cAAe,QAAO;AAC3B,UAAM,eAAe,KAAK,kBAAkB,IAAI,QAAM,UAAU,IAAI,EAAE,GAAG,SAAS,EAAE;AACpF,WAAO,CAAC,KAAK,OAAO,KAAK,aAAa,KAAK,gBAAgB,KAAK,eAAe,cAAc,IAAI,KAAK,uBAAuB,EAAE,GAAG,MAAM,GAAG,YAAY,EACpJ,KAAK,WAAS,OAAO,kBAAkB,EAAE,SAAS,aAAa,CAAC;AAAA,EACrE,CAAC,GAAG,CAAC,gBAAgB,kBAAkB,eAAe,eAAe,SAAS,CAAC;AAC/E,QAAM,mBAAe,wBAAQ,MAAM;AACjC,UAAM,SAAS,IAAI,IAAiC,QAAQ,IAAI,YAAU,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;AACzF,eAAW,QAAQ,YAAa,QAAO,IAAI,KAAK,SAAS,OAAO,IAAI,KAAK,MAAM,KAAK,KAAK,CAAC;AAC1F,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,CAAC;AAChB,QAAM,iBAAiB,iBAAiB,QAAQ,QAAQ,OAAO,aAAW,aAAa,IAAI,OAAO,EAAE,KAAK,KAAK,CAAC,IAAI,QAAQ,OAAO,YAAU,OAAO,OAAO,YAAY;AACtK,QAAM,oBAAgB,wBAAQ,MAAM;AAClC,UAAM,eAA0D,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AACxG,UAAM,SAAS,IAAI,IAA0C,QAAQ,IAAI,YAAU,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;AACnG,eAAW,QAAQ,aAAa;AAC9B,UAAI,iBAAiB,SAAS,KAAK,WAAW,aAAc;AAC5D,aAAO,IAAI,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,IACpC;AACA,eAAW,SAAS,OAAO,OAAO,EAAG,OAAM,KAAK,CAAC,MAAM,UAAU,aAAa,MAAM,QAAQ,IAAI,aAAa,KAAK,QAAQ,KAAK,MAAM,YAAY,KAAK,SAAS;AAC/J,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,YAAY,CAAC;AAC9B,QAAM,mBAAmB,iBAAiB,QAAQ,YAAY,SAAU,aAAa,IAAI,YAAY,KAAK;AAC1G,QAAMC,QAAO,gBAAgB,YAAY;AACrC,UAAM,CAAC,MAAM,aAAa,IAAI,MAAM,QAAQ,IAAI,CAAC,IAAmB,QAAQ,GAAG,IAAuF,gBAAgB,CAAC,CAAC;AACxL,WAAO,MAAM;AAAE,eAAS,IAAI;AAAG,mBAAa,cAAc,UAAU;AAAG,qBAAe,cAAc,WAAW;AAAG,kBAAY,KAAK,IAAI,CAAC;AAAG,iBAAW,KAAK;AAAG,wBAAkB,QAAM,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,IAAI,KAAK,MAAS;AAAA,IAAE;AAAA,EAC9O,GAAG,YAAU;AAAE,aAAS,aAAa,MAAM,CAAC;AAAG,eAAW,KAAK;AAAA,EAAE,CAAC;AAClE,QAAM,SAAS,OAAO,MAAqB,WAAmD;AAC5F,YAAQ,KAAK,EAAE;AAAG,aAAS,MAAS;AACpC,QAAI;AAAE,YAAM,IAAI,UAAU,KAAK,EAAE,IAAI,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,kBAAkB,KAAK,UAAU,GAAG,OAAO,CAAC,EAAE,CAAC;AAAG,YAAMA,MAAK;AAAA,IAAE,SACrI,QAAQ;AAAE,YAAMA,MAAK;AAAG,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EAC/F;AACA,QAAM,WAAW,OAAO,SAAuC;AAC7D,QAAI,CAAC,KAAK,oBAAqB;AAC/B,YAAQ,KAAK,EAAE;AAAG,aAAS,MAAS;AACpC,QAAI;AACF,YAAM,IAAI,UAAU,KAAK,EAAE,aAAa,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,IAAI,KAAK,qBAAqB,SAAS,KAAK,eAAe,iCAAQ,KAAK,KAAK,GAAG,CAAC,EAAE,CAAC;AACrK,YAAMA,MAAK;AAAA,IACb,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EACnF;AACA,QAAM,SAAS,OAAO,SAAuC;AAC3D,QAAI,CAAC,KAAK,oBAAqB;AAC/B,YAAQ,KAAK,EAAE;AAAG,aAAS,MAAS;AACpC,QAAI;AAAE,YAAM,IAAI,UAAU,KAAK,EAAE,WAAW,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,IAAI,KAAK,oBAAoB,CAAC,EAAE,CAAC;AAAG,YAAMA,MAAK;AAAA,IAAE,SAC/H,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EACjF;AACA,QAAM,SAAS,OAAO,MAAqB,WAA8C;AACvF,YAAQ,KAAK,EAAE;AAAG,aAAS,MAAS;AACpC,QAAI;AAAE,YAAM,IAAI,UAAU,KAAK,EAAE,WAAW,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,kBAAkB,KAAK,UAAU,OAAO,CAAC,EAAE,CAAC;AAAG,YAAMA,MAAK;AAAA,IAAE,SAC1I,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EACjF;AACA,QAAM,SAAS,OAAO,MAAqB,QAAgB,WAA8C;AACvG,QAAI,CAAC,OAAQ;AACb,YAAQ,KAAK,EAAE;AAAG,aAAS,MAAS;AACpC,QAAI;AAAE,YAAM,IAAI,UAAU,KAAK,EAAE,WAAW,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,QAAQ,kBAAkB,KAAK,UAAU,OAAO,CAAC,EAAE,CAAC;AAAG,YAAMA,MAAK;AAAA,IAAE,SAClJ,OAAO;AAAE,eAAS,aAAa,KAAK,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EAC/E;AACA,QAAM,SAAS,OAAO,SAAuC;AAC3D,YAAQ,KAAK,EAAE;AAAG,aAAS,MAAS;AACpC,QAAI;AAAE,YAAM,IAAI,UAAU,KAAK,EAAE,IAAI,EAAE,QAAQ,SAAS,CAAC;AAAG,UAAI,mBAAmB,KAAK,GAAI,mBAAkB,MAAS;AAAG,YAAMA,MAAK;AAAA,IAAE,SAChI,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EACjF;AACA,SAAO,+CAAC,SAAI,WAAU,qCACnB;AAAA,KAAC,cAAc,gFAAG;AAAA,cAAQ,+CAAC,SAAI,WAAU,sCAAqC;AAAA,sDAAC,YAAO,MAAK,UAAS,SAAS,MAAM,sCAAI;AAAA,QAAS,8CAAC,+DAA0B,MAAM,IAAI;AAAA,QAAE,8CAAC,UAAM,uBAAa,SAAS,wCAAS;AAAA,SAAO;AAAA,MAAO,8CAAC,iBAAc,SAAS,cAAc,kBAAkB,WAAW,IAAI,sBAAO,OAAO,aAAa,SAAS,wCAAU,QAAQ,aAAa,eAAe,8IAA2B,SAAS,gFAAE;AAAA,uDAAC,UAAK,WAAU,0BAAyB,OAAO,WAAW,4BAAQ,IAAI,KAAK,QAAQ,EAAE,mBAAmB,CAAC,KAAK,4BAAQ;AAAA,wDAAC,OAAE;AAAA,UAAE;AAAA,WAAI;AAAA,QAAQ,eAAe,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,qBAAqB,IAAI,GAAG,sCAAI;AAAA,QAAW,aAAa,WAAW,cAAc,+CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,YAAY,IAAI,GAAG;AAAA,wDAAC,uDAAkB,MAAM,IAAI;AAAA,UAAE;AAAA,WAAG;AAAA,SAAU,GAAK;AAAA,OAAE;AAAA,IAClxB,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,IACjC,qBAAqB,eAAe,8CAAC,mBAAgB,SAAQ,4BAAO,OAAO,YAAY,OAAO,QAAQ,kBAAkB,WAAW,GAAG,OAAO,MAAM,qBAAqB,KAAK,GAAG,OAAM,QAAO,wDAAC,qBAAuC,MAAM,aAAa,OAAO,kBAAkB,WAAsB,SAASA,OAAM,OAAO,MAAM,qBAAqB,KAAK,KAAxI,YAAY,EAA+H,GAAE;AAAA,IAClW,YAAY,eAAe,8CAAC,mBAAgB,OAAM,kCAAQ,QAAQ,iCAAQ,YAAY,KAAK,IAAI,OAAO,MAAM,YAAY,KAAK,GAAG,OAAM,QAAO,wDAAC,YAAS,eAAe,YAAY,IAAI,YAAY,WAAW,OAAO,kBAAkB,OAAO,MAAM,YAAY,KAAK,GAAG,SAASA,OAAM,GAAE;AAAA,IACxR,gBAAgB,+CAAC,mBAAgB,SAAQ,eAAc,OAAO,aAAa,OAAO,QAAQ,kBAAkB,cAAc,SAAS,GAAG,OAAO,MAAM,kBAAkB,MAAS,GAAG,OAAM,QAAO;AAAA;AAAA,QAAC;AAAA;AAAA,UACxK,MAAM;AAAA,UAAc,OAAO,MAAM;AAAA,UAAO,YAAY,MAAM,WAAW,OAAO,UAAQ,KAAK,WAAW,aAAa,EAAE;AAAA,UAAG;AAAA,UAC5I,WAAW,yBAAyB,IAAI,aAAa,EAAE;AAAA,UACvD,MAAM,SAAS,aAAa;AAAA,UAAI,QAAQ,YAAU;AAAE,iBAAK,OAAO,cAAc,MAAM;AAAA,UAAE;AAAA,UAAG,UAAU,MAAM;AAAE,iBAAK,SAAS,YAAY;AAAA,UAAE;AAAA,UAAG,QAAQ,MAAM;AAAE,iBAAK,OAAO,YAAY;AAAA,UAAE;AAAA,UACpL,QAAQ,YAAU;AAAE,iBAAK,OAAO,cAAc,MAAM;AAAA,UAAE;AAAA,UAAG,QAAQ,CAAC,QAAQ,WAAW;AAAE,iBAAK,OAAO,cAAc,QAAQ,MAAM;AAAA,UAAE;AAAA,UAAG,QAAQ,MAAM;AAAE,iBAAK,OAAO,YAAY;AAAA,UAAE;AAAA;AAAA,QAHzK,aAAa;AAAA,MAIpB;AAAA,MAAG,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,OAAmB;AAAA,IACtD,CAAC,eAAe,UAAU,8CAAC,sBAAmB,MAAM,GAAG,IAAK,gFAC3D;AAAA,qDAAC,SAAI,WAAU,2BACb;AAAA,uDAAC,WAAM,WAAU,4BAA2B;AAAA,wDAAC,UAAK,WAAU,WAAU,sCAAI;AAAA,UAAO,8CAAC,UAAK,eAAY,QAAO,wDAAC,yDAAoB,MAAM,IAAI,GAAE;AAAA,UAAO,8CAAC,WAAM,OAAO,OAAO,UAAU,WAAS,SAAS,MAAM,OAAO,KAAK,GAAG,aAAY,kFAAgB;AAAA,UAAG,SAAS,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,SAAS,EAAE,GAAG,cAAW,wCAAS,wDAAC,wDAAmB,MAAM,IAAI,GAAE;AAAA,WAAU;AAAA,QACjX,+CAAC,WAAM,WAAU,8BAA6B;AAAA,wDAAC,UAAK,WAAU,WAAU,kDAAM;AAAA,UAAO,+CAAC,YAAO,OAAO,gBAAgB,UAAU,WAAS,kBAAkB,MAAM,OAAO,KAAK,GAAG;AAAA,0DAAC,YAAO,OAAM,OAAM,sCAAI;AAAA,YAAS,8CAAC,YAAO,OAAM,cAAa,gCAAG;AAAA,YAAU,UAAU,IAAI,UAAQ,+CAAC,YAAO,OAAO,KAAK,IAAkB;AAAA;AAAA,cAAE,KAAK;AAAA,iBAAhB,KAAK,EAAgB,CAAS;AAAA,aAAE;AAAA,WAAS;AAAA,QACnV,+CAAC,WAAM,WAAU,8CAA6C;AAAA,wDAAC,UAAK,WAAU,WAAU,wDAAO;AAAA,UAAO,+CAAC,YAAO,OAAO,cAAc,UAAU,WAAS,gBAAgB,MAAM,OAAO,KAA0B,GAAG;AAAA,2DAAC,YAAO,OAAM,OAAM;AAAA;AAAA,cAAQ,YAAY;AAAA,eAAO;AAAA,YAAU,QAAQ,IAAI,YAAU,+CAAC,YAAO,OAAO,OAAO,IAAqB;AAAA,qBAAO;AAAA,cAAM;AAAA,cAAI,aAAa,IAAI,OAAO,EAAE,KAAK;AAAA,iBAA5D,OAAO,EAAuD,CAAS;AAAA,aAAE;AAAA,WAAS;AAAA,QAChZ,+CAAC,WAAM,aAAU,UAAS;AAAA;AAAA,UAAI;AAAA,UAAiB;AAAA,UAAI,MAAM,MAAM;AAAA,WAAO;AAAA,SACxE;AAAA,MACA,+CAAC,SAAI,WAAU,8BAA6B,cAAW,8CAAU;AAAA,uDAAC,YAAO,MAAK,UAAS,WAAW,iBAAiB,QAAQ,cAAc,IAAI,gBAAc,iBAAiB,OAAO,SAAS,MAAM,gBAAgB,KAAK,GAAG;AAAA,wDAAC,UAAK,0BAAE;AAAA,UAAO,8CAAC,OAAG,sBAAY,QAAO;AAAA,WAAI;AAAA,QAAU,QAAQ,IAAI,YAAU,+CAAC,YAAO,MAAK,UAAyB,WAAW,iBAAiB,OAAO,KAAK,cAAc,IAAI,gBAAc,iBAAiB,OAAO,IAAI,SAAS,MAAM,gBAAgB,OAAO,EAAE,GAAG;AAAA,wDAAC,UAAM,iBAAO,OAAM;AAAA,UAAO,8CAAC,OAAG,uBAAa,IAAI,OAAO,EAAE,KAAK,GAAE;AAAA,aAA1N,OAAO,EAAuN,CAAS;AAAA,SAAE;AAAA,MACxiB,8CAAC,SAAI,WAAU,qBAAoB,gBAAc,iBAAiB,OAAO,cAAW,4BAAQ,yBAAe,IAAI,YAAU;AACzH,cAAM,QAAQ,cAAc,IAAI,OAAO,EAAE,KAAK,CAAC;AAC/C,eAAO,8CAAC,kBAA+B,IAAI,OAAO,IAAI,OAAO,OAAO,OAAO,OAAc,SAAS,iBAAiB,OAAO,UAAU,QAAQ,SAAS,mBAAmB,KAAK,GAAG,YAAY,UAAQ;AAAA,UAAC;AAAA;AAAA,YACrL;AAAA,YAAY;AAAA,YAAsB;AAAA,YAA8B,gBAAgB,eAAe,IAAI,KAAK,EAAE,KAAK;AAAA,YAC7H,WAAW,yBAAyB,IAAI,KAAK,EAAE;AAAA,YAC/C,MAAM,MAAM,kBAAkB,KAAK,EAAE;AAAA;AAAA,UAFhC,KAAK;AAAA,QAGZ,KAJ4B,OAAO,EAI/B;AAAA,MACN,CAAC,GAAE;AAAA,MAAO,CAAC,YAAY,UAAU,+CAAC,SAAI,WAAU,gCAA+B;AAAA,sDAAC,YAAQ,mBAAS,mBAAmB,QAAQ,+CAAY,wCAAS;AAAA,QAAS,8CAAC,OAAG,uBAAa,WAAW,aAAa,6KAAiC,wFAAiB;AAAA,SAAI;AAAA,OAAO;AAAA,KAClQ;AACF;AAEA,SAAS,SAAS,EAAE,MAAM,WAAW,eAAe,gBAAgB,WAAW,KAAK,GAEpE;AACd,QAAM,eAAe,KAAK,kBAAkB,IAAI,QAAM,UAAU,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,SAAgC,SAAS,MAAS;AACnI,QAAM,WAAW,aAAa,OAAO,UAAQ,KAAK,WAAW,MAAM;AACnE,QAAM,wBAAwB,aAAa,SAAS,SAAS;AAC7D,QAAM,WAAW,cAAc,IAAI,KAAK,uBAAuB,EAAE;AACjE,QAAM,iBAAiB,KAAK,aAAa,EAAE,OAAO,KAAK,WAAW,QAAQ,IAAI,YAAY,gBAAgB,WAAW,SAAS,MAAM,IAAI,KAAK,WAAW,KAAK,WAAW,UAAU,EAAE,OAAO,SAAS,SAAS,yCAAW,2BAAO,IAAI;AACnO,SAAO,8CAAC,aAAQ,WAAU,yBAAwB,gBAAc,SAAS,SAAS,GAAG,iBAAe,KAAK,UACvG,yDAAC,YAAO,MAAK,UAAS,WAAU,4BAA2B,iBAAc,UAAS,SAAS,MAAM;AAAA,mDAAC,UAAK;AAAA,qDAAC,UAAK,WAAU,+BAA8B;AAAA,sDAAC,YAAO,OAAO,KAAK,OAAQ,eAAK,OAAM;AAAA,QAAS,8CAAC,QAAI,wBAAc,KAAK,QAAQ,GAAE;AAAA,SAAK;AAAA,MAAO,+CAAC,WAAM,WAAU,+BAA+B;AAAA,mBAAW,IAAI,SAAS,IAAI,KAAK;AAAA,QAAO,KAAK,gBAAgB,mCAAY;AAAA,QAAI,iBAAiB,SAAM,eAAe,KAAK,KAAK;AAAA,SAAG;AAAA,OAAU,aAAa,SAAS,KAAK,iBAAiB,MAAM,+CAAC,UAAK,WAAU,8BAA8B;AAAA,qBAAa,SAAS,KAAK,+CAAC,WAAM,gBAAc,SAAS,SAAS,GAAG;AAAA;AAAA,UAAI;AAAA,UAAsB;AAAA,UAAE,aAAa;AAAA,WAAO;AAAA,QAAU,iBAAiB,KAAK,+CAAC,WAAM;AAAA;AAAA,UAAO;AAAA,WAAe;AAAA,SAAS;AAAA,OAAQ;AAAA,IAAO,8CAAC,+DAA0B,MAAM,IAAI;AAAA,KAAE,GAChwB;AACF;AAEA,SAAS,WAAW,EAAE,MAAM,OAAO,YAAY,WAAW,WAAW,MAAM,QAAQ,UAAU,QAAQ,QAAQ,QAAQ,OAAO,GAG5G;AACd,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAA4B,CAAC,CAAC;AAC1D,gCAAU,MAAM;AAAE,cAAU,CAAC,CAAC;AAAA,EAAE,GAAG,CAAC,KAAK,IAAI,KAAK,QAAQ,CAAC;AAC3D,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,EAAE;AACnD,gCAAU,MAAM;AAAE,QAAI,KAAK,WAAW,UAAU;AAAE,mBAAa,KAAK;AAAG,sBAAgB,EAAE;AAAA,IAAE;AAAA,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;AAC7G,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,yBAAS,KAAK;AAC9D,QAAM,WAAO,wBAAQ,MAAM,IAAI,IAAI,MAAM,IAAI,UAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/E,QAAM,eAAe,KAAK,kBAAkB,IAAI,QAAM,KAAK,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,SAAgC,SAAS,MAAS;AAC9H,QAAM,WAAW,aAAa,OAAO,UAAQ,KAAK,WAAW,MAAM;AACnE,QAAM,WAAW,UAAU,KAAK,UAAQ,KAAK,OAAO,KAAK,mBAAmB;AAC5E,QAAM,WAAW,UAAU,KAAK,UAAQ,KAAK,OAAO,KAAK,mBAAmB;AAC5E,QAAM,uBAAuB,MAAM,OAAO,UAAQ,KAAK,OAAO,KAAK,MAAM,CAAC,KAAK,kBAAkB,SAAS,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;AACxJ,QAAM,aAAa,QAAQ,KAAK,mBAAmB,KAAK,CAAC,aAAa,CAAC,CAAC,SAAS,UAAU,MAAM,EAAE,SAAS,KAAK,MAAM;AACvH,QAAM,mBAAmB,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,MAAM,UAAU,MAAM,KAAK,KAAK,EAAE,EAAE,MAAM,GAAG,CAAC;AAC7F,QAAM,iBAAiB,YAAY,gBAAgB,WAAW,SAAS,MAAM,IAAI;AACjF,SAAO,+CAAC,SAAI,WAAU,2BAClB;AAAA,mDAAC,aAAQ,WAAU,gCAA+B;AAAA,oDAAC,YAAO,sCAAI;AAAA,MAAS,8CAAC,OAAG,eAAK,eAAe,wCAAS;AAAA,OAAI;AAAA,IAC3G,KAAK,cAAc,KAAK,WAAW,UAAU,+CAAC,aAAQ,WAAU,gCAA+B;AAAA,oDAAC,YAAQ,eAAK,WAAW,SAAQ;AAAA,MAAU,KAAK,WAAW,SAAS,SAAS,8CAAC,OAAG,eAAK,WAAW,QAAQ,IAAI,QAAM,KAAK,IAAI,EAAE,GAAG,SAAS,gCAAO,EAAE,KAAK,QAAG,GAAE,IAAO;AAAA,MAAM,KAAK,WAAW,UAAU,+CAAC,WAAM;AAAA;AAAA,QAAM,IAAI,KAAK,KAAK,WAAW,OAAO,EAAE,eAAe;AAAA,SAAE,IAAW;AAAA,OAAK;AAAA,IACpX,8CAAC,qBAAkB,MAAY,QAAgB,WAAsB,MAAY;AAAA,IACjF,+CAAC,SAAI,WAAU,2BAA0B;AAAA,qDAAC,WAAM;AAAA,sDAAC,UAAK,0BAAE;AAAA,QAAO,8CAAC,YAAO,OAAO,KAAK,QAAQ,UAAU,MAAM,UAAU,WAAS,OAAO,EAAE,QAAQ,MAAM,OAAO,OAAO,GAAI,MAAM,OAAO,UAAU,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG,CAAC,GAAI,kBAAQ,IAAI,UAAQ,8CAAC,YAAqB,OAAO,KAAK,IAAI,WAAW,KAAK,OAAO,WAAW,KAAK,OAAO,YAAY,KAAK,OAAO,WAAW,SAAS,SAAS,KAAK,KAAK,OAAO,UAAU,KAAK,WAAW,YAAY,KAAK,WAAW,QAAS,eAAK,SAAjN,KAAK,EAAkN,CAAS,GAAE;AAAA,SAAS;AAAA,MAAQ,+CAAC,WAAM;AAAA,sDAAC,UAAK,gCAAG;AAAA,QAAO,+CAAC,YAAO,OAAO,KAAK,uBAAuB,IAAI,UAAU,QAAQ,KAAK,WAAW,SAAS,UAAU,WAAS,OAAO,EAAE,qBAAqB,MAAM,OAAO,MAAM,CAAC,GAAG;AAAA,wDAAC,YAAO,OAAM,IAAG,gCAAG;AAAA,UAAU,UAAU,IAAI,UAAQ,+CAAC,YAAqB,OAAO,KAAK,IAAI;AAAA;AAAA,YAAE,KAAK;AAAA,YAAK;AAAA,YAAI,KAAK,iBAAiB,SAAS,iBAAO;AAAA,eAA/E,KAAK,EAA+E,CAAS;AAAA,WAAE;AAAA,SAAS;AAAA,MAAQ,+CAAC,WAAM;AAAA,sDAAC,UAAK,sCAAI;AAAA,QAAO,+CAAC,YAAO,OAAO,KAAK,uBAAuB,IAAI,UAAU,MAAM,UAAU,WAAS,OAAO,EAAE,qBAAqB,MAAM,OAAO,MAAM,CAAC,GAAG;AAAA,wDAAC,YAAO,OAAM,IAAG,wDAAS;AAAA,UAAU,UAAU,IAAI,UAAQ,+CAAC,YAAqB,OAAO,KAAK,IAAI;AAAA;AAAA,YAAE,KAAK;AAAA,eAAhC,KAAK,EAAgC,CAAS;AAAA,WAAE;AAAA,SAAS;AAAA,OAAQ;AAAA,IACjoC,kBAAkB,+CAAC,aAAQ,WAAU,8BAA6B,cAAY,WAAW,QAAQ;AAAA,oDAAC,OAAE;AAAA,MAAE,+CAAC,UAAK;AAAA,sDAAC,YAAQ,yBAAe,OAAM;AAAA,QAAS,8CAAC,WAAO,yBAAe,QAAO;AAAA,SAAQ;AAAA,OAAO;AAAA,IACjM,+CAAC,aAAQ,WAAU,+BAA8B;AAAA,qDAAC,YAAO;AAAA,sDAAC,YAAO,sCAAI;AAAA,QAAS,8CAAC,WAAO,mBAAS,SAAS,GAAG,SAAS,MAAM,oFAAmB,aAAa,SAAS,iEAAe,wCAAS;AAAA,SAAQ;AAAA,MAAU,aAAa,SAAS,KAAK,8CAAC,SAAK,uBAAa,IAAI,UAAQ,+CAAC,UAAmB,aAAW,KAAK,WAAW,QAAQ;AAAA,sDAAC,OAAG,eAAK,WAAW,SAAS,8CAAC,wDAAmB,MAAM,IAAI,IAAK,IAAG;AAAA,QAAI,8CAAC,OAAG,eAAK,OAAM;AAAA,QAAI,8CAAC,YAAO,MAAK,UAAS,UAAU,QAAQ,CAAC,SAAS,UAAU,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,cAAY,wCAAU,KAAK,KAAK,IAAI,SAAS,MAAM,OAAO,EAAE,mBAAmB,KAAK,kBAAkB,OAAO,QAAM,OAAO,KAAK,EAAE,EAAE,CAAC,GAAG,0BAAE;AAAA,WAA1W,KAAK,EAA8W,CAAO,GAAE;AAAA,MAAQ,qBAAqB,SAAS,KAAK,+CAAC,WAAM;AAAA,sDAAC,UAAK,WAAU,WAAU,kDAAM;AAAA,QAAO,+CAAC,YAAO,cAAa,IAAG,UAAU,QAAQ,CAAC,SAAS,UAAU,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,UAAU,WAAS;AAAE,gBAAM,KAAK,MAAM,cAAc;AAAO,cAAI,GAAI,QAAO,EAAE,mBAAmB,CAAC,GAAG,KAAK,mBAAmB,EAAE,EAAE,CAAC;AAAG,gBAAM,cAAc,QAAQ;AAAA,QAAG,GAAG;AAAA,wDAAC,YAAO,OAAM,IAAG,wDAAO;AAAA,UAAU,qBAAqB,IAAI,UAAQ,+CAAC,YAAO,OAAO,KAAK,IAAmB;AAAA,iBAAK;AAAA,YAAM;AAAA,YAAI,YAAY,KAAK,MAAM;AAAA,eAAhD,KAAK,EAA6C,CAAS;AAAA,WAAE;AAAA,SAAS;AAAA,OAAS;AAAA,IACvpC,KAAK,iBAAiB,8CAAC,eAAY,OAAM,4BAAO,OAAO,KAAK,eAAe;AAAA,IAC3E,KAAK,iBAAiB,8CAAC,eAAY,OAAO,2BAAO,WAAW,UAAO,SAAS,IAAI,KAAK,EAAE,IAAI,OAAO,KAAK,eAAe;AAAA,IACtH,iBAAiB,SAAS,KAAK,+CAAC,aAAQ,WAAU,gEAA+D;AAAA,qDAAC,aAAQ;AAAA;AAAA,QAAQ,iBAAiB;AAAA,SAAO;AAAA,MAAU,8CAAC,QAAI,2BAAiB,IAAI,UAAQ,+CAAC,QAAiB;AAAA,sDAAC,UAAM,eAAK,SAAQ;AAAA,QAAO,8CAAC,UAAM,cAAI,KAAK,KAAK,EAAE,EAAE,eAAe,GAAE;AAAA,WAA9E,KAAK,EAAgF,CAAK,GAAE;AAAA,OAAK;AAAA,IAChT,aAAa,+CAAC,UAAK,WAAU,2BAA0B,UAAU,WAAS;AAAE,YAAM,eAAe;AAAG,YAAM,SAAS,aAAa,KAAK;AAAG,UAAI,CAAC,OAAQ;AAAQ,aAAO,QAAQ,MAAM;AAAA,IAAE,GAAG;AAAA,qDAAC,WAAM;AAAA,sDAAC,UAAK,sCAAI;AAAA,QAAO,8CAAC,cAAS,WAAS,MAAC,OAAO,cAAc,UAAU,WAAS,gBAAgB,MAAM,OAAO,KAAK,GAAG,MAAM,GAAG,WAAW,MAAM,aAAY,4EAAe;AAAA,SAAE;AAAA,MAAQ,+CAAC,SAAI;AAAA,sDAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAAE,uBAAa,KAAK;AAAG,0BAAgB,EAAE;AAAA,QAAE,GAAG,0BAAE;AAAA,QAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,QAAQ,CAAC,aAAa,KAAK,GAAG,sCAAI;AAAA,SAAS;AAAA,OAAM;AAAA,IAC1jB,oBAAoB,+CAAC,SAAI,WAAU,mCAAkC,MAAK,SAAQ;AAAA,oDAAC,UAAK,kPAAsC;AAAA,MAAO,+CAAC,SAAI;AAAA,sDAAC,YAAO,MAAK,UAAS,SAAS,MAAM,oBAAoB,KAAK,GAAG,sCAAI;AAAA,QAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,aAAY,UAAU,MAAM,SAAS,QAAQ,sCAAI;AAAA,SAAS;AAAA,OAAM;AAAA,IACzT,+CAAC,YAAO,WAAU,4BAA2B;AAAA,qDAAC,WAAM;AAAA;AAAA,QAAE,KAAK;AAAA,QAAS;AAAA,QAAI,IAAI,KAAK,KAAK,SAAS,EAAE,eAAe;AAAA,SAAE;AAAA,MAAQ,+CAAC,UAAM;AAAA,aAAK,WAAW,WAAW,gFAAG;AAAA,eAAK,uBAAuB,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,QAAS,iBAAO,6BAAS,iBAAO,UAAU,QAAQ,cAAI,iBAAM;AAAA,UAAU,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM,aAAa,IAAI,GAAG,sCAAI;AAAA,UAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,QAAQ,QAAQ,KAAK,oBAAoB,WAAW,OAAO,WAAW,KAAK,mBAAmB,UAAU,OAAO,KAAK,OAAK,EAAE,YAAY,YAAY,CAAC,EAAE,UAAU,KAAK,CAAC,EAAE,GAAG,SAAS,MAAM,OAAO,MAAM,GAAG,sCAAI;AAAA,WAAS,IAAM,8CAAC,YAAO,MAAK,UAAS,UAAU,QAAQ,CAAC,YAAY,OAAO,SAAS,SAAS,2GAAsB,CAAC,KAAK,sBAAsB,+CAAY,QAAW,SAAS,UAAW,iBAAO,6BAAS,WAAW,WAAW,WAAW,qDAAa,KAAK,WAAW,UAAU,6BAAS,KAAK,WAAW,SAAS,6BAAS,iBAAO,UAAU,QAAQ,cAAI,IAAG;AAAA,QAAU,8CAAC,YAAO,MAAK,UAAS,WAAU,WAAU,cAAY,gBAAM,KAAK,KAAK,IAAI,iBAAe,kBAAkB,UAAU,MAAM,SAAS,MAAM,oBAAoB,IAAI,GAAG,wDAAC,wDAAmB,MAAM,IAAI,GAAE;AAAA,SAAS;AAAA,OAAO;AAAA,KAC3sC;AACF;AAEA,SAAS,YAAY,EAAE,OAAO,MAAM,GAAkD;AACpF,SAAO,+CAAC,aAAQ,WAAU,2BAA0B;AAAA,kDAAC,YAAQ,iBAAM;AAAA,IAAS,8CAAC,OAAG,iBAAM;AAAA,KAAI;AAC5F;AAEA,SAAS,SAAS,EAAE,eAAe,YAAY,OAAO,OAAO,SAAAC,SAAQ,GAAqJ;AACxN,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,oBAAoB,MAAM,OAAO,UAAQ,KAAK,WAAW,MAAM;AACrE,QAAM,SAAS,OAAO,UAAqD;AACzE,UAAM,eAAe;AAAG,UAAM,OAAO,IAAI,SAAS,MAAM,aAAa;AACrE,YAAQ,IAAI;AAAG,aAAS,MAAS;AACjC,QAAI;AACF,YAAM,IAAI,UAAU,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU;AAAA,QACzD;AAAA,QACA,OAAO,KAAK,IAAI,OAAO;AAAA,QAAG,aAAa,KAAK,IAAI,aAAa;AAAA,QAAG,UAAU,KAAK,IAAI,UAAU;AAAA,QAC7F,SAAS,KAAK,IAAI,YAAY,MAAM,SAAS,QAAQ,KAAK,IAAI,UAAU,CAAC;AAAA,QACzE,qBAAqB,KAAK,IAAI,UAAU,KAAK;AAAA,QAAW,qBAAqB,KAAK,IAAI,UAAU,KAAK;AAAA,QACrG,mBAAmB,KAAK,OAAO,kBAAkB;AAAA,QACjD,oBAAoB,OAAO,KAAK,IAAI,oBAAoB,KAAK,EAAE,EAAE,MAAM,IAAI,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,QAC9G,cAAc,OAAO,KAAK,IAAI,cAAc,KAAK,EAAE,EAAE,MAAM,IAAI,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,MACpG,CAAC,EAAE,CAAC;AACJ,YAAMA,SAAQ;AAAG,YAAM;AAAA,IACzB,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,KAAK;AAAA,IAAE;AAAA,EAC/E;AACA,SAAO,+CAAC,UAAK,WAAU,yBAAwB,aAAW,MAAM,UAAU,WAAS;AAAE,SAAK,OAAO,KAAK;AAAA,EAAE,GAAG;AAAA,mDAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,WAAM,MAAK,SAAQ,WAAW,KAAK,UAAQ,MAAC,WAAS,MAAC,aAAY,0DAAY;AAAA,OAAE;AAAA,IAAQ,+CAAC,WAAM;AAAA,oDAAC,UAAK,gCAAG;AAAA,MAAO,+CAAC,YAAO,MAAK,YAAW,cAAa,IAAG;AAAA,sDAAC,YAAO,OAAM,IAAG,gCAAG;AAAA,QAAU,WAAW,IAAI,UAAQ,+CAAC,YAAqB,OAAO,KAAK,IAAI;AAAA;AAAA,UAAE,KAAK;AAAA,aAAhC,KAAK,EAAgC,CAAS;AAAA,SAAE;AAAA,OAAS;AAAA,IAAQ,+CAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,cAAS,MAAK,eAAc,WAAW,KAAM,MAAM,GAAG,aAAY,kFAAgB;AAAA,OAAE;AAAA,IAAQ,+CAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,wDAAS;AAAA,MAAO,8CAAC,cAAS,MAAK,sBAAqB,MAAM,GAAG,WAAW,KAAO,aAAY,sFAAoB;AAAA,OAAE;AAAA,IAAQ,+CAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,wDAAS;AAAA,MAAO,8CAAC,cAAS,MAAK,gBAAe,MAAM,GAAG,WAAW,MAAM,aAAY,wKAA0C;AAAA,OAAE;AAAA,IAAQ,+CAAC,WAAM;AAAA,oDAAC,UAAK,gCAAG;AAAA,MAAO,+CAAC,YAAO,MAAK,YAAW,cAAa,UAAS;AAAA,sDAAC,YAAO,OAAM,OAAM,oBAAC;AAAA,QAAS,8CAAC,YAAO,OAAM,UAAS,0BAAE;AAAA,QAAS,8CAAC,YAAO,OAAM,QAAO,oBAAC;AAAA,QAAS,8CAAC,YAAO,OAAM,UAAS,0BAAE;AAAA,SAAS;AAAA,OAAS;AAAA,IAAQ,+CAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,+CAAC,YAAO,MAAK,YAAW,cAAa,IAAG;AAAA,sDAAC,YAAO,OAAM,IAAG,wDAAS;AAAA,QAAU,WAAW,IAAI,UAAQ,+CAAC,YAAqB,OAAO,KAAK,IAAI;AAAA;AAAA,UAAE,KAAK;AAAA,aAAhC,KAAK,EAAgC,CAAS;AAAA,SAAE;AAAA,OAAS;AAAA,IAAQ,+CAAC,SAAI,WAAU,8CAA6C;AAAA,qDAAC,UAAK;AAAA;AAAA,QAAK,8CAAC,WAAM,0BAAE;AAAA,SAAQ;AAAA,MAAQ,kBAAkB,SAAS,IAAI,8CAAC,SAAK,4BAAkB,IAAI,UAAQ,+CAAC,WAAoB;AAAA,sDAAC,WAAM,MAAK,YAAW,MAAK,oBAAmB,OAAO,KAAK,IAAI;AAAA,QAAE,8CAAC,OAAE;AAAA,QAAE,8CAAC,UAAM,eAAK,OAAM;AAAA,QAAO,8CAAC,WAAO,sBAAY,KAAK,MAAM,GAAE;AAAA,WAAzI,KAAK,EAA4I,CAAQ,GAAE,IAAS,8CAAC,OAAE,sFAAY;AAAA,MAAK,8CAAC,WAAM,kJAAsB;AAAA,OAAQ;AAAA,IAAM,+CAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,4CAAK;AAAA,MAAO,+CAAC,YAAO,MAAK,cAAa,cAAa,OAAM;AAAA,sDAAC,YAAO,OAAM,OAAM,4IAAqB;AAAA,QAAS,8CAAC,YAAO,OAAM,QAAO,0EAAU;AAAA,SAAS;AAAA,OAAS;AAAA,IAAS,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,IAAmB,+CAAC,YAAO;AAAA,oDAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,OAAO,0BAAE;AAAA,MAAS,+CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,MAAM;AAAA,sDAAC,uDAAkB,MAAM,IAAI;AAAA,QAAG,OAAO,6BAAS;AAAA,SAAO;AAAA,OAAS;AAAA,KAAS;AACvmE;AAEA,SAAS,UAAU,aAAqB,UAAkB,OAAmC,UAAU,oBAAI,IAAY,GAAY;AACjI,MAAI,gBAAgB,SAAU,QAAO;AACrC,MAAI,QAAQ,IAAI,WAAW,EAAG,QAAO;AACrC,UAAQ,IAAI,WAAW;AACvB,UAAQ,MAAM,IAAI,WAAW,GAAG,qBAAqB,CAAC,GAAG,KAAK,QAAM,UAAU,IAAI,UAAU,OAAO,OAAO,CAAC;AAC7G;AACA,SAAS,YAAY,OAAoC;AAAE,SAAO,QAAQ,KAAK,UAAQ,KAAK,OAAO,KAAK,GAAG,SAAS;AAAM;AAC1H,SAAS,kBAAkB,MAAqB,WAAgD;AAC9F,QAAM,WAAW,UAAU,KAAK,UAAQ,KAAK,OAAO,KAAK,mBAAmB;AAC5E,SAAO,GAAG,YAAY,KAAK,MAAM,CAAC,SAAM,WAAW,uBAAQ,SAAS,IAAI,KAAK,4CAAS,SAAM,cAAc,KAAK,QAAQ,CAAC;AAC1H;AACA,SAAS,cAAc,OAA0C;AAAE,SAAQ,EAAE,KAAK,4BAAQ,QAAQ,kCAAS,MAAM,4BAAQ,QAAQ,eAAK,EAAG,KAAK;AAAE;AAChJ,SAAS,gBAAgB,OAA8B,WAAW,GAAqD;AACrH,QAAM,SAAS,MAAM,SAAS;AAC9B,MAAI,MAAM,WAAW,UAAU;AAC7B,SAAK,MAAM,YAAY,OAAO,EAAG,QAAO,WACpC,EAAE,OAAO,wCAAU,OAAO,gEAAc,QAAQ,gBAAM,QAAQ,4KAAgC,IAC9F,EAAE,OAAO,sBAAO,OAAO,kCAAS,QAAQ,+GAAqB;AACjE,UAAM,KAAK,MAAM,gBAAgB,IAAI,KAAK,MAAM,aAAa,EAAE,eAAe,IAAI;AAClF,WAAO,EAAE,OAAO,wCAAU,OAAO,SAAS,uEAAgB,sEAAe,QAAQ,GAAG,EAAE,4BAAQ,MAAM,QAAQ,SAAM,MAAM,KAAK,KAAK,EAAE,GAAG;AAAA,EACzI;AACA,QAAM,aAAa,MAAM,YAAY,KAAK;AAC1C,SAAO;AAAA,IACL,OAAO,YAAY,UAAK,MAAM,QAAQ,8BAAU,SAAS,mCAAU;AAAA,IACnE,OAAO,YAAa,SAAS,qDAAa,qDAAc,SAAS,qDAAa;AAAA,IAC9E,QAAQ,YAAY,mIAA0B;AAAA,EAChD;AACF;;;AHxNuB,IAAAC,uBAAA;AApBhB,SAAS,iBAAiB,EAAE,eAAe,YAAY,IAA8E,CAAC,GAAgB;AAC3J,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAwB,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,EAAE,CAAC;AACjG,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAsC,CAAC,CAAC;AAC1E,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI,GAAG,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AACnF,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAiB,GAAG,CAAC,UAAU,WAAW,QAAI,yBAAiB;AAC/F,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK,GAAG,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AACzF,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE,GAAG,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACvE,gCAAU,MAAM;AAAE,QAAI,eAAe;AAAE,kBAAY,MAAS;AAAG,kBAAY,MAAS;AAAG,kBAAY,KAAK;AAAA,IAAE;AAAA,EAAE,GAAG,CAAC,eAAe,WAAW,CAAC;AAC3I,QAAMC,QAAO,gBAAgB,YAAY;AACvC,UAAM,CAAC,MAAM,aAAa,IAAI,MAAM,QAAQ,IAAI,CAAC,IAAmB,QAAQ,GAAG,IAAiD,gBAAgB,CAAC,CAAC;AAClJ,WAAO,MAAM;AAAE,eAAS,IAAI;AAAG,mBAAa,cAAc,UAAU;AAAG,iBAAW,KAAK;AAAG,eAAS,MAAS;AAAG,kBAAY,QAAM,KAAK,cAAc,KAAK,OAAK,EAAE,OAAO,EAAE,IAAI,KAAK,MAAS;AAAA,IAAE;AAAA,EAC/L,GAAG,YAAU;AAAE,aAAS,aAAa,MAAM,CAAC;AAAG,eAAW,KAAK;AAAA,EAAE,GAAG,CAAC,QAAQ;AAC7E,QAAM,eAAe,MAAM,gBAAgB,CAAC;AAC5C,QAAM,aAAS,wBAAQ,MAAM;AAC3B,UAAM,SAAS,oBAAI,IAAoC;AACvD,eAAW,QAAQ,MAAM,OAAO;AAAE,YAAM,KAAK,KAAK,iBAAiB;AAAU,YAAM,QAAQ,OAAO,IAAI,EAAE,KAAK,CAAC;AAAG,YAAM,KAAK,IAAI;AAAG,aAAO,IAAI,IAAI,KAAK;AAAA,IAAE;AACzJ,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,KAAK,CAAC;AAChB,QAAM,UAAU,aAAa,OAAO,OAAM,EAAE,WAAW,WAAY,YAAY,CAAC,EAAE,OAAO,EAAE,aAAa,UAAU,KAAK,OAAK,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAAE,KAAK,OAAK,GAAG,kBAAkB,EAAE,SAAS,MAAM,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AACtR,QAAM,SAAS,aAAa,KAAK,OAAK,EAAE,OAAO,QAAQ;AACvD,MAAI,SAAU,QAAO,8CAAC,yBAAqC,eAAe,UAAU,MAAM,MAAM;AAAE,gBAAY,MAAS;AAAG,SAAKA,MAAK;AAAA,EAAE,KAArF,QAAwF;AACzI,SAAO,+CAAC,SAAI,WAAU,qCACpB;AAAA,kDAAC,iBAAc,SAAQ,oBAAmB,OAAM,4BAAO,QAAO,gKAA6B,SAAS,+CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,YAAY,IAAI,GAAG;AAAA,oDAAC,uDAAkB,MAAM,IAAI;AAAA,MAAE;AAAA,OAAG,GAAW;AAAA,IACxM,SAAS,+CAAC,mBAAiB;AAAA;AAAA,MAAM,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAAE,aAAKA,MAAK;AAAA,MAAE,GAAG,0BAAE;AAAA,OAAS;AAAA,IACnG,+CAAC,SAAI,WAAU,mCACb;AAAA,oDAAC,SAAI,WAAU,8BAA6B,cAAW,4BAAQ,WAAC,OAAO,IAAI,EAAE,IAAI,WAAS,+CAAC,YAAO,MAAK,UAA6B,gBAAc,aAAa,OAAO,WAAW,aAAa,QAAQ,cAAc,IAAI,SAAS,MAAM;AAAE,oBAAY,KAAK;AAAG,iBAAS,EAAE;AAAA,MAAE,GAAI;AAAA,gBAAQ,uBAAQ;AAAA,QAAM,8CAAC,OAAG,uBAAa,OAAO,OAAM,EAAE,WAAW,WAAY,KAAK,EAAE,QAAO;AAAA,WAApP,OAAO,KAAK,CAA4O,CAAS,GAAE;AAAA,MACxX,+CAAC,WAAM,WAAU,4BAA2B;AAAA,sDAAC,UAAK,WAAU,WAAU,sCAAI;AAAA,QAAO,8CAAC,UAAK,eAAY,QAAO,wDAAC,yDAAoB,MAAM,IAAI,GAAE;AAAA,QAAO,8CAAC,WAAM,aAAY,oDAAW,OAAO,OAAO,UAAU,WAAS;AAAE,mBAAS,MAAM,OAAO,KAAK;AAAG,mBAAS,EAAE;AAAA,QAAE,GAAG;AAAA,SAAE;AAAA,OACrQ;AAAA,IACC,UAAU,8CAAC,sBAAmB,MAAM,GAAG,IAAK,gFAC3C;AAAA,oDAAC,SAAI,WAAU,gCAAgC,kBAAQ,MAAM,GAAG,KAAK,EAAE,IAAI,UAAQ;AACjF,cAAM,QAAQ,OAAO,IAAI,KAAK,EAAE,KAAK,CAAC,GAAG,QAAQ,KAAK,WAAW,SAAU,KAAK,SAAS,UAAU,MAAM,SAAU,MAAM;AACzH,cAAM,OAAO,KAAK,WAAW,SAAS,QAAQ,MAAM,OAAO,OAAK,EAAE,WAAW,MAAM,EAAE;AACrF,cAAM,UAAU,MAAM,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC1D,eAAO,+CAAC,aAAsB,WAAU,gCACtC;AAAA,yDAAC,YAAO,MAAK,UAAS,WAAU,gCAA+B,SAAS,MAAM,KAAK,WAAW,SAAS,YAAY,KAAK,EAAE,IAAI,YAAY,KAAK,EAAE,GAC/I;AAAA,2DAAC,UAAK,WAAU,gCAA+B;AAAA,4DAAC,UAAM,4BAAkB,IAAI,GAAE;AAAA,cAAO,8CAAC,WAAO,oBAAU,KAAK,OAAK,EAAE,OAAO,KAAK,gBAAgB,GAAG,QAAQ,4BAAO;AAAA,eAAQ;AAAA,YACzK,8CAAC,YAAO,OAAO,KAAK,OAAQ,eAAK,OAAM;AAAA,YAAS,8CAAC,OAAG,eAAK,WAAW,KAAK,eAAe,oDAAW;AAAA,YACnG,8CAAC,UAAK,WAAU,oCAAmC,MAAK,eAAc,cAAW,8CAAU,iBAAe,GAAG,iBAAe,KAAK,IAAI,OAAO,CAAC,GAAG,iBAAe,MAAM,wDAAC,OAAE,OAAO,EAAE,OAAO,GAAG,QAAQ,OAAO,QAAQ,MAAM,CAAC,IAAI,GAAG,GAAE;AAAA,YAClO,+CAAC,UAAK,WAAU,gCAA+B;AAAA,6DAAC,WAAO;AAAA;AAAA,gBAAK;AAAA,gBAAI;AAAA,gBAAM;AAAA,gBAAK,UAAU,SAAM,OAAO,kBAAQ;AAAA,iBAAG;AAAA,cAAQ,8CAAC,+DAA0B,MAAM,IAAI;AAAA,eAAE;AAAA,aAC9J;AAAA,UACA,+CAAC,YAAO;AAAA,2DAAC,WAAO;AAAA,kBAAI,KAAK,KAAK,SAAS,EAAE,mBAAmB;AAAA,cAAE;AAAA,eAAG;AAAA,YAAQ,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,YAAY,KAAK,EAAE,GAAG,iBAAc,UAAU,eAAK,YAAY,6BAAS,4BAAO;AAAA,aAAS;AAAA,aAPnL,KAAK,EAQ1B;AAAA,MACF,CAAC,GAAE;AAAA,MACF,CAAC,QAAQ,UAAU,+CAAC,SAAI,WAAU,gCAA+B;AAAA,sDAAC,YAAQ,kBAAQ,+CAAY,WAAW,+CAAY,8CAAU;AAAA,QAAS,8CAAC,OAAG,qBAAW,+IAA4B,sHAAsB;AAAA,SAAI;AAAA,MAC7M,QAAQ,SAAS,SAAS,+CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,SAAS,OAAK,IAAI,EAAE,GAAG;AAAA;AAAA,QAAa,QAAQ,SAAS;AAAA,QAAM;AAAA,SAAE;AAAA,MAC5H,CAAC,YAAY,QAAQ,OAAO,IAAI,QAAQ,GAAG,MAAM,KAAK,+CAAC,YAAO,MAAK,UAAS,WAAU,kCAAiC,SAAS,MAAM,YAAY,QAAQ,GAAG;AAAA;AAAA,QAAO,8CAAC,OAAG,iBAAO,IAAI,QAAQ,EAAG,QAAO;AAAA,QAAI,8CAAC,UAAK,gFAAW;AAAA,QAAO,8CAAC,+DAA0B,MAAM,IAAI;AAAA,SAAE;AAAA,OAC3Q;AAAA,IACC,YAAY,8CAAC,mBAAgB,OAAM,4BAAO,QAAO,wIAAyB,OAAO,MAAM,YAAY,KAAK,GAAG,wDAAC,mBAAgB,WAAsB,OAAO,MAAM,YAAY,KAAK,GAAG,SAAS,OAAO,SAA0B;AAAE,kBAAY,KAAK;AAAG,YAAMA,MAAK;AAAG,kBAAY,KAAK,EAAE;AAAA,IAAE,GAAG,GAAE;AAAA,IAC3R,UAAU,8CAAC,mBAAgB,OAAO,OAAO,OAAO,SAAQ,4BAAO,QAAQ,kBAAkB,MAAM,GAAG,OAAO,MAAM,YAAY,MAAS,GAAG,OAAM,QAAO,wDAAC,qBAAkC,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,EAAE,KAAK,CAAC,GAAG,WAAsB,SAASA,OAAM,OAAO,MAAM,YAAY,MAAS,KAApI,OAAO,EAAgI,GAAE;AAAA,IACrT,iBAAiB,8CAAC,yBAAsB,eAA8B,aAA0B,YAAU,MAAC;AAAA,KAC9G;AACF;;;AM3DA,IAAAC,iBAAiE;AACjE,IAAAC,oCAA+F;AAoB2B,IAAAC,uBAAA;AAhBnH,SAAS,cAAc,EAAE,WAAW,GAAiD;AAC1F,QAAM,CAAC,WAAW,YAAY,QAAI,yBAA8B,CAAC,CAAC;AAClE,QAAM,CAAC,MAAM,OAAO,QAAI,yBAA6B,CAAC,CAAC;AACvD,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AAC9C,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAiB;AACzC,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAMC,YAAO,4BAAY,YAAY;AACnC,QAAI;AAAE,YAAM,QAAQ,MAAM,IAAkE,YAAY;AAAG,mBAAa,MAAM,SAAS;AAAG,cAAQ,MAAM,KAAK,OAAO,UAAQ,KAAK,SAAS,UAAU,EAAE,MAAM,GAAG,EAAE,QAAQ,CAAC;AAAG,eAAS,MAAS;AAAA,IAAE,SAC1O,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,iBAAW,KAAK;AAAA,IAAE;AAAA,EAChF,GAAG,CAAC,CAAC;AACL,gCAAU,MAAM;AAAE,SAAKA,MAAK;AAAA,EAAE,GAAG,CAACA,KAAI,CAAC;AACvC,QAAM,SAAS,OAAO,OAA0B,UAAkD;AAAE,YAAQ,MAAM,EAAE;AAAG,QAAI;AAAE,YAAM,IAAI,cAAc,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,KAAK,EAAE,CAAC;AAAG,YAAMA,MAAK;AAAA,IAAE,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EAAE;AAClT,QAAM,MAAM,OAAO,UAA4C;AAAE,YAAQ,MAAM,EAAE;AAAG,QAAI;AAAE,YAAM,IAAI,cAAc,MAAM,EAAE,YAAY,EAAE,QAAQ,OAAO,CAAC;AAAG,YAAMA,MAAK;AAAA,IAAE,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EAAE;AAC3P,QAAM,SAAS,OAAO,UAA4C;AAAE,YAAQ,MAAM,EAAE;AAAG,QAAI;AAAE,YAAM,IAAI,cAAc,MAAM,EAAE,IAAI,EAAE,QAAQ,SAAS,CAAC;AAAG,YAAMA,MAAK;AAAA,IAAE,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EAAE;AACxP,SAAO,+CAAC,SAAI,WAAU,4BACpB;AAAA,kDAAC,iBAAc,SAAQ,wBAAuB,OAAM,wCAAS,QAAO,wOAAyC,SAAS,gFAAE;AAAA,qDAAC,YAAO,MAAK,UAAS,UAAU,SAAS,SAAS,MAAM;AAAE,aAAKA,MAAK;AAAA,MAAE,GAAG;AAAA,sDAAC,0DAAqB,MAAM,IAAI;AAAA,QAAE;AAAA,SAAE;AAAA,MAAS,+CAAC,YAAO,MAAK,UAAS,UAAU,WAAW,WAAW,GAAG,SAAS,MAAM,YAAY,IAAI,GAAG;AAAA,sDAAC,uDAAkB,MAAM,IAAI;AAAA,QAAE;AAAA,SAAG;AAAA,OAAS,GAAK;AAAA,IACxX,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,IACjC,YAAY,8CAAC,mBAAgB,OAAM,wCAAS,QAAO,4NAAuC,OAAO,MAAM,YAAY,KAAK,GAAG,OAAM,QAAO,wDAAC,gBAAa,YAAwB,OAAO,MAAM,YAAY,KAAK,GAAG,SAASA,OAAM,GAAE;AAAA,IACjO,8CAAC,kBAAe,OAAM,4BAAO,QAAQ,GAAG,UAAU,OAAO,UAAQ,KAAK,OAAO,EAAE,MAAM,uBAClF,oBAAU,8CAAC,sBAAmB,MAAM,GAAG,IAAK,UAAU,WAAW,IAAI,8CAAC,mBAAgB,OAAM,8CAAU,QAAO,kIAAwB,QAAQ,+CAAC,YAAO,MAAK,UAAS,UAAU,WAAW,WAAW,GAAG,SAAS,MAAM,YAAY,IAAI,GAAG;AAAA,oDAAC,uDAAkB,MAAM,IAAI;AAAA,MAAE;AAAA,OAAO,GAAW,IAAK,8CAAC,SAAI,WAAU,6BAA6B,oBAAU,IAAI,WAAS,+CAAC,aAAuB;AAAA,qDAAC,UAAK;AAAA,sDAAC,YAAQ,gBAAM,OAAM;AAAA,QAAS,8CAAC,OAAG,gBAAM,QAAO;AAAA,QAAI,+CAAC,UAAK,WAAU,6BAA4B;AAAA,yDAAC,QAAG;AAAA;AAAA,YAAE,cAAc,YAAY,MAAM,WAAW;AAAA,aAAE;AAAA,UAAK,8CAAC,QAAI,wBAAc,KAAK,GAAE;AAAA,UAAK,+CAAC,QAAG;AAAA;AAAA,YAAI,IAAI,KAAK,MAAM,SAAS,EAAE,eAAe;AAAA,aAAE;AAAA,UAAK,8CAAC,QAAI,gBAAM,yBAAyB,mCAAU,4BAAO;AAAA,WAAK;AAAA,SAAO;AAAA,MAAO,8CAAC,YAAO,MAAK,UAAS,WAAU,8BAA6B,WAAS,MAAM,SAAS,gBAAc,MAAM,SAAS,UAAU,SAAS,MAAM,IAAI,SAAS,MAAM;AAAE,aAAK,OAAO,OAAO,EAAE,SAAS,CAAC,MAAM,QAAQ,CAAC;AAAA,MAAE,GAAG,wDAAC,OAAE,GAAE;AAAA,MAAS,+CAAC,YAAO,MAAK,UAAS,UAAU,SAAS,MAAM,IAAI,SAAS,MAAM;AAAE,aAAK,IAAI,KAAK;AAAA,MAAE,GAAG;AAAA,sDAAC,uDAAkB,MAAM,IAAI;AAAA,QAAG,SAAS,MAAM,KAAK,6BAAS;AAAA,SAAO;AAAA,MAAS,8CAAC,YAAO,MAAK,UAAS,WAAU,WAAU,UAAU,SAAS,MAAM,IAAI,SAAS,MAAM;AAAE,aAAK,OAAO,KAAK;AAAA,MAAE,GAAG,cAAY,gBAAM,MAAM,KAAK,IAAI,wDAAC,wDAAmB,MAAM,IAAI,GAAE;AAAA,SAA13B,MAAM,EAA63B,CAAU,GAAE,GACjwC;AAAA,IACA,+CAAC,kBAAe,OAAM,4BAAO,QAAO,4EAAe;AAAA,oDAAC,SAAI,WAAU,wBAAwB,eAAK,IAAI,CAAAC,SAAO,+CAAC,aAAqB,eAAaA,KAAI,QAAQ;AAAA,sDAAC,OAAE;AAAA,QAAE,+CAAC,UAAK;AAAA,yDAAC,YAAQ;AAAA,sBAAU,KAAK,UAAQ,KAAK,OAAOA,KAAI,QAAQ,GAAG,SAAS;AAAA,YAAQ;AAAA,YAAK,cAAc,YAAYA,KAAI,gBAAgB;AAAA,aAAE;AAAA,UAAS,8CAAC,OAAG,UAAAA,KAAI,SAASA,KAAI,iBAAiB,4BAAO;AAAA,UAAI,+CAAC,WAAO;AAAA,gBAAI,KAAKA,KAAI,SAAS,EAAE,eAAe;AAAA,YAAE;AAAA,YAAIA,KAAI;AAAA,YAAO;AAAA,YAAIA,KAAI,kBAAkB,mCAAU;AAAA,aAAO;AAAA,WAAQ;AAAA,WAA1VA,KAAI,EAA6V,CAAU,GAAE;AAAA,MAAO,CAAC,WAAW,KAAK,WAAW,KAAK,8CAAC,mBAAgB,OAAM,8CAAU,QAAO,kIAAwB;AAAA,OAAG;AAAA,KACllB;AACF;AAEA,SAAS,aAAa,EAAE,YAAY,OAAO,SAAAC,SAAQ,GAA0F;AAC3I,QAAM,CAAC,MAAM,OAAO,QAAI,yBAA+B,UAAU;AACjE,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,SAAS,OAAO,UAAqD;AACzE,UAAM,eAAe;AAAG,UAAM,OAAO,IAAI,SAAS,MAAM,aAAa;AACrE,UAAM,WAAW,SAAS,aAAa,EAAE,MAAM,SAAS,OAAO,KAAK,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,MAAM,OAAO,KAAK,IAAI,MAAM,CAAC,GAAG,QAAQ,OAAO,KAAK,IAAI,QAAQ,CAAC,EAAE;AACnK,YAAQ,IAAI;AAAG,aAAS,MAAS;AACjC,QAAI;AACF,YAAM,IAAI,cAAc,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,aAAa,KAAK,IAAI,aAAa,GAAG,OAAO,KAAK,IAAI,OAAO,GAAG,QAAQ,KAAK,IAAI,QAAQ,GAAG,UAAU,SAAS,MAAM,wBAAwB,KAAK,IAAI,QAAQ,MAAM,MAAM,eAAe,KAAK,IAAI,eAAe,GAAG,gBAAgB,OAAO,KAAK,IAAI,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5U,YAAMA,SAAQ;AAAG,YAAM;AAAA,IACzB,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,KAAK;AAAA,IAAE;AAAA,EAC/E;AACA,SAAO,+CAAC,UAAK,WAAU,6BAA4B,aAAW,MAAM,UAAU,WAAS;AAAE,SAAK,OAAO,KAAK;AAAA,EAAE,GAAG;AAAA,mDAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,WAAM,MAAK,SAAQ,UAAQ,MAAC,WAAW,KAAK,WAAS,MAAC,aAAY,sEAAc;AAAA,OAAE;AAAA,IAAQ,+CAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,+CAAC,YAAO,MAAK,eAAc,UAAQ,MAAC,cAAc,WAAW,CAAC,GAAG,MAAM,IAAI;AAAA,sDAAC,YAAO,OAAM,IAAG,UAAQ,MAAC,sCAAI;AAAA,QAAU,WAAW,IAAI,eAAa,+CAAC,YAA0B,OAAO,UAAU,IAAI;AAAA;AAAA,UAAE,UAAU;AAAA,UAAK;AAAA,UAAI,UAAU;AAAA,aAAlE,UAAU,EAA6D,CAAS;AAAA,SAAE;AAAA,OAAS;AAAA,IAAQ,+CAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,cAAS,MAAK,UAAS,UAAQ,MAAC,WAAW,MAAO,MAAM,GAAG,aAAY,gKAA6B;AAAA,OAAE;AAAA,IAAQ,+CAAC,WAAM;AAAA,oDAAC,UAAK,0BAAE;AAAA,MAAO,+CAAC,YAAO,OAAO,MAAM,UAAU,WAAS,QAAQ,MAAM,OAAO,KAA6B,GAAG;AAAA,sDAAC,YAAO,OAAM,YAAW,kDAAM;AAAA,QAAS,8CAAC,YAAO,OAAM,SAAQ,kDAAM;AAAA,SAAS;AAAA,OAAS;AAAA,IAAS,SAAS,aAAa,+CAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,WAAM,MAAK,WAAU,MAAK,UAAS,KAAK,GAAG,KAAK,OAAO,cAAc,IAAI;AAAA,OAAE,IAAW,+CAAC,SAAI,WAAU,6BAA4B;AAAA,qDAAC,WAAM;AAAA,sDAAC,UAAK,0BAAE;AAAA,QAAO,8CAAC,WAAM,MAAK,QAAO,MAAK,UAAS,KAAK,GAAG,KAAK,IAAI,cAAc,GAAG;AAAA,SAAE;AAAA,MAAQ,+CAAC,WAAM;AAAA,sDAAC,UAAK,0BAAE;AAAA,QAAO,8CAAC,WAAM,MAAK,UAAS,MAAK,UAAS,KAAK,GAAG,KAAK,IAAI,cAAc,GAAG;AAAA,SAAE;AAAA,OAAQ;AAAA,IAAO,+CAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,+CAAC,YAAO,MAAK,iBAAgB,cAAa,QAAO;AAAA,sDAAC,YAAO,OAAM,QAAO,sCAAI;AAAA,QAAS,8CAAC,YAAO,OAAM,SAAQ,sCAAI;AAAA,SAAS;AAAA,OAAS;AAAA,IAAQ,+CAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,WAAM,MAAK,kBAAiB,MAAK,UAAS,KAAK,GAAG,KAAK,KAAK,cAAc,IAAI;AAAA,OAAE;AAAA,IAAQ,+CAAC,WAAM,WAAU,6BAA4B;AAAA,oDAAC,WAAM,MAAK,UAAS,MAAK,YAAW;AAAA,MAAE,8CAAC,OAAE;AAAA,MAAE,8CAAC,UAAK,oEAAS;AAAA,OAAO;AAAA,IAAS,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,IAAmB,+CAAC,YAAO;AAAA,oDAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,OAAO,0BAAE;AAAA,MAAS,+CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,MAAM;AAAA,sDAAC,uDAAkB,MAAM,IAAI;AAAA,QAAG,OAAO,6BAAS;AAAA,SAAO;AAAA,OAAS;AAAA,KAAS;AACl3D;AACA,SAAS,cAAc,OAAkC;AAAE,SAAO,MAAM,SAAS,SAAS,aAAa,UAAK,MAAM,SAAS,OAAO,kBAAQ,gBAAM,OAAO,MAAM,SAAS,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,MAAM,SAAS,MAAM,EAAE,SAAS,GAAG,GAAG,CAAC;AAAG;AACjP,SAAS,cAAc,YAA6B,IAAoB;AAAE,SAAO,WAAW,KAAK,UAAQ,KAAK,OAAO,EAAE,GAAG,QAAQ;AAAQ;;;AC/C1I,IAAAC,iBAA4C;AAC5C,IAAAC,oCAAmC;;;ACD5B,IAAM,yBAAyB,CAAC,aAAa,UAAU,OAAO,OAAO,cAAc,aAAa,UAAU,gBAAgB;AAG1H,IAAM,oBAAyD;AAAA,EACpE,WAAW;AAAA,EAAO,QAAQ;AAAA,EAAS,KAAK;AAAA,EAAO,KAAK;AAAA,EAAO,YAAY;AAAA,EACvE,WAAW;AAAA,EAAQ,QAAQ;AAAA,EAAQ,gBAAgB;AACrD;AAEO,SAAS,sBAAsB,OAA6C;AACjF,SAAQ,uBAA6C,SAAS,KAAK;AACrE;;;ACVA,IAAAC,iBAAiD;AACjD,IAAAC,oCAAmC;AA2BvB,IAAAC,uBAAA;AAtBL,SAAS,qBAAqB,EAAE,YAAY,GAAyC;AAC1F,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAA8B,EAAE,WAAW,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;AAC3F,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAiB;AACzC,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAMC,YAAO,4BAAY,YAAY;AACnC,QAAI;AAAE,gBAAU,MAAM,IAAyB,eAAe,mBAAmB,WAAW,CAAC,SAAS,CAAC;AAAG,eAAS,MAAS;AAAA,IAAE,SACvH,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE;AAAA,EAClD,GAAG,CAAC,WAAW,CAAC;AAChB,gCAAU,MAAM;AAAE,SAAKA,MAAK;AAAA,EAAE,GAAG,CAACA,KAAI,CAAC;AAEvC,QAAM,SAAS,OAAO,aAAoC;AACxD,UAAM,WAAW,OAAO;AACxB,UAAM,YAAY,SAAS,SAAS,QAAQ,IAAI,SAAS,OAAO,QAAM,OAAO,QAAQ,IAAI,CAAC,GAAG,UAAU,QAAQ;AAC/G,YAAQ,QAAQ;AAAG,cAAU,CAAAC,cAAY,EAAE,GAAGA,UAAS,UAAU,EAAE;AAAG,aAAS,MAAS;AACxF,QAAI;AACF,YAAM,SAAS,MAAM,IAA6B,eAAe,mBAAmB,WAAW,CAAC,WAAW,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;AACjK,gBAAU,CAAAA,cAAY,EAAE,GAAGA,UAAS,WAAW,OAAO,UAAU,EAAE;AAAA,IACpE,SAAS,QAAQ;AAAE,gBAAU,CAAAA,cAAY,EAAE,GAAGA,UAAS,WAAW,SAAS,EAAE;AAAG,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAC/G;AAAU,cAAQ,MAAS;AAAA,IAAE;AAAA,EAC/B;AAEA,SAAO,+CAAC,aAAQ,WAAU,oDAAmD,mBAAgB,4BAC3F;AAAA,mDAAC,YAAO;AAAA,qDAAC,UAAK;AAAA,sDAAC,WAAM,6BAAe;AAAA,QAAQ,8CAAC,YAAO,IAAG,4BAA2B,kDAAM;AAAA,SAAS;AAAA,MAAO,+CAAC,QAAI;AAAA,eAAO,UAAU;AAAA,QAAO;AAAA,SAAK;AAAA,OAAK;AAAA,IAC/I,8CAAC,OAAE,WAAU,2BAA0B,2aAAyE;AAAA,IAC/G,OAAO,WAAW,WAAW,IAAI,8CAAC,mBAAgB,OAAM,0DAAY,QAAO,8IAA0B,IAAK,8CAAC,SAAI,WAAU,2BAA2B,iBAAO,WAAW,IAAI,eAAa;AACtL,YAAM,WAAW,OAAO,UAAU,SAAS,UAAU,EAAE;AACvD,YAAM,YAAY,UAAU,aAAa,IAAI,gBAAc,sBAAsB,UAAU,IAAI,kBAAkB,UAAU,IAAI,UAAU;AACzI,aAAO,+CAAC,YAAO,MAAK,UAA4B,WAAW,WAAW,cAAc,IAAI,gBAAc,UAAU,UAAU,SAAS,UAAU,IAAI,SAAS,MAAM;AAAE,aAAK,OAAO,UAAU,EAAE;AAAA,MAAE,GAC1L;AAAA,sDAAC,UAAK,WAAU,6BAA4B,eAAY,QAAQ,mBAAS,UAAU,IAAI,GAAE;AAAA,QACzF,+CAAC,UAAK,WAAU,2BAA0B;AAAA,yDAAC,YAAO;AAAA;AAAA,YAAE,UAAU;AAAA,aAAK;AAAA,UAAS,8CAAC,WAAO,oBAAU,MAAK;AAAA,UAAQ,8CAAC,OAAG,oBAAU,eAAe,8CAAU;AAAA,UAAI,8CAAC,UAAM,WAAC,GAAG,WAAW,GAAG,UAAU,cAAc,IAAI,WAAS,MAAM,IAAI,CAAC,EAAE,IAAI,UAAQ,8CAAC,QAAe,kBAAP,IAAY,CAAK,GAAE;AAAA,WAAO;AAAA,QAChR,8CAAC,UAAK,WAAU,4BAA2B,eAAY,QAAQ,sBAAY,8CAAC,wDAAmB,MAAM,IAAI,GAAG;AAAA,WAH5E,UAAU,EAI5C;AAAA,IACF,CAAC,GAAE;AAAA,IACF,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,KACpC;AACF;AAEA,SAAS,SAAS,MAAsB;AAAE,SAAO,CAAC,GAAG,KAAK,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,KAAK;AAAK;;;ACzCtG,SAAS,eAAe,WAAoL;AAAE,SAAO,EAAE,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,aAAa,UAAU,aAAa,cAAc,UAAU,cAAc,UAAU,UAAU,YAAY,IAAI,UAAU,UAAU,YAAY,IAAI,OAAO,UAAU,SAAS,IAAI,cAAc,CAAC,GAAG,UAAU,YAAY,EAAE;AAAE;;;AHqD3a,IAAAC,uBAAA;AA7CpD,SAAS,iBAAiB,EAAE,WAAW,SAAS,UAAU,GAA+G;AAC9K,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,MAAM,eAAe,SAAS,CAAC;AAChE,QAAM,CAAC,cAAc,eAAe,QAAI,yBAA2B;AACnE,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,KAAK;AAC1C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,KAAK;AACxC,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,gBAAY,uBAAO,KAAK;AAC9B,QAAM,cAAU,uBAAO,IAAI;AAC3B,gCAAU,MAAM;AAAE,YAAQ,UAAU;AAAM,WAAO,MAAM;AAAE,cAAQ,UAAU;AAAA,IAAM;AAAA,EAAE,GAAG,CAAC,CAAC;AACxF,gCAAU,MAAM;AAAE,QAAI,CAAC,UAAU,QAAS,SAAQ,eAAe,SAAS,CAAC;AAAA,EAAE,GAAG,CAAC,UAAU,IAAI,UAAU,SAAS,CAAC;AACnH,gCAAU,MAAM;AAAE,SAAK,IAAsB,SAAS,EAAE,KAAK,WAAS;AAAE,UAAI,QAAQ,QAAS,iBAAgB,KAAK;AAAA,IAAE,CAAC,EAAE,MAAM,YAAU;AAAE,UAAI,QAAQ,QAAS,UAAS,aAAQ,MAAM,CAAC;AAAA,IAAE,CAAC;AAAA,EAAE,GAAG,CAAC,CAAC;AAChM,QAAM,OAAO,CAAC,SAA4B;AAAE,QAAI,UAAU,QAAS;AAAQ,YAAQ,IAAI;AAAG,aAAS,KAAK;AAAG,aAAS,MAAS;AAAA,EAAE;AAC/H,QAAM,SAAS,CAAC,eAAiC,KAAK,EAAE,GAAG,MAAM,cAAc,KAAK,aAAa,SAAS,UAAU,IAAI,KAAK,aAAa,OAAO,UAAQ,SAAS,UAAU,IAAI,CAAC,GAAG,KAAK,cAAc,UAAU,EAAE,CAAC;AACpN,QAAM,OAAO,YAA2B;AACtC,QAAI,UAAU,QAAS;AACvB,cAAU,UAAU;AACpB,cAAU,IAAI;AAAG,aAAS,KAAK;AAAG,aAAS,MAAS;AACpD,QAAI;AACF,YAAM,IAAI,eAAe,UAAU,EAAE,IAAI,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC,EAAE,CAAC;AACrG,UAAI,CAAC,QAAQ,QAAS;AACtB,eAAS,IAAI;AACb,UAAI;AAAE,cAAM,UAAU;AAAA,MAAE,QAClB;AAAE,YAAI,QAAQ,QAAS,UAAS,0KAA8B;AAAA,MAAE;AAAA,IACxE,SAAS,QAAQ;AAAE,UAAI,QAAQ,QAAS,UAAS,iCAAQ,aAAQ,MAAM,CAAC,gFAAe;AAAA,IAAE,UACzF;AAAU,gBAAU,UAAU;AAAO,UAAI,QAAQ,QAAS,WAAU,KAAK;AAAA,IAAE;AAAA,EAC7E;AACA,QAAM,SAAmJ;AAAA,IACvJ,EAAE,IAAI,SAAS,SAAS,SAAS,OAAO,4BAAQ,QAAQ,oGAAoB,SAAS;AAAA,MACnF,EAAE,IAAI,aAAa,OAAO,sBAAO,QAAQ,6FAAkB;AAAA,MAC3D,EAAE,IAAI,UAAU,OAAO,SAAS,QAAQ,wFAAuB;AAAA,MAC/D,EAAE,IAAI,OAAO,OAAO,OAAO,QAAQ,sFAAqB;AAAA,MACxD,EAAE,IAAI,OAAO,OAAO,OAAO,QAAQ,kGAAuB;AAAA,IAC5D,EAAE;AAAA,IACF,EAAE,IAAI,gBAAgB,SAAS,gBAAgB,OAAO,wCAAU,QAAQ,sHAAuB,SAAS;AAAA,MACtG,EAAE,IAAI,cAAc,OAAO,4BAAQ,QAAQ,yGAAoB;AAAA,MAC/D,EAAE,IAAI,UAAU,OAAO,4BAAQ,QAAQ,qHAAsB;AAAA,MAC7D,EAAE,IAAI,aAAa,OAAO,4BAAQ,QAAQ,mGAAmB;AAAA,IAC/D,EAAE;AAAA,IACF,EAAE,IAAI,kBAAkB,SAAS,kBAAkB,OAAO,kCAAS,QAAQ,0JAA6B,SAAS;AAAA,MAC/G,EAAE,IAAI,kBAAkB,OAAO,kBAAkB,gBAAgB,QAAQ,0SAA+D;AAAA,IAC1I,EAAE;AAAA,EACJ;AACA,QAAM,mBAAmB,KAAK,YAAY,cAAc,iBAAiB,YAAY;AACrF,QAAM,eAAe,cAAc,UAAU,KAAK,UAAQ,KAAK,OAAO,gBAAgB,GAAG,UAAU,CAAC;AACpG,QAAM,sBAAsB,QAAQ,KAAK,KAAK,KAAK,CAAC,aAAa,KAAK,UAAQ,KAAK,OAAO,KAAK,KAAK;AACpG,SAAO,+CAAC,SAAI,WAAU,oCAAmC;AAAA,kDAAC,kBAAQ,SAAQ,eAAc,OAAM,4BAAO,QAAO,6NAAkD;AAAA,IAC5J,+CAAC,SAAI,WAAU,8BAA6B;AAAA,oDAAC,aAAM,OAAM,gBAAe,MAAK,0DAAiB,yDAAC,YAAO,UAAU,QAAQ,OAAO,KAAK,UAAU,UAAU,WAAS,KAAK,EAAE,GAAG,MAAM,UAAU,MAAM,OAAO,MAAM,CAAC,GAAG;AAAA,sDAAC,YAAO,OAAM,IAAG,kDAAgB;AAAA,QAAU,QAAQ,OAAO,UAAQ,CAAC,KAAK,MAAM,EAAE,IAAI,UAAQ,8CAAC,YAAO,OAAO,KAAK,IAAmB,eAAK,QAAf,KAAK,EAAe,CAAS;AAAA,SAAE,GAAS;AAAA,MAAQ,8CAAC,aAAM,OAAM,kCAAQ,MAAK,8CAAU,yDAAC,YAAO,UAAU,QAAQ,OAAO,KAAK,UAAU,UAAU,WAAS,KAAK,EAAE,GAAG,MAAM,UAAU,MAAM,OAAO,OAAO,OAAO,GAAG,CAAC,GAAG;AAAA,uDAAC,YAAO,OAAM,IAAG;AAAA;AAAA,UAAa,cAAc,iBAAiB,YAAY;AAAA,WAAO;AAAA,QAAU,cAAc,UAAU,IAAI,cAAY,8CAAC,YAAO,OAAO,SAAS,IAAuB,mBAAS,QAAQ,SAAS,MAAxC,SAAS,EAAkC,CAAS;AAAA,SAAE,GAAS;AAAA,MAAQ,8CAAC,aAAM,OAAM,gBAAK,MAAK,wCAAS,yDAAC,YAAO,UAAU,QAAQ,OAAO,KAAK,OAAO,UAAU,WAAS,KAAK,EAAE,GAAG,MAAM,OAAO,MAAM,OAAO,MAAM,CAAC,GAAG;AAAA,uDAAC,YAAO,OAAM,IAAG;AAAA;AAAA,UAAa,cAAc,iBAAiB,SAAS;AAAA,WAAO;AAAA,QAAU,uBAAuB,+CAAC,YAAO,OAAO,KAAK,OAAO;AAAA;AAAA,UAAQ,KAAK;AAAA,WAAM;AAAA,QAAW,aAAa,IAAI,WAAS,8CAAC,YAAO,OAAO,MAAM,IAAoB,gBAAM,QAAQ,MAAM,MAA/B,MAAM,EAA4B,CAAS;AAAA,SAAE,GAAS;AAAA,OAAQ;AAAA,IACnrC,8CAAC,OAAE,WAAU,2BAA0B,yPAA6C;AAAA,IACpF,8CAAC,SAAI,WAAU,iCAAiC,iBAAO,IAAI,WAAS;AAClE,YAAM,UAAU,MAAM,QAAQ,OAAO,YAAU,KAAK,aAAa,SAAS,OAAO,EAAE,CAAC,EAAE;AACtF,aAAO,+CAAC,aAAQ,WAAU,gCAA8C,mBAAiB,sBAAsB,MAAM,EAAE,IAAI;AAAA,uDAAC,YAAO;AAAA,yDAAC,UAAK;AAAA,0DAAC,WAAO,gBAAM,SAAQ;AAAA,YAAQ,8CAAC,YAAO,IAAI,sBAAsB,MAAM,EAAE,IAAK,gBAAM,OAAM;AAAA,YAAS,8CAAC,OAAG,gBAAM,QAAO;AAAA,aAAI;AAAA,UAAO,+CAAC,QAAI;AAAA;AAAA,YAAQ;AAAA,YAAI,MAAM,QAAQ;AAAA,YAAO;AAAA,aAAI;AAAA,WAAK;AAAA,QAAS,8CAAC,SAAI,WAAU,4BAA4B,gBAAM,QAAQ,IAAI,YAAU;AACpY,gBAAMC,UAAS,KAAK,aAAa,SAAS,OAAO,EAAE;AACnD,iBAAO,+CAAC,YAAO,MAAK,UAAyB,UAAU,QAAQ,WAAWA,UAAS,cAAc,IAAI,gBAAcA,SAAQ,SAAS,MAAM,OAAO,OAAO,EAAE,GAAG;AAAA,0DAAC,UAAM,UAAAA,WAAU,8CAAC,wDAAmB,MAAM,IAAI,GAAG;AAAA,YAAO,8CAAC,YAAQ,iBAAO,OAAM;AAAA,YAAS,8CAAC,WAAO,iBAAO,QAAO;AAAA,eAAzO,OAAO,EAA0O;AAAA,QACrR,CAAC,GAAE;AAAA,WAH2D,MAAM,EAG3D;AAAA,IACX,CAAC,GAAE;AAAA,IACF,KAAK,aAAa,SAAS,QAAQ,KAAK,UAAU,aAAa,SAAS,QAAQ,KAAK,8CAAC,0BAAuB,aAAa,UAAU,IAAI;AAAA,IACxI,KAAK,aAAa,SAAS,QAAQ,KAAK,CAAC,UAAU,aAAa,SAAS,QAAQ,KAAK,8CAAC,OAAE,WAAU,2BAA0B,sIAAyB;AAAA,IACvJ,8CAAC,wBAAqB,aAAa,UAAU,IAAI;AAAA,IAChD,SAAS,8CAAC,OAAE,WAAU,4BAA2B,MAAK,SAAS,iBAAM;AAAA,IAAK,+CAAC,SAAI,WAAU,+CAA8C;AAAA,oDAAC,UAAK,MAAK,UAAS,aAAU,UAAS,eAAY,QAAQ,mBAAS,gFAAE;AAAA,sDAAC,wDAAmB,MAAM,IAAI;AAAA,QAAE,8CAAC,UAAK,oEAAS;AAAA,SAAO,GAAI;AAAA,MAAO,8CAAC,YAAO,MAAK,UAAS,UAAU,QAAQ,aAAW,QAAQ,SAAS,MAAM;AAAE,aAAK,KAAK;AAAA,MAAE,GAAI,mBAAS,mCAAU,wCAAS;AAAA,OAAS;AAAA,KAClZ;AACF;;;AItEA,IAAAC,iBAA4D;AAC5D,IAAAC,oCAAuD;AAcY,IAAAC,uBAAA;AAA5D,SAAS,eAAe,OAA2B;AAAE,SAAO,8CAAC,sBAA6C,GAAG,SAAxB,MAAM,UAAU,EAAe;AAAG;AAE9H,SAAS,mBAAmB,EAAE,WAAW,OAAO,WAAW,UAAU,GAAuB;AAC1F,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,MAAM,eAAe,SAAS,CAAC;AAChE,QAAM,CAAC,WAAW,YAAY,QAAI,yBAA4B;AAC9D,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,KAAK;AACxC,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAiB;AAC7D,QAAM,aAAS,uBAAO,KAAK;AAC3B,QAAM,YAAQ,uBAAO,IAAI;AACzB,gCAAU,MAAM;AAAE,UAAM,UAAU;AAAM,WAAO,MAAM;AAAE,YAAM,UAAU;AAAA,IAAM;AAAA,EAAE,GAAG,CAAC,CAAC;AACpF,gCAAU,MAAM;AAAE,YAAQ,eAAe,SAAS,CAAC;AAAG,aAAS,KAAK;AAAG,sBAAkB,MAAS;AAAA,EAAE,GAAG,CAAC,UAAU,SAAS,CAAC;AAC5H,QAAM,aAAa,mBAAmB,UAAU;AAChD,QAAM,OAAO,cAAc,UAAa;AACxC,QAAM,SAAS,OAAO,UAAoC;AACxD,UAAM,eAAe;AACrB,QAAI,OAAO,WAAW,QAAS;AAC/B,WAAO,UAAU;AAAM,iBAAa,MAAM;AAAG,aAAS,MAAS;AAAG,sBAAkB,MAAS;AAC7F,QAAI,YAAY;AAChB,QAAI;AACF,YAAM,IAAI,eAAe,mBAAmB,UAAU,EAAE,CAAC,IAAI,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC,EAAE,CAAC;AACzH,kBAAY;AACZ,YAAM,UAAU;AAChB,UAAI,MAAM,QAAS,UAAS,IAAI;AAAA,IAClC,SAAS,QAAQ;AACf,UAAI,MAAM,QAAS,UAAS,GAAG,YAAY,uHAAwB,gCAAO,GAAG,aAAa,MAAM,CAAC,EAAE;AAAA,IACrG,UAAE;AAAU,aAAO,UAAU;AAAO,UAAI,MAAM,QAAS,cAAa,MAAS;AAAA,IAAE;AAAA,EACjF;AACA,QAAM,SAAS,YAA2B;AACxC,QAAI,OAAO,WAAW,WAAW,CAAC,cAAc,SAAS,EAAG;AAC5D,UAAM,WAAW;AACjB,WAAO,UAAU;AAAM,iBAAa,QAAQ;AAAG,aAAS,MAAS;AAAG,sBAAkB,MAAS;AAC/F,QAAI,YAAY;AAChB,QAAI;AACF,YAAM,IAAI,eAAe,mBAAmB,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,SAAS,CAAC;AAC3F,kBAAY;AACZ,UAAI,MAAM,QAAS,YAAW,IAAI;AAElC,YAAM,UAAU,QAAQ;AAAA,IAC1B,SAAS,QAAQ;AACf,UAAI,MAAM,QAAS,UAAS,GAAG,YAAY,uKAAgC,gCAAO,GAAG,aAAa,MAAM,CAAC,EAAE;AAAA,IAC7G,UAAE;AAAU,aAAO,UAAU;AAAO,UAAI,MAAM,QAAS,cAAa,MAAS;AAAA,IAAE;AAAA,EACjF;AACA,SAAO,+CAAC,UAAK,IAAG,+BAA8B,WAAU,gCAA+B,aAAW,cAAc,QAAW,UAAU,WAAS;AAAE,SAAK,OAAO,KAAK;AAAA,EAAE,GACjK;AAAA,kDAAC,kBAAQ,SAAQ,YAAW,OAAM,4BAAO,QAAO,0MAAoC;AAAA,IACpF,+CAAC,aAAQ,WAAU,6BAA4B,cAAW,4BAC1D;AAAA,qDAAC,SAAI,WAAU,0BAAyB;AAAA,sDAAC,aAAM,OAAM,gBAAK,wDAAC,WAAM,UAAU,MAAM,UAAQ,MAAC,WAAW,IAAI,OAAO,KAAK,MAAM,UAAU,WAAS,QAAQ,EAAE,GAAG,MAAM,MAAM,MAAM,OAAO,MAAM,CAAC,GAAG,GAAE;AAAA,QAAQ,8CAAC,aAAM,OAAM,gBAAK,wDAAC,WAAM,UAAU,MAAM,UAAQ,MAAC,WAAW,KAAK,OAAO,KAAK,MAAM,UAAU,WAAS,QAAQ,EAAE,GAAG,MAAM,MAAM,MAAM,OAAO,MAAM,CAAC,GAAG,GAAE;AAAA,SAAQ;AAAA,MACzW,8CAAC,aAAM,OAAM,kCAAQ,MAAK,gHAAqB,wDAAC,cAAS,UAAU,MAAM,MAAM,GAAG,WAAW,KAAK,OAAO,KAAK,aAAa,UAAU,WAAS,QAAQ,EAAE,GAAG,MAAM,aAAa,MAAM,OAAO,MAAM,CAAC,GAAG,GAAE;AAAA,MACvM,8CAAC,aAAM,OAAM,wCAAS,MAAK,wLAAiC,wDAAC,cAAS,UAAU,MAAM,MAAM,GAAG,WAAW,MAAO,OAAO,KAAK,cAAc,UAAU,WAAS,QAAQ,EAAE,GAAG,MAAM,cAAc,MAAM,OAAO,MAAM,CAAC,GAAG,GAAE;AAAA,MACvN,SAAS,8CAAC,OAAE,WAAU,4BAA2B,MAAK,SAAS,iBAAM;AAAA,MACtE,+CAAC,SAAI,WAAU,4BAA2B;AAAA,sDAAC,UAAK,MAAK,UAAU,mBAAS,gFAAE;AAAA,wDAAC,wDAAmB,MAAM,IAAI;AAAA,UAAE;AAAA,WAAa,GAAI;AAAA,QAAO,8CAAC,YAAO,UAAU,MAAO,wBAAc,SAAS,mCAAU,4BAAO;AAAA,SAAS;AAAA,OAC5M;AAAA,IACA,+CAAC,SAAI,WAAU,+BAA8B,mBAAiB,YAC5D;AAAA,qDAAC,UAAK;AAAA,sDAAC,YAAQ,oBAAU,mCAAU,aAAa,iCAAQ,UAAU,IAAI,iBAAO,4BAAO;AAAA,QAAS,8CAAC,WAAO,uBAAa,uaAA8E,wOAAyC;AAAA,SAAQ;AAAA,MACjP,+CAAC,SAAK;AAAA,sBAAc,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,WAAU,gBAAe,SAAS,MAAM,kBAAkB,MAAS,GAAG,0BAAE;AAAA,QAAU,+CAAC,YAAO,MAAK,UAAS,WAAW,aAAa,cAAc,IAAI,UAAU,QAAQ,SAAS,GAAG,SAAS,MAAM,aAAa,KAAK,OAAO,IAAI,kBAAkB,UAAU,EAAE,GAAG;AAAA,wDAAC,wDAAmB,MAAM,IAAI;AAAA,UAAG,cAAc,WAAW,mCAAU,UAAU,uBAAQ,aAAa,6BAAS;AAAA,WAAK;AAAA,SAAS;AAAA,OACnb;AAAA,KACF;AACF;;;ACzEA,IAAAC,iBAAuD;;;ACAvD,IAAAC,iBAA0C;AAoBO,IAAAC,uBAAA;AAhB1C,SAAS,qBAAqB,EAAC,WAAU,UAAS,UAAS,GAA4F;AAC5J,QAAM,WAAS,SAAS,SAAS,OAAO,OAAG,EAAE,gBAAc,UAAU,EAAE;AACvE,QAAM,WAAS,SAAS,SAAS,OAAO,OAAG,SAAS,KAAK,OAAG,EAAE,OAAK,EAAE,SAAS,CAAC;AAC/E,QAAM,CAAC,MAAK,OAAO,QAAE,yBAAS,UAAU,sBAAsB,QAAM,QAAQ;AAC5E,QAAM,CAAC,SAAQ,UAAU,QAAE,yBAAS,UAAU,sBAAsB,WAAS,CAAC,CAAC;AAC/E,QAAM,CAAC,kBAAiB,mBAAmB,QAAE,yBAAS,QAAQ,IAAI,OAAG,EAAE,SAAS,CAAC;AACjF,QAAM,CAAC,MAAK,OAAO,QAAE,yBAAS,KAAK,GAAE,CAAC,UAAS,WAAW,QAAE,yBAAS,EAAE,GAAE,CAAC,QAAO,SAAS,QAAE,yBAAS,KAAK;AAC1G,QAAM,cAAQ,uBAA0B,IAAI;AAC5C,gCAAU,MAAI;AAAC,QAAG,CAAC,QAAM,YAAU,SAAS,kBAAgB,SAAS,KAAK,SAAQ,SAAS,MAAM;AAAA,EAAC,GAAE,CAAC,MAAK,QAAQ,CAAC;AACnH,QAAM,cAAY,QAAQ,OAAO,OAAG,CAAC,SAAS,KAAK,OAAG,EAAE,cAAY,EAAE,aAAW,EAAE,WAAS,EAAE,UAAQ,EAAE,WAAS,UAAU,KAAG,CAAC,SAAS,KAAK,OAAG,EAAE,OAAK,EAAE,aAAW,EAAE,OAAO,CAAC;AAC9K,QAAM,eAAa,iBAAiB,KAAK,QAAI,CAAC,QAAQ,KAAK,OAAG,EAAE,cAAY,EAAE,CAAC;AAC/E,SAAO,+CAAC,UAAK,WAAU,+EAA8E,aAAW,MAAM,UAAU,OAAG;AACjI,MAAE,eAAe;AAAE,QAAG,KAAK;AAAO,YAAQ,IAAI;AAAE,gBAAY,EAAE;AAAE,cAAU,KAAK;AAC/E,UAAM,mBAAiB,QAAQ,IAAI,OAAG,SAAS,KAAK,OAAG,EAAE,cAAY,EAAE,aAAW,EAAE,WAAS,EAAE,MAAM,GAAG,EAAE;AAC1G,SAAK,IAAI,eAAe,UAAU,EAAE,kBAAiB,EAAC,QAAO,OAAM,MAAK,KAAK,UAAU,EAAC,MAAK,kBAAiB,SAAO,WAAS,CAAC,IAAE,iBAAgB,CAAC,EAAC,CAAC,EAAE,KAAK,YAAS;AAAC,YAAM,UAAU;AAAE,kBAAY,4CAAS;AAAA,IAAC,CAAC,EAAE,MAAM,WAAO;AAAC,gBAAU,IAAI;AAAE,kBAAY,aAAa,KAAK,CAAC;AAAA,IAAC,CAAC,EAAE,QAAQ,MAAI,QAAQ,KAAK,CAAC;AAAA,EAC7S,GACE;AAAA,mDAAC,WAAM,WAAU,6BAA4B;AAAA,oDAAC,UAAK,4CAAK;AAAA,MAAO,+CAAC,YAAO,UAAU,MAAM,OAAO,MAAM,UAAU,OAAG,QAAQ,EAAE,OAAO,KAAoB,GAAG;AAAA,sDAAC,YAAO,OAAM,UAAS,0EAAU;AAAA,QAAS,8CAAC,YAAO,OAAM,YAAW,8DAAQ;AAAA,SAAS;AAAA,OAAS;AAAA,IACtP,8CAAC,OAAE,sLAA4B;AAAA,IAC9B,CAAC,UAAU,wBAAsB,SAAS,KAAK,OAAG,EAAE,cAAc,KAAG,8CAAC,OAAE,MAAK,UAAS,kMAA8B;AAAA,IACpH,SAAO,cAAY,+CAAC,SAAI,WAAU,oCACjC;AAAA,oDAAC,OAAE,wSAA+C;AAAA,MACjD,CAAC,SAAS,UAAQ,8CAAC,OAAE,4FAAa;AAAA,MAClC,SAAS,IAAI,aAAS,+CAAC,cAA0B,UAAU,MAAM,WAAU,oCAC1E;AAAA,sDAAC,YAAO,yDAAC,WAAM;AAAA,wDAAC,WAAM,MAAK,YAAW,SAAS,iBAAiB,SAAS,QAAQ,EAAE,GAAG,UAAU,OAAG;AACjG,gCAAoB,SAAK,EAAE,OAAO,UAAQ,CAAC,GAAG,KAAI,QAAQ,EAAE,IAAE,IAAI,OAAO,QAAI,OAAK,QAAQ,EAAE,CAAC;AAC7F,gBAAG,CAAC,EAAE,OAAO,QAAQ,YAAW,WAAO,MAAM,OAAO,OAAG,EAAE,cAAY,QAAQ,EAAE,CAAC;AAAA,UAClF,GAAE;AAAA,UAAG,QAAQ;AAAA,UAAM,CAAC,QAAQ,UAAQ,mCAAQ;AAAA,WAAG,GAAQ;AAAA,QACtD,iBAAiB,SAAS,QAAQ,EAAE,KAAG,+CAAC,SAAI,WAAU,kCACpD;AAAA,WAAC,SAAS,KAAK,OAAG,EAAE,cAAY,QAAQ,MAAI,EAAE,WAAS,UAAU,KAAG,8CAAC,OAAE,wJAAuB;AAAA,UAC9F,SAAS,OAAO,OAAG,EAAE,cAAY,QAAQ,MAAI,EAAE,WAAS,UAAU,EAAE,IAAI,OAAG,+CAAC,WAAiB;AAAA,0DAAC,WAAM,MAAK,YAAW,SAAS,QAAQ,KAAK,OAAG,EAAE,cAAY,EAAE,aAAW,EAAE,WAAS,EAAE,MAAM,GAAG,UAAU,OAAG,WAAW,WAAO,EAAE,OAAO,UAAQ,CAAC,GAAG,OAAM,EAAC,WAAU,EAAE,WAAU,QAAO,EAAE,OAAM,CAAC,IAAE,MAAM,OAAO,OAAG,EAAE,cAAY,EAAE,aAAW,EAAE,WAAS,EAAE,MAAM,CAAC,GAAE;AAAA,YAAE,+CAAC,UAAM;AAAA,gBAAE;AAAA,cAAY,8CAAC,WAAO,YAAE,QAAO;AAAA,eAAQ;AAAA,eAA3T,EAAE,EAAgU,CAAQ;AAAA,WACpa;AAAA,WARoC,QAAQ,EAS9C,CAAW;AAAA,MACV,YAAY,SAAO,KAAG,+CAAC,SAAI,MAAK,SAAQ;AAAA,sDAAC,OAAE,sOAAoC;AAAA,QAAK,YAAY,IAAI,OAAG,+CAAC,YAAO,MAAK,UAAS,UAAU,MAA8B,SAAS,MAAI;AAAC,qBAAW,WAAO,MAAM,OAAO,OAAG,EAAE,cAAY,EAAE,aAAW,EAAE,WAAS,EAAE,MAAM,CAAC;AAAE,cAAG,CAAC,QAAQ,KAAK,OAAG,EAAE,cAAY,EAAE,aAAW,EAAE,WAAS,EAAE,MAAM,EAAE,qBAAoB,SAAK,IAAI,OAAO,QAAI,OAAK,EAAE,SAAS,CAAC;AAAA,QAAC,GAAG;AAAA;AAAA,UAAI,EAAE;AAAA,aAA3P,KAAK,UAAU,CAAC,CAAkP,CAAS;AAAA,SAAE;AAAA,OACla;AAAA,IACC,YAAU,8CAAC,OAAE,MAAM,SAAO,UAAQ,UAAW,oBAAS;AAAA,IACvD,8CAAC,YAAO,wDAAC,YAAO,KAAK,SAAS,WAAU,cAAa,UAAU,QAAO,SAAO,eAAa,CAAC,QAAQ,UAAQ,YAAY,SAAO,KAAG,eAAiB,iBAAK,6BAAO,wCAAS,GAAS;AAAA,KAClL;AACF;;;ADPI,IAAAC,uBAAA;AA5BG,SAAS,cAAc,EAAC,WAAU,UAAS,WAAU,OAAM,GAA8G;AAC9K,QAAM,CAAC,UAAS,WAAW,QAAE,yBAAgC,QAAQ;AACrE,QAAM,CAAC,MAAK,OAAO,QAAE,yBAAS,EAAE;AAChC,QAAM,CAAC,SAAQ,UAAU,QAAE,yBAAS,EAAE;AACtC,QAAM,CAAC,UAAS,WAAW,QAAE,yBAAS,EAAE;AACxC,QAAM,CAAC,UAAS,QAAQ,QAAE,yBAAS,EAAE;AACrC,QAAM,CAAC,UAAS,WAAW,QAAE,yBAA6B,UAAU;AACpE,QAAM,CAAC,UAAS,WAAW,QAAE,yBAAS,EAAE,GAAE,CAAC,UAAS,WAAW,QAAE,yBAAS,EAAE,GAAE,CAAC,UAAS,WAAW,QAAE,yBAAS,EAAE;AAChH,QAAM,CAAC,MAAK,OAAO,QAAE,yBAAS,KAAK;AACnC,QAAM,CAAC,UAAS,WAAW,QAAE,yBAAS,EAAE;AACxC,QAAM,CAAC,UAAS,WAAW,QAAE,yBAAiB;AAC9C,QAAM,CAAC,QAAO,SAAS,QAAE,yBAAS,KAAK;AACvC,QAAM,CAAC,eAAc,gBAAgB,QAAE,yBAAS,KAAK;AACrD,QAAM,CAAC,aAAY,cAAc,QAAE,yBAAiB;AACpD,QAAM,WAAS,MAAI;AAAC,cAAU,KAAK;AAAE,aAAS,EAAE;AAAE,gBAAY,EAAE;AAAE,gBAAY,EAAE;AAAA,EAAC;AACjF,QAAM,UAAQ,CAAC,aAAkC;AAC/C,qBAAiB,QAAQ,QAAQ,CAAC;AAAE,gBAAY,YAAU,QAAQ;AAAE,YAAQ,EAAE;AAAE,eAAW,EAAE;AAAE,gBAAY,EAAE;AAAE,gBAAY,EAAE;AAAE,gBAAY,EAAE;AAAE,aAAS,EAAE;AAAE,gBAAY,EAAE;AAAE,gBAAY,UAAU;AAAE,gBAAY,EAAE;AAAE,cAAU,IAAI;AAAA,EACpO;AACA,QAAM,WAAS,SAAS,SAAS,OAAO,OAAG,EAAE,gBAAc,UAAU,EAAE;AACvE,QAAM,WAAS,SAAS,SAAS,OAAO,OAAG,SAAS,KAAK,OAAG,EAAE,OAAK,EAAE,SAAS,CAAC;AAC/E,QAAM,MAAI,OAAM,WAA2B;AAAC,QAAG,KAAK;AAAO,YAAQ,IAAI;AAAE,gBAAY,EAAE;AAAE,QAAG;AAAC,YAAM,OAAO;AAAA,IAAC,SAAO,OAAM;AAAC,kBAAY,aAAa,KAAK,CAAC;AAAA,IAAC,UAAC;AAAQ,cAAQ,KAAK;AAAA,IAAC;AAAA,EAAC;AACjL,QAAM,YAAU,OAAM,SAAe,IAAI,YAAS;AAChD,UAAM,OAAK,EAAC,aAAY,UAAU,IAAG,UAAS,MAAK,KAAK,KAAK,KAAG,UAAS,SAAQ,QAAQ,KAAK,GAAE,UAAS,SAAS,KAAK,GAAE,UAAS,GAAI,aAAW,aAAW,EAAC,UAAS,UAAS,SAAQ,IAAE,EAAC,UAAS,SAAS,KAAK,EAAC,EAAE;AACpN,UAAM,IAAI,OAAK,cAAY,kBAAiB,EAAC,QAAO,QAAO,MAAK,KAAK,UAAU,IAAI,EAAC,CAAC;AACrF,QAAG,MAAK;AAAC,YAAM,UAAU;AAAE,eAAS;AAAA,IAAC;AACrC,gBAAY,OAAK,6NAAuC,0EAAc;AAAA,EACxE,CAAC;AACD,SAAO,+CAAC,SAAI,IAAG,wBAAuB,WAAU,oDAC9C;AAAA,mDAAC,SAAI,WAAU,+BACb;AAAA,oDAAC,kBAAe,SAAQ,YAAW,OAAM,4BAAO,QAAO,gHAAqB;AAAA,MAC5E,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAI,QAAQ,GAAG,sCAAI;AAAA,OACpD;AAAA,IACC,CAAC,UAAQ,YAAU,8CAAC,OAAE,MAAK,UAAU,oBAAS;AAAA,IAC9C,UAAQ,8CAAC,mBAAgB,OAAO,gBAAc,GAAG,aAAW,WAAS,WAAS,YAAY,kBAAM,4BAAQ,QAAQ,aAAW,WAAS,6QAA+C,oJAA4B,OAAO,MAAI;AAAC,UAAG,CAAC,KAAK,UAAS;AAAA,IAAC,GAC7O,yDAAC,UAAK,WAAU,qDAAoD,aAAW,MAAM,UAAU,CAAC,UAAkB;AAAC,YAAM,eAAe;AAAE,WAAK,UAAU,IAAI;AAAA,IAAC,GAC3J;AAAA,OAAC,iBAAe,8CAACC,YAAA,EAAU,OAAM,gBAAK,yDAAC,YAAO,WAAS,MAAC,UAAU,MAAM,OAAO,UAAU,UAAU,OAAG;AAAC,oBAAY,EAAE,OAAO,KAAwB;AAAE,oBAAY,EAAE;AAAE,iBAAS,EAAE;AAAE,oBAAY,EAAE;AAAE,oBAAY,EAAE;AAAE,oBAAY,EAAE;AAAA,MAAC,GAAG;AAAA,sDAAC,YAAO,OAAM,UAAS,oBAAM;AAAA,QAAS,8CAAC,YAAO,OAAM,cAAa,wBAAU;AAAA,SAAS,GAAS;AAAA,MACnU,8CAACA,YAAA,EAAU,OAAM,4BAAO,wDAAC,WAAM,WAAW,eAAe,UAAU,MAAM,WAAW,IAAI,OAAO,MAAM,UAAU,OAAG,QAAQ,EAAE,OAAO,KAAK,GAAG,aAAa,kCAAS,aAAW,WAAS,WAAS,YAAY,IAAI,GAAE;AAAA,MAChN,8CAACA,YAAA,EAAU,OAAM,kCAAQ,wDAAC,WAAM,UAAU,MAAM,UAAQ,MAAC,MAAK,OAAM,OAAO,SAAS,UAAU,OAAG,WAAW,EAAE,OAAO,KAAK,GAAG,aAAY,4BAA2B,GAAE;AAAA,MACtK,+CAAC,aAAQ;AAAA,sDAAC,aAAQ,8DAAQ;AAAA,QAAU,8CAACA,YAAA,EAAU,OAAO,aAAW,WAAS,gCAAU,mCAAe,MAAK,4KAA+B,wDAAC,WAAM,UAAU,MAAM,OAAO,UAAU,UAAU,OAAG,YAAY,EAAE,OAAO,KAAK,GAAG,aAAa,aAAW,WAAS,sBAAoB,iBAAiB,GAAE;AAAA,SAAY;AAAA,MAC7S,8CAACA,YAAA,EAAU,OAAM,4BAAO,yDAAC,YAAO,UAAU,MAAM,OAAO,UAAU,UAAU,OAAG;AAAC,oBAAY,EAAE,OAAO,KAAwB;AAAE,iBAAS,EAAE;AAAE,oBAAY,EAAE;AAAE,oBAAY,EAAE;AAAA,MAAC,GAAG;AAAA,sDAAC,YAAO,OAAM,YAAW,sCAAI;AAAA,QAAS,8CAAC,YAAO,OAAM,SAAQ,0BAAY;AAAA,SAAS,GAAS;AAAA,MACtQ,aAAW,aAAW,gFACrB;AAAA,sDAACA,YAAA,EAAU,OAAM,gBAAK,wDAAC,WAAM,UAAU,MAAM,UAAQ,MAAC,cAAa,YAAW,OAAO,UAAU,UAAU,OAAG,YAAY,EAAE,OAAO,KAAK,GAAG,aAAa,aAAW,WAAS,iDAAY,wCAAS,GAAE;AAAA,QACjM,8CAACA,YAAA,EAAU,OAAM,gBAAK,MAAK,qJAAiC,wDAAC,WAAM,UAAU,MAAM,UAAQ,MAAC,MAAK,YAAW,cAAa,oBAAmB,OAAO,UAAU,UAAU,OAAG,YAAY,EAAE,OAAO,KAAK,GAAE,GAAE;AAAA,QACvM,aAAW,gBAAc,8CAACA,YAAA,EAAU,OAAM,kFAAgB,wDAAC,WAAM,UAAU,MAAM,cAAa,iBAAgB,WAAU,WAAU,OAAO,UAAU,UAAU,OAAG,YAAY,EAAE,OAAO,KAAK,GAAE,GAAE;AAAA,SACjM,IAAI,8CAACA,YAAA,EAAU,OAAM,gBAAe,MAAK,sIAAsC,wDAAC,WAAM,UAAU,MAAM,UAAQ,MAAC,MAAK,YAAW,cAAa,gBAAe,OAAO,UAAU,UAAU,OAAG,SAAS,EAAE,OAAO,KAAK,GAAG,GAAE;AAAA,MACpN,YAAU,8CAAC,OAAE,MAAK,UAAU,oBAAS;AAAA,MACtC,+CAAC,YAAO;AAAA,sDAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,UAAU,0BAAE;AAAA,QAAS,8CAAC,YAAO,MAAK,UAAS,UAAU,QAAM,EAAE,aAAW,aAAW,YAAU,WAAS,aAAW,CAAC,SAAS,SAAS,MAAI,KAAK,UAAU,KAAK,GAAG,sCAAI;AAAA,QAAS,8CAAC,YAAO,WAAU,cAAa,UAAU,MAAO,iBAAK,6BAAO,4BAAO;AAAA,SAAS;AAAA,OACjT,GACF;AAAA,IACA,+CAAC,SAAI,WAAU,4BACf;AAAA,qDAAC,SAAI,WAAU,2BACb;AAAA,uDAAC,UAAK;AAAA,wDAAC,YAAO,0BAAE;AAAA,UAAS,8CAAC,WAAO,mBAAS,KAAK,OAAG,CAAC,EAAE,YAAU,EAAE,aAAW,QAAQ,IAAE,2DAAY,0DAAc;AAAA,WAAQ;AAAA,QAAQ,SAAS,KAAK,OAAG,CAAC,EAAE,YAAU,EAAE,aAAW,QAAQ,KAAG,8CAAC,iBAAc,SAAS,SAAS,KAAK,OAAG,CAAC,EAAE,YAAU,EAAE,aAAW,QAAQ,GAAG;AAAA,QAAG,8CAAC,YAAO,MAAK,UAAS,cAAW,4BAAO,SAAS,MAAI,eAAe,QAAQ,GAAG,0BAAE;AAAA,QACvV,gBAAc,YAAU,8CAAC,mBAAgB,OAAM,4BAAO,QAAO,oGAAmB,OAAO,MAAI,eAAe,MAAS,GAAI,kBAAO;AAAA,SACjI;AAAA,MACE,CAAC,UAAS,YAAY,EAAY,OAAO,CAAAC,cAAU,CAAC,SAAS,KAAK,OAAG,EAAE,aAAWA,SAAQ,CAAC,EAAE,IAAI,CAAAA,cAAU,+CAAC,SAAI,WAAU,2BAAyC;AAAA,uDAAC,UAAK;AAAA,wDAAC,YAAQ,UAAAA,cAAW,WAAS,WAAS,cAAa;AAAA,UAAS,8CAAC,WAAM,sCAAI;AAAA,WAAQ;AAAA,QAAO,8CAAC,YAAO,MAAK,UAAS,cAAY,gBAAMA,SAAQ,IAAI,SAAS,MAAI,QAAQA,SAAQ,GAAG,0BAAE;AAAA,WAA5LA,SAAqM,CAAM;AAAA,MACrW,SAAS,OAAO,OAAG,EAAE,YAAU,EAAE,aAAW,QAAQ,EAAE,IAAI,aAAS,+CAAC,SAAqB,WAAU,2CAClG;AAAA,uDAAC,UAAK;AAAA,wDAAC,YAAQ,kBAAQ,MAAK;AAAA,UAAS,+CAAC,WAAO;AAAA,oBAAQ;AAAA,YAAS;AAAA,YAAI,SAAS,OAAO,OAAG,EAAE,cAAY,QAAQ,MAAI,EAAE,WAAS,SAAS,EAAE;AAAA,YAAO;AAAA,aAAK;AAAA,WAAQ;AAAA,QAAO,8CAAC,iBAAc,SAAiB;AAAA,QAAE,8CAAC,YAAO,MAAK,UAAS,cAAY,gBAAM,QAAQ,IAAI,IAAI,SAAS,MAAI;AAAC,sBAAY,EAAE;AAAE,yBAAe,QAAQ,EAAE;AAAA,QAAC,GAAG,0BAAE;AAAA,QACtT,gBAAc,QAAQ,MAAI,8CAAC,mBAAgB,OAAO,GAAG,QAAQ,IAAI,sBAAS,QAAO,8FAAkB,OAAO,MAAI;AAAC,cAAG,CAAC,MAAK;AAAC,2BAAe,MAAS;AAAE,wBAAY,MAAS;AAAA,UAAC;AAAA,QAAC,GAC3K,yDAAC,SAAI,WAAU,yDACf;AAAA,yDAAC,SAAI,WAAU,kCAAiC;AAAA,2DAAC,UAAK;AAAA,4DAAC,WAAM,sCAAI;AAAA,cAAQ,8CAAC,YAAQ,kBAAQ,WAAU;AAAA,cAAU,QAAQ,QAAQ,YAAU,8CAAC,WAAO,kBAAQ,OAAO,UAAS;AAAA,eAAS;AAAA,YAAO,8CAAC,iBAAc,SAAiB;AAAA,aAAE;AAAA,UACzN,QAAQ,aAAW,YAAU,8CAAC,OAAE,0fAAkF;AAAA,UAClH,CAAC,QAAQ,QAAQ,YAAU,8CAAC,OAAE,kMAA8B;AAAA,UAC5D,QAAQ,aAAW,8CAAC,OAAE,MAAK,SAAS,kBAAQ,WAAU;AAAA,UACvD,+CAAC,SAAI,WAAU,4BAA2B;AAAA,0DAAC,YAAO,UAAU,MAAM,SAAS,MAAI,KAAK,IAAI,YAAS;AAAC,oBAAM,IAAI,aAAa,QAAQ,EAAE,YAAW,EAAC,QAAO,QAAO,MAAK,KAAK,UAAU,EAAC,SAAQ,CAAC,QAAQ,QAAO,CAAC,EAAC,CAAC;AAAE,oBAAM,UAAU;AAAA,YAAC,CAAC,GAAI,kBAAQ,UAAQ,iBAAK,gBAAK;AAAA,YAC5P,QAAQ,WAAS,QAAQ,kBAAgB,WAAS,8CAAC,YAAO,UAAU,MAAM,SAAS,MAAI,KAAK,IAAI,YAAS;AAAC,oBAAM,IAAI,aAAa,QAAQ,EAAE,YAAW,EAAC,QAAO,QAAO,MAAK,KAAK,UAAU,EAAC,SAAQ,KAAI,CAAC,EAAC,CAAC;AAAE,oBAAM,UAAU;AAAA,YAAC,CAAC,GAAG,0BAAE;AAAA,YACnO,8CAAC,YAAO,UAAU,MAAM,SAAS,MAAI,aAAW,QAAQ,KAAG,KAAK,IAAI,YAAS;AAAC,oBAAM,IAAI,aAAa,QAAQ,EAAE,IAAG,EAAC,QAAO,SAAQ,CAAC;AAAE,0BAAY,MAAS;AAAE,oBAAM,UAAU;AAAA,YAAC,CAAC,IAAE,YAAY,QAAQ,EAAE,GAAI,uBAAW,QAAQ,KAAG,2DAAY,4BAAO;AAAA,YAClP,aAAW,QAAQ,MAAI,8CAAC,YAAO,SAAS,MAAI,YAAY,MAAS,GAAG,0BAAE;AAAA,aACzE;AAAA,UACA,+CAAC,aAAQ,WAAU,8BAA6B;AAAA,0DAAC,QAAG,4CAAK;AAAA,YAAK,+CAAC,OAAE,MAAK,UAAU;AAAA,uBAAS,OAAO,OAAG,EAAE,cAAY,QAAQ,MAAI,EAAE,WAAS,SAAS,EAAE;AAAA,cAAO;AAAA,eAAa;AAAA,YACtK,SAAS,OAAO,OAAG,EAAE,cAAY,QAAQ,EAAE,EAAE,IAAI,OAAG,+CAAC,SAAe,WAAU,8BAA6B;AAAA,6DAAC,SAAI;AAAA,8DAAC,YAAQ,YAAE,aAAY;AAAA,gBAAS,8CAAC,WAAO,YAAE,WAAS,aAAW,uBAAM,EAAE,WAAS,YAAU,6BAAO,sBAAM;AAAA,gBAAS,EAAE,WAAS,aAAW,EAAE,eAAa,+CAAC,UAAK;AAAA;AAAA,kBAAI,8CAAC,UAAM,YAAE,aAAY;AAAA,mBAAO;AAAA,iBAAQ;AAAA,cAAM,8CAAC,YAAO,UAAU,MAAM,SAAS,MAAI,KAAK,IAAI,YAAS;AAAC,sBAAM,IAAI,aAAa,EAAE,EAAE,WAAU,EAAC,QAAO,QAAO,MAAK,KAAK,UAAU,EAAC,QAAO,EAAE,WAAS,aAAW,YAAU,WAAU,CAAC,EAAC,CAAC;AAAE,sBAAM,UAAU;AAAA,cAAC,CAAC,GAAI,YAAE,WAAS,aAAW,6BAAO,kCAAQ;AAAA,iBAA5e,EAAE,EAAmf,CAAM;AAAA,aAC1jB;AAAA,UACC,YAAU,8CAAC,OAAE,MAAK,UAAU,oBAAS;AAAA,WACxC,GAAM;AAAA,QACH,QAAQ,aAAW,+CAAC,SAAI,WAAU,qCAAoC,MAAK,UAAS,eAAY,QAAO;AAAA,wDAAC,YAAQ,kBAAQ,kBAAgB,YAAU,6BAAO,4BAAO;AAAA,UAAS,8CAAC,OAAG,kBAAQ,WAAU;AAAA,WAAI;AAAA,WAlBxH,QAAQ,EAmBtF,CAAM;AAAA,OACN;AAAA,IACA,8CAAC,aAAQ,WAAU,qCAAoC,cAAW,4BAAO,yDAAC,SAAI,WAAU,2BAA0B;AAAA,qDAAC,UAAK;AAAA,sDAAC,YAAO,4CAAK;AAAA,QAAS,8CAAC,WAAO,oBAAU,sBAAsB,SAAO,aAAW,sBAAO,UAAU,qBAAqB,QAAQ,MAAM,8BAAQ,sEAAc;AAAA,SAAQ;AAAA,MAAO,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAI,eAAe,UAAU,GAAG,0BAAE;AAAA,OAAS,GAAM;AAAA,IAChX,gBAAc,cAAY,8CAAC,mBAAgB,OAAM,kCAAQ,QAAO,0JAA4B,OAAO,MAAI,eAAe,MAAS,GAAG,wDAAC,wBAAqB,WAAsB,UAAoB,WAAqB,GAAE;AAAA,KAC5N;AACF;AAEA,SAASD,WAAU,EAAC,OAAM,MAAK,SAAQ,GAA8D;AACnG,SAAO,+CAAC,WAAM,WAAU,6BAA4B;AAAA,kDAAC,UAAM,iBAAM;AAAA,IAAQ;AAAA,IAAU,QAAM,8CAAC,WAAO,gBAAK;AAAA,KAAS;AACjH;;;AEzFA,IAAAE,iBAA4D;AAI5D,IAAMC,aAAU,oBAAI,IAA0B;AAC9C,IAAI;AACJ,IAAI;AACJ,IAAI,YAAU;AACd,eAAe,OAAqB;AAClC,MAAG,UAAQ,CAACA,WAAU,KAAK;AAC3B,QAAM,aAAW,IAAI,gBAAgB;AAAE,WAAO;AAC9C,MAAI;AACF,QAAG,SAAS,oBAAkB,UAAU;AACtC,YAAM,QAAM,MAAM,IAAY,oBAAmB,EAAC,QAAO,YAAY,IAAI,CAAC,WAAW,QAAO,YAAY,QAAQ,GAAM,CAAC,CAAC,EAAC,CAAC;AAC1H,YAAM,aAAW,KAAK,UAAU,KAAK;AACrC,UAAG,eAAa,WAAU;AAAC,oBAAU;AAAW,QAAAA,WAAU,QAAQ,cAAU,SAAS,KAAK,CAAC;AAAA,MAAC;AAAA,IAC9F;AAAA,EACF,QAAQ;AAAA,EAA4D,UACpE;AACE,QAAG,WAAS,WAAW,UAAO;AAC9B,QAAGA,WAAU,KAAK,SAAM,WAAW,MAAI,KAAK,KAAK,GAAE,GAAI;AAAA,EACzD;AACF;AACO,SAAS,iBAAiB,aAAsE;AACrG,gCAAU,MAAI;AACZ,UAAM,SAAO,CAAC,UAAe,YAAY,cAAU,WAAS,EAAC,GAAG,UAAS,GAAG,MAAK,IAAE,QAAQ;AAC3F,IAAAA,WAAU,IAAI,MAAM;AACpB,gBAAU;AACV,QAAG,CAAC,QAAO;AAAC,mBAAa,KAAK;AAAE,WAAK,KAAK;AAAA,IAAC;AAC3C,WAAO,MAAI;AAAC,MAAAA,WAAU,OAAO,MAAM;AAAE,UAAG,CAACA,WAAU,MAAK;AAAC,qBAAa,KAAK;AAAE,gBAAQ,MAAM;AAAE,oBAAU;AAAA,MAAE;AAAA,IAAC;AAAA,EAC5G,GAAE,CAAC,WAAW,CAAC;AACjB;;;AC/BA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAC,iBAAyC;AACzC,IAAAC,oCAAkC;AA4B5B,IAAAC,uBAAA;AAlBC,SAAS,sBAAsB,EAAE,OAAO,OAAO,GAAoF;AACxI,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,SAAS,OAAO,UAAqD;AACzE,UAAM,eAAe;AACrB,UAAM,OAAO,IAAI,SAAS,MAAM,aAAa;AAC7C,YAAQ,IAAI;AAAG,aAAS,MAAS;AACjC,QAAI;AACF,YAAM,OAAO;AAAA,QACX,MAAM,OAAO,KAAK,IAAI,MAAM,KAAK,EAAE,EAAE,KAAK;AAAA,QAC1C,MAAM,OAAO,KAAK,IAAI,MAAM,KAAK,EAAE,EAAE,KAAK;AAAA,QAC1C,aAAa,OAAO,KAAK,IAAI,aAAa,KAAK,EAAE,EAAE,KAAK;AAAA,QACxD,cAAc,OAAO,KAAK,IAAI,cAAc,KAAK,EAAE,EAAE,KAAK;AAAA,MAC5D,CAAC;AAAA,IACH,SAAS,QAAQ;AAAE,eAAS,aAAa,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,KAAK;AAAA,IAAE;AAAA,EAC/E;AACA,SAAO,8CAAC,mBAAgB,OAAM,4BAAO,QAAO,gNAA0C,OAAc,OAAM,QACxG,yDAAC,UAAK,WAAU,8DAA6D,aAAW,MAAM,UAAU,WAAS;AAAE,SAAK,OAAO,KAAK;AAAA,EAAE,GACpI;AAAA,mDAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,WAAM,MAAK,QAAO,UAAQ,MAAC,WAAW,IAAI,WAAS,MAAC,aAAY,kCAAQ;AAAA,OAAE;AAAA,IACnG,+CAAC,WAAM;AAAA,oDAAC,UAAK,sCAAI;AAAA,MAAO,8CAAC,WAAM,MAAK,QAAO,UAAQ,MAAC,WAAW,KAAK,aAAY,4EAAe;AAAA,OAAE;AAAA,IACjG,+CAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,4CAAK;AAAA,MAAO,8CAAC,WAAM,MAAK,eAAc,WAAW,KAAK,aAAY,oGAAmB;AAAA,OAAE;AAAA,IACxH,+CAAC,WAAM,WAAU,WAAU;AAAA,oDAAC,UAAK,kDAAM;AAAA,MAAO,8CAAC,cAAS,MAAK,gBAAe,WAAW,MAAO,MAAM,GAAG,aAAY,kLAAgC;AAAA,OAAE;AAAA,IACpJ,SAAS,8CAAC,mBAAiB,iBAAM;AAAA,IAClC,+CAAC,YAAO;AAAA,oDAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,OAAO,0BAAE;AAAA,MAAS,+CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,MAAM;AAAA,sDAAC,uDAAkB,MAAM,IAAI;AAAA,QAAG,OAAO,mCAAU;AAAA,SAAO;AAAA,OAAS;AAAA,KACzM,GACF;AACF;;;ACrCA,IAAAC,iBAA0B;AAOnB,SAAS,kBACd,KACA,IACA,UACA,QACA,WAAuB,MAAM;AAAC,GAClB;AACZ,QAAM,SAAS,IAAI;AACnB,MAAI,OAAO,OAAO,gBAAgB,YAAY;AAC5C,WAAO,IAAI,MAAM,SAAS,EAAE,MAAM,gBAAgB,SAAS,GAAG,MAAM;AAAA,EACtE;AAGA,QAAM,QAAQ,IAAI;AAGlB,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,QAAM,OAAO,CAAC,UAAqD;AACjE,kCAAU,MAAM;AACd,YAAMC,WAAU,EAAE;AAClB,aAAO,MAAM;AAEX,uBAAe,MAAM;AAAE,cAAI,CAAC,YAAY,eAAeA,SAAS,UAAS;AAAA,QAAE,CAAC;AAAA,MAC9E;AAAA,IACF,GAAG,CAAC,CAAC;AACL,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,QAAM,SAAS,MAAM,SAAS,EAAE,MAAM,QAAQ,KAAK,GAAG,GAAG,IAAI;AAC7D,QAAM,UAAU,MAAY;AAAE,QAAI,SAAU;AAAQ,eAAW;AAAM,WAAO;AAAA,EAAE;AAC9E,MAAI;AAAE,WAAO,YAAY,EAAE;AAAA,EAAE,SAAS,OAAO;AAAE,YAAQ;AAAG,UAAM;AAAA,EAAM;AAGtE,SAAO;AACT;;;AClBO,SAAS,wBAAwB,KAAoB,UAAkB,QAAgH;AAC5L,QAAMC,aAAY,oBAAI,IAAgB;AACtC,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,QAAM,SAAS,MAAY;AAAE,eAAW,YAAYA,WAAW,UAAS;AAAA,EAAE;AAC1E,QAAM,aAAgC;AAAA,IACpC,KAAK,aAAa,QAAQ;AACxB,oBAAc,UAAU,EAAE,MAAM,OAAO;AACvC,UAAI,gBAAgB,OAAW,YAAW;AAC1C,UAAI,YAAY,QAAW;AACzB,gCAAwB,QAAQ;AAChC,kBAAU,kBAAkB,KAAK,UAAU,IAAI,WAAS,OAAO,OAAO,UAAU,GAAG,MAAM,WAAW,MAAM,CAAC;AAAA,MAC7G;AACA,aAAO;AAAA,IACT;AAAA,IACA,QAAQ;AAAE,YAAMC,WAAU;AAAS,gBAAU;AAAW,MAAAA,WAAU;AAAG,aAAO;AAAA,IAAE;AAAA,IAC9E,SAAS;AAAE,UAAI,YAAY,OAAW,YAAW,KAAK;AAAA,UAAQ,YAAW,MAAM;AAAA,IAAE;AAAA,IACjF,QAAQ,MAAM,YAAY;AAAA,IAC1B,UAAU,MAAM;AAAA,IAChB,aAAa,MAAM;AAAA,IACnB,MAAM,YAAY,SAAS,WAAW;AACpC,YAAM,WAAW,MAAM,IAA2B,aAAa,mBAAmB,OAAO,CAAC,YAAY,EAAE,QAAQ,OAAO,CAAC;AACxH,UAAI,SAAS,cAAc,UAAW,OAAM,IAAI,MAAM,wDAAW;AACjE,YAAM,qBAAqB,KAAK,SAAS;AACzC,iBAAW,MAAM;AACjB,eAAS,GAAG,EAAE,KAAK,SAAsB;AAAA,IAC3C;AAAA,IACA,MAAM,aAAa,aAAa;AAC9B,YAAM,UAAU,MAAM,IAA4C,eAAe,mBAAmB,WAAW,CAAC,YAAY,EAAE,QAAQ,OAAO,CAAC;AAC9I,YAAM,qBAAqB,KAAK,QAAQ,SAAS;AACjD,iBAAW,MAAM;AACjB,eAAS,GAAG,EAAE,KAAK,QAAQ,SAAsB;AAAA,IACnD;AAAA,IACA,MAAM,aAAa,SAAS;AAC1B,YAAM,UAAU,MAAM,IAA4C,aAAa,mBAAmB,OAAO,CAAC,UAAU,EAAE,QAAQ,OAAO,CAAC;AACtI,YAAM,qBAAqB,KAAK,QAAQ,SAAS;AACjD,iBAAW,MAAM;AACjB,eAAS,GAAG,EAAE,KAAK,QAAQ,SAAsB;AAAA,IACnD;AAAA,IACA,UAAU,UAAU;AAAE,MAAAD,WAAU,IAAI,QAAQ;AAAG,aAAO,MAAMA,WAAU,OAAO,QAAQ;AAAA,IAAE;AAAA,EACzF;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,KAAoB,WAAkC;AAClF,QAAM,KAAK;AACX,QAAM,iBAAiB,SAAS,GAAG;AACnC,MAAI,eAAe,KAAK,YAAY,EAAE,KAAK,EAAE,MAAM,OAAW,QAAO,QAAQ,QAAQ;AACrF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO,MAAY;AAAA,IAAC;AACxB,UAAM,UAAU,OAAO,WAAW,MAAM;AAAE,WAAK;AAAG,aAAO,IAAI,MAAM,wGAAmB,CAAC;AAAA,IAAE,GAAG,GAAK;AACjG,WAAO,eAAe,KAAK,UAAU,MAAM;AACzC,UAAI,eAAe,KAAK,YAAY,EAAE,KAAK,EAAE,MAAM,OAAW;AAC9D,aAAO,aAAa,OAAO;AAAG,WAAK;AAAG,cAAQ;AAAA,IAChD,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,SAAS,KAA+B;AAAE,SAAO,IAAI;AAAiC;;;ApEpBd,IAAAE,uBAAA;AAfjF,IAAM,YAAY;AAClB,IAAM,WAAW,GAAG,SAAS;AAC7B,IAAM,UAAU,GAAG,cAAW;AAAA,EAAK,oBAAgB;AAAA,EAAK,wBAAa;AAAA,EAAK,qBAAiB;AAAA,EAAK,yBAAkB;AAAA,EAAK,cAAc;AAAA,EAAK,sBAAsB;AAAA,EAAK,iBAAa;AAAA,EAAK,uBAAe;AAAA,EAAK,oBAAkB;AAO7N,IAAM,kBAAkB,oBAAI,IAAU,CAAC,UAAU,SAAS,aAAa,SAAS,CAAC;AAE1E,IAAM,SAAS,CAAC,SAAS,UAAU,UAAU;AAE7C,SAAS,MAAM,KAA0B;AAC9C,MAAI,OAAO,eAAe,qBAAqB;AAC/C,QAAM,aAAa,wBAAwB,KAAK,WAAW,CAAC,OAAOC,aAAY,8CAAC,oBAAkB,GAAG,OAAO,YAAYA,UAAS,CAAE;AACnI,MAAI,MAAM,OAAO,iBAAiB,MAAM,IAAI,MAAM,SAAS,EAAE,MAAM,iBAAiB,IAAI,mBAAmB,OAAO,GAAG,GAAG,MAAM,8CAAC,kBAAe,YAAwB,CAAE,CAAC;AACzK,MAAI,OAAO,MAAM,uBAAuB,WAAW,WAAW,KAAK,GAAG,kCAAkC;AACxG,MAAI,OAAO,MAAM,MAAM,WAAW,MAAM,GAAG,kCAAkC;AAC7E,MAAI,MAAM,OAAO,yBAAyB,MAAM,IAAI,MAAM,SAAS;AAAA,IACjE,MAAM;AAAA,IAAyB,IAAI;AAAA,IAAW,OAAO;AAAA,EACvD,GAAG,WAAS,8CAAC,kBAAgB,GAAG,OAAO,YAAwB,UAAU,MAAM,IAAI,OAAO,cAAc,GAAG,CAAE,CAAC;AAChH;AAEA,SAAS,eAAe,OAAiF;AACvG,QAAM,UAAM,uBAAoB,IAAI;AACpC,wBAAsB,GAAG;AACzB,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,IAAI;AACrC,QAAM,CAAC,UAAU,WAAW,QAAI,yBAA0B;AAC1D,mBAAiB,WAAW;AAC5B,QAAM,CAAC,EAAE,MAAM,QAAI,yBAAS,CAAC;AAC7B,gCAAU,MAAM,MAAM,WAAW,UAAU,MAAM,OAAO,WAAS,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,UAAU,CAAC;AAChG,gCAAU,MAAM;AAAE,SAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAAE,GAAG,CAAC,MAAM,WAAW,OAAO,CAAC,CAAC;AACrG,QAAM,SAAS,CAAC,OAAsB;AACpC,UAAM,WAAW,KAAK,EAAE;AACxB,QAAI,MAAM,QAAQ,OAAO,WAAW,oBAAoB,EAAE,QAAS,OAAM,SAAS;AAAA,EACpF;AACA,MAAI,CAAC,MAAM,KAAM,QAAO,8CAAC,aAAQ,KAAU,WAAU,+BAA8B,wDAAC,YAAO,MAAK,UAAS,WAAW,mBAAmB,MAAM,WAAW,OAAO,IAAI,eAAe,EAAE,IAAI,OAAM,gBAAK,SAAS,MAAM,MAAM,WAAW,OAAO,GAAG,wDAAC,8DAAyB,MAAM,IAAI,GAAE,GAAS;AAC5R,SAAO,+CAAC,aAAQ,KAAU,WAAU,uBAClC;AAAA,kDAAC,SAAI,WAAU,+BACb,yDAAC,YAAO,MAAK,UAAS,WAAU,6BAA4B,iBAAe,MAAM,SAAS,MAAM,QAAQ,WAAS,CAAC,KAAK,GAAG;AAAA,oDAAC,UAAK,aAAW,MAAM,wDAAC,8DAAyB,MAAM,IAAI,GAAE;AAAA,MAAO;AAAA,OAAE,GAClM;AAAA,IACA,8CAAC,SAAI,WAAW,2BAA2B,OAAO,aAAa,EAAE,IAAI,eAAa,CAAC,MACjF,wDAAC,SAAI,WAAU,kCACb,yDAAC,YAAO,MAAK,UAAS,UAAU,OAAO,IAAI,IAAI,WAAW,0BAA0B,MAAM,WAAW,OAAO,IAAI,eAAe,EAAE,IAAI,SAAS,MAAM,OAAO,GACzJ;AAAA,oDAAC,UAAK,WAAU,8BAA6B,wDAAC,8DAAyB,MAAM,IAAI,GAAE;AAAA,MAAO,+CAAC,UAAK;AAAA,sDAAC,YAAO,sCAAI;AAAA,QAAS,8CAAC,WAAO,qBAAW,GAAG,SAAS,WAAW,MAAM,4BAAU,SAAS,SAAS,OAAO,UAAQ,KAAK,kBAAkB,SAAS,EAAE,MAAM,oCAAW,oDAAW;AAAA,SAAQ;AAAA,MAAO,8CAAC,OAAE,WAAW,UAAU,SAAS,KAAK,UAAQ,KAAK,kBAAkB,SAAS,IAAI,cAAc,IAAI;AAAA,OACnY,GACF,GACF;AAAA,KACF;AACF;AAEA,SAAS,iBAAiB,EAAE,WAAW,GAAgE;AACrG,QAAM,CAAC,UAAU,WAAW,QAAI,yBAA0B;AAC1D,mBAAiB,WAAW;AAC5B,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,WAAW,SAAS,CAAC;AAClE,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAe,WAAW,YAAY,GAAG,QAAQ,MAAM;AAC/E,QAAM,CAAC,sBAAsB,uBAAuB,QAAI,yBAAS,WAAW,YAAY,CAAC;AACzF,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAC3C,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAS,KAAK;AAChE,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAiB;AAC7C,QAAM,mBAAe,uBAAO,EAAE,YAAY,YAAY,UAAU,WAAW,CAAC;AAC5E,eAAa,UAAU,EAAE,YAAY,YAAY,UAAU,WAAW;AACtE,QAAM,cAAU,4BAAY,OAAO,eAAe,UAAU;AAC1D,QAAI;AACF,YAAM,OAAO,MAAM,YAAY;AAC/B,kBAAY,IAAI;AAChB,oBAAc,CAAAA,aAAW,KAAK,WAAW,KAAK,UAAQ,KAAK,OAAOA,QAAO,IAAIA,WAAU,KAAK,WAAW,CAAC,GAAG,EAAE;AAC7G,eAAS,MAAS;AAAA,IACpB,SAAS,QAAQ;AAAE,eAAS,aAAQ,MAAM,CAAC;AAAG,UAAI,aAAc,OAAM;AAAA,IAAO,UAAE;AAAU,iBAAW,KAAK;AAAA,IAAE;AAAA,EAC7G,GAAG,CAAC,CAAC;AACL,gCAAU,MAAM;AAAE,SAAK,QAAQ;AAAA,EAAE,GAAG,CAAC,OAAO,CAAC;AAC7C,gCAAU,MAAM,WAAW,UAAU,MAAM;AAAE,UAAM,OAAO,WAAW,SAAS;AAAG,QAAI,KAAM,eAAc,IAAI;AAAG,UAAM,cAAc,WAAW,YAAY;AAAG,QAAI,aAAa;AAAE,cAAQ,YAAY,IAAI;AAAG,8BAAwB,WAAW;AAAA,IAAE;AAAA,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC;AACnQ,QAAM,WAAW,UAAU,WAAW,KAAK,UAAQ,KAAK,OAAO,UAAU;AACzE,QAAM,mBAAmB,OAAO,OAA8B;AAC5D,UAAMA,WAAU,aAAa;AAC7B,UAAM,OAAOA,SAAQ,YAAY,KAAK,UAAQ,KAAK,OAAO,EAAE,GAAG,QAAQ;AACvE,gBAAY,WAAS,QAAQ,EAAE,GAAG,OAAO,YAAY,MAAM,WAAW,OAAO,UAAQ,KAAK,OAAO,EAAE,GAAG,UAAU,MAAM,SAAS,OAAO,UAAQ,KAAK,gBAAgB,EAAE,EAAE,IAAI,KAAK;AAChL,QAAIA,SAAQ,eAAe,IAAI;AAC7B,oBAAcA,SAAQ,YAAY,KAAK,UAAQ,KAAK,OAAO,EAAE,GAAG,EAAE;AAClE,cAAQ,MAAM;AAAA,IAChB;AACA,cAAU,2BAAO,IAAI,8DAAY;AACjC,QAAI;AAAE,YAAM,QAAQ,IAAI;AAAA,IAAE,SACnB,QAAQ;AAAE,eAAS,yJAA4B,aAAQ,MAAM,CAAC,EAAE;AAAA,IAAE;AAAA,EAC3E;AACA,QAAM,SAAS,OAAO,UAA4C;AAChE,QAAI;AACF,YAAM,YAAY,MAAM,IAAmB,eAAe,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,WAAW;AAAA,QAC5G,GAAG;AAAA,QAAO,cAAc,CAAC;AAAA,MAC3B,EAAE,CAAC,EAAE,CAAC;AACN,YAAM,QAAQ;AAAG,oBAAc,UAAU,EAAE;AAAG,cAAQ,UAAU;AAAG,2BAAqB,KAAK;AAAA,IAC/F,SAAS,QAAQ;AAAE,eAAS,aAAQ,MAAM,CAAC;AAAG,YAAM;AAAA,IAAO;AAAA,EAC7D;AACA,QAAM,cAAc,OAAO,SAAiB,cAAqC;AAC/E,QAAI;AAAE,eAAS,MAAS;AAAG,YAAM,WAAW,YAAY,SAAS,SAAS;AAAA,IAAE,SACrE,QAAQ;AAAE,eAAS,aAAQ,MAAM,CAAC;AAAA,IAAE;AAAA,EAC7C;AACA,QAAM,eAAe,OAAO,gBAAuC;AACjE,QAAI;AAAE,eAAS,MAAS;AAAG,YAAM,WAAW,aAAa,WAAW;AAAA,IAAE,SAC/D,QAAQ;AAAE,eAAS,aAAQ,MAAM,CAAC;AAAA,IAAE;AAAA,EAC7C;AACA,QAAM,eAAe,OAAO,YAAmC;AAC7D,QAAI;AAAE,eAAS,MAAS;AAAG,YAAM,WAAW,aAAa,OAAO;AAAA,IAAE,SAC3D,QAAQ;AAAE,eAAS,aAAQ,MAAM,CAAC;AAAA,IAAE;AAAA,EAC7C;AACA,QAAM,gBAAgB,gBAAgB,IAAI,IAAI;AAC9C,QAAM,gBAAgB,CAAC,OAAqB;AAAE,kBAAc,EAAE;AAAG,YAAQ,MAAM;AAAA,EAAE;AACjF,SAAO,+CAAC,UAAK,WAAU,yBACpB;AAAA,yBAAqB,8CAAC,yBAAsB,OAAO,MAAM,qBAAqB,KAAK,GAAG,QAAgB;AAAA,IACvG,+CAAC,YAAO,WAAU,sBAChB;AAAA,qDAAC,SAAI,WAAU,4BAA2B;AAAA,sDAAC,YAAO,MAAK,UAAS,gCAA4B,MAAC,SAAS,WAAW,OAAO,cAAW,4BAAO,OAAM,4BAAO,wDAAC,8DAAyB,MAAM,IAAI,GAAE;AAAA,QAAS,8CAAC,8DAAyB,MAAM,IAAI;AAAA,QAAE,+CAAC,UAAK;AAAA,wDAAC,YAAO,0BAAE;AAAA,UAAS,8CAAC,WAAM,oEAAS;AAAA,WAAQ;AAAA,SAAO;AAAA,MACpS;AAAA,QAAC;AAAA;AAAA,UACC,YAAY,UAAU,cAAc,CAAC;AAAA,UACrC;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,iBAAiB,MAAM,qBAAqB,IAAI;AAAA;AAAA,MAClD;AAAA,OACF;AAAA,IACA,+CAAC,SAAI,WAAU,oBACb;AAAA,qDAAC,WAAM,WAAU,sBACf;AAAA,uDAAC,SAAI,WAAU,4BAA2B;AAAA,yDAAC,UAAK;AAAA,0DAAC,WAAM,wBAAU;AAAA,YAAQ,8CAAC,YAAO,sCAAI;AAAA,aAAS;AAAA,UAAO,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,qBAAqB,IAAI,GAAG,cAAW,4BAAO,wDAAC,uDAAkB,MAAM,IAAI,GAAE;AAAA,WAAS;AAAA,QAChO,8CAAC,SAAI,WAAU,2BAA2B,oBAAU,WAAW,IAAI,eAAa;AAC9E,gBAAM,UAAU,SAAS,SAAS,KAAK,UAAQ,KAAK,gBAAgB,UAAU,EAAE;AAChF,iBAAO,+CAAC,YAAO,MAAK,UAA4B,WAAW,CAAC,iBAAiB,eAAe,UAAU,KAAK,cAAc,IAAI,SAAS,MAAM,cAAc,UAAU,EAAE,GACpK;AAAA,0DAAC,UAAO,MAAM,UAAU,MAAM;AAAA,YAAE,+CAAC,UAAK;AAAA,4DAAC,YAAQ,oBAAU,MAAK;AAAA,cAAS,8CAAC,WAAO,oBAAU,MAAK;AAAA,eAAQ;AAAA,YAAO,8CAAC,OAAE,WAAW,SAAS,kBAAkB,YAAY,cAAc,IAAI,OAAO,UAAU,QAAQ,gBAAgB,kCAAS;AAAA,eADtM,UAAU,EAE5C;AAAA,QACF,CAAC,GAAE;AAAA,QACH,+CAAC,SAAI,WAAU,6BAA4B,cAAW,kCACpD;AAAA,yDAAC,YAAO,MAAK,UAAS,WAAW,SAAS,WAAW,cAAc,IAAI,gBAAc,SAAS,WAAW,SAAS,QAAW,SAAS,MAAM,QAAQ,QAAQ,GAAG;AAAA,0DAAC,UAAK,wDAAC,yDAAoB,MAAM,IAAI,GAAE;AAAA,YAAO,8CAAC,YAAO,gCAAQ;AAAA,YAAS,8CAAC,WAAM,wDAAO;AAAA,aAAQ;AAAA,UAC5P,+CAAC,YAAO,MAAK,UAAS,WAAW,SAAS,UAAU,cAAc,IAAI,gBAAc,SAAS,UAAU,SAAS,QAAW,SAAS,MAAM,QAAQ,OAAO,GAAG;AAAA,0DAAC,UAAK,wDAAC,0DAAqB,MAAM,IAAI,GAAE;AAAA,YAAO,8CAAC,YAAO,sCAAI;AAAA,YAAS,8CAAC,WAAM,8DAAQ;AAAA,aAAQ;AAAA,UACvP,+CAAC,YAAO,MAAK,UAAS,WAAW,SAAS,cAAc,cAAc,IAAI,gBAAc,SAAS,cAAc,SAAS,QAAW,SAAS,MAAM,QAAQ,WAAW,GAAG;AAAA,0DAAC,UAAK,wDAAC,uDAAkB,MAAM,IAAI,GAAE;AAAA,YAAO,8CAAC,YAAO,sCAAI;AAAA,YAAS,8CAAC,WAAM,8DAAQ;AAAA,aAAQ;AAAA,UAChQ,+CAAC,YAAO,MAAK,UAAS,WAAW,SAAS,YAAY,cAAc,IAAI,gBAAc,SAAS,YAAY,SAAS,QAAW,SAAS,MAAM,QAAQ,SAAS,GAAG;AAAA,0DAAC,UAAK,wDAAC,uDAAkB,MAAM,IAAI,GAAE;AAAA,YAAO,8CAAC,YAAO,sCAAI;AAAA,YAAS,8CAAC,WAAM,8DAAQ;AAAA,aAAQ;AAAA,WAC5P;AAAA,QACA,+CAAC,SAAI,WAAU,2BAA0B;AAAA,wDAAC,uDAAkB,MAAM,IAAI;AAAA,UAAE,+CAAC,UAAK;AAAA,0DAAC,YAAO,wDAAO;AAAA,YAAS,8CAAC,WAAM,yHAAsB;AAAA,aAAQ;AAAA,WAAO;AAAA,SACpJ;AAAA,MACA,+CAAC,aAAQ,WAAW,oBAAoB,gBAAgB,uBAAuB,EAAE,IAC9E;AAAA,kBAAU,8CAAC,gBAAM,OAAM,8CAAU,IAAK,gBAAgB,+CAAC,SAAI,WAAU,8CACnE;AAAA,mBAAS,YAAY,8CAAC,eAAY;AAAA,UAClC,SAAS,WAAW,8CAAC,oBAAe,eAAe,sBAAsB,QAAQ,aAAa,sBAAsB;AAAA,UACpH,SAAS,eAAe,8CAAC,iBAAc,YAAY,UAAU,cAAc,CAAC,GAAG;AAAA,UAC/E,SAAS,aAAa,8CAAC,wBAAqB;AAAA,WAC/C,IAAS,aAAa,SAAY,8CAAC,gBAAM,OAAM,8CAAU,QAAO,gHAAqB,QAAQ,8CAAC,YAAO,SAAS,MAAM,qBAAqB,IAAI,GAAG,sCAAI,GAAW,IAAK,gFAClK;AAAA,yDAAC,SAAI,WAAU,wBAAuB;AAAA,0DAAC,UAAO,MAAM,SAAS,MAAM;AAAA,YAAE,+CAAC,UAAK;AAAA,4DAAC,WAAM,8BAAgB;AAAA,cAAQ,8CAAC,QAAI,mBAAS,MAAK;AAAA,cAAK,8CAAC,OAAG,mBAAS,eAAe,SAAS,MAAK;AAAA,eAAI;AAAA,YAAO,8CAAC,iBAAO,SAAS,UAAU,SAAS,KAAK,UAAQ,KAAK,gBAAgB,SAAS,EAAE,GAAG;AAAA,aAAE;AAAA,UAC7Q,+CAAC,SAAI,WAAU,oBAAmB,cAAW,4BAC3C;AAAA,0DAAC,aAAU,QAAQ,SAAS,QAAQ,SAAS,MAAM,QAAQ,MAAM,GAAG,MAAM,8CAAC,8DAAyB,MAAM,IAAI,GAAI,0BAAE;AAAA,YACpH,8CAAC,aAAU,QAAQ,SAAS,YAAY,SAAS,MAAM,QAAQ,UAAU,GAAG,MAAM,8CAAC,uDAAkB,MAAM,IAAI,GAAI,0BAAE;AAAA,YACrH,8CAAC,aAAU,QAAQ,SAAS,gBAAgB,SAAS,MAAM,QAAQ,cAAc,GAAG,MAAM,8CAAC,8DAAyB,MAAM,IAAI,GAAI,0BAAE;AAAA,YACpI,8CAAC,aAAU,QAAQ,SAAS,UAAU,SAAS,MAAM,QAAQ,QAAQ,GAAG,MAAM,8CAAC,uDAAkB,MAAM,IAAG,GAAI,0BAAE;AAAA,YAChH,8CAAC,aAAU,QAAQ,SAAS,UAAU,SAAS,MAAM,QAAQ,QAAQ,GAAG,MAAM,8CAAC,uDAAkB,MAAM,IAAI,GAAI,0BAAE;AAAA,YACjH,8CAAC,aAAU,QAAQ,SAAS,YAAY,SAAS,MAAM,QAAQ,UAAU,GAAG,MAAM,8CAAC,yDAAoB,MAAM,IAAI,GAAI,sCAAI;AAAA,aAC3H;AAAA,UACA,+CAAC,SAAI,WAAU,4BACZ;AAAA,sBAAU,8CAAC,OAAE,WAAU,6BAA4B,MAAK,UAAU,kBAAO;AAAA,YACzE,SAAS,UAAU,8CAAC,aAAU,WAAW,UAAU,UAAqB,UAAU,SAAS,aAA0B,cAA4B,cAA4B;AAAA,YAC7K,SAAS,cAAc,8CAAC,kBAAe,WAAW,UAAU,OAAO,UAAU,WAAW,UAAU,GAAG,WAAW,MAAM,QAAQ,IAAI,GAAG,WAAW,kBAAkB;AAAA,YAClK,SAAS,kBAAkB,8CAAC,oBAAmC,WAAW,UAAU,SAAS,UAAU,WAAW,CAAC,GAAG,WAAW,MAAM,QAAQ,IAAI,KAAjG,SAAS,EAA2F;AAAA,YACtJ,SAAS,YAAY,8CAAC,iBAAgC,WAAW,UAAU,UAAqB,WAAW,SAAS,QAAQ,8CAAC,eAAY,WAAW,UAAU,UAAqB,WAAW,SAAS,KAA9J,SAAS,EAAyJ;AAAA,YAC3M,SAAS,YAAY,8CAAC,eAA8B,WAAW,UAAU,UAAqB,aAA0B,cAA4B,cAA4B,WAAW,WAApJ,SAAS,EAAoJ;AAAA,YACpM,SAAS,cAAc,8CAAC,gBAA+B,WAAW,UAAU,UAAqB,WAAW,WAAlE,SAAS,EAAkE;AAAA,aACxH;AAAA,WACF;AAAA,QACC,SAAS,8CAAC,OAAE,WAAU,qBAAoB,MAAK,SAAS,iBAAM;AAAA,SACjE;AAAA,OACF;AAAA,KACF;AACF;AAEA,SAAS,wBAAwB,EAAE,YAAY,YAAY,MAAM,eAAe,UAAU,gBAAgB,GAO1F;AACd,SAAO,+CAAC,SAAI,WAAU,+BACpB;AAAA,mDAAC,SAAI,WAAU,oCACb;AAAA,oDAAC,mBAAgB,YAAwB,YAAwB,UAAU,eAAe;AAAA,MAC1F,8CAAC,YAAO,MAAK,UAAS,WAAU,6BAA4B,SAAS,iBAAiB,cAAW,4BAAO,wDAAC,uDAAkB,MAAM,IAAI,GAAE;AAAA,OACzI;AAAA,IACA,+CAAC,SAAI,WAAU,oCAAmC,cAAW,0DAC3D;AAAA,qDAAC,YAAO,MAAK,UAAS,WAAW,SAAS,WAAW,cAAc,IAAI,gBAAc,SAAS,UAAU,SAAS,MAAM,SAAS,QAAQ,GAAG;AAAA,sDAAC,yDAAoB,MAAM,IAAI;AAAA,QAAE,8CAAC,UAAK,mBAAK;AAAA,SAAO;AAAA,MAC9L,+CAAC,YAAO,MAAK,UAAS,WAAW,SAAS,UAAU,cAAc,IAAI,gBAAc,SAAS,SAAS,SAAS,MAAM,SAAS,OAAO,GAAG;AAAA,sDAAC,0DAAqB,MAAM,IAAI;AAAA,QAAE,8CAAC,UAAK,0BAAE;AAAA,SAAO;AAAA,MACzL,+CAAC,YAAO,MAAK,UAAS,WAAW,SAAS,cAAc,cAAc,IAAI,gBAAc,SAAS,aAAa,SAAS,MAAM,SAAS,WAAW,GAAG;AAAA,sDAAC,uDAAkB,MAAM,IAAI;AAAA,QAAE,8CAAC,UAAK,0BAAE;AAAA,SAAO;AAAA,MAClM,+CAAC,YAAO,MAAK,UAAS,WAAW,SAAS,YAAY,cAAc,IAAI,gBAAc,SAAS,WAAW,SAAS,MAAM,SAAS,SAAS,GAAG;AAAA,sDAAC,uDAAkB,MAAM,IAAI;AAAA,QAAE,8CAAC,UAAK,0BAAE;AAAA,SAAO;AAAA,OAC9L;AAAA,KACF;AACF;AAEA,SAAS,UAAU,EAAE,WAAW,UAAU,UAAU,aAAa,cAAc,aAAa,GAA4Q;AACtW,QAAM,UAAU,SAAS,SAAS,KAAK,UAAQ,KAAK,gBAAgB,UAAU,EAAE;AAChF,QAAMC,YAAW,SAAS,SAAS,OAAO,UAAQ,KAAK,gBAAgB,UAAU,EAAE;AACnF,QAAM,eAAeA,UAAS,KAAK,UAAQ,KAAK,SAAS,OAAO;AAChE,QAAM,UAAU,UAAU,SAAS,SAAS,OAAO,UAAQ,KAAK,cAAc,QAAQ,MAAM,KAAK,WAAW,SAAS,EAAE,SAAS;AAChI,QAAM,WAAW,UAAU,SAAS,SAAS,OAAO,UAAQ,KAAK,cAAc,QAAQ,MAAM,KAAK,WAAW,UAAU,EAAE,SAAS;AAClI,QAAM,eAAe,UAAU,aAAa,IAAI,UAAQ,kBAAkB,IAAI,CAAC;AAC/E,QAAM,SAAS,SAAS,kBAAkB;AAC1C,SAAO,+CAAC,SAAI,WAAU,oBACpB;AAAA,mDAAC,YAAO,WAAU,4BAChB;AAAA,qDAAC,UAAK;AAAA,sDAAC,WAAM,gCAAG;AAAA,QAAQ,8CAAC,QAAI,mBAAS,GAAG,UAAU,IAAI,0CAAY,GAAG,UAAU,IAAI,mCAAS;AAAA,SAAK;AAAA,MAClG,8CAAC,OAAG,mBAAS,iHAAuB,0GAAoB;AAAA,OAC1D;AAAA,IAEA,+CAAC,aAAQ,WAAW,2BAA2B,SAAS,eAAe,EAAE,IACvE;AAAA,qDAAC,SAAI,WAAU,0BAAyB,eAAY,QAClD;AAAA,sDAAC,UAAO,MAAM,UAAU,MAAM;AAAA,QAC9B,8CAAC,UAAK,WAAU,0BAAyB,wDAAC,OAAE,GAAE;AAAA,QAC9C,8CAAC,UAAK,WAAU,4BAA2B,wDAAC,eAAY,OAAK,MAAC,GAAE;AAAA,SAClE;AAAA,MACA,+CAAC,SAAI,WAAU,iCACb;AAAA,uDAAC,UAAK,WAAU,2BAA0B;AAAA,wDAAC,OAAE;AAAA,UAAE;AAAA,UAAQ,SAAS,aAAW,WAAS,WAAS,SAAS,aAAW,eAAa,eAAa;AAAA,WAAK;AAAA,QAChJ,8CAAC,QAAI,WAAC,UAAU,yCAAW,SAAS,uEAAgB,QAAQ,kBAAkB,UAAU,qDAAa,8CAAU;AAAA,QAC/G,8CAAC,OAAG,WAAC,UAAU,yIAA0C,SAAS,uKAAgC,QAAQ,aAAa,gHAAqB;AAAA,QAC5I,+CAAC,SAAI,WAAU,oCACb;AAAA,wDAAC,YAAO,MAAK,UAAS,WAAU,cAAa,SAAS,MAAM,SAAS,QAAQ,GAAI,WAAC,UAAU,6BAAS,UAAU,IAAI,gBAAM,OAAO,wBAAS,4BAAO;AAAA,UAChJ,8CAAC,UAAM,WAAC,UAAU,2DAAc,GAAG,QAAQ,iEAAgB;AAAA,WAC7D;AAAA,SACF;AAAA,OACF;AAAA,IAEA,+CAAC,SAAI,WAAU,4BACb;AAAA,qDAAC,aAAQ,WAAU,4BACjB;AAAA,uDAAC,YAAO;AAAA,wDAAC,UAAK,wDAAC,uDAAkB,MAAM,IAAI,GAAE;AAAA,UAAO,+CAAC,SAAI;AAAA,0DAAC,WAAM,sCAAI;AAAA,YAAQ,8CAAC,YAAQ,oBAAU,MAAK;AAAA,aAAS;AAAA,UAAM,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,SAAS,UAAU,GAAG,0BAAE;AAAA,WAAS;AAAA,QACzL,8CAAC,gBAAY,oBAAU,gBAAgB,UAAU,eAAe,sEAAc;AAAA,SAChF;AAAA,MACA,+CAAC,aAAQ,WAAU,4BACjB;AAAA,uDAAC,YAAO;AAAA,wDAAC,UAAK,wDAAC,8DAAyB,MAAM,IAAI,GAAE;AAAA,UAAO,+CAAC,SAAI;AAAA,0DAAC,WAAM,sCAAI;AAAA,YAAQ,8CAAC,YAAQ,oBAAU,YAAY,2BAAgB;AAAA,aAAS;AAAA,UAAM,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,SAAS,cAAc,GAAG,0BAAE;AAAA,WAAS;AAAA,QAC3N,8CAAC,SAAI,WAAU,oCAAoC,uBAAa,SAAS,aAAa,IAAI,UAAQ,8CAAC,QAAe,kBAAP,IAAY,CAAK,IAAI,8CAAC,WAAM,8DAAQ,GAAS;AAAA,SAC1J;AAAA,MACA,+CAAC,aAAQ,WAAU,+BACjB;AAAA,uDAAC,YAAO;AAAA,wDAAC,UAAK,wDAAC,uDAAkB,MAAM,IAAI,GAAE;AAAA,UAAO,+CAAC,SAAI;AAAA,0DAAC,WAAM,sCAAI;AAAA,YAAQ,8CAAC,YAAQ,wBAAc,WAAW,mCAAU,8CAAU;AAAA,aAAS;AAAA,UAAM,8CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,iBAAiB,SAAY,KAAK,aAAa,UAAU,EAAE,IAAI,aAAa,WAAW,KAAK,aAAa,aAAa,EAAE,IAAI,KAAK,YAAY,aAAa,IAAI,aAAa,SAAS,GAAI,2BAAiB,SAAY,6BAAS,aAAa,WAAW,mCAAU,4BAAO;AAAA,WAAS;AAAA,QACtc,8CAAC,OAAG,yBAAe,kCAAS,aAAa,aAAa,aAAa,CAAC,mFAAkB,0GAAoB;AAAA,SAC5G;AAAA,OACF;AAAA,KACF;AACF;AAEA,SAAS,YAAY,EAAE,WAAW,UAAU,UAAU,GAAqG;AACzJ,QAAM,UAAU,SAAS,SAAS,KAAK,UAAQ,KAAK,gBAAgB,UAAU,OAAO,CAAC,KAAK,YAAY,KAAK,aAAW,SAAS;AAChI,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAoB;AAC9C,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB;AAC3C,gCAAU,MAAM;AACd,QAAI,CAAC,SAAS,MAAM,UAAU,eAAe,MAAM,UAAU,aAAa,MAAM,UAAU,QAAS;AACnG,UAAMC,SAAQ,OAAO,YAAY,MAAM;AACrC,WAAK,IAAiD,iBAAiB,MAAM,EAAE,EAAE,EAAE,KAAK,OAAM,WAAU;AACtG,iBAAS,OAAO,KAAK;AACrB,YAAI,OAAO,SAAS;AAAE,mBAAS,MAAS;AAAG,gBAAM,UAAU;AAAA,QAAE;AAAA,MAC/D,CAAC,EAAE,MAAM,YAAU,SAAS,aAAQ,MAAM,CAAC,CAAC;AAAA,IAC9C,GAAG,GAAK;AACR,WAAO,MAAM,cAAcA,MAAK;AAAA,EAClC,GAAG,CAAC,OAAO,IAAI,OAAO,OAAO,SAAS,CAAC;AACvC,QAAM,QAAQ,YAA2B;AACvC,YAAQ,IAAI;AAAG,aAAS,MAAS;AACjC,QAAI;AAAE,eAAS,MAAM,IAAI,iBAAiB,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,aAAa,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC;AAAA,IAAE,SAC7G,QAAQ;AAAE,eAAS,aAAQ,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,KAAK;AAAA,IAAE;AAAA,EACxE;AACA,QAAM,SAAS,YAA2B;AACxC,QAAI,CAAC,QAAS;AACd,YAAQ,IAAI;AAAG,aAAS,MAAS;AACjC,QAAI;AAAE,YAAM,IAAI,aAAa,QAAQ,EAAE,YAAY,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC,QAAQ,QAAQ,CAAC,EAAE,CAAC;AAAG,YAAM,UAAU;AAAA,IAAE,SACxI,QAAQ;AAAE,eAAS,aAAQ,MAAM,CAAC;AAAA,IAAE,UAAE;AAAU,cAAQ,KAAK;AAAA,IAAE;AAAA,EACxE;AACA,QAAM,WAAW,UAAU,SAAS,SAAS,OAAO,UAAQ,KAAK,cAAc,QAAQ,EAAE,IAAI,CAAC;AAC9F,QAAM,aAAa,OAAO,IAAY,WAAkD;AACtF,QAAI;AAAE,YAAM,IAAI,aAAa,EAAE,WAAW,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;AAAG,YAAM,UAAU;AAAA,IAAE,SAAS,QAAQ;AAAE,eAAS,aAAQ,MAAM,CAAC;AAAA,IAAE;AAAA,EAClK;AACA,SAAO,+CAAC,SAAI,WAAU,+BAA8B;AAAA,kDAAC,kBAAQ,SAAQ,mBAAkB,OAAM,4BAAO,QAAO,gOAAqD;AAAA,IAC7J,CAAC,WAAW,CAAC,SAAS,+CAAC,gBAAa,IAAG,OAAM,aAAW,MAAC,WAAU,8BAA6B,cAAc,IAAI,iBAAiB,KAAK,YAAY,MAAM;AAAA,oDAAC,SAAI,WAAU,2BAA0B,wDAAC,eAAY,OAAK,MAAC,GAAE;AAAA,MAAM,+CAAC,UAAK;AAAA,uDAAC,YAAO;AAAA;AAAA,UAAG,UAAU;AAAA,UAAK;AAAA,WAAK;AAAA,QAAS,8CAAC,OAAE,qOAAwC;AAAA,QAAI,+CAAC,QAAG;AAAA,wDAAC,QAAG,0EAAU;AAAA,UAAK,8CAAC,QAAG,sFAAY;AAAA,UAAK,8CAAC,QAAG,wGAAe;AAAA,WAAK;AAAA,SAAK;AAAA,MAAO,8CAAC,YAAO,MAAK,UAAS,UAAU,MAAM,SAAS,MAAM;AAAE,aAAK,MAAM;AAAA,MAAE,GAAI,iBAAO,qDAAa,wCAAS;AAAA,OAAS;AAAA,IACzf,SAAS,+CAAC,gBAAa,IAAG,OAAM,aAAW,MAAC,WAAU,kBAAiB,cAAc,IAAI,iBAAiB,KAAK,YAAY,MAAM;AAAA,oDAAC,SAAI,WAAU,uBAAuB,gBAAM,aAAa,8CAAC,aAAU,OAAO,MAAM,WAAW,MAAM,KAAK,OAAM,KAAI,GAAG;AAAA,MAAM,+CAAC,UAAK;AAAA,sDAAC,WAAM,8BAAgB;AAAA,QAAQ,8CAAC,YAAQ,gBAAM,UAAU,YAAY,iEAAe,MAAM,UAAU,YAAY,yCAAW,MAAM,UAAU,UAAU,6BAAS,wCAAS;AAAA,QAAS,8CAAC,OAAG,gBAAM,UAAU,MAAM,UAAU,YAAY,iHAA4B,4IAA6B;AAAA,SAAM,MAAM,UAAU,aAAa,MAAM,UAAU,YAAY,+CAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAAE,mBAAS,MAAS;AAAG,eAAK,MAAM;AAAA,QAAE,GAAG;AAAA,wDAAC,0DAAqB,MAAM,IAAI;AAAA,UAAE;AAAA,WAAI;AAAA,SAAU;AAAA,OAAO;AAAA,IAC3tB,WAAW,gFACV;AAAA,qDAAC,gBAAa,IAAG,OAAM,aAAW,MAAC,WAAU,4BAA2B,cAAc,IAAI,iBAAiB,KAAK,YAAY,MAAM;AAAA,sDAAC,SAAI,WAAU,2BAA0B,wDAAC,eAAY,OAAK,MAAC,GAAE;AAAA,QAAM,+CAAC,UAAK;AAAA,wDAAC,WAAM,4BAAc;AAAA,UAAQ,8CAAC,YAAQ,kBAAQ,MAAK;AAAA,UAAS,8CAAC,OAAG,kBAAQ,WAAU;AAAA,WAAI;AAAA,QAAO,8CAAC,iBAAO,SAAkB;AAAA,QAAE,8CAAC,YAAO,MAAK,UAAS,WAAU,sBAAqB,WAAS,QAAQ,SAAS,UAAU,MAAM,cAAY,QAAQ,UAAU,yCAAW,wCAAU,SAAS,MAAM;AAAE,eAAK,OAAO;AAAA,QAAE,GAAG,wDAAC,OAAE,GAAE;AAAA,SAAS;AAAA,MACtgB,QAAQ,aAAa,8CAAC,OAAE,WAAU,4BAA4B,kBAAQ,WAAU;AAAA,MACjF,+CAAC,SAAI,WAAU,+BAA8B;AAAA,uDAAC,UAAK;AAAA,wDAAC,WAAM,oBAAM;AAAA,UAAQ,8CAAC,YAAO,sCAAI;AAAA,WAAS;AAAA,QAAO,+CAAC,QAAI;AAAA,mBAAS,OAAO,UAAQ,KAAK,WAAW,SAAS,EAAE;AAAA,UAAO;AAAA,WAAK;AAAA,SAAK;AAAA,MAC7K,8CAAC,SAAI,WAAU,wBAAwB,mBAAS,WAAW,IAAI,8CAAC,gBAAM,OAAM,wCAAS,QAAO,oJAA2B,SAAO,MAAC,IAAK,SAAS,IAAI,aAAW,+CAAC,aAAyB;AAAA,sDAAC,UAAK,WAAW,MAAM,QAAQ,MAAM,IAAI,wDAAC,uDAAkB,MAAM,IAAI,GAAE;AAAA,QAAO,+CAAC,SAAI;AAAA,wDAAC,YAAQ,kBAAQ,aAAY;AAAA,UAAS,+CAAC,WAAO;AAAA,oBAAQ,WAAW,YAAY,6BAAS,QAAQ,WAAW,aAAa,+CAAY;AAAA,YAAM;AAAA,YAAI,IAAI,KAAK,QAAQ,SAAS,EAAE,eAAe;AAAA,aAAE;AAAA,WAAQ;AAAA,QAAO,QAAQ,WAAW,aAAa,gFAAE;AAAA,wDAAC,YAAO,SAAS,MAAM;AAAE,iBAAK,WAAW,QAAQ,IAAI,SAAS;AAAA,UAAE,GAAG,0BAAE;AAAA,UAAS,8CAAC,YAAO,WAAU,cAAa,SAAS,MAAM;AAAE,iBAAK,WAAW,QAAQ,IAAI,UAAU;AAAA,UAAE,GAAG,0BAAE;AAAA,WAAS;AAAA,QAAK,QAAQ,WAAW,cAAc,8CAAC,YAAO,SAAS,MAAM;AAAE,eAAK,WAAW,QAAQ,IAAI,SAAS;AAAA,QAAE,GAAG,0BAAE;AAAA,QAAW,QAAQ,WAAW,aAAa,8CAAC,YAAO,SAAS,MAAM;AAAE,eAAK,WAAW,QAAQ,IAAI,UAAU;AAAA,QAAE,GAAG,sCAAI;AAAA,WAA5tB,QAAQ,EAA8tB,CAAU,GAAE;AAAA,OAC95B;AAAA,IACC,SAAS,8CAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,KAC3D;AACF;AAEA,SAAS,gBAA4B;AAAE,MAAI,QAAQ,SAAS,eAAe,QAAQ;AAA8B,MAAI,CAAC,OAAO;AAAE,YAAQ,SAAS,cAAc,OAAO;AAAG,UAAM,KAAK;AAAU,UAAM,cAAc;AAAS,aAAS,KAAK,OAAO,KAAK;AAAA,EAAE;AAAE,SAAO,MAAM,OAAO,OAAO;AAAE;",
6
+ "names": ["import_react", "import_dsh_client_ui_primitives", "__defProp", "__hasOwnProp", "_QrCode", "_QrSegment", "React", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_react", "import_dsh_client_ui_primitives", "import_dsh_client_ui_primitives", "import_jsx_runtime", "active", "import_react", "import_react", "import_jsx_runtime", "import_jsx_runtime", "changed", "current", "import_react", "import_jsx_runtime", "source", "target", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "changed", "document", "import_react", "timer", "import_jsx_runtime", "changed", "import_react", "import_jsx_runtime", "current", "import_jsx_runtime", "import_jsx_runtime", "sessions", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "import_react", "import_jsx_runtime", "timer", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "active", "timer", "reason", "current", "import_jsx_runtime", "timer", "poll", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_react", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_react", "apply", "timer", "poll", "import_react", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_jsx_runtime", "module", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "current", "import_react", "import_react", "import_jsx_runtime", "innerWidth", "innerHeight", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_jsx_runtime", "changed", "import_jsx_runtime", "load", "current", "changed", "document", "import_react", "import_dsh_client_ui_primitives", "import_react", "poll", "timer", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "changed", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "load", "changed", "import_jsx_runtime", "load", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "load", "run", "changed", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "load", "current", "import_jsx_runtime", "active", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "import_react", "import_jsx_runtime", "import_jsx_runtime", "FormField", "platform", "import_react", "listeners", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "current", "listeners", "current", "import_jsx_runtime", "current", "sessions", "timer"]
7
7
  }