@osvi-ai/chat 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.js +1 -1
- package/dist/{index-BsRyQwUM.js → index-HWHyM4-l.js} +9 -9
- package/dist/index-HWHyM4-l.js.map +1 -0
- package/dist/types/core/client.d.ts +3 -1
- package/dist/types/ui/icons.d.ts +9 -0
- package/dist/types/ui/osvi-chat.d.ts +1 -0
- package/dist/types/widget/config.d.ts +1 -0
- package/dist/ui.js +103 -43
- package/dist/ui.js.map +1 -1
- package/dist/ui.mjs +363 -287
- package/dist/ui.mjs.map +1 -1
- package/dist/widget.js +129 -56
- package/dist/widget.js.map +1 -1
- package/package.json +2 -2
- package/dist/index-BsRyQwUM.js.map +0 -1
package/dist/ui.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.mjs","sources":["../src/ui/theme.ts","../src/ui/strings.ts","../src/ui/panel/attrs.ts","../src/ui/panel/linkify.ts","../src/ui/panel/transcript.ts","../src/ui/panel/composer.ts","../src/ui/osvi-chat.ts","../src/ui/define.ts","../src/ui/styles.ts","../src/ui/tools/base.ts","../src/ui/tools/osvi-buttons.ts","../src/ui/tools/osvi-carousel.ts","../src/ui/tools/osvi-date-picker.ts","../src/ui/index.ts"],"sourcesContent":["export interface ChatTheme {\n colors?: Partial<Record<'primary' | 'background' | 'surface' | 'text' | 'userBubble' | 'assistantBubble', string>>;\n radius?: 'none' | 'sm' | 'md' | 'lg' | 'full' | number;\n mode?: 'light' | 'dark';\n}\nexport interface Variants { buttons?: 'chips' | 'list'; carousel?: 'slider' | 'list' }\nconst LIGHT = { primary: '#4f46e5', background: '#ffffff', surface: '#f4f4f5', text: '#18181b', userBubble: '#4f46e5', assistantBubble: '#f4f4f5' };\nconst DARK = { primary: '#6366f1', background: '#0a0a12', surface: '#1c1c27', text: '#f4f4f5', userBubble: '#6366f1', assistantBubble: '#1f1f2b' };\nconst RADII = { none: '0px', sm: '6px', md: '10px', lg: '16px', full: '9999px' };\nconst VAR = { primary: '--osvi-color-primary', background: '--osvi-color-background', surface: '--osvi-color-surface', text: '--osvi-color-text', userBubble: '--osvi-color-user-bubble', assistantBubble: '--osvi-color-assistant-bubble' };\nexport const cssVar = (key: keyof typeof LIGHT): string => `var(${VAR[key]}, ${LIGHT[key]})`;\nexport function themeVariables(theme: ChatTheme | undefined): Record<string, string> {\n const colors = { ...(theme?.mode === 'dark' ? DARK : LIGHT), ...theme?.colors };\n const out: Record<string, string> = {};\n for (const key of Object.keys(VAR) as (keyof typeof LIGHT)[]) out[VAR[key]] = colors[key];\n const radius = theme?.radius ?? 'md';\n out['--osvi-radius'] = typeof radius === 'number' ? `${radius}px` : RADII[radius];\n return out;\n}\nexport function explicitThemeVariables(theme: ChatTheme | undefined): Record<string, string> {\n if (!theme) return {};\n if (theme.mode) return themeVariables(theme);\n const full = themeVariables(theme), out: Record<string, string> = {};\n for (const key of Object.keys(theme.colors ?? {}) as (keyof typeof LIGHT)[]) out[VAR[key]] = full[VAR[key]]!;\n if (theme.radius !== undefined) out['--osvi-radius'] = full['--osvi-radius']!;\n return out;\n}\nconst applied = new WeakMap<HTMLElement, string[]>();\nexport function applyTheme(host: HTMLElement, theme: ChatTheme | undefined): void {\n for (const key of applied.get(host) ?? []) host.style.removeProperty(key);\n const variables = explicitThemeVariables(theme);\n for (const [key, value] of Object.entries(variables)) host.style.setProperty(key, value);\n applied.set(host, Object.keys(variables));\n}\n","export const DEFAULT_STRINGS = {\nplaceholder: 'Type your message…', send: 'Send', typing: 'Typing…', humanJoined: 'A team member has joined', chooseOption: 'Choose an option to continue.', typeAnswer: 'Type your answer below, then press Send.', sending: 'Sending your response…', pausedForHuman: 'Choices are paused while a team member is connected.', sendFailed: 'Message not sent.', retry: 'Retry', sessionEnded: 'Conversation ended', reconnecting: 'Reconnecting…', offline: 'You are offline. We will reconnect automatically.', unavailable: 'This chat is unavailable.', originBlocked: 'This chat is not enabled for this website.', rateLimited: 'Too many requests. Please try again in a few minutes.', tryAgain: 'Try again', closeChat: 'Close chat', poweredBy: 'Powered by OSVI', newChat: 'New chat', emptyState: 'Send a message to start chatting.', defaultTitle: 'Chat',\n};\nexport type ChatStrings = { [K in keyof typeof DEFAULT_STRINGS]: string };\n","import type { ChatTheme } from '../theme';\nconst warned = new Set<string>();\nfunction warnOnce(name: string, message: string) { if (!warned.has(name)) { warned.add(name); console.warn(`[osvi-chat] ${message}`); } }\nexport function oneOf<T extends string>(value: string | null | undefined, allowed: readonly T[]): T | undefined { return value != null && (allowed as readonly string[]).includes(value) ? value as T : undefined; }\nexport function parseRadius(value: string | null | undefined): ChatTheme['radius'] | undefined {\n if (value == null) return undefined;\n return oneOf(value, ['none', 'sm', 'md', 'lg', 'full'] as const) ?? (/^\\d{1,2}(?:px)?$/.test(value) ? Number(value.replace(/px$/, '')) : undefined);\n}\nexport function safeBaseUrl(value: string | null | undefined): string | undefined {\n if (!value) return undefined;\n try { const u = new URL(value); if (!u.username && !u.password && (u.protocol === 'https:' || u.protocol === 'http:' && ['localhost', '127.0.0.1'].includes(u.hostname))) return value.replace(/\\/+$/, ''); } catch { /* ignored */ }\n warnOnce('base-url', 'ignored an invalid base-url (https required, http only for localhost)'); return undefined;\n}\nexport function safeAvatar(value: string | null | undefined): string | undefined {\n if (!value) return undefined;\n if (/^data:image\\/(png|jpeg|gif|webp);base64,[a-z0-9+/]+={0,2}$/i.test(value)) return value;\n try { const u = new URL(value); if (u.protocol === 'https:' && !u.username && !u.password) return value; } catch { /* ignored */ }\n return undefined;\n}\nexport function parseJsonAttr(name: string, value: string | null | undefined): Record<string, unknown> | undefined {\n if (!value) return undefined;\n try { const parsed: unknown = JSON.parse(value); if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) return parsed as Record<string, unknown>; } catch { /* warn below */ }\n warnOnce(name, `ignored invalid JSON in the ${name} attribute`); return undefined;\n}\n","export type LinkPart = { text: string } | { href: string; text: string };\nconst URL_RE = /https?:\\/\\/[^\\s<>\"']+/g;\nconst count = (s: string, ch: string) => s.split(ch).length - 1;\nfunction trimUrl(url: string): string {\n for (;;) { const c = url[url.length - 1];\n if (c && '.,!?;:'.includes(c) || c === ')' && count(url, ')') > count(url, '(') || c === ']' && count(url, ']') > count(url, '[')) { url = url.slice(0, -1); continue; } return url; }\n}\nexport function linkify(text: string): LinkPart[] {\n const out: LinkPart[] = []; let last = 0;\n for (const m of text.matchAll(URL_RE)) { const url = trimUrl(m[0]), start = m.index!;\n try { const u = new URL(url); if (!['http:', 'https:'].includes(u.protocol)) continue; } catch { continue; }\n if (start > last) out.push({ text: text.slice(last, start) }); out.push({ href: url, text: url }); last = start + url.length; }\n if (last < text.length) out.push({ text: text.slice(last) }); return out.length ? out : [{ text }];\n}\n","import { html, nothing } from 'lit';\nimport { repeat } from 'lit/directives/repeat.js';\nimport type { ChatState } from '../../core';\nimport type { ChatStrings } from '../strings';\nimport type { Variants } from '../theme';\nimport { linkify } from './linkify';\nexport function renderTranscript(state: ChatState, strings: ChatStrings, variants: Variants, baseUrl: string, retry: (id: string) => void) {\n return html`${state.items.length ? repeat(state.items, item => item.id, item => {\n if (item.kind === 'divider') return html`<p class=\"divider\">${strings.sessionEnded}</p>`;\n if (item.kind === 'message') return html`<article class=${`bubble ${item.role}`}>${item.role === 'human' ? html`<small>Team</small>` : nothing}<p>${linkify(item.content).map(p => 'href' in p ? html`<a href=${p.href} target=\"_blank\" rel=\"noopener noreferrer\">${p.text}</a>` : p.text)}</p>${item.role === 'user' && item.status === 'failed' ? html`<span>${strings.sendFailed}</span><button type=\"button\" @click=${() => retry(item.id)}>${strings.retry}</button>` : nothing}</article>`;\n const i = item.interaction, live = i.interaction_id === state.activeInteraction?.interaction_id && i.interaction_status === 'pending';\n const disabled = !live || state.interactionPending || state.mode === 'human';\n switch (i.tool_type) {\n case 'ui_buttons': return html`<osvi-buttons data-live=${live ? 'true' : 'false'} .interaction=${i} .disabled=${disabled} .variant=${variants.buttons ?? 'chips'} base-url=${baseUrl}></osvi-buttons>`;\n case 'ui_carousel': return html`<osvi-carousel data-live=${live ? 'true' : 'false'} .interaction=${i} .disabled=${disabled} .variant=${variants.carousel ?? 'slider'} base-url=${baseUrl}></osvi-carousel>`;\n case 'ui_date_picker': return html`<osvi-date-picker data-live=${live ? 'true' : 'false'} .interaction=${i} .disabled=${disabled} base-url=${baseUrl}></osvi-date-picker>`;\n default: return html`<p>${i.content}</p>`;\n }\n }) : html`<p>${strings.emptyState}</p>`}${state.awaitingReply ? html`<p aria-label=${strings.typing}>${strings.typing}<span aria-hidden=\"true\"> •••</span></p>` : nothing}`;\n}\n","import { html } from 'lit';\nimport { live } from 'lit/directives/live.js';\nimport type { ChatStrings } from '../strings';\nexport interface ComposerOptions { strings: ChatStrings; draft: string; placeholder: string; disabled: boolean; input: (event: Event) => void; send: () => void }\nexport function renderComposer(o: ComposerOptions) {\n return html`<div class=\"composer\"><textarea aria-label=\"Message\" placeholder=${o.placeholder} .value=${live(o.draft)} ?disabled=${o.disabled} @input=${o.input} @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey && !e.isComposing && !o.disabled) { e.preventDefault(); o.send(); } }}></textarea><button type=\"button\" aria-label=${o.strings.send} ?disabled=${o.disabled || !o.draft.trim()} @click=${o.send}>${o.strings.send}</button></div>`;\n}\n","import { LitElement, css, html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { createChatClient, type ChatClient, type ChatState, type InteractionResponse } from '../core';\nimport { applyTheme, type ChatTheme, type Variants } from './theme';\nimport { DEFAULT_STRINGS, type ChatStrings } from './strings';\nimport { oneOf, parseJsonAttr, parseRadius, safeAvatar, safeBaseUrl } from './panel/attrs';\nimport { renderTranscript } from './panel/transcript';\nimport { renderComposer } from './panel/composer';\nconst emptyState = (): ChatState => ({ status: 'idle', mode: 'ai', awaitingReply: false, items: [], activeInteraction: null, interactionPending: false, agent: null, error: null });\nconst bool = { fromAttribute: (v: string | null) => v !== 'false' };\nexport class OsviChat extends LitElement {\n static clientFactory = createChatClient;\n static properties = { themeAttribute: { attribute: 'theme' }, stringsAttribute: { attribute: 'strings' } };\n static styles = css`\n :host { display:flex; flex-direction:column; height:100%; min-height:260px; color:var(--osvi-color-text,#18181b); background:var(--osvi-color-background,#fff); font:14px/1.5 system-ui,sans-serif; border-radius:var(--osvi-radius,10px); overflow:hidden; }\n header { display:flex; align-items:center; gap:10px; padding:14px; border-bottom:1px solid var(--osvi-color-surface,#f4f4f5); } header img { width:36px; height:36px; border-radius:50%; } .heading { flex:1; } h2,p { margin:0; } h2 { font-size:16px; } small { display:block; }\n .transcript { flex:1; overflow:auto; padding:16px; min-height:0; } .bubble { width:fit-content; max-width:85%; padding:10px 14px; margin:8px 0; border-radius:var(--osvi-radius,10px); background:var(--osvi-color-assistant-bubble,#f4f4f5); overflow-wrap:anywhere; white-space:pre-wrap; } .user { margin-left:auto; color:#fff; background:var(--osvi-color-user-bubble,#4f46e5); } .bubble a { color:inherit; } .divider { text-align:center; } .status { padding:0 14px; } .composer { display:flex; gap:8px; padding:14px; } textarea { flex:1; resize:vertical; min-width:0; } button,textarea { font:inherit; } button { cursor:pointer; } button:disabled { cursor:default; } footer { padding:0 14px 10px; text-align:center; } footer a { color:inherit; } osvi-buttons,osvi-carousel,osvi-date-picker { display:block; margin:8px 0; }\n `;\n @property({ attribute: 'agent-id' }) agentId = '';\n @property({ attribute: 'base-url' }) baseUrl = '';\n @property({ attribute: false }) client: ChatClient | null = null;\n @property({ attribute: false }) theme: ChatTheme = {};\n @property({ attribute: false }) variants: Variants = {};\n @property({ attribute: false }) strings: Partial<ChatStrings> = {};\n @property({ attribute: 'powered-by', converter: bool }) poweredBy = true;\n @property({ attribute: 'new-chat', converter: bool }) newChat = true;\n @property({ attribute: false }) header: { title?: string; subtitle?: string; avatarUrl?: string } = {};\n @property({ type: Boolean }) closable = false;\n @property({ attribute: 'header-title' }) headerTitle: string | undefined;\n @property({ attribute: 'header-subtitle' }) headerSubtitle: string | undefined;\n @property({ attribute: 'header-avatar' }) headerAvatar: string | undefined;\n @property({ attribute: 'primary-color' }) primaryColor: string | undefined;\n @property() radius: string | undefined;\n @property() mode: string | undefined;\n @property() buttons: string | undefined;\n @property() carousel: string | undefined;\n declare themeAttribute: string | undefined;\n declare stringsAttribute: string | undefined;\n @state() private chatState = emptyState();\n @state() private draft = '';\n @state() private busy = false;\n @state() private typed: { id: string; placeholder?: string; previousDraft: string } | null = null;\n private ownClient: ChatClient | null = null;\n private boundClient: ChatClient | null = null;\n private ownKey = '';\n private unsubscribe: (() => void) | undefined;\n private generation = 0;\n private followBottom = true;\n private focusedInteraction: string | null = null;\n connectedCallback() { super.connectedCallback(); this.syncClient(); }\n disconnectedCallback() { super.disconnectedCallback(); this.releaseClient(); }\n private releaseClient() {\n ++this.generation; this.unsubscribe?.(); this.unsubscribe = undefined;\n this.boundClient = null; const own = this.ownClient; this.ownClient = null; this.ownKey = '';\n own?.destroy(); this.busy = false; this.typed = null; this.focusedInteraction = null; this.requestUpdate();\n }\n private syncClient() {\n if (!this.isConnected) return;\n if (!this.client && !this.agentId && !this.boundClient) return;\n const key = JSON.stringify([this.agentId, safeBaseUrl(this.baseUrl)]);\n if (this.client ? this.boundClient === this.client && !this.ownClient : this.ownClient && key === this.ownKey) return;\n this.releaseClient(); this.chatState = emptyState();\n if (!this.client && !this.agentId) return;\n const own = !this.client;\n const client = this.client ?? OsviChat.clientFactory({ agentId: this.agentId, baseUrl: safeBaseUrl(this.baseUrl) });\n this.boundClient = client;\n if (own) { this.ownClient = client; this.ownKey = key; }\n const generation = this.generation;\n this.chatState = client.getState(); this.requestUpdate();\n this.unsubscribe = client.subscribe(state => {\n if (this.generation !== generation || this.boundClient !== client) return;\n this.chatState = state; this.requestUpdate();\n if (this.typed && (state.mode === 'human' || state.activeInteraction?.interaction_id !== this.typed.id || state.activeInteraction.interaction_status !== 'pending')) this.restoreDraft();\n });\n if (own) void this.run(() => client.start());\n }\n protected willUpdate() { this.syncClient(); applyTheme(this, this.mergedTheme()); }\n private mergedTheme(): ChatTheme {\n const attr = parseJsonAttr('theme', this.themeAttribute);\n const colors: NonNullable<ChatTheme['colors']> = {};\n const rawColors = attr?.colors;\n if (rawColors && typeof rawColors === 'object' && !Array.isArray(rawColors)) {\n for (const key of ['primary', 'background', 'surface', 'text', 'userBubble', 'assistantBubble'] as const) {\n const value = (rawColors as Record<string, unknown>)[key]; if (typeof value === 'string') colors[key] = value;\n }\n }\n if (typeof this.primaryColor === 'string') colors.primary = this.primaryColor;\n const radius = parseRadius(this.radius) ?? (typeof attr?.radius === 'number' && Number.isInteger(attr.radius) && attr.radius >= 0 && attr.radius <= 99 ? attr.radius : typeof attr?.radius === 'string' ? parseRadius(attr.radius) : undefined);\n const mode = oneOf(this.mode, ['light', 'dark'] as const) ?? oneOf(typeof attr?.mode === 'string' ? attr.mode : undefined, ['light', 'dark'] as const);\n return { ...this.theme, colors: { ...this.theme?.colors, ...colors }, ...(radius === undefined ? {} : { radius }), ...(mode === undefined ? {} : { mode }) };\n }\n private get labels(): ChatStrings {\n const out = { ...DEFAULT_STRINGS };\n for (const source of [this.strings, parseJsonAttr('strings', this.stringsAttribute)]) {\n for (const key of Object.keys(DEFAULT_STRINGS) as (keyof ChatStrings)[]) if (typeof source?.[key] === 'string') out[key] = source[key] as string;\n }\n return out;\n }\n private get blocked() {\n const s = this.chatState;\n return !this.boundClient || this.busy || s.status === 'connecting' || s.status === 'closed' && !!s.error && !s.error.retryable || s.mode === 'ai' && (s.interactionPending || s.activeInteraction?.interaction_status === 'pending' && !this.typed);\n }\n private get sessionBusy() { return this.busy || this.chatState.status === 'connecting' || this.chatState.interactionPending || this.chatState.items.some(i => i.kind === 'message' && i.status === 'sending'); }\n private async run(action: () => unknown): Promise<void> {\n if (this.busy || !this.boundClient) return;\n const generation = this.generation; this.busy = true; this.requestUpdate();\n try { await action(); } catch { /* Client state owns errors; prevent unhandled rejections from host callbacks. */ }\n finally { if (this.generation === generation) { this.busy = false; this.requestUpdate(); } }\n }\n private restoreDraft() { if (this.typed) { this.draft = this.typed.previousDraft; this.typed = null; this.requestUpdate(); } }\n private send = () => {\n if (this.blocked || !this.draft.trim() || !this.boundClient) return;\n const client = this.boundClient, value = this.draft.trim(), typed = this.typed;\n this.draft = ''; if (typed) this.restoreDraft(); this.requestUpdate();\n void this.run(() => typed ? client.respond(typed.id, { kind: 'text', value }) : client.send(value));\n };\n private respond = (event: CustomEvent<{ interactionId: string; response: InteractionResponse }>) => {\n const d = event.detail, s = this.chatState;\n if (!d || this.busy || s.mode !== 'ai' || s.interactionPending || s.activeInteraction?.interaction_status !== 'pending' || d.interactionId !== s.activeInteraction.interaction_id) return;\n event.stopPropagation(); const client = this.boundClient; if (client) void this.run(() => client.respond(d.interactionId, d.response));\n };\n private requestInput = (event: CustomEvent<{ interactionId: string; placeholder?: string }>) => {\n const d = event.detail, s = this.chatState;\n if (!d || this.busy || s.mode !== 'ai' || s.interactionPending || s.activeInteraction?.interaction_status !== 'pending' || d.interactionId !== s.activeInteraction.interaction_id) return;\n event.stopPropagation();\n this.typed = { id: d.interactionId, placeholder: typeof d.placeholder === 'string' ? d.placeholder : undefined, previousDraft: this.typed?.previousDraft ?? this.draft };\n this.draft = ''; this.requestUpdate(); void this.updateComplete.then(() => this.renderRoot.querySelector('textarea')?.focus());\n };\n async focusActiveInteraction(): Promise<void> {\n await this.updateComplete;\n if (!this.isConnected || this.chatState.activeInteraction?.interaction_status !== 'pending') return;\n const tool = this.renderRoot.querySelector<LitElement>('[data-live=\"true\"]');\n if (!tool) return; const id = this.chatState.activeInteraction.interaction_id;\n await tool.updateComplete;\n if (!this.isConnected || this.chatState.activeInteraction?.interaction_id !== id) return;\n tool.shadowRoot?.querySelector<HTMLElement>('button:not(:disabled),input:not(:disabled),select:not(:disabled),textarea:not(:disabled),[tabindex=\"0\"]')?.focus();\n }\n protected updated() {\n const log = this.renderRoot.querySelector<HTMLElement>('.transcript');\n if (log && this.followBottom) log.scrollTop = log.scrollHeight;\n const id = this.chatState.activeInteraction?.interaction_status === 'pending' ? this.chatState.activeInteraction.interaction_id : null;\n if (id !== this.focusedInteraction) {\n this.focusedInteraction = id;\n if (id && this.isConnected && !this.hidden && document.visibilityState !== 'hidden') void this.focusActiveInteraction();\n }\n }\n private statusText(strings: ChatStrings): string {\n const s = this.chatState;\n if (s.error?.code === 'origin_not_allowed') return strings.originBlocked;\n if (s.error && ['agent_inactive', 'agent_archived', 'agent_not_found'].includes(s.error.code)) return strings.unavailable;\n if (s.error?.code === 'rate_limited') return strings.rateLimited;\n if (s.error?.code === 'token_failed') return s.error.message;\n if (s.status === 'recovering') return strings.reconnecting;\n if (s.status === 'offline') return strings.offline;\n if (s.interactionPending || this.busy && this.typed) return strings.sending;\n if (s.activeInteraction?.interaction_status === 'pending') return s.mode === 'human' ? strings.pausedForHuman : this.typed ? strings.typeAnswer : strings.chooseOption;\n if (s.status === 'closed') return strings.sessionEnded;\n return '';\n }\n render() {\n const strings = this.labels, s = this.chatState, client = this.boundClient;\n const avatar = safeAvatar(this.headerAvatar ?? this.header.avatarUrl);\n const variants: Variants = { ...this.variants, ...(oneOf(this.buttons, ['chips', 'list'] as const) ? { buttons: oneOf(this.buttons, ['chips', 'list'] as const) } : {}), ...(oneOf(this.carousel, ['slider', 'list'] as const) ? { carousel: oneOf(this.carousel, ['slider', 'list'] as const) } : {}) };\n return html`<header>${avatar ? html`<img src=${avatar} alt=\"\" referrerpolicy=\"no-referrer\">` : nothing}<div class=\"heading\"><h2>${this.headerTitle ?? this.header.title ?? s.agent?.name ?? strings.defaultTitle}</h2>${this.headerSubtitle ?? this.header.subtitle ? html`<p>${this.headerSubtitle ?? this.header.subtitle}</p>` : nothing}${s.mode === 'human' ? html`<small>${strings.humanJoined}</small>` : nothing}</div>\n ${this.newChat ? html`<button type=\"button\" ?disabled=${!client || this.sessionBusy} @click=${() => client && !this.sessionBusy && void this.run(() => client.newSession())}>${strings.newChat}</button>` : nothing}\n ${this.closable ? html`<button type=\"button\" aria-label=${strings.closeChat} @click=${() => this.dispatchEvent(new CustomEvent('osvi-close', { bubbles: true, composed: true }))}>×</button>` : nothing}</header>\n <div class=\"transcript\" role=\"log\" aria-live=\"polite\" aria-label=\"Conversation\" @scroll=${(e: Event) => { const el = e.currentTarget as HTMLElement; this.followBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= 80; }} @osvi-respond=${this.respond} @osvi-request-input=${this.requestInput}>${renderTranscript(s, strings, variants, client?.resolveUrl('') ?? '', id => { if (client) void this.run(() => client.retry(id)); })}</div>\n <div class=\"status\" role=\"status\">${this.statusText(strings)}${s.error?.retryable && (s.status === 'idle' || s.status === 'closed') ? html`<button type=\"button\" ?disabled=${this.busy || !client} @click=${() => client && void this.run(() => client.start())}>${strings.tryAgain}</button>` : nothing}</div>\n ${renderComposer({ strings, draft: this.draft, placeholder: this.typed?.placeholder ?? strings.placeholder, disabled: this.blocked, input: e => { this.draft = (e.target as HTMLTextAreaElement).value; this.requestUpdate(); }, send: this.send })}\n ${this.poweredBy ? html`<footer><a href=\"https://osvi.ai\" target=\"_blank\" rel=\"noopener noreferrer\">${strings.poweredBy}</a></footer>` : nothing}`;\n }\n}\n","export function defineOnce(name: string, ctor: CustomElementConstructor): void {\n if (typeof customElements === 'undefined' || customElements.get(name)) return;\n customElements.define(name, ctor);\n}\n","import { css, unsafeCSS } from 'lit';\nimport { cssVar } from './theme';\nexport const toolStyles = css`\n :host { display: block; font: inherit; color: ${unsafeCSS(cssVar('text'))}; background: ${unsafeCSS(cssVar('background'))}; }\n * { box-sizing: border-box; }\n button { font: inherit; color: inherit; background: ${unsafeCSS(cssVar('surface'))}; border: 1px solid currentColor; border-radius: var(--osvi-radius, 10px); padding: 10px 14px; cursor: pointer; }\n button:focus-visible { outline: 3px solid ${unsafeCSS(cssVar('primary'))}; outline-offset: 3px; }\n button:disabled { opacity: .5; cursor: default; }\n button[aria-pressed=\"true\"] { outline: 2px solid ${unsafeCSS(cssVar('primary'))}; }\n small { display: block; }\n .chips { display: flex; flex-wrap: wrap; gap: 8px; }\n .list { display: grid; gap: 6px; }\n .list button { width: 100%; text-align: left; }\n .card { background: ${unsafeCSS(cssVar('surface'))}; border-radius: var(--osvi-radius, 10px); padding: 12px; }\n .image { aspect-ratio: 16 / 9; display: grid; place-items: center; overflow: hidden; }\n .image img { width: 100%; height: 100%; object-fit: cover; }\n .navigation { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin: 10px 0; }\n .days, .weekdays { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 4px; text-align: center; }\n .days button { padding: 8px 0; }\n`;\n","import { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport type { InteractionMessage, InteractionResponse } from '../../core/protocol/types';\nimport { isInteractionPresentation } from '../../core/protocol/validators';\nimport { applyTheme, type ChatTheme } from '../theme';\nexport abstract class ToolElement extends LitElement {\n @property({ attribute: false }) interaction: InteractionMessage | null = null;\n @property({ type: Boolean }) disabled = false;\n @property({ attribute: false }) theme: ChatTheme | undefined;\n @property({ attribute: 'base-url' }) baseUrl = '';\n protected abstract readonly toolType: string;\n protected get live(): boolean { return !this.disabled && this.interaction?.interaction_status === 'pending'; }\n protected get valid(): boolean {\n const i = this.interaction;\n return !!i && i.tool_type === this.toolType && isInteractionPresentation(i, i.presentation);\n }\n protected respond(response: InteractionResponse): void {\n if (!this.interaction || !this.live || !this.valid) return;\n this.dispatchEvent(new CustomEvent('osvi-respond', { bubbles: true, composed: true, detail: { interactionId: this.interaction.interaction_id, response } }));\n }\n protected updated(changed: Map<PropertyKey, unknown>): void { if (changed.has('theme')) applyTheme(this, this.theme); }\n}\n","import { html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport type { ChoicePresentation } from '../../core/protocol/types';\nimport { toolStyles } from '../styles';\nimport { ToolElement } from './base';\nexport class OsviButtons extends ToolElement {\n static styles = toolStyles;\n protected readonly toolType = 'ui_buttons';\n @property() variant: 'chips' | 'list' = 'chips';\n render() {\n const i = this.interaction;\n if (!i) return nothing;\n if (!this.valid) return html`<p>${i.content}</p>`;\n const p = i.presentation as ChoicePresentation;\n const chosen = i.response_payload?.kind === 'text' ? i.response_payload.value : p.options.find(o => o.id === (i.response_payload?.kind === 'selection' ? i.response_payload.value : i.selected_option_id))?.label;\n return html`<p>${p.label}</p>${p.description ? html`<p>${p.description}</p>` : nothing}\n ${this.live ? html`<div role=\"group\" aria-label=\"Options\" class=${this.variant} @keydown=${this.onKey}>\n ${p.options.map(o => html`<button type=\"button\" @click=${() => this.pick(o.id, o.allow_input, o.input_placeholder)}><span>${o.label}</span>${o.description ? html`<small>${o.description}</small>` : nothing}</button>`)}\n </div>` : chosen ? html`<p>${chosen}</p>` : nothing}`;\n }\n private pick(id: string, allowInput?: true, placeholder?: string) {\n if (!this.live || !this.valid || !this.interaction) return;\n if (this.interaction.schema_version === 2 && allowInput) {\n this.dispatchEvent(new CustomEvent('osvi-request-input', { bubbles: true, composed: true, detail: { interactionId: this.interaction.interaction_id, placeholder } }));\n } else this.respond({ kind: 'selection', value: id });\n }\n private onKey(e: KeyboardEvent) {\n if (!['ArrowDown', 'ArrowUp', 'ArrowRight', 'ArrowLeft'].includes(e.key)) return;\n const list = [...this.renderRoot.querySelectorAll('button')];\n const at = list.indexOf((this.renderRoot as ShadowRoot).activeElement as HTMLButtonElement);\n const step = e.key === 'ArrowDown' || e.key === 'ArrowRight' ? 1 : -1;\n list[(at + step + list.length) % list.length]?.focus(); e.preventDefault();\n }\n}\n","import { html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport type { CarouselItem, CarouselPresentation } from '../../core/protocol/types';\nimport { isProxyImageUrl } from '../../core/protocol/validators';\nimport { toolStyles } from '../styles';\nimport { ToolElement } from './base';\nexport class OsviCarousel extends ToolElement {\n static styles = toolStyles;\n protected readonly toolType = 'ui_carousel';\n @property() variant: 'slider' | 'list' = 'slider';\n @state() private index = 0;\n @state() private imageFailed = new Set<number>();\n private pointerStart: number | undefined;\n private suppressPointerClick = false;\n protected willUpdate(changed: Map<PropertyKey, unknown>) {\n if (changed.has('interaction')) { this.index = 0; this.imageFailed = new Set(); this.pointerStart = undefined; this.suppressPointerClick = false; }\n }\n render() {\n const i = this.interaction;\n if (!i) return nothing;\n if (!this.valid) return html`<p>${i.content}</p>`;\n const p = i.presentation as CarouselPresentation;\n const chosen = p.items.find(item => item.id === (i.response_payload?.kind === 'selection' ? i.response_payload.value : i.selected_option_id));\n return html`<p>${p.label}</p>${p.description ? html`<p>${p.description}</p>` : nothing}\n ${!this.live ? chosen ? html`<p>${chosen.title}</p>` : nothing : this.variant === 'list'\n ? html`<div class=\"list\">${p.items.map((item, n) => this.card(item, n))}</div>`\n : html`<div @pointerdown=${(e: PointerEvent) => { this.pointerStart = e.clientX; this.suppressPointerClick = false; }} @pointerup=${(e: PointerEvent) => {\n if (this.pointerStart !== undefined && Math.abs(e.clientX - this.pointerStart) > 40) {\n this.suppressPointerClick = true;\n this.navigate(e.clientX < this.pointerStart ? 1 : -1, p.items.length);\n }\n this.pointerStart = undefined;\n }} @pointercancel=${() => { this.pointerStart = undefined; }}>${this.card(p.items[this.index]!, this.index)}</div>\n <div class=\"navigation\"><button type=\"button\" aria-label=\"Previous card\" ?disabled=${this.index === 0} @click=${() => this.navigate(-1, p.items.length)}>Previous</button>\n <span aria-live=\"polite\">${this.index + 1} of ${p.items.length}</span>\n <button type=\"button\" aria-label=\"Next card\" ?disabled=${this.index === p.items.length - 1} @click=${() => this.navigate(1, p.items.length)}>Next</button></div>`}`;\n }\n private navigate(delta: number, length: number) { this.index = Math.max(0, Math.min(length - 1, this.index + delta)); }\n private select(event: MouseEvent, id: string) {\n // Keyboard activation has detail 0; a swipe's synthesized pointer click must not select.\n if (this.suppressPointerClick && event.detail !== 0) {\n this.suppressPointerClick = false;\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.respond({ kind: 'selection', value: id });\n }\n private card(item: CarouselItem, index: number) {\n const image = item.image;\n return html`<article class=\"card\">${image && isProxyImageUrl(image.url) ? html`<div class=\"image\">${this.imageFailed.has(index)\n ? html`<span role=\"img\" aria-label=\"Image unavailable\">Image unavailable</span>`\n : html`<img src=${this.baseUrl.replace(/\\/$/, '') + image.url} alt=${image.alt} referrerpolicy=\"no-referrer\" loading=\"lazy\" @error=${() => { this.imageFailed = new Set([...this.imageFailed, index]); }}>`}</div>` : nothing}\n <h3>${item.title}</h3>${item.description ? html`<p>${item.description}</p>` : nothing}\n <button type=\"button\" @click=${(e: MouseEvent) => this.select(e, item.id)}>${item.action_label ?? 'Select'}</button></article>`;\n }\n}\n","import { html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport type { DatePickerPresentation } from '../../core/protocol/types';\nimport { isCalendarDate } from '../../core/protocol/validators';\nimport { toolStyles } from '../styles';\nimport { ToolElement } from './base';\nconst toIso = (d: Date) => `${String(d.getFullYear()).padStart(4, '0')}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\nconst today = () => toIso(new Date());\nconst parseDate = (iso: string) => { const d = new Date(0); d.setHours(0, 0, 0, 0); d.setFullYear(Number(iso.slice(0, 4)), Number(iso.slice(5, 7)) - 1, Number(iso.slice(8, 10))); return d; };\nconst monthOf = (iso: string) => iso.slice(0, 7);\nexport class OsviDatePicker extends ToolElement {\n static styles = toolStyles;\n protected readonly toolType = 'ui_date_picker';\n @property() variant = 'grid';\n @state() private month = monthOf(today());\n @state() private start = '';\n @state() private end = '';\n private earliest(p: DatePickerPresentation) { return p.min_date && p.min_date > today() ? p.min_date : today(); }\n protected willUpdate(changed: Map<PropertyKey, unknown>) {\n if (changed.has('interaction')) {\n this.start = ''; this.end = '';\n if (this.valid) this.month = monthOf(this.earliest(this.interaction!.presentation as DatePickerPresentation));\n }\n }\n render() {\n const i = this.interaction;\n if (!i) return nothing;\n if (!this.valid) return html`<p>${i.content}</p>`;\n const p = i.presentation as DatePickerPresentation;\n const response = i.response_payload;\n const chosen = response?.kind === 'date_range' ? `${response.value.start_date} – ${response.value.end_date}` : response?.kind === 'date' || response?.kind === 'text' ? response.value : i.selected_option_id;\n if (!this.live) return html`<p>${p.label}</p>${p.description ? html`<p>${p.description}</p>` : nothing}${chosen ? html`<p>${chosen}</p>` : nothing}`;\n const first = parseDate(`${this.month}-01`);\n const last = new Date(first); last.setMonth(last.getMonth() + 1, 0);\n const earliest = this.earliest(p);\n const days = Array.from({ length: last.getDate() }, (_, n) => `${this.month}-${String(n + 1).padStart(2, '0')}`);\n const hint = p.selection_mode === 'range' ? !this.start ? 'Choose check-in, then check-out.' : !this.end ? `Check-in: ${this.start}. Choose check-out.` : `${this.start} – ${this.end}` : this.start;\n return html`<p>${p.label}</p>${p.description ? html`<p>${p.description}</p>` : nothing}\n <div class=\"navigation\"><button type=\"button\" aria-label=\"Previous month\" ?disabled=${this.month <= monthOf(earliest)} @click=${() => this.moveMonth(-1, p)}>Previous</button>\n <span aria-live=\"polite\">${first.toLocaleDateString(undefined, { month: 'long', year: 'numeric' })}</span>\n <button type=\"button\" aria-label=\"Next month\" ?disabled=${!!p.max_date && this.month >= monthOf(p.max_date)} @click=${() => this.moveMonth(1, p)}>Next</button></div>\n <div class=\"weekdays\" aria-hidden=\"true\">${['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'].map(day => html`<span>${day}</span>`)}</div>\n <div class=\"days\" role=\"group\" aria-label=\"Choose date\" @keydown=${this.onKey}>\n ${Array.from({ length: first.getDay() }, () => html`<span></span>`)}\n ${days.map((day, n) => html`<button type=\"button\" aria-label=${day} aria-pressed=${day === this.start || day === this.end} ?disabled=${day < earliest || !!p.max_date && day > p.max_date} @click=${() => this.pick(day, p)}>${n + 1}</button>`)}\n </div><p aria-live=\"polite\">${hint}</p>\n <button type=\"button\" ?disabled=${!this.start || p.selection_mode === 'range' && (!this.end || this.start >= this.end)} @click=${() => this.confirm(p)}>${p.confirm_label ?? 'Confirm date'}</button>`;\n }\n private moveMonth(delta: number, p: DatePickerPresentation) {\n const date = parseDate(`${this.month}-01`); date.setMonth(date.getMonth() + delta);\n const next = monthOf(toIso(date));\n if (next >= monthOf(this.earliest(p)) && (!p.max_date || next <= monthOf(p.max_date))) this.month = next;\n }\n private pick(day: string, p: DatePickerPresentation) {\n if (!this.live || !this.valid || !isCalendarDate(day) || day < this.earliest(p) || p.max_date && day > p.max_date) return;\n if (p.selection_mode === 'single' || !this.start || this.end || day <= this.start) { this.start = day; this.end = ''; }\n else this.end = day;\n }\n private confirm(p: DatePickerPresentation) {\n if (!isCalendarDate(this.start) || this.start < this.earliest(p) || p.max_date && this.start > p.max_date) return;\n if (p.selection_mode === 'single') this.respond({ kind: 'date', value: this.start });\n else if (isCalendarDate(this.end) && this.start < this.end && (!p.max_date || this.end <= p.max_date)) this.respond({ kind: 'date_range', value: { start_date: this.start, end_date: this.end } });\n }\n private onKey(e: KeyboardEvent) {\n const steps: Record<string, number> = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -7, ArrowDown: 7 };\n const step = steps[e.key]; if (step === undefined) return;\n const buttons = [...this.renderRoot.querySelectorAll<HTMLButtonElement>('.days button')];\n const at = buttons.indexOf((this.renderRoot as ShadowRoot).activeElement as HTMLButtonElement);\n if (at < 0) return;\n let next = at + step;\n while (next >= 0 && next < buttons.length && buttons[next]?.disabled) next += step > 0 ? 1 : -1;\n buttons[next]?.focus(); e.preventDefault();\n }\n}\n","import { OsviChat } from './osvi-chat';\nimport { defineOnce } from './define';\nimport { OsviButtons } from './tools/osvi-buttons';\nimport { OsviCarousel } from './tools/osvi-carousel';\nimport { OsviDatePicker } from './tools/osvi-date-picker';\ndefineOnce('osvi-chat', OsviChat);\ndefineOnce('osvi-buttons', OsviButtons);\ndefineOnce('osvi-carousel', OsviCarousel);\ndefineOnce('osvi-date-picker', OsviDatePicker);\nexport { OsviButtons, OsviCarousel, OsviDatePicker };\nexport { defineOnce } from './define';\nexport { themeVariables, explicitThemeVariables, applyTheme, cssVar, type ChatTheme, type Variants } from './theme';\n\nexport { OsviChat };\nexport { DEFAULT_STRINGS, type ChatStrings } from './strings';\n"],"names":["LIGHT","DARK","RADII","VAR","cssVar","key","themeVariables","theme","colors","out","radius","explicitThemeVariables","full","applied","applyTheme","host","variables","value","DEFAULT_STRINGS","warned","warnOnce","name","message","oneOf","allowed","parseRadius","safeBaseUrl","u","safeAvatar","parseJsonAttr","parsed","URL_RE","count","s","ch","trimUrl","url","c","linkify","text","last","m","start","renderTranscript","state","strings","variants","baseUrl","retry","html","repeat","item","nothing","p","i","live","disabled","renderComposer","o","e","emptyState","bool","v","_OsviChat","_a","LitElement","client","typed","event","d","own","generation","attr","rawColors","mode","source","action","tool","id","log","avatar","el","createChatClient","css","__decorateClass","property","OsviChat","defineOnce","ctor","toolStyles","unsafeCSS","ToolElement","isInteractionPresentation","response","changed","_OsviButtons","chosen","allowInput","placeholder","list","at","step","OsviButtons","_OsviCarousel","n","delta","length","index","image","isProxyImageUrl","OsviCarousel","toIso","today","parseDate","iso","monthOf","_OsviDatePicker","first","earliest","days","_","hint","day","date","next","isCalendarDate","buttons","OsviDatePicker"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ui.mjs","sources":["../src/ui/theme.ts","../src/ui/strings.ts","../src/ui/panel/attrs.ts","../src/ui/panel/linkify.ts","../src/ui/panel/transcript.ts","../src/ui/icons.ts","../src/ui/panel/composer.ts","../src/ui/osvi-chat.ts","../src/ui/define.ts","../src/ui/styles.ts","../src/ui/tools/base.ts","../src/ui/tools/osvi-buttons.ts","../src/ui/tools/osvi-carousel.ts","../src/ui/tools/osvi-date-picker.ts","../src/ui/index.ts"],"sourcesContent":["export interface ChatTheme {\n colors?: Partial<Record<'primary' | 'background' | 'surface' | 'text' | 'userBubble' | 'assistantBubble', string>>;\n radius?: 'none' | 'sm' | 'md' | 'lg' | 'full' | number;\n mode?: 'light' | 'dark';\n}\nexport interface Variants { buttons?: 'chips' | 'list'; carousel?: 'slider' | 'list' }\nconst LIGHT = { primary: '#4f46e5', background: '#ffffff', surface: '#f4f4f5', text: '#18181b', userBubble: '#4f46e5', assistantBubble: '#f4f4f5' };\nconst DARK = { primary: '#6366f1', background: '#0a0a12', surface: '#1c1c27', text: '#f4f4f5', userBubble: '#6366f1', assistantBubble: '#1f1f2b' };\nconst RADII = { none: '0px', sm: '6px', md: '10px', lg: '16px', full: '9999px' };\nconst VAR = { primary: '--osvi-color-primary', background: '--osvi-color-background', surface: '--osvi-color-surface', text: '--osvi-color-text', userBubble: '--osvi-color-user-bubble', assistantBubble: '--osvi-color-assistant-bubble' };\nexport const cssVar = (key: keyof typeof LIGHT): string => `var(${VAR[key]}, ${LIGHT[key]})`;\nexport function themeVariables(theme: ChatTheme | undefined): Record<string, string> {\n const colors = { ...(theme?.mode === 'dark' ? DARK : LIGHT), ...theme?.colors };\n // The user's bubble is brand-coloured unless the customer picks it separately.\n if (!theme?.colors?.userBubble && theme?.colors?.primary) colors.userBubble = theme.colors.primary;\n const out: Record<string, string> = {};\n for (const key of Object.keys(VAR) as (keyof typeof LIGHT)[]) out[VAR[key]] = colors[key];\n const radius = theme?.radius ?? 'md';\n out['--osvi-radius'] = typeof radius === 'number' ? `${radius}px` : RADII[radius];\n return out;\n}\nexport function explicitThemeVariables(theme: ChatTheme | undefined): Record<string, string> {\n if (!theme) return {};\n if (theme.mode) return themeVariables(theme);\n const full = themeVariables(theme), out: Record<string, string> = {};\n for (const key of Object.keys(theme.colors ?? {}) as (keyof typeof LIGHT)[]) out[VAR[key]] = full[VAR[key]]!;\n if (theme.radius !== undefined) out['--osvi-radius'] = full['--osvi-radius']!;\n return out;\n}\nconst applied = new WeakMap<HTMLElement, string[]>();\nexport function applyTheme(host: HTMLElement, theme: ChatTheme | undefined): void {\n for (const key of applied.get(host) ?? []) host.style.removeProperty(key);\n const variables = explicitThemeVariables(theme);\n for (const [key, value] of Object.entries(variables)) host.style.setProperty(key, value);\n applied.set(host, Object.keys(variables));\n}\n","export const DEFAULT_STRINGS = {\nplaceholder: 'Type your message…', send: 'Send', typing: 'Typing…', humanJoined: 'A team member has joined', chooseOption: 'Choose an option to continue.', typeAnswer: 'Type your answer below, then press Send.', sending: 'Sending your response…', pausedForHuman: 'Choices are paused while a team member is connected.', sendFailed: 'Message not sent.', retry: 'Retry', sessionEnded: 'Conversation ended', reconnecting: 'Reconnecting…', offline: 'You are offline. We will reconnect automatically.', unavailable: 'This chat is unavailable.', originBlocked: 'This chat is not enabled for this website.', rateLimited: 'Too many requests. Please try again in a few minutes.', tryAgain: 'Try again', closeChat: 'Close chat', poweredBy: 'Powered by Osvi AI', newChat: 'New chat', emptyState: 'Send a message to start chatting.', defaultTitle: 'Chat',\n};\nexport type ChatStrings = { [K in keyof typeof DEFAULT_STRINGS]: string };\n","import type { ChatTheme } from '../theme';\nconst warned = new Set<string>();\nfunction warnOnce(name: string, message: string) { if (!warned.has(name)) { warned.add(name); console.warn(`[osvi-chat] ${message}`); } }\nexport function oneOf<T extends string>(value: string | null | undefined, allowed: readonly T[]): T | undefined { return value != null && (allowed as readonly string[]).includes(value) ? value as T : undefined; }\nexport function parseRadius(value: string | null | undefined): ChatTheme['radius'] | undefined {\n if (value == null) return undefined;\n return oneOf(value, ['none', 'sm', 'md', 'lg', 'full'] as const) ?? (/^\\d{1,2}(?:px)?$/.test(value) ? Number(value.replace(/px$/, '')) : undefined);\n}\nexport function safeBaseUrl(value: string | null | undefined): string | undefined {\n if (!value) return undefined;\n try { const u = new URL(value); if (!u.username && !u.password && (u.protocol === 'https:' || u.protocol === 'http:' && ['localhost', '127.0.0.1'].includes(u.hostname))) return value.replace(/\\/+$/, ''); } catch { /* ignored */ }\n warnOnce('base-url', 'ignored an invalid base-url (https required, http only for localhost)'); return undefined;\n}\nexport function safeAvatar(value: string | null | undefined): string | undefined {\n if (!value) return undefined;\n if (/^data:image\\/(png|jpeg|gif|webp);base64,[a-z0-9+/]+={0,2}$/i.test(value)) return value;\n try { const u = new URL(value); if (u.protocol === 'https:' && !u.username && !u.password) return value; } catch { /* ignored */ }\n return undefined;\n}\nexport function parseJsonAttr(name: string, value: string | null | undefined): Record<string, unknown> | undefined {\n if (!value) return undefined;\n try { const parsed: unknown = JSON.parse(value); if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) return parsed as Record<string, unknown>; } catch { /* warn below */ }\n warnOnce(name, `ignored invalid JSON in the ${name} attribute`); return undefined;\n}\n","export type LinkPart = { text: string } | { href: string; text: string };\nconst URL_RE = /https?:\\/\\/[^\\s<>\"']+/g;\nconst count = (s: string, ch: string) => s.split(ch).length - 1;\nfunction trimUrl(url: string): string {\n for (;;) { const c = url[url.length - 1];\n if (c && '.,!?;:'.includes(c) || c === ')' && count(url, ')') > count(url, '(') || c === ']' && count(url, ']') > count(url, '[')) { url = url.slice(0, -1); continue; } return url; }\n}\nexport function linkify(text: string): LinkPart[] {\n const out: LinkPart[] = []; let last = 0;\n for (const m of text.matchAll(URL_RE)) { const url = trimUrl(m[0]), start = m.index!;\n try { const u = new URL(url); if (!['http:', 'https:'].includes(u.protocol)) continue; } catch { continue; }\n if (start > last) out.push({ text: text.slice(last, start) }); out.push({ href: url, text: url }); last = start + url.length; }\n if (last < text.length) out.push({ text: text.slice(last) }); return out.length ? out : [{ text }];\n}\n","import { html, nothing } from 'lit';\nimport { repeat } from 'lit/directives/repeat.js';\nimport type { ChatState } from '../../core';\nimport type { ChatStrings } from '../strings';\nimport type { Variants } from '../theme';\nimport { linkify } from './linkify';\nexport function renderTranscript(state: ChatState, strings: ChatStrings, variants: Variants, baseUrl: string, retry: (id: string) => void) {\n return html`${state.items.length ? repeat(state.items, item => item.id, item => {\n if (item.kind === 'divider') return html`<p class=\"divider\">${strings.sessionEnded}</p>`;\n if (item.kind === 'message') return html`<article class=${`bubble ${item.role}`}>${item.role === 'human' ? html`<small class=\"team\">Team</small>` : nothing}<p>${linkify(item.content).map(p => 'href' in p ? html`<a href=${p.href} target=\"_blank\" rel=\"noopener noreferrer\">${p.text}</a>` : p.text)}</p>${item.role === 'user' && item.status === 'failed' ? html`<span class=\"failed\"><span>${strings.sendFailed}</span><button type=\"button\" @click=${() => retry(item.id)}>${strings.retry}</button></span>` : nothing}</article>`;\n const i = item.interaction, live = i.interaction_id === state.activeInteraction?.interaction_id && i.interaction_status === 'pending';\n const disabled = !live || state.interactionPending || state.mode === 'human';\n switch (i.tool_type) {\n case 'ui_buttons': return html`<osvi-buttons data-live=${live ? 'true' : 'false'} .interaction=${i} .disabled=${disabled} .variant=${variants.buttons ?? 'chips'} base-url=${baseUrl}></osvi-buttons>`;\n case 'ui_carousel': return html`<osvi-carousel data-live=${live ? 'true' : 'false'} .interaction=${i} .disabled=${disabled} .variant=${variants.carousel ?? 'slider'} base-url=${baseUrl}></osvi-carousel>`;\n case 'ui_date_picker': return html`<osvi-date-picker data-live=${live ? 'true' : 'false'} .interaction=${i} .disabled=${disabled} base-url=${baseUrl}></osvi-date-picker>`;\n default: return html`<p>${i.content}</p>`;\n }\n }) : html`<p class=\"empty\">${strings.emptyState}</p>`}${state.awaitingReply ? html`<div class=\"typing\" role=\"img\" aria-label=${strings.typing}><i></i><i></i><i></i></div>` : nothing}`;\n}\n","import { svg } from 'lit';\n\n// Inline icons (no network, no font). Each SVG is decorative; buttons carry their own text label.\nconst stroke = (d: unknown, cls = '') => svg`<svg class=${cls} viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${d}</svg>`;\nexport const chatIcon = stroke(svg`<path d=\"M4 5.5A2.5 2.5 0 0 1 6.5 3h11A2.5 2.5 0 0 1 20 5.5v8a2.5 2.5 0 0 1-2.5 2.5H10l-4.2 3.6c-.5.4-1.3.1-1.3-.6V16A2.5 2.5 0 0 1 4 13.5z\"/><path d=\"M8.5 8.5h7M8.5 11.5h4\"/>`);\nexport const newChatIcon = stroke(svg`<path d=\"M4 5.5A2.5 2.5 0 0 1 6.5 3h11A2.5 2.5 0 0 1 20 5.5v8a2.5 2.5 0 0 1-2.5 2.5H10l-4.2 3.6c-.5.4-1.3.1-1.3-.6V16A2.5 2.5 0 0 1 4 13.5z\"/><path d=\"M12 6.5v6M9 9.5h6\"/>`);\nexport const closeIcon = stroke(svg`<path d=\"M6 6l12 12M18 6L6 18\"/>`);\nexport const launcherChatIcon = stroke(svg`<path d=\"M4 5.5A2.5 2.5 0 0 1 6.5 3h11A2.5 2.5 0 0 1 20 5.5v8a2.5 2.5 0 0 1-2.5 2.5H10l-4.2 3.6c-.5.4-1.3.1-1.3-.6V16A2.5 2.5 0 0 1 4 13.5z\"/><path d=\"M8.5 8.5h7M8.5 11.5h4\"/>`, 'chat');\nexport const launcherCloseIcon = stroke(svg`<path d=\"M6 6l12 12M18 6L6 18\"/>`, 'close');\nexport const sendIcon = stroke(svg`<path d=\"M12 19V5M5.5 11.5L12 5l6.5 6.5\"/>`);\nexport const leftIcon = stroke(svg`<path d=\"M15 6l-6 6 6 6\"/>`);\nexport const rightIcon = stroke(svg`<path d=\"M9 6l6 6-6 6\"/>`);\n\n// Osvi AI mark. Ids are scoped by the shadow root each copy renders into.\nexport const osviLogo = svg`<svg viewBox=\"0 0 134 134\" aria-hidden=\"true\" focusable=\"false\"><defs><linearGradient id=\"osvi-g\" x1=\"-36.28\" y1=\"32.2\" x2=\"161.98\" y2=\"93.64\" gradientUnits=\"userSpaceOnUse\"><stop offset=\".304\" stop-color=\"#155DFC\"/><stop offset=\".822\" stop-color=\"#353333\"/></linearGradient><mask id=\"osvi-m\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"-7\" y=\"-6\" width=\"149\" height=\"150\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#0F0F0F\" d=\"M141.385 114.008L141.622 108.411V29.4704L141.385 23.8743C139.964 7.44314 126.224 -5.41602 109.523 -5.41602H25.3094C8.60869 -5.41602 -5.13083 7.44314 -6.55216 23.8743L-6.78906 29.4704V108.411L-6.55216 114.008C-5.13083 130.439 8.60869 143.298 25.3094 143.298H109.523C126.224 143.298 139.964 130.439 141.385 114.008ZM25.3094 102.339C9.55625 102.339 65.7059 83.8874 53.6176 66.6191C42.3654 50.5452 93.7703 32.6852 109.523 32.6852C125.277 32.6852 73.161 54.1172 81.4521 80.9071C86.1899 96.2156 40.944 102.339 25.3094 102.339Z\"/></mask></defs><g mask=\"url(#osvi-m)\"><ellipse cx=\"66.88\" cy=\"66.79\" rx=\"67.22\" ry=\"66.81\" fill=\"url(#osvi-g)\"/></g></svg>`;\n","import { html } from 'lit';\nimport { live } from 'lit/directives/live.js';\nimport type { ChatStrings } from '../strings';\nimport { sendIcon } from '../icons';\nexport interface ComposerOptions { strings: ChatStrings; draft: string; placeholder: string; disabled: boolean; input: (event: Event) => void; send: () => void }\nexport function renderComposer(o: ComposerOptions) {\n return html`<div class=\"composer\"><textarea rows=\"1\" aria-label=\"Message\" placeholder=${o.placeholder} .value=${live(o.draft)} ?disabled=${o.disabled} @input=${(e: Event) => { const ta = e.target as HTMLTextAreaElement; ta.style.height = 'auto'; ta.style.height = `${Math.min(ta.scrollHeight, 120)}px`; o.input(e); }} @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey && !e.isComposing && !o.disabled) { e.preventDefault(); o.send(); } }}></textarea><button type=\"button\" class=\"send\" title=${o.strings.send} aria-label=${o.strings.send} ?disabled=${o.disabled || !o.draft.trim()} @click=${o.send}>${sendIcon}<span class=\"sr\">${o.strings.send}</span></button></div>`;\n}\n","import { LitElement, css, html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { createChatClient, type ChatClient, type ChatState, type InteractionResponse } from '../core';\nimport { applyTheme, type ChatTheme, type Variants } from './theme';\nimport { DEFAULT_STRINGS, type ChatStrings } from './strings';\nimport { oneOf, parseJsonAttr, parseRadius, safeAvatar, safeBaseUrl } from './panel/attrs';\nimport { renderTranscript } from './panel/transcript';\nimport { renderComposer } from './panel/composer';\nimport { closeIcon, newChatIcon, osviLogo } from './icons';\nconst emptyState = (): ChatState => ({ status: 'idle', mode: 'ai', awaitingReply: false, items: [], activeInteraction: null, interactionPending: false, agent: null, error: null });\nconst bool = { fromAttribute: (v: string | null) => v !== 'false' };\nexport class OsviChat extends LitElement {\n static clientFactory = createChatClient;\n static properties = { themeAttribute: { attribute: 'theme' }, stringsAttribute: { attribute: 'strings' } };\n static styles = css`\n :host { --p:var(--osvi-color-primary,#4f46e5); --bg:var(--osvi-color-background,#fff); --surface:var(--osvi-color-surface,#f4f4f5); --text:var(--osvi-color-text,#18181b);\n --ub:var(--osvi-color-user-bubble,var(--p)); --ab:var(--osvi-color-assistant-bubble,var(--surface)); --r:var(--osvi-radius,14px);\n --sub:color-mix(in srgb,var(--text) 58%,var(--bg)); --line:color-mix(in srgb,var(--text) 11%,var(--bg));\n display:flex; flex-direction:column; height:100%; min-height:260px; color:var(--text); background:var(--bg); font-family:inherit; font-size:14px; line-height:1.5; border-radius:var(--r); overflow:hidden; }\n * { box-sizing:border-box; } h2,p { margin:0; }\n button,textarea { font:inherit; color:inherit; } button { cursor:pointer; } button:disabled { cursor:default; opacity:.45; }\n button:focus-visible,textarea:focus-visible,a:focus-visible { outline:3px solid color-mix(in srgb,var(--p) 55%,transparent); outline-offset:2px; }\n .sr { position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; }\n header { display:flex; align-items:center; gap:12px; padding:14px 12px 14px 16px; border-bottom:1px solid var(--line); }\n .avatar { width:38px; height:38px; border-radius:50%; flex:none; object-fit:cover; display:grid; place-items:center; background:var(--p); color:#fff; font-weight:700; font-size:15px; }\n .heading { flex:1; min-width:0; } h2 { font-size:15px; line-height:1.3; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n .heading p,.heading small { display:block; font-size:12.5px; color:var(--sub); }\n .heading small { color:var(--p); font-weight:600; }\n .icon { width:34px; height:34px; border:0; border-radius:10px; background:transparent; color:var(--sub); display:grid; place-items:center; flex:none; }\n .icon:hover:not(:disabled) { background:var(--surface); color:var(--text); } .icon svg { width:18px; height:18px; }\n .transcript { flex:1; overflow:auto; padding:18px 16px; min-height:0; display:flex; flex-direction:column; gap:10px; }\n .empty { margin:auto; color:var(--sub); text-align:center; }\n .bubble { width:fit-content; max-width:84%; padding:10px 14px; border-radius:var(--r); border-bottom-left-radius:6px; background:var(--ab); overflow-wrap:anywhere; white-space:pre-wrap; }\n .bubble.user { align-self:flex-end; color:#fff; background:var(--ub); border-bottom-left-radius:var(--r); border-bottom-right-radius:6px; }\n .bubble a { color:inherit; } .team { display:block; font-size:11px; font-weight:600; color:var(--p); margin-bottom:2px; }\n .failed { display:flex; align-items:center; gap:8px; font-size:12px; margin-top:6px; } .failed button { border:0; background:rgb(255 255 255/.2); border-radius:8px; padding:2px 8px; }\n .divider { display:flex; align-items:center; gap:10px; color:var(--sub); font-size:12px; } .divider::before,.divider::after { content:\"\"; flex:1; height:1px; background:var(--line); }\n .typing { display:inline-flex; gap:4px; padding:12px 14px; background:var(--ab); border-radius:var(--r); border-bottom-left-radius:6px; width:fit-content; }\n .typing i { width:6px; height:6px; border-radius:50%; background:var(--sub); animation:osvi-dot 1.2s infinite; } .typing i:nth-child(2) { animation-delay:.15s; } .typing i:nth-child(3) { animation-delay:.3s; }\n @keyframes osvi-dot { 0%,60%,100% { opacity:.35; transform:none; } 30% { opacity:1; transform:translateY(-3px); } }\n osvi-buttons,osvi-carousel,osvi-date-picker { display:block; max-width:100%; }\n .status { padding:0 16px; font-size:12.5px; color:var(--sub); display:flex; gap:8px; align-items:center; } .status:empty { display:none; }\n .status button { border:1px solid var(--line); background:var(--bg); border-radius:8px; padding:3px 10px; }\n .composer { margin:10px 12px; display:flex; align-items:flex-end; gap:8px; border:1px solid var(--line); border-radius:18px; padding:6px 6px 6px 14px; background:var(--surface); }\n .composer:focus-within { border-color:var(--p); box-shadow:0 0 0 3px color-mix(in srgb,var(--p) 18%,transparent); }\n textarea { flex:1; min-width:0; border:0; outline:0; background:transparent; resize:none; min-height:24px; max-height:120px; padding:6px 0; field-sizing:content; }\n textarea::placeholder { color:var(--sub); } textarea:focus-visible { outline:0; }\n .send { width:36px; height:36px; border:0; border-radius:50%; background:var(--p); color:#fff; display:grid; place-items:center; flex:none; } .send svg { width:17px; height:17px; }\n footer { padding:0 16px 12px; text-align:center; font-size:11.5px; } footer a { color:var(--sub); text-decoration:none; display:inline-flex; align-items:center; gap:6px; }\n footer a:hover { color:var(--text); } footer svg { width:14px; height:14px; flex:none; }\n @media (prefers-reduced-motion:reduce) { .typing i { animation:none; } }\n `;\n @property({ attribute: 'agent-id' }) agentId = '';\n @property({ attribute: 'base-url' }) baseUrl = '';\n @property({ attribute: false }) client: ChatClient | null = null;\n @property({ attribute: false }) theme: ChatTheme = {};\n @property({ attribute: false }) variants: Variants = {};\n @property({ attribute: false }) strings: Partial<ChatStrings> = {};\n @property({ attribute: 'powered-by', converter: bool }) poweredBy = true;\n @property({ attribute: 'new-chat', converter: bool }) newChat = true;\n @property({ attribute: 'new-chat-history' }) newChatHistory: string | undefined; // 'clear' (default) | 'keep'\n @property({ attribute: false }) header: { title?: string; subtitle?: string; avatarUrl?: string } = {};\n @property({ type: Boolean }) closable = false;\n @property({ attribute: 'header-title' }) headerTitle: string | undefined;\n @property({ attribute: 'header-subtitle' }) headerSubtitle: string | undefined;\n @property({ attribute: 'header-avatar' }) headerAvatar: string | undefined;\n @property({ attribute: 'primary-color' }) primaryColor: string | undefined;\n @property() radius: string | undefined;\n @property() mode: string | undefined;\n @property() buttons: string | undefined;\n @property() carousel: string | undefined;\n declare themeAttribute: string | undefined;\n declare stringsAttribute: string | undefined;\n @state() private chatState = emptyState();\n @state() private draft = '';\n @state() private busy = false;\n @state() private typed: { id: string; placeholder?: string; previousDraft: string } | null = null;\n private ownClient: ChatClient | null = null;\n private boundClient: ChatClient | null = null;\n private ownKey = '';\n private unsubscribe: (() => void) | undefined;\n private generation = 0;\n private followBottom = true;\n private focusedInteraction: string | null = null;\n connectedCallback() { super.connectedCallback(); this.syncClient(); }\n disconnectedCallback() { super.disconnectedCallback(); this.releaseClient(); }\n private releaseClient() {\n ++this.generation; this.unsubscribe?.(); this.unsubscribe = undefined;\n this.boundClient = null; const own = this.ownClient; this.ownClient = null; this.ownKey = '';\n own?.destroy(); this.busy = false; this.typed = null; this.focusedInteraction = null; this.requestUpdate();\n }\n private syncClient() {\n if (!this.isConnected) return;\n if (!this.client && !this.agentId && !this.boundClient) return;\n const key = JSON.stringify([this.agentId, safeBaseUrl(this.baseUrl)]);\n if (this.client ? this.boundClient === this.client && !this.ownClient : this.ownClient && key === this.ownKey) return;\n this.releaseClient(); this.chatState = emptyState();\n if (!this.client && !this.agentId) return;\n const own = !this.client;\n const client = this.client ?? OsviChat.clientFactory({ agentId: this.agentId, baseUrl: safeBaseUrl(this.baseUrl) });\n this.boundClient = client;\n if (own) { this.ownClient = client; this.ownKey = key; }\n const generation = this.generation;\n this.chatState = client.getState(); this.requestUpdate();\n this.unsubscribe = client.subscribe(state => {\n if (this.generation !== generation || this.boundClient !== client) return;\n this.chatState = state; this.requestUpdate();\n if (this.typed && (state.mode === 'human' || state.activeInteraction?.interaction_id !== this.typed.id || state.activeInteraction.interaction_status !== 'pending')) this.restoreDraft();\n });\n if (own) void this.run(() => client.start());\n }\n protected willUpdate() { this.syncClient(); applyTheme(this, this.mergedTheme()); }\n private mergedTheme(): ChatTheme {\n const attr = parseJsonAttr('theme', this.themeAttribute);\n const colors: NonNullable<ChatTheme['colors']> = {};\n const rawColors = attr?.colors;\n if (rawColors && typeof rawColors === 'object' && !Array.isArray(rawColors)) {\n for (const key of ['primary', 'background', 'surface', 'text', 'userBubble', 'assistantBubble'] as const) {\n const value = (rawColors as Record<string, unknown>)[key]; if (typeof value === 'string') colors[key] = value;\n }\n }\n if (typeof this.primaryColor === 'string') colors.primary = this.primaryColor;\n const radius = parseRadius(this.radius) ?? (typeof attr?.radius === 'number' && Number.isInteger(attr.radius) && attr.radius >= 0 && attr.radius <= 99 ? attr.radius : typeof attr?.radius === 'string' ? parseRadius(attr.radius) : undefined);\n const mode = oneOf(this.mode, ['light', 'dark'] as const) ?? oneOf(typeof attr?.mode === 'string' ? attr.mode : undefined, ['light', 'dark'] as const);\n return { ...this.theme, colors: { ...this.theme?.colors, ...colors }, ...(radius === undefined ? {} : { radius }), ...(mode === undefined ? {} : { mode }) };\n }\n private get labels(): ChatStrings {\n const out = { ...DEFAULT_STRINGS };\n for (const source of [this.strings, parseJsonAttr('strings', this.stringsAttribute)]) {\n for (const key of Object.keys(DEFAULT_STRINGS) as (keyof ChatStrings)[]) if (typeof source?.[key] === 'string') out[key] = source[key] as string;\n }\n return out;\n }\n private get blocked() {\n const s = this.chatState;\n return !this.boundClient || this.busy || s.status === 'connecting' || s.status === 'closed' && !!s.error && !s.error.retryable || s.mode === 'ai' && (s.interactionPending || s.activeInteraction?.interaction_status === 'pending' && !this.typed);\n }\n private get sessionBusy() { return this.busy || this.chatState.status === 'connecting' || this.chatState.interactionPending || this.chatState.items.some(i => i.kind === 'message' && i.status === 'sending'); }\n private async run(action: () => unknown): Promise<void> {\n if (this.busy || !this.boundClient) return;\n const generation = this.generation; this.busy = true; this.requestUpdate();\n try { await action(); } catch { /* Client state owns errors; prevent unhandled rejections from host callbacks. */ }\n finally { if (this.generation === generation) { this.busy = false; this.requestUpdate(); } }\n }\n private restoreDraft() { if (this.typed) { this.draft = this.typed.previousDraft; this.typed = null; this.requestUpdate(); } }\n private send = () => {\n if (this.blocked || !this.draft.trim() || !this.boundClient) return;\n const client = this.boundClient, value = this.draft.trim(), typed = this.typed;\n this.draft = ''; if (typed) this.restoreDraft(); this.requestUpdate();\n const box = this.renderRoot.querySelector<HTMLTextAreaElement>('textarea'); if (box) box.style.height = '';\n void this.run(() => typed ? client.respond(typed.id, { kind: 'text', value }) : client.send(value));\n };\n private respond = (event: CustomEvent<{ interactionId: string; response: InteractionResponse }>) => {\n const d = event.detail, s = this.chatState;\n if (!d || this.busy || s.mode !== 'ai' || s.interactionPending || s.activeInteraction?.interaction_status !== 'pending' || d.interactionId !== s.activeInteraction.interaction_id) return;\n event.stopPropagation(); const client = this.boundClient; if (client) void this.run(() => client.respond(d.interactionId, d.response));\n };\n private requestInput = (event: CustomEvent<{ interactionId: string; placeholder?: string }>) => {\n const d = event.detail, s = this.chatState;\n if (!d || this.busy || s.mode !== 'ai' || s.interactionPending || s.activeInteraction?.interaction_status !== 'pending' || d.interactionId !== s.activeInteraction.interaction_id) return;\n event.stopPropagation();\n this.typed = { id: d.interactionId, placeholder: typeof d.placeholder === 'string' ? d.placeholder : undefined, previousDraft: this.typed?.previousDraft ?? this.draft };\n this.draft = ''; this.requestUpdate(); void this.updateComplete.then(() => this.renderRoot.querySelector('textarea')?.focus());\n };\n async focusActiveInteraction(): Promise<void> {\n await this.updateComplete;\n if (!this.isConnected || this.chatState.activeInteraction?.interaction_status !== 'pending') return;\n const tool = this.renderRoot.querySelector<LitElement>('[data-live=\"true\"]');\n if (!tool) return; const id = this.chatState.activeInteraction.interaction_id;\n await tool.updateComplete;\n if (!this.isConnected || this.chatState.activeInteraction?.interaction_id !== id) return;\n tool.shadowRoot?.querySelector<HTMLElement>('button:not(:disabled),input:not(:disabled),select:not(:disabled),textarea:not(:disabled),[tabindex=\"0\"]')?.focus();\n }\n protected updated() {\n const log = this.renderRoot.querySelector<HTMLElement>('.transcript');\n if (log && this.followBottom) log.scrollTop = log.scrollHeight;\n const id = this.chatState.activeInteraction?.interaction_status === 'pending' ? this.chatState.activeInteraction.interaction_id : null;\n if (id !== this.focusedInteraction) {\n this.focusedInteraction = id;\n if (id && this.isConnected && !this.hidden && document.visibilityState !== 'hidden') void this.focusActiveInteraction();\n }\n }\n private statusText(strings: ChatStrings): string {\n const s = this.chatState;\n if (s.error?.code === 'origin_not_allowed') return strings.originBlocked;\n if (s.error && ['agent_inactive', 'agent_archived', 'agent_not_found'].includes(s.error.code)) return strings.unavailable;\n if (s.error?.code === 'rate_limited') return strings.rateLimited;\n if (s.error?.code === 'token_failed') return s.error.message;\n if (s.status === 'recovering') return strings.reconnecting;\n if (s.status === 'offline') return strings.offline;\n if (s.interactionPending || this.busy && this.typed) return strings.sending;\n if (s.activeInteraction?.interaction_status === 'pending') return s.mode === 'human' ? strings.pausedForHuman : this.typed ? strings.typeAnswer : strings.chooseOption;\n if (s.status === 'closed') return strings.sessionEnded;\n return '';\n }\n render() {\n const strings = this.labels, s = this.chatState, client = this.boundClient;\n const avatar = safeAvatar(this.headerAvatar ?? this.header.avatarUrl);\n const variants: Variants = { ...this.variants, ...(oneOf(this.buttons, ['chips', 'list'] as const) ? { buttons: oneOf(this.buttons, ['chips', 'list'] as const) } : {}), ...(oneOf(this.carousel, ['slider', 'list'] as const) ? { carousel: oneOf(this.carousel, ['slider', 'list'] as const) } : {}) };\n const title = this.headerTitle ?? this.header.title ?? s.agent?.name ?? strings.defaultTitle;\n return html`<header>${avatar ? html`<img class=\"avatar\" src=${avatar} alt=\"\" referrerpolicy=\"no-referrer\">` : html`<span class=\"avatar\" aria-hidden=\"true\">${title.trim().charAt(0).toUpperCase()}</span>`}<div class=\"heading\"><h2>${title}</h2>${this.headerSubtitle ?? this.header.subtitle ? html`<p>${this.headerSubtitle ?? this.header.subtitle}</p>` : nothing}${s.mode === 'human' ? html`<small>${strings.humanJoined}</small>` : nothing}</div>\n ${this.newChat ? html`<button type=\"button\" class=\"icon\" title=${strings.newChat} ?disabled=${!client || this.sessionBusy} @click=${() => client && !this.sessionBusy && void this.run(() => client.newSession({ keepHistory: this.newChatHistory === 'keep' }))}>${newChatIcon}<span class=\"sr\">${strings.newChat}</span></button>` : nothing}\n ${this.closable ? html`<button type=\"button\" class=\"icon\" title=${strings.closeChat} aria-label=${strings.closeChat} @click=${() => this.dispatchEvent(new CustomEvent('osvi-close', { bubbles: true, composed: true }))}>${closeIcon}</button>` : nothing}</header>\n <div class=\"transcript\" role=\"log\" aria-live=\"polite\" aria-label=\"Conversation\" @scroll=${(e: Event) => { const el = e.currentTarget as HTMLElement; this.followBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= 80; }} @osvi-respond=${this.respond} @osvi-request-input=${this.requestInput}>${renderTranscript(s, strings, variants, client?.resolveUrl('') ?? '', id => { if (client) void this.run(() => client.retry(id)); })}</div>\n <div class=\"status\" role=\"status\">${this.statusText(strings)}${s.error?.retryable && (s.status === 'idle' || s.status === 'closed') ? html`<button type=\"button\" ?disabled=${this.busy || !client} @click=${() => client && void this.run(() => client.start())}>${strings.tryAgain}</button>` : nothing}</div>\n ${renderComposer({ strings, draft: this.draft, placeholder: this.typed?.placeholder ?? strings.placeholder, disabled: this.blocked, input: e => { this.draft = (e.target as HTMLTextAreaElement).value; this.requestUpdate(); }, send: this.send })}\n ${this.poweredBy ? html`<footer><a href=\"https://osvi.ai\" target=\"_blank\" rel=\"noopener noreferrer\">${osviLogo}<span>${strings.poweredBy}</span></a></footer>` : nothing}`;\n }\n}\n","export function defineOnce(name: string, ctor: CustomElementConstructor): void {\n if (typeof customElements === 'undefined' || customElements.get(name)) return;\n customElements.define(name, ctor);\n}\n","import { css, unsafeCSS } from 'lit';\nimport { cssVar } from './theme';\nconst v = (k: Parameters<typeof cssVar>[0]) => unsafeCSS(cssVar(k));\nexport const toolStyles = css`\n :host { --p:${v('primary')}; --bg:${v('background')}; --surface:${v('surface')}; --text:${v('text')}; --r:var(--osvi-radius,14px);\n --sub:color-mix(in srgb,var(--text) 58%,var(--bg)); --line:color-mix(in srgb,var(--text) 11%,var(--bg));\n display:block; font:inherit; color:var(--text); }\n * { box-sizing:border-box; }\n p { margin:0 0 6px; } .label { font-weight:600; } .description { color:var(--sub); font-size:13px; }\n .answer { display:inline-block; margin-top:2px; padding:4px 10px; border-radius:999px; background:color-mix(in srgb,var(--p) 12%,var(--bg)); color:var(--p); font-weight:600; font-size:13px; }\n .sr { position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; }\n button { font:inherit; color:inherit; cursor:pointer; }\n button:focus-visible { outline:3px solid color-mix(in srgb,var(--p) 55%,transparent); outline-offset:2px; }\n button:disabled { opacity:.45; cursor:default; }\n small { display:block; color:var(--sub); font-size:12px; font-weight:400; }\n .chips { display:flex; flex-wrap:wrap; gap:8px; }\n .chips button { border:1.5px solid color-mix(in srgb,var(--p) 55%,var(--line)); background:var(--bg); color:var(--p); border-radius:999px; padding:7px 14px; font-weight:600; font-size:13px; text-align:center; }\n .chips button:hover:not(:disabled) { background:color-mix(in srgb,var(--p) 10%,var(--bg)); }\n .text { display:grid; gap:1px; min-width:0; }\n .chips small { color:inherit; opacity:.8; }\n .list { display:grid; gap:6px; }\n .list > button { display:flex; justify-content:space-between; align-items:center; gap:10px; width:100%; text-align:left; border:1px solid var(--line); background:var(--bg); border-radius:12px; padding:10px 12px; }\n .list > button:hover:not(:disabled) { border-color:var(--p); }\n .list > button svg { width:16px; height:16px; flex:none; color:var(--sub); }\n .card { background:var(--bg); border:1px solid var(--line); border-radius:var(--r); overflow:hidden; box-shadow:0 6px 18px -10px rgb(16 18 30/.35); }\n .card .body { padding:10px 12px 12px; display:grid; gap:4px; } .card h3 { margin:0; font-size:14px; } .card p { margin:0; color:var(--sub); font-size:12.5px; }\n .image { aspect-ratio:16 / 9; max-width:100%; display:grid; place-items:center; overflow:hidden; background:var(--surface); color:var(--sub); font-size:12px; }\n .image img { width:100%; height:100%; object-fit:cover; display:block; }\n .primary { justify-self:start; margin-top:6px; border:0; border-radius:10px; background:var(--p); color:#fff; font-weight:600; font-size:13px; padding:8px 14px; }\n .list .card { display:grid; grid-template-columns:minmax(0,88px) 1fr; } .list .card .image { aspect-ratio:auto; height:100%; min-height:88px; }\n .list .card:not(:has(.image)) { grid-template-columns:1fr; }\n .navigation { display:flex; align-items:center; justify-content:space-between; gap:8px; margin:10px 0 0; }\n .round { width:32px; height:32px; border-radius:50%; border:1px solid var(--line); background:var(--bg); display:grid; place-items:center; padding:0; flex:none; }\n .round:hover:not(:disabled) { border-color:var(--p); } .round svg { width:15px; height:15px; }\n .dots { display:flex; gap:5px; align-items:center; } .dots i { width:6px; height:6px; border-radius:3px; background:var(--line); transition:width .2s; } .dots i.on { width:16px; background:var(--p); }\n .calendar { border:1px solid var(--line); border-radius:var(--r); padding:10px; background:var(--bg); display:grid; gap:6px; }\n .calendar .navigation { margin:0; font-weight:600; font-size:13px; }\n .days, .weekdays { display:grid; grid-template-columns:repeat(7, minmax(0, 1fr)); gap:2px 0; text-align:center; }\n .weekdays { color:var(--sub); font-size:11px; }\n .days button { border:0; background:transparent; height:30px; border-radius:8px; padding:0; font-size:12.5px; font-variant-numeric:tabular-nums; }\n .days button:hover:not(:disabled) { background:var(--surface); }\n .days button.today { box-shadow:inset 0 0 0 1.5px var(--line); }\n .days button.in { background:color-mix(in srgb,var(--p) 14%,transparent); border-radius:0; }\n .days button[aria-pressed=\"true\"] { background:var(--p); color:#fff; }\n .days button.start:not(.end) { border-radius:8px 0 0 8px; } .days button.end:not(.start) { border-radius:0 8px 8px 0; }\n .hint { color:var(--sub); font-size:12px; margin:0; }\n @media (prefers-reduced-motion:reduce) { .dots i { transition:none; } }\n`;\n","import { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport type { InteractionMessage, InteractionResponse } from '../../core/protocol/types';\nimport { isInteractionPresentation } from '../../core/protocol/validators';\nimport { applyTheme, type ChatTheme } from '../theme';\nexport abstract class ToolElement extends LitElement {\n @property({ attribute: false }) interaction: InteractionMessage | null = null;\n @property({ type: Boolean }) disabled = false;\n @property({ attribute: false }) theme: ChatTheme | undefined;\n @property({ attribute: 'base-url' }) baseUrl = '';\n protected abstract readonly toolType: string;\n protected get live(): boolean { return !this.disabled && this.interaction?.interaction_status === 'pending'; }\n protected get valid(): boolean {\n const i = this.interaction;\n return !!i && i.tool_type === this.toolType && isInteractionPresentation(i, i.presentation);\n }\n protected respond(response: InteractionResponse): void {\n if (!this.interaction || !this.live || !this.valid) return;\n this.dispatchEvent(new CustomEvent('osvi-respond', { bubbles: true, composed: true, detail: { interactionId: this.interaction.interaction_id, response } }));\n }\n protected updated(changed: Map<PropertyKey, unknown>): void { if (changed.has('theme')) applyTheme(this, this.theme); }\n}\n","import { html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport type { ChoicePresentation } from '../../core/protocol/types';\nimport { toolStyles } from '../styles';\nimport { ToolElement } from './base';\nimport { rightIcon } from '../icons';\nexport class OsviButtons extends ToolElement {\n static styles = toolStyles;\n protected readonly toolType = 'ui_buttons';\n @property() variant: 'chips' | 'list' = 'chips';\n render() {\n const i = this.interaction;\n if (!i) return nothing;\n if (!this.valid) return html`<p>${i.content}</p>`;\n const p = i.presentation as ChoicePresentation;\n const chosen = i.response_payload?.kind === 'text' ? i.response_payload.value : p.options.find(o => o.id === (i.response_payload?.kind === 'selection' ? i.response_payload.value : i.selected_option_id))?.label;\n return html`<p class=\"label\">${p.label}</p>${p.description ? html`<p class=\"description\">${p.description}</p>` : nothing}\n ${this.live ? html`<div role=\"group\" aria-label=\"Options\" class=${this.variant} @keydown=${this.onKey}>\n ${p.options.map(o => html`<button type=\"button\" @click=${() => this.pick(o.id, o.allow_input, o.input_placeholder)}><span class=\"text\"><span>${o.label}</span>${o.description ? html`<small>${o.description}</small>` : nothing}</span>${this.variant === 'list' ? rightIcon : nothing}</button>`)}\n </div>` : chosen ? html`<p class=\"answer\">${chosen}</p>` : nothing}`;\n }\n private pick(id: string, allowInput?: true, placeholder?: string) {\n if (!this.live || !this.valid || !this.interaction) return;\n if (this.interaction.schema_version === 2 && allowInput) {\n this.dispatchEvent(new CustomEvent('osvi-request-input', { bubbles: true, composed: true, detail: { interactionId: this.interaction.interaction_id, placeholder } }));\n } else this.respond({ kind: 'selection', value: id });\n }\n private onKey(e: KeyboardEvent) {\n if (!['ArrowDown', 'ArrowUp', 'ArrowRight', 'ArrowLeft'].includes(e.key)) return;\n const list = [...this.renderRoot.querySelectorAll('button')];\n const at = list.indexOf((this.renderRoot as ShadowRoot).activeElement as HTMLButtonElement);\n const step = e.key === 'ArrowDown' || e.key === 'ArrowRight' ? 1 : -1;\n list[(at + step + list.length) % list.length]?.focus(); e.preventDefault();\n }\n}\n","import { html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport type { CarouselItem, CarouselPresentation } from '../../core/protocol/types';\nimport { isProxyImageUrl } from '../../core/protocol/validators';\nimport { toolStyles } from '../styles';\nimport { ToolElement } from './base';\nimport { leftIcon, rightIcon } from '../icons';\nexport class OsviCarousel extends ToolElement {\n static styles = toolStyles;\n protected readonly toolType = 'ui_carousel';\n @property() variant: 'slider' | 'list' = 'slider';\n @state() private index = 0;\n @state() private imageFailed = new Set<number>();\n private pointerStart: number | undefined;\n private suppressPointerClick = false;\n protected willUpdate(changed: Map<PropertyKey, unknown>) {\n if (changed.has('interaction')) { this.index = 0; this.imageFailed = new Set(); this.pointerStart = undefined; this.suppressPointerClick = false; }\n }\n render() {\n const i = this.interaction;\n if (!i) return nothing;\n if (!this.valid) return html`<p>${i.content}</p>`;\n const p = i.presentation as CarouselPresentation;\n const chosen = p.items.find(item => item.id === (i.response_payload?.kind === 'selection' ? i.response_payload.value : i.selected_option_id));\n return html`<p class=\"label\">${p.label}</p>${p.description ? html`<p class=\"description\">${p.description}</p>` : nothing}\n ${!this.live ? chosen ? html`<p class=\"answer\">${chosen.title}</p>` : nothing : this.variant === 'list'\n ? html`<div class=\"list\">${p.items.map((item, n) => this.card(item, n))}</div>`\n : html`<div @pointerdown=${(e: PointerEvent) => { this.pointerStart = e.clientX; this.suppressPointerClick = false; }} @pointerup=${(e: PointerEvent) => {\n if (this.pointerStart !== undefined && Math.abs(e.clientX - this.pointerStart) > 40) {\n this.suppressPointerClick = true;\n this.navigate(e.clientX < this.pointerStart ? 1 : -1, p.items.length);\n }\n this.pointerStart = undefined;\n }} @pointercancel=${() => { this.pointerStart = undefined; }}>${this.card(p.items[this.index]!, this.index)}</div>\n <div class=\"navigation\"><button type=\"button\" class=\"round\" aria-label=\"Previous card\" ?disabled=${this.index === 0} @click=${() => this.navigate(-1, p.items.length)}>${leftIcon}</button>\n <span class=\"dots\" aria-hidden=\"true\">${p.items.map((_, n) => html`<i class=${n === this.index ? 'on' : ''}></i>`)}</span><span class=\"sr\" aria-live=\"polite\">${this.index + 1} of ${p.items.length}</span>\n <button type=\"button\" class=\"round\" aria-label=\"Next card\" ?disabled=${this.index === p.items.length - 1} @click=${() => this.navigate(1, p.items.length)}>${rightIcon}</button></div>`}`;\n }\n private navigate(delta: number, length: number) { this.index = Math.max(0, Math.min(length - 1, this.index + delta)); }\n private select(event: MouseEvent, id: string) {\n // Keyboard activation has detail 0; a swipe's synthesized pointer click must not select.\n if (this.suppressPointerClick && event.detail !== 0) {\n this.suppressPointerClick = false;\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.respond({ kind: 'selection', value: id });\n }\n private card(item: CarouselItem, index: number) {\n const image = item.image;\n return html`<article class=\"card\">${image && isProxyImageUrl(image.url) ? html`<div class=\"image\">${this.imageFailed.has(index)\n ? html`<span role=\"img\" aria-label=\"Image unavailable\">Image unavailable</span>`\n : html`<img src=${this.baseUrl.replace(/\\/$/, '') + image.url} alt=${image.alt} referrerpolicy=\"no-referrer\" loading=\"lazy\" @error=${() => { this.imageFailed = new Set([...this.imageFailed, index]); }}>`}</div>` : nothing}\n <div class=\"body\"><h3>${item.title}</h3>${item.description ? html`<p>${item.description}</p>` : nothing}\n <button type=\"button\" class=\"primary\" @click=${(e: MouseEvent) => this.select(e, item.id)}>${item.action_label ?? 'Select'}</button></div></article>`;\n }\n}\n","import { html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport type { DatePickerPresentation } from '../../core/protocol/types';\nimport { isCalendarDate } from '../../core/protocol/validators';\nimport { toolStyles } from '../styles';\nimport { ToolElement } from './base';\nimport { leftIcon, rightIcon } from '../icons';\nconst toIso = (d: Date) => `${String(d.getFullYear()).padStart(4, '0')}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\nconst today = () => toIso(new Date());\nconst parseDate = (iso: string) => { const d = new Date(0); d.setHours(0, 0, 0, 0); d.setFullYear(Number(iso.slice(0, 4)), Number(iso.slice(5, 7)) - 1, Number(iso.slice(8, 10))); return d; };\nconst monthOf = (iso: string) => iso.slice(0, 7);\nexport class OsviDatePicker extends ToolElement {\n static styles = toolStyles;\n protected readonly toolType = 'ui_date_picker';\n @property() variant = 'grid';\n @state() private month = monthOf(today());\n @state() private start = '';\n @state() private end = '';\n private earliest(p: DatePickerPresentation) { return p.min_date && p.min_date > today() ? p.min_date : today(); }\n protected willUpdate(changed: Map<PropertyKey, unknown>) {\n if (changed.has('interaction')) {\n this.start = ''; this.end = '';\n if (this.valid) this.month = monthOf(this.earliest(this.interaction!.presentation as DatePickerPresentation));\n }\n }\n render() {\n const i = this.interaction;\n if (!i) return nothing;\n if (!this.valid) return html`<p>${i.content}</p>`;\n const p = i.presentation as DatePickerPresentation;\n const response = i.response_payload;\n const chosen = response?.kind === 'date_range' ? `${response.value.start_date} – ${response.value.end_date}` : response?.kind === 'date' || response?.kind === 'text' ? response.value : i.selected_option_id;\n if (!this.live) return html`<p class=\"label\">${p.label}</p>${p.description ? html`<p class=\"description\">${p.description}</p>` : nothing}${chosen ? html`<p class=\"answer\">${chosen}</p>` : nothing}`;\n const first = parseDate(`${this.month}-01`);\n const last = new Date(first); last.setMonth(last.getMonth() + 1, 0);\n const earliest = this.earliest(p);\n const days = Array.from({ length: last.getDate() }, (_, n) => `${this.month}-${String(n + 1).padStart(2, '0')}`);\n const hint = p.selection_mode === 'range' ? !this.start ? 'Choose check-in, then check-out.' : !this.end ? `Check-in: ${this.start}. Choose check-out.` : `${this.start} – ${this.end}` : this.start;\n const now = today();\n return html`<p class=\"label\">${p.label}</p>${p.description ? html`<p class=\"description\">${p.description}</p>` : nothing}\n <div class=\"calendar\"><div class=\"navigation\"><button type=\"button\" class=\"round\" aria-label=\"Previous month\" ?disabled=${this.month <= monthOf(earliest)} @click=${() => this.moveMonth(-1, p)}>${leftIcon}</button>\n <span aria-live=\"polite\">${first.toLocaleDateString(undefined, { month: 'long', year: 'numeric' })}</span>\n <button type=\"button\" class=\"round\" aria-label=\"Next month\" ?disabled=${!!p.max_date && this.month >= monthOf(p.max_date)} @click=${() => this.moveMonth(1, p)}>${rightIcon}</button></div>\n <div class=\"weekdays\" aria-hidden=\"true\">${['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'].map(day => html`<span>${day}</span>`)}</div>\n <div class=\"days\" role=\"group\" aria-label=\"Choose date\" @keydown=${this.onKey}>\n ${Array.from({ length: first.getDay() }, () => html`<span></span>`)}\n ${days.map((day, n) => html`<button type=\"button\" class=${[day === now ? 'today' : '', day === this.start ? 'start' : '', day === this.end ? 'end' : '', this.start && this.end && day > this.start && day < this.end ? 'in' : ''].filter(Boolean).join(' ')} aria-label=${day} aria-pressed=${day === this.start || day === this.end} ?disabled=${day < earliest || !!p.max_date && day > p.max_date} @click=${() => this.pick(day, p)}>${n + 1}</button>`)}\n </div><p class=\"hint\" aria-live=\"polite\">${hint}</p>\n <button type=\"button\" class=\"primary\" ?disabled=${!this.start || p.selection_mode === 'range' && (!this.end || this.start >= this.end)} @click=${() => this.confirm(p)}>${p.confirm_label ?? 'Confirm date'}</button></div>`;\n }\n private moveMonth(delta: number, p: DatePickerPresentation) {\n const date = parseDate(`${this.month}-01`); date.setMonth(date.getMonth() + delta);\n const next = monthOf(toIso(date));\n if (next >= monthOf(this.earliest(p)) && (!p.max_date || next <= monthOf(p.max_date))) this.month = next;\n }\n private pick(day: string, p: DatePickerPresentation) {\n if (!this.live || !this.valid || !isCalendarDate(day) || day < this.earliest(p) || p.max_date && day > p.max_date) return;\n if (p.selection_mode === 'single' || !this.start || this.end || day <= this.start) { this.start = day; this.end = ''; }\n else this.end = day;\n }\n private confirm(p: DatePickerPresentation) {\n if (!isCalendarDate(this.start) || this.start < this.earliest(p) || p.max_date && this.start > p.max_date) return;\n if (p.selection_mode === 'single') this.respond({ kind: 'date', value: this.start });\n else if (isCalendarDate(this.end) && this.start < this.end && (!p.max_date || this.end <= p.max_date)) this.respond({ kind: 'date_range', value: { start_date: this.start, end_date: this.end } });\n }\n private onKey(e: KeyboardEvent) {\n const steps: Record<string, number> = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -7, ArrowDown: 7 };\n const step = steps[e.key]; if (step === undefined) return;\n const buttons = [...this.renderRoot.querySelectorAll<HTMLButtonElement>('.days button')];\n const at = buttons.indexOf((this.renderRoot as ShadowRoot).activeElement as HTMLButtonElement);\n if (at < 0) return;\n let next = at + step;\n while (next >= 0 && next < buttons.length && buttons[next]?.disabled) next += step > 0 ? 1 : -1;\n buttons[next]?.focus(); e.preventDefault();\n }\n}\n","import { OsviChat } from './osvi-chat';\nimport { defineOnce } from './define';\nimport { OsviButtons } from './tools/osvi-buttons';\nimport { OsviCarousel } from './tools/osvi-carousel';\nimport { OsviDatePicker } from './tools/osvi-date-picker';\ndefineOnce('osvi-chat', OsviChat);\ndefineOnce('osvi-buttons', OsviButtons);\ndefineOnce('osvi-carousel', OsviCarousel);\ndefineOnce('osvi-date-picker', OsviDatePicker);\nexport { OsviButtons, OsviCarousel, OsviDatePicker };\nexport { defineOnce } from './define';\nexport { themeVariables, explicitThemeVariables, applyTheme, cssVar, type ChatTheme, type Variants } from './theme';\n\nexport { OsviChat };\nexport { DEFAULT_STRINGS, type ChatStrings } from './strings';\n"],"names":["LIGHT","DARK","RADII","VAR","cssVar","key","themeVariables","theme","colors","out","radius","explicitThemeVariables","full","applied","applyTheme","host","variables","value","DEFAULT_STRINGS","warned","warnOnce","name","message","oneOf","allowed","parseRadius","safeBaseUrl","u","safeAvatar","parseJsonAttr","parsed","URL_RE","count","s","ch","trimUrl","url","c","linkify","text","last","m","start","renderTranscript","state","strings","variants","baseUrl","retry","html","repeat","item","nothing","p","i","live","disabled","stroke","d","cls","svg","newChatIcon","closeIcon","sendIcon","leftIcon","rightIcon","osviLogo","renderComposer","o","e","ta","emptyState","bool","v","_OsviChat","_a","LitElement","client","typed","box","event","own","generation","attr","rawColors","mode","source","action","tool","id","log","avatar","title","el","createChatClient","css","__decorateClass","property","OsviChat","defineOnce","ctor","k","unsafeCSS","toolStyles","ToolElement","isInteractionPresentation","response","changed","_OsviButtons","chosen","allowInput","placeholder","list","at","step","OsviButtons","_OsviCarousel","_","delta","length","index","image","isProxyImageUrl","OsviCarousel","toIso","today","parseDate","iso","monthOf","_OsviDatePicker","first","earliest","days","n","hint","now","day","date","next","isCalendarDate","buttons","OsviDatePicker"],"mappings":";;;;;AAMA,MAAMA,IAAQ,EAAE,SAAS,WAAW,YAAY,WAAW,SAAS,WAAW,MAAM,WAAW,YAAY,WAAW,iBAAiB,UAAA,GAClIC,KAAO,EAAE,SAAS,WAAW,YAAY,WAAW,SAAS,WAAW,MAAM,WAAW,YAAY,WAAW,iBAAiB,UAAA,GACjIC,KAAQ,EAAE,MAAM,OAAO,IAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,MAAM,SAAA,GAChEC,IAAM,EAAE,SAAS,wBAAwB,YAAY,2BAA2B,SAAS,wBAAwB,MAAM,qBAAqB,YAAY,4BAA4B,iBAAiB,gCAAA,GAC9LC,KAAS,CAACC,MAAoC,OAAOF,EAAIE,CAAG,CAAC,KAAKL,EAAMK,CAAG,CAAC;AAClF,SAASC,EAAeC,GAAsD;AACnF,QAAMC,IAAS,EAAE,GAAID,GAAO,SAAS,SAASN,KAAOD,GAAQ,GAAGO,GAAO,OAAA;AAEvE,EAAI,CAACA,GAAO,QAAQ,cAAcA,GAAO,QAAQ,YAASC,EAAO,aAAaD,EAAM,OAAO;AAC3F,QAAME,IAA8B,CAAA;AACpC,aAAWJ,KAAO,OAAO,KAAKF,CAAG,EAA6B,CAAAM,EAAIN,EAAIE,CAAG,CAAC,IAAIG,EAAOH,CAAG;AACxF,QAAMK,IAASH,GAAO,UAAU;AAChC,SAAAE,EAAI,eAAe,IAAI,OAAOC,KAAW,WAAW,GAAGA,CAAM,OAAOR,GAAMQ,CAAM,GACzED;AACT;AACO,SAASE,GAAuBJ,GAAsD;AAC3F,MAAI,CAACA,EAAO,QAAO,CAAA;AACnB,MAAIA,EAAM,KAAM,QAAOD,EAAeC,CAAK;AAC3C,QAAMK,IAAON,EAAeC,CAAK,GAAGE,IAA8B,CAAA;AAClE,aAAWJ,KAAO,OAAO,KAAKE,EAAM,UAAU,CAAA,CAAE,EAA6B,CAAAE,EAAIN,EAAIE,CAAG,CAAC,IAAIO,EAAKT,EAAIE,CAAG,CAAC;AAC1G,SAAIE,EAAM,WAAW,aAAe,eAAe,IAAIK,EAAK,eAAe,IACpEH;AACT;AACA,MAAMI,wBAAc,QAAA;AACb,SAASC,EAAWC,GAAmBR,GAAoC;AAChF,aAAWF,KAAOQ,EAAQ,IAAIE,CAAI,KAAK,CAAA,EAAI,CAAAA,EAAK,MAAM,eAAeV,CAAG;AACxE,QAAMW,IAAYL,GAAuBJ,CAAK;AAC9C,aAAW,CAACF,GAAKY,CAAK,KAAK,OAAO,QAAQD,CAAS,EAAG,CAAAD,EAAK,MAAM,YAAYV,GAAKY,CAAK;AACvF,EAAAJ,EAAQ,IAAIE,GAAM,OAAO,KAAKC,CAAS,CAAC;AAC1C;ACnCO,MAAME,IAAkB;AAAA,EAC/B,aAAa;AAAA,EAAsB,MAAM;AAAA,EAAQ,QAAQ;AAAA,EAAW,aAAa;AAAA,EAA4B,cAAc;AAAA,EAAiC,YAAY;AAAA,EAA4C,SAAS;AAAA,EAA0B,gBAAgB;AAAA,EAAwD,YAAY;AAAA,EAAqB,OAAO;AAAA,EAAS,cAAc;AAAA,EAAsB,cAAc;AAAA,EAAiB,SAAS;AAAA,EAAqD,aAAa;AAAA,EAA6B,eAAe;AAAA,EAA8C,aAAa;AAAA,EAAyD,UAAU;AAAA,EAAa,WAAW;AAAA,EAAc,WAAW;AAAA,EAAsB,SAAS;AAAA,EAAY,YAAY;AAAA,EAAqC,cAAc;AACn0B,GCDMC,wBAAa,IAAA;AACnB,SAASC,GAASC,GAAcC,GAAiB;AAAE,EAAKH,EAAO,IAAIE,CAAI,MAAKF,EAAO,IAAIE,CAAI,GAAG,QAAQ,KAAK,eAAeC,CAAO,EAAE;AAAK;AACjI,SAASC,EAAwBN,GAAkCO,GAAsC;AAAE,SAAOP,KAAS,QAASO,EAA8B,SAASP,CAAK,IAAIA,IAAa;AAAW;AAC5M,SAASQ,EAAYR,GAAmE;AAC9F,MAAIA,KAAS;AACb,WAAOM,EAAMN,GAAO,CAAC,QAAQ,MAAM,MAAM,MAAM,MAAM,CAAU,MAAM,mBAAmB,KAAKA,CAAK,IAAI,OAAOA,EAAM,QAAQ,OAAO,EAAE,CAAC,IAAI;AAC1I;AACO,SAASS,EAAYT,GAAsD;AACjF,MAAKA,GACL;AAAA,QAAI;AAAE,YAAMU,IAAI,IAAI,IAAIV,CAAK;AAAG,UAAI,CAACU,EAAE,YAAY,CAACA,EAAE,aAAaA,EAAE,aAAa,YAAYA,EAAE,aAAa,WAAW,CAAC,aAAa,WAAW,EAAE,SAASA,EAAE,QAAQ,GAAI,QAAOV,EAAM,QAAQ,QAAQ,EAAE;AAAA,IAAG,QAAQ;AAAA,IAAgB;AACpO,IAAAG,GAAS,YAAY,uEAAuE;AAAA;AAC7F;AACO,SAASQ,GAAWX,GAAsD;AAChF,MAAKA,GACL;AAAA,QAAI,8DAA8D,KAAKA,CAAK,EAAG,QAAOA;AACtF,QAAI;AAAE,YAAMU,IAAI,IAAI,IAAIV,CAAK;AAAG,UAAIU,EAAE,aAAa,YAAY,CAACA,EAAE,YAAY,CAACA,EAAE,SAAU,QAAOV;AAAA,IAAO,QAAQ;AAAA,IAAgB;AAAA;AAElI;AACO,SAASY,EAAcR,GAAcJ,GAAuE;AAClH,MAAKA,GACL;AAAA,QAAI;AAAE,YAAMa,IAAkB,KAAK,MAAMb,CAAK;AAAG,UAAIa,KAAU,OAAOA,KAAW,YAAY,CAAC,MAAM,QAAQA,CAAM,EAAG,QAAOA;AAAA,IAAmC,QAAQ;AAAA,IAAmB;AAC1L,IAAAV,GAASC,GAAM,+BAA+BA,CAAI,YAAY;AAAA;AAC/D;ACtBA,MAAMU,KAAS,0BACTC,IAAQ,CAACC,GAAWC,MAAeD,EAAE,MAAMC,CAAE,EAAE,SAAS;AAC9D,SAASC,GAAQC,GAAqB;AACrC,aAAS;AAAE,UAAMC,IAAID,EAAIA,EAAI,SAAS,CAAC;AACvC,QAAIC,KAAK,SAAS,SAASA,CAAC,KAAKA,MAAM,OAAOL,EAAMI,GAAK,GAAG,IAAIJ,EAAMI,GAAK,GAAG,KAAKC,MAAM,OAAOL,EAAMI,GAAK,GAAG,IAAIJ,EAAMI,GAAK,GAAG,GAAG;AAAE,MAAAA,IAAMA,EAAI,MAAM,GAAG,EAAE;AAAG;AAAA,IAAU;AAAE,WAAOA;AAAA,EAAK;AACtL;AACO,SAASE,GAAQC,GAA0B;AACjD,QAAM9B,IAAkB,CAAA;AAAI,MAAI+B,IAAO;AACvC,aAAWC,KAAKF,EAAK,SAASR,EAAM,GAAG;AAAE,UAAMK,IAAMD,GAAQM,EAAE,CAAC,CAAC,GAAGC,IAAQD,EAAE;AAC9E,QAAI;AAAE,YAAMd,IAAI,IAAI,IAAIS,CAAG;AAAG,UAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAST,EAAE,QAAQ,EAAG;AAAA,IAAU,QAAQ;AAAE;AAAA,IAAU;AAC3G,IAAIe,IAAQF,KAAM/B,EAAI,KAAK,EAAE,MAAM8B,EAAK,MAAMC,GAAME,CAAK,EAAA,CAAG,GAAGjC,EAAI,KAAK,EAAE,MAAM2B,GAAK,MAAMA,GAAK,GAAGI,IAAOE,IAAQN,EAAI;AAAA,EAAQ;AAC9H,SAAII,IAAOD,EAAK,UAAQ9B,EAAI,KAAK,EAAE,MAAM8B,EAAK,MAAMC,CAAI,EAAA,CAAG,GAAU/B,EAAI,SAASA,IAAM,CAAC,EAAE,MAAA8B,GAAM;AAClG;ACPO,SAASI,GAAiBC,GAAkBC,GAAsBC,GAAoBC,GAAiBC,GAA6B;AAC1I,SAAOC,IAAOL,EAAM,MAAM,SAASM,GAAON,EAAM,OAAO,CAAAO,MAAQA,EAAK,IAAI,CAAAA,MAAQ;AAChF,QAAIA,EAAK,SAAS,UAAW,QAAOF,uBAA0BJ,EAAQ,YAAY;AAClF,QAAIM,EAAK,SAAS,UAAW,QAAOF,mBAAsB,UAAUE,EAAK,IAAI,EAAE,IAAIA,EAAK,SAAS,UAAUF,sCAAyCG,CAAO,MAAMd,GAAQa,EAAK,OAAO,EAAE,IAAI,CAAAE,MAAK,UAAUA,IAAIJ,YAAeI,EAAE,IAAI,8CAA8CA,EAAE,IAAI,SAASA,EAAE,IAAI,CAAC,OAAOF,EAAK,SAAS,UAAUA,EAAK,WAAW,WAAWF,+BAAkCJ,EAAQ,UAAU,uCAAuC,MAAMG,EAAMG,EAAK,EAAE,CAAC,IAAIN,EAAQ,KAAK,qBAAqBO,CAAO;AAC7f,UAAME,IAAIH,EAAK,aAAaI,IAAOD,EAAE,mBAAmBV,EAAM,mBAAmB,kBAAkBU,EAAE,uBAAuB,WACtHE,IAAW,CAACD,KAAQX,EAAM,sBAAsBA,EAAM,SAAS;AACrE,YAAQU,EAAE,WAAA;AAAA,MACV,KAAK;AAAc,eAAOL,4BAA+BM,IAAO,SAAS,OAAO,iBAAiBD,CAAC,cAAcE,CAAQ,aAAaV,EAAS,WAAW,OAAO,aAAaC,CAAO;AAAA,MACpL,KAAK;AAAe,eAAOE,6BAAgCM,IAAO,SAAS,OAAO,iBAAiBD,CAAC,cAAcE,CAAQ,aAAaV,EAAS,YAAY,QAAQ,aAAaC,CAAO;AAAA,MACxL,KAAK;AAAkB,eAAOE,gCAAmCM,IAAO,SAAS,OAAO,iBAAiBD,CAAC,cAAcE,CAAQ,aAAaT,CAAO;AAAA,MACpJ;AAAS,eAAOE,OAAUK,EAAE,OAAO;AAAA,IAAA;AAAA,EAEnC,CAAC,IAAIL,qBAAwBJ,EAAQ,UAAU,MAAM,GAAGD,EAAM,gBAAgBK,8CAAiDJ,EAAQ,MAAM,iCAAiCO,CAAO;AACtL;AChBA,MAAMK,IAAS,CAACC,GAAYC,IAAM,OAAOC,eAAiBD,CAAG,+JAA+JD,CAAC;AACrMD,EAAOG,kLAAoL;AAC5M,MAAMC,KAAcJ,EAAOG,8KAAgL,GACrME,KAAYL,EAAOG,mCAAqC;AACrCH,EAAOG,oLAAsL,MAAM;AAClMH,EAAOG,qCAAuC,OAAO;AAC/E,MAAMG,KAAWN,EAAOG,6CAA+C,GACjEI,KAAWP,EAAOG,6BAA+B,GACjDK,IAAYR,EAAOG,2BAA6B,GAGhDM,KAAWN;ACTjB,SAASO,GAAeC,GAAoB;AAClD,SAAOnB,8EAAiFmB,EAAE,WAAW,WAAWb,GAAKa,EAAE,KAAK,CAAC,cAAcA,EAAE,QAAQ,WAAW,CAACC,MAAa;AAAE,UAAMC,IAAKD,EAAE;AAA+B,IAAAC,EAAG,MAAM,SAAS,QAAQA,EAAG,MAAM,SAAS,GAAG,KAAK,IAAIA,EAAG,cAAc,GAAG,CAAC,MAAMF,EAAE,MAAMC,CAAC;AAAA,EAAG,CAAC,aAAa,CAACA,MAAqB;AAAE,IAAIA,EAAE,QAAQ,WAAW,CAACA,EAAE,YAAY,CAACA,EAAE,eAAe,CAACD,EAAE,aAAYC,EAAE,eAAA,GAAkBD,EAAE,KAAA;AAAA,EAAU,CAAC,wDAAwDA,EAAE,QAAQ,IAAI,eAAeA,EAAE,QAAQ,IAAI,cAAcA,EAAE,YAAY,CAACA,EAAE,MAAM,KAAA,CAAM,WAAWA,EAAE,IAAI,IAAIL,EAAQ,oBAAoBK,EAAE,QAAQ,IAAI;AACzpB;;;;;;ACEA,MAAMG,IAAa,OAAkB,EAAE,QAAQ,QAAQ,MAAM,MAAM,eAAe,IAAO,OAAO,CAAA,GAAI,mBAAmB,MAAM,oBAAoB,IAAO,OAAO,MAAM,OAAO,SACtKC,KAAO,EAAE,eAAe,CAACC,MAAqBA,MAAM,QAAA;;AACnD,MAAMC,KAANC,IAAA,cAAuBC,EAAW;AAAA,EAAlC,cAAA;AAAA,UAAA,GAAA,SAAA,GAyCgC,KAAA,UAAU,IACV,KAAA,UAAU,IACf,KAAA,SAA4B,MAC5B,KAAA,QAAmB,CAAA,GACnB,KAAA,WAAqB,CAAA,GACrB,KAAA,UAAgC,CAAA,GACR,KAAA,YAAY,IACd,KAAA,UAAU,IAEhC,KAAA,SAAoE,CAAA,GACvE,KAAA,WAAW,IAW/B,KAAQ,YAAYL,EAAA,GACpB,KAAQ,QAAQ,IAChB,KAAQ,OAAO,IACf,KAAQ,QAA4E,MAC7F,KAAQ,YAA+B,MACvC,KAAQ,cAAiC,MACzC,KAAQ,SAAS,IAEjB,KAAQ,aAAa,GACrB,KAAQ,eAAe,IACvB,KAAQ,qBAAoC,MA8D5C,KAAQ,OAAO,MAAM;AACnB,UAAI,KAAK,WAAW,CAAC,KAAK,MAAM,KAAA,KAAU,CAAC,KAAK,YAAa;AAC7D,YAAMM,IAAS,KAAK,aAAa5D,IAAQ,KAAK,MAAM,KAAA,GAAQ6D,IAAQ,KAAK;AACzE,WAAK,QAAQ,IAAQA,UAAY,aAAA,GAAgB,KAAK,cAAA;AACtD,YAAMC,IAAM,KAAK,WAAW,cAAmC,UAAU;AAAG,MAAIA,MAAKA,EAAI,MAAM,SAAS,KACnG,KAAK,IAAI,MAAMD,IAAQD,EAAO,QAAQC,EAAM,IAAI,EAAE,MAAM,QAAQ,OAAA7D,EAAA,CAAO,IAAI4D,EAAO,KAAK5D,CAAK,CAAC;AAAA,IACpG,GACA,KAAQ,UAAU,CAAC+D,MAAiF;AAClG,YAAMtB,IAAIsB,EAAM,QAAQ/C,IAAI,KAAK;AACjC,UAAI,CAACyB,KAAK,KAAK,QAAQzB,EAAE,SAAS,QAAQA,EAAE,sBAAsBA,EAAE,mBAAmB,uBAAuB,aAAayB,EAAE,kBAAkBzB,EAAE,kBAAkB,eAAgB;AACnL,MAAA+C,EAAM,gBAAA;AAAmB,YAAMH,IAAS,KAAK;AAAa,MAAIA,KAAa,KAAK,IAAI,MAAMA,EAAO,QAAQnB,EAAE,eAAeA,EAAE,QAAQ,CAAC;AAAA,IACvI,GACA,KAAQ,eAAe,CAACsB,MAAwE;AAC9F,YAAMtB,IAAIsB,EAAM,QAAQ/C,IAAI,KAAK;AACjC,MAAI,CAACyB,KAAK,KAAK,QAAQzB,EAAE,SAAS,QAAQA,EAAE,sBAAsBA,EAAE,mBAAmB,uBAAuB,aAAayB,EAAE,kBAAkBzB,EAAE,kBAAkB,mBACnK+C,EAAM,gBAAA,GACN,KAAK,QAAQ,EAAE,IAAItB,EAAE,eAAe,aAAa,OAAOA,EAAE,eAAgB,WAAWA,EAAE,cAAc,QAAW,eAAe,KAAK,OAAO,iBAAiB,KAAK,MAAA,GACjK,KAAK,QAAQ,IAAI,KAAK,cAAA,GAAsB,KAAK,eAAe,KAAK,MAAM,KAAK,WAAW,cAAc,UAAU,GAAG,OAAO;AAAA,IAC/H;AAAA,EAAA;AAAA,EA/EA,oBAAoB;AAAE,UAAM,kBAAA,GAAqB,KAAK,WAAA;AAAA,EAAc;AAAA,EACpE,uBAAuB;AAAE,UAAM,qBAAA,GAAwB,KAAK,cAAA;AAAA,EAAiB;AAAA,EACrE,gBAAgB;AACtB,MAAE,KAAK,YAAY,KAAK,cAAA,GAAiB,KAAK,cAAc,QAC5D,KAAK,cAAc;AAAM,UAAMuB,IAAM,KAAK;AAAW,SAAK,YAAY,MAAM,KAAK,SAAS,IAC1FA,GAAK,QAAA,GAAW,KAAK,OAAO,IAAO,KAAK,QAAQ,MAAM,KAAK,qBAAqB,MAAM,KAAK,cAAA;AAAA,EAC7F;AAAA,EACQ,aAAa;AAEnB,QADI,CAAC,KAAK,eACN,CAAC,KAAK,UAAU,CAAC,KAAK,WAAW,CAAC,KAAK,YAAa;AACxD,UAAM5E,IAAM,KAAK,UAAU,CAAC,KAAK,SAASqB,EAAY,KAAK,OAAO,CAAC,CAAC;AAGpE,SAFI,KAAK,SAAS,KAAK,gBAAgB,KAAK,UAAU,CAAC,KAAK,YAAY,KAAK,aAAarB,MAAQ,KAAK,YACvG,KAAK,cAAA,GAAiB,KAAK,YAAYkE,EAAA,GACnC,CAAC,KAAK,UAAU,CAAC,KAAK,SAAS;AACnC,UAAMU,IAAM,CAAC,KAAK,QACZJ,IAAS,KAAK,UAAUF,EAAS,cAAc,EAAE,SAAS,KAAK,SAAS,SAASjD,EAAY,KAAK,OAAO,GAAG;AAClH,SAAK,cAAcmD,GACfI,MAAO,KAAK,YAAYJ,GAAQ,KAAK,SAASxE;AAClD,UAAM6E,IAAa,KAAK;AACxB,SAAK,YAAYL,EAAO,SAAA,GAAY,KAAK,cAAA,GACzC,KAAK,cAAcA,EAAO,UAAU,CAAAjC,MAAS;AAC3C,MAAI,KAAK,eAAesC,KAAc,KAAK,gBAAgBL,MAC3D,KAAK,YAAYjC,GAAO,KAAK,cAAA,GACzB,KAAK,UAAUA,EAAM,SAAS,WAAWA,EAAM,mBAAmB,mBAAmB,KAAK,MAAM,MAAMA,EAAM,kBAAkB,uBAAuB,mBAAiB,aAAA;AAAA,IAC5K,CAAC,GACGqC,KAAU,KAAK,IAAI,MAAMJ,EAAO,OAAO;AAAA,EAC7C;AAAA,EACU,aAAa;AAAE,SAAK,WAAA,GAAc/D,EAAW,MAAM,KAAK,aAAa;AAAA,EAAG;AAAA,EAC1E,cAAyB;AAC/B,UAAMqE,IAAOtD,EAAc,SAAS,KAAK,cAAc,GACjDrB,IAA2C,CAAA,GAC3C4E,IAAYD,GAAM;AACxB,QAAIC,KAAa,OAAOA,KAAc,YAAY,CAAC,MAAM,QAAQA,CAAS;AACxE,iBAAW/E,KAAO,CAAC,WAAW,cAAc,WAAW,QAAQ,cAAc,iBAAiB,GAAY;AACxG,cAAMY,IAASmE,EAAsC/E,CAAG;AAAG,QAAI,OAAOY,KAAU,aAAUT,EAAOH,CAAG,IAAIY;AAAA,MAC1G;AAEF,IAAI,OAAO,KAAK,gBAAiB,aAAUT,EAAO,UAAU,KAAK;AACjE,UAAME,IAASe,EAAY,KAAK,MAAM,MAAM,OAAO0D,GAAM,UAAW,YAAY,OAAO,UAAUA,EAAK,MAAM,KAAKA,EAAK,UAAU,KAAKA,EAAK,UAAU,KAAKA,EAAK,SAAS,OAAOA,GAAM,UAAW,WAAW1D,EAAY0D,EAAK,MAAM,IAAI,SAC/NE,IAAO9D,EAAM,KAAK,MAAM,CAAC,SAAS,MAAM,CAAU,KAAKA,EAAM,OAAO4D,GAAM,QAAS,WAAWA,EAAK,OAAO,QAAW,CAAC,SAAS,MAAM,CAAU;AACrJ,WAAO,EAAE,GAAG,KAAK,OAAO,QAAQ,EAAE,GAAG,KAAK,OAAO,QAAQ,GAAG3E,EAAA,GAAU,GAAIE,MAAW,SAAY,KAAK,EAAE,QAAAA,EAAA,GAAW,GAAI2E,MAAS,SAAY,CAAA,IAAK,EAAE,MAAAA,IAAK;AAAA,EAC1J;AAAA,EACA,IAAY,SAAsB;AAChC,UAAM5E,IAAM,EAAE,GAAGS,EAAA;AACjB,eAAWoE,KAAU,CAAC,KAAK,SAASzD,EAAc,WAAW,KAAK,gBAAgB,CAAC;AACjF,iBAAWxB,KAAO,OAAO,KAAKa,CAAe,EAA4B,CAAI,OAAOoE,IAASjF,CAAG,KAAM,aAAUI,EAAIJ,CAAG,IAAIiF,EAAOjF,CAAG;AAEvI,WAAOI;AAAA,EACT;AAAA,EACA,IAAY,UAAU;AACpB,UAAMwB,IAAI,KAAK;AACf,WAAO,CAAC,KAAK,eAAe,KAAK,QAAQA,EAAE,WAAW,gBAAgBA,EAAE,WAAW,YAAY,CAAC,CAACA,EAAE,SAAS,CAACA,EAAE,MAAM,aAAaA,EAAE,SAAS,SAASA,EAAE,sBAAsBA,EAAE,mBAAmB,uBAAuB,aAAa,CAAC,KAAK;AAAA,EAC/O;AAAA,EACA,IAAY,cAAc;AAAE,WAAO,KAAK,QAAQ,KAAK,UAAU,WAAW,gBAAgB,KAAK,UAAU,sBAAsB,KAAK,UAAU,MAAM,KAAK,CAAAqB,MAAKA,EAAE,SAAS,aAAaA,EAAE,WAAW,SAAS;AAAA,EAAG;AAAA,EAC/M,MAAc,IAAIiC,GAAsC;AACtD,QAAI,KAAK,QAAQ,CAAC,KAAK,YAAa;AACpC,UAAML,IAAa,KAAK;AAAY,SAAK,OAAO,IAAM,KAAK,cAAA;AAC3D,QAAI;AAAE,YAAMK,EAAA;AAAA,IAAU,QAAQ;AAAA,IAAoF,UAAA;AACxG,MAAI,KAAK,eAAeL,MAAc,KAAK,OAAO,IAAO,KAAK,cAAA;AAAA,IAAmB;AAAA,EAC7F;AAAA,EACQ,eAAe;AAAE,IAAI,KAAK,UAAS,KAAK,QAAQ,KAAK,MAAM,eAAe,KAAK,QAAQ,MAAM,KAAK,cAAA;AAAA,EAAmB;AAAA,EAoB7H,MAAM,yBAAwC;AAE5C,QADA,MAAM,KAAK,gBACP,CAAC,KAAK,eAAe,KAAK,UAAU,mBAAmB,uBAAuB,UAAW;AAC7F,UAAMM,IAAO,KAAK,WAAW,cAA0B,oBAAoB;AAC3E,QAAI,CAACA,EAAM;AAAQ,UAAMC,IAAK,KAAK,UAAU,kBAAkB;AAE/D,IADA,MAAMD,EAAK,gBACP,GAAC,KAAK,eAAe,KAAK,UAAU,mBAAmB,mBAAmBC,MAC9ED,EAAK,YAAY,cAA2B,yGAAyG,GAAG,MAAA;AAAA,EAC1J;AAAA,EACU,UAAU;AAClB,UAAME,IAAM,KAAK,WAAW,cAA2B,aAAa;AACpE,IAAIA,KAAO,KAAK,iBAAcA,EAAI,YAAYA,EAAI;AAClD,UAAMD,IAAK,KAAK,UAAU,mBAAmB,uBAAuB,YAAY,KAAK,UAAU,kBAAkB,iBAAiB;AAClI,IAAIA,MAAO,KAAK,uBACd,KAAK,qBAAqBA,GACtBA,KAAM,KAAK,eAAe,CAAC,KAAK,UAAU,SAAS,oBAAoB,YAAe,KAAK,uBAAA;AAAA,EAEnG;AAAA,EACQ,WAAW5C,GAA8B;AAC/C,UAAMZ,IAAI,KAAK;AACf,WAAIA,EAAE,OAAO,SAAS,uBAA6BY,EAAQ,gBACvDZ,EAAE,SAAS,CAAC,kBAAkB,kBAAkB,iBAAiB,EAAE,SAASA,EAAE,MAAM,IAAI,IAAUY,EAAQ,cAC1GZ,EAAE,OAAO,SAAS,iBAAuBY,EAAQ,cACjDZ,EAAE,OAAO,SAAS,iBAAuBA,EAAE,MAAM,UACjDA,EAAE,WAAW,eAAqBY,EAAQ,eAC1CZ,EAAE,WAAW,YAAkBY,EAAQ,UACvCZ,EAAE,sBAAsB,KAAK,QAAQ,KAAK,QAAcY,EAAQ,UAChEZ,EAAE,mBAAmB,uBAAuB,YAAkBA,EAAE,SAAS,UAAUY,EAAQ,iBAAiB,KAAK,QAAQA,EAAQ,aAAaA,EAAQ,eACtJZ,EAAE,WAAW,WAAiBY,EAAQ,eACnC;AAAA,EACT;AAAA,EACA,SAAS;AACP,UAAMA,IAAU,KAAK,QAAQZ,IAAI,KAAK,WAAW4C,IAAS,KAAK,aACzDc,IAAS/D,GAAW,KAAK,gBAAgB,KAAK,OAAO,SAAS,GAC9DkB,IAAqB,EAAE,GAAG,KAAK,UAAU,GAAIvB,EAAM,KAAK,SAAS,CAAC,SAAS,MAAM,CAAU,IAAI,EAAE,SAASA,EAAM,KAAK,SAAS,CAAC,SAAS,MAAM,CAAU,EAAA,IAAM,CAAA,GAAK,GAAIA,EAAM,KAAK,UAAU,CAAC,UAAU,MAAM,CAAU,IAAI,EAAE,UAAUA,EAAM,KAAK,UAAU,CAAC,UAAU,MAAM,CAAU,EAAA,IAAM,GAAC,GAC9RqE,IAAQ,KAAK,eAAe,KAAK,OAAO,SAAS3D,EAAE,OAAO,QAAQY,EAAQ;AAChF,WAAOI,YAAe0C,IAAS1C,4BAA+B0C,CAAM,0CAA0C1C,4CAA+C2C,EAAM,KAAA,EAAO,OAAO,CAAC,EAAE,YAAA,CAAa,SAAS,4BAA4BA,CAAK,QAAQ,KAAK,kBAAkB,KAAK,OAAO,WAAW3C,OAAU,KAAK,kBAAkB,KAAK,OAAO,QAAQ,SAASG,CAAO,GAAGnB,EAAE,SAAS,UAAUgB,WAAcJ,EAAQ,WAAW,aAAaO,CAAO;AAAA,QAC/a,KAAK,UAAUH,6CAAgDJ,EAAQ,OAAO,cAAc,CAACgC,KAAU,KAAK,WAAW,WAAW,MAAMA,KAAU,CAAC,KAAK,eAAe,KAAK,KAAK,IAAI,MAAMA,EAAO,WAAW,EAAE,aAAa,KAAK,mBAAmB,OAAA,CAAQ,CAAC,CAAC,IAAIhB,EAAW,oBAAoBhB,EAAQ,OAAO,qBAAqBO,CAAO;AAAA,QAC5U,KAAK,WAAWH,6CAAgDJ,EAAQ,SAAS,eAAeA,EAAQ,SAAS,WAAW,MAAM,KAAK,cAAc,IAAI,YAAY,cAAc,EAAE,SAAS,IAAM,UAAU,IAAM,CAAC,CAAC,IAAIiB,EAAS,cAAcV,CAAO;AAAA,gGAChK,CAACiB,MAAa;AAAE,YAAMwB,IAAKxB,EAAE;AAA8B,WAAK,eAAewB,EAAG,eAAeA,EAAG,YAAYA,EAAG,gBAAgB;AAAA,IAAI,CAAC,kBAAkB,KAAK,OAAO,wBAAwB,KAAK,YAAY,IAAIlD,GAAiBV,GAAGY,GAASC,GAAU+B,GAAQ,WAAW,EAAE,KAAK,IAAI,CAAAY,MAAM;AAAE,MAAIZ,KAAa,KAAK,IAAI,MAAMA,EAAO,MAAMY,CAAE,CAAC;AAAA,IAAG,CAAC,CAAC;AAAA,0CAC3Y,KAAK,WAAW5C,CAAO,CAAC,GAAGZ,EAAE,OAAO,cAAcA,EAAE,WAAW,UAAUA,EAAE,WAAW,YAAYgB,oCAAuC,KAAK,QAAQ,CAAC4B,CAAM,WAAW,MAAMA,KAAU,KAAK,KAAK,IAAI,MAAMA,EAAO,MAAA,CAAO,CAAC,IAAIhC,EAAQ,QAAQ,cAAcO,CAAO;AAAA,QACtSe,GAAe,EAAE,SAAAtB,GAAS,OAAO,KAAK,OAAO,aAAa,KAAK,OAAO,eAAeA,EAAQ,aAAa,UAAU,KAAK,SAAS,OAAO,CAAAwB,MAAK;AAAE,WAAK,QAASA,EAAE,OAA+B,OAAO,KAAK,cAAA;AAAA,IAAiB,GAAG,MAAM,KAAK,MAAM,CAAC;AAAA,QACjP,KAAK,YAAYpB,gFAAmFiB,EAAQ,SAASrB,EAAQ,SAAS,yBAAyBO,CAAO;AAAA,EAC5K;AACF,GApMEuB,EAAO,gBAAgBmB,IACvBnB,EAAO,aAAa,EAAE,gBAAgB,EAAE,WAAW,QAAA,GAAW,kBAAkB,EAAE,WAAW,YAAU,GACvGA,EAAO,SAASoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAHXpB;AAyCgCqB,EAAA;AAAA,EAApCC,EAAS,EAAE,WAAW,WAAA,CAAY;AAAA,GAzCxBvB,EAyC0B,WAAA,SAAA;AACAsB,EAAA;AAAA,EAApCC,EAAS,EAAE,WAAW,WAAA,CAAY;AAAA,GA1CxBvB,EA0C0B,WAAA,SAAA;AACLsB,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GA3CnBvB,EA2CqB,WAAA,QAAA;AACAsB,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GA5CnBvB,EA4CqB,WAAA,OAAA;AACAsB,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GA7CnBvB,EA6CqB,WAAA,UAAA;AACAsB,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GA9CnBvB,EA8CqB,WAAA,SAAA;AACwBsB,EAAA;AAAA,EAAvDC,EAAS,EAAE,WAAW,cAAc,WAAWzB,IAAM;AAAA,GA/C3CE,EA+C6C,WAAA,WAAA;AACFsB,EAAA;AAAA,EAArDC,EAAS,EAAE,WAAW,YAAY,WAAWzB,IAAM;AAAA,GAhDzCE,EAgD2C,WAAA,SAAA;AACTsB,EAAA;AAAA,EAA5CC,EAAS,EAAE,WAAW,mBAAA,CAAoB;AAAA,GAjDhCvB,EAiDkC,WAAA,gBAAA;AACbsB,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAlDnBvB,EAkDqB,WAAA,QAAA;AACHsB,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GAnDhBvB,EAmDkB,WAAA,UAAA;AACYsB,EAAA;AAAA,EAAxCC,EAAS,EAAE,WAAW,eAAA,CAAgB;AAAA,GApD5BvB,EAoD8B,WAAA,aAAA;AACGsB,EAAA;AAAA,EAA3CC,EAAS,EAAE,WAAW,kBAAA,CAAmB;AAAA,GArD/BvB,EAqDiC,WAAA,gBAAA;AACFsB,EAAA;AAAA,EAAzCC,EAAS,EAAE,WAAW,gBAAA,CAAiB;AAAA,GAtD7BvB,EAsD+B,WAAA,cAAA;AACAsB,EAAA;AAAA,EAAzCC,EAAS,EAAE,WAAW,gBAAA,CAAiB;AAAA,GAvD7BvB,EAuD+B,WAAA,cAAA;AAC9BsB,EAAA;AAAA,EAAXC,EAAA;AAAS,GAxDCvB,EAwDC,WAAA,QAAA;AACAsB,EAAA;AAAA,EAAXC,EAAA;AAAS,GAzDCvB,EAyDC,WAAA,MAAA;AACAsB,EAAA;AAAA,EAAXC,EAAA;AAAS,GA1DCvB,EA0DC,WAAA,SAAA;AACAsB,EAAA;AAAA,EAAXC,EAAA;AAAS,GA3DCvB,EA2DC,WAAA,UAAA;AAGKsB,EAAA;AAAA,EAAhBpD,EAAA;AAAM,GA9DI8B,EA8DM,WAAA,WAAA;AACAsB,EAAA;AAAA,EAAhBpD,EAAA;AAAM,GA/DI8B,EA+DM,WAAA,OAAA;AACAsB,EAAA;AAAA,EAAhBpD,EAAA;AAAM,GAhEI8B,EAgEM,WAAA,MAAA;AACAsB,EAAA;AAAA,EAAhBpD,EAAA;AAAM,GAjEI8B,EAiEM,WAAA,OAAA;AAjEZ,IAAMwB,KAANxB;ACXA,SAASyB,EAAW9E,GAAc+E,GAAsC;AAC7E,EAAI,OAAO,iBAAmB,OAAe,eAAe,IAAI/E,CAAI,KACpE,eAAe,OAAOA,GAAM+E,CAAI;AAClC;ACDA,MAAM3B,IAAI,CAAC4B,MAAoCC,GAAUlG,GAAOiG,CAAC,CAAC,GACrDE,IAAaR;AAAA,gBACVtB,EAAE,SAAS,CAAC,UAAUA,EAAE,YAAY,CAAC,eAAeA,EAAE,SAAS,CAAC,YAAYA,EAAE,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;ACC9F,MAAe+B,UAAoB5B,EAAW;AAAA,EAA9C,cAAA;AAAA,UAAA,GAAA,SAAA,GAC2B,KAAA,cAAyC,MAC5C,KAAA,WAAW,IAEH,KAAA,UAAU;AAAA,EAAA;AAAA,EAE/C,IAAc,OAAgB;AAAE,WAAO,CAAC,KAAK,YAAY,KAAK,aAAa,uBAAuB;AAAA,EAAW;AAAA,EAC7G,IAAc,QAAiB;AAC7B,UAAMtB,IAAI,KAAK;AACf,WAAO,CAAC,CAACA,KAAKA,EAAE,cAAc,KAAK,YAAYmD,GAA0BnD,GAAGA,EAAE,YAAY;AAAA,EAC5F;AAAA,EACU,QAAQoD,GAAqC;AACrD,IAAI,CAAC,KAAK,eAAe,CAAC,KAAK,QAAQ,CAAC,KAAK,SAC7C,KAAK,cAAc,IAAI,YAAY,gBAAgB,EAAE,SAAS,IAAM,UAAU,IAAM,QAAQ,EAAE,eAAe,KAAK,YAAY,gBAAgB,UAAAA,EAAA,EAAS,CAAG,CAAC;AAAA,EAC7J;AAAA,EACU,QAAQC,GAA0C;AAAE,IAAIA,EAAQ,IAAI,OAAO,KAAG7F,EAAW,MAAM,KAAK,KAAK;AAAA,EAAG;AACxH;AAfkCkF,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GADVO,EACY,WAAA,aAAA;AACHR,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GAFPO,EAES,WAAA,UAAA;AACGR,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAHVO,EAGY,WAAA,OAAA;AACKR,EAAA;AAAA,EAApCC,EAAS,EAAE,WAAW,WAAA,CAAY;AAAA,GAJfO,EAIiB,WAAA,SAAA;;;;;;ACHhC,MAAMI,IAAN,MAAMA,UAAoBJ,EAAY;AAAA,EAAtC,cAAA;AAAA,UAAA,GAAA,SAAA,GAEL,KAAmB,WAAW,cAClB,KAAA,UAA4B;AAAA,EAAA;AAAA,EACxC,SAAS;AACP,UAAMlD,IAAI,KAAK;AACf,QAAI,CAACA,EAAG,QAAOF;AACf,QAAI,CAAC,KAAK,MAAO,QAAOH,OAAUK,EAAE,OAAO;AAC3C,UAAMD,IAAIC,EAAE,cACNuD,IAASvD,EAAE,kBAAkB,SAAS,SAASA,EAAE,iBAAiB,QAAQD,EAAE,QAAQ,KAAK,OAAKe,EAAE,QAAQd,EAAE,kBAAkB,SAAS,cAAcA,EAAE,iBAAiB,QAAQA,EAAE,mBAAmB,GAAG;AAC5M,WAAOL,qBAAwBI,EAAE,KAAK,OAAOA,EAAE,cAAcJ,2BAA8BI,EAAE,WAAW,SAASD,CAAO;AAAA,QACpH,KAAK,OAAOH,iDAAoD,KAAK,OAAO,aAAa,KAAK,KAAK;AAAA,UACjGI,EAAE,QAAQ,IAAI,CAAAe,MAAKnB,iCAAoC,MAAM,KAAK,KAAKmB,EAAE,IAAIA,EAAE,aAAaA,EAAE,iBAAiB,CAAC,6BAA6BA,EAAE,KAAK,UAAUA,EAAE,cAAcnB,WAAcmB,EAAE,WAAW,aAAahB,CAAO,UAAU,KAAK,YAAY,SAASa,IAAYb,CAAO,WAAW,CAAC;AAAA,gBAC1RyD,IAAS5D,sBAAyB4D,CAAM,SAASzD,CAAO;AAAA,EACtE;AAAA,EACQ,KAAKqC,GAAYqB,GAAmBC,GAAsB;AAChE,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,SAAS,CAAC,KAAK,gBACnC,KAAK,YAAY,mBAAmB,KAAKD,IAC3C,KAAK,cAAc,IAAI,YAAY,sBAAsB,EAAE,SAAS,IAAM,UAAU,IAAM,QAAQ,EAAE,eAAe,KAAK,YAAY,gBAAgB,aAAAC,EAAA,EAAY,CAAG,CAAC,SAC1J,QAAQ,EAAE,MAAM,aAAa,OAAOtB,GAAI;AAAA,EACtD;AAAA,EACQ,MAAMpB,GAAkB;AAC9B,QAAI,CAAC,CAAC,aAAa,WAAW,cAAc,WAAW,EAAE,SAASA,EAAE,GAAG,EAAG;AAC1E,UAAM2C,IAAO,CAAC,GAAG,KAAK,WAAW,iBAAiB,QAAQ,CAAC,GACrDC,IAAKD,EAAK,QAAS,KAAK,WAA0B,aAAkC,GACpFE,IAAO7C,EAAE,QAAQ,eAAeA,EAAE,QAAQ,eAAe,IAAI;AACnE,IAAA2C,GAAMC,IAAKC,IAAOF,EAAK,UAAUA,EAAK,MAAM,GAAG,MAAA,GAAS3C,EAAE,eAAA;AAAA,EAC5D;AACF;AA3BEuC,EAAO,SAASL;AADX,IAAMY,IAANP;AAGOZ,GAAA;AAAA,EAAXC,EAAA;AAAS,GAHCkB,EAGC,WAAA,SAAA;;;;;;ACFP,MAAMC,IAAN,MAAMA,UAAqBZ,EAAY;AAAA,EAAvC,cAAA;AAAA,UAAA,GAAA,SAAA,GAEL,KAAmB,WAAW,eAClB,KAAA,UAA6B,UAChC,KAAQ,QAAQ,GAChB,KAAQ,kCAAkB,IAAA,GAEnC,KAAQ,uBAAuB;AAAA,EAAA;AAAA,EACrB,WAAWG,GAAoC;AACvD,IAAIA,EAAQ,IAAI,aAAa,MAAK,KAAK,QAAQ,GAAG,KAAK,kCAAkB,IAAA,GAAO,KAAK,eAAe,QAAW,KAAK,uBAAuB;AAAA,EAC7I;AAAA,EACA,SAAS;AACP,UAAMrD,IAAI,KAAK;AACf,QAAI,CAACA,EAAG,QAAOF;AACf,QAAI,CAAC,KAAK,MAAO,QAAOH,OAAUK,EAAE,OAAO;AAC3C,UAAMD,IAAIC,EAAE,cACNuD,IAASxD,EAAE,MAAM,KAAK,OAAQF,EAAK,QAAQG,EAAE,kBAAkB,SAAS,cAAcA,EAAE,iBAAiB,QAAQA,EAAE,mBAAmB;AAC5I,WAAOL,qBAAwBI,EAAE,KAAK,OAAOA,EAAE,cAAcJ,2BAA8BI,EAAE,WAAW,SAASD,CAAO;AAAA,QACnH,KAAK,OAAwE,KAAK,YAAY,SAC7FH,sBAAyBI,EAAE,MAAM,IAAI,CAACF,GAAM,MAAM,KAAK,KAAKA,GAAM,CAAC,CAAC,CAAC,WACrEF,sBAAyB,CAACoB,MAAoB;AAAE,WAAK,eAAeA,EAAE,SAAS,KAAK,uBAAuB;AAAA,IAAO,CAAC,eAAe,CAACA,MAAoB;AACvJ,MAAI,KAAK,iBAAiB,UAAa,KAAK,IAAIA,EAAE,UAAU,KAAK,YAAY,IAAI,OAC/E,KAAK,uBAAuB,IAC5B,KAAK,SAASA,EAAE,UAAU,KAAK,eAAe,IAAI,IAAIhB,EAAE,MAAM,MAAM,IAEtE,KAAK,eAAe;AAAA,IACtB,CAAC,mBAAmB,MAAM;AAAE,WAAK,eAAe;AAAA,IAAW,CAAC,IAAI,KAAK,KAAKA,EAAE,MAAM,KAAK,KAAK,GAAI,KAAK,KAAK,CAAC;AAAA,2GACR,KAAK,UAAU,CAAC,WAAW,MAAM,KAAK,SAAS,IAAIA,EAAE,MAAM,MAAM,CAAC,IAAIW,EAAQ;AAAA,kDACvIX,EAAE,MAAM,IAAI,CAACgE,GAAG,MAAMpE,aAAgB,MAAM,KAAK,QAAQ,OAAO,EAAE,OAAO,CAAC,8CAA8C,KAAK,QAAQ,CAAC,OAAOI,EAAE,MAAM,MAAM;AAAA,iFAC5H,KAAK,UAAUA,EAAE,MAAM,SAAS,CAAC,WAAW,MAAM,KAAK,SAAS,GAAGA,EAAE,MAAM,MAAM,CAAC,IAAIY,CAAS,oBAX3J4C,IAAS5D,sBAAyB4D,EAAO,KAAK,SAASzD,CAWqH;AAAA,EAC/L;AAAA,EACQ,SAASkE,GAAeC,GAAgB;AAAE,SAAK,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAIA,IAAS,GAAG,KAAK,QAAQD,CAAK,CAAC;AAAA,EAAG;AAAA,EAC9G,OAAOtC,GAAmBS,GAAY;AAE5C,QAAI,KAAK,wBAAwBT,EAAM,WAAW,GAAG;AACnD,WAAK,uBAAuB,IAC5BA,EAAM,eAAA,GACNA,EAAM,gBAAA;AACN;AAAA,IACF;AACA,SAAK,QAAQ,EAAE,MAAM,aAAa,OAAOS,GAAI;AAAA,EAC/C;AAAA,EACQ,KAAKtC,GAAoBqE,GAAe;AAC9C,UAAMC,IAAQtE,EAAK;AACnB,WAAOF,0BAA6BwE,KAASC,GAAgBD,EAAM,GAAG,IAAIxE,uBAA0B,KAAK,YAAY,IAAIuE,CAAK,IAC1HvE,8EACAA,aAAgB,KAAK,QAAQ,QAAQ,OAAO,EAAE,IAAIwE,EAAM,GAAG,QAAQA,EAAM,GAAG,uDAAuD,MAAM;AAAE,WAAK,kCAAkB,IAAI,CAAC,GAAG,KAAK,aAAaD,CAAK,CAAC;AAAA,IAAG,CAAC,GAAG,WAAWpE,CAAO;AAAA,8BACrMD,EAAK,KAAK,QAAQA,EAAK,cAAcF,OAAUE,EAAK,WAAW,SAASC,CAAO;AAAA,qDACxD,CAACiB,MAAkB,KAAK,OAAOA,GAAGlB,EAAK,EAAE,CAAC,IAAIA,EAAK,gBAAgB,QAAQ;AAAA,EAC9H;AACF;AAjDEiE,EAAO,SAASb;AADX,IAAMoB,IAANP;AAGOpB,EAAA;AAAA,EAAXC,EAAA;AAAS,GAHC0B,EAGC,WAAA,SAAA;AACK3B,EAAA;AAAA,EAAhBpD,EAAA;AAAM,GAJI+E,EAIM,WAAA,OAAA;AACA3B,EAAA;AAAA,EAAhBpD,EAAA;AAAM,GALI+E,EAKM,WAAA,aAAA;;;;;;ACLnB,MAAMC,KAAQ,CAAClE,MAAY,GAAG,OAAOA,EAAE,YAAA,CAAa,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAOA,EAAE,aAAa,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAOA,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IACrJmE,IAAQ,MAAMD,GAAM,oBAAI,MAAM,GAC9BE,IAAY,CAACC,MAAgB;AAAE,QAAMrE,IAAI,oBAAI,KAAK,CAAC;AAAG,SAAAA,EAAE,SAAS,GAAG,GAAG,GAAG,CAAC,GAAGA,EAAE,YAAY,OAAOqE,EAAI,MAAM,GAAG,CAAC,CAAC,GAAG,OAAOA,EAAI,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,OAAOA,EAAI,MAAM,GAAG,EAAE,CAAC,CAAC,GAAUrE;AAAG,GACvLsE,IAAU,CAACD,MAAgBA,EAAI,MAAM,GAAG,CAAC,GAClCE,IAAN,MAAMA,UAAuBzB,EAAY;AAAA,EAAzC,cAAA;AAAA,UAAA,GAAA,SAAA,GAEL,KAAmB,WAAW,kBAClB,KAAA,UAAU,QACb,KAAQ,QAAQwB,EAAQH,GAAO,GAC/B,KAAQ,QAAQ,IAChB,KAAQ,MAAM;AAAA,EAAA;AAAA,EACf,SAASxE,GAA2B;AAAE,WAAOA,EAAE,YAAYA,EAAE,WAAWwE,MAAUxE,EAAE,WAAWwE,EAAA;AAAA,EAAS;AAAA,EACtG,WAAWlB,GAAoC;AACvD,IAAIA,EAAQ,IAAI,aAAa,MAC3B,KAAK,QAAQ,IAAI,KAAK,MAAM,IACxB,KAAK,UAAO,KAAK,QAAQqB,EAAQ,KAAK,SAAS,KAAK,YAAa,YAAsC,CAAC;AAAA,EAEhH;AAAA,EACA,SAAS;AACP,UAAM1E,IAAI,KAAK;AACf,QAAI,CAACA,EAAG,QAAOF;AACf,QAAI,CAAC,KAAK,MAAO,QAAOH,OAAUK,EAAE,OAAO;AAC3C,UAAMD,IAAIC,EAAE,cACNoD,IAAWpD,EAAE,kBACbuD,IAASH,GAAU,SAAS,eAAe,GAAGA,EAAS,MAAM,UAAU,MAAMA,EAAS,MAAM,QAAQ,KAAKA,GAAU,SAAS,UAAUA,GAAU,SAAS,SAASA,EAAS,QAAQpD,EAAE;AAC3L,QAAI,CAAC,KAAK,KAAM,QAAOL,qBAAwBI,EAAE,KAAK,OAAOA,EAAE,cAAcJ,2BAA8BI,EAAE,WAAW,SAASD,CAAO,GAAGyD,IAAS5D,sBAAyB4D,CAAM,SAASzD,CAAO;AACnM,UAAM8E,IAAQJ,EAAU,GAAG,KAAK,KAAK,KAAK,GACpCtF,IAAO,IAAI,KAAK0F,CAAK;AAAG,IAAA1F,EAAK,SAASA,EAAK,SAAA,IAAa,GAAG,CAAC;AAClE,UAAM2F,IAAW,KAAK,SAAS9E,CAAC,GAC1B+E,IAAO,MAAM,KAAK,EAAE,QAAQ5F,EAAK,UAAQ,GAAK,CAAC6E,GAAGgB,MAAM,GAAG,KAAK,KAAK,IAAI,OAAOA,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,GACzGC,IAAOjF,EAAE,mBAAmB,UAAW,KAAK,QAA8C,KAAK,MAAqD,GAAG,KAAK,KAAK,MAAM,KAAK,GAAG,KAA1E,aAAa,KAAK,KAAK,wBAAxE,qCAAgI,KAAK,OACzLkF,KAAMV,EAAA;AACZ,WAAO5E,qBAAwBI,EAAE,KAAK,OAAOA,EAAE,cAAcJ,2BAA8BI,EAAE,WAAW,SAASD,CAAO;AAAA,gIACI,KAAK,SAAS4E,EAAQG,CAAQ,CAAC,WAAW,MAAM,KAAK,UAAU,IAAI9E,CAAC,CAAC,IAAIW,EAAQ;AAAA,mCAC9KkE,EAAM,mBAAmB,QAAW,EAAE,OAAO,QAAQ,MAAM,UAAA,CAAW,CAAC;AAAA,gFAC1B,CAAC,CAAC7E,EAAE,YAAY,KAAK,SAAS2E,EAAQ3E,EAAE,QAAQ,CAAC,WAAW,MAAM,KAAK,UAAU,GAAGA,CAAC,CAAC,IAAIY,CAAS;AAAA,iDAClI,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,EAAE,IAAI,CAAAuE,MAAOvF,UAAauF,CAAG,SAAS,CAAC;AAAA,yEACxD,KAAK,KAAK;AAAA,UACzE,MAAM,KAAK,EAAE,QAAQN,EAAM,YAAY,MAAMjF,gBAAmB,CAAC;AAAA,UACjEmF,EAAK,IAAI,CAACI,GAAKH,MAAMpF,gCAAmC,CAACuF,MAAQD,KAAM,UAAU,IAAIC,MAAQ,KAAK,QAAQ,UAAU,IAAIA,MAAQ,KAAK,MAAM,QAAQ,IAAI,KAAK,SAAS,KAAK,OAAOA,IAAM,KAAK,SAASA,IAAM,KAAK,MAAM,OAAO,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC,eAAeA,CAAG,iBAAiBA,MAAQ,KAAK,SAASA,MAAQ,KAAK,GAAG,cAAcA,IAAML,KAAY,CAAC,CAAC9E,EAAE,YAAYmF,IAAMnF,EAAE,QAAQ,WAAW,MAAM,KAAK,KAAKmF,GAAKnF,CAAC,CAAC,IAAIgF,IAAI,CAAC,WAAW,CAAC;AAAA,iDACnZC,CAAI;AAAA,wDACG,CAAC,KAAK,SAASjF,EAAE,mBAAmB,YAAY,CAAC,KAAK,OAAO,KAAK,SAAS,KAAK,IAAI,WAAW,MAAM,KAAK,QAAQA,CAAC,CAAC,IAAIA,EAAE,iBAAiB,cAAc;AAAA,EAC/M;AAAA,EACQ,UAAUiE,GAAejE,GAA2B;AAC1D,UAAMoF,IAAOX,EAAU,GAAG,KAAK,KAAK,KAAK;AAAG,IAAAW,EAAK,SAASA,EAAK,SAAA,IAAanB,CAAK;AACjF,UAAMoB,IAAOV,EAAQJ,GAAMa,CAAI,CAAC;AAChC,IAAIC,KAAQV,EAAQ,KAAK,SAAS3E,CAAC,CAAC,MAAM,CAACA,EAAE,YAAYqF,KAAQV,EAAQ3E,EAAE,QAAQ,YAAS,QAAQqF;AAAA,EACtG;AAAA,EACQ,KAAKF,GAAanF,GAA2B;AACnD,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,SAAS,CAACsF,EAAeH,CAAG,KAAKA,IAAM,KAAK,SAASnF,CAAC,KAAKA,EAAE,YAAYmF,IAAMnF,EAAE,aACrGA,EAAE,mBAAmB,YAAY,CAAC,KAAK,SAAS,KAAK,OAAOmF,KAAO,KAAK,SAAS,KAAK,QAAQA,GAAK,KAAK,MAAM,WACxG,MAAMA;AAAA,EAClB;AAAA,EACQ,QAAQnF,GAA2B;AACzC,IAAI,CAACsF,EAAe,KAAK,KAAK,KAAK,KAAK,QAAQ,KAAK,SAAStF,CAAC,KAAKA,EAAE,YAAY,KAAK,QAAQA,EAAE,aAC7FA,EAAE,mBAAmB,WAAU,KAAK,QAAQ,EAAE,MAAM,QAAQ,OAAO,KAAK,MAAA,CAAO,IAC1EsF,EAAe,KAAK,GAAG,KAAK,KAAK,QAAQ,KAAK,QAAQ,CAACtF,EAAE,YAAY,KAAK,OAAOA,EAAE,aAAW,KAAK,QAAQ,EAAE,MAAM,cAAc,OAAO,EAAE,YAAY,KAAK,OAAO,UAAU,KAAK,IAAA,GAAO;AAAA,EACnM;AAAA,EACQ,MAAMgB,GAAkB;AAE9B,UAAM6C,IADgC,EAAE,WAAW,IAAI,YAAY,GAAG,SAAS,IAAI,WAAW,EAAA,EAC3E7C,EAAE,GAAG;AAAG,QAAI6C,MAAS,OAAW;AACnD,UAAM0B,IAAU,CAAC,GAAG,KAAK,WAAW,iBAAoC,cAAc,CAAC,GACjF3B,IAAK2B,EAAQ,QAAS,KAAK,WAA0B,aAAkC;AAC7F,QAAI3B,IAAK,EAAG;AACZ,QAAIyB,IAAOzB,IAAKC;AAChB,WAAOwB,KAAQ,KAAKA,IAAOE,EAAQ,UAAUA,EAAQF,CAAI,GAAG,WAAU,CAAAA,KAAQxB,IAAO,IAAI,IAAI;AAC7F,IAAA0B,EAAQF,CAAI,GAAG,MAAA,GAASrE,EAAE,eAAA;AAAA,EAC5B;AACF;AA/DE4D,EAAO,SAAS1B;AADX,IAAMsC,IAANZ;AAGOjC,EAAA;AAAA,EAAXC,EAAA;AAAS,GAHC4C,EAGC,WAAA,SAAA;AACK7C,EAAA;AAAA,EAAhBpD,EAAA;AAAM,GAJIiG,EAIM,WAAA,OAAA;AACA7C,EAAA;AAAA,EAAhBpD,EAAA;AAAM,GALIiG,EAKM,WAAA,OAAA;AACA7C,EAAA;AAAA,EAAhBpD,EAAA;AAAM,GANIiG,EAMM,WAAA,KAAA;ACZnB1C,EAAW,aAAaD,EAAQ;AAChCC,EAAW,gBAAgBgB,CAAW;AACtChB,EAAW,iBAAiBwB,CAAY;AACxCxB,EAAW,oBAAoB0C,CAAc;"}
|