@shival99/z-ui 2.2.0 → 2.2.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"shival99-z-ui-components-z-chat.mjs","sources":["../../../../libs/core-ui/components/z-chat/z-chat.variants.ts","../../../../libs/core-ui/components/z-chat/z-chat.component.ts","../../../../libs/core-ui/components/z-chat/z-chat.component.html","../../../../libs/core-ui/components/z-chat/shival99-z-ui-components-z-chat.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const zChatWrapperVariants = cva('z-chat fixed z-[95] pointer-events-none', {\n variants: {\n zPosition: {\n 'bottom-right': '',\n 'bottom-left': '',\n },\n },\n defaultVariants: {\n zPosition: 'bottom-right',\n },\n});\n\nexport const zChatPanelVariants = cva(\n 'absolute bottom-16 flex flex-col overflow-hidden rounded-2xl shadow-2xl transition-all duration-200',\n {\n variants: {\n zPosition: {\n 'bottom-right': 'right-0 origin-bottom-right',\n 'bottom-left': 'left-0 origin-bottom-left',\n },\n zSize: {\n sm: 'h-[28rem] w-[20rem]',\n default: 'h-[35rem] w-[25rem]',\n lg: 'h-[39rem] w-[29rem]',\n },\n zOpen: {\n true: 'pointer-events-auto visible translate-y-0 scale-100 opacity-100',\n false: 'pointer-events-none invisible translate-y-3 scale-95 opacity-0',\n },\n },\n defaultVariants: {\n zPosition: 'bottom-right',\n zSize: 'default',\n zOpen: false,\n },\n }\n);\n\nexport const zChatFabVariants = cva(\n 'relative inline-flex size-14 items-center justify-center rounded-full shadow-lg ring-1 ring-black/5 transition-all duration-200 hover:scale-[1.03] active:scale-95',\n {\n variants: {\n zOpen: {\n true: 'bg-background text-foreground border border-border shadow-xl dark:border-white/15 dark:bg-[#2b2b2b] dark:text-white',\n false: 'from-primary via-primary to-primary/75 bg-gradient-to-br text-white shadow-xl',\n },\n },\n defaultVariants: {\n zOpen: false,\n },\n }\n);\n\nexport type ZChatVariants = VariantProps<typeof zChatPanelVariants>;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n input,\n model,\n OnDestroy,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ZIconComponent, type ZIcon } from '@shival99/z-ui/components/z-icon';\nimport { ZModalComponent } from '@shival99/z-ui/components/z-modal';\nimport { zMergeClasses, zTransform, zUuid } from '@shival99/z-ui/utils';\nimport type { ClassValue } from 'clsx';\nimport { NgScrollbar } from 'ngx-scrollbar';\nimport type {\n ZChatAttachment,\n ZChatMessage,\n ZChatOffset,\n ZChatPosition,\n ZChatSendEvent,\n ZChatSize,\n ZChatSuggestion,\n} from './z-chat.types';\nimport { zChatFabVariants, zChatPanelVariants, zChatWrapperVariants } from './z-chat.variants';\n\nconst DEFAULT_SUGGESTIONS: ZChatSuggestion[] = [\n {\n label: 'i18n_z_ui_chat_ai_suggestion_1',\n prompt: 'Create release notes from recent commits',\n icon: 'lucideSparkles',\n },\n {\n label: 'i18n_z_ui_chat_ai_suggestion_2',\n prompt: 'Suggest test cases for a new feature',\n icon: 'lucideFlaskConical',\n },\n { label: 'i18n_z_ui_chat_ai_suggestion_3', prompt: 'Generate a concise PR summary', icon: 'lucideGitPullRequest' },\n];\n\n@Component({\n selector: 'z-chat',\n imports: [FormsModule, TranslatePipe, ZIconComponent, ZModalComponent, NgScrollbar],\n standalone: true,\n templateUrl: './z-chat.component.html',\n styleUrl: './z-chat.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'z-chat block',\n '(document:keydown.escape)': 'onEscapeKey()',\n },\n exportAs: 'zChat',\n})\nexport class ZChatComponent implements OnDestroy {\n public readonly class = input<ClassValue>('');\n public readonly zOpen = model(false);\n public readonly zMessages = model<ZChatMessage[]>([]);\n public readonly zTitle = input('i18n_z_ui_chat_ai_title');\n public readonly zSubtitle = input('i18n_z_ui_chat_ai_subtitle');\n public readonly zPlaceholder = input('i18n_z_ui_chat_ai_placeholder');\n public readonly zPosition = input<ZChatPosition>('bottom-right');\n public readonly zOffset = input<ZChatOffset>({});\n public readonly zSize = input<ZChatSize>('default');\n public readonly zSuggestions = input<ZChatSuggestion[]>(DEFAULT_SUGGESTIONS);\n public readonly zShowSuggestions = input(true, { transform: zTransform });\n public readonly zShowPulse = input(true, { transform: zTransform });\n public readonly zDisabled = input(false, { transform: zTransform });\n public readonly zLoading = input(false, { transform: zTransform });\n public readonly zAllowAttachments = input(true, { transform: zTransform });\n public readonly zAcceptedFiles = input('image/*,.pdf,.doc,.docx,.txt,.csv,.xlsx');\n public readonly zAutoReply = input(true, { transform: zTransform });\n public readonly zAutoReplyDelay = input(1200);\n public readonly zFabIcon = input<ZIcon>('lucideMessageSquareDot');\n public readonly zBotIcon = input<ZIcon>('lucideBot');\n public readonly zSendIcon = input<ZIcon>('lucideArrowUp');\n\n public readonly zSend = output<ZChatSendEvent>();\n public readonly zResponse = output<ZChatMessage>();\n public readonly zToggle = output<boolean>();\n public readonly zClear = output<void>();\n\n protected readonly draftMessage = signal('');\n protected readonly showRipple = signal(false);\n protected readonly attachments = signal<ZChatAttachment[]>([]);\n protected readonly isComposerExpanded = signal(false);\n protected readonly isComposerOverflowing = signal(false);\n protected readonly isPreviewVisible = signal(false);\n protected readonly previewImage = signal<{ url: string; name: string; size: number } | null>(null);\n\n private readonly _mockTyping = signal(false);\n private readonly _messagesScrollbarRef = viewChild<NgScrollbar>('messagesScrollbar');\n private readonly _chatInputRef = viewChild<ElementRef<HTMLTextAreaElement>>('chatInput');\n private readonly _fileInputRef = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n private _mockReplyTimer: ReturnType<typeof setTimeout> | null = null;\n private _rippleTimer: ReturnType<typeof setTimeout> | null = null;\n private _scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\n protected readonly wrapperClasses = computed(() =>\n zMergeClasses(zChatWrapperVariants({ zPosition: this.zPosition() }), this.class())\n );\n\n protected readonly wrapperTop = computed(() => this._resolveOffsetValue('top'));\n protected readonly wrapperRight = computed(() => this._resolveOffsetValue('right'));\n protected readonly wrapperBottom = computed(() => this._resolveOffsetValue('bottom'));\n protected readonly wrapperLeft = computed(() => this._resolveOffsetValue('left'));\n\n protected readonly panelClasses = computed(() =>\n zChatPanelVariants({\n zPosition: this.zPosition(),\n zSize: this.zSize(),\n zOpen: this.zOpen(),\n })\n );\n\n protected readonly fabClasses = computed(() =>\n zChatFabVariants({\n zOpen: this.zOpen(),\n })\n );\n\n protected readonly isTyping = computed(() => this.zLoading() || this._mockTyping());\n protected readonly canSend = computed(\n () => (!!this.draftMessage().trim() || this.attachments().length > 0) && !this.zDisabled() && !this.isTyping()\n );\n\n protected readonly hasMessages = computed(() => this.zMessages().length > 0);\n protected readonly showEmptyState = computed(() => !this.hasMessages() && this.zShowSuggestions());\n protected readonly previewImageSizeLabel = computed(() => {\n const preview = this.previewImage();\n return preview ? this.formatFileSize(preview.size) : '';\n });\n\n public ngOnDestroy(): void {\n if (this._mockReplyTimer) {\n clearTimeout(this._mockReplyTimer);\n }\n if (this._rippleTimer) {\n clearTimeout(this._rippleTimer);\n }\n if (this._scrollTimer) {\n clearTimeout(this._scrollTimer);\n }\n const filesInMessages = this.zMessages().flatMap(item => item.files ?? []);\n this._releaseAttachmentUrls(filesInMessages);\n this._releaseAttachmentUrls(this.attachments());\n }\n\n public open(): void {\n if (this.zOpen()) {\n return;\n }\n this._toggle(true);\n }\n\n public close(): void {\n if (!this.zOpen()) {\n return;\n }\n this._toggle(false);\n }\n\n public clearMessages(): void {\n const filesInMessages = this.zMessages().flatMap(item => item.files ?? []);\n this._releaseAttachmentUrls(filesInMessages);\n this.zMessages.set([]);\n this.zClear.emit();\n }\n\n protected onToggle(): void {\n this._toggle(!this.zOpen());\n }\n\n protected onSuggestionSelect(item: ZChatSuggestion): void {\n this.draftMessage.set((item.prompt ?? item.label).trim());\n this.onSendMessage();\n }\n\n protected onClickAttach(): void {\n this._fileInputRef()?.nativeElement.click();\n }\n\n protected onFileChange(event: Event): void {\n const inputEl = event.target as HTMLInputElement;\n const { files } = inputEl;\n if (!files || files.length === 0) {\n return;\n }\n\n this._appendFiles(Array.from(files));\n inputEl.value = '';\n }\n\n protected onTextareaPaste(event: ClipboardEvent): void {\n if (!this.zAllowAttachments()) {\n return;\n }\n const items = event.clipboardData?.items;\n if (!items || items.length === 0) {\n return;\n }\n\n const files: File[] = [];\n Array.from(items).forEach(item => {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) {\n files.push(file);\n }\n }\n });\n\n if (files.length > 0) {\n event.preventDefault();\n this._appendFiles(files);\n }\n }\n\n protected removeAttachment(id: string): void {\n const target = this.attachments().find(item => item.id === id);\n if (target?.previewUrl) {\n URL.revokeObjectURL(target.previewUrl);\n }\n this.attachments.update(files => files.filter(item => item.id !== id));\n }\n\n protected formatFileSize(size: number): string {\n if (size < 1024) {\n return `${size} B`;\n }\n if (size < 1024 * 1024) {\n return `${(size / 1024).toFixed(1)} KB`;\n }\n if (size < 1024 * 1024 * 1024) {\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n }\n return `${(size / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n }\n\n protected isImageAttachment(file: ZChatAttachment): boolean {\n return file.type.startsWith('image/');\n }\n\n protected openImagePreview(file: ZChatAttachment): void {\n if (!file.previewUrl || !this.isImageAttachment(file)) {\n return;\n }\n this.previewImage.set({\n url: file.previewUrl,\n name: file.name,\n size: file.size,\n });\n this.isPreviewVisible.set(true);\n }\n\n protected closeImagePreview(): void {\n setTimeout(() => {\n this.isPreviewVisible.set(false);\n this.previewImage.set(null);\n }, 300);\n }\n\n protected onInputKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.onSendMessage();\n }\n }\n\n protected onTextareaInput(event: Event): void {\n const textarea = event.target as HTMLTextAreaElement;\n textarea.style.height = 'auto';\n const nextHeight = Math.min(textarea.scrollHeight, 66);\n textarea.style.height = `${nextHeight}px`;\n textarea.style.overflowY = textarea.scrollHeight > 66 ? 'auto' : 'hidden';\n this.isComposerExpanded.set(nextHeight > 44 || textarea.value.includes('\\n'));\n this.isComposerOverflowing.set(textarea.scrollHeight > nextHeight + 1);\n }\n\n protected onSendMessage(): void {\n const message = this.draftMessage().trim();\n if (!message && this.attachments().length === 0) {\n return;\n }\n if (!this.canSend()) {\n return;\n }\n\n const attachedFiles = this.attachments().map(file => ({\n ...file,\n // Keep message preview URLs alive after composer files are cleared.\n previewUrl: this._createMessagePreviewUrl(file),\n file: undefined,\n }));\n const messageContent = message || `Attached ${attachedFiles.length} file(s).`;\n const userMessage = this._createMessage('user', messageContent, attachedFiles);\n const nextMessages = [...this.zMessages(), userMessage];\n this.zMessages.set(nextMessages);\n this._ensureBottomVisible();\n this.draftMessage.set('');\n this._releaseAttachmentUrls(this.attachments());\n this.attachments.set([]);\n const inputEl = this._chatInputRef()?.nativeElement;\n if (inputEl) {\n inputEl.style.height = '66px';\n inputEl.style.overflowY = 'hidden';\n }\n this.isComposerExpanded.set(false);\n this.isComposerOverflowing.set(false);\n this.zSend.emit({ message: messageContent, files: attachedFiles, messages: nextMessages });\n\n if (this.zAutoReply()) {\n this._simulateReply(messageContent, attachedFiles.length);\n }\n\n this._focusInputSoon();\n }\n\n private _toggle(isOpen: boolean): void {\n this.zOpen.set(isOpen);\n this.zToggle.emit(isOpen);\n this._triggerRipple();\n\n if (isOpen) {\n this._focusInputSoon();\n requestAnimationFrame(() => {\n this._scheduleScrollToBottom(250);\n });\n }\n }\n\n private _createMessage(role: ZChatMessage['role'], content: string, files?: ZChatAttachment[]): ZChatMessage {\n return {\n id: zUuid(),\n role,\n content,\n files,\n createdAt: Date.now(),\n };\n }\n\n private _simulateReply(userMessage: string, fileCount: number): void {\n if (this._mockReplyTimer) {\n clearTimeout(this._mockReplyTimer);\n }\n this._mockTyping.set(true);\n const delay = Math.max(200, this.zAutoReplyDelay());\n\n this._mockReplyTimer = setTimeout(() => {\n this._mockTyping.set(false);\n const botMessage = this._createMessage('assistant', this._buildMockReply(userMessage, fileCount));\n this.zMessages.update(messages => [...messages, botMessage]);\n this.zResponse.emit(botMessage);\n this._ensureBottomVisible();\n }, delay);\n }\n\n private _buildMockReply(message: string, fileCount: number): string {\n const normalized = message.toLowerCase();\n\n if (fileCount > 0) {\n return `Received ${fileCount} attachment(s). I can summarize, extract key points, or draft a reply from these files.`;\n }\n if (normalized.includes('deploy') || normalized.includes('release')) {\n return 'Deployment checklist: run lint, build artifact, smoke test staging, then promote to production.';\n }\n if (normalized.includes('bug') || normalized.includes('error')) {\n return 'Please share logs, repro steps, expected behavior, and current environment so I can triage precisely.';\n }\n if (normalized.includes('test')) {\n return 'I suggest coverage for happy path, validation failures, edge cases, and retry/error handling.';\n }\n return 'Got it. I can help you break this task into actionable steps and propose code changes.';\n }\n\n private _triggerRipple(): void {\n this.showRipple.set(true);\n if (this._rippleTimer) {\n clearTimeout(this._rippleTimer);\n }\n this._rippleTimer = setTimeout(() => this.showRipple.set(false), 350);\n }\n\n protected onMessagesScrollbarInit(): void {\n this._ensureBottomVisible();\n }\n\n protected onEscapeKey(): void {\n if (this.previewImage()) {\n this.closeImagePreview();\n }\n }\n\n private _scheduleScrollToBottom(delay = 0, duration = 300): void {\n if (this._scrollTimer) {\n clearTimeout(this._scrollTimer);\n }\n this._scrollTimer = setTimeout(() => {\n this._scrollToBottom(duration);\n }, delay);\n }\n\n private _ensureBottomVisible(): void {\n this._scrollToBottom(0);\n requestAnimationFrame(() => {\n this._scrollToBottom(0);\n this._scheduleScrollToBottom(90, 0);\n });\n }\n\n private _scrollToBottom(duration = 300): void {\n const scrollbar = this._messagesScrollbarRef();\n if (!scrollbar) {\n return;\n }\n void scrollbar.scrollTo({\n bottom: 0,\n duration,\n easing: { x1: 0.25, y1: 0.1, x2: 0.25, y2: 1 },\n });\n }\n\n private _focusInputSoon(): void {\n setTimeout(() => this._chatInputRef()?.nativeElement.focus(), 50);\n }\n\n private _releaseAttachmentUrls(files: ZChatAttachment[]): void {\n files.forEach(file => {\n if (file.previewUrl) {\n URL.revokeObjectURL(file.previewUrl);\n }\n });\n }\n\n private _appendFiles(files: File[]): void {\n const nextFiles: ZChatAttachment[] = files.map(file => ({\n id: zUuid(),\n name: file.name,\n size: file.size,\n type: file.type,\n previewUrl: file.type.startsWith('image/') ? URL.createObjectURL(file) : undefined,\n file,\n }));\n\n this.attachments.update(current => [...current, ...nextFiles]);\n }\n\n private _createMessagePreviewUrl(file: ZChatAttachment): string | undefined {\n if (!this.isImageAttachment(file)) {\n return undefined;\n }\n if (file.file) {\n return URL.createObjectURL(file.file);\n }\n return file.previewUrl;\n }\n\n private _resolveOffsetValue(side: keyof ZChatOffset): string | null {\n const override = this.zOffset()[side];\n if (override !== undefined && override !== null && override !== '') {\n return typeof override === 'number' ? `${override}px` : String(override);\n }\n\n const defaults =\n this.zPosition() === 'bottom-left'\n ? { top: null, right: null, bottom: '1.25rem', left: '1.5rem' }\n : { top: null, right: '1.5rem', bottom: '1.25rem', left: null };\n\n return defaults[side];\n }\n}\n","<div\n [class]=\"wrapperClasses()\"\n [style.top]=\"wrapperTop()\"\n [style.right]=\"wrapperRight()\"\n [style.bottom]=\"wrapperBottom()\"\n [style.left]=\"wrapperLeft()\">\n <div class=\"relative\">\n <section class=\"z-chat-panel-shell\" [class]=\"panelClasses()\">\n <header class=\"from-primary/95 to-primary/75 text-primary-foreground bg-gradient-to-r px-4 py-3.5\">\n <div class=\"flex items-start justify-between gap-3\">\n <div class=\"min-w-0\">\n <div class=\"flex items-center gap-2\">\n <span\n class=\"bg-primary-foreground/15 relative inline-flex size-8 shrink-0 items-center justify-center rounded-full\">\n <z-icon [zType]=\"zBotIcon()\" zSize=\"16\" class=\"text-primary-foreground\" />\n <span\n class=\"ring-primary inline-block size-2.5 rounded-full bg-emerald-300 ring-2\"\n style=\"position: absolute; right: -0.0625rem; bottom: -0.0625rem\"></span>\n </span>\n <h3 class=\"truncate text-sm font-semibold\">{{ zTitle() | translate }}</h3>\n </div>\n </div>\n <div class=\"flex items-center gap-1\">\n <button\n type=\"button\"\n class=\"text-primary-foreground/90 hover:bg-primary-foreground/15 inline-flex size-8 cursor-pointer items-center justify-center rounded-md transition\"\n (click)=\"clearMessages()\"\n title=\"{{ 'i18n_z_ui_chat_ai_new_chat' | translate }}\">\n <z-icon zType=\"lucideRefreshCcw\" zSize=\"17\" />\n </button>\n <button\n type=\"button\"\n class=\"text-primary-foreground/90 hover:bg-primary-foreground/15 inline-flex size-8 cursor-pointer items-center justify-center rounded-md transition\"\n (click)=\"close()\"\n title=\"{{ 'i18n_z_ui_chat_ai_close' | translate }}\">\n <z-icon zType=\"lucideChevronDown\" zSize=\"18\" />\n </button>\n </div>\n </div>\n </header>\n\n <div class=\"z-chat-lower-shell\">\n <ng-scrollbar\n #messagesScrollbar\n (afterInit)=\"onMessagesScrollbarInit()\"\n class=\"z-chat-scrollbar z-chat-content-surface flex-1 overflow-x-hidden\"\n track=\"vertical\"\n orientation=\"vertical\"\n appearance=\"compact\"\n visibility=\"hover\">\n <div class=\"z-chat-messages\">\n @if (hasMessages()) {\n @for (item of zMessages(); track item.id) {\n <div\n class=\"z-chat-message z-chat-message--enter\"\n [class.justify-end]=\"item.role === 'user'\"\n [class.justify-start]=\"item.role === 'assistant'\">\n <div\n class=\"z-chat-message-bubble max-w-[88%] min-w-0 rounded-2xl px-3 py-2.5 text-sm leading-5 [overflow-wrap:anywhere] break-all shadow-xs\"\n [class.bg-primary]=\"item.role === 'user'\"\n [class.text-primary-foreground]=\"item.role === 'user'\"\n [class.rounded-br-md]=\"item.role === 'user'\"\n [class.bg-background]=\"item.role === 'assistant'\"\n [class.border-border/60]=\"item.role === 'assistant'\"\n [class.text-foreground]=\"item.role === 'assistant'\"\n [class.rounded-bl-md]=\"item.role === 'assistant'\"\n [class.border]=\"item.role === 'assistant'\">\n @if (item.files && item.files.length > 0) {\n <div class=\"mb-2 flex flex-col gap-1.5\">\n @for (file of item.files; track file.id) {\n <div\n class=\"flex items-center gap-2 rounded-[0.5rem] px-2 py-1.5 text-xs\"\n [class.bg-white/15]=\"item.role === 'user'\"\n [class.bg-muted/40]=\"item.role === 'assistant'\">\n @if (isImageAttachment(file) && file.previewUrl) {\n <img\n [src]=\"file.previewUrl\"\n [alt]=\"file.name\"\n class=\"size-8 cursor-pointer rounded-[0.5rem] object-cover\"\n (click)=\"openImagePreview(file)\"\n title=\"Click to preview\" />\n } @else {\n <span\n class=\"bg-background/80 text-muted-foreground inline-flex size-8 items-center justify-center rounded-[0.5rem]\"\n [class.bg-white/20]=\"item.role === 'user'\"\n [class.text-white]=\"item.role === 'user'\">\n <z-icon zType=\"lucideFileText\" zSize=\"14\" />\n </span>\n }\n <div class=\"min-w-0 flex-1\">\n <p class=\"truncate text-[0.6875rem] font-medium\">{{ file.name }}</p>\n <p class=\"truncate text-[0.625rem] opacity-80\">{{ formatFileSize(file.size) }}</p>\n </div>\n </div>\n }\n </div>\n }\n {{ item.content }}\n </div>\n </div>\n }\n } @else if (showEmptyState()) {\n <div class=\"flex h-full min-h-60 flex-col items-center justify-center px-2 text-center\">\n <div\n class=\"from-primary/20 to-primary/5 mb-3 inline-flex size-14 items-center justify-center rounded-full bg-gradient-to-br\">\n <z-icon zType=\"lucideBot\" zSize=\"28\" class=\"text-primary\" />\n </div>\n <h4 class=\"text-foreground text-sm font-semibold\">{{ 'i18n_z_ui_chat_ai_empty_title' | translate }}</h4>\n <p class=\"text-muted-foreground mt-1 text-xs\">{{ 'i18n_z_ui_chat_ai_empty_desc' | translate }}</p>\n\n @if (zSuggestions().length > 0) {\n <div class=\"mt-4 flex w-full flex-col gap-2\">\n @for (item of zSuggestions(); track item.label) {\n <button\n type=\"button\"\n class=\"z-chat-suggestion-item bg-background/95 hover:bg-background border-border/60 text-foreground flex w-full cursor-pointer items-center gap-2 rounded-xl border px-3 py-2 text-left text-xs transition hover:shadow-sm\"\n [style.animation-delay.ms]=\"$index * 70\"\n (click)=\"onSuggestionSelect(item)\">\n @if (item.icon) {\n <z-icon [zType]=\"item.icon!\" zSize=\"14\" class=\"text-primary shrink-0\" />\n }\n <span class=\"line-clamp-2\">{{ item.label | translate }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (isTyping()) {\n <div class=\"z-chat-message z-chat-message--enter justify-start\">\n <div class=\"bg-background border-border/60 rounded-2xl rounded-bl-md border px-3 py-2\">\n <div class=\"flex items-center gap-1\">\n <span class=\"bg-muted-foreground/60 inline-block size-1.5 animate-bounce rounded-full\"></span>\n <span\n class=\"bg-muted-foreground/60 inline-block size-1.5 animate-bounce rounded-full\"\n style=\"animation-delay: 0.15s\"></span>\n <span\n class=\"bg-muted-foreground/60 inline-block size-1.5 animate-bounce rounded-full\"\n style=\"animation-delay: 0.3s\"></span>\n </div>\n </div>\n </div>\n }\n </div>\n </ng-scrollbar>\n\n <footer class=\"z-chat-footer-surface p-3\">\n @if (attachments().length > 0) {\n <div class=\"mb-2 flex max-h-32 flex-col gap-2 overflow-y-auto pr-1\">\n @for (file of attachments(); track file.id) {\n <div\n class=\"bg-muted/45 border-border/55 relative flex w-full items-center gap-2 rounded-[0.5rem] border px-2 py-1.5\">\n @if (isImageAttachment(file) && file.previewUrl) {\n <img\n [src]=\"file.previewUrl\"\n [alt]=\"file.name\"\n class=\"size-8 shrink-0 cursor-pointer rounded-[0.5rem] object-cover\"\n (click)=\"openImagePreview(file)\"\n title=\"Click to preview\" />\n } @else {\n <span\n class=\"bg-background text-muted-foreground inline-flex size-8 shrink-0 items-center justify-center rounded-[0.5rem]\">\n <z-icon zType=\"lucideFileText\" zSize=\"14\" />\n </span>\n }\n <div class=\"min-w-0 flex-1\">\n <p class=\"truncate text-[0.6875rem] font-medium\">{{ file.name }}</p>\n <p class=\"text-muted-foreground truncate text-[0.625rem]\">{{ formatFileSize(file.size) }}</p>\n </div>\n <button\n type=\"button\"\n class=\"bg-background/80 hover:bg-background text-muted-foreground inline-flex size-5 cursor-pointer items-center justify-center rounded-full transition\"\n (click)=\"removeAttachment(file.id)\">\n <z-icon zType=\"lucideX\" zSize=\"12\" />\n </button>\n </div>\n }\n </div>\n }\n\n <div class=\"z-chat-composer-shell\">\n <div class=\"z-chat-composer-main\" [class.z-chat-composer__field--overflow]=\"isComposerOverflowing()\">\n <textarea\n #chatInput\n class=\"z-chat-composer-textarea\"\n [placeholder]=\"zPlaceholder() | translate\"\n [disabled]=\"zDisabled()\"\n [ngModel]=\"draftMessage()\"\n (ngModelChange)=\"draftMessage.set($event)\"\n (input)=\"onTextareaInput($event)\"\n (paste)=\"onTextareaPaste($event)\"\n (keydown)=\"onInputKeydown($event)\"\n rows=\"3\"></textarea>\n </div>\n\n <div class=\"z-chat-composer-toolbar\">\n <div class=\"z-chat-composer-toolbar-left\">\n @if (zAllowAttachments()) {\n <input\n #fileInput\n type=\"file\"\n class=\"hidden\"\n [attr.accept]=\"zAcceptedFiles()\"\n multiple\n (change)=\"onFileChange($event)\" />\n <button\n type=\"button\"\n class=\"z-chat-composer-tool-btn\"\n [disabled]=\"zDisabled()\"\n (click)=\"onClickAttach()\"\n title=\"{{ 'i18n_z_ui_chat_ai_attach' | translate }}\">\n <z-icon zType=\"lucidePlus\" zSize=\"18\" />\n </button>\n }\n </div>\n\n <div class=\"z-chat-composer-toolbar-right\">\n <button\n type=\"button\"\n class=\"z-chat-composer-send-btn\"\n [disabled]=\"!canSend()\"\n (click)=\"onSendMessage()\"\n title=\"{{ 'i18n_z_ui_chat_ai_send' | translate }}\">\n <z-icon\n [zType]=\"isTyping() ? 'lucideLoaderCircle' : zSendIcon()\"\n zSize=\"16\"\n [class]=\"isTyping() ? 'animate-spin' : ''\" />\n </button>\n </div>\n </div>\n </div>\n </footer>\n </div>\n\n <z-modal\n [zVisible]=\"isPreviewVisible()\"\n [zTitle]=\"previewImage()?.name\"\n [zDescription]=\"previewImageSizeLabel()\"\n zWidth=\"min(92vw, 720px)\"\n [zHideFooter]=\"true\"\n [zMaskClosable]=\"true\"\n zOverlay=\"blur\"\n (zCancel)=\"closeImagePreview()\">\n <div class=\"z-chat-preview-modal-body\">\n <img [src]=\"previewImage()?.url\" [alt]=\"previewImage()?.name\" class=\"z-chat-preview-image\" />\n </div>\n </z-modal>\n </section>\n\n <button\n type=\"button\"\n class=\"pointer-events-auto cursor-pointer\"\n [class]=\"fabClasses()\"\n (click)=\"onToggle()\"\n [attr.aria-expanded]=\"zOpen()\"\n [attr.aria-label]=\"'i18n_z_ui_chat_ai_toggle' | translate\"\n title=\"{{ 'i18n_z_ui_chat_ai_toggle' | translate }}\">\n @if (zShowPulse() && !zOpen()) {\n <span class=\"bg-primary/30 absolute inset-0 animate-ping rounded-full\"></span>\n }\n\n @if (showRipple()) {\n <span class=\"bg-primary-foreground/30 absolute inset-0 animate-ping rounded-full\"></span>\n }\n\n <z-icon\n [zType]=\"zOpen() ? 'lucideX' : zFabIcon()\"\n zSize=\"24\"\n class=\"relative z-1 transition-transform duration-200\"\n [class.rotate-180]=\"zOpen()\" />\n </button>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shival99-z-ui-components-z-chat.mjs","sources":["../../../../libs/core-ui/components/z-chat/z-chat.define.ts","../../../../libs/core-ui/components/z-chat/z-chat.variants.ts","../../../../libs/core-ui/components/z-chat/z-chat.component.ts","../../../../libs/core-ui/components/z-chat/z-chat.component.html","../../../../libs/core-ui/components/z-chat/shival99-z-ui-components-z-chat.ts"],"sourcesContent":["import type { ZChatSuggestion } from './z-chat.types';\n\n/** Renders a pin gets to land the list on the newest message before it gives up. */\nexport const Z_CHAT_PIN_TO_NEWEST_ATTEMPTS = 12;\n\n/** Gợi ý mặc định hiển thị khi khung chat chưa có tin nhắn nào. */\nexport const Z_CHAT_DEFAULT_SUGGESTIONS: ZChatSuggestion[] = [\n {\n label: 'i18n_z_ui_chat_ai_suggestion_1',\n prompt: 'Create release notes from recent commits',\n icon: 'lucideSparkles',\n },\n {\n label: 'i18n_z_ui_chat_ai_suggestion_2',\n prompt: 'Suggest test cases for a new feature',\n icon: 'lucideFlaskConical',\n },\n { label: 'i18n_z_ui_chat_ai_suggestion_3', prompt: 'Generate a concise PR summary', icon: 'lucideGitPullRequest' },\n];\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const zChatWrapperVariants = cva('z-chat fixed z-[95] pointer-events-none', {\n variants: {\n zPosition: {\n 'bottom-right': '',\n 'bottom-left': '',\n },\n },\n defaultVariants: {\n zPosition: 'bottom-right',\n },\n});\n\nexport const zChatPanelVariants = cva(\n 'absolute bottom-16 flex flex-col overflow-hidden rounded-2xl shadow-2xl transition-all duration-200',\n {\n variants: {\n zPosition: {\n 'bottom-right': 'right-0 origin-bottom-right',\n 'bottom-left': 'left-0 origin-bottom-left',\n },\n zSize: {\n sm: 'h-[28rem] w-[20rem]',\n default: 'h-[35rem] w-[25rem]',\n lg: 'h-[39rem] w-[29rem]',\n },\n zOpen: {\n true: 'pointer-events-auto visible translate-y-0 scale-100 opacity-100',\n false: 'pointer-events-none invisible translate-y-3 scale-95 opacity-0',\n },\n },\n defaultVariants: {\n zPosition: 'bottom-right',\n zSize: 'default',\n zOpen: false,\n },\n }\n);\n\nexport const zChatFabVariants = cva(\n 'relative inline-flex size-14 items-center justify-center rounded-full shadow-lg ring-1 ring-black/5 transition-all duration-200 hover:scale-[1.03] active:scale-95',\n {\n variants: {\n zOpen: {\n true: 'bg-background text-foreground border border-border shadow-xl dark:border-white/15 dark:bg-[#2b2b2b] dark:text-white',\n false: 'from-primary via-primary to-primary/75 bg-gradient-to-br text-white shadow-xl',\n },\n },\n defaultVariants: {\n zOpen: false,\n },\n }\n);\n\nexport type ZChatVariants = VariantProps<typeof zChatPanelVariants>;\n","import {\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n input,\n model,\n OnDestroy,\n output,\n signal,\n viewChild,\n viewChildren,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ZIconComponent, type ZIcon } from '@shival99/z-ui/components/z-icon';\nimport { ZModalComponent } from '@shival99/z-ui/components/z-modal';\nimport { zMergeClasses, zTransform, zUuid } from '@shival99/z-ui/utils';\nimport { elementScroll, injectVirtualizer } from '@tanstack/angular-virtual';\nimport type { ClassValue } from 'clsx';\nimport { NgScrollbar } from 'ngx-scrollbar';\nimport { Z_CHAT_DEFAULT_SUGGESTIONS, Z_CHAT_PIN_TO_NEWEST_ATTEMPTS } from './z-chat.define';\nimport type {\n ZChatAttachment,\n ZChatMessage,\n ZChatOffset,\n ZChatPosition,\n ZChatSendEvent,\n ZChatSize,\n ZChatSuggestion,\n} from './z-chat.types';\nimport { zChatFabVariants, zChatPanelVariants, zChatWrapperVariants } from './z-chat.variants';\n\n@Component({\n selector: 'z-chat',\n imports: [FormsModule, TranslatePipe, ZIconComponent, ZModalComponent, NgScrollbar],\n standalone: true,\n templateUrl: './z-chat.component.html',\n styleUrl: './z-chat.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'z-chat block',\n '(document:keydown.escape)': 'onEscapeKey()',\n },\n exportAs: 'zChat',\n})\nexport class ZChatComponent implements OnDestroy {\n public readonly class = input<ClassValue>('');\n public readonly zOpen = model(false);\n public readonly zMessages = model<ZChatMessage[]>([]);\n public readonly zTitle = input('i18n_z_ui_chat_ai_title');\n public readonly zSubtitle = input('i18n_z_ui_chat_ai_subtitle');\n public readonly zPlaceholder = input('i18n_z_ui_chat_ai_placeholder');\n public readonly zPosition = input<ZChatPosition>('bottom-right');\n public readonly zOffset = input<ZChatOffset>({});\n public readonly zSize = input<ZChatSize>('default');\n public readonly zSuggestions = input<ZChatSuggestion[]>(Z_CHAT_DEFAULT_SUGGESTIONS);\n public readonly zShowSuggestions = input(true, { transform: zTransform });\n public readonly zShowPulse = input(true, { transform: zTransform });\n public readonly zDisabled = input(false, { transform: zTransform });\n public readonly zLoading = input(false, { transform: zTransform });\n public readonly zAllowAttachments = input(true, { transform: zTransform });\n public readonly zAcceptedFiles = input('image/*,.pdf,.doc,.docx,.txt,.csv,.xlsx');\n public readonly zAutoReply = input(true, { transform: zTransform });\n public readonly zAutoReplyDelay = input(1200);\n public readonly zFabIcon = input<ZIcon>('lucideMessageSquareDot');\n public readonly zBotIcon = input<ZIcon>('lucideBot');\n public readonly zSendIcon = input<ZIcon>('lucideArrowUp');\n\n public readonly zSend = output<ZChatSendEvent>();\n public readonly zResponse = output<ZChatMessage>();\n public readonly zToggle = output<boolean>();\n public readonly zClear = output<void>();\n\n protected readonly draftMessage = signal('');\n protected readonly showRipple = signal(false);\n protected readonly attachments = signal<ZChatAttachment[]>([]);\n protected readonly isComposerExpanded = signal(false);\n protected readonly isComposerOverflowing = signal(false);\n protected readonly isPreviewVisible = signal(false);\n protected readonly previewImage = signal<{ url: string; name: string; size: number } | null>(null);\n\n private readonly _mockTyping = signal(false);\n private readonly _messagesScrollbarRef = viewChild<NgScrollbar>('messagesScrollbar');\n private readonly _chatInputRef = viewChild<ElementRef<HTMLTextAreaElement>>('chatInput');\n private readonly _fileInputRef = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n private readonly _virtualMessageRefs = viewChildren<ElementRef<HTMLElement>>('virtualMessage');\n\n /** Signal, not a field: requesting a pin must itself wake `_pinToNewest`. */\n private readonly _pinAttemptsLeft = signal(0);\n\n private _mockReplyTimer: ReturnType<typeof setTimeout> | null = null;\n private _rippleTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Declared before the virtualizer so measurement runs before its post-render scroll\n // reconciliation — otherwise anchoring settles against stale sizes.\n private readonly _measureMessages = afterRenderEffect({\n mixedReadWrite: () => {\n for (const ref of this._virtualMessageRefs()) {\n this.messageVirtualizer.measureElement(ref.nativeElement);\n }\n },\n });\n\n protected readonly messageVirtualizer = injectVirtualizer(() => ({\n scrollElement: this._getMessagesViewportElement(),\n count: this.zMessages().length,\n // Seed only: every row is measured, so this just sizes rows not yet rendered.\n estimateSize: () => 74,\n getItemKey: (index: number) => this.zMessages()[index]?.id ?? index,\n // Chat semantics: pin to the bottom, and follow new messages only when already pinned\n // there, so a reader scrolled up into history is never yanked down by an incoming reply.\n anchorTo: 'end' as const,\n followOnAppend: true,\n scrollEndThreshold: 80,\n overscan: 10,\n useApplicationRefTick: false,\n // ng-scrollbar does not emit a scroll event for a programmatic scrollTo, so the virtualizer\n // would keep rendering the old offset while the box sits somewhere else — a viewport stuck on\n // stale rows. Push the offset in by hand, exactly as z-table does over the same scroller.\n scrollToFn: (offset: number, options: { adjustments?: number; behavior?: ScrollBehavior }, instance) => {\n instance.scrollOffset = offset;\n elementScroll(offset, options, instance);\n },\n }));\n\n /**\n * Drives a requested pin to completion across renders.\n *\n * One `scrollToEnd()` is not enough on a cold list: the end is computed from estimates, and it\n * moves as rows are measured. The scroll box also arrives late — ng-scrollbar reports its\n * viewport only after init, and a scroll issued before then leaves the virtualizer at offset 0\n * with no event to resync it. Re-asserting each render until `isAtEnd` holds covers both.\n */\n private readonly _pinToNewest = afterRenderEffect({\n mixedReadWrite: () => {\n // Tracked so this re-runs as rows mount and measurements land.\n this.messageVirtualizer.getVirtualItems();\n const attemptsLeft = this._pinAttemptsLeft();\n const hasRows = this.zMessages().length > 0;\n\n if (attemptsLeft <= 0 || !this.zOpen() || !hasRows || !this._getMessagesViewportElement()) {\n return;\n }\n\n if (this.messageVirtualizer.isAtEnd(1)) {\n this._pinAttemptsLeft.set(0);\n return;\n }\n\n // Decrementing re-triggers this effect, so the pin keeps re-asserting until it lands.\n this._pinAttemptsLeft.set(attemptsLeft - 1);\n this.messageVirtualizer.scrollToEnd();\n },\n });\n\n protected readonly wrapperClasses = computed(() =>\n zMergeClasses(zChatWrapperVariants({ zPosition: this.zPosition() }), this.class())\n );\n\n protected readonly wrapperTop = computed(() => this._resolveOffsetValue('top'));\n protected readonly wrapperRight = computed(() => this._resolveOffsetValue('right'));\n protected readonly wrapperBottom = computed(() => this._resolveOffsetValue('bottom'));\n protected readonly wrapperLeft = computed(() => this._resolveOffsetValue('left'));\n\n protected readonly panelClasses = computed(() =>\n zChatPanelVariants({\n zPosition: this.zPosition(),\n zSize: this.zSize(),\n zOpen: this.zOpen(),\n })\n );\n\n protected readonly fabClasses = computed(() =>\n zChatFabVariants({\n zOpen: this.zOpen(),\n })\n );\n\n protected readonly isTyping = computed(() => this.zLoading() || this._mockTyping());\n protected readonly canSend = computed(\n () => (!!this.draftMessage().trim() || this.attachments().length > 0) && !this.zDisabled() && !this.isTyping()\n );\n\n protected readonly hasMessages = computed(() => this.zMessages().length > 0);\n /** Only the newest bubble plays the push-in animation; recycled rows must not replay it. */\n protected readonly newestMessageId = computed(() => {\n const messages = this.zMessages();\n return messages.length > 0 ? messages[messages.length - 1].id : null;\n });\n\n protected readonly showEmptyState = computed(() => !this.hasMessages() && this.zShowSuggestions());\n protected readonly previewImageSizeLabel = computed(() => {\n const preview = this.previewImage();\n return preview ? this.formatFileSize(preview.size) : '';\n });\n\n public ngOnDestroy(): void {\n if (this._mockReplyTimer) {\n clearTimeout(this._mockReplyTimer);\n }\n if (this._rippleTimer) {\n clearTimeout(this._rippleTimer);\n }\n const filesInMessages = this.zMessages().flatMap(item => item.files ?? []);\n this._releaseAttachmentUrls(filesInMessages);\n this._releaseAttachmentUrls(this.attachments());\n }\n\n public open(): void {\n if (this.zOpen()) {\n return;\n }\n this._toggle(true);\n }\n\n public close(): void {\n if (!this.zOpen()) {\n return;\n }\n this._toggle(false);\n }\n\n public clearMessages(): void {\n const filesInMessages = this.zMessages().flatMap(item => item.files ?? []);\n this._releaseAttachmentUrls(filesInMessages);\n this.zMessages.set([]);\n this.zClear.emit();\n }\n\n protected onToggle(): void {\n this._toggle(!this.zOpen());\n }\n\n protected onSuggestionSelect(item: ZChatSuggestion): void {\n this.draftMessage.set((item.prompt ?? item.label).trim());\n this.onSendMessage();\n }\n\n protected onClickAttach(): void {\n this._fileInputRef()?.nativeElement.click();\n }\n\n protected onFileChange(event: Event): void {\n const inputEl = event.target as HTMLInputElement;\n const { files } = inputEl;\n if (!files || files.length === 0) {\n return;\n }\n\n this._appendFiles(Array.from(files));\n inputEl.value = '';\n }\n\n protected onTextareaPaste(event: ClipboardEvent): void {\n if (!this.zAllowAttachments()) {\n return;\n }\n const items = event.clipboardData?.items;\n if (!items || items.length === 0) {\n return;\n }\n\n const files: File[] = [];\n Array.from(items).forEach(item => {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) {\n files.push(file);\n }\n }\n });\n\n if (files.length > 0) {\n event.preventDefault();\n this._appendFiles(files);\n }\n }\n\n protected removeAttachment(id: string): void {\n const target = this.attachments().find(item => item.id === id);\n if (target?.previewUrl) {\n URL.revokeObjectURL(target.previewUrl);\n }\n this.attachments.update(files => files.filter(item => item.id !== id));\n }\n\n protected formatFileSize(size: number): string {\n if (size < 1024) {\n return `${size} B`;\n }\n if (size < 1024 * 1024) {\n return `${(size / 1024).toFixed(1)} KB`;\n }\n if (size < 1024 * 1024 * 1024) {\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n }\n return `${(size / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n }\n\n protected isImageAttachment(file: ZChatAttachment): boolean {\n return file.type.startsWith('image/');\n }\n\n protected openImagePreview(file: ZChatAttachment): void {\n if (!file.previewUrl || !this.isImageAttachment(file)) {\n return;\n }\n this.previewImage.set({\n url: file.previewUrl,\n name: file.name,\n size: file.size,\n });\n this.isPreviewVisible.set(true);\n }\n\n protected closeImagePreview(): void {\n setTimeout(() => {\n this.isPreviewVisible.set(false);\n this.previewImage.set(null);\n }, 300);\n }\n\n protected onInputKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.onSendMessage();\n }\n }\n\n protected onTextareaInput(event: Event): void {\n const textarea = event.target as HTMLTextAreaElement;\n textarea.style.height = 'auto';\n const nextHeight = Math.min(textarea.scrollHeight, 66);\n textarea.style.height = `${nextHeight}px`;\n textarea.style.overflowY = textarea.scrollHeight > 66 ? 'auto' : 'hidden';\n this.isComposerExpanded.set(nextHeight > 44 || textarea.value.includes('\\n'));\n this.isComposerOverflowing.set(textarea.scrollHeight > nextHeight + 1);\n }\n\n protected onSendMessage(): void {\n const message = this.draftMessage().trim();\n if (!message && this.attachments().length === 0) {\n return;\n }\n if (!this.canSend()) {\n return;\n }\n\n const attachedFiles = this.attachments().map(file => ({\n ...file,\n // Keep message preview URLs alive after composer files are cleared.\n previewUrl: this._createMessagePreviewUrl(file),\n file: undefined,\n }));\n const messageContent = message || `Attached ${attachedFiles.length} file(s).`;\n const userMessage = this._createMessage('user', messageContent, attachedFiles);\n const nextMessages = [...this.zMessages(), userMessage];\n this.zMessages.set(nextMessages);\n this._ensureBottomVisible();\n this.draftMessage.set('');\n this._releaseAttachmentUrls(this.attachments());\n this.attachments.set([]);\n const inputEl = this._chatInputRef()?.nativeElement;\n if (inputEl) {\n inputEl.style.height = '66px';\n inputEl.style.overflowY = 'hidden';\n }\n this.isComposerExpanded.set(false);\n this.isComposerOverflowing.set(false);\n this.zSend.emit({ message: messageContent, files: attachedFiles, messages: nextMessages });\n\n if (this.zAutoReply()) {\n this._simulateReply(messageContent, attachedFiles.length);\n }\n\n this._focusInputSoon();\n }\n\n private _toggle(isOpen: boolean): void {\n this.zOpen.set(isOpen);\n this.zToggle.emit(isOpen);\n this._triggerRipple();\n\n if (isOpen) {\n this._focusInputSoon();\n this._ensureBottomVisible();\n }\n }\n\n private _createMessage(role: ZChatMessage['role'], content: string, files?: ZChatAttachment[]): ZChatMessage {\n return {\n id: zUuid(),\n role,\n content,\n files,\n createdAt: Date.now(),\n };\n }\n\n private _simulateReply(userMessage: string, fileCount: number): void {\n if (this._mockReplyTimer) {\n clearTimeout(this._mockReplyTimer);\n }\n this._mockTyping.set(true);\n const delay = Math.max(200, this.zAutoReplyDelay());\n\n this._mockReplyTimer = setTimeout(() => {\n this._mockTyping.set(false);\n const botMessage = this._createMessage('assistant', this._buildMockReply(userMessage, fileCount));\n this.zMessages.update(messages => [...messages, botMessage]);\n this.zResponse.emit(botMessage);\n this._ensureBottomVisible();\n }, delay);\n }\n\n private _buildMockReply(message: string, fileCount: number): string {\n const normalized = message.toLowerCase();\n\n if (fileCount > 0) {\n return `Received ${fileCount} attachment(s). I can summarize, extract key points, or draft a reply from these files.`;\n }\n if (normalized.includes('deploy') || normalized.includes('release')) {\n return 'Deployment checklist: run lint, build artifact, smoke test staging, then promote to production.';\n }\n if (normalized.includes('bug') || normalized.includes('error')) {\n return 'Please share logs, repro steps, expected behavior, and current environment so I can triage precisely.';\n }\n if (normalized.includes('test')) {\n return 'I suggest coverage for happy path, validation failures, edge cases, and retry/error handling.';\n }\n return 'Got it. I can help you break this task into actionable steps and propose code changes.';\n }\n\n private _triggerRipple(): void {\n this.showRipple.set(true);\n if (this._rippleTimer) {\n clearTimeout(this._rippleTimer);\n }\n this._rippleTimer = setTimeout(() => this.showRipple.set(false), 350);\n }\n\n protected onMessagesScrollbarInit(): void {\n this._ensureBottomVisible();\n }\n\n protected onEscapeKey(): void {\n if (this.previewImage()) {\n this.closeImagePreview();\n }\n }\n\n /**\n * Requests a pin to the newest message; `_pinToNewest` performs it once rendering can honour it.\n *\n * Never scroll synchronously from here. Callers fire right after mutating `zMessages` or\n * `zOpen`, before change detection has fed the new length into the virtualizer, so the scroll\n * would target the previous last index and strand the list mid-history.\n */\n private _ensureBottomVisible(): void {\n this._pinAttemptsLeft.set(Z_CHAT_PIN_TO_NEWEST_ATTEMPTS);\n }\n\n /** ng-scrollbar owns the real scrolling box; the virtualizer must observe that, not the host. */\n private _getMessagesViewportElement(): HTMLElement | undefined {\n const scrollbar = this._messagesScrollbarRef();\n return scrollbar?.adapter.initialized() ? scrollbar.adapter.viewportElement : undefined;\n }\n\n private _focusInputSoon(): void {\n setTimeout(() => this._chatInputRef()?.nativeElement.focus(), 50);\n }\n\n private _releaseAttachmentUrls(files: ZChatAttachment[]): void {\n files.forEach(file => {\n if (file.previewUrl) {\n URL.revokeObjectURL(file.previewUrl);\n }\n });\n }\n\n private _appendFiles(files: File[]): void {\n const nextFiles: ZChatAttachment[] = files.map(file => ({\n id: zUuid(),\n name: file.name,\n size: file.size,\n type: file.type,\n previewUrl: file.type.startsWith('image/') ? URL.createObjectURL(file) : undefined,\n file,\n }));\n\n this.attachments.update(current => [...current, ...nextFiles]);\n }\n\n private _createMessagePreviewUrl(file: ZChatAttachment): string | undefined {\n if (!this.isImageAttachment(file)) {\n return undefined;\n }\n if (file.file) {\n return URL.createObjectURL(file.file);\n }\n return file.previewUrl;\n }\n\n private _resolveOffsetValue(side: keyof ZChatOffset): string | null {\n const override = this.zOffset()[side];\n if (override !== undefined && override !== null && override !== '') {\n return typeof override === 'number' ? `${override}px` : String(override);\n }\n\n const defaults =\n this.zPosition() === 'bottom-left'\n ? { top: null, right: null, bottom: '1.25rem', left: '1.5rem' }\n : { top: null, right: '1.5rem', bottom: '1.25rem', left: null };\n\n return defaults[side];\n }\n}\n","<div\n [class]=\"wrapperClasses()\"\n [style.top]=\"wrapperTop()\"\n [style.right]=\"wrapperRight()\"\n [style.bottom]=\"wrapperBottom()\"\n [style.left]=\"wrapperLeft()\">\n <div class=\"relative\">\n <section class=\"z-chat-panel-shell\" [class]=\"panelClasses()\">\n <header class=\"from-primary/95 to-primary/75 text-primary-foreground bg-gradient-to-r px-4 py-3.5\">\n <div class=\"flex items-start justify-between gap-3\">\n <div class=\"min-w-0\">\n <div class=\"flex items-center gap-2\">\n <span\n class=\"bg-primary-foreground/15 relative inline-flex size-8 shrink-0 items-center justify-center rounded-full\">\n <z-icon [zType]=\"zBotIcon()\" zSize=\"16\" class=\"text-primary-foreground\" />\n <span\n class=\"ring-primary inline-block size-2.5 rounded-full bg-emerald-300 ring-2\"\n style=\"position: absolute; right: -0.0625rem; bottom: -0.0625rem\"></span>\n </span>\n <h3 class=\"truncate text-sm font-semibold\">{{ zTitle() | translate }}</h3>\n </div>\n </div>\n <div class=\"flex items-center gap-1\">\n <button\n type=\"button\"\n class=\"text-primary-foreground/90 hover:bg-primary-foreground/15 inline-flex size-8 cursor-pointer items-center justify-center rounded-md transition\"\n (click)=\"clearMessages()\"\n title=\"{{ 'i18n_z_ui_chat_ai_new_chat' | translate }}\">\n <z-icon zType=\"lucideRefreshCcw\" zSize=\"17\" />\n </button>\n <button\n type=\"button\"\n class=\"text-primary-foreground/90 hover:bg-primary-foreground/15 inline-flex size-8 cursor-pointer items-center justify-center rounded-md transition\"\n (click)=\"close()\"\n title=\"{{ 'i18n_z_ui_chat_ai_close' | translate }}\">\n <z-icon zType=\"lucideChevronDown\" zSize=\"18\" />\n </button>\n </div>\n </div>\n </header>\n\n <div class=\"z-chat-lower-shell\">\n <ng-scrollbar\n #messagesScrollbar\n (afterInit)=\"onMessagesScrollbarInit()\"\n class=\"z-chat-scrollbar z-chat-content-surface flex-1 overflow-x-hidden\"\n track=\"vertical\"\n orientation=\"vertical\"\n appearance=\"compact\"\n visibility=\"hover\">\n <div class=\"z-chat-messages\">\n @if (hasMessages()) {\n <div class=\"z-chat-messages-sizer\" [style.height.px]=\"messageVirtualizer.getTotalSize()\">\n @for (row of messageVirtualizer.getVirtualItems(); track row.key) {\n @let item = zMessages()[row.index];\n <div\n #virtualMessage\n class=\"z-chat-virtual-row\"\n [attr.data-index]=\"row.index\"\n [style.transform]=\"'translateY(' + row.start + 'px)'\">\n <div\n class=\"z-chat-message\"\n [class.z-chat-message--enter]=\"item.id === newestMessageId()\"\n [class.justify-end]=\"item.role === 'user'\"\n [class.justify-start]=\"item.role === 'assistant'\">\n <div\n class=\"z-chat-message-bubble max-w-[88%] min-w-0 rounded-2xl px-3 py-2.5 text-sm leading-5 [overflow-wrap:anywhere] break-all shadow-xs\"\n [class.bg-primary]=\"item.role === 'user'\"\n [class.text-primary-foreground]=\"item.role === 'user'\"\n [class.rounded-br-md]=\"item.role === 'user'\"\n [class.bg-background]=\"item.role === 'assistant'\"\n [class.border-border/60]=\"item.role === 'assistant'\"\n [class.text-foreground]=\"item.role === 'assistant'\"\n [class.rounded-bl-md]=\"item.role === 'assistant'\"\n [class.border]=\"item.role === 'assistant'\">\n @if (item.files && item.files.length > 0) {\n <div class=\"mb-2 flex flex-col gap-1.5\">\n @for (file of item.files; track file.id) {\n <div\n class=\"flex items-center gap-2 rounded-[0.5rem] px-2 py-1.5 text-xs\"\n [class.bg-white/15]=\"item.role === 'user'\"\n [class.bg-muted/40]=\"item.role === 'assistant'\">\n @if (isImageAttachment(file) && file.previewUrl) {\n <img\n [src]=\"file.previewUrl\"\n [alt]=\"file.name\"\n class=\"size-8 cursor-pointer rounded-[0.5rem] object-cover\"\n (click)=\"openImagePreview(file)\"\n title=\"Click to preview\" />\n } @else {\n <span\n class=\"bg-background/80 text-muted-foreground inline-flex size-8 items-center justify-center rounded-[0.5rem]\"\n [class.bg-white/20]=\"item.role === 'user'\"\n [class.text-white]=\"item.role === 'user'\">\n <z-icon zType=\"lucideFileText\" zSize=\"14\" />\n </span>\n }\n <div class=\"min-w-0 flex-1\">\n <p class=\"truncate text-[0.6875rem] font-medium\">{{ file.name }}</p>\n <p class=\"truncate text-[0.625rem] opacity-80\">{{ formatFileSize(file.size) }}</p>\n </div>\n </div>\n }\n </div>\n }\n {{ item.content }}\n </div>\n </div>\n </div>\n }\n </div>\n } @else if (showEmptyState()) {\n <div class=\"flex h-full min-h-60 flex-col items-center justify-center px-2 text-center\">\n <div\n class=\"from-primary/20 to-primary/5 mb-3 inline-flex size-14 items-center justify-center rounded-full bg-gradient-to-br\">\n <z-icon zType=\"lucideBot\" zSize=\"28\" class=\"text-primary\" />\n </div>\n <h4 class=\"text-foreground text-sm font-semibold\">{{ 'i18n_z_ui_chat_ai_empty_title' | translate }}</h4>\n <p class=\"text-muted-foreground mt-1 text-xs\">{{ 'i18n_z_ui_chat_ai_empty_desc' | translate }}</p>\n\n @if (zSuggestions().length > 0) {\n <div class=\"mt-4 flex w-full flex-col gap-2\">\n @for (item of zSuggestions(); track item.label) {\n <button\n type=\"button\"\n class=\"z-chat-suggestion-item bg-background/95 hover:bg-background border-border/60 text-foreground flex w-full cursor-pointer items-center gap-2 rounded-xl border px-3 py-2 text-left text-xs transition hover:shadow-sm\"\n [style.animation-delay.ms]=\"$index * 70\"\n (click)=\"onSuggestionSelect(item)\">\n @if (item.icon) {\n <z-icon [zType]=\"item.icon!\" zSize=\"14\" class=\"text-primary shrink-0\" />\n }\n <span class=\"line-clamp-2\">{{ item.label | translate }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (isTyping()) {\n <div class=\"z-chat-message z-chat-message--enter justify-start\">\n <div class=\"bg-background border-border/60 rounded-2xl rounded-bl-md border px-3 py-2\">\n <div class=\"flex items-center gap-1\">\n <span class=\"bg-muted-foreground/60 inline-block size-1.5 animate-bounce rounded-full\"></span>\n <span\n class=\"bg-muted-foreground/60 inline-block size-1.5 animate-bounce rounded-full\"\n style=\"animation-delay: 0.15s\"></span>\n <span\n class=\"bg-muted-foreground/60 inline-block size-1.5 animate-bounce rounded-full\"\n style=\"animation-delay: 0.3s\"></span>\n </div>\n </div>\n </div>\n }\n </div>\n </ng-scrollbar>\n\n <footer class=\"z-chat-footer-surface p-3\">\n @if (attachments().length > 0) {\n <div class=\"mb-2 flex max-h-32 flex-col gap-2 overflow-y-auto pr-1\">\n @for (file of attachments(); track file.id) {\n <div\n class=\"bg-muted/45 border-border/55 relative flex w-full items-center gap-2 rounded-[0.5rem] border px-2 py-1.5\">\n @if (isImageAttachment(file) && file.previewUrl) {\n <img\n [src]=\"file.previewUrl\"\n [alt]=\"file.name\"\n class=\"size-8 shrink-0 cursor-pointer rounded-[0.5rem] object-cover\"\n (click)=\"openImagePreview(file)\"\n title=\"Click to preview\" />\n } @else {\n <span\n class=\"bg-background text-muted-foreground inline-flex size-8 shrink-0 items-center justify-center rounded-[0.5rem]\">\n <z-icon zType=\"lucideFileText\" zSize=\"14\" />\n </span>\n }\n <div class=\"min-w-0 flex-1\">\n <p class=\"truncate text-[0.6875rem] font-medium\">{{ file.name }}</p>\n <p class=\"text-muted-foreground truncate text-[0.625rem]\">{{ formatFileSize(file.size) }}</p>\n </div>\n <button\n type=\"button\"\n class=\"bg-background/80 hover:bg-background text-muted-foreground inline-flex size-5 cursor-pointer items-center justify-center rounded-full transition\"\n (click)=\"removeAttachment(file.id)\">\n <z-icon zType=\"lucideX\" zSize=\"12\" />\n </button>\n </div>\n }\n </div>\n }\n\n <div class=\"z-chat-composer-shell\">\n <div class=\"z-chat-composer-main\" [class.z-chat-composer__field--overflow]=\"isComposerOverflowing()\">\n <textarea\n #chatInput\n class=\"z-chat-composer-textarea\"\n [placeholder]=\"zPlaceholder() | translate\"\n [disabled]=\"zDisabled()\"\n [ngModel]=\"draftMessage()\"\n (ngModelChange)=\"draftMessage.set($event)\"\n (input)=\"onTextareaInput($event)\"\n (paste)=\"onTextareaPaste($event)\"\n (keydown)=\"onInputKeydown($event)\"\n rows=\"3\"></textarea>\n </div>\n\n <div class=\"z-chat-composer-toolbar\">\n <div class=\"z-chat-composer-toolbar-left\">\n @if (zAllowAttachments()) {\n <input\n #fileInput\n type=\"file\"\n class=\"hidden\"\n [attr.accept]=\"zAcceptedFiles()\"\n multiple\n (change)=\"onFileChange($event)\" />\n <button\n type=\"button\"\n class=\"z-chat-composer-tool-btn\"\n [disabled]=\"zDisabled()\"\n (click)=\"onClickAttach()\"\n title=\"{{ 'i18n_z_ui_chat_ai_attach' | translate }}\">\n <z-icon zType=\"lucidePlus\" zSize=\"18\" />\n </button>\n }\n </div>\n\n <div class=\"z-chat-composer-toolbar-right\">\n <button\n type=\"button\"\n class=\"z-chat-composer-send-btn\"\n [disabled]=\"!canSend()\"\n (click)=\"onSendMessage()\"\n title=\"{{ 'i18n_z_ui_chat_ai_send' | translate }}\">\n <z-icon\n [zType]=\"isTyping() ? 'lucideLoaderCircle' : zSendIcon()\"\n zSize=\"16\"\n [class]=\"isTyping() ? 'animate-spin' : ''\" />\n </button>\n </div>\n </div>\n </div>\n </footer>\n </div>\n\n <z-modal\n [zVisible]=\"isPreviewVisible()\"\n [zTitle]=\"previewImage()?.name\"\n [zDescription]=\"previewImageSizeLabel()\"\n zWidth=\"min(92vw, 720px)\"\n [zHideFooter]=\"true\"\n [zMaskClosable]=\"true\"\n zOverlay=\"blur\"\n (zCancel)=\"closeImagePreview()\">\n <div class=\"z-chat-preview-modal-body\">\n <img [src]=\"previewImage()?.url\" [alt]=\"previewImage()?.name\" class=\"z-chat-preview-image\" />\n </div>\n </z-modal>\n </section>\n\n <button\n type=\"button\"\n class=\"pointer-events-auto cursor-pointer\"\n [class]=\"fabClasses()\"\n (click)=\"onToggle()\"\n [attr.aria-expanded]=\"zOpen()\"\n [attr.aria-label]=\"'i18n_z_ui_chat_ai_toggle' | translate\"\n title=\"{{ 'i18n_z_ui_chat_ai_toggle' | translate }}\">\n @if (zShowPulse() && !zOpen()) {\n <span class=\"bg-primary/30 absolute inset-0 animate-ping rounded-full\"></span>\n }\n\n @if (showRipple()) {\n <span class=\"bg-primary-foreground/30 absolute inset-0 animate-ping rounded-full\"></span>\n }\n\n <z-icon\n [zType]=\"zOpen() ? 'lucideX' : zFabIcon()\"\n zSize=\"24\"\n class=\"relative z-1 transition-transform duration-200\"\n [class.rotate-180]=\"zOpen()\" />\n </button>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;AAEA;AACO,MAAM,6BAA6B,GAAG,EAAE;AAE/C;AACO,MAAM,0BAA0B,GAAsB;AAC3D,IAAA;AACE,QAAA,KAAK,EAAE,gCAAgC;AACvC,QAAA,MAAM,EAAE,0CAA0C;AAClD,QAAA,IAAI,EAAE,gBAAgB;AACvB,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,gCAAgC;AACvC,QAAA,MAAM,EAAE,sCAAsC;AAC9C,QAAA,IAAI,EAAE,oBAAoB;AAC3B,KAAA;IACD,EAAE,KAAK,EAAE,gCAAgC,EAAE,MAAM,EAAE,+BAA+B,EAAE,IAAI,EAAE,sBAAsB,EAAE;CACnH;;AChBM,MAAM,oBAAoB,GAAG,GAAG,CAAC,yCAAyC,EAAE;AACjF,IAAA,QAAQ,EAAE;AACR,QAAA,SAAS,EAAE;AACT,YAAA,cAAc,EAAE,EAAE;AAClB,YAAA,aAAa,EAAE,EAAE;AAClB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,SAAS,EAAE,cAAc;AAC1B,KAAA;AACF,CAAA;AAEM,MAAM,kBAAkB,GAAG,GAAG,CACnC,qGAAqG,EACrG;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,SAAS,EAAE;AACT,YAAA,cAAc,EAAE,6BAA6B;AAC7C,YAAA,aAAa,EAAE,2BAA2B;AAC3C,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,qBAAqB;AACzB,YAAA,OAAO,EAAE,qBAAqB;AAC9B,YAAA,EAAE,EAAE,qBAAqB;AAC1B,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,iEAAiE;AACvE,YAAA,KAAK,EAAE,gEAAgE;AACxE,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,SAAS,EAAE,cAAc;AACzB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,KAAK;AACb,KAAA;AACF,CAAA;AAGI,MAAM,gBAAgB,GAAG,GAAG,CACjC,oKAAoK,EACpK;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,qHAAqH;AAC3H,YAAA,KAAK,EAAE,+EAA+E;AACvF,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,KAAK,EAAE,KAAK;AACb,KAAA;AACF,CAAA;;MCHU,cAAc,CAAA;IACT,KAAK,GAAG,KAAK,CAAa,EAAE;8EAAC;IAC7B,KAAK,GAAG,KAAK,CAAC,KAAK;8EAAC;IACpB,SAAS,GAAG,KAAK,CAAiB,EAAE;kFAAC;IACrC,MAAM,GAAG,KAAK,CAAC,yBAAyB;+EAAC;IACzC,SAAS,GAAG,KAAK,CAAC,4BAA4B;kFAAC;IAC/C,YAAY,GAAG,KAAK,CAAC,+BAA+B;qFAAC;IACrD,SAAS,GAAG,KAAK,CAAgB,cAAc;kFAAC;IAChD,OAAO,GAAG,KAAK,CAAc,EAAE;gFAAC;IAChC,KAAK,GAAG,KAAK,CAAY,SAAS;8EAAC;IACnC,YAAY,GAAG,KAAK,CAAoB,0BAA0B;qFAAC;IACnE,gBAAgB,GAAG,KAAK,CAAC,IAAI,wFAAI,SAAS,EAAE,UAAU,EAAA,CAAG;IACzD,UAAU,GAAG,KAAK,CAAC,IAAI,kFAAI,SAAS,EAAE,UAAU,EAAA,CAAG;IACnD,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,UAAU,EAAA,CAAG;IACnD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,UAAU,EAAA,CAAG;IAClD,iBAAiB,GAAG,KAAK,CAAC,IAAI,yFAAI,SAAS,EAAE,UAAU,EAAA,CAAG;IAC1D,cAAc,GAAG,KAAK,CAAC,yCAAyC;uFAAC;IACjE,UAAU,GAAG,KAAK,CAAC,IAAI,kFAAI,SAAS,EAAE,UAAU,EAAA,CAAG;IACnD,eAAe,GAAG,KAAK,CAAC,IAAI;wFAAC;IAC7B,QAAQ,GAAG,KAAK,CAAQ,wBAAwB;iFAAC;IACjD,QAAQ,GAAG,KAAK,CAAQ,WAAW;iFAAC;IACpC,SAAS,GAAG,KAAK,CAAQ,eAAe;kFAAC;IAEzC,KAAK,GAAG,MAAM,EAAkB;IAChC,SAAS,GAAG,MAAM,EAAgB;IAClC,OAAO,GAAG,MAAM,EAAW;IAC3B,MAAM,GAAG,MAAM,EAAQ;IAEpB,YAAY,GAAG,MAAM,CAAC,EAAE;qFAAC;IACzB,UAAU,GAAG,MAAM,CAAC,KAAK;mFAAC;IAC1B,WAAW,GAAG,MAAM,CAAoB,EAAE;oFAAC;IAC3C,kBAAkB,GAAG,MAAM,CAAC,KAAK;2FAAC;IAClC,qBAAqB,GAAG,MAAM,CAAC,KAAK;8FAAC;IACrC,gBAAgB,GAAG,MAAM,CAAC,KAAK;yFAAC;IAChC,YAAY,GAAG,MAAM,CAAqD,IAAI;qFAAC;IAEjF,WAAW,GAAG,MAAM,CAAC,KAAK;oFAAC;IAC3B,qBAAqB,GAAG,SAAS,CAAc,mBAAmB;8FAAC;IACnE,aAAa,GAAG,SAAS,CAAkC,WAAW;sFAAC;IACvE,aAAa,GAAG,SAAS,CAA+B,WAAW;sFAAC;IACpE,mBAAmB,GAAG,YAAY,CAA0B,gBAAgB;4FAAC;;IAG7E,gBAAgB,GAAG,MAAM,CAAC,CAAC;yFAAC;IAErC,eAAe,GAAyC,IAAI;IAC5D,YAAY,GAAyC,IAAI;;;IAIhD,gBAAgB,GAAG,iBAAiB,CAAC;QACpD,cAAc,EAAE,MAAK;YACnB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE;gBAC5C,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC;YAC3D;QACF,CAAC;AACF,KAAA,CAAC;AAEiB,IAAA,kBAAkB,GAAG,iBAAiB,CAAC,OAAO;AAC/D,QAAA,aAAa,EAAE,IAAI,CAAC,2BAA2B,EAAE;AACjD,QAAA,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM;;AAE9B,QAAA,YAAY,EAAE,MAAM,EAAE;AACtB,QAAA,UAAU,EAAE,CAAC,KAAa,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,KAAK;;;AAGnE,QAAA,QAAQ,EAAE,KAAc;AACxB,QAAA,cAAc,EAAE,IAAI;AACpB,QAAA,kBAAkB,EAAE,EAAE;AACtB,QAAA,QAAQ,EAAE,EAAE;AACZ,QAAA,qBAAqB,EAAE,KAAK;;;;QAI5B,UAAU,EAAE,CAAC,MAAc,EAAE,OAA4D,EAAE,QAAQ,KAAI;AACrG,YAAA,QAAQ,CAAC,YAAY,GAAG,MAAM;AAC9B,YAAA,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;QAC1C,CAAC;AACF,KAAA,CAAC,CAAC;AAEH;;;;;;;AAOG;IACc,YAAY,GAAG,iBAAiB,CAAC;QAChD,cAAc,EAAE,MAAK;;AAEnB,YAAA,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE;AACzC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC;AAE3C,YAAA,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE;gBACzF;YACF;YAEA,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACtC,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5B;YACF;;YAGA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC;AAC3C,YAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE;QACvC,CAAC;AACF,KAAA,CAAC;IAEiB,cAAc,GAAG,QAAQ,CAAC,MAC3C,aAAa,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;uFACnF;IAEkB,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;mFAAC;IAC5D,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;qFAAC;IAChE,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;sFAAC;IAClE,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;oFAAC;AAE9D,IAAA,YAAY,GAAG,QAAQ,CAAC,MACzC,kBAAkB,CAAC;AACjB,QAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;AAC3B,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;KACpB,CAAC;qFACH;AAEkB,IAAA,UAAU,GAAG,QAAQ,CAAC,MACvC,gBAAgB,CAAC;AACf,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;KACpB,CAAC;mFACH;AAEkB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE;iFAAC;AAChE,IAAA,OAAO,GAAG,QAAQ,CACnC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gFAC/G;AAEkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC;oFAAC;;AAEzD,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACjD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE;QACjC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IACtE,CAAC;wFAAC;AAEiB,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE;uFAAC;AAC/E,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;AACvD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AACnC,QAAA,OAAO,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;IACzD,CAAC;8FAAC;IAEK,WAAW,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;QACpC;AACA,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QACjC;AACA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AAC1E,QAAA,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACjD;IAEO,IAAI,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;YAChB;QACF;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IACpB;IAEO,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE;YACjB;QACF;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IACrB;IAEO,aAAa,GAAA;AAClB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AAC1E,QAAA,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC;AAC5C,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEU,QAAQ,GAAA;QAChB,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B;AAEU,IAAA,kBAAkB,CAAC,IAAqB,EAAA;AAChD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,aAAa,EAAE;IACtB;IAEU,aAAa,GAAA;QACrB,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IAC7C;AAEU,IAAA,YAAY,CAAC,KAAY,EAAA;AACjC,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAA0B;AAChD,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO;QACzB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAChC;QACF;QAEA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpC,QAAA,OAAO,CAAC,KAAK,GAAG,EAAE;IACpB;AAEU,IAAA,eAAe,CAAC,KAAqB,EAAA;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC7B;QACF;AACA,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK;QACxC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAChC;QACF;QAEA,MAAM,KAAK,GAAW,EAAE;QACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,IAAG;AAC/B,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;AACxB,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;gBAC7B,IAAI,IAAI,EAAE;AACR,oBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;gBAClB;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAC1B;IACF;AAEU,IAAA,gBAAgB,CAAC,EAAU,EAAA;AACnC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;AAC9D,QAAA,IAAI,MAAM,EAAE,UAAU,EAAE;AACtB,YAAA,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC;QACxC;QACA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACxE;AAEU,IAAA,cAAc,CAAC,IAAY,EAAA;AACnC,QAAA,IAAI,IAAI,GAAG,IAAI,EAAE;YACf,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAI;QACpB;AACA,QAAA,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE;AACtB,YAAA,OAAO,CAAA,EAAG,CAAC,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA,GAAA,CAAK;QACzC;QACA,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE;AAC7B,YAAA,OAAO,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK;QAClD;AACA,QAAA,OAAO,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK;IACzD;AAEU,IAAA,iBAAiB,CAAC,IAAqB,EAAA;QAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;IACvC;AAEU,IAAA,gBAAgB,CAAC,IAAqB,EAAA;AAC9C,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE;YACrD;QACF;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;YACpB,GAAG,EAAE,IAAI,CAAC,UAAU;YACpB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;AAChB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;IAEU,iBAAiB,GAAA;QACzB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAC7B,CAAC,EAAE,GAAG,CAAC;IACT;AAEU,IAAA,cAAc,CAAC,KAAoB,EAAA;QAC3C,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC5C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;AAEU,IAAA,eAAe,CAAC,KAAY,EAAA;AACpC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAA6B;AACpD,QAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAC9B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC;QACtD,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,UAAU,IAAI;AACzC,QAAA,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,YAAY,GAAG,EAAE,GAAG,MAAM,GAAG,QAAQ;AACzE,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC7E,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,GAAG,UAAU,GAAG,CAAC,CAAC;IACxE;IAEU,aAAa,GAAA;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE;AAC1C,QAAA,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/C;QACF;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YACnB;QACF;AAEA,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK;AACpD,YAAA,GAAG,IAAI;;AAEP,YAAA,UAAU,EAAE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC;AAC/C,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,OAAO,IAAI,YAAY,aAAa,CAAC,MAAM,CAAA,SAAA,CAAW;AAC7E,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC;QAC9E,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,WAAW,CAAC;AACvD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;QAChC,IAAI,CAAC,oBAAoB,EAAE;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC/C,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa;QACnD,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAC7B,YAAA,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ;QACpC;AACA,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;AACrC,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AAE1F,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,aAAa,CAAC,MAAM,CAAC;QAC3D;QAEA,IAAI,CAAC,eAAe,EAAE;IACxB;AAEQ,IAAA,OAAO,CAAC,MAAe,EAAA;AAC7B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,cAAc,EAAE;QAErB,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,eAAe,EAAE;YACtB,IAAI,CAAC,oBAAoB,EAAE;QAC7B;IACF;AAEQ,IAAA,cAAc,CAAC,IAA0B,EAAE,OAAe,EAAE,KAAyB,EAAA;QAC3F,OAAO;YACL,EAAE,EAAE,KAAK,EAAE;YACX,IAAI;YACJ,OAAO;YACP,KAAK;AACL,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB;IACH;IAEQ,cAAc,CAAC,WAAmB,EAAE,SAAiB,EAAA;AAC3D,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;QACpC;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;AAEnD,QAAA,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,MAAK;AACrC,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AACjG,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,GAAG,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC5D,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;YAC/B,IAAI,CAAC,oBAAoB,EAAE;QAC7B,CAAC,EAAE,KAAK,CAAC;IACX;IAEQ,eAAe,CAAC,OAAe,EAAE,SAAiB,EAAA;AACxD,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE;AAExC,QAAA,IAAI,SAAS,GAAG,CAAC,EAAE;YACjB,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,uFAAA,CAAyF;QACvH;AACA,QAAA,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AACnE,YAAA,OAAO,iGAAiG;QAC1G;AACA,QAAA,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC9D,YAAA,OAAO,uGAAuG;QAChH;AACA,QAAA,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC/B,YAAA,OAAO,+FAA+F;QACxG;AACA,QAAA,OAAO,wFAAwF;IACjG;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QACjC;AACA,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;IACvE;IAEU,uBAAuB,GAAA;QAC/B,IAAI,CAAC,oBAAoB,EAAE;IAC7B;IAEU,WAAW,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACvB,IAAI,CAAC,iBAAiB,EAAE;QAC1B;IACF;AAEA;;;;;;AAMG;IACK,oBAAoB,GAAA;AAC1B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,6BAA6B,CAAC;IAC1D;;IAGQ,2BAA2B,GAAA;AACjC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE;AAC9C,QAAA,OAAO,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,GAAG,SAAS;IACzF;IAEQ,eAAe,GAAA;AACrB,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;IACnE;AAEQ,IAAA,sBAAsB,CAAC,KAAwB,EAAA;AACrD,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;AACnB,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;YACtC;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,YAAY,CAAC,KAAa,EAAA;QAChC,MAAM,SAAS,GAAsB,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK;YACtD,EAAE,EAAE,KAAK,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,SAAS;YAClF,IAAI;AACL,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC;IAChE;AAEQ,IAAA,wBAAwB,CAAC,IAAqB,EAAA;QACpD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,OAAO,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QACvC;QACA,OAAO,IAAI,CAAC,UAAU;IACxB;AAEQ,IAAA,mBAAmB,CAAC,IAAuB,EAAA;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;AACrC,QAAA,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,EAAE,EAAE;AAClE,YAAA,OAAO,OAAO,QAAQ,KAAK,QAAQ,GAAG,CAAA,EAAG,QAAQ,CAAA,EAAA,CAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC1E;AAEA,QAAA,MAAM,QAAQ,GACZ,IAAI,CAAC,SAAS,EAAE,KAAK;AACnB,cAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ;AAC7D,cAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;AAEnE,QAAA,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB;uGAtdW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,yBAAA,EAAA,eAAA,EAAA,EAAA,cAAA,EAAA,cAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjD3B,0ncA4RA,EAAA,MAAA,EAAA,CAAA,2+JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvPY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,wSAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAiB,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,cAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,aAAA,EAAA,aAAA,EAAA,SAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,KAAA,EAAA,SAAA,EAAA,aAAA,EAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,qDAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAA3D,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAYzB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAd1B,SAAS;+BACE,QAAQ,EAAA,OAAA,EACT,CAAC,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,CAAC,EAAA,UAAA,EACvE,IAAI,mBAGC,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,KAAK,EAAE,cAAc;AACrB,wBAAA,2BAA2B,EAAE,eAAe;AAC7C,qBAAA,EAAA,QAAA,EACS,OAAO,EAAA,QAAA,EAAA,0ncAAA,EAAA,MAAA,EAAA,CAAA,2+JAAA,CAAA,EAAA;AAuC+C,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,mBAAmB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACP,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACd,WAAW,gFACP,gBAAgB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEzF/F;;AAEG;;;;"}