soulnet-dsh 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -0
  3. package/cordis.patch.yml +40 -0
  4. package/lib/client.js +5427 -0
  5. package/lib/client.js.map +1 -0
  6. package/lib/commands.js +94 -0
  7. package/lib/commands.js.map +1 -0
  8. package/lib/events-Cz7g9aXF.js +134 -0
  9. package/lib/events-Cz7g9aXF.js.map +1 -0
  10. package/lib/events-DHPK3pow.js +134 -0
  11. package/lib/events-DHPK3pow.js.map +1 -0
  12. package/lib/events-DViXNRAZ.js +9 -0
  13. package/lib/events-DViXNRAZ.js.map +1 -0
  14. package/lib/index.js +2547 -0
  15. package/lib/index.js.map +1 -0
  16. package/lib/policy-HQKLctKr.js +96 -0
  17. package/lib/policy-HQKLctKr.js.map +1 -0
  18. package/lib/send-BL_Yr40O.js +33 -0
  19. package/lib/send-BL_Yr40O.js.map +1 -0
  20. package/lib/send-DcYQC5CC.js +127 -0
  21. package/lib/send-DcYQC5CC.js.map +1 -0
  22. package/lib/sessions.js +1197 -0
  23. package/lib/sessions.js.map +1 -0
  24. package/lib/tools.js +342 -0
  25. package/lib/tools.js.map +1 -0
  26. package/lib/types/alter-state.d.ts +185 -0
  27. package/lib/types/api/index.d.ts +52 -0
  28. package/lib/types/client/A2ANode.d.ts +4 -0
  29. package/lib/types/client/AlterPane.d.ts +9 -0
  30. package/lib/types/client/ChatPane.d.ts +13 -0
  31. package/lib/types/client/DraftCard.d.ts +11 -0
  32. package/lib/types/client/FriendComposer.d.ts +20 -0
  33. package/lib/types/client/FriendList.d.ts +12 -0
  34. package/lib/types/client/FriendPane.d.ts +13 -0
  35. package/lib/types/client/Inbox.d.ts +9 -0
  36. package/lib/types/client/InboxOverlay.d.ts +8 -0
  37. package/lib/types/client/Onboarding.d.ts +4 -0
  38. package/lib/types/client/SettingsSection.d.ts +29 -0
  39. package/lib/types/client/SidebarEntry.d.ts +9 -0
  40. package/lib/types/client/SoulmirrorPage.d.ts +12 -0
  41. package/lib/types/client/SoulmirrorView.d.ts +5 -0
  42. package/lib/types/client/a2a-node.d.ts +46 -0
  43. package/lib/types/client/alter-ui.d.ts +35 -0
  44. package/lib/types/client/api.d.ts +424 -0
  45. package/lib/types/client/inbox-state.d.ts +57 -0
  46. package/lib/types/client/index.d.ts +30 -0
  47. package/lib/types/client/locales.d.ts +239 -0
  48. package/lib/types/client/page-state.d.ts +116 -0
  49. package/lib/types/client/page-store.d.ts +96 -0
  50. package/lib/types/client/panel-store.d.ts +30 -0
  51. package/lib/types/client/styles.d.ts +2 -0
  52. package/lib/types/commands/index.d.ts +24 -0
  53. package/lib/types/drafts.d.ts +50 -0
  54. package/lib/types/events.d.ts +61 -0
  55. package/lib/types/friend-settings.d.ts +41 -0
  56. package/lib/types/index.d.ts +43 -0
  57. package/lib/types/network/fake.d.ts +10 -0
  58. package/lib/types/network/jsonrpc.d.ts +52 -0
  59. package/lib/types/network/send.d.ts +19 -0
  60. package/lib/types/network/soulnet.d.ts +123 -0
  61. package/lib/types/network/types.d.ts +203 -0
  62. package/lib/types/persona.d.ts +45 -0
  63. package/lib/types/policy.d.ts +105 -0
  64. package/lib/types/sessions/index.d.ts +182 -0
  65. package/lib/types/settings.d.ts +58 -0
  66. package/lib/types/tools/define.d.ts +35 -0
  67. package/lib/types/tools/index.d.ts +57 -0
  68. package/lib/types-zwvjR1n5.js +29 -0
  69. package/lib/types-zwvjR1n5.js.map +1 -0
  70. package/package.json +133 -0
  71. package/presets/soulmirror-chat/agent.cordis.yml +24 -0
  72. package/presets/soulmirror-chat/preset.yml +3 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","names":["useSyncExternalStore","Tooltip","useState","useRef","useCallback","Toast","useState","useSyncExternalStore","useCopy","useState","useCallback","useSyncExternalStore","useSyncExternalStore","useState","useRef","Modal","Button","useSyncExternalStore","useState","Button","IconCheckOutline14","IconCloseFill14","FOLLOW_SLACK","useSyncExternalStore","useState","useRef","useCallback","Tooltip","IconRightUpOutline14","Button","IconSendOutline16","useCopy","useState","useCallback","writeClipboard","useSyncExternalStore","Tooltip","IconCheckOutline14","IconCopyOutline16","IconRefreshOutline14","IconCloseOutline16","IconSearchOutline16","IconCloseFill14","Button","useSyncExternalStore","useState","useRef","IconUserOutline16","IconCheckOutline14","writeClipboard","IconCopyOutline16","Button","IconSendOutline16","Tooltip","useSyncExternalStore","useCallback","useRef","useState","useState","useCallback","writeClipboard","useSyncExternalStore","Tooltip","IconCheckOutline14","IconCopyOutline16","IconRefreshOutline14","IconCloseFill14","Button","Button"],"sources":["../src/events.ts","../src/client/a2a-node.ts","../src/client/A2ANode.tsx","../src/client/inbox-state.ts","../src/client/api.ts","../src/client/page-state.ts","../src/client/page-store.ts","../src/client/SidebarEntry.tsx","../src/client/InboxOverlay.tsx","../src/client/locales.ts","../src/client/alter-ui.tsx","../src/client/SettingsSection.tsx","../src/client/Onboarding.tsx","../src/client/DraftCard.tsx","../src/client/AlterPane.tsx","../src/client/FriendList.tsx","../src/client/FriendPane.tsx","../src/client/SoulmirrorPage.tsx","../src/client/Inbox.tsx","../src/client/SoulmirrorView.tsx","../src/client/styles.ts","../src/client/index.ts"],"sourcesContent":["/**\n * Shared vocabulary of soulnet-dsh: branded ids and the\n * `user/message` source tag that marks an inbound A2A mail.\n *\n * There is deliberately NO custom SessionEventMap merge here any more. The P0\n * spike (dsh/SPIKE.md §1) showed that a custom durable event type makes the\n * session log unloadable (the persistence read path refuses unknown,\n * non-ignorable types), so every inbound mail is written as an ordinary\n * `user/message` whose `source` carries the fields below; the client half\n * recognises that source and renders the message as a chat bubble.\n *\n * P4: the same relay source also carries the plugin's own NOTES into the\n * alter session (the owner approved / rejected / edited a draft) — marked by\n * `a2a.note`, never woken as a turn, rendered as a system line.\n *\n * Keep this file free of runtime imports apart from constants: the client\n * bundle imports it as well.\n */\nimport type { Branded } from '@deepseek-ai/dsh-brand'\n\n/** Stable A2A message id (the relay envelope id; replay-safe). */\nexport type A2AMessageId = Branded<'A2AMessageId'>\n/** Fingerprint of a peer's signing key (the A2A identity). */\nexport type Fingerprint = Branded<'Fingerprint'>\n\n/** `source.plugin` of the `user/message` carrying an inbound A2A mail. */\nexport const SOULMIRROR_PLUGIN = 'soulmirror'\n/** `source.form` of that message: dsh's built-in \"a message another agent addressed to this one\". */\nexport const RELAY_FORM = 'relay'\n\n/** Kinds of plugin notes written into the alter session (P4 draft decisions). */\nexport type A2ANoteKind = 'draft-approved' | 'draft-rejected' | 'draft-revise'\n\n/** The extra `a2a` block the host attaches to the relay source (wire-extensible; the literal type is closed upstream). */\nexport interface A2ASourceMeta {\n readonly id: string\n readonly fp: string\n readonly ts: number\n readonly auto?: true\n /** A2A message type (`text`, `app_share`, …); absent means `text`. */\n readonly type?: string\n /** Set on the plugin's own notes (draft decisions): not mail, never a turn trigger. */\n readonly note?: A2ANoteKind\n /** Draft id the note refers to. */\n readonly draftId?: string\n}\n\n/** Shape the client renderer derives from such a `user/message` (one bubble). */\nexport interface A2AMessageData {\n readonly id: A2AMessageId\n /** `in`: friend → me; `out`: me → friend. */\n readonly dir: 'in' | 'out'\n /** Peer fingerprint (the friend this message belongs to). */\n readonly fp: Fingerprint\n /** Display name of the peer at send time. */\n readonly name: string\n readonly body: string\n /** Unix epoch ms at the sender. */\n readonly ts: number\n /** Outbound delivery state; absent on inbound. */\n readonly delivery?: 'queued' | 'sent' | 'failed'\n /** Set when the message was produced by a peer's auto-reply (loop guard). */\n readonly auto?: true\n /** Set when the row is a plugin note (draft decision), not mail. */\n readonly note?: A2ANoteKind\n}\n","/**\n * Conversation Node Definition for SoulMirror relayed rows in the NATIVE dsh\n * view of the alter session.\n *\n * The host writes each inbound A2A message as a `user/message` whose source is\n * `{ kind:'plugin', plugin:'soulmirror', form:'relay', senderSessionId, a2a:{…} }`\n * (see ../sessions/index.ts and SPIKE.md §1) — and, since P4, its own NOTES\n * (the owner decided a draft) with the same source plus `a2a.note`. This\n * definition folds exactly those events into `a2a-message` chat nodes that\n * ./A2ANode.tsx paints as a bubble (mail) or a system line (note).\n * ui-conversation's own `input-message` definition also renders the same\n * event as a collapsed \"Context injection · soulmirror\" row; shadowing that\n * row (keyed `context` renderer at priority -1) is still open.\n */\nimport type { ConversationNodeDefinition } from '@deepseek-ai/dsh-client-runtime/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type { A2AMessageData, A2ASourceMeta } from '../events.ts'\nimport { RELAY_FORM, SOULMIRROR_PLUGIN } from '../events.ts'\n\n/** Renderer payload: the message plus the seq of the event that produced the node. */\nexport interface A2AChatData extends A2AMessageData {\n readonly seq: number\n readonly type?: string\n}\n\ndeclare module '@deepseek-ai/dsh-client-ui-conversation/client' {\n interface ChatNodeDataMap {\n 'a2a-message': A2AChatData\n }\n}\n\ndeclare module '@deepseek-ai/dsh-client-runtime/client' {\n interface ConversationStepDataMap {\n 'a2a-message': A2AChatData\n }\n}\n\ninterface RelaySource {\n kind?: unknown\n plugin?: unknown\n form?: unknown\n senderSessionId?: unknown\n a2a?: Partial<A2ASourceMeta>\n}\n\n/** Whether a `user/message` source is a SoulMirror relayed row (mail or note). */\nexport function isSoulmirrorRelaySource(source: unknown): source is RelaySource & { a2a?: Partial<A2ASourceMeta> } {\n const s = source as RelaySource | undefined\n return s?.kind === 'plugin' && s.plugin === SOULMIRROR_PLUGIN && s.form === RELAY_FORM\n}\n\n/** Strip the host's model-facing preamble (first line) so the bubble shows the mail body only. */\nexport function bodyOfRelayText(text: string): string {\n return text.includes('\\n') ? text.slice(text.indexOf('\\n') + 1) : text\n}\n\nexport const a2aRelayDefinition: ConversationNodeDefinition<A2AChatData> = {\n kind: 'a2a-message',\n target: 'chat',\n match: (event) => {\n if (event.type !== 'user/message') return null\n const source = (event.data as { source?: unknown }).source\n if (!isSoulmirrorRelaySource(source)) return null\n const id = typeof source.a2a?.id === 'string' ? source.a2a.id : String((event.data as { id: unknown }).id)\n return { id: `relay:${id}`, role: 'start' }\n },\n start: (_context, match) => {\n const data = match.event.data as { content: { type: string; text?: string }[]; source: RelaySource }\n const text = data.content.map(block => block.type === 'text' ? block.text ?? '' : '').join('')\n const a2a = data.source.a2a\n const note = typeof a2a?.note === 'string' ? a2a.note : undefined\n return {\n id: String(a2a?.id ?? match.event.seq) as A2AChatData['id'],\n dir: 'in',\n fp: String(a2a?.fp ?? '') as A2AChatData['fp'],\n name: typeof data.source.senderSessionId === 'string' ? data.source.senderSessionId : 'friend',\n // Notes keep their one-line text (the \"[SoulMirror note] \" prefix is stripped by the renderer).\n body: note === undefined ? bodyOfRelayText(text) : text.replace(/^\\[SoulMirror note\\]\\s*/, ''),\n ts: typeof a2a?.ts === 'number' ? a2a.ts : match.event.time,\n ...(a2a?.auto === true ? { auto: true as const } : {}),\n ...(typeof a2a?.type === 'string' ? { type: a2a.type } : {}),\n ...(note === undefined ? {} : { note }),\n seq: match.event.seq,\n }\n },\n update: context => context.state,\n buildViewNode: (context) => {\n if (context.state === undefined) return null\n return {\n key: context.key,\n kind: 'a2a-message',\n id: context.id,\n target: 'chat',\n anchorSeq: context.state.seq,\n location: context.start?.location ?? context.matches[0]?.location ?? { kind: 'unresolved' as const },\n visibility: 'visible' as const,\n data: context.state,\n }\n },\n}\n","/** Keyed Chat renderer for `a2a-message` nodes in the native alter session: a friend bubble, or a system line for a plugin note. */\nimport type { CSSProperties } from 'react'\n// Type-only: the 'conversation.chat.node' SlotMap row + our ChatNodeDataMap merge.\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { A2AChatData } from './a2a-node.ts'\nimport type { NS } from './locales.ts'\n\nexport type A2ANodeProps = PropsRuntime<'conversation.chat.node', 'a2a-message'> & PropsLocale<typeof NS>\n\nconst row = (dir: 'in' | 'out'): CSSProperties => ({\n display: 'flex',\n justifyContent: dir === 'in' ? 'flex-start' : 'flex-end',\n padding: '4px 0',\n})\n\nconst bubble = (dir: 'in' | 'out'): CSSProperties => ({\n maxWidth: '72%',\n padding: '8px 12px',\n borderRadius: dir === 'in' ? '4px 14px 14px 14px' : '14px 4px 14px 14px',\n background: dir === 'in' ? 'var(--dsw-specific-bubble, var(--dsw-alias-interactive-bg-hover))' : 'var(--dsw-alias-brand-primary)',\n color: dir === 'in' ? 'var(--dsw-alias-label-primary)' : 'var(--dsw-alias-label-primary-inverted)',\n border: dir === 'in' ? '1px solid var(--dsw-alias-border-l2)' : 'none',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n fontSize: '0.95em',\n lineHeight: 1.45,\n})\n\nconst meta: CSSProperties = {\n fontSize: '0.75em',\n color: 'var(--dsw-alias-label-tertiary)',\n marginBottom: 2,\n display: 'flex',\n gap: 8,\n}\n\nconst noteLine: CSSProperties = {\n display: 'flex',\n justifyContent: 'center',\n padding: '4px 0',\n fontSize: '0.78em',\n color: 'var(--dsw-alias-label-tertiary)',\n textAlign: 'center',\n}\n\nfunction time(ts: number): string {\n const d = new Date(ts)\n const pad = (n: number): string => String(n).padStart(2, '0')\n return `${pad(d.getHours())}:${pad(d.getMinutes())}`\n}\n\nexport function A2ANode({ node, t }: A2ANodeProps) {\n const data: A2AChatData = node.data\n if (data.note !== undefined) {\n return (\n <div style={noteLine} data-soulmirror-a2a-note={data.note}>\n <span>{t('bubble.note')} · {data.body} · {time(data.ts)}</span>\n </div>\n )\n }\n return (\n <div style={row(data.dir)} data-soulmirror-a2a={data.id}>\n <div>\n <div style={meta}>\n <span>{t(data.dir === 'in' ? 'bubble.in' : 'bubble.out', { name: data.name })}</span>\n <span>{time(data.ts)}</span>\n {data.auto ? <span>· {t('bubble.auto')}</span> : null}\n {data.type !== undefined ? <span>· {data.type}</span> : null}\n {data.delivery !== undefined ? <span>· {data.delivery}</span> : null}\n </div>\n <div style={bubble(data.dir)}>{data.body}</div>\n </div>\n </div>\n )\n}\n","/**\n * Pure inbox state: the friend list as the browser sees it (from\n * `/soulmirror/api/state`) folded with the live SSE frames (`message`,\n * `outbound`, `presence`, `typing`, `friend_accept`, `friend_request`,\n * `draft`) so the sidebar badge, the page's middle column and the new-mail\n * cue update instantly — the authoritative `/state` refetch that follows a\n * frame replaces the optimistic fold. No React, no DOM: unit-tested under\n * node (test/inbox-state.test.ts).\n */\nimport type { ApiDraft, ApiFriend, ApiPending, ApiState, NetworkEventFrame } from './api.ts'\n\nexport interface InboxFriend extends ApiFriend {}\n\n/** The slice of the network state the inbox surfaces read. */\nexport interface InboxState {\n readonly friends: readonly InboxFriend[]\n readonly pending: readonly ApiPending[]\n /** Pending drafts of the alter (P4), oldest first. */\n readonly drafts: readonly ApiDraft[]\n /** The alter session id (host), when known. */\n readonly alterSessionId: string | undefined\n /** fp → typing flag (live, never persisted). */\n readonly typing: Readonly<Record<string, boolean>>\n}\n\n/** What the new-mail cue needs: who wrote, what, and the alter session id (the toast is suppressed while it is on screen). */\nexport interface MailNotice {\n readonly id: string\n readonly fp: string\n readonly name: string\n readonly body: string\n readonly ts: number\n readonly sessionId: string | undefined\n}\n\nexport const EMPTY_INBOX: InboxState = { friends: [], pending: [], drafts: [], alterSessionId: undefined, typing: {} }\n\n/** Unread total over all friends (the sidebar badge number). */\nexport function unreadTotal(friends: readonly Pick<InboxFriend, 'unread'>[]): number {\n let total = 0\n for (const f of friends) total += f.unread > 0 ? f.unread : 0\n return total\n}\n\n/** Friends sorted for the inbox: unread first, then by last message time (desc), then by name. */\nexport function sortInbox(friends: readonly InboxFriend[]): InboxFriend[] {\n return [...friends].sort((a, b) => {\n const ua = a.unread > 0 ? 1 : 0\n const ub = b.unread > 0 ? 1 : 0\n if (ua !== ub) return ub - ua\n const ta = a.lastTs ?? 0\n const tb = b.lastTs ?? 0\n if (ta !== tb) return tb - ta\n return a.name.localeCompare(b.name)\n })\n}\n\n/** Pending drafts for one friend, oldest first. */\nexport function draftsFor(state: Pick<InboxState, 'drafts'>, fp: string): ApiDraft[] {\n return state.drafts.filter(d => d.fp === fp)\n}\n\n/** Replace the folded state with a fresh `/state` answer (keeps the live typing flags and, for rows without `online`, the last known presence). */\nexport function fromApiState(previous: InboxState, state: ApiState): InboxState {\n const known = new Map(previous.friends.map(f => [f.fp, f.online]))\n const drafts = state.drafts ?? []\n const counts = new Map<string, number>()\n for (const d of drafts) counts.set(d.fp, (counts.get(d.fp) ?? 0) + 1)\n return {\n friends: state.friends.map((f) => {\n const n = counts.get(f.fp)\n const row = n === undefined ? withoutDrafts(f) : { ...f, drafts: n }\n if (row.online !== undefined) return row\n const was = known.get(f.fp)\n return was === undefined ? row : { ...row, online: was }\n }),\n pending: state.pending,\n drafts,\n alterSessionId: state.alter?.sessionId ?? undefined,\n typing: previous.typing,\n }\n}\n\n/** The row without its `drafts` count (exactOptionalPropertyTypes: the key must be absent, not undefined). */\nfunction withoutDrafts(f: InboxFriend): InboxFriend {\n if (f.drafts === undefined) return f\n const { drafts: _dropped, ...rest } = f\n return rest\n}\n\nfunction patchFriend(friends: readonly InboxFriend[], fp: string, patch: (f: InboxFriend) => InboxFriend): InboxFriend[] {\n return friends.map(f => (f.fp === fp ? patch(f) : f))\n}\n\n/**\n * Fold one SSE frame into the state. Returns the next state and, for\n * `message` frames, the notice the new-mail cue should show.\n */\nexport function applyFrame(state: InboxState, frame: NetworkEventFrame): { state: InboxState; notice?: MailNotice } {\n switch (frame.kind) {\n case 'message': {\n const { message } = frame\n const known = state.friends.some(f => f.fp === message.from)\n const friends = known\n ? patchFriend(state.friends, message.from, f => ({\n ...f,\n unread: f.unread + 1,\n count: f.count + 1,\n lastTs: message.ts,\n lastBody: message.body,\n }))\n // Mail from a friend the list does not know yet (accepted while the\n // page was away): show a provisional row; the refetch fills it in.\n : [...state.friends, { fp: message.from, name: message.name, unread: 1, count: 1, lastTs: message.ts, lastBody: message.body }]\n const name = state.friends.find(f => f.fp === message.from)?.name ?? message.name\n return {\n state: { ...state, friends },\n notice: { id: message.id, fp: message.from, name, body: message.body, ts: message.ts, sessionId: state.alterSessionId },\n }\n }\n case 'typing':\n return { state: { ...state, typing: { ...state.typing, [frame.fp]: frame.on } } }\n case 'presence':\n return { state: { ...state, friends: patchFriend(state.friends, frame.fp, f => ({ ...f, online: frame.online })) } }\n case 'friend_accept': {\n const exists = state.friends.some(f => f.fp === frame.friend.fp)\n const friends = exists\n ? patchFriend(state.friends, frame.friend.fp, f => ({ ...f, ...frame.friend }))\n : [...state.friends, frame.friend]\n // The request that produced this friend is no longer pending.\n const pending = state.pending.filter(p => p.fp !== frame.friend.fp)\n return { state: { ...state, friends, pending } }\n }\n case 'friend_request': {\n const exists = state.pending.some(p => p.id === frame.request.id)\n return { state: exists ? state : { ...state, pending: [...state.pending, frame.request] } }\n }\n case 'outbound': {\n // The alter (or the debug send) wrote to the friend: the row's preview and\n // time move, the unread count does not.\n const { fp, entry } = frame\n const friends = patchFriend(state.friends, fp, f => ({\n ...f,\n count: f.count + 1,\n ...(entry.ts >= (f.lastTs ?? 0) ? { lastTs: entry.ts, lastBody: entry.body } : {}),\n }))\n return { state: { ...state, friends } }\n }\n case 'draft': {\n const without = state.drafts.filter(d => d.id !== frame.draft.id)\n const drafts = frame.action === 'added' ? [...without, frame.draft] : without\n const n = drafts.filter(d => d.fp === frame.draft.fp).length\n const friends = patchFriend(state.friends, frame.draft.fp, f => (n === 0 ? withoutDrafts(f) : { ...f, drafts: n }))\n return { state: { ...state, drafts, friends } }\n }\n case 'status':\n case 'alter':\n default:\n return { state }\n }\n}\n\n/** The owner read a conversation: zero its unread count locally (the host/peer cursor moves in parallel). */\nexport function markReadLocal(state: InboxState, fp: string): InboxState {\n if (!state.friends.some(f => f.fp === fp && f.unread > 0)) return state\n return { ...state, friends: patchFriend(state.friends, fp, f => ({ ...f, unread: 0 })) }\n}\n\n/** Should the new-mail cue fire? Only while the alter session is not the one on screen. */\nexport function shouldNotify(notice: MailNotice, currentSessionId: string | undefined): boolean {\n return notice.sessionId === undefined || notice.sessionId !== currentSessionId\n}\n\n/** Compact relative time for the inbox row: \"now\", \"5m\", \"3h\", \"2d\", else a short date. */\nexport function formatAge(ts: number | undefined, now: number = Date.now()): string {\n if (ts === undefined || ts <= 0) return ''\n const diff = Math.max(0, now - ts)\n const minute = 60_000\n if (diff < minute) return 'now'\n if (diff < 60 * minute) return `${Math.floor(diff / minute)}m`\n if (diff < 24 * 60 * minute) return `${Math.floor(diff / (60 * minute))}h`\n if (diff < 7 * 24 * 60 * minute) return `${Math.floor(diff / (24 * 60 * minute))}d`\n const d = new Date(ts)\n return `${d.getMonth() + 1}/${d.getDate()}`\n}\n\n/** One-line preview of a message body for the inbox row. */\nexport function previewOf(body: string | undefined, max = 60): string {\n if (body === undefined) return ''\n const flat = body.replace(/\\s+/g, ' ').trim()\n return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat\n}\n","/**\n * Browser side of the host HTTP API (see ../api/index.ts): typed fetch\n * helpers, a Server-Sent-Events subscription, and one small shared store\n * (React `useSyncExternalStore` shape) holding the last known network state.\n * Same-origin requests only; dsh web serves the bundle and `/soulmirror/api/`\n * from the same loopback server.\n */\nimport { applyFrame, EMPTY_INBOX, fromApiState, markReadLocal, type InboxState, type MailNotice } from './inbox-state.ts'\n\nexport const API_BASE = '/soulmirror/api/'\n\nexport interface ApiIdentity { fp: string; name: string; cardUri: string; createdAt?: string }\nexport type ReplyTier = 'notify' | 'draft' | 'auto'\nexport interface ApiFriend {\n fp: string; name: string; remark?: string; cardName?: string; online?: boolean\n unread: number; count: number; lastTs?: number; lastBody?: string; typing?: boolean\n /** Per-friend diplomacy protocol override (friends.yaml `protocol`). */\n protocol?: string\n /** Effective reply tier (P3); `tierExplicit` when stored for this friend rather than the global default. */\n tier?: ReplyTier; tierExplicit?: true\n /** Pending drafts of the alter to this friend (P4). */\n drafts?: number\n}\n/** What woke a turn of the alter session. */\nexport interface ApiTrigger { kind: 'owner' | 'inbound' | 'inbound-auto' | 'unknown'; fp?: string; name?: string; messageId?: string }\nexport type ApiSendOutcome = 'sent' | 'draft-queued' | 'refused' | 'failed'\n/** The alter's latest state (host `session.latest`, SSE `alter`; see src/alter-state.ts). */\nexport interface ApiAlterLatest {\n instruction?: { text: string; ts: number; seq: number }\n note?: { text: string; ts: number; seq: number; turn: number }\n sent?: { body: string; fingerprint?: string; ts: number; outcome?: ApiSendOutcome; gate?: string; draftId?: string; detail?: string }\n turn?: { turn: number; reason: string; failed: boolean; ts: number; message?: string; open: boolean }\n trigger: ApiTrigger\n seq: number\n}\nexport interface ApiAlterState {\n sessionId: string\n status: 'idle' | 'running'\n latest: ApiAlterLatest\n}\n/** One item of the \"My alter\" transcript (host `session.history`; see src/alter-state.ts `chatFromEvents`). */\nexport type ApiChatItem =\n | { kind: 'owner'; key: string; ts: number; text: string; revise?: { name: string; fp: string } }\n | { kind: 'alter'; key: string; ts: number; text: string; turn: number }\n | { kind: 'inbound'; key: string; ts: number; fp: string; name: string; id: string; body: string; auto: boolean; type?: string }\n | { kind: 'send'; key: string; ts: number; fp: string; body: string; outcome?: ApiSendOutcome; gate?: string; draftId?: string; detail?: string; auto: boolean }\n | { kind: 'note'; key: string; ts: number; note: 'draft-approved' | 'draft-rejected' | 'draft-revise'; fp: string; text: string; draftId?: string }\n | { kind: 'turn-failed'; key: string; ts: number; turn: number; reason: string; message?: string }\nexport interface ApiChat { items: ApiChatItem[]; running: boolean; seq: number }\nexport interface ApiHistory { sessionId: string | null; status: 'idle' | 'running'; chat: ApiChat }\n/** A pending draft of the alter (P4; src/drafts.ts). */\nexport interface ApiDraft {\n id: string; fp: string; name: string; body: string; createdAt: string; reason: string\n trigger?: { kind: string; fp?: string; name?: string; messageId?: string }\n sessionId?: string\n}\n/** Alter-wide settings as the host resolves them (live). */\nexport interface ApiAlterConfig {\n sessionId: string | null; status: 'idle' | 'running'\n defaultTier: ReplyTier; autoReplyPerHour: number; directSend: boolean; protocolPath: string; protocolExists: boolean\n legacyFriendSessions: Record<string, string>\n}\nexport interface ApiPending { id: string; fp: string; name: string; greeting: string; createdAt?: string }\n/** One archived conversation entry (`conversation.get`, `message.send`, SSE `outbound`). */\nexport interface ApiEntry {\n seq: number; dir: 'in' | 'out'; id: string; body: string; ts: number\n type?: string; auto?: true; status?: string; artifactName?: string\n}\nexport interface ApiStatus {\n backend: 'fake' | 'soulnet'; state: 'starting' | 'ready' | 'restarting' | 'stopped' | 'error'\n pid?: number; restarts: number; lastError?: string; relay?: string; home?: string; protocol?: string; version?: string\n binary?: string; binarySource?: 'setting' | 'platform-package' | 'path' | 'plugin-bin' | string\n}\nexport interface ApiState {\n backend: 'fake' | 'soulnet'\n status: ApiStatus\n home: string\n settingsNamespace: string\n identity: ApiIdentity | null\n friends: ApiFriend[]\n pending: ApiPending[]\n drafts: ApiDraft[]\n alter?: ApiAlterConfig\n error?: string\n}\n\nexport class ApiError extends Error {\n override readonly name = 'ApiError'\n constructor(message: string, readonly code: number, readonly httpStatus: number) {\n super(message)\n }\n}\n\nasync function call<T>(route: string, body?: Record<string, unknown>): Promise<T> {\n const response = await fetch(`${API_BASE}${route}`, body === undefined && route === 'state'\n ? { method: 'GET', headers: { accept: 'application/json' } }\n : { method: 'POST', headers: { 'content-type': 'application/json', accept: 'application/json' }, body: JSON.stringify(body ?? {}) })\n const text = await response.text()\n let parsed: unknown = {}\n try {\n parsed = text === '' ? {} : JSON.parse(text)\n } catch {\n throw new ApiError(`bad response from ${route}: ${text.slice(0, 120)}`, -32603, response.status)\n }\n const err = (parsed as { error?: { code?: number; message?: string } }).error\n if (!response.ok || err !== undefined) {\n throw new ApiError(err?.message ?? `${route} failed (${response.status})`, err?.code ?? -32603, response.status)\n }\n return parsed as T\n}\n\nexport const api = {\n state: () => call<ApiState>('state'),\n createIdentity: (name: string) => call<{ identity: ApiIdentity }>('identity.create', { name }),\n parseCard: (uri: string) => call<{ fp: string; name: string; uri: string }>('card.parse', { uri }),\n addFriend: (cardUri: string, note?: string) => call<{ friend: ApiFriend }>('friends.add', { card_uri: cardUri, ...(note === undefined ? {} : { note }) }),\n accept: (id: string, note?: string) => call<{ friend: ApiFriend }>('friends.accept', { id, ...(note === undefined ? {} : { note }) }),\n reject: (id: string) => call<{ ok: true }>('friends.reject', { id }),\n markRead: (fp: string, seq?: number) => call<{ ok: true }>('conversation.markRead', { fp, ...(seq === undefined ? {} : { seq }) }),\n /** Archive of one friend: `since` = only seq > since, `limit` = the last N entries. */\n conversation: (fp: string, opts: { since?: number; limit?: number } = {}) =>\n call<{ entries: ApiEntry[]; typing: boolean }>('conversation.get', { fp, ...(opts.since === undefined ? {} : { since: opts.since }), ...(opts.limit === undefined ? {} : { limit: opts.limit }) }),\n /** Debug: direct send to a friend through the peer (bypasses the alter); answers the archived entry. */\n send: (fp: string, body: string) => call<{ entry: ApiEntry; receipt: { id: string; seq?: number; status: string } }>('message.send', { fp, body }),\n typing: (fp: string, on: boolean) => call<{ ok: true }>('message.typing', { fp, on }),\n presence: (fps: readonly string[]) => call<{ online: Record<string, boolean> }>('presence', { fps: [...fps] }),\n /** The owner instructs their alter (an owner user/message + a woken turn in the alter session). */\n instruct: (text: string) => call<{ sessionId: string; messageId: string; state: ApiAlterState | null }>('alter.instruct', { text }),\n /** The alter's latest state (null = no session yet). */\n sessionLatest: () => call<{ state: ApiAlterState | null }>('session.latest', {}),\n /** The alter transcript (last `limit` items). */\n sessionHistory: (limit?: number) => call<ApiHistory>('session.history', limit === undefined ? {} : { limit }),\n /** Pending drafts (all, or one friend's). */\n drafts: (fp?: string) => call<{ drafts: ApiDraft[] }>('drafts.list', fp === undefined ? {} : { fp }),\n /** Decide a draft: approve (optionally edited), reject, or send it back to the alter with feedback. */\n decideDraft: (id: string, decision: { action: 'approve'; body?: string } | { action: 'reject' } | { action: 'revise'; feedback: string }) =>\n call<{ ok: true; draft: ApiDraft; entry?: ApiEntry }>('drafts.decide', { id, ...decision }),\n /** Note / protocol override (peer) and reply tier (plugin) of a friend; `tier: ''` = back to the default. */\n friendSet: (fp: string, patch: { note?: string; protocol?: string; tier?: ReplyTier | '' }) => call<{ friend: ApiFriend }>('friends.set', { fp, ...patch }),\n friendCard: (fp: string) => call<{ fp: string; name: string; uri: string }>('friends.card', { fp }),\n protocolGet: () => call<{ text: string; path: string; exists: boolean }>('protocol.get', {}),\n protocolSet: (text: string) => call<{ ok: true; text: string; path: string }>('protocol.set', { text }),\n}\n\nexport type NetworkEventFrame =\n | { kind: 'message'; message: { id: string; from: string; name: string; body: string; ts: number; seq?: number; type?: string; auto?: true; artifactName?: string } }\n /** An outbound entry was archived (the alter sent, a draft was approved, or the debug direct send): `fp` is the friend. */\n | { kind: 'outbound'; fp: string; entry: ApiEntry }\n | { kind: 'typing'; fp: string; on: boolean }\n | { kind: 'friend_request'; request: ApiPending }\n | { kind: 'friend_accept'; friend: ApiFriend }\n | { kind: 'presence'; fp: string; online: boolean }\n | { kind: 'status'; status: ApiStatus }\n /** The alter's state changed (a turn, a note, a send …). */\n | { kind: 'alter'; state: ApiAlterState }\n /** A pending draft was stored or decided. */\n | { kind: 'draft'; action: 'added' | 'removed'; draft: ApiDraft; decision?: 'approved' | 'rejected' | 'revise' }\n\nexport interface NetworkStoreSnapshot {\n readonly state: ApiState | undefined\n readonly loading: boolean\n readonly error: string | undefined\n /** fp → typing flag (live, from SSE). */\n readonly typing: Readonly<Record<string, boolean>>\n readonly status: ApiStatus | undefined\n /** Bumps on every SSE frame so lists can refetch. */\n readonly revision: number\n /**\n * Friends / pending / drafts as folded from the last `/state` answer plus\n * the SSE frames since (optimistic; replaced by the next refetch). The\n * sidebar badge, the page's middle column and the toast read this, not\n * `state` directly.\n */\n readonly inbox: InboxState\n}\n\n/**\n * One store per browser page: `refresh()` pulls `/state`, `connect()` keeps the\n * SSE stream open (typing, friend events, backend status) while someone\n * subscribes. Components read it through `useSyncExternalStore`.\n */\nexport class NetworkStore {\n private snapshot: NetworkStoreSnapshot = { state: undefined, loading: false, error: undefined, typing: {}, status: undefined, revision: 0, inbox: EMPTY_INBOX }\n private readonly listeners = new Set<() => void>()\n private readonly mailListeners = new Set<(notice: MailNotice) => void>()\n private readonly frameListeners = new Set<(frame: NetworkEventFrame) => void>()\n private source: EventSource | undefined\n private refreshTimer: ReturnType<typeof setTimeout> | undefined\n private inflight: Promise<void> | undefined\n\n getSnapshot = (): NetworkStoreSnapshot => this.snapshot\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener)\n if (this.listeners.size === 1) this.connect()\n if (this.snapshot.state === undefined && !this.snapshot.loading) void this.refresh()\n return () => {\n this.listeners.delete(listener)\n if (this.listeners.size === 0) this.disconnect()\n }\n }\n\n /**\n * Subscribe to new-mail notices (one per inbound `message` frame). The\n * caller decides whether to show a cue (e.g. only when that thread is not\n * on screen). Independent of the snapshot subscription; does not open the\n * SSE stream by itself.\n */\n onMail = (listener: (notice: MailNotice) => void): (() => void) => {\n this.mailListeners.add(listener)\n return () => { this.mailListeners.delete(listener) }\n }\n\n /** Subscribe to every SSE frame as it arrives (the page's stores fold `message` / `outbound` / `alter` / `draft`). */\n onFrame = (listener: (frame: NetworkEventFrame) => void): (() => void) => {\n this.frameListeners.add(listener)\n return () => { this.frameListeners.delete(listener) }\n }\n\n /** Fold a `presence` answer (fp -> online) into the friend rows. */\n applyPresence = (online: Readonly<Record<string, boolean>>): void => {\n let inbox = this.snapshot.inbox\n for (const [fp, on] of Object.entries(online)) inbox = applyFrame(inbox, { kind: 'presence', fp, online: on }).state\n if (inbox !== this.snapshot.inbox) this.set({ inbox })\n }\n\n /** Fold an outbound entry we just archived ourselves (preview / time of the friend row). */\n applyOutbound = (fp: string, entry: ApiEntry): void => {\n this.set({ inbox: applyFrame(this.snapshot.inbox, { kind: 'outbound', fp, entry }).state })\n }\n\n private set(patch: Partial<NetworkStoreSnapshot>): void {\n this.snapshot = { ...this.snapshot, ...patch }\n for (const l of this.listeners) l()\n }\n\n /** The owner read a friend's conversation: zero its unread locally and tell the host. */\n markRead = (fp: string): Promise<void> => {\n this.set({ inbox: markReadLocal(this.snapshot.inbox, fp) })\n return api.markRead(fp).then(() => {}).catch(() => {})\n }\n\n refresh = (): Promise<void> => {\n if (this.inflight !== undefined) return this.inflight\n this.set({ loading: true })\n this.inflight = api.state().then((state) => {\n this.set({ state, loading: false, error: undefined, status: state.status, inbox: fromApiState(this.snapshot.inbox, state) })\n }).catch((error: unknown) => {\n this.set({ loading: false, error: error instanceof Error ? error.message : String(error) })\n }).finally(() => { this.inflight = undefined })\n return this.inflight\n }\n\n /** Debounced refresh after SSE frames that change lists. */\n private scheduleRefresh(): void {\n if (this.refreshTimer !== undefined) return\n this.refreshTimer = setTimeout(() => {\n this.refreshTimer = undefined\n void this.refresh()\n }, 250)\n }\n\n private connect(): void {\n if (this.source !== undefined || typeof EventSource === 'undefined') return\n const source = new EventSource(`${API_BASE}events`)\n this.source = source\n const handle = (event: MessageEvent): void => {\n let frame: NetworkEventFrame\n try {\n frame = JSON.parse(String(event.data)) as NetworkEventFrame\n } catch {\n return\n }\n const revision = this.snapshot.revision + 1\n const folded = applyFrame(this.snapshot.inbox, frame)\n for (const l of this.frameListeners) l(frame)\n switch (frame.kind) {\n case 'typing':\n this.set({ typing: { ...this.snapshot.typing, [frame.fp]: frame.on }, revision, inbox: folded.state })\n return\n case 'status':\n this.set({ status: frame.status, revision })\n if (frame.status.state === 'ready') this.scheduleRefresh()\n return\n case 'outbound':\n case 'draft':\n this.set({ revision, inbox: folded.state })\n return\n case 'alter':\n // Folded by the page store (frame listeners); bump the revision so views re-read.\n this.set({ revision })\n return\n case 'message':\n case 'friend_request':\n case 'friend_accept':\n case 'presence':\n this.set({ revision, inbox: folded.state })\n if (folded.notice !== undefined) for (const l of this.mailListeners) l(folded.notice)\n this.scheduleRefresh()\n return\n default:\n return\n }\n }\n for (const kind of ['message', 'outbound', 'typing', 'friend_request', 'friend_accept', 'presence', 'status', 'alter', 'draft']) {\n source.addEventListener(kind, handle as EventListener)\n }\n source.onerror = () => {\n // EventSource reconnects by itself; refresh once it is back.\n this.scheduleRefresh()\n }\n }\n\n private disconnect(): void {\n this.source?.close()\n this.source = undefined\n if (this.refreshTimer !== undefined) {\n clearTimeout(this.refreshTimer)\n this.refreshTimer = undefined\n }\n }\n}\n\nexport const networkStore = new NetworkStore()\n","/**\n * Pure state of the SoulMirror page (P2b): which friend is selected, the\n * per-friend message thread (archive entries + optimistic outbound bubbles),\n * and the row / bubble helpers. Folds: `conversation.get` answers (merge by\n * seq, dedupe by id), SSE `message` frames (inbound), SSE `outbound` frames\n * (another tab sent), optimistic send → reconcile / fail. No React, no DOM:\n * unit-tested under node (test/page-state.test.ts). The friend list itself\n * is the inbox state (./inbox-state.ts); this module only adds the search\n * filter and the selection rule on top of it.\n */\nimport type { ApiEntry } from './api.ts'\nimport { sortInbox, type InboxFriend } from './inbox-state.ts'\n\n/** One bubble of the thread: an archived entry, or an outbound one not yet acknowledged by the peer. */\nexport interface ThreadEntry {\n /** Archive line number (1-based); 0 while the entry is only optimistic. */\n readonly seq: number\n readonly dir: 'in' | 'out'\n /** A2A message id; for optimistic entries the client id until the receipt arrives. */\n readonly id: string\n readonly body: string\n /** Unix epoch ms. */\n readonly ts: number\n readonly type?: string\n readonly auto?: true\n /** Outbound delivery state: `sending` (optimistic) | `sent` | `queued` | `error` | `failed` (the send call itself failed). */\n readonly status?: string\n readonly artifactName?: string\n /** Client-side id of an optimistic send (stable across reconcile; the React key). */\n readonly clientId?: string\n /** Error text when the send call failed (status `failed`). */\n readonly error?: string\n}\n\nexport interface ThreadState {\n readonly entries: readonly ThreadEntry[]\n /** The `limit` of the last archive fetch (grows when the owner scrolls up). */\n readonly window: number\n /** The archive has no older entries than the ones loaded. */\n readonly complete: boolean\n readonly loading: boolean\n readonly loaded: boolean\n readonly error?: string\n}\n\nexport const EMPTY_THREAD: ThreadState = { entries: [], window: 0, complete: false, loading: false, loaded: false }\n\n/** Entries per archive fetch; the window grows by this much per \"load older\". */\nexport const PAGE_SIZE = 50\n\nexport function entryFromApi(entry: ApiEntry): ThreadEntry {\n return {\n seq: entry.seq,\n dir: entry.dir === 'out' ? 'out' : 'in',\n id: entry.id,\n body: entry.body,\n ts: entry.ts,\n ...(entry.type === undefined ? {} : { type: entry.type }),\n ...(entry.auto === true ? { auto: true as const } : {}),\n ...(entry.status === undefined ? {} : { status: entry.status }),\n ...(entry.artifactName === undefined ? {} : { artifactName: entry.artifactName }),\n }\n}\n\n/** Stable ordering: archived entries by seq, then optimistic ones (seq 0) by time at the tail. */\nexport function sortThread(entries: readonly ThreadEntry[]): ThreadEntry[] {\n return [...entries].sort((a, b) => {\n const pa = a.seq > 0 ? 0 : 1\n const pb = b.seq > 0 ? 0 : 1\n if (pa !== pb) return pa - pb\n if (pa === 0 && a.seq !== b.seq) return a.seq - b.seq\n if (a.ts !== b.ts) return a.ts - b.ts\n return a.id.localeCompare(b.id)\n })\n}\n\n/**\n * Merge archive entries into the thread: an entry with the same seq replaces\n * the loaded one (status may have moved from queued → sent), an entry with\n * the same id as an optimistic bubble absorbs it (keeps its clientId so the\n * React key is stable), everything else is appended. Result sorted.\n */\nexport function mergeEntries(existing: readonly ThreadEntry[], incoming: readonly ThreadEntry[]): ThreadEntry[] {\n const bySeq = new Map<number, number>()\n const byId = new Map<string, number>()\n const next: ThreadEntry[] = [...existing]\n next.forEach((e, i) => {\n if (e.seq > 0) bySeq.set(e.seq, i)\n byId.set(e.id, i)\n })\n for (const entry of incoming) {\n const seqIndex = entry.seq > 0 ? bySeq.get(entry.seq) : undefined\n const idIndex = byId.get(entry.id)\n const index = seqIndex ?? idIndex\n if (index === undefined) {\n next.push(entry)\n if (entry.seq > 0) bySeq.set(entry.seq, next.length - 1)\n byId.set(entry.id, next.length - 1)\n continue\n }\n const previous = next[index]!\n const merged: ThreadEntry = { ...previous, ...entry, ...(previous.clientId === undefined ? {} : { clientId: previous.clientId }) }\n next[index] = merged\n if (merged.seq > 0) bySeq.set(merged.seq, index)\n byId.set(merged.id, index)\n if (previous.id !== merged.id) byId.delete(previous.id)\n }\n return sortThread(next)\n}\n\n/** Fold one `conversation.get` answer (the last `window` entries) into the thread. */\nexport function applyArchive(state: ThreadState, entries: readonly ApiEntry[], window: number): ThreadState {\n const incoming = entries.map(entryFromApi)\n const { error: _dropped, ...rest } = state\n return {\n ...rest,\n entries: mergeEntries(state.entries, incoming),\n window,\n // Fewer entries than asked for = the archive starts inside the window.\n complete: incoming.length < window,\n loading: false,\n loaded: true,\n }\n}\n\n/** Append one inbound message (SSE `message` frame) to the thread. */\nexport function applyInbound(state: ThreadState, message: { id: string; body: string; ts: number; seq?: number; type?: string; auto?: true; artifactName?: string }): ThreadState {\n const entry: ThreadEntry = {\n seq: message.seq ?? 0,\n dir: 'in',\n id: message.id,\n body: message.body,\n ts: message.ts,\n ...(message.type === undefined ? {} : { type: message.type }),\n ...(message.auto === true ? { auto: true as const } : {}),\n ...(message.artifactName === undefined ? {} : { artifactName: message.artifactName }),\n }\n return { ...state, entries: mergeEntries(state.entries, [entry]) }\n}\n\n/** Append one archived outbound entry (SSE `outbound` frame from another tab, or our own receipt). */\nexport function applyOutbound(state: ThreadState, entry: ApiEntry): ThreadState {\n return { ...state, entries: mergeEntries(state.entries, [entryFromApi(entry)]) }\n}\n\n/** The owner pressed Send: show the bubble at once (status `sending`). */\nexport function addOptimistic(state: ThreadState, draft: { clientId: string; body: string; ts: number }): ThreadState {\n const entry: ThreadEntry = { seq: 0, dir: 'out', id: draft.clientId, body: draft.body, ts: draft.ts, status: 'sending', clientId: draft.clientId }\n return { ...state, entries: [...state.entries, entry] }\n}\n\n/** The host answered `message.send` with the archived entry: replace the optimistic bubble in place. */\nexport function reconcileSend(state: ThreadState, clientId: string, entry: ApiEntry): ThreadState {\n const archived = entryFromApi(entry)\n const index = state.entries.findIndex(e => e.clientId === clientId)\n if (index === -1) return { ...state, entries: mergeEntries(state.entries, [archived]) }\n const next = [...state.entries]\n next[index] = { ...archived, clientId }\n // The archive may already hold the same seq (an `outbound` frame raced the\n // answer): drop the duplicate that is not ours.\n const deduped = next.filter((e, i) => i === index || (!(e.seq > 0 && e.seq === archived.seq) && e.id !== archived.id))\n return { ...state, entries: sortThread(deduped) }\n}\n\n/** The send call failed: keep the bubble, mark it `failed` with the error. */\nexport function failSend(state: ThreadState, clientId: string, error: string): ThreadState {\n return {\n ...state,\n entries: state.entries.map(e => (e.clientId === clientId ? { ...e, status: 'failed', error } : e)),\n }\n}\n\n/** Remove a failed optimistic bubble (the owner discarded it or retries). */\nexport function dropEntry(state: ThreadState, clientId: string): ThreadState {\n return { ...state, entries: state.entries.filter(e => e.clientId !== clientId) }\n}\n\n/** Highest archived seq in the thread (the read cursor to report). */\nexport function lastSeq(state: ThreadState): number {\n let max = 0\n for (const e of state.entries) if (e.seq > max) max = e.seq\n return max\n}\n\n// ——— friend list helpers ———\n\n/** Case-insensitive filter over name / remark / card name / fingerprint prefix. */\nexport function filterFriends(friends: readonly InboxFriend[], query: string): InboxFriend[] {\n const q = query.trim().toLowerCase()\n if (q === '') return [...friends]\n return friends.filter(f =>\n f.name.toLowerCase().includes(q)\n || (f.remark?.toLowerCase().includes(q) ?? false)\n || (f.cardName?.toLowerCase().includes(q) ?? false)\n || f.fp.toLowerCase().startsWith(q))\n}\n\n/** Rows of the middle column: unread first, then newest, then by name; then the search filter. */\nexport function listRows(friends: readonly InboxFriend[], query: string): InboxFriend[] {\n return filterFriends(sortInbox(friends), query)\n}\n\n/** Selection key of the pinned first item \"My alter\" (never a fingerprint). */\nexport const ALTER_KEY = 'alter'\n\n/**\n * Which item the page shows on the right: \"My alter\" (the pinned first item,\n * also the default — selecting it has no side effect) or the explicitly\n * selected friend while it is still a friend (selecting a friend marks it\n * read, so a gone friend never re-selects itself; it falls back to the alter).\n */\nexport function resolveSelection(friends: readonly Pick<InboxFriend, 'fp'>[], selected: string | undefined): string {\n if (selected === undefined || selected === ALTER_KEY) return ALTER_KEY\n return friends.some(f => f.fp === selected) ? selected : ALTER_KEY\n}\n\n// ——— bubble helpers ———\n\n/** Local calendar day key (YYYY-MM-DD) for the day separators. */\nexport function dayKey(ts: number): string {\n const d = new Date(ts)\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${d.getFullYear()}-${m}-${day}`\n}\n\nexport type ThreadRow =\n | { readonly kind: 'day'; readonly key: string; readonly ts: number }\n | { readonly kind: 'entry'; readonly key: string; readonly entry: ThreadEntry }\n\n/** Interleave day separators: one before the first entry of every local day. */\nexport function withDaySeparators(entries: readonly ThreadEntry[]): ThreadRow[] {\n const rows: ThreadRow[] = []\n let lastDay: string | undefined\n for (const entry of entries) {\n const day = dayKey(entry.ts)\n if (day !== lastDay) {\n rows.push({ kind: 'day', key: `day:${day}`, ts: entry.ts })\n lastDay = day\n }\n rows.push({ kind: 'entry', key: entry.clientId ?? (entry.seq > 0 ? `seq:${entry.seq}` : `id:${entry.id}`), entry })\n }\n return rows\n}\n\n/** Bubble time: HH:MM (24 h, local). */\nexport function formatClock(ts: number): string {\n const d = new Date(ts)\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n}\n\n/** Day separator label: \"Today\" / \"Yesterday\" (via the dictionary) or a local date. */\nexport function formatDay(ts: number, now: number, labels: { today: string; yesterday: string }): string {\n const today = dayKey(now)\n const key = dayKey(ts)\n if (key === today) return labels.today\n if (key === dayKey(now - 24 * 60 * 60 * 1000)) return labels.yesterday\n const d = new Date(ts)\n const sameYear = d.getFullYear() === new Date(now).getFullYear()\n return sameYear ? `${d.getMonth() + 1}/${d.getDate()}` : `${d.getFullYear()}/${d.getMonth() + 1}/${d.getDate()}`\n}\n","/**\n * Open/closed state and selection of the SoulMirror page plus the per-friend\n * thread cache and the \"My alter\" transcript, shared between the sidebar\n * footer button (`sidebar.footer.action`), the `/soulmirror` popup, the view\n * tab and the page itself (`shell.overlay`). Threads are folded with the pure\n * functions of ./page-state.ts: archive fetches (`conversation.get`), SSE\n * `message` / `outbound` frames (through `networkStore.onFrame`), optimistic\n * debug sends and their reconcile. The alter transcript is fetched from\n * `session.history` and refetched (debounced) on every SSE `alter` frame.\n * One store per page; components read it through `useSyncExternalStore`.\n */\nimport { api, networkStore, type ApiChat, type NetworkEventFrame } from './api.ts'\nimport {\n addOptimistic, ALTER_KEY, applyArchive, applyInbound, applyOutbound, dropEntry, EMPTY_THREAD, failSend, PAGE_SIZE, reconcileSend,\n type ThreadState,\n} from './page-state.ts'\n\n/** The alter transcript as the page holds it (P4). */\nexport interface AlterView {\n readonly sessionId: string | undefined\n readonly status: 'idle' | 'running'\n readonly chat: ApiChat\n readonly loading: boolean\n readonly loaded: boolean\n /** An instruction is being posted. */\n readonly instructing: boolean\n readonly error?: string\n}\n\nexport const EMPTY_ALTER: AlterView = { sessionId: undefined, status: 'idle', chat: { items: [], running: false, seq: 0 }, loading: false, loaded: false, instructing: false }\n\nexport interface PageSnapshot {\n readonly open: boolean\n /** Selection: `ALTER_KEY` or a friend fingerprint (may point at a friend that is gone; the page resolves it). */\n readonly selected: string | undefined\n /** fp → thread (only for friends whose archive was fetched at least once). */\n readonly threads: Readonly<Record<string, ThreadState>>\n readonly alter: AlterView\n /** Draft ids with a decision in flight. */\n readonly deciding: readonly string[]\n}\n\n/** Typing signal cadence: re-send `on` at most every 4 s while typing, `off` after 5 s of silence. */\nconst TYPING_RESEND_MS = 4_000\nconst TYPING_IDLE_MS = 5_000\n/** Debounce of the transcript refetch after an `alter` frame. */\nconst HISTORY_REFETCH_MS = 120\n/** Items of the transcript fetched per load. */\nexport const HISTORY_LIMIT = 200\n\nexport class PageStore {\n private snapshot: PageSnapshot = { open: false, selected: undefined, threads: {}, alter: EMPTY_ALTER, deciding: [] }\n private readonly listeners = new Set<() => void>()\n private readonly typingSentAt = new Map<string, number>()\n private readonly typingIdle = new Map<string, ReturnType<typeof setTimeout>>()\n private historyTimer: ReturnType<typeof setTimeout> | undefined\n private historyAgain = false\n private seq = 0\n\n constructor() {\n networkStore.onFrame(this.onFrame)\n }\n\n getSnapshot = (): PageSnapshot => this.snapshot\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener)\n return () => { this.listeners.delete(listener) }\n }\n\n private set(patch: Partial<PageSnapshot>): void {\n this.snapshot = { ...this.snapshot, ...patch }\n for (const l of this.listeners) l()\n }\n\n private setThread(fp: string, thread: ThreadState): void {\n this.set({ threads: { ...this.snapshot.threads, [fp]: thread } })\n }\n\n thread = (fp: string): ThreadState => this.snapshot.threads[fp] ?? EMPTY_THREAD\n\n private setAlter(patch: Partial<AlterView>): void {\n this.set({ alter: { ...this.snapshot.alter, ...patch } })\n }\n\n /** Fetch the alter transcript (`session.history`). */\n loadAlter = async (): Promise<void> => {\n if (this.snapshot.alter.loading) {\n this.historyAgain = true\n return\n }\n this.setAlter({ loading: true })\n try {\n const h = await api.sessionHistory(HISTORY_LIMIT)\n const { error: _dropped, ...rest } = this.snapshot.alter\n this.set({ alter: { ...rest, sessionId: h.sessionId ?? undefined, status: h.status, chat: h.chat, loading: false, loaded: true } })\n } catch (e: unknown) {\n this.setAlter({ loading: false, loaded: true, error: e instanceof Error ? e.message : String(e) })\n }\n if (this.historyAgain) {\n this.historyAgain = false\n void this.loadAlter()\n }\n }\n\n private scheduleHistory(): void {\n if (this.historyTimer !== undefined) return\n this.historyTimer = setTimeout(() => {\n this.historyTimer = undefined\n void this.loadAlter()\n }, HISTORY_REFETCH_MS)\n }\n\n /**\n * The owner instructs their alter: the text becomes an owner user/message\n * in the alter session and wakes a turn; the alter decides what to tell\n * which friend and sends it with soulmirror_send_message. The transcript\n * refetches as the session moves (SSE `alter`), the friend thread shows\n * the alter's send as an outbound bubble (SSE `outbound`).\n */\n instruct = async (text: string): Promise<boolean> => {\n const body = text.replace(/\\s+$/, '')\n if (body === '') return false\n const { error: _dropped, ...rest } = this.snapshot.alter\n this.set({ alter: { ...rest, instructing: true } })\n try {\n await api.instruct(body)\n this.setAlter({ instructing: false, loaded: true })\n this.scheduleHistory()\n return true\n } catch (e: unknown) {\n this.setAlter({ instructing: false, error: e instanceof Error ? e.message : String(e) })\n return false\n }\n }\n\n /** Decide a pending draft (approve / approve edited / reject / revise). */\n decideDraft = async (id: string, decision: { action: 'approve'; body?: string } | { action: 'reject' } | { action: 'revise'; feedback: string }): Promise<boolean> => {\n if (this.snapshot.deciding.includes(id)) return false\n this.set({ deciding: [...this.snapshot.deciding, id] })\n try {\n const result = await api.decideDraft(id, decision)\n if (result.entry !== undefined) {\n const thread = this.snapshot.threads[result.draft.fp]\n if (thread !== undefined) this.setThread(result.draft.fp, applyOutbound(thread, result.entry))\n networkStore.applyOutbound(result.draft.fp, result.entry)\n }\n this.scheduleHistory()\n void networkStore.refresh()\n return true\n } catch (e: unknown) {\n this.setAlter({ error: e instanceof Error ? e.message : String(e) })\n return false\n } finally {\n this.set({ deciding: this.snapshot.deciding.filter(d => d !== id) })\n }\n }\n\n open = (selection?: string): void => {\n const selected = selection ?? this.snapshot.selected ?? ALTER_KEY\n this.set({ open: true, selected })\n this.prime(selected)\n }\n\n close = (): void => { if (this.snapshot.open) this.set({ open: false }) }\n\n toggle = (): void => {\n if (this.snapshot.open) this.close()\n else this.open()\n }\n\n select = (selection: string): void => {\n if (selection === this.snapshot.selected) return\n this.set({ selected: selection })\n this.prime(selection)\n }\n\n /** Fetch what the selection needs (the transcript for the alter, the archive for a friend). */\n private prime(selection: string): void {\n if (selection === ALTER_KEY) {\n if (!this.snapshot.alter.loaded) void this.loadAlter()\n return\n }\n void this.load(selection)\n }\n\n /** Fetch (or re-fetch) the last `window` entries of a friend's archive. */\n load = async (fp: string, window?: number): Promise<void> => {\n const current = this.thread(fp)\n if (current.loading) return\n const size = window ?? (current.window > 0 ? current.window : PAGE_SIZE)\n this.setThread(fp, { ...current, loading: true })\n try {\n const { entries } = await api.conversation(fp, { limit: size })\n this.setThread(fp, applyArchive(this.thread(fp), entries, size))\n } catch (e: unknown) {\n this.setThread(fp, { ...this.thread(fp), loading: false, loaded: true, error: e instanceof Error ? e.message : String(e) })\n }\n }\n\n /** The owner scrolled to the top: widen the window by one page. */\n loadOlder = (fp: string): Promise<void> => {\n const t = this.thread(fp)\n if (t.complete || t.loading) return Promise.resolve()\n return this.load(fp, (t.window > 0 ? t.window : PAGE_SIZE) + PAGE_SIZE)\n }\n\n /**\n * Debug direct send (Settings → \"send as myself\"): optimistic bubble now,\n * reconcile with the archived entry the host answers, or mark it failed.\n */\n send = async (fp: string, body: string): Promise<boolean> => {\n const text = body.replace(/\\s+$/, '')\n if (text === '') return false\n this.seq += 1\n const clientId = `local-${Date.now().toString(36)}-${this.seq}`\n this.setThread(fp, addOptimistic(this.thread(fp), { clientId, body: text, ts: Date.now() }))\n this.stopTyping(fp)\n try {\n const { entry } = await api.send(fp, text)\n this.setThread(fp, reconcileSend(this.thread(fp), clientId, entry))\n networkStore.applyOutbound(fp, entry)\n return true\n } catch (e: unknown) {\n this.setThread(fp, failSend(this.thread(fp), clientId, e instanceof Error ? e.message : String(e)))\n return false\n }\n }\n\n /** Discard a failed bubble (returns its body so the composer can offer it again). */\n discard = (fp: string, clientId: string): string | undefined => {\n const entry = this.thread(fp).entries.find(e => e.clientId === clientId)\n this.setThread(fp, dropEntry(this.thread(fp), clientId))\n return entry?.body\n }\n\n /** The owner is typing in the debug composer: best-effort `message.typing on`, throttled; `off` after idle. */\n noteTyping = (fp: string): void => {\n const now = Date.now()\n const last = this.typingSentAt.get(fp) ?? 0\n if (now - last > TYPING_RESEND_MS) {\n this.typingSentAt.set(fp, now)\n void api.typing(fp, true).catch(() => {})\n }\n const idle = this.typingIdle.get(fp)\n if (idle !== undefined) clearTimeout(idle)\n this.typingIdle.set(fp, setTimeout(() => { this.stopTyping(fp) }, TYPING_IDLE_MS))\n }\n\n stopTyping = (fp: string): void => {\n const idle = this.typingIdle.get(fp)\n if (idle !== undefined) {\n clearTimeout(idle)\n this.typingIdle.delete(fp)\n }\n if (this.typingSentAt.has(fp)) {\n this.typingSentAt.delete(fp)\n void api.typing(fp, false).catch(() => {})\n }\n }\n\n private onFrame = (frame: NetworkEventFrame): void => {\n switch (frame.kind) {\n case 'message': {\n const fp = frame.message.from\n const thread = this.snapshot.threads[fp]\n if (thread !== undefined) this.setThread(fp, applyInbound(thread, frame.message))\n // Mail reaches the alter session too: the transcript shows it.\n if (this.snapshot.alter.loaded) this.scheduleHistory()\n return\n }\n case 'outbound': {\n const thread = this.snapshot.threads[frame.fp]\n if (thread === undefined) return\n this.setThread(frame.fp, applyOutbound(thread, frame.entry))\n return\n }\n case 'alter':\n this.setAlter({ sessionId: frame.state.sessionId, status: frame.state.status })\n if (this.snapshot.alter.loaded || this.snapshot.open) this.scheduleHistory()\n return\n case 'draft':\n if (this.snapshot.alter.loaded) this.scheduleHistory()\n return\n default:\n return\n }\n }\n}\n\nexport const pageStore = new PageStore()\n","/**\r\n * `sidebar.footer.action` entry: the \"SoulMirror\" button at the sidebar foot\r\n * (stacked above Settings in both widths). Wide: icon + label + unread pill;\r\n * rail: icon + red dot. Clicking toggles the SoulMirror page\r\n * (./SoulmirrorPage.tsx, a `shell.overlay` entry that fills the frame right\r\n * of this sidebar). The unread number is the sum over all friends, folded\r\n * live from the host SSE stream.\r\n */\r\nimport { useSyncExternalStore } from 'react'\r\nimport type { SidebarFooterActionOwnerProps } from '@deepseek-ai/dsh-client-ui-sidebar/client'\r\nimport { Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport { networkStore } from './api.ts'\r\nimport { unreadTotal } from './inbox-state.ts'\r\nimport type { NS } from './locales.ts'\r\nimport { pageStore } from './page-store.ts'\r\n\r\nexport type SidebarEntryProps = SidebarFooterActionOwnerProps & PropsLocale<typeof NS>\r\n\r\n/** The SoulMirror glyph: a mirror (rounded frame) with a reflected spark. */\r\nexport function SoulMirrorIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden>\r\n <path d=\"M8 1.2c-3.2 0-5.6 2.6-5.6 6.1 0 2.9 1.7 5.3 4.2 6.1v1.4h2.8v-1.4c2.5-.8 4.2-3.2 4.2-6.1 0-3.5-2.4-6.1-5.6-6.1Zm0 1.4c2.4 0 4.2 2 4.2 4.7S10.4 12 8 12 3.8 10 3.8 7.3 5.6 2.6 8 2.6Z\" fill=\"currentColor\" />\r\n <path d=\"M8.6 4.2 9.2 5.8l1.6.6-1.6.6-.6 1.6L8 7l-1.6-.6L8 5.8l.6-1.6Z\" fill=\"currentColor\" />\r\n </svg>\r\n )\r\n}\r\n\r\nexport function SidebarEntry({ wide, t }: SidebarEntryProps) {\r\n const net = useSyncExternalStore(networkStore.subscribe, networkStore.getSnapshot)\r\n const page = useSyncExternalStore(pageStore.subscribe, pageStore.getSnapshot)\r\n const total = unreadTotal(net.inbox.friends)\r\n const label = total > 0 ? `${t('sidebar.entry')} · ${t('sidebar.unread', { n: total })}` : t('sidebar.entry')\r\n\r\n return (\r\n <Tooltip label={label} delayMs={500} disabled={wide}>\r\n <button\r\n type=\"button\"\r\n className={`sm-footer${wide ? '' : ' sm-rail'}`}\r\n aria-label={label}\r\n aria-haspopup=\"dialog\"\r\n aria-expanded={page.open}\r\n data-soulmirror-footer\r\n data-soulmirror-unread-total={total}\r\n onClick={() => { pageStore.toggle() }}\r\n >\r\n <span className=\"sm-footer-icon\">\r\n <SoulMirrorIcon size={wide ? 16 : 18} />\r\n {!wide && total > 0 ? <span className=\"sm-dot\" aria-hidden /> : null}\r\n </span>\r\n {wide ? <span className=\"sm-footer-label\">{t('sidebar.entry')}</span> : null}\r\n {wide && total > 0 ? <span className=\"sm-badge\">{total > 99 ? '99+' : total}</span> : null}\r\n </button>\r\n </Tooltip>\r\n )\r\n}\r\n","/**\r\n * `shell.overlay` entry `soulmirror-inbox`: the new-mail cue — a ui-primitives\r\n * Toast \"New message from <name>\" for mail whose session is not the one on\r\n * screen and whose thread is not open on the SoulMirror page. Always mounted\r\n * (the overlay layer is click-through until an entry renders something), so\r\n * the SSE stream is kept open by the store subscription here and the footer\r\n * badge updates live even while the page is closed. The P2 inbox popover\r\n * that used to live here was replaced by the full page (./SoulmirrorPage.tsx).\r\n */\r\nimport { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react'\r\nimport { Toast } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport { networkStore } from './api.ts'\r\nimport { shouldNotify, type MailNotice } from './inbox-state.ts'\r\nimport type { NS } from './locales.ts'\r\nimport { pageStore } from './page-store.ts'\r\nimport { SoulMirrorIcon } from './SidebarEntry.tsx'\r\n\r\nexport interface InboxOverlayInjected {\r\n /** The session currently on screen (ctx.sessions.list current), for the new-mail cue. */\r\n currentSessionId: () => string | undefined\r\n}\r\n\r\nexport type InboxOverlayProps = InboxOverlayInjected & PropsLocale<typeof NS>\r\n\r\nconst MAX_TOASTS = 3\r\n\r\ninterface ToastEntry extends MailNotice { key: number }\r\n\r\nexport function InboxOverlay({ currentSessionId, t }: InboxOverlayProps) {\r\n // Subscribing keeps the SSE stream open for the whole page lifetime.\r\n useSyncExternalStore(networkStore.subscribe, networkStore.getSnapshot)\r\n const [toasts, setToasts] = useState<ToastEntry[]>([])\r\n const seq = useRef(0)\r\n useEffect(() => networkStore.onMail((notice) => {\r\n const page = pageStore.getSnapshot()\r\n if (page.open && page.selected === notice.fp) return\r\n if (!shouldNotify(notice, currentSessionId())) return\r\n seq.current += 1\r\n const entry: ToastEntry = { ...notice, key: seq.current }\r\n setToasts(prev => [...prev.slice(-(MAX_TOASTS - 1)), entry])\r\n }), [currentSessionId])\r\n const dismiss = useCallback((key: number) => { setToasts(prev => prev.filter(x => x.key !== key)) }, [])\r\n\r\n return (\r\n <>\r\n {toasts.map(toast => (\r\n <MailToast key={toast.key} entry={toast} t={t} onDone={() => { dismiss(toast.key) }} />\r\n ))}\r\n </>\r\n )\r\n}\r\n\r\nfunction MailToast({ entry, t, onDone }: { entry: ToastEntry; t: InboxOverlayProps['t']; onDone: () => void }) {\r\n return <Toast text={t('toast.newMail', { name: entry.name })} icon={<SoulMirrorIcon size={16} />} onDone={onDone} />\r\n}\r\n","/** Dictionary namespace and zh/en copy owned by the soulnet-dsh client half. */\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\n\nexport const NS = 'soulmirror'\n\nexport const en = {\n 'view.tab': 'SoulMirror',\n 'sidebar.entry': 'SoulMirror',\n 'sidebar.unread': '{n} unread',\n 'inbox.title': 'SoulMirror',\n 'inbox.hint': 'Your alter speaks to your friends on your behalf. Open SoulMirror to talk to it, watch its conversations and review its drafts; click a friend to open that thread.',\n 'inbox.friends': 'Friends',\n 'inbox.pending': 'Pending requests ({n})',\n 'inbox.pending.noGreeting': '(no greeting)',\n 'inbox.pending.accepted': 'Accepted {name}.',\n 'inbox.empty': 'No friends yet — paste a card URI below, or /add.',\n 'inbox.empty.noIdentity': 'No identity yet — create one in Settings → SoulMirror network.',\n 'inbox.noIdentity': 'No identity yet',\n 'inbox.noMessages': 'No messages yet',\n 'inbox.typing': 'typing…',\n 'inbox.online': 'online',\n 'inbox.offline': 'offline',\n 'inbox.open': 'Open the thread with {name}',\n 'inbox.close': 'Close',\n 'inbox.card.copy': 'Copy my card URI',\n 'inbox.card.copied': 'Copied',\n 'inbox.add': 'Add',\n 'inbox.add.placeholder': 'Add a friend: paste a card URI (soulmirror://card?…)',\n 'toast.newMail': 'New message from {name}',\n 'bubble.in': 'from {name}',\n 'bubble.out': 'to {name}',\n 'bubble.mine': 'my alter',\n 'bubble.auto': 'auto-reply',\n 'bubble.note': 'SoulMirror',\n 'settings.nav': 'SoulMirror network',\n 'settings.title': 'SoulMirror network',\n 'settings.intro': 'This dsh is a node on the SoulMirror network: an end-to-end encrypted A2A identity, friends, and your alter — one dsh session (\"My alter\") that speaks to every friend on your behalf.',\n 'settings.status': 'Backend',\n 'settings.status.soulnet': 'soulnet light peer',\n 'settings.status.fake': 'in-memory fake',\n 'settings.state.ready': 'running',\n 'settings.state.starting': 'starting…',\n 'settings.state.restarting': 'restarting…',\n 'settings.state.stopped': 'stopped',\n 'settings.state.error': 'error',\n 'settings.binary': 'binary',\n 'settings.binary.setting': 'from the peerBinary setting',\n 'settings.binary.platform-package': 'from the platform package',\n 'settings.binary.path': 'from PATH',\n 'settings.binary.plugin-bin': 'from the plugin bin/ directory',\n 'settings.identity': 'Identity',\n 'settings.identity.none': 'No identity yet. Pick a display name to create one — this generates your key pair locally.',\n 'settings.identity.name': 'Display name',\n 'settings.identity.create': 'Create identity',\n 'settings.identity.creating': 'Creating…',\n 'settings.card': 'My card URI',\n 'settings.card.copy': 'Copy',\n 'settings.card.copied': 'Copied',\n 'settings.card.hint': 'Send this link to people who should add you; they paste it in their SoulMirror (or /add here).',\n 'settings.backup': 'Back up identity.json',\n 'settings.backup.body': 'Your identity is the private key in {path}. Losing it means losing this identity, friends and history — copy the whole a2a/ directory somewhere safe. Moving to SoulMirror later = copying it to ~/.soulmirror/a2a/.',\n 'settings.config': 'Connection',\n 'settings.config.relay': 'Relay URL',\n 'settings.config.displayName': 'Display name (for a new identity)',\n 'settings.config.backend': 'Backend',\n 'settings.config.peerBinary': 'soulnet binary path',\n 'settings.config.home': 'Data directory',\n 'settings.config.hint': 'Changes apply the next time dsh starts (the peer process is spawned with them). Empty path = PATH lookup, then the plugin\\'s bin/; empty directory = $SOULNET_HOME, then ~/.soulnet.',\n 'settings.config.unavailable': 'Settings are editable from a local (loopback) browser only.',\n 'settings.friends': 'Friends',\n 'settings.friends.hint': 'Friends are read-only threads on the SoulMirror page: your alter writes to them, you tell your alter what to say.',\n 'settings.friends.none': 'No friends yet. Paste a card URI below or use /add.',\n 'settings.friends.open': 'Open on the page',\n 'settings.friends.online': 'online',\n 'settings.friends.offline': 'offline',\n 'settings.friends.unread': '{n} unread',\n 'settings.friends.typing': 'typing…',\n 'settings.pending': 'Pending requests',\n 'settings.pending.none': 'No pending requests.',\n 'settings.pending.accept': 'Accept',\n 'settings.pending.reject': 'Reject',\n 'settings.add': 'Add a friend',\n 'settings.add.uri': 'Card URI (soulmirror://card?…)',\n 'settings.add.note': 'Note / name (optional, also the greeting)',\n 'settings.add.send': 'Send request',\n 'settings.add.sent': 'Request sent to {name}. The thread appears once they accept.',\n 'settings.error': 'Error: {message}',\n 'settings.refresh': 'Refresh',\n 'onboard.title': 'Welcome to the SoulMirror network',\n 'onboard.body': 'Create your A2A identity: a key pair generated on this machine. Others add you by pasting your card URI.',\n 'onboard.name': 'Display name',\n 'onboard.create': 'Create identity',\n 'onboard.done': 'Done',\n 'onboard.later': 'Later',\n 'onboard.created': 'Identity created. Copy your card URI and back up identity.json.',\n 'onboard.waiting': 'The soulnet peer is not running yet ({state}). Check Settings → SoulMirror network.',\n 'cmd.friends.open': 'Open the thread with {name}',\n 'cmd.friends.none': 'No friends yet',\n 'cmd.soulmirror.page': 'Open SoulMirror — My alter',\n 'cmd.soulmirror.page.detail': 'Talk to your alter; friends on the left are its conversations',\n 'page.title': 'SoulMirror',\n 'page.close': 'Back to dsh',\n 'page.search': 'Search friends',\n 'page.pending': 'New friends',\n 'page.friends': 'Friends',\n 'page.identity.pending': '{n} pending',\n 'page.drafts.count': '{n} to review',\n 'page.row.draftTag': '[draft]',\n 'page.add': 'Add friend',\n 'page.add.uri': 'Card URI (soulmirror://card?…)',\n 'page.add.note': 'Note (optional, also the greeting)',\n 'page.add.send': 'Send request',\n 'page.empty.noFriends': 'No friends yet. Paste a card URI under \"Add friend\" at the bottom of the list, or send yours to a friend.',\n 'page.empty.noFriends.noIdentity': 'No identity yet — create one in Settings → SoulMirror network.',\n 'page.empty.noMatch': 'No friend matches \"{query}\".',\n 'page.header.online': 'online',\n 'page.header.offline': 'offline',\n 'page.header.lastSeen': 'last message {age} ago',\n 'page.header.lastSeen.now': 'last message just now',\n 'page.header.card': 'Card',\n 'page.header.card.title': 'Card of {name}',\n 'page.header.card.copy': 'Copy',\n 'page.header.card.copied': 'Copied',\n 'page.header.markRead': 'Mark read',\n 'page.thread.loading': 'Loading…',\n 'page.thread.loadOlder': 'Load older messages',\n 'page.thread.start': 'Start of the conversation',\n 'page.thread.today': 'Today',\n 'page.thread.yesterday': 'Yesterday',\n 'page.thread.typing': '{name} is typing…',\n 'page.thread.attachment': 'attachment: {name}',\n 'page.status.sending': 'sending…',\n 'page.status.sent': 'sent',\n 'page.status.queued': 'queued — relay unreachable, will retry',\n 'page.status.error': 'not delivered',\n 'page.status.failed': 'failed: {message}',\n 'page.status.retry': 'Retry',\n 'page.status.discard': 'Discard',\n 'page.composer.send': 'Send',\n 'page.composer.instructing': 'Sending…',\n 'page.composer.direct': 'Debug: direct to {name} · end-to-end encrypted · your alter does not see it',\n 'page.open': 'Open SoulMirror',\n 'alter.me': 'My alter',\n 'alter.row.hint': 'Talk to your alter directly',\n 'alter.row.drafts': '{n} draft(s) waiting for you',\n 'alter.status.running': 'Your alter is working…',\n 'alter.status.idle': 'Ready · one memory shared across every friend',\n 'alter.status.noSession': 'Starting the alter session…',\n 'alter.openDsh': 'Open in dsh',\n 'alter.openDsh.hint': 'The same conversation as a native dsh session (trajectory, tools, approvals).',\n 'alter.pendbar': '{n} draft(s) of your alter wait for your decision',\n 'alter.pendbar.go': 'Review in {name}\\'s thread →',\n 'alter.empty.title': 'Tell your alter what to do',\n 'alter.empty.hint': 'It writes to your friends on your behalf (\"tell Bob I am in\"), answers their mail by your diplomacy protocol, and asks you before money, tasks or commitments. Friends on the left are its conversations — read-only for you.',\n 'alter.composer.placeholder': 'Say something to your alter… (Enter to send, Shift+Enter for a new line)',\n 'alter.composer.hint': 'You only talk to your own alter; it speaks to your friends for you.',\n 'alter.proactive': 'proactive',\n 'alter.thinking': 'Your alter is working…',\n 'alter.item.inbound': 'Mail from {name}',\n 'alter.item.view': 'open thread',\n 'alter.item.send': 'To {name}',\n 'alter.item.send.pending': 'sending…',\n 'alter.item.send.sent': 'sent',\n 'alter.item.send.auto': 'sent · auto',\n 'alter.item.send.draft': 'draft — waiting for your review',\n 'alter.item.send.refused': 'not sent',\n 'alter.item.send.failed': 'failed',\n 'alter.item.note.approved': 'You approved the draft to {name}; it was sent',\n 'alter.item.note.rejected': 'You rejected the draft to {name}',\n 'alter.item.note.revise': 'You sent the draft to {name} back for revision',\n 'alter.item.turnFailed': 'The turn failed: {reason}',\n 'alter.item.revise': 'Revision for {name}',\n 'alter.failed.hint': 'No model answer — check the model / API key in dsh, then try again.',\n 'draft.tag': 'Draft',\n 'draft.title': 'Your alter wants to send this',\n 'draft.title.to': 'Your alter wants to send this to {name}',\n 'draft.openThread': 'open thread',\n 'draft.reason.draft-tier': 'Held because this friend\\'s reply tier is \"draft\" (you review before anything goes out).',\n 'draft.reason.notify-tier': 'Held because this friend\\'s reply tier is \"notify\".',\n 'draft.reason.rate-limited': 'Held because the hourly auto-reply cap for this friend is reached.',\n 'draft.reason.loop-guard-auto': 'Held because the mail that woke your alter was itself an automatic reply (loop guard).',\n 'draft.reason.other-friend': 'Held because your alter wants to write to a different friend than the one who wrote.',\n 'draft.reason.unknown-trigger': 'Held because your alter was not acting on your instruction or on this friend\\'s mail.',\n 'draft.inReplyTo': 'in reply to mail from {name}',\n 'draft.approve': 'Send it',\n 'draft.edit': 'Edit',\n 'draft.editSend': 'Send edited',\n 'draft.revise': 'Let the alter revise',\n 'draft.revise.placeholder': 'Tell your alter what to change (it rewrites and sends on your word)…',\n 'draft.reviseSend': 'Send feedback to the alter',\n 'draft.reject': 'Reject',\n 'draft.cancel': 'Cancel',\n 'friend.banner.prefix': 'This is ',\n 'friend.banner.mine': 'your alter',\n 'friend.banner.middle': '\\'s conversation with ',\n 'friend.banner.theirs': '{name}',\n 'friend.banner.suffix': ' — you can\\'t speak here. Tell \"My alter\" instead.',\n 'friend.banner.go': 'Go to My alter',\n 'friend.empty': 'No messages yet — tell \"My alter\" to write to {name}.',\n 'friend.drafts.pill': '{n} draft(s) waiting for your decision',\n 'friend.actbar.eye': 'Alter ↔ alter · you are the observer',\n 'friend.actbar.pending': 'Drafts',\n 'friend.actbar.settings': 'Protocol & settings',\n 'friend.actbar.goAlter': 'Talk to My alter →',\n 'friend.debug.placeholder': 'Debug: send as myself to {name}… (bypasses the alter)',\n 'friend.debug.send': 'Send as myself',\n 'tier.notify': 'Notify only',\n 'tier.draft': 'Draft — you review before it sends',\n 'tier.auto': 'Auto-reply — no review (rate-limited)',\n 'tier.default': 'Default ({tier})',\n 'tier.short.notify': 'notify',\n 'tier.short.draft': 'draft',\n 'tier.short.auto': 'auto',\n 'friend.settings.title': 'How your alter handles {name}',\n 'friend.tier': 'Reply tier',\n 'friend.tier.hint': 'notify: mail is only shown; draft: your alter drafts a reply and you review it on this page; auto: it sends by itself (max {n}/hour).',\n 'friend.protocol': 'Protocol override for this friend',\n 'friend.protocol.placeholder': 'Rules for this friend only (they win over the global protocol on conflict). Empty = none.',\n 'friend.protocol.save': 'Save',\n 'friend.protocol.saved': 'Saved.',\n 'protocol.title': 'Diplomacy protocol',\n 'protocol.open': 'Protocol',\n 'protocol.hint': 'The principles your alter follows when it speaks to friends on your behalf (global; per-friend overrides live under \"Protocol & settings\" in a friend thread). Saved to {path}; applies from the next turn.',\n 'protocol.missing': 'No protocol.md yet — the peer writes the default when your identity is created; saving here creates it.',\n 'protocol.save': 'Save protocol',\n 'protocol.saved': 'Saved.',\n 'protocol.reload': 'Reload',\n 'settings.alter': 'Your alter',\n 'settings.alter.intro': 'One dsh session (\"My alter\") is your alter: you tell it what to say, it writes to your friends and answers their mail by the diplomacy protocol. In the \"draft\" tier its replies wait for your review on the SoulMirror page; \"auto\" sends by itself (rate-limited); \"notify\" only shows the mail. These settings apply immediately.',\n 'settings.alter.defaultTier': 'Default reply tier',\n 'settings.alter.perHour': 'Auto replies per friend per hour',\n 'settings.alter.directSend': 'Debug: offer \"Send as myself\" in friend threads (bypasses the alter)',\n 'settings.alter.openPage': 'Open SoulMirror',\n 'settings.alter.openSession': 'Open the alter session in dsh',\n 'settings.alter.legacy': '{n} old per-friend session(s) from before 0.1.0-p4 are kept in dsh but receive no mail; you can delete them.',\n} as const\n\nexport const zh: Record<keyof typeof en, string> = {\n 'view.tab': '灵镜',\n 'sidebar.entry': '灵镜',\n 'sidebar.unread': '{n} 条未读',\n 'inbox.title': '灵镜',\n 'inbox.hint': '你的分身替你和好友往来。打开灵镜就能跟它说话、看它和好友的对话、审它拟的稿;点好友打开那段往来。',\n 'inbox.friends': '好友',\n 'inbox.pending': '待处理申请({n})',\n 'inbox.pending.noGreeting': '(没有问候语)',\n 'inbox.pending.accepted': '已接受 {name}。',\n 'inbox.empty': '还没有好友——在下面贴名片链接,或用 /add。',\n 'inbox.empty.noIdentity': '还没有身份——到 设置 → 灵镜网络 创建。',\n 'inbox.noIdentity': '还没有身份',\n 'inbox.noMessages': '还没有消息',\n 'inbox.typing': '正在输入…',\n 'inbox.online': '在线',\n 'inbox.offline': '离线',\n 'inbox.open': '打开与 {name} 的往来',\n 'inbox.close': '关闭',\n 'inbox.card.copy': '复制我的名片链接',\n 'inbox.card.copied': '已复制',\n 'inbox.add': '添加',\n 'inbox.add.placeholder': '加好友:贴名片链接(soulmirror://card?…)',\n 'toast.newMail': '{name} 发来新消息',\n 'bubble.in': '来自 {name}',\n 'bubble.out': '发给 {name}',\n 'bubble.mine': '我的分身',\n 'bubble.auto': '自动回复',\n 'bubble.note': '灵镜',\n 'settings.nav': '灵镜网络',\n 'settings.title': '灵镜网络',\n 'settings.intro': '这个 dsh 是灵镜网络上的一个节点:端到端加密的 A2A 身份、好友,以及你的分身——一条 dsh 会话(「我的分身」),替你和所有好友往来。',\n 'settings.status': '后端',\n 'settings.status.soulnet': 'soulnet 灵网轻端',\n 'settings.status.fake': '内存假实现',\n 'settings.state.ready': '运行中',\n 'settings.state.starting': '启动中…',\n 'settings.state.restarting': '重启中…',\n 'settings.state.stopped': '已停止',\n 'settings.state.error': '出错',\n 'settings.binary': '可执行文件',\n 'settings.binary.setting': '来自 peerBinary 设置',\n 'settings.binary.platform-package': '来自平台包',\n 'settings.binary.path': '来自 PATH',\n 'settings.binary.plugin-bin': '来自插件 bin/ 目录',\n 'settings.identity': '身份',\n 'settings.identity.none': '还没有身份。起一个昵称就会在本机生成密钥对。',\n 'settings.identity.name': '昵称',\n 'settings.identity.create': '创建身份',\n 'settings.identity.creating': '创建中…',\n 'settings.card': '我的名片链接',\n 'settings.card.copy': '复制',\n 'settings.card.copied': '已复制',\n 'settings.card.hint': '把这个链接发给要加你的人;对方在灵镜里贴上(或在这里 /add)。',\n 'settings.backup': '备份 identity.json',\n 'settings.backup.body': '你的身份就是 {path} 里的私钥。丢了就丢了身份、好友和历史——把整个 a2a/ 目录拷到安全的地方。以后迁到灵镜 = 拷到 ~/.soulmirror/a2a/。',\n 'settings.config': '连接',\n 'settings.config.relay': '邮局(relay)地址',\n 'settings.config.displayName': '昵称(用于新建身份)',\n 'settings.config.backend': '后端',\n 'settings.config.peerBinary': 'soulnet 可执行文件路径',\n 'settings.config.home': '数据目录',\n 'settings.config.hint': '改动下次启动 dsh 时生效(轻端进程按这些参数启动)。路径留空 = 查 PATH,再查插件 bin/;目录留空 = $SOULNET_HOME,再 ~/.soulnet。',\n 'settings.config.unavailable': '只有本机(loopback)浏览器可以编辑设置。',\n 'settings.friends': '好友',\n 'settings.friends.hint': '好友在灵镜页面里是只读的往来记录:分身替你写信,你只吩咐分身。',\n 'settings.friends.none': '还没有好友。在下面贴名片链接,或用 /add。',\n 'settings.friends.open': '在灵镜里打开',\n 'settings.friends.online': '在线',\n 'settings.friends.offline': '离线',\n 'settings.friends.unread': '{n} 条未读',\n 'settings.friends.typing': '正在输入…',\n 'settings.pending': '待处理的好友申请',\n 'settings.pending.none': '没有待处理的申请。',\n 'settings.pending.accept': '接受',\n 'settings.pending.reject': '拒绝',\n 'settings.add': '加好友',\n 'settings.add.uri': '名片链接(soulmirror://card?…)',\n 'settings.add.note': '备注/名字(可选,同时作为问候语)',\n 'settings.add.send': '发送申请',\n 'settings.add.sent': '已向 {name} 发出申请,对方接受后往来就会出现。',\n 'settings.error': '错误:{message}',\n 'settings.refresh': '刷新',\n 'onboard.title': '欢迎来到灵镜网络',\n 'onboard.body': '创建你的 A2A 身份:在本机生成一对密钥。别人贴你的名片链接就能加你。',\n 'onboard.name': '昵称',\n 'onboard.create': '创建身份',\n 'onboard.done': '完成',\n 'onboard.later': '稍后',\n 'onboard.created': '身份已创建。复制名片链接,并备份 identity.json。',\n 'onboard.waiting': 'soulnet 轻端还没运行({state})。请到 设置 → 灵镜网络 查看。',\n 'cmd.friends.open': '打开与 {name} 的往来',\n 'cmd.friends.none': '还没有好友',\n 'cmd.soulmirror.page': '打开灵镜——我的分身',\n 'cmd.soulmirror.page.detail': '跟你的分身说话;左边的好友是它的往来',\n 'page.title': '灵镜',\n 'page.close': '返回 dsh',\n 'page.search': '搜索好友',\n 'page.pending': '新的朋友',\n 'page.friends': '我的好友',\n 'page.identity.pending': '{n} 条待处理',\n 'page.drafts.count': '{n} 项待确认',\n 'page.row.draftTag': '[待确认]',\n 'page.add': '加好友',\n 'page.add.uri': '名片链接(soulmirror://card?…)',\n 'page.add.note': '备注(可选,同时作为问候语)',\n 'page.add.send': '发送申请',\n 'page.empty.noFriends': '还没有好友。把对方的名片链接贴到列表底部的「加好友」,或把你的名片发给对方。',\n 'page.empty.noFriends.noIdentity': '还没有身份——到 设置 → 灵镜网络 创建。',\n 'page.empty.noMatch': '没有匹配「{query}」的好友。',\n 'page.header.online': '在线',\n 'page.header.offline': '离线',\n 'page.header.lastSeen': '最近消息 {age} 前',\n 'page.header.lastSeen.now': '最近消息刚刚',\n 'page.header.card': '名片',\n 'page.header.card.title': '{name} 的名片',\n 'page.header.card.copy': '复制',\n 'page.header.card.copied': '已复制',\n 'page.header.markRead': '标为已读',\n 'page.thread.loading': '加载中…',\n 'page.thread.loadOlder': '加载更早的消息',\n 'page.thread.start': '对话开始',\n 'page.thread.today': '今天',\n 'page.thread.yesterday': '昨天',\n 'page.thread.typing': '{name} 正在输入…',\n 'page.thread.attachment': '附件:{name}',\n 'page.status.sending': '发送中…',\n 'page.status.sent': '已发送',\n 'page.status.queued': '已排队——邮局暂不可达,会自动重试',\n 'page.status.error': '未送达',\n 'page.status.failed': '发送失败:{message}',\n 'page.status.retry': '重试',\n 'page.status.discard': '丢弃',\n 'page.composer.send': '发送',\n 'page.composer.instructing': '发送中…',\n 'page.composer.direct': '调试:直发给 {name} · 端到端加密 · 分身看不到',\n 'page.open': '打开灵镜',\n 'alter.me': '我的分身',\n 'alter.row.hint': '跟你的分身直接对话',\n 'alter.row.drafts': '{n} 项等你拍板',\n 'alter.status.running': '分身正在处理…',\n 'alter.status.idle': '就绪 · 对所有好友共享同一记忆',\n 'alter.status.noSession': '分身会话启动中…',\n 'alter.openDsh': '在 dsh 里打开',\n 'alter.openDsh.hint': '同一段对话的 dsh 原生会话(轨迹、工具、审批)。',\n 'alter.pendbar': '还有 {n} 项分身拟稿等你拍板',\n 'alter.pendbar.go': '去「{name}」里看 →',\n 'alter.empty.title': '吩咐你的分身',\n 'alter.empty.hint': '它替你给好友写信(「告诉 Bob 我到」),按外交准则应答来信,涉及花钱、任务、承诺时先问你。左边的好友是它的往来——你只看不说。',\n 'alter.composer.placeholder': '和你的分身说点什么…(Enter 发送,Shift+Enter 换行)',\n 'alter.composer.hint': '你只对自己的分身说话;对外发言由它替你去说。',\n 'alter.proactive': '主动',\n 'alter.thinking': '分身正在处理…',\n 'alter.item.inbound': '{name} 来信',\n 'alter.item.view': '看往来',\n 'alter.item.send': '发给 {name}',\n 'alter.item.send.pending': '发送中…',\n 'alter.item.send.sent': '已发出',\n 'alter.item.send.auto': '已发出 · 自动',\n 'alter.item.send.draft': '拟稿——等你拍板',\n 'alter.item.send.refused': '未发出',\n 'alter.item.send.failed': '失败',\n 'alter.item.note.approved': '你允许了发给 {name} 的拟稿,已发出',\n 'alter.item.note.rejected': '你拒绝了发给 {name} 的拟稿',\n 'alter.item.note.revise': '你把发给 {name} 的拟稿退回重写',\n 'alter.item.turnFailed': '这一轮失败:{reason}',\n 'alter.item.revise': '让分身改 → {name}',\n 'alter.failed.hint': '模型没有回答——检查 dsh 的模型 / API key 后再试。',\n 'draft.tag': '待确认',\n 'draft.title': '我的分身想这样回复',\n 'draft.title.to': '我的分身想这样发给 {name}',\n 'draft.openThread': '看往来',\n 'draft.reason.draft-tier': '依据:这位好友的应答档位是「拟稿」(发出前先问你)。',\n 'draft.reason.notify-tier': '依据:这位好友的应答档位是「只通知」。',\n 'draft.reason.rate-limited': '依据:对这位好友的自动回复已达每小时上限。',\n 'draft.reason.loop-guard-auto': '依据:唤醒分身的那封来信本身是自动回复(防循环)。',\n 'draft.reason.other-friend': '依据:分身想写给的不是来信的那位好友。',\n 'draft.reason.unknown-trigger': '依据:分身既不是按你的吩咐、也不是在回复这位好友的来信。',\n 'draft.inReplyTo': '回复 {name} 的来信',\n 'draft.approve': '允许发送',\n 'draft.edit': '改一改',\n 'draft.editSend': '按改后的发送',\n 'draft.revise': '让分身改',\n 'draft.revise.placeholder': '告诉分身怎么改(它重写后按你的吩咐发出)…',\n 'draft.reviseSend': '把意见发给分身',\n 'draft.reject': '拒绝',\n 'draft.cancel': '取消',\n 'friend.banner.prefix': '这是',\n 'friend.banner.mine': '你的分身',\n 'friend.banner.middle': '与',\n 'friend.banner.theirs': '{name} 的分身',\n 'friend.banner.suffix': '的往来,你不能直接发言;要说话去找「我的分身」。',\n 'friend.banner.go': '去「我的分身」',\n 'friend.empty': '还没往来——去「我的分身」说「让分身问问 {name}…」即可发起。',\n 'friend.drafts.pill': '{n} 项等你拍板',\n 'friend.actbar.eye': '分身与分身的对话——你是观察者',\n 'friend.actbar.pending': '待确认',\n 'friend.actbar.settings': '准则 / 好友设置',\n 'friend.actbar.goAlter': '去找「我的分身」说话 →',\n 'friend.debug.placeholder': '调试:以我本人发给 {name}…(绕过分身)',\n 'friend.debug.send': '以我本人发送',\n 'tier.notify': '只通知',\n 'tier.draft': '拟稿——发出前先问我',\n 'tier.auto': '自动回复——不用审批(有频控)',\n 'tier.default': '默认({tier})',\n 'tier.short.notify': '只通知',\n 'tier.short.draft': '拟稿',\n 'tier.short.auto': '自动',\n 'friend.settings.title': '分身如何对待 {name}',\n 'friend.tier': '应答档位',\n 'friend.tier.hint': '只通知:来信只展示;拟稿:分身拟好回复、在本页等你拍板;自动:分身自己发(每小时最多 {n} 条)。',\n 'friend.protocol': '对这位好友的准则补充',\n 'friend.protocol.placeholder': '只对这位好友生效的规则(冲突时压过全局准则)。留空 = 没有。',\n 'friend.protocol.save': '保存',\n 'friend.protocol.saved': '已保存。',\n 'protocol.title': '外交准则',\n 'protocol.open': '准则',\n 'protocol.hint': '分身替你和好友往来时遵守的处世原则(全局;对单个好友的补充在好友往来底部的「准则 / 好友设置」里)。保存到 {path},下一轮起生效。',\n 'protocol.missing': '还没有 protocol.md——轻端在创建身份时写入默认准则;在这里保存会直接创建。',\n 'protocol.save': '保存准则',\n 'protocol.saved': '已保存。',\n 'protocol.reload': '重新读取',\n 'settings.alter': '我的分身',\n 'settings.alter.intro': '一条 dsh 会话(「我的分身」)就是你的分身:你吩咐它,它替你给好友写信、按外交准则应答来信。「拟稿」档的回复在灵镜页面等你拍板;「自动」档自己发(有频控);「只通知」只展示来信。这些设置立即生效。',\n 'settings.alter.defaultTier': '默认应答档位',\n 'settings.alter.perHour': '每位好友每小时自动回复上限',\n 'settings.alter.directSend': '调试:在好友往来里提供「以我本人发送」(绕过分身)',\n 'settings.alter.openPage': '打开灵镜',\n 'settings.alter.openSession': '在 dsh 里打开分身会话',\n 'settings.alter.legacy': '0.1.0-p4 之前的 {n} 条按好友分开的旧会话仍留在 dsh 里,但不再收信,可以删除。',\n}\n\nexport type SoulmirrorKey = keyof typeof en\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n soulmirror: SoulmirrorKey\n }\n}\n","/**\n * Building blocks shared by the SoulMirror page and the settings section:\n *\n * - `TierPill` / `TierSelect`: the reply tier (notify / draft / auto, with\n * an optional \"default\" entry).\n * - `FriendSettingsPanel`: per-friend tier + protocol override (friend pane,\n * above the action bar).\n * - `ProtocolEditor`: the global diplomacy protocol textarea (friend list\n * head + settings section), saved through `protocol.set`.\n */\nimport { useEffect, useState, useSyncExternalStore } from 'react'\nimport { api, networkStore, type ReplyTier } from './api.ts'\nimport type { Translate } from './Inbox.tsx'\n\nexport const TIERS: readonly ReplyTier[] = ['notify', 'draft', 'auto']\n\nexport function tierLabel(t: Translate, tier: ReplyTier): string {\n return tier === 'notify' ? t('tier.notify') : tier === 'auto' ? t('tier.auto') : t('tier.draft')\n}\n\nexport function tierShort(t: Translate, tier: ReplyTier): string {\n return tier === 'notify' ? t('tier.short.notify') : tier === 'auto' ? t('tier.short.auto') : t('tier.short.draft')\n}\n\nexport function TierPill({ tier, t }: { tier: ReplyTier; t: Translate }) {\n return <span className={`sm-tier-pill sm-tier-${tier}`} data-soulmirror-tier={tier}>{tierShort(t, tier)}</span>\n}\n\nexport function TierSelect({ value, defaultTier, onChange, t, disabled, id }: {\n /** Stored tier; undefined = the global default applies. */\n value: ReplyTier | undefined\n defaultTier: ReplyTier\n onChange: (tier: ReplyTier | undefined) => void\n t: Translate\n disabled?: boolean\n id?: string\n}) {\n return (\n <select\n id={id}\n className=\"sm-select\"\n value={value ?? ''}\n disabled={disabled}\n onChange={(e) => { onChange(e.target.value === '' ? undefined : e.target.value as ReplyTier) }}\n data-soulmirror-tier-select\n >\n <option value=\"\">{t('tier.default', { tier: tierShort(t, defaultTier) })}</option>\n {TIERS.map(tier => <option key={tier} value={tier}>{tierLabel(t, tier)}</option>)}\n </select>\n )\n}\n\n/** Per-friend alter settings: reply tier + protocol override (friend pane, above the action bar). */\nexport function FriendSettingsPanel({ fp, name, tier, tierExplicit, protocol, defaultTier, perHour, t, onClose }: {\n fp: string\n name: string\n tier: ReplyTier | undefined\n tierExplicit: boolean\n protocol: string | undefined\n defaultTier: ReplyTier\n perHour: number\n t: Translate\n onClose?: () => void\n}) {\n const [draft, setDraft] = useState(protocol ?? '')\n const [busy, setBusy] = useState(false)\n const [note, setNote] = useState<{ kind: 'ok' | 'error'; text: string } | undefined>(undefined)\n useEffect(() => { setDraft(protocol ?? '') }, [fp, protocol])\n\n const save = async (patch: { tier?: ReplyTier | ''; protocol?: string }): Promise<void> => {\n setBusy(true)\n setNote(undefined)\n try {\n await api.friendSet(fp, patch)\n await networkStore.refresh()\n setNote({ kind: 'ok', text: t('friend.protocol.saved') })\n } catch (e: unknown) {\n setNote({ kind: 'error', text: e instanceof Error ? e.message : String(e) })\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className=\"sm-friend-settings\" data-soulmirror-friend-settings={fp}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <div className=\"sm-section\" style={{ padding: 0, flex: 1 }}>{t('friend.settings.title', { name })}</div>\n {onClose !== undefined ? <button type=\"button\" className=\"sm-linkbtn\" onClick={onClose}>{t('inbox.close')}</button> : null}\n </div>\n <label>\n <span>{t('friend.tier')}</span>\n <TierSelect value={tierExplicit ? tier : undefined} defaultTier={defaultTier} disabled={busy} t={t} onChange={(next) => { void save({ tier: next ?? '' }) }} />\n <span>{t('friend.tier.hint', { n: perHour })}</span>\n </label>\n <label>\n <span>{t('friend.protocol')}</span>\n <textarea className=\"sm-textarea-box\" value={draft} placeholder={t('friend.protocol.placeholder')} onChange={(e) => { setDraft(e.target.value) }} data-soulmirror-friend-protocol />\n </label>\n <div className=\"sm-alter-actions\">\n {note !== undefined ? <span style={{ marginRight: 'auto', fontSize: 11.5 }} className={note.kind === 'error' ? 'sm-alter-error' : 'sm-muted'}>{note.kind === 'error' ? t('settings.error', { message: note.text }) : note.text}</span> : null}\n <button type=\"button\" className=\"sm-ghostbtn\" disabled={busy || draft === (protocol ?? '')} onClick={() => { void save({ protocol: draft }) }} data-soulmirror-friend-protocol-save>{t('friend.protocol.save')}</button>\n </div>\n </div>\n )\n}\n\n/** The global diplomacy protocol editor (protocol.md), used by the friend list and the settings section. */\nexport function ProtocolEditor({ t, compact }: { t: Translate; compact?: boolean }) {\n const net = useSyncExternalStore(networkStore.subscribe, networkStore.getSnapshot)\n const [text, setText] = useState<string | undefined>(undefined)\n const [saved, setSaved] = useState<string | undefined>(undefined)\n const [path, setPath] = useState<string>(net.state?.alter?.protocolPath ?? '')\n const [exists, setExists] = useState<boolean>(net.state?.alter?.protocolExists ?? true)\n const [busy, setBusy] = useState(false)\n const [note, setNote] = useState<{ kind: 'ok' | 'error'; text: string } | undefined>(undefined)\n\n const load = async (): Promise<void> => {\n setBusy(true)\n try {\n const r = await api.protocolGet()\n setText(r.text)\n setSaved(r.text)\n setPath(r.path)\n setExists(r.exists)\n setNote(undefined)\n } catch (e: unknown) {\n setNote({ kind: 'error', text: e instanceof Error ? e.message : String(e) })\n } finally {\n setBusy(false)\n }\n }\n useEffect(() => { void load() }, [])\n\n const save = async (): Promise<void> => {\n if (text === undefined) return\n setBusy(true)\n try {\n const r = await api.protocolSet(text)\n setSaved(r.text)\n setText(r.text)\n setExists(true)\n setNote({ kind: 'ok', text: t('protocol.saved') })\n } catch (e: unknown) {\n setNote({ kind: 'error', text: e instanceof Error ? e.message : String(e) })\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className=\"sm-protocol\" data-soulmirror-protocol>\n {compact ? null : <strong>{t('protocol.title')}</strong>}\n <span className=\"sm-muted\" style={{ fontSize: 11.5 }}>{t('protocol.hint', { path })}</span>\n {!exists ? <span className=\"sm-alter-warn\" style={{ fontSize: 11.5 }}>{t('protocol.missing')}</span> : null}\n <textarea\n className=\"sm-textarea-box\"\n value={text ?? ''}\n disabled={text === undefined}\n onChange={(e) => { setText(e.target.value) }}\n spellCheck={false}\n data-soulmirror-protocol-text\n />\n <div className=\"sm-alter-actions\">\n {note !== undefined ? <span style={{ marginRight: 'auto', fontSize: 11.5 }} className={note.kind === 'error' ? 'sm-alter-error' : 'sm-muted'}>{note.kind === 'error' ? t('settings.error', { message: note.text }) : note.text}</span> : null}\n <button type=\"button\" className=\"sm-ghostbtn\" disabled={busy} onClick={() => { void load() }}>{t('protocol.reload')}</button>\n <button type=\"button\" className=\"sm-ghostbtn\" disabled={busy || text === undefined || text === saved} onClick={() => { void save() }} data-soulmirror-protocol-save>{t('protocol.save')}</button>\n </div>\n </div>\n )\n}\n","/**\n * `settings.section` \"SoulMirror network\": backend status, identity (create on\n * first run; card URI + copy + backup warning), connection settings bound to\n * the host `soulmirror` settings namespace, the alter settings (default reply\n * tier, auto replies per hour, the debug \"send as myself\" toggle, the global\n * diplomacy protocol editor, open the page / the alter's dsh session),\n * friends (presence / unread / drafts / open on the page), pending requests\n * (accept / reject) and an add-friend form.\n */\nimport { useCallback, useEffect, useState, useSyncExternalStore } from 'react'\nimport type { CSSProperties } from 'react'\n// Type-only: the 'settings.section' SlotMap row (declared by ui-settings).\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { SettingsScope } from '@deepseek-ai/dsh-client-runtime/client'\nimport { ProtocolEditor, TIERS, tierLabel } from './alter-ui.tsx'\nimport { api, networkStore, type ApiPending, type ReplyTier } from './api.ts'\nimport type { NS } from './locales.ts'\nimport { pageStore } from './page-store.ts'\n\ntype SettingsSectionProps = PropsRuntime<'settings.section'>\n\nexport interface SoulmirrorSettingsValues {\n relay?: string\n displayName?: string\n backend?: string\n peerBinary?: string\n home?: string\n defaultTier?: ReplyTier\n autoReplyPerHour?: number\n directSend?: boolean\n}\n\nexport interface SoulmirrorSettingsInjected {\n /** Select a session as current (ctx.sessions.open) — used for \"Open the alter session in dsh\". */\n openSession: (id: string) => void\n /** Bound settings scope of the `soulmirror` namespace. */\n scope: SettingsScope<SoulmirrorSettingsValues>\n}\n\nexport type SoulmirrorSettingsProps =\n SettingsSectionProps & InjectFace<SoulmirrorSettingsInjected> & PropsLocale<typeof NS>\n\nconst card: CSSProperties = { border: '1px solid rgba(127,127,127,.25)', borderRadius: 10, padding: '10px 12px', display: 'grid', gap: 8 }\nconst h4: CSSProperties = { margin: 0, fontSize: '0.95em' }\nconst small: CSSProperties = { opacity: 0.7, fontSize: '0.82em', margin: 0 }\nconst input: CSSProperties = { font: 'inherit', padding: '6px 8px', borderRadius: 6, border: '1px solid rgba(127,127,127,.35)', background: 'transparent', color: 'inherit', width: '100%', boxSizing: 'border-box' }\nconst mono: CSSProperties = { fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace', fontSize: '0.8em', wordBreak: 'break-all', userSelect: 'all' }\nconst rowStyle: CSSProperties = { display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap' }\nconst warn: CSSProperties = { ...card, borderColor: 'rgba(255,160,0,.55)', background: 'rgba(255,160,0,.08)' }\n\nfunction useCopy(): [copied: boolean, copy: (text: string) => void] {\n const [copied, setCopied] = useState(false)\n const copy = useCallback((text: string) => {\n void navigator.clipboard?.writeText(text).then(() => {\n setCopied(true)\n setTimeout(() => { setCopied(false) }, 1500)\n }).catch(() => {})\n }, [])\n return [copied, copy]\n}\n\nexport function CardBlock({ cardUri, home, t }: { cardUri: string; home: string; t: SoulmirrorSettingsProps['t'] }) {\n const [copied, copy] = useCopy()\n const sep = home.includes('\\\\') ? '\\\\' : '/'\n return (\n <>\n <div style={card}>\n <h4 style={h4}>{t('settings.card')}</h4>\n <div style={mono} data-soulmirror-card-uri>{cardUri}</div>\n <div style={rowStyle}>\n <button type=\"button\" onClick={() => { copy(cardUri) }}>{copied ? t('settings.card.copied') : t('settings.card.copy')}</button>\n <span style={small}>{t('settings.card.hint')}</span>\n </div>\n </div>\n <div style={warn} role=\"note\">\n <h4 style={h4}>⚠ {t('settings.backup')}</h4>\n <p style={{ ...small, opacity: 0.9 }}>{t('settings.backup.body', { path: `${home}${sep}a2a${sep}identity.json` })}</p>\n </div>\n </>\n )\n}\n\nfunction SettingField({ label, field, scope, values, user, writable, type = 'text', options, optionLabel, min }: {\n label: string\n field: keyof SoulmirrorSettingsValues\n scope: SettingsScope<SoulmirrorSettingsValues>\n values: SoulmirrorSettingsValues | undefined\n user: Record<string, unknown>\n writable: boolean\n type?: 'text' | 'select' | 'number'\n options?: readonly string[]\n optionLabel?: (option: string) => string\n min?: number\n}) {\n const current = values?.[field] ?? ''\n const [draft, setDraft] = useState(String(current))\n useEffect(() => { setDraft(String(current)) }, [current])\n const commit = (): void => {\n if (draft === String(current)) return\n const value: unknown = type === 'number' ? Math.max(min ?? 0, Math.floor(Number(draft) || 0)) : draft\n void scope.set(field, value as never).catch(() => {})\n }\n const overridden = field in user\n return (\n <label style={{ display: 'grid', gap: 4, fontSize: '0.85em' }}>\n <span style={{ opacity: 0.8 }}>{label}{overridden ? ' *' : ''}</span>\n {type === 'select'\n ? (\n <select value={draft} disabled={!writable} onChange={(e) => { setDraft(e.target.value); void scope.set(field, e.target.value as never).catch(() => {}) }} style={input} data-soulmirror-setting={field}>\n {(options ?? []).map(o => <option key={o} value={o}>{optionLabel === undefined ? o : optionLabel(o)}</option>)}\n </select>\n )\n : <input style={input} type={type === 'number' ? 'number' : 'text'} min={min} value={draft} disabled={!writable} onChange={e => { setDraft(e.target.value) }} onBlur={commit} onKeyDown={(e) => { if (e.key === 'Enter') commit() }} data-soulmirror-setting={field} />}\n </label>\n )\n}\n\nconst BINARY_SOURCE_KEYS = {\n 'setting': 'settings.binary.setting',\n 'platform-package': 'settings.binary.platform-package',\n 'path': 'settings.binary.path',\n 'plugin-bin': 'settings.binary.plugin-bin',\n} as const\nfunction binarySourceLabel(t: SoulmirrorSettingsProps['t'], source: string): string {\n const key = (BINARY_SOURCE_KEYS as Record<string, (typeof BINARY_SOURCE_KEYS)[keyof typeof BINARY_SOURCE_KEYS] | undefined>)[source]\n return key === undefined ? source : t(key)\n}\n\nexport function SoulmirrorSettingsSection({ openSession, scope, t }: SoulmirrorSettingsProps) {\n const net = useSyncExternalStore(networkStore.subscribe, networkStore.getSnapshot)\n // The scope is a class instance (methods need `this`): wrap instead of passing them unbound.\n const subscribeScope = useCallback((listener: () => void) => scope.subscribe(listener), [scope])\n const readScope = useCallback(() => scope.getSnapshot(), [scope])\n const settings = useSyncExternalStore(subscribeScope, readScope)\n const state = net.state\n const status = net.status ?? state?.status\n const [name, setName] = useState('')\n const [busy, setBusy] = useState<string | undefined>(undefined)\n const [message, setMessage] = useState<string | undefined>(undefined)\n const [error, setError] = useState<string | undefined>(undefined)\n const [addUri, setAddUri] = useState('')\n const [addNote, setAddNote] = useState('')\n\n const run = async (key: string, action: () => Promise<string | undefined>): Promise<void> => {\n setBusy(key)\n setError(undefined)\n setMessage(undefined)\n try {\n const note = await action()\n if (note !== undefined) setMessage(note)\n await networkStore.refresh()\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : String(e))\n } finally {\n setBusy(undefined)\n }\n }\n\n const writable = settings.status === 'ready' && settings.writable\n const userLayer = (typeof settings.user === 'object' && settings.user !== null ? settings.user : {}) as Record<string, unknown>\n const displayName = settings.value?.displayName ?? ''\n useEffect(() => { if (name === '' && displayName !== '') setName(displayName) }, [displayName, name])\n const directSend = settings.value?.directSend === true\n\n return (\n <div style={{ display: 'grid', gap: 12 }} data-soulmirror-settings>\n <h3 style={{ margin: 0 }}>{t('settings.title')}</h3>\n <p style={small}>{t('settings.intro')}</p>\n\n <div style={card}>\n <div style={rowStyle}>\n <h4 style={h4}>{t('settings.status')}</h4>\n <span>{state?.backend === 'fake' ? t('settings.status.fake') : t('settings.status.soulnet')}</span>\n {status !== undefined ? <span style={{ opacity: 0.8 }}>· {t(`settings.state.${status.state}`)}{status.pid !== undefined ? ` (pid ${status.pid})` : ''}{status.restarts > 0 ? ` · restarts ${status.restarts}` : ''}</span> : null}\n <button type=\"button\" onClick={() => { void networkStore.refresh() }} disabled={net.loading}>{t('settings.refresh')}</button>\n </div>\n {status?.lastError !== undefined ? <p style={{ ...small, color: 'rgb(220,80,60)' }}>{status.lastError}</p> : null}\n {net.error !== undefined ? <p style={{ ...small, color: 'rgb(220,80,60)' }}>{t('settings.error', { message: net.error })}</p> : null}\n {state?.error !== undefined ? <p style={{ ...small, color: 'rgb(220,80,60)' }}>{t('settings.error', { message: state.error })}</p> : null}\n {status?.relay !== undefined || state?.home !== undefined\n ? <p style={small}>{status?.relay ?? ''}{status?.relay !== undefined ? ' · ' : ''}{state?.home ?? ''}</p>\n : null}\n {status?.binary !== undefined\n ? <p style={small} data-soulmirror-binary>{t('settings.binary')}: <code style={{ wordBreak: 'break-all' }}>{status.binary}</code>{status.binarySource !== undefined ? ` (${binarySourceLabel(t, status.binarySource)})` : ''}{status.version !== undefined ? ` · soulnet ${status.version}` : ''}</p>\n : null}\n </div>\n\n <div style={card}>\n <h4 style={h4}>{t('settings.identity')}</h4>\n {state?.identity\n ? (\n <div style={rowStyle}>\n <strong>{state.identity.name}</strong>\n <span style={mono}>{state.identity.fp}</span>\n </div>\n )\n : (\n <>\n <p style={small}>{t('settings.identity.none')}</p>\n <div style={rowStyle}>\n <input style={{ ...input, maxWidth: 280 }} placeholder={t('settings.identity.name')} value={name} onChange={e => { setName(e.target.value) }} />\n <button\n type=\"button\"\n disabled={busy !== undefined || name.trim() === '' || status?.state === 'error'}\n onClick={() => { void run('create', async () => { await api.createIdentity(name.trim()); return undefined }) }}\n >\n {busy === 'create' ? t('settings.identity.creating') : t('settings.identity.create')}\n </button>\n </div>\n </>\n )}\n </div>\n\n {state?.identity ? <CardBlock cardUri={state.identity.cardUri} home={state.home} t={t} /> : null}\n\n <div style={card}>\n <h4 style={h4}>{t('settings.config')}</h4>\n {settings.status === 'unavailable' || settings.mode === 'memory' ? <p style={small}>{t('settings.config.unavailable')}</p> : null}\n <SettingField label={t('settings.config.relay')} field=\"relay\" scope={scope} values={settings.value} user={userLayer} writable={writable} />\n <SettingField label={t('settings.config.displayName')} field=\"displayName\" scope={scope} values={settings.value} user={userLayer} writable={writable} />\n <SettingField label={t('settings.config.backend')} field=\"backend\" scope={scope} values={settings.value} user={userLayer} writable={writable} type=\"select\" options={['soulnet', 'fake']} />\n <SettingField label={t('settings.config.peerBinary')} field=\"peerBinary\" scope={scope} values={settings.value} user={userLayer} writable={writable} />\n <SettingField label={t('settings.config.home')} field=\"home\" scope={scope} values={settings.value} user={userLayer} writable={writable} />\n <p style={small}>{t('settings.config.hint')}</p>\n </div>\n\n <div style={card} data-soulmirror-settings-alter>\n <h4 style={h4}>{t('settings.alter')}</h4>\n <p style={small}>{t('settings.alter.intro')}</p>\n <SettingField label={t('settings.alter.defaultTier')} field=\"defaultTier\" scope={scope} values={settings.value} user={userLayer} writable={writable} type=\"select\" options={TIERS} optionLabel={(o) => tierLabel(t, o as ReplyTier)} />\n <SettingField label={t('settings.alter.perHour')} field=\"autoReplyPerHour\" scope={scope} values={settings.value} user={userLayer} writable={writable} type=\"number\" min={0} />\n <div style={rowStyle}>\n <button type=\"button\" onClick={() => { pageStore.open('alter') }} data-soulmirror-settings-open-page>{t('settings.alter.openPage')}</button>\n {state?.alter?.sessionId != null ? <button type=\"button\" onClick={() => { openSession(state.alter!.sessionId!) }} data-soulmirror-settings-open-alter-session>{t('settings.alter.openSession')}</button> : null}\n {state?.alter?.legacyFriendSessions !== undefined && Object.keys(state.alter.legacyFriendSessions).length > 0\n ? <span style={small}>{t('settings.alter.legacy', { n: Object.keys(state.alter.legacyFriendSessions).length })}</span>\n : null}\n </div>\n <label style={{ display: 'flex', alignItems: 'center', gap: 8, fontSize: '0.85em' }}>\n <input type=\"checkbox\" checked={directSend} disabled={!writable} onChange={(e) => { void scope.set('directSend', e.target.checked).catch(() => {}) }} data-soulmirror-setting=\"directSend\" />\n <span>{t('settings.alter.directSend')}</span>\n </label>\n <ProtocolEditor t={t} />\n </div>\n\n <div style={card}>\n <h4 style={h4}>{t('settings.friends')}</h4>\n <p style={small}>{t('settings.friends.hint')}</p>\n {(state?.friends.length ?? 0) === 0\n ? <p style={small}>{t('settings.friends.none')}</p>\n : (\n <ul style={{ listStyle: 'none', padding: 0, margin: 0, display: 'grid', gap: 6 }}>\n {state?.friends.map(f => (\n <li key={f.fp} style={rowStyle}>\n <span title={f.online === true ? t('settings.friends.online') : t('settings.friends.offline')} style={{ color: f.online === true ? 'rgb(60,180,90)' : 'rgba(127,127,127,.7)' }}>●</span>\n <span style={{ flex: 1, minWidth: 160 }}>\n <strong>{f.name}</strong>\n {f.cardName !== undefined && f.cardName !== f.name ? <span style={{ opacity: 0.6 }}> ({f.cardName})</span> : null}\n <span style={{ ...mono, opacity: 0.6 }}> {f.fp.slice(0, 16)}…</span>\n {f.tier !== undefined ? <span style={{ marginLeft: 8, opacity: 0.7 }}>{t(`tier.short.${f.tier}`)}</span> : null}\n {f.unread > 0 ? <span style={{ marginLeft: 8, color: 'var(--dsw-alias-brand-primary)' }}>{t('settings.friends.unread', { n: f.unread })}</span> : null}\n {(f.drafts ?? 0) > 0 ? <span style={{ marginLeft: 8, color: 'var(--dsw-alias-state-warn-primary)' }}>{t('page.drafts.count', { n: f.drafts ?? 0 })}</span> : null}\n {net.typing[f.fp] === true || f.typing === true ? <span style={{ marginLeft: 8, opacity: 0.8 }}>{t('settings.friends.typing')}</span> : null}\n </span>\n <button type=\"button\" onClick={() => { pageStore.open(f.fp) }}>{t('settings.friends.open')}</button>\n </li>\n ))}\n </ul>\n )}\n </div>\n\n <div style={card}>\n <h4 style={h4}>{t('settings.pending')}{(state?.pending.length ?? 0) > 0 ? ` (${state?.pending.length ?? 0})` : ''}</h4>\n {(state?.pending.length ?? 0) === 0\n ? <p style={small}>{t('settings.pending.none')}</p>\n : (\n <ul style={{ listStyle: 'none', padding: 0, margin: 0, display: 'grid', gap: 6 }}>\n {state?.pending.map((p: ApiPending) => (\n <li key={p.id} style={rowStyle}>\n <span style={{ flex: 1, minWidth: 160 }}>\n <strong>{p.name}</strong> <span style={{ ...mono, opacity: 0.6 }}>{p.fp.slice(0, 16)}…</span>\n {p.greeting !== '' ? <span style={{ opacity: 0.75 }}> — “{p.greeting}”</span> : null}\n </span>\n <button type=\"button\" disabled={busy !== undefined} onClick={() => { void run(`accept:${p.id}`, async () => { const r = await api.accept(p.id); pageStore.open(r.friend.fp); return undefined }) }}>{t('settings.pending.accept')}</button>\n <button type=\"button\" disabled={busy !== undefined} onClick={() => { void run(`reject:${p.id}`, async () => { await api.reject(p.id); return undefined }) }}>{t('settings.pending.reject')}</button>\n </li>\n ))}\n </ul>\n )}\n </div>\n\n <div style={card}>\n <h4 style={h4}>{t('settings.add')}</h4>\n <input style={input} placeholder={t('settings.add.uri')} value={addUri} onChange={e => { setAddUri(e.target.value) }} />\n <input style={input} placeholder={t('settings.add.note')} value={addNote} onChange={e => { setAddNote(e.target.value) }} />\n <div style={rowStyle}>\n <button\n type=\"button\"\n disabled={busy !== undefined || addUri.trim() === '' || !state?.identity}\n onClick={() => {\n void run('add', async () => {\n const { friend } = await api.addFriend(addUri.trim(), addNote.trim() === '' ? undefined : addNote.trim())\n setAddUri('')\n setAddNote('')\n return t('settings.add.sent', { name: friend.name })\n })\n }}\n >\n {t('settings.add.send')}\n </button>\n {message !== undefined ? <span style={small}>{message}</span> : null}\n </div>\n </div>\n\n {error !== undefined ? <p style={{ ...small, color: 'rgb(220,80,60)' }} role=\"alert\">{t('settings.error', { message: error })}</p> : null}\n </div>\n )\n}\n","/**\r\n * `settings.onboarding` step \"soulmirror-identity\": shown once while there is\r\n * no SoulMirror identity. Name → create → card URI + copy + backup warning →\r\n * Done. Completes immediately (renders nothing) when an identity exists, or\r\n * when the user picks \"Later\" (they can create it in Settings any time; the\r\n * step shows again on the next start while no identity exists, because the\r\n * only durable completion fact we keep is the identity itself).\r\n */\r\nimport { useEffect, useRef, useState, useSyncExternalStore } from 'react'\r\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\r\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport { api, networkStore } from './api.ts'\r\nimport type { NS } from './locales.ts'\r\nimport { CardBlock } from './SettingsSection.tsx'\r\n\r\nexport type OnboardingProps = PropsRuntime<'settings.onboarding'> & PropsLocale<typeof NS>\r\n\r\nexport function SoulmirrorOnboarding({ complete, openSection, t }: OnboardingProps) {\r\n const net = useSyncExternalStore(networkStore.subscribe, networkStore.getSnapshot)\r\n const [name, setName] = useState('')\r\n const [busy, setBusy] = useState(false)\r\n const [error, setError] = useState<string | undefined>(undefined)\r\n const [created, setCreated] = useState(false)\r\n const finished = useRef(false)\r\n const finish = (): void => {\r\n if (finished.current) return\r\n finished.current = true\r\n complete()\r\n }\r\n\r\n // Identity present and we did not just create it → nothing to onboard.\r\n useEffect(() => {\r\n if (net.state?.identity && !created) finish()\r\n })\r\n\r\n useEffect(() => {\r\n const appRoot = document.getElementById('root')\r\n if (appRoot === null || net.state === undefined || (net.state.identity && !created)) return\r\n const previous = appRoot.inert\r\n appRoot.inert = true\r\n return () => { appRoot.inert = previous }\r\n }, [net.state, created])\r\n\r\n if (net.state === undefined) return null\r\n if (net.state.identity && !created) return null\r\n const status = net.status ?? net.state.status\r\n const peerDown = net.state.backend === 'soulnet' && status.state !== 'ready'\r\n\r\n return (\r\n <Modal open title={t('onboard.title')} onClose={() => {}} headless>\r\n <div style={{ display: 'grid', gap: 12, padding: 16, maxWidth: 560 }} data-soulmirror-onboarding>\r\n <h2 style={{ margin: 0, fontSize: '1.1em' }}>{t('onboard.title')}</h2>\r\n {!created\r\n ? (\r\n <>\r\n <p style={{ margin: 0, opacity: 0.8 }}>{t('onboard.body')}</p>\r\n {peerDown ? <p style={{ margin: 0, color: 'rgb(220,120,40)' }}>{t('onboard.waiting', { state: status.state })}</p> : null}\r\n <input\r\n style={{ font: 'inherit', padding: '6px 8px', borderRadius: 6, border: '1px solid rgba(127,127,127,.35)', background: 'transparent', color: 'inherit' }}\r\n placeholder={t('onboard.name')}\r\n value={name}\r\n autoFocus\r\n onChange={e => { setName(e.target.value) }}\r\n />\r\n {error !== undefined ? <p role=\"alert\" style={{ margin: 0, color: 'rgb(220,80,60)' }}>{error}</p> : null}\r\n <div style={{ display: 'flex', gap: 8, justifyContent: 'flex-end' }}>\r\n <Button variant=\"ghost\" onClick={() => { finish() }}>{t('onboard.later')}</Button>\r\n <Button\r\n variant=\"primary\"\r\n disabled={busy || name.trim() === '' || peerDown}\r\n onClick={() => {\r\n setBusy(true)\r\n setError(undefined)\r\n api.createIdentity(name.trim()).then(async () => {\r\n await networkStore.refresh()\r\n setCreated(true)\r\n }).catch((e: unknown) => {\r\n setError(e instanceof Error ? e.message : String(e))\r\n }).finally(() => { setBusy(false) })\r\n }}\r\n >\r\n {t('onboard.create')}\r\n </Button>\r\n </div>\r\n </>\r\n )\r\n : (\r\n <>\r\n <p style={{ margin: 0 }}>{t('onboard.created')}</p>\r\n {net.state.identity ? <CardBlock cardUri={net.state.identity.cardUri} home={net.state.home} t={t} /> : null}\r\n <div style={{ display: 'flex', gap: 8, justifyContent: 'flex-end' }}>\r\n <Button variant=\"ghost\" onClick={() => { finish(); openSection('soulmirror') }}>{t('settings.nav')}</Button>\r\n <Button variant=\"primary\" onClick={() => { finish() }}>{t('onboard.done')}</Button>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </Modal>\r\n )\r\n}\r\n","/**\n * The owner's review card for one pending draft of the alter (P4): what the\n * alter wants to send to whom and why it was held, with the four decisions —\n * approve (send as the alter), edit then send, send it back to the alter with\n * feedback (\"let the alter revise\"), or reject. Rendered in the friend's\n * read-only thread and in the \"My alter\" chat; the host answers through\n * `drafts.decide` and the card disappears with the SSE `draft` frame.\n */\nimport { useState, useSyncExternalStore } from 'react'\nimport { Button, IconCheckOutline14, IconCloseFill14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { ApiDraft } from './api.ts'\nimport type { Translate } from './Inbox.tsx'\nimport { formatAge } from './inbox-state.ts'\nimport { pageStore } from './page-store.ts'\n\nexport function reasonLabel(t: Translate, reason: string): string {\n switch (reason) {\n case 'draft-tier': return t('draft.reason.draft-tier')\n case 'notify-tier': return t('draft.reason.notify-tier')\n case 'rate-limited': return t('draft.reason.rate-limited')\n case 'loop-guard-auto': return t('draft.reason.loop-guard-auto')\n case 'other-friend': return t('draft.reason.other-friend')\n case 'unknown-trigger':\n default: return t('draft.reason.unknown-trigger')\n }\n}\n\nexport function DraftCard({ draft, t, showTarget, onGoFriend }: {\n draft: ApiDraft\n t: Translate\n /** Name the target in the head (the alter chat lists drafts to every friend). */\n showTarget?: boolean\n /** Jump to the friend's read-only thread. */\n onGoFriend?: (fp: string) => void\n}) {\n const page = useSyncExternalStore(pageStore.subscribe, pageStore.getSnapshot)\n const busy = page.deciding.includes(draft.id)\n const [mode, setMode] = useState<'idle' | 'edit' | 'revise'>('idle')\n const [text, setText] = useState(draft.body)\n const [feedback, setFeedback] = useState('')\n const inReplyTo = draft.trigger?.kind === 'inbound' ? (draft.trigger.name ?? draft.name) : undefined\n\n return (\n <div className=\"sm-draft\" data-soulmirror-draft={draft.id} data-soulmirror-draft-fp={draft.fp}>\n <div className=\"sm-draft-head\">\n <span className=\"sm-draft-tag\">{t('draft.tag')}</span>\n <span>{showTarget === true ? t('draft.title.to', { name: draft.name }) : t('draft.title')}</span>\n {showTarget === true && onGoFriend !== undefined\n ? <button type=\"button\" className=\"sm-linkbtn\" onClick={() => { onGoFriend(draft.fp) }}>{t('draft.openThread')}</button>\n : null}\n <span className=\"sm-row-time\">{formatAge(Date.parse(draft.createdAt))}</span>\n </div>\n {mode === 'edit'\n ? (\n <div className=\"sm-draft-edit\">\n <textarea className=\"sm-textarea-box\" value={text} onChange={(e) => { setText(e.target.value) }} autoFocus data-soulmirror-draft-edit />\n <div className=\"sm-draft-actions\">\n <Button variant=\"primary\" size=\"sm\" disabled={busy || text.trim() === ''} onClick={() => { void pageStore.decideDraft(draft.id, { action: 'approve', body: text }).then((ok) => { if (ok) setMode('idle') }) }} data-soulmirror-draft-edit-send>\n {t('draft.editSend')}\n </Button>\n <button type=\"button\" className=\"sm-ghostbtn\" disabled={busy} onClick={() => { setMode('idle'); setText(draft.body) }}>{t('draft.cancel')}</button>\n </div>\n </div>\n )\n : <div className=\"sm-draft-body\" data-soulmirror-draft-body>{draft.body}</div>}\n <div className=\"sm-draft-why\">\n {reasonLabel(t, draft.reason)}\n {inReplyTo !== undefined ? ` · ${t('draft.inReplyTo', { name: inReplyTo })}` : ''}\n </div>\n {mode === 'revise'\n ? (\n <div className=\"sm-draft-edit\">\n <textarea className=\"sm-textarea-box\" value={feedback} placeholder={t('draft.revise.placeholder')} onChange={(e) => { setFeedback(e.target.value) }} autoFocus data-soulmirror-draft-feedback />\n <div className=\"sm-draft-actions\">\n <Button variant=\"primary\" size=\"sm\" disabled={busy || feedback.trim() === ''} onClick={() => { void pageStore.decideDraft(draft.id, { action: 'revise', feedback }).then((ok) => { if (ok) setMode('idle') }) }} data-soulmirror-draft-revise-send>\n {t('draft.reviseSend')}\n </Button>\n <button type=\"button\" className=\"sm-ghostbtn\" disabled={busy} onClick={() => { setMode('idle'); setFeedback('') }}>{t('draft.cancel')}</button>\n </div>\n </div>\n )\n : null}\n {mode === 'idle'\n ? (\n <div className=\"sm-draft-actions\">\n <Button variant=\"primary\" size=\"sm\" icon={<IconCheckOutline14 size={14} />} disabled={busy} onClick={() => { void pageStore.decideDraft(draft.id, { action: 'approve' }) }} data-soulmirror-draft-approve>\n {t('draft.approve')}\n </Button>\n <button type=\"button\" className=\"sm-ghostbtn\" disabled={busy} onClick={() => { setMode('edit') }} data-soulmirror-draft-edit-open>{t('draft.edit')}</button>\n <button type=\"button\" className=\"sm-ghostbtn\" disabled={busy} onClick={() => { setMode('revise') }} data-soulmirror-draft-revise-open>{t('draft.revise')}</button>\n <button type=\"button\" className=\"sm-ghostbtn sm-dangerbtn\" disabled={busy} onClick={() => { void pageStore.decideDraft(draft.id, { action: 'reject' }) }} data-soulmirror-draft-reject>\n <IconCloseFill14 size={12} /> {t('draft.reject')}\n </button>\n </div>\n )\n : null}\n </div>\n )\n}\n","/**\n * Right pane for the pinned first item \"My alter\" (P4): the ONLY place the\n * owner talks. Header (alter avatar, name, live status, \"Open in dsh\"), a\n * pending bar when drafts wait, the transcript of the alter session rendered\n * by us from `session.history` (owner messages right, the alter's notes left,\n * relayed friend mail as compact cards, what the alter sent / queued as send\n * lines, the plugin's draft-decision notes, failed turns), the pending draft\n * cards, and the composer → `alter.instruct` (an owner user/message + a woken\n * turn). The native dsh session holds the same log (\"Open in dsh\").\n */\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport { Button, IconRightUpOutline14, IconSendOutline16, Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { networkStore, type ApiChatItem } from './api.ts'\nimport { DraftCard } from './DraftCard.tsx'\nimport type { Translate } from './Inbox.tsx'\nimport { formatClock, formatDay } from './page-state.ts'\nimport { pageStore } from './page-store.ts'\nimport { SoulMirrorIcon } from './SidebarEntry.tsx'\n\nexport interface AlterPaneProps {\n t: Translate\n /** Open the alter's dsh session (closes the page). */\n onOpenSession: (sessionId: string) => void\n /** Jump to a friend's read-only thread. */\n onGoFriend: (fp: string) => void\n}\n\n/** How close to the bottom (px) counts as \"following\" — new items auto-scroll only then. */\nconst FOLLOW_SLACK = 48\n\nfunction nameOf(friends: readonly { fp: string; name: string }[], fp: string, fallback?: string): string {\n return friends.find(f => f.fp === fp)?.name ?? fallback ?? (fp.length > 10 ? `${fp.slice(0, 10)}…` : fp)\n}\n\nfunction dayOf(ts: number): string {\n const d = new Date(ts)\n return `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`\n}\n\nexport function AlterPane({ t, onOpenSession, onGoFriend }: AlterPaneProps) {\n const page = useSyncExternalStore(pageStore.subscribe, pageStore.getSnapshot)\n const net = useSyncExternalStore(networkStore.subscribe, networkStore.getSnapshot)\n const alter = page.alter\n const friends = net.inbox.friends\n const drafts = net.inbox.drafts\n const running = alter.status === 'running' || alter.chat.running || alter.instructing\n const [draft, setDraft] = useState('')\n const scroller = useRef<HTMLDivElement>(null)\n const textarea = useRef<HTMLTextAreaElement>(null)\n const following = useRef(true)\n\n useEffect(() => {\n if (!alter.loaded && !alter.loading) void pageStore.loadAlter()\n textarea.current?.focus()\n }, [])\n\n const items = alter.chat.items\n useLayoutEffect(() => {\n const el = scroller.current\n if (el === null) return\n if (following.current) el.scrollTop = el.scrollHeight\n }, [items, drafts.length, running])\n\n const onScroll = (): void => {\n const el = scroller.current\n if (el === null) return\n following.current = el.scrollHeight - el.scrollTop - el.clientHeight < FOLLOW_SLACK\n }\n\n const submit = useCallback((text: string): void => {\n if (text.trim() === '') return\n following.current = true\n setDraft('')\n const el = textarea.current\n if (el !== null) el.style.height = 'auto'\n void pageStore.instruct(text).finally(() => { textarea.current?.focus() })\n }, [])\n\n const autosize = (): void => {\n const el = textarea.current\n if (el === null) return\n el.style.height = 'auto'\n el.style.height = `${Math.min(160, el.scrollHeight)}px`\n }\n\n // Rows with day separators; \"proactive\" = the alter spoke after friend mail, not after the owner.\n const rows: { key: string; node: JSX.Element }[] = []\n let lastDay: string | undefined\n let lastTrigger: 'owner' | 'inbound' | undefined\n for (const item of items) {\n const day = dayOf(item.ts)\n if (day !== lastDay) {\n rows.push({ key: `day:${day}`, node: <div className=\"sm-day\">{formatDay(item.ts, Date.now(), { today: t('page.thread.today'), yesterday: t('page.thread.yesterday') })}</div> })\n lastDay = day\n }\n rows.push({ key: item.key, node: renderItem(item, lastTrigger) })\n if (item.kind === 'owner') lastTrigger = 'owner'\n else if (item.kind === 'inbound') lastTrigger = 'inbound'\n }\n\n function renderItem(item: ApiChatItem, trigger: 'owner' | 'inbound' | undefined): JSX.Element {\n switch (item.kind) {\n case 'owner':\n return (\n <div className=\"sm-citem sm-owner\" data-soulmirror-alter-item=\"owner\" data-soulmirror-alter-revise={item.revise?.fp}>\n <div className=\"sm-cmeta\">\n {item.revise !== undefined ? <span className=\"sm-proactive\">{t('alter.item.revise', { name: nameOf(friends, item.revise.fp, item.revise.name) })}</span> : null}\n <span>{formatClock(item.ts)}</span>\n </div>\n <div className=\"sm-obubble\">{item.text}</div>\n </div>\n )\n case 'alter':\n return (\n <div className=\"sm-citem sm-alter\" data-soulmirror-alter-item=\"alter\">\n <div className=\"sm-cmeta\">\n <span className=\"sm-avatar sm-avatar-alter sm-avatar-sm\" aria-hidden><SoulMirrorIcon size={13} /></span>\n <span>{formatClock(item.ts)}</span>\n {trigger === 'inbound' ? <span className=\"sm-proactive\">{t('alter.proactive')}</span> : null}\n </div>\n <div className=\"sm-abubble\">{item.text}</div>\n </div>\n )\n case 'inbound': {\n const name = nameOf(friends, item.fp, item.name)\n return (\n <div className=\"sm-citem sm-wide\" data-soulmirror-alter-item=\"inbound\">\n <div className=\"sm-inmail\" role=\"button\" tabIndex={0} onClick={() => { onGoFriend(item.fp) }} onKeyDown={(e) => { if (e.key === 'Enter') onGoFriend(item.fp) }}>\n <div className=\"sm-inmail-head\">\n <span>{t('alter.item.inbound', { name: '' })}</span><b>{name}</b>\n <span>· {formatClock(item.ts)}</span>\n {item.auto ? <span>· {t('bubble.auto')}</span> : null}\n <span style={{ marginLeft: 'auto' }} className=\"sm-linkbtn\">{t('alter.item.view')}</span>\n </div>\n <div className=\"sm-inmail-body\">{item.body}</div>\n </div>\n </div>\n )\n }\n case 'send': {\n const name = nameOf(friends, item.fp)\n const state = item.outcome === undefined\n ? <span className=\"sm-statepill\">{t('alter.item.send.pending')}</span>\n : item.outcome === 'sent'\n ? <span className=\"sm-statepill sm-ok\">{item.auto ? t('alter.item.send.auto') : t('alter.item.send.sent')}</span>\n : item.outcome === 'draft-queued'\n ? <span className=\"sm-statepill sm-warn\">{t('alter.item.send.draft')}</span>\n : <span className=\"sm-statepill sm-err\">{item.outcome === 'failed' ? t('alter.item.send.failed') : t('alter.item.send.refused')}{item.detail === undefined ? '' : ` · ${item.detail}`}</span>\n return (\n <div className=\"sm-citem sm-wide\" data-soulmirror-alter-item=\"send\" data-soulmirror-alter-send={item.outcome ?? 'pending'}>\n <div className=\"sm-sendline\">\n <div className=\"sm-sendline-head\">\n <span>{t('alter.item.send', { name: '' })}</span><b>{name}</b>\n <span>· {formatClock(item.ts)}</span>\n {state}\n <button type=\"button\" className=\"sm-linkbtn\" style={{ marginLeft: 'auto' }} onClick={() => { onGoFriend(item.fp) }}>{t('alter.item.view')}</button>\n </div>\n <div className=\"sm-sendline-body\">{item.body}</div>\n </div>\n </div>\n )\n }\n case 'note': {\n const name = nameOf(friends, item.fp)\n const text = item.note === 'draft-approved' ? t('alter.item.note.approved', { name }) : item.note === 'draft-rejected' ? t('alter.item.note.rejected', { name }) : t('alter.item.note.revise', { name })\n return <div className=\"sm-citem sm-center\" data-soulmirror-alter-item=\"note\"><div className=\"sm-noteline\">{text} · {formatClock(item.ts)}</div></div>\n }\n case 'turn-failed':\n return (\n <div className=\"sm-citem sm-center\" data-soulmirror-alter-item=\"turn-failed\">\n <span className=\"sm-statepill sm-err\">{t('alter.item.turnFailed', { reason: item.message === undefined ? item.reason : `${item.reason} — ${item.message}` })}</span>\n <span className=\"sm-noteline\">{t('alter.failed.hint')}</span>\n </div>\n )\n default:\n return <></>\n }\n }\n\n const firstDraft = drafts[0]\n\n return (\n <section className=\"sm-chat-col\" data-soulmirror-page-chat=\"alter\" data-soulmirror-alter-status={running ? 'running' : 'idle'} style={{ position: 'relative' }}>\n <header className=\"sm-chat-head\">\n <span className=\"sm-avatar sm-avatar-alter sm-avatar-lg\" aria-hidden><SoulMirrorIcon size={18} /></span>\n <div style={{ flex: 1, minWidth: 0, display: 'grid' }}>\n <div className=\"sm-chat-head-name\">{t('alter.me')}</div>\n <div className=\"sm-chat-head-sub\">\n <span className={`sm-livedot${running ? ' sm-busy' : ''}`} aria-hidden />\n {alter.sessionId === undefined ? t('alter.status.noSession') : running ? t('alter.status.running') : t('alter.status.idle')}\n </div>\n </div>\n <div className=\"sm-chat-head-actions\">\n {alter.sessionId !== undefined\n ? (\n <Tooltip label={t('alter.openDsh.hint')} side=\"bottom\">\n <button type=\"button\" className=\"sm-ghostbtn\" onClick={() => { onOpenSession(alter.sessionId!) }} data-soulmirror-alter-open-dsh>\n <IconRightUpOutline14 size={14} /> {t('alter.openDsh')}\n </button>\n </Tooltip>\n )\n : null}\n </div>\n </header>\n {drafts.length > 0 && firstDraft !== undefined\n ? (\n <div className=\"sm-pendbar\" data-soulmirror-alter-pendbar={drafts.length}>\n <span>{t('alter.pendbar', { n: drafts.length })}</span>\n <button type=\"button\" className=\"sm-linkbtn\" onClick={() => { onGoFriend(firstDraft.fp) }}>{t('alter.pendbar.go', { name: firstDraft.name })}</button>\n </div>\n )\n : null}\n <div ref={scroller} className=\"sm-thread\" onScroll={onScroll} data-soulmirror-alter-thread>\n <div className=\"sm-thread-inner\">\n {!alter.loaded && alter.loading ? <span className=\"sm-muted\" style={{ alignSelf: 'center', fontSize: 12 }}>{t('page.thread.loading')}</span> : null}\n {alter.error !== undefined ? <span style={{ alignSelf: 'center', fontSize: 12, color: 'var(--dsw-alias-state-error-primary)' }}>{t('settings.error', { message: alter.error })}</span> : null}\n {alter.loaded && items.length === 0 && drafts.length === 0\n ? (\n <div className=\"sm-empty\" data-soulmirror-alter-empty>\n <SoulMirrorIcon size={32} />\n <div className=\"sm-empty-title\">{t('alter.empty.title')}</div>\n <p>{t('alter.empty.hint')}</p>\n </div>\n )\n : null}\n {rows.map(row => <div key={row.key} style={{ display: 'contents' }}>{row.node}</div>)}\n {drafts.map(d => <DraftCard key={d.id} draft={d} t={t} showTarget onGoFriend={onGoFriend} />)}\n {running\n ? (\n <div className=\"sm-citem sm-alter\" data-soulmirror-alter-running>\n <div className=\"sm-typing\" style={{ padding: '2px 0' }}><span className=\"sm-typing-dots\"><span /><span /><span /></span>{t('alter.thinking')}</div>\n </div>\n )\n : null}\n </div>\n </div>\n <div className=\"sm-composer\">\n <div className=\"sm-composer-box\">\n <textarea\n ref={textarea}\n className=\"sm-textarea\"\n rows={1}\n value={draft}\n placeholder={t('alter.composer.placeholder')}\n onChange={(e) => { setDraft(e.target.value); autosize() }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault()\n submit(draft)\n }\n }}\n data-soulmirror-page-composer\n />\n <Button variant=\"primary\" size=\"sm\" icon={<IconSendOutline16 size={14} />} disabled={draft.trim() === '' || alter.instructing} onClick={() => { submit(draft) }} data-soulmirror-page-send>\n {alter.instructing ? t('page.composer.instructing') : t('page.composer.send')}\n </Button>\n </div>\n <span className=\"sm-composer-hint\">{t('alter.composer.hint')}</span>\n </div>\n </section>\n )\n}\n","/**\n * Middle column of the SoulMirror page (prototype #B): identity header (name,\n * fingerprint, copy card, drafts-to-review count, protocol editor toggle,\n * refresh, close), search box, the PINNED FIRST ITEM \"My alter\" (never\n * sorted away — the only place the owner talks), \"Pending requests\" (accept /\n * reject), \"Friends\" (avatar with presence dot and unread badge, name, tier\n * pill, last preview + age — a `[draft]` marker when the alter's draft to\n * that friend waits for review; unread-first then newest) and \"Add friend\"\n * (card URI + note) at the bottom. The selected row is highlighted; clicking\n * a friend row selects it (the friend pane marks it read).\n */\nimport { useCallback, useState, useSyncExternalStore } from 'react'\nimport { Button, IconCheckOutline14, IconCloseFill14, IconCloseOutline16, IconCopyOutline16, IconRefreshOutline14, IconSearchOutline16, Tooltip, writeClipboard } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { ProtocolEditor, TierPill } from './alter-ui.tsx'\nimport { api, networkStore } from './api.ts'\nimport type { Translate } from './Inbox.tsx'\nimport { formatAge, previewOf, unreadTotal, type InboxFriend } from './inbox-state.ts'\nimport { ALTER_KEY, listRows } from './page-state.ts'\nimport { pageStore } from './page-store.ts'\nimport { SoulMirrorIcon } from './SidebarEntry.tsx'\n\nexport interface FriendListProps {\n t: Translate\n /** `ALTER_KEY` or the selected friend's fingerprint. */\n selected: string\n onSelect: (key: string) => void\n /** A pending request was accepted: the new friend's fp. */\n onAccepted?: (fp: string) => void\n /** Close the page (back to dsh). */\n onClose: () => void\n}\n\nfunction useCopy(): [copied: boolean, copy: (text: string) => void] {\n const [copied, setCopied] = useState(false)\n const copy = useCallback((text: string) => {\n void writeClipboard(text).then((ok) => {\n if (!ok) return\n setCopied(true)\n setTimeout(() => { setCopied(false) }, 1500)\n })\n }, [])\n return [copied, copy]\n}\n\nfunction Row({ friend, typing, selected, t, onSelect }: {\n friend: InboxFriend\n typing: boolean\n selected: boolean\n t: Translate\n onSelect: () => void\n}) {\n const unread = friend.unread > 0\n const drafts = friend.drafts ?? 0\n const preview = typing ? t('inbox.typing') : previewOf(friend.lastBody)\n return (\n <li>\n <button\n type=\"button\"\n className={`sm-row${selected ? ' sm-selected' : ''}`}\n onClick={onSelect}\n aria-pressed={selected}\n data-soulmirror-page-friend={friend.fp}\n data-soulmirror-selected={selected ? 'true' : undefined}\n data-soulmirror-row-drafts={drafts > 0 ? drafts : undefined}\n >\n <span className=\"sm-avawrap\">\n <span className=\"sm-avatar\" aria-hidden>{friend.name.slice(0, 1)}</span>\n <span className={`sm-presence${friend.online === true ? ' sm-online' : ''}`} title={friend.online === true ? t('inbox.online') : t('inbox.offline')} />\n {unread ? <span className=\"sm-badge\" data-soulmirror-unread={friend.unread}>{friend.unread > 99 ? '99+' : friend.unread}</span> : null}\n </span>\n <span className=\"sm-row-body\">\n <span className=\"sm-row-title\">\n <span className=\"sm-row-name\">{friend.name}</span>\n {friend.tier !== undefined && friend.tier !== 'draft' ? <TierPill tier={friend.tier} t={t} /> : null}\n <span className=\"sm-row-time\">{formatAge(friend.lastTs)}</span>\n </span>\n <span className={`sm-row-preview${unread ? ' sm-unread' : ''}`}>\n {drafts > 0 ? <span className=\"sm-alert\">{t('page.row.draftTag')} </span> : null}\n {preview === '' ? t('inbox.noMessages') : preview}\n </span>\n </span>\n </button>\n </li>\n )\n}\n\nexport function FriendList({ t, selected, onSelect, onAccepted, onClose }: FriendListProps) {\n const net = useSyncExternalStore(networkStore.subscribe, networkStore.getSnapshot)\n const page = useSyncExternalStore(pageStore.subscribe, pageStore.getSnapshot)\n const { inbox } = net\n const identity = net.state?.identity ?? null\n const status = net.status ?? net.state?.status\n const [copied, copy] = useCopy()\n const [query, setQuery] = useState('')\n const [addUri, setAddUri] = useState('')\n const [addNote, setAddNote] = useState('')\n const [busy, setBusy] = useState<string | undefined>(undefined)\n const [note, setNote] = useState<{ kind: 'ok' | 'error'; text: string } | undefined>(undefined)\n const [protocolOpen, setProtocolOpen] = useState(false)\n const rows = listRows(inbox.friends, query)\n const total = unreadTotal(inbox.friends)\n const drafts = inbox.drafts.length\n const alterRunning = page.alter.status === 'running' || page.alter.chat.running || page.alter.instructing\n const alterSelected = selected === ALTER_KEY\n\n const run = async (key: string, action: () => Promise<string | undefined>): Promise<void> => {\n setBusy(key)\n setNote(undefined)\n try {\n const ok = await action()\n if (ok !== undefined) setNote({ kind: 'ok', text: ok })\n await networkStore.refresh()\n } catch (e: unknown) {\n setNote({ kind: 'error', text: e instanceof Error ? e.message : String(e) })\n } finally {\n setBusy(undefined)\n }\n }\n\n const submitAdd = (): void => {\n if (busy !== undefined || addUri.trim() === '' || identity === null) return\n void run('add', async () => {\n const { friend } = await api.addFriend(addUri.trim(), addNote.trim() === '' ? undefined : addNote.trim())\n setAddUri('')\n setAddNote('')\n return t('settings.add.sent', { name: friend.name })\n })\n }\n\n return (\n <aside className=\"sm-list-col\" data-soulmirror-page-list>\n <div className=\"sm-list-head\">\n <div style={{ flex: 1, minWidth: 0, display: 'grid', gap: 1 }}>\n <div className=\"sm-list-head-title\">\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{identity?.name ?? t('page.title')}</span>\n {total > 0 ? <span className=\"sm-badge\" data-soulmirror-unread-total={total}>{total > 99 ? '99+' : total}</span> : null}\n {drafts > 0\n ? (\n <Tooltip label={t('page.drafts.count', { n: drafts })} side=\"bottom\">\n <span className=\"sm-badge sm-badge-warn\" data-soulmirror-page-drafts-total={drafts}>{t('page.row.draftTag')} {drafts}</span>\n </Tooltip>\n )\n : null}\n </div>\n {identity !== null\n ? (\n <div className=\"sm-muted\" style={{ display: 'flex', alignItems: 'center', gap: 6, minWidth: 0, fontSize: 12 }} data-soulmirror-page-identity>\n <span style={{ fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)', opacity: 0.75 }}>{identity.fp.slice(0, 12)}…</span>\n <Tooltip label={copied ? t('inbox.card.copied') : t('inbox.card.copy')} side=\"bottom\">\n <button type=\"button\" className=\"sm-iconbtn\" aria-label={t('inbox.card.copy')} onClick={() => { copy(identity.cardUri) }}>\n {copied ? <IconCheckOutline14 size={14} /> : <IconCopyOutline16 size={14} />}\n </button>\n </Tooltip>\n {inbox.pending.length > 0 ? <span style={{ color: 'var(--dsw-alias-state-warn-primary)' }}>{t('page.identity.pending', { n: inbox.pending.length })}</span> : null}\n </div>\n )\n : <span className=\"sm-muted\" style={{ fontSize: 12 }}>{status?.state === 'ready' || status === undefined ? t('inbox.noIdentity') : t('onboard.waiting', { state: t(`settings.state.${status.state}`) })}</span>}\n </div>\n <Tooltip label={t('protocol.title')} side=\"bottom\">\n <button type=\"button\" className=\"sm-ghostbtn\" aria-label={t('protocol.title')} aria-expanded={protocolOpen} onClick={() => { setProtocolOpen(v => !v) }} data-soulmirror-page-protocol-toggle>\n {t('protocol.open')}\n </button>\n </Tooltip>\n <Tooltip label={t('settings.refresh')} side=\"bottom\">\n <button type=\"button\" className=\"sm-iconbtn\" aria-label={t('settings.refresh')} onClick={() => { void networkStore.refresh() }}>\n <IconRefreshOutline14 size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('page.close')} side=\"bottom\">\n <button type=\"button\" className=\"sm-iconbtn\" aria-label={t('page.close')} onClick={onClose} data-soulmirror-page-close>\n <IconCloseOutline16 size={14} />\n </button>\n </Tooltip>\n </div>\n <div className=\"sm-list-search\">\n <span style={{ display: 'flex', alignItems: 'center', flex: 1, gap: 6, minWidth: 0 }}>\n <IconSearchOutline16 size={14} />\n <input\n className=\"sm-input\"\n placeholder={t('page.search')}\n value={query}\n onChange={(e) => { setQuery(e.target.value) }}\n aria-label={t('page.search')}\n data-soulmirror-page-search\n />\n </span>\n </div>\n <div className=\"sm-list-body\">\n {protocolOpen ? <ProtocolEditor t={t} /> : null}\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n <li>\n <button\n type=\"button\"\n className={`sm-row sm-row-alter${alterSelected ? ' sm-selected' : ''}`}\n onClick={() => { onSelect(ALTER_KEY) }}\n aria-pressed={alterSelected}\n data-soulmirror-page-alter\n data-soulmirror-selected={alterSelected ? 'true' : undefined}\n >\n <span className=\"sm-avawrap\">\n <span className=\"sm-avatar sm-avatar-alter\" aria-hidden><SoulMirrorIcon size={16} /></span>\n {drafts > 0 ? <span className=\"sm-badge\" data-soulmirror-alter-drafts={drafts}>{drafts}</span> : null}\n </span>\n <span className=\"sm-row-body\">\n <span className=\"sm-row-title\">\n <span className=\"sm-row-name\">{t('alter.me')} <span className={`sm-livedot${alterRunning ? ' sm-busy' : ''}`} aria-hidden /></span>\n </span>\n <span className=\"sm-row-preview\">{alterRunning ? t('alter.status.running') : drafts > 0 ? t('alter.row.drafts', { n: drafts }) : t('alter.row.hint')}</span>\n </span>\n </button>\n </li>\n </ul>\n {inbox.pending.length > 0\n ? (\n <>\n <div className=\"sm-section\">{t('page.pending')} · {inbox.pending.length}</div>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {inbox.pending.map(p => (\n <li key={p.id} className=\"sm-req\" data-soulmirror-page-pending={p.id}>\n <span className=\"sm-avatar sm-avatar-sm\" aria-hidden>{p.name.slice(0, 1)}</span>\n <span className=\"sm-row-body\">\n <span className=\"sm-row-title\"><span className=\"sm-row-name\">{p.name}</span><span className=\"sm-row-time\">{p.createdAt === undefined ? '' : formatAge(Date.parse(p.createdAt))}</span></span>\n <span className=\"sm-row-preview\">{p.greeting === '' ? t('inbox.pending.noGreeting') : previewOf(p.greeting)}</span>\n </span>\n <span className=\"sm-pending-actions\">\n <Tooltip label={t('settings.pending.accept')} side=\"bottom\">\n <button\n type=\"button\"\n className=\"sm-iconbtn\"\n aria-label={t('settings.pending.accept')}\n disabled={busy !== undefined}\n onClick={() => {\n void run(`accept:${p.id}`, async () => {\n const r = await api.accept(p.id)\n onAccepted?.(r.friend.fp)\n return t('inbox.pending.accepted', { name: r.friend.name })\n })\n }}\n >\n <IconCheckOutline14 size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('settings.pending.reject')} side=\"bottom\">\n <button type=\"button\" className=\"sm-iconbtn\" aria-label={t('settings.pending.reject')} disabled={busy !== undefined} onClick={() => { void run(`reject:${p.id}`, async () => { await api.reject(p.id); return undefined }) }}>\n <IconCloseFill14 size={14} />\n </button>\n </Tooltip>\n </span>\n </li>\n ))}\n </ul>\n </>\n )\n : null}\n <div className=\"sm-section\">{t('page.friends')}{inbox.friends.length > 0 ? ` · ${inbox.friends.length}` : ''}</div>\n {inbox.friends.length === 0\n ? <p className=\"sm-muted\" style={{ margin: 0, padding: '4px 10px 10px', fontSize: 12 }} data-soulmirror-page-empty-list>{identity === null ? t('page.empty.noFriends.noIdentity') : t('page.empty.noFriends')}</p>\n : rows.length === 0\n ? <p className=\"sm-muted\" style={{ margin: 0, padding: '4px 10px 10px', fontSize: 12 }}>{t('page.empty.noMatch', { query })}</p>\n : (\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }} data-soulmirror-page-friends>\n {rows.map(f => (\n <Row\n key={f.fp}\n friend={f}\n typing={inbox.typing[f.fp] === true || f.typing === true}\n selected={f.fp === selected}\n t={t}\n onSelect={() => { onSelect(f.fp) }}\n />\n ))}\n </ul>\n )}\n </div>\n <div className=\"sm-list-foot\">\n <div className=\"sm-section\" style={{ padding: '0 0 2px' }}>{t('page.add')}</div>\n <input\n className=\"sm-input\"\n placeholder={t('page.add.uri')}\n value={addUri}\n disabled={identity === null}\n onChange={(e) => { setAddUri(e.target.value) }}\n onKeyDown={(e) => { if (e.key === 'Enter') submitAdd() }}\n data-soulmirror-page-add\n />\n <div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>\n <input\n className=\"sm-input\"\n placeholder={t('page.add.note')}\n value={addNote}\n disabled={identity === null}\n onChange={(e) => { setAddNote(e.target.value) }}\n onKeyDown={(e) => { if (e.key === 'Enter') submitAdd() }}\n />\n <Button variant=\"primary\" size=\"sm\" disabled={busy !== undefined || addUri.trim() === '' || identity === null} onClick={submitAdd}>\n {t('page.add.send')}\n </Button>\n </div>\n {note !== undefined\n ? <span style={{ fontSize: 12, color: note.kind === 'error' ? 'var(--dsw-alias-state-error-primary)' : 'var(--dsw-alias-label-secondary)' }} role={note.kind === 'error' ? 'alert' : undefined}>{note.kind === 'error' ? t('settings.error', { message: note.text }) : note.text}</span>\n : net.error !== undefined ? <span style={{ fontSize: 12, color: 'var(--dsw-alias-state-error-primary)' }}>{t('settings.error', { message: net.error })}</span> : null}\n </div>\n </aside>\n )\n}\n","/**\n * Right pane for a FRIEND item (P4): the read-only A2A thread between the\n * owner's alter and that friend's alter — header (name, presence, Card, Mark\n * read), a banner saying the owner cannot speak here, the bubbles (in = the\n * friend, out = my alter; delivery state; day separators; load older on\n * scroll-up), the pending DRAFT CARDS for this friend (approve / edit /\n * revise / reject), the typing indicator (SSE), an optional friend-settings\n * panel (reply tier + protocol override) and the bottom ACTION BAR instead of\n * a composer: drafts waiting · Card · Protocol & settings · \"Talk to My\n * alter\". With the debug setting \"send as myself\" on, a small direct-send row\n * appears above the action bar (bypasses the alter; P2b behaviour).\n */\nimport { useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport { Button, IconCheckOutline14, IconCopyOutline16, IconSendOutline16, IconUserOutline16, Tooltip, writeClipboard } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { FriendSettingsPanel } from './alter-ui.tsx'\nimport { api, networkStore } from './api.ts'\nimport { DraftCard } from './DraftCard.tsx'\nimport type { Translate } from './Inbox.tsx'\nimport { draftsFor, formatAge, type InboxFriend } from './inbox-state.ts'\nimport { formatClock, formatDay, withDaySeparators, type ThreadEntry, type ThreadState } from './page-state.ts'\nimport { pageStore } from './page-store.ts'\n\nexport interface FriendPaneProps {\n t: Translate\n friend: InboxFriend\n /** Whether the page is visible (mark-read only then). */\n visible: boolean\n /** Jump to \"My alter\". */\n onGoAlter: () => void\n /** Debug setting: offer the direct-send row (bypasses the alter). */\n directSend: boolean\n}\n\n/** How close to the bottom (px) counts as \"following\" — new bubbles auto-scroll only then. */\nconst FOLLOW_SLACK = 48\n\nfunction statusLabel(t: Translate, entry: ThreadEntry): { text: string; failed: boolean } {\n switch (entry.status) {\n case 'sending': return { text: t('page.status.sending'), failed: false }\n case 'queued': return { text: t('page.status.queued'), failed: false }\n case 'error': return { text: t('page.status.error'), failed: true }\n case 'failed': return { text: t('page.status.failed', { message: entry.error ?? '' }), failed: true }\n case 'sent':\n default: return { text: t('page.status.sent'), failed: false }\n }\n}\n\nfunction Bubble({ entry, t, fp, onRetry }: { entry: ThreadEntry; t: Translate; fp: string; onRetry: (body: string) => void }) {\n const out = entry.dir === 'out'\n const status = out ? statusLabel(t, entry) : undefined\n const pending = entry.status === 'sending'\n const failed = entry.status === 'failed' || entry.status === 'error'\n return (\n <div className={`sm-msg ${out ? 'sm-out' : 'sm-in'}`} data-soulmirror-bubble={out ? 'out' : 'in'} data-soulmirror-seq={entry.seq > 0 ? entry.seq : undefined}>\n <div className={`sm-bubble${pending ? ' sm-pending' : ''}${failed ? ' sm-failed' : ''}`}>\n {entry.body}\n {entry.artifactName !== undefined ? <div style={{ fontSize: 11, opacity: 0.8, marginTop: 4 }}>📎 {t('page.thread.attachment', { name: entry.artifactName })}</div> : null}\n </div>\n <div className=\"sm-msg-meta\">\n {out ? <span>{t('bubble.mine')}</span> : null}\n {entry.auto === true ? <span>{t('bubble.auto')}</span> : null}\n <span>{formatClock(entry.ts)}</span>\n {status !== undefined ? <span className={status.failed ? 'sm-status-failed' : undefined} data-soulmirror-status={entry.status ?? 'sent'}>{status.text}</span> : null}\n {entry.status === 'failed' && entry.clientId !== undefined\n ? (\n <>\n <button type=\"button\" className=\"sm-linkbtn\" onClick={() => { const body = pageStore.discard(fp, entry.clientId!); if (body !== undefined) onRetry(body) }}>{t('page.status.retry')}</button>\n <button type=\"button\" className=\"sm-linkbtn\" onClick={() => { pageStore.discard(fp, entry.clientId!) }}>{t('page.status.discard')}</button>\n </>\n )\n : null}\n </div>\n </div>\n )\n}\n\nexport function FriendPane({ t, friend, visible, onGoAlter, directSend }: FriendPaneProps) {\n const fp = friend.fp\n const page = useSyncExternalStore(pageStore.subscribe, pageStore.getSnapshot)\n const net = useSyncExternalStore(networkStore.subscribe, networkStore.getSnapshot)\n const thread: ThreadState = page.threads[fp] ?? { entries: [], window: 0, complete: false, loading: false, loaded: false }\n const drafts = draftsFor(net.inbox, fp)\n const alterConfig = net.state?.alter\n const typing = net.inbox.typing[fp] === true\n const [cardOpen, setCardOpen] = useState(false)\n const [settingsOpen, setSettingsOpen] = useState(false)\n const [copied, setCopied] = useState(false)\n const [debugText, setDebugText] = useState('')\n const scroller = useRef<HTMLDivElement>(null)\n const draftsAnchor = useRef<HTMLDivElement>(null)\n const following = useRef(true)\n const prevFirstSeq = useRef<number | undefined>(undefined)\n const prevHeight = useRef(0)\n\n // Switching friends: reset, fetch the archive.\n useEffect(() => {\n setCardOpen(false)\n setSettingsOpen(false)\n setDebugText('')\n following.current = true\n if (!(pageStore.thread(fp).loaded)) void pageStore.load(fp)\n }, [fp])\n\n // Escape closes the card popover (the page listens too and yields while it is open).\n useEffect(() => {\n if (!cardOpen) return\n const onKey = (e: KeyboardEvent): void => { if (e.key === 'Escape') setCardOpen(false) }\n document.addEventListener('keydown', onKey)\n return () => { document.removeEventListener('keydown', onKey) }\n }, [cardOpen])\n\n // Refresh presence for the open friend (cached 10 s by the peer).\n useEffect(() => {\n let cancelled = false\n api.presence([fp]).then(({ online }) => { if (!cancelled) networkStore.applyPresence(online) }).catch(() => {})\n return () => { cancelled = true }\n }, [fp])\n\n // Open + visible = read: on selection and as mail lands.\n const unread = friend.unread\n useEffect(() => {\n if (!visible) return\n if (typeof document !== 'undefined' && document.visibilityState !== 'visible') return\n if (unread === 0) return\n void networkStore.markRead(fp)\n }, [fp, unread, visible, thread.entries.length])\n useEffect(() => {\n if (!visible || typeof document === 'undefined') return\n const onVisibility = (): void => { if (document.visibilityState === 'visible') void networkStore.markRead(fp) }\n document.addEventListener('visibilitychange', onVisibility)\n return () => { document.removeEventListener('visibilitychange', onVisibility) }\n }, [fp, visible])\n\n // Auto-scroll: stick to the bottom while following; keep the viewport\n // anchored when older entries are prepended.\n const entries = thread.entries\n const firstSeq = entries.find(e => e.seq > 0)?.seq\n useLayoutEffect(() => {\n const el = scroller.current\n if (el === null) return\n if (prevFirstSeq.current !== undefined && firstSeq !== undefined && firstSeq < prevFirstSeq.current) {\n el.scrollTop += el.scrollHeight - prevHeight.current\n } else if (following.current) {\n el.scrollTop = el.scrollHeight\n }\n prevFirstSeq.current = firstSeq\n prevHeight.current = el.scrollHeight\n }, [entries, typing, firstSeq, fp, drafts.length])\n\n const onScroll = (): void => {\n const el = scroller.current\n if (el === null) return\n following.current = el.scrollHeight - el.scrollTop - el.clientHeight < FOLLOW_SLACK\n if (el.scrollTop < 24 && !thread.complete && !thread.loading && thread.loaded) void pageStore.loadOlder(fp)\n }\n\n const age = friend.lastTs === undefined ? '' : formatAge(friend.lastTs)\n const presence = friend.online === true\n ? t('page.header.online')\n : age === '' ? t('page.header.offline') : `${t('page.header.offline')} · ${age === 'now' ? t('page.header.lastSeen.now') : t('page.header.lastSeen', { age })}`\n const rows = withDaySeparators(entries)\n const note = friend.remark !== undefined && friend.remark !== friend.name ? friend.remark : undefined\n\n const sendDebug = (): void => {\n const text = debugText.trim()\n if (text === '') return\n setDebugText('')\n following.current = true\n void pageStore.send(fp, text)\n }\n\n return (\n <section className=\"sm-chat-col\" data-soulmirror-page-chat={fp} data-soulmirror-readonly style={{ position: 'relative' }}>\n <header className=\"sm-chat-head\">\n <span className=\"sm-avawrap\">\n <span className=\"sm-avatar sm-avatar-lg\" aria-hidden>{friend.name.slice(0, 1)}</span>\n <span className={`sm-presence${friend.online === true ? ' sm-online' : ''}`} />\n </span>\n <div style={{ flex: 1, minWidth: 0, display: 'grid' }}>\n <div className=\"sm-chat-head-name\">{friend.name}</div>\n <div className=\"sm-chat-head-sub\" data-soulmirror-presence={friend.online === true ? 'online' : 'offline'}>\n {typing ? <span style={{ color: 'var(--dsw-alias-brand-primary)' }}>{t('page.thread.typing', { name: friend.name })}</span> : presence}\n {note !== undefined ? <span>· {note}</span> : null}\n {friend.tier !== undefined && friend.tier !== 'draft' ? <span>· {t(`tier.short.${friend.tier}`)}</span> : null}\n </div>\n </div>\n <div className=\"sm-chat-head-actions\">\n <button type=\"button\" className=\"sm-ghostbtn\" onClick={() => { setCardOpen(v => !v) }} aria-expanded={cardOpen} data-soulmirror-page-card>\n <IconUserOutline16 size={14} /> {t('page.header.card')}\n </button>\n <button type=\"button\" className=\"sm-ghostbtn\" disabled={unread === 0} onClick={() => { void networkStore.markRead(fp) }} data-soulmirror-page-mark-read>\n <IconCheckOutline14 size={14} /> {t('page.header.markRead')}\n </button>\n </div>\n </header>\n <div className=\"sm-banner\" role=\"note\" data-soulmirror-readonly-banner>\n <span>{t('friend.banner.prefix')}<b>{t('friend.banner.mine')}</b>{t('friend.banner.middle')}<b>{t('friend.banner.theirs', { name: friend.name })}</b>{t('friend.banner.suffix')}</span>\n <button type=\"button\" className=\"sm-ghostbtn\" onClick={onGoAlter} data-soulmirror-banner-go>{t('friend.banner.go')}</button>\n </div>\n {cardOpen\n ? (\n <div className=\"sm-card-pop\" role=\"dialog\" aria-label={t('page.header.card.title', { name: friend.name })} data-soulmirror-page-card-pop>\n <strong>{t('page.header.card.title', { name: friend.name })}</strong>\n <span className=\"sm-muted\">{friend.cardName ?? friend.name}{note !== undefined ? ` · ${note}` : ''}</span>\n <span className=\"sm-card-uri\" data-soulmirror-page-card-fp>{fp}</span>\n <div style={{ display: 'flex', gap: 6, justifyContent: 'flex-end' }}>\n <button\n type=\"button\"\n className=\"sm-ghostbtn\"\n onClick={() => {\n void writeClipboard(fp).then((ok) => {\n if (!ok) return\n setCopied(true)\n setTimeout(() => { setCopied(false) }, 1500)\n })\n }}\n >\n {copied ? <IconCheckOutline14 size={14} /> : <IconCopyOutline16 size={14} />} {copied ? t('page.header.card.copied') : t('page.header.card.copy')}\n </button>\n <button type=\"button\" className=\"sm-ghostbtn\" onClick={() => { setCardOpen(false) }}>{t('inbox.close')}</button>\n </div>\n </div>\n )\n : null}\n <div ref={scroller} className=\"sm-thread\" onScroll={onScroll} data-soulmirror-page-thread>\n <div className=\"sm-thread-inner\">\n {thread.loaded && !thread.complete\n ? (\n <button type=\"button\" className=\"sm-linkbtn sm-muted\" style={{ alignSelf: 'center', fontSize: 11 }} disabled={thread.loading} onClick={() => { void pageStore.loadOlder(fp) }}>\n {thread.loading ? t('page.thread.loading') : t('page.thread.loadOlder')}\n </button>\n )\n : thread.loaded && entries.length > 0\n ? <span className=\"sm-muted\" style={{ alignSelf: 'center', fontSize: 11 }}>{t('page.thread.start')}</span>\n : null}\n {!thread.loaded && thread.loading ? <span className=\"sm-muted\" style={{ alignSelf: 'center', fontSize: 12 }}>{t('page.thread.loading')}</span> : null}\n {thread.error !== undefined ? <span style={{ alignSelf: 'center', fontSize: 12, color: 'var(--dsw-alias-state-error-primary)' }}>{t('settings.error', { message: thread.error })}</span> : null}\n {thread.loaded && entries.length === 0 && thread.error === undefined && drafts.length === 0\n ? <span className=\"sm-muted\" style={{ alignSelf: 'center', fontSize: 12, padding: '24px 0', textAlign: 'center' }} data-soulmirror-page-thread-empty>{t('friend.empty', { name: friend.name })}</span>\n : null}\n {rows.map(row => row.kind === 'day'\n ? <div key={row.key} className=\"sm-day\">{formatDay(row.ts, Date.now(), { today: t('page.thread.today'), yesterday: t('page.thread.yesterday') })}</div>\n : <Bubble key={row.key} entry={row.entry} t={t} fp={fp} onRetry={(body) => { setDebugText(body) }} />)}\n {drafts.length > 0\n ? (\n <div ref={draftsAnchor} data-soulmirror-page-drafts={drafts.length} style={{ display: 'contents' }}>\n <div className=\"sm-citem sm-center\"><span className=\"sm-statepill sm-warn\">{t('friend.drafts.pill', { n: drafts.length })}</span></div>\n {drafts.map(d => <DraftCard key={d.id} draft={d} t={t} />)}\n </div>\n )\n : null}\n </div>\n </div>\n <div className=\"sm-typing\" aria-live=\"polite\" data-soulmirror-page-typing={typing ? 'on' : 'off'}>\n {typing ? <><span className=\"sm-typing-dots\"><span /><span /><span /></span>{t('page.thread.typing', { name: friend.name })}</> : null}\n </div>\n {settingsOpen\n ? (\n <FriendSettingsPanel\n fp={fp}\n name={friend.name}\n tier={friend.tier}\n tierExplicit={friend.tierExplicit === true}\n protocol={friend.protocol}\n defaultTier={alterConfig?.defaultTier ?? 'draft'}\n perHour={alterConfig?.autoReplyPerHour ?? 20}\n t={t}\n onClose={() => { setSettingsOpen(false) }}\n />\n )\n : null}\n {directSend\n ? (\n <div className=\"sm-composer\" data-soulmirror-debug-send style={{ paddingBottom: 6 }}>\n <div className=\"sm-composer-box\">\n <textarea\n className=\"sm-textarea\"\n rows={1}\n value={debugText}\n placeholder={t('friend.debug.placeholder', { name: friend.name })}\n onChange={(e) => { setDebugText(e.target.value); if (e.target.value.trim() !== '') pageStore.noteTyping(fp) }}\n onBlur={() => { if (debugText.trim() === '') pageStore.stopTyping(fp) }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault()\n sendDebug()\n }\n }}\n data-soulmirror-debug-composer\n />\n <Button variant=\"outline\" size=\"sm\" icon={<IconSendOutline16 size={14} />} disabled={debugText.trim() === ''} onClick={sendDebug} data-soulmirror-debug-send-button>\n {t('friend.debug.send')}\n </Button>\n </div>\n <span className=\"sm-composer-hint\">{t('page.composer.direct', { name: friend.name })}</span>\n </div>\n )\n : null}\n <div className=\"sm-actbar\" data-soulmirror-actbar>\n <span className=\"sm-actbar-eye\">{t('friend.actbar.eye')}</span>\n {drafts.length > 0\n ? (\n <button type=\"button\" className=\"sm-ghostbtn sm-warnbtn\" onClick={() => { draftsAnchor.current?.scrollIntoView({ block: 'end', behavior: 'smooth' }) }} data-soulmirror-actbar-drafts={drafts.length}>\n {t('friend.actbar.pending')} <b>{drafts.length}</b>\n </button>\n )\n : null}\n <button type=\"button\" className=\"sm-ghostbtn\" onClick={() => { setCardOpen(v => !v) }}>\n <IconUserOutline16 size={14} /> {t('page.header.card')}\n </button>\n <Tooltip label={t('friend.settings.title', { name: friend.name })} side=\"top\">\n <button type=\"button\" className=\"sm-ghostbtn\" aria-expanded={settingsOpen} onClick={() => { setSettingsOpen(v => !v) }} data-soulmirror-friend-settings-toggle>\n {t('friend.actbar.settings')}\n </button>\n </Tooltip>\n <Button variant=\"primary\" size=\"sm\" onClick={onGoAlter} data-soulmirror-actbar-go-alter>{t('friend.actbar.goAlter')}</Button>\n </div>\n </section>\n )\n}\n","/**\n * `shell.overlay` entry `soulmirror-page`: the full SoulMirror page — the\n * product's chat page inside dsh (prototype #B). It covers the frame to the\n * RIGHT of dsh's own sidebar (the sidebar keeps working: New Session, the\n * session list, the footer buttons), with the middle column (the pinned \"My\n * alter\" item, pending requests, friends, add friend) and the right pane:\n * \"My alter\" = the chat with the alter + composer (the only place the owner\n * talks), a friend = the read-only alter ↔ alter thread with the action bar.\n * Escape / the close button return to dsh.\n *\n * Geometry: `ctx.layout` (ui-layout's ILayout) exposes panel ACTIONS only\n * (toggleSidebar / openDetails / closeDetails) — the width store is private\n * to the root entry — so the left edge is measured from the DOM: the sidebar\n * column is the ancestor of our own footer button whose parent is the frame\n * (the overlay layer's parent). A ResizeObserver on it plus the window\n * resize event re-measure on drag / collapse.\n */\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport type { SettingsScope } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots'\nimport { AlterPane } from './AlterPane.tsx'\nimport { networkStore } from './api.ts'\nimport { FriendList } from './FriendList.tsx'\nimport { FriendPane } from './FriendPane.tsx'\nimport type { NS } from './locales.ts'\nimport { ALTER_KEY, resolveSelection } from './page-state.ts'\nimport { pageStore } from './page-store.ts'\nimport type { SoulmirrorSettingsValues } from './SettingsSection.tsx'\n\nexport interface SoulmirrorPageInjected {\n /** Select a session as current (ctx.sessions.open). */\n openSession: (sessionId: string) => void\n /** Bound settings scope of the `soulmirror` namespace (the page reads the debug `directSend` toggle live). */\n scope: SettingsScope<SoulmirrorSettingsValues>\n}\n\nexport type SoulmirrorPageProps = SoulmirrorPageInjected & PropsLocale<typeof NS>\n\n/** Fallback left edge when the sidebar column cannot be found (ui-layout SIDEBAR_DEFAULT). */\nconst SIDEBAR_FALLBACK = 280\n\n/**\n * dsh's sidebar column and the frame it sits in: the ancestor of our own\n * footer button whose parent also contains this page (the slot framework\n * wraps overlay entries, so the page's parent is not the layer itself). The\n * page is absolutely positioned inside the overlay layer, which covers the\n * frame, so `column.right - frame.left` is the page's left edge.\n */\nfunction sidebarColumnOf(pageRoot: HTMLElement | null): { column: HTMLElement; frame: HTMLElement } | undefined {\n if (pageRoot === null) return undefined\n const footer = document.querySelector('[data-soulmirror-footer]')\n let node: HTMLElement | null = footer instanceof HTMLElement ? footer : null\n while (node !== null) {\n const parent: HTMLElement | null = node.parentElement\n if (parent !== null && parent !== node && parent.contains(pageRoot) && !node.contains(pageRoot)) return { column: node, frame: parent }\n node = parent\n }\n return undefined\n}\n\nexport function SoulmirrorPage({ openSession, scope, t }: SoulmirrorPageProps) {\n const page = useSyncExternalStore(pageStore.subscribe, pageStore.getSnapshot)\n const net = useSyncExternalStore(networkStore.subscribe, networkStore.getSnapshot)\n const subscribeScope = useCallback((listener: () => void) => scope.subscribe(listener), [scope])\n const readScope = useCallback(() => scope.getSnapshot(), [scope])\n const settings = useSyncExternalStore(subscribeScope, readScope)\n // Debug \"send as myself\": the live settings document, else what the host resolved.\n const directSend = settings.value?.directSend === true || (settings.value?.directSend === undefined && net.state?.alter?.directSend === true)\n const root = useRef<HTMLDivElement>(null)\n const [left, setLeft] = useState(SIDEBAR_FALLBACK)\n const selected = resolveSelection(net.inbox.friends, page.selected)\n const friend = selected === ALTER_KEY ? undefined : net.inbox.friends.find(f => f.fp === selected)\n\n // Left edge = right edge of dsh's sidebar column; re-measured on resize / collapse.\n useLayoutEffect(() => {\n if (!page.open) return\n const measure = (): void => {\n const found = sidebarColumnOf(root.current)\n if (found === undefined) {\n setLeft(SIDEBAR_FALLBACK)\n return\n }\n const edge = found.column.getBoundingClientRect().right - found.frame.getBoundingClientRect().left\n setLeft(Math.max(0, Math.round(edge)))\n }\n measure()\n const found = sidebarColumnOf(root.current)\n const observer = typeof ResizeObserver === 'undefined' || found === undefined ? undefined : new ResizeObserver(measure)\n if (found !== undefined) observer?.observe(found.column)\n window.addEventListener('resize', measure)\n // The sidebar collapse is a CSS transition; poll briefly so the edge follows it.\n const timer = window.setInterval(measure, 300)\n return () => {\n observer?.disconnect()\n window.removeEventListener('resize', measure)\n window.clearInterval(timer)\n }\n }, [page.open])\n\n // Escape returns to dsh — unless the card popover is open (the friend pane\n // closes it on the same key and the page stays).\n useEffect(() => {\n if (!page.open) return\n const onKey = (e: KeyboardEvent): void => {\n if (e.key !== 'Escape') return\n if (document.querySelector('[data-soulmirror-page-card-pop]') !== null) return\n pageStore.close()\n }\n document.addEventListener('keydown', onKey)\n return () => { document.removeEventListener('keydown', onKey) }\n }, [page.open])\n\n if (!page.open) return null\n\n const goAlter = (): void => { pageStore.select(ALTER_KEY) }\n const goFriend = (fp: string): void => { pageStore.select(fp) }\n const openAlterSession = (sessionId: string): void => {\n openSession(sessionId)\n pageStore.close()\n }\n\n return (\n <div ref={root} className=\"sm-page-root\" style={{ left }} role=\"dialog\" aria-label={t('page.title')} data-soulmirror-page data-soulmirror-page-left={left}>\n <FriendList\n t={t}\n selected={selected}\n onSelect={(key) => { pageStore.select(key) }}\n onAccepted={(fp) => { pageStore.select(fp) }}\n onClose={() => { pageStore.close() }}\n />\n {friend !== undefined\n ? <FriendPane t={t} friend={friend} visible={page.open} onGoAlter={goAlter} directSend={directSend} />\n : <AlterPane t={t} onOpenSession={openAlterSession} onGoFriend={goFriend} />}\n </div>\n )\n}\n","/**\n * The global inbox of the \"SoulMirror\" `conversation.view` tab: identity line\n * (name + copy card), all friends with presence / unread / last message,\n * pending requests (accept / reject) and an add-friend field. Clicking a\n * friend opens the SoulMirror page on that friend; accepting a request opens\n * the page on the new friend (P4: friends have no dsh session of their own).\n */\nimport { useCallback, useState, useSyncExternalStore } from 'react'\nimport { Button, IconCheckOutline14, IconCloseFill14, IconCopyOutline16, IconRefreshOutline14, Tooltip, writeClipboard } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots'\nimport { api, networkStore } from './api.ts'\nimport { formatAge, previewOf, sortInbox, unreadTotal, type InboxFriend } from './inbox-state.ts'\nimport type { NS } from './locales.ts'\n\nexport type Translate = PropsLocale<typeof NS>['t']\n\nexport interface InboxProps {\n t: Translate\n /** A friend row was clicked (or a request accepted): open the SoulMirror page on that friend. */\n onOpenFriend: (fp: string) => void\n}\n\nfunction useCopy(): [copied: boolean, copy: (text: string) => void] {\n const [copied, setCopied] = useState(false)\n const copy = useCallback((text: string) => {\n void writeClipboard(text).then((ok) => {\n if (!ok) return\n setCopied(true)\n setTimeout(() => { setCopied(false) }, 1500)\n })\n }, [])\n return [copied, copy]\n}\n\n/** One friend row: presence dot, name, unread badge, last preview + age. */\nfunction FriendRow({ friend, typing, t, onOpen }: { friend: InboxFriend; typing: boolean; t: Translate; onOpen: () => void }) {\n const unread = friend.unread > 0\n const preview = typing ? t('inbox.typing') : previewOf(friend.lastBody)\n return (\n <li>\n <button type=\"button\" className=\"sm-row\" onClick={onOpen} data-soulmirror-inbox-friend={friend.fp} aria-label={t('inbox.open', { name: friend.name })}>\n <span className={`sm-presence${friend.online === true ? ' sm-online' : ''}`} title={friend.online === true ? t('inbox.online') : t('inbox.offline')} />\n <span className=\"sm-row-body\">\n <span className=\"sm-row-title\">\n <span className=\"sm-row-name\">{friend.name}</span>\n <span className=\"sm-row-time\">{formatAge(friend.lastTs)}</span>\n </span>\n <span className={`sm-row-preview${unread ? ' sm-unread' : ''}`}>{preview === '' ? t('inbox.noMessages') : preview}</span>\n </span>\n {unread ? <span className=\"sm-badge\" data-soulmirror-unread={friend.unread}>{friend.unread > 99 ? '99+' : friend.unread}</span> : null}\n </button>\n </li>\n )\n}\n\nexport function Inbox({ t, onOpenFriend }: InboxProps) {\n const net = useSyncExternalStore(networkStore.subscribe, networkStore.getSnapshot)\n const { inbox } = net\n const identity = net.state?.identity ?? null\n const status = net.status ?? net.state?.status\n const [copied, copy] = useCopy()\n const [addUri, setAddUri] = useState('')\n const [busy, setBusy] = useState<string | undefined>(undefined)\n const [note, setNote] = useState<{ kind: 'ok' | 'error'; text: string } | undefined>(undefined)\n const friends = sortInbox(inbox.friends)\n const total = unreadTotal(inbox.friends)\n\n const run = async (key: string, action: () => Promise<string | undefined>): Promise<void> => {\n setBusy(key)\n setNote(undefined)\n try {\n const ok = await action()\n if (ok !== undefined) setNote({ kind: 'ok', text: ok })\n await networkStore.refresh()\n } catch (e: unknown) {\n setNote({ kind: 'error', text: e instanceof Error ? e.message : String(e) })\n } finally {\n setBusy(undefined)\n }\n }\n\n const openFriend = (friend: InboxFriend): void => { onOpenFriend(friend.fp) }\n\n const header = (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, padding: '0 0 8px' }}>\n <div style={{ flex: 1, minWidth: 0, display: 'grid' }}>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 6, minWidth: 0 }}>\n <strong style={{ fontSize: '1.05em' }}>{t('inbox.title')}</strong>\n {total > 0 ? <span className=\"sm-badge\" data-soulmirror-unread-total={total}>{total}</span> : null}\n </div>\n {identity !== null\n ? (\n <div className=\"sm-muted\" style={{ display: 'flex', alignItems: 'center', gap: 6, minWidth: 0, fontSize: 12 }} data-soulmirror-inbox-identity>\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{identity.name}</span>\n <span style={{ fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)', opacity: 0.75 }}>{identity.fp.slice(0, 10)}…</span>\n <Tooltip label={copied ? t('inbox.card.copied') : t('inbox.card.copy')} side=\"bottom\">\n <button type=\"button\" className=\"sm-iconbtn\" aria-label={t('inbox.card.copy')} onClick={() => { copy(identity.cardUri) }}>\n {copied ? <IconCheckOutline14 size={14} /> : <IconCopyOutline16 size={14} />}\n </button>\n </Tooltip>\n </div>\n )\n : <span className=\"sm-muted\" style={{ fontSize: 12 }}>{status?.state === 'ready' || status === undefined ? t('inbox.noIdentity') : t('onboard.waiting', { state: t(`settings.state.${status.state}`) })}</span>}\n </div>\n <Tooltip label={t('settings.refresh')} side=\"bottom\">\n <button type=\"button\" className=\"sm-iconbtn\" aria-label={t('settings.refresh')} onClick={() => { void networkStore.refresh() }}>\n <IconRefreshOutline14 size={14} />\n </button>\n </Tooltip>\n </div>\n )\n\n const body = (\n <div style={{ flex: 1, minHeight: 0, overflowY: 'auto', padding: 0 }}>\n {inbox.pending.length > 0\n ? (\n <>\n <div className=\"sm-section\">{t('inbox.pending', { n: inbox.pending.length })}</div>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {inbox.pending.map(p => (\n <li key={p.id} className=\"sm-row\" style={{ cursor: 'default' }} data-soulmirror-inbox-pending={p.id}>\n <span className=\"sm-row-body\">\n <span className=\"sm-row-title\"><span className=\"sm-row-name\">{p.name}</span></span>\n <span className=\"sm-row-preview\">{p.greeting === '' ? t('inbox.pending.noGreeting') : previewOf(p.greeting)}</span>\n </span>\n <Tooltip label={t('settings.pending.accept')} side=\"bottom\">\n <button\n type=\"button\"\n className=\"sm-iconbtn\"\n aria-label={t('settings.pending.accept')}\n disabled={busy !== undefined}\n onClick={() => {\n void run(`accept:${p.id}`, async () => {\n const r = await api.accept(p.id)\n onOpenFriend(r.friend.fp)\n return t('inbox.pending.accepted', { name: r.friend.name })\n })\n }}\n >\n <IconCheckOutline14 size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('settings.pending.reject')} side=\"bottom\">\n <button type=\"button\" className=\"sm-iconbtn\" aria-label={t('settings.pending.reject')} disabled={busy !== undefined} onClick={() => { void run(`reject:${p.id}`, async () => { await api.reject(p.id); return undefined }) }}>\n <IconCloseFill14 size={14} />\n </button>\n </Tooltip>\n </li>\n ))}\n </ul>\n </>\n )\n : null}\n <div className=\"sm-section\">{t('inbox.friends')}</div>\n {friends.length === 0\n ? <p className=\"sm-muted\" style={{ margin: 0, padding: '4px 10px 10px' }} data-soulmirror-inbox-empty>{identity === null ? t('inbox.empty.noIdentity') : t('inbox.empty')}</p>\n : (\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }} data-soulmirror-inbox-list>\n {friends.map(f => (\n <FriendRow key={f.fp} friend={f} typing={inbox.typing[f.fp] === true || f.typing === true} t={t} onOpen={() => { openFriend(f) }} />\n ))}\n </ul>\n )}\n </div>\n )\n\n const submitAdd = (): void => {\n if (busy !== undefined || addUri.trim() === '' || identity === null) return\n void run('add', async () => {\n const { friend } = await api.addFriend(addUri.trim())\n setAddUri('')\n return t('settings.add.sent', { name: friend.name })\n })\n }\n\n const footer = (\n <div style={{ display: 'grid', gap: 6, padding: '12px 0 0', borderTop: '1px solid var(--dsw-alias-border-l2)' }}>\n <div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>\n <input\n className=\"sm-input\"\n placeholder={t('inbox.add.placeholder')}\n value={addUri}\n disabled={identity === null}\n onChange={(e) => { setAddUri(e.target.value) }}\n onKeyDown={(e) => { if (e.key === 'Enter') submitAdd() }}\n data-soulmirror-inbox-add\n />\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={busy !== undefined || addUri.trim() === '' || identity === null}\n onClick={submitAdd}\n >\n {t('inbox.add')}\n </Button>\n </div>\n {note !== undefined\n ? <span style={{ fontSize: 12, color: note.kind === 'error' ? 'var(--dsw-alias-state-error-primary)' : 'var(--dsw-alias-label-secondary)' }} role={note.kind === 'error' ? 'alert' : undefined}>{note.kind === 'error' ? t('settings.error', { message: note.text }) : note.text}</span>\n : net.error !== undefined ? <span style={{ fontSize: 12, color: 'var(--dsw-alias-state-error-primary)' }}>{t('settings.error', { message: net.error })}</span> : null}\n </div>\n )\n\n return (\n <section className=\"sm-page\" data-soulmirror-inbox=\"page\">\n {header}\n <p className=\"sm-muted\" style={{ margin: '0 0 8px', fontSize: 12 }}>{t('inbox.hint')}</p>\n {body}\n {footer}\n </section>\n )\n}\n","/**\n * `conversation.view` tab \"SoulMirror\": a one-screen summary (identity,\n * friends with unread / drafts, pending requests, add friend) with the\n * \"Open SoulMirror\" button that opens the page (P4: the page is the product\n * surface; this tab only leads there and lists what waits).\n */\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { ConvViewProps } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots'\nimport { Inbox } from './Inbox.tsx'\nimport type { NS } from './locales.ts'\nimport { pageStore } from './page-store.ts'\nimport { SoulMirrorIcon } from './SidebarEntry.tsx'\n\nexport type SoulmirrorViewProps = ConvViewProps & PropsLocale<typeof NS>\n\nexport function SoulmirrorView({ sessionId, t }: SoulmirrorViewProps) {\n return (\n <div data-soulmirror-view={sessionId} style={{ height: '100%', overflowY: 'auto' }}>\n <div className=\"sm-page\" style={{ paddingBottom: 0 }}>\n <Button variant=\"primary\" size=\"sm\" icon={<SoulMirrorIcon size={14} />} onClick={() => { pageStore.open() }} data-soulmirror-view-open-page>\n {t('page.open')}\n </Button>\n </div>\n <Inbox t={t} onOpenFriend={(fp) => { pageStore.open(fp) }} />\n </div>\n )\n}\n","/**\n * The rules the SoulMirror surfaces need that inline styles cannot express\n * (hover / focus chrome, the unread dot, the rail circle, bubbles, the typing\n * dots, the three-column page, the draft cards). The client bundle has no\n * CSS-module pipeline (tsdown replica, SPIKE.md §6), so one `<style>` element\n * is appended to the document once. Every colour is a `--dsw-*` token (the\n * ones ui-layout / ui-theme set on the document), so the page follows dsh's\n * theme and looks native — the LAYOUT follows the SoulMirror prototype\n * (docs/superpowers/specs/2026-08-23-dsh-soulmirror-chat-alignment.html, #B),\n * the COLOURS and type follow dsh.\n */\nconst STYLE_ID = 'soulmirror-styles'\n\nconst CSS = `\n.sm-footer {\n flex: none; display: flex; align-items: center; gap: 8px;\n width: calc(100% + 4px); height: 42px; margin: 4px -2px 0; padding: 0 10px 0 8px;\n box-sizing: border-box; border: none; border-radius: 12px; background: transparent;\n cursor: pointer; overflow: hidden; color: var(--dsw-alias-label-primary);\n font-family: inherit; font-size: 14px; line-height: 22px; position: relative;\n}\n.sm-footer:hover, .sm-footer[aria-expanded=\"true\"] { background: var(--dsw-alias-interactive-bg-hover); }\n.sm-footer.sm-rail {\n width: 36px; height: 36px; margin: 8px 0 0; padding: 0; gap: 0;\n justify-content: center; border-radius: 50%;\n}\n.sm-footer-label { flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; text-align: left; }\n.sm-footer-icon { flex: none; display: inline-flex; position: relative; }\n.sm-badge {\n flex: none; display: inline-flex; align-items: center; justify-content: center;\n min-width: 18px; height: 18px; padding: 0 5px; box-sizing: border-box; border-radius: 9px;\n background: var(--dsw-alias-brand-primary); color: var(--dsw-alias-label-primary-inverted);\n font-size: 11px; font-weight: 600; line-height: 18px;\n}\n.sm-badge.sm-badge-warn { background: var(--dsw-alias-state-warn-primary); color: var(--dsw-alias-label-primary-inverted); white-space: nowrap; }\n.sm-dot {\n position: absolute; top: -2px; right: -3px; width: 9px; height: 9px; border-radius: 50%;\n background: var(--dsw-alias-state-error-primary); box-shadow: 0 0 0 2px var(--dsw-specific-sidebar-fill);\n}\n.sm-row {\n display: flex; align-items: center; gap: 10px; width: 100%; padding: 8px 10px; box-sizing: border-box;\n border: none; border-radius: 10px; background: transparent; color: inherit; font: inherit; text-align: left; cursor: pointer;\n position: relative;\n}\n.sm-row:hover, .sm-row:focus-visible { background: var(--dsw-alias-interactive-bg-hover); outline: none; }\n.sm-row.sm-selected, .sm-row.sm-selected:hover { background: var(--dsw-alias-interactive-bg-hover-solid, var(--dsw-alias-interactive-bg-hover)); }\n.sm-row-body { flex: 1; min-width: 0; display: grid; gap: 1px; }\n.sm-row-title { display: flex; align-items: baseline; gap: 6px; min-width: 0; }\n.sm-row-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }\n.sm-row-time { flex: none; font-size: 11px; color: var(--dsw-alias-label-tertiary); }\n.sm-row-preview { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; color: var(--dsw-alias-label-secondary); }\n.sm-row-preview.sm-unread { color: var(--dsw-alias-label-primary); }\n.sm-row-preview .sm-alert { color: var(--dsw-alias-state-warn-primary); font-weight: 600; }\n.sm-row.sm-row-alter::before {\n content: \"\"; position: absolute; left: 0; top: 6px; bottom: 6px; width: 3px; border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n}\n.sm-avawrap { position: relative; flex: none; }\n.sm-avatar {\n width: 34px; height: 34px; border-radius: 9px; display: flex; align-items: center; justify-content: center;\n background: var(--dsw-alias-interactive-bg-hover-solid, var(--dsw-alias-bg-layer-2)); color: var(--dsw-alias-label-primary);\n font-size: 14px; font-weight: 600; flex: none; user-select: none;\n}\n.sm-avatar.sm-avatar-alter { background: var(--dsw-alias-brand-primary); color: var(--dsw-alias-label-primary-inverted); }\n.sm-avatar.sm-avatar-lg { width: 36px; height: 36px; font-size: 16px; border-radius: 11px; }\n.sm-avatar.sm-avatar-sm { width: 26px; height: 26px; font-size: 12px; border-radius: 7px; }\n.sm-avawrap .sm-presence { position: absolute; right: -2px; bottom: -2px; width: 10px; height: 10px; border: 2px solid var(--dsw-specific-sidebar-fill, var(--dsw-alias-bg-base)); opacity: 1; }\n.sm-avawrap .sm-badge { position: absolute; top: -6px; right: -8px; border: 2px solid var(--dsw-specific-sidebar-fill, var(--dsw-alias-bg-base)); }\n.sm-presence { flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--dsw-alias-label-tertiary); opacity: .5; }\n.sm-presence.sm-online { background: var(--dsw-alias-state-success-primary); opacity: 1; }\n.sm-livedot { display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--dsw-alias-state-success-primary); box-shadow: 0 0 0 2px var(--dsw-alias-state-success-tertiary, transparent); vertical-align: middle; }\n.sm-livedot.sm-busy { background: var(--dsw-alias-state-warn-primary); box-shadow: 0 0 0 2px var(--dsw-alias-state-warn-tertiary, transparent); }\n.sm-iconbtn {\n flex: none; display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px;\n border: none; border-radius: 6px; background: transparent; color: var(--dsw-alias-label-secondary); cursor: pointer; padding: 0;\n}\n.sm-iconbtn:hover { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary); }\n.sm-iconbtn:disabled { opacity: .45; cursor: default; }\n.sm-input {\n flex: 1; min-width: 0; height: 28px; padding: 0 8px; box-sizing: border-box; font: inherit; font-size: 12px;\n border: 1px solid var(--dsw-alias-border-l2); border-radius: 8px; background: var(--dsw-alias-bg-base); color: inherit;\n}\n.sm-input:focus { outline: none; border-color: var(--dsw-alias-brand-primary); }\n.sm-section { padding: 8px 10px 4px; font-size: 11px; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; color: var(--dsw-alias-label-tertiary); }\n.sm-muted { color: var(--dsw-alias-label-secondary); }\n.sm-page { max-width: 720px; margin: 0 auto; padding: 16px 20px; font-size: 13px; line-height: 20px; }\n.sm-page .sm-row { padding: 10px 12px; }\n\n/* ——— the SoulMirror page: middle column + right pane, right of dsh's sidebar ——— */\n.sm-page-root {\n position: absolute; top: 0; bottom: 0; right: 0; z-index: 25;\n display: flex; min-width: 0; overflow: hidden;\n background: var(--dsw-alias-bg-base); color: var(--dsw-alias-label-primary);\n border-left: 1px solid var(--dsw-alias-border-l1); font-size: 13px; line-height: 20px;\n animation: sm-page-in 120ms ease-out;\n}\n@keyframes sm-page-in { from { opacity: 0; } }\n.sm-list-col {\n flex: none; width: 300px; min-width: 240px; display: flex; flex-direction: column; min-height: 0;\n border-right: 1px solid var(--dsw-alias-border-l1); background: var(--dsw-specific-sidebar-fill, transparent);\n}\n.sm-list-head { flex: none; display: flex; align-items: center; gap: 8px; padding: 12px 12px 8px; }\n.sm-list-head-title { display: flex; align-items: center; gap: 8px; min-width: 0; font-weight: 600; font-size: 15px; }\n.sm-list-search { flex: none; padding: 0 12px 8px; display: flex; gap: 6px; align-items: center; }\n.sm-list-body { flex: 1; min-height: 0; overflow-y: auto; padding: 0 6px 6px; }\n.sm-list-foot { flex: none; padding: 8px 12px 12px; border-top: 1px solid var(--dsw-alias-border-l2); display: grid; gap: 6px; }\n.sm-req { display: flex; align-items: center; gap: 8px; margin: 2px 4px 4px; padding: 8px 10px; border: 1px solid var(--dsw-alias-border-l2); border-radius: 10px; background: var(--dsw-alias-bg-base); }\n.sm-chat-col { flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 0; background: var(--dsw-alias-bg-base); }\n.sm-chat-head {\n flex: none; display: flex; align-items: center; gap: 10px; min-height: 56px; padding: 8px 16px; box-sizing: border-box;\n border-bottom: 1px solid var(--dsw-alias-border-l2);\n}\n.sm-chat-head-name { font-weight: 600; font-size: 15px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.sm-chat-head-sub { font-size: 12px; color: var(--dsw-alias-label-secondary); display: flex; align-items: center; gap: 6px; min-width: 0; }\n.sm-chat-head-actions { flex: none; display: flex; align-items: center; gap: 4px; }\n.sm-banner {\n flex: none; display: flex; align-items: center; gap: 10px; padding: 7px 16px; font-size: 12.5px;\n background: var(--dsw-alias-state-warn-tertiary, var(--dsw-alias-interactive-bg-hover)); color: var(--dsw-alias-state-warn-label, var(--dsw-alias-label-primary));\n border-bottom: 1px solid var(--dsw-alias-border-l2);\n}\n.sm-banner b { font-weight: 600; }\n.sm-banner .sm-ghostbtn { margin-left: auto; background: var(--dsw-alias-bg-base); }\n.sm-pendbar {\n flex: none; display: flex; align-items: center; gap: 8px; padding: 7px 16px; font-size: 12.5px;\n background: var(--dsw-alias-state-warn-tertiary, var(--dsw-alias-interactive-bg-hover)); color: var(--dsw-alias-state-warn-label, var(--dsw-alias-label-primary));\n border-bottom: 1px solid var(--dsw-alias-border-l2);\n}\n.sm-pendbar b { color: var(--dsw-alias-state-warn-primary); }\n.sm-pendbar .sm-linkbtn { margin-left: auto; }\n.sm-thread { flex: 1; min-height: 0; overflow-y: auto; padding: 12px 20px; display: flex; flex-direction: column; }\n.sm-thread-inner { margin-top: auto; display: flex; flex-direction: column; gap: 4px; }\n.sm-day { align-self: center; margin: 10px 0 6px; padding: 1px 10px; border-radius: 10px; font-size: 11px;\n color: var(--dsw-alias-label-tertiary); background: var(--dsw-alias-interactive-bg-hover); }\n.sm-msg { display: flex; flex-direction: column; max-width: 72%; }\n.sm-msg.sm-in { align-self: flex-start; align-items: flex-start; }\n.sm-msg.sm-out { align-self: flex-end; align-items: flex-end; }\n.sm-bubble {\n padding: 7px 11px; border-radius: 14px; white-space: pre-wrap; overflow-wrap: anywhere; font-size: 13.5px; line-height: 20px;\n}\n.sm-in .sm-bubble { background: var(--dsw-specific-bubble, var(--dsw-alias-interactive-bg-hover)); color: var(--dsw-alias-label-primary); border-bottom-left-radius: 4px; }\n.sm-out .sm-bubble { background: var(--dsw-alias-brand-primary, var(--dsw-static-deepseek-500)); color: var(--dsw-alias-label-primary-inverted); border-bottom-right-radius: 4px; }\n.sm-out .sm-bubble.sm-pending { opacity: .65; }\n.sm-out .sm-bubble.sm-failed { background: var(--dsw-alias-state-error-primary); }\n.sm-msg-meta { display: flex; align-items: center; gap: 6px; margin: 2px 4px 0; font-size: 11px; color: var(--dsw-alias-label-tertiary); }\n.sm-msg-meta .sm-status-failed { color: var(--dsw-alias-state-error-primary); }\n.sm-linkbtn { border: none; background: none; padding: 0; font: inherit; font-size: 12px; color: var(--dsw-alias-brand-primary); cursor: pointer; }\n.sm-linkbtn:disabled { opacity: .5; cursor: default; }\n.sm-typing { display: flex; align-items: center; gap: 6px; padding: 2px 20px 6px; font-size: 12px; color: var(--dsw-alias-label-secondary); min-height: 22px; }\n.sm-typing-dots span { display: inline-block; width: 5px; height: 5px; margin-right: 2px; border-radius: 50%; background: currentColor; opacity: .35; animation: sm-blink 1.2s infinite; }\n.sm-typing-dots span:nth-child(2) { animation-delay: .2s; }\n.sm-typing-dots span:nth-child(3) { animation-delay: .4s; }\n@keyframes sm-blink { 0%, 80%, 100% { opacity: .25; } 40% { opacity: 1; } }\n.sm-composer { flex: none; padding: 8px 16px 12px; border-top: 1px solid var(--dsw-alias-border-l2); display: grid; gap: 6px; }\n.sm-composer-box {\n display: flex; align-items: flex-end; gap: 6px; padding: 6px 6px 6px 12px; box-sizing: border-box;\n border: 1px solid var(--dsw-alias-border-l2); border-radius: 14px; background: var(--dsw-specific-input-major, var(--dsw-alias-bg-layer-1));\n}\n.sm-composer-box:focus-within { border-color: var(--dsw-alias-brand-primary); }\n.sm-textarea {\n flex: 1; min-width: 0; max-height: 160px; min-height: 24px; padding: 2px 0; resize: none; border: none; outline: none;\n background: transparent; color: inherit; font: inherit; font-size: 13.5px; line-height: 20px;\n}\n.sm-composer-hint { font-size: 11px; color: var(--dsw-alias-label-tertiary); padding: 0 4px; }\n.sm-actbar {\n flex: none; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; padding: 10px 16px;\n border-top: 1px solid var(--dsw-alias-border-l2); background: var(--dsw-alias-bg-layer-1, var(--dsw-alias-bg-base));\n}\n.sm-actbar-eye { font-size: 12px; color: var(--dsw-alias-label-tertiary); margin-right: auto; }\n.sm-empty { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; padding: 24px; text-align: center; color: var(--dsw-alias-label-secondary); }\n.sm-empty-title { font-size: 15px; font-weight: 600; color: var(--dsw-alias-label-primary); }\n.sm-empty p { margin: 0; max-width: 420px; font-size: 12.5px; }\n.sm-card-pop {\n position: absolute; right: 16px; top: 60px; z-index: 2; width: min(420px, calc(100% - 32px)); padding: 10px 12px; box-sizing: border-box;\n border: 1px solid var(--dsw-alias-border-inverted); border-radius: 12px; background: var(--dsw-specific-menu); box-shadow: var(--dsw-shadow-lv3);\n display: grid; gap: 6px; font-size: 12px;\n}\n.sm-card-uri { font-family: var(--ds-font-family-code, ui-monospace, monospace); font-size: 11px; overflow-wrap: anywhere; color: var(--dsw-alias-label-secondary); max-height: 96px; overflow: auto; }\n.sm-pending-actions { display: flex; gap: 4px; flex: none; }\n.sm-ghostbtn {\n display: inline-flex; align-items: center; gap: 4px; height: 26px; padding: 0 9px; border: 1px solid var(--dsw-alias-border-l2); border-radius: 8px;\n background: transparent; color: var(--dsw-alias-label-primary); font: inherit; font-size: 12px; cursor: pointer; white-space: nowrap;\n}\n.sm-ghostbtn:hover { background: var(--dsw-alias-interactive-bg-hover); }\n.sm-ghostbtn:disabled { opacity: .5; cursor: default; }\n.sm-ghostbtn.sm-warnbtn { background: var(--dsw-alias-state-warn-tertiary, transparent); border-color: var(--dsw-alias-state-warn-secondary, var(--dsw-alias-border-l2)); color: var(--dsw-alias-state-warn-label, var(--dsw-alias-label-primary)); font-weight: 600; }\n.sm-ghostbtn.sm-warnbtn b { color: var(--dsw-alias-state-warn-primary); margin-left: 2px; }\n.sm-ghostbtn.sm-dangerbtn { color: var(--dsw-alias-state-error-primary); }\n.sm-ghostbtn.sm-dangerbtn:hover { background: var(--dsw-alias-interactive-bg-hover-danger, var(--dsw-alias-interactive-bg-hover)); }\n\n/* ——— drafts: the owner's review card (friend thread + alter chat) ——— */\n.sm-draft {\n margin: 8px 0; padding: 10px 14px; box-sizing: border-box; display: grid; gap: 6px; font-size: 12.5px; line-height: 18px;\n border: 1px solid var(--dsw-alias-border-l2); border-left: 3px solid var(--dsw-alias-state-warn-primary); border-radius: 10px;\n background: var(--dsw-alias-state-warn-tertiary, var(--dsw-alias-bg-layer-1)); color: var(--dsw-alias-label-primary); max-width: 560px; align-self: stretch;\n}\n.sm-draft-head { display: flex; align-items: center; gap: 8px; font-weight: 600; }\n.sm-draft-tag { display: inline-flex; align-items: center; height: 18px; padding: 0 6px; border-radius: 4px; font-size: 10.5px; font-weight: 700; background: var(--dsw-alias-state-warn-primary); color: var(--dsw-alias-label-primary-inverted); }\n.sm-draft-head .sm-row-time { margin-left: auto; }\n.sm-draft-body { white-space: pre-wrap; overflow-wrap: anywhere; padding: 7px 10px; border-radius: 8px; background: var(--dsw-alias-bg-base); border: 1px solid var(--dsw-alias-border-l2); font-size: 13px; }\n.sm-draft-why { font-size: 11.5px; color: var(--dsw-alias-label-secondary); }\n.sm-draft-actions { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }\n.sm-draft-edit { display: grid; gap: 6px; }\n.sm-draft .sm-textarea-box { min-height: 56px; background: var(--dsw-alias-bg-base); }\n\n/* ——— \"My alter\": the owner ↔ alter transcript ——— */\n.sm-citem { display: flex; flex-direction: column; max-width: 78%; gap: 2px; }\n.sm-citem.sm-owner { align-self: flex-end; align-items: flex-end; }\n.sm-citem.sm-alter { align-self: flex-start; align-items: flex-start; }\n.sm-citem.sm-wide { max-width: 92%; align-self: flex-start; align-items: stretch; }\n.sm-citem.sm-center { align-self: center; align-items: center; max-width: 90%; }\n.sm-cmeta { display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--dsw-alias-label-tertiary); padding: 0 4px; }\n.sm-cmeta .sm-proactive { font-size: 10px; font-weight: 700; color: var(--dsw-alias-brand-primary); background: var(--dsw-alias-interactive-bg-hover); padding: 0 6px; border-radius: 999px; }\n.sm-obubble { padding: 7px 12px; border-radius: 14px 4px 14px 14px; background: var(--dsw-alias-brand-primary); color: var(--dsw-alias-label-primary-inverted); white-space: pre-wrap; overflow-wrap: anywhere; font-size: 13.5px; line-height: 20px; }\n.sm-abubble { padding: 8px 12px; border-radius: 4px 14px 14px 14px; background: var(--dsw-specific-bubble, var(--dsw-alias-bg-layer-1)); border: 1px solid var(--dsw-alias-border-l2); color: var(--dsw-alias-label-primary); white-space: pre-wrap; overflow-wrap: anywhere; font-size: 13.5px; line-height: 20px; }\n.sm-inmail { display: grid; gap: 3px; padding: 6px 10px; border-radius: 10px; border: 1px dashed var(--dsw-alias-border-l3, var(--dsw-alias-border-l2)); background: var(--dsw-alias-bg-layer-1, transparent); font-size: 12.5px; cursor: pointer; }\n.sm-inmail:hover { background: var(--dsw-alias-interactive-bg-hover); }\n.sm-inmail-head { display: flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--dsw-alias-label-secondary); }\n.sm-inmail-head b { color: var(--dsw-alias-label-primary); }\n.sm-inmail-body { white-space: pre-wrap; overflow-wrap: anywhere; color: var(--dsw-alias-label-primary); }\n.sm-sendline { display: grid; gap: 3px; padding: 6px 10px; border-radius: 10px; border: 1px solid var(--dsw-alias-border-l2); background: var(--dsw-alias-bg-base); font-size: 12.5px; }\n.sm-sendline-head { display: flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--dsw-alias-label-secondary); }\n.sm-sendline-head b { color: var(--dsw-alias-label-primary); }\n.sm-sendline-body { white-space: pre-wrap; overflow-wrap: anywhere; }\n.sm-statepill { display: inline-flex; align-items: center; gap: 6px; padding: 2px 10px; border-radius: 999px; font-size: 11px; background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-secondary); }\n.sm-statepill.sm-ok { color: var(--dsw-alias-state-success-primary); }\n.sm-statepill.sm-warn { color: var(--dsw-alias-state-warn-primary); background: var(--dsw-alias-state-warn-tertiary, var(--dsw-alias-interactive-bg-hover)); }\n.sm-statepill.sm-err { color: var(--dsw-alias-state-error-primary); }\n.sm-noteline { font-size: 11.5px; color: var(--dsw-alias-label-tertiary); text-align: center; padding: 2px 12px; }\n\n/* ——— friend settings / protocol editor ——— */\n.sm-alter-warn { color: var(--dsw-alias-state-warn-primary); }\n.sm-alter-error { color: var(--dsw-alias-state-error-primary); }\n.sm-alter-ok { color: var(--dsw-alias-state-success-primary); }\n.sm-alter-actions { display: flex; gap: 6px; justify-content: flex-end; align-items: center; }\n.sm-tier-pill { display: inline-flex; align-items: center; gap: 4px; padding: 0 6px; height: 18px; border-radius: 9px; font-size: 10.5px;\n background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-secondary); border: 1px solid var(--dsw-alias-border-l2); }\n.sm-tier-pill.sm-tier-auto { color: var(--dsw-alias-state-warn-primary); }\n.sm-friend-settings { flex: none; margin: 0; padding: 10px 16px; display: grid; gap: 8px; border-top: 1px solid var(--dsw-alias-border-l2); background: var(--dsw-alias-bg-layer-1, var(--dsw-alias-bg-base)); font-size: 12px; max-height: 45%; overflow: auto; }\n.sm-friend-settings label { display: grid; gap: 3px; }\n.sm-friend-settings label > span { font-size: 11px; color: var(--dsw-alias-label-secondary); }\n.sm-select { height: 26px; padding: 0 6px; font: inherit; font-size: 12px; border: 1px solid var(--dsw-alias-border-l2); border-radius: 8px; background: var(--dsw-alias-bg-base); color: inherit; }\n.sm-textarea-box { width: 100%; min-height: 72px; max-height: 240px; padding: 6px 8px; box-sizing: border-box; resize: vertical; font: inherit; font-size: 12px; line-height: 18px;\n border: 1px solid var(--dsw-alias-border-l2); border-radius: 8px; background: var(--dsw-alias-bg-base); color: inherit; }\n.sm-textarea-box:focus { outline: none; border-color: var(--dsw-alias-brand-primary); }\n.sm-protocol { margin: 0 6px 8px; padding: 8px 10px; display: grid; gap: 6px; border-radius: 10px; border: 1px solid var(--dsw-alias-border-l2); background: var(--dsw-alias-bg-base); font-size: 12px; }\n.sm-protocol .sm-textarea-box { min-height: 180px; font-family: var(--ds-font-family-code, ui-monospace, monospace); font-size: 11.5px; }\n.sm-checkbox { display: inline-flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--dsw-alias-label-secondary); cursor: pointer; }\n`\n\nexport function ensureStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = CSS\n document.head.appendChild(style)\n}\n\nexport function removeStyles(): void {\n if (typeof document === 'undefined') return\n document.getElementById(STYLE_ID)?.remove()\n}\n","/**\n * soulnet-dsh browser half (served as\n * /plugins/soulnet-dsh/client.js).\n *\n * Registers: zh/en dictionaries, the `a2a-message` Conversation Node\n * Definition + keyed Chat renderer (inbound mail bubbles / plugin notes in\n * the native alter session), the \"SoulMirror\" `conversation.view` tab (opens\n * the page), the `sidebar.footer.action` entry (SoulMirror button + unread\n * badge → toggles the page), two `shell.overlay` entries (`soulmirror-page`:\n * the full page — the pinned \"My alter\" chat, the friend list and the\n * read-only friend threads, right of dsh's sidebar; `soulmirror-inbox`: the\n * new-mail toast), the `settings.section` \"SoulMirror network\", the\n * `settings.onboarding` identity step, and the client side of the slash\n * commands (`/friends` and `/soulmirror` popups open the page). The P3\n * composer takeover of friend sessions is gone with the friend sessions\n * (P4): the alter session keeps dsh's native composer. All cross-plugin\n * collaboration goes through cordis services (`ctx.slots`, `ctx.locale`,\n * `ctx.conversationEvents`, `ctx.sessions`, `ctx.settingsScope`,\n * `ctx.commandUi`); the only value imports are react, ui-primitives and this\n * package's own files (bundle purity).\n */\nimport type { ClientContext, SessionId } from '@deepseek-ai/dsh-client-runtime/client'\n// Type-only: ctx.locale, ctx.commandUi, ctx.settingsScope, the conversation/settings SlotMap rows.\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-commands/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-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport { a2aRelayDefinition } from './a2a-node.ts'\nimport { A2ANode } from './A2ANode.tsx'\nimport { api } from './api.ts'\nimport { InboxOverlay, type InboxOverlayInjected } from './InboxOverlay.tsx'\nimport { en, NS, zh } from './locales.ts'\nimport { SoulmirrorOnboarding } from './Onboarding.tsx'\nimport { SoulmirrorSettingsSection, type SoulmirrorSettingsInjected, type SoulmirrorSettingsValues } from './SettingsSection.tsx'\nimport { pageStore } from './page-store.ts'\nimport { SidebarEntry } from './SidebarEntry.tsx'\nimport { SoulmirrorPage, type SoulmirrorPageInjected } from './SoulmirrorPage.tsx'\nimport { SoulmirrorView } from './SoulmirrorView.tsx'\nimport { ensureStyles, removeStyles } from './styles.ts'\n\nexport type { A2AChatData } from './a2a-node.ts'\nexport type { SoulmirrorKey } from './locales.ts'\nexport type { InboxState, MailNotice } from './inbox-state.ts'\nexport type { ThreadEntry, ThreadState } from './page-state.ts'\n\nconst SETTINGS_NAMESPACE = 'soulmirror'\n\nexport const inject = ['slots', 'locale', 'conversationEvents', 'sessions', 'settingsScope', 'commandUi']\n\n/** Whether a session cwd is the SoulMirror workspace (`<home>/a2a`, e.g. `~/.soulnet/a2a`). */\nexport function isSoulmirrorCwd(cwd: string | undefined): boolean {\n if (cwd === undefined) return false\n const normalized = cwd.replace(/\\\\/g, '/').replace(/\\/+$/, '')\n return /\\/\\.soulnet\\/a2a$/.test(normalized) || /\\/soulmirror\\/a2a$/.test(normalized) || /\\/\\.soulmirror\\/a2a$/.test(normalized)\n}\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'soulmirror: dictionaries')\n const t = ctx.locale.bind(NS)\n ctx.effect(() => {\n ensureStyles()\n return removeStyles\n }, 'soulmirror: inbox styles')\n const openSession = (id: string): void => { ctx.sessions.open(id as SessionId) }\n\n // 1. Inbound mail / plugin notes → `a2a-message` nodes (engine), then the\n // keyed renderer (slot) for the native alter session view.\n ctx.conversationEvents.register(a2aRelayDefinition)\n ctx.slots.inject('conversation.chat.node', () => ctx.slots.register({\n name: 'conversation.chat.node',\n key: 'a2a-message',\n locale: NS,\n }, A2ANode))\n\n // 2. A second view tab beside Chat/Trajectory: a short SoulMirror summary\n // with the button that opens the page.\n ctx.slots.inject('conversation.view', () => ctx.slots.register({\n name: 'conversation.view',\n id: 'soulmirror',\n order: 20,\n locale: NS,\n label: () => t('view.tab'),\n }, SoulmirrorView))\n\n // 2b. Sidebar foot: the \"SoulMirror\" button with the unread badge (stacked\n // above Settings in both widths) toggles the SoulMirror page …\n ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register({\n name: 'sidebar.footer.action',\n id: 'soulmirror',\n order: 0,\n locale: NS,\n }, SidebarEntry))\n\n // 2c. … which lives in the root overlay layer: the full page right of dsh's\n // sidebar (the settings scope is bound once below; the page reads\n // `directSend` from it live)\n const scope = ctx.settingsScope.bind<SoulmirrorSettingsValues>({ namespace: SETTINGS_NAMESPACE })\n const pageInjected = (): SoulmirrorPageInjected => ({ openSession, scope })\n ctx.slots.inject('shell.overlay', () => ctx.slots.register({\n name: 'shell.overlay',\n id: 'soulmirror-page',\n order: 40,\n locale: NS,\n inject: pageInjected,\n }, SoulmirrorPage))\n\n // 2d. … and the new-mail toast (mail while the alter session is not on\n // screen and the friend's thread is not open on the page).\n const overlayInjected = (): InboxOverlayInjected => ({\n currentSessionId: () => ctx.sessions.list.getSnapshot().current,\n })\n ctx.slots.inject('shell.overlay', () => ctx.slots.register({\n name: 'shell.overlay',\n id: 'soulmirror-inbox',\n order: 50,\n locale: NS,\n inject: overlayInjected,\n }, InboxOverlay))\n\n // 3. Settings section backed by the host `soulmirror` namespace.\n const settingsInjected = (): SoulmirrorSettingsInjected => ({\n openSession,\n scope,\n })\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'soulmirror',\n order: 80,\n locale: NS,\n label: () => t('settings.nav'),\n inject: settingsInjected,\n }, SoulmirrorSettingsSection))\n\n // 4. First-run onboarding: create the identity (after dsh's own welcome/model steps).\n ctx.slots.inject('settings.onboarding', () => ctx.slots.register({\n name: 'settings.onboarding',\n id: 'soulmirror-identity',\n order: 50,\n locale: NS,\n }, SoulmirrorOnboarding))\n\n // 5. Slash commands, client side: `/friends` (host command) gets a popup on\n // bare invocation that opens the page on the chosen friend; `/soulmirror`\n // gets a popup that opens the page (on \"My alter\" or one friend). `/card`\n // and `/add <card_uri>` are plain host commands (their text result is\n // rendered by the composer).\n const friendOptions = async (): Promise<{ id: string; label: string; detail: string }[]> => {\n const state = await api.state().catch(() => undefined)\n if (state === undefined || state.friends.length === 0) return []\n return state.friends.map(f => ({\n id: f.fp,\n label: `${f.online === true ? '● ' : '○ '}${f.name}${f.unread > 0 ? ` (${f.unread})` : ''}${(f.drafts ?? 0) > 0 ? ` · ${t('page.row.draftTag')}` : ''}`,\n detail: t('cmd.friends.open', { name: f.name }),\n }))\n }\n ctx.effect(() => ctx.commandUi.decorate({\n name: 'friends',\n available: () => true,\n ui: {\n kind: 'popupSelect',\n options: async () => {\n const options = await friendOptions()\n return options.length === 0 ? [{ id: 'none', label: t('cmd.friends.none') }] : options\n },\n onSelect: (option) => {\n if (option.id === 'none') return\n pageStore.open(option.id)\n },\n },\n }), 'soulmirror: /friends popup')\n ctx.effect(() => ctx.commandUi.decorate({\n name: 'soulmirror',\n available: () => true,\n ui: {\n kind: 'popupSelect',\n options: async () => {\n const page = { id: 'page', label: t('cmd.soulmirror.page'), detail: t('cmd.soulmirror.page.detail') }\n return [page, ...await friendOptions()]\n },\n onSelect: (option) => {\n pageStore.open(option.id === 'page' ? 'alter' : option.id)\n },\n },\n }), 'soulmirror: /soulmirror popup')\n}\n"],"mappings":";;;;;;;;;;;;EC8CA,SAAgB,wBAAwB,QAA2E;GACjH,MAAM,IAAI;GACV,OAAO,GAAG,SAAS,YAAY,EAAE,WAAA,gBAAgC,EAAE,SAAA;EACrE;;EAGA,SAAgB,gBAAgB,MAAsB;GACpD,OAAO,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI;EACpE;EAEA,MAAa,qBAA8D;GACzE,MAAM;GACN,QAAQ;GACR,QAAQ,UAAU;IAChB,IAAI,MAAM,SAAS,gBAAgB,OAAO;IAC1C,MAAM,SAAU,MAAM,KAA8B;IACpD,IAAI,CAAC,wBAAwB,MAAM,GAAG,OAAO;IAE7C,OAAO;KAAE,IAAI,SADF,OAAO,OAAO,KAAK,OAAO,WAAW,OAAO,IAAI,KAAK,OAAQ,MAAM,KAAyB,EAAE;KAC7E,MAAM;IAAQ;GAC5C;GACA,QAAQ,UAAU,UAAU;IAC1B,MAAM,OAAO,MAAM,MAAM;IACzB,MAAM,OAAO,KAAK,QAAQ,KAAI,UAAS,MAAM,SAAS,SAAS,MAAM,QAAQ,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE;IAC7F,MAAM,MAAM,KAAK,OAAO;IACxB,MAAM,OAAO,OAAO,KAAK,SAAS,WAAW,IAAI,OAAO,KAAA;IACxD,OAAO;KACL,IAAI,OAAO,KAAK,MAAM,MAAM,MAAM,GAAG;KACrC,KAAK;KACL,IAAI,OAAO,KAAK,MAAM,EAAE;KACxB,MAAM,OAAO,KAAK,OAAO,oBAAoB,WAAW,KAAK,OAAO,kBAAkB;KAEtF,MAAM,SAAS,KAAA,IAAY,gBAAgB,IAAI,IAAI,KAAK,QAAQ,2BAA2B,EAAE;KAC7F,IAAI,OAAO,KAAK,OAAO,WAAW,IAAI,KAAK,MAAM,MAAM;KACvD,GAAI,KAAK,SAAS,OAAO,EAAE,MAAM,KAAc,IAAI,CAAC;KACpD,GAAI,OAAO,KAAK,SAAS,WAAW,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;KAC1D,GAAI,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK;KACrC,KAAK,MAAM,MAAM;IACnB;GACF;GACA,SAAQ,YAAW,QAAQ;GAC3B,gBAAgB,YAAY;IAC1B,IAAI,QAAQ,UAAU,KAAA,GAAW,OAAO;IACxC,OAAO;KACL,KAAK,QAAQ;KACb,MAAM;KACN,IAAI,QAAQ;KACZ,QAAQ;KACR,WAAW,QAAQ,MAAM;KACzB,UAAU,QAAQ,OAAO,YAAY,QAAQ,QAAQ,EAAE,EAAE,YAAY,EAAE,MAAM,aAAsB;KACnG,YAAY;KACZ,MAAM,QAAQ;IAChB;GACF;EACF;;;ECzFA,MAAM,OAAO,SAAsC;GACjD,SAAS;GACT,gBAAgB,QAAQ,OAAO,eAAe;GAC9C,SAAS;EACX;EAEA,MAAM,UAAU,SAAsC;GACpD,UAAU;GACV,SAAS;GACT,cAAc,QAAQ,OAAO,uBAAuB;GACpD,YAAY,QAAQ,OAAO,sEAAsE;GACjG,OAAO,QAAQ,OAAO,mCAAmC;GACzD,QAAQ,QAAQ,OAAO,yCAAyC;GAChE,YAAY;GACZ,WAAW;GACX,UAAU;GACV,YAAY;EACd;EAEA,MAAM,OAAsB;GAC1B,UAAU;GACV,OAAO;GACP,cAAc;GACd,SAAS;GACT,KAAK;EACP;EAEA,MAAM,WAA0B;GAC9B,SAAS;GACT,gBAAgB;GAChB,SAAS;GACT,UAAU;GACV,OAAO;GACP,WAAW;EACb;EAEA,SAAS,KAAK,IAAoB;GAChC,MAAM,IAAI,IAAI,KAAK,EAAE;GACrB,MAAM,OAAO,MAAsB,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;GAC5D,OAAO,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,CAAC;EACnD;EAEA,SAAgB,QAAQ,EAAE,MAAM,KAAmB;GACjD,MAAM,OAAoB,KAAK;GAC/B,IAAI,KAAK,SAAS,KAAA,GAChB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,OAAO;IAAU,4BAA0B,KAAK;IACnD,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA;KAAO,EAAE,aAAa;KAAE;KAAI,KAAK;KAAK;KAAI,KAAK,KAAK,EAAE;IAAQ,EAAA,CAAA;GAC3D,CAAA;GAGT,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,OAAO,IAAI,KAAK,GAAG;IAAG,uBAAqB,KAAK;IACnD,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,OAAO;KAAZ,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,KAAK,QAAQ,OAAO,cAAc,cAAc,EAAE,MAAM,KAAK,KAAK,CAAC,EAAQ,CAAA;MACpF,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,KAAK,KAAK,EAAE,EAAQ,CAAA;MAC1B,KAAK,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAM,MAAG,EAAE,aAAa,CAAQ,EAAA,CAAA,IAAI;MAChD,KAAK,SAAS,KAAA,IAAY,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAM,MAAG,KAAK,IAAW,EAAA,CAAA,IAAI;MACvD,KAAK,aAAa,KAAA,IAAY,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAM,MAAG,KAAK,QAAe,EAAA,CAAA,IAAI;KAC7D;IACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,OAAO,OAAO,KAAK,GAAG;KAAI,UAAA,KAAK;IAAU,CAAA,CAC3C,EAAA,CAAA;GACF,CAAA;EAET;;;ECxCA,MAAa,cAA0B;GAAE,SAAS,CAAC;GAAG,SAAS,CAAC;GAAG,QAAQ,CAAC;GAAG,gBAAgB,KAAA;GAAW,QAAQ,CAAC;EAAE;;EAGrH,SAAgB,YAAY,SAAyD;GACnF,IAAI,QAAQ;GACZ,KAAK,MAAM,KAAK,SAAS,SAAS,EAAE,SAAS,IAAI,EAAE,SAAS;GAC5D,OAAO;EACT;;EAGA,SAAgB,UAAU,SAAgD;GACxE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,MAAM;IACjC,MAAM,KAAK,EAAE,SAAS,IAAI,IAAI;IAC9B,MAAM,KAAK,EAAE,SAAS,IAAI,IAAI;IAC9B,IAAI,OAAO,IAAI,OAAO,KAAK;IAC3B,MAAM,KAAK,EAAE,UAAU;IACvB,MAAM,KAAK,EAAE,UAAU;IACvB,IAAI,OAAO,IAAI,OAAO,KAAK;IAC3B,OAAO,EAAE,KAAK,cAAc,EAAE,IAAI;GACpC,CAAC;EACH;;EAGA,SAAgB,UAAU,OAAmC,IAAwB;GACnF,OAAO,MAAM,OAAO,QAAO,MAAK,EAAE,OAAO,EAAE;EAC7C;;EAGA,SAAgB,aAAa,UAAsB,OAA6B;GAC9E,MAAM,QAAQ,IAAI,IAAI,SAAS,QAAQ,KAAI,MAAK,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;GACjE,MAAM,SAAS,MAAM,UAAU,CAAC;GAChC,MAAM,yBAAS,IAAI,IAAoB;GACvC,KAAK,MAAM,KAAK,QAAQ,OAAO,IAAI,EAAE,KAAK,OAAO,IAAI,EAAE,EAAE,KAAK,KAAK,CAAC;GACpE,OAAO;IACL,SAAS,MAAM,QAAQ,KAAK,MAAM;KAChC,MAAM,IAAI,OAAO,IAAI,EAAE,EAAE;KACzB,MAAM,MAAM,MAAM,KAAA,IAAY,cAAc,CAAC,IAAI;MAAE,GAAG;MAAG,QAAQ;KAAE;KACnE,IAAI,IAAI,WAAW,KAAA,GAAW,OAAO;KACrC,MAAM,MAAM,MAAM,IAAI,EAAE,EAAE;KAC1B,OAAO,QAAQ,KAAA,IAAY,MAAM;MAAE,GAAG;MAAK,QAAQ;KAAI;IACzD,CAAC;IACD,SAAS,MAAM;IACf;IACA,gBAAgB,MAAM,OAAO,aAAa,KAAA;IAC1C,QAAQ,SAAS;GACnB;EACF;;EAGA,SAAS,cAAc,GAA6B;GAClD,IAAI,EAAE,WAAW,KAAA,GAAW,OAAO;GACnC,MAAM,EAAE,QAAQ,UAAU,GAAG,SAAS;GACtC,OAAO;EACT;EAEA,SAAS,YAAY,SAAiC,IAAY,OAAuD;GACvH,OAAO,QAAQ,KAAI,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,IAAI,CAAE;EACtD;;;;;EAMA,SAAgB,WAAW,OAAmB,OAAsE;GAClH,QAAQ,MAAM,MAAd;IACE,KAAK,WAAW;KACd,MAAM,EAAE,YAAY;KAEpB,MAAM,UADQ,MAAM,QAAQ,MAAK,MAAK,EAAE,OAAO,QAAQ,IACnC,IAChB,YAAY,MAAM,SAAS,QAAQ,OAAM,OAAM;MAC/C,GAAG;MACH,QAAQ,EAAE,SAAS;MACnB,OAAO,EAAE,QAAQ;MACjB,QAAQ,QAAQ;MAChB,UAAU,QAAQ;KACpB,EAAE,IAGA,CAAC,GAAG,MAAM,SAAS;MAAE,IAAI,QAAQ;MAAM,MAAM,QAAQ;MAAM,QAAQ;MAAG,OAAO;MAAG,QAAQ,QAAQ;MAAI,UAAU,QAAQ;KAAK,CAAC;KAChI,MAAM,OAAO,MAAM,QAAQ,MAAK,MAAK,EAAE,OAAO,QAAQ,IAAI,CAAC,EAAE,QAAQ,QAAQ;KAC7E,OAAO;MACL,OAAO;OAAE,GAAG;OAAO;MAAQ;MAC3B,QAAQ;OAAE,IAAI,QAAQ;OAAI,IAAI,QAAQ;OAAM;OAAM,MAAM,QAAQ;OAAM,IAAI,QAAQ;OAAI,WAAW,MAAM;MAAe;KACxH;IACF;IACA,KAAK,UACH,OAAO,EAAE,OAAO;KAAE,GAAG;KAAO,QAAQ;MAAE,GAAG,MAAM;OAAS,MAAM,KAAK,MAAM;KAAG;IAAE,EAAE;IAClF,KAAK,YACH,OAAO,EAAE,OAAO;KAAE,GAAG;KAAO,SAAS,YAAY,MAAM,SAAS,MAAM,KAAI,OAAM;MAAE,GAAG;MAAG,QAAQ,MAAM;KAAO,EAAE;IAAE,EAAE;IACrH,KAAK,iBAAiB;KAEpB,MAAM,UADS,MAAM,QAAQ,MAAK,MAAK,EAAE,OAAO,MAAM,OAAO,EACxC,IACjB,YAAY,MAAM,SAAS,MAAM,OAAO,KAAI,OAAM;MAAE,GAAG;MAAG,GAAG,MAAM;KAAO,EAAE,IAC5E,CAAC,GAAG,MAAM,SAAS,MAAM,MAAM;KAEnC,MAAM,UAAU,MAAM,QAAQ,QAAO,MAAK,EAAE,OAAO,MAAM,OAAO,EAAE;KAClE,OAAO,EAAE,OAAO;MAAE,GAAG;MAAO;MAAS;KAAQ,EAAE;IACjD;IACA,KAAK,kBAEH,OAAO,EAAE,OADM,MAAM,QAAQ,MAAK,MAAK,EAAE,OAAO,MAAM,QAAQ,EACzC,IAAI,QAAQ;KAAE,GAAG;KAAO,SAAS,CAAC,GAAG,MAAM,SAAS,MAAM,OAAO;IAAE,EAAE;IAE5F,KAAK,YAAY;KAGf,MAAM,EAAE,IAAI,UAAU;KACtB,MAAM,UAAU,YAAY,MAAM,SAAS,KAAI,OAAM;MACnD,GAAG;MACH,OAAO,EAAE,QAAQ;MACjB,GAAI,MAAM,OAAO,EAAE,UAAU,KAAK;OAAE,QAAQ,MAAM;OAAI,UAAU,MAAM;MAAK,IAAI,CAAC;KAClF,EAAE;KACF,OAAO,EAAE,OAAO;MAAE,GAAG;MAAO;KAAQ,EAAE;IACxC;IACA,KAAK,SAAS;KACZ,MAAM,UAAU,MAAM,OAAO,QAAO,MAAK,EAAE,OAAO,MAAM,MAAM,EAAE;KAChE,MAAM,SAAS,MAAM,WAAW,UAAU,CAAC,GAAG,SAAS,MAAM,KAAK,IAAI;KACtE,MAAM,IAAI,OAAO,QAAO,MAAK,EAAE,OAAO,MAAM,MAAM,EAAE,CAAC,CAAC;KACtD,MAAM,UAAU,YAAY,MAAM,SAAS,MAAM,MAAM,KAAI,MAAM,MAAM,IAAI,cAAc,CAAC,IAAI;MAAE,GAAG;MAAG,QAAQ;KAAE,CAAE;KAClH,OAAO,EAAE,OAAO;MAAE,GAAG;MAAO;MAAQ;KAAQ,EAAE;IAChD;IAGA,SACE,OAAO,EAAE,MAAM;GACnB;EACF;;EAGA,SAAgB,cAAc,OAAmB,IAAwB;GACvE,IAAI,CAAC,MAAM,QAAQ,MAAK,MAAK,EAAE,OAAO,MAAM,EAAE,SAAS,CAAC,GAAG,OAAO;GAClE,OAAO;IAAE,GAAG;IAAO,SAAS,YAAY,MAAM,SAAS,KAAI,OAAM;KAAE,GAAG;KAAG,QAAQ;IAAE,EAAE;GAAE;EACzF;;EAGA,SAAgB,aAAa,QAAoB,kBAA+C;GAC9F,OAAO,OAAO,cAAc,KAAA,KAAa,OAAO,cAAc;EAChE;;EAGA,SAAgB,UAAU,IAAwB,MAAc,KAAK,IAAI,GAAW;GAClF,IAAI,OAAO,KAAA,KAAa,MAAM,GAAG,OAAO;GACxC,MAAM,OAAO,KAAK,IAAI,GAAG,MAAM,EAAE;GACjC,MAAM,SAAS;GACf,IAAI,OAAO,QAAQ,OAAO;GAC1B,IAAI,OAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,OAAO,MAAM,EAAE;GAC5D,IAAI,OAAO,OAAU,QAAQ,OAAO,GAAG,KAAK,MAAM,QAAQ,KAAK,OAAO,EAAE;GACxE,IAAI,OAAO,QAAc,QAAQ,OAAO,GAAG,KAAK,MAAM,QAAQ,OAAU,OAAO,EAAE;GACjF,MAAM,IAAI,IAAI,KAAK,EAAE;GACrB,OAAO,GAAG,EAAE,SAAS,IAAI,EAAE,GAAG,EAAE,QAAQ;EAC1C;;EAGA,SAAgB,UAAU,MAA0B,MAAM,IAAY;GACpE,IAAI,SAAS,KAAA,GAAW,OAAO;GAC/B,MAAM,OAAO,KAAK,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;GAC5C,OAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC,EAAE,KAAK;EAC5D;;;;;;;;;;ECtLA,MAAa,WAAW;EA6ExB,IAAa,WAAb,cAA8B,MAAM;GAEI;GAAuB;GAD7D,OAAyB;GACzB,YAAY,SAAiB,MAAuB,YAA6B;IAC/E,MAAM,OAAO;IADuB,KAAA,OAAA;IAAuB,KAAA,aAAA;GAE7D;EACF;EAEA,eAAe,KAAQ,OAAe,MAA4C;GAChF,MAAM,WAAW,MAAM,MAAM,GAAG,WAAW,SAAS,SAAS,KAAA,KAAa,UAAU,UAChF;IAAE,QAAQ;IAAO,SAAS,EAAE,QAAQ,mBAAmB;GAAE,IACzD;IAAE,QAAQ;IAAQ,SAAS;KAAE,gBAAgB;KAAoB,QAAQ;IAAmB;IAAG,MAAM,KAAK,UAAU,QAAQ,CAAC,CAAC;GAAE,CAAC;GACrI,MAAM,OAAO,MAAM,SAAS,KAAK;GACjC,IAAI,SAAkB,CAAC;GACvB,IAAI;IACF,SAAS,SAAS,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI;GAC7C,QAAQ;IACN,MAAM,IAAI,SAAS,qBAAqB,MAAM,IAAI,KAAK,MAAM,GAAG,GAAG,KAAK,QAAQ,SAAS,MAAM;GACjG;GACA,MAAM,MAAO,OAA2D;GACxE,IAAI,CAAC,SAAS,MAAM,QAAQ,KAAA,GAC1B,MAAM,IAAI,SAAS,KAAK,WAAW,GAAG,MAAM,WAAW,SAAS,OAAO,IAAI,KAAK,QAAQ,QAAQ,SAAS,MAAM;GAEjH,OAAO;EACT;EAEA,MAAa,MAAM;GACjB,aAAa,KAAe,OAAO;GACnC,iBAAiB,SAAiB,KAAgC,mBAAmB,EAAE,KAAK,CAAC;GAC7F,YAAY,QAAgB,KAAgD,cAAc,EAAE,IAAI,CAAC;GACjG,YAAY,SAAiB,SAAkB,KAA4B,eAAe;IAAE,UAAU;IAAS,GAAI,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK;GAAG,CAAC;GACxJ,SAAS,IAAY,SAAkB,KAA4B,kBAAkB;IAAE;IAAI,GAAI,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK;GAAG,CAAC;GACpI,SAAS,OAAe,KAAmB,kBAAkB,EAAE,GAAG,CAAC;GACnE,WAAW,IAAY,QAAiB,KAAmB,yBAAyB;IAAE;IAAI,GAAI,QAAQ,KAAA,IAAY,CAAC,IAAI,EAAE,IAAI;GAAG,CAAC;;GAEjI,eAAe,IAAY,OAA2C,CAAC,MACrE,KAA+C,oBAAoB;IAAE;IAAI,GAAI,KAAK,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM;IAAI,GAAI,KAAK,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM;GAAG,CAAC;;GAEnM,OAAO,IAAY,SAAiB,KAAiF,gBAAgB;IAAE;IAAI;GAAK,CAAC;GACjJ,SAAS,IAAY,OAAgB,KAAmB,kBAAkB;IAAE;IAAI;GAAG,CAAC;GACpF,WAAW,QAA2B,KAA0C,YAAY,EAAE,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC;;GAE7G,WAAW,SAAiB,KAA4E,kBAAkB,EAAE,KAAK,CAAC;;GAElI,qBAAqB,KAAsC,kBAAkB,CAAC,CAAC;;GAE/E,iBAAiB,UAAmB,KAAiB,mBAAmB,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,CAAC;;GAE5G,SAAS,OAAgB,KAA6B,eAAe,OAAO,KAAA,IAAY,CAAC,IAAI,EAAE,GAAG,CAAC;;GAEnG,cAAc,IAAY,aACxB,KAAsD,iBAAiB;IAAE;IAAI,GAAG;GAAS,CAAC;;GAE5F,YAAY,IAAY,UAAuE,KAA4B,eAAe;IAAE;IAAI,GAAG;GAAM,CAAC;GAC1J,aAAa,OAAe,KAAgD,gBAAgB,EAAE,GAAG,CAAC;GAClG,mBAAmB,KAAsD,gBAAgB,CAAC,CAAC;GAC3F,cAAc,SAAiB,KAA+C,gBAAgB,EAAE,KAAK,CAAC;EACxG;;;;;;EAuCA,IAAa,eAAb,MAA0B;GACxB,WAAyC;IAAE,OAAO,KAAA;IAAW,SAAS;IAAO,OAAO,KAAA;IAAW,QAAQ,CAAC;IAAG,QAAQ,KAAA;IAAW,UAAU;IAAG,OAAO;GAAY;GAC9J,4BAA6B,IAAI,IAAgB;GACjD,gCAAiC,IAAI,IAAkC;GACvE,iCAAkC,IAAI,IAAwC;GAC9E;GACA;GACA;GAEA,oBAA0C,KAAK;GAE/C,aAAa,aAAuC;IAClD,KAAK,UAAU,IAAI,QAAQ;IAC3B,IAAI,KAAK,UAAU,SAAS,GAAG,KAAK,QAAQ;IAC5C,IAAI,KAAK,SAAS,UAAU,KAAA,KAAa,CAAC,KAAK,SAAS,SAAS,KAAU,QAAQ;IACnF,aAAa;KACX,KAAK,UAAU,OAAO,QAAQ;KAC9B,IAAI,KAAK,UAAU,SAAS,GAAG,KAAK,WAAW;IACjD;GACF;;;;;;;GAQA,UAAU,aAAyD;IACjE,KAAK,cAAc,IAAI,QAAQ;IAC/B,aAAa;KAAE,KAAK,cAAc,OAAO,QAAQ;IAAE;GACrD;;GAGA,WAAW,aAA+D;IACxE,KAAK,eAAe,IAAI,QAAQ;IAChC,aAAa;KAAE,KAAK,eAAe,OAAO,QAAQ;IAAE;GACtD;;GAGA,iBAAiB,WAAoD;IACnE,IAAI,QAAQ,KAAK,SAAS;IAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,OAAO,QAAQ,MAAM,GAAG,QAAQ,WAAW,OAAO;KAAE,MAAM;KAAY;KAAI,QAAQ;IAAG,CAAC,CAAC,CAAC;IAC/G,IAAI,UAAU,KAAK,SAAS,OAAO,KAAK,IAAI,EAAE,MAAM,CAAC;GACvD;;GAGA,iBAAiB,IAAY,UAA0B;IACrD,KAAK,IAAI,EAAE,OAAO,WAAW,KAAK,SAAS,OAAO;KAAE,MAAM;KAAY;KAAI;IAAM,CAAC,CAAC,CAAC,MAAM,CAAC;GAC5F;GAEA,IAAY,OAA4C;IACtD,KAAK,WAAW;KAAE,GAAG,KAAK;KAAU,GAAG;IAAM;IAC7C,KAAK,MAAM,KAAK,KAAK,WAAW,EAAE;GACpC;;GAGA,YAAY,OAA8B;IACxC,KAAK,IAAI,EAAE,OAAO,cAAc,KAAK,SAAS,OAAO,EAAE,EAAE,CAAC;IAC1D,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;GACvD;GAEA,gBAA+B;IAC7B,IAAI,KAAK,aAAa,KAAA,GAAW,OAAO,KAAK;IAC7C,KAAK,IAAI,EAAE,SAAS,KAAK,CAAC;IAC1B,KAAK,WAAW,IAAI,MAAM,CAAC,CAAC,MAAM,UAAU;KAC1C,KAAK,IAAI;MAAE;MAAO,SAAS;MAAO,OAAO,KAAA;MAAW,QAAQ,MAAM;MAAQ,OAAO,aAAa,KAAK,SAAS,OAAO,KAAK;KAAE,CAAC;IAC7H,CAAC,CAAC,CAAC,OAAO,UAAmB;KAC3B,KAAK,IAAI;MAAE,SAAS;MAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;KAAE,CAAC;IAC5F,CAAC,CAAC,CAAC,cAAc;KAAE,KAAK,WAAW,KAAA;IAAU,CAAC;IAC9C,OAAO,KAAK;GACd;;GAGA,kBAAgC;IAC9B,IAAI,KAAK,iBAAiB,KAAA,GAAW;IACrC,KAAK,eAAe,iBAAiB;KACnC,KAAK,eAAe,KAAA;KACpB,KAAU,QAAQ;IACpB,GAAG,GAAG;GACR;GAEA,UAAwB;IACtB,IAAI,KAAK,WAAW,KAAA,KAAa,OAAO,gBAAgB,aAAa;IACrE,MAAM,SAAS,IAAI,YAAY,GAAG,SAAS,OAAO;IAClD,KAAK,SAAS;IACd,MAAM,UAAU,UAA8B;KAC5C,IAAI;KACJ,IAAI;MACF,QAAQ,KAAK,MAAM,OAAO,MAAM,IAAI,CAAC;KACvC,QAAQ;MACN;KACF;KACA,MAAM,WAAW,KAAK,SAAS,WAAW;KAC1C,MAAM,SAAS,WAAW,KAAK,SAAS,OAAO,KAAK;KACpD,KAAK,MAAM,KAAK,KAAK,gBAAgB,EAAE,KAAK;KAC5C,QAAQ,MAAM,MAAd;MACE,KAAK;OACH,KAAK,IAAI;QAAE,QAAQ;SAAE,GAAG,KAAK,SAAS;UAAS,MAAM,KAAK,MAAM;QAAG;QAAG;QAAU,OAAO,OAAO;OAAM,CAAC;OACrG;MACF,KAAK;OACH,KAAK,IAAI;QAAE,QAAQ,MAAM;QAAQ;OAAS,CAAC;OAC3C,IAAI,MAAM,OAAO,UAAU,SAAS,KAAK,gBAAgB;OACzD;MACF,KAAK;MACL,KAAK;OACH,KAAK,IAAI;QAAE;QAAU,OAAO,OAAO;OAAM,CAAC;OAC1C;MACF,KAAK;OAEH,KAAK,IAAI,EAAE,SAAS,CAAC;OACrB;MACF,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;OACH,KAAK,IAAI;QAAE;QAAU,OAAO,OAAO;OAAM,CAAC;OAC1C,IAAI,OAAO,WAAW,KAAA,GAAW,KAAK,MAAM,KAAK,KAAK,eAAe,EAAE,OAAO,MAAM;OACpF,KAAK,gBAAgB;OACrB;MACF,SACE;KACJ;IACF;IACA,KAAK,MAAM,QAAQ;KAAC;KAAW;KAAY;KAAU;KAAkB;KAAiB;KAAY;KAAU;KAAS;IAAO,GAC5H,OAAO,iBAAiB,MAAM,MAAuB;IAEvD,OAAO,gBAAgB;KAErB,KAAK,gBAAgB;IACvB;GACF;GAEA,aAA2B;IACzB,KAAK,QAAQ,MAAM;IACnB,KAAK,SAAS,KAAA;IACd,IAAI,KAAK,iBAAiB,KAAA,GAAW;KACnC,aAAa,KAAK,YAAY;KAC9B,KAAK,eAAe,KAAA;IACtB;GACF;EACF;EAEA,MAAa,eAAe,IAAI,aAAa;;;ECtR7C,MAAa,eAA4B;GAAE,SAAS,CAAC;GAAG,QAAQ;GAAG,UAAU;GAAO,SAAS;GAAO,QAAQ;EAAM;EAKlH,SAAgB,aAAa,OAA8B;GACzD,OAAO;IACL,KAAK,MAAM;IACX,KAAK,MAAM,QAAQ,QAAQ,QAAQ;IACnC,IAAI,MAAM;IACV,MAAM,MAAM;IACZ,IAAI,MAAM;IACV,GAAI,MAAM,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;IACvD,GAAI,MAAM,SAAS,OAAO,EAAE,MAAM,KAAc,IAAI,CAAC;IACrD,GAAI,MAAM,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;IAC7D,GAAI,MAAM,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,MAAM,aAAa;GACjF;EACF;;EAGA,SAAgB,WAAW,SAAgD;GACzE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,MAAM;IACjC,MAAM,KAAK,EAAE,MAAM,IAAI,IAAI;IAC3B,MAAM,KAAK,EAAE,MAAM,IAAI,IAAI;IAC3B,IAAI,OAAO,IAAI,OAAO,KAAK;IAC3B,IAAI,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE;IAClD,IAAI,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,KAAK,EAAE;IACnC,OAAO,EAAE,GAAG,cAAc,EAAE,EAAE;GAChC,CAAC;EACH;;;;;;;EAQA,SAAgB,aAAa,UAAkC,UAAiD;GAC9G,MAAM,wBAAQ,IAAI,IAAoB;GACtC,MAAM,uBAAO,IAAI,IAAoB;GACrC,MAAM,OAAsB,CAAC,GAAG,QAAQ;GACxC,KAAK,SAAS,GAAG,MAAM;IACrB,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,EAAE,KAAK,CAAC;IACjC,KAAK,IAAI,EAAE,IAAI,CAAC;GAClB,CAAC;GACD,KAAK,MAAM,SAAS,UAAU;IAC5B,MAAM,WAAW,MAAM,MAAM,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,KAAA;IACxD,MAAM,UAAU,KAAK,IAAI,MAAM,EAAE;IACjC,MAAM,QAAQ,YAAY;IAC1B,IAAI,UAAU,KAAA,GAAW;KACvB,KAAK,KAAK,KAAK;KACf,IAAI,MAAM,MAAM,GAAG,MAAM,IAAI,MAAM,KAAK,KAAK,SAAS,CAAC;KACvD,KAAK,IAAI,MAAM,IAAI,KAAK,SAAS,CAAC;KAClC;IACF;IACA,MAAM,WAAW,KAAK;IACtB,MAAM,SAAsB;KAAE,GAAG;KAAU,GAAG;KAAO,GAAI,SAAS,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,SAAS,SAAS;IAAG;IACjI,KAAK,SAAS;IACd,IAAI,OAAO,MAAM,GAAG,MAAM,IAAI,OAAO,KAAK,KAAK;IAC/C,KAAK,IAAI,OAAO,IAAI,KAAK;IACzB,IAAI,SAAS,OAAO,OAAO,IAAI,KAAK,OAAO,SAAS,EAAE;GACxD;GACA,OAAO,WAAW,IAAI;EACxB;;EAGA,SAAgB,aAAa,OAAoB,SAA8B,QAA6B;GAC1G,MAAM,WAAW,QAAQ,IAAI,YAAY;GACzC,MAAM,EAAE,OAAO,UAAU,GAAG,SAAS;GACrC,OAAO;IACL,GAAG;IACH,SAAS,aAAa,MAAM,SAAS,QAAQ;IAC7C;IAEA,UAAU,SAAS,SAAS;IAC5B,SAAS;IACT,QAAQ;GACV;EACF;;EAGA,SAAgB,aAAa,OAAoB,SAAiI;GAChL,MAAM,QAAqB;IACzB,KAAK,QAAQ,OAAO;IACpB,KAAK;IACL,IAAI,QAAQ;IACZ,MAAM,QAAQ;IACd,IAAI,QAAQ;IACZ,GAAI,QAAQ,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,KAAK;IAC3D,GAAI,QAAQ,SAAS,OAAO,EAAE,MAAM,KAAc,IAAI,CAAC;IACvD,GAAI,QAAQ,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,QAAQ,aAAa;GACrF;GACA,OAAO;IAAE,GAAG;IAAO,SAAS,aAAa,MAAM,SAAS,CAAC,KAAK,CAAC;GAAE;EACnE;;EAGA,SAAgB,cAAc,OAAoB,OAA8B;GAC9E,OAAO;IAAE,GAAG;IAAO,SAAS,aAAa,MAAM,SAAS,CAAC,aAAa,KAAK,CAAC,CAAC;GAAE;EACjF;;EAGA,SAAgB,cAAc,OAAoB,OAAoE;GACpH,MAAM,QAAqB;IAAE,KAAK;IAAG,KAAK;IAAO,IAAI,MAAM;IAAU,MAAM,MAAM;IAAM,IAAI,MAAM;IAAI,QAAQ;IAAW,UAAU,MAAM;GAAS;GACjJ,OAAO;IAAE,GAAG;IAAO,SAAS,CAAC,GAAG,MAAM,SAAS,KAAK;GAAE;EACxD;;EAGA,SAAgB,cAAc,OAAoB,UAAkB,OAA8B;GAChG,MAAM,WAAW,aAAa,KAAK;GACnC,MAAM,QAAQ,MAAM,QAAQ,WAAU,MAAK,EAAE,aAAa,QAAQ;GAClE,IAAI,UAAU,IAAI,OAAO;IAAE,GAAG;IAAO,SAAS,aAAa,MAAM,SAAS,CAAC,QAAQ,CAAC;GAAE;GACtF,MAAM,OAAO,CAAC,GAAG,MAAM,OAAO;GAC9B,KAAK,SAAS;IAAE,GAAG;IAAU;GAAS;GAGtC,MAAM,UAAU,KAAK,QAAQ,GAAG,MAAM,MAAM,SAAU,EAAE,EAAE,MAAM,KAAK,EAAE,QAAQ,SAAS,QAAQ,EAAE,OAAO,SAAS,EAAG;GACrH,OAAO;IAAE,GAAG;IAAO,SAAS,WAAW,OAAO;GAAE;EAClD;;EAGA,SAAgB,SAAS,OAAoB,UAAkB,OAA4B;GACzF,OAAO;IACL,GAAG;IACH,SAAS,MAAM,QAAQ,KAAI,MAAM,EAAE,aAAa,WAAW;KAAE,GAAG;KAAG,QAAQ;KAAU;IAAM,IAAI,CAAE;GACnG;EACF;;EAGA,SAAgB,UAAU,OAAoB,UAA+B;GAC3E,OAAO;IAAE,GAAG;IAAO,SAAS,MAAM,QAAQ,QAAO,MAAK,EAAE,aAAa,QAAQ;GAAE;EACjF;;EAYA,SAAgB,cAAc,SAAiC,OAA8B;GAC3F,MAAM,IAAI,MAAM,KAAK,CAAC,CAAC,YAAY;GACnC,IAAI,MAAM,IAAI,OAAO,CAAC,GAAG,OAAO;GAChC,OAAO,QAAQ,QAAO,MACpB,EAAE,KAAK,YAAY,CAAC,CAAC,SAAS,CAAC,MAC3B,EAAE,QAAQ,YAAY,CAAC,CAAC,SAAS,CAAC,KAAK,WACvC,EAAE,UAAU,YAAY,CAAC,CAAC,SAAS,CAAC,KAAK,UAC1C,EAAE,GAAG,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC;EACvC;;EAGA,SAAgB,SAAS,SAAiC,OAA8B;GACtF,OAAO,cAAc,UAAU,OAAO,GAAG,KAAK;EAChD;;EAGA,MAAa,YAAY;;;;;;;EAQzB,SAAgB,iBAAiB,SAA6C,UAAsC;GAClH,IAAI,aAAa,KAAA,KAAa,aAAA,SAAwB,OAAO;GAC7D,OAAO,QAAQ,MAAK,MAAK,EAAE,OAAO,QAAQ,IAAI,WAAW;EAC3D;;EAKA,SAAgB,OAAO,IAAoB;GACzC,MAAM,IAAI,IAAI,KAAK,EAAE;GACrB,MAAM,IAAI,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;GAClD,MAAM,MAAM,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;GAC/C,OAAO,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG;EACpC;;EAOA,SAAgB,kBAAkB,SAA8C;GAC9E,MAAM,OAAoB,CAAC;GAC3B,IAAI;GACJ,KAAK,MAAM,SAAS,SAAS;IAC3B,MAAM,MAAM,OAAO,MAAM,EAAE;IAC3B,IAAI,QAAQ,SAAS;KACnB,KAAK,KAAK;MAAE,MAAM;MAAO,KAAK,OAAO;MAAO,IAAI,MAAM;KAAG,CAAC;KAC1D,UAAU;IACZ;IACA,KAAK,KAAK;KAAE,MAAM;KAAS,KAAK,MAAM,aAAa,MAAM,MAAM,IAAI,OAAO,MAAM,QAAQ,MAAM,MAAM;KAAO;IAAM,CAAC;GACpH;GACA,OAAO;EACT;;EAGA,SAAgB,YAAY,IAAoB;GAC9C,MAAM,IAAI,IAAI,KAAK,EAAE;GACrB,OAAO,GAAG,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;EAC3F;;EAGA,SAAgB,UAAU,IAAY,KAAa,QAAsD;GACvG,MAAM,QAAQ,OAAO,GAAG;GACxB,MAAM,MAAM,OAAO,EAAE;GACrB,IAAI,QAAQ,OAAO,OAAO,OAAO;GACjC,IAAI,QAAQ,OAAO,MAAM,KAAmB,GAAG,OAAO,OAAO;GAC7D,MAAM,IAAI,IAAI,KAAK,EAAE;GAErB,OADiB,EAAE,YAAY,MAAM,IAAI,KAAK,GAAG,CAAC,CAAC,YAAY,IAC7C,GAAG,EAAE,SAAS,IAAI,EAAE,GAAG,EAAE,QAAQ,MAAM,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,IAAI,EAAE,GAAG,EAAE,QAAQ;EAC/G;;;;;;;;;;;;;;ECvOA,MAAa,cAAyB;GAAE,WAAW,KAAA;GAAW,QAAQ;GAAQ,MAAM;IAAE,OAAO,CAAC;IAAG,SAAS;IAAO,KAAK;GAAE;GAAG,SAAS;GAAO,QAAQ;GAAO,aAAa;EAAM;;EAc7K,MAAM,mBAAmB;EACzB,MAAM,iBAAiB;;EAEvB,MAAM,qBAAqB;EAI3B,IAAa,YAAb,MAAuB;GACrB,WAAiC;IAAE,MAAM;IAAO,UAAU,KAAA;IAAW,SAAS,CAAC;IAAG,OAAO;IAAa,UAAU,CAAC;GAAE;GACnH,4BAA6B,IAAI,IAAgB;GACjD,+BAAgC,IAAI,IAAoB;GACxD,6BAA8B,IAAI,IAA2C;GAC7E;GACA,eAAuB;GACvB,MAAc;GAEd,cAAc;IACZ,aAAa,QAAQ,KAAK,OAAO;GACnC;GAEA,oBAAkC,KAAK;GAEvC,aAAa,aAAuC;IAClD,KAAK,UAAU,IAAI,QAAQ;IAC3B,aAAa;KAAE,KAAK,UAAU,OAAO,QAAQ;IAAE;GACjD;GAEA,IAAY,OAAoC;IAC9C,KAAK,WAAW;KAAE,GAAG,KAAK;KAAU,GAAG;IAAM;IAC7C,KAAK,MAAM,KAAK,KAAK,WAAW,EAAE;GACpC;GAEA,UAAkB,IAAY,QAA2B;IACvD,KAAK,IAAI,EAAE,SAAS;KAAE,GAAG,KAAK,SAAS;MAAU,KAAK;IAAO,EAAE,CAAC;GAClE;GAEA,UAAU,OAA4B,KAAK,SAAS,QAAQ,OAAO;GAEnE,SAAiB,OAAiC;IAChD,KAAK,IAAI,EAAE,OAAO;KAAE,GAAG,KAAK,SAAS;KAAO,GAAG;IAAM,EAAE,CAAC;GAC1D;;GAGA,YAAY,YAA2B;IACrC,IAAI,KAAK,SAAS,MAAM,SAAS;KAC/B,KAAK,eAAe;KACpB;IACF;IACA,KAAK,SAAS,EAAE,SAAS,KAAK,CAAC;IAC/B,IAAI;KACF,MAAM,IAAI,MAAM,IAAI,eAAA,GAA4B;KAChD,MAAM,EAAE,OAAO,UAAU,GAAG,SAAS,KAAK,SAAS;KACnD,KAAK,IAAI,EAAE,OAAO;MAAE,GAAG;MAAM,WAAW,EAAE,aAAa,KAAA;MAAW,QAAQ,EAAE;MAAQ,MAAM,EAAE;MAAM,SAAS;MAAO,QAAQ;KAAK,EAAE,CAAC;IACpI,SAAS,GAAY;KACnB,KAAK,SAAS;MAAE,SAAS;MAAO,QAAQ;MAAM,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;KAAE,CAAC;IACnG;IACA,IAAI,KAAK,cAAc;KACrB,KAAK,eAAe;KACpB,KAAU,UAAU;IACtB;GACF;GAEA,kBAAgC;IAC9B,IAAI,KAAK,iBAAiB,KAAA,GAAW;IACrC,KAAK,eAAe,iBAAiB;KACnC,KAAK,eAAe,KAAA;KACpB,KAAU,UAAU;IACtB,GAAG,kBAAkB;GACvB;;;;;;;;GASA,WAAW,OAAO,SAAmC;IACnD,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE;IACpC,IAAI,SAAS,IAAI,OAAO;IACxB,MAAM,EAAE,OAAO,UAAU,GAAG,SAAS,KAAK,SAAS;IACnD,KAAK,IAAI,EAAE,OAAO;KAAE,GAAG;KAAM,aAAa;IAAK,EAAE,CAAC;IAClD,IAAI;KACF,MAAM,IAAI,SAAS,IAAI;KACvB,KAAK,SAAS;MAAE,aAAa;MAAO,QAAQ;KAAK,CAAC;KAClD,KAAK,gBAAgB;KACrB,OAAO;IACT,SAAS,GAAY;KACnB,KAAK,SAAS;MAAE,aAAa;MAAO,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;KAAE,CAAC;KACvF,OAAO;IACT;GACF;;GAGA,cAAc,OAAO,IAAY,aAAqI;IACpK,IAAI,KAAK,SAAS,SAAS,SAAS,EAAE,GAAG,OAAO;IAChD,KAAK,IAAI,EAAE,UAAU,CAAC,GAAG,KAAK,SAAS,UAAU,EAAE,EAAE,CAAC;IACtD,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,YAAY,IAAI,QAAQ;KACjD,IAAI,OAAO,UAAU,KAAA,GAAW;MAC9B,MAAM,SAAS,KAAK,SAAS,QAAQ,OAAO,MAAM;MAClD,IAAI,WAAW,KAAA,GAAW,KAAK,UAAU,OAAO,MAAM,IAAI,cAAc,QAAQ,OAAO,KAAK,CAAC;MAC7F,aAAa,cAAc,OAAO,MAAM,IAAI,OAAO,KAAK;KAC1D;KACA,KAAK,gBAAgB;KACrB,aAAkB,QAAQ;KAC1B,OAAO;IACT,SAAS,GAAY;KACnB,KAAK,SAAS,EAAE,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,EAAE,CAAC;KACnE,OAAO;IACT,UAAU;KACR,KAAK,IAAI,EAAE,UAAU,KAAK,SAAS,SAAS,QAAO,MAAK,MAAM,EAAE,EAAE,CAAC;IACrE;GACF;GAEA,QAAQ,cAA6B;IACnC,MAAM,WAAW,aAAa,KAAK,SAAS,YAAA;IAC5C,KAAK,IAAI;KAAE,MAAM;KAAM;IAAS,CAAC;IACjC,KAAK,MAAM,QAAQ;GACrB;GAEA,cAAoB;IAAE,IAAI,KAAK,SAAS,MAAM,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;GAAE;GAExE,eAAqB;IACnB,IAAI,KAAK,SAAS,MAAM,KAAK,MAAM;SAC9B,KAAK,KAAK;GACjB;GAEA,UAAU,cAA4B;IACpC,IAAI,cAAc,KAAK,SAAS,UAAU;IAC1C,KAAK,IAAI,EAAE,UAAU,UAAU,CAAC;IAChC,KAAK,MAAM,SAAS;GACtB;;GAGA,MAAc,WAAyB;IACrC,IAAI,cAAA,SAAyB;KAC3B,IAAI,CAAC,KAAK,SAAS,MAAM,QAAQ,KAAU,UAAU;KACrD;IACF;IACA,KAAU,KAAK,SAAS;GAC1B;;GAGA,OAAO,OAAO,IAAY,WAAmC;IAC3D,MAAM,UAAU,KAAK,OAAO,EAAE;IAC9B,IAAI,QAAQ,SAAS;IACrB,MAAM,OAAO,WAAW,QAAQ,SAAS,IAAI,QAAQ,SAAA;IACrD,KAAK,UAAU,IAAI;KAAE,GAAG;KAAS,SAAS;IAAK,CAAC;IAChD,IAAI;KACF,MAAM,EAAE,YAAY,MAAM,IAAI,aAAa,IAAI,EAAE,OAAO,KAAK,CAAC;KAC9D,KAAK,UAAU,IAAI,aAAa,KAAK,OAAO,EAAE,GAAG,SAAS,IAAI,CAAC;IACjE,SAAS,GAAY;KACnB,KAAK,UAAU,IAAI;MAAE,GAAG,KAAK,OAAO,EAAE;MAAG,SAAS;MAAO,QAAQ;MAAM,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;KAAE,CAAC;IAC5H;GACF;;GAGA,aAAa,OAA8B;IACzC,MAAM,IAAI,KAAK,OAAO,EAAE;IACxB,IAAI,EAAE,YAAY,EAAE,SAAS,OAAO,QAAQ,QAAQ;IACpD,OAAO,KAAK,KAAK,KAAK,EAAE,SAAS,IAAI,EAAE,SAAA,MAAA,EAA+B;GACxE;;;;;GAMA,OAAO,OAAO,IAAY,SAAmC;IAC3D,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE;IACpC,IAAI,SAAS,IAAI,OAAO;IACxB,KAAK,OAAO;IACZ,MAAM,WAAW,SAAS,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK;IAC1D,KAAK,UAAU,IAAI,cAAc,KAAK,OAAO,EAAE,GAAG;KAAE;KAAU,MAAM;KAAM,IAAI,KAAK,IAAI;IAAE,CAAC,CAAC;IAC3F,KAAK,WAAW,EAAE;IAClB,IAAI;KACF,MAAM,EAAE,UAAU,MAAM,IAAI,KAAK,IAAI,IAAI;KACzC,KAAK,UAAU,IAAI,cAAc,KAAK,OAAO,EAAE,GAAG,UAAU,KAAK,CAAC;KAClE,aAAa,cAAc,IAAI,KAAK;KACpC,OAAO;IACT,SAAS,GAAY;KACnB,KAAK,UAAU,IAAI,SAAS,KAAK,OAAO,EAAE,GAAG,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,CAAC;KAClG,OAAO;IACT;GACF;;GAGA,WAAW,IAAY,aAAyC;IAC9D,MAAM,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC,QAAQ,MAAK,MAAK,EAAE,aAAa,QAAQ;IACvE,KAAK,UAAU,IAAI,UAAU,KAAK,OAAO,EAAE,GAAG,QAAQ,CAAC;IACvD,OAAO,OAAO;GAChB;;GAGA,cAAc,OAAqB;IACjC,MAAM,MAAM,KAAK,IAAI;IAErB,IAAI,OADS,KAAK,aAAa,IAAI,EAAE,KAAK,KACzB,kBAAkB;KACjC,KAAK,aAAa,IAAI,IAAI,GAAG;KAC7B,IAAS,OAAO,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1C;IACA,MAAM,OAAO,KAAK,WAAW,IAAI,EAAE;IACnC,IAAI,SAAS,KAAA,GAAW,aAAa,IAAI;IACzC,KAAK,WAAW,IAAI,IAAI,iBAAiB;KAAE,KAAK,WAAW,EAAE;IAAE,GAAG,cAAc,CAAC;GACnF;GAEA,cAAc,OAAqB;IACjC,MAAM,OAAO,KAAK,WAAW,IAAI,EAAE;IACnC,IAAI,SAAS,KAAA,GAAW;KACtB,aAAa,IAAI;KACjB,KAAK,WAAW,OAAO,EAAE;IAC3B;IACA,IAAI,KAAK,aAAa,IAAI,EAAE,GAAG;KAC7B,KAAK,aAAa,OAAO,EAAE;KAC3B,IAAS,OAAO,IAAI,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC;IAC3C;GACF;GAEA,WAAmB,UAAmC;IACpD,QAAQ,MAAM,MAAd;KACE,KAAK,WAAW;MACd,MAAM,KAAK,MAAM,QAAQ;MACzB,MAAM,SAAS,KAAK,SAAS,QAAQ;MACrC,IAAI,WAAW,KAAA,GAAW,KAAK,UAAU,IAAI,aAAa,QAAQ,MAAM,OAAO,CAAC;MAEhF,IAAI,KAAK,SAAS,MAAM,QAAQ,KAAK,gBAAgB;MACrD;KACF;KACA,KAAK,YAAY;MACf,MAAM,SAAS,KAAK,SAAS,QAAQ,MAAM;MAC3C,IAAI,WAAW,KAAA,GAAW;MAC1B,KAAK,UAAU,MAAM,IAAI,cAAc,QAAQ,MAAM,KAAK,CAAC;MAC3D;KACF;KACA,KAAK;MACH,KAAK,SAAS;OAAE,WAAW,MAAM,MAAM;OAAW,QAAQ,MAAM,MAAM;MAAO,CAAC;MAC9E,IAAI,KAAK,SAAS,MAAM,UAAU,KAAK,SAAS,MAAM,KAAK,gBAAgB;MAC3E;KACF,KAAK;MACH,IAAI,KAAK,SAAS,MAAM,QAAQ,KAAK,gBAAgB;MACrD;KACF,SACE;IACJ;GACF;EACF;EAEA,MAAa,YAAY,IAAI,UAAU;;;;;;;;;;;;EC9QvC,SAAgB,eAAe,EAAE,OAAO,MAAyB;GAC/D,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,OAAO;IAAM,QAAQ;IAAM,SAAQ;IAAY,MAAK;IAAO,OAAM;IAA6B,eAAA;IAAnG,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,GAAE;KAAsL,MAAK;IAAgB,CAAA,GACnN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,GAAE;KAAgE,MAAK;IAAgB,CAAA,CAC1F;;EAET;EAEA,SAAgB,aAAa,EAAE,MAAM,KAAwB;GAC3D,MAAM,OAAA,GAAMA,MAAAA,qBAAAA,CAAqB,aAAa,WAAW,aAAa,WAAW;GACjF,MAAM,QAAA,GAAOA,MAAAA,qBAAAA,CAAqB,UAAU,WAAW,UAAU,WAAW;GAC5E,MAAM,QAAQ,YAAY,IAAI,MAAM,OAAO;GAC3C,MAAM,QAAQ,QAAQ,IAAI,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe;GAE5G,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,SAAD;IAAgB;IAAO,SAAS;IAAK,UAAU;IAC7C,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;KACE,MAAK;KACL,WAAW,YAAY,OAAO,KAAK;KACnC,cAAY;KACZ,iBAAc;KACd,iBAAe,KAAK;KACpB,0BAAA;KACA,gCAA8B;KAC9B,eAAe;MAAE,UAAU,OAAO;KAAE;KARtC,UAAA;MAUE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD,EAAgB,MAAM,OAAO,KAAK,GAAK,CAAA,GACtC,CAAC,QAAQ,QAAQ,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAU;QAAS,eAAA;OAAa,CAAA,IAAI,IAC5D;;MACL,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAmB,UAAA,EAAE,eAAe;MAAQ,CAAA,IAAI;MACvE,QAAQ,QAAQ,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAY,UAAA,QAAQ,KAAK,QAAQ;MAAY,CAAA,IAAI;KAChF;;GACD,CAAA;EAEb;;;;;;;;;;;;EC3BA,SAAgB,aAAa,EAAE,kBAAkB,KAAwB;GAEvE,CAAA,GAAA,MAAA,qBAAA,CAAqB,aAAa,WAAW,aAAa,WAAW;GACrE,MAAM,CAAC,QAAQ,cAAA,GAAaC,MAAAA,SAAAA,CAAuB,CAAC,CAAC;GACrD,MAAM,OAAA,GAAMC,MAAAA,OAAAA,CAAO,CAAC;GACpB,CAAA,GAAA,MAAA,UAAA,OAAgB,aAAa,QAAQ,WAAW;IAC9C,MAAM,OAAO,UAAU,YAAY;IACnC,IAAI,KAAK,QAAQ,KAAK,aAAa,OAAO,IAAI;IAC9C,IAAI,CAAC,aAAa,QAAQ,iBAAiB,CAAC,GAAG;IAC/C,IAAI,WAAW;IACf,MAAM,QAAoB;KAAE,GAAG;KAAQ,KAAK,IAAI;IAAQ;IACxD,WAAU,SAAQ,CAAC,GAAG,KAAK,MAAM,EAAiB,GAAG,KAAK,CAAC;GAC7D,CAAC,GAAG,CAAC,gBAAgB,CAAC;GACtB,MAAM,WAAA,GAAUC,MAAAA,YAAAA,EAAa,QAAgB;IAAE,WAAU,SAAQ,KAAK,QAAO,MAAK,EAAE,QAAQ,GAAG,CAAC;GAAE,GAAG,CAAC,CAAC;GAEvG,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,kBAAA,UAAA,EAAA,UACG,OAAO,KAAI,UACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;IAA2B,OAAO;IAAU;IAAG,cAAc;KAAE,QAAQ,MAAM,GAAG;IAAE;GAAI,GAAtE,MAAM,GAAgE,CACvF,EACD,CAAA;EAEN;EAEA,SAAS,UAAU,EAAE,OAAO,GAAG,UAAgF;GAC7G,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,OAAD;IAAO,MAAM,EAAE,iBAAiB,EAAE,MAAM,MAAM,KAAK,CAAC;IAAG,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD,EAAgB,MAAM,GAAK,CAAA;IAAW;GAAS,CAAA;EACrH;;;ECpDA,MAAa,KAAK;EAElB,MAAa,KAAK;GAChB,YAAY;GACZ,iBAAiB;GACjB,kBAAkB;GAClB,eAAe;GACf,cAAc;GACd,iBAAiB;GACjB,iBAAiB;GACjB,4BAA4B;GAC5B,0BAA0B;GAC1B,eAAe;GACf,0BAA0B;GAC1B,oBAAoB;GACpB,oBAAoB;GACpB,gBAAgB;GAChB,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd,eAAe;GACf,mBAAmB;GACnB,qBAAqB;GACrB,aAAa;GACb,yBAAyB;GACzB,iBAAiB;GACjB,aAAa;GACb,cAAc;GACd,eAAe;GACf,eAAe;GACf,eAAe;GACf,gBAAgB;GAChB,kBAAkB;GAClB,kBAAkB;GAClB,mBAAmB;GACnB,2BAA2B;GAC3B,wBAAwB;GACxB,wBAAwB;GACxB,2BAA2B;GAC3B,6BAA6B;GAC7B,0BAA0B;GAC1B,wBAAwB;GACxB,mBAAmB;GACnB,2BAA2B;GAC3B,oCAAoC;GACpC,wBAAwB;GACxB,8BAA8B;GAC9B,qBAAqB;GACrB,0BAA0B;GAC1B,0BAA0B;GAC1B,4BAA4B;GAC5B,8BAA8B;GAC9B,iBAAiB;GACjB,sBAAsB;GACtB,wBAAwB;GACxB,sBAAsB;GACtB,mBAAmB;GACnB,wBAAwB;GACxB,mBAAmB;GACnB,yBAAyB;GACzB,+BAA+B;GAC/B,2BAA2B;GAC3B,8BAA8B;GAC9B,wBAAwB;GACxB,wBAAwB;GACxB,+BAA+B;GAC/B,oBAAoB;GACpB,yBAAyB;GACzB,yBAAyB;GACzB,yBAAyB;GACzB,2BAA2B;GAC3B,4BAA4B;GAC5B,2BAA2B;GAC3B,2BAA2B;GAC3B,oBAAoB;GACpB,yBAAyB;GACzB,2BAA2B;GAC3B,2BAA2B;GAC3B,gBAAgB;GAChB,oBAAoB;GACpB,qBAAqB;GACrB,qBAAqB;GACrB,qBAAqB;GACrB,kBAAkB;GAClB,oBAAoB;GACpB,iBAAiB;GACjB,gBAAgB;GAChB,gBAAgB;GAChB,kBAAkB;GAClB,gBAAgB;GAChB,iBAAiB;GACjB,mBAAmB;GACnB,mBAAmB;GACnB,oBAAoB;GACpB,oBAAoB;GACpB,uBAAuB;GACvB,8BAA8B;GAC9B,cAAc;GACd,cAAc;GACd,eAAe;GACf,gBAAgB;GAChB,gBAAgB;GAChB,yBAAyB;GACzB,qBAAqB;GACrB,qBAAqB;GACrB,YAAY;GACZ,gBAAgB;GAChB,iBAAiB;GACjB,iBAAiB;GACjB,wBAAwB;GACxB,mCAAmC;GACnC,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,wBAAwB;GACxB,4BAA4B;GAC5B,oBAAoB;GACpB,0BAA0B;GAC1B,yBAAyB;GACzB,2BAA2B;GAC3B,wBAAwB;GACxB,uBAAuB;GACvB,yBAAyB;GACzB,qBAAqB;GACrB,qBAAqB;GACrB,yBAAyB;GACzB,sBAAsB;GACtB,0BAA0B;GAC1B,uBAAuB;GACvB,oBAAoB;GACpB,sBAAsB;GACtB,qBAAqB;GACrB,sBAAsB;GACtB,qBAAqB;GACrB,uBAAuB;GACvB,sBAAsB;GACtB,6BAA6B;GAC7B,wBAAwB;GACxB,aAAa;GACb,YAAY;GACZ,kBAAkB;GAClB,oBAAoB;GACpB,wBAAwB;GACxB,qBAAqB;GACrB,0BAA0B;GAC1B,iBAAiB;GACjB,sBAAsB;GACtB,iBAAiB;GACjB,oBAAoB;GACpB,qBAAqB;GACrB,oBAAoB;GACpB,8BAA8B;GAC9B,uBAAuB;GACvB,mBAAmB;GACnB,kBAAkB;GAClB,sBAAsB;GACtB,mBAAmB;GACnB,mBAAmB;GACnB,2BAA2B;GAC3B,wBAAwB;GACxB,wBAAwB;GACxB,yBAAyB;GACzB,2BAA2B;GAC3B,0BAA0B;GAC1B,4BAA4B;GAC5B,4BAA4B;GAC5B,0BAA0B;GAC1B,yBAAyB;GACzB,qBAAqB;GACrB,qBAAqB;GACrB,aAAa;GACb,eAAe;GACf,kBAAkB;GAClB,oBAAoB;GACpB,2BAA2B;GAC3B,4BAA4B;GAC5B,6BAA6B;GAC7B,gCAAgC;GAChC,6BAA6B;GAC7B,gCAAgC;GAChC,mBAAmB;GACnB,iBAAiB;GACjB,cAAc;GACd,kBAAkB;GAClB,gBAAgB;GAChB,4BAA4B;GAC5B,oBAAoB;GACpB,gBAAgB;GAChB,gBAAgB;GAChB,wBAAwB;GACxB,sBAAsB;GACtB,wBAAwB;GACxB,wBAAwB;GACxB,wBAAwB;GACxB,oBAAoB;GACpB,gBAAgB;GAChB,sBAAsB;GACtB,qBAAqB;GACrB,yBAAyB;GACzB,0BAA0B;GAC1B,yBAAyB;GACzB,4BAA4B;GAC5B,qBAAqB;GACrB,eAAe;GACf,cAAc;GACd,aAAa;GACb,gBAAgB;GAChB,qBAAqB;GACrB,oBAAoB;GACpB,mBAAmB;GACnB,yBAAyB;GACzB,eAAe;GACf,oBAAoB;GACpB,mBAAmB;GACnB,+BAA+B;GAC/B,wBAAwB;GACxB,yBAAyB;GACzB,kBAAkB;GAClB,iBAAiB;GACjB,iBAAiB;GACjB,oBAAoB;GACpB,iBAAiB;GACjB,kBAAkB;GAClB,mBAAmB;GACnB,kBAAkB;GAClB,wBAAwB;GACxB,8BAA8B;GAC9B,0BAA0B;GAC1B,6BAA6B;GAC7B,2BAA2B;GAC3B,8BAA8B;GAC9B,yBAAyB;EAC3B;EAEA,MAAa,KAAsC;GACjD,YAAY;GACZ,iBAAiB;GACjB,kBAAkB;GAClB,eAAe;GACf,cAAc;GACd,iBAAiB;GACjB,iBAAiB;GACjB,4BAA4B;GAC5B,0BAA0B;GAC1B,eAAe;GACf,0BAA0B;GAC1B,oBAAoB;GACpB,oBAAoB;GACpB,gBAAgB;GAChB,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd,eAAe;GACf,mBAAmB;GACnB,qBAAqB;GACrB,aAAa;GACb,yBAAyB;GACzB,iBAAiB;GACjB,aAAa;GACb,cAAc;GACd,eAAe;GACf,eAAe;GACf,eAAe;GACf,gBAAgB;GAChB,kBAAkB;GAClB,kBAAkB;GAClB,mBAAmB;GACnB,2BAA2B;GAC3B,wBAAwB;GACxB,wBAAwB;GACxB,2BAA2B;GAC3B,6BAA6B;GAC7B,0BAA0B;GAC1B,wBAAwB;GACxB,mBAAmB;GACnB,2BAA2B;GAC3B,oCAAoC;GACpC,wBAAwB;GACxB,8BAA8B;GAC9B,qBAAqB;GACrB,0BAA0B;GAC1B,0BAA0B;GAC1B,4BAA4B;GAC5B,8BAA8B;GAC9B,iBAAiB;GACjB,sBAAsB;GACtB,wBAAwB;GACxB,sBAAsB;GACtB,mBAAmB;GACnB,wBAAwB;GACxB,mBAAmB;GACnB,yBAAyB;GACzB,+BAA+B;GAC/B,2BAA2B;GAC3B,8BAA8B;GAC9B,wBAAwB;GACxB,wBAAwB;GACxB,+BAA+B;GAC/B,oBAAoB;GACpB,yBAAyB;GACzB,yBAAyB;GACzB,yBAAyB;GACzB,2BAA2B;GAC3B,4BAA4B;GAC5B,2BAA2B;GAC3B,2BAA2B;GAC3B,oBAAoB;GACpB,yBAAyB;GACzB,2BAA2B;GAC3B,2BAA2B;GAC3B,gBAAgB;GAChB,oBAAoB;GACpB,qBAAqB;GACrB,qBAAqB;GACrB,qBAAqB;GACrB,kBAAkB;GAClB,oBAAoB;GACpB,iBAAiB;GACjB,gBAAgB;GAChB,gBAAgB;GAChB,kBAAkB;GAClB,gBAAgB;GAChB,iBAAiB;GACjB,mBAAmB;GACnB,mBAAmB;GACnB,oBAAoB;GACpB,oBAAoB;GACpB,uBAAuB;GACvB,8BAA8B;GAC9B,cAAc;GACd,cAAc;GACd,eAAe;GACf,gBAAgB;GAChB,gBAAgB;GAChB,yBAAyB;GACzB,qBAAqB;GACrB,qBAAqB;GACrB,YAAY;GACZ,gBAAgB;GAChB,iBAAiB;GACjB,iBAAiB;GACjB,wBAAwB;GACxB,mCAAmC;GACnC,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,wBAAwB;GACxB,4BAA4B;GAC5B,oBAAoB;GACpB,0BAA0B;GAC1B,yBAAyB;GACzB,2BAA2B;GAC3B,wBAAwB;GACxB,uBAAuB;GACvB,yBAAyB;GACzB,qBAAqB;GACrB,qBAAqB;GACrB,yBAAyB;GACzB,sBAAsB;GACtB,0BAA0B;GAC1B,uBAAuB;GACvB,oBAAoB;GACpB,sBAAsB;GACtB,qBAAqB;GACrB,sBAAsB;GACtB,qBAAqB;GACrB,uBAAuB;GACvB,sBAAsB;GACtB,6BAA6B;GAC7B,wBAAwB;GACxB,aAAa;GACb,YAAY;GACZ,kBAAkB;GAClB,oBAAoB;GACpB,wBAAwB;GACxB,qBAAqB;GACrB,0BAA0B;GAC1B,iBAAiB;GACjB,sBAAsB;GACtB,iBAAiB;GACjB,oBAAoB;GACpB,qBAAqB;GACrB,oBAAoB;GACpB,8BAA8B;GAC9B,uBAAuB;GACvB,mBAAmB;GACnB,kBAAkB;GAClB,sBAAsB;GACtB,mBAAmB;GACnB,mBAAmB;GACnB,2BAA2B;GAC3B,wBAAwB;GACxB,wBAAwB;GACxB,yBAAyB;GACzB,2BAA2B;GAC3B,0BAA0B;GAC1B,4BAA4B;GAC5B,4BAA4B;GAC5B,0BAA0B;GAC1B,yBAAyB;GACzB,qBAAqB;GACrB,qBAAqB;GACrB,aAAa;GACb,eAAe;GACf,kBAAkB;GAClB,oBAAoB;GACpB,2BAA2B;GAC3B,4BAA4B;GAC5B,6BAA6B;GAC7B,gCAAgC;GAChC,6BAA6B;GAC7B,gCAAgC;GAChC,mBAAmB;GACnB,iBAAiB;GACjB,cAAc;GACd,kBAAkB;GAClB,gBAAgB;GAChB,4BAA4B;GAC5B,oBAAoB;GACpB,gBAAgB;GAChB,gBAAgB;GAChB,wBAAwB;GACxB,sBAAsB;GACtB,wBAAwB;GACxB,wBAAwB;GACxB,wBAAwB;GACxB,oBAAoB;GACpB,gBAAgB;GAChB,sBAAsB;GACtB,qBAAqB;GACrB,yBAAyB;GACzB,0BAA0B;GAC1B,yBAAyB;GACzB,4BAA4B;GAC5B,qBAAqB;GACrB,eAAe;GACf,cAAc;GACd,aAAa;GACb,gBAAgB;GAChB,qBAAqB;GACrB,oBAAoB;GACpB,mBAAmB;GACnB,yBAAyB;GACzB,eAAe;GACf,oBAAoB;GACpB,mBAAmB;GACnB,+BAA+B;GAC/B,wBAAwB;GACxB,yBAAyB;GACzB,kBAAkB;GAClB,iBAAiB;GACjB,iBAAiB;GACjB,oBAAoB;GACpB,iBAAiB;GACjB,kBAAkB;GAClB,mBAAmB;GACnB,kBAAkB;GAClB,wBAAwB;GACxB,8BAA8B;GAC9B,0BAA0B;GAC1B,6BAA6B;GAC7B,2BAA2B;GAC3B,8BAA8B;GAC9B,yBAAyB;EAC3B;;;;;;;;;;;;;ECrcA,MAAa,QAA8B;GAAC;GAAU;GAAS;EAAM;EAErE,SAAgB,UAAU,GAAc,MAAyB;GAC/D,OAAO,SAAS,WAAW,EAAE,aAAa,IAAI,SAAS,SAAS,EAAE,WAAW,IAAI,EAAE,YAAY;EACjG;EAEA,SAAgB,UAAU,GAAc,MAAyB;GAC/D,OAAO,SAAS,WAAW,EAAE,mBAAmB,IAAI,SAAS,SAAS,EAAE,iBAAiB,IAAI,EAAE,kBAAkB;EACnH;EAEA,SAAgB,SAAS,EAAE,MAAM,KAAwC;GACvE,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,WAAW,wBAAwB;IAAQ,wBAAsB;IAAO,UAAA,UAAU,GAAG,IAAI;GAAQ,CAAA;EAChH;EAEA,SAAgB,WAAW,EAAE,OAAO,aAAa,UAAU,GAAG,UAAU,MAQrE;GACD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;IACM;IACJ,WAAU;IACV,OAAO,SAAS;IACN;IACV,WAAW,MAAM;KAAE,SAAS,EAAE,OAAO,UAAU,KAAK,KAAA,IAAY,EAAE,OAAO,KAAkB;IAAE;IAC7F,+BAAA;IANF,UAAA,CAQE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,OAAM;KAAI,UAAA,EAAE,gBAAgB,EAAE,MAAM,UAAU,GAAG,WAAW,EAAE,CAAC;IAAU,CAAA,GAChF,MAAM,KAAI,SAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAmB,OAAO;KAAO,UAAA,UAAU,GAAG,IAAI;IAAU,GAA/C,IAA+C,CAAC,CAC1E;;EAEZ;;EAGA,SAAgB,oBAAoB,EAAE,IAAI,MAAM,MAAM,cAAc,UAAU,aAAa,SAAS,GAAG,WAUpG;GACD,MAAM,CAAC,OAAO,aAAA,GAAYC,MAAAA,SAAAA,CAAS,YAAY,EAAE;GACjD,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAA6D,KAAA,CAAS;GAC9F,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,SAAS,YAAY,EAAE;GAAE,GAAG,CAAC,IAAI,QAAQ,CAAC;GAE5D,MAAM,OAAO,OAAO,UAAuE;IACzF,QAAQ,IAAI;IACZ,QAAQ,KAAA,CAAS;IACjB,IAAI;KACF,MAAM,IAAI,UAAU,IAAI,KAAK;KAC7B,MAAM,aAAa,QAAQ;KAC3B,QAAQ;MAAE,MAAM;MAAM,MAAM,EAAE,uBAAuB;KAAE,CAAC;IAC1D,SAAS,GAAY;KACnB,QAAQ;MAAE,MAAM;MAAS,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;KAAE,CAAC;IAC7E,UAAU;KACR,QAAQ,KAAK;IACf;GACF;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAqB,mCAAiC;IAArE,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;MAAE;MAA5D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAa,OAAO;QAAE,SAAS;QAAG,MAAM;OAAE;OAAI,UAAA,EAAE,yBAAyB,EAAE,KAAK,CAAC;MAAO,CAAA,GACtG,YAAY,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAU;OAAa,SAAS;OAAU,UAAA,EAAE,aAAa;MAAU,CAAA,IAAI,IACnH;;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,aAAa,EAAQ,CAAA;MAC9B,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;OAAY,OAAO,eAAe,OAAO,KAAA;OAAwB;OAAa,UAAU;OAAS;OAAG,WAAW,SAAS;QAAE,KAAU,EAAE,MAAM,QAAQ,GAAG,CAAC;OAAE;MAAI,CAAA;MAC9J,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,oBAAoB,EAAE,GAAG,QAAQ,CAAC,EAAQ,CAAA;KAC9C,EAAA,CAAA;KACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,iBAAiB,EAAQ,CAAA,GAClC,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAU,WAAU;MAAkB,OAAO;MAAO,aAAa,EAAE,6BAA6B;MAAG,WAAW,MAAM;OAAE,SAAS,EAAE,OAAO,KAAK;MAAE;MAAG,mCAAA;KAAiC,CAAA,CAC9K,EAAA,CAAA;KACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACG,SAAS,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,OAAO;QAAE,aAAa;QAAQ,UAAU;OAAK;OAAG,WAAW,KAAK,SAAS,UAAU,mBAAmB;OAAa,UAAA,KAAK,SAAS,UAAU,EAAE,kBAAkB,EAAE,SAAS,KAAK,KAAK,CAAC,IAAI,KAAK;MAAW,CAAA,IAAI,MACzO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAU;OAAc,UAAU,QAAQ,WAAW,YAAY;OAAK,eAAe;QAAE,KAAU,EAAE,UAAU,MAAM,CAAC;OAAE;OAAG,wCAAA;OAAsC,UAAA,EAAE,sBAAsB;MAAU,CAAA,CACpN;;IACF;;EAET;;EAGA,SAAgB,eAAe,EAAE,GAAG,WAAgD;GAClF,MAAM,OAAA,GAAMC,MAAAA,qBAAAA,CAAqB,aAAa,WAAW,aAAa,WAAW;GACjF,MAAM,CAAC,MAAM,YAAA,GAAWD,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GAC9D,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GAChE,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAiB,IAAI,OAAO,OAAO,gBAAgB,EAAE;GAC7E,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAkB,IAAI,OAAO,OAAO,kBAAkB,IAAI;GACtF,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAA6D,KAAA,CAAS;GAE9F,MAAM,OAAO,YAA2B;IACtC,QAAQ,IAAI;IACZ,IAAI;KACF,MAAM,IAAI,MAAM,IAAI,YAAY;KAChC,QAAQ,EAAE,IAAI;KACd,SAAS,EAAE,IAAI;KACf,QAAQ,EAAE,IAAI;KACd,UAAU,EAAE,MAAM;KAClB,QAAQ,KAAA,CAAS;IACnB,SAAS,GAAY;KACnB,QAAQ;MAAE,MAAM;MAAS,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;KAAE,CAAC;IAC7E,UAAU;KACR,QAAQ,KAAK;IACf;GACF;GACA,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,KAAU;GAAE,GAAG,CAAC,CAAC;GAEnC,MAAM,OAAO,YAA2B;IACtC,IAAI,SAAS,KAAA,GAAW;IACxB,QAAQ,IAAI;IACZ,IAAI;KACF,MAAM,IAAI,MAAM,IAAI,YAAY,IAAI;KACpC,SAAS,EAAE,IAAI;KACf,QAAQ,EAAE,IAAI;KACd,UAAU,IAAI;KACd,QAAQ;MAAE,MAAM;MAAM,MAAM,EAAE,gBAAgB;KAAE,CAAC;IACnD,SAAS,GAAY;KACnB,QAAQ;MAAE,MAAM;MAAS,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;KAAE,CAAC;IAC7E,UAAU;KACR,QAAQ,KAAK;IACf;GACF;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAc,4BAAA;IAA7B,UAAA;KACG,UAAU,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,gBAAgB,EAAU,CAAA;KACvD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAU;MAAW,OAAO,EAAE,UAAU,KAAK;MAAI,UAAA,EAAE,iBAAiB,EAAE,KAAK,CAAC;KAAQ,CAAA;KACzF,CAAC,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAU;MAAgB,OAAO,EAAE,UAAU,KAAK;MAAI,UAAA,EAAE,kBAAkB;KAAQ,CAAA,IAAI;KACvG,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MACE,WAAU;MACV,OAAO,QAAQ;MACf,UAAU,SAAS,KAAA;MACnB,WAAW,MAAM;OAAE,QAAQ,EAAE,OAAO,KAAK;MAAE;MAC3C,YAAY;MACZ,iCAAA;KACD,CAAA;KACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACG,SAAS,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,OAAO;SAAE,aAAa;SAAQ,UAAU;QAAK;QAAG,WAAW,KAAK,SAAS,UAAU,mBAAmB;QAAa,UAAA,KAAK,SAAS,UAAU,EAAE,kBAAkB,EAAE,SAAS,KAAK,KAAK,CAAC,IAAI,KAAK;OAAW,CAAA,IAAI;OACzO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAc,UAAU;QAAM,eAAe;SAAE,KAAU;QAAE;QAAI,UAAA,EAAE,iBAAiB;OAAU,CAAA;OAC5H,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAc,UAAU,QAAQ,SAAS,KAAA,KAAa,SAAS;QAAO,eAAe;SAAE,KAAU;QAAE;QAAG,iCAAA;QAA+B,UAAA,EAAE,eAAe;OAAU,CAAA;MAC7L;;IACF;;EAET;;;;;;;;;;;;EC9HA,MAAM,OAAsB;GAAE,QAAQ;GAAmC,cAAc;GAAI,SAAS;GAAa,SAAS;GAAQ,KAAK;EAAE;EACzI,MAAM,KAAoB;GAAE,QAAQ;GAAG,UAAU;EAAS;EAC1D,MAAM,QAAuB;GAAE,SAAS;GAAK,UAAU;GAAU,QAAQ;EAAE;EAC3E,MAAM,QAAuB;GAAE,MAAM;GAAW,SAAS;GAAW,cAAc;GAAG,QAAQ;GAAmC,YAAY;GAAe,OAAO;GAAW,OAAO;GAAQ,WAAW;EAAa;EACpN,MAAM,OAAsB;GAAE,YAAY;GAAkD,UAAU;GAAS,WAAW;GAAa,YAAY;EAAM;EACzJ,MAAM,WAA0B;GAAE,SAAS;GAAQ,YAAY;GAAU,KAAK;GAAI,UAAU;EAAO;EACnG,MAAM,OAAsB;GAAE,GAAG;GAAM,aAAa;GAAuB,YAAY;EAAsB;EAE7G,SAASE,YAA2D;GAClE,MAAM,CAAC,QAAQ,cAAA,GAAaC,MAAAA,SAAAA,CAAS,KAAK;GAO1C,OAAO,CAAC,SAAA,GANKC,MAAAA,YAAAA,EAAa,SAAiB;IACzC,UAAe,WAAW,UAAU,IAAI,CAAC,CAAC,WAAW;KACnD,UAAU,IAAI;KACd,iBAAiB;MAAE,UAAU,KAAK;KAAE,GAAG,IAAI;IAC7C,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;GACnB,GAAG,CAAC,CACe,CAAC;EACtB;EAEA,SAAgB,UAAU,EAAE,SAAS,MAAM,KAAyE;GAClH,MAAM,CAAC,QAAQ,QAAQF,UAAQ;GAC/B,MAAM,MAAM,KAAK,SAAS,IAAI,IAAI,OAAO;GACzC,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,OAAO;IAAZ,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,OAAO;MAAK,UAAA,EAAE,eAAe;KAAM,CAAA;KACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,OAAO;MAAM,4BAAA;MAA0B,UAAA;KAAa,CAAA;KACzD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,OAAO;MAAZ,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,eAAe;QAAE,KAAK,OAAO;OAAE;OAAI,UAAA,SAAS,EAAE,sBAAsB,IAAI,EAAE,oBAAoB;MAAU,CAAA,GAC9H,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,OAAO;OAAQ,UAAA,EAAE,oBAAoB;MAAQ,CAAA,CAChD;;IACF;GACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,OAAO;IAAM,MAAK;IAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;KAAI,OAAO;KAAX,UAAA,CAAe,MAAG,EAAE,iBAAiB,CAAM;IAC3C,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,OAAO;MAAE,GAAG;MAAO,SAAS;KAAI;KAAI,UAAA,EAAE,wBAAwB,EAAE,MAAM,GAAG,OAAO,IAAI,KAAK,IAAI,eAAe,CAAC;IAAK,CAAA,CAClH;GACL,CAAA,CAAA,EAAA,CAAA;EAEN;EAEA,SAAS,aAAa,EAAE,OAAO,OAAO,OAAO,QAAQ,MAAM,UAAU,OAAO,QAAQ,SAAS,aAAa,OAWvG;GACD,MAAM,UAAU,SAAS,UAAU;GACnC,MAAM,CAAC,OAAO,aAAA,GAAYC,MAAAA,SAAAA,CAAS,OAAO,OAAO,CAAC;GAClD,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,SAAS,OAAO,OAAO,CAAC;GAAE,GAAG,CAAC,OAAO,CAAC;GACxD,MAAM,eAAqB;IACzB,IAAI,UAAU,OAAO,OAAO,GAAG;IAC/B,MAAM,QAAiB,SAAS,WAAW,KAAK,IAAI,OAAO,GAAG,KAAK,MAAM,OAAO,KAAK,KAAK,CAAC,CAAC,IAAI;IAChG,MAAW,IAAI,OAAO,KAAc,CAAC,CAAC,YAAY,CAAC,CAAC;GACtD;GACA,MAAM,aAAa,SAAS;GAC5B,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;IAAO,OAAO;KAAE,SAAS;KAAQ,KAAK;KAAG,UAAU;IAAS;IAA5D,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAAM,OAAO,EAAE,SAAS,GAAI;KAA5B,UAAA,CAAgC,OAAO,aAAa,OAAO,EAAS;IACnE,CAAA,GAAA,SAAS,WAEN,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,OAAO;KAAO,UAAU,CAAC;KAAU,WAAW,MAAM;MAAE,SAAS,EAAE,OAAO,KAAK;MAAG,MAAW,IAAI,OAAO,EAAE,OAAO,KAAc,CAAC,CAAC,YAAY,CAAC,CAAC;KAAE;KAAG,OAAO;KAAO,2BAAyB;KAC7L,WAAA,WAAW,CAAC,EAAA,CAAG,KAAI,MAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAgB,OAAO;MAAI,UAAA,gBAAgB,KAAA,IAAY,IAAI,YAAY,CAAC;KAAU,GAArE,CAAqE,CAAC;IACvG,CAAA,IAER,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KAAO,OAAO;KAAO,MAAM,SAAS,WAAW,WAAW;KAAa;KAAK,OAAO;KAAO,UAAU,CAAC;KAAU,WAAU,MAAK;MAAE,SAAS,EAAE,OAAO,KAAK;KAAE;KAAG,QAAQ;KAAQ,YAAY,MAAM;MAAE,IAAI,EAAE,QAAQ,SAAS,OAAO;KAAE;KAAG,2BAAyB;IAAQ,CAAA,CACnQ;;EAEX;EAEA,MAAM,qBAAqB;GACzB,WAAW;GACX,oBAAoB;GACpB,QAAQ;GACR,cAAc;EAChB;EACA,SAAS,kBAAkB,GAAiC,QAAwB;GAClF,MAAM,MAAO,mBAAgH;GAC7H,OAAO,QAAQ,KAAA,IAAY,SAAS,EAAE,GAAG;EAC3C;EAEA,SAAgB,0BAA0B,EAAE,aAAa,OAAO,KAA8B;GAC5F,MAAM,OAAA,GAAME,MAAAA,qBAAAA,CAAqB,aAAa,WAAW,aAAa,WAAW;GAEjF,MAAM,kBAAA,GAAiBD,MAAAA,YAAAA,EAAa,aAAyB,MAAM,UAAU,QAAQ,GAAG,CAAC,KAAK,CAAC;GAC/F,MAAM,aAAA,GAAYA,MAAAA,YAAAA,OAAkB,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC;GAChE,MAAM,YAAA,GAAWC,MAAAA,qBAAAA,CAAqB,gBAAgB,SAAS;GAC/D,MAAM,QAAQ,IAAI;GAClB,MAAM,SAAS,IAAI,UAAU,OAAO;GACpC,MAAM,CAAC,MAAM,YAAA,GAAWF,MAAAA,SAAAA,CAAS,EAAE;GACnC,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GAC9D,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GACpE,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GAChE,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,EAAE;GACvC,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,EAAE;GAEzC,MAAM,MAAM,OAAO,KAAa,WAA6D;IAC3F,QAAQ,GAAG;IACX,SAAS,KAAA,CAAS;IAClB,WAAW,KAAA,CAAS;IACpB,IAAI;KACF,MAAM,OAAO,MAAM,OAAO;KAC1B,IAAI,SAAS,KAAA,GAAW,WAAW,IAAI;KACvC,MAAM,aAAa,QAAQ;IAC7B,SAAS,GAAY;KACnB,SAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;IACrD,UAAU;KACR,QAAQ,KAAA,CAAS;IACnB;GACF;GAEA,MAAM,WAAW,SAAS,WAAW,WAAW,SAAS;GACzD,MAAM,YAAa,OAAO,SAAS,SAAS,YAAY,SAAS,SAAS,OAAO,SAAS,OAAO,CAAC;GAClG,MAAM,cAAc,SAAS,OAAO,eAAe;GACnD,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,SAAS,MAAM,gBAAgB,IAAI,QAAQ,WAAW;GAAE,GAAG,CAAC,aAAa,IAAI,CAAC;GACpG,MAAM,aAAa,SAAS,OAAO,eAAe;GAElD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,KAAK;IAAG;IAAG,4BAAA;IAA1C,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,OAAO,EAAE,QAAQ,EAAE;MAAI,UAAA,EAAE,gBAAgB;KAAM,CAAA;KACnD,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,OAAO;MAAQ,UAAA,EAAE,gBAAgB;KAAK,CAAA;KAEzC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,OAAO;MAAZ,UAAA;OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,OAAO;QAAZ,UAAA;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;UAAI,OAAO;UAAK,UAAA,EAAE,iBAAiB;SAAM,CAAA;SACzC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,OAAO,YAAY,SAAS,EAAE,sBAAsB,IAAI,EAAE,yBAAyB,EAAQ,CAAA;SACjG,WAAW,KAAA,IAAY,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,OAAO,EAAE,SAAS,GAAI;UAA5B,UAAA;WAA+B;WAAG,EAAE,kBAAkB,OAAO,OAAO;WAAG,OAAO,QAAQ,KAAA,IAAY,SAAS,OAAO,IAAI,KAAK;WAAI,OAAO,WAAW,IAAI,eAAe,OAAO,aAAa;UAAS;SAAI,CAAA,IAAA;SAC7N,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,eAAe;WAAE,aAAkB,QAAQ;UAAE;UAAG,UAAU,IAAI;UAAU,UAAA,EAAE,kBAAkB;SAAU,CAAA;QACzH;;OACJ,QAAQ,cAAc,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,OAAO;SAAE,GAAG;SAAO,OAAO;QAAiB;QAAI,UAAA,OAAO;OAAa,CAAA,IAAI;OAC5G,IAAI,UAAU,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,OAAO;SAAE,GAAG;SAAO,OAAO;QAAiB;QAAI,UAAA,EAAE,kBAAkB,EAAE,SAAS,IAAI,MAAM,CAAC;OAAK,CAAA,IAAI;OAC/H,OAAO,UAAU,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,OAAO;SAAE,GAAG;SAAO,OAAO;QAAiB;QAAI,UAAA,EAAE,kBAAkB,EAAE,SAAS,MAAM,MAAM,CAAC;OAAK,CAAA,IAAI;OACpI,QAAQ,UAAU,KAAA,KAAa,OAAO,SAAS,KAAA,IAC5C,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;QAAG,OAAO;QAAV,UAAA;SAAkB,QAAQ,SAAS;SAAI,QAAQ,UAAU,KAAA,IAAY,QAAQ;SAAI,OAAO,QAAQ;QAAM;OACtG,CAAA,IAAA;OACH,QAAQ,WAAW,KAAA,IAChB,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;QAAG,OAAO;QAAO,0BAAA;QAAjB,UAAA;SAAyC,EAAE,iBAAiB;SAAE;SAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,OAAO,EAAE,WAAW,YAAY;UAAI,UAAA,OAAO;SAAa,CAAA;SAAE,OAAO,iBAAiB,KAAA,IAAY,KAAK,kBAAkB,GAAG,OAAO,YAAY,EAAE,KAAK;SAAI,OAAO,YAAY,KAAA,IAAY,cAAc,OAAO,YAAY;QAAM;OAClS,CAAA,IAAA;MACD;;KAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,OAAO;MAAZ,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,OAAO;OAAK,UAAA,EAAE,mBAAmB;MAAM,CAAA,GAC1C,OAAO,WAEJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,OAAO;OAAZ,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,MAAM,SAAS,KAAa,CAAA,GACrC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,OAAO;QAAO,UAAA,MAAM,SAAS;OAAS,CAAA,CACzC;MAGL,CAAA,IAAA,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,OAAO;OAAQ,UAAA,EAAE,wBAAwB;MAAK,CAAA,GACjD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,OAAO;OAAZ,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAO,OAAO;SAAE,GAAG;SAAO,UAAU;QAAI;QAAG,aAAa,EAAE,wBAAwB;QAAG,OAAO;QAAM,WAAU,MAAK;SAAE,QAAQ,EAAE,OAAO,KAAK;QAAE;OAAI,CAAA,GAC/I,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QACE,MAAK;QACL,UAAU,SAAS,KAAA,KAAa,KAAK,KAAK,MAAM,MAAM,QAAQ,UAAU;QACxE,eAAe;SAAE,IAAS,UAAU,YAAY;UAAE,MAAM,IAAI,eAAe,KAAK,KAAK,CAAC;SAAoB,CAAC;QAAE;QAE5G,UAAA,SAAS,WAAW,EAAE,4BAA4B,IAAI,EAAE,0BAA0B;OAC7E,CAAA,CACL;MACL,CAAA,CAAA,EAAA,CAAA,CAEH;;KAEJ,OAAO,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;MAAW,SAAS,MAAM,SAAS;MAAS,MAAM,MAAM;MAAS;KAAI,CAAA,IAAI;KAE5F,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,OAAO;MAAZ,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAI,OAAO;QAAK,UAAA,EAAE,iBAAiB;OAAM,CAAA;OACxC,SAAS,WAAW,iBAAiB,SAAS,SAAS,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,OAAO;QAAQ,UAAA,EAAE,6BAA6B;OAAK,CAAA,IAAI;OAC7H,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;QAAc,OAAO,EAAE,uBAAuB;QAAG,OAAM;QAAe;QAAO,QAAQ,SAAS;QAAO,MAAM;QAAqB;OAAW,CAAA;OAC3I,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;QAAc,OAAO,EAAE,6BAA6B;QAAG,OAAM;QAAqB;QAAO,QAAQ,SAAS;QAAO,MAAM;QAAqB;OAAW,CAAA;OACvJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;QAAc,OAAO,EAAE,yBAAyB;QAAG,OAAM;QAAiB;QAAO,QAAQ,SAAS;QAAO,MAAM;QAAqB;QAAU,MAAK;QAAS,SAAS,CAAC,WAAW,MAAM;OAAI,CAAA;OAC3L,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;QAAc,OAAO,EAAE,4BAA4B;QAAG,OAAM;QAAoB;QAAO,QAAQ,SAAS;QAAO,MAAM;QAAqB;OAAW,CAAA;OACrJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;QAAc,OAAO,EAAE,sBAAsB;QAAG,OAAM;QAAc;QAAO,QAAQ,SAAS;QAAO,MAAM;QAAqB;OAAW,CAAA;OACzI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,OAAO;QAAQ,UAAA,EAAE,sBAAsB;OAAK,CAAA;MAC5C;;KAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,OAAO;MAAM,kCAAA;MAAlB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAI,OAAO;QAAK,UAAA,EAAE,gBAAgB;OAAM,CAAA;OACxC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,OAAO;QAAQ,UAAA,EAAE,sBAAsB;OAAK,CAAA;OAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;QAAc,OAAO,EAAE,4BAA4B;QAAG,OAAM;QAAqB;QAAO,QAAQ,SAAS;QAAO,MAAM;QAAqB;QAAU,MAAK;QAAS,SAAS;QAAO,cAAc,MAAM,UAAU,GAAG,CAAc;OAAI,CAAA;OACtO,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;QAAc,OAAO,EAAE,wBAAwB;QAAG,OAAM;QAA0B;QAAO,QAAQ,SAAS;QAAO,MAAM;QAAqB;QAAU,MAAK;QAAS,KAAK;OAAI,CAAA;OAC7K,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,OAAO;QAAZ,UAAA;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,eAAe;WAAE,UAAU,KAAK,OAAO;UAAE;UAAG,sCAAA;UAAoC,UAAA,EAAE,yBAAyB;SAAU,CAAA;SAC1I,OAAO,OAAO,aAAa,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,eAAe;WAAE,YAAY,MAAM,MAAO,SAAU;UAAE;UAAG,+CAAA;UAA6C,UAAA,EAAE,4BAA4B;SAAU,CAAA,IAAI;SAC1M,OAAO,OAAO,yBAAyB,KAAA,KAAa,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,IACxG,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,OAAO;UAAQ,UAAA,EAAE,yBAAyB,EAAE,GAAG,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC,CAAC,OAAO,CAAC;SAAQ,CAAA,IACnH;QACD;;OACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;QAAO,OAAO;SAAE,SAAS;SAAQ,YAAY;SAAU,KAAK;SAAG,UAAU;QAAS;QAAlF,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAO,MAAK;SAAW,SAAS;SAAY,UAAU,CAAC;SAAU,WAAW,MAAM;UAAE,MAAW,IAAI,cAAc,EAAE,OAAO,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;SAAE;SAAG,2BAAwB;QAAc,CAAA,GAC5L,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,2BAA2B,EAAQ,CAAA,CACvC;;OACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD,EAAmB,EAAI,CAAA;MACpB;;KAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,OAAO;MAAZ,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAI,OAAO;QAAK,UAAA,EAAE,kBAAkB;OAAM,CAAA;OAC1C,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,OAAO;QAAQ,UAAA,EAAE,uBAAuB;OAAK,CAAA;QAC9C,OAAO,QAAQ,UAAU,OAAO,IAC9B,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,OAAO;QAAQ,UAAA,EAAE,uBAAuB;OAAK,CAAA,IAEhD,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAI,OAAO;SAAE,WAAW;SAAQ,SAAS;SAAG,QAAQ;SAAG,SAAS;SAAQ,KAAK;QAAE;QAC5E,UAAA,OAAO,QAAQ,KAAI,MAClB,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;SAAe,OAAO;SAAtB,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,OAAO,EAAE,WAAW,OAAO,EAAE,yBAAyB,IAAI,EAAE,0BAA0B;WAAG,OAAO,EAAE,OAAO,EAAE,WAAW,OAAO,mBAAmB,uBAAuB;WAAG,UAAA;UAAO,CAAA;UACvL,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,OAAO;YAAE,MAAM;YAAG,UAAU;WAAI;WAAtC,UAAA;YACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,KAAa,CAAA;YACvB,EAAE,aAAa,KAAA,KAAa,EAAE,aAAa,EAAE,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;aAAM,OAAO,EAAE,SAAS,GAAI;aAA5B,UAAA;cAA+B;cAAG,EAAE;cAAS;aAAO;YAAI,CAAA,IAAA;YAC7G,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;aAAM,OAAO;cAAE,GAAG;cAAM,SAAS;aAAI;aAArC,UAAA;cAAwC;cAAE,EAAE,GAAG,MAAM,GAAG,EAAE;cAAE;aAAO;;YAClE,EAAE,SAAS,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,OAAO;cAAE,YAAY;cAAG,SAAS;aAAI;aAAI,UAAA,EAAE,cAAc,EAAE,MAAM;YAAQ,CAAA,IAAI;YAC1G,EAAE,SAAS,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,OAAO;cAAE,YAAY;cAAG,OAAO;aAAiC;aAAI,UAAA,EAAE,2BAA2B,EAAE,GAAG,EAAE,OAAO,CAAC;YAAQ,CAAA,IAAI;aAChJ,EAAE,UAAU,KAAK,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,OAAO;cAAE,YAAY;cAAG,OAAO;aAAsC;aAAI,UAAA,EAAE,qBAAqB,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;YAAQ,CAAA,IAAI;YAC5J,IAAI,OAAO,EAAE,QAAQ,QAAQ,EAAE,WAAW,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,OAAO;cAAE,YAAY;cAAG,SAAS;aAAI;aAAI,UAAA,EAAE,yBAAyB;YAAQ,CAAA,IAAI;WACpI;;UACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,eAAe;YAAE,UAAU,KAAK,EAAE,EAAE;WAAE;WAAI,UAAA,EAAE,uBAAuB;UAAU,CAAA;SACjG;QAZK,GAAA,EAAE,EAYP,CACL;OACC,CAAA;MAEL;;KAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,OAAO;MAAZ,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;OAAI,OAAO;OAAX,UAAA,CAAgB,EAAE,kBAAkB,IAAI,OAAO,QAAQ,UAAU,KAAK,IAAI,KAAK,OAAO,QAAQ,UAAU,EAAE,KAAK,EAAO;MACpH,CAAA,IAAA,OAAO,QAAQ,UAAU,OAAO,IAC9B,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,OAAO;OAAQ,UAAA,EAAE,uBAAuB;MAAK,CAAA,IAEhD,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,OAAO;QAAE,WAAW;QAAQ,SAAS;QAAG,QAAQ;QAAG,SAAS;QAAQ,KAAK;OAAE;OAC5E,UAAA,OAAO,QAAQ,KAAK,MACnB,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;QAAe,OAAO;QAAtB,UAAA;SACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,OAAO;WAAE,MAAM;WAAG,UAAU;UAAI;UAAtC,UAAA;WACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,KAAa,CAAA;WAAC;WAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;YAAM,OAAO;aAAE,GAAG;aAAM,SAAS;YAAI;YAArC,UAAA,CAAyC,EAAE,GAAG,MAAM,GAAG,EAAE,GAAE,GAAO;;WAC3F,EAAE,aAAa,KAAK,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;YAAM,OAAO,EAAE,SAAS,IAAK;YAA7B,UAAA;aAAgC;aAAK,EAAE;aAAS;YAAO;WAAI,CAAA,IAAA;UAC5E;;SACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,UAAU,SAAS,KAAA;UAAW,eAAe;WAAE,IAAS,UAAU,EAAE,MAAM,YAAY;YAAE,MAAM,IAAI,MAAM,IAAI,OAAO,EAAE,EAAE;YAAG,UAAU,KAAK,EAAE,OAAO,EAAE;WAAoB,CAAC;UAAE;UAAI,UAAA,EAAE,yBAAyB;SAAU,CAAA;SAC1O,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,UAAU,SAAS,KAAA;UAAW,eAAe;WAAE,IAAS,UAAU,EAAE,MAAM,YAAY;YAAE,MAAM,IAAI,OAAO,EAAE,EAAE;WAAoB,CAAC;UAAE;UAAI,UAAA,EAAE,yBAAyB;SAAU,CAAA;QACjM;OAPK,GAAA,EAAE,EAOP,CACL;MACC,CAAA,CAEL;;KAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,OAAO;MAAZ,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAI,OAAO;QAAK,UAAA,EAAE,cAAc;OAAM,CAAA;OACtC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAO,OAAO;QAAO,aAAa,EAAE,kBAAkB;QAAG,OAAO;QAAQ,WAAU,MAAK;SAAE,UAAU,EAAE,OAAO,KAAK;QAAE;OAAI,CAAA;OACvH,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAO,OAAO;QAAO,aAAa,EAAE,mBAAmB;QAAG,OAAO;QAAS,WAAU,MAAK;SAAE,WAAW,EAAE,OAAO,KAAK;QAAE;OAAI,CAAA;OAC1H,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,OAAO;QAAZ,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SACE,MAAK;SACL,UAAU,SAAS,KAAA,KAAa,OAAO,KAAK,MAAM,MAAM,CAAC,OAAO;SAChE,eAAe;UACb,IAAS,OAAO,YAAY;WAC1B,MAAM,EAAE,WAAW,MAAM,IAAI,UAAU,OAAO,KAAK,GAAG,QAAQ,KAAK,MAAM,KAAK,KAAA,IAAY,QAAQ,KAAK,CAAC;WACxG,UAAU,EAAE;WACZ,WAAW,EAAE;WACb,OAAO,EAAE,qBAAqB,EAAE,MAAM,OAAO,KAAK,CAAC;UACrD,CAAC;SACH;SAEC,UAAA,EAAE,mBAAmB;QAChB,CAAA,GACP,YAAY,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,OAAO;SAAQ,UAAA;QAAc,CAAA,IAAI,IAC7D;;MACF;;KAEJ,UAAU,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,OAAO;OAAE,GAAG;OAAO,OAAO;MAAiB;MAAG,MAAK;MAAS,UAAA,EAAE,kBAAkB,EAAE,SAAS,MAAM,CAAC;KAAK,CAAA,IAAI;IAClI;;EAET;;;;;;;;;;;EC5SA,SAAgB,qBAAqB,EAAE,UAAU,aAAa,KAAsB;GAClF,MAAM,OAAA,GAAMG,MAAAA,qBAAAA,CAAqB,aAAa,WAAW,aAAa,WAAW;GACjF,MAAM,CAAC,MAAM,YAAA,GAAWC,MAAAA,SAAAA,CAAS,EAAE;GACnC,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GAChE,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,KAAK;GAC5C,MAAM,YAAA,GAAWC,MAAAA,OAAAA,CAAO,KAAK;GAC7B,MAAM,eAAqB;IACzB,IAAI,SAAS,SAAS;IACtB,SAAS,UAAU;IACnB,SAAS;GACX;GAGA,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,IAAI,OAAO,YAAY,CAAC,SAAS,OAAO;GAC9C,CAAC;GAED,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,UAAU,SAAS,eAAe,MAAM;IAC9C,IAAI,YAAY,QAAQ,IAAI,UAAU,KAAA,KAAc,IAAI,MAAM,YAAY,CAAC,SAAU;IACrF,MAAM,WAAW,QAAQ;IACzB,QAAQ,QAAQ;IAChB,aAAa;KAAE,QAAQ,QAAQ;IAAS;GAC1C,GAAG,CAAC,IAAI,OAAO,OAAO,CAAC;GAEvB,IAAI,IAAI,UAAU,KAAA,GAAW,OAAO;GACpC,IAAI,IAAI,MAAM,YAAY,CAAC,SAAS,OAAO;GAC3C,MAAM,SAAS,IAAI,UAAU,IAAI,MAAM;GACvC,MAAM,WAAW,IAAI,MAAM,YAAY,aAAa,OAAO,UAAU;GAErE,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,OAAD;IAAO,MAAA;IAAK,OAAO,EAAE,eAAe;IAAG,eAAe,CAAC;IAAG,UAAA;IACxD,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,KAAK;MAAI,SAAS;MAAI,UAAU;KAAI;KAAG,8BAAA;KAAtE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,OAAO;OAAE,QAAQ;OAAG,UAAU;MAAQ;MAAI,UAAA,EAAE,eAAe;KAAM,CAAA,GACpE,CAAC,UAEE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,OAAO;QAAE,QAAQ;QAAG,SAAS;OAAI;OAAI,UAAA,EAAE,cAAc;MAAK,CAAA;MAC5D,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,OAAO;QAAE,QAAQ;QAAG,OAAO;OAAkB;OAAI,UAAA,EAAE,mBAAmB,EAAE,OAAO,OAAO,MAAM,CAAC;MAAK,CAAA,IAAI;MACrH,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OACE,OAAO;QAAE,MAAM;QAAW,SAAS;QAAW,cAAc;QAAG,QAAQ;QAAmC,YAAY;QAAe,OAAO;OAAU;OACtJ,aAAa,EAAE,cAAc;OAC7B,OAAO;OACP,WAAA;OACA,WAAU,MAAK;QAAE,QAAQ,EAAE,OAAO,KAAK;OAAE;MAC1C,CAAA;MACA,UAAU,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,MAAK;OAAQ,OAAO;QAAE,QAAQ;QAAG,OAAO;OAAiB;OAAI,UAAA;MAAS,CAAA,IAAI;MACpG,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,KAAK;QAAG,gBAAgB;OAAW;OAAlE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;QAAQ,SAAQ;QAAQ,eAAe;SAAE,OAAO;QAAE;QAAI,UAAA,EAAE,eAAe;OAAU,CAAA,GACjF,iBAAA,GAAA,kBAAA,IAAA,CAACA,sCAAAA,QAAD;QACE,SAAQ;QACR,UAAU,QAAQ,KAAK,KAAK,MAAM,MAAM;QACxC,eAAe;SACb,QAAQ,IAAI;SACZ,SAAS,KAAA,CAAS;SAClB,IAAI,eAAe,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY;UAC/C,MAAM,aAAa,QAAQ;UAC3B,WAAW,IAAI;SACjB,CAAC,CAAC,CAAC,OAAO,MAAe;UACvB,SAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;SACrD,CAAC,CAAC,CAAC,cAAc;UAAE,QAAQ,KAAK;SAAE,CAAC;QACrC;QAEC,UAAA,EAAE,gBAAgB;OACb,CAAA,CACL;;KACL,EAAA,CAAA,IAGF,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,OAAO,EAAE,QAAQ,EAAE;OAAI,UAAA,EAAE,iBAAiB;MAAK,CAAA;MACjD,IAAI,MAAM,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;OAAW,SAAS,IAAI,MAAM,SAAS;OAAS,MAAM,IAAI,MAAM;OAAS;MAAI,CAAA,IAAI;MACvG,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,KAAK;QAAG,gBAAgB;OAAW;OAAlE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,sCAAAA,QAAD;QAAQ,SAAQ;QAAQ,eAAe;SAAE,OAAO;SAAG,YAAY,YAAY;QAAE;QAAI,UAAA,EAAE,cAAc;OAAU,CAAA,GAC3G,iBAAA,GAAA,kBAAA,IAAA,CAACA,sCAAAA,QAAD;QAAQ,SAAQ;QAAU,eAAe;SAAE,OAAO;QAAE;QAAI,UAAA,EAAE,cAAc;OAAU,CAAA,CAC/E;;KACL,EAAA,CAAA,CAEH;;GACA,CAAA;EAEX;;;;;;;;;;;ECrFA,SAAgB,YAAY,GAAc,QAAwB;GAChE,QAAQ,QAAR;IACE,KAAK,cAAc,OAAO,EAAE,yBAAyB;IACrD,KAAK,eAAe,OAAO,EAAE,0BAA0B;IACvD,KAAK,gBAAgB,OAAO,EAAE,2BAA2B;IACzD,KAAK,mBAAmB,OAAO,EAAE,8BAA8B;IAC/D,KAAK,gBAAgB,OAAO,EAAE,2BAA2B;IAEzD,SAAS,OAAO,EAAE,8BAA8B;GAClD;EACF;EAEA,SAAgB,UAAU,EAAE,OAAO,GAAG,YAAY,cAO/C;GAED,MAAM,QAAA,GADOC,MAAAA,qBAAAA,CAAqB,UAAU,WAAW,UAAU,WACjD,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE;GAC5C,MAAM,CAAC,MAAM,YAAA,GAAWC,MAAAA,SAAAA,CAAqC,MAAM;GACnE,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,MAAM,IAAI;GAC3C,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,EAAE;GAC3C,MAAM,YAAY,MAAM,SAAS,SAAS,YAAa,MAAM,QAAQ,QAAQ,MAAM,OAAQ,KAAA;GAE3F,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAW,yBAAuB,MAAM;IAAI,4BAA0B,MAAM;IAA3F,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAU;QAAgB,UAAA,EAAE,WAAW;OAAQ,CAAA;OACrD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,eAAe,OAAO,EAAE,kBAAkB,EAAE,MAAM,MAAM,KAAK,CAAC,IAAI,EAAE,aAAa,EAAQ,CAAA;OAC/F,eAAe,QAAQ,eAAe,KAAA,IACnC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAa,eAAe;SAAE,WAAW,MAAM,EAAE;QAAE;QAAI,UAAA,EAAE,kBAAkB;OAAU,CAAA,IACrH;OACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAU;QAAe,UAAA,UAAU,KAAK,MAAM,MAAM,SAAS,CAAC;OAAQ,CAAA;MACzE;;KACJ,SAAS,SAEN,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;OAAU,WAAU;OAAkB,OAAO;OAAM,WAAW,MAAM;QAAE,QAAQ,EAAE,OAAO,KAAK;OAAE;OAAG,WAAA;OAAU,8BAAA;MAA4B,CAAA,GACvI,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;QAAQ,SAAQ;QAAU,MAAK;QAAK,UAAU,QAAQ,KAAK,KAAK,MAAM;QAAI,eAAe;SAAE,UAAe,YAAY,MAAM,IAAI;UAAE,QAAQ;UAAW,MAAM;SAAK,CAAC,CAAC,CAAC,MAAM,OAAO;UAAE,IAAI,IAAI,QAAQ,MAAM;SAAE,CAAC;QAAE;QAAG,mCAAA;QAC7M,UAAA,EAAE,gBAAgB;OACb,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAc,UAAU;QAAM,eAAe;SAAE,QAAQ,MAAM;SAAG,QAAQ,MAAM,IAAI;QAAE;QAAI,UAAA,EAAE,cAAc;OAAU,CAAA,CAC/I;MACF,CAAA,CAAA;KAEL,CAAA,IAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAU;MAAgB,8BAAA;MAA4B,UAAA,MAAM;KAAU,CAAA;KAC/E,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACG,YAAY,GAAG,MAAM,MAAM,GAC3B,cAAc,KAAA,IAAY,MAAM,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC,MAAM,EAC5E;;KACJ,SAAS,WAEN,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;OAAU,WAAU;OAAkB,OAAO;OAAU,aAAa,EAAE,0BAA0B;OAAG,WAAW,MAAM;QAAE,YAAY,EAAE,OAAO,KAAK;OAAE;OAAG,WAAA;OAAU,kCAAA;MAAgC,CAAA,GAC/L,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,sCAAAA,QAAD;QAAQ,SAAQ;QAAU,MAAK;QAAK,UAAU,QAAQ,SAAS,KAAK,MAAM;QAAI,eAAe;SAAE,UAAe,YAAY,MAAM,IAAI;UAAE,QAAQ;UAAU;SAAS,CAAC,CAAC,CAAC,MAAM,OAAO;UAAE,IAAI,IAAI,QAAQ,MAAM;SAAE,CAAC;QAAE;QAAG,qCAAA;QAC9M,UAAA,EAAE,kBAAkB;OACf,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAc,UAAU;QAAM,eAAe;SAAE,QAAQ,MAAM;SAAG,YAAY,EAAE;QAAE;QAAI,UAAA,EAAE,cAAc;OAAU,CAAA,CAC3I;MACF,CAAA,CAAA;KAEL,CAAA,IAAA;KACH,SAAS,SAEN,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,sCAAAA,QAAD;QAAQ,SAAQ;QAAU,MAAK;QAAK,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,oBAAD,EAAoB,MAAM,GAAK,CAAA;QAAG,UAAU;QAAM,eAAe;SAAE,UAAe,YAAY,MAAM,IAAI,EAAE,QAAQ,UAAU,CAAC;QAAE;QAAG,iCAAA;QACzK,UAAA,EAAE,eAAe;OACZ,CAAA;OACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAc,UAAU;QAAM,eAAe;SAAE,QAAQ,MAAM;QAAE;QAAG,mCAAA;QAAiC,UAAA,EAAE,YAAY;OAAU,CAAA;OAC3J,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAc,UAAU;QAAM,eAAe;SAAE,QAAQ,QAAQ;QAAE;QAAG,qCAAA;QAAmC,UAAA,EAAE,cAAc;OAAU,CAAA;OACjK,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAA2B,UAAU;QAAM,eAAe;SAAE,UAAe,YAAY,MAAM,IAAI,EAAE,QAAQ,SAAS,CAAC;QAAE;QAAG,gCAAA;QAA1J,UAAA;SACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,iBAAD,EAAiB,MAAM,GAAK,CAAA;SAAC;SAAE,EAAE,cAAc;QACzC;;MACL;KAEL,CAAA,IAAA;IACD;;EAET;;;;;;;;;;;;;;ECtEA,MAAMC,iBAAe;EAErB,SAAS,OAAO,SAAkD,IAAY,UAA2B;GACvG,OAAO,QAAQ,MAAK,MAAK,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,aAAa,GAAG,SAAS,KAAK,GAAG,GAAG,MAAM,GAAG,EAAE,EAAE,KAAK;EACvG;EAEA,SAAS,MAAM,IAAoB;GACjC,MAAM,IAAI,IAAI,KAAK,EAAE;GACrB,OAAO,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,IAAI,EAAE,GAAG,EAAE,QAAQ;EAC7D;EAEA,SAAgB,UAAU,EAAE,GAAG,eAAe,cAA8B;GAC1E,MAAM,QAAA,GAAOC,MAAAA,qBAAAA,CAAqB,UAAU,WAAW,UAAU,WAAW;GAC5E,MAAM,OAAA,GAAMA,MAAAA,qBAAAA,CAAqB,aAAa,WAAW,aAAa,WAAW;GACjF,MAAM,QAAQ,KAAK;GACnB,MAAM,UAAU,IAAI,MAAM;GAC1B,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,UAAU,MAAM,WAAW,aAAa,MAAM,KAAK,WAAW,MAAM;GAC1E,MAAM,CAAC,OAAO,aAAA,GAAYC,MAAAA,SAAAA,CAAS,EAAE;GACrC,MAAM,YAAA,GAAWC,MAAAA,OAAAA,CAAuB,IAAI;GAC5C,MAAM,YAAA,GAAWA,MAAAA,OAAAA,CAA4B,IAAI;GACjD,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAAO,IAAI;GAE7B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,SAAS,UAAe,UAAU;IAC9D,SAAS,SAAS,MAAM;GAC1B,GAAG,CAAC,CAAC;GAEL,MAAM,QAAQ,MAAM,KAAK;GACzB,CAAA,GAAA,MAAA,gBAAA,OAAsB;IACpB,MAAM,KAAK,SAAS;IACpB,IAAI,OAAO,MAAM;IACjB,IAAI,UAAU,SAAS,GAAG,YAAY,GAAG;GAC3C,GAAG;IAAC;IAAO,OAAO;IAAQ;GAAO,CAAC;GAElC,MAAM,iBAAuB;IAC3B,MAAM,KAAK,SAAS;IACpB,IAAI,OAAO,MAAM;IACjB,UAAU,UAAU,GAAG,eAAe,GAAG,YAAY,GAAG,eAAeH;GACzE;GAEA,MAAM,UAAA,GAASI,MAAAA,YAAAA,EAAa,SAAuB;IACjD,IAAI,KAAK,KAAK,MAAM,IAAI;IACxB,UAAU,UAAU;IACpB,SAAS,EAAE;IACX,MAAM,KAAK,SAAS;IACpB,IAAI,OAAO,MAAM,GAAG,MAAM,SAAS;IACnC,UAAe,SAAS,IAAI,CAAC,CAAC,cAAc;KAAE,SAAS,SAAS,MAAM;IAAE,CAAC;GAC3E,GAAG,CAAC,CAAC;GAEL,MAAM,iBAAuB;IAC3B,MAAM,KAAK,SAAS;IACpB,IAAI,OAAO,MAAM;IACjB,GAAG,MAAM,SAAS;IAClB,GAAG,MAAM,SAAS,GAAG,KAAK,IAAI,KAAK,GAAG,YAAY,EAAE;GACtD;GAGA,MAAM,OAA6C,CAAC;GACpD,IAAI;GACJ,IAAI;GACJ,KAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,MAAM,MAAM,KAAK,EAAE;IACzB,IAAI,QAAQ,SAAS;KACnB,KAAK,KAAK;MAAE,KAAK,OAAO;MAAO,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAU,UAAA,UAAU,KAAK,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,EAAE,mBAAmB;QAAG,WAAW,EAAE,uBAAuB;OAAE,CAAC;MAAO,CAAA;KAAE,CAAC;KAC/K,UAAU;IACZ;IACA,KAAK,KAAK;KAAE,KAAK,KAAK;KAAK,MAAM,WAAW,MAAM,WAAW;IAAE,CAAC;IAChE,IAAI,KAAK,SAAS,SAAS,cAAc;SACpC,IAAI,KAAK,SAAS,WAAW,cAAc;GAClD;GAEA,SAAS,WAAW,MAAmB,SAAuD;IAC5F,QAAQ,KAAK,MAAb;KACE,KAAK,SACH,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAoB,8BAA2B;MAAQ,gCAA8B,KAAK,QAAQ;MAAjH,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACG,KAAK,WAAW,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAU;QAAgB,UAAA,EAAE,qBAAqB,EAAE,MAAM,OAAO,SAAS,KAAK,OAAO,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC;OAAQ,CAAA,IAAI,MAC3J,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,YAAY,KAAK,EAAE,EAAQ,CAAA,CAC/B;MACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAc,UAAA,KAAK;MAAU,CAAA,CACzC;;KAET,KAAK,SACH,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAoB,8BAA2B;MAA9D,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;SAAyC,eAAA;SAAY,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD,EAAgB,MAAM,GAAK,CAAA;QAAO,CAAA;QACvG,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,YAAY,KAAK,EAAE,EAAQ,CAAA;QACjC,YAAY,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;SAAgB,UAAA,EAAE,iBAAiB;QAAQ,CAAA,IAAI;OACrF;MACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAc,UAAA,KAAK;MAAU,CAAA,CACzC;;KAET,KAAK,WAAW;MACd,MAAM,OAAO,OAAO,SAAS,KAAK,IAAI,KAAK,IAAI;MAC/C,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAmB,8BAA2B;OAC3D,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;QAAY,MAAK;QAAS,UAAU;QAAG,eAAe;SAAE,WAAW,KAAK,EAAE;QAAE;QAAG,YAAY,MAAM;SAAE,IAAI,EAAE,QAAQ,SAAS,WAAW,KAAK,EAAE;QAAE;QAA7J,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;SAAf,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,sBAAsB,EAAE,MAAM,GAAG,CAAC,EAAQ,CAAA;UAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,KAAQ,CAAA;UAChE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAM,MAAG,YAAY,KAAK,EAAE,CAAQ,EAAA,CAAA;UACnC,KAAK,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAM,MAAG,EAAE,aAAa,CAAQ,EAAA,CAAA,IAAI;UACjD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,OAAO,EAAE,YAAY,OAAO;WAAG,WAAU;WAAc,UAAA,EAAE,iBAAiB;UAAQ,CAAA;SACrF;QACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAU;SAAkB,UAAA,KAAK;QAAU,CAAA,CAC7C;;MACF,CAAA;KAET;KACA,KAAK,QAAQ;MACX,MAAM,OAAO,OAAO,SAAS,KAAK,EAAE;MACpC,MAAM,QAAQ,KAAK,YAAY,KAAA,IAC3B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAgB,UAAA,EAAE,yBAAyB;MAAQ,CAAA,IACnE,KAAK,YAAY,SACf,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAsB,UAAA,KAAK,OAAO,EAAE,sBAAsB,IAAI,EAAE,sBAAsB;MAAQ,CAAA,IAC9G,KAAK,YAAY,iBACf,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAwB,UAAA,EAAE,uBAAuB;MAAQ,CAAA,IACzE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CAAuC,KAAK,YAAY,WAAW,EAAE,wBAAwB,IAAI,EAAE,yBAAyB,GAAG,KAAK,WAAW,KAAA,IAAY,KAAK,MAAM,KAAK,QAAe;;MAClM,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAmB,8BAA2B;OAAO,8BAA4B,KAAK,WAAW;OAC9G,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;SAAf,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,mBAAmB,EAAE,MAAM,GAAG,CAAC,EAAQ,CAAA;UAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,KAAQ,CAAA;UAC7D,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAM,MAAG,YAAY,KAAK,EAAE,CAAQ,EAAA,CAAA;UACnC;UACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAU;WAAa,OAAO,EAAE,YAAY,OAAO;WAAG,eAAe;YAAE,WAAW,KAAK,EAAE;WAAE;WAAI,UAAA,EAAE,iBAAiB;UAAU,CAAA;SAC/I;QACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAU;SAAoB,UAAA,KAAK;QAAU,CAAA,CAC/C;;MACF,CAAA;KAET;KACA,KAAK,QAAQ;MACX,MAAM,OAAO,OAAO,SAAS,KAAK,EAAE;MACpC,MAAM,OAAO,KAAK,SAAS,mBAAmB,EAAE,4BAA4B,EAAE,KAAK,CAAC,IAAI,KAAK,SAAS,mBAAmB,EAAE,4BAA4B,EAAE,KAAK,CAAC,IAAI,EAAE,0BAA0B,EAAE,KAAK,CAAC;MACvM,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAqB,8BAA2B;OAAO,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;QAAf,UAAA;SAA8B;SAAK;SAAI,YAAY,KAAK,EAAE;QAAO;;MAAM,CAAA;KACtJ;KACA,KAAK,eACH,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAqB,8BAA2B;MAA/D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAuB,UAAA,EAAE,yBAAyB,EAAE,QAAQ,KAAK,YAAY,KAAA,IAAY,KAAK,SAAS,GAAG,KAAK,OAAO,KAAK,KAAK,UAAU,CAAC;MAAQ,CAAA,GACnK,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAe,UAAA,EAAE,mBAAmB;MAAQ,CAAA,CACzD;;KAET,SACE,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAA,kBAAA,UAAA,CAAI,CAAA;IACf;GACF;GAEA,MAAM,aAAa,OAAO;GAE1B,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAAc,6BAA0B;IAAQ,gCAA8B,UAAU,YAAY;IAAQ,OAAO,EAAE,UAAU,WAAW;IAA7J,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,WAAU;MAAlB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAU;QAAyC,eAAA;QAAY,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD,EAAgB,MAAM,GAAK,CAAA;OAAO,CAAA;OACvG,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,OAAO;SAAE,MAAM;SAAG,UAAU;SAAG,SAAS;QAAO;QAApD,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAU;SAAqB,UAAA,EAAE,UAAU;QAAO,CAAA,GACvD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAW,aAAa,UAAU,aAAa;UAAM,eAAA;SAAa,CAAA,GACvE,MAAM,cAAc,KAAA,IAAY,EAAE,wBAAwB,IAAI,UAAU,EAAE,sBAAsB,IAAI,EAAE,mBAAmB,CACvH;QACF,CAAA,CAAA;;OACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;QACZ,UAAA,MAAM,cAAc,KAAA,IAEjB,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,SAAD;SAAS,OAAO,EAAE,oBAAoB;SAAG,MAAK;SAC5C,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAU;UAAc,eAAe;WAAE,cAAc,MAAM,SAAU;UAAE;UAAG,kCAAA;UAAlG,UAAA;WACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,sBAAD,EAAsB,MAAM,GAAK,CAAA;WAAC;WAAE,EAAE,eAAe;UAC/C;;QACD,CAAA,IAET;OACD,CAAA;MACC;;KACP,OAAO,SAAS,KAAK,eAAe,KAAA,IAEjC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAa,iCAA+B,OAAO;MAAlE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO,OAAO,CAAC,EAAQ,CAAA,GACtD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAU;OAAa,eAAe;QAAE,WAAW,WAAW,EAAE;OAAE;OAAI,UAAA,EAAE,oBAAoB,EAAE,MAAM,WAAW,KAAK,CAAC;MAAU,CAAA,CAClJ;KAEL,CAAA,IAAA;KACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,KAAK;MAAU,WAAU;MAAsB;MAAU,gCAAA;MAC5D,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACG,CAAC,MAAM,UAAU,MAAM,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;SAAW,OAAO;UAAE,WAAW;UAAU,UAAU;SAAG;SAAI,UAAA,EAAE,qBAAqB;QAAQ,CAAA,IAAI;QAC9I,MAAM,UAAU,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,OAAO;UAAE,WAAW;UAAU,UAAU;UAAI,OAAO;SAAuC;SAAI,UAAA,EAAE,kBAAkB,EAAE,SAAS,MAAM,MAAM,CAAC;QAAQ,CAAA,IAAI;QACxL,MAAM,UAAU,MAAM,WAAW,KAAK,OAAO,WAAW,IAErD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;SAAW,+BAAA;SAA1B,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD,EAAgB,MAAM,GAAK,CAAA;UAC3B,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;WAAK,WAAU;WAAkB,UAAA,EAAE,mBAAmB;UAAO,CAAA;UAC7D,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,kBAAkB,EAAK,CAAA;SAC1B;QAEL,CAAA,IAAA;QACH,KAAK,KAAI,QAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAmB,OAAO,EAAE,SAAS,WAAW;SAAI,UAAA,IAAI;QAAU,GAAxD,IAAI,GAAoD,CAAC;QACnF,OAAO,KAAI,MAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAsB,OAAO;SAAM;SAAG,YAAA;SAAuB;QAAa,GAA1D,EAAE,EAAwD,CAAC;QAC3F,UAEG,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAU;SAAoB,iCAAA;SACjC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAU;UAAY,OAAO,EAAE,SAAS,QAAQ;UAArD,UAAA,CAAwD,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAU;WAAhB,UAAA;YAAiC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,CAAO,CAAA;YAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,CAAO,CAAA;YAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,CAAO,CAAA;WAAO;UAAE,CAAA,GAAA,EAAE,gBAAgB,CAAO;;QAC/I,CAAA,IAEL;OACD;;KACF,CAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QACE,KAAK;QACL,WAAU;QACV,MAAM;QACN,OAAO;QACP,aAAa,EAAE,4BAA4B;QAC3C,WAAW,MAAM;SAAE,SAAS,EAAE,OAAO,KAAK;SAAG,SAAS;QAAE;QACxD,YAAY,MAAM;SAChB,IAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,aAAa;UAClE,EAAE,eAAe;UACjB,OAAO,KAAK;SACd;QACF;QACA,iCAAA;OACD,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;QAAQ,SAAQ;QAAU,MAAK;QAAK,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,mBAAD,EAAmB,MAAM,GAAK,CAAA;QAAG,UAAU,MAAM,KAAK,MAAM,MAAM,MAAM;QAAa,eAAe;SAAE,OAAO,KAAK;QAAE;QAAG,6BAAA;QAC9J,UAAA,MAAM,cAAc,EAAE,2BAA2B,IAAI,EAAE,oBAAoB;OACtE,CAAA,CACL;MACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAoB,UAAA,EAAE,qBAAqB;MAAQ,CAAA,CAChE;;IACE;;EAEb;;;;;;;;;;;;;;ECrOA,SAASC,YAA2D;GAClE,MAAM,CAAC,QAAQ,cAAA,GAAaC,MAAAA,SAAAA,CAAS,KAAK;GAQ1C,OAAO,CAAC,SAAA,GAPKC,MAAAA,YAAAA,EAAa,SAAiB;IACzC,CAAA,GAAKC,sCAAAA,eAAAA,CAAe,IAAI,CAAC,CAAC,MAAM,OAAO;KACrC,IAAI,CAAC,IAAI;KACT,UAAU,IAAI;KACd,iBAAiB;MAAE,UAAU,KAAK;KAAE,GAAG,IAAI;IAC7C,CAAC;GACH,GAAG,CAAC,CACe,CAAC;EACtB;EAEA,SAAS,IAAI,EAAE,QAAQ,QAAQ,UAAU,GAAG,YAMzC;GACD,MAAM,SAAS,OAAO,SAAS;GAC/B,MAAM,SAAS,OAAO,UAAU;GAChC,MAAM,UAAU,SAAS,EAAE,cAAc,IAAI,UAAU,OAAO,QAAQ;GACtE,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;IACE,MAAK;IACL,WAAW,SAAS,WAAW,iBAAiB;IAChD,SAAS;IACT,gBAAc;IACd,+BAA6B,OAAO;IACpC,4BAA0B,WAAW,SAAS,KAAA;IAC9C,8BAA4B,SAAS,IAAI,SAAS,KAAA;IAPpD,UAAA,CASE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAAM,WAAU;KAAhB,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAY,eAAA;OAAa,UAAA,OAAO,KAAK,MAAM,GAAG,CAAC;MAAQ,CAAA;MACvE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAW,cAAc,OAAO,WAAW,OAAO,eAAe;OAAM,OAAO,OAAO,WAAW,OAAO,EAAE,cAAc,IAAI,EAAE,eAAe;MAAI,CAAA;MACrJ,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAW,0BAAwB,OAAO;OAAS,UAAA,OAAO,SAAS,KAAK,QAAQ,OAAO;MAAa,CAAA,IAAI;KAC9H;IACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAAM,WAAU;KAAhB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAU;MAAhB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAU;QAAe,UAAA,OAAO;OAAW,CAAA;OAChD,OAAO,SAAS,KAAA,KAAa,OAAO,SAAS,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAU,MAAM,OAAO;QAAS;OAAI,CAAA,IAAI;OAChG,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAU;QAAe,UAAA,UAAU,OAAO,MAAM;OAAQ,CAAA;MAC1D;KACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAW,iBAAiB,SAAS,eAAe;MAA1D,UAAA,CACG,SAAS,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CAA4B,EAAE,mBAAmB,GAAE,GAAO;MAAI,CAAA,IAAA,MAC3E,YAAY,KAAK,EAAE,kBAAkB,IAAI,OACtC;KACF,CAAA,CAAA;IACA,CAAA,CAAA;GACN,CAAA,EAAA,CAAA;EAER;EAEA,SAAgB,WAAW,EAAE,GAAG,UAAU,UAAU,YAAY,WAA4B;GAC1F,MAAM,OAAA,GAAMC,MAAAA,qBAAAA,CAAqB,aAAa,WAAW,aAAa,WAAW;GACjF,MAAM,QAAA,GAAOA,MAAAA,qBAAAA,CAAqB,UAAU,WAAW,UAAU,WAAW;GAC5E,MAAM,EAAE,UAAU;GAClB,MAAM,WAAW,IAAI,OAAO,YAAY;GACxC,MAAM,SAAS,IAAI,UAAU,IAAI,OAAO;GACxC,MAAM,CAAC,QAAQ,QAAQJ,UAAQ;GAC/B,MAAM,CAAC,OAAO,aAAA,GAAYC,MAAAA,SAAAA,CAAS,EAAE;GACrC,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,EAAE;GACvC,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,EAAE;GACzC,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GAC9D,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAA6D,KAAA,CAAS;GAC9F,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAAS,KAAK;GACtD,MAAM,OAAO,SAAS,MAAM,SAAS,KAAK;GAC1C,MAAM,QAAQ,YAAY,MAAM,OAAO;GACvC,MAAM,SAAS,MAAM,OAAO;GAC5B,MAAM,eAAe,KAAK,MAAM,WAAW,aAAa,KAAK,MAAM,KAAK,WAAW,KAAK,MAAM;GAC9F,MAAM,gBAAgB,aAAa;GAEnC,MAAM,MAAM,OAAO,KAAa,WAA6D;IAC3F,QAAQ,GAAG;IACX,QAAQ,KAAA,CAAS;IACjB,IAAI;KACF,MAAM,KAAK,MAAM,OAAO;KACxB,IAAI,OAAO,KAAA,GAAW,QAAQ;MAAE,MAAM;MAAM,MAAM;KAAG,CAAC;KACtD,MAAM,aAAa,QAAQ;IAC7B,SAAS,GAAY;KACnB,QAAQ;MAAE,MAAM;MAAS,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;KAAE,CAAC;IAC7E,UAAU;KACR,QAAQ,KAAA,CAAS;IACnB;GACF;GAEA,MAAM,kBAAwB;IAC5B,IAAI,SAAS,KAAA,KAAa,OAAO,KAAK,MAAM,MAAM,aAAa,MAAM;IACrE,IAAS,OAAO,YAAY;KAC1B,MAAM,EAAE,WAAW,MAAM,IAAI,UAAU,OAAO,KAAK,GAAG,QAAQ,KAAK,MAAM,KAAK,KAAA,IAAY,QAAQ,KAAK,CAAC;KACxG,UAAU,EAAE;KACZ,WAAW,EAAE;KACb,OAAO,EAAE,qBAAqB,EAAE,MAAM,OAAO,KAAK,CAAC;IACrD,CAAC;GACH;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;IAAO,WAAU;IAAc,6BAAA;IAA/B,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,OAAO;SAAE,MAAM;SAAG,UAAU;SAAG,SAAS;SAAQ,KAAK;QAAE;QAA5D,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;SAAf,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,OAAO;YAAE,UAAU;YAAU,cAAc;YAAY,YAAY;WAAS;WAAI,UAAA,UAAU,QAAQ,EAAE,YAAY;UAAQ,CAAA;UAC7H,QAAQ,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAU;WAAW,gCAA8B;WAAQ,UAAA,QAAQ,KAAK,QAAQ;UAAY,CAAA,IAAI;UAClH,SAAS,IAEN,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,SAAD;WAAS,OAAO,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;WAAG,MAAK;WAC1D,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;YAAM,WAAU;YAAyB,qCAAmC;YAA5E,UAAA;aAAqF,EAAE,mBAAmB;aAAE;aAAE;YAAa;;UACpH,CAAA,IAET;SACD;QACJ,CAAA,GAAA,aAAa,OAEV,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;SAAW,OAAO;UAAE,SAAS;UAAQ,YAAY;UAAU,KAAK;UAAG,UAAU;UAAG,UAAU;SAAG;SAAG,iCAAA;SAA/G,UAAA;UACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,OAAO;YAAE,YAAY;YAAuD,SAAS;WAAK;WAAhG,UAAA,CAAoG,SAAS,GAAG,MAAM,GAAG,EAAE,GAAE,GAAO;;UACpI,iBAAA,GAAA,kBAAA,IAAA,CAACA,sCAAAA,SAAD;WAAS,OAAO,SAAS,EAAE,mBAAmB,IAAI,EAAE,iBAAiB;WAAG,MAAK;WAC3E,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,MAAK;YAAS,WAAU;YAAa,cAAY,EAAE,iBAAiB;YAAG,eAAe;aAAE,KAAK,SAAS,OAAO;YAAE;YACpH,UAAA,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,oBAAD,EAAoB,MAAM,GAAK,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,mBAAD,EAAmB,MAAM,GAAK,CAAA;WACrE,CAAA;UACD,CAAA;UACR,MAAM,QAAQ,SAAS,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,OAAO,EAAE,OAAO,sCAAsC;WAAI,UAAA,EAAE,yBAAyB,EAAE,GAAG,MAAM,QAAQ,OAAO,CAAC;UAAQ,CAAA,IAAI;SAC3J;QAEL,CAAA,IAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;SAAW,OAAO,EAAE,UAAU,GAAG;SAAI,UAAA,QAAQ,UAAU,WAAW,WAAW,KAAA,IAAY,EAAE,kBAAkB,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,kBAAkB,OAAO,OAAO,EAAE,CAAC;QAAQ,CAAA,CAC7M;;OACL,iBAAA,GAAA,kBAAA,IAAA,CAACF,sCAAAA,SAAD;QAAS,OAAO,EAAE,gBAAgB;QAAG,MAAK;QACxC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAU;SAAc,cAAY,EAAE,gBAAgB;SAAG,iBAAe;SAAc,eAAe;UAAE,iBAAgB,MAAK,CAAC,CAAC;SAAE;SAAG,wCAAA;SACtJ,UAAA,EAAE,eAAe;QACZ,CAAA;OACD,CAAA;OACT,iBAAA,GAAA,kBAAA,IAAA,CAACA,sCAAAA,SAAD;QAAS,OAAO,EAAE,kBAAkB;QAAG,MAAK;QAC1C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAU;SAAa,cAAY,EAAE,kBAAkB;SAAG,eAAe;UAAE,aAAkB,QAAQ;SAAE;SAC3H,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,sCAAAA,sBAAD,EAAsB,MAAM,GAAK,CAAA;QAC3B,CAAA;OACD,CAAA;OACT,iBAAA,GAAA,kBAAA,IAAA,CAACH,sCAAAA,SAAD;QAAS,OAAO,EAAE,YAAY;QAAG,MAAK;QACpC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAU;SAAa,cAAY,EAAE,YAAY;SAAG,SAAS;SAAS,8BAAA;SAC1F,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,oBAAD,EAAoB,MAAM,GAAK,CAAA;QACzB,CAAA;OACD,CAAA;MACN;;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAU;MACb,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,MAAM;QAAG,KAAK;QAAG,UAAU;OAAE;OAAnF,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,qBAAD,EAAqB,MAAM,GAAK,CAAA,GAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QACE,WAAU;QACV,aAAa,EAAE,aAAa;QAC5B,OAAO;QACP,WAAW,MAAM;SAAE,SAAS,EAAE,OAAO,KAAK;QAAE;QAC5C,cAAY,EAAE,aAAa;QAC3B,+BAAA;OACD,CAAA,CACG;;KACH,CAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACG,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD,EAAmB,EAAI,CAAA,IAAI;OAC3C,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAI,OAAO;SAAE,WAAW;SAAQ,QAAQ;SAAG,SAAS;QAAE;QACpD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;SACE,MAAK;SACL,WAAW,sBAAsB,gBAAgB,iBAAiB;SAClE,eAAe;UAAE,SAAS,SAAS;SAAE;SACrC,gBAAc;SACd,8BAAA;SACA,4BAA0B,gBAAgB,SAAS,KAAA;SANrD,UAAA,CAQE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,WAAU;UAAhB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAU;WAA4B,eAAA;WAAY,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD,EAAgB,MAAM,GAAK,CAAA;UAAO,CAAA,GACzF,SAAS,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAU;WAAW,gCAA8B;WAAS,UAAA;UAAa,CAAA,IAAI,IAC7F;SACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,WAAU;UAAhB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAU;WACd,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;YAAM,WAAU;YAAhB,UAAA;aAA+B,EAAE,UAAU;aAAE;aAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;cAAM,WAAW,aAAa,eAAe,aAAa;cAAM,eAAA;aAAa,CAAA;YAAO;;UAC9H,CAAA,GACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAU;WAAkB,UAAA,eAAe,EAAE,sBAAsB,IAAI,SAAS,IAAI,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,gBAAgB;UAAQ,CAAA,CACvJ;SACA,CAAA,CAAA;QACN,CAAA,EAAA,CAAA;OACF,CAAA;OACH,MAAM,QAAQ,SAAS,IAEpB,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;QAAf,UAAA;SAA6B,EAAE,cAAc;SAAE;SAAI,MAAM,QAAQ;QAAY;OAC7E,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAI,OAAO;SAAE,WAAW;SAAQ,QAAQ;SAAG,SAAS;QAAE;QACnD,UAAA,MAAM,QAAQ,KAAI,MACjB,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;SAAe,WAAU;SAAS,gCAA8B,EAAE;SAAlE,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAU;WAAyB,eAAA;WAAa,UAAA,EAAE,KAAK,MAAM,GAAG,CAAC;UAAQ,CAAA;UAC/E,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAU;WAAhB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;YAAM,WAAU;YAAhB,UAAA,CAA+B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,WAAU;aAAe,UAAA,EAAE;YAAW,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,WAAU;aAAe,UAAA,EAAE,cAAc,KAAA,IAAY,KAAK,UAAU,KAAK,MAAM,EAAE,SAAS,CAAC;YAAQ,CAAA,CAAO;WAC5L,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAU;YAAkB,UAAA,EAAE,aAAa,KAAK,EAAE,0BAA0B,IAAI,UAAU,EAAE,QAAQ;WAAQ,CAAA,CAC9G;;UACN,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAU;WAAhB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACL,sCAAAA,SAAD;YAAS,OAAO,EAAE,yBAAyB;YAAG,MAAK;YACjD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aACE,MAAK;aACL,WAAU;aACV,cAAY,EAAE,yBAAyB;aACvC,UAAU,SAAS,KAAA;aACnB,eAAe;cACb,IAAS,UAAU,EAAE,MAAM,YAAY;eACrC,MAAM,IAAI,MAAM,IAAI,OAAO,EAAE,EAAE;eAC/B,aAAa,EAAE,OAAO,EAAE;eACxB,OAAO,EAAE,0BAA0B,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC;cAC5D,CAAC;aACH;aAEA,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,oBAAD,EAAoB,MAAM,GAAK,CAAA;YACzB,CAAA;WACD,CAAA,GACT,iBAAA,GAAA,kBAAA,IAAA,CAACD,sCAAAA,SAAD;YAAS,OAAO,EAAE,yBAAyB;YAAG,MAAK;YACjD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aAAQ,MAAK;aAAS,WAAU;aAAa,cAAY,EAAE,yBAAyB;aAAG,UAAU,SAAS,KAAA;aAAW,eAAe;cAAE,IAAS,UAAU,EAAE,MAAM,YAAY;eAAE,MAAM,IAAI,OAAO,EAAE,EAAE;cAAoB,CAAC;aAAE;aACzN,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,sCAAAA,iBAAD,EAAiB,MAAM,GAAK,CAAA;YACtB,CAAA;WACD,CAAA,CACL;;SACJ;QA9BK,GAAA,EAAE,EA8BP,CACL;OACC,CAAA,CACJ,EAAA,CAAA,IAEF;OACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CAA6B,EAAE,cAAc,GAAG,MAAM,QAAQ,SAAS,IAAI,MAAM,MAAM,QAAQ,WAAW,EAAQ;;OACjH,MAAM,QAAQ,WAAW,IACtB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAU;QAAW,OAAO;SAAE,QAAQ;SAAG,SAAS;SAAiB,UAAU;QAAG;QAAG,mCAAA;QAAiC,UAAA,aAAa,OAAO,EAAE,iCAAiC,IAAI,EAAE,sBAAsB;OAAK,CAAA,IAC/M,KAAK,WAAW,IACd,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAU;QAAW,OAAO;SAAE,QAAQ;SAAG,SAAS;SAAiB,UAAU;QAAG;QAAI,UAAA,EAAE,sBAAsB,EAAE,MAAM,CAAC;OAAK,CAAA,IAE7H,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAI,OAAO;SAAE,WAAW;SAAQ,QAAQ;SAAG,SAAS;QAAE;QAAG,gCAAA;QACtD,UAAA,KAAK,KAAI,MACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAEE,QAAQ;SACR,QAAQ,MAAM,OAAO,EAAE,QAAQ,QAAQ,EAAE,WAAW;SACpD,UAAU,EAAE,OAAO;SAChB;SACH,gBAAgB;UAAE,SAAS,EAAE,EAAE;SAAE;QAClC,GANM,EAAE,EAMR,CACF;OACC,CAAA;MAEP;;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;QAAa,OAAO,EAAE,SAAS,UAAU;QAAI,UAAA,EAAE,UAAU;OAAO,CAAA;OAC/E,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QACE,WAAU;QACV,aAAa,EAAE,cAAc;QAC7B,OAAO;QACP,UAAU,aAAa;QACvB,WAAW,MAAM;SAAE,UAAU,EAAE,OAAO,KAAK;QAAE;QAC7C,YAAY,MAAM;SAAE,IAAI,EAAE,QAAQ,SAAS,UAAU;QAAE;QACvD,4BAAA;OACD,CAAA;OACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,KAAK;SAAG,YAAY;QAAS;QAA5D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SACE,WAAU;SACV,aAAa,EAAE,eAAe;SAC9B,OAAO;SACP,UAAU,aAAa;SACvB,WAAW,MAAM;UAAE,WAAW,EAAE,OAAO,KAAK;SAAE;SAC9C,YAAY,MAAM;UAAE,IAAI,EAAE,QAAQ,SAAS,UAAU;SAAE;QACxD,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;SAAQ,SAAQ;SAAU,MAAK;SAAK,UAAU,SAAS,KAAA,KAAa,OAAO,KAAK,MAAM,MAAM,aAAa;SAAM,SAAS;SACrH,UAAA,EAAE,eAAe;QACZ,CAAA,CACL;;OACJ,SAAS,KAAA,IACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAI,OAAO,KAAK,SAAS,UAAU,yCAAyC;QAAmC;QAAG,MAAM,KAAK,SAAS,UAAU,UAAU,KAAA;QAAY,UAAA,KAAK,SAAS,UAAU,EAAE,kBAAkB,EAAE,SAAS,KAAK,KAAK,CAAC,IAAI,KAAK;OAAW,CAAA,IACrR,IAAI,UAAU,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAI,OAAO;QAAuC;QAAI,UAAA,EAAE,kBAAkB,EAAE,SAAS,IAAI,MAAM,CAAC;OAAQ,CAAA,IAAI;MAChK;;IACA;;EAEX;;;;;;;;;;;;;;;;EC9QA,MAAM,eAAe;EAErB,SAAS,YAAY,GAAc,OAAuD;GACxF,QAAQ,MAAM,QAAd;IACE,KAAK,WAAW,OAAO;KAAE,MAAM,EAAE,qBAAqB;KAAG,QAAQ;IAAM;IACvE,KAAK,UAAU,OAAO;KAAE,MAAM,EAAE,oBAAoB;KAAG,QAAQ;IAAM;IACrE,KAAK,SAAS,OAAO;KAAE,MAAM,EAAE,mBAAmB;KAAG,QAAQ;IAAK;IAClE,KAAK,UAAU,OAAO;KAAE,MAAM,EAAE,sBAAsB,EAAE,SAAS,MAAM,SAAS,GAAG,CAAC;KAAG,QAAQ;IAAK;IAEpG,SAAS,OAAO;KAAE,MAAM,EAAE,kBAAkB;KAAG,QAAQ;IAAM;GAC/D;EACF;EAEA,SAAS,OAAO,EAAE,OAAO,GAAG,IAAI,WAA8F;GAC5H,MAAM,MAAM,MAAM,QAAQ;GAC1B,MAAM,SAAS,MAAM,YAAY,GAAG,KAAK,IAAI,KAAA;GAC7C,MAAM,UAAU,MAAM,WAAW;GACjC,MAAM,SAAS,MAAM,WAAW,YAAY,MAAM,WAAW;GAC7D,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAW,UAAU,MAAM,WAAW;IAAW,0BAAwB,MAAM,QAAQ;IAAM,uBAAqB,MAAM,MAAM,IAAI,MAAM,MAAM,KAAA;IAAnJ,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAW,YAAY,UAAU,gBAAgB,KAAK,SAAS,eAAe;KAAnF,UAAA,CACG,MAAM,MACN,MAAM,iBAAiB,KAAA,IAAY,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,OAAO;OAAE,UAAU;OAAI,SAAS;OAAK,WAAW;MAAE;MAAvD,UAAA,CAA0D,OAAI,EAAE,0BAA0B,EAAE,MAAM,MAAM,aAAa,CAAC,CAAO;KAAI,CAAA,IAAA,IAClK;IACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACG,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,aAAa,EAAQ,CAAA,IAAI;MACxC,MAAM,SAAS,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,aAAa,EAAQ,CAAA,IAAI;MACzD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,YAAY,MAAM,EAAE,EAAQ,CAAA;MAClC,WAAW,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAW,OAAO,SAAS,qBAAqB,KAAA;OAAW,0BAAwB,MAAM,UAAU;OAAS,UAAA,OAAO;MAAW,CAAA,IAAI;MAC/J,MAAM,WAAW,YAAY,MAAM,aAAa,KAAA,IAE7C,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAU;OAAa,eAAe;QAAE,MAAM,OAAO,UAAU,QAAQ,IAAI,MAAM,QAAS;QAAG,IAAI,SAAS,KAAA,GAAW,QAAQ,IAAI;OAAE;OAAI,UAAA,EAAE,mBAAmB;MAAU,CAAA,GAC5L,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAU;OAAa,eAAe;QAAE,UAAU,QAAQ,IAAI,MAAM,QAAS;OAAE;OAAI,UAAA,EAAE,qBAAqB;MAAU,CAAA,CAC1I,EAAA,CAAA,IAEF;KACD;IACF,CAAA,CAAA;;EAET;EAEA,SAAgB,WAAW,EAAE,GAAG,QAAQ,SAAS,WAAW,cAA+B;GACzF,MAAM,KAAK,OAAO;GAClB,MAAM,QAAA,GAAOC,MAAAA,qBAAAA,CAAqB,UAAU,WAAW,UAAU,WAAW;GAC5E,MAAM,OAAA,GAAMA,MAAAA,qBAAAA,CAAqB,aAAa,WAAW,aAAa,WAAW;GACjF,MAAM,SAAsB,KAAK,QAAQ,OAAO;IAAE,SAAS,CAAC;IAAG,QAAQ;IAAG,UAAU;IAAO,SAAS;IAAO,QAAQ;GAAM;GACzH,MAAM,SAAS,UAAU,IAAI,OAAO,EAAE;GACtC,MAAM,cAAc,IAAI,OAAO;GAC/B,MAAM,SAAS,IAAI,MAAM,OAAO,QAAQ;GACxC,MAAM,CAAC,UAAU,gBAAA,GAAeC,MAAAA,SAAAA,CAAS,KAAK;GAC9C,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAAS,KAAK;GACtD,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;GAC1C,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,EAAE;GAC7C,MAAM,YAAA,GAAWC,MAAAA,OAAAA,CAAuB,IAAI;GAC5C,MAAM,gBAAA,GAAeA,MAAAA,OAAAA,CAAuB,IAAI;GAChD,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAAO,IAAI;GAC7B,MAAM,gBAAA,GAAeA,MAAAA,OAAAA,CAA2B,KAAA,CAAS;GACzD,MAAM,cAAA,GAAaA,MAAAA,OAAAA,CAAO,CAAC;GAG3B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,YAAY,KAAK;IACjB,gBAAgB,KAAK;IACrB,aAAa,EAAE;IACf,UAAU,UAAU;IACpB,IAAI,CAAE,UAAU,OAAO,EAAE,CAAC,CAAC,QAAS,UAAe,KAAK,EAAE;GAC5D,GAAG,CAAC,EAAE,CAAC;GAGP,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,UAAU;IACf,MAAM,SAAS,MAA2B;KAAE,IAAI,EAAE,QAAQ,UAAU,YAAY,KAAK;IAAE;IACvF,SAAS,iBAAiB,WAAW,KAAK;IAC1C,aAAa;KAAE,SAAS,oBAAoB,WAAW,KAAK;IAAE;GAChE,GAAG,CAAC,QAAQ,CAAC;GAGb,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,YAAY;IAChB,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,aAAa;KAAE,IAAI,CAAC,WAAW,aAAa,cAAc,MAAM;IAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAC9G,aAAa;KAAE,YAAY;IAAK;GAClC,GAAG,CAAC,EAAE,CAAC;GAGP,MAAM,SAAS,OAAO;GACtB,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,SAAS;IACd,IAAI,OAAO,aAAa,eAAe,SAAS,oBAAoB,WAAW;IAC/E,IAAI,WAAW,GAAG;IAClB,aAAkB,SAAS,EAAE;GAC/B,GAAG;IAAC;IAAI;IAAQ;IAAS,OAAO,QAAQ;GAAM,CAAC;GAC/C,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,WAAW,OAAO,aAAa,aAAa;IACjD,MAAM,qBAA2B;KAAE,IAAI,SAAS,oBAAoB,WAAW,aAAkB,SAAS,EAAE;IAAE;IAC9G,SAAS,iBAAiB,oBAAoB,YAAY;IAC1D,aAAa;KAAE,SAAS,oBAAoB,oBAAoB,YAAY;IAAE;GAChF,GAAG,CAAC,IAAI,OAAO,CAAC;GAIhB,MAAM,UAAU,OAAO;GACvB,MAAM,WAAW,QAAQ,MAAK,MAAK,EAAE,MAAM,CAAC,CAAC,EAAE;GAC/C,CAAA,GAAA,MAAA,gBAAA,OAAsB;IACpB,MAAM,KAAK,SAAS;IACpB,IAAI,OAAO,MAAM;IACjB,IAAI,aAAa,YAAY,KAAA,KAAa,aAAa,KAAA,KAAa,WAAW,aAAa,SAC1F,GAAG,aAAa,GAAG,eAAe,WAAW;SACxC,IAAI,UAAU,SACnB,GAAG,YAAY,GAAG;IAEpB,aAAa,UAAU;IACvB,WAAW,UAAU,GAAG;GAC1B,GAAG;IAAC;IAAS;IAAQ;IAAU;IAAI,OAAO;GAAM,CAAC;GAEjD,MAAM,iBAAuB;IAC3B,MAAM,KAAK,SAAS;IACpB,IAAI,OAAO,MAAM;IACjB,UAAU,UAAU,GAAG,eAAe,GAAG,YAAY,GAAG,eAAe;IACvE,IAAI,GAAG,YAAY,MAAM,CAAC,OAAO,YAAY,CAAC,OAAO,WAAW,OAAO,QAAQ,UAAe,UAAU,EAAE;GAC5G;GAEA,MAAM,MAAM,OAAO,WAAW,KAAA,IAAY,KAAK,UAAU,OAAO,MAAM;GACtE,MAAM,WAAW,OAAO,WAAW,OAC/B,EAAE,oBAAoB,IACtB,QAAQ,KAAK,EAAE,qBAAqB,IAAI,GAAG,EAAE,qBAAqB,EAAE,KAAK,QAAQ,QAAQ,EAAE,0BAA0B,IAAI,EAAE,wBAAwB,EAAE,IAAI,CAAC;GAC9J,MAAM,OAAO,kBAAkB,OAAO;GACtC,MAAM,OAAO,OAAO,WAAW,KAAA,KAAa,OAAO,WAAW,OAAO,OAAO,OAAO,SAAS,KAAA;GAE5F,MAAM,kBAAwB;IAC5B,MAAM,OAAO,UAAU,KAAK;IAC5B,IAAI,SAAS,IAAI;IACjB,aAAa,EAAE;IACf,UAAU,UAAU;IACpB,UAAe,KAAK,IAAI,IAAI;GAC9B;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAAc,6BAA2B;IAAI,4BAAA;IAAyB,OAAO,EAAE,UAAU,WAAW;IAAvH,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,WAAU;MAAlB,UAAA;OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAU;QAAhB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;SAAyB,eAAA;SAAa,UAAA,OAAO,KAAK,MAAM,GAAG,CAAC;QAAQ,CAAA,GACpF,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,WAAW,cAAc,OAAO,WAAW,OAAO,eAAe,KAAO,CAAA,CAC1E;;OACN,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,OAAO;SAAE,MAAM;SAAG,UAAU;SAAG,SAAS;QAAO;QAApD,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAU;SAAqB,UAAA,OAAO;QAAU,CAAA,GACrD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;SAAmB,4BAA0B,OAAO,WAAW,OAAO,WAAW;SAAhG,UAAA;UACG,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,OAAO,EAAE,OAAO,iCAAiC;WAAI,UAAA,EAAE,sBAAsB,EAAE,MAAM,OAAO,KAAK,CAAC;UAAQ,CAAA,IAAI;UAC7H,SAAS,KAAA,IAAY,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAM,MAAG,IAAW,EAAA,CAAA,IAAI;UAC7C,OAAO,SAAS,KAAA,KAAa,OAAO,SAAS,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAM,MAAG,EAAE,cAAc,OAAO,MAAM,CAAQ,EAAA,CAAA,IAAI;SACvG;QACF,CAAA,CAAA;;OACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAU;SAAc,eAAe;UAAE,aAAY,MAAK,CAAC,CAAC;SAAE;SAAG,iBAAe;SAAU,6BAAA;SAAhH,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,mBAAD,EAAmB,MAAM,GAAK,CAAA;UAAC;UAAE,EAAE,kBAAkB;SAC/C;QACR,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAU;SAAc,UAAU,WAAW;SAAG,eAAe;UAAE,aAAkB,SAAS,EAAE;SAAE;SAAG,kCAAA;SAAzH,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,oBAAD,EAAoB,MAAM,GAAK,CAAA;UAAC;UAAE,EAAE,sBAAsB;SACpD;QACL,CAAA,CAAA;;MACC;;KACR,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAY,MAAK;MAAO,mCAAA;MAAvC,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA;OAAO,EAAE,sBAAsB;OAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,oBAAoB,EAAK,CAAA;OAAE,EAAE,sBAAsB;OAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,wBAAwB,EAAE,MAAM,OAAO,KAAK,CAAC,EAAK,CAAA;OAAE,EAAE,sBAAsB;MAAQ,EAAA,CAAA,GACtL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAU;OAAc,SAAS;OAAW,6BAAA;OAA2B,UAAA,EAAE,kBAAkB;MAAU,CAAA,CACxH;;KACJ,WAEG,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAc,MAAK;MAAS,cAAY,EAAE,0BAA0B,EAAE,MAAM,OAAO,KAAK,CAAC;MAAG,iCAAA;MAA3G,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,0BAA0B,EAAE,MAAM,OAAO,KAAK,CAAC,EAAU,CAAA;OACpE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAU;QAAhB,UAAA,CAA4B,OAAO,YAAY,OAAO,MAAM,SAAS,KAAA,IAAY,MAAM,SAAS,EAAS;;OACzG,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAU;QAAc,gCAAA;QAA8B,UAAA;OAAS,CAAA;OACrE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,KAAK;SAAG,gBAAgB;QAAW;QAAlE,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;SACE,MAAK;SACL,WAAU;SACV,eAAe;UACb,CAAA,GAAKC,sCAAAA,eAAAA,CAAe,EAAE,CAAC,CAAC,MAAM,OAAO;WACnC,IAAI,CAAC,IAAI;WACT,UAAU,IAAI;WACd,iBAAiB;YAAE,UAAU,KAAK;WAAE,GAAG,IAAI;UAC7C,CAAC;SACH;SATF,UAAA;UAWG,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAACD,sCAAAA,oBAAD,EAAoB,MAAM,GAAK,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,mBAAD,EAAmB,MAAM,GAAK,CAAA;UAAE;UAAE,SAAS,EAAE,yBAAyB,IAAI,EAAE,uBAAuB;SAC1I;QACR,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAU;SAAc,eAAe;UAAE,YAAY,KAAK;SAAE;SAAI,UAAA,EAAE,aAAa;QAAU,CAAA,CAC5G;;MACF;KAEL,CAAA,IAAA;KACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,KAAK;MAAU,WAAU;MAAsB;MAAU,+BAAA;MAC5D,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACG,OAAO,UAAU,CAAC,OAAO,WAEtB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAU;SAAsB,OAAO;UAAE,WAAW;UAAU,UAAU;SAAG;SAAG,UAAU,OAAO;SAAS,eAAe;UAAE,UAAe,UAAU,EAAE;SAAE;SACzK,UAAA,OAAO,UAAU,EAAE,qBAAqB,IAAI,EAAE,uBAAuB;QAChE,CAAA,IAER,OAAO,UAAU,QAAQ,SAAS,IAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;SAAW,OAAO;UAAE,WAAW;UAAU,UAAU;SAAG;SAAI,UAAA,EAAE,mBAAmB;QAAQ,CAAA,IACvG;QACL,CAAC,OAAO,UAAU,OAAO,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;SAAW,OAAO;UAAE,WAAW;UAAU,UAAU;SAAG;SAAI,UAAA,EAAE,qBAAqB;QAAQ,CAAA,IAAI;QAChJ,OAAO,UAAU,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,OAAO;UAAE,WAAW;UAAU,UAAU;UAAI,OAAO;SAAuC;SAAI,UAAA,EAAE,kBAAkB,EAAE,SAAS,OAAO,MAAM,CAAC;QAAQ,CAAA,IAAI;QAC1L,OAAO,UAAU,QAAQ,WAAW,KAAK,OAAO,UAAU,KAAA,KAAa,OAAO,WAAW,IACtF,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;SAAW,OAAO;UAAE,WAAW;UAAU,UAAU;UAAI,SAAS;UAAU,WAAW;SAAS;SAAG,qCAAA;SAAmC,UAAA,EAAE,gBAAgB,EAAE,MAAM,OAAO,KAAK,CAAC;QAAQ,CAAA,IACnM;QACH,KAAK,KAAI,QAAO,IAAI,SAAS,QAC1B,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAmB,WAAU;SAAU,UAAA,UAAU,IAAI,IAAI,KAAK,IAAI,GAAG;UAAE,OAAO,EAAE,mBAAmB;UAAG,WAAW,EAAE,uBAAuB;SAAE,CAAC;QAAO,GAA1I,IAAI,GAAsI,IACpJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAsB,OAAO,IAAI;SAAU;SAAO;SAAI,UAAU,SAAS;UAAE,aAAa,IAAI;SAAE;QAAI,GAArF,IAAI,GAAiF,CAAC;QACtG,OAAO,SAAS,IAEb,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,KAAK;SAAc,+BAA6B,OAAO;SAAQ,OAAO,EAAE,SAAS,WAAW;SAAjG,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAU;UAAqB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAU;WAAwB,UAAA,EAAE,sBAAsB,EAAE,GAAG,OAAO,OAAO,CAAC;UAAQ,CAAA;SAAM,CAAA,GACrI,OAAO,KAAI,MAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;UAAsB,OAAO;UAAM;SAAI,GAAvB,EAAE,EAAqB,CAAC,CACtD;QAEL,CAAA,IAAA;OACD;;KACF,CAAA;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAU;MAAY,aAAU;MAAS,+BAA6B,SAAS,OAAO;MACxF,UAAA,SAAS,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAU;OAAhB,UAAA;QAAiC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,CAAO,CAAA;QAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,CAAO,CAAA;QAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,CAAO,CAAA;OAAO;MAAE,CAAA,GAAA,EAAE,sBAAsB,EAAE,MAAM,OAAO,KAAK,CAAC,CAAI,EAAA,CAAA,IAAI;KAC/H,CAAA;KACJ,eAEG,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAD;MACM;MACJ,MAAM,OAAO;MACb,MAAM,OAAO;MACb,cAAc,OAAO,iBAAiB;MACtC,UAAU,OAAO;MACjB,aAAa,aAAa,eAAe;MACzC,SAAS,aAAa,oBAAoB;MACvC;MACH,eAAe;OAAE,gBAAgB,KAAK;MAAE;KACzC,CAAA,IAED;KACH,aAEG,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAc,8BAAA;MAA2B,OAAO,EAAE,eAAe,EAAE;MAAlF,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QACE,WAAU;QACV,MAAM;QACN,OAAO;QACP,aAAa,EAAE,4BAA4B,EAAE,MAAM,OAAO,KAAK,CAAC;QAChE,WAAW,MAAM;SAAE,aAAa,EAAE,OAAO,KAAK;SAAG,IAAI,EAAE,OAAO,MAAM,KAAK,MAAM,IAAI,UAAU,WAAW,EAAE;QAAE;QAC5G,cAAc;SAAE,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,WAAW,EAAE;QAAE;QACtE,YAAY,MAAM;SAChB,IAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,aAAa;UAClE,EAAE,eAAe;UACjB,UAAU;SACZ;QACF;QACA,kCAAA;OACD,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;QAAQ,SAAQ;QAAU,MAAK;QAAK,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,mBAAD,EAAmB,MAAM,GAAK,CAAA;QAAG,UAAU,UAAU,KAAK,MAAM;QAAI,SAAS;QAAW,qCAAA;QAC/H,UAAA,EAAE,mBAAmB;OAChB,CAAA,CACL;MACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAoB,UAAA,EAAE,wBAAwB,EAAE,MAAM,OAAO,KAAK,CAAC;MAAQ,CAAA,CACxF;KAEL,CAAA,IAAA;KACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAY,0BAAA;MAA3B,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAU;QAAiB,UAAA,EAAE,mBAAmB;OAAQ,CAAA;OAC7D,OAAO,SAAS,IAEb,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAyB,eAAe;SAAE,aAAa,SAAS,eAAe;UAAE,OAAO;UAAO,UAAU;SAAS,CAAC;QAAE;QAAG,iCAA+B,OAAO;QAA9L,UAAA;SACG,EAAE,uBAAuB;SAAE;SAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,OAAO,OAAU,CAAA;QAC5C;OAER,CAAA,IAAA;OACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAc,eAAe;SAAE,aAAY,MAAK,CAAC,CAAC;QAAE;QAApF,UAAA;SACE,iBAAA,GAAA,kBAAA,IAAA,CAACL,sCAAAA,mBAAD,EAAmB,MAAM,GAAK,CAAA;SAAC;SAAE,EAAE,kBAAkB;QAC/C;;OACR,iBAAA,GAAA,kBAAA,IAAA,CAACM,sCAAAA,SAAD;QAAS,OAAO,EAAE,yBAAyB,EAAE,MAAM,OAAO,KAAK,CAAC;QAAG,MAAK;QACtE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAU;SAAc,iBAAe;SAAc,eAAe;UAAE,iBAAgB,MAAK,CAAC,CAAC;SAAE;SAAG,0CAAA;SACrH,UAAA,EAAE,wBAAwB;QACrB,CAAA;OACD,CAAA;OACT,iBAAA,GAAA,kBAAA,IAAA,CAACF,sCAAAA,QAAD;QAAQ,SAAQ;QAAU,MAAK;QAAK,SAAS;QAAW,mCAAA;QAAiC,UAAA,EAAE,uBAAuB;OAAU,CAAA;MACzH;;IACE;;EAEb;;;;;;;;;;;;;;;;;;;;;ECxRA,MAAM,mBAAmB;;;;;;;;EASzB,SAAS,gBAAgB,UAAuF;GAC9G,IAAI,aAAa,MAAM,OAAO,KAAA;GAC9B,MAAM,SAAS,SAAS,cAAc,0BAA0B;GAChE,IAAI,OAA2B,kBAAkB,cAAc,SAAS;GACxE,OAAO,SAAS,MAAM;IACpB,MAAM,SAA6B,KAAK;IACxC,IAAI,WAAW,QAAQ,WAAW,QAAQ,OAAO,SAAS,QAAQ,KAAK,CAAC,KAAK,SAAS,QAAQ,GAAG,OAAO;KAAE,QAAQ;KAAM,OAAO;IAAO;IACtI,OAAO;GACT;EAEF;EAEA,SAAgB,eAAe,EAAE,aAAa,OAAO,KAA0B;GAC7E,MAAM,QAAA,GAAOG,MAAAA,qBAAAA,CAAqB,UAAU,WAAW,UAAU,WAAW;GAC5E,MAAM,OAAA,GAAMA,MAAAA,qBAAAA,CAAqB,aAAa,WAAW,aAAa,WAAW;GACjF,MAAM,kBAAA,GAAiBC,MAAAA,YAAAA,EAAa,aAAyB,MAAM,UAAU,QAAQ,GAAG,CAAC,KAAK,CAAC;GAC/F,MAAM,aAAA,GAAYA,MAAAA,YAAAA,OAAkB,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC;GAChE,MAAM,YAAA,GAAWD,MAAAA,qBAAAA,CAAqB,gBAAgB,SAAS;GAE/D,MAAM,aAAa,SAAS,OAAO,eAAe,QAAS,SAAS,OAAO,eAAe,KAAA,KAAa,IAAI,OAAO,OAAO,eAAe;GACxI,MAAM,QAAA,GAAOE,MAAAA,OAAAA,CAAuB,IAAI;GACxC,MAAM,CAAC,MAAM,YAAA,GAAWC,MAAAA,SAAAA,CAAS,gBAAgB;GACjD,MAAM,WAAW,iBAAiB,IAAI,MAAM,SAAS,KAAK,QAAQ;GAClE,MAAM,SAAS,aAAA,UAAyB,KAAA,IAAY,IAAI,MAAM,QAAQ,MAAK,MAAK,EAAE,OAAO,QAAQ;GAGjG,CAAA,GAAA,MAAA,gBAAA,OAAsB;IACpB,IAAI,CAAC,KAAK,MAAM;IAChB,MAAM,gBAAsB;KAC1B,MAAM,QAAQ,gBAAgB,KAAK,OAAO;KAC1C,IAAI,UAAU,KAAA,GAAW;MACvB,QAAQ,gBAAgB;MACxB;KACF;KACA,MAAM,OAAO,MAAM,OAAO,sBAAsB,CAAC,CAAC,QAAQ,MAAM,MAAM,sBAAsB,CAAC,CAAC;KAC9F,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC;IACvC;IACA,QAAQ;IACR,MAAM,QAAQ,gBAAgB,KAAK,OAAO;IAC1C,MAAM,WAAW,OAAO,mBAAmB,eAAe,UAAU,KAAA,IAAY,KAAA,IAAY,IAAI,eAAe,OAAO;IACtH,IAAI,UAAU,KAAA,GAAW,UAAU,QAAQ,MAAM,MAAM;IACvD,OAAO,iBAAiB,UAAU,OAAO;IAEzC,MAAM,QAAQ,OAAO,YAAY,SAAS,GAAG;IAC7C,aAAa;KACX,UAAU,WAAW;KACrB,OAAO,oBAAoB,UAAU,OAAO;KAC5C,OAAO,cAAc,KAAK;IAC5B;GACF,GAAG,CAAC,KAAK,IAAI,CAAC;GAId,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,KAAK,MAAM;IAChB,MAAM,SAAS,MAA2B;KACxC,IAAI,EAAE,QAAQ,UAAU;KACxB,IAAI,SAAS,cAAc,iCAAiC,MAAM,MAAM;KACxE,UAAU,MAAM;IAClB;IACA,SAAS,iBAAiB,WAAW,KAAK;IAC1C,aAAa;KAAE,SAAS,oBAAoB,WAAW,KAAK;IAAE;GAChE,GAAG,CAAC,KAAK,IAAI,CAAC;GAEd,IAAI,CAAC,KAAK,MAAM,OAAO;GAEvB,MAAM,gBAAsB;IAAE,UAAU,OAAO,SAAS;GAAE;GAC1D,MAAM,YAAY,OAAqB;IAAE,UAAU,OAAO,EAAE;GAAE;GAC9D,MAAM,oBAAoB,cAA4B;IACpD,YAAY,SAAS;IACrB,UAAU,MAAM;GAClB;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,KAAK;IAAM,WAAU;IAAe,OAAO,EAAE,KAAK;IAAG,MAAK;IAAS,cAAY,EAAE,YAAY;IAAG,wBAAA;IAAqB,6BAA2B;IAArJ,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KACK;KACO;KACV,WAAW,QAAQ;MAAE,UAAU,OAAO,GAAG;KAAE;KAC3C,aAAa,OAAO;MAAE,UAAU,OAAO,EAAE;KAAE;KAC3C,eAAe;MAAE,UAAU,MAAM;KAAE;IACpC,CAAA,GACA,WAAW,KAAA,IACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KAAe;KAAW;KAAQ,SAAS,KAAK;KAAM,WAAW;KAAqB;IAAa,CAAA,IACnG,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAAc;KAAG,eAAe;KAAkB,YAAY;IAAW,CAAA,CAC1E;;EAET;;;;;;;;;;ECjHA,SAAS,UAA2D;GAClE,MAAM,CAAC,QAAQ,cAAA,GAAaC,MAAAA,SAAAA,CAAS,KAAK;GAQ1C,OAAO,CAAC,SAAA,GAPKC,MAAAA,YAAAA,EAAa,SAAiB;IACzC,CAAA,GAAKC,sCAAAA,eAAAA,CAAe,IAAI,CAAC,CAAC,MAAM,OAAO;KACrC,IAAI,CAAC,IAAI;KACT,UAAU,IAAI;KACd,iBAAiB;MAAE,UAAU,KAAK;KAAE,GAAG,IAAI;IAC7C,CAAC;GACH,GAAG,CAAC,CACe,CAAC;EACtB;;EAGA,SAAS,UAAU,EAAE,QAAQ,QAAQ,GAAG,UAAsF;GAC5H,MAAM,SAAS,OAAO,SAAS;GAC/B,MAAM,UAAU,SAAS,EAAE,cAAc,IAAI,UAAU,OAAO,QAAQ;GACtE,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;IAAQ,MAAK;IAAS,WAAU;IAAS,SAAS;IAAQ,gCAA8B,OAAO;IAAI,cAAY,EAAE,cAAc,EAAE,MAAM,OAAO,KAAK,CAAC;IAApJ,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAW,cAAc,OAAO,WAAW,OAAO,eAAe;MAAM,OAAO,OAAO,WAAW,OAAO,EAAE,cAAc,IAAI,EAAE,eAAe;KAAI,CAAA;KACtJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAU;QAAe,UAAA,OAAO;OAAW,CAAA,GACjD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAU;QAAe,UAAA,UAAU,OAAO,MAAM;OAAQ,CAAA,CAC1D;MACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAW,iBAAiB,SAAS,eAAe;OAAO,UAAA,YAAY,KAAK,EAAE,kBAAkB,IAAI;MAAc,CAAA,CACpH;;KACL,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAU;MAAW,0BAAwB,OAAO;MAAS,UAAA,OAAO,SAAS,KAAK,QAAQ,OAAO;KAAa,CAAA,IAAI;IAC5H;GACN,CAAA,EAAA,CAAA;EAER;EAEA,SAAgB,MAAM,EAAE,GAAG,gBAA4B;GACrD,MAAM,OAAA,GAAMC,MAAAA,qBAAAA,CAAqB,aAAa,WAAW,aAAa,WAAW;GACjF,MAAM,EAAE,UAAU;GAClB,MAAM,WAAW,IAAI,OAAO,YAAY;GACxC,MAAM,SAAS,IAAI,UAAU,IAAI,OAAO;GACxC,MAAM,CAAC,QAAQ,QAAQ,QAAQ;GAC/B,MAAM,CAAC,QAAQ,cAAA,GAAaH,MAAAA,SAAAA,CAAS,EAAE;GACvC,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GAC9D,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAA6D,KAAA,CAAS;GAC9F,MAAM,UAAU,UAAU,MAAM,OAAO;GACvC,MAAM,QAAQ,YAAY,MAAM,OAAO;GAEvC,MAAM,MAAM,OAAO,KAAa,WAA6D;IAC3F,QAAQ,GAAG;IACX,QAAQ,KAAA,CAAS;IACjB,IAAI;KACF,MAAM,KAAK,MAAM,OAAO;KACxB,IAAI,OAAO,KAAA,GAAW,QAAQ;MAAE,MAAM;MAAM,MAAM;KAAG,CAAC;KACtD,MAAM,aAAa,QAAQ;IAC7B,SAAS,GAAY;KACnB,QAAQ;MAAE,MAAM;MAAS,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;KAAE,CAAC;IAC7E,UAAU;KACR,QAAQ,KAAA,CAAS;IACnB;GACF;GAEA,MAAM,cAAc,WAA8B;IAAE,aAAa,OAAO,EAAE;GAAE;GAE5E,MAAM,SACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAG,SAAS;IAAU;IAAhF,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,OAAO;MAAE,MAAM;MAAG,UAAU;MAAG,SAAS;KAAO;KAApD,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAY,KAAK;OAAG,UAAU;MAAE;MAA3E,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,OAAO,EAAE,UAAU,SAAS;OAAI,UAAA,EAAE,aAAa;MAAU,CAAA,GAChE,QAAQ,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAW,gCAA8B;OAAQ,UAAA;MAAY,CAAA,IAAI,IAC3F;KACJ,CAAA,GAAA,aAAa,OAEV,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAW,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;OAAG,UAAU;OAAG,UAAU;MAAG;MAAG,kCAAA;MAA/G,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAU,cAAc;SAAY,YAAY;QAAS;QAAI,UAAA,SAAS;OAAW,CAAA;OAC1G,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,OAAO;SAAE,YAAY;SAAuD,SAAS;QAAK;QAAhG,UAAA,CAAoG,SAAS,GAAG,MAAM,GAAG,EAAE,GAAE,GAAO;;OACpI,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,SAAD;QAAS,OAAO,SAAS,EAAE,mBAAmB,IAAI,EAAE,iBAAiB;QAAG,MAAK;QAC3E,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAU;SAAa,cAAY,EAAE,iBAAiB;SAAG,eAAe;UAAE,KAAK,SAAS,OAAO;SAAE;SACpH,UAAA,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,oBAAD,EAAoB,MAAM,GAAK,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,mBAAD,EAAmB,MAAM,GAAK,CAAA;QACrE,CAAA;OACD,CAAA;MACN;KAEL,CAAA,IAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAU;MAAW,OAAO,EAAE,UAAU,GAAG;MAAI,UAAA,QAAQ,UAAU,WAAW,WAAW,KAAA,IAAY,EAAE,kBAAkB,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,kBAAkB,OAAO,OAAO,EAAE,CAAC;KAAQ,CAAA,CAC7M;IACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAACF,sCAAAA,SAAD;KAAS,OAAO,EAAE,kBAAkB;KAAG,MAAK;KAC1C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAU;MAAa,cAAY,EAAE,kBAAkB;MAAG,eAAe;OAAE,aAAkB,QAAQ;MAAE;MAC3H,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,sCAAAA,sBAAD,EAAsB,MAAM,GAAK,CAAA;KAC3B,CAAA;IACD,CAAA,CACN;;GAGP,MAAM,OACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,OAAO;KAAE,MAAM;KAAG,WAAW;KAAG,WAAW;KAAQ,SAAS;IAAE;IAAnE,UAAA;KACG,MAAM,QAAQ,SAAS,IAEpB,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAU;MAAc,UAAA,EAAE,iBAAiB,EAAE,GAAG,MAAM,QAAQ,OAAO,CAAC;KAAO,CAAA,GAClF,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,OAAO;OAAE,WAAW;OAAQ,QAAQ;OAAG,SAAS;MAAE;MACnD,UAAA,MAAM,QAAQ,KAAI,MACjB,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;OAAe,WAAU;OAAS,OAAO,EAAE,QAAQ,UAAU;OAAG,iCAA+B,EAAE;OAAjG,UAAA;QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAU;SAAhB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;UAAe,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAU;WAAe,UAAA,EAAE;UAAW,CAAA;SAAO,CAAA,GAClF,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;UAAkB,UAAA,EAAE,aAAa,KAAK,EAAE,0BAA0B,IAAI,UAAU,EAAE,QAAQ;SAAQ,CAAA,CAC9G;;QACN,iBAAA,GAAA,kBAAA,IAAA,CAACH,sCAAAA,SAAD;SAAS,OAAO,EAAE,yBAAyB;SAAG,MAAK;SACjD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UACE,MAAK;UACL,WAAU;UACV,cAAY,EAAE,yBAAyB;UACvC,UAAU,SAAS,KAAA;UACnB,eAAe;WACb,IAAS,UAAU,EAAE,MAAM,YAAY;YACrC,MAAM,IAAI,MAAM,IAAI,OAAO,EAAE,EAAE;YAC/B,aAAa,EAAE,OAAO,EAAE;YACxB,OAAO,EAAE,0BAA0B,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC;WAC5D,CAAC;UACH;UAEA,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,oBAAD,EAAoB,MAAM,GAAK,CAAA;SACzB,CAAA;QACD,CAAA;QACT,iBAAA,GAAA,kBAAA,IAAA,CAACD,sCAAAA,SAAD;SAAS,OAAO,EAAE,yBAAyB;SAAG,MAAK;SACjD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAU;UAAa,cAAY,EAAE,yBAAyB;UAAG,UAAU,SAAS,KAAA;UAAW,eAAe;WAAE,IAAS,UAAU,EAAE,MAAM,YAAY;YAAE,MAAM,IAAI,OAAO,EAAE,EAAE;WAAoB,CAAC;UAAE;UACzN,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,iBAAD,EAAiB,MAAM,GAAK,CAAA;SACtB,CAAA;QACD,CAAA;OACP;MA3BK,GAAA,EAAE,EA2BP,CACL;KACC,CAAA,CACJ,EAAA,CAAA,IAEF;KACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAU;MAAc,UAAA,EAAE,eAAe;KAAO,CAAA;KACpD,QAAQ,WAAW,IAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAU;MAAW,OAAO;OAAE,QAAQ;OAAG,SAAS;MAAgB;MAAG,+BAAA;MAA6B,UAAA,aAAa,OAAO,EAAE,wBAAwB,IAAI,EAAE,aAAa;KAAK,CAAA,IAE3K,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,OAAO;OAAE,WAAW;OAAQ,QAAQ;OAAG,SAAS;MAAE;MAAG,8BAAA;MACtD,UAAA,QAAQ,KAAI,MACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;OAAsB,QAAQ;OAAG,QAAQ,MAAM,OAAO,EAAE,QAAQ,QAAQ,EAAE,WAAW;OAAS;OAAG,cAAc;QAAE,WAAW,CAAC;OAAE;MAAI,GAAnH,EAAE,EAAiH,CACpI;KACC,CAAA;IAEL;;GAGP,MAAM,kBAAwB;IAC5B,IAAI,SAAS,KAAA,KAAa,OAAO,KAAK,MAAM,MAAM,aAAa,MAAM;IACrE,IAAS,OAAO,YAAY;KAC1B,MAAM,EAAE,WAAW,MAAM,IAAI,UAAU,OAAO,KAAK,CAAC;KACpD,UAAU,EAAE;KACZ,OAAO,EAAE,qBAAqB,EAAE,MAAM,OAAO,KAAK,CAAC;IACrD,CAAC;GACH;GAEA,MAAM,SACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,KAAK;KAAG,SAAS;KAAY,WAAW;IAAuC;IAA9G,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,KAAK;MAAG,YAAY;KAAS;KAA5D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;MACE,WAAU;MACV,aAAa,EAAE,uBAAuB;MACtC,OAAO;MACP,UAAU,aAAa;MACvB,WAAW,MAAM;OAAE,UAAU,EAAE,OAAO,KAAK;MAAE;MAC7C,YAAY,MAAM;OAAE,IAAI,EAAE,QAAQ,SAAS,UAAU;MAAE;MACvD,6BAAA;KACD,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;MACE,SAAQ;MACR,MAAK;MACL,UAAU,SAAS,KAAA,KAAa,OAAO,KAAK,MAAM,MAAM,aAAa;MACrE,SAAS;MAER,UAAA,EAAE,WAAW;KACR,CAAA,CACL;IACJ,CAAA,GAAA,SAAS,KAAA,IACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,OAAO;MAAE,UAAU;MAAI,OAAO,KAAK,SAAS,UAAU,yCAAyC;KAAmC;KAAG,MAAM,KAAK,SAAS,UAAU,UAAU,KAAA;KAAY,UAAA,KAAK,SAAS,UAAU,EAAE,kBAAkB,EAAE,SAAS,KAAK,KAAK,CAAC,IAAI,KAAK;IAAW,CAAA,IACrR,IAAI,UAAU,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,OAAO;MAAE,UAAU;MAAI,OAAO;KAAuC;KAAI,UAAA,EAAE,kBAAkB,EAAE,SAAS,IAAI,MAAM,CAAC;IAAQ,CAAA,IAAI,IAChK;;GAGP,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAAU,yBAAsB;IAAnD,UAAA;KACG;KACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAU;MAAW,OAAO;OAAE,QAAQ;OAAW,UAAU;MAAG;MAAI,UAAA,EAAE,YAAY;KAAK,CAAA;KACvF;KACA;IACM;;EAEb;;;;;;;;;EClMA,SAAgB,eAAe,EAAE,WAAW,KAA0B;GACpE,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,wBAAsB;IAAW,OAAO;KAAE,QAAQ;KAAQ,WAAW;IAAO;IAAjF,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAU;KAAU,OAAO,EAAE,eAAe,EAAE;KACjD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;MAAQ,SAAQ;MAAU,MAAK;MAAK,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD,EAAgB,MAAM,GAAK,CAAA;MAAG,eAAe;OAAE,UAAU,KAAK;MAAE;MAAG,kCAAA;MAC1G,UAAA,EAAE,WAAW;KACR,CAAA;IACL,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAU;KAAG,eAAe,OAAO;MAAE,UAAU,KAAK,EAAE;KAAE;IAAI,CAAA,CACzD;;EAET;;;;;;;;;;;;;;EChBA,MAAM,WAAW;EAEjB,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4OZ,SAAgB,eAAqB;GACnC,IAAI,OAAO,aAAa,aAAa;GACrC,IAAI,SAAS,eAAe,QAAQ,MAAM,MAAM;GAChD,MAAM,QAAQ,SAAS,cAAc,OAAO;GAC5C,MAAM,KAAK;GACX,MAAM,cAAc;GACpB,SAAS,KAAK,YAAY,KAAK;EACjC;EAEA,SAAgB,eAAqB;GACnC,IAAI,OAAO,aAAa,aAAa;GACrC,SAAS,eAAe,QAAQ,CAAC,EAAE,OAAO;EAC5C;;;ECtNA,MAAM,qBAAqB;EAE3B,MAAa,SAAS;GAAC;GAAS;GAAU;GAAsB;GAAY;GAAiB;EAAW;;EAGxG,SAAgB,gBAAgB,KAAkC;GAChE,IAAI,QAAQ,KAAA,GAAW,OAAO;GAC9B,MAAM,aAAa,IAAI,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,QAAQ,EAAE;GAC7D,OAAO,oBAAoB,KAAK,UAAU,KAAK,qBAAqB,KAAK,UAAU,KAAK,uBAAuB,KAAK,UAAU;EAChI;EAEA,SAAgB,MAAM,KAA0B;GAC9C,IAAI,aAAa,IAAI,OAAO,SAAS,IAAI;IAAE;IAAI;GAAG,CAAC,GAAG,0BAA0B;GAChF,MAAM,IAAI,IAAI,OAAO,KAAK,EAAE;GAC5B,IAAI,aAAa;IACf,aAAa;IACb,OAAO;GACT,GAAG,0BAA0B;GAC7B,MAAM,eAAe,OAAqB;IAAE,IAAI,SAAS,KAAK,EAAe;GAAE;GAI/E,IAAI,mBAAmB,SAAS,kBAAkB;GAClD,IAAI,MAAM,OAAO,gCAAgC,IAAI,MAAM,SAAS;IAClE,MAAM;IACN,KAAK;IACL,QAAQ;GACV,GAAG,OAAO,CAAC;GAIX,IAAI,MAAM,OAAO,2BAA2B,IAAI,MAAM,SAAS;IAC7D,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,aAAa,EAAE,UAAU;GAC3B,GAAG,cAAc,CAAC;GAIlB,IAAI,MAAM,OAAO,+BAA+B,IAAI,MAAM,SAAS;IACjE,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;GACV,GAAG,YAAY,CAAC;GAKhB,MAAM,QAAQ,IAAI,cAAc,KAA+B,EAAE,WAAW,mBAAmB,CAAC;GAChG,MAAM,sBAA8C;IAAE;IAAa;GAAM;GACzE,IAAI,MAAM,OAAO,uBAAuB,IAAI,MAAM,SAAS;IACzD,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,QAAQ;GACV,GAAG,cAAc,CAAC;GAIlB,MAAM,yBAA+C,EACnD,wBAAwB,IAAI,SAAS,KAAK,YAAY,CAAC,CAAC,QAC1D;GACA,IAAI,MAAM,OAAO,uBAAuB,IAAI,MAAM,SAAS;IACzD,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,QAAQ;GACV,GAAG,YAAY,CAAC;GAGhB,MAAM,0BAAsD;IAC1D;IACA;GACF;GACA,IAAI,MAAM,OAAO,0BAA0B,IAAI,MAAM,SAAS;IAC5D,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,aAAa,EAAE,cAAc;IAC7B,QAAQ;GACV,GAAG,yBAAyB,CAAC;GAG7B,IAAI,MAAM,OAAO,6BAA6B,IAAI,MAAM,SAAS;IAC/D,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;GACV,GAAG,oBAAoB,CAAC;GAOxB,MAAM,gBAAgB,YAAsE;IAC1F,MAAM,QAAQ,MAAM,IAAI,MAAM,CAAC,CAAC,YAAY,KAAA,CAAS;IACrD,IAAI,UAAU,KAAA,KAAa,MAAM,QAAQ,WAAW,GAAG,OAAO,CAAC;IAC/D,OAAO,MAAM,QAAQ,KAAI,OAAM;KAC7B,IAAI,EAAE;KACN,OAAO,GAAG,EAAE,WAAW,OAAO,OAAO,OAAO,EAAE,OAAO,EAAE,SAAS,IAAI,KAAK,EAAE,OAAO,KAAK,MAAM,EAAE,UAAU,KAAK,IAAI,MAAM,EAAE,mBAAmB,MAAM;KACnJ,QAAQ,EAAE,oBAAoB,EAAE,MAAM,EAAE,KAAK,CAAC;IAChD,EAAE;GACJ;GACA,IAAI,aAAa,IAAI,UAAU,SAAS;IACtC,MAAM;IACN,iBAAiB;IACjB,IAAI;KACF,MAAM;KACN,SAAS,YAAY;MACnB,MAAM,UAAU,MAAM,cAAc;MACpC,OAAO,QAAQ,WAAW,IAAI,CAAC;OAAE,IAAI;OAAQ,OAAO,EAAE,kBAAkB;MAAE,CAAC,IAAI;KACjF;KACA,WAAW,WAAW;MACpB,IAAI,OAAO,OAAO,QAAQ;MAC1B,UAAU,KAAK,OAAO,EAAE;KAC1B;IACF;GACF,CAAC,GAAG,4BAA4B;GAChC,IAAI,aAAa,IAAI,UAAU,SAAS;IACtC,MAAM;IACN,iBAAiB;IACjB,IAAI;KACF,MAAM;KACN,SAAS,YAAY;MAEnB,OAAO,CAAC;OADO,IAAI;OAAQ,OAAO,EAAE,qBAAqB;OAAG,QAAQ,EAAE,4BAA4B;MACvF,GAAG,GAAG,MAAM,cAAc,CAAC;KACxC;KACA,WAAW,WAAW;MACpB,UAAU,KAAK,OAAO,OAAO,SAAS,UAAU,OAAO,EAAE;KAC3D;IACF;GACF,CAAC,GAAG,+BAA+B;EACrC"}