{
  "version": 3,
  "sources": ["../node_modules/inline-style-parser/index.js", "../node_modules/style-to-object/src/index.ts", "../node_modules/extend/index.js", "../src/index.ts", "../src/components/AIStateIndicator/AIStateIndicator.tsx", "../src/components/AIStateIndicator/hooks/useAIState.ts", "../src/context/ChannelActionContext.tsx", "../src/context/ChannelListContext.tsx", "../src/context/ChannelStateContext.tsx", "../src/context/ChatContext.tsx", "../src/context/utils/getDisplayName.ts", "../src/context/ComponentContext.tsx", "../src/context/DialogManagerContext.tsx", "../src/components/Dialog/DialogManager.ts", "../src/components/Dialog/DialogPortal.tsx", "../src/components/Dialog/hooks/useDialog.ts", "../src/store/hooks/useStateStore.ts", "../src/components/Portal/Portal.ts", "../src/context/MessageContext.tsx", "../src/context/MessageBounceContext.tsx", "../src/context/MessageInputContext.tsx", "../src/context/MessageListContext.tsx", "../src/context/PollContext.tsx", "../src/context/TranslationContext.tsx", "../src/i18n/utils.ts", "../src/context/TypingContext.tsx", "../src/context/WithComponents.tsx", "../src/components/Attachment/Attachment.tsx", "../src/components/Attachment/AttachmentContainer.tsx", "../src/components/Attachment/AttachmentActions.tsx", "../src/components/Attachment/Audio.tsx", "../src/components/Attachment/components/DownloadButton.tsx", "../src/components/Attachment/icons.tsx", "../src/components/SafeAnchor/SafeAnchor.tsx", "../src/components/Attachment/components/FileSizeIndicator.tsx", "../src/components/MessageInput/hooks/utils.ts", "../src/components/Attachment/components/ProgressBar.tsx", "../src/components/Attachment/components/PlaybackRateButton.tsx", "../src/components/Attachment/components/PlayButton.tsx", "../src/components/Attachment/components/WaveProgressBar.tsx", "../src/components/Attachment/utils.tsx", "../src/components/Attachment/audioSampling.ts", "../src/components/AudioPlayback/AudioPlayer.ts", "../src/components/AudioPlayback/WithAudioPlayback.tsx", "../src/components/AudioPlayback/AudioPlayerPool.ts", "../src/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.ts", "../src/components/Attachment/VoiceRecording.tsx", "../src/components/ReactFileUtilities/FileIcon/FileIcon.tsx", "../src/components/ReactFileUtilities/FileIcon/FileIconSet.tsx", "../src/components/ReactFileUtilities/FileIcon/mimeTypes.ts", "../src/components/ReactFileUtilities/FileIcon/iconMap.ts", "../src/components/ReactFileUtilities/UploadButton.tsx", "../src/components/ReactFileUtilities/utils.ts", "../src/components/MessageInput/AttachmentSelector.tsx", "../src/components/MessageInput/icons.tsx", "../src/components/MessageInput/hooks/useMessageComposer.ts", "../src/components/Threads/ThreadContext.tsx", "../src/components/Threads/ThreadList/ThreadList.tsx", "../src/components/Threads/ThreadList/ThreadListItem.tsx", "../src/components/Threads/ThreadList/ThreadListItemUI.tsx", "../src/components/Message/Timestamp.tsx", "../src/components/Avatar/Avatar.tsx", "../src/components/Threads/icons.tsx", "../src/utils/getChannel.ts", "../src/utils/getWholeChar.ts", "../src/components/Avatar/ChannelAvatar.tsx", "../src/components/Avatar/GroupAvatar.tsx", "../src/components/Threads/UnreadCountBadge.tsx", "../src/components/ChannelPreview/ChannelPreview.tsx", "../src/components/ChannelPreview/ChannelPreviewMessenger.tsx", "../src/components/ChannelPreview/ChannelPreviewActionButtons.tsx", "../src/components/ChannelList/ChannelList.tsx", "../src/components/ChannelList/hooks/useConnectionRecoveredListener.ts", "../src/components/ChannelList/hooks/useMobileNavigation.ts", "../src/components/ChannelList/hooks/usePaginatedChannels.ts", "../src/components/ChannelList/hooks/useChannelListShape.ts", "../src/components/ChannelList/utils.ts", "../src/components/ChannelList/ChannelListMessenger.tsx", "../src/components/Loading/LoadingChannels.tsx", "../src/components/UtilityComponents/NullComponent.tsx", "../src/components/UtilityComponents/ErrorBoundary.tsx", "../src/components/ChannelSearch/ChannelSearch.tsx", "../src/components/ChannelSearch/hooks/useChannelSearch.ts", "../src/components/ChannelSearch/utils.ts", "../src/components/ChannelSearch/SearchBar.tsx", "../src/components/ChannelSearch/icons.tsx", "../src/components/ChannelSearch/SearchInput.tsx", "../src/components/ChannelSearch/SearchResults.tsx", "../src/components/EmptyStateIndicator/EmptyStateIndicator.tsx", "../src/components/EmptyStateIndicator/icons.tsx", "../src/components/LoadMore/LoadMorePaginator.tsx", "../src/components/LoadMore/LoadMoreButton.tsx", "../src/components/Loading/LoadingChannel.tsx", "../src/components/Loading/LoadingErrorIndicator.tsx", "../src/components/Loading/LoadingIndicator.tsx", "../src/utils/deprecationWarning.ts", "../src/components/ChannelList/hooks/useChannelDeletedListener.ts", "../src/components/ChannelList/hooks/useChannelHiddenListener.ts", "../src/components/ChannelList/hooks/useChannelTruncatedListener.ts", "../src/components/ChannelList/hooks/useChannelUpdatedListener.ts", "../src/components/ChannelList/hooks/useChannelVisibleListener.ts", "../src/components/ChannelList/hooks/useMessageNewListener.ts", "../src/components/ChannelList/hooks/useNotificationAddedToChannelListener.ts", "../src/components/ChannelList/hooks/useNotificationMessageNewListener.ts", "../src/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.ts", "../src/components/ChannelList/hooks/useUserPresenceChangedListener.ts", "../src/components/ChannelList/hooks/useSelectedChannelState.ts", "../src/components/ChannelList/hooks/useChannelMembershipState.ts", "../src/components/ChannelPreview/icons.tsx", "../src/components/ChannelPreview/hooks/useIsChannelMuted.ts", "../src/components/ChannelPreview/hooks/useChannelPreviewInfo.ts", "../src/components/ChannelPreview/utils.tsx", "../node_modules/devlop/lib/default.js", "../node_modules/comma-separated-tokens/index.js", "../node_modules/estree-util-is-identifier-name/lib/index.js", "../node_modules/hast-util-whitespace/lib/index.js", "../node_modules/property-information/lib/util/schema.js", "../node_modules/property-information/lib/util/merge.js", "../node_modules/property-information/lib/normalize.js", "../node_modules/property-information/lib/util/info.js", "../node_modules/property-information/lib/util/types.js", "../node_modules/property-information/lib/util/defined-info.js", "../node_modules/property-information/lib/util/create.js", "../node_modules/property-information/lib/xlink.js", "../node_modules/property-information/lib/xml.js", "../node_modules/property-information/lib/util/case-sensitive-transform.js", "../node_modules/property-information/lib/util/case-insensitive-transform.js", "../node_modules/property-information/lib/xmlns.js", "../node_modules/property-information/lib/aria.js", "../node_modules/property-information/lib/html.js", "../node_modules/property-information/lib/svg.js", "../node_modules/property-information/lib/find.js", "../node_modules/property-information/lib/hast-to-react.js", "../node_modules/property-information/index.js", "../node_modules/space-separated-tokens/index.js", "../node_modules/style-to-object/esm/index.mjs", "../node_modules/unist-util-position/lib/index.js", "../node_modules/unist-util-stringify-position/lib/index.js", "../node_modules/vfile-message/lib/index.js", "../node_modules/hast-util-to-jsx-runtime/lib/index.js", "../node_modules/html-url-attributes/lib/index.js", "../node_modules/react-markdown/lib/index.js", "../node_modules/mdast-util-to-string/lib/index.js", "../node_modules/character-entities/index.js", "../node_modules/decode-named-character-reference/index.js", "../node_modules/micromark-util-chunked/index.js", "../node_modules/micromark-util-combine-extensions/index.js", "../node_modules/micromark-util-decode-numeric-character-reference/index.js", "../node_modules/micromark-util-normalize-identifier/index.js", "../node_modules/micromark-util-character/index.js", "../node_modules/micromark-util-sanitize-uri/index.js", "../node_modules/micromark-factory-space/index.js", "../node_modules/micromark/lib/initialize/content.js", "../node_modules/micromark/lib/initialize/document.js", "../node_modules/micromark-util-classify-character/index.js", "../node_modules/micromark-util-resolve-all/index.js", "../node_modules/micromark-core-commonmark/lib/attention.js", "../node_modules/micromark-core-commonmark/lib/autolink.js", "../node_modules/micromark-core-commonmark/lib/blank-line.js", "../node_modules/micromark-core-commonmark/lib/block-quote.js", "../node_modules/micromark-core-commonmark/lib/character-escape.js", "../node_modules/micromark-core-commonmark/lib/character-reference.js", "../node_modules/micromark-core-commonmark/lib/code-fenced.js", "../node_modules/micromark-core-commonmark/lib/code-indented.js", "../node_modules/micromark-core-commonmark/lib/code-text.js", "../node_modules/micromark-util-subtokenize/lib/splice-buffer.js", "../node_modules/micromark-util-subtokenize/index.js", "../node_modules/micromark-core-commonmark/lib/content.js", "../node_modules/micromark-factory-destination/index.js", "../node_modules/micromark-factory-label/index.js", "../node_modules/micromark-factory-title/index.js", "../node_modules/micromark-factory-whitespace/index.js", "../node_modules/micromark-core-commonmark/lib/definition.js", "../node_modules/micromark-core-commonmark/lib/hard-break-escape.js", "../node_modules/micromark-core-commonmark/lib/heading-atx.js", "../node_modules/micromark-util-html-tag-name/index.js", "../node_modules/micromark-core-commonmark/lib/html-flow.js", "../node_modules/micromark-core-commonmark/lib/html-text.js", "../node_modules/micromark-core-commonmark/lib/label-end.js", "../node_modules/micromark-core-commonmark/lib/label-start-image.js", "../node_modules/micromark-core-commonmark/lib/label-start-link.js", "../node_modules/micromark-core-commonmark/lib/line-ending.js", "../node_modules/micromark-core-commonmark/lib/thematic-break.js", "../node_modules/micromark-core-commonmark/lib/list.js", "../node_modules/micromark-core-commonmark/lib/setext-underline.js", "../node_modules/micromark/lib/initialize/flow.js", "../node_modules/micromark/lib/initialize/text.js", "../node_modules/micromark/lib/constructs.js", "../node_modules/micromark/lib/create-tokenizer.js", "../node_modules/micromark/lib/parse.js", "../node_modules/micromark/lib/postprocess.js", "../node_modules/micromark/lib/preprocess.js", "../node_modules/micromark-util-decode-string/index.js", "../node_modules/mdast-util-from-markdown/lib/index.js", "../node_modules/remark-parse/lib/index.js", "../node_modules/mdast-util-to-hast/lib/handlers/blockquote.js", "../node_modules/mdast-util-to-hast/lib/handlers/break.js", "../node_modules/mdast-util-to-hast/lib/handlers/code.js", "../node_modules/mdast-util-to-hast/lib/handlers/delete.js", "../node_modules/mdast-util-to-hast/lib/handlers/emphasis.js", "../node_modules/mdast-util-to-hast/lib/handlers/footnote-reference.js", "../node_modules/mdast-util-to-hast/lib/handlers/heading.js", "../node_modules/mdast-util-to-hast/lib/handlers/html.js", "../node_modules/mdast-util-to-hast/lib/revert.js", "../node_modules/mdast-util-to-hast/lib/handlers/image-reference.js", "../node_modules/mdast-util-to-hast/lib/handlers/image.js", "../node_modules/mdast-util-to-hast/lib/handlers/inline-code.js", "../node_modules/mdast-util-to-hast/lib/handlers/link-reference.js", "../node_modules/mdast-util-to-hast/lib/handlers/link.js", "../node_modules/mdast-util-to-hast/lib/handlers/list-item.js", "../node_modules/mdast-util-to-hast/lib/handlers/list.js", "../node_modules/mdast-util-to-hast/lib/handlers/paragraph.js", "../node_modules/mdast-util-to-hast/lib/handlers/root.js", "../node_modules/mdast-util-to-hast/lib/handlers/strong.js", "../node_modules/mdast-util-to-hast/lib/handlers/table.js", "../node_modules/mdast-util-to-hast/lib/handlers/table-row.js", "../node_modules/mdast-util-to-hast/lib/handlers/table-cell.js", "../node_modules/trim-lines/index.js", "../node_modules/mdast-util-to-hast/lib/handlers/text.js", "../node_modules/mdast-util-to-hast/lib/handlers/thematic-break.js", "../node_modules/mdast-util-to-hast/lib/handlers/index.js", "../node_modules/@ungap/structured-clone/esm/types.js", "../node_modules/@ungap/structured-clone/esm/deserialize.js", "../node_modules/@ungap/structured-clone/esm/serialize.js", "../node_modules/@ungap/structured-clone/esm/index.js", "../node_modules/mdast-util-to-hast/lib/footer.js", "../node_modules/unist-util-is/lib/index.js", "../node_modules/unist-util-visit-parents/lib/color.node.js", "../node_modules/unist-util-visit-parents/lib/index.js", "../node_modules/unist-util-visit/lib/index.js", "../node_modules/mdast-util-to-hast/lib/state.js", "../node_modules/mdast-util-to-hast/lib/index.js", "../node_modules/remark-rehype/lib/index.js", "../node_modules/bail/index.js", "../node_modules/unified/lib/index.js", "../node_modules/is-plain-obj/index.js", "../node_modules/trough/index.js", "../node_modules/vfile/lib/minpath.js", "../node_modules/vfile/lib/minproc.js", "../node_modules/vfile/lib/minurl.js", "../node_modules/vfile/lib/minurl.shared.js", "../node_modules/vfile/lib/index.js", "../node_modules/unified/lib/callable-instance.js", "../src/components/Message/FixedHeightMessage.tsx", "../src/utils/useStableCallback.ts", "../src/components/Message/hooks/useActionHandler.ts", "../src/components/Message/utils.tsx", "../src/components/Message/hooks/useDeleteHandler.ts", "../src/components/Message/hooks/useEditHandler.ts", "../src/components/Message/hooks/useFlagHandler.ts", "../src/components/Message/hooks/useMentionsHandler.ts", "../src/components/Message/hooks/useMarkUnreadHandler.ts", "../src/components/Message/hooks/useMuteHandler.ts", "../src/components/Message/hooks/useOpenThreadHandler.ts", "../src/components/Message/hooks/usePinHandler.ts", "../src/components/Message/hooks/useReactionHandler.ts", "../src/components/Message/hooks/useRetryHandler.ts", "../src/components/Message/hooks/useUserHandler.ts", "../src/components/Message/hooks/useUserRole.ts", "../src/components/Message/hooks/useReactionsFetcher.ts", "../src/components/Message/hooks/useMessageTextStreaming.ts", "../src/components/Message/hooks/useMessageReminder.ts", "../src/components/Message/MessageDeleted.tsx", "../src/components/Message/MessageTimestamp.tsx", "../src/components/Gallery/BaseImage.tsx", "../src/components/Gallery/Gallery.tsx", "../src/components/Modal/GlobalModal.tsx", "../src/components/Modal/icons.tsx", "../src/components/Dialog/ButtonWithSubmenu.tsx", "../src/components/Dialog/DialogAnchor.tsx", "../src/components/Dialog/hooks/usePopoverPosition.ts", "../src/components/Modal/Modal.tsx", "../src/components/Gallery/ModalGallery.tsx", "../src/components/Gallery/Image.tsx", "../src/components/MessageActions/MessageActions.tsx", "../src/components/MessageActions/MessageActionsBox.tsx", "../src/components/MessageActions/CustomMessageActionsList.tsx", "../src/components/MessageActions/RemindMeSubmenu.tsx", "../src/components/Message/icons.tsx", "../src/components/Message/renderText/regex.ts", "../node_modules/hast-util-is-element/lib/index.js", "../node_modules/hast-util-find-and-replace/node_modules/escape-string-regexp/index.js", "../node_modules/hast-util-find-and-replace/lib/index.js", "../node_modules/unist-builder/lib/index.js", "../src/components/Message/renderText/rehypePlugins/emojiMarkdownPlugin.ts", "../src/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.ts", "../src/components/Message/renderText/remarkPlugins/htmlToTextPlugin.ts", "../src/components/Message/renderText/remarkPlugins/imageToLink.ts", "../src/components/Message/renderText/remarkPlugins/keepLineBreaksPlugin.ts", "../src/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.ts", "../src/components/Message/renderText/remarkPlugins/remarkIgnoreMarkdown.ts", "../src/components/Message/renderText/renderText.tsx", "../node_modules/ccount/index.js", "../node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp/index.js", "../node_modules/mdast-util-find-and-replace/lib/index.js", "../node_modules/mdast-util-gfm-autolink-literal/lib/index.js", "../node_modules/mdast-util-gfm-footnote/lib/index.js", "../node_modules/mdast-util-gfm-strikethrough/lib/index.js", "../node_modules/markdown-table/index.js", "../node_modules/mdast-util-to-markdown/lib/handle/blockquote.js", "../node_modules/mdast-util-to-markdown/lib/util/pattern-in-scope.js", "../node_modules/mdast-util-to-markdown/lib/handle/break.js", "../node_modules/longest-streak/index.js", "../node_modules/mdast-util-to-markdown/lib/util/format-code-as-indented.js", "../node_modules/mdast-util-to-markdown/lib/util/check-fence.js", "../node_modules/mdast-util-to-markdown/lib/handle/code.js", "../node_modules/mdast-util-to-markdown/lib/util/check-quote.js", "../node_modules/mdast-util-to-markdown/lib/handle/definition.js", "../node_modules/mdast-util-to-markdown/lib/util/check-emphasis.js", "../node_modules/mdast-util-to-markdown/lib/util/encode-character-reference.js", "../node_modules/mdast-util-to-markdown/lib/util/encode-info.js", "../node_modules/mdast-util-to-markdown/lib/handle/emphasis.js", "../node_modules/mdast-util-to-markdown/lib/util/format-heading-as-setext.js", "../node_modules/mdast-util-to-markdown/lib/handle/heading.js", "../node_modules/mdast-util-to-markdown/lib/handle/html.js", "../node_modules/mdast-util-to-markdown/lib/handle/image.js", "../node_modules/mdast-util-to-markdown/lib/handle/image-reference.js", "../node_modules/mdast-util-to-markdown/lib/handle/inline-code.js", "../node_modules/mdast-util-to-markdown/lib/util/format-link-as-autolink.js", "../node_modules/mdast-util-to-markdown/lib/handle/link.js", "../node_modules/mdast-util-to-markdown/lib/handle/link-reference.js", "../node_modules/mdast-util-to-markdown/lib/util/check-bullet.js", "../node_modules/mdast-util-to-markdown/lib/util/check-bullet-other.js", "../node_modules/mdast-util-to-markdown/lib/util/check-bullet-ordered.js", "../node_modules/mdast-util-to-markdown/lib/util/check-rule.js", "../node_modules/mdast-util-to-markdown/lib/handle/list.js", "../node_modules/mdast-util-to-markdown/lib/util/check-list-item-indent.js", "../node_modules/mdast-util-to-markdown/lib/handle/list-item.js", "../node_modules/mdast-util-to-markdown/lib/handle/paragraph.js", "../node_modules/mdast-util-phrasing/lib/index.js", "../node_modules/mdast-util-to-markdown/lib/handle/root.js", "../node_modules/mdast-util-to-markdown/lib/util/check-strong.js", "../node_modules/mdast-util-to-markdown/lib/handle/strong.js", "../node_modules/mdast-util-to-markdown/lib/handle/text.js", "../node_modules/mdast-util-to-markdown/lib/util/check-rule-repetition.js", "../node_modules/mdast-util-to-markdown/lib/handle/thematic-break.js", "../node_modules/mdast-util-to-markdown/lib/handle/index.js", "../node_modules/mdast-util-gfm-table/lib/index.js", "../node_modules/mdast-util-gfm-task-list-item/lib/index.js", "../node_modules/mdast-util-gfm/lib/index.js", "../node_modules/micromark-extension-gfm-autolink-literal/lib/syntax.js", "../node_modules/micromark-extension-gfm-footnote/lib/syntax.js", "../node_modules/micromark-extension-gfm-strikethrough/lib/syntax.js", "../node_modules/micromark-extension-gfm-table/lib/edit-map.js", "../node_modules/micromark-extension-gfm-table/lib/infer.js", "../node_modules/micromark-extension-gfm-table/lib/syntax.js", "../node_modules/micromark-extension-gfm-task-list-item/lib/syntax.js", "../node_modules/micromark-extension-gfm/index.js", "../node_modules/remark-gfm/lib/index.js", "../src/components/Message/renderText/componentRenderers/Anchor.tsx", "../src/components/Message/renderText/componentRenderers/Emoji.tsx", "../src/components/Message/renderText/componentRenderers/Mention.tsx", "../src/components/Message/Message.tsx", "../src/components/Message/MessageSimple.tsx", "../src/components/MessageBounce/MessageBounceModal.tsx", "../src/components/MessageBounce/MessageBouncePrompt.tsx", "../src/components/Message/MessageBlocked.tsx", "../src/components/Message/MessageOptions.tsx", "../src/components/Reactions/ReactionSelectorWithButton.tsx", "../src/components/Reactions/ReactionSelector.tsx", "../src/components/Reactions/reactionOptions.tsx", "../src/components/Reactions/StreamEmoji.tsx", "../src/components/Reactions/SpriteImage.tsx", "../src/components/Reactions/utils/utils.ts", "../src/components/Message/MessageRepliesCountButton.tsx", "../src/components/Message/MessageStatus.tsx", "../src/components/Tooltip/Tooltip.tsx", "../src/components/Tooltip/hooks/useEnterLeaveHandlers.ts", "../src/components/Message/MessageText.tsx", "../src/components/Message/QuotedMessage.tsx", "../src/components/Poll/Poll.tsx", "../src/components/Poll/PollContent.tsx", "../src/components/Poll/PollHeader.tsx", "../src/components/Poll/PollActions/AddCommentForm.tsx", "../src/components/Dialog/FormDialog.tsx", "../src/components/Form/FieldError.tsx", "../src/components/Dialog/PromptDialog.tsx", "../src/components/Poll/PollActions/EndPollDialog.tsx", "../src/components/Poll/PollActions/PollActions.tsx", "../src/components/Poll/PollActions/PollAction.tsx", "../src/components/Poll/PollActions/SuggestPollOptionForm.tsx", "../src/components/Poll/PollActions/PollAnswerList.tsx", "../src/components/Modal/ModalHeader.tsx", "../src/components/Poll/PollVote.tsx", "../src/components/Poll/hooks/usePollAnswerPagination.ts", "../src/components/Poll/hooks/useManagePollVotesRealtime.ts", "../src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts", "../src/components/Poll/hooks/usePollOptionVotesPagination.ts", "../src/components/InfiniteScrollPaginator/InfiniteScrollPaginator.tsx", "../src/constants/limits.ts", "../src/components/Poll/PollActions/PollOptionsFullList.tsx", "../src/components/Poll/PollOptionList.tsx", "../src/components/Poll/PollOptionSelector.tsx", "../src/components/Poll/PollActions/PollResults/PollResults.tsx", "../src/components/Poll/PollActions/PollResults/PollOptionVotesList.tsx", "../src/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.tsx", "../src/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.tsx", "../src/components/Poll/constants.ts", "../src/components/Poll/QuotedPoll.tsx", "../src/components/Poll/PollCreationDialog/PollCreationDialog.tsx", "../src/components/Poll/PollCreationDialog/MultipleAnswersField.tsx", "../src/components/Form/SwitchField.tsx", "../src/components/Poll/PollCreationDialog/NameField.tsx", "../src/components/Poll/PollCreationDialog/OptionFieldSet.tsx", "../src/components/DragAndDrop/DragAndDropContainer.tsx", "../src/components/Poll/PollCreationDialog/PollCreationDialogControls.tsx", "../src/components/Message/MessageErrorText.tsx", "../src/components/Message/StreamedMessageText.tsx", "../src/components/MessageList/ConnectionStatus.tsx", "../src/components/MessageList/CustomNotification.tsx", "../src/components/MessageList/GiphyPreviewMessage.tsx", "../src/components/MessageList/MessageList.tsx", "../src/components/MessageList/hooks/MessageList/useEnrichedMessages.ts", "../src/components/MessageList/utils.ts", "../src/constants/messageTypes.ts", "../src/i18n/de.json", "../src/i18n/en.json", "../src/i18n/es.json", "../src/i18n/fr.json", "../src/i18n/hi.json", "../src/i18n/it.json", "../src/i18n/ja.json", "../src/i18n/ko.json", "../src/i18n/nl.json", "../src/i18n/pt.json", "../src/i18n/ru.json", "../src/i18n/tr.json", "../src/i18n/Streami18n.ts", "../src/i18n/TranslationBuilder/TranslationBuilder.ts", "../src/i18n/TranslationBuilder/notifications/attachmentUpload.ts", "../src/i18n/TranslationBuilder/notifications/pollComposition.ts", "../src/i18n/TranslationBuilder/notifications/pollVoteCountTrespass.ts", "../src/i18n/TranslationBuilder/notifications/browserAudioPlaybackError.ts", "../src/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.ts", "../src/components/MessageList/hooks/MessageList/useMessageListElements.tsx", "../src/components/MessageList/hooks/useLastReadData.ts", "../src/components/MessageList/hooks/useLastDeliveredData.ts", "../src/components/MessageList/hooks/MessageList/useMessageListScrollManager.ts", "../src/components/MessageList/hooks/MessageList/useScrollLocationLogic.tsx", "../src/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.ts", "../src/components/MessageList/MessageListMainPanel.tsx", "../src/components/MessageList/UnreadMessagesSeparator.tsx", "../src/components/MessageList/hooks/useMarkRead.ts", "../src/components/MessageList/MessageNotification.tsx", "../src/components/MessageList/MessageListNotifications.tsx", "../src/components/Notifications/hooks/useNotifications.ts", "../src/components/MessageList/UnreadMessagesNotification.tsx", "../src/components/MessageList/icons.tsx", "../src/components/InfiniteScrollPaginator/InfiniteScroll.tsx", "../src/components/TypingIndicator/TypingIndicator.tsx", "../src/components/MessageList/renderMessages.tsx", "../src/components/DateSeparator/DateSeparator.tsx", "../src/components/EventComponent/EventComponent.tsx", "../src/components/UtilityComponents/useStableId.ts", "../src/components/MessageList/hooks/useLastOwnMessage.ts", "../src/utils/findReverse.ts", "../src/components/MessageList/ScrollToBottomButton.tsx", "../src/components/MessageList/VirtualizedMessageList.tsx", "../src/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.ts", "../src/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.ts", "../src/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.ts", "../src/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.ts", "../src/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.ts", "../src/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.ts", "../src/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.ts", "../src/components/MessageList/VirtualizedMessageListComponents.tsx", "../src/context/VirtualizedMessageListContext.tsx", "../src/components/Message/MessageIsThreadReplyInChannelButtonIndicator.tsx", "../src/components/Message/ReminderNotification.tsx", "../src/components/Reactions/ReactionsList.tsx", "../src/components/Reactions/ReactionsListModal.tsx", "../src/components/Reactions/hooks/useFetchReactions.ts", "../src/components/Reactions/hooks/useProcessReactions.tsx", "../src/components/Reactions/SimpleReactionsList.tsx", "../src/components/Message/MessageEditedTimestamp.tsx", "../src/components/ChannelPreview/hooks/useMessageDeliveryStatus.ts", "../src/components/ChatView/ChatView.tsx", "../src/components/Threads/ThreadList/ThreadListEmptyPlaceholder.tsx", "../src/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.tsx", "../src/components/Threads/ThreadList/ThreadListLoadingIndicator.tsx", "../src/components/Thread/Thread.tsx", "../src/components/Thread/LegacyThreadContext.ts", "../src/components/Thread/ThreadHeader.tsx", "../src/components/Thread/icons.tsx", "../src/components/Thread/ThreadHead.tsx", "../src/components/Thread/ThreadStart.tsx", "../src/components/MessageInput/hooks/useAttachmentManagerState.ts", "../src/components/Channel/constants.ts", "../src/components/Dialog/DialogMenu.tsx", "../src/components/Location/ShareLocationDialog.tsx", "../src/components/Form/Dropdown.tsx", "../src/context/AttachmentSelectorContext.tsx", "../src/components/MessageInput/hooks/useAttachmentsForPreview.ts", "../src/components/MessageInput/hooks/useCanCreatePoll.ts", "../src/components/MessageInput/hooks/useCooldownTimer.tsx", "../src/components/MessageInput/hooks/useTextareaRef.ts", "../src/components/MessageInput/hooks/useSubmitHandler.ts", "../src/components/MessageInput/hooks/usePasteHandler.ts", "../src/components/MediaRecorder/hooks/useMediaRecorder.ts", "../src/components/MediaRecorder/observable/Subscription.ts", "../src/components/MediaRecorder/observable/Observer.ts", "../src/components/MediaRecorder/observable/Observable.ts", "../src/components/MediaRecorder/observable/Subject.ts", "../src/components/MediaRecorder/observable/BehaviorSubject.ts", "../src/components/MediaRecorder/classes/BrowserPermission.ts", "../src/components/MediaRecorder/classes/MediaRecorderController.ts", "../src/utils/mergeDeep.ts", "../src/components/MediaRecorder/classes/AmplitudeRecorder.ts", "../src/components/MediaRecorder/transcode/audioProcessing.ts", "../src/components/MediaRecorder/transcode/wav.ts", "../src/components/MediaRecorder/transcode/index.ts", "../src/components/MessageInput/hooks/useMessageInputControls.ts", "../src/components/MessageInput/hooks/useMessageComposerHasSendableData.ts", "../src/components/MessageInput/AttachmentPreviewList/AttachmentPreviewList.tsx", "../src/components/MessageInput/AttachmentPreviewList/UnsupportedAttachmentPreview.tsx", "../src/components/MessageInput/AttachmentPreviewList/VoiceRecordingPreview.tsx", "../src/components/MediaRecorder/RecordingPermissionDeniedNotification.tsx", "../src/components/MediaRecorder/AudioRecorder/AudioRecorder.tsx", "../src/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.tsx", "../src/components/MediaRecorder/AudioRecorder/RecordingTimer.tsx", "../src/components/MediaRecorder/AudioRecorder/AudioRecordingInProgress.tsx", "../src/components/MediaRecorder/AudioRecorder/hooks/useTimeElapsed.ts", "../src/components/MediaRecorder/AudioRecorder/AudioRecordingButtons.tsx", "../src/components/MessageInput/AttachmentPreviewList/FileAttachmentPreview.tsx", "../src/components/MessageInput/AttachmentPreviewList/ImageAttachmentPreview.tsx", "../src/components/MessageInput/AttachmentPreviewList/GeolocationPreview.tsx", "../src/components/MessageInput/CooldownTimer.tsx", "../src/components/MessageInput/hooks/useTimer.ts", "../src/components/MessageInput/EditMessageForm.tsx", "../src/components/MessageInput/MessageInput.tsx", "../src/components/MessageInput/MessageInputFlat.tsx", "../src/components/MessageInput/SendButton.tsx", "../src/components/MessageInput/StopAIGenerationButton.tsx", "../src/components/MessageInput/QuotedMessagePreview.tsx", "../src/components/MessageInput/LinkPreviewList.tsx", "../src/components/MessageInput/SendToChannelCheckbox.tsx", "../src/components/TextareaComposer/SuggestionList/CommandItem.tsx", "../src/components/TextareaComposer/SuggestionList/EmoticonItem.tsx", "../src/components/TextareaComposer/SuggestionList/SuggestionList.tsx", "../src/components/TextareaComposer/SuggestionList/SuggestionListItem.tsx", "../src/components/TextareaComposer/SuggestionList/UserItem.tsx", "../src/components/TextareaComposer/TextareaComposer.tsx", "../src/components/MessageInput/WithDragAndDropUpload.tsx", "../src/components/MessageInput/hooks/useCreateMessageInputContext.ts", "../src/components/Attachment/Card.tsx", "../src/components/Attachment/FileAttachment.tsx", "../src/components/Attachment/Geolocation.tsx", "../src/components/Attachment/UnsupportedAttachment.tsx", "../src/components/Attachment/hooks/useAudioController.ts", "../src/components/Location/hooks/useLiveLocationSharingManager.ts", "../src/components/Channel/Channel.tsx", "../src/components/Channel/channelState.ts", "../src/components/Channel/hooks/useCreateChannelStateContext.ts", "../src/components/Channel/hooks/useCreateTypingContext.ts", "../src/components/Channel/hooks/useEditMessageHandler.ts", "../src/components/Channel/hooks/useIsMounted.ts", "../src/components/Channel/hooks/useMentionsHandlers.ts", "../src/components/Channel/hooks/useChannelContainerClasses.ts", "../src/components/Channel/utils.ts", "../src/components/Attachment/attachment-sizing.tsx", "../src/experimental/Search/hooks/useSearchFocusedMessage.ts", "../src/components/ChannelHeader/ChannelHeader.tsx", "../src/components/ChannelHeader/icons.tsx", "../src/components/Chat/Chat.tsx", "../src/components/Chat/hooks/useChat.ts", "../src/components/Chat/hooks/useCreateChatContext.ts", "../src/components/Chat/hooks/useChannelsQueryState.ts", "../src/components/Chat/hooks/useCreateChatClient.ts", "../src/components/Window/Window.tsx"],
  "sourcesContent": ["// http://www.w3.org/TR/CSS21/grammar.html\n// https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027\nvar COMMENT_REGEX = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\n\nvar NEWLINE_REGEX = /\\n/g;\nvar WHITESPACE_REGEX = /^\\s*/;\n\n// declaration\nvar PROPERTY_REGEX = /^(\\*?[-#/*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/;\nvar COLON_REGEX = /^:\\s*/;\nvar VALUE_REGEX = /^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};])+)/;\nvar SEMICOLON_REGEX = /^[;\\s]*/;\n\n// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Polyfill\nvar TRIM_REGEX = /^\\s+|\\s+$/g;\n\n// strings\nvar NEWLINE = '\\n';\nvar FORWARD_SLASH = '/';\nvar ASTERISK = '*';\nvar EMPTY_STRING = '';\n\n// types\nvar TYPE_COMMENT = 'comment';\nvar TYPE_DECLARATION = 'declaration';\n\n/**\n * @param {String} style\n * @param {Object} [options]\n * @return {Object[]}\n * @throws {TypeError}\n * @throws {Error}\n */\nmodule.exports = function (style, options) {\n  if (typeof style !== 'string') {\n    throw new TypeError('First argument must be a string');\n  }\n\n  if (!style) return [];\n\n  options = options || {};\n\n  /**\n   * Positional.\n   */\n  var lineno = 1;\n  var column = 1;\n\n  /**\n   * Update lineno and column based on `str`.\n   *\n   * @param {String} str\n   */\n  function updatePosition(str) {\n    var lines = str.match(NEWLINE_REGEX);\n    if (lines) lineno += lines.length;\n    var i = str.lastIndexOf(NEWLINE);\n    column = ~i ? str.length - i : column + str.length;\n  }\n\n  /**\n   * Mark position and patch `node.position`.\n   *\n   * @return {Function}\n   */\n  function position() {\n    var start = { line: lineno, column: column };\n    return function (node) {\n      node.position = new Position(start);\n      whitespace();\n      return node;\n    };\n  }\n\n  /**\n   * Store position information for a node.\n   *\n   * @constructor\n   * @property {Object} start\n   * @property {Object} end\n   * @property {undefined|String} source\n   */\n  function Position(start) {\n    this.start = start;\n    this.end = { line: lineno, column: column };\n    this.source = options.source;\n  }\n\n  /**\n   * Non-enumerable source string.\n   */\n  Position.prototype.content = style;\n\n  var errorsList = [];\n\n  /**\n   * Error `msg`.\n   *\n   * @param {String} msg\n   * @throws {Error}\n   */\n  function error(msg) {\n    var err = new Error(\n      options.source + ':' + lineno + ':' + column + ': ' + msg\n    );\n    err.reason = msg;\n    err.filename = options.source;\n    err.line = lineno;\n    err.column = column;\n    err.source = style;\n\n    if (options.silent) {\n      errorsList.push(err);\n    } else {\n      throw err;\n    }\n  }\n\n  /**\n   * Match `re` and return captures.\n   *\n   * @param {RegExp} re\n   * @return {undefined|Array}\n   */\n  function match(re) {\n    var m = re.exec(style);\n    if (!m) return;\n    var str = m[0];\n    updatePosition(str);\n    style = style.slice(str.length);\n    return m;\n  }\n\n  /**\n   * Parse whitespace.\n   */\n  function whitespace() {\n    match(WHITESPACE_REGEX);\n  }\n\n  /**\n   * Parse comments.\n   *\n   * @param {Object[]} [rules]\n   * @return {Object[]}\n   */\n  function comments(rules) {\n    var c;\n    rules = rules || [];\n    while ((c = comment())) {\n      if (c !== false) {\n        rules.push(c);\n      }\n    }\n    return rules;\n  }\n\n  /**\n   * Parse comment.\n   *\n   * @return {Object}\n   * @throws {Error}\n   */\n  function comment() {\n    var pos = position();\n    if (FORWARD_SLASH != style.charAt(0) || ASTERISK != style.charAt(1)) return;\n\n    var i = 2;\n    while (\n      EMPTY_STRING != style.charAt(i) &&\n      (ASTERISK != style.charAt(i) || FORWARD_SLASH != style.charAt(i + 1))\n    ) {\n      ++i;\n    }\n    i += 2;\n\n    if (EMPTY_STRING === style.charAt(i - 1)) {\n      return error('End of comment missing');\n    }\n\n    var str = style.slice(2, i - 2);\n    column += 2;\n    updatePosition(str);\n    style = style.slice(i);\n    column += 2;\n\n    return pos({\n      type: TYPE_COMMENT,\n      comment: str\n    });\n  }\n\n  /**\n   * Parse declaration.\n   *\n   * @return {Object}\n   * @throws {Error}\n   */\n  function declaration() {\n    var pos = position();\n\n    // prop\n    var prop = match(PROPERTY_REGEX);\n    if (!prop) return;\n    comment();\n\n    // :\n    if (!match(COLON_REGEX)) return error(\"property missing ':'\");\n\n    // val\n    var val = match(VALUE_REGEX);\n\n    var ret = pos({\n      type: TYPE_DECLARATION,\n      property: trim(prop[0].replace(COMMENT_REGEX, EMPTY_STRING)),\n      value: val\n        ? trim(val[0].replace(COMMENT_REGEX, EMPTY_STRING))\n        : EMPTY_STRING\n    });\n\n    // ;\n    match(SEMICOLON_REGEX);\n\n    return ret;\n  }\n\n  /**\n   * Parse declarations.\n   *\n   * @return {Object[]}\n   */\n  function declarations() {\n    var decls = [];\n\n    comments(decls);\n\n    // declarations\n    var decl;\n    while ((decl = declaration())) {\n      if (decl !== false) {\n        decls.push(decl);\n        comments(decls);\n      }\n    }\n\n    return decls;\n  }\n\n  whitespace();\n  return declarations();\n};\n\n/**\n * Trim `str`.\n *\n * @param {String} str\n * @return {String}\n */\nfunction trim(str) {\n  return str ? str.replace(TRIM_REGEX, EMPTY_STRING) : EMPTY_STRING;\n}\n", "import type { Declaration } from 'inline-style-parser';\nimport parse from 'inline-style-parser';\n\nexport { Declaration };\n\ninterface StyleObject {\n  [name: string]: string;\n}\n\ntype Iterator = (\n  property: string,\n  value: string,\n  declaration: Declaration,\n) => void;\n\n/**\n * Parses inline style to object.\n *\n * @param style - Inline style.\n * @param iterator - Iterator.\n * @returns - Style object or null.\n *\n * @example Parsing inline style to object:\n *\n * ```js\n * import parse from 'style-to-object';\n * parse('line-height: 42;'); // { 'line-height': '42' }\n * ```\n */\nexport default function StyleToObject(\n  style: string,\n  iterator?: Iterator,\n): StyleObject | null {\n  let styleObject: StyleObject | null = null;\n\n  if (!style || typeof style !== 'string') {\n    return styleObject;\n  }\n\n  const declarations = parse(style);\n  const hasIterator = typeof iterator === 'function';\n\n  declarations.forEach((declaration) => {\n    if (declaration.type !== 'declaration') {\n      return;\n    }\n\n    const { property, value } = declaration;\n\n    if (hasIterator) {\n      iterator(property, value, declaration);\n    } else if (value) {\n      styleObject = styleObject || {};\n      styleObject[property] = value;\n    }\n  });\n\n  return styleObject;\n}\n", "'use strict';\n\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\nvar defineProperty = Object.defineProperty;\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nvar isArray = function isArray(arr) {\n\tif (typeof Array.isArray === 'function') {\n\t\treturn Array.isArray(arr);\n\t}\n\n\treturn toStr.call(arr) === '[object Array]';\n};\n\nvar isPlainObject = function isPlainObject(obj) {\n\tif (!obj || toStr.call(obj) !== '[object Object]') {\n\t\treturn false;\n\t}\n\n\tvar hasOwnConstructor = hasOwn.call(obj, 'constructor');\n\tvar hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');\n\t// Not own constructor property must be Object\n\tif (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n\t\treturn false;\n\t}\n\n\t// Own properties are enumerated firstly, so to speed up,\n\t// if last one is own, then all properties are own.\n\tvar key;\n\tfor (key in obj) { /**/ }\n\n\treturn typeof key === 'undefined' || hasOwn.call(obj, key);\n};\n\n// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target\nvar setProperty = function setProperty(target, options) {\n\tif (defineProperty && options.name === '__proto__') {\n\t\tdefineProperty(target, options.name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\tvalue: options.newValue,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\ttarget[options.name] = options.newValue;\n\t}\n};\n\n// Return undefined instead of __proto__ if '__proto__' is not an own property\nvar getProperty = function getProperty(obj, name) {\n\tif (name === '__proto__') {\n\t\tif (!hasOwn.call(obj, name)) {\n\t\t\treturn void 0;\n\t\t} else if (gOPD) {\n\t\t\t// In early versions of node, obj['__proto__'] is buggy when obj has\n\t\t\t// __proto__ as an own property. Object.getOwnPropertyDescriptor() works.\n\t\t\treturn gOPD(obj, name).value;\n\t\t}\n\t}\n\n\treturn obj[name];\n};\n\nmodule.exports = function extend() {\n\tvar options, name, src, copy, copyIsArray, clone;\n\tvar target = arguments[0];\n\tvar i = 1;\n\tvar length = arguments.length;\n\tvar deep = false;\n\n\t// Handle a deep copy situation\n\tif (typeof target === 'boolean') {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\tif (target == null || (typeof target !== 'object' && typeof target !== 'function')) {\n\t\ttarget = {};\n\t}\n\n\tfor (; i < length; ++i) {\n\t\toptions = arguments[i];\n\t\t// Only deal with non-null/undefined values\n\t\tif (options != null) {\n\t\t\t// Extend the base object\n\t\t\tfor (name in options) {\n\t\t\t\tsrc = getProperty(target, name);\n\t\t\t\tcopy = getProperty(options, name);\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif (target !== copy) {\n\t\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\t\tif (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\t\t\t\t\t\tif (copyIsArray) {\n\t\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\t\tclone = src && isArray(src) ? src : [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tclone = src && isPlainObject(src) ? src : {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: extend(deep, clone, copy) });\n\n\t\t\t\t\t// Don't bring in undefined values\n\t\t\t\t\t} else if (typeof copy !== 'undefined') {\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: copy });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n", "export * from './components';\nexport * from './context';\nexport * from './i18n';\nexport * from './store';\nexport * from './types';\nexport * from './utils';\n", "import React from 'react';\nimport type { Channel } from 'stream-chat';\n\nimport { AIStates, useAIState } from './hooks/useAIState';\n\nimport { useChannelStateContext, useTranslationContext } from '../../context';\n\nexport type AIStateIndicatorProps = {\n  channel?: Channel;\n};\n\nexport const AIStateIndicator = ({\n  channel: channelFromProps,\n}: AIStateIndicatorProps) => {\n  const { t } = useTranslationContext();\n  const { channel: channelFromContext } = useChannelStateContext('AIStateIndicator');\n  const channel = channelFromProps || channelFromContext;\n  const { aiState } = useAIState(channel);\n  const allowedStates = {\n    [AIStates.Thinking]: t('Thinking...'),\n    [AIStates.Generating]: t('Generating...'),\n  };\n\n  return aiState in allowedStates ? (\n    <div className='str-chat__ai-state-indicator-container'>\n      <p className='str-chat__ai-state-indicator-text'>{allowedStates[aiState]}</p>\n    </div>\n  ) : null;\n};\n", "import { useEffect, useState } from 'react';\nimport type { AIState, Channel, Event } from 'stream-chat';\n\nexport const AIStates = {\n  Error: 'AI_STATE_ERROR',\n  ExternalSources: 'AI_STATE_EXTERNAL_SOURCES',\n  Generating: 'AI_STATE_GENERATING',\n  Idle: 'AI_STATE_IDLE',\n  Stop: 'AI_STATE_STOP',\n  Thinking: 'AI_STATE_THINKING',\n};\n\n/**\n * A hook that returns the current state of the AI.\n * @param {Channel} channel - The channel for which we want to know the AI state.\n * @returns {{ aiState: AIState }} The current AI state for the given channel.\n */\nexport const useAIState = (channel?: Channel): { aiState: AIState } => {\n  const [aiState, setAiState] = useState<AIState>(AIStates.Idle);\n\n  useEffect(() => {\n    if (!channel) {\n      return;\n    }\n\n    const indicatorChangedListener = channel.on('ai_indicator.update', (event: Event) => {\n      const { cid } = event;\n      const state = event.ai_state as AIState;\n      if (channel.cid === cid) {\n        setAiState(state);\n      }\n    });\n\n    const indicatorClearedListener = channel.on('ai_indicator.clear', (event) => {\n      const { cid } = event;\n      if (channel.cid === cid) {\n        setAiState(AIStates.Idle);\n      }\n    });\n\n    const indicatorStoppedListener = channel.on('ai_indicator.stop', (event) => {\n      const { cid } = event;\n      if (channel.cid === cid) {\n        setAiState(AIStates.Stop);\n      }\n    });\n\n    return () => {\n      indicatorChangedListener.unsubscribe();\n      indicatorClearedListener.unsubscribe();\n      indicatorStoppedListener.unsubscribe();\n    };\n  }, [channel]);\n\n  return { aiState };\n};\n", "import type { PropsWithChildren } from 'react';\nimport React, { useContext } from 'react';\n\nimport type {\n  DeleteMessageOptions,\n  LocalMessage,\n  Message,\n  MessageResponse,\n  SendMessageOptions,\n  UpdateMessageAPIResponse,\n  UpdateMessageOptions,\n} from 'stream-chat';\n\nimport type { ChannelStateReducerAction } from '../components/Channel/channelState';\nimport type { CustomMentionHandler } from '../components/Message/hooks/useMentionsHandler';\n\nimport type { ChannelUnreadUiState, UnknownType } from '../types/types';\n\nexport type MarkReadWrapperOptions = {\n  /**\n   * Signal, whether the `channelUnreadUiState` should be updated.\n   * By default, the local state update is prevented when the Channel component is mounted.\n   * This is in order to keep the UI indicating the original unread state, when the user opens a channel.\n   */\n  updateChannelUiUnreadState?: boolean;\n};\n\nexport type RetrySendMessage = (message: LocalMessage) => Promise<void>;\n\nexport type ChannelActionContextValue = {\n  addNotification: (text: string, type: 'success' | 'error') => void;\n  closeThread: (event?: React.BaseSyntheticEvent) => void;\n  deleteMessage: (\n    message: LocalMessage,\n    options?: DeleteMessageOptions,\n  ) => Promise<MessageResponse>;\n  dispatch: React.Dispatch<ChannelStateReducerAction>;\n  editMessage: (\n    message: LocalMessage | MessageResponse,\n    options?: UpdateMessageOptions,\n  ) => Promise<UpdateMessageAPIResponse | void>;\n  jumpToFirstUnreadMessage: (\n    queryMessageLimit?: number,\n    highlightDuration?: number,\n  ) => Promise<void>;\n  jumpToLatestMessage: () => Promise<void>;\n  jumpToMessage: (\n    messageId: string,\n    limit?: number,\n    highlightDuration?: number,\n  ) => Promise<void>;\n  loadMore: (limit?: number) => Promise<number>;\n  loadMoreNewer: (limit?: number) => Promise<number>;\n  loadMoreThread: () => Promise<void>;\n  markRead: (options?: MarkReadWrapperOptions) => void;\n  onMentionsClick: CustomMentionHandler;\n  onMentionsHover: CustomMentionHandler;\n  openThread: (message: LocalMessage, event?: React.BaseSyntheticEvent) => void;\n  removeMessage: (message: LocalMessage) => void;\n  retrySendMessage: RetrySendMessage;\n  sendMessage: (params: {\n    localMessage: LocalMessage;\n    message: Message;\n    options?: SendMessageOptions;\n  }) => Promise<void>;\n  setChannelUnreadUiState: React.Dispatch<\n    React.SetStateAction<ChannelUnreadUiState | undefined>\n  >;\n  updateMessage: (message: MessageResponse | LocalMessage) => void;\n};\n\nexport const ChannelActionContext = React.createContext<\n  ChannelActionContextValue | undefined\n>(undefined);\n\nexport const ChannelActionProvider = ({\n  children,\n  value,\n}: PropsWithChildren<{\n  value: ChannelActionContextValue;\n}>) => (\n  <ChannelActionContext.Provider value={value as unknown as ChannelActionContextValue}>\n    {children}\n  </ChannelActionContext.Provider>\n);\n\nexport const useChannelActionContext = (componentName?: string) => {\n  const contextValue = useContext(ChannelActionContext);\n\n  if (!contextValue) {\n    console.warn(\n      `The useChannelActionContext hook was called outside of the ChannelActionContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the ${componentName} component.`,\n    );\n\n    return {} as ChannelActionContextValue;\n  }\n\n  return contextValue as unknown as ChannelActionContextValue;\n};\n\n/**\n * Typescript currently does not support partial inference, so if ChannelActionContext\n * typing is desired while using the HOC withChannelActionContext, the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withChannelActionContext = <P extends UnknownType>(\n  Component: React.ComponentType<P>,\n) => {\n  const WithChannelActionContextComponent = (\n    props: Omit<P, keyof ChannelActionContextValue>,\n  ) => {\n    const channelActionContext = useChannelActionContext();\n\n    return <Component {...(props as P)} {...channelActionContext} />;\n  };\n\n  WithChannelActionContextComponent.displayName = (\n    Component.displayName ||\n    Component.name ||\n    'Component'\n  ).replace('Base', '');\n\n  return WithChannelActionContextComponent;\n};\n", "import type { Dispatch, PropsWithChildren, SetStateAction } from 'react';\nimport React, { createContext, useContext } from 'react';\n\nimport type { Channel } from 'stream-chat';\n\nexport type ChannelListContextValue = {\n  /**\n   * State representing the array of loaded channels.\n   * Channels query is executed by default only by ChannelList component in the SDK.\n   */\n  channels: Channel[];\n  /**\n   * Indicator for channel pagination to determine whether more items can be loaded\n   */\n  hasNextPage: boolean;\n  /**\n   * Pagination function to load more channels\n   */\n  loadNextPage(): Promise<void>;\n  /**\n   * Sets the list of Channel objects to be rendered by ChannelList component.\n   */\n  setChannels: Dispatch<SetStateAction<Channel[]>>;\n};\n\nexport const ChannelListContext = createContext<ChannelListContextValue | undefined>(\n  undefined,\n);\n\n/**\n * Context provider for components rendered within the `ChannelList`\n */\nexport const ChannelListContextProvider = ({\n  children,\n  value,\n}: PropsWithChildren<{\n  value: ChannelListContextValue;\n}>) => (\n  <ChannelListContext.Provider value={value as unknown as ChannelListContextValue}>\n    {children}\n  </ChannelListContext.Provider>\n);\n\nexport const useChannelListContext = (componentName?: string) => {\n  const contextValue = useContext(ChannelListContext);\n\n  if (!contextValue) {\n    console.warn(\n      `The useChannelListContext hook was called outside of the ChannelListContext provider. Make sure this hook is called within the ChannelList component. The errored call is located in the ${componentName} component.`,\n    );\n\n    return {} as ChannelListContextValue;\n  }\n\n  return contextValue as unknown as ChannelListContextValue;\n};\n", "import type { PropsWithChildren } from 'react';\nimport React, { useContext } from 'react';\nimport type {\n  Channel,\n  ChannelConfigWithInfo,\n  LocalMessage,\n  Mute,\n  ChannelState as StreamChannelState,\n} from 'stream-chat';\n\nimport type {\n  ChannelUnreadUiState,\n  GiphyVersions,\n  ImageAttachmentSizeHandler,\n  UnknownType,\n  VideoAttachmentSizeHandler,\n} from '../types/types';\n\nexport type ChannelNotifications = Array<{\n  id: string;\n  text: string;\n  type: 'success' | 'error';\n}>;\n\nexport type ChannelState = {\n  suppressAutoscroll: boolean;\n  error?: Error | null;\n  hasMore?: boolean;\n  hasMoreNewer?: boolean;\n  highlightedMessageId?: string;\n  loading?: boolean;\n  loadingMore?: boolean;\n  loadingMoreNewer?: boolean;\n  members?: StreamChannelState['members'];\n  messages?: LocalMessage[];\n  pinnedMessages?: LocalMessage[];\n  read?: StreamChannelState['read'];\n  thread?: LocalMessage | null;\n  threadHasMore?: boolean;\n  threadLoadingMore?: boolean;\n  threadMessages?: LocalMessage[];\n  threadSuppressAutoscroll?: boolean;\n  typing?: StreamChannelState['typing'];\n  watcherCount?: number;\n  watchers?: StreamChannelState['watchers'];\n};\n\nexport type ChannelStateContextValue = Omit<ChannelState, 'typing'> & {\n  channel: Channel;\n  channelCapabilities: Record<string, boolean>;\n  channelConfig: ChannelConfigWithInfo | undefined;\n  imageAttachmentSizeHandler: ImageAttachmentSizeHandler;\n  notifications: ChannelNotifications;\n  shouldGenerateVideoThumbnail: boolean;\n  videoAttachmentSizeHandler: VideoAttachmentSizeHandler;\n  channelUnreadUiState?: ChannelUnreadUiState;\n  giphyVersion?: GiphyVersions;\n  mutes?: Array<Mute>;\n  watcher_count?: number;\n};\n\nexport const ChannelStateContext = React.createContext<\n  ChannelStateContextValue | undefined\n>(undefined);\n\nexport const ChannelStateProvider = ({\n  children,\n  value,\n}: PropsWithChildren<{\n  value: ChannelStateContextValue;\n}>) => (\n  <ChannelStateContext.Provider value={value as unknown as ChannelStateContextValue}>\n    {children}\n  </ChannelStateContext.Provider>\n);\n\nexport const useChannelStateContext = (componentName?: string) => {\n  const contextValue = useContext(ChannelStateContext);\n\n  if (!contextValue) {\n    console.warn(\n      `The useChannelStateContext hook was called outside of the ChannelStateContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the ${componentName} component.`,\n    );\n\n    return {} as ChannelStateContextValue;\n  }\n\n  return contextValue as unknown as ChannelStateContextValue;\n};\n\n/**\n * Typescript currently does not support partial inference, so if ChannelStateContext\n * typing is desired while using the HOC withChannelStateContext, the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withChannelStateContext = <P extends UnknownType>(\n  Component: React.ComponentType<P>,\n) => {\n  const WithChannelStateContextComponent = (\n    props: Omit<P, keyof ChannelStateContextValue>,\n  ) => {\n    const channelStateContext = useChannelStateContext();\n\n    return <Component {...(props as P)} {...channelStateContext} />;\n  };\n\n  WithChannelStateContextComponent.displayName = (\n    Component.displayName ||\n    Component.name ||\n    'Component'\n  ).replace('Base', '');\n\n  return WithChannelStateContextComponent;\n};\n", "import React, { useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\nimport type {\n  AppSettingsAPIResponse,\n  Channel,\n  Mute,\n  SearchController,\n} from 'stream-chat';\n\nimport { getDisplayName } from './utils/getDisplayName';\nimport type { ChatProps } from '../components/Chat/Chat';\nimport type { UnknownType } from '../types/types';\nimport type { ChannelsQueryState } from '../components/Chat/hooks/useChannelsQueryState';\n\ntype CSSClasses =\n  | 'chat'\n  | 'chatContainer'\n  | 'channel'\n  | 'channelList'\n  | 'message'\n  | 'messageList'\n  | 'thread'\n  | 'threadList'\n  | 'virtualMessage'\n  | 'virtualizedMessageList';\n\nexport type CustomClasses = Partial<Record<CSSClasses, string>>;\n\ntype ChannelConfId = string; // e.g.: \"messaging:general\"\n\nexport type ChatContextValue = {\n  /**\n   * Indicates, whether a channels query has been triggered within ChannelList by its channels pagination controller.\n   */\n  channelsQueryState: ChannelsQueryState;\n  closeMobileNav: () => void;\n  getAppSettings: () => Promise<AppSettingsAPIResponse> | null;\n  latestMessageDatesByChannels: Record<ChannelConfId, Date>;\n  mutes: Array<Mute>;\n  openMobileNav: () => void;\n  /** Instance of SearchController class that allows to control all the search operations. */\n  searchController: SearchController;\n  /**\n   * Sets active channel to be rendered within Channel component.\n   * @param newChannel\n   * @param watchers\n   * @param event\n   */\n  setActiveChannel: (\n    newChannel?: Channel,\n    watchers?: { limit?: number; offset?: number },\n    event?: React.BaseSyntheticEvent,\n  ) => void;\n  useImageFlagEmojisOnWindows: boolean;\n  /**\n   * Active channel used to render the contents of the Channel component.\n   */\n  channel?: Channel;\n  /**\n   * Object through which custom classes can be set for main container components of the SDK.\n   */\n  customClasses?: CustomClasses;\n  navOpen?: boolean;\n} & Partial<Pick<ChatProps, 'isMessageAIGenerated'>> &\n  Required<Pick<ChatProps, 'theme' | 'client'>>;\n\nexport const ChatContext = React.createContext<ChatContextValue | undefined>(undefined);\n\nexport const ChatProvider = ({\n  children,\n  value,\n}: PropsWithChildren<{\n  value: ChatContextValue;\n}>) => (\n  <ChatContext.Provider value={value as unknown as ChatContextValue}>\n    {children}\n  </ChatContext.Provider>\n);\n\nexport const useChatContext = (componentName?: string) => {\n  const contextValue = useContext(ChatContext);\n\n  if (!contextValue) {\n    console.warn(\n      `The useChatContext hook was called outside of the ChatContext provider. Make sure this hook is called within a child of the Chat component. The errored call is located in the ${componentName} component.`,\n    );\n\n    return {} as ChatContextValue;\n  }\n\n  return contextValue as unknown as ChatContextValue;\n};\n\n/**\n * Typescript currently does not support partial inference so if ChatContext\n * typing is desired while using the HOC withChatContext the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withChatContext = <P extends UnknownType>(\n  Component: React.ComponentType<P>,\n) => {\n  const WithChatContextComponent = (props: Omit<P, keyof ChatContextValue>) => {\n    const chatContext = useChatContext();\n\n    return <Component {...(props as P)} {...chatContext} />;\n  };\n  WithChatContextComponent.displayName = `WithChatContext${getDisplayName(Component)}`;\n  return WithChatContextComponent;\n};\n", "import type { UnknownType } from '../../types/types';\n\nexport const getDisplayName = <P extends UnknownType>(\n  Component: React.ComponentType<P>,\n) => Component.displayName || Component.name || 'Component';\n", "import type { PropsWithChildren } from 'react';\nimport React, { useContext } from 'react';\n\nimport type {\n  AttachmentPreviewListProps,\n  AttachmentProps,\n  AvatarProps,\n  BaseImageProps,\n  ChannelPreviewActionButtonsProps,\n  CooldownTimerProps,\n  CustomMessageActionsListProps,\n  DateSeparatorProps,\n  EditMessageModalProps,\n  EmojiSearchIndex,\n  EmptyStateIndicatorProps,\n  EventComponentProps,\n  FixedHeightMessageProps,\n  GiphyPreviewMessageProps,\n  LoadingIndicatorProps,\n  MessageBouncePromptProps,\n  MessageDeletedProps,\n  MessageInputProps,\n  MessageListNotificationsProps,\n  MessageNotificationProps,\n  MessageOptionsProps,\n  MessageProps,\n  MessageRepliesCountButtonProps,\n  MessageStatusProps,\n  MessageTimestampProps,\n  MessageUIComponentProps,\n  ModalGalleryProps,\n  ModalProps,\n  PinIndicatorProps,\n  PollCreationDialogProps,\n  PollOptionSelectorProps,\n  QuotedMessagePreviewProps,\n  ReactionOptions,\n  ReactionSelectorProps,\n  ReactionsListModalProps,\n  ReactionsListProps,\n  RecordingPermissionDeniedNotificationProps,\n  ReminderNotificationProps,\n  SendButtonProps,\n  StartRecordingAudioButtonProps,\n  StreamedMessageTextProps,\n  TextareaComposerProps,\n  ThreadHeaderProps,\n  ThreadListItemProps,\n  ThreadListItemUIProps,\n  TimestampProps,\n  TypingIndicatorProps,\n  UnreadMessagesNotificationProps,\n  UnreadMessagesSeparatorProps,\n} from '../components';\n\nimport type {\n  SuggestionItemProps,\n  SuggestionListProps,\n} from '../components/TextareaComposer';\n\nimport type {\n  SearchProps,\n  SearchResultsPresearchProps,\n  SearchSourceResultListProps,\n} from '../experimental';\n\nimport type { PropsWithChildrenOnly, UnknownType } from '../types/types';\nimport type { StopAIGenerationButtonProps } from '../components/MessageInput/StopAIGenerationButton';\nimport type { ShareLocationDialogProps } from '../components/Location';\n\nexport type ComponentContextValue = {\n  /** Custom UI component to display a message attachment, defaults to and accepts same props as: [Attachment](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Attachment.tsx) */\n  Attachment?: React.ComponentType<AttachmentProps>;\n  /** Custom UI component to display an attachment previews in MessageInput, defaults to and accepts same props as: [Attachment](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/AttachmentPreviewList.tsx) */\n  AttachmentPreviewList?: React.ComponentType<AttachmentPreviewListProps>;\n  /** Custom UI component to control adding attachments to MessageInput, defaults to and accepts same props as: [AttachmentSelector](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/AttachmentSelector.tsx) */\n  AttachmentSelector?: React.ComponentType;\n  /** Custom UI component for contents of attachment selector initiation button */\n  AttachmentSelectorInitiationButtonContents?: React.ComponentType;\n  /** Custom UI component to display AudioRecorder in MessageInput, defaults to and accepts same props as: [AudioRecorder](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/AudioRecorder.tsx) */\n  AudioRecorder?: React.ComponentType;\n  /** Optional UI component to override the default suggestion Item component, defaults to and accepts same props as: [Item](https://github.com/GetStream/stream-chat-react/blob/master/src/components/AutoCompleteTextarea/Item.js) */\n  AutocompleteSuggestionItem?: React.ComponentType<SuggestionItemProps>;\n  /** Optional UI component to override the default List component that displays suggestions, defaults to and accepts same props as: [List](https://github.com/GetStream/stream-chat-react/blob/master/src/components/AutoCompleteTextarea/List.js) */\n  AutocompleteSuggestionList?: React.ComponentType<SuggestionListProps>;\n  /** UI component to display a user's avatar, defaults to and accepts same props as: [Avatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/Avatar.tsx) */\n  Avatar?: React.ComponentType<AvatarProps>;\n  /** Custom UI component to display <img/> elements resp. a fallback in case of load error, defaults to and accepts same props as: [BaseImage](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/BaseImage.tsx) */\n  BaseImage?: React.ComponentType<BaseImageProps>;\n  /** Custom UI component to display set of action buttons within `ChannelPreviewMessenger` component, accepts same props as: [ChannelPreviewActionButtons](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/ChannelPreviewActionButtons.tsx) */\n  ChannelPreviewActionButtons?: React.ComponentType<ChannelPreviewActionButtonsProps>;\n  /** Custom UI component to display the slow mode cooldown timer, defaults to and accepts same props as: [CooldownTimer](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/CooldownTimer.tsx) */\n  CooldownTimer?: React.ComponentType<CooldownTimerProps>;\n  /** Custom UI component to render set of buttons to be displayed in the MessageActionsBox, defaults to and accepts same props as: [CustomMessageActionsList](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageActions/CustomMessageActionsList.tsx) */\n  CustomMessageActionsList?: React.ComponentType<CustomMessageActionsListProps>;\n  /** Custom UI component for date separators, defaults to and accepts same props as: [DateSeparator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/DateSeparator.tsx) */\n  DateSeparator?: React.ComponentType<DateSeparatorProps>;\n  /** Custom UI component to override default edit message input, defaults to and accepts same props as: [EditMessageForm](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/EditMessageForm.tsx) */\n  EditMessageInput?: React.ComponentType<MessageInputProps>;\n  /** Custom UI component to override default EditMessageModal, defaults to and accepts same props as: [EditMessageModal](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/EditMessageForm.tsx) */\n  EditMessageModal?: React.ComponentType<EditMessageModalProps>;\n  /** Custom UI component for rendering button with emoji picker in MessageInput */\n  EmojiPicker?: React.ComponentType;\n  /** Mechanism to be used with autocomplete and text replace features of the `MessageInput` component, see [emoji-mart `SearchIndex`](https://github.com/missive/emoji-mart#%EF%B8%8F%EF%B8%8F-headless-search) */\n  emojiSearchIndex?: EmojiSearchIndex;\n  /** Custom UI component to be displayed when the `MessageList` is empty, defaults to and accepts same props as: [EmptyStateIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/EmptyStateIndicator/EmptyStateIndicator.tsx)  */\n  EmptyStateIndicator?: React.ComponentType<EmptyStateIndicatorProps>;\n  /**\n   * Custom UI component for file upload icon, defaults to and accepts same props as: [FileUploadIcon](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/icons.tsx)\n   * @deprecated use AttachmentSelectorInitiationButtonContents prop instead\n   */\n  FileUploadIcon?: React.ComponentType;\n  /** Custom UI component to render a Giphy preview in the `VirtualizedMessageList` */\n  GiphyPreviewMessage?: React.ComponentType<GiphyPreviewMessageProps>;\n  /** Custom UI component to render at the top of the `MessageList` */\n  HeaderComponent?: React.ComponentType;\n  /** Custom UI component handling how the message input is rendered, defaults to and accepts the same props as [MessageInputFlat](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/MessageInputFlat.tsx) */\n  Input?: React.ComponentType<MessageInputProps>;\n  /** Custom component to render link previews in message input **/\n  LinkPreviewList?: React.ComponentType;\n  /** Custom UI component to render while the `MessageList` is loading new messages, defaults to and accepts same props as: [LoadingIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Loading/LoadingIndicator.tsx) */\n  LoadingIndicator?: React.ComponentType<LoadingIndicatorProps>;\n  /** Custom UI component to display a message in the standard `MessageList`, defaults to and accepts the same props as: [MessageSimple](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageSimple.tsx) */\n  Message?: React.ComponentType<MessageUIComponentProps>;\n  /** Custom UI component for message actions popup, accepts no props, all the defaults are set within [MessageActions (unstable)](https://github.com/GetStream/stream-chat-react/blob/master/src/experimental/MessageActions/MessageActions.tsx) */\n  MessageActions?: React.ComponentType;\n  /** Custom UI component to display the contents of a bounced message modal. Usually it allows to retry, edit, or delete the message. Defaults to and accepts the same props as: [MessageBouncePrompt](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageBounce/MessageBouncePrompt.tsx) */\n  MessageBouncePrompt?: React.ComponentType<MessageBouncePromptProps>;\n  /** Custom UI component for a moderation-blocked message, defaults to and accepts same props as: [MessageBlocked](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageBlocked.tsx) */\n  MessageBlocked?: React.ComponentType;\n  /** Custom UI component for a deleted message, defaults to and accepts same props as: [MessageDeleted](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageDeleted.tsx) */\n  MessageDeleted?: React.ComponentType<MessageDeletedProps>;\n  /** Custom UI component for an indicator that a message is a thread reply sent to channel list: [MessageIsThreadReplyInChannelButtonIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageIsThreadReplyInChannelButtonIndicator.tsx) */\n  MessageIsThreadReplyInChannelButtonIndicator?: React.ComponentType;\n  MessageListMainPanel?: React.ComponentType<PropsWithChildrenOnly>;\n  /** Custom UI component that displays message and connection status notifications in the `MessageList`, defaults to and accepts same props as [DefaultMessageListNotifications](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageList/MessageListNotifications.tsx) */\n  MessageListNotifications?: React.ComponentType<MessageListNotificationsProps>;\n  /** Custom UI component to display a notification when scrolled up the list and new messages arrive, defaults to and accepts same props as [MessageNotification](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageList/MessageNotification.tsx) */\n  MessageNotification?: React.ComponentType<MessageNotificationProps>;\n  /**\n   * Custom UI component for message options popup, defaults to and accepts same props as: [MessageOptions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageOptions.tsx)\n   *\n   * @deprecated Use MessageActions property instead.\n   */\n  MessageOptions?: React.ComponentType<MessageOptionsProps>;\n  /** Custom UI component to display message replies, defaults to and accepts same props as: [MessageRepliesCountButton](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageRepliesCountButton.tsx) */\n  MessageRepliesCountButton?: React.ComponentType<MessageRepliesCountButtonProps>;\n  /** Custom UI component to display message delivery status, defaults to and accepts same props as: [MessageStatus](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageStatus.tsx) */\n  MessageStatus?: React.ComponentType<MessageStatusProps>;\n  /** Custom UI component to display system messages, defaults to and accepts same props as: [EventComponent](https://github.com/GetStream/stream-chat-react/blob/master/src/components/EventComponent/EventComponent.tsx) */\n  MessageSystem?: React.ComponentType<EventComponentProps>;\n  /** Custom UI component to display a timestamp on a message, defaults to and accepts same props as: [MessageTimestamp](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageTimestamp.tsx) */\n  MessageTimestamp?: React.ComponentType<MessageTimestampProps>;\n  /** Custom UI component for viewing content in a modal, defaults to and accepts the same props as [Modal](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Modal/Modal.tsx) */\n  Modal?: React.ComponentType<ModalProps>;\n  /** Custom UI component for viewing message's image attachments, defaults to and accepts the same props as [ModalGallery](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/ModalGallery.tsx) */\n  ModalGallery?: React.ComponentType<ModalGalleryProps>;\n  /** Custom UI component to override default pinned message indicator, defaults to and accepts same props as: [PinIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/icons.tsx) */\n  PinIndicator?: React.ComponentType<PinIndicatorProps>;\n  /** Custom UI component to override default poll actions rendering in a message, defaults to and accepts same props as: [PollActions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollActions/PollActions.tsx) */\n  PollActions?: React.ComponentType;\n  /** Custom UI component to override default poll rendering in a message, defaults to and accepts same props as: [PollContent](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollContent.tsx) */\n  PollContent?: React.ComponentType;\n  /** Custom UI component to override default poll creation dialog contents, defaults to and accepts same props as: [PollCreationDialog](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx) */\n  PollCreationDialog?: React.ComponentType<PollCreationDialogProps>;\n  /** Custom UI component to override default poll header in a message, defaults to and accepts same props as: [PollHeader](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollHeader.tsx) */\n  PollHeader?: React.ComponentType;\n  /** Custom UI component to override default poll option selector, defaults to and accepts same props as: [PollOptionSelector](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollOptionSelector.tsx) */\n  PollOptionSelector?: React.ComponentType<PollOptionSelectorProps>;\n  /** Custom UI component to override quoted message UI on a sent message, defaults to and accepts same props as: [QuotedMessage](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/QuotedMessage.tsx) */\n  QuotedMessage?: React.ComponentType;\n  /** Custom UI component to override the message input's quoted message preview, defaults to and accepts same props as: [QuotedMessagePreview](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/QuotedMessagePreview.tsx) */\n  QuotedMessagePreview?: React.ComponentType<QuotedMessagePreviewProps>;\n  /** Custom UI component to override the rendering of quoted poll, defaults to and accepts same props as: [QuotedPoll](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/QuotedPoll.tsx) */\n  QuotedPoll?: React.ComponentType;\n  /** Custom reaction options to be applied to ReactionSelector, ReactionList and SimpleReactionList components */\n  reactionOptions?: ReactionOptions;\n  /** Custom UI component to display the reaction selector, defaults to and accepts same props as: [ReactionSelector](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Reactions/ReactionSelector.tsx) */\n  ReactionSelector?: React.ForwardRefExoticComponent<ReactionSelectorProps>;\n  /** Custom UI component to display the list of reactions on a message, defaults to and accepts same props as: [ReactionsList](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Reactions/ReactionsList.tsx) */\n  ReactionsList?: React.ComponentType<ReactionsListProps>;\n  /** Custom UI component to display the reactions modal, defaults to and accepts same props as: [ReactionsListModal](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Reactions/ReactionsListModal.tsx) */\n  ReactionsListModal?: React.ComponentType<ReactionsListModalProps>;\n  RecordingPermissionDeniedNotification?: React.ComponentType<RecordingPermissionDeniedNotificationProps>;\n  /** Custom UI component to display the message reminder information in the Message UI, defaults to and accepts same props as: [ReminderNotification](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/ReminderNotification.tsx) */\n  ReminderNotification?: React.ComponentType<ReminderNotificationProps>;\n  /** Custom component to display the search UI, defaults to and accepts same props as: [Search](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Search/Search.tsx) */\n  Search?: React.ComponentType<SearchProps>;\n  /** Custom component to display the UI where the searched string is entered, defaults to and accepts same props as: [SearchBar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Search/SearchBar/SearchBar.tsx) */\n  SearchBar?: React.ComponentType;\n  /** Custom component for the search UI dedicated to display the results area, defaults to and accepts same props as: [SearchResults](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Search/SearchResults/SearchResults.tsx) */\n  SearchResults?: React.ComponentType;\n  /** Custom UI component to display header of search results pane, defaults to and accepts same props as: [SearchResultsHeader](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Search/SearchResults/SearchResultsHeader.tsx) */\n  SearchResultsHeader?: React.ComponentType;\n  /** Custom component to display search results pane before emitting the first search query for a given source, defaults to and accepts same props as: [SearchResultsPresearch](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Search/SearchResults/SearchSourceResultsPresearch.tsx) */\n  SearchResultsPresearch?: React.ComponentType<SearchResultsPresearchProps>;\n  /** Custom component to display the search source items results, defaults to and accepts same props as: [SearchSourceResultList](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Search/SearchResults/SearchSourceResultList.tsx) */\n  SearchSourceResultList?: React.ComponentType<SearchSourceResultListProps>;\n  /** Custom component to indicate the end of the last page for a searched source, defaults to and accepts same props as: [SearchSourceResultListFooter](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Search/SearchResults/SearchSourceResultListFooter.tsx) */\n  SearchSourceResultListFooter?: React.ComponentType;\n  /** Custom UI component to display search results items for a given search source pane, defaults to and accepts same props as: [SearchSourceResults](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Search/SearchResults/SourceSearchResults.tsx) */\n  SearchSourceResults?: React.ComponentType;\n  /** Custom component to display the search source results UI with 0 items found, defaults to and accepts same props as: [SearchSourceResultsEmpty](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Search/SearchResults/SearchSourceResultsEmpty.tsx) */\n  SearchSourceResultsEmpty?: React.ComponentType;\n  /** Custom component to display the header content for a given search source results, no default component is provided. */\n  SearchSourceResultsHeader?: React.ComponentType;\n  /** Custom component to display the search source results UI during the search query execution, defaults to and accepts same props as: [SearchSourceResultsLoadingIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.tsx) */\n  SearchSourceResultsLoadingIndicator?: React.ComponentType;\n  /** Custom UI component for send button, defaults to and accepts same props as: [SendButton](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/icons.tsx) */\n  SendButton?: React.ComponentType<SendButtonProps>;\n  /** Custom UI component checkbox that indicates message to be sent to main channel, defaults to and accepts same props as: [SendToChannelCheckbox](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/SendToChannelCheckbox.tsx) */\n  SendToChannelCheckbox?: React.ComponentType;\n  /** Custom UI component to render the location sharing dialog, defaults to and accepts same props as: [ShareLocationDialog](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Location/ShareLocationDialog.tsx) */\n  ShareLocationDialog?: React.ComponentType<ShareLocationDialogProps>;\n  /** Custom UI component button for initiating audio recording, defaults to and accepts same props as: [StartRecordingAudioButton](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MediaRecorder/AudioRecorder/AudioRecordingButtons.tsx) */\n  StartRecordingAudioButton?: React.ComponentType<StartRecordingAudioButtonProps>;\n  StopAIGenerationButton?: React.ComponentType<StopAIGenerationButtonProps> | null;\n  StreamedMessageText?: React.ComponentType<StreamedMessageTextProps>;\n  /** Custom UI component to handle message text input, defaults to and accepts same props as [TextareaComposer](https://github.com/GetStream/stream-chat-react/blob/master/src/components/TextareaComposer/TextareaComposer.tsx) */\n  TextareaComposer?: React.ComponentType<TextareaComposerProps>;\n  /** Custom UI component that displays thread's parent or other message at the top of the `MessageList`, defaults to and accepts same props as [MessageSimple](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageSimple.tsx) */\n  ThreadHead?: React.ComponentType<MessageProps>;\n  /** Custom UI component to display the header of a `Thread`, defaults to and accepts same props as: [DefaultThreadHeader](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Thread/Thread.tsx) */\n  ThreadHeader?: React.ComponentType<ThreadHeaderProps>;\n  ThreadInput?: React.ComponentType<MessageInputProps>;\n  ThreadListEmptyPlaceholder?: React.ComponentType;\n  ThreadListItem?: React.ComponentType<ThreadListItemProps>;\n  ThreadListItemUI?: React.ComponentType<ThreadListItemUIProps>;\n  ThreadListLoadingIndicator?: React.ComponentType;\n  ThreadListUnseenThreadsBanner?: React.ComponentType;\n  /** Custom UI component to display the start of a threaded `MessageList`, defaults to and accepts same props as: [DefaultThreadStart](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Thread/Thread.tsx) */\n  ThreadStart?: React.ComponentType;\n  /** Custom UI component to display a date used in timestamps. It's used internally by the default `MessageTimestamp`, and to display a timestamp for edited messages. */\n  Timestamp?: React.ComponentType<TimestampProps>;\n  /** Custom UI component for the typing indicator, defaults to and accepts same props as: [TypingIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/TypingIndicator/TypingIndicator.tsx) */\n  TypingIndicator?: React.ComponentType<TypingIndicatorProps>;\n  /** Custom UI component that indicates a user is viewing unread messages. It disappears once the user scrolls to UnreadMessagesSeparator. Defaults to and accepts same props as: [UnreadMessagesNotification](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageList/UnreadMessagesNotification.tsx) */\n  UnreadMessagesNotification?: React.ComponentType<UnreadMessagesNotificationProps>;\n  /** Custom UI component that separates read messages from unread, defaults to and accepts same props as: [UnreadMessagesSeparator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageList/UnreadMessagesSeparator.tsx) */\n  UnreadMessagesSeparator?: React.ComponentType<UnreadMessagesSeparatorProps>;\n  /** Custom UI component to display a message in the `VirtualizedMessageList`, does not have a default implementation */\n  VirtualMessage?: React.ComponentType<FixedHeightMessageProps>;\n  /** Custom UI component to wrap MessageList children. Default is the `ul` tag */\n  MessageListWrapper?: React.ComponentType<PropsWithChildren>;\n  /** Custom UI component to wrap each element of MessageList. Default is the `li` tag */\n  MessageListItem?: React.ComponentType<PropsWithChildren>;\n};\n\nexport const ComponentContext = React.createContext<ComponentContextValue>({});\n\nexport const ComponentProvider = ({\n  children,\n  value,\n}: PropsWithChildren<{\n  value: Partial<ComponentContextValue>;\n}>) => (\n  <ComponentContext.Provider value={value as unknown as ComponentContextValue}>\n    {children}\n  </ComponentContext.Provider>\n);\n\nexport const useComponentContext = (\n  /**\n   * @deprecated\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  _componentName?: string,\n) => useContext(ComponentContext) as unknown as ComponentContextValue;\n\n/**\n * Typescript currently does not support partial inference, so if ComponentContext\n * typing is desired while using the HOC withComponentContext, the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withComponentContext = <P extends UnknownType>(\n  Component: React.ComponentType<P>,\n) => {\n  const WithComponentContextComponent = (props: Omit<P, keyof ComponentContextValue>) => {\n    const componentContext = useComponentContext();\n\n    return <Component {...(props as P)} {...componentContext} />;\n  };\n\n  WithComponentContextComponent.displayName = (\n    Component.displayName ||\n    Component.name ||\n    'Component'\n  ).replace('Base', '');\n\n  return WithComponentContextComponent;\n};\n", "import React, {\n  type PropsWithChildren,\n  useContext,\n  useEffect,\n  useMemo,\n  useState,\n} from 'react';\nimport { StateStore } from 'stream-chat';\n\nimport { DialogManager } from '../components/Dialog/DialogManager';\nimport { DialogPortalDestination } from '../components/Dialog/DialogPortal';\nimport type { PropsWithChildrenOnly } from '../types/types';\n\ntype DialogManagerId = string;\n\ntype DialogManagersState = Record<DialogManagerId, DialogManager | undefined>;\nconst dialogManagersRegistry: StateStore<DialogManagersState> = new StateStore({});\n\nconst getDialogManager = (id: string): DialogManager | undefined =>\n  dialogManagersRegistry.getLatestValue()[id];\n\nconst getOrCreateDialogManager = (id: string) => {\n  let manager = getDialogManager(id);\n  if (!manager) {\n    manager = new DialogManager({ id });\n    dialogManagersRegistry.partialNext({ [id]: manager });\n  }\n  return manager;\n};\n\nconst removeDialogManager = (id: string) => {\n  if (!getDialogManager(id)) return;\n  dialogManagersRegistry.partialNext({ [id]: undefined });\n};\n\ntype DialogManagerProviderContextValue = {\n  dialogManager: DialogManager;\n};\n\nconst DialogManagerProviderContext = React.createContext<\n  DialogManagerProviderContextValue | undefined\n>(undefined);\n\n/**\n * Marks the portal location\n * @param children\n * @param id\n * @constructor\n */\nexport const DialogManagerProvider = ({\n  children,\n  id,\n}: PropsWithChildren<{ id?: string }>) => {\n  const [dialogManager, setDialogManager] = useState<DialogManager | null>(() => {\n    if (id) return getDialogManager(id) ?? null;\n    return new DialogManager(); // will not be included in the registry\n  });\n\n  useEffect(() => {\n    if (!id) return;\n    setDialogManager(getOrCreateDialogManager(id));\n    return () => {\n      removeDialogManager(id);\n      setDialogManager(null);\n    };\n  }, [id]);\n\n  // temporarily do not render until a new dialog manager is created\n  if (!dialogManager) return null;\n\n  return (\n    <DialogManagerProviderContext.Provider value={{ dialogManager }}>\n      {children}\n      <DialogPortalDestination />\n    </DialogManagerProviderContext.Provider>\n  );\n};\n\nexport type UseDialogManagerParams = {\n  dialogId?: string;\n  dialogManagerId?: string;\n};\n\nconst getManagerFromStore = ({\n  dialogId,\n  dialogManagerId,\n  newState,\n  previousState,\n}: UseDialogManagerParams & {\n  newState: DialogManagersState;\n  previousState: DialogManagersState | undefined;\n}) => {\n  let managerInNewState: DialogManager | undefined;\n  let managerInPrevState: DialogManager | undefined;\n  if (dialogManagerId) {\n    if (!dialogId) {\n      managerInNewState = newState[dialogManagerId];\n      managerInPrevState = previousState?.[dialogManagerId];\n    } else {\n      if (newState[dialogManagerId]?.get(dialogId)) {\n        managerInNewState = newState[dialogManagerId];\n      }\n      if (previousState?.[dialogManagerId]?.get(dialogId)) {\n        managerInPrevState = previousState[dialogManagerId];\n      }\n    }\n  } else if (dialogId) {\n    managerInNewState = Object.values(newState).find(\n      (dialogMng) => dialogId && dialogMng?.get(dialogId),\n    );\n    managerInPrevState =\n      previousState &&\n      Object.values(previousState).find(\n        (dialogMng) => dialogId && dialogMng?.get(dialogId),\n      );\n  }\n\n  return { managerInNewState, managerInPrevState };\n};\n\n/**\n * Retrieves the nearest dialog manager or searches for the dialog manager by dialog manager id or dialog id.\n * Dialog id will take precedence over dialog manager id if both are provided and dialog manager is found by dialog id.\n */\nexport const useDialogManager = ({\n  dialogId,\n  dialogManagerId,\n}: UseDialogManagerParams = {}) => {\n  const nearestDialogManagerContext = useContext(DialogManagerProviderContext);\n\n  const [dialogManagerContext, setDialogManagerContext] = useState<\n    DialogManagerProviderContextValue | undefined\n  >(() => {\n    const { managerInNewState } = getManagerFromStore({\n      dialogId,\n      dialogManagerId,\n      newState: dialogManagersRegistry.getLatestValue(),\n      previousState: undefined,\n    });\n    return managerInNewState\n      ? { dialogManager: managerInNewState }\n      : nearestDialogManagerContext;\n  });\n\n  useEffect(() => {\n    if (!dialogId && !dialogManagerId) return;\n    const unsubscribe = dialogManagersRegistry.subscribeWithSelector(\n      (state) => state,\n      (newState, previousState) => {\n        const { managerInNewState, managerInPrevState } = getManagerFromStore({\n          dialogId,\n          dialogManagerId,\n          newState,\n          previousState,\n        });\n\n        if (!managerInPrevState || managerInNewState?.id !== managerInPrevState.id) {\n          setDialogManagerContext((prevState) => {\n            if (prevState?.dialogManager.id === managerInNewState?.id) return prevState;\n            // fixme: need to handle the possibility that the dialogManager is undefined\n            return {\n              dialogManager:\n                managerInNewState || nearestDialogManagerContext?.dialogManager,\n            } as DialogManagerProviderContextValue;\n          });\n        }\n      },\n    );\n    return () => {\n      unsubscribe();\n    };\n  }, [dialogId, dialogManagerId, nearestDialogManagerContext?.dialogManager]);\n\n  if (!dialogManagerContext?.dialogManager) {\n    console.warn(\n      `Dialog manager (manager id: ${dialogManagerId}, dialog id: ${dialogId}) is not available`,\n    );\n  }\n\n  return dialogManagerContext as DialogManagerProviderContextValue;\n};\n\nexport const modalDialogManagerId = 'modal-dialog-manager' as const;\n\nexport const ModalDialogManagerProvider = ({ children }: PropsWithChildrenOnly) => (\n  <DialogManagerProvider id={modalDialogManagerId}>{children}</DialogManagerProvider>\n);\n\nexport const useModalDialogManager = () =>\n  useMemo(() => getDialogManager(modalDialogManagerId), []);\n\nexport const useNearestDialogManagerContext = () =>\n  useContext(DialogManagerProviderContext);\n", "import { nanoid } from 'nanoid';\nimport { StateStore } from 'stream-chat';\n\nexport type GetDialogParams = {\n  id: DialogId;\n};\nexport type GetOrCreateDialogParams = GetDialogParams;\n\ntype DialogId = string;\n\nexport type Dialog = {\n  close: () => void;\n  id: DialogId;\n  isOpen: boolean | undefined;\n  open: (zIndex?: number) => void;\n  removalTimeout: NodeJS.Timeout | undefined;\n  remove: () => void;\n  toggle: (closeAll?: boolean) => void;\n};\n\nexport type DialogManagerOptions = {\n  id?: string;\n};\n\ntype Dialogs = Record<DialogId, Dialog>;\n\nexport type DialogManagerState = {\n  dialogsById: Dialogs;\n};\n\n/**\n * Keeps a map of Dialog objects.\n * Dialog can be controlled via `Dialog` object retrieved using `useDialog()` hook.\n * The hook returns an object with the following API:\n *\n * - `dialog.open()` - opens the dialog\n * - `dialog.close()` - closes the dialog\n * - `dialog.toggle()` - toggles the dialog open state. Accepts boolean argument closeAll. If enabled closes any other dialog that would be open.\n * - `dialog.remove()` - removes the dialog object reference from the state (primarily for cleanup purposes)\n */\nexport class DialogManager {\n  id: string;\n  state = new StateStore<DialogManagerState>({\n    dialogsById: {},\n  });\n\n  constructor({ id }: DialogManagerOptions = {}) {\n    this.id = id ?? nanoid();\n  }\n\n  get openDialogCount() {\n    return Object.values(this.state.getLatestValue().dialogsById).reduce(\n      (count, dialog) => {\n        if (dialog.isOpen) return count + 1;\n        return count;\n      },\n      0,\n    );\n  }\n\n  get(id: DialogId) {\n    return this.state.getLatestValue().dialogsById[id];\n  }\n\n  getOrCreate({ id }: GetOrCreateDialogParams) {\n    let dialog = this.state.getLatestValue().dialogsById[id];\n    if (!dialog) {\n      dialog = {\n        close: () => {\n          this.close(id);\n        },\n        id,\n        isOpen: false,\n        open: () => {\n          this.open({ id });\n        },\n        removalTimeout: undefined,\n        remove: () => {\n          this.remove(id);\n        },\n        toggle: (closeAll = false) => {\n          this.toggle({ id }, closeAll);\n        },\n      };\n      this.state.next((current) => ({\n        ...current,\n        ...{ dialogsById: { ...current.dialogsById, [id]: dialog } },\n      }));\n    }\n\n    if (dialog.removalTimeout) {\n      clearTimeout(dialog.removalTimeout);\n      this.state.next((current) => ({\n        ...current,\n        ...{\n          dialogsById: {\n            ...current.dialogsById,\n            [id]: {\n              ...dialog,\n              removalTimeout: undefined,\n            },\n          },\n        },\n      }));\n    }\n\n    return dialog;\n  }\n\n  open(params: GetOrCreateDialogParams, closeRest?: boolean) {\n    const dialog = this.getOrCreate(params);\n    if (dialog.isOpen) return;\n    if (closeRest) {\n      this.closeAll();\n    }\n    this.state.next((current) => ({\n      ...current,\n      dialogsById: { ...current.dialogsById, [dialog.id]: { ...dialog, isOpen: true } },\n    }));\n  }\n\n  close(id: DialogId) {\n    const dialog = this.state.getLatestValue().dialogsById[id];\n    if (!dialog?.isOpen) return;\n    this.state.next((current) => ({\n      ...current,\n      dialogsById: { ...current.dialogsById, [dialog.id]: { ...dialog, isOpen: false } },\n    }));\n  }\n\n  closeAll() {\n    Object.values(this.state.getLatestValue().dialogsById).forEach((dialog) =>\n      dialog.close(),\n    );\n  }\n\n  toggle(params: GetOrCreateDialogParams, closeAll = false) {\n    if (this.state.getLatestValue().dialogsById[params.id]?.isOpen) {\n      this.close(params.id);\n    } else {\n      this.open(params, closeAll);\n    }\n  }\n\n  remove(id: DialogId) {\n    const state = this.state.getLatestValue();\n    const dialog = state.dialogsById[id];\n    if (!dialog) return;\n\n    if (dialog.removalTimeout) {\n      clearTimeout(dialog.removalTimeout);\n    }\n\n    this.state.next((current) => {\n      const newDialogs = { ...current.dialogsById };\n      delete newDialogs[id];\n      return {\n        ...current,\n        dialogsById: newDialogs,\n      };\n    });\n  }\n\n  /**\n   * Marks the dialog state as unused. If the dialog id is referenced again quickly,\n   * the state will not be removed. Otherwise, the state will be removed after\n   * a short timeout.\n   */\n  markForRemoval(id: DialogId) {\n    const dialog = this.state.getLatestValue().dialogsById[id];\n\n    if (!dialog) {\n      return;\n    }\n\n    this.state.next((current) => ({\n      ...current,\n      dialogsById: {\n        ...current.dialogsById,\n        [id]: {\n          ...dialog,\n          removalTimeout: setTimeout(() => {\n            this.remove(id);\n          }, 16),\n        },\n      },\n    }));\n  }\n}\n", "import type { PropsWithChildren } from 'react';\nimport React, { useCallback } from 'react';\nimport { useDialogIsOpen, useOpenedDialogCount } from './hooks';\nimport { Portal } from '../Portal/Portal';\nimport { useDialogManager, useNearestDialogManagerContext } from '../../context';\n\nexport const DialogPortalDestination = () => {\n  const { dialogManager } = useNearestDialogManagerContext() ?? {};\n  const openedDialogCount = useOpenedDialogCount({ dialogManagerId: dialogManager?.id });\n  // const [destinationRoot, setDestinationRoot] = useState<HTMLDivElement | null>(null);\n\n  // todo: allow to configure and then enable\n  // useEffect(() => {\n  //   if (!destinationRoot) return;\n  //   const handleClickOutside = (event: MouseEvent) => {\n  //     if (!destinationRoot?.contains(event.target as Node)) {\n  //       dialogManager?.closeAll();\n  //     }\n  //   };\n  //   document.addEventListener('click', handleClickOutside, { capture: true });\n  //   return () => {\n  //     document.removeEventListener('click', handleClickOutside, { capture: true });\n  //   };\n  // }, [destinationRoot, dialogManager]);\n\n  if (!openedDialogCount) return null;\n\n  return (\n    <div\n      className='str-chat__dialog-overlay'\n      data-str-chat__portal-id={dialogManager?.id}\n      data-testid='str-chat__dialog-overlay'\n      onClick={() => dialogManager?.closeAll()}\n      // ref={setDestinationRoot}\n      style={\n        {\n          '--str-chat__dialog-overlay-height': openedDialogCount > 0 ? '100%' : '0',\n        } as React.CSSProperties\n      }\n    />\n  );\n};\n\ntype DialogPortalEntryProps = {\n  dialogId: string;\n  dialogManagerId?: string;\n};\n\nexport const DialogPortalEntry = ({\n  children,\n  dialogId,\n  dialogManagerId,\n}: PropsWithChildren<DialogPortalEntryProps>) => {\n  const { dialogManager } = useDialogManager({ dialogId, dialogManagerId });\n  const dialogIsOpen = useDialogIsOpen(dialogId, dialogManagerId);\n\n  const getPortalDestination = useCallback(\n    () => document.querySelector(`div[data-str-chat__portal-id=\"${dialogManager.id}\"]`),\n    [dialogManager.id],\n  );\n\n  return (\n    <Portal getPortalDestination={getPortalDestination} isOpen={dialogIsOpen}>\n      {children}\n    </Portal>\n  );\n};\n", "import { useCallback, useEffect } from 'react';\nimport {\n  modalDialogManagerId,\n  useDialogManager,\n  useNearestDialogManagerContext,\n} from '../../../context';\nimport { useStateStore } from '../../../store';\n\nimport type { DialogManagerState, GetOrCreateDialogParams } from '../DialogManager';\n\nexport type UseDialogParams = GetOrCreateDialogParams & {\n  dialogManagerId?: string;\n};\n\nexport const useDialog = ({ dialogManagerId, id }: UseDialogParams) => {\n  const { dialogManager } = useDialogManager({ dialogManagerId });\n\n  useEffect(\n    () => () => {\n      // Since this cleanup can run even if the component is still mounted\n      // and dialog id is unchanged (e.g. in <StrictMode />), it's safer to\n      // mark state as unused and only remove it after a timeout, rather than\n      // to remove it immediately.\n      dialogManager.markForRemoval(id);\n    },\n    [dialogManager, id],\n  );\n\n  return dialogManager.getOrCreate({ id });\n};\n\nexport const useDialogOnNearestManager = ({ id }: Pick<UseDialogParams, 'id'>) => {\n  const { dialogManager } = useNearestDialogManagerContext() ?? {};\n  const dialog = useDialog({ dialogManagerId: dialogManager?.id, id });\n\n  return {\n    dialog,\n    dialogManager,\n  };\n};\n\nexport const modalDialogId = 'modal-dialog' as const;\n\nexport const useModalDialog = () =>\n  useDialog({ dialogManagerId: modalDialogManagerId, id: modalDialogId });\n\nexport const useDialogIsOpen = (id: string, dialogManagerId?: string) => {\n  const { dialogManager } = useDialogManager({ dialogManagerId });\n  const dialogIsOpenSelector = useCallback(\n    ({ dialogsById }: DialogManagerState) => ({ isOpen: !!dialogsById[id]?.isOpen }),\n    [id],\n  );\n  return useStateStore(dialogManager.state, dialogIsOpenSelector).isOpen;\n};\n\nexport const useModalDialogIsOpen = () =>\n  useDialogIsOpen(modalDialogId, modalDialogManagerId);\n\nconst openedDialogCountSelector = (nextValue: DialogManagerState) => ({\n  openedDialogCount: Object.values(nextValue.dialogsById).reduce((count, dialog) => {\n    if (dialog.isOpen) return count + 1;\n    return count;\n  }, 0),\n});\n\nexport const useOpenedDialogCount = ({\n  dialogManagerId,\n}: { dialogManagerId?: string } = {}) => {\n  const { dialogManager } = useDialogManager({ dialogManagerId });\n  return useStateStore(dialogManager.state, openedDialogCountSelector).openedDialogCount;\n};\n", "import { useCallback, useMemo } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\n\nimport type { StateStore } from 'stream-chat';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst noop = () => {};\n\nexport function useStateStore<\n  T extends Record<string, unknown>,\n  O extends Readonly<Record<string, unknown> | Readonly<unknown[]>>,\n>(store: StateStore<T>, selector: (v: T) => O): O;\nexport function useStateStore<\n  T extends Record<string, unknown>,\n  O extends Readonly<Record<string, unknown> | Readonly<unknown[]>>,\n>(store: StateStore<T> | undefined, selector: (v: T) => O): O | undefined;\nexport function useStateStore<\n  T extends Record<string, unknown>,\n  O extends Readonly<Record<string, unknown> | Readonly<unknown[]>>,\n>(store: StateStore<T> | undefined, selector: (v: T) => O) {\n  const wrappedSubscription = useCallback(\n    (onStoreChange: () => void) => {\n      const unsubscribe = store?.subscribeWithSelector(selector, onStoreChange);\n      return unsubscribe ?? noop;\n    },\n    [store, selector],\n  );\n\n  const wrappedSnapshot = useMemo(() => {\n    let cachedTuple: [T, O];\n\n    return () => {\n      const currentValue = store?.getLatestValue();\n\n      if (!currentValue) return undefined;\n\n      // store value hasn't changed, no need to compare individual values\n      if (cachedTuple && cachedTuple[0] === currentValue) {\n        return cachedTuple[1];\n      }\n\n      const newlySelected = selector(currentValue);\n\n      // store value changed but selected values wouldn't have to, double-check selected\n      if (cachedTuple) {\n        let selectededAreEqualToCached = true;\n\n        for (const key in cachedTuple[1]) {\n          if (cachedTuple[1][key] === newlySelected[key]) continue;\n          selectededAreEqualToCached = false;\n          break;\n        }\n\n        if (selectededAreEqualToCached) return cachedTuple[1];\n      }\n\n      cachedTuple = [currentValue, newlySelected];\n      return cachedTuple[1];\n    };\n  }, [store, selector]);\n\n  const state = useSyncExternalStore(wrappedSubscription, wrappedSnapshot);\n\n  return state;\n}\n", "import type { PropsWithChildren, ReactPortal } from 'react';\nimport { useLayoutEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type PortalProps = {\n  getPortalDestination: () => Element | null;\n  isOpen?: boolean;\n};\n\nexport const Portal = ({\n  children,\n  getPortalDestination,\n  isOpen,\n}: PropsWithChildren<PortalProps>): ReactPortal | null => {\n  const [portalDestination, setPortalDestination] = useState<Element | null>(null);\n\n  useLayoutEffect(() => {\n    const destination = getPortalDestination();\n    if (!destination || !isOpen) return;\n    setPortalDestination(destination);\n  }, [getPortalDestination, isOpen]);\n\n  if (!portalDestination) return null;\n\n  return createPortal(children, portalDestination);\n};\n", "import type { BaseSyntheticEvent, PropsWithChildren, ReactNode } from 'react';\nimport React, { useContext } from 'react';\n\nimport type {\n  DeleteMessageOptions,\n  LocalMessage,\n  Mute,\n  ReactionResponse,\n  ReactionSort,\n  UserResponse,\n} from 'stream-chat';\n\nimport type { ChannelActionContextValue } from './ChannelActionContext';\n\nimport type { ActionHandlerReturnType } from '../components/Message/hooks/useActionHandler';\nimport type { PinPermissions } from '../components/Message/hooks/usePinHandler';\nimport type { ReactEventHandler } from '../components/Message/types';\nimport type { MessageActionsArray } from '../components/Message/utils';\nimport type { MessageInputProps } from '../components/MessageInput/MessageInput';\nimport type { GroupStyle } from '../components/MessageList/utils';\nimport type {\n  ReactionDetailsComparator,\n  ReactionsComparator,\n  ReactionType,\n} from '../components/Reactions/types';\n\nimport type { RenderTextOptions } from '../components/Message/renderText';\nimport type { UnknownType } from '../types/types';\n\nexport type CustomMessageActions = {\n  [key: string]: (\n    message: LocalMessage,\n    event: React.BaseSyntheticEvent,\n  ) => Promise<void> | void;\n};\n\nexport type MessageContextValue = {\n  /** If actions such as edit, delete, flag, mute are enabled on Message */\n  actionsEnabled: boolean;\n  /** Function to exit edit state */\n  clearEditingState: (event?: React.BaseSyntheticEvent) => void;\n  /** If the Message is in edit state */\n  editing: boolean;\n  /**\n   * Returns all allowed actions on message by current user e.g., ['edit', 'delete', 'flag', 'mute', 'pin', 'quote', 'react', 'reply'].\n   * Please check [Message](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message.tsx) component for default implementation.\n   */\n  getMessageActions: () => MessageActionsArray<string>;\n  /** Function to send an action in a Channel */\n  handleAction: ActionHandlerReturnType;\n  /** Function to delete a message in a Channel */\n  handleDelete: (\n    event: BaseSyntheticEvent,\n    options?: DeleteMessageOptions,\n  ) => Promise<void> | void;\n  /** Function to edit a message in a Channel */\n  handleEdit: ReactEventHandler;\n  /** Function to fetch the message reactions */\n  handleFetchReactions: (\n    reactionType?: ReactionType,\n    sort?: ReactionSort,\n  ) => Promise<Array<ReactionResponse>>;\n  /** Function to flag a message in a Channel */\n  handleFlag: ReactEventHandler;\n  /** Function to mark message and the messages that follow it as unread in a Channel */\n  handleMarkUnread: ReactEventHandler;\n  /** Function to mute a user in a Channel */\n  handleMute: ReactEventHandler;\n  /** Function to open a Thread on a Message */\n  handleOpenThread: ReactEventHandler;\n  /** Function to pin a Message in a Channel */\n  handlePin: ReactEventHandler;\n  /** Function to post a reaction on a Message */\n  handleReaction: (\n    reactionType: string,\n    event: React.BaseSyntheticEvent,\n  ) => Promise<void>;\n  /** Function to retry sending a Message */\n  handleRetry: ChannelActionContextValue['retrySendMessage'];\n  /** Function that returns whether the Message belongs to the current user */\n  isMyMessage: () => boolean;\n  /** The message object */\n  message: LocalMessage;\n  /** Indicates whether a message has not been read yet or has been marked unread */\n  messageIsUnread: boolean;\n  /** Handler function for a click event on an @mention in Message */\n  onMentionsClickMessage: ReactEventHandler;\n  /** Handler function for a hover event on an @mention in Message */\n  onMentionsHoverMessage: ReactEventHandler;\n  /** Handler function for a click event on the user that posted the Message */\n  onUserClick: ReactEventHandler;\n  /** Handler function for a hover event on the user that posted the Message */\n  onUserHover: ReactEventHandler;\n  /** Function to toggle the edit state on a Message */\n  setEditingState: ReactEventHandler;\n  /** Additional props for underlying MessageInput component, [available props](https://getstream.io/chat/docs/sdk/react/message-input-components/message_input/#props) */\n  additionalMessageInputProps?: MessageInputProps;\n  /** Call this function to keep message list scrolled to the bottom when the scroll height increases, e.g. an element appears below the last message (only used in the `VirtualizedMessageList`) */\n  autoscrollToBottom?: () => void;\n  /** Message component configuration prop. If true, picking a reaction from the `ReactionSelector` component will close the selector */\n  closeReactionSelectorOnClick?: boolean;\n  /** Object containing custom message actions and function handlers */\n  customMessageActions?: CustomMessageActions;\n  /** An array of user IDs that have confirmed the message delivery to their device */\n  deliveredTo?: UserResponse[];\n  /** If true, the message is the last one in a group sent by a specific user (only used in the `VirtualizedMessageList`) */\n  endOfGroup?: boolean;\n  /** If true, the message is the first one in a group sent by a specific user (only used in the `VirtualizedMessageList`) */\n  firstOfGroup?: boolean;\n  /** Override the default formatting of the date. This is a function that has access to the original date object, returns a string  */\n  formatDate?: (date: Date) => string;\n  /** If true, group messages sent by each user (only used in the `VirtualizedMessageList`) */\n  groupedByUser?: boolean;\n  /** A list of styles to apply to this message, ie. top, bottom, single */\n  groupStyles?: GroupStyle[];\n  /** Whether to highlight and focus the message on load */\n  highlighted?: boolean;\n  /** Whether the threaded message is the first in the thread list */\n  initialMessage?: boolean;\n  /**\n   * A factory function that determines whether a message is AI generated or not.\n   */\n  isMessageAIGenerated?: (message: LocalMessage) => boolean;\n  /** Latest own message in currently displayed message set. */\n  lastOwnMessage?: LocalMessage;\n  /** Latest message id on current channel */\n  lastReceivedId?: string | null;\n  /** DOMRect object for parent MessageList component */\n  messageListRect?: DOMRect;\n  /** Array of muted users coming from [ChannelStateContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_state_context/#mutes) */\n  mutes?: Mute[];\n  /** @deprecated in favor of `channelCapabilities - The user roles allowed to pin Messages in various channel types */\n  pinPermissions?: PinPermissions;\n  /** Sort options to provide to a reactions query */\n  reactionDetailsSort?: ReactionSort;\n  /** A list of users that have read this Message */\n  readBy?: UserResponse[];\n  /** Custom function to render message text content, defaults to the renderText function: [utils](https://github.com/GetStream/stream-chat-react/blob/master/src/utils.tsx) */\n  renderText?: (\n    text?: string,\n    mentioned_users?: UserResponse[],\n    options?: RenderTextOptions,\n  ) => ReactNode;\n  /** Keep track of read receipts for each message sent by the user. When disabled, only the last own message delivery / read status is rendered. */\n  returnAllReadData?: boolean;\n  /** Comparator function to sort the list of reacted users\n   * @deprecated use `reactionDetailsSort` instead\n   */\n  sortReactionDetails?: ReactionDetailsComparator;\n  /** Comparator function to sort reactions, defaults to chronological order */\n  sortReactions?: ReactionsComparator;\n  /** Whether or not the Message is in a Thread */\n  threadList?: boolean;\n  /** render HTML instead of markdown. Posting HTML is only allowed server-side */\n  unsafeHTML?: boolean;\n};\n\nexport const MessageContext = React.createContext<MessageContextValue | undefined>(\n  undefined,\n);\n\nexport const MessageProvider = ({\n  children,\n  value,\n}: PropsWithChildren<{\n  value: MessageContextValue;\n}>) => (\n  <MessageContext.Provider value={value as unknown as MessageContextValue}>\n    {children}\n  </MessageContext.Provider>\n);\n\nexport const useMessageContext = (\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  _componentName?: string,\n) => {\n  const contextValue = useContext(MessageContext);\n\n  if (!contextValue) {\n    return {} as MessageContextValue;\n  }\n\n  return contextValue as unknown as MessageContextValue;\n};\n\n/**\n * Typescript currently does not support partial inference, so if MessageContext\n * typing is desired while using the HOC withMessageContext, the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withMessageContext = <P extends UnknownType>(\n  Component: React.ComponentType<P>,\n) => {\n  const WithMessageContextComponent = (props: Omit<P, keyof MessageContextValue>) => {\n    const messageContext = useMessageContext();\n\n    return <Component {...(props as P)} {...messageContext} />;\n  };\n\n  WithMessageContextComponent.displayName = (\n    Component.displayName ||\n    Component.name ||\n    'Component'\n  ).replace('Base', '');\n\n  return WithMessageContextComponent;\n};\n", "import type { ReactEventHandler } from 'react';\nimport React, { createContext, useCallback, useContext, useMemo } from 'react';\nimport { useMessageContext } from './MessageContext';\nimport { useChannelActionContext } from './ChannelActionContext';\nimport { isMessageBounced } from '../components';\nimport type { LocalMessage } from 'stream-chat';\nimport type { PropsWithChildrenOnly } from '../types/types';\n\nexport interface MessageBounceContextValue {\n  handleDelete: ReactEventHandler;\n  handleEdit: ReactEventHandler;\n  handleRetry: ReactEventHandler;\n  message: LocalMessage;\n}\n\nconst MessageBounceContext = createContext<MessageBounceContextValue | undefined>(\n  undefined,\n);\n\nexport function useMessageBounceContext(componentName?: string) {\n  const contextValue = useContext(MessageBounceContext);\n\n  if (!contextValue) {\n    console.warn(\n      `The useMessageBounceContext hook was called outside of the MessageBounceContext provider. The errored call is located in the ${componentName} component.`,\n    );\n\n    return {} as MessageBounceContextValue;\n  }\n\n  return contextValue;\n}\n\nexport function MessageBounceProvider({ children }: PropsWithChildrenOnly) {\n  const {\n    handleRetry: doHandleRetry,\n    message,\n    setEditingState,\n  } = useMessageContext('MessageBounceProvider');\n\n  if (!isMessageBounced(message)) {\n    console.warn(\n      `The MessageBounceProvider was rendered for a message that is not bounced. Have you missed the \"isMessageBounced\" check?`,\n    );\n  }\n\n  const { removeMessage } = useChannelActionContext('MessageBounceProvider');\n\n  const handleDelete: ReactEventHandler = useCallback(() => {\n    removeMessage(message);\n  }, [message, removeMessage]);\n\n  const handleEdit: ReactEventHandler = useCallback(\n    (e) => {\n      setEditingState(e);\n    },\n    [setEditingState],\n  );\n\n  const handleRetry = useCallback(() => {\n    doHandleRetry(message);\n  }, [doHandleRetry, message]);\n\n  const value = useMemo(\n    () => ({\n      handleDelete,\n      handleEdit,\n      handleRetry,\n      message,\n    }),\n    [handleDelete, handleEdit, handleRetry, message],\n  );\n\n  return (\n    <MessageBounceContext.Provider value={value}>\n      {children}\n    </MessageBounceContext.Provider>\n  );\n}\n", "import React, { createContext, useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\n\nimport type { CooldownTimerState, MessageInputProps } from '../components/MessageInput';\nimport type { MessageInputHookProps } from '../components/MessageInput/hooks/useMessageInputControls';\n\nexport type MessageInputContextValue = MessageInputHookProps &\n  Omit<MessageInputProps, 'Input'> &\n  CooldownTimerState;\n\nexport const MessageInputContext = createContext<MessageInputHookProps | undefined>(\n  undefined,\n);\n\nexport const MessageInputContextProvider = ({\n  children,\n  value,\n}: PropsWithChildren<{\n  value: MessageInputContextValue;\n}>) => (\n  <MessageInputContext.Provider value={value as unknown as MessageInputContextValue}>\n    {children}\n  </MessageInputContext.Provider>\n);\n\nexport const useMessageInputContext = (\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  componentName?: string,\n) => {\n  const contextValue = useContext(MessageInputContext);\n\n  if (!contextValue) {\n    return {} as MessageInputContextValue;\n  }\n\n  return contextValue as unknown as MessageInputContextValue;\n};\n", "import React, { createContext, useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\nimport type { RenderedMessage } from '../components';\n\nexport type MessageListContextValue = {\n  /** Enriched message list, including date separators and intro message (if enabled) */\n  processedMessages: RenderedMessage[];\n  /** The scroll container within which the messages and typing indicator are rendered */\n  listElement: HTMLDivElement | null;\n  /** Function that scrolls the `listElement` to the bottom. */\n  scrollToBottom: () => void;\n};\n\nexport const MessageListContext = createContext<MessageListContextValue | undefined>(\n  undefined,\n);\n\n/**\n * Context provider for components rendered within the `MessageList`\n */\nexport const MessageListContextProvider = ({\n  children,\n  value,\n}: PropsWithChildren<{\n  value: MessageListContextValue;\n}>) => (\n  <MessageListContext.Provider value={value as MessageListContextValue}>\n    {children}\n  </MessageListContext.Provider>\n);\n\nexport const useMessageListContext = (componentName?: string) => {\n  const contextValue = useContext(MessageListContext);\n\n  if (!contextValue) {\n    console.warn(\n      `The useMessageListContext hook was called outside of the MessageListContext provider. Make sure this hook is called within the MessageList component. The errored call is located in the ${componentName} component.`,\n    );\n\n    return {} as MessageListContextValue;\n  }\n\n  return contextValue as MessageListContextValue;\n};\n", "import React, { useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\nimport type { Poll } from 'stream-chat';\n\nexport type PollContextValue = {\n  poll: Poll;\n};\n\nexport const PollContext = React.createContext<PollContextValue | undefined>(undefined);\n\nexport const PollProvider = ({\n  children,\n  poll,\n}: PropsWithChildren<{\n  poll: Poll;\n}>) =>\n  poll ? (\n    <PollContext.Provider value={{ poll } as unknown as PollContextValue}>\n      {children}\n    </PollContext.Provider>\n  ) : null;\n\nexport const usePollContext = () => {\n  const contextValue = useContext(PollContext);\n  return contextValue as unknown as PollContextValue;\n};\n", "import React, { useContext } from 'react';\nimport Dayjs from 'dayjs';\nimport calendar from 'dayjs/plugin/calendar';\nimport localizedFormat from 'dayjs/plugin/localizedFormat';\nimport type { PropsWithChildren } from 'react';\nimport type { TFunction } from 'i18next';\nimport type { TranslationLanguages } from 'stream-chat';\n\nimport { getDisplayName } from './utils/getDisplayName';\nimport { defaultDateTimeParser, defaultTranslatorFunction } from '../i18n/utils';\nimport type { UnknownType } from '../types/types';\nimport type { TDateTimeParser } from '../i18n/types';\n\nDayjs.extend(calendar);\nDayjs.extend(localizedFormat);\n\nexport type TranslationContextValue = {\n  t: TFunction;\n  tDateTimeParser: TDateTimeParser;\n  userLanguage: TranslationLanguages;\n};\n\nexport const TranslationContext = React.createContext<TranslationContextValue>({\n  t: defaultTranslatorFunction,\n  tDateTimeParser: defaultDateTimeParser,\n  userLanguage: 'en',\n});\n\nexport const TranslationProvider = ({\n  children,\n  value,\n}: PropsWithChildren<{ value: TranslationContextValue }>) => (\n  <TranslationContext.Provider value={value}>{children}</TranslationContext.Provider>\n);\n\nexport const useTranslationContext = (componentName?: string) => {\n  const contextValue = useContext(TranslationContext);\n\n  if (!contextValue) {\n    console.warn(\n      `The useTranslationContext hook was called outside of the TranslationContext provider. Make sure this hook is called within a child of the Chat component. The errored call is located in the ${componentName} component.`,\n    );\n\n    return {} as TranslationContextValue;\n  }\n\n  return contextValue;\n};\n\nexport const withTranslationContext = <P extends UnknownType>(\n  Component: React.ComponentType<P>,\n) => {\n  const WithTranslationContextComponent = (\n    props: Omit<P, keyof TranslationContextValue>,\n  ) => {\n    const translationContext = useTranslationContext();\n\n    return <Component {...(props as P)} {...translationContext} />;\n  };\n\n  WithTranslationContextComponent.displayName = `WithTranslationContext${getDisplayName(\n    Component,\n  )}`;\n\n  return WithTranslationContextComponent;\n};\n", "import Dayjs from 'dayjs';\nimport type { Duration as DayjsDuration } from 'dayjs/plugin/duration';\n\nimport type { TFunction } from 'i18next';\nimport type { Moment } from 'moment-timezone';\nimport type {\n  DateFormatterOptions,\n  DurationFormatterOptions,\n  PredefinedFormatters,\n  SupportedTranslations,\n  TDateTimeParserInput,\n  TDateTimeParserOutput,\n  TimestampFormatterOptions,\n} from './types';\n\nexport const notValidDateWarning =\n  'MessageTimestamp was called without a message, or message has invalid created_at date.';\nexport const noParsingFunctionWarning =\n  'MessageTimestamp was called but there is no datetime parsing function available';\n\nexport const isNumberOrString = (\n  output: TDateTimeParserOutput,\n): output is number | string => typeof output === 'string' || typeof output === 'number';\n\nexport const isDayOrMoment = (\n  output: TDateTimeParserOutput,\n): output is Dayjs.Dayjs | Moment => !!(output as Dayjs.Dayjs | Moment)?.isSame;\n\nexport const isDate = (output: unknown): output is Date =>\n  output !== null &&\n  typeof output === 'object' &&\n  typeof (output as Date).getTime === 'function';\n\nexport function getDateString({\n  calendar,\n  calendarFormats,\n  format,\n  formatDate,\n  messageCreatedAt,\n  t,\n  tDateTimeParser,\n  timestampTranslationKey,\n}: DateFormatterOptions): string | number | null {\n  if (\n    !messageCreatedAt ||\n    (typeof messageCreatedAt === 'string' && !Date.parse(messageCreatedAt))\n  ) {\n    console.warn(notValidDateWarning);\n    return null;\n  }\n\n  if (typeof formatDate === 'function') {\n    return formatDate(new Date(messageCreatedAt));\n  }\n\n  if (t && timestampTranslationKey) {\n    const options: TimestampFormatterOptions = {};\n    if (typeof calendar !== 'undefined' && calendar !== null) options.calendar = calendar;\n    if (typeof calendarFormats !== 'undefined' && calendarFormats !== null)\n      options.calendarFormats = calendarFormats;\n    if (typeof format !== 'undefined' && format !== null) options.format = format;\n\n    const translatedTimestamp = t(timestampTranslationKey, {\n      ...options,\n      timestamp: new Date(messageCreatedAt),\n    });\n    const translationKeyFound = timestampTranslationKey !== translatedTimestamp;\n    if (translationKeyFound) return translatedTimestamp;\n  }\n\n  if (!tDateTimeParser) {\n    console.warn(noParsingFunctionWarning);\n    return null;\n  }\n\n  const parsedTime = tDateTimeParser(messageCreatedAt);\n\n  if (isDayOrMoment(parsedTime)) {\n    /**\n     * parsedTime.calendar is guaranteed on the type but is only\n     * available when a user calls dayjs.extend(calendar)\n     */\n    return calendar && parsedTime.calendar\n      ? parsedTime.calendar(undefined, calendarFormats || undefined)\n      : parsedTime.format(format || undefined);\n  }\n\n  if (isDate(parsedTime)) {\n    return parsedTime.toDateString();\n  }\n\n  if (isNumberOrString(parsedTime)) {\n    return parsedTime;\n  }\n\n  return null;\n}\n\nexport const predefinedFormatters: PredefinedFormatters = {\n  durationFormatter:\n    (streamI18n) =>\n    (value, _, { format, withSuffix }: DurationFormatterOptions) => {\n      // NOTE: isDayjs is not exported in \"dayjs\" package for ESM, hence we access\n      // `isDayjs` from Dayjs instance\n      if (format && Dayjs.isDayjs(streamI18n.DateTimeParser)) {\n        return (streamI18n.DateTimeParser.duration(value) as DayjsDuration).format(\n          format,\n        );\n      }\n      return streamI18n.DateTimeParser.duration(value).humanize(!!withSuffix);\n    },\n  timestampFormatter:\n    (streamI18n) =>\n    (\n      value,\n      _,\n      {\n        calendarFormats,\n        ...options\n      }: Pick<TimestampFormatterOptions, 'calendar' | 'format'> & {\n        calendarFormats?: Record<string, string> | string;\n      },\n    ) => {\n      let parsedCalendarFormats;\n      try {\n        if (!options.calendar) {\n          parsedCalendarFormats = {};\n        } else if (typeof calendarFormats === 'string') {\n          parsedCalendarFormats = JSON.parse(calendarFormats);\n        } else if (typeof calendarFormats === 'object') {\n          parsedCalendarFormats = calendarFormats;\n        }\n      } catch (e) {\n        console.error('[TIMESTAMP FORMATTER]', e);\n      }\n\n      const result = getDateString({\n        ...options,\n        calendarFormats: parsedCalendarFormats,\n        messageCreatedAt: value,\n        tDateTimeParser: streamI18n.tDateTimeParser,\n      });\n      if (!result || typeof result === 'number') {\n        return JSON.stringify(value);\n      }\n      return result;\n    },\n};\n\nexport const defaultTranslatorFunction = ((key: string) => key) as TFunction;\n\nexport const defaultDateTimeParser = (input?: TDateTimeParserInput) => Dayjs(input);\n\nexport const isLanguageSupported = (\n  language: string,\n): language is SupportedTranslations => {\n  const translations = [\n    'de',\n    'en',\n    'es',\n    'fr',\n    'hi',\n    'it',\n    'ja',\n    'ko',\n    'nl',\n    'pt',\n    'ru',\n    'tr',\n  ];\n  return translations.some((translation) => language === translation);\n};\n", "import React, { useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\n\nimport type { ChannelState as StreamChannelState } from 'stream-chat';\nimport type { UnknownType } from '../types/types';\n\nexport type TypingContextValue = {\n  typing?: StreamChannelState['typing'];\n};\n\nexport const TypingContext = React.createContext<TypingContextValue | undefined>(\n  undefined,\n);\n\nexport const TypingProvider = ({\n  children,\n  value,\n}: PropsWithChildren<{\n  value: TypingContextValue;\n}>) => (\n  <TypingContext.Provider value={value as unknown as TypingContextValue}>\n    {children}\n  </TypingContext.Provider>\n);\n\nexport const useTypingContext = (componentName?: string) => {\n  const contextValue = useContext(TypingContext);\n\n  if (!contextValue) {\n    console.warn(\n      `The useTypingContext hook was called outside of the TypingContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the ${componentName} component.`,\n    );\n\n    return {} as TypingContextValue;\n  }\n\n  return contextValue as TypingContextValue;\n};\n\n/**\n * Typescript currently does not support partial inference, so if TypingContext\n * typing is desired while using the HOC withTypingContext, the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withTypingContext = <P extends UnknownType>(\n  Component: React.ComponentType<P>,\n) => {\n  const WithTypingContextComponent = (props: Omit<P, keyof TypingContextValue>) => {\n    const typingContext = useTypingContext();\n\n    return <Component {...(props as P)} {...typingContext} />;\n  };\n\n  WithTypingContextComponent.displayName = (\n    Component.displayName ||\n    Component.name ||\n    'Component'\n  ).replace('Base', '');\n\n  return WithTypingContextComponent;\n};\n", "import React, { useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\n\nimport { ComponentContext } from './ComponentContext';\nimport type { ComponentContextValue } from './ComponentContext';\n\nexport function WithComponents({\n  children,\n  overrides,\n}: PropsWithChildren<{ overrides: Partial<ComponentContextValue> }>) {\n  const parentOverrides = useContext(ComponentContext);\n  const actualOverrides: ComponentContextValue = { ...parentOverrides, ...overrides };\n  return (\n    <ComponentContext.Provider value={actualOverrides}>\n      {children}\n    </ComponentContext.Provider>\n  );\n}\n", "import React, { useMemo } from 'react';\nimport {\n  isAudioAttachment,\n  isFileAttachment,\n  isImageAttachment,\n  isScrapedContent,\n  isSharedLocationResponse,\n  isVideoAttachment,\n  isVoiceRecordingAttachment,\n} from 'stream-chat';\n\nimport {\n  AudioContainer,\n  CardContainer,\n  FileContainer,\n  GalleryContainer,\n  GeolocationContainer,\n  ImageContainer,\n  MediaContainer,\n  UnsupportedAttachmentContainer,\n  VoiceRecordingContainer,\n} from './AttachmentContainer';\nimport { SUPPORTED_VIDEO_FORMATS } from './utils';\n\nimport type { ReactPlayerProps } from 'react-player';\nimport type { SharedLocationResponse, Attachment as StreamAttachment } from 'stream-chat';\nimport type { AttachmentActionsProps } from './AttachmentActions';\nimport type { AudioProps } from './Audio';\nimport type { VoiceRecordingProps } from './VoiceRecording';\nimport type { CardProps } from './Card';\nimport type { FileAttachmentProps } from './FileAttachment';\nimport type { GalleryProps, ImageProps } from '../Gallery';\nimport type { UnsupportedAttachmentProps } from './UnsupportedAttachment';\nimport type { ActionHandlerReturnType } from '../Message/hooks/useActionHandler';\nimport type { GroupedRenderedAttachment } from './utils';\nimport type { GeolocationProps } from './Geolocation';\n\nconst CONTAINER_MAP = {\n  audio: AudioContainer,\n  card: CardContainer,\n  file: FileContainer,\n  media: MediaContainer,\n  unsupported: UnsupportedAttachmentContainer,\n  voiceRecording: VoiceRecordingContainer,\n} as const;\n\nexport const ATTACHMENT_GROUPS_ORDER = [\n  'card',\n  'gallery',\n  'image',\n  'media',\n  'audio',\n  'voiceRecording',\n  'file',\n  'geolocation',\n  'unsupported',\n] as const;\n\nexport type AttachmentProps = {\n  /** The message attachments to render, see [attachment structure](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) **/\n  attachments: (StreamAttachment | SharedLocationResponse)[];\n  /**\tThe handler function to call when an action is performed on an attachment, examples include canceling a \\/giphy command or shuffling the results. */\n  actionHandler?: ActionHandlerReturnType;\n  /** Custom UI component for displaying attachment actions, defaults to and accepts same props as: [AttachmentActions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/AttachmentActions.tsx) */\n  AttachmentActions?: React.ComponentType<AttachmentActionsProps>;\n  /** Custom UI component for displaying an audio type attachment, defaults to and accepts same props as: [Audio](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Audio.tsx) */\n  Audio?: React.ComponentType<AudioProps>;\n  /** Custom UI component for displaying a card type attachment, defaults to and accepts same props as: [Card](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Card.tsx) */\n  Card?: React.ComponentType<CardProps>;\n  /** Custom UI component for displaying a file type attachment, defaults to and accepts same props as: [File](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/FileAttachment.tsx) */\n  File?: React.ComponentType<FileAttachmentProps>;\n  /** Custom UI component for displaying a gallery of image type attachments, defaults to and accepts same props as: [Gallery](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/Gallery.tsx) */\n  Gallery?: React.ComponentType<GalleryProps>;\n  Geolocation?: React.ComponentType<GeolocationProps>;\n  /** Custom UI component for displaying an image type attachment, defaults to and accepts same props as: [Image](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/Image.tsx) */\n  Image?: React.ComponentType<ImageProps>;\n  /** Optional flag to signal that an attachment is a displayed as a part of a quoted message */\n  isQuoted?: boolean;\n  /** Custom UI component for displaying a media type attachment, defaults to `ReactPlayer` from 'react-player' */\n  Media?: React.ComponentType<ReactPlayerProps>;\n  /** Custom UI component for displaying unsupported attachment types, defaults to NullComponent */\n  UnsupportedAttachment?: React.ComponentType<UnsupportedAttachmentProps>;\n  /** Custom UI component for displaying an audio recording attachment, defaults to and accepts same props as: [VoiceRecording](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/VoiceRecording.tsx) */\n  VoiceRecording?: React.ComponentType<VoiceRecordingProps>;\n};\n\n/**\n * A component used for rendering message attachments. By default, the component supports: AttachmentActions, Audio, Card, File, Gallery, Image, and Video\n */\nexport const Attachment = (props: AttachmentProps) => {\n  const { attachments } = props;\n\n  const groupedAttachments = useMemo(\n    () => renderGroupedAttachments(props),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [attachments],\n  );\n\n  return (\n    <div className='str-chat__attachment-list'>\n      {ATTACHMENT_GROUPS_ORDER.reduce(\n        (acc, groupName) => [...acc, ...groupedAttachments[groupName]],\n        [] as React.ReactNode[],\n      )}\n    </div>\n  );\n};\n\nconst renderGroupedAttachments = ({\n  attachments,\n  ...rest\n}: AttachmentProps): GroupedRenderedAttachment => {\n  const uploadedImages: StreamAttachment[] = attachments.filter((attachment) =>\n    isImageAttachment(attachment),\n  );\n\n  const containers = attachments\n    .filter((attachment) => !isImageAttachment(attachment))\n    .reduce<GroupedRenderedAttachment>(\n      (typeMap, attachment) => {\n        if (isSharedLocationResponse(attachment)) {\n          typeMap.geolocation.push(\n            <GeolocationContainer\n              {...rest}\n              key='geolocation-container'\n              location={attachment}\n            />,\n          );\n        } else {\n          const attachmentType = getAttachmentType(attachment);\n\n          const Container = CONTAINER_MAP[attachmentType];\n          typeMap[attachmentType].push(\n            <Container\n              key={`${attachmentType}-${typeMap[attachmentType].length}`}\n              {...rest}\n              attachment={attachment}\n            />,\n          );\n        }\n\n        return typeMap;\n      },\n      {\n        audio: [],\n        card: [],\n        file: [],\n        media: [],\n        unsupported: [],\n        // not used in reduce\n        // eslint-disable-next-line sort-keys\n        image: [],\n        // eslint-disable-next-line sort-keys\n        gallery: [],\n        geolocation: [],\n        voiceRecording: [],\n      },\n    );\n\n  if (uploadedImages.length > 1) {\n    containers['gallery'] = [\n      <GalleryContainer\n        key='gallery-container'\n        {...rest}\n        attachment={{\n          images: uploadedImages,\n          type: 'gallery',\n        }}\n      />,\n    ];\n  } else if (uploadedImages.length === 1) {\n    containers['image'] = [\n      <ImageContainer key='image-container' {...rest} attachment={uploadedImages[0]} />,\n    ];\n  }\n\n  return containers;\n};\n\nconst getAttachmentType = (\n  attachment: AttachmentProps['attachments'][number],\n): keyof typeof CONTAINER_MAP => {\n  if (isScrapedContent(attachment)) {\n    return 'card';\n  } else if (isVideoAttachment(attachment, SUPPORTED_VIDEO_FORMATS)) {\n    return 'media';\n  } else if (isAudioAttachment(attachment)) {\n    return 'audio';\n  } else if (isVoiceRecordingAttachment(attachment)) {\n    return 'voiceRecording';\n  } else if (isFileAttachment(attachment, SUPPORTED_VIDEO_FORMATS)) {\n    return 'file';\n  }\n\n  return 'unsupported';\n};\n", "import type { PropsWithChildren } from 'react';\nimport React, { useLayoutEffect, useRef, useState } from 'react';\nimport ReactPlayer from 'react-player';\nimport clsx from 'clsx';\nimport * as linkify from 'linkifyjs';\nimport type { Attachment, LocalAttachment, SharedLocationResponse } from 'stream-chat';\nimport { isSharedLocationResponse } from 'stream-chat';\n\nimport { AttachmentActions as DefaultAttachmentActions } from './AttachmentActions';\nimport { Audio as DefaultAudio } from './Audio';\nimport { VoiceRecording as DefaultVoiceRecording } from './VoiceRecording';\nimport { Gallery as DefaultGallery, ImageComponent as DefaultImage } from '../Gallery';\nimport { Card as DefaultCard } from './Card';\nimport { FileAttachment as DefaultFile } from './FileAttachment';\nimport { Geolocation as DefaultGeolocation } from './Geolocation';\nimport { UnsupportedAttachment as DefaultUnsupportedAttachment } from './UnsupportedAttachment';\nimport type {\n  AttachmentComponentType,\n  GalleryAttachment,\n  GeolocationContainerProps,\n  RenderAttachmentProps,\n  RenderGalleryProps,\n} from './utils';\nimport { isGalleryAttachmentType, isSvgAttachment } from './utils';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport type {\n  ImageAttachmentConfiguration,\n  VideoAttachmentConfiguration,\n} from '../../types/types';\n\nexport type AttachmentContainerProps = {\n  attachment: Attachment | GalleryAttachment | SharedLocationResponse;\n  componentType: AttachmentComponentType;\n};\nexport const AttachmentWithinContainer = ({\n  attachment,\n  children,\n  componentType,\n}: PropsWithChildren<AttachmentContainerProps>) => {\n  const isGAT = isGalleryAttachmentType(attachment);\n  let extra = '';\n\n  if (!isGAT && !isSharedLocationResponse(attachment)) {\n    extra =\n      componentType === 'card' && !attachment?.image_url && !attachment?.thumb_url\n        ? 'no-image'\n        : attachment?.actions?.length\n          ? 'actions'\n          : '';\n  }\n\n  const classNames = clsx(\n    'str-chat__message-attachment str-chat__message-attachment-dynamic-size',\n    {\n      [`str-chat__message-attachment--${componentType}`]: componentType,\n      [`str-chat__message-attachment--${(attachment as Attachment)?.type}`]: (\n        attachment as Attachment\n      )?.type,\n      [`str-chat__message-attachment--${componentType}--${extra}`]:\n        componentType && extra,\n      'str-chat__message-attachment--svg-image': isSvgAttachment(attachment),\n      'str-chat__message-attachment-with-actions': extra === 'actions',\n    },\n  );\n\n  return <div className={classNames}>{children}</div>;\n};\n\nexport const AttachmentActionsContainer = ({\n  actionHandler,\n  attachment,\n  AttachmentActions = DefaultAttachmentActions,\n}: RenderAttachmentProps) => {\n  if (!attachment.actions?.length) return null;\n\n  return (\n    <AttachmentActions\n      {...attachment}\n      actionHandler={actionHandler}\n      actions={attachment.actions}\n      id={(attachment as LocalAttachment).localMetadata?.id || ''}\n      text={attachment.text || ''}\n    />\n  );\n};\n\nfunction getCssDimensionsVariables(url: string) {\n  const cssVars = {\n    '--original-height': 1000000,\n    '--original-width': 1000000,\n  } as Record<string, number>;\n\n  if (linkify.test(url, 'url')) {\n    const urlParams = new URL(url).searchParams;\n    const oh = Number(urlParams.get('oh'));\n    const ow = Number(urlParams.get('ow'));\n    const originalHeight = oh > 1 ? oh : 1000000;\n    const originalWidth = ow > 1 ? ow : 1000000;\n    cssVars['--original-width'] = originalWidth;\n    cssVars['--original-height'] = originalHeight;\n  }\n\n  return cssVars;\n}\n\nexport const GalleryContainer = ({\n  attachment,\n  Gallery = DefaultGallery,\n}: RenderGalleryProps) => {\n  const imageElements = useRef<HTMLElement[]>([]);\n  const { imageAttachmentSizeHandler } = useChannelStateContext();\n  const [attachmentConfigurations, setAttachmentConfigurations] = useState<\n    ImageAttachmentConfiguration[]\n  >([]);\n\n  useLayoutEffect(() => {\n    if (!imageElements.current || !imageAttachmentSizeHandler) return;\n    const newConfigurations: ImageAttachmentConfiguration[] = [];\n    const nonNullImageElements = imageElements.current.filter((e) => !!e);\n    if (nonNullImageElements.length < imageElements.current.length) {\n      imageElements.current = nonNullImageElements;\n    }\n    imageElements.current.forEach((element, i) => {\n      if (!element) return;\n      const config = imageAttachmentSizeHandler(attachment.images[i], element);\n      newConfigurations.push(config);\n    });\n    setAttachmentConfigurations(newConfigurations);\n  }, [imageAttachmentSizeHandler, attachment]);\n\n  const images = attachment.images.map((image, i) => ({\n    ...image,\n    previewUrl: attachmentConfigurations[i]?.url || 'about:blank',\n    style: getCssDimensionsVariables(\n      attachment.images[i]?.image_url || attachment.images[i]?.thumb_url || '',\n    ),\n  }));\n\n  return (\n    <AttachmentWithinContainer attachment={attachment} componentType='gallery'>\n      <Gallery images={images || []} innerRefs={imageElements} key='gallery' />\n    </AttachmentWithinContainer>\n  );\n};\n\nexport const ImageContainer = (props: RenderAttachmentProps) => {\n  const { attachment, Image = DefaultImage } = props;\n  const componentType = 'image';\n  const imageElement = useRef<HTMLImageElement>(null);\n  const { imageAttachmentSizeHandler } = useChannelStateContext();\n  const [attachmentConfiguration, setAttachmentConfiguration] = useState<\n    ImageAttachmentConfiguration | undefined\n  >(undefined);\n\n  useLayoutEffect(() => {\n    if (imageElement.current && imageAttachmentSizeHandler) {\n      const config = imageAttachmentSizeHandler(attachment, imageElement.current);\n      setAttachmentConfiguration(config);\n    }\n  }, [imageElement, imageAttachmentSizeHandler, attachment]);\n\n  const imageConfig = {\n    ...attachment,\n    previewUrl: attachmentConfiguration?.url || 'about:blank',\n    style: getCssDimensionsVariables(attachment.image_url || attachment.thumb_url || ''),\n  };\n\n  if (attachment.actions && attachment.actions.length) {\n    return (\n      <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n        <div className='str-chat__attachment'>\n          <Image {...imageConfig} innerRef={imageElement} />\n          <AttachmentActionsContainer {...props} />\n        </div>\n      </AttachmentWithinContainer>\n    );\n  }\n\n  return (\n    <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n      <Image {...imageConfig} innerRef={imageElement} />\n    </AttachmentWithinContainer>\n  );\n};\n\nexport const CardContainer = (props: RenderAttachmentProps) => {\n  const { attachment, Card = DefaultCard } = props;\n  const componentType = 'card';\n\n  if (attachment.actions && attachment.actions.length) {\n    return (\n      <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n        <div className='str-chat__attachment'>\n          <Card {...attachment} />\n          <AttachmentActionsContainer {...props} />\n        </div>\n      </AttachmentWithinContainer>\n    );\n  }\n\n  return (\n    <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n      <Card {...attachment} />\n    </AttachmentWithinContainer>\n  );\n};\n\nexport const FileContainer = ({\n  attachment,\n  File = DefaultFile,\n}: RenderAttachmentProps) => {\n  if (!attachment.asset_url) return null;\n\n  return (\n    <AttachmentWithinContainer attachment={attachment} componentType='file'>\n      <File attachment={attachment} />\n    </AttachmentWithinContainer>\n  );\n};\nexport const AudioContainer = ({\n  attachment,\n  Audio = DefaultAudio,\n}: RenderAttachmentProps) => (\n  <AttachmentWithinContainer attachment={attachment} componentType='audio'>\n    <div className='str-chat__attachment'>\n      <Audio og={attachment} />\n    </div>\n  </AttachmentWithinContainer>\n);\n\nexport const VoiceRecordingContainer = ({\n  attachment,\n  isQuoted,\n  VoiceRecording = DefaultVoiceRecording,\n}: RenderAttachmentProps) => (\n  <AttachmentWithinContainer attachment={attachment} componentType='voiceRecording'>\n    <div className='str-chat__attachment'>\n      <VoiceRecording attachment={attachment} isQuoted={isQuoted} />\n    </div>\n  </AttachmentWithinContainer>\n);\n\nexport const MediaContainer = (props: RenderAttachmentProps) => {\n  const { attachment, Media = ReactPlayer } = props;\n  const componentType = 'media';\n  const { shouldGenerateVideoThumbnail, videoAttachmentSizeHandler } =\n    useChannelStateContext();\n  const videoElement = useRef<HTMLDivElement>(null);\n  const [attachmentConfiguration, setAttachmentConfiguration] =\n    useState<VideoAttachmentConfiguration>();\n\n  useLayoutEffect(() => {\n    if (videoElement.current && videoAttachmentSizeHandler) {\n      const config = videoAttachmentSizeHandler(\n        attachment,\n        videoElement.current,\n        shouldGenerateVideoThumbnail,\n      );\n      setAttachmentConfiguration(config);\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [videoElement, videoAttachmentSizeHandler, attachment]);\n\n  const content = (\n    <div\n      className='str-chat__player-wrapper'\n      data-testid='video-wrapper'\n      ref={videoElement}\n      style={getCssDimensionsVariables(attachment.thumb_url || '')}\n    >\n      <Media\n        className='react-player'\n        config={{ file: { attributes: { poster: attachmentConfiguration?.thumbUrl } } }}\n        controls\n        height='100%'\n        url={attachmentConfiguration?.url}\n        width='100%'\n      />\n    </div>\n  );\n\n  return attachment.actions?.length ? (\n    <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n      <div className='str-chat__attachment'>\n        {content}\n        <AttachmentActionsContainer {...props} />\n      </div>\n    </AttachmentWithinContainer>\n  ) : (\n    <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n      {content}\n    </AttachmentWithinContainer>\n  );\n};\n\nexport const GeolocationContainer = ({\n  Geolocation = DefaultGeolocation,\n  location,\n}: GeolocationContainerProps) => (\n  <AttachmentWithinContainer attachment={location} componentType='geolocation'>\n    <Geolocation location={location} />\n  </AttachmentWithinContainer>\n);\n\nexport const UnsupportedAttachmentContainer = ({\n  attachment,\n  UnsupportedAttachment = DefaultUnsupportedAttachment,\n}: RenderAttachmentProps) => (\n  <>\n    <UnsupportedAttachment attachment={attachment} />\n  </>\n);\n", "import React, { useMemo } from 'react';\nimport type { Action, Attachment } from 'stream-chat';\n\nimport { useTranslationContext } from '../../context';\n\nimport type { ActionHandlerReturnType } from '../Message/hooks/useActionHandler';\n\nexport type AttachmentActionsProps = Attachment & {\n  /** A list of actions */\n  actions: Action[];\n  /** Unique id for action button key. Key is generated by concatenating this id with action value - {`${id}-${action.value}`} */\n  id: string;\n  /** The text for the form input */\n  text: string;\n  /** Click event handler */\n  actionHandler?: ActionHandlerReturnType;\n};\n\nconst UnMemoizedAttachmentActions = (props: AttachmentActionsProps) => {\n  const { actionHandler, actions, id, text } = props;\n  const { t } = useTranslationContext('UnMemoizedAttachmentActions');\n\n  const handleActionClick = (\n    event: React.MouseEvent<HTMLButtonElement, MouseEvent>,\n    name?: string,\n    value?: string,\n  ) => actionHandler?.(name, value, event);\n\n  const knownActionText = useMemo<Record<string, string>>(\n    () => ({\n      Cancel: t('Cancel'),\n      Send: t('Send'),\n      Shuffle: t('Shuffle'),\n    }),\n    [t],\n  );\n\n  return (\n    <div className='str-chat__message-attachment-actions'>\n      <div className='str-chat__message-attachment-actions-form'>\n        <span>{text}</span>\n        {actions.map((action) => (\n          <button\n            className={`str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--${action.style}`}\n            data-testid={`${action.name}`}\n            data-value={action.value}\n            key={`${id}-${action.value}`}\n            onClick={(event) => handleActionClick(event, action.name, action.value)}\n          >\n            {action.text ? (knownActionText[action.text] ?? t(action.text)) : null}\n          </button>\n        ))}\n      </div>\n    </div>\n  );\n};\n\n/**\n * A component for rendering the actions you can take on an attachment.\n */\nexport const AttachmentActions = React.memo(\n  UnMemoizedAttachmentActions,\n) as typeof UnMemoizedAttachmentActions;\n", "import React from 'react';\nimport type { Attachment } from 'stream-chat';\n\nimport { DownloadButton, FileSizeIndicator, PlayButton, ProgressBar } from './components';\nimport { type AudioPlayerState, useAudioPlayer } from '../AudioPlayback';\nimport { useStateStore } from '../../store';\nimport { useMessageContext } from '../../context';\nimport type { AudioPlayer } from '../AudioPlayback/AudioPlayer';\n\ntype AudioAttachmentUIProps = {\n  audioPlayer: AudioPlayer;\n};\n\n// todo: finish creating a BaseAudioPlayer derived from VoiceRecordingPlayerUI and AudioAttachmentUI\nconst AudioAttachmentUI = ({ audioPlayer }: AudioAttachmentUIProps) => {\n  const dataTestId = 'audio-widget';\n  const rootClassName = 'str-chat__message-attachment-audio-widget';\n\n  const { isPlaying, progress } =\n    useStateStore(audioPlayer?.state, audioPlayerStateSelector) ?? {};\n\n  return (\n    <div className={rootClassName} data-testid={dataTestId}>\n      <div className='str-chat__message-attachment-audio-widget--play-controls'>\n        <PlayButton isPlaying={!!isPlaying} onClick={audioPlayer.togglePlay} />\n      </div>\n      <div className='str-chat__message-attachment-audio-widget--text'>\n        <div className='str-chat__message-attachment-audio-widget--text-first-row'>\n          <div className='str-chat__message-attachment-audio-widget--title'>\n            {audioPlayer.title}\n          </div>\n          <DownloadButton assetUrl={audioPlayer.src} />\n        </div>\n        <div className='str-chat__message-attachment-audio-widget--text-second-row'>\n          <FileSizeIndicator fileSize={audioPlayer.fileSize} />\n          <ProgressBar onClick={audioPlayer.seek} progress={progress ?? 0} />\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport type AudioProps = {\n  // fixme: rename og to attachment\n  og: Attachment;\n};\n\nconst audioPlayerStateSelector = (state: AudioPlayerState) => ({\n  isPlaying: state.isPlaying,\n  progress: state.progressPercent,\n});\n\nconst UnMemoizedAudio = (props: AudioProps) => {\n  const {\n    og: { asset_url, file_size, mime_type, title },\n  } = props;\n\n  /**\n   * Introducing message context. This could be breaking change, therefore the fallback to {} is provided.\n   * If this component is used outside the message context, then there will be no audio player namespacing\n   * => scrolling away from the message in virtualized ML would create a new AudioPlayer instance.\n   *\n   * Edge case: the requester (message) has multiple attachments with the same assetURL - does not happen\n   * with the default SDK components, but can be done with custom API calls.In this case all the Audio\n   * widgets will share the state.\n   */\n  const { message, threadList } = useMessageContext() ?? {};\n\n  const audioPlayer = useAudioPlayer({\n    fileSize: file_size,\n    mimeType: mime_type,\n    requester:\n      message?.id &&\n      `${threadList ? (message.parent_id ?? message.id) : ''}${message.id}`,\n    src: asset_url,\n    title,\n    waveformData: props.og.waveform_data,\n  });\n\n  return audioPlayer ? <AudioAttachmentUI audioPlayer={audioPlayer} /> : null;\n};\n\n/**\n * Audio attachment with play/pause button and progress bar\n */\nexport const Audio = React.memo(UnMemoizedAudio) as typeof UnMemoizedAudio;\n", "import React from 'react';\n\nimport { DownloadIcon } from '../icons';\nimport { SafeAnchor } from '../../SafeAnchor';\n\ntype DownloadButtonProps = {\n  assetUrl?: string;\n};\n\nexport const DownloadButton = ({ assetUrl }: DownloadButtonProps) => (\n  <SafeAnchor\n    className='str-chat__message-attachment-file--item-download'\n    download\n    href={assetUrl}\n    target='_blank'\n  >\n    <DownloadIcon className='str-chat__message-attachment-download-icon' />\n  </SafeAnchor>\n);\n", "import React from 'react';\nimport type { IconProps } from '../../types/types';\n\nexport const DownloadIcon = ({ className }: IconProps) => (\n  <svg\n    className={className}\n    data-testid='download'\n    fill='none'\n    height='24'\n    viewBox='0 0 24 24'\n    width='24'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      d='M19.35 10.04C18.67 6.59 15.64 4 12 4C9.11 4 6.6 5.64 5.35 8.04C2.34 8.36 0 10.91 0 14C0 17.31 2.69 20 6 20H19C21.76 20 24 17.76 24 15C24 12.36 21.95 10.22 19.35 10.04ZM19 18H6C3.79 18 2 16.21 2 14C2 11.95 3.53 10.24 5.56 10.03L6.63 9.92L7.13 8.97C8.08 7.14 9.94 6 12 6C14.62 6 16.88 7.86 17.39 10.43L17.69 11.93L19.22 12.04C20.78 12.14 22 13.45 22 15C22 16.65 20.65 18 19 18ZM13.45 10H10.55V13H8L12 17L16 13H13.45V10Z'\n      fill='black'\n    />\n  </svg>\n);\n\nexport const PlayTriangleIcon = () => (\n  <svg fill='none' viewBox='0 0 12 14' xmlns='http://www.w3.org/2000/svg'>\n    <path d='M0.5 0V14L11.5 7L0.5 0Z' fill='#080707' />\n  </svg>\n);\n\nexport const PauseIcon = () => (\n  <svg fill='none' viewBox='0 0 12 14' xmlns='http://www.w3.org/2000/svg'>\n    <path d='M0 14H4V0H0V14ZM8 0V14H12V0H8Z' fill='#080707' />\n  </svg>\n);\n\nexport const GeolocationIcon = () => (\n  <svg\n    className='str-chat__message-geolocation__icon'\n    fill='currentColor'\n    viewBox='0 0 255.856 255.856'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      d='M127.928 38.8c-30.75 0-55.768 25.017-55.768 55.767s25.018 55.767 55.768 55.767 55.768-25.017 55.768-55.767S158.678 38.8 127.928 38.8zm0 96.533c-22.479 0-40.768-18.288-40.768-40.767S105.449 53.8 127.928 53.8s40.768 18.288 40.768 40.767-18.288 40.766-40.768 40.766z'\n      strokeWidth='60'\n    />\n    <path d='M127.928 0C75.784 0 33.362 42.422 33.362 94.566c0 30.072 25.22 74.875 40.253 98.904 9.891 15.809 20.52 30.855 29.928 42.365 15.101 18.474 20.506 20.02 24.386 20.02 3.938 0 9.041-1.547 24.095-20.031 9.429-11.579 20.063-26.616 29.944-42.342 15.136-24.088 40.527-68.971 40.527-98.917C222.495 42.422 180.073 0 127.928 0zm43.641 181.803c-19.396 31.483-37.203 52.757-43.73 58.188-6.561-5.264-24.079-26.032-43.746-58.089-22.707-37.015-35.73-68.848-35.73-87.336C48.362 50.693 84.055 15 127.928 15s79.566 35.693 79.566 79.566c.001 18.382-13.094 50.178-35.925 87.237z' />\n  </svg>\n);\n\nexport const ExternalLinkIcon = () => (\n  <svg fill='currentColor' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'>\n    <path d='M12.586 2H10a1 1 0 1 1 0-2h5a1 1 0 0 1 1 1v5a1 1 0 1 1-2 0V3.414l-6.793 6.793a1 1 0 0 1-1.414-1.414L12.586 2zM6 1a1 1 0 1 1 0 2H3a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h8.967a1 1 0 0 0 1-.99L13 9.99a1 1 0 1 1 2 .02l-.033 3.023a3 3 0 0 1-3 2.967H3a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3h3z' />\n  </svg>\n);\n", "import type { PropsWithChildren } from 'react';\nimport React from 'react';\nimport { sanitizeUrl } from '@braintree/sanitize-url';\nimport { useTranslationContext } from '../../context';\n\n/**\n * Similar to a regular anchor tag, but it sanitizes the href value and prevents XSS\n */\nexport type SafeAnchorProps = {\n  /** Set the className for the anchor tag element */\n  className?: string;\n  /** Specifies that the target (href attribute) will be downloaded instead of navigating to a file */\n  download?: boolean;\n  /** Set the href attribute for the anchor tag element */\n  href?: string;\n  /** Set the rel attribute for the anchor tag element */\n  rel?: string;\n  /** Set the target attribute for the anchor tag element */\n  target?: string;\n};\n\nconst UnMemoizedSafeAnchor = (props: PropsWithChildren<SafeAnchorProps>) => {\n  const { children, className, download, href, rel, target } = props;\n  const { t } = useTranslationContext('SafeAnchor');\n  if (!href) return null;\n  const sanitized = sanitizeUrl(href);\n  return (\n    <a\n      aria-label={t('aria/Attachment')}\n      className={className}\n      download={download}\n      href={sanitized}\n      rel={rel}\n      target={target}\n    >\n      {children}\n    </a>\n  );\n};\n\nexport const SafeAnchor = React.memo(UnMemoizedSafeAnchor) as typeof UnMemoizedSafeAnchor;\n", "import React from 'react';\nimport { prettifyFileSize } from '../../MessageInput/hooks/utils';\n\ntype FileSizeIndicatorProps = {\n  /** file size in byte */\n  fileSize?: number | string;\n  /**\n   The maximum number of fraction digits to display. If not set, the default behavior is to round to 3 significant digits.\n   @default undefined\n   */\n  maximumFractionDigits?: number;\n};\n\nexport const FileSizeIndicator = ({\n  fileSize,\n  maximumFractionDigits,\n}: FileSizeIndicatorProps) => {\n  const actualFileSize = typeof fileSize === 'string' ? parseFloat(fileSize) : fileSize;\n\n  if (typeof actualFileSize === 'undefined' || !Number.isFinite(Number(actualFileSize))) {\n    return null;\n  }\n\n  return (\n    <span\n      className='str-chat__message-attachment-file--item-size'\n      data-testid='file-size-indicator'\n    >\n      {prettifyFileSize(actualFileSize, maximumFractionDigits)}\n    </span>\n  );\n};\n", "export function prettifyFileSize(bytes: number, precision = 3) {\n  const units = ['B', 'kB', 'MB', 'GB'];\n  const exponent = Math.min(\n    Math.floor(Math.log(bytes) / Math.log(1024)),\n    units.length - 1,\n  );\n  const mantissa = bytes / 1024 ** exponent;\n  const formattedMantissa =\n    precision === 0 ? Math.round(mantissa).toString() : mantissa.toPrecision(precision);\n  return `${formattedMantissa} ${units[exponent]}`;\n}\n", "import clsx from 'clsx';\nimport React from 'react';\n\nexport type ProgressBarProps = {\n  /** Progress expressed in fractional number value btw 0 and 100. */\n  progress: number;\n} & Pick<React.ComponentProps<'div'>, 'className' | 'onClick'>;\n\nexport const ProgressBar = ({ className, onClick, progress }: ProgressBarProps) => (\n  <div\n    className={clsx(\n      'str-chat__message-attachment-audio-widget--progress-track',\n      className,\n    )}\n    data-progress={progress}\n    data-testid='audio-progress'\n    onClick={onClick}\n    role='progressbar'\n    style={\n      {\n        '--str-chat__message-attachment-audio-widget-progress': progress + '%',\n      } as React.CSSProperties\n    }\n  >\n    <div\n      className='str-chat__message-attachment-audio-widget--progress-slider'\n      style={{ left: `${progress}px` }}\n    />\n  </div>\n);\n", "import React from 'react';\n\nexport type PlaybackRateButtonProps = React.ComponentProps<'button'>;\n\nexport const PlaybackRateButton = ({ children, onClick }: PlaybackRateButtonProps) => (\n  <button\n    className='str-chat__message_attachment__playback-rate-button'\n    data-testid='playback-rate-button'\n    onClick={onClick}\n    type='button'\n  >\n    {children}\n  </button>\n);\n", "import React from 'react';\nimport { PauseIcon, PlayTriangleIcon } from '../icons';\n\ntype PlayButtonProps = {\n  isPlaying: boolean;\n  onClick: () => void;\n};\n\nexport const PlayButton = ({ isPlaying, onClick }: PlayButtonProps) => (\n  <button\n    className='str-chat__message-attachment-audio-widget--play-button'\n    data-testid={isPlaying ? 'pause-audio' : 'play-audio'}\n    onClick={onClick}\n    type='button'\n  >\n    {isPlaying ? <PauseIcon /> : <PlayTriangleIcon />}\n  </button>\n);\n", "import throttle from 'lodash.throttle';\nimport type { PointerEventHandler } from 'react';\nimport React, {\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport clsx from 'clsx';\nimport { resampleWaveformData } from '../audioSampling';\nimport type { SeekFn } from '../hooks/useAudioController';\n\ntype WaveProgressBarProps = {\n  /** Function that allows to change the track progress */\n  seek: SeekFn;\n  /** The array of fractional number values between 0 and 1 representing the height of amplitudes */\n  waveformData: number[];\n  /** Allows to specify the number of bars into which the original waveformData array should be resampled */\n  amplitudesCount?: number;\n  /** Progress expressed in fractional number value btw 0 and 100. */\n  progress?: number;\n  relativeAmplitudeBarWidth?: number;\n  relativeAmplitudeGap?: number;\n};\n\nexport const WaveProgressBar = ({\n  amplitudesCount = 40,\n  progress = 0,\n  relativeAmplitudeBarWidth = 2,\n  relativeAmplitudeGap = 1,\n  seek,\n  waveformData,\n}: WaveProgressBarProps) => {\n  const [progressIndicator, setProgressIndicator] = useState<HTMLDivElement | null>(null);\n  const isDragging = useRef(false);\n  const [root, setRoot] = useState<HTMLDivElement | null>(null);\n  const [trackAxisX, setTrackAxisX] = useState<{\n    barCount: number;\n    barWidth: number;\n    gap: number;\n  }>();\n  const lastRootWidth = useRef<number>(undefined);\n\n  const handleDragStart: PointerEventHandler<HTMLDivElement> = (e) => {\n    e.preventDefault();\n    if (!progressIndicator) return;\n    isDragging.current = true;\n    progressIndicator.style.cursor = 'grabbing';\n  };\n\n  const handleDrag: PointerEventHandler<HTMLDivElement> = (e) => {\n    if (!isDragging.current) return;\n    // Due to throttling of seek, it is necessary to create a copy (snapshot) of the event.\n    // Otherwise, the event would be nullified at the point when the throttled function is executed.\n    seek({ ...e });\n  };\n\n  const handleDragStop = useCallback(() => {\n    if (!progressIndicator) return;\n    isDragging.current = false;\n    progressIndicator.style.removeProperty('cursor');\n  }, [progressIndicator]);\n\n  const getTrackAxisX = useMemo(\n    () =>\n      throttle((rootWidth: number) => {\n        if (rootWidth === lastRootWidth.current) return;\n        lastRootWidth.current = rootWidth;\n        const possibleAmpCount = Math.floor(\n          rootWidth / (relativeAmplitudeGap + relativeAmplitudeBarWidth),\n        );\n        const tooManyAmplitudesToRender = possibleAmpCount < amplitudesCount;\n        const barCount = tooManyAmplitudesToRender ? possibleAmpCount : amplitudesCount;\n        const amplitudeBarWidthToGapRatio =\n          relativeAmplitudeBarWidth / (relativeAmplitudeBarWidth + relativeAmplitudeGap);\n        const barWidth = barCount && (rootWidth / barCount) * amplitudeBarWidthToGapRatio;\n\n        setTrackAxisX({\n          barCount,\n          barWidth,\n          gap: barWidth * (relativeAmplitudeGap / relativeAmplitudeBarWidth),\n        });\n      }, 1),\n    [relativeAmplitudeBarWidth, relativeAmplitudeGap, amplitudesCount],\n  );\n\n  const resampledWaveformData = useMemo(\n    () => (trackAxisX ? resampleWaveformData(waveformData, trackAxisX.barCount) : []),\n    [trackAxisX, waveformData],\n  );\n\n  useEffect(() => {\n    document.addEventListener('pointerup', handleDragStop);\n    return () => {\n      document.removeEventListener('pointerup', handleDragStop);\n    };\n  }, [handleDragStop]);\n\n  useEffect(() => {\n    if (!root || typeof ResizeObserver === 'undefined') return;\n    const observer = new ResizeObserver(([entry]) => {\n      getTrackAxisX(entry.contentRect.width);\n    });\n    observer.observe(root);\n\n    return () => {\n      observer.disconnect();\n    };\n  }, [getTrackAxisX, root]);\n\n  useLayoutEffect(() => {\n    if (!root) return;\n    const { width: rootWidth } = root.getBoundingClientRect();\n    getTrackAxisX(rootWidth);\n  }, [getTrackAxisX, root]);\n\n  if (!waveformData.length || trackAxisX?.barCount === 0) return null;\n\n  return (\n    <div\n      className='str-chat__wave-progress-bar__track'\n      data-testid='wave-progress-bar-track'\n      onClick={seek}\n      onPointerDown={handleDragStart}\n      onPointerMove={handleDrag}\n      onPointerUp={handleDragStop}\n      ref={setRoot}\n      role='progressbar'\n      style={\n        {\n          '--str-chat__voice-recording-amplitude-bar-gap-width': trackAxisX?.gap + 'px',\n        } as React.CSSProperties\n      }\n    >\n      {resampledWaveformData.map((amplitude, i) => (\n        <div\n          className={clsx('str-chat__wave-progress-bar__amplitude-bar', {\n            ['str-chat__wave-progress-bar__amplitude-bar--active']:\n              progress > (i / resampledWaveformData.length) * 100,\n          })}\n          data-testid='amplitude-bar'\n          key={`amplitude-${i}`}\n          style={\n            {\n              '--str-chat__voice-recording-amplitude-bar-width':\n                trackAxisX?.barWidth + 'px',\n              '--str-chat__wave-progress-bar__amplitude-bar-height': amplitude\n                ? amplitude * 100 + '%'\n                : '0%',\n            } as React.CSSProperties\n          }\n        />\n      ))}\n      <div\n        className='str-chat__wave-progress-bar__progress-indicator'\n        data-testid='wave-progress-bar-progress-indicator'\n        ref={setProgressIndicator}\n        style={{ left: `${progress < 0 ? 0 : progress > 100 ? 100 : progress}%` }}\n      />\n    </div>\n  );\n};\n", "import type { ReactNode } from 'react';\nimport type { Attachment, SharedLocationResponse } from 'stream-chat';\nimport type { ATTACHMENT_GROUPS_ORDER, AttachmentProps } from './Attachment';\n\nexport const SUPPORTED_VIDEO_FORMATS = [\n  'video/mp4',\n  'video/ogg',\n  'video/webm',\n  'video/quicktime',\n];\n\nexport type AttachmentComponentType = (typeof ATTACHMENT_GROUPS_ORDER)[number];\n\nexport type GroupedRenderedAttachment = Record<AttachmentComponentType, ReactNode[]>;\n\nexport type GalleryAttachment = {\n  images: Attachment[];\n  type: 'gallery';\n};\n\nexport type RenderAttachmentProps = Omit<AttachmentProps, 'attachments'> & {\n  attachment: Attachment;\n};\n\nexport type RenderGalleryProps = Omit<AttachmentProps, 'attachments'> & {\n  attachment: GalleryAttachment;\n};\n\nexport type GeolocationContainerProps = Omit<AttachmentProps, 'attachments'> & {\n  location: SharedLocationResponse;\n};\n\n// This identity function determines attachment type specific to React.\n// Once made sure other SDKs support the same logic, move to stream-chat-js\nexport const isGalleryAttachmentType = (\n  attachment: Attachment | GalleryAttachment,\n): attachment is GalleryAttachment =>\n  Array.isArray((attachment as GalleryAttachment).images);\n\nexport const isSvgAttachment = (attachment: Attachment) => {\n  const filename = attachment.fallback || '';\n  return filename.toLowerCase().endsWith('.svg');\n};\n\nexport const divMod = (num: number, divisor: number) => [\n  Math.floor(num / divisor),\n  num % divisor,\n];\n\nexport const displayDuration = (totalSeconds?: number) => {\n  if (!totalSeconds || totalSeconds < 0) return '00:00';\n\n  const [hours, hoursLeftover] = divMod(totalSeconds, 3600);\n  const [minutes, seconds] = divMod(hoursLeftover, 60);\n  const roundedSeconds = Math.ceil(seconds);\n\n  const prependHrsZero = hours.toString().length === 1 ? '0' : '';\n  const prependMinZero = minutes.toString().length === 1 ? '0' : '';\n  const prependSecZero = roundedSeconds.toString().length === 1 ? '0' : '';\n  const minSec = `${prependMinZero}${minutes}:${prependSecZero}${roundedSeconds}`;\n\n  return hours ? `${prependHrsZero}${hours}:` + minSec : minSec;\n};\n", "import { divMod } from './utils';\n\nexport const resampleWaveformData = (waveformData: number[], amplitudesCount: number) =>\n  waveformData.length === amplitudesCount\n    ? waveformData\n    : waveformData.length > amplitudesCount\n      ? downSample(waveformData, amplitudesCount)\n      : upSample(waveformData, amplitudesCount);\n\n/**\n * The downSample function uses the Largest-Triangle-Three-Buckets (LTTB) algorithm.\n * See the thesis Downsampling Time Series for Visual Representation by Sveinn Steinarsson for more (https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf)\n * @param data\n * @param targetOutputSize\n */\nexport function downSample(data: number[], targetOutputSize: number): number[] {\n  if (data.length <= targetOutputSize || targetOutputSize === 0) {\n    return data;\n  }\n\n  if (targetOutputSize === 1) return [mean(data)];\n\n  const result: number[] = [];\n  // bucket size adjusted due to the fact that the first and the last item in the original data array is kept in target output\n  const bucketSize = (data.length - 2) / (targetOutputSize - 2);\n  let lastSelectedPointIndex = 0;\n  result.push(data[lastSelectedPointIndex]); // Always add the first point\n  let maxAreaPoint, maxArea, triangleArea;\n\n  for (let bucketIndex = 1; bucketIndex < targetOutputSize - 1; bucketIndex++) {\n    const previousBucketRefPoint = data[lastSelectedPointIndex];\n    const nextBucketMean = getNextBucketMean(data, bucketIndex, bucketSize);\n\n    const currentBucketStartIndex = Math.floor((bucketIndex - 1) * bucketSize) + 1;\n    const nextBucketStartIndex = Math.floor(bucketIndex * bucketSize) + 1;\n    const countUnitsBetweenAtoC = 1 + nextBucketStartIndex - currentBucketStartIndex;\n\n    maxArea = triangleArea = -1;\n\n    for (\n      let currentPointIndex = currentBucketStartIndex;\n      currentPointIndex < nextBucketStartIndex;\n      currentPointIndex++\n    ) {\n      const countUnitsBetweenAtoB =\n        Math.abs(currentPointIndex - currentBucketStartIndex) + 1;\n      const countUnitsBetweenBtoC = countUnitsBetweenAtoC - countUnitsBetweenAtoB;\n      const currentPointValue = data[currentPointIndex];\n\n      triangleArea = triangleAreaHeron(\n        triangleBase(\n          Math.abs(previousBucketRefPoint - currentPointValue),\n          countUnitsBetweenAtoB,\n        ),\n        triangleBase(Math.abs(currentPointValue - nextBucketMean), countUnitsBetweenBtoC),\n        triangleBase(\n          Math.abs(previousBucketRefPoint - nextBucketMean),\n          countUnitsBetweenAtoC,\n        ),\n      );\n\n      if (triangleArea > maxArea) {\n        maxArea = triangleArea;\n        maxAreaPoint = data[currentPointIndex];\n        lastSelectedPointIndex = currentPointIndex;\n      }\n    }\n\n    if (typeof maxAreaPoint !== 'undefined') result.push(maxAreaPoint);\n  }\n\n  result.push(data[data.length - 1]); // Always add the last point\n\n  return result;\n}\n\nconst triangleAreaHeron = (a: number, b: number, c: number) => {\n  const s = (a + b + c) / 2;\n  return Math.sqrt(s * (s - a) * (s - b) * (s - c));\n};\nconst triangleBase = (a: number, b: number) => Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));\nconst mean = (values: number[]) =>\n  values.reduce((acc, value) => acc + value, 0) / values.length;\nconst getNextBucketMean = (\n  data: number[],\n  currentBucketIndex: number,\n  bucketSize: number,\n) => {\n  const nextBucketStartIndex = Math.floor(currentBucketIndex * bucketSize) + 1;\n  let nextNextBucketStartIndex = Math.floor((currentBucketIndex + 1) * bucketSize) + 1;\n  nextNextBucketStartIndex =\n    nextNextBucketStartIndex < data.length ? nextNextBucketStartIndex : data.length;\n\n  return mean(data.slice(nextBucketStartIndex, nextNextBucketStartIndex));\n};\nexport const upSample = (values: number[], targetSize: number) => {\n  if (!values.length) {\n    console.warn('Cannot extend empty array of amplitudes.');\n    return values;\n  }\n\n  if (values.length > targetSize) {\n    console.warn(\n      'Requested to extend the waveformData that is longer than the target list size',\n    );\n    return values;\n  }\n\n  if (targetSize === values.length) return values;\n\n  // eslint-disable-next-line prefer-const\n  let [bucketSize, remainder] = divMod(targetSize, values.length);\n  const result: number[] = [];\n\n  for (let i = 0; i < values.length; i++) {\n    const extra = remainder && remainder-- ? 1 : 0;\n    result.push(...Array(bucketSize + extra).fill(values[i]));\n  }\n  return result;\n};\n", "import { StateStore } from 'stream-chat';\nimport throttle from 'lodash.throttle';\nimport type { AudioPlayerPlugin } from './plugins';\nimport type { AudioPlayerPool } from './AudioPlayerPool';\n\nexport type AudioPlayerErrorCode =\n  | 'failed-to-start'\n  | 'not-playable'\n  | 'seek-not-supported'\n  | (string & {});\n\nexport type RegisterAudioPlayerErrorParams = {\n  error?: Error;\n  errCode?: AudioPlayerErrorCode;\n};\n\nexport type AudioPlayerDescriptor = {\n  id: string;\n  src: string;\n  /** Audio duration in seconds. */\n  durationSeconds?: number;\n  fileSize?: number | string;\n  mimeType?: string;\n  title?: string;\n  waveformData?: number[];\n};\n\nexport type AudioPlayerPlayAudioParams = {\n  currentPlaybackRate?: number;\n  playbackRates?: number[];\n};\n\nexport type AudioPlayerState = {\n  /** Signals whether the browser can play the record. */\n  canPlayRecord: boolean;\n  /** Current playback speed. Initiated with the first item of the playbackRates array. */\n  currentPlaybackRate: number;\n  /** The audio element ref */\n  elementRef: HTMLAudioElement | null;\n  /** Signals whether the playback is in progress. */\n  isPlaying: boolean;\n  /** Keeps the latest playback error reference. */\n  playbackError: Error | null;\n  /** An array of fractional numeric values of playback speed to override the defaults (1.0, 1.5, 2.0) */\n  playbackRates: number[];\n  /** Playback progress expressed in percent. */\n  progressPercent: number;\n  /** Playback progress expressed in seconds. */\n  secondsElapsed: number;\n};\n\nexport type AudioPlayerOptions = AudioPlayerDescriptor & {\n  /** An array of fractional numeric values of playback speed to override the defaults (1.0, 1.5, 2.0) */\n  playbackRates?: number[];\n  plugins?: AudioPlayerPlugin[];\n  pool: AudioPlayerPool;\n};\n\nconst DEFAULT_PLAYBACK_RATES = [1.0, 1.5, 2.0];\n\nconst isSeekable = (audioElement: HTMLAudioElement) =>\n  !(audioElement.duration === Infinity || isNaN(audioElement.duration));\n\nexport const defaultRegisterAudioPlayerError = ({\n  error,\n}: RegisterAudioPlayerErrorParams = {}) => {\n  if (!error) return;\n  console.error('[AUDIO PLAYER]', error);\n};\n\nexport const elementIsPlaying = (audioElement: HTMLAudioElement | null) =>\n  audioElement && !(audioElement.paused || audioElement.ended);\n\nexport type SeekFn = (params: {\n  clientX: number;\n  currentTarget: HTMLDivElement;\n}) => Promise<void>;\n\nexport class AudioPlayer {\n  state: StateStore<AudioPlayerState>;\n  /** The audio MIME type that is checked before the audio is played. If the type is not supported the controller registers error in playbackError. */\n  private _data: AudioPlayerDescriptor;\n  private _plugins = new Map<string, AudioPlayerPlugin>();\n  private playTimeout: ReturnType<typeof setTimeout> | undefined = undefined;\n  private unsubscribeEventListeners: (() => void) | null = null;\n  private _pool: AudioPlayerPool;\n  private _disposed = false;\n  private _pendingLoadedMeta?: { element: HTMLAudioElement; onLoaded: () => void };\n  private _elementIsReadyPromise?: Promise<boolean>;\n  private _restoringPosition = false;\n  private _removalTimeout: ReturnType<typeof setTimeout> | undefined = undefined;\n\n  constructor({\n    durationSeconds,\n    fileSize,\n    id,\n    mimeType,\n    playbackRates: customPlaybackRates,\n    plugins,\n    pool,\n    src,\n    title,\n    waveformData,\n  }: AudioPlayerOptions) {\n    this._data = {\n      durationSeconds,\n      fileSize,\n      id,\n      mimeType,\n      src,\n      title,\n      waveformData,\n    };\n    this._pool = pool;\n    this.setPlugins(() => plugins ?? []);\n\n    const playbackRates = customPlaybackRates?.length\n      ? customPlaybackRates\n      : DEFAULT_PLAYBACK_RATES;\n\n    // do not create element here; only evaluate canPlayRecord cheaply\n    const canPlayRecord = mimeType ? !!new Audio().canPlayType(mimeType) : true;\n\n    this.state = new StateStore<AudioPlayerState>({\n      canPlayRecord,\n      currentPlaybackRate: playbackRates[0],\n      elementRef: null,\n      isPlaying: false,\n      playbackError: null,\n      playbackRates,\n      progressPercent: 0,\n      secondsElapsed: 0,\n    });\n\n    this.plugins.forEach((p) => p.onInit?.({ player: this }));\n  }\n\n  private get plugins(): AudioPlayerPlugin[] {\n    return Array.from(this._plugins.values());\n  }\n\n  get canPlayRecord() {\n    return this.state.getLatestValue().canPlayRecord;\n  }\n\n  get elementRef() {\n    return this.state.getLatestValue().elementRef;\n  }\n\n  get isPlaying(): boolean {\n    return this.state.getLatestValue().isPlaying;\n  }\n\n  get currentPlaybackRate() {\n    return this.state.getLatestValue().currentPlaybackRate;\n  }\n\n  get playbackRates() {\n    return this.state.getLatestValue().playbackRates;\n  }\n\n  get durationSeconds() {\n    return this._data.durationSeconds;\n  }\n\n  get fileSize() {\n    return this._data.fileSize;\n  }\n\n  get id() {\n    return this._data.id;\n  }\n\n  get src() {\n    return this._data.src;\n  }\n\n  get mimeType() {\n    return this._data.mimeType;\n  }\n\n  get title() {\n    return this._data.title;\n  }\n\n  get waveformData() {\n    return this._data.waveformData;\n  }\n\n  get secondsElapsed() {\n    return this.state.getLatestValue().secondsElapsed;\n  }\n\n  get progressPercent() {\n    return this.state.getLatestValue().progressPercent;\n  }\n\n  get disposed() {\n    return this._disposed;\n  }\n\n  private ensureElementRef(): HTMLAudioElement {\n    if (this._disposed) {\n      throw new Error('AudioPlayer is disposed');\n    }\n    if (!this.elementRef) {\n      const el = this._pool.acquireElement({\n        ownerId: this.id,\n        src: this.src,\n      });\n      this.setRef(el);\n    }\n    return this.elementRef as HTMLAudioElement;\n  }\n  private setPlaybackStartSafetyTimeout = () => {\n    clearTimeout(this.playTimeout);\n    this.playTimeout = setTimeout(() => {\n      if (!this.elementRef) return;\n      try {\n        this.elementRef.pause();\n        this.state.partialNext({ isPlaying: false });\n      } catch (e) {\n        this.registerError({ errCode: 'failed-to-start' });\n      }\n    }, 2000);\n  };\n\n  private clearPlaybackStartSafetyTimeout = () => {\n    if (!this.elementRef) return;\n    clearTimeout(this.playTimeout);\n    this.playTimeout = undefined;\n  };\n\n  private clearPendingLoadedMeta = () => {\n    const pending = this._pendingLoadedMeta;\n    if (pending?.element && pending.onLoaded) {\n      pending.element.removeEventListener('loadedmetadata', pending.onLoaded);\n    }\n    this._pendingLoadedMeta = undefined;\n  };\n\n  private restoreSavedPosition = (elementRef: HTMLAudioElement) => {\n    const saved = this.secondsElapsed;\n    if (!saved || saved <= 0) return;\n    const apply = () => {\n      const duration = elementRef.duration;\n      const clamped =\n        typeof duration === 'number' && !isNaN(duration) && isFinite(duration)\n          ? Math.min(saved, duration)\n          : saved;\n      try {\n        if (elementRef.currentTime === clamped) return;\n        elementRef.currentTime = clamped;\n        // Preempt UI with restored position to avoid flicker\n        this.setSecondsElapsed(clamped);\n      } catch {\n        // ignore\n      }\n    };\n    // No information is available about the media resource.\n    if (elementRef.readyState < 1) {\n      this.clearPendingLoadedMeta();\n      this._restoringPosition = true;\n      const onLoaded = () => {\n        // Ensure this callback still belongs to the same pending registration and same element\n        if (this._pendingLoadedMeta?.onLoaded !== onLoaded) return;\n        this._pendingLoadedMeta = undefined;\n        if (this.elementRef !== elementRef) {\n          this._restoringPosition = false;\n          return;\n        }\n        apply();\n        this._restoringPosition = false;\n      };\n      elementRef.addEventListener('loadedmetadata', onLoaded, { once: true });\n      this._pendingLoadedMeta = { element: elementRef, onLoaded };\n    } else {\n      this._restoringPosition = true;\n      apply();\n      this._restoringPosition = false;\n    }\n  };\n\n  setDescriptor(descriptor: AudioPlayerDescriptor) {\n    this._data = { ...this._data, ...descriptor };\n    if (descriptor.src !== this.src && this.elementRef) {\n      this.elementRef.src = descriptor.src;\n    }\n  }\n\n  private releaseElement({ resetState }: { resetState: boolean }) {\n    this.clearPendingLoadedMeta();\n    this._restoringPosition = false;\n    if (resetState) {\n      this.stop();\n    } else {\n      // Ensure isPlaying reflects reality, but keep progress/seconds\n      this.state.partialNext({ isPlaying: false });\n      if (this.elementRef) {\n        try {\n          this.elementRef.pause();\n        } catch {\n          // ignore\n        }\n      }\n    }\n    if (this.elementRef) {\n      this._pool.releaseElement(this.id);\n      this.setRef(null);\n    }\n  }\n\n  private elementIsReady = (): Promise<boolean> => {\n    if (this._elementIsReadyPromise) return this._elementIsReadyPromise;\n\n    this._elementIsReadyPromise = new Promise((resolve) => {\n      if (!this.elementRef) return resolve(false);\n      const element = this.elementRef;\n      const handleLoaded = () => {\n        element.removeEventListener('loadedmetadata', handleLoaded);\n        resolve(element.readyState > 0);\n      };\n      element.addEventListener('loadedmetadata', handleLoaded);\n    });\n\n    return this._elementIsReadyPromise;\n  };\n\n  private setRef = (elementRef: HTMLAudioElement | null) => {\n    if (elementIsPlaying(this.elementRef)) {\n      // preserve state during swap\n      this.releaseElement({ resetState: false });\n    }\n    this.clearPendingLoadedMeta();\n    this._restoringPosition = false;\n    this._elementIsReadyPromise = undefined;\n    this.state.partialNext({ elementRef });\n    // When a new element is attached, make sure listeners are wired to it\n    if (elementRef) {\n      this.registerSubscriptions();\n    }\n  };\n\n  setSecondsElapsed = (secondsElapsed: number) => {\n    this.state.partialNext({\n      progressPercent:\n        this.elementRef && secondsElapsed\n          ? (secondsElapsed / this.elementRef.duration) * 100\n          : 0,\n      secondsElapsed,\n    });\n  };\n\n  setPlugins(setter: (currentPlugins: AudioPlayerPlugin[]) => AudioPlayerPlugin[]) {\n    this._plugins = setter(this.plugins).reduce((acc, plugin) => {\n      if (plugin.id) {\n        acc.set(plugin.id, plugin);\n      }\n      return acc;\n    }, new Map<string, AudioPlayerPlugin>());\n  }\n\n  canPlayMimeType = (mimeType: string) => {\n    if (!mimeType) return false;\n    if (this.elementRef) return !!this.elementRef.canPlayType(mimeType);\n    return !!new Audio().canPlayType(mimeType);\n  };\n\n  play = async (params?: AudioPlayerPlayAudioParams) => {\n    if (this._disposed) return;\n    const elementRef = this.ensureElementRef();\n    if (elementIsPlaying(this.elementRef)) {\n      if (this.isPlaying) return;\n      this.state.partialNext({ isPlaying: true });\n      return;\n    }\n\n    const { currentPlaybackRate, playbackRates } = {\n      currentPlaybackRate: this.currentPlaybackRate,\n      playbackRates: this.playbackRates,\n      ...params,\n    };\n\n    if (!this.canPlayRecord) {\n      this.registerError({ errCode: 'not-playable' });\n      return;\n    }\n\n    // Restore last known position for this player before attempting to play\n    this.restoreSavedPosition(elementRef);\n\n    elementRef.playbackRate = currentPlaybackRate ?? this.currentPlaybackRate;\n\n    this.setPlaybackStartSafetyTimeout();\n\n    try {\n      await elementRef.play();\n      this.state.partialNext({\n        currentPlaybackRate,\n        isPlaying: true,\n        playbackRates,\n      });\n      this._pool.setActiveAudioPlayer(this);\n    } catch (e) {\n      this.registerError({ error: e as Error });\n      this.state.partialNext({ isPlaying: false });\n    } finally {\n      this.clearPlaybackStartSafetyTimeout();\n    }\n  };\n\n  pause = () => {\n    if (!elementIsPlaying(this.elementRef)) return;\n    this.clearPlaybackStartSafetyTimeout();\n\n    // existence of the element already checked by elementIsPlaying\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    this.elementRef!.pause();\n    this.state.partialNext({ isPlaying: false });\n  };\n\n  stop = () => {\n    this.pause();\n    this.setSecondsElapsed(0);\n    if (this.elementRef) this.elementRef.currentTime = 0;\n  };\n\n  togglePlay = async () => (this.isPlaying ? this.pause() : await this.play());\n\n  increasePlaybackRate = () => {\n    if (!this.elementRef) return;\n    let currentPlaybackRateIndex = this.state\n      .getLatestValue()\n      .playbackRates.findIndex((rate) => rate === this.currentPlaybackRate);\n    if (currentPlaybackRateIndex === -1) {\n      currentPlaybackRateIndex = 0;\n    }\n    const nextIndex =\n      currentPlaybackRateIndex === this.playbackRates.length - 1\n        ? 0\n        : currentPlaybackRateIndex + 1;\n    const currentPlaybackRate = this.playbackRates[nextIndex];\n    this.state.partialNext({ currentPlaybackRate });\n    this.elementRef.playbackRate = currentPlaybackRate;\n  };\n\n  seek = throttle<SeekFn>(async ({ clientX, currentTarget }) => {\n    let element = this.elementRef;\n    if (!this.elementRef) {\n      element = this.ensureElementRef();\n      const isReady = await this.elementIsReady();\n      if (!isReady) return;\n    }\n    if (!currentTarget || !element) return;\n    if (!isSeekable(element)) {\n      this.registerError({ errCode: 'seek-not-supported' });\n      return;\n    }\n\n    const { width, x } = currentTarget.getBoundingClientRect();\n\n    const ratio = (clientX - x) / width;\n    if (ratio > 1 || ratio < 0) return;\n    const currentTime = ratio * element.duration;\n    this.setSecondsElapsed(currentTime);\n    element.currentTime = currentTime;\n  }, 16);\n\n  registerError = (params: RegisterAudioPlayerErrorParams) => {\n    defaultRegisterAudioPlayerError(params);\n    this.plugins.forEach(({ onError }) => onError?.({ player: this, ...params }));\n  };\n\n  /**\n   * Removes the audio element reference, event listeners and audio player from the player pool.\n   * Helpful when only a single AudioPlayer instance is to be removed from the AudioPlayerPool.\n   */\n  requestRemoval = () => {\n    this._disposed = true;\n    this.cancelScheduledRemoval();\n    this.clearPendingLoadedMeta();\n    this._restoringPosition = false;\n    this.releaseElement({ resetState: true });\n    this.unsubscribeEventListeners?.();\n    this.unsubscribeEventListeners = null;\n    this.plugins.forEach(({ onRemove }) => onRemove?.({ player: this }));\n    this._pool.deregister(this.id);\n  };\n\n  cancelScheduledRemoval = () => {\n    clearTimeout(this._removalTimeout);\n    this._removalTimeout = undefined;\n  };\n\n  scheduleRemoval = (ms: number = 0) => {\n    this.cancelScheduledRemoval();\n    this._removalTimeout = setTimeout(() => {\n      if (this.disposed) return;\n      this.requestRemoval();\n    }, ms);\n  };\n\n  /**\n   * Releases only the underlying element back to the pool without disposing the player instance.\n   * Used by the pool to hand off the shared element in single-playback mode.\n   */\n  releaseElementForHandoff = () => {\n    if (!this.elementRef) return;\n    this.releaseElement({ resetState: false });\n    this.unsubscribeEventListeners?.();\n    this.unsubscribeEventListeners = null;\n  };\n\n  registerSubscriptions = () => {\n    this.unsubscribeEventListeners?.();\n\n    const audioElement = this.elementRef;\n    if (!audioElement) return;\n\n    const handleEnded = () => {\n      this.state.partialNext({\n        isPlaying: false,\n        secondsElapsed: audioElement?.duration ?? this.durationSeconds ?? 0,\n      });\n    };\n\n    const handleError = (e: HTMLMediaElementEventMap['error']) => {\n      // if fired probably is one of these (e.srcElement.error.code)\n      // 1 = MEDIA_ERR_ABORTED         (fetch aborted by user/JS)\n      // 2 = MEDIA_ERR_NETWORK         (network failed while fetching)\n      // 3 = MEDIA_ERR_DECODE          (data fetched but couldn\u2019t decode)\n      // 4 = MEDIA_ERR_SRC_NOT_SUPPORTED (no resource supported / bad type)\n      // reported during the mount so only logging to the console\n      const audio = e.currentTarget as HTMLAudioElement | null;\n      const state: Partial<AudioPlayerState> = { isPlaying: false };\n\n      if (!audio?.error?.code) {\n        this.state.partialNext(state);\n        return;\n      }\n\n      if (audio.error.code === 4) {\n        state.canPlayRecord = false;\n        this.state.partialNext(state);\n      }\n\n      const errorMsg = [\n        undefined,\n        'MEDIA_ERR_ABORTED: fetch aborted by user',\n        'MEDIA_ERR_NETWORK: network failed while fetching',\n        'MEDIA_ERR_DECODE: audio fetched but couldn\u2019t decode',\n        'MEDIA_ERR_SRC_NOT_SUPPORTED: source not supported',\n      ][audio?.error?.code];\n      if (!errorMsg) return;\n\n      defaultRegisterAudioPlayerError({ error: new Error(errorMsg + ` (${audio.src})`) });\n    };\n\n    const handleTimeupdate = () => {\n      const t = audioElement?.currentTime ?? 0;\n      // Ignore spurious zero during restore/handoff to avoid UI flicker\n      if (this._restoringPosition && t === 0) return;\n      // Also avoid regressing UI to zero if we already have non-zero progress and we're not playing\n      if (!this.isPlaying && t === 0 && this.secondsElapsed > 0) return;\n      this.setSecondsElapsed(t);\n    };\n\n    audioElement.addEventListener('ended', handleEnded);\n    audioElement.addEventListener('error', handleError);\n    audioElement.addEventListener('timeupdate', handleTimeupdate);\n\n    this.unsubscribeEventListeners = () => {\n      audioElement.pause();\n      audioElement.removeEventListener('ended', handleEnded);\n      audioElement.removeEventListener('error', handleError);\n      audioElement.removeEventListener('timeupdate', handleTimeupdate);\n    };\n  };\n}\n", "import React, { useContext, useState } from 'react';\nimport { useEffect } from 'react';\nimport type { AudioPlayerOptions } from './AudioPlayer';\nimport type { AudioPlayerPoolState } from './AudioPlayerPool';\nimport { AudioPlayerPool } from './AudioPlayerPool';\nimport { audioPlayerNotificationsPluginFactory } from './plugins/AudioPlayerNotificationsPlugin';\nimport { useChatContext, useTranslationContext } from '../../context';\nimport { useStateStore } from '../../store';\n\nexport type WithAudioPlaybackProps = {\n  children?: React.ReactNode;\n  allowConcurrentPlayback?: boolean;\n};\n\nconst AudioPlayerContext = React.createContext<{ audioPlayers: AudioPlayerPool | null }>({\n  audioPlayers: null,\n});\n\nexport const WithAudioPlayback = ({\n  allowConcurrentPlayback,\n  children,\n}: WithAudioPlaybackProps) => {\n  const [audioPlayers] = useState(() => new AudioPlayerPool({ allowConcurrentPlayback }));\n\n  useEffect(\n    () => () => {\n      audioPlayers.clear();\n    },\n    [audioPlayers],\n  );\n\n  return (\n    <AudioPlayerContext.Provider value={{ audioPlayers }}>\n      {children}\n    </AudioPlayerContext.Provider>\n  );\n};\n\nexport type UseAudioPlayerProps = {\n  /**\n   * Identifier of the entity that requested the audio playback, e.g. message ID.\n   * Asset to specific audio player is a many-to-many relationship\n   * - one URL can be associated with multiple UI elements,\n   * - one UI element can display multiple audio sources.\n   * Therefore, the AudioPlayer ID is a combination of request:src.\n   *\n   * The requester string can take into consideration whether there are multiple instances of\n   * the same URL requested by the same requester (message has multiple attachments with the same asset URL).\n   * In reality the fact that one message has multiple attachments with the same asset URL\n   * could be considered a bad practice or a bug.\n   */\n  requester?: string;\n} & Partial<Omit<AudioPlayerOptions, 'id' | 'pool'>>;\n\nconst makeAudioPlayerId = ({ requester, src }: { src: string; requester?: string }) =>\n  `${requester ?? 'requester-unknown'}:${src}`;\n\nexport const useAudioPlayer = ({\n  durationSeconds,\n  fileSize,\n  mimeType,\n  playbackRates,\n  plugins,\n  requester = '',\n  src,\n  title,\n  waveformData,\n}: UseAudioPlayerProps) => {\n  const { client } = useChatContext();\n  const { t } = useTranslationContext();\n  const { audioPlayers } = useContext(AudioPlayerContext);\n\n  const audioPlayer =\n    src && audioPlayers\n      ? audioPlayers.getOrAdd({\n          durationSeconds,\n          fileSize,\n          id: makeAudioPlayerId({ requester, src }),\n          mimeType,\n          playbackRates,\n          plugins,\n          src,\n          title,\n          waveformData,\n        })\n      : undefined;\n\n  useEffect(() => {\n    if (!audioPlayer) return;\n    /**\n     * Avoid having to pass client and translation function to AudioPlayer instances\n     * and instead provide plugin that takes care of translated notifications.\n     */\n    const notificationsPlugin = audioPlayerNotificationsPluginFactory({ client, t });\n    audioPlayer.setPlugins((currentPlugins) => [\n      ...currentPlugins.filter((plugin) => plugin.id !== notificationsPlugin.id),\n      notificationsPlugin,\n    ]);\n  }, [audioPlayer, client, t]);\n\n  return audioPlayer;\n};\n\nconst activeAudioPlayerSelector = ({ activeAudioPlayer }: AudioPlayerPoolState) => ({\n  activeAudioPlayer,\n});\n\nexport const useActiveAudioPlayer = () => {\n  const { audioPlayers } = useContext(AudioPlayerContext);\n  const { activeAudioPlayer } =\n    useStateStore(audioPlayers?.state, activeAudioPlayerSelector) ?? {};\n  return activeAudioPlayer;\n};\n", "import { AudioPlayer, type AudioPlayerOptions } from './AudioPlayer';\nimport { StateStore } from 'stream-chat';\n\nexport type AudioPlayerPoolState = {\n  activeAudioPlayer: AudioPlayer | null;\n};\n\nexport class AudioPlayerPool {\n  state: StateStore<AudioPlayerPoolState> = new StateStore<AudioPlayerPoolState>({\n    activeAudioPlayer: null,\n  });\n  private pool = new Map<string, AudioPlayer>();\n  private audios = new Map<string, HTMLAudioElement>();\n  private sharedAudio: HTMLAudioElement | null = null;\n  private sharedOwnerId: string | null = null;\n  private readonly allowConcurrentPlayback: boolean;\n\n  constructor(config?: { allowConcurrentPlayback?: boolean }) {\n    this.allowConcurrentPlayback = !!config?.allowConcurrentPlayback;\n  }\n\n  get players() {\n    return Array.from(this.pool.values());\n  }\n\n  get activeAudioPlayer() {\n    return this.state.getLatestValue().activeAudioPlayer;\n  }\n\n  getOrAdd = (params: Omit<AudioPlayerOptions, 'pool'>) => {\n    const { playbackRates, plugins, ...descriptor } = params;\n    let player = this.pool.get(params.id);\n    if (player) {\n      if (!player.disposed) {\n        player.setDescriptor(descriptor);\n        return player;\n      }\n      this.deregister(params.id);\n    }\n    player = new AudioPlayer({\n      playbackRates,\n      plugins,\n      ...descriptor,\n      pool: this,\n    });\n    this.pool.set(params.id, player);\n    return player;\n  };\n\n  /**\n   * In case of allowConcurrentPlayback enabled, a new Audio is created and assigned to the given audioPlayer owner.\n   * In case of disabled concurrency, the shared audio ownership is transferred to the new owner loading the owner's\n   * source.\n   *\n   * @param ownerId\n   * @param src\n   */\n  acquireElement = ({ ownerId, src }: { ownerId: string; src: string }) => {\n    if (!this.allowConcurrentPlayback) {\n      // Single shared element mode\n      if (!this.sharedAudio) {\n        this.sharedAudio = new Audio();\n      }\n      // Handoff from previous owner if different\n      if (this.sharedOwnerId && this.sharedOwnerId !== ownerId) {\n        const previous = this.pool.get(this.sharedOwnerId);\n        // Ask previous to pause and drop ref, but keep player in pool\n        previous?.pause();\n        previous?.releaseElementForHandoff();\n      }\n      this.sharedOwnerId = ownerId;\n      if (this.sharedAudio.src !== src) {\n        // setting src starts loading; avoid explicit load() to prevent currentTime reset flicker\n        this.sharedAudio.src = src;\n      }\n      return this.sharedAudio;\n    }\n\n    // Concurrent-per-owner mode\n    let audio = this.audios.get(ownerId);\n    if (!audio) {\n      audio = new Audio();\n      this.audios.set(ownerId, audio);\n    }\n    if (audio.src !== src) {\n      // setting src starts loading; avoid explicit load() here as well\n      audio.src = src;\n    }\n    return audio;\n  };\n\n  /**\n   * Removes the given audio players ownership of the shared audio element (in case of concurrent playback is disabled)\n   * and pauses the reproduction of the audio.\n   * In case of concurrent playback mode (allowConcurrentPlayback enabled), the audio is paused,\n   * its source cleared and removed from the audios pool readied for garbage collection.\n   *\n   * @param ownerId\n   */\n  releaseElement = (ownerId: string) => {\n    if (!this.allowConcurrentPlayback) {\n      if (this.sharedOwnerId !== ownerId) return;\n      const el = this.sharedAudio;\n      if (el) {\n        try {\n          el.pause();\n        } catch {\n          // ignore\n        }\n        el.removeAttribute('src');\n        el.load();\n      }\n      // Keep shared element instance for reuse\n      this.sharedOwnerId = null;\n      return;\n    }\n\n    const el = this.audios.get(ownerId);\n    if (!el) return;\n    try {\n      el.pause();\n    } catch {\n      // ignore\n    }\n    el.removeAttribute('src');\n    el.load();\n    this.audios.delete(ownerId);\n  };\n\n  /** Sets active audio player when allowConcurrentPlayback is disabled */\n  setActiveAudioPlayer = (activeAudioPlayer: AudioPlayer | null) => {\n    if (this.allowConcurrentPlayback) return;\n    this.state.partialNext({ activeAudioPlayer });\n  };\n\n  /** Removes the AudioPlayer instance from the pool of players */\n  deregister(id: string) {\n    if (this.pool.has(id)) {\n      this.pool.delete(id);\n    }\n    if (this.activeAudioPlayer?.id === id) {\n      this.setActiveAudioPlayer(null);\n    }\n  }\n\n  /** Performs all the necessary cleanup actions and removes the player from the pool */\n  remove = (id: string) => {\n    const player = this.pool.get(id);\n    if (!player) return;\n    player.requestRemoval();\n  };\n\n  /** Removes and cleans up all the players from the pool */\n  clear = () => {\n    this.players.forEach((player) => {\n      this.remove(player.id);\n    });\n  };\n\n  registerSubscriptions = () => {\n    // Only register subscriptions for players that have an attached element.\n    // Avoid creating elements or cross-wiring listeners on the shared element in single-playback mode.\n    this.players.forEach((p) => {\n      if (p.elementRef) {\n        p.registerSubscriptions();\n      }\n    });\n  };\n}\n", "import type { AudioPlayerPlugin } from './AudioPlayerPlugin';\nimport { type AudioPlayerErrorCode } from '../AudioPlayer';\nimport type { StreamChat } from 'stream-chat';\nimport type { TFunction } from 'i18next';\n\nexport const audioPlayerNotificationsPluginFactory = ({\n  client,\n  t,\n}: {\n  client: StreamChat;\n  t: TFunction;\n}): AudioPlayerPlugin => {\n  const errors: Record<AudioPlayerErrorCode, Error> = {\n    'failed-to-start': new Error(t('Failed to play the recording')),\n    'not-playable': new Error(\n      t('Recording format is not supported and cannot be reproduced'),\n    ),\n    'seek-not-supported': new Error(t('Cannot seek in the recording')),\n  };\n\n  return {\n    id: 'AudioPlayerNotificationsPlugin',\n    onError: ({ errCode, error: e }) => {\n      const error =\n        (errCode && errors[errCode]) ??\n        e ??\n        new Error(t('Error reproducing the recording'));\n\n      client?.notifications.addError({\n        message: error.message,\n        options: {\n          originalError: error,\n          type: 'browser:audio:playback:error',\n        },\n        origin: {\n          emitter: 'AudioPlayer',\n        },\n      });\n    },\n  };\n};\n", "import React from 'react';\nimport type { Attachment } from 'stream-chat';\n\nimport {\n  FileSizeIndicator,\n  PlaybackRateButton,\n  PlayButton,\n  WaveProgressBar,\n} from './components';\nimport { displayDuration } from './utils';\nimport { FileIcon } from '../ReactFileUtilities';\nimport { useMessageContext, useTranslationContext } from '../../context';\nimport { type AudioPlayerState, useAudioPlayer } from '../AudioPlayback/';\nimport { useStateStore } from '../../store';\nimport type { AudioPlayer } from '../AudioPlayback/AudioPlayer';\n\nconst rootClassName = 'str-chat__message-attachment__voice-recording-widget';\n\nconst audioPlayerStateSelector = (state: AudioPlayerState) => ({\n  canPlayRecord: state.canPlayRecord,\n  isPlaying: state.isPlaying,\n  playbackRate: state.currentPlaybackRate,\n  progress: state.progressPercent,\n  secondsElapsed: state.secondsElapsed,\n});\n\ntype VoiceRecordingPlayerUIProps = {\n  audioPlayer: AudioPlayer;\n};\n\n// todo: finish creating a BaseAudioPlayer derived from VoiceRecordingPlayerUI and AudioAttachmentUI\nconst VoiceRecordingPlayerUI = ({ audioPlayer }: VoiceRecordingPlayerUIProps) => {\n  const { canPlayRecord, isPlaying, playbackRate, progress, secondsElapsed } =\n    useStateStore(audioPlayer?.state, audioPlayerStateSelector) ?? {};\n\n  const displayedDuration = secondsElapsed || audioPlayer.durationSeconds;\n\n  return (\n    <div className={rootClassName} data-testid='voice-recording-widget'>\n      <PlayButton isPlaying={!!isPlaying} onClick={audioPlayer.togglePlay} />\n      <div className='str-chat__message-attachment__voice-recording-widget__metadata'>\n        <div\n          className='str-chat__message-attachment__voice-recording-widget__title'\n          data-testid='voice-recording-title'\n          title={audioPlayer.title}\n        >\n          {audioPlayer.title}\n        </div>\n        <div className='str-chat__message-attachment__voice-recording-widget__audio-state'>\n          <div className='str-chat__message-attachment__voice-recording-widget__timer'>\n            {audioPlayer.durationSeconds ? (\n              displayDuration(displayedDuration)\n            ) : (\n              <FileSizeIndicator\n                fileSize={audioPlayer.fileSize}\n                maximumFractionDigits={0}\n              />\n            )}\n          </div>\n          <WaveProgressBar\n            progress={progress}\n            seek={audioPlayer.seek}\n            waveformData={audioPlayer.waveformData || []}\n          />\n        </div>\n      </div>\n      <div className='str-chat__message-attachment__voice-recording-widget__right-section'>\n        {isPlaying ? (\n          <PlaybackRateButton\n            disabled={!canPlayRecord}\n            onClick={audioPlayer.increasePlaybackRate}\n          >\n            {playbackRate?.toFixed(1)}x\n          </PlaybackRateButton>\n        ) : (\n          <FileIcon big={true} mimeType={audioPlayer.mimeType} size={40} />\n        )}\n      </div>\n    </div>\n  );\n};\n\nexport type VoiceRecordingPlayerProps = Pick<VoiceRecordingProps, 'attachment'> & {\n  /** An array of fractional numeric values of playback speed to override the defaults (1.0, 1.5, 2.0) */\n  playbackRates?: number[];\n};\n\nexport const VoiceRecordingPlayer = ({\n  attachment,\n  playbackRates,\n}: VoiceRecordingPlayerProps) => {\n  const { t } = useTranslationContext();\n  const {\n    asset_url,\n    duration = 0,\n    file_size,\n    mime_type,\n    title = t('Voice message'),\n    waveform_data,\n  } = attachment;\n\n  /**\n   * Introducing message context. This could be breaking change, therefore the fallback to {} is provided.\n   * If this component is used outside the message context, then there will be no audio player namespacing\n   * => scrolling away from the message in virtualized ML would create a new AudioPlayer instance.\n   *\n   * Edge case: the requester (message) has multiple attachments with the same assetURL - does not happen\n   * with the default SDK components, but can be done with custom API calls.In this case all the Audio\n   * widgets will share the state.\n   */\n  const { message, threadList } = useMessageContext() ?? {};\n\n  const audioPlayer = useAudioPlayer({\n    durationSeconds: duration ?? 0,\n    fileSize: file_size,\n    mimeType: mime_type,\n    playbackRates,\n    requester:\n      message?.id &&\n      `${threadList ? (message.parent_id ?? message.id) : ''}${message.id}`,\n    src: asset_url,\n    title,\n    waveformData: waveform_data,\n  });\n\n  return audioPlayer ? <VoiceRecordingPlayerUI audioPlayer={audioPlayer} /> : null;\n};\n\nexport type QuotedVoiceRecordingProps = Pick<VoiceRecordingProps, 'attachment'>;\n\nexport const QuotedVoiceRecording = ({ attachment }: QuotedVoiceRecordingProps) => {\n  const { t } = useTranslationContext();\n  const title = attachment.title || t('Voice message');\n  return (\n    <div className={rootClassName} data-testid='quoted-voice-recording-widget'>\n      <div className='str-chat__message-attachment__voice-recording-widget__metadata'>\n        {title && (\n          <div\n            className='str-chat__message-attachment__voice-recording-widget__title'\n            data-testid='voice-recording-title'\n            title={title}\n          >\n            {title}\n          </div>\n        )}\n        <div className='str-chat__message-attachment__voice-recording-widget__audio-state'>\n          <div className='str-chat__message-attachment__voice-recording-widget__timer'>\n            {attachment.duration ? (\n              displayDuration(attachment.duration)\n            ) : (\n              <FileSizeIndicator\n                fileSize={attachment.file_size}\n                maximumFractionDigits={0}\n              />\n            )}\n          </div>\n        </div>\n      </div>\n      <FileIcon big={true} mimeType={attachment.mime_type} size={34} />\n    </div>\n  );\n};\n\nexport type VoiceRecordingProps = {\n  /** The attachment object from the message's attachment list. */\n  attachment: Attachment;\n  /** A boolean flag to signal whether the attachment will be rendered inside the quoted reply. */\n  isQuoted?: boolean;\n};\n\nexport const VoiceRecording = ({ attachment, isQuoted }: VoiceRecordingProps) =>\n  isQuoted ? (\n    <QuotedVoiceRecording attachment={attachment} />\n  ) : (\n    <VoiceRecordingPlayer attachment={attachment} />\n  );\n", "import React from 'react';\n\nimport type { IconType } from './iconMap';\nimport { iconMap } from './iconMap';\n\nexport type FileIconProps = {\n  big?: boolean;\n  className?: string;\n  filename?: string;\n  mimeType?: string;\n  size?: number; // big icon on sent attachment\n  sizeSmall?: number; // small icon on file upload preview\n  type?: IconType;\n};\n\nexport function mimeTypeToIcon(type: IconType = 'standard', mimeType?: string) {\n  const theMap = iconMap[type] || iconMap['standard'];\n\n  if (!mimeType) return theMap.fallback;\n\n  const icon = theMap[mimeType];\n  if (icon) return icon;\n\n  if (mimeType.startsWith('audio/')) return theMap['audio/'];\n  if (mimeType.startsWith('video/')) return theMap['video/'];\n  if (mimeType.startsWith('image/')) return theMap['image/'];\n  if (mimeType.startsWith('text/')) return theMap['text/'];\n\n  return theMap.fallback;\n}\n\nexport const FileIcon = (props: FileIconProps) => {\n  const {\n    big = false,\n    mimeType,\n    size = 50,\n    sizeSmall = 20,\n    type = 'standard',\n    ...rest\n  } = props;\n\n  const Icon = mimeTypeToIcon(type, mimeType);\n\n  return <Icon {...rest} size={big ? size : sizeSmall} />;\n};\n", "import type { ComponentPropsWithoutRef } from 'react';\nimport React from 'react';\nimport clsx from 'clsx';\n\nexport type IconTypeV2 = 'standard' | 'alt';\n\nexport type IconProps = {\n  mimeType?: string;\n  size?: number;\n  type?: IconTypeV2;\n} & ComponentPropsWithoutRef<'svg'>;\n\nconst DEFAULT_SIZE = 40;\n\nexport const FilePdfIcon = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-pdf', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V3Z'\n      fill='#F5F5F5'\n    />\n    <path\n      d='M0 28H34V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V28Z'\n      fill='#E71A01'\n    />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#DBDBDB' />\n    <path\n      clipRule='evenodd'\n      d='M16.39 8.90641C16.215 8.27341 15.787 7.95841 15.426 8.00441C14.99 8.06141 14.526 8.32041 14.34 8.72941C13.854 9.82141 14.768 12.8934 15.028 13.7674L15.073 13.9194C14.015 17.1134 10.394 23.4264 8.62002 23.8534C8.58302 23.4364 8.80602 22.2294 11.146 20.7244C11.266 20.5944 11.406 20.4374 11.471 20.3344C9.49302 21.3004 6.93108 22.8514 8.47102 24.0114C8.55602 24.0774 8.68502 24.1314 8.83402 24.1874C10.014 24.6244 11.666 23.1954 13.327 19.9544C15.157 19.3504 16.633 18.8964 18.722 18.5804C21.005 20.1304 22.538 20.4464 23.578 20.0474C23.866 19.9354 24.32 19.5734 24.45 19.1004C24.515 18.8774 24.608 18.5154 24.432 18.2274C23.842 17.2664 21.452 17.5954 20.032 17.7904C19.779 17.8254 19.557 17.8564 19.381 17.8744C17.552 16.7704 16.289 14.8014 15.778 13.3804C15.857 13.0784 15.936 12.7894 16.012 12.5124C16.397 11.1124 16.701 10.0064 16.392 8.90641H16.39ZM24.45 19.1004C23.605 20.1404 21.628 19.4164 20.05 18.4224C21.507 18.2644 23.01 18.1724 23.661 18.3764C24.488 18.6364 24.459 19.0444 24.451 19.1004H24.45ZM15.601 12.7404C15.296 11.6544 14.868 9.24041 15.555 8.46041C16.701 9.11641 16.266 10.5384 15.825 11.9834C15.748 12.2364 15.671 12.4894 15.601 12.7404ZM13.439 19.5834C15.156 18.9054 16.354 18.4494 18.118 18.1254C16.818 16.9554 16.028 15.6834 15.378 14.3834C14.915 16.0554 13.948 18.5894 13.438 19.5834H13.439Z'\n      fill='#E71A01'\n      fillRule='evenodd'\n    />\n    <path\n      d='M13.1719 33.0127V37.4219H12.1875V32.3018H13.1001L13.1719 33.0127ZM15.5132 34.1099V34.1816C15.5132 34.4505 15.4813 34.7 15.4175 34.9302C15.356 35.1603 15.2648 35.3608 15.144 35.5317C15.0233 35.7004 14.8729 35.8325 14.6929 35.9282C14.5151 36.0216 14.3101 36.0684 14.0776 36.0684C13.8521 36.0684 13.6561 36.0228 13.4897 35.9316C13.3234 35.8405 13.1833 35.7129 13.0693 35.5488C12.9577 35.3825 12.8677 35.1899 12.7993 34.9712C12.731 34.7524 12.6785 34.5177 12.6421 34.2671V34.0791C12.6785 33.8102 12.731 33.5641 12.7993 33.3408C12.8677 33.1152 12.9577 32.9204 13.0693 32.7563C13.1833 32.59 13.3223 32.4613 13.4863 32.3701C13.6527 32.279 13.8475 32.2334 14.0708 32.2334C14.3055 32.2334 14.5117 32.2778 14.6895 32.3667C14.8695 32.4556 15.0199 32.5832 15.1406 32.7495C15.2637 32.9159 15.356 33.1141 15.4175 33.3442C15.4813 33.5744 15.5132 33.8296 15.5132 34.1099ZM14.5254 34.1816V34.1099C14.5254 33.9526 14.5117 33.8079 14.4844 33.6758C14.4593 33.5413 14.4183 33.424 14.3613 33.3237C14.3066 33.2235 14.2337 33.146 14.1426 33.0913C14.0537 33.0343 13.9455 33.0059 13.8179 33.0059C13.6834 33.0059 13.5684 33.0275 13.4727 33.0708C13.3792 33.1141 13.3029 33.1768 13.2437 33.2588C13.1844 33.3408 13.14 33.4388 13.1104 33.5527C13.0807 33.6667 13.0625 33.7954 13.0557 33.939V34.4141C13.0671 34.5827 13.099 34.7342 13.1514 34.8687C13.2038 35.0008 13.2847 35.1056 13.394 35.1831C13.5034 35.2606 13.647 35.2993 13.8247 35.2993C13.9546 35.2993 14.064 35.2708 14.1528 35.2139C14.2417 35.1546 14.3135 35.0737 14.3682 34.9712C14.4251 34.8687 14.465 34.7502 14.4878 34.6157C14.5129 34.4813 14.5254 34.3366 14.5254 34.1816ZM18.3091 35.1934V30.75H19.3003V36H18.4082L18.3091 35.1934ZM15.9712 34.1953V34.1235C15.9712 33.841 16.0031 33.5846 16.0669 33.3545C16.1307 33.1221 16.2241 32.9227 16.3472 32.7563C16.4702 32.59 16.6217 32.4613 16.8018 32.3701C16.9818 32.279 17.1868 32.2334 17.417 32.2334C17.6335 32.2334 17.8226 32.279 17.9844 32.3701C18.1484 32.4613 18.2874 32.5911 18.4014 32.7598C18.5176 32.9261 18.611 33.1232 18.6816 33.3511C18.7523 33.5767 18.8035 33.8239 18.8354 34.0928V34.25C18.8035 34.5075 18.7523 34.7467 18.6816 34.9678C18.611 35.1888 18.5176 35.3825 18.4014 35.5488C18.2874 35.7129 18.1484 35.8405 17.9844 35.9316C17.8203 36.0228 17.6289 36.0684 17.4102 36.0684C17.18 36.0684 16.9749 36.0216 16.7949 35.9282C16.6172 35.8348 16.4668 35.7038 16.3438 35.5352C16.223 35.3665 16.1307 35.1683 16.0669 34.9404C16.0031 34.7126 15.9712 34.4642 15.9712 34.1953ZM16.9556 34.1235V34.1953C16.9556 34.348 16.967 34.4904 16.9897 34.6226C17.0148 34.7547 17.0547 34.8721 17.1094 34.9746C17.1663 35.0749 17.2393 35.1535 17.3281 35.2104C17.4193 35.2651 17.5298 35.2925 17.6597 35.2925C17.8283 35.2925 17.9673 35.2549 18.0767 35.1797C18.186 35.1022 18.2692 34.9963 18.3262 34.8618C18.3854 34.7274 18.4196 34.5724 18.4287 34.397V33.9492C18.4219 33.8057 18.4014 33.6769 18.3672 33.563C18.3353 33.4468 18.2874 33.3477 18.2236 33.2656C18.1621 33.1836 18.0846 33.1198 17.9912 33.0742C17.9001 33.0286 17.7918 33.0059 17.6665 33.0059C17.5389 33.0059 17.4295 33.0355 17.3384 33.0947C17.2472 33.1517 17.1732 33.2303 17.1162 33.3306C17.0615 33.4308 17.0205 33.5493 16.9932 33.686C16.9681 33.8205 16.9556 33.9663 16.9556 34.1235ZM21.3237 36H20.3325V31.9736C20.3325 31.6934 20.3872 31.4575 20.4966 31.2661C20.6082 31.0724 20.7643 30.9266 20.9648 30.8286C21.1676 30.7284 21.408 30.6782 21.686 30.6782C21.7772 30.6782 21.8649 30.6851 21.9492 30.6987C22.0335 30.7101 22.1156 30.7249 22.1953 30.7432L22.1851 31.4849C22.1418 31.4735 22.0962 31.4655 22.0483 31.4609C22.0005 31.4564 21.9447 31.4541 21.8809 31.4541C21.7624 31.4541 21.661 31.4746 21.5767 31.5156C21.4946 31.5544 21.432 31.6125 21.3887 31.6899C21.3454 31.7674 21.3237 31.862 21.3237 31.9736V36ZM22.062 32.3018V32.999H19.7822V32.3018H22.062Z'\n      fill='white'\n    />\n  </svg>\n);\n\nexport const FileWordIcon = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-word', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      d='M0 28H34V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V28Z'\n      fill='#4285F4'\n    />\n    <path d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V28H0V3Z' fill='#F5F5F5' />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#DBDBDB' />\n    <path clipRule='evenodd' d='M8 13H23V15H8V13Z' fill='#4285F4' fillRule='evenodd' />\n    <path clipRule='evenodd' d='M8 17H18V19H8V17Z' fill='#4285F4' fillRule='evenodd' />\n    <path clipRule='evenodd' d='M8 21H23V23H8V21Z' fill='#4285F4' fillRule='evenodd' />\n  </svg>\n);\n\nexport const FileWordIconAlt = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-word-alt', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V3Z'\n      fill='url(#paint0_linear_11084_64)'\n    />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#3670D3' />\n    <path clipRule='evenodd' d='M8 13H23V15H8V13Z' fill='#C1D8FF' fillRule='evenodd' />\n    <path clipRule='evenodd' d='M8 17H18V19H8V17Z' fill='#C1D8FF' fillRule='evenodd' />\n    <path clipRule='evenodd' d='M8 21H23V23H8V21Z' fill='#C1D8FF' fillRule='evenodd' />\n    <defs>\n      <linearGradient\n        gradientUnits='userSpaceOnUse'\n        id='paint0_linear_11084_64'\n        x1='0'\n        x2='0'\n        y1='0'\n        y2='40'\n      >\n        <stop stopColor='#79A4F2' />\n        <stop offset='1' stopColor='#3375E2' />\n      </linearGradient>\n    </defs>\n  </svg>\n);\n\nexport const FilePowerPointIcon = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-powerpoint', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      clipRule='evenodd'\n      d='M17.7168 33.172C18.2348 33.172 18.4238 33.655 18.4238 34.18C18.4238 34.642 18.2978 35.195 17.7168 35.195C17.1708 35.195 16.9888 34.642 16.9888 34.145C16.9888 33.683 17.1708 33.172 17.7168 33.172ZM19.5718 31.002H18.3818V32.7589H18.3678C18.1228 32.43 17.7798 32.262 17.3318 32.262C16.3028 32.262 15.7988 33.158 15.7988 34.103C15.7988 35.125 16.2818 36.1049 17.4228 36.1049C17.8428 36.1049 18.1928 35.923 18.4238 35.58H18.4378V36H19.5718V31.002ZM12.7095 34.1872C12.7095 33.7252 12.8775 33.1722 13.4305 33.1722C13.9835 33.1722 14.1585 33.7252 14.1585 34.1872C14.1585 34.6492 13.9835 35.1952 13.4305 35.1952C12.8775 35.1952 12.7095 34.6492 12.7095 34.1872ZM11.5195 34.1872C11.5195 35.2792 12.3035 36.1052 13.4305 36.1052C14.5575 36.1052 15.3485 35.2792 15.3485 34.1872C15.3485 33.0952 14.5575 32.2622 13.4305 32.2622C12.3035 32.2622 11.5195 33.0952 11.5195 34.1872ZM21.839 32.3671H22.574V33.1371H21.839V34.7891C21.839 35.0761 22.007 35.1391 22.266 35.1391C22.3142 35.1391 22.364 35.1357 22.4147 35.1323C22.4672 35.1287 22.5206 35.1251 22.574 35.1251V36.0001C22.481 36.0031 22.388 36.0099 22.295 36.0168C22.171 36.0259 22.047 36.0351 21.923 36.0351C20.908 36.0351 20.649 35.7411 20.649 34.7541V33.1371H20.047V32.3671H20.649V31.2681H21.839V32.3671Z'\n      fill='white'\n      fillRule='evenodd'\n    />\n    <path\n      d='M0 28H34V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V28Z'\n      fill='#D65537'\n    />\n    <path d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V28H0V3Z' fill='#F5F5F5' />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#DBDBDB' />\n    <path\n      clipRule='evenodd'\n      d='M7 12C7 10.8954 7.89543 10 9 10H19C20.1046 10 21 10.8954 21 12V18C21 19.1046 20.1046 20 19 20H9C7.89543 20 7 19.1046 7 18V12ZM9 12H19V18H9V12ZM25 22C25 23.1046 24.1046 24 23 24H11V22H23V15H25V22Z'\n      fill='#D65537'\n      fillRule='evenodd'\n    />\n  </svg>\n);\n\nexport const FilePowerPointIconAlt = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-powerpoint-alt', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V3Z'\n      fill='url(#paint0_linear_11084_76)'\n    />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#AB381D' />\n    <path\n      clipRule='evenodd'\n      d='M7 12C7 10.8954 7.89543 10 9 10H19C20.1046 10 21 10.8954 21 12V18C21 19.1046 20.1046 20 19 20H9C7.89543 20 7 19.1046 7 18V12ZM9 12H19V18H9V12ZM25 22C25 23.1046 24.1046 24 23 24H11V22H23V15H25V22Z'\n      fill='#FFB3A0'\n      fillRule='evenodd'\n    />\n    <defs>\n      <linearGradient\n        gradientUnits='userSpaceOnUse'\n        id='paint0_linear_11084_76'\n        x1='0'\n        x2='0'\n        y1='0'\n        y2='40'\n      >\n        <stop stopColor='#DC7259' />\n        <stop offset='1' stopColor='#D14423' />\n      </linearGradient>\n    </defs>\n  </svg>\n);\n\nexport const FileExcelIcon = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-excel', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      clipRule='evenodd'\n      d='M17.7168 33.172C18.2348 33.172 18.4238 33.655 18.4238 34.18C18.4238 34.642 18.2978 35.195 17.7168 35.195C17.1708 35.195 16.9888 34.642 16.9888 34.145C16.9888 33.683 17.1708 33.172 17.7168 33.172ZM19.5718 31.002H18.3818V32.7589H18.3678C18.1228 32.43 17.7798 32.262 17.3318 32.262C16.3028 32.262 15.7988 33.158 15.7988 34.103C15.7988 35.125 16.2818 36.1049 17.4228 36.1049C17.8428 36.1049 18.1928 35.923 18.4238 35.58H18.4378V36H19.5718V31.002ZM12.7095 34.1872C12.7095 33.7252 12.8775 33.1722 13.4305 33.1722C13.9835 33.1722 14.1585 33.7252 14.1585 34.1872C14.1585 34.6492 13.9835 35.1952 13.4305 35.1952C12.8775 35.1952 12.7095 34.6492 12.7095 34.1872ZM11.5195 34.1872C11.5195 35.2792 12.3035 36.1052 13.4305 36.1052C14.5575 36.1052 15.3485 35.2792 15.3485 34.1872C15.3485 33.0952 14.5575 32.2622 13.4305 32.2622C12.3035 32.2622 11.5195 33.0952 11.5195 34.1872ZM21.839 32.3671H22.574V33.1371H21.839V34.7891C21.839 35.0761 22.007 35.1391 22.266 35.1391C22.3142 35.1391 22.364 35.1357 22.4147 35.1323C22.4672 35.1287 22.5206 35.1251 22.574 35.1251V36.0001C22.481 36.0031 22.388 36.0099 22.295 36.0168C22.171 36.0259 22.047 36.0351 21.923 36.0351C20.908 36.0351 20.649 35.7411 20.649 34.7541V33.1371H20.047V32.3671H20.649V31.2681H21.839V32.3671Z'\n      fill='white'\n      fillRule='evenodd'\n    />\n    <path\n      d='M0 28H34V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V28Z'\n      fill='#0F9D58'\n    />\n    <path d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V28H0V3Z' fill='#F5F5F5' />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#DBDBDB' />\n    <path\n      clipRule='evenodd'\n      d='M12 13H7V15H12V13ZM12 17H7V19H12V17ZM7 21H12V23H7V21ZM23 13H14V15H23V13ZM14 17H23V19H14V17ZM23 21H14V23H23V21Z'\n      fill='#0F9D58'\n      fillRule='evenodd'\n    />\n  </svg>\n);\n\nexport const FileExcelIconAlt = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-excel-alt', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V3Z'\n      fill='url(#paint0_linear_11084_326)'\n    />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#0C864B' />\n    <path\n      clipRule='evenodd'\n      d='M12 13H7V15H12V13ZM12 17H7V19H12V17ZM7 21H12V23H7V21ZM23 13H14V15H23V13ZM14 17H23V19H14V17ZM23 21H14V23H23V21Z'\n      fill='#A8E7C9'\n      fillRule='evenodd'\n    />\n    <defs>\n      <linearGradient\n        gradientUnits='userSpaceOnUse'\n        id='paint0_linear_11084_326'\n        x1='0'\n        x2='0'\n        y1='0'\n        y2='40'\n      >\n        <stop stopColor='#64AD8A' />\n        <stop offset='1' stopColor='#0C864B' />\n      </linearGradient>\n    </defs>\n  </svg>\n);\n\nexport const FileArchiveIcon = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-archive', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      clipRule='evenodd'\n      d='M17.7168 33.172C18.2348 33.172 18.4238 33.655 18.4238 34.18C18.4238 34.642 18.2978 35.195 17.7168 35.195C17.1708 35.195 16.9888 34.642 16.9888 34.145C16.9888 33.683 17.1708 33.172 17.7168 33.172ZM19.5718 31.002H18.3818V32.7589H18.3678C18.1228 32.43 17.7798 32.262 17.3318 32.262C16.3028 32.262 15.7988 33.158 15.7988 34.103C15.7988 35.125 16.2818 36.1049 17.4228 36.1049C17.8428 36.1049 18.1928 35.923 18.4238 35.58H18.4378V36H19.5718V31.002ZM12.7095 34.1872C12.7095 33.7252 12.8775 33.1722 13.4305 33.1722C13.9835 33.1722 14.1585 33.7252 14.1585 34.1872C14.1585 34.6492 13.9835 35.1952 13.4305 35.1952C12.8775 35.1952 12.7095 34.6492 12.7095 34.1872ZM11.5195 34.1872C11.5195 35.2792 12.3035 36.1052 13.4305 36.1052C14.5575 36.1052 15.3485 35.2792 15.3485 34.1872C15.3485 33.0952 14.5575 32.2622 13.4305 32.2622C12.3035 32.2622 11.5195 33.0952 11.5195 34.1872ZM21.839 32.3671H22.574V33.1371H21.839V34.7891C21.839 35.0761 22.007 35.1391 22.266 35.1391C22.3142 35.1391 22.364 35.1357 22.4147 35.1323C22.4672 35.1287 22.5206 35.1251 22.574 35.1251V36.0001C22.481 36.0031 22.388 36.0099 22.295 36.0168C22.171 36.0259 22.047 36.0351 21.923 36.0351C20.908 36.0351 20.649 35.7411 20.649 34.7541V33.1371H20.047V32.3671H20.649V31.2681H21.839V32.3671Z'\n      fill='white'\n      fillRule='evenodd'\n    />\n    <path\n      d='M0 28H34V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V28Z'\n      fill='#F8B859'\n    />\n    <path d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V28H0V3Z' fill='#F5F5F5' />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#DBDBDB' />\n    <path\n      clipRule='evenodd'\n      d='M10 0H8V2H10V4H8V6H10V8H8V10H10V12H8V14H10V12H12V10H10V8H12V6H10V4H12V2H10V0ZM8 17C8 16.4477 8.44771 16 9 16H11C11.5523 16 12 16.4477 12 17V23C12 23.5523 11.5523 24 11 24H9C8.44771 24 8 23.5523 8 23V17ZM9 23V20H11V23H9Z'\n      fill='#F8B859'\n      fillRule='evenodd'\n    />\n  </svg>\n);\n\nexport const FileArchiveIconAlt = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-archive-alt', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V3Z'\n      fill='url(#paint0_linear_11086_246)'\n    />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#B67A24' />\n    <path\n      clipRule='evenodd'\n      d='M10 0H8V2H10V4H8V6H10V8H8V10H10V12H8V14H10V12H12V10H10V8H12V6H10V4H12V2H10V0ZM8 17C8 16.4477 8.44771 16 9 16H11C11.5523 16 12 16.4477 12 17V23C12 23.5523 11.5523 24 11 24H9C8.44771 24 8 23.5523 8 23V17ZM9 23V20H11V23H9Z'\n      fill='#FFE9C8'\n      fillRule='evenodd'\n    />\n    <defs>\n      <linearGradient\n        gradientUnits='userSpaceOnUse'\n        id='paint0_linear_11086_246'\n        x1='0'\n        x2='0'\n        y1='0'\n        y2='40'\n      >\n        <stop stopColor='#FFC775' />\n        <stop offset='1' stopColor='#E69E34' />\n      </linearGradient>\n    </defs>\n  </svg>\n);\n\nexport const FileCodeIcon = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-code', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      d='M0 28H34V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V28Z'\n      fill='#00ACA1'\n    />\n    <path d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V28H0V3Z' fill='#F5F5F5' />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#DBDBDB' />\n    <path\n      clipRule='evenodd'\n      d='M15 21V18.984L11.5 18L15 17V15L9 17V19L15 21ZM19 15V17.016L22.5 18L19 19V21L25 19V17L19 15Z'\n      fill='#00ACA1'\n      fillRule='evenodd'\n    />\n  </svg>\n);\n\nexport const FileCodeIconAlt = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-code-alt', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V3Z'\n      fill='url(#paint0_linear_11086_611)'\n    />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#00ACA1' />\n    <path\n      clipRule='evenodd'\n      d='M15 21V18.984L11.5 18L15 17V15L9 17V19L15 21ZM19 15V17.016L22.5 18L19 19V21L25 19V17L19 15Z'\n      fill='#A3DCD8'\n      fillRule='evenodd'\n    />\n    <defs>\n      <linearGradient\n        gradientUnits='userSpaceOnUse'\n        id='paint0_linear_11086_611'\n        x1='0'\n        x2='0'\n        y1='0'\n        y2='40'\n      >\n        <stop stopColor='#7FC4BD' />\n        <stop offset='1' stopColor='#00ACA1' />\n      </linearGradient>\n    </defs>\n  </svg>\n);\n\nexport const FileAudioIcon = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-audio', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      clipRule='evenodd'\n      d='M17.7168 33.172C18.2348 33.172 18.4238 33.655 18.4238 34.18C18.4238 34.642 18.2978 35.195 17.7168 35.195C17.1708 35.195 16.9888 34.642 16.9888 34.145C16.9888 33.683 17.1708 33.172 17.7168 33.172ZM19.5718 31.002H18.3818V32.7589H18.3678C18.1228 32.43 17.7798 32.262 17.3318 32.262C16.3028 32.262 15.7988 33.158 15.7988 34.103C15.7988 35.125 16.2818 36.1049 17.4228 36.1049C17.8428 36.1049 18.1928 35.923 18.4238 35.58H18.4378V36H19.5718V31.002ZM12.7095 34.1872C12.7095 33.7252 12.8775 33.1722 13.4305 33.1722C13.9835 33.1722 14.1585 33.7252 14.1585 34.1872C14.1585 34.6492 13.9835 35.1952 13.4305 35.1952C12.8775 35.1952 12.7095 34.6492 12.7095 34.1872ZM11.5195 34.1872C11.5195 35.2792 12.3035 36.1052 13.4305 36.1052C14.5575 36.1052 15.3485 35.2792 15.3485 34.1872C15.3485 33.0952 14.5575 32.2622 13.4305 32.2622C12.3035 32.2622 11.5195 33.0952 11.5195 34.1872ZM21.839 32.3671H22.574V33.1371H21.839V34.7891C21.839 35.0761 22.007 35.1391 22.266 35.1391C22.3142 35.1391 22.364 35.1357 22.4147 35.1323C22.4672 35.1287 22.5206 35.1251 22.574 35.1251V36.0001C22.481 36.0031 22.388 36.0099 22.295 36.0168C22.171 36.0259 22.047 36.0351 21.923 36.0351C20.908 36.0351 20.649 35.7411 20.649 34.7541V33.1371H20.047V32.3671H20.649V31.2681H21.839V32.3671Z'\n      fill='white'\n      fillRule='evenodd'\n    />\n    <path\n      d='M0 28H34V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V28Z'\n      fill='#2727B0'\n    />\n    <path d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V28H0V3Z' fill='#F5F5F5' />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#DBDBDB' />\n    <path\n      clipRule='evenodd'\n      d='M8.87912 21.941H12.298L16.9521 24.7493C17.0307 24.8138 17.1293 24.849 17.2311 24.849C17.4738 24.8488 17.6705 24.6519 17.6703 24.4092V12.4399C17.6704 12.3381 17.6352 12.2396 17.5707 12.1609C17.4168 11.9732 17.1398 11.9457 16.9521 12.0996L12.298 14.908H8.87912C8.3936 14.908 8 15.3016 8 15.7871V21.0619C8 21.5474 8.3936 21.941 8.87912 21.941ZM12.9258 16.6664L15.9122 15.2224V21.6268L12.9258 20.1829H9.7583V16.6664H12.9258ZM19.8511 16.3517C19.474 16.4092 19.2397 16.6637 19.3283 16.9191L19.3262 16.92C19.5295 17.4995 19.6305 18.098 19.6284 18.6953C19.6305 19.2975 19.5237 19.9014 19.3196 20.4909C19.229 20.7462 19.4682 20.9996 19.8474 21.06C19.9008 21.0683 19.9542 21.072 20.0076 21.072C20.3259 21.072 20.6156 20.9234 20.6922 20.7057C20.9194 20.0451 21.0337 19.37 21.0374 18.6953C21.0349 18.0251 20.9211 17.3575 20.6955 16.7035C20.6053 16.4477 20.229 16.2908 19.8511 16.3517ZM22.1605 14.6028C22.5252 14.5163 22.9259 14.6454 23.055 14.8938C23.6891 16.1157 24 17.4042 24 18.6923C24.0004 19.9895 23.6796 21.2839 23.0521 22.5153C22.9503 22.7123 22.6763 22.8344 22.3828 22.8344C22.3071 22.8344 22.2301 22.8261 22.1543 22.8092C21.7863 22.7251 21.5914 22.4536 21.7185 22.2077C22.2988 21.0761 22.5922 19.8836 22.5931 18.6919C22.5931 17.5056 22.3054 16.3222 21.7276 15.2025C21.6001 14.9563 21.795 14.686 22.1605 14.6028Z'\n      fill='#2727B0'\n      fillRule='evenodd'\n    />\n  </svg>\n);\n\nexport const FileAudioIconAlt = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-audio-alt', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V3Z'\n      fill='url(#paint0_linear_11086_420)'\n    />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#1919A5' />\n    <path\n      clipRule='evenodd'\n      d='M8.87912 21.941H12.298L16.9521 24.7493C17.0307 24.8138 17.1293 24.849 17.2311 24.849C17.4738 24.8488 17.6705 24.6519 17.6703 24.4092V12.4399C17.6704 12.3381 17.6352 12.2396 17.5707 12.1609C17.4168 11.9732 17.1398 11.9457 16.9521 12.0996L12.298 14.908H8.87912C8.3936 14.908 8 15.3016 8 15.7871V21.0619C8 21.5474 8.3936 21.941 8.87912 21.941ZM12.9258 16.6664L15.9122 15.2224V21.6268L12.9258 20.1829H9.7583V16.6664H12.9258ZM19.8511 16.3517C19.474 16.4092 19.2397 16.6637 19.3283 16.9191L19.3262 16.92C19.5295 17.4995 19.6305 18.098 19.6284 18.6953C19.6305 19.2975 19.5237 19.9014 19.3196 20.4909C19.229 20.7462 19.4682 20.9996 19.8474 21.06C19.9008 21.0683 19.9542 21.072 20.0076 21.072C20.3259 21.072 20.6156 20.9234 20.6922 20.7057C20.9194 20.0451 21.0337 19.37 21.0374 18.6953C21.0349 18.0251 20.9211 17.3575 20.6955 16.7035C20.6053 16.4477 20.229 16.2908 19.8511 16.3517ZM22.1605 14.6028C22.5252 14.5163 22.9259 14.6454 23.055 14.8938C23.6891 16.1157 24 17.4042 24 18.6923C24.0004 19.9895 23.6796 21.2839 23.0521 22.5153C22.9503 22.7123 22.6763 22.8344 22.3828 22.8344C22.3071 22.8344 22.2301 22.8261 22.1543 22.8092C21.7863 22.7251 21.5914 22.4536 21.7185 22.2077C22.2988 21.0761 22.5922 19.8836 22.5931 18.6919C22.5931 17.5056 22.3054 16.3222 21.7276 15.2025C21.6001 14.9563 21.795 14.686 22.1605 14.6028Z'\n      fill='#AAAAFF'\n      fillRule='evenodd'\n    />\n    <defs>\n      <linearGradient\n        gradientUnits='userSpaceOnUse'\n        id='paint0_linear_11086_420'\n        x1='0'\n        x2='0'\n        y1='0'\n        y2='40'\n      >\n        <stop stopColor='#4A4AB8' />\n        <stop offset='1' stopColor='#2727B0' />\n      </linearGradient>\n    </defs>\n  </svg>\n);\n\nexport const FileVideoIcon = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-video', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      clipRule='evenodd'\n      d='M17.7168 33.172C18.2348 33.172 18.4238 33.655 18.4238 34.18C18.4238 34.642 18.2978 35.195 17.7168 35.195C17.1708 35.195 16.9888 34.642 16.9888 34.145C16.9888 33.683 17.1708 33.172 17.7168 33.172ZM19.5718 31.002H18.3818V32.7589H18.3678C18.1228 32.43 17.7798 32.262 17.3318 32.262C16.3028 32.262 15.7988 33.158 15.7988 34.103C15.7988 35.125 16.2818 36.1049 17.4228 36.1049C17.8428 36.1049 18.1928 35.923 18.4238 35.58H18.4378V36H19.5718V31.002ZM12.7095 34.1872C12.7095 33.7252 12.8775 33.1722 13.4305 33.1722C13.9835 33.1722 14.1585 33.7252 14.1585 34.1872C14.1585 34.6492 13.9835 35.1952 13.4305 35.1952C12.8775 35.1952 12.7095 34.6492 12.7095 34.1872ZM11.5195 34.1872C11.5195 35.2792 12.3035 36.1052 13.4305 36.1052C14.5575 36.1052 15.3485 35.2792 15.3485 34.1872C15.3485 33.0952 14.5575 32.2622 13.4305 32.2622C12.3035 32.2622 11.5195 33.0952 11.5195 34.1872ZM21.839 32.3671H22.574V33.1371H21.839V34.7891C21.839 35.0761 22.007 35.1391 22.266 35.1391C22.3142 35.1391 22.364 35.1357 22.4147 35.1323C22.4672 35.1287 22.5206 35.1251 22.574 35.1251V36.0001C22.481 36.0031 22.388 36.0099 22.295 36.0168C22.171 36.0259 22.047 36.0351 21.923 36.0351C20.908 36.0351 20.649 35.7411 20.649 34.7541V33.1371H20.047V32.3671H20.649V31.2681H21.839V32.3671Z'\n      fill='white'\n      fillRule='evenodd'\n    />\n    <path\n      d='M0 28H34V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V28Z'\n      fill='#9D27B0'\n    />\n    <path d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V28H0V3Z' fill='#F5F5F5' />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#DBDBDB' />\n    <path\n      d='M9 17H25V24H9V17ZM27 14C27 12.8954 26.1046 12 25 12H22L24 15H21L19 12H17L19 15H16L14 12H12L14 15H11L9 12C7.9 12 7.01 12.9 7.01 14L7 24C7 25.1 7.9 26 9 26H25C26.1 26 27 25.1 27 24V14Z'\n      fill='#9D27B0'\n    />\n  </svg>\n);\n\nexport const FileVideoIconAlt = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-video-alt', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V3Z'\n      fill='url(#paint0_linear_18604_164254)'\n    />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#7A1589' />\n    <path\n      d='M9 17H25V24H9V17ZM27 14C27 12.8954 26.1046 12 25 12H22L24 15H21L19 12H17L19 15H16L14 12H12L14 15H11L9 12C7.9 12 7.01 12.9 7.01 14L7 24C7 25.1 7.9 26 9 26H25C26.1 26 27 25.1 27 24V14Z'\n      fill='#F3A8FF'\n    />\n    <defs>\n      <linearGradient\n        gradientUnits='userSpaceOnUse'\n        id='paint0_linear_18604_164254'\n        x1='0'\n        x2='0'\n        y1='0'\n        y2='40'\n      >\n        <stop stopColor='#A94AB8' />\n        <stop offset='1' stopColor='#9D27B0' />\n      </linearGradient>\n    </defs>\n  </svg>\n);\n\nexport const FileFallbackIcon = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-fallback ', className)}\n    fill='none'\n    height={size}\n    viewBox='0 0 34 40'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V3Z'\n      fill='url(#paint0_linear)'\n    />\n    <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#DBDBDB' />\n    <path clipRule='evenodd' d='M8 13H23V15H8V13Z' fill='#CFCFCF' fillRule='evenodd' />\n    <path clipRule='evenodd' d='M8 17H18V19H8V17Z' fill='#CFCFCF' fillRule='evenodd' />\n    <path clipRule='evenodd' d='M8 21H23V23H8V21Z' fill='#CFCFCF' fillRule='evenodd' />\n    <defs>\n      <linearGradient\n        gradientUnits='userSpaceOnUse'\n        id='paint0_linear'\n        x1='0'\n        x2='0'\n        y1='0'\n        y2='40'\n      >\n        <stop stopColor='white' />\n        <stop offset='1' stopColor='#DBDBDB' />\n      </linearGradient>\n    </defs>\n  </svg>\n);\n\n// v1 icon without possibility to specify size via props\nexport const FileImageIcon = ({\n  className = '',\n  size = DEFAULT_SIZE,\n  ...props\n}: IconProps) => (\n  <svg\n    className={clsx('rfu-file-image', className)}\n    height={size}\n    viewBox='0 0 384 512'\n    width={size}\n    xmlns='http://www.w3.org/2000/svg'\n    {...props}\n  >\n    <path\n      d='M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm32-48h224V288l-23.5-23.5c-4.7-4.7-12.3-4.7-17 0L176 352l-39.5-39.5c-4.7-4.7-12.3-4.7-17 0L80 352v64zm48-240c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48z'\n      fill='#414D54'\n    />\n  </svg>\n);\n", "export type GeneralType = 'audio/' | 'video/' | 'image/' | 'text/';\n\nexport type SupportedMimeType =\n  | (typeof wordMimeTypes)[number]\n  | (typeof excelMimeTypes)[number]\n  | (typeof powerpointMimeTypes)[number]\n  | (typeof archiveFileTypes)[number]\n  | (typeof codeFileTypes)[number];\n\nexport const wordMimeTypes = [\n  // Microsoft Word\n  // .doc .dot\n  'application/msword',\n  // .doc .dot\n  'application/msword-template',\n  // .docx\n  'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n  // .dotx (no test)\n  'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n  // .docm\n  'application/vnd.ms-word.document.macroEnabled.12',\n  // .dotm (no test)\n  'application/vnd.ms-word.template.macroEnabled.12',\n\n  // LibreOffice/OpenOffice Writer\n  // .odt\n  'application/vnd.oasis.opendocument.text',\n  // .ott\n  'application/vnd.oasis.opendocument.text-template',\n  // .fodt\n  'application/vnd.oasis.opendocument.text-flat-xml',\n  // .uot\n  // NOTE: firefox doesn't know mimetype so maybe ignore\n];\n\nexport const excelMimeTypes = [\n  // .csv\n  'text/csv',\n  // TODO: maybe more data files\n\n  // Microsoft Excel\n  // .xls .xlt .xla (no test for .xla)\n  'application/vnd.ms-excel',\n  // .xlsx\n  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n  // .xltx (no test)\n  'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n  // .xlsm\n  'application/vnd.ms-excel.sheet.macroEnabled.12',\n  // .xltm (no test)\n  'application/vnd.ms-excel.template.macroEnabled.12',\n  // .xlam (no test)\n  'application/vnd.ms-excel.addin.macroEnabled.12',\n  // .xlsb (no test)\n  'application/vnd.ms-excel.addin.macroEnabled.12',\n\n  // LibreOffice/OpenOffice Calc\n  // .ods\n  'application/vnd.oasis.opendocument.spreadsheet',\n  // .ots\n  'application/vnd.oasis.opendocument.spreadsheet-template',\n  // .fods\n  'application/vnd.oasis.opendocument.spreadsheet-flat-xml',\n  // .uos\n  // NOTE: firefox doesn't know mimetype so maybe ignore\n];\n\nexport const powerpointMimeTypes = [\n  // Microsoft Word\n  // .ppt .pot .pps .ppa (no test for .ppa)\n  'application/vnd.ms-powerpoint',\n  // .pptx\n  'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n  // .potx (no test)\n  'application/vnd.openxmlformats-officedocument.presentationml.template',\n  // .ppsx\n  'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n  // .ppam\n  'application/vnd.ms-powerpoint.addin.macroEnabled.12',\n  // .pptm\n  'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\n  // .potm\n  'application/vnd.ms-powerpoint.template.macroEnabled.12',\n  // .ppsm\n  'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',\n\n  // LibreOffice/OpenOffice Writer\n  // .odp\n  'application/vnd.oasis.opendocument.presentation',\n  // .otp\n  'application/vnd.oasis.opendocument.presentation-template',\n  // .fodp\n  'application/vnd.oasis.opendocument.presentation-flat-xml',\n  // .uop\n  // NOTE: firefox doesn't know mimetype so maybe ignore\n];\n\nexport const archiveFileTypes = [\n  // .zip\n  'application/zip',\n  // .z7\n  'application/x-7z-compressed',\n  // .ar\n  'application/x-archive',\n  // .tar\n  'application/x-tar',\n  // .tar.gz\n  'application/gzip',\n  // .tar.Z\n  'application/x-compress',\n  // .tar.bz2\n  'application/x-bzip',\n  // .tar.lz\n  'application/x-lzip',\n  // .tar.lz4\n  'application/x-lz4',\n  // .tar.lzma\n  'application/x-lzma',\n  // .tar.lzo (no test)\n  'application/x-lzop',\n  // .tar.xz\n  'application/x-xz',\n  // .war\n  'application/x-webarchive',\n  // .rar\n  'application/vnd.rar',\n];\n\nexport const codeFileTypes = [\n  // .html .htm\n  'text/html',\n  // .css\n  'text/css',\n  // .js\n  'application/x-javascript',\n  'text/javascript',\n  // .json\n  'application/json',\n  // .py\n  'text/x-python',\n  // .go\n  'text/x-go',\n  // .c\n  'text/x-csrc',\n  // .cpp\n  'text/x-c++src',\n  // .rb\n  'application/x-ruby',\n  // .rust\n  'text/rust',\n  // .java\n  'text/x-java',\n  // .php\n  'application/x-php',\n  // .cs\n  'text/x-csharp',\n  // .scala\n  'text/x-scala',\n  // .erl\n  'text/x-erlang',\n  // .sh\n  'application/x-shellscript',\n];\n", "import * as fileIconSet from './FileIconSet';\nimport type { GeneralType, SupportedMimeType } from './mimeTypes';\nimport {\n  archiveFileTypes,\n  codeFileTypes,\n  excelMimeTypes,\n  powerpointMimeTypes,\n  wordMimeTypes,\n} from './mimeTypes';\nimport type { ComponentType } from 'react';\nimport type { IconProps } from './FileIconSet';\n\ntype MimeTypeMappedComponent =\n  | 'FilePdfIcon'\n  | 'FileWordIcon'\n  | 'FileExcelIcon'\n  | 'FilePowerPointIcon'\n  | 'FileArchiveIcon'\n  | 'FileCodeIcon';\n\ntype GeneralContentTypeComponent =\n  | 'FileImageIcon'\n  | 'FileAudioIcon'\n  | 'FileVideoIcon'\n  | 'FileAltIcon';\n\ntype IconComponents<Props> = {\n  FileAltIcon: ComponentType<Props>;\n  FileArchiveIcon: ComponentType<Props>;\n  FileAudioIcon: ComponentType<Props>;\n  FileCodeIcon: ComponentType<Props>;\n  FileExcelIcon: ComponentType<Props>;\n  FileFallbackIcon: ComponentType<Props>;\n  FileImageIcon: ComponentType<Props>;\n  FilePdfIcon: ComponentType<Props>;\n  FilePowerPointIcon: ComponentType<Props>;\n  FileVideoIcon: ComponentType<Props>;\n  FileWordIcon: ComponentType<Props>;\n};\n\ntype MimeTypeToIconMap<Props> = {\n  [key: string]: ComponentType<Props>;\n};\n\nfunction generateMimeTypeToIconMap<Props>({\n  FileArchiveIcon,\n  FileCodeIcon,\n  FileExcelIcon,\n  FilePdfIcon,\n  FilePowerPointIcon,\n  FileWordIcon,\n}: Pick<IconComponents<Props>, MimeTypeMappedComponent>) {\n  const mimeTypeToIconMap: MimeTypeToIconMap<Props> = {\n    'application/pdf': FilePdfIcon,\n  };\n\n  for (const type of wordMimeTypes) {\n    mimeTypeToIconMap[type] = FileWordIcon;\n  }\n\n  for (const type of excelMimeTypes) {\n    mimeTypeToIconMap[type] = FileExcelIcon;\n  }\n\n  for (const type of powerpointMimeTypes) {\n    mimeTypeToIconMap[type] = FilePowerPointIcon;\n  }\n\n  for (const type of archiveFileTypes) {\n    mimeTypeToIconMap[type] = FileArchiveIcon;\n  }\n\n  for (const type of codeFileTypes) {\n    mimeTypeToIconMap[type] = FileCodeIcon;\n  }\n  return mimeTypeToIconMap;\n}\n\nfunction generateGeneralTypeToIconMap<Props>({\n  FileAltIcon,\n  FileAudioIcon,\n  FileImageIcon,\n  FileVideoIcon,\n}: Pick<IconComponents<Props>, GeneralContentTypeComponent>) {\n  return {\n    'audio/': FileAudioIcon,\n    'image/': FileImageIcon,\n    'text/': FileAltIcon,\n    'video/': FileVideoIcon,\n  };\n}\n\nexport type IconType = 'standard' | 'alt';\n\ntype IconMap = {\n  standard: Record<\n    SupportedMimeType | GeneralType | 'fallback',\n    ComponentType<IconProps>\n  >;\n  alt?: Record<SupportedMimeType | GeneralType | 'fallback', ComponentType<IconProps>>;\n};\n\nexport const iconMap: IconMap = {\n  alt: {\n    ...generateMimeTypeToIconMap<IconProps>({\n      FileArchiveIcon: fileIconSet.FileArchiveIconAlt,\n      FileCodeIcon: fileIconSet.FileCodeIconAlt,\n      FileExcelIcon: fileIconSet.FileExcelIconAlt,\n      FilePdfIcon: fileIconSet.FilePdfIcon,\n      FilePowerPointIcon: fileIconSet.FilePowerPointIconAlt,\n      FileWordIcon: fileIconSet.FileWordIconAlt,\n    }),\n    ...generateGeneralTypeToIconMap<IconProps>({\n      FileAltIcon: fileIconSet.FileFallbackIcon,\n      FileAudioIcon: fileIconSet.FileAudioIconAlt,\n      FileImageIcon: fileIconSet.FileImageIcon,\n      FileVideoIcon: fileIconSet.FileVideoIconAlt,\n    }),\n    fallback: fileIconSet.FileFallbackIcon,\n  },\n  standard: {\n    ...generateMimeTypeToIconMap<IconProps>({\n      FileArchiveIcon: fileIconSet.FileArchiveIcon,\n      FileCodeIcon: fileIconSet.FileCodeIcon,\n      FileExcelIcon: fileIconSet.FileExcelIcon,\n      FilePdfIcon: fileIconSet.FilePdfIcon,\n      FilePowerPointIcon: fileIconSet.FilePowerPointIcon,\n      FileWordIcon: fileIconSet.FileWordIcon,\n    }),\n    ...generateGeneralTypeToIconMap<IconProps>({\n      FileAltIcon: fileIconSet.FileFallbackIcon,\n      FileAudioIcon: fileIconSet.FileAudioIcon,\n      FileImageIcon: fileIconSet.FileImageIcon,\n      FileVideoIcon: fileIconSet.FileVideoIcon,\n    }),\n    fallback: fileIconSet.FileFallbackIcon,\n  },\n};\n", "import clsx from 'clsx';\nimport { nanoid } from 'nanoid';\nimport type { ComponentProps } from 'react';\nimport React, { forwardRef, useCallback, useMemo } from 'react';\n\nimport { useHandleFileChangeWrapper } from './utils';\nimport { useMessageInputContext, useTranslationContext } from '../../context';\nimport { useMessageComposer } from '../MessageInput';\nimport { useAttachmentManagerState } from '../MessageInput/hooks/useAttachmentManagerState';\nimport { useStateStore } from '../../store';\nimport type { MessageComposerConfig } from 'stream-chat';\nimport type { PartialSelected } from '../../types/types';\n\nconst attachmentManagerConfigStateSelector = (state: MessageComposerConfig) => ({\n  acceptedFiles: state.attachments.acceptedFiles,\n  maxNumberOfFilesPerMessage: state.attachments.maxNumberOfFilesPerMessage,\n});\n\n/**\n * @deprecated Use FileInputProps instead.\n */\nexport type UploadButtonProps = {\n  onFileChange: (files: Array<File>) => void;\n  resetOnChange?: boolean;\n} & Omit<ComponentProps<'input'>, 'type' | 'onChange'>;\n\n/**\n * @deprecated Use FileInput instead\n */\n\nexport const UploadButton = forwardRef(function UploadButton(\n  { onFileChange, resetOnChange = true, ...rest }: UploadButtonProps,\n  ref: React.ForwardedRef<HTMLInputElement>,\n) {\n  const handleInputChange = useHandleFileChangeWrapper(resetOnChange, onFileChange);\n\n  return <input onChange={handleInputChange} ref={ref} type='file' {...rest} />;\n});\n\nexport type FileInputProps = UploadButtonProps;\n\nexport const FileInput = UploadButton;\n\nexport const UploadFileInput = forwardRef(function UploadFileInput(\n  {\n    className,\n    onFileChange: onFileChangeCustom,\n    ...props\n  }: PartialSelected<FileInputProps, 'onFileChange'>,\n  ref: React.ForwardedRef<HTMLInputElement>,\n) {\n  const { t } = useTranslationContext('UploadFileInput');\n  const { cooldownRemaining, textareaRef } = useMessageInputContext();\n  const messageComposer = useMessageComposer();\n  const { attachmentManager } = messageComposer;\n  const { isUploadEnabled } = useAttachmentManagerState();\n  const { acceptedFiles, maxNumberOfFilesPerMessage } = useStateStore(\n    messageComposer.configState,\n    attachmentManagerConfigStateSelector,\n  );\n  const id = useMemo(() => nanoid(), []);\n\n  const onFileChange = useCallback(\n    (files: Array<File>) => {\n      attachmentManager.uploadFiles(files);\n      textareaRef.current?.focus();\n      onFileChangeCustom?.(files);\n    },\n    [onFileChangeCustom, attachmentManager, textareaRef],\n  );\n\n  return (\n    <FileInput\n      accept={acceptedFiles?.join(',')}\n      aria-label={t('aria/File upload')}\n      data-testid='file-input'\n      disabled={!isUploadEnabled || !!cooldownRemaining}\n      id={id}\n      multiple={maxNumberOfFilesPerMessage > 1}\n      {...props}\n      className={clsx('str-chat__file-input', className)}\n      onFileChange={onFileChange}\n      ref={ref}\n    />\n  );\n});\n", "import type { FileLike, RecordedMediaType } from './types';\nimport type { ChangeEvent } from 'react';\nimport { useCallback } from 'react';\n\nexport const useHandleFileChangeWrapper = (\n  resetOnChange = false,\n  handler?: (files: Array<File>) => void,\n) =>\n  useCallback(\n    ({ currentTarget }: ChangeEvent<HTMLInputElement>) => {\n      const { files } = currentTarget;\n\n      if (!files) return;\n\n      try {\n        handler?.(Array.from(files));\n      } catch (error) {\n        console.error(error);\n      }\n\n      if (resetOnChange) currentTarget.value = '';\n    },\n    [handler, resetOnChange],\n  );\n\nexport function dataTransferItemsHaveFiles(items?: DataTransferItem[]): boolean {\n  if (!items || !items.length) {\n    return false;\n  }\n  for (const item of items) {\n    if (item.kind === 'file' || item.type === 'text/html') {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport async function dataTransferItemsToFiles(\n  items?: DataTransferItem[],\n): Promise<FileLike[]> {\n  if (!items || !items.length) {\n    return [];\n  }\n\n  // If there are files inside the DataTransferItem prefer those\n  const fileLikes = getFileLikes(items);\n  if (fileLikes.length) {\n    return fileLikes;\n  }\n\n  // Otherwise extract images from html\n  const blobPromises = [];\n  for (const item of items) {\n    if (item.type === 'text/html') {\n      blobPromises.push(\n        new Promise<void>((accept) => {\n          item.getAsString(async (s) => {\n            const imagePromises = extractImageSources(s).map((src) =>\n              getImageSource(fileLikes, src),\n            );\n\n            await Promise.all(imagePromises);\n            accept();\n          });\n        }),\n      );\n    }\n  }\n  await Promise.all(blobPromises);\n  return fileLikes;\n}\n\nfunction getFileLikes(items: DataTransferItem[]) {\n  const fileLikes = [];\n  for (const item of items) {\n    if (item.kind === 'file') {\n      const file = item.getAsFile();\n      if (file) {\n        fileLikes.push(file);\n      }\n    }\n  }\n  return fileLikes;\n}\n\nasync function getImageSource(fileLikes: FileLike[], src: string) {\n  let res;\n  try {\n    res = await fetch(src);\n  } catch (e) {\n    return;\n  }\n  const contentType = res.headers.get('Content-type') || 'application/octet-stream';\n  const buf = await res.arrayBuffer();\n  const blob = new Blob([buf], { type: contentType });\n  fileLikes.push(blob);\n}\n\nconst extractImageSources = (s: string) => {\n  const imageTags = new DOMParser()\n    .parseFromString(s, 'text/html')\n    .getElementsByTagName('img');\n  return Array.from(imageTags, (tag) => tag.src).filter((tag) => tag);\n};\n\nexport const isBlobButNotFile = (obj: unknown): obj is Blob =>\n  obj instanceof Blob && !(obj instanceof File);\n\nexport const createFileFromBlobs = ({\n  blobsArray,\n  fileName,\n  mimeType,\n}: {\n  blobsArray: Blob[];\n  fileName: string;\n  mimeType: string;\n}) => {\n  const concatenatedBlob = new Blob(blobsArray, { type: mimeType });\n  return new File([concatenatedBlob], fileName, { type: concatenatedBlob.type });\n};\n\nexport const getExtensionFromMimeType = (mimeType: string) => {\n  const match = mimeType.match(/\\/([^/;]+)/);\n  return match && match[1];\n};\n\nexport const getRecordedMediaTypeFromMimeType = (\n  mimeType: string,\n): RecordedMediaType | null => {\n  const match = mimeType.match(/^(audio|video)\\/.*$/);\n  return match && (match[1] as RecordedMediaType);\n};\n\nexport const readFileAsArrayBuffer = (file: File): Promise<ArrayBuffer> =>\n  new Promise((resolve, reject) => {\n    const fileReader = new FileReader();\n    fileReader.onload = () => {\n      resolve(fileReader.result as ArrayBuffer);\n    };\n\n    fileReader.onerror = () => {\n      reject(fileReader.error);\n    };\n\n    fileReader.readAsArrayBuffer(file);\n  });\n\nexport const generateFileName = (mimeType: string) =>\n  `file_${new Date().toISOString()}.${getExtensionFromMimeType(mimeType)}`;\n", "import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { UploadIcon as DefaultUploadIcon } from './icons';\nimport { useAttachmentManagerState } from './hooks/useAttachmentManagerState';\nimport { CHANNEL_CONTAINER_ID } from '../Channel/constants';\nimport { DialogAnchor, useDialogIsOpen, useDialogOnNearestManager } from '../Dialog';\nimport { DialogMenuButton } from '../Dialog/DialogMenu';\nimport { Modal as DefaultModal } from '../Modal';\nimport { ShareLocationDialog as DefaultLocationDialog } from '../Location';\nimport { PollCreationDialog as DefaultPollCreationDialog } from '../Poll';\nimport { Portal } from '../Portal/Portal';\nimport { UploadFileInput } from '../ReactFileUtilities';\nimport {\n  useChannelStateContext,\n  useComponentContext,\n  useTranslationContext,\n} from '../../context';\nimport {\n  AttachmentSelectorContextProvider,\n  useAttachmentSelectorContext,\n} from '../../context/AttachmentSelectorContext';\nimport { useStableId } from '../UtilityComponents/useStableId';\nimport clsx from 'clsx';\nimport { useMessageComposer } from './hooks';\n\nexport const SimpleAttachmentSelector = () => {\n  const {\n    AttachmentSelectorInitiationButtonContents,\n    FileUploadIcon = DefaultUploadIcon,\n  } = useComponentContext();\n  const { channelCapabilities } = useChannelStateContext();\n  const inputRef = useRef<HTMLInputElement | null>(null);\n  const [labelElement, setLabelElement] = useState<HTMLLabelElement | null>(null);\n  const id = useStableId();\n\n  useEffect(() => {\n    if (!labelElement) return;\n    const handleKeyUp = (event: KeyboardEvent) => {\n      if (![' ', 'Enter'].includes(event.key) || !inputRef.current) return;\n      event.preventDefault();\n      inputRef.current.click();\n    };\n    labelElement.addEventListener('keyup', handleKeyUp);\n    return () => {\n      labelElement.removeEventListener('keyup', handleKeyUp);\n    };\n  }, [labelElement]);\n\n  if (!channelCapabilities['upload-file']) return null;\n\n  return (\n    <div className='str-chat__file-input-container' data-testid='file-upload-button'>\n      <UploadFileInput id={id} ref={inputRef} />\n      <label\n        className='str-chat__file-input-label'\n        htmlFor={id}\n        ref={setLabelElement}\n        tabIndex={0}\n      >\n        {AttachmentSelectorInitiationButtonContents ? (\n          <AttachmentSelectorInitiationButtonContents />\n        ) : (\n          <FileUploadIcon />\n        )}\n      </label>\n    </div>\n  );\n};\n\nconst AttachmentSelectorMenuInitButtonIcon = () => {\n  const { AttachmentSelectorInitiationButtonContents, FileUploadIcon } =\n    useComponentContext('SimpleAttachmentSelector');\n  if (AttachmentSelectorInitiationButtonContents) {\n    return <AttachmentSelectorInitiationButtonContents />;\n  }\n  if (FileUploadIcon) {\n    return <FileUploadIcon />;\n  }\n  return <div className='str-chat__attachment-selector__menu-button__icon' />;\n};\n\nexport type AttachmentSelectorModalContentProps = {\n  close: () => void;\n};\n\nexport type AttachmentSelectorActionProps = {\n  closeMenu: () => void;\n  openModalForAction: (actionType: AttachmentSelectorAction['type']) => void;\n};\n\nexport type AttachmentSelectorAction = {\n  ActionButton: React.ComponentType<AttachmentSelectorActionProps>;\n  type: 'uploadFile' | 'createPoll' | 'addLocation' | (string & {});\n  ModalContent?: React.ComponentType<AttachmentSelectorModalContentProps>;\n};\n\nexport const DefaultAttachmentSelectorComponents = {\n  File({ closeMenu }: AttachmentSelectorActionProps) {\n    const { t } = useTranslationContext();\n    const { fileInput } = useAttachmentSelectorContext();\n    const { isUploadEnabled } = useAttachmentManagerState();\n\n    return (\n      <DialogMenuButton\n        className='str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__upload-file-button'\n        disabled={!isUploadEnabled} // todo: add styles for disabled state\n        onClick={() => {\n          if (fileInput) fileInput.click();\n          closeMenu();\n        }}\n      >\n        {t('File')}\n      </DialogMenuButton>\n    );\n  },\n  Location({ closeMenu, openModalForAction }: AttachmentSelectorActionProps) {\n    const { t } = useTranslationContext();\n    return (\n      <DialogMenuButton\n        className='str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__add-location-button'\n        onClick={() => {\n          openModalForAction('addLocation');\n          closeMenu();\n        }}\n      >\n        {t('Location')}\n      </DialogMenuButton>\n    );\n  },\n  Poll({ closeMenu, openModalForAction }: AttachmentSelectorActionProps) {\n    const { t } = useTranslationContext();\n    return (\n      <DialogMenuButton\n        className='str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__create-poll-button'\n        onClick={() => {\n          openModalForAction('createPoll');\n          closeMenu();\n        }}\n      >\n        {t('Poll')}\n      </DialogMenuButton>\n    );\n  },\n};\n\nexport const defaultAttachmentSelectorActionSet: AttachmentSelectorAction[] = [\n  { ActionButton: DefaultAttachmentSelectorComponents.File, type: 'uploadFile' },\n  {\n    ActionButton: DefaultAttachmentSelectorComponents.Poll,\n    type: 'createPoll',\n  },\n  {\n    ActionButton: DefaultAttachmentSelectorComponents.Location,\n    type: 'addLocation',\n  },\n];\n\nexport type AttachmentSelectorProps = {\n  attachmentSelectorActionSet?: AttachmentSelectorAction[];\n  getModalPortalDestination?: () => HTMLElement | null;\n};\n\nconst useAttachmentSelectorActionsFiltered = (original: AttachmentSelectorAction[]) => {\n  const {\n    PollCreationDialog = DefaultPollCreationDialog,\n    ShareLocationDialog = DefaultLocationDialog,\n  } = useComponentContext();\n  const { channelCapabilities } = useChannelStateContext();\n  const messageComposer = useMessageComposer();\n  const channelConfig = messageComposer.channel.getConfig();\n\n  return original\n    .filter((action) => {\n      if (action.type === 'uploadFile')\n        return channelCapabilities['upload-file'] && channelConfig?.uploads;\n\n      if (action.type === 'createPoll')\n        return (\n          channelCapabilities['send-poll'] &&\n          !messageComposer.threadId &&\n          channelConfig?.polls\n        );\n\n      if (action.type === 'addLocation') {\n        return channelConfig?.shared_locations && !messageComposer.threadId;\n      }\n      return true;\n    })\n    .map((action) => {\n      if (action.type === 'createPoll' && !action.ModalContent) {\n        return { ...action, ModalContent: PollCreationDialog };\n      }\n      if (action.type === 'addLocation' && !action.ModalContent) {\n        return { ...action, ModalContent: ShareLocationDialog };\n      }\n      return action;\n    });\n};\n\nexport const AttachmentSelector = ({\n  attachmentSelectorActionSet = defaultAttachmentSelectorActionSet,\n  getModalPortalDestination,\n}: AttachmentSelectorProps) => {\n  const { t } = useTranslationContext();\n  const { Modal = DefaultModal } = useComponentContext();\n  const { channelCapabilities } = useChannelStateContext();\n  const messageComposer = useMessageComposer();\n\n  const actions = useAttachmentSelectorActionsFiltered(attachmentSelectorActionSet);\n\n  const menuDialogId = `attachment-actions-menu${messageComposer.threadId ? '-thread' : ''}`;\n  const { dialog: menuDialog, dialogManager } = useDialogOnNearestManager({\n    id: menuDialogId,\n  });\n  const menuDialogIsOpen = useDialogIsOpen(menuDialogId, dialogManager?.id);\n\n  const [modalContentAction, setModalContentActionAction] =\n    useState<AttachmentSelectorAction>();\n  const openModal = useCallback(\n    (actionType: AttachmentSelectorAction['type']) => {\n      const action = actions.find((a) => a.type === actionType);\n      if (!action?.ModalContent) return;\n      setModalContentActionAction(action);\n    },\n    [actions],\n  );\n\n  const closeModal = useCallback(() => setModalContentActionAction(undefined), []);\n\n  const [fileInput, setFileInput] = useState<HTMLInputElement | null>(null);\n  const menuButtonRef = useRef<HTMLButtonElement>(null);\n\n  const getDefaultPortalDestination = useCallback(\n    () => document.getElementById(CHANNEL_CONTAINER_ID),\n    [],\n  );\n\n  if (actions.length === 0) return null;\n\n  if (actions.length === 1 && actions[0].type === 'uploadFile')\n    return <SimpleAttachmentSelector />;\n\n  const ModalContent = modalContentAction?.ModalContent;\n  const modalIsOpen = !!ModalContent;\n  return (\n    <AttachmentSelectorContextProvider value={{ fileInput }}>\n      <div className='str-chat__attachment-selector'>\n        {channelCapabilities['upload-file'] && <UploadFileInput ref={setFileInput} />}\n        <button\n          aria-expanded={menuDialogIsOpen}\n          aria-haspopup='true'\n          aria-label={t('aria/Open Attachment Selector')}\n          className='str-chat__attachment-selector__menu-button'\n          data-testid='invoke-attachment-selector-button'\n          onClick={() => menuDialog?.toggle()}\n          ref={menuButtonRef}\n        >\n          <AttachmentSelectorMenuInitButtonIcon />\n        </button>\n        <DialogAnchor\n          dialogManagerId={dialogManager?.id}\n          id={menuDialogId}\n          placement='top-start'\n          referenceElement={menuButtonRef.current}\n          tabIndex={-1}\n          trapFocus\n        >\n          <div\n            className='str-chat__attachment-selector-actions-menu str-chat__dialog-menu'\n            data-testid='attachment-selector-actions-menu'\n          >\n            {actions.map(({ ActionButton, type }) => (\n              <ActionButton\n                closeMenu={menuDialog.close}\n                key={`attachment-selector-item-${type}`}\n                openModalForAction={openModal}\n              />\n            ))}\n          </div>\n        </DialogAnchor>\n        <Portal\n          getPortalDestination={getModalPortalDestination ?? getDefaultPortalDestination}\n          isOpen={modalIsOpen}\n        >\n          <Modal\n            className={clsx({\n              'str-chat__create-poll-modal': modalContentAction?.type === 'createPoll',\n              'str-chat__share-location-modal':\n                modalContentAction?.type === 'addLocation',\n            })}\n            onClose={closeModal}\n            open={modalIsOpen}\n          >\n            {ModalContent && <ModalContent close={closeModal} />}\n          </Modal>\n        </Portal>\n      </div>\n    </AttachmentSelectorContextProvider>\n  );\n};\n", "import React, { useMemo } from 'react';\nimport { nanoid } from 'nanoid';\n\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nexport const LoadingIndicatorIcon = ({ size = 20 }: { size?: number }) => {\n  const id = useMemo(() => nanoid(), []);\n\n  return (\n    <div className='str-chat__loading-indicator'>\n      <svg\n        data-testid='loading-indicator'\n        height={size}\n        viewBox='0 0 30 30'\n        width={size}\n        xmlns='http://www.w3.org/2000/svg'\n      >\n        <defs>\n          <linearGradient\n            id={`${id}-linear-gradient`}\n            x1='50%'\n            x2='50%'\n            y1='0%'\n            y2='100%'\n          >\n            <stop offset='0%' stopColor='#FFF' stopOpacity='0' />\n            <stop data-testid='stop-color' offset='100%' stopOpacity='1' />\n          </linearGradient>\n        </defs>\n        <path\n          d='M2.518 23.321l1.664-1.11A12.988 12.988 0 0 0 15 28c7.18 0 13-5.82 13-13S22.18 2 15 2V0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-5.206 0-9.792-2.652-12.482-6.679z'\n          fill={`url(#${id}-linear-gradient)`}\n          fillRule='evenodd'\n        />\n      </svg>\n    </div>\n  );\n};\n\nexport const UploadIcon = () => {\n  const { t } = useTranslationContext('UploadIcon');\n  return (\n    <svg\n      data-testid='attach-icon'\n      fill='none'\n      height='24'\n      viewBox='0 0 24 24'\n      width='24'\n      xmlns='http://www.w3.org/2000/svg'\n    >\n      <title>{t('Attach files')}</title>\n      <g clipPath='url(#clip0_10878_5)'>\n        <path\n          d='M12.9997 6.99993L10.9997 6.99993L10.9997 10.9999L6.99972 10.9999L6.99972 12.9999L10.9997 12.9999L10.9997 16.9999L12.9997 16.9999L12.9997 12.9999L16.9997 12.9999L16.9997 10.9999L12.9997 10.9999L12.9997 6.99993ZM11.9997 1.99992C6.47972 1.99992 1.99972 6.47993 1.99972 11.9999C1.99972 17.5199 6.47972 21.9999 11.9997 21.9999C17.5197 21.9999 21.9997 17.5199 21.9997 11.9999C21.9997 6.47993 17.5197 1.99992 11.9997 1.99992ZM11.9997 19.9999C7.58972 19.9999 3.99972 16.4099 3.99972 11.9999C3.99972 7.58993 7.58972 3.99993 11.9997 3.99993C16.4097 3.99993 19.9997 7.58993 19.9997 11.9999C19.9997 16.4099 16.4097 19.9999 11.9997 19.9999Z'\n          fill='black'\n        />\n      </g>\n      <defs>\n        <clipPath id='clip0_10878_5'>\n          <rect fill='white' height='24' width='24' />\n        </clipPath>\n      </defs>\n    </svg>\n  );\n};\n\nexport const CloseIcon = () => (\n  <svg\n    data-testid='close-no-outline'\n    fill='none'\n    height='24'\n    viewBox='0 0 24 24'\n    width='24'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      d='M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12L19 6.41Z'\n      fill='black'\n    ></path>\n  </svg>\n);\n\nexport const RetryIcon = () => (\n  <svg\n    data-testid='retry'\n    fill='none'\n    height='24'\n    viewBox='0 0 24 24'\n    width='24'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      d='M17.6449 6.35C16.1949 4.9 14.2049 4 11.9949 4C7.57488 4 4.00488 7.58 4.00488 12C4.00488 16.42 7.57488 20 11.9949 20C15.7249 20 18.8349 17.45 19.7249 14H17.6449C16.8249 16.33 14.6049 18 11.9949 18C8.68488 18 5.99488 15.31 5.99488 12C5.99488 8.69 8.68488 6 11.9949 6C13.6549 6 15.1349 6.69 16.2149 7.78L12.9949 11H19.9949V4L17.6449 6.35Z'\n      fill='black'\n    />\n  </svg>\n);\n\nexport const DownloadIcon = () => (\n  <svg\n    data-testid='download'\n    fill='none'\n    height='24'\n    viewBox='0 0 24 24'\n    width='24'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      d='M19.35 10.04C18.67 6.59 15.64 4 12 4C9.11 4 6.6 5.64 5.35 8.04C2.34 8.36 0 10.91 0 14C0 17.31 2.69 20 6 20H19C21.76 20 24 17.76 24 15C24 12.36 21.95 10.22 19.35 10.04ZM19 18H6C3.79 18 2 16.21 2 14C2 11.95 3.53 10.24 5.56 10.03L6.63 9.92L7.13 8.97C8.08 7.14 9.94 6 12 6C14.62 6 16.88 7.86 17.39 10.43L17.69 11.93L19.22 12.04C20.78 12.14 22 13.45 22 15C22 16.65 20.65 18 19 18ZM13.45 10H10.55V13H8L12 17L16 13H13.45V10Z'\n      fill='black'\n    ></path>\n  </svg>\n);\n\nexport const LinkIcon = () => (\n  <svg\n    fill='none'\n    height='11'\n    viewBox='0 0 20 11'\n    width='20'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      clipRule='evenodd'\n      d='M1.9 5.5C1.9 3.79 3.29 2.4 5 2.4H8.05C8.57467 2.4 9 1.97467 9 1.45C9 0.925329 8.57467 0.5 8.05 0.5H5C2.24 0.5 0 2.74 0 5.5C0 8.26 2.24 10.5 5 10.5H8.05C8.57467 10.5 9 10.0747 9 9.55C9 9.02533 8.57467 8.6 8.05 8.6H5C3.29 8.6 1.9 7.21 1.9 5.5ZM6 5.5C6 6.05228 6.44772 6.5 7 6.5H13C13.5523 6.5 14 6.05228 14 5.5C14 4.94772 13.5523 4.5 13 4.5H7C6.44772 4.5 6 4.94772 6 5.5ZM15 0.5H11.95C11.4253 0.5 11 0.925329 11 1.45C11 1.97467 11.4253 2.4 11.95 2.4H15C16.71 2.4 18.1 3.79 18.1 5.5C18.1 7.21 16.71 8.6 15 8.6H11.95C11.4253 8.6 11 9.02533 11 9.55C11 10.0747 11.4253 10.5 11.95 10.5H15C17.76 10.5 20 8.26 20 5.5C20 2.74 17.76 0.5 15 0.5Z'\n      fill='#005DFF'\n      fillRule='evenodd'\n    />\n  </svg>\n);\n\nexport const SendIcon = () => {\n  const { t } = useTranslationContext('SendButton');\n  return (\n    <svg\n      data-testid='send'\n      fill='currentColor'\n      height='24'\n      viewBox='0 0 24 24'\n      width='24'\n      xmlns='http://www.w3.org/2000/svg'\n    >\n      <title>{t('Send')}</title>\n      <path d='M4.00952 22L24 12L4.00952 2L4 9.77778L18.2857 12L4 14.2222L4.00952 22Z'></path>\n    </svg>\n  );\n};\n\nexport const MicIcon = () => (\n  <svg fill='currentColor' viewBox='0 0 14 20' xmlns='http://www.w3.org/2000/svg'>\n    <path d='M7 12.5C8.66 12.5 10 11.16 10 9.5V3.5C10 1.84 8.66 0.5 7 0.5C5.34 0.5 4 1.84 4 3.5V9.5C4 11.16 5.34 12.5 7 12.5Z' />\n    <path d='M12 9.5C12 12.26 9.76 14.5 7 14.5C4.24 14.5 2 12.26 2 9.5H0C0 13.03 2.61 15.93 6 16.42V19.5H8V16.42C11.39 15.93 14 13.03 14 9.5H12Z' />\n  </svg>\n);\n\nexport const BinIcon = () => (\n  <svg fill='currentColor' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'>\n    <path d='M8.00033 25.3333C8.00033 26.8 9.20033 28 10.667 28H21.3337C22.8003 28 24.0003 26.8 24.0003 25.3333V12C24.0003 10.5333 22.8003 9.33333 21.3337 9.33333H10.667C9.20033 9.33333 8.00033 10.5333 8.00033 12V25.3333ZM24.0003 5.33333H20.667L19.7203 4.38667C19.4803 4.14667 19.1337 4 18.787 4H13.2137C12.867 4 12.5203 4.14667 12.2803 4.38667L11.3337 5.33333H8.00033C7.26699 5.33333 6.66699 5.93333 6.66699 6.66667C6.66699 7.4 7.26699 8 8.00033 8H24.0003C24.7337 8 25.3337 7.4 25.3337 6.66667C25.3337 5.93333 24.7337 5.33333 24.0003 5.33333Z' />\n  </svg>\n);\n\nexport const PauseIcon = () => (\n  <svg\n    data-testid='str-chat__pause-icon'\n    fill='currentColor'\n    viewBox='0 0 16 20'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path d='M0 19.3333H5.33333V0.666626H0V19.3333ZM10.6667 0.666626V19.3333H16V0.666626H10.6667Z' />\n  </svg>\n);\n\nexport const PlayIcon = () => (\n  <svg\n    data-testid='str-chat__play-icon'\n    fill='currentColor'\n    viewBox='0 0 14 18'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path d='M0.236328 2.09338V15.9067C0.236328 16.9601 1.39633 17.6001 2.28966 17.0267L13.143 10.1201C13.9697 9.60005 13.9697 8.40005 13.143 7.86672L2.28966 0.973385C1.39633 0.400051 0.236328 1.04005 0.236328 2.09338Z' />\n  </svg>\n);\n\nexport const CheckSignIcon = () => (\n  <svg fill='currentColor' viewBox='0 0 18 14' xmlns='http://www.w3.org/2000/svg'>\n    <path d='M5.79457 10.875L2.32457 7.40502C1.93457 7.01502 1.30457 7.01502 0.91457 7.40502C0.52457 7.79502 0.52457 8.42502 0.91457 8.81502L5.09457 12.995C5.48457 13.385 6.11457 13.385 6.50457 12.995L17.0846 2.41502C17.4746 2.02502 17.4746 1.39502 17.0846 1.00502C16.6946 0.615024 16.0646 0.615024 15.6746 1.00502L5.79457 10.875Z' />\n  </svg>\n);\n", "import { useEffect, useMemo } from 'react';\nimport { FixedSizeQueueCache, MessageComposer } from 'stream-chat';\nimport { useThreadContext } from '../../Threads';\nimport {\n  useChannelStateContext,\n  useChatContext,\n  useMessageContext,\n} from '../../../context';\nimport { useLegacyThreadContext } from '../../Thread';\n\nconst queueCache = new FixedSizeQueueCache<string, MessageComposer>(64);\n\nexport const useMessageComposer = () => {\n  const { client } = useChatContext();\n  const { channel } = useChannelStateContext();\n  const { editing, message: editedMessage } = useMessageContext();\n  // legacy thread will receive new composer\n  const { legacyThread: parentMessage } = useLegacyThreadContext();\n  const threadInstance = useThreadContext();\n\n  const cachedEditedMessage = useMemo(() => {\n    if (!editedMessage) return undefined;\n\n    return editedMessage;\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [editedMessage?.id]);\n\n  const cachedParentMessage = useMemo(() => {\n    if (!parentMessage) return undefined;\n\n    return parentMessage;\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [parentMessage?.id]);\n\n  // composer hierarchy\n  // edited message (always new) -> thread instance (own) -> thread message (always new) -> channel (own)\n  // editedMessage ?? thread ?? parentMessage ?? channel;\n  const messageComposer = useMemo(() => {\n    if (editing && cachedEditedMessage) {\n      const tag = MessageComposer.constructTag(cachedEditedMessage);\n\n      const cachedComposer = queueCache.get(tag);\n      if (cachedComposer) {\n        cachedComposer.editedMessage = cachedEditedMessage;\n        return cachedComposer;\n      }\n\n      return new MessageComposer({\n        client,\n        composition: cachedEditedMessage,\n        compositionContext: cachedEditedMessage,\n      });\n    } else if (threadInstance) {\n      return threadInstance.messageComposer;\n    } else if (cachedParentMessage) {\n      const compositionContext = {\n        ...cachedParentMessage,\n        legacyThreadId: cachedParentMessage.id,\n      };\n\n      const tag = MessageComposer.constructTag(compositionContext);\n\n      const cachedComposer = queueCache.get(tag);\n      if (cachedComposer) return cachedComposer;\n\n      return new MessageComposer({\n        client,\n        compositionContext,\n      });\n    } else {\n      return channel.messageComposer;\n    }\n  }, [\n    cachedEditedMessage,\n    cachedParentMessage,\n    channel,\n    client,\n    editing,\n    threadInstance,\n  ]);\n\n  if (\n    (['legacy_thread', 'message'] as MessageComposer['contextType'][]).includes(\n      messageComposer.contextType,\n    ) &&\n    !queueCache.peek(messageComposer.tag)\n  ) {\n    queueCache.add(messageComposer.tag, messageComposer);\n  }\n\n  useEffect(() => {\n    const unsubscribe = messageComposer.registerSubscriptions();\n    return () => {\n      unsubscribe();\n    };\n  }, [messageComposer]);\n\n  return messageComposer;\n};\n", "import React, { createContext, useContext } from 'react';\n\nimport { Channel } from '../../components';\n\nimport type { PropsWithChildren } from 'react';\nimport type { Thread } from 'stream-chat';\n\nexport type ThreadContextValue = Thread | undefined;\n\nexport const ThreadContext = createContext<ThreadContextValue>(undefined);\n\nexport const useThreadContext = () => useContext(ThreadContext);\n\nexport const ThreadProvider = ({\n  children,\n  thread,\n}: PropsWithChildren<{ thread?: Thread }>) => (\n  <ThreadContext.Provider value={thread}>\n    <Channel channel={thread?.channel}>{children}</Channel>\n  </ThreadContext.Provider>\n);\n", "import React, { useEffect } from 'react';\nimport type { ComputeItemKey, VirtuosoProps } from 'react-virtuoso';\nimport { Virtuoso } from 'react-virtuoso';\n\nimport type { Thread, ThreadManagerState } from 'stream-chat';\n\nimport { ThreadListItem as DefaultThreadListItem } from './ThreadListItem';\nimport { ThreadListEmptyPlaceholder as DefaultThreadListEmptyPlaceholder } from './ThreadListEmptyPlaceholder';\nimport { ThreadListUnseenThreadsBanner as DefaultThreadListUnseenThreadsBanner } from './ThreadListUnseenThreadsBanner';\nimport { ThreadListLoadingIndicator as DefaultThreadListLoadingIndicator } from './ThreadListLoadingIndicator';\nimport { useChatContext, useComponentContext } from '../../../context';\nimport { useStateStore } from '../../../store';\n\nconst selector = (nextValue: ThreadManagerState) => ({ threads: nextValue.threads });\n\nconst computeItemKey: ComputeItemKey<Thread, unknown> = (_, item) => item.id;\n\ntype ThreadListProps = {\n  virtuosoProps?: VirtuosoProps<Thread, unknown>;\n};\n\nexport const useThreadList = () => {\n  const { client } = useChatContext();\n\n  useEffect(() => {\n    const handleVisibilityChange = () => {\n      if (document.visibilityState === 'visible') {\n        client.threads.activate();\n      }\n      if (document.visibilityState === 'hidden') {\n        client.threads.deactivate();\n      }\n    };\n\n    handleVisibilityChange();\n\n    document.addEventListener('visibilitychange', handleVisibilityChange);\n    return () => {\n      client.threads.deactivate();\n      document.removeEventListener('visibilitychange', handleVisibilityChange);\n    };\n  }, [client]);\n};\n\nexport const ThreadList = ({ virtuosoProps }: ThreadListProps) => {\n  const { client } = useChatContext();\n  const {\n    ThreadListEmptyPlaceholder = DefaultThreadListEmptyPlaceholder,\n    ThreadListItem = DefaultThreadListItem,\n    ThreadListLoadingIndicator = DefaultThreadListLoadingIndicator,\n    ThreadListUnseenThreadsBanner = DefaultThreadListUnseenThreadsBanner,\n  } = useComponentContext();\n  const { threads } = useStateStore(client.threads.state, selector);\n\n  useThreadList();\n\n  return (\n    <div className='str-chat__thread-list-container'>\n      {/* TODO: allow re-load on stale ThreadManager state */}\n      <ThreadListUnseenThreadsBanner />\n      <Virtuoso\n        atBottomStateChange={(atBottom) => atBottom && client.threads.loadNextPage()}\n        className='str-chat__thread-list'\n        components={{\n          EmptyPlaceholder: ThreadListEmptyPlaceholder,\n          Footer: ThreadListLoadingIndicator,\n        }}\n        computeItemKey={computeItemKey}\n        data={threads}\n        itemContent={(_, thread) => <ThreadListItem thread={thread} />}\n        // TODO: handle visibility (for a button that scrolls to the unread thread)\n        // itemsRendered={(items) => console.log({ items })}\n        {...virtuosoProps}\n      />\n    </div>\n  );\n};\n", "import React, { createContext, useContext } from 'react';\n\nimport type { Thread } from 'stream-chat';\n\nimport { useComponentContext } from '../../../context';\nimport { ThreadListItemUI as DefaultThreadListItemUI } from './ThreadListItemUI';\n\nimport type { ThreadListItemUIProps } from './ThreadListItemUI';\n\nexport type ThreadListItemProps = {\n  thread: Thread;\n  threadListItemUIProps?: ThreadListItemUIProps;\n};\n\nconst ThreadListItemContext = createContext<Thread | undefined>(undefined);\n\nexport const useThreadListItemContext = () => useContext(ThreadListItemContext);\n\nexport const ThreadListItem = ({\n  thread,\n  threadListItemUIProps,\n}: ThreadListItemProps) => {\n  const { ThreadListItemUI = DefaultThreadListItemUI } = useComponentContext();\n\n  return (\n    <ThreadListItemContext.Provider value={thread}>\n      <ThreadListItemUI {...threadListItemUIProps} />\n    </ThreadListItemContext.Provider>\n  );\n};\n\n// const App = () => {\n//   const route = useRouter();\n\n//   return (\n//     <Chat>\n//       {route === '/channels' && (\n//         <Channel>\n//           <MessageList />\n//           <Thread />\n//         </Channel>\n//       )}\n//       {route === '/threads' && (\n//         <Threads>\n//           <ThreadList />\n//           <ThreadProvider>\n//             <Thread />\n//           </ThreadProvider>\n//         </Threads>\n//       )}\n//     </Chat>\n//   );\n// };\n\n// pre-built layout\n\n{\n  /* \n<Chat client={chatClient}>\n  <Views>\n    // has default\n    <ViewSelector onItemPointerDown={} />\n    <View.Chat>\n      <Channel>\n        <MessageList />\n        <MessageInput />\n      </Channel>\n    </View.Chat>\n    <View.Thread> <-- activeThread state\n      <ThreadList /> <-- uses context for click handler\n      <WrappedThread /> <-- ThreadProvider + Channel combo\n    </View.Thread>\n  </Views>\n</Chat>;\n*/\n}\n", "import React, { useCallback } from 'react';\nimport clsx from 'clsx';\n\nimport type { LocalMessage, ThreadState } from 'stream-chat';\nimport type { ComponentPropsWithoutRef } from 'react';\n\nimport { Timestamp } from '../../Message/Timestamp';\nimport { Avatar } from '../../Avatar';\nimport { Icon } from '../icons';\nimport { UnreadCountBadge } from '../UnreadCountBadge';\n\nimport { useChannelPreviewInfo } from '../../ChannelPreview';\nimport { useChatContext } from '../../../context';\nimport { useThreadsViewContext } from '../../ChatView';\nimport { useThreadListItemContext } from './ThreadListItem';\nimport { useStateStore } from '../../../store';\n\nexport type ThreadListItemUIProps = ComponentPropsWithoutRef<'button'>;\n\n/**\n * TODO:\n * - maybe hover state? ask design\n */\n\nexport const attachmentTypeIconMap = {\n  audio: '\uD83D\uDD08',\n  file: '\uD83D\uDCC4',\n  image: '\uD83D\uDCF7',\n  video: '\uD83C\uDFA5',\n  voiceRecording: '\uD83C\uDF99\uFE0F',\n} as const;\n\n// TODO: translations\nconst getTitleFromMessage = ({\n  currentUserId,\n  message,\n}: {\n  currentUserId?: string;\n  message?: LocalMessage;\n}) => {\n  const attachment = message?.attachments?.at(0);\n\n  let attachmentIcon = '';\n\n  if (attachment) {\n    attachmentIcon +=\n      attachmentTypeIconMap[\n        (attachment.type as keyof typeof attachmentTypeIconMap) ?? 'file'\n      ] ?? attachmentTypeIconMap.file;\n  }\n\n  const messageBelongsToCurrentUser = message?.user?.id === currentUserId;\n\n  if (message?.deleted_at && message.parent_id)\n    return clsx(messageBelongsToCurrentUser && 'You:', 'This reply was deleted.');\n\n  if (message?.deleted_at && !message.parent_id)\n    return clsx(messageBelongsToCurrentUser && 'You:', 'The source message was deleted.');\n\n  if (attachment?.type === 'voiceRecording')\n    return clsx(attachmentIcon, messageBelongsToCurrentUser && 'You:', 'Voice message');\n\n  return clsx(\n    attachmentIcon,\n    messageBelongsToCurrentUser && 'You:',\n    message?.text || attachment?.fallback || 'N/A',\n  );\n};\n\nexport const ThreadListItemUI = (props: ThreadListItemUIProps) => {\n  const { client } = useChatContext();\n  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n  const thread = useThreadListItemContext()!;\n\n  const selector = useCallback(\n    (nextValue: ThreadState) => ({\n      channel: nextValue.channel,\n      deletedAt: nextValue.deletedAt,\n      latestReply: nextValue.replies.at(-1),\n      ownUnreadMessageCount:\n        (client.userID && nextValue.read[client.userID]?.unreadMessageCount) || 0,\n      parentMessage: nextValue.parentMessage,\n    }),\n    [client],\n  );\n\n  const { channel, deletedAt, latestReply, ownUnreadMessageCount, parentMessage } =\n    useStateStore(thread.state, selector);\n\n  const { displayTitle: channelDisplayTitle } = useChannelPreviewInfo({ channel });\n\n  const { activeThread, setActiveThread } = useThreadsViewContext();\n\n  const avatarProps = deletedAt ? null : latestReply?.user;\n\n  return (\n    <button\n      aria-selected={activeThread === thread}\n      className='str-chat__thread-list-item'\n      data-thread-id={thread.id}\n      onClick={() => setActiveThread(thread)}\n      role='option'\n      {...props}\n    >\n      <div className='str-chat__thread-list-item__channel'>\n        <Icon.MessageBubble />\n        <div className='str-chat__thread-list-item__channel-text'>\n          {channelDisplayTitle}\n        </div>\n      </div>\n      <div className='str-chat__thread-list-item__parent-message'>\n        <div className='str-chat__thread-list-item__parent-message-text'>\n          {/* TODO: use thread.title instead? */}\n          replied to: {getTitleFromMessage({ message: parentMessage })}\n        </div>\n        {!deletedAt && <UnreadCountBadge count={ownUnreadMessageCount} />}\n      </div>\n      <div className='str-chat__thread-list-item__latest-reply'>\n        <Avatar {...avatarProps} />\n        <div className='str-chat__thread-list-item__latest-reply-details'>\n          {!deletedAt && (\n            <div className='str-chat__thread-list-item__latest-reply-created-by'>\n              {latestReply?.user?.name || latestReply?.user?.id || 'Unknown sender'}\n            </div>\n          )}\n          <div className='str-chat__thread-list-item__latest-reply-text-and-timestamp'>\n            <div className='str-chat__thread-list-item__latest-reply-text'>\n              {deletedAt\n                ? 'This thread was deleted'\n                : getTitleFromMessage({\n                    currentUserId: client.user?.id,\n                    message: latestReply,\n                  })}\n            </div>\n            <div className='str-chat__thread-list-item__latest-reply-timestamp'>\n              <Timestamp timestamp={deletedAt ?? latestReply?.created_at} />\n            </div>\n          </div>\n        </div>\n      </div>\n    </button>\n  );\n};\n", "import React, { useMemo } from 'react';\n\nimport { useMessageContext } from '../../context/MessageContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { getDateString, isDate } from '../../i18n/utils';\nimport type { TimestampFormatterOptions } from '../../i18n/types';\n\nexport interface TimestampProps extends TimestampFormatterOptions {\n  /* Adds a CSS class name to the component's outer `time` container. */\n  customClass?: string;\n  /* Timestamp to display */\n  timestamp?: Date | string;\n}\n\nexport function Timestamp(props: TimestampProps) {\n  const { calendar, calendarFormats, customClass, format, timestamp } = props;\n\n  const { formatDate } = useMessageContext('MessageTimestamp');\n  const { t, tDateTimeParser } = useTranslationContext('MessageTimestamp');\n\n  const normalizedTimestamp =\n    timestamp && isDate(timestamp) ? timestamp.toISOString() : timestamp;\n\n  const when = useMemo(\n    () =>\n      getDateString({\n        calendar,\n        calendarFormats,\n        format,\n        formatDate,\n        messageCreatedAt: normalizedTimestamp,\n        t,\n        tDateTimeParser,\n        timestampTranslationKey: 'timestamp/MessageTimestamp',\n      }),\n    [\n      calendar,\n      calendarFormats,\n      format,\n      formatDate,\n      normalizedTimestamp,\n      t,\n      tDateTimeParser,\n    ],\n  );\n\n  if (!when) {\n    return null;\n  }\n\n  return (\n    <time\n      className={customClass}\n      dateTime={normalizedTimestamp}\n      title={normalizedTimestamp}\n    >\n      {when}\n    </time>\n  );\n}\n", "import clsx from 'clsx';\nimport React, { useEffect, useState } from 'react';\nimport type { UserResponse } from 'stream-chat';\n\nimport { Icon } from '../Threads/icons';\nimport { getWholeChar } from '../../utils';\n\nexport type AvatarProps = {\n  /** Custom root element class that will be merged with the default class */\n  className?: string;\n  /** Image URL or default is an image of the first initial of the name if there is one  */\n  image?: string | null;\n  /** Name of the image, used for title tag fallback */\n  name?: string;\n  /** click event handler attached to the component root element */\n  onClick?: (event: React.BaseSyntheticEvent) => void;\n  /** mouseOver event handler attached to the component root element */\n  onMouseOver?: (event: React.BaseSyntheticEvent) => void;\n  /** The entire user object for the chat user displayed in the component */\n  user?: UserResponse;\n};\n\n/**\n * A round avatar image with fallback to username's first letter\n */\nexport const Avatar = (props: AvatarProps) => {\n  const {\n    className,\n    image,\n    name,\n    onClick = () => undefined,\n    onMouseOver = () => undefined,\n  } = props;\n\n  const [error, setError] = useState(false);\n\n  useEffect(() => {\n    setError(false);\n  }, [image]);\n\n  const nameStr = name?.toString() || '';\n  const initials = getWholeChar(nameStr, 0);\n  const showImage = image && !error;\n\n  return (\n    <div\n      className={clsx(`str-chat__avatar str-chat__message-sender-avatar`, className, {\n        ['str-chat__avatar--multiple-letters']: initials.length > 1,\n        ['str-chat__avatar--no-letters']: !initials.length,\n        ['str-chat__avatar--one-letter']: initials.length === 1,\n      })}\n      data-testid='avatar'\n      onClick={onClick}\n      onMouseOver={onMouseOver}\n      role='button'\n      title={name}\n    >\n      {showImage ? (\n        <img\n          alt={initials}\n          className='str-chat__avatar-image'\n          data-testid='avatar-img'\n          onError={() => setError(true)}\n          src={image}\n        />\n      ) : (\n        <>\n          {!!initials.length && (\n            <div\n              className={clsx('str-chat__avatar-fallback')}\n              data-testid='avatar-fallback'\n            >\n              {initials}\n            </div>\n          )}\n          {!initials.length && <Icon.User />}\n        </>\n      )}\n    </div>\n  );\n};\n", "import React from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\n\n// TODO: unify icons across SDK\nexport const Icon = {\n  MessageBubble: (props: ComponentPropsWithoutRef<'svg'>) => (\n    <svg\n      className='str-chat__icon str-chat__icon--message-bubble'\n      fill='none'\n      height='14'\n      viewBox='0 0 14 14'\n      width='14'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path\n        d='M1.66659 1.66665H12.3333V9.66665H2.44659L1.66659 10.4466V1.66665ZM1.66659 0.333313C0.933252 0.333313 0.339919 0.933313 0.339919 1.66665L0.333252 13.6666L2.99992 11H12.3333C13.0666 11 13.6666 10.4 13.6666 9.66665V1.66665C13.6666 0.933313 13.0666 0.333313 12.3333 0.333313H1.66659ZM2.99992 6.99998H10.9999V8.33331H2.99992V6.99998ZM2.99992 4.99998H10.9999V6.33331H2.99992V4.99998ZM2.99992 2.99998H10.9999V4.33331H2.99992V2.99998Z'\n        fill='currentColor'\n      />\n    </svg>\n  ),\n  MessageBubbleEmpty: (props: ComponentPropsWithoutRef<'svg'>) => (\n    <svg\n      className='str-chat__icon str-chat__icon--message-bubble-empty'\n      fill='none'\n      height='20'\n      viewBox='0 0 20 20'\n      width='20'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path\n        d='M18 0H2C0.9 0 0 0.9 0 2V20L4 16H18C19.1 16 20 15.1 20 14V2C20 0.9 19.1 0 18 0ZM18 14H4L2 16V2H18V14Z'\n        fill='currentColor'\n      />\n    </svg>\n  ),\n  Reload: (props: ComponentPropsWithoutRef<'svg'>) => (\n    <svg\n      className='str-chat__icon str-chat__icon--reload'\n      fill='none'\n      height='22'\n      viewBox='0 0 16 22'\n      width='16'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path\n        d='M8 3V0L4 4L8 8V5C11.31 5 14 7.69 14 11C14 12.01 13.75 12.97 13.3 13.8L14.76 15.26C15.54 14.03 16 12.57 16 11C16 6.58 12.42 3 8 3ZM8 17C4.69 17 2 14.31 2 11C2 9.99 2.25 9.03 2.7 8.2L1.24 6.74C0.46 7.97 0 9.43 0 11C0 15.42 3.58 19 8 19V22L12 18L8 14V17Z'\n        fill='currentColor'\n      />\n    </svg>\n  ),\n  User: (props: ComponentPropsWithoutRef<'svg'>) => (\n    <svg\n      className='str-chat__icon str-chat__icon--user'\n      fill='none'\n      height='16'\n      viewBox='0 0 16 16'\n      width='16'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path\n        d='M8 2C9.1 2 10 2.9 10 4C10 5.1 9.1 6 8 6C6.9 6 6 5.1 6 4C6 2.9 6.9 2 8 2ZM8 12C10.7 12 13.8 13.29 14 14H2C2.23 13.28 5.31 12 8 12ZM8 0C5.79 0 4 1.79 4 4C4 6.21 5.79 8 8 8C10.21 8 12 6.21 12 4C12 1.79 10.21 0 8 0ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z'\n        fill='currentColor'\n      />\n    </svg>\n  ),\n};\n", "import type {\n  Channel,\n  ChannelQueryOptions,\n  QueryChannelAPIResponse,\n  StreamChat,\n} from 'stream-chat';\n\n/**\n * prevent from duplicate invocation of channel.watch()\n * when events 'notification.message_new' and 'notification.added_to_channel' arrive at the same time\n */\nconst WATCH_QUERY_IN_PROGRESS_FOR_CHANNEL: Record<\n  string,\n  Promise<QueryChannelAPIResponse> | undefined\n> = {};\n\ntype GetChannelParams = {\n  client: StreamChat;\n  channel?: Channel;\n  id?: string;\n  members?: string[];\n  options?: ChannelQueryOptions;\n  type?: string;\n};\n/**\n * Calls channel.watch() if it was not already recently called. Waits for watch promise to resolve even if it was invoked previously.\n * @param client\n * @param members\n * @param options\n * @param type\n * @param id\n * @param channel\n */\nexport const getChannel = async ({\n  channel,\n  client,\n  id,\n  members,\n  options,\n  type,\n}: GetChannelParams) => {\n  if (!channel && !type) {\n    throw new Error('Channel or channel type have to be provided to query a channel.');\n  }\n\n  // unfortunately typescript is not able to infer that if (!channel && !type) === false, then channel or type has to be truthy\n  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n  const theChannel = channel || client.channel(type!, id, { members });\n\n  // need to keep as with call to channel.watch the id can be changed from undefined to an actual ID generated server-side\n  const originalCid = theChannel?.id\n    ? theChannel.cid\n    : members && members.length\n      ? generateChannelTempCid(theChannel.type, members)\n      : undefined;\n\n  if (!originalCid) {\n    throw new Error(\n      'Channel ID or channel members array have to be provided to query a channel.',\n    );\n  }\n\n  const queryPromise = WATCH_QUERY_IN_PROGRESS_FOR_CHANNEL[originalCid];\n\n  if (queryPromise) {\n    await queryPromise;\n  } else {\n    try {\n      WATCH_QUERY_IN_PROGRESS_FOR_CHANNEL[originalCid] = theChannel.watch(options);\n      await WATCH_QUERY_IN_PROGRESS_FOR_CHANNEL[originalCid];\n    } finally {\n      delete WATCH_QUERY_IN_PROGRESS_FOR_CHANNEL[originalCid];\n    }\n  }\n\n  return theChannel;\n};\n\n// Channels created without ID need to be referenced by an identifier until the back-end generates the final ID.\nconst generateChannelTempCid = (channelType: string, members?: string[]) => {\n  if (!members) return;\n  const membersStr = [...members].sort().join(',');\n  return `${channelType}:!members-${membersStr}`;\n};\n", "// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt#getting_whole_characters\nexport const getWholeChar = (str: string, i: number) => {\n  const code = str.charCodeAt(i);\n\n  if (Number.isNaN(code)) return '';\n\n  if (code < 0xd800 || code > 0xdfff) return str.charAt(i);\n\n  if (0xd800 <= code && code <= 0xdbff) {\n    if (str.length <= i + 1) {\n      throw 'High surrogate without following low surrogate';\n    }\n\n    const next = str.charCodeAt(i + 1);\n\n    if (0xdc00 > next || next > 0xdfff) {\n      throw 'High surrogate without following low surrogate';\n    }\n\n    return str.charAt(i) + str.charAt(i + 1);\n  }\n\n  if (i === 0) {\n    throw 'Low surrogate without preceding high surrogate';\n  }\n\n  const prev = str.charCodeAt(i - 1);\n\n  if (0xd800 > prev || prev > 0xdbff) {\n    throw 'Low surrogate without preceding high surrogate';\n  }\n\n  return '';\n};\n", "import React from 'react';\n\nimport { Avatar, GroupAvatar } from './';\nimport type { AvatarProps, GroupAvatarProps } from './';\n\nexport type ChannelAvatarProps = Partial<GroupAvatarProps> & AvatarProps;\n\nexport const ChannelAvatar = ({\n  groupChannelDisplayInfo,\n  image,\n  name,\n  user,\n  ...sharedProps\n}: ChannelAvatarProps) => {\n  if (groupChannelDisplayInfo) {\n    return (\n      <GroupAvatar groupChannelDisplayInfo={groupChannelDisplayInfo} {...sharedProps} />\n    );\n  }\n  return <Avatar image={image} name={name} user={user} {...sharedProps} />;\n};\n", "import clsx from 'clsx';\nimport React from 'react';\nimport type { AvatarProps } from './Avatar';\nimport { Avatar } from './Avatar';\nimport type { GroupChannelDisplayInfo } from '../ChannelPreview';\n\nexport type GroupAvatarProps = Pick<\n  AvatarProps,\n  'className' | 'onClick' | 'onMouseOver'\n> & {\n  /** Mapping of image URLs to names which initials will be used as fallbacks in case image assets fail to load. */\n  groupChannelDisplayInfo: GroupChannelDisplayInfo;\n};\n\nexport const GroupAvatar = ({\n  className,\n  groupChannelDisplayInfo,\n  onClick,\n  onMouseOver,\n}: GroupAvatarProps) => (\n  <div\n    className={clsx(\n      `str-chat__avatar-group`,\n      { 'str-chat__avatar-group--three-part': groupChannelDisplayInfo.length === 3 },\n      className,\n    )}\n    data-testid='group-avatar'\n    onClick={onClick}\n    onMouseOver={onMouseOver}\n    role='button'\n  >\n    {groupChannelDisplayInfo.slice(0, 4).map(({ image, name }, i) => (\n      <Avatar\n        className={clsx({\n          'str-chat__avatar--single': groupChannelDisplayInfo.length === 3 && i === 0,\n        })}\n        image={image}\n        key={`${name}-${image}-${i}`}\n        name={name}\n      />\n    ))}\n  </div>\n);\n", "import clsx from 'clsx';\nimport React from 'react';\nimport type { PropsWithChildren } from 'react';\n\nexport const UnreadCountBadge = ({\n  children,\n  count,\n  position,\n}: PropsWithChildren<{\n  count: number;\n  position?: 'top-right' | 'bottom-right' | 'bottom-left' | 'top-left';\n}>) => (\n  <div className='str-chat__unread-count-badge-container'>\n    {children}\n    {count > 0 && (\n      <div\n        className={clsx(\n          'str-chat__unread-count-badge',\n          position && `str-chat__unread-count-badge--${position}`,\n        )}\n      >\n        {count}\n      </div>\n    )}\n  </div>\n);\n", "import throttle from 'lodash.throttle';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport type { Channel, Event, LocalMessage } from 'stream-chat';\n\nimport { ChannelPreviewMessenger } from './ChannelPreviewMessenger';\nimport { useIsChannelMuted } from './hooks/useIsChannelMuted';\nimport { useChannelPreviewInfo } from './hooks/useChannelPreviewInfo';\nimport { getLatestMessagePreview as defaultGetLatestMessagePreview } from './utils';\nimport { useChatContext } from '../../context/ChatContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useMessageDeliveryStatus } from './hooks/useMessageDeliveryStatus';\nimport type { MessageDeliveryStatus } from './hooks/useMessageDeliveryStatus';\nimport type { ChatContextValue } from '../../context/ChatContext';\nimport type { ChannelAvatarProps } from '../Avatar/ChannelAvatar';\nimport type { GroupChannelDisplayInfo } from './utils';\nimport type { TranslationContextValue } from '../../context/TranslationContext';\n\nexport type ChannelPreviewUIComponentProps = ChannelPreviewProps & {\n  /** Image of Channel to display */\n  displayImage?: string;\n  /** Title of Channel to display */\n  displayTitle?: string;\n  /** Title of Channel to display */\n  groupChannelDisplayInfo?: GroupChannelDisplayInfo;\n  /** The last message received in a channel */\n  lastMessage?: LocalMessage;\n  /** @deprecated Use latestMessagePreview prop instead. */\n  latestMessage?: ReactNode;\n  /** Latest message preview to display, will be a string or JSX element supporting markdown. */\n  latestMessagePreview?: ReactNode;\n  /** Status describing whether own message has been delivered or read by another. If the last message is not an own message, then the status is undefined. */\n  messageDeliveryStatus?: MessageDeliveryStatus;\n  /** Number of unread Messages */\n  unread?: number;\n};\n\nexport type ChannelPreviewProps = {\n  /** Comes from either the `channelRenderFilterFn` or `usePaginatedChannels` call from [ChannelList](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/ChannelList.tsx) */\n  channel: Channel;\n  /** If the component's channel is the active (selected) Channel */\n  active?: boolean;\n  /** Current selected channel object */\n  activeChannel?: Channel;\n  /** UI component to display an avatar, defaults to [Avatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/Avatar.tsx) component and accepts the same props as: [ChannelAvatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/ChannelAvatar.tsx) */\n  Avatar?: React.ComponentType<ChannelAvatarProps>;\n  /** Forces the update of preview component on channel update */\n  channelUpdateCount?: number;\n  /** Custom class for the channel preview root */\n  className?: string;\n  /** Custom function that generates the message preview in ChannelPreview component */\n  getLatestMessagePreview?: (\n    channel: Channel,\n    t: TranslationContextValue['t'],\n    userLanguage: TranslationContextValue['userLanguage'],\n    isMessageAIGenerated: ChatContextValue['isMessageAIGenerated'],\n  ) => ReactNode;\n  key?: string;\n  /** Custom ChannelPreview click handler function */\n  onSelect?: (event: React.MouseEvent) => void;\n  /** Custom UI component to display the channel preview in the list, defaults to and accepts same props as: [ChannelPreviewMessenger](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelPreview/ChannelPreviewMessenger.tsx) */\n  Preview?: React.ComponentType<ChannelPreviewUIComponentProps>;\n  /** Setter for selected Channel */\n  setActiveChannel?: ChatContextValue['setActiveChannel'];\n  /** Object containing watcher parameters */\n  watchers?: { limit?: number; offset?: number };\n};\n\nexport const ChannelPreview = (props: ChannelPreviewProps) => {\n  const {\n    active,\n    channel,\n    channelUpdateCount,\n    getLatestMessagePreview = defaultGetLatestMessagePreview,\n    Preview = ChannelPreviewMessenger,\n  } = props;\n  const {\n    channel: activeChannel,\n    client,\n    isMessageAIGenerated,\n    setActiveChannel,\n  } = useChatContext('ChannelPreview');\n  const { t, userLanguage } = useTranslationContext('ChannelPreview');\n  const { displayImage, displayTitle, groupChannelDisplayInfo } = useChannelPreviewInfo({\n    channel,\n  });\n\n  const [lastMessage, setLastMessage] = useState<LocalMessage>(\n    channel.state.messages[channel.state.messages.length - 1],\n  );\n  const [latestMessagePreview, setLatestMessagePreview] = useState<ReactNode>(() =>\n    getLatestMessagePreview(channel, t, userLanguage, isMessageAIGenerated),\n  );\n\n  const [unread, setUnread] = useState(0);\n  const { messageDeliveryStatus } = useMessageDeliveryStatus({\n    channel,\n    lastMessage,\n  });\n\n  const isActive =\n    typeof active === 'undefined' ? activeChannel?.cid === channel.cid : active;\n  const { muted } = useIsChannelMuted(channel);\n\n  useEffect(() => {\n    const handleEvent = (event: Event) => {\n      if (!event.cid) return setUnread(0);\n      if (channel.cid === event.cid) setUnread(0);\n    };\n\n    client.on('notification.mark_read', handleEvent);\n    return () => client.off('notification.mark_read', handleEvent);\n  }, [channel, client]);\n\n  useEffect(() => {\n    const handleEvent = (event: Event) => {\n      if (channel.cid !== event.cid) return;\n      if (event.user?.id !== client.user?.id) return;\n      setUnread(channel.countUnread());\n    };\n    channel.on('notification.mark_unread', handleEvent);\n    return () => {\n      channel.off('notification.mark_unread', handleEvent);\n    };\n  }, [channel, client]);\n\n  const refreshUnreadCount = useMemo(\n    () =>\n      throttle(() => {\n        if (muted) {\n          setUnread(0);\n        } else {\n          setUnread(channel.countUnread());\n        }\n      }, 400),\n    [channel, muted],\n  );\n\n  useEffect(() => {\n    refreshUnreadCount();\n    setLatestMessagePreview(\n      getLatestMessagePreview(channel, t, userLanguage, isMessageAIGenerated),\n    );\n\n    const handleEvent = (event: Event) => {\n      const deletedMessagesInAnotherChannel =\n        event.type === 'user.messages.deleted' && event.cid && event.cid !== channel.cid;\n\n      if (deletedMessagesInAnotherChannel) return;\n\n      setLastMessage(\n        channel.state.latestMessages[channel.state.latestMessages.length - 1],\n      );\n      setLatestMessagePreview(\n        getLatestMessagePreview(channel, t, userLanguage, isMessageAIGenerated),\n      );\n      refreshUnreadCount();\n    };\n\n    channel.on('message.new', handleEvent);\n    channel.on('message.updated', handleEvent);\n    channel.on('message.deleted', handleEvent);\n    client.on('user.messages.deleted', handleEvent);\n    channel.on('message.undeleted', handleEvent);\n    channel.on('channel.truncated', handleEvent);\n\n    return () => {\n      channel.off('message.new', handleEvent);\n      channel.off('message.updated', handleEvent);\n      channel.off('message.deleted', handleEvent);\n      client.off('user.messages.deleted', handleEvent);\n      channel.off('message.undeleted', handleEvent);\n      channel.off('channel.truncated', handleEvent);\n    };\n  }, [\n    channel,\n    client,\n    refreshUnreadCount,\n    channelUpdateCount,\n    getLatestMessagePreview,\n    t,\n    userLanguage,\n    isMessageAIGenerated,\n  ]);\n\n  if (!Preview) return null;\n\n  return (\n    <Preview\n      {...props}\n      active={isActive}\n      displayImage={displayImage}\n      displayTitle={displayTitle}\n      groupChannelDisplayInfo={groupChannelDisplayInfo}\n      lastMessage={lastMessage}\n      latestMessage={latestMessagePreview}\n      latestMessagePreview={latestMessagePreview}\n      messageDeliveryStatus={messageDeliveryStatus}\n      setActiveChannel={setActiveChannel}\n      unread={unread}\n    />\n  );\n};\n", "import React, { useRef } from 'react';\nimport clsx from 'clsx';\n\nimport { ChannelPreviewActionButtons as DefaultChannelPreviewActionButtons } from './ChannelPreviewActionButtons';\nimport { Avatar as DefaultAvatar } from '../Avatar';\nimport { useComponentContext } from '../../context';\nimport type { ChannelPreviewUIComponentProps } from './ChannelPreview';\n\nconst UnMemoizedChannelPreviewMessenger = (props: ChannelPreviewUIComponentProps) => {\n  const {\n    active,\n    Avatar = DefaultAvatar,\n    channel,\n    className: customClassName = '',\n    displayImage,\n    displayTitle,\n    groupChannelDisplayInfo,\n    latestMessagePreview,\n    onSelect: customOnSelectChannel,\n    setActiveChannel,\n    unread,\n    watchers,\n  } = props;\n\n  const { ChannelPreviewActionButtons = DefaultChannelPreviewActionButtons } =\n    useComponentContext();\n\n  const channelPreviewButton = useRef<HTMLButtonElement | null>(null);\n\n  const avatarName =\n    displayTitle || channel.state.messages[channel.state.messages.length - 1]?.user?.id;\n\n  const onSelectChannel = (e: React.MouseEvent<HTMLButtonElement>) => {\n    if (customOnSelectChannel) {\n      customOnSelectChannel(e);\n    } else if (setActiveChannel) {\n      setActiveChannel(channel, watchers);\n    }\n    if (channelPreviewButton?.current) {\n      channelPreviewButton.current.blur();\n    }\n  };\n\n  return (\n    <div className='str-chat__channel-preview-container'>\n      <ChannelPreviewActionButtons channel={channel} />\n      <button\n        aria-label={`Select Channel: ${displayTitle || ''}`}\n        aria-selected={active}\n        className={clsx(\n          `str-chat__channel-preview-messenger str-chat__channel-preview`,\n          active && 'str-chat__channel-preview-messenger--active',\n          unread && unread >= 1 && 'str-chat__channel-preview-messenger--unread',\n          customClassName,\n        )}\n        data-testid='channel-preview-button'\n        onClick={onSelectChannel}\n        ref={channelPreviewButton}\n        role='option'\n      >\n        <div className='str-chat__channel-preview-messenger--left'>\n          <Avatar\n            className='str-chat__avatar--channel-preview'\n            groupChannelDisplayInfo={groupChannelDisplayInfo}\n            image={displayImage}\n            name={avatarName}\n          />\n        </div>\n        <div className='str-chat__channel-preview-end'>\n          <div className='str-chat__channel-preview-end-first-row'>\n            <div className='str-chat__channel-preview-messenger--name'>\n              <span>{displayTitle}</span>\n            </div>\n            {!!unread && (\n              <div\n                className='str-chat__channel-preview-unread-badge'\n                data-testid='unread-badge'\n              >\n                {unread}\n              </div>\n            )}\n          </div>\n          <div className='str-chat__channel-preview-messenger--last-message'>\n            {latestMessagePreview}\n          </div>\n        </div>\n      </button>\n    </div>\n  );\n};\n\n/**\n * Used as preview component for channel item in [ChannelList](#channellist) component.\n * Its best suited for messenger type chat.\n */\nexport const ChannelPreviewMessenger = React.memo(\n  UnMemoizedChannelPreviewMessenger,\n) as typeof UnMemoizedChannelPreviewMessenger;\n", "import React from 'react';\nimport clsx from 'clsx';\nimport type { Channel } from 'stream-chat';\n\nimport { useChannelMembershipState } from '../ChannelList';\nimport { Icon } from './icons';\nimport { useTranslationContext } from '../../context';\n\nexport type ChannelPreviewActionButtonsProps = {\n  channel: Channel;\n};\n\nexport function ChannelPreviewActionButtons({\n  channel,\n}: ChannelPreviewActionButtonsProps) {\n  const membership = useChannelMembershipState(channel);\n  const { t } = useTranslationContext();\n\n  return (\n    <div className='str-chat__channel-preview__action-buttons'>\n      <button\n        aria-label={membership.pinned_at ? t('Unpin') : t('Pin')}\n        className={clsx(\n          'str-chat__channel-preview__action-button',\n          'str-chat__channel-preview__action-button--pin',\n          membership.pinned_at && 'str-chat__channel-preview__action-button--active',\n        )}\n        onClick={(e) => {\n          e.stopPropagation();\n          if (membership.pinned_at) {\n            channel.unpin();\n          } else {\n            channel.pin();\n          }\n        }}\n        title={membership.pinned_at ? t('Unpin') : t('Pin')}\n      >\n        <Icon.Pin />\n      </button>\n      <button\n        aria-label={membership.archived_at ? t('Unarchive') : t('Archive')}\n        className={clsx(\n          'str-chat__channel-preview__action-button',\n          'str-chat__channel-preview__action-button--archive',\n          membership.archived_at && 'str-chat__channel-preview__action-button--active',\n        )}\n        onClick={(e) => {\n          e.stopPropagation();\n          if (membership.archived_at) {\n            channel.unarchive();\n          } else {\n            channel.archive();\n          }\n        }}\n        title={membership.archived_at ? t('Unarchive') : t('Archive')}\n      >\n        <Icon.ArchiveBox />\n      </button>\n    </div>\n  );\n}\n", "import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport type { ReactNode } from 'react';\nimport type {\n  Channel,\n  ChannelFilters,\n  ChannelOptions,\n  ChannelSort,\n  Event,\n  SearchControllerState,\n} from 'stream-chat';\n\nimport { useConnectionRecoveredListener } from './hooks/useConnectionRecoveredListener';\nimport { useMobileNavigation } from './hooks/useMobileNavigation';\nimport { usePaginatedChannels } from './hooks/usePaginatedChannels';\nimport {\n  useChannelListShape,\n  usePrepareShapeHandlers,\n} from './hooks/useChannelListShape';\nimport { useStateStore } from '../../store';\nimport { ChannelListMessenger } from './ChannelListMessenger';\nimport { Avatar as DefaultAvatar } from '../Avatar';\nimport { ChannelPreview } from '../ChannelPreview/ChannelPreview';\nimport { ChannelSearch as DefaultChannelSearch } from '../ChannelSearch/ChannelSearch';\nimport { EmptyStateIndicator as DefaultEmptyStateIndicator } from '../EmptyStateIndicator';\nimport { LoadingChannels } from '../Loading/LoadingChannels';\nimport { LoadMorePaginator } from '../LoadMore/LoadMorePaginator';\nimport {\n  ChannelListContextProvider,\n  useChatContext,\n  useComponentContext,\n} from '../../context';\nimport { NullComponent } from '../UtilityComponents';\nimport { moveChannelUpwards } from './utils';\nimport type { CustomQueryChannelsFn } from './hooks/usePaginatedChannels';\nimport type { ChannelListMessengerProps } from './ChannelListMessenger';\nimport type { ChannelPreviewUIComponentProps } from '../ChannelPreview/ChannelPreview';\nimport type { ChannelSearchProps } from '../ChannelSearch/ChannelSearch';\nimport type { EmptyStateIndicatorProps } from '../EmptyStateIndicator';\nimport type { LoadMorePaginatorProps } from '../LoadMore/LoadMorePaginator';\nimport type { ChatContextValue } from '../../context';\nimport type { ChannelAvatarProps } from '../Avatar';\nimport type { TranslationContextValue } from '../../context/TranslationContext';\nimport type { PaginatorProps } from '../../types/types';\nimport type { LoadingErrorIndicatorProps } from '../Loading';\n\nconst DEFAULT_FILTERS = {};\nconst DEFAULT_OPTIONS = {};\nconst DEFAULT_SORT = {};\n\nconst searchControllerStateSelector = (nextValue: SearchControllerState) => ({\n  searchIsActive: nextValue.isActive,\n});\n\nexport type ChannelListProps = {\n  /** Additional props for underlying ChannelSearch component and channel search controller, [available props](https://getstream.io/chat/docs/sdk/react/utility-components/channel_search/#props) */\n  additionalChannelSearchProps?: Omit<ChannelSearchProps, 'setChannels'>;\n  /**\n   * When the client receives `message.new`, `notification.message_new`, and `notification.added_to_channel` events, we automatically\n   * push that channel to the top of the list. If the channel doesn't currently exist in the list, we grab the channel from\n   * `client.activeChannels` and push it to the top of the list. You can disable this behavior by setting this prop\n   * to false, which will prevent channels not in the list from incrementing the list. The default is true.\n   */\n  allowNewMessagesFromUnfilteredChannels?: boolean;\n  /** UI component to display an avatar, defaults to [Avatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/Avatar.tsx) component and accepts the same props as: [ChannelAvatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/ChannelAvatar.tsx) */\n  Avatar?: React.ComponentType<ChannelAvatarProps>;\n  /** Optional function to filter channels prior to loading in the DOM. Do not use any complex or async logic that would delay the loading of the ChannelList. We recommend using a pure function with array methods like filter/sort/reduce. */\n  channelRenderFilterFn?: (channels: Array<Channel>) => Array<Channel>;\n  /** Custom UI component to display search results, defaults to and accepts same props as: [ChannelSearch](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelSearch/ChannelSearch.tsx) */\n  ChannelSearch?: React.ComponentType<ChannelSearchProps>;\n  // FIXME: how is this even legal (WHY IS IT STRING?!)\n  /** Set a channel (with this ID) to active and manually move it to the top of the list */\n  customActiveChannel?: string;\n  /** Custom function that handles the channel pagination. Has to build query filters, sort and options and query and append channels to the current channels state and update the hasNext pagination flag after each query. */\n  customQueryChannels?: CustomQueryChannelsFn;\n  /** Custom UI component for rendering an empty list, defaults to and accepts same props as: [EmptyStateIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/EmptyStateIndicator/EmptyStateIndicator.tsx) */\n  EmptyStateIndicator?: React.ComponentType<EmptyStateIndicatorProps>;\n  /** An object containing channel query filters */\n  filters?: ChannelFilters;\n  /** Custom function that generates the message preview in ChannelPreview component */\n  getLatestMessagePreview?: (\n    channel: Channel,\n    t: TranslationContextValue['t'],\n    userLanguage: TranslationContextValue['userLanguage'],\n    isMessageAIGenerated?: ChatContextValue['isMessageAIGenerated'],\n  ) => ReactNode;\n  /** Custom UI component to display the container for the queried channels, defaults to and accepts same props as: [ChannelListMessenger](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/ChannelListMessenger.tsx) */\n  List?: React.ComponentType<ChannelListMessengerProps>;\n  /** Custom UI component to display the loading error indicator, defaults to component that renders null */\n  LoadingErrorIndicator?: React.ComponentType<LoadingErrorIndicatorProps>;\n  /** Custom UI component to display the loading state, defaults to and accepts same props as: [LoadingChannels](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Loading/LoadingChannels.tsx) */\n  LoadingIndicator?: React.ComponentType;\n  /** When true, channels won't dynamically sort by most recent message */\n  lockChannelOrder?: boolean;\n  /** Function to override the default behavior when a user is added to a channel, corresponds to [notification.added\\_to\\_channel](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n  onAddedToChannel?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void;\n  /** Function to override the default behavior when a channel is deleted, corresponds to [channel.deleted](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n  onChannelDeleted?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void;\n  /** Function to override the default behavior when a channel is hidden, corresponds to [channel.hidden](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n  onChannelHidden?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void;\n  /** Function to override the default behavior when a channel is truncated, corresponds to [channel.truncated](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n  onChannelTruncated?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void;\n  /** Function to override the default behavior when a channel is updated, corresponds to [channel.updated](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n  onChannelUpdated?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void;\n  /** Function to override the default channel visible behavior, corresponds to [channel.visible](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n  onChannelVisible?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void;\n  /** Function to override the default behavior when a message is received on a channel not being watched, corresponds to [notification.message\\_new](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n  onMessageNew?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void;\n  /** Function to override the default behavior when a message is received on a channel being watched, handles [message.new](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n  onMessageNewHandler?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void;\n  /** Function to override the default behavior when a user gets removed from a channel, corresponds to [notification.removed\\_from\\_channel](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n  onRemovedFromChannel?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void;\n  /** An object containing channel query options */\n  options?: ChannelOptions;\n  /** Custom UI component to handle channel pagination logic, defaults to and accepts same props as: [LoadMorePaginator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/LoadMore/LoadMorePaginator.tsx) */\n  Paginator?: React.ComponentType<PaginatorProps | LoadMorePaginatorProps>;\n  /** Custom UI component to display the channel preview in the list, defaults to and accepts same props as: [ChannelPreviewMessenger](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelPreview/ChannelPreviewMessenger.tsx) */\n  Preview?: React.ComponentType<ChannelPreviewUIComponentProps>;\n  /**\n   * Custom interval during which the recovery channel list queries will be prevented.\n   * This is to avoid firing unnecessary queries during internet connection fluctuation.\n   * Recovery channel query is triggered upon `connection.recovered` and leads to complete channel list reload with pagination offset 0.\n   * The minimum throttle interval is 2000ms. The default throttle interval is 5000ms.\n   */\n  recoveryThrottleIntervalMs?: number;\n  /** Function to override the default behavior when rendering channels, so this function is called instead of rendering the Preview directly */\n  renderChannels?: (\n    channels: Channel[],\n    channelPreview: (item: Channel) => React.ReactNode,\n  ) => React.ReactNode;\n  /** If true, sends the list's currently loaded channels to the `List` component as the `loadedChannels` prop */\n  sendChannelsToList?: boolean;\n  /** Last channel will be set as active channel if true, defaults to true */\n  setActiveChannelOnMount?: boolean;\n  /** Whether or not to load the list with a search component, defaults to false */\n  showChannelSearch?: boolean;\n  /** An object containing channel query sort parameters */\n  sort?: ChannelSort;\n  /** An object containing query parameters for fetching channel watchers */\n  watchers?: { limit?: number; offset?: number };\n};\n\nconst UnMemoizedChannelList = (props: ChannelListProps) => {\n  const {\n    additionalChannelSearchProps,\n    allowNewMessagesFromUnfilteredChannels = true,\n    Avatar = DefaultAvatar,\n    channelRenderFilterFn,\n    ChannelSearch = DefaultChannelSearch,\n    customActiveChannel,\n    customQueryChannels,\n    EmptyStateIndicator = DefaultEmptyStateIndicator,\n    filters = {},\n    getLatestMessagePreview,\n    List = ChannelListMessenger,\n    LoadingErrorIndicator = NullComponent,\n    LoadingIndicator = LoadingChannels,\n    lockChannelOrder = false,\n    onAddedToChannel,\n    onChannelDeleted,\n    onChannelHidden,\n    onChannelTruncated,\n    onChannelUpdated,\n    onChannelVisible,\n    onMessageNew,\n    onMessageNewHandler,\n    onRemovedFromChannel,\n    options,\n    Paginator = LoadMorePaginator,\n    Preview,\n    recoveryThrottleIntervalMs,\n    renderChannels,\n    sendChannelsToList = false,\n    setActiveChannelOnMount = true,\n    showChannelSearch = false,\n    sort = DEFAULT_SORT,\n    watchers = {},\n  } = props;\n\n  const {\n    channel,\n    channelsQueryState,\n    client,\n    closeMobileNav,\n    customClasses,\n    navOpen = false,\n    searchController,\n    setActiveChannel,\n    theme,\n    useImageFlagEmojisOnWindows,\n  } = useChatContext('ChannelList');\n  const { Search } = useComponentContext(); // FIXME: us component context to retrieve ChannelPreview UI components too\n  const channelListRef = useRef<HTMLDivElement | null>(null);\n  const [channelUpdateCount, setChannelUpdateCount] = useState(0);\n  const [searchActive, setSearchActive] = useState(false);\n\n  // Indicator relevant when Search component that relies on SearchController is used\n  const { searchIsActive } = useStateStore(\n    searchController.state,\n    searchControllerStateSelector,\n  );\n  /**\n   * Set a channel with id {customActiveChannel} as active and move it to the top of the list.\n   * If customActiveChannel prop is absent, then set the first channel in list as active channel.\n   */\n  const activeChannelHandler = async (\n    channels: Array<Channel>,\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n  ) => {\n    if (!channels.length) {\n      return;\n    }\n\n    if (customActiveChannel) {\n      // FIXME: this is wrong...\n      let customActiveChannelObject = channels.find(\n        (chan) => chan.id === customActiveChannel,\n      );\n\n      if (!customActiveChannelObject) {\n        [customActiveChannelObject] = await client.queryChannels({\n          id: customActiveChannel,\n        });\n      }\n\n      if (customActiveChannelObject) {\n        setActiveChannel(customActiveChannelObject, watchers);\n\n        const newChannels = moveChannelUpwards({\n          channels,\n          channelToMove: customActiveChannelObject,\n          sort,\n        });\n\n        setChannels(newChannels);\n      }\n\n      return;\n    }\n\n    if (setActiveChannelOnMount) {\n      setActiveChannel(channels[0], watchers);\n    }\n  };\n\n  /**\n   * For some events, inner properties on the channel will update but the shallow comparison will not\n   * force a re-render. Incrementing this dummy variable ensures the channel previews update.\n   */\n  const forceUpdate = useCallback(() => setChannelUpdateCount((count) => count + 1), []);\n\n  const onSearch = useCallback(\n    (event: React.ChangeEvent<HTMLInputElement>) => {\n      setSearchActive(!!event.target.value);\n\n      additionalChannelSearchProps?.onSearch?.(event);\n    },\n    [additionalChannelSearchProps],\n  );\n\n  const onSearchExit = useCallback(() => {\n    setSearchActive(false);\n    additionalChannelSearchProps?.onSearchExit?.();\n  }, [additionalChannelSearchProps]);\n\n  const { channels, hasNextPage, loadNextPage, setChannels } = usePaginatedChannels(\n    client,\n    filters || DEFAULT_FILTERS,\n    sort || DEFAULT_SORT,\n    options || DEFAULT_OPTIONS,\n    activeChannelHandler,\n    recoveryThrottleIntervalMs,\n    customQueryChannels,\n  );\n\n  const loadedChannels = channelRenderFilterFn\n    ? channelRenderFilterFn(channels)\n    : channels;\n\n  useMobileNavigation(channelListRef, navOpen, closeMobileNav);\n\n  const { customHandler, defaultHandler } = usePrepareShapeHandlers({\n    allowNewMessagesFromUnfilteredChannels,\n    filters,\n    lockChannelOrder,\n    onAddedToChannel,\n    onChannelDeleted,\n    onChannelHidden,\n    onChannelTruncated,\n    onChannelUpdated,\n    onChannelVisible,\n    onMessageNew,\n    onMessageNewHandler,\n    onRemovedFromChannel,\n    setChannels,\n    sort,\n    // TODO: implement\n    // customHandleChannelListShape\n  });\n\n  useChannelListShape(customHandler ?? defaultHandler);\n\n  // TODO: maybe move this too\n  useConnectionRecoveredListener(forceUpdate);\n\n  useEffect(() => {\n    const handleEvent = (event: Event) => {\n      if (event.cid === channel?.cid) {\n        setActiveChannel();\n      }\n    };\n\n    client.on('channel.deleted', handleEvent);\n    client.on('channel.hidden', handleEvent);\n\n    return () => {\n      client.off('channel.deleted', handleEvent);\n      client.off('channel.hidden', handleEvent);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [channel?.cid]);\n\n  const renderChannel = (item: Channel) => {\n    const previewProps = {\n      activeChannel: channel,\n      Avatar,\n      channel: item,\n      // forces the update of preview component on channel update\n      channelUpdateCount,\n      getLatestMessagePreview,\n      key: item.cid,\n      Preview,\n      setActiveChannel,\n      watchers,\n    };\n\n    return <ChannelPreview {...previewProps} />;\n  };\n\n  const baseClass = 'str-chat__channel-list';\n  const className = clsx(\n    customClasses?.chat ?? 'str-chat',\n    theme,\n    customClasses?.channelList ?? `${baseClass} ${baseClass}-react`,\n    {\n      'str-chat--windows-flags':\n        useImageFlagEmojisOnWindows && navigator.userAgent.match(/Win/),\n      [`${baseClass}--open`]: navOpen,\n    },\n  );\n\n  const showChannelList =\n    (!searchActive && !searchIsActive) || additionalChannelSearchProps?.popupResults;\n  return (\n    <ChannelListContextProvider\n      value={{ channels, hasNextPage, loadNextPage, setChannels }}\n    >\n      <div className={className} ref={channelListRef}>\n        {showChannelSearch &&\n          (Search ? (\n            <Search\n              directMessagingChannelType={additionalChannelSearchProps?.channelType}\n              disabled={additionalChannelSearchProps?.disabled}\n              exitSearchOnInputBlur={\n                additionalChannelSearchProps?.clearSearchOnClickOutside\n              }\n              placeholder={additionalChannelSearchProps?.placeholder}\n            />\n          ) : (\n            <ChannelSearch\n              onSearch={onSearch}\n              onSearchExit={onSearchExit}\n              setChannels={setChannels}\n              {...additionalChannelSearchProps}\n            />\n          ))}\n        {showChannelList && (\n          <List\n            error={channelsQueryState.error}\n            loadedChannels={sendChannelsToList ? loadedChannels : undefined}\n            loading={\n              !!channelsQueryState.queryInProgress &&\n              ['reload', 'uninitialized'].includes(channelsQueryState.queryInProgress)\n            }\n            LoadingErrorIndicator={LoadingErrorIndicator}\n            LoadingIndicator={LoadingIndicator}\n            setChannels={setChannels}\n          >\n            {!loadedChannels?.length ? (\n              <EmptyStateIndicator listType='channel' />\n            ) : (\n              <Paginator\n                hasNextPage={hasNextPage}\n                isLoading={channelsQueryState.queryInProgress === 'load-more'}\n                loadNextPage={loadNextPage}\n              >\n                {renderChannels\n                  ? renderChannels(loadedChannels, renderChannel)\n                  : loadedChannels.map((channel) => renderChannel(channel))}\n              </Paginator>\n            )}\n          </List>\n        )}\n      </div>\n    </ChannelListContextProvider>\n  );\n};\n\n/**\n * Renders a preview list of Channels, allowing you to select the Channel you want to open\n */\nexport const ChannelList = React.memo(\n  UnMemoizedChannelList,\n) as typeof UnMemoizedChannelList;\n", "import { useEffect } from 'react';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nexport const useConnectionRecoveredListener = (forceUpdate?: () => void) => {\n  const { client } = useChatContext('useConnectionRecoveredListener');\n\n  useEffect(() => {\n    const handleEvent = () => {\n      if (forceUpdate) {\n        forceUpdate();\n      }\n    };\n\n    client.on('connection.recovered', handleEvent);\n\n    return () => {\n      client.off('connection.recovered', handleEvent);\n    };\n  }, [client, forceUpdate]);\n};\n", "import { useEffect } from 'react';\n\nexport const useMobileNavigation = (\n  channelListRef: React.RefObject<HTMLDivElement | null>,\n  navOpen: boolean,\n  closeMobileNav?: () => void,\n) => {\n  useEffect(() => {\n    const handleClickOutside = (event: MouseEvent) => {\n      if (\n        closeMobileNav &&\n        channelListRef.current &&\n        !channelListRef.current.contains(event.target as Node) &&\n        navOpen\n      ) {\n        closeMobileNav();\n      }\n    };\n\n    document.addEventListener('click', handleClickOutside);\n\n    return () => {\n      document.removeEventListener('click', handleClickOutside);\n    };\n  }, [channelListRef, closeMobileNav, navOpen]);\n};\n", "import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport uniqBy from 'lodash.uniqby';\n\nimport type {\n  APIErrorResponse,\n  Channel,\n  ChannelFilters,\n  ChannelOptions,\n  ChannelSort,\n  ErrorFromResponse,\n  StreamChat,\n} from 'stream-chat';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { ChannelsQueryState } from '../../Chat/hooks/useChannelsQueryState';\n\nconst RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS = 5000;\nconst MIN_RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS = 2000;\n\ntype AllowedQueryType = Extract<\n  ChannelsQueryState['queryInProgress'],\n  'reload' | 'load-more'\n>;\n\nexport type CustomQueryChannelParams = {\n  currentChannels: Array<Channel>;\n  queryType: AllowedQueryType;\n  setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>;\n  setHasNextPage: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport type CustomQueryChannelsFn = (params: CustomQueryChannelParams) => Promise<void>;\n\nexport const usePaginatedChannels = (\n  client: StreamChat,\n  filters: ChannelFilters,\n  sort: ChannelSort,\n  options: ChannelOptions,\n  activeChannelHandler: (\n    channels: Array<Channel>,\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n  ) => void,\n  recoveryThrottleIntervalMs: number = RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS,\n  customQueryChannels?: CustomQueryChannelsFn,\n) => {\n  const {\n    channelsQueryState: { error, setError, setQueryInProgress },\n  } = useChatContext('usePaginatedChannels');\n  const [channels, setChannels] = useState<Array<Channel>>([]);\n  const [hasNextPage, setHasNextPage] = useState(true);\n  const lastRecoveryTimestamp = useRef<number | undefined>(undefined);\n\n  const recoveryThrottleInterval =\n    recoveryThrottleIntervalMs < MIN_RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS\n      ? MIN_RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS\n      : (recoveryThrottleIntervalMs ?? RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS);\n  // memoize props\n  const filterString = useMemo(() => JSON.stringify(filters), [filters]);\n  const sortString = useMemo(() => JSON.stringify(sort), [sort]);\n\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  const queryChannels = async (queryType = 'load-more') => {\n    setError(null);\n\n    if (queryType === 'reload') {\n      setChannels([]);\n    }\n    setQueryInProgress(queryType as AllowedQueryType);\n\n    try {\n      if (customQueryChannels) {\n        await customQueryChannels({\n          currentChannels: channels,\n          queryType: queryType as AllowedQueryType,\n          setChannels,\n          setHasNextPage,\n        });\n      } else {\n        const offset = queryType === 'reload' ? 0 : channels.length;\n\n        const newOptions = {\n          offset,\n          ...options,\n        };\n\n        const channelQueryResponse = await client.queryChannels(\n          filters,\n          sort || {},\n          newOptions,\n        );\n\n        const newChannels =\n          queryType === 'reload'\n            ? channelQueryResponse\n            : uniqBy([...channels, ...channelQueryResponse], 'cid');\n\n        setChannels(newChannels);\n        setHasNextPage(channelQueryResponse.length >= (newOptions.limit ?? 1));\n\n        // Set active channel only on load of first page\n        if (!offset && activeChannelHandler) {\n          activeChannelHandler(newChannels, setChannels);\n        }\n      }\n    } catch (error) {\n      console.warn(error);\n      setError(error as ErrorFromResponse<APIErrorResponse>);\n    }\n\n    setQueryInProgress(null);\n  };\n\n  const throttleRecover = useCallback(() => {\n    const now = Date.now();\n    const isFirstRecovery = !lastRecoveryTimestamp.current;\n    const timeElapsedSinceLastRecoveryMs = lastRecoveryTimestamp.current\n      ? now - lastRecoveryTimestamp.current\n      : 0;\n\n    if (\n      !isFirstRecovery &&\n      timeElapsedSinceLastRecoveryMs < recoveryThrottleInterval &&\n      !error\n    ) {\n      return;\n    }\n\n    lastRecoveryTimestamp.current = now;\n    queryChannels('reload');\n  }, [error, queryChannels, recoveryThrottleInterval]);\n\n  const loadNextPage = () => queryChannels();\n\n  useEffect(() => {\n    if (client.recoverStateOnReconnect) return;\n    const { unsubscribe } = client.on('connection.recovered', throttleRecover);\n\n    return () => {\n      unsubscribe();\n    };\n  }, [client, throttleRecover]);\n\n  useEffect(() => {\n    queryChannels('reload');\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [filterString, sortString]);\n\n  return {\n    channels,\n    hasNextPage,\n    loadNextPage,\n    setChannels,\n  };\n};\n", "import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { Channel, Event } from 'stream-chat';\nimport type { Dispatch, SetStateAction } from 'react';\n\nimport {\n  extractSortValue,\n  findLastPinnedChannelIndex,\n  isChannelArchived,\n  isChannelPinned,\n  moveChannelUpwards,\n  shouldConsiderArchivedChannels,\n  shouldConsiderPinnedChannels,\n} from '../utils';\nimport { useChatContext } from '../../../context';\nimport { getChannel } from '../../../utils';\nimport type { ChannelListProps } from '../ChannelList';\n\ntype SetChannels = Dispatch<SetStateAction<Channel[]>>;\n\ntype BaseParameters = {\n  event: Event;\n  setChannels: SetChannels;\n};\n\ntype RepeatedParameters = {\n  customHandler?: (\n    setChannels: BaseParameters['setChannels'],\n    event: BaseParameters['event'],\n  ) => void;\n};\n\ntype HandleMessageNewParameters = BaseParameters &\n  RepeatedParameters & {\n    allowNewMessagesFromUnfilteredChannels: boolean;\n    lockChannelOrder: boolean;\n  } & Required<Pick<ChannelListProps, 'filters' | 'sort'>>;\n\ntype HandleNotificationMessageNewParameters = BaseParameters &\n  RepeatedParameters & {\n    allowNewMessagesFromUnfilteredChannels: boolean;\n    lockChannelOrder: boolean;\n  } & Required<Pick<ChannelListProps, 'filters' | 'sort'>>;\n\ntype HandleNotificationRemovedFromChannelParameters = BaseParameters & RepeatedParameters;\n\ntype HandleNotificationAddedToChannelParameters = BaseParameters &\n  RepeatedParameters & {\n    allowNewMessagesFromUnfilteredChannels: boolean;\n    lockChannelOrder: boolean;\n  } & Required<Pick<ChannelListProps, 'sort'>>;\n\ntype HandleChannelVisibleParameters = BaseParameters &\n  RepeatedParameters &\n  Required<Pick<ChannelListProps, 'sort' | 'filters'>>;\n\ntype HandleMemberUpdatedParameters = BaseParameters & {\n  lockChannelOrder: boolean;\n} & Required<Pick<ChannelListProps, 'sort' | 'filters'>>;\n\ntype HandleChannelDeletedParameters = BaseParameters & RepeatedParameters;\n\ntype HandleChannelHiddenParameters = BaseParameters & RepeatedParameters;\n\ntype HandleChannelTruncatedParameters = BaseParameters & RepeatedParameters;\n\ntype HandleChannelUpdatedParameters = BaseParameters & RepeatedParameters;\n\ntype HandleUserPresenceChangedParameters = BaseParameters;\n\nconst shared = ({\n  customHandler,\n  event,\n  setChannels,\n}: BaseParameters & RepeatedParameters) => {\n  if (typeof customHandler === 'function') {\n    return customHandler(setChannels, event);\n  }\n\n  setChannels((channels) => {\n    const channelIndex = channels.findIndex((channel) => channel.cid === event.cid);\n\n    if (channelIndex < 0) return channels;\n\n    channels.splice(channelIndex, 1);\n\n    return [...channels];\n  });\n};\n\nexport const useChannelListShapeDefaults = () => {\n  const { client } = useChatContext();\n\n  const handleMessageNew = useCallback(\n    ({\n      allowNewMessagesFromUnfilteredChannels,\n      customHandler,\n      event,\n      filters,\n      lockChannelOrder,\n      setChannels,\n      sort,\n    }: HandleMessageNewParameters) => {\n      if (typeof customHandler === 'function') {\n        return customHandler(setChannels, event);\n      }\n\n      const channelType = event.channel_type;\n      const channelId = event.channel_id;\n\n      if (!channelType || !channelId) return;\n\n      setChannels((currentChannels) => {\n        const targetChannel = client.channel(channelType, channelId);\n        const targetChannelIndex = currentChannels.indexOf(targetChannel);\n        const targetChannelExistsWithinList = targetChannelIndex >= 0;\n\n        const isTargetChannelPinned = isChannelPinned(targetChannel);\n        const isTargetChannelArchived = isChannelArchived(targetChannel);\n\n        const considerArchivedChannels = shouldConsiderArchivedChannels(filters);\n        const considerPinnedChannels = shouldConsiderPinnedChannels(sort);\n\n        if (\n          // filter is defined, target channel is archived and filter option is set to false\n          (considerArchivedChannels && isTargetChannelArchived && !filters.archived) ||\n          // filter is defined, target channel isn't archived and filter option is set to true\n          (considerArchivedChannels && !isTargetChannelArchived && filters.archived) ||\n          // sort option is defined, target channel is pinned\n          (considerPinnedChannels && isTargetChannelPinned) ||\n          // list order is locked\n          lockChannelOrder ||\n          // target channel is not within the loaded list and loading from cache is disallowed\n          (!targetChannelExistsWithinList && !allowNewMessagesFromUnfilteredChannels)\n        ) {\n          return currentChannels;\n        }\n\n        return moveChannelUpwards({\n          channels: currentChannels,\n          channelToMove: targetChannel,\n          channelToMoveIndexWithinChannels: targetChannelIndex,\n          sort,\n        });\n      });\n    },\n    [client],\n  );\n\n  const handleNotificationMessageNew = useCallback(\n    async ({\n      allowNewMessagesFromUnfilteredChannels,\n      customHandler,\n      event,\n      filters,\n      setChannels,\n      sort,\n    }: HandleNotificationMessageNewParameters) => {\n      if (typeof customHandler === 'function') {\n        return customHandler(setChannels, event);\n      }\n\n      if (!event.channel) {\n        return;\n      }\n\n      const channel = await getChannel({\n        client,\n        id: event.channel.id,\n        type: event.channel.type,\n      });\n\n      const considerArchivedChannels = shouldConsiderArchivedChannels(filters);\n      if (isChannelArchived(channel) && considerArchivedChannels && !filters.archived) {\n        return;\n      }\n\n      if (!allowNewMessagesFromUnfilteredChannels) {\n        return;\n      }\n\n      setChannels((channels) =>\n        moveChannelUpwards({\n          channels,\n          channelToMove: channel,\n          sort,\n        }),\n      );\n    },\n    [client],\n  );\n\n  const handleNotificationAddedToChannel = useCallback(\n    async ({\n      allowNewMessagesFromUnfilteredChannels,\n      customHandler,\n      event,\n      setChannels,\n      sort,\n    }: HandleNotificationAddedToChannelParameters) => {\n      if (typeof customHandler === 'function') {\n        return customHandler(setChannels, event);\n      }\n\n      if (!event.channel || !allowNewMessagesFromUnfilteredChannels) {\n        return;\n      }\n\n      const channel = await getChannel({\n        client,\n        id: event.channel.id,\n        members: event.channel.members?.reduce<string[]>(\n          (newMembers, { user, user_id }) => {\n            const userId = user_id || user?.id;\n\n            if (userId) newMembers.push(userId);\n\n            return newMembers;\n          },\n          [],\n        ),\n        type: event.channel.type,\n      });\n\n      // membership has been reset (target channel shouldn't be pinned nor archived)\n      setChannels((channels) =>\n        moveChannelUpwards({\n          channels,\n          channelToMove: channel,\n          sort,\n        }),\n      );\n    },\n    [client],\n  );\n\n  const handleNotificationRemovedFromChannel = useCallback(\n    ({\n      customHandler,\n      event,\n      setChannels,\n    }: HandleNotificationRemovedFromChannelParameters) => {\n      if (typeof customHandler === 'function') {\n        return customHandler(setChannels, event);\n      }\n\n      setChannels((channels) =>\n        channels.filter((channel) => channel.cid !== event.channel?.cid),\n      );\n    },\n    [],\n  );\n\n  const handleMemberUpdated = useCallback(\n    ({\n      event,\n      filters,\n      lockChannelOrder,\n      setChannels,\n      sort,\n    }: HandleMemberUpdatedParameters) => {\n      if (\n        !event.member?.user ||\n        event.member.user.id !== client.userID ||\n        !event.channel_type\n      ) {\n        return;\n      }\n\n      const channelType = event.channel_type;\n      const channelId = event.channel_id;\n\n      const considerPinnedChannels = shouldConsiderPinnedChannels(sort);\n      const considerArchivedChannels = shouldConsiderArchivedChannels(filters);\n\n      // `pinned_at` nor `archived` properties are set or channel list order is locked, return early\n      if ((!considerPinnedChannels && !considerArchivedChannels) || lockChannelOrder) {\n        return;\n      }\n\n      const pinnedAtSort = extractSortValue({ atIndex: 0, sort, targetKey: 'pinned_at' });\n\n      setChannels((currentChannels) => {\n        const targetChannel = client.channel(channelType, channelId);\n        // assumes that channel instances are not changing\n        const targetChannelIndex = currentChannels.indexOf(targetChannel);\n        const targetChannelExistsWithinList = targetChannelIndex >= 0;\n\n        const isTargetChannelArchived = isChannelArchived(targetChannel);\n        const isTargetChannelPinned = isChannelPinned(targetChannel);\n\n        const newChannels = [...currentChannels];\n\n        if (targetChannelExistsWithinList) {\n          newChannels.splice(targetChannelIndex, 1);\n        }\n\n        // handle archiving (remove channel)\n        if (\n          (considerArchivedChannels && isTargetChannelArchived && !filters.archived) ||\n          (considerArchivedChannels && !isTargetChannelArchived && filters.archived)\n        ) {\n          return newChannels;\n        }\n\n        let lastPinnedChannelIndex: number | null = null;\n\n        // calculate last pinned channel index only if `pinned_at` sort is set to\n        // ascending order or if it's in descending order while the pin is being removed, otherwise\n        // we move to the top (index 0)\n        if (pinnedAtSort === 1 || (pinnedAtSort === -1 && !isTargetChannelPinned)) {\n          lastPinnedChannelIndex = findLastPinnedChannelIndex({ channels: newChannels });\n        }\n\n        const newTargetChannelIndex =\n          typeof lastPinnedChannelIndex === 'number' ? lastPinnedChannelIndex + 1 : 0;\n\n        newChannels.splice(newTargetChannelIndex, 0, targetChannel);\n\n        return newChannels;\n      });\n    },\n    [client],\n  );\n\n  const handleChannelDeleted = useCallback(\n    (p: HandleChannelDeletedParameters) => shared(p),\n    [],\n  );\n\n  const handleChannelHidden = useCallback(\n    (p: HandleChannelHiddenParameters) => shared(p),\n    [],\n  );\n\n  const handleChannelVisible = useCallback(\n    async ({\n      customHandler,\n      event,\n      filters,\n      setChannels,\n      sort,\n    }: HandleChannelVisibleParameters) => {\n      if (typeof customHandler === 'function') {\n        return customHandler(setChannels, event);\n      }\n\n      if (!event.channel_id && !event.channel_type) {\n        return;\n      }\n\n      const channel = await getChannel({\n        client,\n        id: event.channel_id,\n        type: event.channel_type,\n      });\n\n      const considerArchivedChannels = shouldConsiderArchivedChannels(filters);\n      if (isChannelArchived(channel) && considerArchivedChannels && !filters.archived) {\n        return;\n      }\n\n      setChannels((channels) =>\n        moveChannelUpwards({\n          channels,\n          channelToMove: channel,\n          sort,\n        }),\n      );\n    },\n    [client],\n  );\n\n  const handleChannelTruncated = useCallback(\n    ({ customHandler, event, setChannels }: HandleChannelTruncatedParameters) => {\n      if (typeof customHandler === 'function') {\n        return customHandler(setChannels, event);\n      }\n\n      // TODO: not sure whether this is needed\n      setChannels((channels) => [...channels]);\n      // if (forceUpdate) {\n      //   forceUpdate();\n      // }\n    },\n    [],\n  );\n\n  const handleChannelUpdated = useCallback(\n    ({ customHandler, event, setChannels }: HandleChannelUpdatedParameters) => {\n      if (typeof customHandler === 'function') {\n        return customHandler(setChannels, event);\n      }\n\n      setChannels((channels) => {\n        const channelIndex = channels.findIndex(\n          (channel) => channel.cid === event.channel?.cid,\n        );\n\n        if (channelIndex > -1 && event.channel) {\n          const newChannels = channels;\n          newChannels[channelIndex].data = {\n            ...event.channel,\n            hidden: event.channel?.hidden ?? newChannels[channelIndex].data?.hidden,\n            own_capabilities:\n              event.channel?.own_capabilities ??\n              newChannels[channelIndex].data?.own_capabilities,\n          };\n\n          return [...newChannels];\n        }\n\n        return channels;\n      });\n\n      // if (forceUpdate) {\n      //   forceUpdate();\n      // }\n    },\n    [],\n  );\n\n  const handleUserPresenceChanged = useCallback(\n    ({ event, setChannels }: HandleUserPresenceChangedParameters) => {\n      setChannels((channels) => {\n        const newChannels = channels.map((channel) => {\n          if (!event.user?.id || !channel.state.members[event.user.id]) {\n            return channel;\n          }\n\n          // FIXME: oh no...\n          const newChannel = channel;\n          newChannel.state.members[event.user.id].user = event.user;\n\n          return newChannel;\n        });\n\n        return newChannels;\n      });\n    },\n    [],\n  );\n\n  return useMemo(\n    () => ({\n      handleChannelDeleted,\n      handleChannelHidden,\n      handleChannelTruncated,\n      handleChannelUpdated,\n      handleChannelVisible,\n      handleMemberUpdated,\n      handleMessageNew,\n      handleNotificationAddedToChannel,\n      handleNotificationMessageNew,\n      handleNotificationRemovedFromChannel,\n      handleUserPresenceChanged,\n    }),\n    [\n      handleChannelDeleted,\n      handleChannelHidden,\n      handleChannelTruncated,\n      handleChannelUpdated,\n      handleChannelVisible,\n      handleMemberUpdated,\n      handleMessageNew,\n      handleNotificationAddedToChannel,\n      handleNotificationMessageNew,\n      handleNotificationRemovedFromChannel,\n      handleUserPresenceChanged,\n    ],\n  );\n};\n\ntype UseDefaultHandleChannelListShapeParameters = Required<\n  Pick<\n    ChannelListProps,\n    'allowNewMessagesFromUnfilteredChannels' | 'lockChannelOrder' | 'filters' | 'sort'\n  >\n> &\n  Pick<\n    ChannelListProps,\n    | 'onAddedToChannel'\n    | 'onChannelDeleted'\n    | 'onChannelHidden'\n    | 'onChannelTruncated'\n    | 'onChannelUpdated'\n    | 'onChannelVisible'\n    | 'onMessageNew'\n    | 'onMessageNewHandler'\n    | 'onRemovedFromChannel'\n  > & {\n    setChannels: SetChannels;\n    customHandleChannelListShape?: (data: {\n      defaults: ReturnType<typeof useChannelListShapeDefaults>;\n      event: Event;\n      setChannels: SetChannels;\n    }) => void;\n  };\n\nexport const usePrepareShapeHandlers = ({\n  allowNewMessagesFromUnfilteredChannels,\n  customHandleChannelListShape,\n  filters,\n  lockChannelOrder,\n  onAddedToChannel,\n  onChannelDeleted,\n  onChannelHidden,\n  onChannelTruncated,\n  onChannelUpdated,\n  onChannelVisible,\n  onMessageNew,\n  onMessageNewHandler,\n  onRemovedFromChannel,\n  setChannels,\n  sort,\n}: UseDefaultHandleChannelListShapeParameters) => {\n  const defaults = useChannelListShapeDefaults();\n\n  const defaultHandleChannelListShapeRef = useRef<(e: Event) => void>(undefined);\n\n  const customHandleChannelListShapeRef = useRef<(e: Event) => void>(undefined);\n\n  customHandleChannelListShapeRef.current = (event: Event) => {\n    customHandleChannelListShape?.({ defaults, event, setChannels });\n  };\n\n  defaultHandleChannelListShapeRef.current = (event: Event) => {\n    switch (event.type) {\n      case 'message.new':\n        defaults.handleMessageNew({\n          allowNewMessagesFromUnfilteredChannels,\n          customHandler: onMessageNewHandler,\n          event,\n          filters,\n          lockChannelOrder,\n          setChannels,\n          sort,\n        });\n        break;\n      case 'notification.message_new':\n        defaults.handleNotificationMessageNew({\n          allowNewMessagesFromUnfilteredChannels,\n          customHandler: onMessageNew,\n          event,\n          filters,\n          lockChannelOrder,\n          setChannels,\n          sort,\n        });\n        break;\n      case 'notification.added_to_channel':\n        defaults.handleNotificationAddedToChannel({\n          allowNewMessagesFromUnfilteredChannels,\n          customHandler: onAddedToChannel,\n          event,\n          lockChannelOrder,\n          setChannels,\n          sort,\n        });\n        break;\n      case 'notification.removed_from_channel':\n        defaults.handleNotificationRemovedFromChannel({\n          customHandler: onRemovedFromChannel,\n          event,\n          setChannels,\n        });\n        break;\n      case 'channel.deleted':\n        defaults.handleChannelDeleted({\n          customHandler: onChannelDeleted,\n          event,\n          setChannels,\n        });\n        break;\n      case 'channel.hidden':\n        defaults.handleChannelHidden({\n          customHandler: onChannelHidden,\n          event,\n          setChannels,\n        });\n        break;\n      case 'channel.visible':\n        defaults.handleChannelVisible({\n          customHandler: onChannelVisible,\n          event,\n          filters,\n          setChannels,\n          sort,\n        });\n        break;\n      case 'channel.truncated':\n        defaults.handleChannelTruncated({\n          customHandler: onChannelTruncated,\n          event,\n          setChannels,\n        });\n        break;\n      case 'channel.updated':\n        defaults.handleChannelUpdated({\n          customHandler: onChannelUpdated,\n          event,\n          setChannels,\n        });\n        break;\n      case 'user.presence.changed':\n        defaults.handleUserPresenceChanged({ event, setChannels });\n        break;\n      case 'member.updated':\n        defaults.handleMemberUpdated({\n          event,\n          filters,\n          lockChannelOrder,\n          setChannels,\n          sort,\n        });\n        break;\n      default:\n        break;\n    }\n  };\n\n  const defaultFn = useCallback((e: Event) => {\n    defaultHandleChannelListShapeRef.current?.(e);\n  }, []);\n\n  const customFn = useMemo(() => {\n    if (!customHandleChannelListShape) return null;\n    return (e: Event) => {\n      customHandleChannelListShapeRef.current?.(e);\n    };\n  }, [customHandleChannelListShape]);\n\n  return {\n    customHandler: customFn,\n    defaultHandler: defaultFn,\n  };\n};\n\nexport const useChannelListShape = (handler: (e: Event) => void) => {\n  const { client } = useChatContext();\n\n  useEffect(() => {\n    const subscription = client.on('all', handler);\n\n    return subscription.unsubscribe;\n  }, [client, handler]);\n};\n", "import uniqBy from 'lodash.uniqby';\nimport type { Channel, ChannelSort, ChannelSortBase } from 'stream-chat';\n\nimport type { ChannelListProps } from './ChannelList';\n\ntype MoveChannelUpParams = {\n  channels: Array<Channel>;\n  cid: string;\n  activeChannel?: Channel;\n};\n\n/**\n * @deprecated\n */\nexport const moveChannelUp = ({ activeChannel, channels, cid }: MoveChannelUpParams) => {\n  // get index of channel to move up\n  const channelIndex = channels.findIndex((channel) => channel.cid === cid);\n\n  if (!activeChannel && channelIndex <= 0) return channels;\n\n  // get channel to move up\n  const channel = activeChannel || channels[channelIndex];\n\n  return uniqBy([channel, ...channels], 'cid');\n};\n\n/**\n * Expects channel array sorted by `{ pinned_at: -1 }`.\n *\n * TODO: add support for the `{ pinned_at: 1 }`\n */\nexport function findLastPinnedChannelIndex({ channels }: { channels: Channel[] }) {\n  let lastPinnedChannelIndex: number | null = null;\n\n  for (const channel of channels) {\n    if (!isChannelPinned(channel)) break;\n\n    if (typeof lastPinnedChannelIndex === 'number') {\n      lastPinnedChannelIndex++;\n    } else {\n      lastPinnedChannelIndex = 0;\n    }\n  }\n\n  return lastPinnedChannelIndex;\n}\n\ntype MoveChannelUpwardsParams = {\n  channels: Array<Channel>;\n  channelToMove: Channel;\n  sort: ChannelSort;\n  /**\n   * If the index of the channel within `channels` list which is being moved upwards\n   * (`channelToMove`) is known, you can supply it to skip extra calculation.\n   */\n  channelToMoveIndexWithinChannels?: number;\n};\n\nexport const moveChannelUpwards = ({\n  channels,\n  channelToMove,\n  channelToMoveIndexWithinChannels,\n  sort,\n}: MoveChannelUpwardsParams) => {\n  // get index of channel to move up\n  const targetChannelIndex =\n    channelToMoveIndexWithinChannels ??\n    channels.findIndex((channel) => channel.cid === channelToMove.cid);\n\n  const targetChannelExistsWithinList = targetChannelIndex >= 0;\n  const targetChannelAlreadyAtTheTop = targetChannelIndex === 0;\n\n  // pinned channels should not move within the list based on recent activity, channels which\n  // receive messages and are not pinned should move upwards but only under the last pinned channel\n  // in the list\n  const considerPinnedChannels = shouldConsiderPinnedChannels(sort);\n  const isTargetChannelPinned = isChannelPinned(channelToMove);\n\n  if (targetChannelAlreadyAtTheTop || (considerPinnedChannels && isTargetChannelPinned)) {\n    return channels;\n  }\n\n  const newChannels = [...channels];\n\n  // target channel index is known, remove it from the list\n  if (targetChannelExistsWithinList) {\n    newChannels.splice(targetChannelIndex, 1);\n  }\n\n  // as position of pinned channels has to stay unchanged, we need to\n  // find last pinned channel in the list to move the target channel after\n  let lastPinnedChannelIndex: number | null = null;\n  if (considerPinnedChannels) {\n    lastPinnedChannelIndex = findLastPinnedChannelIndex({ channels: newChannels });\n  }\n\n  // re-insert it at the new place (to specific index if pinned channels are considered)\n  newChannels.splice(\n    typeof lastPinnedChannelIndex === 'number' ? lastPinnedChannelIndex + 1 : 0,\n    0,\n    channelToMove,\n  );\n\n  return newChannels;\n};\n\n/**\n * Returns `true` only if object with `pinned_at` property is first within the `sort` array\n * or if `pinned_at` key of the `sort` object gets picked first when using `for...in` looping mechanism\n * and value of the `pinned_at` is either `1` or `-1`.\n */\nexport const shouldConsiderPinnedChannels = (sort: ChannelListProps['sort']) => {\n  const value = extractSortValue({ atIndex: 0, sort, targetKey: 'pinned_at' });\n\n  if (typeof value !== 'number') return false;\n\n  return Math.abs(value) === 1;\n};\n\nexport const extractSortValue = ({\n  atIndex,\n  sort,\n  targetKey,\n}: {\n  atIndex: number;\n  targetKey: keyof ChannelSortBase;\n  sort?: ChannelListProps['sort'];\n}) => {\n  if (!sort) return null;\n  let option: null | ChannelSortBase = null;\n\n  if (Array.isArray(sort)) {\n    option = sort[atIndex] ?? null;\n  } else {\n    let index = 0;\n    for (const key in sort) {\n      if (index !== atIndex) {\n        index++;\n        continue;\n      }\n\n      if (key !== targetKey) {\n        return null;\n      }\n\n      option = sort;\n\n      break;\n    }\n  }\n\n  return option?.[targetKey] ?? null;\n};\n\n/**\n * Returns `true` only if `archived` property is of type `boolean` within `filters` object.\n */\nexport const shouldConsiderArchivedChannels = (filters: ChannelListProps['filters']) => {\n  if (!filters) return false;\n\n  return typeof filters.archived === 'boolean';\n};\n\n/**\n * Returns `true` only if `pinned_at` property is of type `string` within `membership` object.\n */\nexport const isChannelPinned = (channel: Channel) => {\n  if (!channel) return false;\n\n  const membership = channel.state.membership;\n\n  return typeof membership.pinned_at === 'string';\n};\n\n/**\n * Returns `true` only if `archived_at` property is of type `string` within `membership` object.\n */\nexport const isChannelArchived = (channel: Channel) => {\n  if (!channel) return false;\n\n  const membership = channel.state.membership;\n\n  return typeof membership.archived_at === 'string';\n};\n", "import React from 'react';\nimport type { PropsWithChildren } from 'react';\nimport type { APIErrorResponse, Channel, ErrorFromResponse } from 'stream-chat';\n\nimport { LoadingChannels } from '../Loading/LoadingChannels';\nimport { NullComponent } from '../UtilityComponents';\nimport { useTranslationContext } from '../../context';\nimport type { LoadingErrorIndicatorProps } from '../Loading';\n\nexport type ChannelListMessengerProps = {\n  /** Whether the channel query request returned an errored response */\n  error: ErrorFromResponse<APIErrorResponse> | null;\n  /** The channels currently loaded in the list, only defined if `sendChannelsToList` on `ChannelList` is true */\n  loadedChannels?: Channel[];\n  /** Whether the channels are currently loading */\n  loading?: boolean;\n  /** Custom UI component to display the loading error indicator, defaults to component that renders null */\n  LoadingErrorIndicator?: React.ComponentType<LoadingErrorIndicatorProps>;\n  /** Custom UI component to display a loading indicator, defaults to and accepts same props as: [LoadingChannels](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Loading/LoadingChannels.tsx) */\n  LoadingIndicator?: React.ComponentType;\n  /** Local state hook that resets the currently loaded channels */\n  setChannels?: React.Dispatch<React.SetStateAction<Channel[]>>;\n};\n\n/**\n * A preview list of channels, allowing you to select the channel you want to open\n */\nexport const ChannelListMessenger = (\n  props: PropsWithChildren<ChannelListMessengerProps>,\n) => {\n  const {\n    children,\n    error = null,\n    loading,\n    LoadingErrorIndicator = NullComponent,\n    LoadingIndicator = LoadingChannels,\n  } = props;\n  const { t } = useTranslationContext('ChannelListMessenger');\n\n  if (error) {\n    return <LoadingErrorIndicator error={error} />;\n  }\n\n  if (loading) {\n    return <LoadingIndicator />;\n  }\n\n  return (\n    <div className='str-chat__channel-list-messenger str-chat__channel-list-messenger-react'>\n      <div\n        aria-label={t('aria/Channel list')}\n        className='str-chat__channel-list-messenger__main str-chat__channel-list-messenger-react__main'\n        role='listbox'\n      >\n        {children}\n      </div>\n    </div>\n  );\n};\n", "import React from 'react';\n\nconst LoadingItems = () => (\n  <div className='str-chat__loading-channels-item str-chat__channel-preview-loading'>\n    <div className='str-chat__loading-channels-avatar' />\n    <div className='str-chat__loading-channels-meta str-chat__channel-preview-end-loading'>\n      <div className='str-chat__loading-channels-username' />\n      <div className='str-chat__loading-channels-status' />\n    </div>\n  </div>\n);\n\nconst UnMemoizedLoadingChannels = () => (\n  <div className='str-chat__loading-channels'>\n    <LoadingItems />\n    <LoadingItems />\n    <LoadingItems />\n  </div>\n);\n\n/**\n * Loading indicator for the ChannelList\n */\nexport const LoadingChannels = React.memo(UnMemoizedLoadingChannels);\n", "export const NullComponent = () => null;\n", "import { Component } from 'react';\nimport type { PropsWithChildren, ReactNode } from 'react';\n\ntype ErrorBoundaryProps = PropsWithChildren<{ fallback?: ReactNode }>;\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, { hasError: boolean }> {\n  constructor(props: ErrorBoundaryProps) {\n    super(props);\n    this.state = { hasError: false };\n  }\n\n  static getDerivedStateFromError() {\n    return { hasError: true };\n  }\n\n  componentDidCatch(error: unknown, information: unknown) {\n    console.error(error, information);\n  }\n\n  render() {\n    if (this.state.hasError) {\n      return this.props.fallback;\n    }\n\n    return this.props.children;\n  }\n}\n", "import clsx from 'clsx';\nimport React from 'react';\n\nimport type { ChannelSearchControllerParams } from './hooks/useChannelSearch';\nimport { useChannelSearch } from './hooks/useChannelSearch';\n\nimport type { AdditionalSearchBarProps, SearchBarProps } from './SearchBar';\nimport { SearchBar as DefaultSearchBar } from './SearchBar';\nimport type { AdditionalSearchInputProps, SearchInputProps } from './SearchInput';\nimport { SearchInput as DefaultSearchInput } from './SearchInput';\nimport type { AdditionalSearchResultsProps } from './SearchResults';\nimport { SearchResults } from './SearchResults';\n\nexport type AdditionalChannelSearchProps = {\n  /** Custom UI component to display the search bar with text input */\n  SearchBar?: React.ComponentType<SearchBarProps>;\n  /** Custom UI component to display the search text input */\n  SearchInput?: React.ComponentType<SearchInputProps>;\n};\n\nexport type ChannelSearchProps = AdditionalSearchBarProps &\n  AdditionalSearchInputProps &\n  AdditionalSearchResultsProps &\n  AdditionalChannelSearchProps &\n  ChannelSearchControllerParams;\n\nconst UnMemoizedChannelSearch = (props: ChannelSearchProps) => {\n  const {\n    AppMenu,\n    ClearInputIcon,\n    ExitSearchIcon,\n    MenuIcon,\n    placeholder,\n    popupResults = false,\n    SearchBar = DefaultSearchBar,\n    SearchEmpty,\n    SearchInput = DefaultSearchInput,\n    SearchInputIcon,\n    SearchLoading,\n    SearchResultItem,\n    SearchResultsHeader,\n    SearchResultsList,\n    ...channelSearchParams\n  } = props;\n\n  const {\n    activateSearch,\n    clearState,\n    exitSearch,\n    inputIsFocused,\n    inputRef,\n    onSearch,\n    query,\n    results,\n    searchBarRef,\n    searching,\n    selectResult,\n  } = useChannelSearch(channelSearchParams);\n\n  return (\n    <div\n      className={clsx(\n        'str-chat__channel-search',\n        popupResults\n          ? 'str-chat__channel-search--popup'\n          : 'str-chat__channel-search--inline',\n        {\n          'str-chat__channel-search--with-results': results.length > 0,\n        },\n      )}\n      data-testid='channel-search'\n    >\n      <SearchBar\n        activateSearch={activateSearch}\n        AppMenu={AppMenu}\n        ClearInputIcon={ClearInputIcon}\n        clearState={clearState}\n        disabled={channelSearchParams.disabled}\n        exitSearch={exitSearch}\n        ExitSearchIcon={ExitSearchIcon}\n        inputIsFocused={inputIsFocused}\n        inputRef={inputRef}\n        MenuIcon={MenuIcon}\n        onSearch={onSearch}\n        placeholder={placeholder}\n        query={query}\n        searchBarRef={searchBarRef}\n        SearchInput={SearchInput}\n        SearchInputIcon={SearchInputIcon}\n      />\n\n      {query && (\n        <SearchResults\n          popupResults={popupResults}\n          results={results}\n          SearchEmpty={SearchEmpty}\n          searching={searching}\n          SearchLoading={SearchLoading}\n          SearchResultItem={SearchResultItem}\n          SearchResultsHeader={SearchResultsHeader}\n          SearchResultsList={SearchResultsList}\n          selectResult={selectResult}\n        />\n      )}\n    </div>\n  );\n};\n\n/**\n * The ChannelSearch component makes a query users call and displays the results in a list.\n * Clicking on a list item will navigate you into a channel with the selected user. It can be used\n * on its own or added to the ChannelList component by setting the `showChannelSearch` prop to true.\n */\nexport const ChannelSearch = React.memo(\n  UnMemoizedChannelSearch,\n) as typeof UnMemoizedChannelSearch;\n", "import type React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport debounce from 'lodash.debounce';\nimport uniqBy from 'lodash.uniqby';\n\nimport type { ChannelOrUserResponse } from '../utils';\nimport { isChannel } from '../utils';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type {\n  Channel,\n  ChannelFilters,\n  ChannelOptions,\n  ChannelSort,\n  UserFilters,\n  UserOptions,\n  UsersAPIResponse,\n  UserSort,\n} from 'stream-chat';\nimport type { SearchBarController } from '../SearchBar';\nimport type { SearchInputController } from '../SearchInput';\nimport type { SearchResultsController } from '../SearchResults';\n\nexport type ChannelSearchFunctionParams = {\n  setQuery: React.Dispatch<React.SetStateAction<string>>;\n  setResults: React.Dispatch<React.SetStateAction<ChannelOrUserResponse[]>>;\n  setSearching: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport type SearchController = SearchInputController &\n  SearchBarController &\n  SearchResultsController;\n\nexport type SearchQueryParams = {\n  channelFilters?: {\n    filters?: ChannelFilters;\n    options?: ChannelOptions;\n    sort?: ChannelSort;\n  };\n  userFilters?: {\n    filters?: UserFilters | ((query: string) => UserFilters);\n    options?: UserOptions;\n    sort?: UserSort;\n  };\n};\n\nexport type ChannelSearchParams = {\n  /** The type of channel to create on user result select, defaults to `messaging` */\n  channelType?: string;\n  /** Clear search state / results on every click outside the search input, defaults to true */\n  clearSearchOnClickOutside?: boolean;\n  /** Disables execution of the search queries, defaults to false */\n  disabled?: boolean;\n  /** Callback invoked with every search input change handler */\n  onSearch?: SearchInputController['onSearch'];\n  /** Callback invoked when the search UI is deactivated */\n  onSearchExit?: () => void;\n  /** Custom handler function to run on search result item selection */\n  onSelectResult?: (\n    params: ChannelSearchFunctionParams,\n    result: ChannelOrUserResponse,\n  ) => Promise<void> | void;\n  /** The number of milliseconds to debounce the search query. The default interval is 200ms. */\n  searchDebounceIntervalMs?: number;\n  /** Boolean to search for channels in the server query, default is false and just searches for users */\n  searchForChannels?: boolean;\n  /** Boolean to search for users in the server query, default is true and just searches for users */\n  searchForUsers?: boolean;\n  /** Custom search function to override the default implementation */\n  searchFunction?: (\n    params: ChannelSearchFunctionParams,\n    event: React.BaseSyntheticEvent,\n  ) => Promise<void> | void;\n  /** Object containing filters/sort/options overrides for user / channel search */\n  searchQueryParams?: SearchQueryParams;\n};\n\nexport type ChannelSearchControllerParams = ChannelSearchParams & {\n  /** Set the array of channels displayed in the ChannelList */\n  setChannels?: React.Dispatch<React.SetStateAction<Array<Channel>>>;\n};\n\nexport const useChannelSearch = ({\n  channelType = 'messaging',\n  clearSearchOnClickOutside = true,\n  disabled = false,\n  onSearch: onSearchCallback,\n  onSearchExit,\n  onSelectResult,\n  searchDebounceIntervalMs = 300,\n  searchForChannels = false,\n  searchForUsers = true,\n  searchFunction,\n  searchQueryParams,\n  setChannels,\n}: ChannelSearchControllerParams): SearchController => {\n  const { client, setActiveChannel } = useChatContext('useChannelSearch');\n\n  const [inputIsFocused, setInputIsFocused] = useState(false);\n  const [query, setQuery] = useState('');\n  const [results, setResults] = useState<Array<ChannelOrUserResponse>>([]);\n  const [searching, setSearching] = useState(false);\n\n  const searchQueryPromiseInProgress = useRef<boolean>(false);\n  const shouldIgnoreQueryResults = useRef(false);\n\n  const inputRef = useRef<HTMLInputElement | null>(null);\n  const searchBarRef = useRef<HTMLDivElement | null>(null);\n\n  const clearState = useCallback(() => {\n    setQuery('');\n    setResults([]);\n    setSearching(false);\n\n    shouldIgnoreQueryResults.current = searchQueryPromiseInProgress.current;\n  }, []);\n\n  const activateSearch = useCallback(() => {\n    setInputIsFocused(true);\n  }, []);\n\n  const exitSearch = useCallback(() => {\n    setInputIsFocused(false);\n    inputRef.current?.blur();\n    clearState();\n    onSearchExit?.();\n  }, [clearState, onSearchExit]);\n\n  useEffect(() => {\n    if (disabled) return;\n\n    const clickListener = (event: MouseEvent) => {\n      if (!(event.target instanceof HTMLElement)) return;\n      const isInputClick = searchBarRef.current?.contains(event.target);\n\n      if (isInputClick) return;\n\n      if ((inputIsFocused && !query) || clearSearchOnClickOutside) {\n        exitSearch();\n      }\n    };\n\n    document.addEventListener('click', clickListener);\n    return () => document.removeEventListener('click', clickListener);\n  }, [disabled, inputIsFocused, query, exitSearch, clearSearchOnClickOutside]);\n\n  useEffect(() => {\n    if (!inputRef.current || disabled) return;\n\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (event.key === 'Escape') return exitSearch();\n    };\n    inputRef.current.addEventListener('keydown', handleKeyDown);\n\n    return () => {\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n      inputRef.current?.removeEventListener('keydown', handleKeyDown);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [disabled]);\n\n  const selectResult = useCallback(\n    async (result: ChannelOrUserResponse) => {\n      if (!client.userID) return;\n      if (onSelectResult) {\n        await onSelectResult(\n          {\n            setQuery,\n            setResults,\n            setSearching,\n          },\n          result,\n        );\n        return;\n      }\n      let selectedChannel: Channel;\n      if (isChannel(result)) {\n        setActiveChannel(result);\n        selectedChannel = result;\n      } else {\n        const newChannel = client.channel(channelType, {\n          members: [client.userID, result.id],\n        });\n        await newChannel.watch();\n\n        setActiveChannel(newChannel);\n        selectedChannel = newChannel;\n      }\n      setChannels?.((channels) => uniqBy([selectedChannel, ...channels], 'cid'));\n      if (clearSearchOnClickOutside) {\n        exitSearch();\n      }\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      clearSearchOnClickOutside,\n      client,\n      exitSearch,\n      onSelectResult,\n      setActiveChannel,\n      setChannels,\n    ],\n  );\n\n  const getChannels = useCallback(\n    async (text: string) => {\n      if (!searchForChannels && !searchForUsers) return;\n      let results: ChannelOrUserResponse[] = [];\n      const promises: Array<Promise<Channel[]> | Promise<UsersAPIResponse>> = [];\n      try {\n        if (searchForChannels) {\n          promises.push(\n            client.queryChannels(\n              {\n                members: { $in: [client.userID as string] },\n                name: { $autocomplete: text },\n                ...searchQueryParams?.channelFilters?.filters,\n              },\n              searchQueryParams?.channelFilters?.sort || {},\n              { limit: 5, ...searchQueryParams?.channelFilters?.options },\n            ),\n          );\n        }\n\n        if (searchForUsers) {\n          promises.push(\n            client.queryUsers(\n              {\n                $or: [{ id: { $autocomplete: text } }, { name: { $autocomplete: text } }],\n                ...searchQueryParams?.userFilters?.filters,\n              },\n              { id: 1, ...searchQueryParams?.userFilters?.sort },\n              { limit: 8, ...searchQueryParams?.userFilters?.options },\n            ),\n          );\n        }\n\n        if (promises.length) {\n          searchQueryPromiseInProgress.current = true;\n\n          const resolved = await Promise.all(promises);\n\n          if (searchForChannels && searchForUsers) {\n            const [channels, { users }] = resolved as [Channel[], UsersAPIResponse];\n            results = [...channels, ...users.filter((u) => u.id !== client.user?.id)];\n          } else if (searchForChannels) {\n            const [channels] = resolved as [Channel[]];\n            results = [...channels];\n          } else if (searchForUsers) {\n            const [{ users }] = resolved as [UsersAPIResponse];\n            results = [...users.filter((u) => u.id !== client.user?.id)];\n          }\n        }\n      } catch (error) {\n        console.error(error);\n      }\n      setSearching(false);\n\n      if (!shouldIgnoreQueryResults.current) {\n        setResults(results);\n      } else {\n        shouldIgnoreQueryResults.current = false;\n      }\n\n      searchQueryPromiseInProgress.current = false;\n    },\n    [client, searchForChannels, searchForUsers, searchQueryParams],\n  );\n\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  const scheduleGetChannels = useCallback(\n    debounce(getChannels, searchDebounceIntervalMs),\n    [getChannels, searchDebounceIntervalMs],\n  );\n\n  const onSearch = useCallback(\n    (event: React.ChangeEvent<HTMLInputElement>) => {\n      event.preventDefault();\n      if (disabled) return;\n\n      if (searchFunction) {\n        searchFunction(\n          {\n            setQuery,\n            setResults,\n            setSearching,\n          },\n          event,\n        );\n      } else if (!searchForChannels && !searchForUsers) {\n        return;\n      } else if (event.target.value) {\n        setSearching(true);\n        setQuery(event.target.value);\n        scheduleGetChannels(event.target.value);\n      } else if (!event.target.value) {\n        clearState();\n        scheduleGetChannels.cancel();\n      }\n      onSearchCallback?.(event);\n    },\n    [\n      clearState,\n      disabled,\n      scheduleGetChannels,\n      onSearchCallback,\n      searchForChannels,\n      searchForUsers,\n      searchFunction,\n    ],\n  );\n\n  return {\n    activateSearch,\n    clearState,\n    exitSearch,\n    inputIsFocused,\n    inputRef,\n    onSearch,\n    query,\n    results,\n    searchBarRef,\n    searching,\n    selectResult,\n  };\n};\n", "import type { Channel, UserResponse } from 'stream-chat';\n\nexport type ChannelOrUserResponse = Channel | UserResponse;\n\nexport const isChannel = (output: ChannelOrUserResponse): output is Channel =>\n  (output as Channel).cid != null;\n", "import type { MouseEventHandler, PropsWithChildren } from 'react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\n\nimport {\n  MenuIcon as DefaultMenuIcon,\n  SearchIcon as DefaultSearchInputIcon,\n  ReturnIcon,\n  XIcon,\n} from './icons';\nimport type { SearchInputProps } from './SearchInput';\nimport { SearchInput as DefaultSearchInput } from './SearchInput';\n\nexport type AppMenuProps = {\n  close?: () => void;\n};\n\ntype SearchBarButtonProps = {\n  className?: string;\n  onClick?: MouseEventHandler<HTMLButtonElement>;\n};\n\nconst SearchBarButton = ({\n  children,\n  className,\n  onClick,\n}: PropsWithChildren<SearchBarButtonProps>) => (\n  <button\n    className={clsx('str-chat__channel-search-bar-button', className)}\n    data-testid='search-bar-button'\n    onClick={onClick}\n  >\n    {children}\n  </button>\n);\n\nexport type SearchBarController = {\n  /** Called on search input focus */\n  activateSearch: () => void;\n  /** Clears the search state, removes focus from the search input */\n  exitSearch: () => void;\n  /** Flag determining whether the search input is focused */\n  inputIsFocused: boolean;\n  /** Ref object for the input wrapper in the SearchBar */\n  searchBarRef: React.RefObject<HTMLDivElement | null>;\n};\n\nexport type AdditionalSearchBarProps = {\n  /** Application menu to be displayed  when clicked on MenuIcon */\n  AppMenu?: React.ComponentType<AppMenuProps>;\n  /** Custom icon component used to clear the input value on click. Displayed within the search input wrapper. */\n  ClearInputIcon?: React.ComponentType;\n  /** Custom icon component used to terminate the search UI session on click. */\n  ExitSearchIcon?: React.ComponentType;\n  /** Custom icon component used to invoke context menu. */\n  MenuIcon?: React.ComponentType;\n  /** Custom UI component to display the search text input */\n  SearchInput?: React.ComponentType<SearchInputProps>;\n  /** Custom icon used to indicate search input. */\n  SearchInputIcon?: React.ComponentType;\n};\n\nexport type SearchBarProps = AdditionalSearchBarProps &\n  SearchBarController &\n  SearchInputProps;\n\n// todo: add context menu control logic\nexport const SearchBar = (props: SearchBarProps) => {\n  const {\n    activateSearch,\n    AppMenu,\n    ClearInputIcon = XIcon,\n    exitSearch,\n    ExitSearchIcon = ReturnIcon,\n    inputIsFocused,\n    MenuIcon = DefaultMenuIcon,\n    searchBarRef,\n    SearchInput = DefaultSearchInput,\n    SearchInputIcon = DefaultSearchInputIcon,\n    ...inputProps\n  } = props;\n\n  const [menuIsOpen, setMenuIsOpen] = useState(false);\n  const appMenuRef = useRef<HTMLDivElement | null>(null);\n\n  useEffect(() => {\n    if (!appMenuRef.current) return;\n\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (menuIsOpen && event.key === 'Escape') {\n        setMenuIsOpen(false);\n      }\n    };\n\n    const clickListener = (e: MouseEvent) => {\n      if (\n        !(e.target instanceof HTMLElement) ||\n        !menuIsOpen ||\n        appMenuRef.current?.contains(e.target)\n      )\n        return;\n      setMenuIsOpen(false);\n    };\n\n    document.addEventListener('keydown', handleKeyDown);\n    document.addEventListener('click', clickListener);\n    return () => {\n      document.removeEventListener('keydown', handleKeyDown);\n      document.removeEventListener('click', clickListener);\n    };\n  }, [menuIsOpen]);\n\n  useEffect(() => {\n    if (!props.inputRef.current) return;\n    const input = props.inputRef.current;\n    const handleFocus = () => {\n      activateSearch();\n    };\n\n    const handleBlur = (e: Event) => {\n      e.stopPropagation(); // handle blur/focus state with React state\n    };\n\n    input.addEventListener('focus', handleFocus);\n    input.addEventListener('blur', handleBlur);\n    return () => {\n      input.removeEventListener('focus', handleFocus);\n      input.removeEventListener('blur', handleBlur);\n    };\n  }, [activateSearch, props.inputRef]);\n\n  const handleClearClick = useCallback(() => {\n    exitSearch();\n    inputProps.inputRef.current?.focus();\n  }, [exitSearch, inputProps.inputRef]);\n\n  const closeAppMenu = useCallback(() => setMenuIsOpen(false), []);\n\n  return (\n    <div\n      className='str-chat__channel-search-bar'\n      data-testid='search-bar'\n      ref={searchBarRef}\n    >\n      {inputIsFocused ? (\n        <SearchBarButton\n          className='str-chat__channel-search-bar-button--exit-search'\n          onClick={exitSearch}\n        >\n          <ExitSearchIcon />\n        </SearchBarButton>\n      ) : AppMenu ? (\n        <SearchBarButton\n          className='str-chat__channel-search-bar-button--menu'\n          onClick={() => setMenuIsOpen((prev) => !prev)}\n        >\n          <MenuIcon />\n        </SearchBarButton>\n      ) : null}\n\n      <div\n        className={clsx(\n          'str-chat__channel-search-input--wrapper',\n          inputProps.query && 'str-chat__channel-search-input--wrapper-active',\n        )}\n      >\n        <div className='str-chat__channel-search-input--icon'>\n          <SearchInputIcon />\n        </div>\n        <SearchInput {...inputProps} />\n        <button\n          className='str-chat__channel-search-input--clear-button'\n          data-testid='clear-input-button'\n          disabled={!inputProps.query}\n          onClick={handleClearClick}\n        >\n          <ClearInputIcon />\n        </button>\n      </div>\n      {menuIsOpen && AppMenu && (\n        <div ref={appMenuRef}>\n          <AppMenu close={closeAppMenu} />\n        </div>\n      )}\n    </div>\n  );\n};\n", "import React from 'react';\nimport type { IconProps } from '../../types/types';\n\nexport const MenuIcon = () => (\n  <svg\n    data-testid='menu-icon'\n    fill='none'\n    height='24'\n    viewBox='0 0 24 24'\n    width='24'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      clipRule='evenodd'\n      d='M3 8V6H21V8H3ZM3 13H21V11H3V13ZM3 18H21V16H3V18Z'\n      fill='black'\n      fillRule='evenodd'\n    />\n  </svg>\n);\n\nexport const ReturnIcon = () => (\n  <svg\n    data-testid='return-icon'\n    fill='none'\n    height='20'\n    viewBox='0 0 22 22'\n    width='20'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      d='M21.6668 9.66666V12.3333H5.6529L12.9932 19.6736L11.1076 21.5592L0.54834 11L11.1076 0.440765L12.9932 2.32638L5.6529 9.66666H21.6668Z'\n      fill='#080707'\n    />\n  </svg>\n);\n\nexport const XIcon = () => (\n  <svg\n    fill='none'\n    height='14'\n    viewBox='0 0 14 14'\n    width='14'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      d='M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z'\n      fill='#747881'\n    />\n  </svg>\n);\n\nexport const SearchIcon = ({ className }: IconProps) => (\n  <svg\n    className={className}\n    fill='none'\n    height='18'\n    viewBox='0 0 18 18'\n    width='18'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z'\n      fill='#747881'\n    />\n  </svg>\n);\n", "import React from 'react';\n\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nexport type SearchInputController = {\n  /** Clears the channel search state */\n  clearState: () => void;\n  inputRef: React.RefObject<HTMLInputElement | null>;\n  /** Search input change handler */\n  onSearch: React.ChangeEventHandler<HTMLInputElement>;\n  /** Current search string */\n  query: string;\n};\n\nexport type AdditionalSearchInputProps = {\n  /** Sets the input element into disabled state */\n  disabled?: boolean;\n  /** Custom placeholder text to be displayed in the search input */\n  placeholder?: string;\n};\n\nexport type SearchInputProps = AdditionalSearchInputProps & SearchInputController;\n\nexport const SearchInput = (props: SearchInputProps) => {\n  const { disabled, inputRef, onSearch, placeholder, query } = props;\n\n  const { t } = useTranslationContext('SearchInput');\n\n  return (\n    <input\n      className='str-chat__channel-search-input'\n      data-testid='search-input'\n      disabled={disabled}\n      onChange={onSearch}\n      placeholder={placeholder ?? t('Search')}\n      ref={inputRef}\n      type='text'\n      value={query}\n    />\n  );\n};\n", "import type { PropsWithChildren } from 'react';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport clsx from 'clsx';\n\nimport { SearchIcon } from './icons';\nimport { ChannelPreview } from '../ChannelPreview';\nimport type { ChannelOrUserResponse } from './utils';\nimport { isChannel } from './utils';\nimport { Avatar } from '../Avatar';\n\nimport { useTranslationContext } from '../../context';\n\nconst DefaultSearchEmpty = () => {\n  const { t } = useTranslationContext('SearchResults');\n  return (\n    <div aria-live='polite' className='str-chat__channel-search-container-empty'>\n      <SearchIcon />\n      {t('No results found')}\n    </div>\n  );\n};\n\nexport type SearchResultsHeaderProps = Pick<SearchResultsProps, 'results'>;\n\nconst DefaultSearchResultsHeader = ({ results }: SearchResultsHeaderProps) => {\n  const { t } = useTranslationContext('SearchResultsHeader');\n  return (\n    <div\n      className='str-chat__channel-search-results-header'\n      data-testid='channel-search-results-header'\n    >\n      {t('searchResultsCount', {\n        count: results.length,\n      })}\n    </div>\n  );\n};\n\nexport type SearchResultsListProps = Required<\n  Pick<SearchResultsProps, 'results' | 'SearchResultItem' | 'selectResult'>\n> & {\n  focusedUser?: number;\n};\n\nconst DefaultSearchResultsList = (props: SearchResultsListProps) => {\n  const { focusedUser, results, SearchResultItem, selectResult } = props;\n\n  return (\n    <>\n      {results.map((result, index) => (\n        <SearchResultItem\n          focusedUser={focusedUser}\n          index={index}\n          key={index}\n          result={result}\n          selectResult={selectResult}\n        />\n      ))}\n    </>\n  );\n};\n\n// fixme: index and focusedUser should be changed for className with default value \"str-chat__channel-search-result--focused\"\nexport type SearchResultItemProps = Pick<SearchResultsProps, 'selectResult'> & {\n  index: number;\n  result: ChannelOrUserResponse;\n  focusedUser?: number;\n};\n\nconst DefaultSearchResultItem = (props: SearchResultItemProps) => {\n  const { focusedUser, index, result, selectResult } = props;\n  const focused = focusedUser === index;\n\n  const className = clsx(\n    'str-chat__channel-search-result',\n    focused && 'str-chat__channel-search-result--focused',\n  );\n\n  if (isChannel(result)) {\n    const channel = result;\n\n    return (\n      <ChannelPreview\n        channel={channel}\n        className={className}\n        onSelect={() => selectResult(channel)}\n      />\n    );\n  } else {\n    return (\n      <button\n        aria-label={`Select User Channel: ${result.name || ''}`}\n        className={className}\n        data-testid='channel-search-result-user'\n        onClick={() => selectResult(result)}\n        role='option'\n      >\n        <Avatar\n          className='str-chat__avatar--channel-preview'\n          image={result.image}\n          name={result.name || result.id}\n          user={result}\n        />\n        <div className='str-chat__channel-search-result--display-name'>\n          {result.name || result.id}\n        </div>\n      </button>\n    );\n  }\n};\n\nconst ResultsContainer = ({\n  children,\n  popupResults,\n}: PropsWithChildren<{ popupResults?: boolean }>) => {\n  const { t } = useTranslationContext('ResultsContainer');\n\n  return (\n    <div\n      aria-label={t('aria/Channel search results')}\n      className={clsx(\n        `str-chat__channel-search-result-list`,\n        popupResults ? 'popup' : 'inline',\n      )}\n    >\n      {children}\n    </div>\n  );\n};\n\nexport type SearchResultsController = {\n  results: Array<ChannelOrUserResponse>;\n  searching: boolean;\n  selectResult: (result: ChannelOrUserResponse) => Promise<void> | void;\n};\n\nexport type AdditionalSearchResultsProps = {\n  /** Display search results as an absolutely positioned popup, defaults to false and shows inline */\n  popupResults?: boolean;\n  /** Custom UI component to display empty search results */\n  SearchEmpty?: React.ComponentType;\n  /** Custom UI component to display the search loading state */\n  SearchLoading?: React.ComponentType;\n  /** Custom UI component to display a search result list item, defaults to and accepts the same props as: [DefaultSearchResultItem](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelSearch/SearchResults.tsx) */\n  SearchResultItem?: React.ComponentType<SearchResultItemProps>;\n  /** Custom UI component to display the search results header */\n  SearchResultsHeader?: React.ComponentType;\n  /** Custom UI component to display all the search results, defaults to and accepts the same props as: [DefaultSearchResultsList](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelSearch/SearchResults.tsx)  */\n  SearchResultsList?: React.ComponentType<SearchResultsListProps>;\n};\n\nexport type SearchResultsProps = AdditionalSearchResultsProps & SearchResultsController;\n\nexport const SearchResults = (props: SearchResultsProps) => {\n  const {\n    popupResults,\n    results,\n    SearchEmpty = DefaultSearchEmpty,\n    searching,\n    SearchLoading,\n    SearchResultItem = DefaultSearchResultItem,\n    SearchResultsHeader = DefaultSearchResultsHeader,\n    SearchResultsList = DefaultSearchResultsList,\n    selectResult,\n  } = props;\n\n  const { t } = useTranslationContext('SearchResults');\n  const [focusedResult, setFocusedResult] = useState<number>();\n\n  const handleKeyDown = useCallback(\n    (event: KeyboardEvent) => {\n      if (event.key === 'ArrowUp') {\n        setFocusedResult((prevFocused) => {\n          if (prevFocused === undefined) return 0;\n          return prevFocused === 0 ? results.length - 1 : prevFocused - 1;\n        });\n      }\n\n      if (event.key === 'ArrowDown') {\n        setFocusedResult((prevFocused) => {\n          if (prevFocused === undefined) return 0;\n          return prevFocused === results.length - 1 ? 0 : prevFocused + 1;\n        });\n      }\n\n      if (event.key === 'Enter') {\n        event.preventDefault();\n        setFocusedResult((prevFocused) => {\n          if (typeof prevFocused !== 'undefined') {\n            selectResult(results[prevFocused]);\n            return undefined;\n          }\n          return prevFocused;\n        });\n      }\n    },\n    [results, selectResult],\n  );\n\n  useEffect(() => {\n    document.addEventListener('keydown', handleKeyDown, false);\n    return () => document.removeEventListener('keydown', handleKeyDown);\n  }, [handleKeyDown]);\n\n  if (searching) {\n    return (\n      <ResultsContainer popupResults={popupResults}>\n        {SearchLoading ? (\n          <SearchLoading />\n        ) : (\n          <div\n            className='str-chat__channel-search-container-searching'\n            data-testid='search-in-progress-indicator'\n          >\n            {t('Searching...')}\n          </div>\n        )}\n      </ResultsContainer>\n    );\n  }\n\n  if (!results.length) {\n    return (\n      <ResultsContainer popupResults={popupResults}>\n        <SearchEmpty />\n      </ResultsContainer>\n    );\n  }\n\n  return (\n    <ResultsContainer popupResults={popupResults}>\n      <SearchResultsHeader results={results} />\n      <SearchResultsList\n        focusedUser={focusedResult}\n        results={results}\n        SearchResultItem={SearchResultItem}\n        selectResult={selectResult}\n      />\n    </ResultsContainer>\n  );\n};\n", "import React from 'react';\n\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { ChatBubble } from './icons';\n\nexport type EmptyStateIndicatorProps = {\n  /** List Type: channel | message */\n  listType?: 'channel' | 'message' | 'thread';\n};\n\nconst UnMemoizedEmptyStateIndicator = (props: EmptyStateIndicatorProps) => {\n  const { listType } = props;\n\n  const { t } = useTranslationContext('EmptyStateIndicator');\n\n  if (listType === 'thread') return null;\n\n  if (listType === 'channel') {\n    const text = t('You have no channels currently');\n    return (\n      <>\n        <div className='str-chat__channel-list-empty'>\n          <ChatBubble />\n          <p role='listitem'>{text}</p>\n        </div>\n      </>\n    );\n  }\n\n  if (listType === 'message') {\n    const text = t('No chats here yet\u2026');\n    return (\n      <div className='str-chat__empty-channel'>\n        <ChatBubble />\n        <p className='str-chat__empty-channel-text' role='listitem'>\n          {text}\n        </p>\n      </div>\n    );\n  }\n\n  return <p>No items exist</p>;\n};\n\nexport const EmptyStateIndicator = React.memo(\n  UnMemoizedEmptyStateIndicator,\n) as typeof UnMemoizedEmptyStateIndicator;\n", "import React from 'react';\n\nexport const ChatBubble = () => (\n  <svg\n    data-testid='chat-bubble'\n    fill='none'\n    height='96'\n    viewBox='0 0 136 136'\n    width='96'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      d='M106 24.5H30C24.775 24.5 20.5 28.775 20.5 34V119.5L39.5 100.5H106C111.225 100.5 115.5 96.225 115.5 91V34C115.5 28.775 111.225 24.5 106 24.5ZM106 91H39.5L30 100.5V34H106V91Z'\n      fill='#B4B7BB'\n    />\n  </svg>\n);\n", "import type { PropsWithChildren } from 'react';\nimport React, { useEffect } from 'react';\n\nimport type { LoadMoreButtonProps } from './LoadMoreButton';\nimport { LoadMoreButton as DefaultLoadMoreButton } from './LoadMoreButton';\nimport type { PaginatorProps } from '../../types/types';\nimport { deprecationAndReplacementWarning } from '../../utils/deprecationWarning';\n\nexport type LoadMorePaginatorProps = PaginatorProps & {\n  /** A UI button component that handles pagination logic */\n  LoadMoreButton?: React.ComponentType<LoadMoreButtonProps>;\n  /** indicates if the `LoadMoreButton` should be displayed at the top of the list of channels instead of the bottom of the list (the default) */\n  reverse?: boolean;\n};\n\nexport const UnMemoizedLoadMorePaginator = (\n  props: PropsWithChildren<LoadMorePaginatorProps>,\n) => {\n  const {\n    children,\n    hasNextPage,\n    isLoading,\n    LoadMoreButton = DefaultLoadMoreButton,\n    loadNextPage,\n    refreshing,\n    reverse,\n  } = props;\n  const loadingState = typeof isLoading !== 'undefined' ? isLoading : refreshing;\n\n  useEffect(() => {\n    deprecationAndReplacementWarning(\n      [[{ refreshing }, { isLoading }]],\n      'LoadMorePaginator',\n    );\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  return (\n    <>\n      {!reverse && children}\n      {hasNextPage && <LoadMoreButton isLoading={loadingState} onClick={loadNextPage} />}\n      {reverse && children}\n    </>\n  );\n};\n\nexport const LoadMorePaginator = React.memo(\n  UnMemoizedLoadMorePaginator,\n) as typeof UnMemoizedLoadMorePaginator;\n", "import type { PropsWithChildren } from 'react';\nimport React, { useEffect } from 'react';\nimport { LoadingIndicator } from '../Loading';\nimport { deprecationAndReplacementWarning } from '../../utils/deprecationWarning';\nimport { useTranslationContext } from '../../context';\n\nexport type LoadMoreButtonProps = {\n  /** onClick handler load more button. Pagination logic should be executed in this handler. */\n  onClick: React.MouseEventHandler<HTMLButtonElement>;\n  /** indicates whether a loading request is in progress */\n  isLoading?: boolean;\n  /**\n   * @desc If true, LoadingIndicator is displayed instead of button\n   * @deprecated Use loading prop instead of refreshing. Planned for removal: https://github.com/GetStream/stream-chat-react/issues/1804\n   */\n  refreshing?: boolean;\n};\n\nconst UnMemoizedLoadMoreButton = ({\n  children,\n  isLoading,\n  onClick,\n  refreshing,\n}: PropsWithChildren<LoadMoreButtonProps>) => {\n  const { t } = useTranslationContext('UnMemoizedLoadMoreButton');\n\n  const childrenOrDefaultString = children ?? t('Load more');\n  const loading = typeof isLoading !== 'undefined' ? isLoading : refreshing;\n\n  useEffect(() => {\n    deprecationAndReplacementWarning([[{ refreshing }, { isLoading }]], 'LoadMoreButton');\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  return (\n    <div className='str-chat__load-more-button'>\n      <button\n        aria-label={t('aria/Load More Channels')}\n        className='str-chat__load-more-button__button str-chat__cta-button'\n        data-testid='load-more-button'\n        disabled={loading}\n        onClick={onClick}\n      >\n        {loading ? <LoadingIndicator /> : childrenOrDefaultString}\n      </button>\n    </div>\n  );\n};\n\nexport const LoadMoreButton = React.memo(\n  UnMemoizedLoadMoreButton,\n) as typeof UnMemoizedLoadMoreButton;\n", "import React from 'react';\n\nconst LoadingMessage = () => (\n  <div className='str-chat__loading-channel-message'>\n    <div className='str-chat__loading-channel-message-avatar'></div>\n    <div className='str-chat__loading-channel-message-end'>\n      <div className='str-chat__loading-channel-message-sender'></div>\n      <div className='str-chat__loading-channel-message-last-row'>\n        <div className='str-chat__loading-channel-message-text'></div>\n        <div className='str-chat__loading-channel-message-date'></div>\n      </div>\n    </div>\n  </div>\n);\n\nconst LoadingMessageInput = () => (\n  <div className='str-chat__loading-channel-message-input-row'>\n    <div className='str-chat__loading-channel-message-input'></div>\n    <div className='str-chat__loading-channel-message-send'></div>\n  </div>\n);\n\nconst LoadingChannelHeader = () => (\n  <div className='str-chat__loading-channel-header'>\n    <div className='str-chat__loading-channel-header-avatar'></div>\n    <div className='str-chat__loading-channel-header-end'>\n      <div className='str-chat__loading-channel-header-name'></div>\n      <div className='str-chat__loading-channel-header-info'></div>\n    </div>\n  </div>\n);\n\nexport const LoadingChannel = () => (\n  <div className='str-chat__loading-channel'>\n    <LoadingChannelHeader />\n    <div className='str-chat__loading-channel-message-list'>\n      {Array.from(Array(3)).map((_, i) => (\n        <LoadingMessage key={`loading-message-${i}`} />\n      ))}\n    </div>\n    <LoadingMessageInput />\n  </div>\n);\n", "import React from 'react';\n\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nexport type LoadingErrorIndicatorProps = {\n  /** Error object */\n  error?: Error | null;\n};\n\n/**\n * UI component for error indicator in a Channel\n */\nconst UnMemoizedLoadingErrorIndicator = ({ error }: LoadingErrorIndicatorProps) => {\n  const { t } = useTranslationContext('LoadingErrorIndicator');\n\n  if (!error) return null;\n\n  return <div>{t('Error: {{ errorMessage }}', { errorMessage: error.message })}</div>;\n};\n\nexport const LoadingErrorIndicator = React.memo(\n  UnMemoizedLoadingErrorIndicator,\n  (prevProps, nextProps) => prevProps.error?.message === nextProps.error?.message,\n) as typeof UnMemoizedLoadingErrorIndicator;\n", "import React from 'react';\n\n// FIXME: remove color and size props and let the loading indicator to be styled via CSS\nexport type LoadingIndicatorProps = {\n  /** Set the color of the LoadingIndicator */\n  color?: string;\n  /** The size of the loading icon, @default 15px */\n  size?: number;\n};\n\nconst UnMemoizedLoadingIndicator = (props: LoadingIndicatorProps) => {\n  const { color = '#006CFF', size = 15 } = props;\n\n  return (\n    <div\n      className={`str-chat__loading-indicator`}\n      data-testid='loading-indicator-wrapper'\n      style={{ height: size, width: size }}\n    >\n      <svg\n        height={size}\n        viewBox={`0 0 30 30`}\n        width={size}\n        xmlns='http://www.w3.org/2000/svg'\n      >\n        <defs>\n          <linearGradient id='a' x1='50%' x2='50%' y1='0%' y2='100%'>\n            <stop offset='0%' stopColor='#FFF' stopOpacity='0' />\n            <stop\n              data-testid='loading-indicator-circle'\n              offset='100%'\n              stopColor={color}\n              stopOpacity='1'\n              style={{ stopColor: color }}\n            />\n          </linearGradient>\n        </defs>\n        <path\n          d='M2.518 23.321l1.664-1.11A12.988 12.988 0 0 0 15 28c7.18 0 13-5.82 13-13S22.18 2 15 2V0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-5.206 0-9.792-2.652-12.482-6.679z'\n          fill='url(#a)'\n          fillRule='evenodd'\n        />\n      </svg>\n    </div>\n  );\n};\n\n/**\n * Simple loading spinner\n */\nexport const LoadingIndicator = React.memo(\n  UnMemoizedLoadingIndicator,\n  (prevProps, nextProps) =>\n    prevProps.color === nextProps.color && prevProps.size === nextProps.size,\n) as typeof UnMemoizedLoadingIndicator;\n", "export const deprecationAndReplacementWarning = <P extends Record<string, unknown>[][]>(\n  pairs: P,\n  component: string,\n) => {\n  pairs.forEach((data) => {\n    const [[oldName, oldValue], [newName, newValue]] = [\n      Object.entries(data[0])[0],\n      Object.entries(data[1])[0],\n    ];\n\n    if (\n      (typeof oldValue !== 'undefined' && typeof newValue === 'undefined') ||\n      (typeof oldValue !== 'undefined' && typeof newValue !== 'undefined')\n    ) {\n      console.warn(\n        `[Deprecation notice (${component})]: prefer using prop ${newName} instead of ${oldName}`,\n      );\n    }\n  });\n};\n", "import { useEffect } from 'react';\nimport type { Channel, Event } from 'stream-chat';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nexport const useChannelDeletedListener = (\n  setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n  customHandler?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void,\n) => {\n  const { client } = useChatContext('useChannelDeletedListener');\n\n  useEffect(() => {\n    const handleEvent = (event: Event) => {\n      if (customHandler && typeof customHandler === 'function') {\n        customHandler(setChannels, event);\n      } else {\n        setChannels((channels) => {\n          const channelIndex = channels.findIndex((channel) => channel.cid === event.cid);\n\n          if (channelIndex < 0) return [...channels];\n\n          // Remove the deleted channel from the list\n          channels.splice(channelIndex, 1);\n\n          return [...channels];\n        });\n      }\n    };\n\n    client.on('channel.deleted', handleEvent);\n\n    return () => {\n      client.off('channel.deleted', handleEvent);\n    };\n  }, [client, customHandler, setChannels]);\n};\n", "import { useEffect } from 'react';\nimport type { Channel, Event } from 'stream-chat';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nexport const useChannelHiddenListener = (\n  setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n  customHandler?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void,\n) => {\n  const { client } = useChatContext('useChannelHiddenListener');\n\n  useEffect(() => {\n    const handleEvent = (event: Event) => {\n      if (customHandler && typeof customHandler === 'function') {\n        customHandler(setChannels, event);\n      } else {\n        setChannels((channels) => {\n          const channelIndex = channels.findIndex((channel) => channel.cid === event.cid);\n          if (channelIndex < 0) return [...channels];\n\n          // Remove the hidden channel from the list.s\n          channels.splice(channelIndex, 1);\n\n          return [...channels];\n        });\n      }\n    };\n\n    client.on('channel.hidden', handleEvent);\n\n    return () => {\n      client.off('channel.hidden', handleEvent);\n    };\n  }, [client, customHandler, setChannels]);\n};\n", "import { useEffect } from 'react';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useChannelTruncatedListener = (\n  setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n  customHandler?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void,\n  forceUpdate?: () => void,\n) => {\n  const { client } = useChatContext('useChannelTruncatedListener');\n\n  useEffect(() => {\n    const handleEvent = (event: Event) => {\n      setChannels((channels) => [...channels]);\n\n      if (customHandler && typeof customHandler === 'function') {\n        customHandler(setChannels, event);\n      }\n      if (forceUpdate) {\n        forceUpdate();\n      }\n    };\n\n    client.on('channel.truncated', handleEvent);\n\n    return () => {\n      client.off('channel.truncated', handleEvent);\n    };\n  }, [client, customHandler, forceUpdate, setChannels]);\n};\n", "import { useEffect } from 'react';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useChannelUpdatedListener = (\n  setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n  customHandler?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void,\n  forceUpdate?: () => void,\n) => {\n  const { client } = useChatContext('useChannelUpdatedListener');\n\n  useEffect(() => {\n    const handleEvent = (event: Event) => {\n      setChannels((channels) => {\n        const channelIndex = channels.findIndex(\n          (channel) => channel.cid === event.channel?.cid,\n        );\n\n        if (channelIndex > -1 && event.channel) {\n          const newChannels = channels;\n          newChannels[channelIndex].data = {\n            ...event.channel,\n            hidden: event.channel?.hidden ?? newChannels[channelIndex].data?.hidden,\n            own_capabilities:\n              event.channel?.own_capabilities ??\n              newChannels[channelIndex].data?.own_capabilities,\n          };\n\n          return [...newChannels];\n        }\n\n        return channels;\n      });\n      if (forceUpdate) {\n        forceUpdate();\n      }\n      if (customHandler && typeof customHandler === 'function') {\n        customHandler(setChannels, event);\n      }\n    };\n\n    client.on('channel.updated', handleEvent);\n\n    return () => {\n      client.off('channel.updated', handleEvent);\n    };\n  }, [client, customHandler, forceUpdate, setChannels]);\n};\n", "import { useEffect } from 'react';\nimport uniqBy from 'lodash.uniqby';\n\nimport { getChannel } from '../../../utils/getChannel';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useChannelVisibleListener = (\n  setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n  customHandler?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void,\n) => {\n  const { client } = useChatContext('useChannelVisibleListener');\n\n  useEffect(() => {\n    const handleEvent = async (event: Event) => {\n      if (customHandler && typeof customHandler === 'function') {\n        customHandler(setChannels, event);\n      } else if (event.type && event.channel_type && event.channel_id) {\n        const channel = await getChannel({\n          client,\n          id: event.channel_id,\n          type: event.channel_type,\n        });\n        setChannels((channels) => uniqBy([channel, ...channels], 'cid'));\n      }\n    };\n\n    client.on('channel.visible', handleEvent);\n\n    return () => {\n      client.off('channel.visible', handleEvent);\n    };\n  }, [client, customHandler, setChannels]);\n};\n", "import { useEffect } from 'react';\nimport uniqBy from 'lodash.uniqby';\n\nimport { moveChannelUp } from '../utils';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useMessageNewListener = (\n  setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n  customHandler?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void,\n  lockChannelOrder = false,\n  allowNewMessagesFromUnfilteredChannels = true,\n) => {\n  const { client } = useChatContext('useMessageNewListener');\n\n  useEffect(() => {\n    const handleEvent = (event: Event) => {\n      if (customHandler && typeof customHandler === 'function') {\n        customHandler(setChannels, event);\n      } else {\n        setChannels((channels) => {\n          const channelInList =\n            channels.filter((channel) => channel.cid === event.cid).length > 0;\n\n          if (\n            !channelInList &&\n            allowNewMessagesFromUnfilteredChannels &&\n            event.channel_type\n          ) {\n            const channel = client.channel(event.channel_type, event.channel_id);\n            return uniqBy([channel, ...channels], 'cid');\n          }\n\n          if (!lockChannelOrder) return moveChannelUp({ channels, cid: event.cid || '' });\n\n          return channels;\n        });\n      }\n    };\n\n    client.on('message.new', handleEvent);\n\n    return () => {\n      client.off('message.new', handleEvent);\n    };\n  }, [\n    allowNewMessagesFromUnfilteredChannels,\n    client,\n    customHandler,\n    lockChannelOrder,\n    setChannels,\n  ]);\n};\n", "import { useEffect } from 'react';\nimport uniqBy from 'lodash.uniqby';\n\nimport { getChannel } from '../../../utils/getChannel';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useNotificationAddedToChannelListener = (\n  setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n  customHandler?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void,\n  allowNewMessagesFromUnfilteredChannels = true,\n) => {\n  const { client } = useChatContext('useNotificationAddedToChannelListener');\n\n  useEffect(() => {\n    const handleEvent = async (event: Event) => {\n      if (customHandler && typeof customHandler === 'function') {\n        customHandler(setChannels, event);\n      } else if (allowNewMessagesFromUnfilteredChannels && event.channel?.type) {\n        const channel = await getChannel({\n          client,\n          id: event.channel.id,\n          members: event.channel.members?.reduce<string[]>((acc, { user, user_id }) => {\n            const userId = user_id || user?.id;\n            if (userId) {\n              acc.push(userId);\n            }\n            return acc;\n          }, []),\n          type: event.channel.type,\n        });\n        setChannels((channels) => uniqBy([channel, ...channels], 'cid'));\n      }\n    };\n\n    client.on('notification.added_to_channel', handleEvent);\n\n    return () => {\n      client.off('notification.added_to_channel', handleEvent);\n    };\n  }, [allowNewMessagesFromUnfilteredChannels, client, customHandler, setChannels]);\n};\n", "import { useEffect } from 'react';\nimport uniqBy from 'lodash.uniqby';\n\nimport { getChannel } from '../../../utils/getChannel';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useNotificationMessageNewListener = (\n  setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n  customHandler?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void,\n  allowNewMessagesFromUnfilteredChannels = true,\n) => {\n  const { client } = useChatContext('useNotificationMessageNewListener');\n\n  useEffect(() => {\n    const handleEvent = async (event: Event) => {\n      if (customHandler && typeof customHandler === 'function') {\n        customHandler(setChannels, event);\n      } else if (allowNewMessagesFromUnfilteredChannels && event.channel?.type) {\n        const channel = await getChannel({\n          client,\n          id: event.channel.id,\n          type: event.channel.type,\n        });\n        setChannels((channels) => uniqBy([channel, ...channels], 'cid'));\n      }\n    };\n\n    client.on('notification.message_new', handleEvent);\n\n    return () => {\n      client.off('notification.message_new', handleEvent);\n    };\n  }, [allowNewMessagesFromUnfilteredChannels, client, customHandler, setChannels]);\n};\n", "import { useEffect } from 'react';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useNotificationRemovedFromChannelListener = (\n  setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n  customHandler?: (\n    setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n    event: Event,\n  ) => void,\n) => {\n  const { client } = useChatContext('useNotificationRemovedFromChannelListener');\n\n  useEffect(() => {\n    const handleEvent = (event: Event) => {\n      if (customHandler && typeof customHandler === 'function') {\n        customHandler(setChannels, event);\n      } else {\n        setChannels((channels) =>\n          channels.filter((channel) => channel.cid !== event.channel?.cid),\n        );\n      }\n    };\n\n    client.on('notification.removed_from_channel', handleEvent);\n\n    return () => {\n      client.off('notification.removed_from_channel', handleEvent);\n    };\n  }, [client, customHandler, setChannels]);\n};\n", "import { useEffect } from 'react';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useUserPresenceChangedListener = (\n  setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n) => {\n  const { client } = useChatContext('useUserPresenceChangedListener');\n\n  useEffect(() => {\n    const handleEvent = (event: Event) => {\n      setChannels((channels) => {\n        const newChannels = channels.map((channel) => {\n          if (!event.user?.id || !channel.state.members[event.user.id]) {\n            return channel;\n          }\n\n          const newChannel = channel; // dumb workaround for linter\n          newChannel.state.members[event.user.id].user = event.user;\n\n          return newChannel;\n        });\n\n        return [...newChannels];\n      });\n    };\n\n    client.on('user.presence.changed', handleEvent);\n\n    return () => {\n      client.off('user.presence.changed', handleEvent);\n    };\n  }, [client, setChannels]);\n};\n", "import { useCallback } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport type { Channel, EventTypes } from 'stream-chat';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst noop = () => {};\n\nexport function useSelectedChannelState<O>(_: {\n  channel: Channel;\n  selector: (channel: Channel) => O;\n  stateChangeEventKeys?: EventTypes[];\n}): O;\nexport function useSelectedChannelState<O>(_: {\n  selector: (channel: Channel) => O;\n  channel?: Channel | undefined;\n  stateChangeEventKeys?: EventTypes[];\n}): O | undefined;\nexport function useSelectedChannelState<O>({\n  channel,\n  selector,\n  stateChangeEventKeys = ['all'],\n}: {\n  selector: (channel: Channel) => O;\n  channel?: Channel;\n  stateChangeEventKeys?: EventTypes[];\n}): O | undefined {\n  const subscribe = useCallback(\n    (onStoreChange: (value: O) => void) => {\n      if (!channel) return noop;\n\n      const subscriptions = stateChangeEventKeys.map((et) =>\n        channel.on(et, () => {\n          onStoreChange(selector(channel));\n        }),\n      );\n\n      return () => subscriptions.forEach((subscription) => subscription.unsubscribe());\n    },\n    [channel, selector, stateChangeEventKeys],\n  );\n\n  const getSnapshot = useCallback(() => {\n    if (!channel) return undefined;\n\n    return selector(channel);\n  }, [channel, selector]);\n\n  return useSyncExternalStore(subscribe, getSnapshot);\n}\n", "import type { Channel, ChannelMemberResponse, EventTypes } from 'stream-chat';\nimport { useSelectedChannelState } from './useSelectedChannelState';\n\nconst selector = (c: Channel) => c.state.membership;\nconst keys: EventTypes[] = ['member.updated'];\n\nexport function useChannelMembershipState(channel: Channel): ChannelMemberResponse;\nexport function useChannelMembershipState(\n  channel?: Channel | undefined,\n): ChannelMemberResponse | undefined;\nexport function useChannelMembershipState(channel?: Channel) {\n  return useSelectedChannelState({ channel, selector, stateChangeEventKeys: keys });\n}\n", "import React from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\n\nexport const Icon = {\n  ArchiveBox: (props: ComponentPropsWithoutRef<'svg'>) => (\n    <svg\n      className='str-chat__icon str-chat__icon--archive-box'\n      fill='currentColor'\n      viewBox='0 0 512 512'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path d='M32 32l448 0c17.7 0 32 14.3 32 32l0 32c0 17.7-14.3 32-32 32L32 128C14.3 128 0 113.7 0 96L0 64C0 46.3 14.3 32 32 32zm0 128l448 0 0 256c0 35.3-28.7 64-64 64L96 480c-35.3 0-64-28.7-64-64l0-256zm128 80c0 8.8 7.2 16 16 16l160 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-160 0c-8.8 0-16 7.2-16 16z' />\n    </svg>\n  ),\n  Pin: (props: ComponentPropsWithoutRef<'svg'>) => (\n    <svg\n      className='str-chat__icon str-chat__icon--pin'\n      fill='currentColor'\n      viewBox='0 0 384 512'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path d='M32 32C32 14.3 46.3 0 64 0L320 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-29.5 0 11.4 148.2c36.7 19.9 65.7 53.2 79.5 94.7l1 3c3.3 9.8 1.6 20.5-4.4 28.8s-15.7 13.3-26 13.3L32 352c-10.3 0-19.9-4.9-26-13.3s-7.7-19.1-4.4-28.8l1-3c13.8-41.5 42.8-74.8 79.5-94.7L93.5 64 64 64C46.3 64 32 49.7 32 32zM160 384l64 0 0 96c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-96z' />\n    </svg>\n  ),\n};\n", "import { useEffect, useState } from 'react';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel } from 'stream-chat';\n\nexport const useIsChannelMuted = (channel: Channel) => {\n  const { client } = useChatContext('useIsChannelMuted');\n\n  const [muted, setMuted] = useState(channel.muteStatus());\n\n  useEffect(() => {\n    const handleEvent = () => setMuted(channel.muteStatus());\n\n    client.on('notification.channel_mutes_updated', handleEvent);\n    return () => client.off('notification.channel_mutes_updated', handleEvent);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [muted]);\n\n  return muted;\n};\n", "import { useEffect, useState } from 'react';\nimport type { Channel } from 'stream-chat';\n\nimport { getDisplayImage, getDisplayTitle, getGroupChannelDisplayInfo } from '../utils';\nimport { useChatContext } from '../../../context';\n\nexport type ChannelPreviewInfoParams = {\n  channel: Channel;\n  /** Manually set the image to render, defaults to the Channel image */\n  overrideImage?: string;\n  /** Set title manually */\n  overrideTitle?: string;\n};\n\nexport const useChannelPreviewInfo = (props: ChannelPreviewInfoParams) => {\n  const { channel, overrideImage, overrideTitle } = props;\n\n  const { client } = useChatContext('useChannelPreviewInfo');\n  const [displayTitle, setDisplayTitle] = useState(\n    () => overrideTitle || getDisplayTitle(channel, client.user),\n  );\n  const [displayImage, setDisplayImage] = useState(\n    () => overrideImage || getDisplayImage(channel, client.user),\n  );\n\n  const [groupChannelDisplayInfo, setGroupDisplayChannelInfo] = useState<\n    ReturnType<typeof getGroupChannelDisplayInfo>\n  >(() => getGroupChannelDisplayInfo(channel));\n\n  useEffect(() => {\n    if (overrideTitle && overrideImage) return;\n\n    const updateInfo = () => {\n      if (!overrideTitle) setDisplayTitle(getDisplayTitle(channel, client.user));\n      if (!overrideImage) {\n        setDisplayImage(getDisplayImage(channel, client.user));\n        setGroupDisplayChannelInfo(getGroupChannelDisplayInfo(channel));\n      }\n    };\n\n    updateInfo();\n\n    client.on('user.updated', updateInfo);\n    return () => {\n      client.off('user.updated', updateInfo);\n    };\n  }, [channel, channel.data, client, overrideImage, overrideTitle]);\n\n  return {\n    displayImage: overrideImage || displayImage,\n    displayTitle: overrideTitle || displayTitle,\n    groupChannelDisplayInfo,\n  };\n};\n", "import React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport type { ReactNode } from 'react';\nimport type { Channel, PollVote, TranslationLanguages, UserResponse } from 'stream-chat';\n\nimport type { TranslationContextValue } from '../../context/TranslationContext';\nimport type { ChatContextValue } from '../../context';\nimport type { PluggableList } from 'unified';\nimport { htmlToTextPlugin, imageToLink, plusPlusToEmphasis } from '../Message';\nimport remarkGfm from 'remark-gfm';\n\nconst remarkPlugins: PluggableList = [\n  htmlToTextPlugin,\n  [remarkGfm, { singleTilde: false }],\n  plusPlusToEmphasis,\n  imageToLink,\n];\n\nexport const renderPreviewText = (text: string) => (\n  <ReactMarkdown remarkPlugins={remarkPlugins} skipHtml>\n    {text}\n  </ReactMarkdown>\n);\n\nconst getLatestPollVote = (latestVotesByOption: Record<string, PollVote[]>) => {\n  let latestVote: PollVote | undefined;\n  for (const optionVotes of Object.values(latestVotesByOption)) {\n    optionVotes.forEach((vote) => {\n      if (latestVote && new Date(latestVote.updated_at) >= new Date(vote.created_at))\n        return;\n      latestVote = vote;\n    });\n  }\n\n  return latestVote;\n};\n\nexport const getLatestMessagePreview = (\n  channel: Channel,\n  t: TranslationContextValue['t'],\n  userLanguage: TranslationContextValue['userLanguage'] = 'en',\n  isMessageAIGenerated?: ChatContextValue['isMessageAIGenerated'],\n): ReactNode => {\n  const latestMessage =\n    channel.state.latestMessages[channel.state.latestMessages.length - 1];\n\n  const previewTextToRender =\n    latestMessage?.i18n?.[`${userLanguage}_text` as `${TranslationLanguages}_text`] ||\n    latestMessage?.text;\n  const poll = latestMessage?.poll;\n\n  if (!latestMessage) {\n    return t('Nothing yet...');\n  }\n\n  if (latestMessage.deleted_at) {\n    return t('Message deleted');\n  }\n\n  if (poll) {\n    if (!poll.vote_count) {\n      const createdBy =\n        poll.created_by?.id === channel.getClient().userID\n          ? t('You')\n          : (poll.created_by?.name ?? t('Poll'));\n      return t('\uD83D\uDCCA {{createdBy}} created: {{ pollName}}', {\n        createdBy,\n        pollName: poll.name,\n      });\n    } else {\n      const latestVote = getLatestPollVote(\n        poll.latest_votes_by_option as Record<string, PollVote[]>,\n      );\n      const option =\n        latestVote && poll.options.find((opt) => opt.id === latestVote.option_id);\n\n      if (option && latestVote) {\n        return t('\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}', {\n          pollOptionText: option.text,\n          votedBy:\n            latestVote?.user?.id === channel.getClient().userID\n              ? t('You')\n              : (latestVote.user?.name ?? t('Poll')),\n        });\n      }\n    }\n  }\n\n  if (previewTextToRender) {\n    return isMessageAIGenerated?.(latestMessage)\n      ? previewTextToRender\n      : renderPreviewText(previewTextToRender);\n  }\n\n  if (latestMessage.command) {\n    return `/${latestMessage.command}`;\n  }\n\n  if (latestMessage.attachments?.length) {\n    return t('\uD83C\uDFD9 Attachment...');\n  }\n\n  if (latestMessage.shared_location) {\n    return t('\uD83D\uDCCDShared location');\n  }\n\n  return t('Empty message...');\n};\n\nexport type GroupChannelDisplayInfo = { image?: string; name?: string }[];\n\nexport const getGroupChannelDisplayInfo = (\n  channel: Channel,\n): GroupChannelDisplayInfo | undefined => {\n  const members = Object.values(channel.state.members);\n  if (members.length <= 2) return;\n\n  const info: GroupChannelDisplayInfo = [];\n  for (let i = 0; i < members.length; i++) {\n    const { user } = members[i];\n    if (!user?.name && !user?.image) continue;\n    info.push({ image: user.image, name: user.name });\n    if (info.length === 4) break;\n  }\n  return info;\n};\n\nconst getChannelDisplayInfo = (\n  info: 'name' | 'image',\n  channel: Channel,\n  currentUser?: UserResponse,\n) => {\n  if (channel.data?.[info]) return channel.data[info];\n  const members = Object.values(channel.state.members);\n  if (members.length !== 2) return;\n  const otherMember = members.find((member) => member.user?.id !== currentUser?.id);\n  return otherMember?.user?.[info];\n};\n\nexport const getDisplayTitle = (channel: Channel, currentUser?: UserResponse) =>\n  getChannelDisplayInfo('name', channel, currentUser);\n\nexport const getDisplayImage = (channel: Channel, currentUser?: UserResponse) =>\n  getChannelDisplayInfo('image', channel, currentUser);\n", "export function deprecate(fn) {\n  return fn\n}\n\nexport function equal() {}\n\nexport function ok() {}\n\nexport function unreachable() {}\n", "/**\n * @typedef Options\n *   Configuration for `stringify`.\n * @property {boolean} [padLeft=true]\n *   Whether to pad a space before a token.\n * @property {boolean} [padRight=false]\n *   Whether to pad a space after a token.\n */\n\n/**\n * @typedef {Options} StringifyOptions\n *   Please use `StringifyOptions` instead.\n */\n\n/**\n * Parse comma-separated tokens to an array.\n *\n * @param {string} value\n *   Comma-separated tokens.\n * @returns {Array<string>}\n *   List of tokens.\n */\nexport function parse(value) {\n  /** @type {Array<string>} */\n  const tokens = []\n  const input = String(value || '')\n  let index = input.indexOf(',')\n  let start = 0\n  /** @type {boolean} */\n  let end = false\n\n  while (!end) {\n    if (index === -1) {\n      index = input.length\n      end = true\n    }\n\n    const token = input.slice(start, index).trim()\n\n    if (token || !end) {\n      tokens.push(token)\n    }\n\n    start = index + 1\n    index = input.indexOf(',', start)\n  }\n\n  return tokens\n}\n\n/**\n * Serialize an array of strings or numbers to comma-separated tokens.\n *\n * @param {Array<string|number>} values\n *   List of tokens.\n * @param {Options} [options]\n *   Configuration for `stringify` (optional).\n * @returns {string}\n *   Comma-separated tokens.\n */\nexport function stringify(values, options) {\n  const settings = options || {}\n\n  // Ensure the last empty entry is seen.\n  const input = values[values.length - 1] === '' ? [...values, ''] : values\n\n  return input\n    .join(\n      (settings.padRight ? ' ' : '') +\n        ',' +\n        (settings.padLeft === false ? '' : ' ')\n    )\n    .trim()\n}\n", "/**\n * @typedef Options\n *   Configuration.\n * @property {boolean | null | undefined} [jsx=false]\n *   Support JSX identifiers (default: `false`).\n */\n\nconst startRe = /[$_\\p{ID_Start}]/u\nconst contRe = /[$_\\u{200C}\\u{200D}\\p{ID_Continue}]/u\nconst contReJsx = /[-$_\\u{200C}\\u{200D}\\p{ID_Continue}]/u\nconst nameRe = /^[$_\\p{ID_Start}][$_\\u{200C}\\u{200D}\\p{ID_Continue}]*$/u\nconst nameReJsx = /^[$_\\p{ID_Start}][-$_\\u{200C}\\u{200D}\\p{ID_Continue}]*$/u\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Checks if the given code point can start an identifier.\n *\n * @param {number | undefined} code\n *   Code point to check.\n * @returns {boolean}\n *   Whether `code` can start an identifier.\n */\n// Note: `undefined` is supported so you can pass the result from `''.codePointAt`.\nexport function start(code) {\n  return code ? startRe.test(String.fromCodePoint(code)) : false\n}\n\n/**\n * Checks if the given code point can continue an identifier.\n *\n * @param {number | undefined} code\n *   Code point to check.\n * @param {Options | null | undefined} [options]\n *   Configuration (optional).\n * @returns {boolean}\n *   Whether `code` can continue an identifier.\n */\n// Note: `undefined` is supported so you can pass the result from `''.codePointAt`.\nexport function cont(code, options) {\n  const settings = options || emptyOptions\n  const re = settings.jsx ? contReJsx : contRe\n  return code ? re.test(String.fromCodePoint(code)) : false\n}\n\n/**\n * Checks if the given value is a valid identifier name.\n *\n * @param {string} name\n *   Identifier to check.\n * @param {Options | null | undefined} [options]\n *   Configuration (optional).\n * @returns {boolean}\n *   Whether `name` can be an identifier.\n */\nexport function name(name, options) {\n  const settings = options || emptyOptions\n  const re = settings.jsx ? nameReJsx : nameRe\n  return re.test(name)\n}\n", "/**\n * @typedef {import('hast').Nodes} Nodes\n */\n\n// HTML whitespace expression.\n// See <https://infra.spec.whatwg.org/#ascii-whitespace>.\nconst re = /[ \\t\\n\\f\\r]/g\n\n/**\n * Check if the given value is *inter-element whitespace*.\n *\n * @param {Nodes | string} thing\n *   Thing to check (`Node` or `string`).\n * @returns {boolean}\n *   Whether the `value` is inter-element whitespace (`boolean`): consisting of\n *   zero or more of space, tab (`\\t`), line feed (`\\n`), carriage return\n *   (`\\r`), or form feed (`\\f`); if a node is passed it must be a `Text` node,\n *   whose `value` field is checked.\n */\nexport function whitespace(thing) {\n  return typeof thing === 'object'\n    ? thing.type === 'text'\n      ? empty(thing.value)\n      : false\n    : empty(thing)\n}\n\n/**\n * @param {string} value\n * @returns {boolean}\n */\nfunction empty(value) {\n  return value.replace(re, '') === ''\n}\n", "/**\n * @typedef {import('./info.js').Info} Info\n * @typedef {Record<string, Info>} Properties\n * @typedef {Record<string, string>} Normal\n */\n\nexport class Schema {\n  /**\n   * @constructor\n   * @param {Properties} property\n   * @param {Normal} normal\n   * @param {string} [space]\n   */\n  constructor(property, normal, space) {\n    this.property = property\n    this.normal = normal\n    if (space) {\n      this.space = space\n    }\n  }\n}\n\n/** @type {Properties} */\nSchema.prototype.property = {}\n/** @type {Normal} */\nSchema.prototype.normal = {}\n/** @type {string|null} */\nSchema.prototype.space = null\n", "/**\n * @typedef {import('./schema.js').Properties} Properties\n * @typedef {import('./schema.js').Normal} Normal\n */\n\nimport {Schema} from './schema.js'\n\n/**\n * @param {Schema[]} definitions\n * @param {string} [space]\n * @returns {Schema}\n */\nexport function merge(definitions, space) {\n  /** @type {Properties} */\n  const property = {}\n  /** @type {Normal} */\n  const normal = {}\n  let index = -1\n\n  while (++index < definitions.length) {\n    Object.assign(property, definitions[index].property)\n    Object.assign(normal, definitions[index].normal)\n  }\n\n  return new Schema(property, normal, space)\n}\n", "/**\n * @param {string} value\n * @returns {string}\n */\nexport function normalize(value) {\n  return value.toLowerCase()\n}\n", "export class Info {\n  /**\n   * @constructor\n   * @param {string} property\n   * @param {string} attribute\n   */\n  constructor(property, attribute) {\n    /** @type {string} */\n    this.property = property\n    /** @type {string} */\n    this.attribute = attribute\n  }\n}\n\n/** @type {string|null} */\nInfo.prototype.space = null\nInfo.prototype.boolean = false\nInfo.prototype.booleanish = false\nInfo.prototype.overloadedBoolean = false\nInfo.prototype.number = false\nInfo.prototype.commaSeparated = false\nInfo.prototype.spaceSeparated = false\nInfo.prototype.commaOrSpaceSeparated = false\nInfo.prototype.mustUseProperty = false\nInfo.prototype.defined = false\n", "let powers = 0\n\nexport const boolean = increment()\nexport const booleanish = increment()\nexport const overloadedBoolean = increment()\nexport const number = increment()\nexport const spaceSeparated = increment()\nexport const commaSeparated = increment()\nexport const commaOrSpaceSeparated = increment()\n\nfunction increment() {\n  return 2 ** ++powers\n}\n", "import {Info} from './info.js'\nimport * as types from './types.js'\n\n/** @type {Array<keyof types>} */\n// @ts-expect-error: hush.\nconst checks = Object.keys(types)\n\nexport class DefinedInfo extends Info {\n  /**\n   * @constructor\n   * @param {string} property\n   * @param {string} attribute\n   * @param {number|null} [mask]\n   * @param {string} [space]\n   */\n  constructor(property, attribute, mask, space) {\n    let index = -1\n\n    super(property, attribute)\n\n    mark(this, 'space', space)\n\n    if (typeof mask === 'number') {\n      while (++index < checks.length) {\n        const check = checks[index]\n        mark(this, checks[index], (mask & types[check]) === types[check])\n      }\n    }\n  }\n}\n\nDefinedInfo.prototype.defined = true\n\n/**\n * @param {DefinedInfo} values\n * @param {string} key\n * @param {unknown} value\n */\nfunction mark(values, key, value) {\n  if (value) {\n    // @ts-expect-error: assume `value` matches the expected value of `key`.\n    values[key] = value\n  }\n}\n", "/**\n * @typedef {import('./schema.js').Properties} Properties\n * @typedef {import('./schema.js').Normal} Normal\n *\n * @typedef {Record<string, string>} Attributes\n *\n * @typedef {Object} Definition\n * @property {Record<string, number|null>} properties\n * @property {(attributes: Attributes, property: string) => string} transform\n * @property {string} [space]\n * @property {Attributes} [attributes]\n * @property {Array<string>} [mustUseProperty]\n */\n\nimport {normalize} from '../normalize.js'\nimport {Schema} from './schema.js'\nimport {DefinedInfo} from './defined-info.js'\n\nconst own = {}.hasOwnProperty\n\n/**\n * @param {Definition} definition\n * @returns {Schema}\n */\nexport function create(definition) {\n  /** @type {Properties} */\n  const property = {}\n  /** @type {Normal} */\n  const normal = {}\n  /** @type {string} */\n  let prop\n\n  for (prop in definition.properties) {\n    if (own.call(definition.properties, prop)) {\n      const value = definition.properties[prop]\n      const info = new DefinedInfo(\n        prop,\n        definition.transform(definition.attributes || {}, prop),\n        value,\n        definition.space\n      )\n\n      if (\n        definition.mustUseProperty &&\n        definition.mustUseProperty.includes(prop)\n      ) {\n        info.mustUseProperty = true\n      }\n\n      property[prop] = info\n\n      normal[normalize(prop)] = prop\n      normal[normalize(info.attribute)] = prop\n    }\n  }\n\n  return new Schema(property, normal, definition.space)\n}\n", "import {create} from './util/create.js'\n\nexport const xlink = create({\n  space: 'xlink',\n  transform(_, prop) {\n    return 'xlink:' + prop.slice(5).toLowerCase()\n  },\n  properties: {\n    xLinkActuate: null,\n    xLinkArcRole: null,\n    xLinkHref: null,\n    xLinkRole: null,\n    xLinkShow: null,\n    xLinkTitle: null,\n    xLinkType: null\n  }\n})\n", "import {create} from './util/create.js'\n\nexport const xml = create({\n  space: 'xml',\n  transform(_, prop) {\n    return 'xml:' + prop.slice(3).toLowerCase()\n  },\n  properties: {xmlLang: null, xmlBase: null, xmlSpace: null}\n})\n", "/**\n * @param {Record<string, string>} attributes\n * @param {string} attribute\n * @returns {string}\n */\nexport function caseSensitiveTransform(attributes, attribute) {\n  return attribute in attributes ? attributes[attribute] : attribute\n}\n", "import {caseSensitiveTransform} from './case-sensitive-transform.js'\n\n/**\n * @param {Record<string, string>} attributes\n * @param {string} property\n * @returns {string}\n */\nexport function caseInsensitiveTransform(attributes, property) {\n  return caseSensitiveTransform(attributes, property.toLowerCase())\n}\n", "import {create} from './util/create.js'\nimport {caseInsensitiveTransform} from './util/case-insensitive-transform.js'\n\nexport const xmlns = create({\n  space: 'xmlns',\n  attributes: {xmlnsxlink: 'xmlns:xlink'},\n  transform: caseInsensitiveTransform,\n  properties: {xmlns: null, xmlnsXLink: null}\n})\n", "import {booleanish, number, spaceSeparated} from './util/types.js'\nimport {create} from './util/create.js'\n\nexport const aria = create({\n  transform(_, prop) {\n    return prop === 'role' ? prop : 'aria-' + prop.slice(4).toLowerCase()\n  },\n  properties: {\n    ariaActiveDescendant: null,\n    ariaAtomic: booleanish,\n    ariaAutoComplete: null,\n    ariaBusy: booleanish,\n    ariaChecked: booleanish,\n    ariaColCount: number,\n    ariaColIndex: number,\n    ariaColSpan: number,\n    ariaControls: spaceSeparated,\n    ariaCurrent: null,\n    ariaDescribedBy: spaceSeparated,\n    ariaDetails: null,\n    ariaDisabled: booleanish,\n    ariaDropEffect: spaceSeparated,\n    ariaErrorMessage: null,\n    ariaExpanded: booleanish,\n    ariaFlowTo: spaceSeparated,\n    ariaGrabbed: booleanish,\n    ariaHasPopup: null,\n    ariaHidden: booleanish,\n    ariaInvalid: null,\n    ariaKeyShortcuts: null,\n    ariaLabel: null,\n    ariaLabelledBy: spaceSeparated,\n    ariaLevel: number,\n    ariaLive: null,\n    ariaModal: booleanish,\n    ariaMultiLine: booleanish,\n    ariaMultiSelectable: booleanish,\n    ariaOrientation: null,\n    ariaOwns: spaceSeparated,\n    ariaPlaceholder: null,\n    ariaPosInSet: number,\n    ariaPressed: booleanish,\n    ariaReadOnly: booleanish,\n    ariaRelevant: null,\n    ariaRequired: booleanish,\n    ariaRoleDescription: spaceSeparated,\n    ariaRowCount: number,\n    ariaRowIndex: number,\n    ariaRowSpan: number,\n    ariaSelected: booleanish,\n    ariaSetSize: number,\n    ariaSort: null,\n    ariaValueMax: number,\n    ariaValueMin: number,\n    ariaValueNow: number,\n    ariaValueText: null,\n    role: null\n  }\n})\n", "import {\n  boolean,\n  overloadedBoolean,\n  booleanish,\n  number,\n  spaceSeparated,\n  commaSeparated\n} from './util/types.js'\nimport {create} from './util/create.js'\nimport {caseInsensitiveTransform} from './util/case-insensitive-transform.js'\n\nexport const html = create({\n  space: 'html',\n  attributes: {\n    acceptcharset: 'accept-charset',\n    classname: 'class',\n    htmlfor: 'for',\n    httpequiv: 'http-equiv'\n  },\n  transform: caseInsensitiveTransform,\n  mustUseProperty: ['checked', 'multiple', 'muted', 'selected'],\n  properties: {\n    // Standard Properties.\n    abbr: null,\n    accept: commaSeparated,\n    acceptCharset: spaceSeparated,\n    accessKey: spaceSeparated,\n    action: null,\n    allow: null,\n    allowFullScreen: boolean,\n    allowPaymentRequest: boolean,\n    allowUserMedia: boolean,\n    alt: null,\n    as: null,\n    async: boolean,\n    autoCapitalize: null,\n    autoComplete: spaceSeparated,\n    autoFocus: boolean,\n    autoPlay: boolean,\n    blocking: spaceSeparated,\n    capture: boolean,\n    charSet: null,\n    checked: boolean,\n    cite: null,\n    className: spaceSeparated,\n    cols: number,\n    colSpan: null,\n    content: null,\n    contentEditable: booleanish,\n    controls: boolean,\n    controlsList: spaceSeparated,\n    coords: number | commaSeparated,\n    crossOrigin: null,\n    data: null,\n    dateTime: null,\n    decoding: null,\n    default: boolean,\n    defer: boolean,\n    dir: null,\n    dirName: null,\n    disabled: boolean,\n    download: overloadedBoolean,\n    draggable: booleanish,\n    encType: null,\n    enterKeyHint: null,\n    fetchPriority: null,\n    form: null,\n    formAction: null,\n    formEncType: null,\n    formMethod: null,\n    formNoValidate: boolean,\n    formTarget: null,\n    headers: spaceSeparated,\n    height: number,\n    hidden: boolean,\n    high: number,\n    href: null,\n    hrefLang: null,\n    htmlFor: spaceSeparated,\n    httpEquiv: spaceSeparated,\n    id: null,\n    imageSizes: null,\n    imageSrcSet: null,\n    inert: boolean,\n    inputMode: null,\n    integrity: null,\n    is: null,\n    isMap: boolean,\n    itemId: null,\n    itemProp: spaceSeparated,\n    itemRef: spaceSeparated,\n    itemScope: boolean,\n    itemType: spaceSeparated,\n    kind: null,\n    label: null,\n    lang: null,\n    language: null,\n    list: null,\n    loading: null,\n    loop: boolean,\n    low: number,\n    manifest: null,\n    max: null,\n    maxLength: number,\n    media: null,\n    method: null,\n    min: null,\n    minLength: number,\n    multiple: boolean,\n    muted: boolean,\n    name: null,\n    nonce: null,\n    noModule: boolean,\n    noValidate: boolean,\n    onAbort: null,\n    onAfterPrint: null,\n    onAuxClick: null,\n    onBeforeMatch: null,\n    onBeforePrint: null,\n    onBeforeToggle: null,\n    onBeforeUnload: null,\n    onBlur: null,\n    onCancel: null,\n    onCanPlay: null,\n    onCanPlayThrough: null,\n    onChange: null,\n    onClick: null,\n    onClose: null,\n    onContextLost: null,\n    onContextMenu: null,\n    onContextRestored: null,\n    onCopy: null,\n    onCueChange: null,\n    onCut: null,\n    onDblClick: null,\n    onDrag: null,\n    onDragEnd: null,\n    onDragEnter: null,\n    onDragExit: null,\n    onDragLeave: null,\n    onDragOver: null,\n    onDragStart: null,\n    onDrop: null,\n    onDurationChange: null,\n    onEmptied: null,\n    onEnded: null,\n    onError: null,\n    onFocus: null,\n    onFormData: null,\n    onHashChange: null,\n    onInput: null,\n    onInvalid: null,\n    onKeyDown: null,\n    onKeyPress: null,\n    onKeyUp: null,\n    onLanguageChange: null,\n    onLoad: null,\n    onLoadedData: null,\n    onLoadedMetadata: null,\n    onLoadEnd: null,\n    onLoadStart: null,\n    onMessage: null,\n    onMessageError: null,\n    onMouseDown: null,\n    onMouseEnter: null,\n    onMouseLeave: null,\n    onMouseMove: null,\n    onMouseOut: null,\n    onMouseOver: null,\n    onMouseUp: null,\n    onOffline: null,\n    onOnline: null,\n    onPageHide: null,\n    onPageShow: null,\n    onPaste: null,\n    onPause: null,\n    onPlay: null,\n    onPlaying: null,\n    onPopState: null,\n    onProgress: null,\n    onRateChange: null,\n    onRejectionHandled: null,\n    onReset: null,\n    onResize: null,\n    onScroll: null,\n    onScrollEnd: null,\n    onSecurityPolicyViolation: null,\n    onSeeked: null,\n    onSeeking: null,\n    onSelect: null,\n    onSlotChange: null,\n    onStalled: null,\n    onStorage: null,\n    onSubmit: null,\n    onSuspend: null,\n    onTimeUpdate: null,\n    onToggle: null,\n    onUnhandledRejection: null,\n    onUnload: null,\n    onVolumeChange: null,\n    onWaiting: null,\n    onWheel: null,\n    open: boolean,\n    optimum: number,\n    pattern: null,\n    ping: spaceSeparated,\n    placeholder: null,\n    playsInline: boolean,\n    popover: null,\n    popoverTarget: null,\n    popoverTargetAction: null,\n    poster: null,\n    preload: null,\n    readOnly: boolean,\n    referrerPolicy: null,\n    rel: spaceSeparated,\n    required: boolean,\n    reversed: boolean,\n    rows: number,\n    rowSpan: number,\n    sandbox: spaceSeparated,\n    scope: null,\n    scoped: boolean,\n    seamless: boolean,\n    selected: boolean,\n    shadowRootDelegatesFocus: boolean,\n    shadowRootMode: null,\n    shape: null,\n    size: number,\n    sizes: null,\n    slot: null,\n    span: number,\n    spellCheck: booleanish,\n    src: null,\n    srcDoc: null,\n    srcLang: null,\n    srcSet: null,\n    start: number,\n    step: null,\n    style: null,\n    tabIndex: number,\n    target: null,\n    title: null,\n    translate: null,\n    type: null,\n    typeMustMatch: boolean,\n    useMap: null,\n    value: booleanish,\n    width: number,\n    wrap: null,\n\n    // Legacy.\n    // See: https://html.spec.whatwg.org/#other-elements,-attributes-and-apis\n    align: null, // Several. Use CSS `text-align` instead,\n    aLink: null, // `<body>`. Use CSS `a:active {color}` instead\n    archive: spaceSeparated, // `<object>`. List of URIs to archives\n    axis: null, // `<td>` and `<th>`. Use `scope` on `<th>`\n    background: null, // `<body>`. Use CSS `background-image` instead\n    bgColor: null, // `<body>` and table elements. Use CSS `background-color` instead\n    border: number, // `<table>`. Use CSS `border-width` instead,\n    borderColor: null, // `<table>`. Use CSS `border-color` instead,\n    bottomMargin: number, // `<body>`\n    cellPadding: null, // `<table>`\n    cellSpacing: null, // `<table>`\n    char: null, // Several table elements. When `align=char`, sets the character to align on\n    charOff: null, // Several table elements. When `char`, offsets the alignment\n    classId: null, // `<object>`\n    clear: null, // `<br>`. Use CSS `clear` instead\n    code: null, // `<object>`\n    codeBase: null, // `<object>`\n    codeType: null, // `<object>`\n    color: null, // `<font>` and `<hr>`. Use CSS instead\n    compact: boolean, // Lists. Use CSS to reduce space between items instead\n    declare: boolean, // `<object>`\n    event: null, // `<script>`\n    face: null, // `<font>`. Use CSS instead\n    frame: null, // `<table>`\n    frameBorder: null, // `<iframe>`. Use CSS `border` instead\n    hSpace: number, // `<img>` and `<object>`\n    leftMargin: number, // `<body>`\n    link: null, // `<body>`. Use CSS `a:link {color: *}` instead\n    longDesc: null, // `<frame>`, `<iframe>`, and `<img>`. Use an `<a>`\n    lowSrc: null, // `<img>`. Use a `<picture>`\n    marginHeight: number, // `<body>`\n    marginWidth: number, // `<body>`\n    noResize: boolean, // `<frame>`\n    noHref: boolean, // `<area>`. Use no href instead of an explicit `nohref`\n    noShade: boolean, // `<hr>`. Use background-color and height instead of borders\n    noWrap: boolean, // `<td>` and `<th>`\n    object: null, // `<applet>`\n    profile: null, // `<head>`\n    prompt: null, // `<isindex>`\n    rev: null, // `<link>`\n    rightMargin: number, // `<body>`\n    rules: null, // `<table>`\n    scheme: null, // `<meta>`\n    scrolling: booleanish, // `<frame>`. Use overflow in the child context\n    standby: null, // `<object>`\n    summary: null, // `<table>`\n    text: null, // `<body>`. Use CSS `color` instead\n    topMargin: number, // `<body>`\n    valueType: null, // `<param>`\n    version: null, // `<html>`. Use a doctype.\n    vAlign: null, // Several. Use CSS `vertical-align` instead\n    vLink: null, // `<body>`. Use CSS `a:visited {color}` instead\n    vSpace: number, // `<img>` and `<object>`\n\n    // Non-standard Properties.\n    allowTransparency: null,\n    autoCorrect: null,\n    autoSave: null,\n    disablePictureInPicture: boolean,\n    disableRemotePlayback: boolean,\n    prefix: null,\n    property: null,\n    results: number,\n    security: null,\n    unselectable: null\n  }\n})\n", "import {\n  boolean,\n  number,\n  spaceSeparated,\n  commaSeparated,\n  commaOrSpaceSeparated\n} from './util/types.js'\nimport {create} from './util/create.js'\nimport {caseSensitiveTransform} from './util/case-sensitive-transform.js'\n\nexport const svg = create({\n  space: 'svg',\n  attributes: {\n    accentHeight: 'accent-height',\n    alignmentBaseline: 'alignment-baseline',\n    arabicForm: 'arabic-form',\n    baselineShift: 'baseline-shift',\n    capHeight: 'cap-height',\n    className: 'class',\n    clipPath: 'clip-path',\n    clipRule: 'clip-rule',\n    colorInterpolation: 'color-interpolation',\n    colorInterpolationFilters: 'color-interpolation-filters',\n    colorProfile: 'color-profile',\n    colorRendering: 'color-rendering',\n    crossOrigin: 'crossorigin',\n    dataType: 'datatype',\n    dominantBaseline: 'dominant-baseline',\n    enableBackground: 'enable-background',\n    fillOpacity: 'fill-opacity',\n    fillRule: 'fill-rule',\n    floodColor: 'flood-color',\n    floodOpacity: 'flood-opacity',\n    fontFamily: 'font-family',\n    fontSize: 'font-size',\n    fontSizeAdjust: 'font-size-adjust',\n    fontStretch: 'font-stretch',\n    fontStyle: 'font-style',\n    fontVariant: 'font-variant',\n    fontWeight: 'font-weight',\n    glyphName: 'glyph-name',\n    glyphOrientationHorizontal: 'glyph-orientation-horizontal',\n    glyphOrientationVertical: 'glyph-orientation-vertical',\n    hrefLang: 'hreflang',\n    horizAdvX: 'horiz-adv-x',\n    horizOriginX: 'horiz-origin-x',\n    horizOriginY: 'horiz-origin-y',\n    imageRendering: 'image-rendering',\n    letterSpacing: 'letter-spacing',\n    lightingColor: 'lighting-color',\n    markerEnd: 'marker-end',\n    markerMid: 'marker-mid',\n    markerStart: 'marker-start',\n    navDown: 'nav-down',\n    navDownLeft: 'nav-down-left',\n    navDownRight: 'nav-down-right',\n    navLeft: 'nav-left',\n    navNext: 'nav-next',\n    navPrev: 'nav-prev',\n    navRight: 'nav-right',\n    navUp: 'nav-up',\n    navUpLeft: 'nav-up-left',\n    navUpRight: 'nav-up-right',\n    onAbort: 'onabort',\n    onActivate: 'onactivate',\n    onAfterPrint: 'onafterprint',\n    onBeforePrint: 'onbeforeprint',\n    onBegin: 'onbegin',\n    onCancel: 'oncancel',\n    onCanPlay: 'oncanplay',\n    onCanPlayThrough: 'oncanplaythrough',\n    onChange: 'onchange',\n    onClick: 'onclick',\n    onClose: 'onclose',\n    onCopy: 'oncopy',\n    onCueChange: 'oncuechange',\n    onCut: 'oncut',\n    onDblClick: 'ondblclick',\n    onDrag: 'ondrag',\n    onDragEnd: 'ondragend',\n    onDragEnter: 'ondragenter',\n    onDragExit: 'ondragexit',\n    onDragLeave: 'ondragleave',\n    onDragOver: 'ondragover',\n    onDragStart: 'ondragstart',\n    onDrop: 'ondrop',\n    onDurationChange: 'ondurationchange',\n    onEmptied: 'onemptied',\n    onEnd: 'onend',\n    onEnded: 'onended',\n    onError: 'onerror',\n    onFocus: 'onfocus',\n    onFocusIn: 'onfocusin',\n    onFocusOut: 'onfocusout',\n    onHashChange: 'onhashchange',\n    onInput: 'oninput',\n    onInvalid: 'oninvalid',\n    onKeyDown: 'onkeydown',\n    onKeyPress: 'onkeypress',\n    onKeyUp: 'onkeyup',\n    onLoad: 'onload',\n    onLoadedData: 'onloadeddata',\n    onLoadedMetadata: 'onloadedmetadata',\n    onLoadStart: 'onloadstart',\n    onMessage: 'onmessage',\n    onMouseDown: 'onmousedown',\n    onMouseEnter: 'onmouseenter',\n    onMouseLeave: 'onmouseleave',\n    onMouseMove: 'onmousemove',\n    onMouseOut: 'onmouseout',\n    onMouseOver: 'onmouseover',\n    onMouseUp: 'onmouseup',\n    onMouseWheel: 'onmousewheel',\n    onOffline: 'onoffline',\n    onOnline: 'ononline',\n    onPageHide: 'onpagehide',\n    onPageShow: 'onpageshow',\n    onPaste: 'onpaste',\n    onPause: 'onpause',\n    onPlay: 'onplay',\n    onPlaying: 'onplaying',\n    onPopState: 'onpopstate',\n    onProgress: 'onprogress',\n    onRateChange: 'onratechange',\n    onRepeat: 'onrepeat',\n    onReset: 'onreset',\n    onResize: 'onresize',\n    onScroll: 'onscroll',\n    onSeeked: 'onseeked',\n    onSeeking: 'onseeking',\n    onSelect: 'onselect',\n    onShow: 'onshow',\n    onStalled: 'onstalled',\n    onStorage: 'onstorage',\n    onSubmit: 'onsubmit',\n    onSuspend: 'onsuspend',\n    onTimeUpdate: 'ontimeupdate',\n    onToggle: 'ontoggle',\n    onUnload: 'onunload',\n    onVolumeChange: 'onvolumechange',\n    onWaiting: 'onwaiting',\n    onZoom: 'onzoom',\n    overlinePosition: 'overline-position',\n    overlineThickness: 'overline-thickness',\n    paintOrder: 'paint-order',\n    panose1: 'panose-1',\n    pointerEvents: 'pointer-events',\n    referrerPolicy: 'referrerpolicy',\n    renderingIntent: 'rendering-intent',\n    shapeRendering: 'shape-rendering',\n    stopColor: 'stop-color',\n    stopOpacity: 'stop-opacity',\n    strikethroughPosition: 'strikethrough-position',\n    strikethroughThickness: 'strikethrough-thickness',\n    strokeDashArray: 'stroke-dasharray',\n    strokeDashOffset: 'stroke-dashoffset',\n    strokeLineCap: 'stroke-linecap',\n    strokeLineJoin: 'stroke-linejoin',\n    strokeMiterLimit: 'stroke-miterlimit',\n    strokeOpacity: 'stroke-opacity',\n    strokeWidth: 'stroke-width',\n    tabIndex: 'tabindex',\n    textAnchor: 'text-anchor',\n    textDecoration: 'text-decoration',\n    textRendering: 'text-rendering',\n    transformOrigin: 'transform-origin',\n    typeOf: 'typeof',\n    underlinePosition: 'underline-position',\n    underlineThickness: 'underline-thickness',\n    unicodeBidi: 'unicode-bidi',\n    unicodeRange: 'unicode-range',\n    unitsPerEm: 'units-per-em',\n    vAlphabetic: 'v-alphabetic',\n    vHanging: 'v-hanging',\n    vIdeographic: 'v-ideographic',\n    vMathematical: 'v-mathematical',\n    vectorEffect: 'vector-effect',\n    vertAdvY: 'vert-adv-y',\n    vertOriginX: 'vert-origin-x',\n    vertOriginY: 'vert-origin-y',\n    wordSpacing: 'word-spacing',\n    writingMode: 'writing-mode',\n    xHeight: 'x-height',\n    // These were camelcased in Tiny. Now lowercased in SVG 2\n    playbackOrder: 'playbackorder',\n    timelineBegin: 'timelinebegin'\n  },\n  transform: caseSensitiveTransform,\n  properties: {\n    about: commaOrSpaceSeparated,\n    accentHeight: number,\n    accumulate: null,\n    additive: null,\n    alignmentBaseline: null,\n    alphabetic: number,\n    amplitude: number,\n    arabicForm: null,\n    ascent: number,\n    attributeName: null,\n    attributeType: null,\n    azimuth: number,\n    bandwidth: null,\n    baselineShift: null,\n    baseFrequency: null,\n    baseProfile: null,\n    bbox: null,\n    begin: null,\n    bias: number,\n    by: null,\n    calcMode: null,\n    capHeight: number,\n    className: spaceSeparated,\n    clip: null,\n    clipPath: null,\n    clipPathUnits: null,\n    clipRule: null,\n    color: null,\n    colorInterpolation: null,\n    colorInterpolationFilters: null,\n    colorProfile: null,\n    colorRendering: null,\n    content: null,\n    contentScriptType: null,\n    contentStyleType: null,\n    crossOrigin: null,\n    cursor: null,\n    cx: null,\n    cy: null,\n    d: null,\n    dataType: null,\n    defaultAction: null,\n    descent: number,\n    diffuseConstant: number,\n    direction: null,\n    display: null,\n    dur: null,\n    divisor: number,\n    dominantBaseline: null,\n    download: boolean,\n    dx: null,\n    dy: null,\n    edgeMode: null,\n    editable: null,\n    elevation: number,\n    enableBackground: null,\n    end: null,\n    event: null,\n    exponent: number,\n    externalResourcesRequired: null,\n    fill: null,\n    fillOpacity: number,\n    fillRule: null,\n    filter: null,\n    filterRes: null,\n    filterUnits: null,\n    floodColor: null,\n    floodOpacity: null,\n    focusable: null,\n    focusHighlight: null,\n    fontFamily: null,\n    fontSize: null,\n    fontSizeAdjust: null,\n    fontStretch: null,\n    fontStyle: null,\n    fontVariant: null,\n    fontWeight: null,\n    format: null,\n    fr: null,\n    from: null,\n    fx: null,\n    fy: null,\n    g1: commaSeparated,\n    g2: commaSeparated,\n    glyphName: commaSeparated,\n    glyphOrientationHorizontal: null,\n    glyphOrientationVertical: null,\n    glyphRef: null,\n    gradientTransform: null,\n    gradientUnits: null,\n    handler: null,\n    hanging: number,\n    hatchContentUnits: null,\n    hatchUnits: null,\n    height: null,\n    href: null,\n    hrefLang: null,\n    horizAdvX: number,\n    horizOriginX: number,\n    horizOriginY: number,\n    id: null,\n    ideographic: number,\n    imageRendering: null,\n    initialVisibility: null,\n    in: null,\n    in2: null,\n    intercept: number,\n    k: number,\n    k1: number,\n    k2: number,\n    k3: number,\n    k4: number,\n    kernelMatrix: commaOrSpaceSeparated,\n    kernelUnitLength: null,\n    keyPoints: null, // SEMI_COLON_SEPARATED\n    keySplines: null, // SEMI_COLON_SEPARATED\n    keyTimes: null, // SEMI_COLON_SEPARATED\n    kerning: null,\n    lang: null,\n    lengthAdjust: null,\n    letterSpacing: null,\n    lightingColor: null,\n    limitingConeAngle: number,\n    local: null,\n    markerEnd: null,\n    markerMid: null,\n    markerStart: null,\n    markerHeight: null,\n    markerUnits: null,\n    markerWidth: null,\n    mask: null,\n    maskContentUnits: null,\n    maskUnits: null,\n    mathematical: null,\n    max: null,\n    media: null,\n    mediaCharacterEncoding: null,\n    mediaContentEncodings: null,\n    mediaSize: number,\n    mediaTime: null,\n    method: null,\n    min: null,\n    mode: null,\n    name: null,\n    navDown: null,\n    navDownLeft: null,\n    navDownRight: null,\n    navLeft: null,\n    navNext: null,\n    navPrev: null,\n    navRight: null,\n    navUp: null,\n    navUpLeft: null,\n    navUpRight: null,\n    numOctaves: null,\n    observer: null,\n    offset: null,\n    onAbort: null,\n    onActivate: null,\n    onAfterPrint: null,\n    onBeforePrint: null,\n    onBegin: null,\n    onCancel: null,\n    onCanPlay: null,\n    onCanPlayThrough: null,\n    onChange: null,\n    onClick: null,\n    onClose: null,\n    onCopy: null,\n    onCueChange: null,\n    onCut: null,\n    onDblClick: null,\n    onDrag: null,\n    onDragEnd: null,\n    onDragEnter: null,\n    onDragExit: null,\n    onDragLeave: null,\n    onDragOver: null,\n    onDragStart: null,\n    onDrop: null,\n    onDurationChange: null,\n    onEmptied: null,\n    onEnd: null,\n    onEnded: null,\n    onError: null,\n    onFocus: null,\n    onFocusIn: null,\n    onFocusOut: null,\n    onHashChange: null,\n    onInput: null,\n    onInvalid: null,\n    onKeyDown: null,\n    onKeyPress: null,\n    onKeyUp: null,\n    onLoad: null,\n    onLoadedData: null,\n    onLoadedMetadata: null,\n    onLoadStart: null,\n    onMessage: null,\n    onMouseDown: null,\n    onMouseEnter: null,\n    onMouseLeave: null,\n    onMouseMove: null,\n    onMouseOut: null,\n    onMouseOver: null,\n    onMouseUp: null,\n    onMouseWheel: null,\n    onOffline: null,\n    onOnline: null,\n    onPageHide: null,\n    onPageShow: null,\n    onPaste: null,\n    onPause: null,\n    onPlay: null,\n    onPlaying: null,\n    onPopState: null,\n    onProgress: null,\n    onRateChange: null,\n    onRepeat: null,\n    onReset: null,\n    onResize: null,\n    onScroll: null,\n    onSeeked: null,\n    onSeeking: null,\n    onSelect: null,\n    onShow: null,\n    onStalled: null,\n    onStorage: null,\n    onSubmit: null,\n    onSuspend: null,\n    onTimeUpdate: null,\n    onToggle: null,\n    onUnload: null,\n    onVolumeChange: null,\n    onWaiting: null,\n    onZoom: null,\n    opacity: null,\n    operator: null,\n    order: null,\n    orient: null,\n    orientation: null,\n    origin: null,\n    overflow: null,\n    overlay: null,\n    overlinePosition: number,\n    overlineThickness: number,\n    paintOrder: null,\n    panose1: null,\n    path: null,\n    pathLength: number,\n    patternContentUnits: null,\n    patternTransform: null,\n    patternUnits: null,\n    phase: null,\n    ping: spaceSeparated,\n    pitch: null,\n    playbackOrder: null,\n    pointerEvents: null,\n    points: null,\n    pointsAtX: number,\n    pointsAtY: number,\n    pointsAtZ: number,\n    preserveAlpha: null,\n    preserveAspectRatio: null,\n    primitiveUnits: null,\n    propagate: null,\n    property: commaOrSpaceSeparated,\n    r: null,\n    radius: null,\n    referrerPolicy: null,\n    refX: null,\n    refY: null,\n    rel: commaOrSpaceSeparated,\n    rev: commaOrSpaceSeparated,\n    renderingIntent: null,\n    repeatCount: null,\n    repeatDur: null,\n    requiredExtensions: commaOrSpaceSeparated,\n    requiredFeatures: commaOrSpaceSeparated,\n    requiredFonts: commaOrSpaceSeparated,\n    requiredFormats: commaOrSpaceSeparated,\n    resource: null,\n    restart: null,\n    result: null,\n    rotate: null,\n    rx: null,\n    ry: null,\n    scale: null,\n    seed: null,\n    shapeRendering: null,\n    side: null,\n    slope: null,\n    snapshotTime: null,\n    specularConstant: number,\n    specularExponent: number,\n    spreadMethod: null,\n    spacing: null,\n    startOffset: null,\n    stdDeviation: null,\n    stemh: null,\n    stemv: null,\n    stitchTiles: null,\n    stopColor: null,\n    stopOpacity: null,\n    strikethroughPosition: number,\n    strikethroughThickness: number,\n    string: null,\n    stroke: null,\n    strokeDashArray: commaOrSpaceSeparated,\n    strokeDashOffset: null,\n    strokeLineCap: null,\n    strokeLineJoin: null,\n    strokeMiterLimit: number,\n    strokeOpacity: number,\n    strokeWidth: null,\n    style: null,\n    surfaceScale: number,\n    syncBehavior: null,\n    syncBehaviorDefault: null,\n    syncMaster: null,\n    syncTolerance: null,\n    syncToleranceDefault: null,\n    systemLanguage: commaOrSpaceSeparated,\n    tabIndex: number,\n    tableValues: null,\n    target: null,\n    targetX: number,\n    targetY: number,\n    textAnchor: null,\n    textDecoration: null,\n    textRendering: null,\n    textLength: null,\n    timelineBegin: null,\n    title: null,\n    transformBehavior: null,\n    type: null,\n    typeOf: commaOrSpaceSeparated,\n    to: null,\n    transform: null,\n    transformOrigin: null,\n    u1: null,\n    u2: null,\n    underlinePosition: number,\n    underlineThickness: number,\n    unicode: null,\n    unicodeBidi: null,\n    unicodeRange: null,\n    unitsPerEm: number,\n    values: null,\n    vAlphabetic: number,\n    vMathematical: number,\n    vectorEffect: null,\n    vHanging: number,\n    vIdeographic: number,\n    version: null,\n    vertAdvY: number,\n    vertOriginX: number,\n    vertOriginY: number,\n    viewBox: null,\n    viewTarget: null,\n    visibility: null,\n    width: null,\n    widths: null,\n    wordSpacing: null,\n    writingMode: null,\n    x: null,\n    x1: null,\n    x2: null,\n    xChannelSelector: null,\n    xHeight: number,\n    y: null,\n    y1: null,\n    y2: null,\n    yChannelSelector: null,\n    z: null,\n    zoomAndPan: null\n  }\n})\n", "/**\n * @typedef {import('./util/schema.js').Schema} Schema\n */\n\nimport {normalize} from './normalize.js'\nimport {DefinedInfo} from './util/defined-info.js'\nimport {Info} from './util/info.js'\n\nconst valid = /^data[-\\w.:]+$/i\nconst dash = /-[a-z]/g\nconst cap = /[A-Z]/g\n\n/**\n * @param {Schema} schema\n * @param {string} value\n * @returns {Info}\n */\nexport function find(schema, value) {\n  const normal = normalize(value)\n  let prop = value\n  let Type = Info\n\n  if (normal in schema.normal) {\n    return schema.property[schema.normal[normal]]\n  }\n\n  if (normal.length > 4 && normal.slice(0, 4) === 'data' && valid.test(value)) {\n    // Attribute or property.\n    if (value.charAt(4) === '-') {\n      // Turn it into a property.\n      const rest = value.slice(5).replace(dash, camelcase)\n      prop = 'data' + rest.charAt(0).toUpperCase() + rest.slice(1)\n    } else {\n      // Turn it into an attribute.\n      const rest = value.slice(4)\n\n      if (!dash.test(rest)) {\n        let dashes = rest.replace(cap, kebab)\n\n        if (dashes.charAt(0) !== '-') {\n          dashes = '-' + dashes\n        }\n\n        value = 'data' + dashes\n      }\n    }\n\n    Type = DefinedInfo\n  }\n\n  return new Type(prop, value)\n}\n\n/**\n * @param {string} $0\n * @returns {string}\n */\nfunction kebab($0) {\n  return '-' + $0.toLowerCase()\n}\n\n/**\n * @param {string} $0\n * @returns {string}\n */\nfunction camelcase($0) {\n  return $0.charAt(1).toUpperCase()\n}\n", "/**\n * `hast` is close to `React`, but differs in a couple of cases.\n *\n * To get a React property from a hast property, check if it is in\n * `hastToReact`, if it is, then use the corresponding value,\n * otherwise, use the hast property.\n *\n * @type {Record<string, string>}\n */\nexport const hastToReact = {\n  classId: 'classID',\n  dataType: 'datatype',\n  itemId: 'itemID',\n  strokeDashArray: 'strokeDasharray',\n  strokeDashOffset: 'strokeDashoffset',\n  strokeLineCap: 'strokeLinecap',\n  strokeLineJoin: 'strokeLinejoin',\n  strokeMiterLimit: 'strokeMiterlimit',\n  typeOf: 'typeof',\n  xLinkActuate: 'xlinkActuate',\n  xLinkArcRole: 'xlinkArcrole',\n  xLinkHref: 'xlinkHref',\n  xLinkRole: 'xlinkRole',\n  xLinkShow: 'xlinkShow',\n  xLinkTitle: 'xlinkTitle',\n  xLinkType: 'xlinkType',\n  xmlnsXLink: 'xmlnsXlink'\n}\n", "/**\n * @typedef {import('./lib/util/info.js').Info} Info\n * @typedef {import('./lib/util/schema.js').Schema} Schema\n */\n\nimport {merge} from './lib/util/merge.js'\nimport {xlink} from './lib/xlink.js'\nimport {xml} from './lib/xml.js'\nimport {xmlns} from './lib/xmlns.js'\nimport {aria} from './lib/aria.js'\nimport {html as htmlBase} from './lib/html.js'\nimport {svg as svgBase} from './lib/svg.js'\n\nexport {find} from './lib/find.js'\nexport {hastToReact} from './lib/hast-to-react.js'\nexport {normalize} from './lib/normalize.js'\nexport const html = merge([xml, xlink, xmlns, aria, htmlBase], 'html')\nexport const svg = merge([xml, xlink, xmlns, aria, svgBase], 'svg')\n", "/**\n * Parse space-separated tokens to an array of strings.\n *\n * @param {string} value\n *   Space-separated tokens.\n * @returns {Array<string>}\n *   List of tokens.\n */\nexport function parse(value) {\n  const input = String(value || '').trim()\n  return input ? input.split(/[ \\t\\n\\r\\f]+/g) : []\n}\n\n/**\n * Serialize an array of strings as space separated-tokens.\n *\n * @param {Array<string|number>} values\n *   List of tokens.\n * @returns {string}\n *   Space-separated tokens.\n */\nexport function stringify(values) {\n  return values.join(' ').trim()\n}\n", "import StyleToObject from '../cjs/index.js';\n\n// ensure compatibility with rollup umd build\nexport default StyleToObject.default || StyleToObject;\n", "/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Point} Point\n * @typedef {import('unist').Position} Position\n */\n\n/**\n * @typedef NodeLike\n * @property {string} type\n * @property {PositionLike | null | undefined} [position]\n *\n * @typedef PositionLike\n * @property {PointLike | null | undefined} [start]\n * @property {PointLike | null | undefined} [end]\n *\n * @typedef PointLike\n * @property {number | null | undefined} [line]\n * @property {number | null | undefined} [column]\n * @property {number | null | undefined} [offset]\n */\n\n/**\n * Get the ending point of `node`.\n *\n * @param node\n *   Node.\n * @returns\n *   Point.\n */\nexport const pointEnd = point('end')\n\n/**\n * Get the starting point of `node`.\n *\n * @param node\n *   Node.\n * @returns\n *   Point.\n */\nexport const pointStart = point('start')\n\n/**\n * Get the positional info of `node`.\n *\n * @param {'end' | 'start'} type\n *   Side.\n * @returns\n *   Getter.\n */\nfunction point(type) {\n  return point\n\n  /**\n   * Get the point info of `node` at a bound side.\n   *\n   * @param {Node | NodeLike | null | undefined} [node]\n   * @returns {Point | undefined}\n   */\n  function point(node) {\n    const point = (node && node.position && node.position[type]) || {}\n\n    if (\n      typeof point.line === 'number' &&\n      point.line > 0 &&\n      typeof point.column === 'number' &&\n      point.column > 0\n    ) {\n      return {\n        line: point.line,\n        column: point.column,\n        offset:\n          typeof point.offset === 'number' && point.offset > -1\n            ? point.offset\n            : undefined\n      }\n    }\n  }\n}\n\n/**\n * Get the positional info of `node`.\n *\n * @param {Node | NodeLike | null | undefined} [node]\n *   Node.\n * @returns {Position | undefined}\n *   Position.\n */\nexport function position(node) {\n  const start = pointStart(node)\n  const end = pointEnd(node)\n\n  if (start && end) {\n    return {start, end}\n  }\n}\n", "/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Point} Point\n * @typedef {import('unist').Position} Position\n */\n\n/**\n * @typedef NodeLike\n * @property {string} type\n * @property {PositionLike | null | undefined} [position]\n *\n * @typedef PointLike\n * @property {number | null | undefined} [line]\n * @property {number | null | undefined} [column]\n * @property {number | null | undefined} [offset]\n *\n * @typedef PositionLike\n * @property {PointLike | null | undefined} [start]\n * @property {PointLike | null | undefined} [end]\n */\n\n/**\n * Serialize the positional info of a point, position (start and end points),\n * or node.\n *\n * @param {Node | NodeLike | Point | PointLike | Position | PositionLike | null | undefined} [value]\n *   Node, position, or point.\n * @returns {string}\n *   Pretty printed positional info of a node (`string`).\n *\n *   In the format of a range `ls:cs-le:ce` (when given `node` or `position`)\n *   or a point `l:c` (when given `point`), where `l` stands for line, `c` for\n *   column, `s` for `start`, and `e` for end.\n *   An empty string (`''`) is returned if the given value is neither `node`,\n *   `position`, nor `point`.\n */\nexport function stringifyPosition(value) {\n  // Nothing.\n  if (!value || typeof value !== 'object') {\n    return ''\n  }\n\n  // Node.\n  if ('position' in value || 'type' in value) {\n    return position(value.position)\n  }\n\n  // Position.\n  if ('start' in value || 'end' in value) {\n    return position(value)\n  }\n\n  // Point.\n  if ('line' in value || 'column' in value) {\n    return point(value)\n  }\n\n  // ?\n  return ''\n}\n\n/**\n * @param {Point | PointLike | null | undefined} point\n * @returns {string}\n */\nfunction point(point) {\n  return index(point && point.line) + ':' + index(point && point.column)\n}\n\n/**\n * @param {Position | PositionLike | null | undefined} pos\n * @returns {string}\n */\nfunction position(pos) {\n  return point(pos && pos.start) + '-' + point(pos && pos.end)\n}\n\n/**\n * @param {number | null | undefined} value\n * @returns {number}\n */\nfunction index(value) {\n  return value && typeof value === 'number' ? value : 1\n}\n", "/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Point} Point\n * @typedef {import('unist').Position} Position\n */\n\n/**\n * @typedef {object & {type: string, position?: Position | undefined}} NodeLike\n *\n * @typedef Options\n *   Configuration.\n * @property {Array<Node> | null | undefined} [ancestors]\n *   Stack of (inclusive) ancestor nodes surrounding the message (optional).\n * @property {Error | null | undefined} [cause]\n *   Original error cause of the message (optional).\n * @property {Point | Position | null | undefined} [place]\n *   Place of message (optional).\n * @property {string | null | undefined} [ruleId]\n *   Category of message (optional, example: `'my-rule'`).\n * @property {string | null | undefined} [source]\n *   Namespace of who sent the message (optional, example: `'my-package'`).\n */\n\nimport {stringifyPosition} from 'unist-util-stringify-position'\n\n/**\n * Message.\n */\nexport class VFileMessage extends Error {\n  /**\n   * Create a message for `reason`.\n   *\n   * > \uD83E\uDEA6 **Note**: also has obsolete signatures.\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Options | null | undefined} [options]\n   * @returns\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns\n   *\n   * @overload\n   * @param {string} reason\n   * @param {string | null | undefined} [origin]\n   * @returns\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {string | null | undefined} [origin]\n   * @returns\n   *\n   * @param {Error | VFileMessage | string} causeOrReason\n   *   Reason for message, should use markdown.\n   * @param {Node | NodeLike | Options | Point | Position | string | null | undefined} [optionsOrParentOrPlace]\n   *   Configuration (optional).\n   * @param {string | null | undefined} [origin]\n   *   Place in code where the message originates (example:\n   *   `'my-package:my-rule'` or `'my-rule'`).\n   * @returns\n   *   Instance of `VFileMessage`.\n   */\n  // eslint-disable-next-line complexity\n  constructor(causeOrReason, optionsOrParentOrPlace, origin) {\n    super()\n\n    if (typeof optionsOrParentOrPlace === 'string') {\n      origin = optionsOrParentOrPlace\n      optionsOrParentOrPlace = undefined\n    }\n\n    /** @type {string} */\n    let reason = ''\n    /** @type {Options} */\n    let options = {}\n    let legacyCause = false\n\n    if (optionsOrParentOrPlace) {\n      // Point.\n      if (\n        'line' in optionsOrParentOrPlace &&\n        'column' in optionsOrParentOrPlace\n      ) {\n        options = {place: optionsOrParentOrPlace}\n      }\n      // Position.\n      else if (\n        'start' in optionsOrParentOrPlace &&\n        'end' in optionsOrParentOrPlace\n      ) {\n        options = {place: optionsOrParentOrPlace}\n      }\n      // Node.\n      else if ('type' in optionsOrParentOrPlace) {\n        options = {\n          ancestors: [optionsOrParentOrPlace],\n          place: optionsOrParentOrPlace.position\n        }\n      }\n      // Options.\n      else {\n        options = {...optionsOrParentOrPlace}\n      }\n    }\n\n    if (typeof causeOrReason === 'string') {\n      reason = causeOrReason\n    }\n    // Error.\n    else if (!options.cause && causeOrReason) {\n      legacyCause = true\n      reason = causeOrReason.message\n      options.cause = causeOrReason\n    }\n\n    if (!options.ruleId && !options.source && typeof origin === 'string') {\n      const index = origin.indexOf(':')\n\n      if (index === -1) {\n        options.ruleId = origin\n      } else {\n        options.source = origin.slice(0, index)\n        options.ruleId = origin.slice(index + 1)\n      }\n    }\n\n    if (!options.place && options.ancestors && options.ancestors) {\n      const parent = options.ancestors[options.ancestors.length - 1]\n\n      if (parent) {\n        options.place = parent.position\n      }\n    }\n\n    const start =\n      options.place && 'start' in options.place\n        ? options.place.start\n        : options.place\n\n    /* eslint-disable no-unused-expressions */\n    /**\n     * Stack of ancestor nodes surrounding the message.\n     *\n     * @type {Array<Node> | undefined}\n     */\n    this.ancestors = options.ancestors || undefined\n\n    /**\n     * Original error cause of the message.\n     *\n     * @type {Error | undefined}\n     */\n    this.cause = options.cause || undefined\n\n    /**\n     * Starting column of message.\n     *\n     * @type {number | undefined}\n     */\n    this.column = start ? start.column : undefined\n\n    /**\n     * State of problem.\n     *\n     * * `true` \u2014 error, file not usable\n     * * `false` \u2014 warning, change may be needed\n     * * `undefined` \u2014 change likely not needed\n     *\n     * @type {boolean | null | undefined}\n     */\n    this.fatal = undefined\n\n    /**\n     * Path of a file (used throughout the `VFile` ecosystem).\n     *\n     * @type {string | undefined}\n     */\n    this.file\n\n    // Field from `Error`.\n    /**\n     * Reason for message.\n     *\n     * @type {string}\n     */\n    this.message = reason\n\n    /**\n     * Starting line of error.\n     *\n     * @type {number | undefined}\n     */\n    this.line = start ? start.line : undefined\n\n    // Field from `Error`.\n    /**\n     * Serialized positional info of message.\n     *\n     * On normal errors, this would be something like `ParseError`, buit in\n     * `VFile` messages we use this space to show where an error happened.\n     */\n    this.name = stringifyPosition(options.place) || '1:1'\n\n    /**\n     * Place of message.\n     *\n     * @type {Point | Position | undefined}\n     */\n    this.place = options.place || undefined\n\n    /**\n     * Reason for message, should use markdown.\n     *\n     * @type {string}\n     */\n    this.reason = this.message\n\n    /**\n     * Category of message (example: `'my-rule'`).\n     *\n     * @type {string | undefined}\n     */\n    this.ruleId = options.ruleId || undefined\n\n    /**\n     * Namespace of message (example: `'my-package'`).\n     *\n     * @type {string | undefined}\n     */\n    this.source = options.source || undefined\n\n    // Field from `Error`.\n    /**\n     * Stack of message.\n     *\n     * This is used by normal errors to show where something happened in\n     * programming code, irrelevant for `VFile` messages,\n     *\n     * @type {string}\n     */\n    this.stack =\n      legacyCause && options.cause && typeof options.cause.stack === 'string'\n        ? options.cause.stack\n        : ''\n\n    // The following fields are \u201Cwell known\u201D.\n    // Not standard.\n    // Feel free to add other non-standard fields to your messages.\n\n    /**\n     * Specify the source value that\u2019s being reported, which is deemed\n     * incorrect.\n     *\n     * @type {string | undefined}\n     */\n    this.actual\n\n    /**\n     * Suggest acceptable values that can be used instead of `actual`.\n     *\n     * @type {Array<string> | undefined}\n     */\n    this.expected\n\n    /**\n     * Long form description of the message (you should use markdown).\n     *\n     * @type {string | undefined}\n     */\n    this.note\n\n    /**\n     * Link to docs for the message.\n     *\n     * > \uD83D\uDC49 **Note**: this must be an absolute URL that can be passed as `x`\n     * > to `new URL(x)`.\n     *\n     * @type {string | undefined}\n     */\n    this.url\n    /* eslint-enable no-unused-expressions */\n  }\n}\n\nVFileMessage.prototype.file = ''\nVFileMessage.prototype.name = ''\nVFileMessage.prototype.reason = ''\nVFileMessage.prototype.message = ''\nVFileMessage.prototype.stack = ''\nVFileMessage.prototype.column = undefined\nVFileMessage.prototype.line = undefined\nVFileMessage.prototype.ancestors = undefined\nVFileMessage.prototype.cause = undefined\nVFileMessage.prototype.fatal = undefined\nVFileMessage.prototype.place = undefined\nVFileMessage.prototype.ruleId = undefined\nVFileMessage.prototype.source = undefined\n", "/**\n * @import {Identifier, Literal, MemberExpression} from 'estree'\n * @import {Jsx, JsxDev, Options, Props} from 'hast-util-to-jsx-runtime'\n * @import {Element, Nodes, Parents, Root, Text} from 'hast'\n * @import {MdxFlowExpressionHast, MdxTextExpressionHast} from 'mdast-util-mdx-expression'\n * @import {MdxJsxFlowElementHast, MdxJsxTextElementHast} from 'mdast-util-mdx-jsx'\n * @import {MdxjsEsmHast} from 'mdast-util-mdxjs-esm'\n * @import {Position} from 'unist'\n * @import {Child, Create, Field, State, Style} from './types.js'\n */\n\nimport {stringify as commas} from 'comma-separated-tokens'\nimport {ok as assert} from 'devlop'\nimport {name as isIdentifierName} from 'estree-util-is-identifier-name'\nimport {whitespace} from 'hast-util-whitespace'\nimport {find, hastToReact, html, svg} from 'property-information'\nimport {stringify as spaces} from 'space-separated-tokens'\nimport styleToObject from 'style-to-object'\nimport {pointStart} from 'unist-util-position'\nimport {VFileMessage} from 'vfile-message'\n\n// To do: next major: `Object.hasOwn`.\nconst own = {}.hasOwnProperty\n\n/** @type {Map<string, number>} */\nconst emptyMap = new Map()\n\nconst cap = /[A-Z]/g\nconst dashSomething = /-([a-z])/g\n\n// `react-dom` triggers a warning for *any* white space in tables.\n// To follow GFM, `mdast-util-to-hast` injects line endings between elements.\n// Other tools might do so too, but they don\u2019t do here, so we remove all of\n// that.\n\n// See: <https://github.com/facebook/react/pull/7081>.\n// See: <https://github.com/facebook/react/pull/7515>.\n// See: <https://github.com/remarkjs/remark-react/issues/64>.\n// See: <https://github.com/rehypejs/rehype-react/pull/29>.\n// See: <https://github.com/rehypejs/rehype-react/pull/32>.\n// See: <https://github.com/rehypejs/rehype-react/pull/45>.\nconst tableElements = new Set(['table', 'tbody', 'thead', 'tfoot', 'tr'])\n\nconst tableCellElement = new Set(['td', 'th'])\n\nconst docs = 'https://github.com/syntax-tree/hast-util-to-jsx-runtime'\n\n/**\n * Transform a hast tree to preact, react, solid, svelte, vue, etc.,\n * with an automatic JSX runtime.\n *\n * @param {Nodes} tree\n *   Tree to transform.\n * @param {Options} options\n *   Configuration (required).\n * @returns {JSX.Element}\n *   JSX element.\n */\n\nexport function toJsxRuntime(tree, options) {\n  if (!options || options.Fragment === undefined) {\n    throw new TypeError('Expected `Fragment` in options')\n  }\n\n  const filePath = options.filePath || undefined\n  /** @type {Create} */\n  let create\n\n  if (options.development) {\n    if (typeof options.jsxDEV !== 'function') {\n      throw new TypeError(\n        'Expected `jsxDEV` in options when `development: true`'\n      )\n    }\n\n    create = developmentCreate(filePath, options.jsxDEV)\n  } else {\n    if (typeof options.jsx !== 'function') {\n      throw new TypeError('Expected `jsx` in production options')\n    }\n\n    if (typeof options.jsxs !== 'function') {\n      throw new TypeError('Expected `jsxs` in production options')\n    }\n\n    create = productionCreate(filePath, options.jsx, options.jsxs)\n  }\n\n  /** @type {State} */\n  const state = {\n    Fragment: options.Fragment,\n    ancestors: [],\n    components: options.components || {},\n    create,\n    elementAttributeNameCase: options.elementAttributeNameCase || 'react',\n    evaluater: options.createEvaluater ? options.createEvaluater() : undefined,\n    filePath,\n    ignoreInvalidStyle: options.ignoreInvalidStyle || false,\n    passKeys: options.passKeys !== false,\n    passNode: options.passNode || false,\n    schema: options.space === 'svg' ? svg : html,\n    stylePropertyNameCase: options.stylePropertyNameCase || 'dom',\n    tableCellAlignToStyle: options.tableCellAlignToStyle !== false\n  }\n\n  const result = one(state, tree, undefined)\n\n  // JSX element.\n  if (result && typeof result !== 'string') {\n    return result\n  }\n\n  // Text node or something that turned into nothing.\n  return state.create(\n    tree,\n    state.Fragment,\n    {children: result || undefined},\n    undefined\n  )\n}\n\n/**\n * Transform a node.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Nodes} node\n *   Current node.\n * @param {string | undefined} key\n *   Key.\n * @returns {Child | undefined}\n *   Child, optional.\n */\nfunction one(state, node, key) {\n  if (node.type === 'element') {\n    return element(state, node, key)\n  }\n\n  if (node.type === 'mdxFlowExpression' || node.type === 'mdxTextExpression') {\n    return mdxExpression(state, node)\n  }\n\n  if (node.type === 'mdxJsxFlowElement' || node.type === 'mdxJsxTextElement') {\n    return mdxJsxElement(state, node, key)\n  }\n\n  if (node.type === 'mdxjsEsm') {\n    return mdxEsm(state, node)\n  }\n\n  if (node.type === 'root') {\n    return root(state, node, key)\n  }\n\n  if (node.type === 'text') {\n    return text(state, node)\n  }\n}\n\n/**\n * Handle element.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Element} node\n *   Current node.\n * @param {string | undefined} key\n *   Key.\n * @returns {Child | undefined}\n *   Child, optional.\n */\nfunction element(state, node, key) {\n  const parentSchema = state.schema\n  let schema = parentSchema\n\n  if (node.tagName.toLowerCase() === 'svg' && parentSchema.space === 'html') {\n    schema = svg\n    state.schema = schema\n  }\n\n  state.ancestors.push(node)\n\n  const type = findComponentFromName(state, node.tagName, false)\n  const props = createElementProps(state, node)\n  let children = createChildren(state, node)\n\n  if (tableElements.has(node.tagName)) {\n    children = children.filter(function (child) {\n      return typeof child === 'string' ? !whitespace(child) : true\n    })\n  }\n\n  addNode(state, props, type, node)\n  addChildren(props, children)\n\n  // Restore.\n  state.ancestors.pop()\n  state.schema = parentSchema\n\n  return state.create(node, type, props, key)\n}\n\n/**\n * Handle MDX expression.\n *\n * @param {State} state\n *   Info passed around.\n * @param {MdxFlowExpressionHast | MdxTextExpressionHast} node\n *   Current node.\n * @returns {Child | undefined}\n *   Child, optional.\n */\nfunction mdxExpression(state, node) {\n  if (node.data && node.data.estree && state.evaluater) {\n    const program = node.data.estree\n    const expression = program.body[0]\n    assert(expression.type === 'ExpressionStatement')\n\n    // Assume result is a child.\n    return /** @type {Child | undefined} */ (\n      state.evaluater.evaluateExpression(expression.expression)\n    )\n  }\n\n  crashEstree(state, node.position)\n}\n\n/**\n * Handle MDX ESM.\n *\n * @param {State} state\n *   Info passed around.\n * @param {MdxjsEsmHast} node\n *   Current node.\n * @returns {Child | undefined}\n *   Child, optional.\n */\nfunction mdxEsm(state, node) {\n  if (node.data && node.data.estree && state.evaluater) {\n    // Assume result is a child.\n    return /** @type {Child | undefined} */ (\n      state.evaluater.evaluateProgram(node.data.estree)\n    )\n  }\n\n  crashEstree(state, node.position)\n}\n\n/**\n * Handle MDX JSX.\n *\n * @param {State} state\n *   Info passed around.\n * @param {MdxJsxFlowElementHast | MdxJsxTextElementHast} node\n *   Current node.\n * @param {string | undefined} key\n *   Key.\n * @returns {Child | undefined}\n *   Child, optional.\n */\nfunction mdxJsxElement(state, node, key) {\n  const parentSchema = state.schema\n  let schema = parentSchema\n\n  if (node.name === 'svg' && parentSchema.space === 'html') {\n    schema = svg\n    state.schema = schema\n  }\n\n  state.ancestors.push(node)\n\n  const type =\n    node.name === null\n      ? state.Fragment\n      : findComponentFromName(state, node.name, true)\n  const props = createJsxElementProps(state, node)\n  const children = createChildren(state, node)\n\n  addNode(state, props, type, node)\n  addChildren(props, children)\n\n  // Restore.\n  state.ancestors.pop()\n  state.schema = parentSchema\n\n  return state.create(node, type, props, key)\n}\n\n/**\n * Handle root.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Root} node\n *   Current node.\n * @param {string | undefined} key\n *   Key.\n * @returns {Child | undefined}\n *   Child, optional.\n */\nfunction root(state, node, key) {\n  /** @type {Props} */\n  const props = {}\n\n  addChildren(props, createChildren(state, node))\n\n  return state.create(node, state.Fragment, props, key)\n}\n\n/**\n * Handle text.\n *\n * @param {State} _\n *   Info passed around.\n * @param {Text} node\n *   Current node.\n * @returns {Child | undefined}\n *   Child, optional.\n */\nfunction text(_, node) {\n  return node.value\n}\n\n/**\n * Add `node` to props.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Props} props\n *   Props.\n * @param {unknown} type\n *   Type.\n * @param {Element | MdxJsxFlowElementHast | MdxJsxTextElementHast} node\n *   Node.\n * @returns {undefined}\n *   Nothing.\n */\nfunction addNode(state, props, type, node) {\n  // If this is swapped out for a component:\n  if (typeof type !== 'string' && type !== state.Fragment && state.passNode) {\n    props.node = node\n  }\n}\n\n/**\n * Add children to props.\n *\n * @param {Props} props\n *   Props.\n * @param {Array<Child>} children\n *   Children.\n * @returns {undefined}\n *   Nothing.\n */\nfunction addChildren(props, children) {\n  if (children.length > 0) {\n    const value = children.length > 1 ? children : children[0]\n\n    if (value) {\n      props.children = value\n    }\n  }\n}\n\n/**\n * @param {string | undefined} _\n *   Path to file.\n * @param {Jsx} jsx\n *   Dynamic.\n * @param {Jsx} jsxs\n *   Static.\n * @returns {Create}\n *   Create a production element.\n */\nfunction productionCreate(_, jsx, jsxs) {\n  return create\n  /** @type {Create} */\n  function create(_, type, props, key) {\n    // Only an array when there are 2 or more children.\n    const isStaticChildren = Array.isArray(props.children)\n    const fn = isStaticChildren ? jsxs : jsx\n    return key ? fn(type, props, key) : fn(type, props)\n  }\n}\n\n/**\n * @param {string | undefined} filePath\n *   Path to file.\n * @param {JsxDev} jsxDEV\n *   Development.\n * @returns {Create}\n *   Create a development element.\n */\nfunction developmentCreate(filePath, jsxDEV) {\n  return create\n  /** @type {Create} */\n  function create(node, type, props, key) {\n    // Only an array when there are 2 or more children.\n    const isStaticChildren = Array.isArray(props.children)\n    const point = pointStart(node)\n    return jsxDEV(\n      type,\n      props,\n      key,\n      isStaticChildren,\n      {\n        columnNumber: point ? point.column - 1 : undefined,\n        fileName: filePath,\n        lineNumber: point ? point.line : undefined\n      },\n      undefined\n    )\n  }\n}\n\n/**\n * Create props from an element.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Element} node\n *   Current element.\n * @returns {Props}\n *   Props.\n */\nfunction createElementProps(state, node) {\n  /** @type {Props} */\n  const props = {}\n  /** @type {string | undefined} */\n  let alignValue\n  /** @type {string} */\n  let prop\n\n  for (prop in node.properties) {\n    if (prop !== 'children' && own.call(node.properties, prop)) {\n      const result = createProperty(state, prop, node.properties[prop])\n\n      if (result) {\n        const [key, value] = result\n\n        if (\n          state.tableCellAlignToStyle &&\n          key === 'align' &&\n          typeof value === 'string' &&\n          tableCellElement.has(node.tagName)\n        ) {\n          alignValue = value\n        } else {\n          props[key] = value\n        }\n      }\n    }\n  }\n\n  if (alignValue) {\n    // Assume style is an object.\n    const style = /** @type {Style} */ (props.style || (props.style = {}))\n    style[state.stylePropertyNameCase === 'css' ? 'text-align' : 'textAlign'] =\n      alignValue\n  }\n\n  return props\n}\n\n/**\n * Create props from a JSX element.\n *\n * @param {State} state\n *   Info passed around.\n * @param {MdxJsxFlowElementHast | MdxJsxTextElementHast} node\n *   Current JSX element.\n * @returns {Props}\n *   Props.\n */\nfunction createJsxElementProps(state, node) {\n  /** @type {Props} */\n  const props = {}\n\n  for (const attribute of node.attributes) {\n    if (attribute.type === 'mdxJsxExpressionAttribute') {\n      if (attribute.data && attribute.data.estree && state.evaluater) {\n        const program = attribute.data.estree\n        const expression = program.body[0]\n        assert(expression.type === 'ExpressionStatement')\n        const objectExpression = expression.expression\n        assert(objectExpression.type === 'ObjectExpression')\n        const property = objectExpression.properties[0]\n        assert(property.type === 'SpreadElement')\n\n        Object.assign(\n          props,\n          state.evaluater.evaluateExpression(property.argument)\n        )\n      } else {\n        crashEstree(state, node.position)\n      }\n    } else {\n      // For JSX, the author is responsible of passing in the correct values.\n      const name = attribute.name\n      /** @type {unknown} */\n      let value\n\n      if (attribute.value && typeof attribute.value === 'object') {\n        if (\n          attribute.value.data &&\n          attribute.value.data.estree &&\n          state.evaluater\n        ) {\n          const program = attribute.value.data.estree\n          const expression = program.body[0]\n          assert(expression.type === 'ExpressionStatement')\n          value = state.evaluater.evaluateExpression(expression.expression)\n        } else {\n          crashEstree(state, node.position)\n        }\n      } else {\n        value = attribute.value === null ? true : attribute.value\n      }\n\n      // Assume a prop.\n      props[name] = /** @type {Props[keyof Props]} */ (value)\n    }\n  }\n\n  return props\n}\n\n/**\n * Create children.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Parents} node\n *   Current element.\n * @returns {Array<Child>}\n *   Children.\n */\nfunction createChildren(state, node) {\n  /** @type {Array<Child>} */\n  const children = []\n  let index = -1\n  /** @type {Map<string, number>} */\n  // Note: test this when Solid doesn\u2019t want to merge my upcoming PR.\n  /* c8 ignore next */\n  const countsByName = state.passKeys ? new Map() : emptyMap\n\n  while (++index < node.children.length) {\n    const child = node.children[index]\n    /** @type {string | undefined} */\n    let key\n\n    if (state.passKeys) {\n      const name =\n        child.type === 'element'\n          ? child.tagName\n          : child.type === 'mdxJsxFlowElement' ||\n              child.type === 'mdxJsxTextElement'\n            ? child.name\n            : undefined\n\n      if (name) {\n        const count = countsByName.get(name) || 0\n        key = name + '-' + count\n        countsByName.set(name, count + 1)\n      }\n    }\n\n    const result = one(state, child, key)\n    if (result !== undefined) children.push(result)\n  }\n\n  return children\n}\n\n/**\n * Handle a property.\n *\n * @param {State} state\n *   Info passed around.\n * @param {string} prop\n *   Key.\n * @param {Array<number | string> | boolean | number | string | null | undefined} value\n *   hast property value.\n * @returns {Field | undefined}\n *   Field for runtime, optional.\n */\nfunction createProperty(state, prop, value) {\n  const info = find(state.schema, prop)\n\n  // Ignore nullish and `NaN` values.\n  if (\n    value === null ||\n    value === undefined ||\n    (typeof value === 'number' && Number.isNaN(value))\n  ) {\n    return\n  }\n\n  if (Array.isArray(value)) {\n    // Accept `array`.\n    // Most props are space-separated.\n    value = info.commaSeparated ? commas(value) : spaces(value)\n  }\n\n  // React only accepts `style` as object.\n  if (info.property === 'style') {\n    let styleObject =\n      typeof value === 'object' ? value : parseStyle(state, String(value))\n\n    if (state.stylePropertyNameCase === 'css') {\n      styleObject = transformStylesToCssCasing(styleObject)\n    }\n\n    return ['style', styleObject]\n  }\n\n  return [\n    state.elementAttributeNameCase === 'react' && info.space\n      ? hastToReact[info.property] || info.property\n      : info.attribute,\n    value\n  ]\n}\n\n/**\n * Parse a CSS declaration to an object.\n *\n * @param {State} state\n *   Info passed around.\n * @param {string} value\n *   CSS declarations.\n * @returns {Style}\n *   Properties.\n * @throws\n *   Throws `VFileMessage` when CSS cannot be parsed.\n */\nfunction parseStyle(state, value) {\n  /** @type {Style} */\n  const result = {}\n\n  try {\n    styleToObject(value, replacer)\n  } catch (error) {\n    if (!state.ignoreInvalidStyle) {\n      const cause = /** @type {Error} */ (error)\n      const message = new VFileMessage('Cannot parse `style` attribute', {\n        ancestors: state.ancestors,\n        cause,\n        ruleId: 'style',\n        source: 'hast-util-to-jsx-runtime'\n      })\n      message.file = state.filePath || undefined\n      message.url = docs + '#cannot-parse-style-attribute'\n\n      throw message\n    }\n  }\n\n  return result\n\n  /**\n   * Add a CSS property (normal, so with dashes) to `result` as a DOM CSS\n   * property.\n   *\n   * @param {string} name\n   *   Key.\n   * @param {string} value\n   *   Value\n   * @returns {undefined}\n   *   Nothing.\n   */\n  function replacer(name, value) {\n    let key = name\n\n    if (key.slice(0, 2) !== '--') {\n      if (key.slice(0, 4) === '-ms-') key = 'ms-' + key.slice(4)\n      key = key.replace(dashSomething, toCamel)\n    }\n\n    result[key] = value\n  }\n}\n\n/**\n * Create a JSX name from a string.\n *\n * @param {State} state\n *   To do.\n * @param {string} name\n *   Name.\n * @param {boolean} allowExpression\n *   Allow member expressions and identifiers.\n * @returns {unknown}\n *   To do.\n */\nfunction findComponentFromName(state, name, allowExpression) {\n  /** @type {Identifier | Literal | MemberExpression} */\n  let result\n\n  if (!allowExpression) {\n    result = {type: 'Literal', value: name}\n  } else if (name.includes('.')) {\n    const identifiers = name.split('.')\n    let index = -1\n    /** @type {Identifier | Literal | MemberExpression | undefined} */\n    let node\n\n    while (++index < identifiers.length) {\n      /** @type {Identifier | Literal} */\n      const prop = isIdentifierName(identifiers[index])\n        ? {type: 'Identifier', name: identifiers[index]}\n        : {type: 'Literal', value: identifiers[index]}\n      node = node\n        ? {\n            type: 'MemberExpression',\n            object: node,\n            property: prop,\n            computed: Boolean(index && prop.type === 'Literal'),\n            optional: false\n          }\n        : prop\n    }\n\n    assert(node, 'always a result')\n    result = node\n  } else {\n    result =\n      isIdentifierName(name) && !/^[a-z]/.test(name)\n        ? {type: 'Identifier', name}\n        : {type: 'Literal', value: name}\n  }\n\n  // Only literals can be passed in `components` currently.\n  // No identifiers / member expressions.\n  if (result.type === 'Literal') {\n    const name = /** @type {keyof JSX.IntrinsicElements} */ (result.value)\n\n    return own.call(state.components, name) ? state.components[name] : name\n  }\n\n  // Assume component.\n  if (state.evaluater) {\n    return state.evaluater.evaluateExpression(result)\n  }\n\n  crashEstree(state)\n}\n\n/**\n * @param {State} state\n * @param {Position | undefined} [place]\n * @returns {never}\n */\nfunction crashEstree(state, place) {\n  const message = new VFileMessage(\n    'Cannot handle MDX estrees without `createEvaluater`',\n    {\n      ancestors: state.ancestors,\n      place,\n      ruleId: 'mdx-estree',\n      source: 'hast-util-to-jsx-runtime'\n    }\n  )\n  message.file = state.filePath || undefined\n  message.url = docs + '#cannot-handle-mdx-estrees-without-createevaluater'\n\n  throw message\n}\n\n/**\n * Transform a DOM casing style object to a CSS casing style object.\n *\n * @param {Style} domCasing\n * @returns {Style}\n */\nfunction transformStylesToCssCasing(domCasing) {\n  /** @type {Style} */\n  const cssCasing = {}\n  /** @type {string} */\n  let from\n\n  for (from in domCasing) {\n    if (own.call(domCasing, from)) {\n      cssCasing[transformStyleToCssCasing(from)] = domCasing[from]\n    }\n  }\n\n  return cssCasing\n}\n\n/**\n * Transform a DOM casing style field to a CSS casing style field.\n *\n * @param {string} from\n * @returns {string}\n */\nfunction transformStyleToCssCasing(from) {\n  let to = from.replace(cap, toDash)\n  // Handle `ms-xxx` -> `-ms-xxx`.\n  if (to.slice(0, 3) === 'ms-') to = '-' + to\n  return to\n}\n\n/**\n * Make `$1` capitalized.\n *\n * @param {string} _\n *   Whatever.\n * @param {string} $1\n *   Single ASCII alphabetical.\n * @returns {string}\n *   Capitalized `$1`.\n */\nfunction toCamel(_, $1) {\n  return $1.toUpperCase()\n}\n\n/**\n * Make `$0` dash cased.\n *\n * @param {string} $0\n *   Capitalized ASCII leter.\n * @returns {string}\n *   Dash and lower letter.\n */\nfunction toDash($0) {\n  return '-' + $0.toLowerCase()\n}\n", "/**\n * HTML URL properties.\n *\n * Each key is a property name and each value is a list of tag names it applies\n * to or `null` if it applies to all elements.\n *\n * @type {Record<string, Array<string> | null>}\n */\nexport const urlAttributes = {\n  action: ['form'],\n  cite: ['blockquote', 'del', 'ins', 'q'],\n  data: ['object'],\n  formAction: ['button', 'input'],\n  href: ['a', 'area', 'base', 'link'],\n  icon: ['menuitem'],\n  itemId: null,\n  manifest: ['html'],\n  ping: ['a', 'area'],\n  poster: ['video'],\n  src: [\n    'audio',\n    'embed',\n    'iframe',\n    'img',\n    'input',\n    'script',\n    'source',\n    'track',\n    'video'\n  ]\n}\n", "/**\n * @import {Element, ElementContent, Nodes, Parents, Root} from 'hast'\n * @import {ComponentProps, ElementType, ReactElement} from 'react'\n * @import {Options as RemarkRehypeOptions} from 'remark-rehype'\n * @import {BuildVisitor} from 'unist-util-visit'\n * @import {PluggableList} from 'unified'\n */\n\n/**\n * @callback AllowElement\n *   Filter elements.\n * @param {Readonly<Element>} element\n *   Element to check.\n * @param {number} index\n *   Index of `element` in `parent`.\n * @param {Readonly<Parents> | undefined} parent\n *   Parent of `element`.\n * @returns {boolean | null | undefined}\n *   Whether to allow `element` (default: `false`).\n */\n\n/**\n * @typedef ExtraProps\n *   Extra fields we pass.\n * @property {Element | undefined} [node]\n *   passed when `passNode` is on.\n */\n\n/**\n * @typedef {{\n *   [Key in Extract<ElementType, string>]?: ElementType<ComponentProps<Key> & ExtraProps>\n * }} Components\n *   Map tag names to components.\n */\n\n/**\n * @typedef Deprecation\n *   Deprecation.\n * @property {string} from\n *   Old field.\n * @property {string} id\n *   ID in readme.\n * @property {keyof Options} [to]\n *   New field.\n */\n\n/**\n * @typedef Options\n *   Configuration.\n * @property {AllowElement | null | undefined} [allowElement]\n *   Filter elements (optional);\n *   `allowedElements` / `disallowedElements` is used first.\n * @property {ReadonlyArray<string> | null | undefined} [allowedElements]\n *   Tag names to allow (default: all tag names);\n *   cannot combine w/ `disallowedElements`.\n * @property {string | null | undefined} [children]\n *   Markdown.\n * @property {string | null | undefined} [className]\n *   Wrap in a `div` with this class name.\n * @property {Components | null | undefined} [components]\n *   Map tag names to components.\n * @property {ReadonlyArray<string> | null | undefined} [disallowedElements]\n *   Tag names to disallow (default: `[]`);\n *   cannot combine w/ `allowedElements`.\n * @property {PluggableList | null | undefined} [rehypePlugins]\n *   List of rehype plugins to use.\n * @property {PluggableList | null | undefined} [remarkPlugins]\n *   List of remark plugins to use.\n * @property {Readonly<RemarkRehypeOptions> | null | undefined} [remarkRehypeOptions]\n *   Options to pass through to `remark-rehype`.\n * @property {boolean | null | undefined} [skipHtml=false]\n *   Ignore HTML in markdown completely (default: `false`).\n * @property {boolean | null | undefined} [unwrapDisallowed=false]\n *   Extract (unwrap) what\u2019s in disallowed elements (default: `false`);\n *   normally when say `strong` is not allowed, it and it\u2019s children are dropped,\n *   with `unwrapDisallowed` the element itself is replaced by its children.\n * @property {UrlTransform | null | undefined} [urlTransform]\n *   Change URLs (default: `defaultUrlTransform`)\n */\n\n/**\n * @callback UrlTransform\n *   Transform all URLs.\n * @param {string} url\n *   URL.\n * @param {string} key\n *   Property name (example: `'href'`).\n * @param {Readonly<Element>} node\n *   Node.\n * @returns {string | null | undefined}\n *   Transformed URL (optional).\n */\n\nimport {unreachable} from 'devlop'\nimport {toJsxRuntime} from 'hast-util-to-jsx-runtime'\nimport {urlAttributes} from 'html-url-attributes'\nimport {Fragment, jsx, jsxs} from 'react/jsx-runtime'\nimport remarkParse from 'remark-parse'\nimport remarkRehype from 'remark-rehype'\nimport {unified} from 'unified'\nimport {visit} from 'unist-util-visit'\nimport {VFile} from 'vfile'\n\nconst changelog =\n  'https://github.com/remarkjs/react-markdown/blob/main/changelog.md'\n\n/** @type {PluggableList} */\nconst emptyPlugins = []\n/** @type {Readonly<RemarkRehypeOptions>} */\nconst emptyRemarkRehypeOptions = {allowDangerousHtml: true}\nconst safeProtocol = /^(https?|ircs?|mailto|xmpp)$/i\n\n// Mutable because we `delete` any time it\u2019s used and a message is sent.\n/** @type {ReadonlyArray<Readonly<Deprecation>>} */\nconst deprecations = [\n  {from: 'astPlugins', id: 'remove-buggy-html-in-markdown-parser'},\n  {from: 'allowDangerousHtml', id: 'remove-buggy-html-in-markdown-parser'},\n  {\n    from: 'allowNode',\n    id: 'replace-allownode-allowedtypes-and-disallowedtypes',\n    to: 'allowElement'\n  },\n  {\n    from: 'allowedTypes',\n    id: 'replace-allownode-allowedtypes-and-disallowedtypes',\n    to: 'allowedElements'\n  },\n  {\n    from: 'disallowedTypes',\n    id: 'replace-allownode-allowedtypes-and-disallowedtypes',\n    to: 'disallowedElements'\n  },\n  {from: 'escapeHtml', id: 'remove-buggy-html-in-markdown-parser'},\n  {from: 'includeElementIndex', id: '#remove-includeelementindex'},\n  {\n    from: 'includeNodeIndex',\n    id: 'change-includenodeindex-to-includeelementindex'\n  },\n  {from: 'linkTarget', id: 'remove-linktarget'},\n  {from: 'plugins', id: 'change-plugins-to-remarkplugins', to: 'remarkPlugins'},\n  {from: 'rawSourcePos', id: '#remove-rawsourcepos'},\n  {from: 'renderers', id: 'change-renderers-to-components', to: 'components'},\n  {from: 'source', id: 'change-source-to-children', to: 'children'},\n  {from: 'sourcePos', id: '#remove-sourcepos'},\n  {from: 'transformImageUri', id: '#add-urltransform', to: 'urlTransform'},\n  {from: 'transformLinkUri', id: '#add-urltransform', to: 'urlTransform'}\n]\n\n/**\n * Component to render markdown.\n *\n * @param {Readonly<Options>} options\n *   Props.\n * @returns {ReactElement}\n *   React element.\n */\nexport function Markdown(options) {\n  const allowedElements = options.allowedElements\n  const allowElement = options.allowElement\n  const children = options.children || ''\n  const className = options.className\n  const components = options.components\n  const disallowedElements = options.disallowedElements\n  const rehypePlugins = options.rehypePlugins || emptyPlugins\n  const remarkPlugins = options.remarkPlugins || emptyPlugins\n  const remarkRehypeOptions = options.remarkRehypeOptions\n    ? {...options.remarkRehypeOptions, ...emptyRemarkRehypeOptions}\n    : emptyRemarkRehypeOptions\n  const skipHtml = options.skipHtml\n  const unwrapDisallowed = options.unwrapDisallowed\n  const urlTransform = options.urlTransform || defaultUrlTransform\n\n  const processor = unified()\n    .use(remarkParse)\n    .use(remarkPlugins)\n    .use(remarkRehype, remarkRehypeOptions)\n    .use(rehypePlugins)\n\n  const file = new VFile()\n\n  if (typeof children === 'string') {\n    file.value = children\n  } else {\n    unreachable(\n      'Unexpected value `' +\n        children +\n        '` for `children` prop, expected `string`'\n    )\n  }\n\n  if (allowedElements && disallowedElements) {\n    unreachable(\n      'Unexpected combined `allowedElements` and `disallowedElements`, expected one or the other'\n    )\n  }\n\n  for (const deprecation of deprecations) {\n    if (Object.hasOwn(options, deprecation.from)) {\n      unreachable(\n        'Unexpected `' +\n          deprecation.from +\n          '` prop, ' +\n          (deprecation.to\n            ? 'use `' + deprecation.to + '` instead'\n            : 'remove it') +\n          ' (see <' +\n          changelog +\n          '#' +\n          deprecation.id +\n          '> for more info)'\n      )\n    }\n  }\n\n  const mdastTree = processor.parse(file)\n  /** @type {Nodes} */\n  let hastTree = processor.runSync(mdastTree, file)\n\n  // Wrap in `div` if there\u2019s a class name.\n  if (className) {\n    hastTree = {\n      type: 'element',\n      tagName: 'div',\n      properties: {className},\n      // Assume no doctypes.\n      children: /** @type {Array<ElementContent>} */ (\n        hastTree.type === 'root' ? hastTree.children : [hastTree]\n      )\n    }\n  }\n\n  visit(hastTree, transform)\n\n  return toJsxRuntime(hastTree, {\n    Fragment,\n    // @ts-expect-error\n    // React components are allowed to return numbers,\n    // but not according to the types in hast-util-to-jsx-runtime\n    components,\n    ignoreInvalidStyle: true,\n    jsx,\n    jsxs,\n    passKeys: true,\n    passNode: true\n  })\n\n  /** @type {BuildVisitor<Root>} */\n  function transform(node, index, parent) {\n    if (node.type === 'raw' && parent && typeof index === 'number') {\n      if (skipHtml) {\n        parent.children.splice(index, 1)\n      } else {\n        parent.children[index] = {type: 'text', value: node.value}\n      }\n\n      return index\n    }\n\n    if (node.type === 'element') {\n      /** @type {string} */\n      let key\n\n      for (key in urlAttributes) {\n        if (\n          Object.hasOwn(urlAttributes, key) &&\n          Object.hasOwn(node.properties, key)\n        ) {\n          const value = node.properties[key]\n          const test = urlAttributes[key]\n          if (test === null || test.includes(node.tagName)) {\n            node.properties[key] = urlTransform(String(value || ''), key, node)\n          }\n        }\n      }\n    }\n\n    if (node.type === 'element') {\n      let remove = allowedElements\n        ? !allowedElements.includes(node.tagName)\n        : disallowedElements\n          ? disallowedElements.includes(node.tagName)\n          : false\n\n      if (!remove && allowElement && typeof index === 'number') {\n        remove = !allowElement(node, index, parent)\n      }\n\n      if (remove && parent && typeof index === 'number') {\n        if (unwrapDisallowed && node.children) {\n          parent.children.splice(index, 1, ...node.children)\n        } else {\n          parent.children.splice(index, 1)\n        }\n\n        return index\n      }\n    }\n  }\n}\n\n/**\n * Make a URL safe.\n *\n * @satisfies {UrlTransform}\n * @param {string} value\n *   URL.\n * @returns {string}\n *   Safe URL.\n */\nexport function defaultUrlTransform(value) {\n  // Same as:\n  // <https://github.com/micromark/micromark/blob/929275e/packages/micromark-util-sanitize-uri/dev/index.js#L34>\n  // But without the `encode` part.\n  const colon = value.indexOf(':')\n  const questionMark = value.indexOf('?')\n  const numberSign = value.indexOf('#')\n  const slash = value.indexOf('/')\n\n  if (\n    // If there is no protocol, it\u2019s relative.\n    colon === -1 ||\n    // If the first colon is after a `?`, `#`, or `/`, it\u2019s not a protocol.\n    (slash !== -1 && colon > slash) ||\n    (questionMark !== -1 && colon > questionMark) ||\n    (numberSign !== -1 && colon > numberSign) ||\n    // It is a protocol, it should be allowed.\n    safeProtocol.test(value.slice(0, colon))\n  ) {\n    return value\n  }\n\n  return ''\n}\n", "/**\n * @typedef {import('mdast').Nodes} Nodes\n *\n * @typedef Options\n *   Configuration (optional).\n * @property {boolean | null | undefined} [includeImageAlt=true]\n *   Whether to use `alt` for `image`s (default: `true`).\n * @property {boolean | null | undefined} [includeHtml=true]\n *   Whether to use `value` of HTML (default: `true`).\n */\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Get the text content of a node or list of nodes.\n *\n * Prefers the node\u2019s plain-text fields, otherwise serializes its children,\n * and if the given value is an array, serialize the nodes in it.\n *\n * @param {unknown} [value]\n *   Thing to serialize, typically `Node`.\n * @param {Options | null | undefined} [options]\n *   Configuration (optional).\n * @returns {string}\n *   Serialized `value`.\n */\nexport function toString(value, options) {\n  const settings = options || emptyOptions\n  const includeImageAlt =\n    typeof settings.includeImageAlt === 'boolean'\n      ? settings.includeImageAlt\n      : true\n  const includeHtml =\n    typeof settings.includeHtml === 'boolean' ? settings.includeHtml : true\n\n  return one(value, includeImageAlt, includeHtml)\n}\n\n/**\n * One node or several nodes.\n *\n * @param {unknown} value\n *   Thing to serialize.\n * @param {boolean} includeImageAlt\n *   Include image `alt`s.\n * @param {boolean} includeHtml\n *   Include HTML.\n * @returns {string}\n *   Serialized node.\n */\nfunction one(value, includeImageAlt, includeHtml) {\n  if (node(value)) {\n    if ('value' in value) {\n      return value.type === 'html' && !includeHtml ? '' : value.value\n    }\n\n    if (includeImageAlt && 'alt' in value && value.alt) {\n      return value.alt\n    }\n\n    if ('children' in value) {\n      return all(value.children, includeImageAlt, includeHtml)\n    }\n  }\n\n  if (Array.isArray(value)) {\n    return all(value, includeImageAlt, includeHtml)\n  }\n\n  return ''\n}\n\n/**\n * Serialize a list of nodes.\n *\n * @param {Array<unknown>} values\n *   Thing to serialize.\n * @param {boolean} includeImageAlt\n *   Include image `alt`s.\n * @param {boolean} includeHtml\n *   Include HTML.\n * @returns {string}\n *   Serialized nodes.\n */\nfunction all(values, includeImageAlt, includeHtml) {\n  /** @type {Array<string>} */\n  const result = []\n  let index = -1\n\n  while (++index < values.length) {\n    result[index] = one(values[index], includeImageAlt, includeHtml)\n  }\n\n  return result.join('')\n}\n\n/**\n * Check if `value` looks like a node.\n *\n * @param {unknown} value\n *   Thing.\n * @returns {value is Nodes}\n *   Whether `value` is a node.\n */\nfunction node(value) {\n  return Boolean(value && typeof value === 'object')\n}\n", "/**\n * Map of named character references.\n *\n * @type {Record<string, string>}\n */\nexport const characterEntities = {\n  AElig: '\u00C6',\n  AMP: '&',\n  Aacute: '\u00C1',\n  Abreve: '\u0102',\n  Acirc: '\u00C2',\n  Acy: '\u0410',\n  Afr: '\uD835\uDD04',\n  Agrave: '\u00C0',\n  Alpha: '\u0391',\n  Amacr: '\u0100',\n  And: '\u2A53',\n  Aogon: '\u0104',\n  Aopf: '\uD835\uDD38',\n  ApplyFunction: '\u2061',\n  Aring: '\u00C5',\n  Ascr: '\uD835\uDC9C',\n  Assign: '\u2254',\n  Atilde: '\u00C3',\n  Auml: '\u00C4',\n  Backslash: '\u2216',\n  Barv: '\u2AE7',\n  Barwed: '\u2306',\n  Bcy: '\u0411',\n  Because: '\u2235',\n  Bernoullis: '\u212C',\n  Beta: '\u0392',\n  Bfr: '\uD835\uDD05',\n  Bopf: '\uD835\uDD39',\n  Breve: '\u02D8',\n  Bscr: '\u212C',\n  Bumpeq: '\u224E',\n  CHcy: '\u0427',\n  COPY: '\u00A9',\n  Cacute: '\u0106',\n  Cap: '\u22D2',\n  CapitalDifferentialD: '\u2145',\n  Cayleys: '\u212D',\n  Ccaron: '\u010C',\n  Ccedil: '\u00C7',\n  Ccirc: '\u0108',\n  Cconint: '\u2230',\n  Cdot: '\u010A',\n  Cedilla: '\u00B8',\n  CenterDot: '\u00B7',\n  Cfr: '\u212D',\n  Chi: '\u03A7',\n  CircleDot: '\u2299',\n  CircleMinus: '\u2296',\n  CirclePlus: '\u2295',\n  CircleTimes: '\u2297',\n  ClockwiseContourIntegral: '\u2232',\n  CloseCurlyDoubleQuote: '\u201D',\n  CloseCurlyQuote: '\u2019',\n  Colon: '\u2237',\n  Colone: '\u2A74',\n  Congruent: '\u2261',\n  Conint: '\u222F',\n  ContourIntegral: '\u222E',\n  Copf: '\u2102',\n  Coproduct: '\u2210',\n  CounterClockwiseContourIntegral: '\u2233',\n  Cross: '\u2A2F',\n  Cscr: '\uD835\uDC9E',\n  Cup: '\u22D3',\n  CupCap: '\u224D',\n  DD: '\u2145',\n  DDotrahd: '\u2911',\n  DJcy: '\u0402',\n  DScy: '\u0405',\n  DZcy: '\u040F',\n  Dagger: '\u2021',\n  Darr: '\u21A1',\n  Dashv: '\u2AE4',\n  Dcaron: '\u010E',\n  Dcy: '\u0414',\n  Del: '\u2207',\n  Delta: '\u0394',\n  Dfr: '\uD835\uDD07',\n  DiacriticalAcute: '\u00B4',\n  DiacriticalDot: '\u02D9',\n  DiacriticalDoubleAcute: '\u02DD',\n  DiacriticalGrave: '`',\n  DiacriticalTilde: '\u02DC',\n  Diamond: '\u22C4',\n  DifferentialD: '\u2146',\n  Dopf: '\uD835\uDD3B',\n  Dot: '\u00A8',\n  DotDot: '\u20DC',\n  DotEqual: '\u2250',\n  DoubleContourIntegral: '\u222F',\n  DoubleDot: '\u00A8',\n  DoubleDownArrow: '\u21D3',\n  DoubleLeftArrow: '\u21D0',\n  DoubleLeftRightArrow: '\u21D4',\n  DoubleLeftTee: '\u2AE4',\n  DoubleLongLeftArrow: '\u27F8',\n  DoubleLongLeftRightArrow: '\u27FA',\n  DoubleLongRightArrow: '\u27F9',\n  DoubleRightArrow: '\u21D2',\n  DoubleRightTee: '\u22A8',\n  DoubleUpArrow: '\u21D1',\n  DoubleUpDownArrow: '\u21D5',\n  DoubleVerticalBar: '\u2225',\n  DownArrow: '\u2193',\n  DownArrowBar: '\u2913',\n  DownArrowUpArrow: '\u21F5',\n  DownBreve: '\u0311',\n  DownLeftRightVector: '\u2950',\n  DownLeftTeeVector: '\u295E',\n  DownLeftVector: '\u21BD',\n  DownLeftVectorBar: '\u2956',\n  DownRightTeeVector: '\u295F',\n  DownRightVector: '\u21C1',\n  DownRightVectorBar: '\u2957',\n  DownTee: '\u22A4',\n  DownTeeArrow: '\u21A7',\n  Downarrow: '\u21D3',\n  Dscr: '\uD835\uDC9F',\n  Dstrok: '\u0110',\n  ENG: '\u014A',\n  ETH: '\u00D0',\n  Eacute: '\u00C9',\n  Ecaron: '\u011A',\n  Ecirc: '\u00CA',\n  Ecy: '\u042D',\n  Edot: '\u0116',\n  Efr: '\uD835\uDD08',\n  Egrave: '\u00C8',\n  Element: '\u2208',\n  Emacr: '\u0112',\n  EmptySmallSquare: '\u25FB',\n  EmptyVerySmallSquare: '\u25AB',\n  Eogon: '\u0118',\n  Eopf: '\uD835\uDD3C',\n  Epsilon: '\u0395',\n  Equal: '\u2A75',\n  EqualTilde: '\u2242',\n  Equilibrium: '\u21CC',\n  Escr: '\u2130',\n  Esim: '\u2A73',\n  Eta: '\u0397',\n  Euml: '\u00CB',\n  Exists: '\u2203',\n  ExponentialE: '\u2147',\n  Fcy: '\u0424',\n  Ffr: '\uD835\uDD09',\n  FilledSmallSquare: '\u25FC',\n  FilledVerySmallSquare: '\u25AA',\n  Fopf: '\uD835\uDD3D',\n  ForAll: '\u2200',\n  Fouriertrf: '\u2131',\n  Fscr: '\u2131',\n  GJcy: '\u0403',\n  GT: '>',\n  Gamma: '\u0393',\n  Gammad: '\u03DC',\n  Gbreve: '\u011E',\n  Gcedil: '\u0122',\n  Gcirc: '\u011C',\n  Gcy: '\u0413',\n  Gdot: '\u0120',\n  Gfr: '\uD835\uDD0A',\n  Gg: '\u22D9',\n  Gopf: '\uD835\uDD3E',\n  GreaterEqual: '\u2265',\n  GreaterEqualLess: '\u22DB',\n  GreaterFullEqual: '\u2267',\n  GreaterGreater: '\u2AA2',\n  GreaterLess: '\u2277',\n  GreaterSlantEqual: '\u2A7E',\n  GreaterTilde: '\u2273',\n  Gscr: '\uD835\uDCA2',\n  Gt: '\u226B',\n  HARDcy: '\u042A',\n  Hacek: '\u02C7',\n  Hat: '^',\n  Hcirc: '\u0124',\n  Hfr: '\u210C',\n  HilbertSpace: '\u210B',\n  Hopf: '\u210D',\n  HorizontalLine: '\u2500',\n  Hscr: '\u210B',\n  Hstrok: '\u0126',\n  HumpDownHump: '\u224E',\n  HumpEqual: '\u224F',\n  IEcy: '\u0415',\n  IJlig: '\u0132',\n  IOcy: '\u0401',\n  Iacute: '\u00CD',\n  Icirc: '\u00CE',\n  Icy: '\u0418',\n  Idot: '\u0130',\n  Ifr: '\u2111',\n  Igrave: '\u00CC',\n  Im: '\u2111',\n  Imacr: '\u012A',\n  ImaginaryI: '\u2148',\n  Implies: '\u21D2',\n  Int: '\u222C',\n  Integral: '\u222B',\n  Intersection: '\u22C2',\n  InvisibleComma: '\u2063',\n  InvisibleTimes: '\u2062',\n  Iogon: '\u012E',\n  Iopf: '\uD835\uDD40',\n  Iota: '\u0399',\n  Iscr: '\u2110',\n  Itilde: '\u0128',\n  Iukcy: '\u0406',\n  Iuml: '\u00CF',\n  Jcirc: '\u0134',\n  Jcy: '\u0419',\n  Jfr: '\uD835\uDD0D',\n  Jopf: '\uD835\uDD41',\n  Jscr: '\uD835\uDCA5',\n  Jsercy: '\u0408',\n  Jukcy: '\u0404',\n  KHcy: '\u0425',\n  KJcy: '\u040C',\n  Kappa: '\u039A',\n  Kcedil: '\u0136',\n  Kcy: '\u041A',\n  Kfr: '\uD835\uDD0E',\n  Kopf: '\uD835\uDD42',\n  Kscr: '\uD835\uDCA6',\n  LJcy: '\u0409',\n  LT: '<',\n  Lacute: '\u0139',\n  Lambda: '\u039B',\n  Lang: '\u27EA',\n  Laplacetrf: '\u2112',\n  Larr: '\u219E',\n  Lcaron: '\u013D',\n  Lcedil: '\u013B',\n  Lcy: '\u041B',\n  LeftAngleBracket: '\u27E8',\n  LeftArrow: '\u2190',\n  LeftArrowBar: '\u21E4',\n  LeftArrowRightArrow: '\u21C6',\n  LeftCeiling: '\u2308',\n  LeftDoubleBracket: '\u27E6',\n  LeftDownTeeVector: '\u2961',\n  LeftDownVector: '\u21C3',\n  LeftDownVectorBar: '\u2959',\n  LeftFloor: '\u230A',\n  LeftRightArrow: '\u2194',\n  LeftRightVector: '\u294E',\n  LeftTee: '\u22A3',\n  LeftTeeArrow: '\u21A4',\n  LeftTeeVector: '\u295A',\n  LeftTriangle: '\u22B2',\n  LeftTriangleBar: '\u29CF',\n  LeftTriangleEqual: '\u22B4',\n  LeftUpDownVector: '\u2951',\n  LeftUpTeeVector: '\u2960',\n  LeftUpVector: '\u21BF',\n  LeftUpVectorBar: '\u2958',\n  LeftVector: '\u21BC',\n  LeftVectorBar: '\u2952',\n  Leftarrow: '\u21D0',\n  Leftrightarrow: '\u21D4',\n  LessEqualGreater: '\u22DA',\n  LessFullEqual: '\u2266',\n  LessGreater: '\u2276',\n  LessLess: '\u2AA1',\n  LessSlantEqual: '\u2A7D',\n  LessTilde: '\u2272',\n  Lfr: '\uD835\uDD0F',\n  Ll: '\u22D8',\n  Lleftarrow: '\u21DA',\n  Lmidot: '\u013F',\n  LongLeftArrow: '\u27F5',\n  LongLeftRightArrow: '\u27F7',\n  LongRightArrow: '\u27F6',\n  Longleftarrow: '\u27F8',\n  Longleftrightarrow: '\u27FA',\n  Longrightarrow: '\u27F9',\n  Lopf: '\uD835\uDD43',\n  LowerLeftArrow: '\u2199',\n  LowerRightArrow: '\u2198',\n  Lscr: '\u2112',\n  Lsh: '\u21B0',\n  Lstrok: '\u0141',\n  Lt: '\u226A',\n  Map: '\u2905',\n  Mcy: '\u041C',\n  MediumSpace: '\u205F',\n  Mellintrf: '\u2133',\n  Mfr: '\uD835\uDD10',\n  MinusPlus: '\u2213',\n  Mopf: '\uD835\uDD44',\n  Mscr: '\u2133',\n  Mu: '\u039C',\n  NJcy: '\u040A',\n  Nacute: '\u0143',\n  Ncaron: '\u0147',\n  Ncedil: '\u0145',\n  Ncy: '\u041D',\n  NegativeMediumSpace: '\u200B',\n  NegativeThickSpace: '\u200B',\n  NegativeThinSpace: '\u200B',\n  NegativeVeryThinSpace: '\u200B',\n  NestedGreaterGreater: '\u226B',\n  NestedLessLess: '\u226A',\n  NewLine: '\\n',\n  Nfr: '\uD835\uDD11',\n  NoBreak: '\u2060',\n  NonBreakingSpace: '\u00A0',\n  Nopf: '\u2115',\n  Not: '\u2AEC',\n  NotCongruent: '\u2262',\n  NotCupCap: '\u226D',\n  NotDoubleVerticalBar: '\u2226',\n  NotElement: '\u2209',\n  NotEqual: '\u2260',\n  NotEqualTilde: '\u2242\u0338',\n  NotExists: '\u2204',\n  NotGreater: '\u226F',\n  NotGreaterEqual: '\u2271',\n  NotGreaterFullEqual: '\u2267\u0338',\n  NotGreaterGreater: '\u226B\u0338',\n  NotGreaterLess: '\u2279',\n  NotGreaterSlantEqual: '\u2A7E\u0338',\n  NotGreaterTilde: '\u2275',\n  NotHumpDownHump: '\u224E\u0338',\n  NotHumpEqual: '\u224F\u0338',\n  NotLeftTriangle: '\u22EA',\n  NotLeftTriangleBar: '\u29CF\u0338',\n  NotLeftTriangleEqual: '\u22EC',\n  NotLess: '\u226E',\n  NotLessEqual: '\u2270',\n  NotLessGreater: '\u2278',\n  NotLessLess: '\u226A\u0338',\n  NotLessSlantEqual: '\u2A7D\u0338',\n  NotLessTilde: '\u2274',\n  NotNestedGreaterGreater: '\u2AA2\u0338',\n  NotNestedLessLess: '\u2AA1\u0338',\n  NotPrecedes: '\u2280',\n  NotPrecedesEqual: '\u2AAF\u0338',\n  NotPrecedesSlantEqual: '\u22E0',\n  NotReverseElement: '\u220C',\n  NotRightTriangle: '\u22EB',\n  NotRightTriangleBar: '\u29D0\u0338',\n  NotRightTriangleEqual: '\u22ED',\n  NotSquareSubset: '\u228F\u0338',\n  NotSquareSubsetEqual: '\u22E2',\n  NotSquareSuperset: '\u2290\u0338',\n  NotSquareSupersetEqual: '\u22E3',\n  NotSubset: '\u2282\u20D2',\n  NotSubsetEqual: '\u2288',\n  NotSucceeds: '\u2281',\n  NotSucceedsEqual: '\u2AB0\u0338',\n  NotSucceedsSlantEqual: '\u22E1',\n  NotSucceedsTilde: '\u227F\u0338',\n  NotSuperset: '\u2283\u20D2',\n  NotSupersetEqual: '\u2289',\n  NotTilde: '\u2241',\n  NotTildeEqual: '\u2244',\n  NotTildeFullEqual: '\u2247',\n  NotTildeTilde: '\u2249',\n  NotVerticalBar: '\u2224',\n  Nscr: '\uD835\uDCA9',\n  Ntilde: '\u00D1',\n  Nu: '\u039D',\n  OElig: '\u0152',\n  Oacute: '\u00D3',\n  Ocirc: '\u00D4',\n  Ocy: '\u041E',\n  Odblac: '\u0150',\n  Ofr: '\uD835\uDD12',\n  Ograve: '\u00D2',\n  Omacr: '\u014C',\n  Omega: '\u03A9',\n  Omicron: '\u039F',\n  Oopf: '\uD835\uDD46',\n  OpenCurlyDoubleQuote: '\u201C',\n  OpenCurlyQuote: '\u2018',\n  Or: '\u2A54',\n  Oscr: '\uD835\uDCAA',\n  Oslash: '\u00D8',\n  Otilde: '\u00D5',\n  Otimes: '\u2A37',\n  Ouml: '\u00D6',\n  OverBar: '\u203E',\n  OverBrace: '\u23DE',\n  OverBracket: '\u23B4',\n  OverParenthesis: '\u23DC',\n  PartialD: '\u2202',\n  Pcy: '\u041F',\n  Pfr: '\uD835\uDD13',\n  Phi: '\u03A6',\n  Pi: '\u03A0',\n  PlusMinus: '\u00B1',\n  Poincareplane: '\u210C',\n  Popf: '\u2119',\n  Pr: '\u2ABB',\n  Precedes: '\u227A',\n  PrecedesEqual: '\u2AAF',\n  PrecedesSlantEqual: '\u227C',\n  PrecedesTilde: '\u227E',\n  Prime: '\u2033',\n  Product: '\u220F',\n  Proportion: '\u2237',\n  Proportional: '\u221D',\n  Pscr: '\uD835\uDCAB',\n  Psi: '\u03A8',\n  QUOT: '\"',\n  Qfr: '\uD835\uDD14',\n  Qopf: '\u211A',\n  Qscr: '\uD835\uDCAC',\n  RBarr: '\u2910',\n  REG: '\u00AE',\n  Racute: '\u0154',\n  Rang: '\u27EB',\n  Rarr: '\u21A0',\n  Rarrtl: '\u2916',\n  Rcaron: '\u0158',\n  Rcedil: '\u0156',\n  Rcy: '\u0420',\n  Re: '\u211C',\n  ReverseElement: '\u220B',\n  ReverseEquilibrium: '\u21CB',\n  ReverseUpEquilibrium: '\u296F',\n  Rfr: '\u211C',\n  Rho: '\u03A1',\n  RightAngleBracket: '\u27E9',\n  RightArrow: '\u2192',\n  RightArrowBar: '\u21E5',\n  RightArrowLeftArrow: '\u21C4',\n  RightCeiling: '\u2309',\n  RightDoubleBracket: '\u27E7',\n  RightDownTeeVector: '\u295D',\n  RightDownVector: '\u21C2',\n  RightDownVectorBar: '\u2955',\n  RightFloor: '\u230B',\n  RightTee: '\u22A2',\n  RightTeeArrow: '\u21A6',\n  RightTeeVector: '\u295B',\n  RightTriangle: '\u22B3',\n  RightTriangleBar: '\u29D0',\n  RightTriangleEqual: '\u22B5',\n  RightUpDownVector: '\u294F',\n  RightUpTeeVector: '\u295C',\n  RightUpVector: '\u21BE',\n  RightUpVectorBar: '\u2954',\n  RightVector: '\u21C0',\n  RightVectorBar: '\u2953',\n  Rightarrow: '\u21D2',\n  Ropf: '\u211D',\n  RoundImplies: '\u2970',\n  Rrightarrow: '\u21DB',\n  Rscr: '\u211B',\n  Rsh: '\u21B1',\n  RuleDelayed: '\u29F4',\n  SHCHcy: '\u0429',\n  SHcy: '\u0428',\n  SOFTcy: '\u042C',\n  Sacute: '\u015A',\n  Sc: '\u2ABC',\n  Scaron: '\u0160',\n  Scedil: '\u015E',\n  Scirc: '\u015C',\n  Scy: '\u0421',\n  Sfr: '\uD835\uDD16',\n  ShortDownArrow: '\u2193',\n  ShortLeftArrow: '\u2190',\n  ShortRightArrow: '\u2192',\n  ShortUpArrow: '\u2191',\n  Sigma: '\u03A3',\n  SmallCircle: '\u2218',\n  Sopf: '\uD835\uDD4A',\n  Sqrt: '\u221A',\n  Square: '\u25A1',\n  SquareIntersection: '\u2293',\n  SquareSubset: '\u228F',\n  SquareSubsetEqual: '\u2291',\n  SquareSuperset: '\u2290',\n  SquareSupersetEqual: '\u2292',\n  SquareUnion: '\u2294',\n  Sscr: '\uD835\uDCAE',\n  Star: '\u22C6',\n  Sub: '\u22D0',\n  Subset: '\u22D0',\n  SubsetEqual: '\u2286',\n  Succeeds: '\u227B',\n  SucceedsEqual: '\u2AB0',\n  SucceedsSlantEqual: '\u227D',\n  SucceedsTilde: '\u227F',\n  SuchThat: '\u220B',\n  Sum: '\u2211',\n  Sup: '\u22D1',\n  Superset: '\u2283',\n  SupersetEqual: '\u2287',\n  Supset: '\u22D1',\n  THORN: '\u00DE',\n  TRADE: '\u2122',\n  TSHcy: '\u040B',\n  TScy: '\u0426',\n  Tab: '\\t',\n  Tau: '\u03A4',\n  Tcaron: '\u0164',\n  Tcedil: '\u0162',\n  Tcy: '\u0422',\n  Tfr: '\uD835\uDD17',\n  Therefore: '\u2234',\n  Theta: '\u0398',\n  ThickSpace: '\u205F\u200A',\n  ThinSpace: '\u2009',\n  Tilde: '\u223C',\n  TildeEqual: '\u2243',\n  TildeFullEqual: '\u2245',\n  TildeTilde: '\u2248',\n  Topf: '\uD835\uDD4B',\n  TripleDot: '\u20DB',\n  Tscr: '\uD835\uDCAF',\n  Tstrok: '\u0166',\n  Uacute: '\u00DA',\n  Uarr: '\u219F',\n  Uarrocir: '\u2949',\n  Ubrcy: '\u040E',\n  Ubreve: '\u016C',\n  Ucirc: '\u00DB',\n  Ucy: '\u0423',\n  Udblac: '\u0170',\n  Ufr: '\uD835\uDD18',\n  Ugrave: '\u00D9',\n  Umacr: '\u016A',\n  UnderBar: '_',\n  UnderBrace: '\u23DF',\n  UnderBracket: '\u23B5',\n  UnderParenthesis: '\u23DD',\n  Union: '\u22C3',\n  UnionPlus: '\u228E',\n  Uogon: '\u0172',\n  Uopf: '\uD835\uDD4C',\n  UpArrow: '\u2191',\n  UpArrowBar: '\u2912',\n  UpArrowDownArrow: '\u21C5',\n  UpDownArrow: '\u2195',\n  UpEquilibrium: '\u296E',\n  UpTee: '\u22A5',\n  UpTeeArrow: '\u21A5',\n  Uparrow: '\u21D1',\n  Updownarrow: '\u21D5',\n  UpperLeftArrow: '\u2196',\n  UpperRightArrow: '\u2197',\n  Upsi: '\u03D2',\n  Upsilon: '\u03A5',\n  Uring: '\u016E',\n  Uscr: '\uD835\uDCB0',\n  Utilde: '\u0168',\n  Uuml: '\u00DC',\n  VDash: '\u22AB',\n  Vbar: '\u2AEB',\n  Vcy: '\u0412',\n  Vdash: '\u22A9',\n  Vdashl: '\u2AE6',\n  Vee: '\u22C1',\n  Verbar: '\u2016',\n  Vert: '\u2016',\n  VerticalBar: '\u2223',\n  VerticalLine: '|',\n  VerticalSeparator: '\u2758',\n  VerticalTilde: '\u2240',\n  VeryThinSpace: '\u200A',\n  Vfr: '\uD835\uDD19',\n  Vopf: '\uD835\uDD4D',\n  Vscr: '\uD835\uDCB1',\n  Vvdash: '\u22AA',\n  Wcirc: '\u0174',\n  Wedge: '\u22C0',\n  Wfr: '\uD835\uDD1A',\n  Wopf: '\uD835\uDD4E',\n  Wscr: '\uD835\uDCB2',\n  Xfr: '\uD835\uDD1B',\n  Xi: '\u039E',\n  Xopf: '\uD835\uDD4F',\n  Xscr: '\uD835\uDCB3',\n  YAcy: '\u042F',\n  YIcy: '\u0407',\n  YUcy: '\u042E',\n  Yacute: '\u00DD',\n  Ycirc: '\u0176',\n  Ycy: '\u042B',\n  Yfr: '\uD835\uDD1C',\n  Yopf: '\uD835\uDD50',\n  Yscr: '\uD835\uDCB4',\n  Yuml: '\u0178',\n  ZHcy: '\u0416',\n  Zacute: '\u0179',\n  Zcaron: '\u017D',\n  Zcy: '\u0417',\n  Zdot: '\u017B',\n  ZeroWidthSpace: '\u200B',\n  Zeta: '\u0396',\n  Zfr: '\u2128',\n  Zopf: '\u2124',\n  Zscr: '\uD835\uDCB5',\n  aacute: '\u00E1',\n  abreve: '\u0103',\n  ac: '\u223E',\n  acE: '\u223E\u0333',\n  acd: '\u223F',\n  acirc: '\u00E2',\n  acute: '\u00B4',\n  acy: '\u0430',\n  aelig: '\u00E6',\n  af: '\u2061',\n  afr: '\uD835\uDD1E',\n  agrave: '\u00E0',\n  alefsym: '\u2135',\n  aleph: '\u2135',\n  alpha: '\u03B1',\n  amacr: '\u0101',\n  amalg: '\u2A3F',\n  amp: '&',\n  and: '\u2227',\n  andand: '\u2A55',\n  andd: '\u2A5C',\n  andslope: '\u2A58',\n  andv: '\u2A5A',\n  ang: '\u2220',\n  ange: '\u29A4',\n  angle: '\u2220',\n  angmsd: '\u2221',\n  angmsdaa: '\u29A8',\n  angmsdab: '\u29A9',\n  angmsdac: '\u29AA',\n  angmsdad: '\u29AB',\n  angmsdae: '\u29AC',\n  angmsdaf: '\u29AD',\n  angmsdag: '\u29AE',\n  angmsdah: '\u29AF',\n  angrt: '\u221F',\n  angrtvb: '\u22BE',\n  angrtvbd: '\u299D',\n  angsph: '\u2222',\n  angst: '\u00C5',\n  angzarr: '\u237C',\n  aogon: '\u0105',\n  aopf: '\uD835\uDD52',\n  ap: '\u2248',\n  apE: '\u2A70',\n  apacir: '\u2A6F',\n  ape: '\u224A',\n  apid: '\u224B',\n  apos: \"'\",\n  approx: '\u2248',\n  approxeq: '\u224A',\n  aring: '\u00E5',\n  ascr: '\uD835\uDCB6',\n  ast: '*',\n  asymp: '\u2248',\n  asympeq: '\u224D',\n  atilde: '\u00E3',\n  auml: '\u00E4',\n  awconint: '\u2233',\n  awint: '\u2A11',\n  bNot: '\u2AED',\n  backcong: '\u224C',\n  backepsilon: '\u03F6',\n  backprime: '\u2035',\n  backsim: '\u223D',\n  backsimeq: '\u22CD',\n  barvee: '\u22BD',\n  barwed: '\u2305',\n  barwedge: '\u2305',\n  bbrk: '\u23B5',\n  bbrktbrk: '\u23B6',\n  bcong: '\u224C',\n  bcy: '\u0431',\n  bdquo: '\u201E',\n  becaus: '\u2235',\n  because: '\u2235',\n  bemptyv: '\u29B0',\n  bepsi: '\u03F6',\n  bernou: '\u212C',\n  beta: '\u03B2',\n  beth: '\u2136',\n  between: '\u226C',\n  bfr: '\uD835\uDD1F',\n  bigcap: '\u22C2',\n  bigcirc: '\u25EF',\n  bigcup: '\u22C3',\n  bigodot: '\u2A00',\n  bigoplus: '\u2A01',\n  bigotimes: '\u2A02',\n  bigsqcup: '\u2A06',\n  bigstar: '\u2605',\n  bigtriangledown: '\u25BD',\n  bigtriangleup: '\u25B3',\n  biguplus: '\u2A04',\n  bigvee: '\u22C1',\n  bigwedge: '\u22C0',\n  bkarow: '\u290D',\n  blacklozenge: '\u29EB',\n  blacksquare: '\u25AA',\n  blacktriangle: '\u25B4',\n  blacktriangledown: '\u25BE',\n  blacktriangleleft: '\u25C2',\n  blacktriangleright: '\u25B8',\n  blank: '\u2423',\n  blk12: '\u2592',\n  blk14: '\u2591',\n  blk34: '\u2593',\n  block: '\u2588',\n  bne: '=\u20E5',\n  bnequiv: '\u2261\u20E5',\n  bnot: '\u2310',\n  bopf: '\uD835\uDD53',\n  bot: '\u22A5',\n  bottom: '\u22A5',\n  bowtie: '\u22C8',\n  boxDL: '\u2557',\n  boxDR: '\u2554',\n  boxDl: '\u2556',\n  boxDr: '\u2553',\n  boxH: '\u2550',\n  boxHD: '\u2566',\n  boxHU: '\u2569',\n  boxHd: '\u2564',\n  boxHu: '\u2567',\n  boxUL: '\u255D',\n  boxUR: '\u255A',\n  boxUl: '\u255C',\n  boxUr: '\u2559',\n  boxV: '\u2551',\n  boxVH: '\u256C',\n  boxVL: '\u2563',\n  boxVR: '\u2560',\n  boxVh: '\u256B',\n  boxVl: '\u2562',\n  boxVr: '\u255F',\n  boxbox: '\u29C9',\n  boxdL: '\u2555',\n  boxdR: '\u2552',\n  boxdl: '\u2510',\n  boxdr: '\u250C',\n  boxh: '\u2500',\n  boxhD: '\u2565',\n  boxhU: '\u2568',\n  boxhd: '\u252C',\n  boxhu: '\u2534',\n  boxminus: '\u229F',\n  boxplus: '\u229E',\n  boxtimes: '\u22A0',\n  boxuL: '\u255B',\n  boxuR: '\u2558',\n  boxul: '\u2518',\n  boxur: '\u2514',\n  boxv: '\u2502',\n  boxvH: '\u256A',\n  boxvL: '\u2561',\n  boxvR: '\u255E',\n  boxvh: '\u253C',\n  boxvl: '\u2524',\n  boxvr: '\u251C',\n  bprime: '\u2035',\n  breve: '\u02D8',\n  brvbar: '\u00A6',\n  bscr: '\uD835\uDCB7',\n  bsemi: '\u204F',\n  bsim: '\u223D',\n  bsime: '\u22CD',\n  bsol: '\\\\',\n  bsolb: '\u29C5',\n  bsolhsub: '\u27C8',\n  bull: '\u2022',\n  bullet: '\u2022',\n  bump: '\u224E',\n  bumpE: '\u2AAE',\n  bumpe: '\u224F',\n  bumpeq: '\u224F',\n  cacute: '\u0107',\n  cap: '\u2229',\n  capand: '\u2A44',\n  capbrcup: '\u2A49',\n  capcap: '\u2A4B',\n  capcup: '\u2A47',\n  capdot: '\u2A40',\n  caps: '\u2229\uFE00',\n  caret: '\u2041',\n  caron: '\u02C7',\n  ccaps: '\u2A4D',\n  ccaron: '\u010D',\n  ccedil: '\u00E7',\n  ccirc: '\u0109',\n  ccups: '\u2A4C',\n  ccupssm: '\u2A50',\n  cdot: '\u010B',\n  cedil: '\u00B8',\n  cemptyv: '\u29B2',\n  cent: '\u00A2',\n  centerdot: '\u00B7',\n  cfr: '\uD835\uDD20',\n  chcy: '\u0447',\n  check: '\u2713',\n  checkmark: '\u2713',\n  chi: '\u03C7',\n  cir: '\u25CB',\n  cirE: '\u29C3',\n  circ: '\u02C6',\n  circeq: '\u2257',\n  circlearrowleft: '\u21BA',\n  circlearrowright: '\u21BB',\n  circledR: '\u00AE',\n  circledS: '\u24C8',\n  circledast: '\u229B',\n  circledcirc: '\u229A',\n  circleddash: '\u229D',\n  cire: '\u2257',\n  cirfnint: '\u2A10',\n  cirmid: '\u2AEF',\n  cirscir: '\u29C2',\n  clubs: '\u2663',\n  clubsuit: '\u2663',\n  colon: ':',\n  colone: '\u2254',\n  coloneq: '\u2254',\n  comma: ',',\n  commat: '@',\n  comp: '\u2201',\n  compfn: '\u2218',\n  complement: '\u2201',\n  complexes: '\u2102',\n  cong: '\u2245',\n  congdot: '\u2A6D',\n  conint: '\u222E',\n  copf: '\uD835\uDD54',\n  coprod: '\u2210',\n  copy: '\u00A9',\n  copysr: '\u2117',\n  crarr: '\u21B5',\n  cross: '\u2717',\n  cscr: '\uD835\uDCB8',\n  csub: '\u2ACF',\n  csube: '\u2AD1',\n  csup: '\u2AD0',\n  csupe: '\u2AD2',\n  ctdot: '\u22EF',\n  cudarrl: '\u2938',\n  cudarrr: '\u2935',\n  cuepr: '\u22DE',\n  cuesc: '\u22DF',\n  cularr: '\u21B6',\n  cularrp: '\u293D',\n  cup: '\u222A',\n  cupbrcap: '\u2A48',\n  cupcap: '\u2A46',\n  cupcup: '\u2A4A',\n  cupdot: '\u228D',\n  cupor: '\u2A45',\n  cups: '\u222A\uFE00',\n  curarr: '\u21B7',\n  curarrm: '\u293C',\n  curlyeqprec: '\u22DE',\n  curlyeqsucc: '\u22DF',\n  curlyvee: '\u22CE',\n  curlywedge: '\u22CF',\n  curren: '\u00A4',\n  curvearrowleft: '\u21B6',\n  curvearrowright: '\u21B7',\n  cuvee: '\u22CE',\n  cuwed: '\u22CF',\n  cwconint: '\u2232',\n  cwint: '\u2231',\n  cylcty: '\u232D',\n  dArr: '\u21D3',\n  dHar: '\u2965',\n  dagger: '\u2020',\n  daleth: '\u2138',\n  darr: '\u2193',\n  dash: '\u2010',\n  dashv: '\u22A3',\n  dbkarow: '\u290F',\n  dblac: '\u02DD',\n  dcaron: '\u010F',\n  dcy: '\u0434',\n  dd: '\u2146',\n  ddagger: '\u2021',\n  ddarr: '\u21CA',\n  ddotseq: '\u2A77',\n  deg: '\u00B0',\n  delta: '\u03B4',\n  demptyv: '\u29B1',\n  dfisht: '\u297F',\n  dfr: '\uD835\uDD21',\n  dharl: '\u21C3',\n  dharr: '\u21C2',\n  diam: '\u22C4',\n  diamond: '\u22C4',\n  diamondsuit: '\u2666',\n  diams: '\u2666',\n  die: '\u00A8',\n  digamma: '\u03DD',\n  disin: '\u22F2',\n  div: '\u00F7',\n  divide: '\u00F7',\n  divideontimes: '\u22C7',\n  divonx: '\u22C7',\n  djcy: '\u0452',\n  dlcorn: '\u231E',\n  dlcrop: '\u230D',\n  dollar: '$',\n  dopf: '\uD835\uDD55',\n  dot: '\u02D9',\n  doteq: '\u2250',\n  doteqdot: '\u2251',\n  dotminus: '\u2238',\n  dotplus: '\u2214',\n  dotsquare: '\u22A1',\n  doublebarwedge: '\u2306',\n  downarrow: '\u2193',\n  downdownarrows: '\u21CA',\n  downharpoonleft: '\u21C3',\n  downharpoonright: '\u21C2',\n  drbkarow: '\u2910',\n  drcorn: '\u231F',\n  drcrop: '\u230C',\n  dscr: '\uD835\uDCB9',\n  dscy: '\u0455',\n  dsol: '\u29F6',\n  dstrok: '\u0111',\n  dtdot: '\u22F1',\n  dtri: '\u25BF',\n  dtrif: '\u25BE',\n  duarr: '\u21F5',\n  duhar: '\u296F',\n  dwangle: '\u29A6',\n  dzcy: '\u045F',\n  dzigrarr: '\u27FF',\n  eDDot: '\u2A77',\n  eDot: '\u2251',\n  eacute: '\u00E9',\n  easter: '\u2A6E',\n  ecaron: '\u011B',\n  ecir: '\u2256',\n  ecirc: '\u00EA',\n  ecolon: '\u2255',\n  ecy: '\u044D',\n  edot: '\u0117',\n  ee: '\u2147',\n  efDot: '\u2252',\n  efr: '\uD835\uDD22',\n  eg: '\u2A9A',\n  egrave: '\u00E8',\n  egs: '\u2A96',\n  egsdot: '\u2A98',\n  el: '\u2A99',\n  elinters: '\u23E7',\n  ell: '\u2113',\n  els: '\u2A95',\n  elsdot: '\u2A97',\n  emacr: '\u0113',\n  empty: '\u2205',\n  emptyset: '\u2205',\n  emptyv: '\u2205',\n  emsp13: '\u2004',\n  emsp14: '\u2005',\n  emsp: '\u2003',\n  eng: '\u014B',\n  ensp: '\u2002',\n  eogon: '\u0119',\n  eopf: '\uD835\uDD56',\n  epar: '\u22D5',\n  eparsl: '\u29E3',\n  eplus: '\u2A71',\n  epsi: '\u03B5',\n  epsilon: '\u03B5',\n  epsiv: '\u03F5',\n  eqcirc: '\u2256',\n  eqcolon: '\u2255',\n  eqsim: '\u2242',\n  eqslantgtr: '\u2A96',\n  eqslantless: '\u2A95',\n  equals: '=',\n  equest: '\u225F',\n  equiv: '\u2261',\n  equivDD: '\u2A78',\n  eqvparsl: '\u29E5',\n  erDot: '\u2253',\n  erarr: '\u2971',\n  escr: '\u212F',\n  esdot: '\u2250',\n  esim: '\u2242',\n  eta: '\u03B7',\n  eth: '\u00F0',\n  euml: '\u00EB',\n  euro: '\u20AC',\n  excl: '!',\n  exist: '\u2203',\n  expectation: '\u2130',\n  exponentiale: '\u2147',\n  fallingdotseq: '\u2252',\n  fcy: '\u0444',\n  female: '\u2640',\n  ffilig: '\uFB03',\n  fflig: '\uFB00',\n  ffllig: '\uFB04',\n  ffr: '\uD835\uDD23',\n  filig: '\uFB01',\n  fjlig: 'fj',\n  flat: '\u266D',\n  fllig: '\uFB02',\n  fltns: '\u25B1',\n  fnof: '\u0192',\n  fopf: '\uD835\uDD57',\n  forall: '\u2200',\n  fork: '\u22D4',\n  forkv: '\u2AD9',\n  fpartint: '\u2A0D',\n  frac12: '\u00BD',\n  frac13: '\u2153',\n  frac14: '\u00BC',\n  frac15: '\u2155',\n  frac16: '\u2159',\n  frac18: '\u215B',\n  frac23: '\u2154',\n  frac25: '\u2156',\n  frac34: '\u00BE',\n  frac35: '\u2157',\n  frac38: '\u215C',\n  frac45: '\u2158',\n  frac56: '\u215A',\n  frac58: '\u215D',\n  frac78: '\u215E',\n  frasl: '\u2044',\n  frown: '\u2322',\n  fscr: '\uD835\uDCBB',\n  gE: '\u2267',\n  gEl: '\u2A8C',\n  gacute: '\u01F5',\n  gamma: '\u03B3',\n  gammad: '\u03DD',\n  gap: '\u2A86',\n  gbreve: '\u011F',\n  gcirc: '\u011D',\n  gcy: '\u0433',\n  gdot: '\u0121',\n  ge: '\u2265',\n  gel: '\u22DB',\n  geq: '\u2265',\n  geqq: '\u2267',\n  geqslant: '\u2A7E',\n  ges: '\u2A7E',\n  gescc: '\u2AA9',\n  gesdot: '\u2A80',\n  gesdoto: '\u2A82',\n  gesdotol: '\u2A84',\n  gesl: '\u22DB\uFE00',\n  gesles: '\u2A94',\n  gfr: '\uD835\uDD24',\n  gg: '\u226B',\n  ggg: '\u22D9',\n  gimel: '\u2137',\n  gjcy: '\u0453',\n  gl: '\u2277',\n  glE: '\u2A92',\n  gla: '\u2AA5',\n  glj: '\u2AA4',\n  gnE: '\u2269',\n  gnap: '\u2A8A',\n  gnapprox: '\u2A8A',\n  gne: '\u2A88',\n  gneq: '\u2A88',\n  gneqq: '\u2269',\n  gnsim: '\u22E7',\n  gopf: '\uD835\uDD58',\n  grave: '`',\n  gscr: '\u210A',\n  gsim: '\u2273',\n  gsime: '\u2A8E',\n  gsiml: '\u2A90',\n  gt: '>',\n  gtcc: '\u2AA7',\n  gtcir: '\u2A7A',\n  gtdot: '\u22D7',\n  gtlPar: '\u2995',\n  gtquest: '\u2A7C',\n  gtrapprox: '\u2A86',\n  gtrarr: '\u2978',\n  gtrdot: '\u22D7',\n  gtreqless: '\u22DB',\n  gtreqqless: '\u2A8C',\n  gtrless: '\u2277',\n  gtrsim: '\u2273',\n  gvertneqq: '\u2269\uFE00',\n  gvnE: '\u2269\uFE00',\n  hArr: '\u21D4',\n  hairsp: '\u200A',\n  half: '\u00BD',\n  hamilt: '\u210B',\n  hardcy: '\u044A',\n  harr: '\u2194',\n  harrcir: '\u2948',\n  harrw: '\u21AD',\n  hbar: '\u210F',\n  hcirc: '\u0125',\n  hearts: '\u2665',\n  heartsuit: '\u2665',\n  hellip: '\u2026',\n  hercon: '\u22B9',\n  hfr: '\uD835\uDD25',\n  hksearow: '\u2925',\n  hkswarow: '\u2926',\n  hoarr: '\u21FF',\n  homtht: '\u223B',\n  hookleftarrow: '\u21A9',\n  hookrightarrow: '\u21AA',\n  hopf: '\uD835\uDD59',\n  horbar: '\u2015',\n  hscr: '\uD835\uDCBD',\n  hslash: '\u210F',\n  hstrok: '\u0127',\n  hybull: '\u2043',\n  hyphen: '\u2010',\n  iacute: '\u00ED',\n  ic: '\u2063',\n  icirc: '\u00EE',\n  icy: '\u0438',\n  iecy: '\u0435',\n  iexcl: '\u00A1',\n  iff: '\u21D4',\n  ifr: '\uD835\uDD26',\n  igrave: '\u00EC',\n  ii: '\u2148',\n  iiiint: '\u2A0C',\n  iiint: '\u222D',\n  iinfin: '\u29DC',\n  iiota: '\u2129',\n  ijlig: '\u0133',\n  imacr: '\u012B',\n  image: '\u2111',\n  imagline: '\u2110',\n  imagpart: '\u2111',\n  imath: '\u0131',\n  imof: '\u22B7',\n  imped: '\u01B5',\n  in: '\u2208',\n  incare: '\u2105',\n  infin: '\u221E',\n  infintie: '\u29DD',\n  inodot: '\u0131',\n  int: '\u222B',\n  intcal: '\u22BA',\n  integers: '\u2124',\n  intercal: '\u22BA',\n  intlarhk: '\u2A17',\n  intprod: '\u2A3C',\n  iocy: '\u0451',\n  iogon: '\u012F',\n  iopf: '\uD835\uDD5A',\n  iota: '\u03B9',\n  iprod: '\u2A3C',\n  iquest: '\u00BF',\n  iscr: '\uD835\uDCBE',\n  isin: '\u2208',\n  isinE: '\u22F9',\n  isindot: '\u22F5',\n  isins: '\u22F4',\n  isinsv: '\u22F3',\n  isinv: '\u2208',\n  it: '\u2062',\n  itilde: '\u0129',\n  iukcy: '\u0456',\n  iuml: '\u00EF',\n  jcirc: '\u0135',\n  jcy: '\u0439',\n  jfr: '\uD835\uDD27',\n  jmath: '\u0237',\n  jopf: '\uD835\uDD5B',\n  jscr: '\uD835\uDCBF',\n  jsercy: '\u0458',\n  jukcy: '\u0454',\n  kappa: '\u03BA',\n  kappav: '\u03F0',\n  kcedil: '\u0137',\n  kcy: '\u043A',\n  kfr: '\uD835\uDD28',\n  kgreen: '\u0138',\n  khcy: '\u0445',\n  kjcy: '\u045C',\n  kopf: '\uD835\uDD5C',\n  kscr: '\uD835\uDCC0',\n  lAarr: '\u21DA',\n  lArr: '\u21D0',\n  lAtail: '\u291B',\n  lBarr: '\u290E',\n  lE: '\u2266',\n  lEg: '\u2A8B',\n  lHar: '\u2962',\n  lacute: '\u013A',\n  laemptyv: '\u29B4',\n  lagran: '\u2112',\n  lambda: '\u03BB',\n  lang: '\u27E8',\n  langd: '\u2991',\n  langle: '\u27E8',\n  lap: '\u2A85',\n  laquo: '\u00AB',\n  larr: '\u2190',\n  larrb: '\u21E4',\n  larrbfs: '\u291F',\n  larrfs: '\u291D',\n  larrhk: '\u21A9',\n  larrlp: '\u21AB',\n  larrpl: '\u2939',\n  larrsim: '\u2973',\n  larrtl: '\u21A2',\n  lat: '\u2AAB',\n  latail: '\u2919',\n  late: '\u2AAD',\n  lates: '\u2AAD\uFE00',\n  lbarr: '\u290C',\n  lbbrk: '\u2772',\n  lbrace: '{',\n  lbrack: '[',\n  lbrke: '\u298B',\n  lbrksld: '\u298F',\n  lbrkslu: '\u298D',\n  lcaron: '\u013E',\n  lcedil: '\u013C',\n  lceil: '\u2308',\n  lcub: '{',\n  lcy: '\u043B',\n  ldca: '\u2936',\n  ldquo: '\u201C',\n  ldquor: '\u201E',\n  ldrdhar: '\u2967',\n  ldrushar: '\u294B',\n  ldsh: '\u21B2',\n  le: '\u2264',\n  leftarrow: '\u2190',\n  leftarrowtail: '\u21A2',\n  leftharpoondown: '\u21BD',\n  leftharpoonup: '\u21BC',\n  leftleftarrows: '\u21C7',\n  leftrightarrow: '\u2194',\n  leftrightarrows: '\u21C6',\n  leftrightharpoons: '\u21CB',\n  leftrightsquigarrow: '\u21AD',\n  leftthreetimes: '\u22CB',\n  leg: '\u22DA',\n  leq: '\u2264',\n  leqq: '\u2266',\n  leqslant: '\u2A7D',\n  les: '\u2A7D',\n  lescc: '\u2AA8',\n  lesdot: '\u2A7F',\n  lesdoto: '\u2A81',\n  lesdotor: '\u2A83',\n  lesg: '\u22DA\uFE00',\n  lesges: '\u2A93',\n  lessapprox: '\u2A85',\n  lessdot: '\u22D6',\n  lesseqgtr: '\u22DA',\n  lesseqqgtr: '\u2A8B',\n  lessgtr: '\u2276',\n  lesssim: '\u2272',\n  lfisht: '\u297C',\n  lfloor: '\u230A',\n  lfr: '\uD835\uDD29',\n  lg: '\u2276',\n  lgE: '\u2A91',\n  lhard: '\u21BD',\n  lharu: '\u21BC',\n  lharul: '\u296A',\n  lhblk: '\u2584',\n  ljcy: '\u0459',\n  ll: '\u226A',\n  llarr: '\u21C7',\n  llcorner: '\u231E',\n  llhard: '\u296B',\n  lltri: '\u25FA',\n  lmidot: '\u0140',\n  lmoust: '\u23B0',\n  lmoustache: '\u23B0',\n  lnE: '\u2268',\n  lnap: '\u2A89',\n  lnapprox: '\u2A89',\n  lne: '\u2A87',\n  lneq: '\u2A87',\n  lneqq: '\u2268',\n  lnsim: '\u22E6',\n  loang: '\u27EC',\n  loarr: '\u21FD',\n  lobrk: '\u27E6',\n  longleftarrow: '\u27F5',\n  longleftrightarrow: '\u27F7',\n  longmapsto: '\u27FC',\n  longrightarrow: '\u27F6',\n  looparrowleft: '\u21AB',\n  looparrowright: '\u21AC',\n  lopar: '\u2985',\n  lopf: '\uD835\uDD5D',\n  loplus: '\u2A2D',\n  lotimes: '\u2A34',\n  lowast: '\u2217',\n  lowbar: '_',\n  loz: '\u25CA',\n  lozenge: '\u25CA',\n  lozf: '\u29EB',\n  lpar: '(',\n  lparlt: '\u2993',\n  lrarr: '\u21C6',\n  lrcorner: '\u231F',\n  lrhar: '\u21CB',\n  lrhard: '\u296D',\n  lrm: '\u200E',\n  lrtri: '\u22BF',\n  lsaquo: '\u2039',\n  lscr: '\uD835\uDCC1',\n  lsh: '\u21B0',\n  lsim: '\u2272',\n  lsime: '\u2A8D',\n  lsimg: '\u2A8F',\n  lsqb: '[',\n  lsquo: '\u2018',\n  lsquor: '\u201A',\n  lstrok: '\u0142',\n  lt: '<',\n  ltcc: '\u2AA6',\n  ltcir: '\u2A79',\n  ltdot: '\u22D6',\n  lthree: '\u22CB',\n  ltimes: '\u22C9',\n  ltlarr: '\u2976',\n  ltquest: '\u2A7B',\n  ltrPar: '\u2996',\n  ltri: '\u25C3',\n  ltrie: '\u22B4',\n  ltrif: '\u25C2',\n  lurdshar: '\u294A',\n  luruhar: '\u2966',\n  lvertneqq: '\u2268\uFE00',\n  lvnE: '\u2268\uFE00',\n  mDDot: '\u223A',\n  macr: '\u00AF',\n  male: '\u2642',\n  malt: '\u2720',\n  maltese: '\u2720',\n  map: '\u21A6',\n  mapsto: '\u21A6',\n  mapstodown: '\u21A7',\n  mapstoleft: '\u21A4',\n  mapstoup: '\u21A5',\n  marker: '\u25AE',\n  mcomma: '\u2A29',\n  mcy: '\u043C',\n  mdash: '\u2014',\n  measuredangle: '\u2221',\n  mfr: '\uD835\uDD2A',\n  mho: '\u2127',\n  micro: '\u00B5',\n  mid: '\u2223',\n  midast: '*',\n  midcir: '\u2AF0',\n  middot: '\u00B7',\n  minus: '\u2212',\n  minusb: '\u229F',\n  minusd: '\u2238',\n  minusdu: '\u2A2A',\n  mlcp: '\u2ADB',\n  mldr: '\u2026',\n  mnplus: '\u2213',\n  models: '\u22A7',\n  mopf: '\uD835\uDD5E',\n  mp: '\u2213',\n  mscr: '\uD835\uDCC2',\n  mstpos: '\u223E',\n  mu: '\u03BC',\n  multimap: '\u22B8',\n  mumap: '\u22B8',\n  nGg: '\u22D9\u0338',\n  nGt: '\u226B\u20D2',\n  nGtv: '\u226B\u0338',\n  nLeftarrow: '\u21CD',\n  nLeftrightarrow: '\u21CE',\n  nLl: '\u22D8\u0338',\n  nLt: '\u226A\u20D2',\n  nLtv: '\u226A\u0338',\n  nRightarrow: '\u21CF',\n  nVDash: '\u22AF',\n  nVdash: '\u22AE',\n  nabla: '\u2207',\n  nacute: '\u0144',\n  nang: '\u2220\u20D2',\n  nap: '\u2249',\n  napE: '\u2A70\u0338',\n  napid: '\u224B\u0338',\n  napos: '\u0149',\n  napprox: '\u2249',\n  natur: '\u266E',\n  natural: '\u266E',\n  naturals: '\u2115',\n  nbsp: '\u00A0',\n  nbump: '\u224E\u0338',\n  nbumpe: '\u224F\u0338',\n  ncap: '\u2A43',\n  ncaron: '\u0148',\n  ncedil: '\u0146',\n  ncong: '\u2247',\n  ncongdot: '\u2A6D\u0338',\n  ncup: '\u2A42',\n  ncy: '\u043D',\n  ndash: '\u2013',\n  ne: '\u2260',\n  neArr: '\u21D7',\n  nearhk: '\u2924',\n  nearr: '\u2197',\n  nearrow: '\u2197',\n  nedot: '\u2250\u0338',\n  nequiv: '\u2262',\n  nesear: '\u2928',\n  nesim: '\u2242\u0338',\n  nexist: '\u2204',\n  nexists: '\u2204',\n  nfr: '\uD835\uDD2B',\n  ngE: '\u2267\u0338',\n  nge: '\u2271',\n  ngeq: '\u2271',\n  ngeqq: '\u2267\u0338',\n  ngeqslant: '\u2A7E\u0338',\n  nges: '\u2A7E\u0338',\n  ngsim: '\u2275',\n  ngt: '\u226F',\n  ngtr: '\u226F',\n  nhArr: '\u21CE',\n  nharr: '\u21AE',\n  nhpar: '\u2AF2',\n  ni: '\u220B',\n  nis: '\u22FC',\n  nisd: '\u22FA',\n  niv: '\u220B',\n  njcy: '\u045A',\n  nlArr: '\u21CD',\n  nlE: '\u2266\u0338',\n  nlarr: '\u219A',\n  nldr: '\u2025',\n  nle: '\u2270',\n  nleftarrow: '\u219A',\n  nleftrightarrow: '\u21AE',\n  nleq: '\u2270',\n  nleqq: '\u2266\u0338',\n  nleqslant: '\u2A7D\u0338',\n  nles: '\u2A7D\u0338',\n  nless: '\u226E',\n  nlsim: '\u2274',\n  nlt: '\u226E',\n  nltri: '\u22EA',\n  nltrie: '\u22EC',\n  nmid: '\u2224',\n  nopf: '\uD835\uDD5F',\n  not: '\u00AC',\n  notin: '\u2209',\n  notinE: '\u22F9\u0338',\n  notindot: '\u22F5\u0338',\n  notinva: '\u2209',\n  notinvb: '\u22F7',\n  notinvc: '\u22F6',\n  notni: '\u220C',\n  notniva: '\u220C',\n  notnivb: '\u22FE',\n  notnivc: '\u22FD',\n  npar: '\u2226',\n  nparallel: '\u2226',\n  nparsl: '\u2AFD\u20E5',\n  npart: '\u2202\u0338',\n  npolint: '\u2A14',\n  npr: '\u2280',\n  nprcue: '\u22E0',\n  npre: '\u2AAF\u0338',\n  nprec: '\u2280',\n  npreceq: '\u2AAF\u0338',\n  nrArr: '\u21CF',\n  nrarr: '\u219B',\n  nrarrc: '\u2933\u0338',\n  nrarrw: '\u219D\u0338',\n  nrightarrow: '\u219B',\n  nrtri: '\u22EB',\n  nrtrie: '\u22ED',\n  nsc: '\u2281',\n  nsccue: '\u22E1',\n  nsce: '\u2AB0\u0338',\n  nscr: '\uD835\uDCC3',\n  nshortmid: '\u2224',\n  nshortparallel: '\u2226',\n  nsim: '\u2241',\n  nsime: '\u2244',\n  nsimeq: '\u2244',\n  nsmid: '\u2224',\n  nspar: '\u2226',\n  nsqsube: '\u22E2',\n  nsqsupe: '\u22E3',\n  nsub: '\u2284',\n  nsubE: '\u2AC5\u0338',\n  nsube: '\u2288',\n  nsubset: '\u2282\u20D2',\n  nsubseteq: '\u2288',\n  nsubseteqq: '\u2AC5\u0338',\n  nsucc: '\u2281',\n  nsucceq: '\u2AB0\u0338',\n  nsup: '\u2285',\n  nsupE: '\u2AC6\u0338',\n  nsupe: '\u2289',\n  nsupset: '\u2283\u20D2',\n  nsupseteq: '\u2289',\n  nsupseteqq: '\u2AC6\u0338',\n  ntgl: '\u2279',\n  ntilde: '\u00F1',\n  ntlg: '\u2278',\n  ntriangleleft: '\u22EA',\n  ntrianglelefteq: '\u22EC',\n  ntriangleright: '\u22EB',\n  ntrianglerighteq: '\u22ED',\n  nu: '\u03BD',\n  num: '#',\n  numero: '\u2116',\n  numsp: '\u2007',\n  nvDash: '\u22AD',\n  nvHarr: '\u2904',\n  nvap: '\u224D\u20D2',\n  nvdash: '\u22AC',\n  nvge: '\u2265\u20D2',\n  nvgt: '>\u20D2',\n  nvinfin: '\u29DE',\n  nvlArr: '\u2902',\n  nvle: '\u2264\u20D2',\n  nvlt: '<\u20D2',\n  nvltrie: '\u22B4\u20D2',\n  nvrArr: '\u2903',\n  nvrtrie: '\u22B5\u20D2',\n  nvsim: '\u223C\u20D2',\n  nwArr: '\u21D6',\n  nwarhk: '\u2923',\n  nwarr: '\u2196',\n  nwarrow: '\u2196',\n  nwnear: '\u2927',\n  oS: '\u24C8',\n  oacute: '\u00F3',\n  oast: '\u229B',\n  ocir: '\u229A',\n  ocirc: '\u00F4',\n  ocy: '\u043E',\n  odash: '\u229D',\n  odblac: '\u0151',\n  odiv: '\u2A38',\n  odot: '\u2299',\n  odsold: '\u29BC',\n  oelig: '\u0153',\n  ofcir: '\u29BF',\n  ofr: '\uD835\uDD2C',\n  ogon: '\u02DB',\n  ograve: '\u00F2',\n  ogt: '\u29C1',\n  ohbar: '\u29B5',\n  ohm: '\u03A9',\n  oint: '\u222E',\n  olarr: '\u21BA',\n  olcir: '\u29BE',\n  olcross: '\u29BB',\n  oline: '\u203E',\n  olt: '\u29C0',\n  omacr: '\u014D',\n  omega: '\u03C9',\n  omicron: '\u03BF',\n  omid: '\u29B6',\n  ominus: '\u2296',\n  oopf: '\uD835\uDD60',\n  opar: '\u29B7',\n  operp: '\u29B9',\n  oplus: '\u2295',\n  or: '\u2228',\n  orarr: '\u21BB',\n  ord: '\u2A5D',\n  order: '\u2134',\n  orderof: '\u2134',\n  ordf: '\u00AA',\n  ordm: '\u00BA',\n  origof: '\u22B6',\n  oror: '\u2A56',\n  orslope: '\u2A57',\n  orv: '\u2A5B',\n  oscr: '\u2134',\n  oslash: '\u00F8',\n  osol: '\u2298',\n  otilde: '\u00F5',\n  otimes: '\u2297',\n  otimesas: '\u2A36',\n  ouml: '\u00F6',\n  ovbar: '\u233D',\n  par: '\u2225',\n  para: '\u00B6',\n  parallel: '\u2225',\n  parsim: '\u2AF3',\n  parsl: '\u2AFD',\n  part: '\u2202',\n  pcy: '\u043F',\n  percnt: '%',\n  period: '.',\n  permil: '\u2030',\n  perp: '\u22A5',\n  pertenk: '\u2031',\n  pfr: '\uD835\uDD2D',\n  phi: '\u03C6',\n  phiv: '\u03D5',\n  phmmat: '\u2133',\n  phone: '\u260E',\n  pi: '\u03C0',\n  pitchfork: '\u22D4',\n  piv: '\u03D6',\n  planck: '\u210F',\n  planckh: '\u210E',\n  plankv: '\u210F',\n  plus: '+',\n  plusacir: '\u2A23',\n  plusb: '\u229E',\n  pluscir: '\u2A22',\n  plusdo: '\u2214',\n  plusdu: '\u2A25',\n  pluse: '\u2A72',\n  plusmn: '\u00B1',\n  plussim: '\u2A26',\n  plustwo: '\u2A27',\n  pm: '\u00B1',\n  pointint: '\u2A15',\n  popf: '\uD835\uDD61',\n  pound: '\u00A3',\n  pr: '\u227A',\n  prE: '\u2AB3',\n  prap: '\u2AB7',\n  prcue: '\u227C',\n  pre: '\u2AAF',\n  prec: '\u227A',\n  precapprox: '\u2AB7',\n  preccurlyeq: '\u227C',\n  preceq: '\u2AAF',\n  precnapprox: '\u2AB9',\n  precneqq: '\u2AB5',\n  precnsim: '\u22E8',\n  precsim: '\u227E',\n  prime: '\u2032',\n  primes: '\u2119',\n  prnE: '\u2AB5',\n  prnap: '\u2AB9',\n  prnsim: '\u22E8',\n  prod: '\u220F',\n  profalar: '\u232E',\n  profline: '\u2312',\n  profsurf: '\u2313',\n  prop: '\u221D',\n  propto: '\u221D',\n  prsim: '\u227E',\n  prurel: '\u22B0',\n  pscr: '\uD835\uDCC5',\n  psi: '\u03C8',\n  puncsp: '\u2008',\n  qfr: '\uD835\uDD2E',\n  qint: '\u2A0C',\n  qopf: '\uD835\uDD62',\n  qprime: '\u2057',\n  qscr: '\uD835\uDCC6',\n  quaternions: '\u210D',\n  quatint: '\u2A16',\n  quest: '?',\n  questeq: '\u225F',\n  quot: '\"',\n  rAarr: '\u21DB',\n  rArr: '\u21D2',\n  rAtail: '\u291C',\n  rBarr: '\u290F',\n  rHar: '\u2964',\n  race: '\u223D\u0331',\n  racute: '\u0155',\n  radic: '\u221A',\n  raemptyv: '\u29B3',\n  rang: '\u27E9',\n  rangd: '\u2992',\n  range: '\u29A5',\n  rangle: '\u27E9',\n  raquo: '\u00BB',\n  rarr: '\u2192',\n  rarrap: '\u2975',\n  rarrb: '\u21E5',\n  rarrbfs: '\u2920',\n  rarrc: '\u2933',\n  rarrfs: '\u291E',\n  rarrhk: '\u21AA',\n  rarrlp: '\u21AC',\n  rarrpl: '\u2945',\n  rarrsim: '\u2974',\n  rarrtl: '\u21A3',\n  rarrw: '\u219D',\n  ratail: '\u291A',\n  ratio: '\u2236',\n  rationals: '\u211A',\n  rbarr: '\u290D',\n  rbbrk: '\u2773',\n  rbrace: '}',\n  rbrack: ']',\n  rbrke: '\u298C',\n  rbrksld: '\u298E',\n  rbrkslu: '\u2990',\n  rcaron: '\u0159',\n  rcedil: '\u0157',\n  rceil: '\u2309',\n  rcub: '}',\n  rcy: '\u0440',\n  rdca: '\u2937',\n  rdldhar: '\u2969',\n  rdquo: '\u201D',\n  rdquor: '\u201D',\n  rdsh: '\u21B3',\n  real: '\u211C',\n  realine: '\u211B',\n  realpart: '\u211C',\n  reals: '\u211D',\n  rect: '\u25AD',\n  reg: '\u00AE',\n  rfisht: '\u297D',\n  rfloor: '\u230B',\n  rfr: '\uD835\uDD2F',\n  rhard: '\u21C1',\n  rharu: '\u21C0',\n  rharul: '\u296C',\n  rho: '\u03C1',\n  rhov: '\u03F1',\n  rightarrow: '\u2192',\n  rightarrowtail: '\u21A3',\n  rightharpoondown: '\u21C1',\n  rightharpoonup: '\u21C0',\n  rightleftarrows: '\u21C4',\n  rightleftharpoons: '\u21CC',\n  rightrightarrows: '\u21C9',\n  rightsquigarrow: '\u219D',\n  rightthreetimes: '\u22CC',\n  ring: '\u02DA',\n  risingdotseq: '\u2253',\n  rlarr: '\u21C4',\n  rlhar: '\u21CC',\n  rlm: '\u200F',\n  rmoust: '\u23B1',\n  rmoustache: '\u23B1',\n  rnmid: '\u2AEE',\n  roang: '\u27ED',\n  roarr: '\u21FE',\n  robrk: '\u27E7',\n  ropar: '\u2986',\n  ropf: '\uD835\uDD63',\n  roplus: '\u2A2E',\n  rotimes: '\u2A35',\n  rpar: ')',\n  rpargt: '\u2994',\n  rppolint: '\u2A12',\n  rrarr: '\u21C9',\n  rsaquo: '\u203A',\n  rscr: '\uD835\uDCC7',\n  rsh: '\u21B1',\n  rsqb: ']',\n  rsquo: '\u2019',\n  rsquor: '\u2019',\n  rthree: '\u22CC',\n  rtimes: '\u22CA',\n  rtri: '\u25B9',\n  rtrie: '\u22B5',\n  rtrif: '\u25B8',\n  rtriltri: '\u29CE',\n  ruluhar: '\u2968',\n  rx: '\u211E',\n  sacute: '\u015B',\n  sbquo: '\u201A',\n  sc: '\u227B',\n  scE: '\u2AB4',\n  scap: '\u2AB8',\n  scaron: '\u0161',\n  sccue: '\u227D',\n  sce: '\u2AB0',\n  scedil: '\u015F',\n  scirc: '\u015D',\n  scnE: '\u2AB6',\n  scnap: '\u2ABA',\n  scnsim: '\u22E9',\n  scpolint: '\u2A13',\n  scsim: '\u227F',\n  scy: '\u0441',\n  sdot: '\u22C5',\n  sdotb: '\u22A1',\n  sdote: '\u2A66',\n  seArr: '\u21D8',\n  searhk: '\u2925',\n  searr: '\u2198',\n  searrow: '\u2198',\n  sect: '\u00A7',\n  semi: ';',\n  seswar: '\u2929',\n  setminus: '\u2216',\n  setmn: '\u2216',\n  sext: '\u2736',\n  sfr: '\uD835\uDD30',\n  sfrown: '\u2322',\n  sharp: '\u266F',\n  shchcy: '\u0449',\n  shcy: '\u0448',\n  shortmid: '\u2223',\n  shortparallel: '\u2225',\n  shy: '\u00AD',\n  sigma: '\u03C3',\n  sigmaf: '\u03C2',\n  sigmav: '\u03C2',\n  sim: '\u223C',\n  simdot: '\u2A6A',\n  sime: '\u2243',\n  simeq: '\u2243',\n  simg: '\u2A9E',\n  simgE: '\u2AA0',\n  siml: '\u2A9D',\n  simlE: '\u2A9F',\n  simne: '\u2246',\n  simplus: '\u2A24',\n  simrarr: '\u2972',\n  slarr: '\u2190',\n  smallsetminus: '\u2216',\n  smashp: '\u2A33',\n  smeparsl: '\u29E4',\n  smid: '\u2223',\n  smile: '\u2323',\n  smt: '\u2AAA',\n  smte: '\u2AAC',\n  smtes: '\u2AAC\uFE00',\n  softcy: '\u044C',\n  sol: '/',\n  solb: '\u29C4',\n  solbar: '\u233F',\n  sopf: '\uD835\uDD64',\n  spades: '\u2660',\n  spadesuit: '\u2660',\n  spar: '\u2225',\n  sqcap: '\u2293',\n  sqcaps: '\u2293\uFE00',\n  sqcup: '\u2294',\n  sqcups: '\u2294\uFE00',\n  sqsub: '\u228F',\n  sqsube: '\u2291',\n  sqsubset: '\u228F',\n  sqsubseteq: '\u2291',\n  sqsup: '\u2290',\n  sqsupe: '\u2292',\n  sqsupset: '\u2290',\n  sqsupseteq: '\u2292',\n  squ: '\u25A1',\n  square: '\u25A1',\n  squarf: '\u25AA',\n  squf: '\u25AA',\n  srarr: '\u2192',\n  sscr: '\uD835\uDCC8',\n  ssetmn: '\u2216',\n  ssmile: '\u2323',\n  sstarf: '\u22C6',\n  star: '\u2606',\n  starf: '\u2605',\n  straightepsilon: '\u03F5',\n  straightphi: '\u03D5',\n  strns: '\u00AF',\n  sub: '\u2282',\n  subE: '\u2AC5',\n  subdot: '\u2ABD',\n  sube: '\u2286',\n  subedot: '\u2AC3',\n  submult: '\u2AC1',\n  subnE: '\u2ACB',\n  subne: '\u228A',\n  subplus: '\u2ABF',\n  subrarr: '\u2979',\n  subset: '\u2282',\n  subseteq: '\u2286',\n  subseteqq: '\u2AC5',\n  subsetneq: '\u228A',\n  subsetneqq: '\u2ACB',\n  subsim: '\u2AC7',\n  subsub: '\u2AD5',\n  subsup: '\u2AD3',\n  succ: '\u227B',\n  succapprox: '\u2AB8',\n  succcurlyeq: '\u227D',\n  succeq: '\u2AB0',\n  succnapprox: '\u2ABA',\n  succneqq: '\u2AB6',\n  succnsim: '\u22E9',\n  succsim: '\u227F',\n  sum: '\u2211',\n  sung: '\u266A',\n  sup1: '\u00B9',\n  sup2: '\u00B2',\n  sup3: '\u00B3',\n  sup: '\u2283',\n  supE: '\u2AC6',\n  supdot: '\u2ABE',\n  supdsub: '\u2AD8',\n  supe: '\u2287',\n  supedot: '\u2AC4',\n  suphsol: '\u27C9',\n  suphsub: '\u2AD7',\n  suplarr: '\u297B',\n  supmult: '\u2AC2',\n  supnE: '\u2ACC',\n  supne: '\u228B',\n  supplus: '\u2AC0',\n  supset: '\u2283',\n  supseteq: '\u2287',\n  supseteqq: '\u2AC6',\n  supsetneq: '\u228B',\n  supsetneqq: '\u2ACC',\n  supsim: '\u2AC8',\n  supsub: '\u2AD4',\n  supsup: '\u2AD6',\n  swArr: '\u21D9',\n  swarhk: '\u2926',\n  swarr: '\u2199',\n  swarrow: '\u2199',\n  swnwar: '\u292A',\n  szlig: '\u00DF',\n  target: '\u2316',\n  tau: '\u03C4',\n  tbrk: '\u23B4',\n  tcaron: '\u0165',\n  tcedil: '\u0163',\n  tcy: '\u0442',\n  tdot: '\u20DB',\n  telrec: '\u2315',\n  tfr: '\uD835\uDD31',\n  there4: '\u2234',\n  therefore: '\u2234',\n  theta: '\u03B8',\n  thetasym: '\u03D1',\n  thetav: '\u03D1',\n  thickapprox: '\u2248',\n  thicksim: '\u223C',\n  thinsp: '\u2009',\n  thkap: '\u2248',\n  thksim: '\u223C',\n  thorn: '\u00FE',\n  tilde: '\u02DC',\n  times: '\u00D7',\n  timesb: '\u22A0',\n  timesbar: '\u2A31',\n  timesd: '\u2A30',\n  tint: '\u222D',\n  toea: '\u2928',\n  top: '\u22A4',\n  topbot: '\u2336',\n  topcir: '\u2AF1',\n  topf: '\uD835\uDD65',\n  topfork: '\u2ADA',\n  tosa: '\u2929',\n  tprime: '\u2034',\n  trade: '\u2122',\n  triangle: '\u25B5',\n  triangledown: '\u25BF',\n  triangleleft: '\u25C3',\n  trianglelefteq: '\u22B4',\n  triangleq: '\u225C',\n  triangleright: '\u25B9',\n  trianglerighteq: '\u22B5',\n  tridot: '\u25EC',\n  trie: '\u225C',\n  triminus: '\u2A3A',\n  triplus: '\u2A39',\n  trisb: '\u29CD',\n  tritime: '\u2A3B',\n  trpezium: '\u23E2',\n  tscr: '\uD835\uDCC9',\n  tscy: '\u0446',\n  tshcy: '\u045B',\n  tstrok: '\u0167',\n  twixt: '\u226C',\n  twoheadleftarrow: '\u219E',\n  twoheadrightarrow: '\u21A0',\n  uArr: '\u21D1',\n  uHar: '\u2963',\n  uacute: '\u00FA',\n  uarr: '\u2191',\n  ubrcy: '\u045E',\n  ubreve: '\u016D',\n  ucirc: '\u00FB',\n  ucy: '\u0443',\n  udarr: '\u21C5',\n  udblac: '\u0171',\n  udhar: '\u296E',\n  ufisht: '\u297E',\n  ufr: '\uD835\uDD32',\n  ugrave: '\u00F9',\n  uharl: '\u21BF',\n  uharr: '\u21BE',\n  uhblk: '\u2580',\n  ulcorn: '\u231C',\n  ulcorner: '\u231C',\n  ulcrop: '\u230F',\n  ultri: '\u25F8',\n  umacr: '\u016B',\n  uml: '\u00A8',\n  uogon: '\u0173',\n  uopf: '\uD835\uDD66',\n  uparrow: '\u2191',\n  updownarrow: '\u2195',\n  upharpoonleft: '\u21BF',\n  upharpoonright: '\u21BE',\n  uplus: '\u228E',\n  upsi: '\u03C5',\n  upsih: '\u03D2',\n  upsilon: '\u03C5',\n  upuparrows: '\u21C8',\n  urcorn: '\u231D',\n  urcorner: '\u231D',\n  urcrop: '\u230E',\n  uring: '\u016F',\n  urtri: '\u25F9',\n  uscr: '\uD835\uDCCA',\n  utdot: '\u22F0',\n  utilde: '\u0169',\n  utri: '\u25B5',\n  utrif: '\u25B4',\n  uuarr: '\u21C8',\n  uuml: '\u00FC',\n  uwangle: '\u29A7',\n  vArr: '\u21D5',\n  vBar: '\u2AE8',\n  vBarv: '\u2AE9',\n  vDash: '\u22A8',\n  vangrt: '\u299C',\n  varepsilon: '\u03F5',\n  varkappa: '\u03F0',\n  varnothing: '\u2205',\n  varphi: '\u03D5',\n  varpi: '\u03D6',\n  varpropto: '\u221D',\n  varr: '\u2195',\n  varrho: '\u03F1',\n  varsigma: '\u03C2',\n  varsubsetneq: '\u228A\uFE00',\n  varsubsetneqq: '\u2ACB\uFE00',\n  varsupsetneq: '\u228B\uFE00',\n  varsupsetneqq: '\u2ACC\uFE00',\n  vartheta: '\u03D1',\n  vartriangleleft: '\u22B2',\n  vartriangleright: '\u22B3',\n  vcy: '\u0432',\n  vdash: '\u22A2',\n  vee: '\u2228',\n  veebar: '\u22BB',\n  veeeq: '\u225A',\n  vellip: '\u22EE',\n  verbar: '|',\n  vert: '|',\n  vfr: '\uD835\uDD33',\n  vltri: '\u22B2',\n  vnsub: '\u2282\u20D2',\n  vnsup: '\u2283\u20D2',\n  vopf: '\uD835\uDD67',\n  vprop: '\u221D',\n  vrtri: '\u22B3',\n  vscr: '\uD835\uDCCB',\n  vsubnE: '\u2ACB\uFE00',\n  vsubne: '\u228A\uFE00',\n  vsupnE: '\u2ACC\uFE00',\n  vsupne: '\u228B\uFE00',\n  vzigzag: '\u299A',\n  wcirc: '\u0175',\n  wedbar: '\u2A5F',\n  wedge: '\u2227',\n  wedgeq: '\u2259',\n  weierp: '\u2118',\n  wfr: '\uD835\uDD34',\n  wopf: '\uD835\uDD68',\n  wp: '\u2118',\n  wr: '\u2240',\n  wreath: '\u2240',\n  wscr: '\uD835\uDCCC',\n  xcap: '\u22C2',\n  xcirc: '\u25EF',\n  xcup: '\u22C3',\n  xdtri: '\u25BD',\n  xfr: '\uD835\uDD35',\n  xhArr: '\u27FA',\n  xharr: '\u27F7',\n  xi: '\u03BE',\n  xlArr: '\u27F8',\n  xlarr: '\u27F5',\n  xmap: '\u27FC',\n  xnis: '\u22FB',\n  xodot: '\u2A00',\n  xopf: '\uD835\uDD69',\n  xoplus: '\u2A01',\n  xotime: '\u2A02',\n  xrArr: '\u27F9',\n  xrarr: '\u27F6',\n  xscr: '\uD835\uDCCD',\n  xsqcup: '\u2A06',\n  xuplus: '\u2A04',\n  xutri: '\u25B3',\n  xvee: '\u22C1',\n  xwedge: '\u22C0',\n  yacute: '\u00FD',\n  yacy: '\u044F',\n  ycirc: '\u0177',\n  ycy: '\u044B',\n  yen: '\u00A5',\n  yfr: '\uD835\uDD36',\n  yicy: '\u0457',\n  yopf: '\uD835\uDD6A',\n  yscr: '\uD835\uDCCE',\n  yucy: '\u044E',\n  yuml: '\u00FF',\n  zacute: '\u017A',\n  zcaron: '\u017E',\n  zcy: '\u0437',\n  zdot: '\u017C',\n  zeetrf: '\u2128',\n  zeta: '\u03B6',\n  zfr: '\uD835\uDD37',\n  zhcy: '\u0436',\n  zigrarr: '\u21DD',\n  zopf: '\uD835\uDD6B',\n  zscr: '\uD835\uDCCF',\n  zwj: '\u200D',\n  zwnj: '\u200C'\n}\n", "import {characterEntities} from 'character-entities'\n\nconst own = {}.hasOwnProperty\n\n/**\n * Decode a single character reference (without the `&` or `;`).\n * You probably only need this when you\u2019re building parsers yourself that follow\n * different rules compared to HTML.\n * This is optimized to be tiny in browsers.\n *\n * @param {string} value\n *   `notin` (named), `#123` (deci), `#x123` (hexa).\n * @returns {string|false}\n *   Decoded reference.\n */\nexport function decodeNamedCharacterReference(value) {\n  return own.call(characterEntities, value) ? characterEntities[value] : false\n}\n", "/**\n * Like `Array#splice`, but smarter for giant arrays.\n *\n * `Array#splice` takes all items to be inserted as individual argument which\n * causes a stack overflow in V8 when trying to insert 100k items for instance.\n *\n * Otherwise, this does not return the removed items, and takes `items` as an\n * array instead of rest parameters.\n *\n * @template {unknown} T\n *   Item type.\n * @param {Array<T>} list\n *   List to operate on.\n * @param {number} start\n *   Index to remove/insert at (can be negative).\n * @param {number} remove\n *   Number of items to remove.\n * @param {Array<T>} items\n *   Items to inject into `list`.\n * @returns {undefined}\n *   Nothing.\n */\nexport function splice(list, start, remove, items) {\n  const end = list.length;\n  let chunkStart = 0;\n  /** @type {Array<unknown>} */\n  let parameters;\n\n  // Make start between zero and `end` (included).\n  if (start < 0) {\n    start = -start > end ? 0 : end + start;\n  } else {\n    start = start > end ? end : start;\n  }\n  remove = remove > 0 ? remove : 0;\n\n  // No need to chunk the items if there\u2019s only a couple (10k) items.\n  if (items.length < 10000) {\n    parameters = Array.from(items);\n    parameters.unshift(start, remove);\n    // @ts-expect-error Hush, it\u2019s fine.\n    list.splice(...parameters);\n  } else {\n    // Delete `remove` items starting from `start`\n    if (remove) list.splice(start, remove);\n\n    // Insert the items in chunks to not cause stack overflows.\n    while (chunkStart < items.length) {\n      parameters = items.slice(chunkStart, chunkStart + 10000);\n      parameters.unshift(start, 0);\n      // @ts-expect-error Hush, it\u2019s fine.\n      list.splice(...parameters);\n      chunkStart += 10000;\n      start += 10000;\n    }\n  }\n}\n\n/**\n * Append `items` (an array) at the end of `list` (another array).\n * When `list` was empty, returns `items` instead.\n *\n * This prevents a potentially expensive operation when `list` is empty,\n * and adds items in batches to prevent V8 from hanging.\n *\n * @template {unknown} T\n *   Item type.\n * @param {Array<T>} list\n *   List to operate on.\n * @param {Array<T>} items\n *   Items to add to `list`.\n * @returns {Array<T>}\n *   Either `list` or `items`.\n */\nexport function push(list, items) {\n  if (list.length > 0) {\n    splice(list, list.length, 0, items);\n    return list;\n  }\n  return items;\n}", "/**\n * @import {\n *   Extension,\n *   Handles,\n *   HtmlExtension,\n *   NormalizedExtension\n * } from 'micromark-util-types'\n */\n\nimport {splice} from 'micromark-util-chunked'\n\nconst hasOwnProperty = {}.hasOwnProperty\n\n/**\n * Combine multiple syntax extensions into one.\n *\n * @param {ReadonlyArray<Extension>} extensions\n *   List of syntax extensions.\n * @returns {NormalizedExtension}\n *   A single combined extension.\n */\nexport function combineExtensions(extensions) {\n  /** @type {NormalizedExtension} */\n  const all = {}\n  let index = -1\n\n  while (++index < extensions.length) {\n    syntaxExtension(all, extensions[index])\n  }\n\n  return all\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {NormalizedExtension} all\n *   Extension to merge into.\n * @param {Extension} extension\n *   Extension to merge.\n * @returns {undefined}\n *   Nothing.\n */\nfunction syntaxExtension(all, extension) {\n  /** @type {keyof Extension} */\n  let hook\n\n  for (hook in extension) {\n    const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n    /** @type {Record<string, unknown>} */\n    const left = maybe || (all[hook] = {})\n    /** @type {Record<string, unknown> | undefined} */\n    const right = extension[hook]\n    /** @type {string} */\n    let code\n\n    if (right) {\n      for (code in right) {\n        if (!hasOwnProperty.call(left, code)) left[code] = []\n        const value = right[code]\n        constructs(\n          // @ts-expect-error Looks like a list.\n          left[code],\n          Array.isArray(value) ? value : value ? [value] : []\n        )\n      }\n    }\n  }\n}\n\n/**\n * Merge `list` into `existing` (both lists of constructs).\n * Mutates `existing`.\n *\n * @param {Array<unknown>} existing\n *   List of constructs to merge into.\n * @param {Array<unknown>} list\n *   List of constructs to merge.\n * @returns {undefined}\n *   Nothing.\n */\nfunction constructs(existing, list) {\n  let index = -1\n  /** @type {Array<unknown>} */\n  const before = []\n\n  while (++index < list.length) {\n    // @ts-expect-error Looks like an object.\n    ;(list[index].add === 'after' ? existing : before).push(list[index])\n  }\n\n  splice(existing, 0, 0, before)\n}\n\n/**\n * Combine multiple HTML extensions into one.\n *\n * @param {ReadonlyArray<HtmlExtension>} htmlExtensions\n *   List of HTML extensions.\n * @returns {HtmlExtension}\n *   Single combined HTML extension.\n */\nexport function combineHtmlExtensions(htmlExtensions) {\n  /** @type {HtmlExtension} */\n  const handlers = {}\n  let index = -1\n\n  while (++index < htmlExtensions.length) {\n    htmlExtension(handlers, htmlExtensions[index])\n  }\n\n  return handlers\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {HtmlExtension} all\n *   Extension to merge into.\n * @param {HtmlExtension} extension\n *   Extension to merge.\n * @returns {undefined}\n *   Nothing.\n */\nfunction htmlExtension(all, extension) {\n  /** @type {keyof HtmlExtension} */\n  let hook\n\n  for (hook in extension) {\n    const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n    const left = maybe || (all[hook] = {})\n    const right = extension[hook]\n    /** @type {keyof Handles} */\n    let type\n\n    if (right) {\n      for (type in right) {\n        // @ts-expect-error assume document vs regular handler are managed correctly.\n        left[type] = right[type]\n      }\n    }\n  }\n}\n", "/**\n * Turn the number (in string form as either hexa- or plain decimal) coming from\n * a numeric character reference into a character.\n *\n * Sort of like `String.fromCodePoint(Number.parseInt(value, base))`, but makes\n * non-characters and control characters safe.\n *\n * @param {string} value\n *   Value to decode.\n * @param {number} base\n *   Numeric base.\n * @returns {string}\n *   Character.\n */\nexport function decodeNumericCharacterReference(value, base) {\n  const code = Number.parseInt(value, base);\n  if (\n  // C0 except for HT, LF, FF, CR, space.\n  code < 9 || code === 11 || code > 13 && code < 32 ||\n  // Control character (DEL) of C0, and C1 controls.\n  code > 126 && code < 160 ||\n  // Lone high surrogates and low surrogates.\n  code > 55_295 && code < 57_344 ||\n  // Noncharacters.\n  code > 64_975 && code < 65_008 || /* eslint-disable no-bitwise */\n  (code & 65_535) === 65_535 || (code & 65_535) === 65_534 || /* eslint-enable no-bitwise */\n  // Out of range\n  code > 1_114_111) {\n    return \"\\uFFFD\";\n  }\n  return String.fromCodePoint(code);\n}", "/**\n * Normalize an identifier (as found in references, definitions).\n *\n * Collapses markdown whitespace, trim, and then lower- and uppercase.\n *\n * Some characters are considered \u201Cuppercase\u201D, such as U+03F4 (`\u03F4`), but if their\n * lowercase counterpart (U+03B8 (`\u03B8`)) is uppercased will result in a different\n * uppercase character (U+0398 (`\u0398`)).\n * So, to get a canonical form, we perform both lower- and uppercase.\n *\n * Using uppercase last makes sure keys will never interact with default\n * prototypal values (such as `constructor`): nothing in the prototype of\n * `Object` is uppercase.\n *\n * @param {string} value\n *   Identifier to normalize.\n * @returns {string}\n *   Normalized identifier.\n */\nexport function normalizeIdentifier(value) {\n  return value\n  // Collapse markdown whitespace.\n  .replace(/[\\t\\n\\r ]+/g, \" \")\n  // Trim.\n  .replace(/^ | $/g, '')\n  // Some characters are considered \u201Cuppercase\u201D, but if their lowercase\n  // counterpart is uppercased will result in a different uppercase\n  // character.\n  // Hence, to get that form, we perform both lower- and uppercase.\n  // Upper case makes sure keys will not interact with default prototypal\n  // methods: no method is uppercase.\n  .toLowerCase().toUpperCase();\n}", "/**\n * @import {Code} from 'micromark-util-types'\n */\n\n/**\n * Check whether the character code represents an ASCII alpha (`a` through `z`,\n * case insensitive).\n *\n * An **ASCII alpha** is an ASCII upper alpha or ASCII lower alpha.\n *\n * An **ASCII upper alpha** is a character in the inclusive range U+0041 (`A`)\n * to U+005A (`Z`).\n *\n * An **ASCII lower alpha** is a character in the inclusive range U+0061 (`a`)\n * to U+007A (`z`).\n *\n * @param code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport const asciiAlpha = regexCheck(/[A-Za-z]/);\n\n/**\n * Check whether the character code represents an ASCII alphanumeric (`a`\n * through `z`, case insensitive, or `0` through `9`).\n *\n * An **ASCII alphanumeric** is an ASCII digit (see `asciiDigit`) or ASCII alpha\n * (see `asciiAlpha`).\n *\n * @param code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport const asciiAlphanumeric = regexCheck(/[\\dA-Za-z]/);\n\n/**\n * Check whether the character code represents an ASCII atext.\n *\n * atext is an ASCII alphanumeric (see `asciiAlphanumeric`), or a character in\n * the inclusive ranges U+0023 NUMBER SIGN (`#`) to U+0027 APOSTROPHE (`'`),\n * U+002A ASTERISK (`*`), U+002B PLUS SIGN (`+`), U+002D DASH (`-`), U+002F\n * SLASH (`/`), U+003D EQUALS TO (`=`), U+003F QUESTION MARK (`?`), U+005E\n * CARET (`^`) to U+0060 GRAVE ACCENT (`` ` ``), or U+007B LEFT CURLY BRACE\n * (`{`) to U+007E TILDE (`~`).\n *\n * See:\n * **\\[RFC5322]**:\n * [Internet Message Format](https://tools.ietf.org/html/rfc5322).\n * P. Resnick.\n * IETF.\n *\n * @param code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport const asciiAtext = regexCheck(/[#-'*+\\--9=?A-Z^-~]/);\n\n/**\n * Check whether a character code is an ASCII control character.\n *\n * An **ASCII control** is a character in the inclusive range U+0000 NULL (NUL)\n * to U+001F (US), or U+007F (DEL).\n *\n * @param {Code} code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport function asciiControl(code) {\n  return (\n    // Special whitespace codes (which have negative values), C0 and Control\n    // character DEL\n    code !== null && (code < 32 || code === 127)\n  );\n}\n\n/**\n * Check whether the character code represents an ASCII digit (`0` through `9`).\n *\n * An **ASCII digit** is a character in the inclusive range U+0030 (`0`) to\n * U+0039 (`9`).\n *\n * @param code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport const asciiDigit = regexCheck(/\\d/);\n\n/**\n * Check whether the character code represents an ASCII hex digit (`a` through\n * `f`, case insensitive, or `0` through `9`).\n *\n * An **ASCII hex digit** is an ASCII digit (see `asciiDigit`), ASCII upper hex\n * digit, or an ASCII lower hex digit.\n *\n * An **ASCII upper hex digit** is a character in the inclusive range U+0041\n * (`A`) to U+0046 (`F`).\n *\n * An **ASCII lower hex digit** is a character in the inclusive range U+0061\n * (`a`) to U+0066 (`f`).\n *\n * @param code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport const asciiHexDigit = regexCheck(/[\\dA-Fa-f]/);\n\n/**\n * Check whether the character code represents ASCII punctuation.\n *\n * An **ASCII punctuation** is a character in the inclusive ranges U+0021\n * EXCLAMATION MARK (`!`) to U+002F SLASH (`/`), U+003A COLON (`:`) to U+0040 AT\n * SIGN (`@`), U+005B LEFT SQUARE BRACKET (`[`) to U+0060 GRAVE ACCENT\n * (`` ` ``), or U+007B LEFT CURLY BRACE (`{`) to U+007E TILDE (`~`).\n *\n * @param code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport const asciiPunctuation = regexCheck(/[!-/:-@[-`{-~]/);\n\n/**\n * Check whether a character code is a markdown line ending.\n *\n * A **markdown line ending** is the virtual characters M-0003 CARRIAGE RETURN\n * LINE FEED (CRLF), M-0004 LINE FEED (LF) and M-0005 CARRIAGE RETURN (CR).\n *\n * In micromark, the actual character U+000A LINE FEED (LF) and U+000D CARRIAGE\n * RETURN (CR) are replaced by these virtual characters depending on whether\n * they occurred together.\n *\n * @param {Code} code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport function markdownLineEnding(code) {\n  return code !== null && code < -2;\n}\n\n/**\n * Check whether a character code is a markdown line ending (see\n * `markdownLineEnding`) or markdown space (see `markdownSpace`).\n *\n * @param {Code} code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport function markdownLineEndingOrSpace(code) {\n  return code !== null && (code < 0 || code === 32);\n}\n\n/**\n * Check whether a character code is a markdown space.\n *\n * A **markdown space** is the concrete character U+0020 SPACE (SP) and the\n * virtual characters M-0001 VIRTUAL SPACE (VS) and M-0002 HORIZONTAL TAB (HT).\n *\n * In micromark, the actual character U+0009 CHARACTER TABULATION (HT) is\n * replaced by one M-0002 HORIZONTAL TAB (HT) and between 0 and 3 M-0001 VIRTUAL\n * SPACE (VS) characters, depending on the column at which the tab occurred.\n *\n * @param {Code} code\n *   Code.\n * @returns {boolean}\n *   Whether it matches.\n */\nexport function markdownSpace(code) {\n  return code === -2 || code === -1 || code === 32;\n}\n\n// Size note: removing ASCII from the regex and using `asciiPunctuation` here\n// In fact adds to the bundle size.\n/**\n * Check whether the character code represents Unicode punctuation.\n *\n * A **Unicode punctuation** is a character in the Unicode `Pc` (Punctuation,\n * Connector), `Pd` (Punctuation, Dash), `Pe` (Punctuation, Close), `Pf`\n * (Punctuation, Final quote), `Pi` (Punctuation, Initial quote), `Po`\n * (Punctuation, Other), or `Ps` (Punctuation, Open) categories, or an ASCII\n * punctuation (see `asciiPunctuation`).\n *\n * See:\n * **\\[UNICODE]**:\n * [The Unicode Standard](https://www.unicode.org/versions/).\n * Unicode Consortium.\n *\n * @param code\n *   Code.\n * @returns\n *   Whether it matches.\n */\nexport const unicodePunctuation = regexCheck(/\\p{P}|\\p{S}/u);\n\n/**\n * Check whether the character code represents Unicode whitespace.\n *\n * Note that this does handle micromark specific markdown whitespace characters.\n * See `markdownLineEndingOrSpace` to check that.\n *\n * A **Unicode whitespace** is a character in the Unicode `Zs` (Separator,\n * Space) category, or U+0009 CHARACTER TABULATION (HT), U+000A LINE FEED (LF),\n * U+000C (FF), or U+000D CARRIAGE RETURN (CR) (**\\[UNICODE]**).\n *\n * See:\n * **\\[UNICODE]**:\n * [The Unicode Standard](https://www.unicode.org/versions/).\n * Unicode Consortium.\n *\n * @param code\n *   Code.\n * @returns\n *   Whether it matches.\n */\nexport const unicodeWhitespace = regexCheck(/\\s/);\n\n/**\n * Create a code check from a regex.\n *\n * @param {RegExp} regex\n *   Expression.\n * @returns {(code: Code) => boolean}\n *   Check.\n */\nfunction regexCheck(regex) {\n  return check;\n\n  /**\n   * Check whether a code matches the bound regex.\n   *\n   * @param {Code} code\n   *   Character code.\n   * @returns {boolean}\n   *   Whether the character code matches the bound regex.\n   */\n  function check(code) {\n    return code !== null && code > -1 && regex.test(String.fromCharCode(code));\n  }\n}", "import { asciiAlphanumeric } from 'micromark-util-character';\nimport { encode } from 'micromark-util-encode';\n/**\n * Make a value safe for injection as a URL.\n *\n * This encodes unsafe characters with percent-encoding and skips already\n * encoded sequences (see `normalizeUri`).\n * Further unsafe characters are encoded as character references (see\n * `micromark-util-encode`).\n *\n * A regex of allowed protocols can be given, in which case the URL is\n * sanitized.\n * For example, `/^(https?|ircs?|mailto|xmpp)$/i` can be used for `a[href]`, or\n * `/^https?$/i` for `img[src]` (this is what `github.com` allows).\n * If the URL includes an unknown protocol (one not matched by `protocol`, such\n * as a dangerous example, `javascript:`), the value is ignored.\n *\n * @param {string | null | undefined} url\n *   URI to sanitize.\n * @param {RegExp | null | undefined} [protocol]\n *   Allowed protocols.\n * @returns {string}\n *   Sanitized URI.\n */\nexport function sanitizeUri(url, protocol) {\n  const value = encode(normalizeUri(url || ''));\n  if (!protocol) {\n    return value;\n  }\n  const colon = value.indexOf(':');\n  const questionMark = value.indexOf('?');\n  const numberSign = value.indexOf('#');\n  const slash = value.indexOf('/');\n  if (\n  // If there is no protocol, it\u2019s relative.\n  colon < 0 ||\n  // If the first colon is after a `?`, `#`, or `/`, it\u2019s not a protocol.\n  slash > -1 && colon > slash || questionMark > -1 && colon > questionMark || numberSign > -1 && colon > numberSign ||\n  // It is a protocol, it should be allowed.\n  protocol.test(value.slice(0, colon))) {\n    return value;\n  }\n  return '';\n}\n\n/**\n * Normalize a URL.\n *\n * Encode unsafe characters with percent-encoding, skipping already encoded\n * sequences.\n *\n * @param {string} value\n *   URI to normalize.\n * @returns {string}\n *   Normalized URI.\n */\nexport function normalizeUri(value) {\n  /** @type {Array<string>} */\n  const result = [];\n  let index = -1;\n  let start = 0;\n  let skip = 0;\n  while (++index < value.length) {\n    const code = value.charCodeAt(index);\n    /** @type {string} */\n    let replace = '';\n\n    // A correct percent encoded value.\n    if (code === 37 && asciiAlphanumeric(value.charCodeAt(index + 1)) && asciiAlphanumeric(value.charCodeAt(index + 2))) {\n      skip = 2;\n    }\n    // ASCII.\n    else if (code < 128) {\n      if (!/[!#$&-;=?-Z_a-z~]/.test(String.fromCharCode(code))) {\n        replace = String.fromCharCode(code);\n      }\n    }\n    // Astral.\n    else if (code > 55_295 && code < 57_344) {\n      const next = value.charCodeAt(index + 1);\n\n      // A correct surrogate pair.\n      if (code < 56_320 && next > 56_319 && next < 57_344) {\n        replace = String.fromCharCode(code, next);\n        skip = 1;\n      }\n      // Lone surrogate.\n      else {\n        replace = \"\\uFFFD\";\n      }\n    }\n    // Unicode.\n    else {\n      replace = String.fromCharCode(code);\n    }\n    if (replace) {\n      result.push(value.slice(start, index), encodeURIComponent(replace));\n      start = index + skip + 1;\n      replace = '';\n    }\n    if (skip) {\n      index += skip;\n      skip = 0;\n    }\n  }\n  return result.join('') + value.slice(start);\n}", "/**\n * @import {Effects, State, TokenType} from 'micromark-util-types'\n */\n\nimport { markdownSpace } from 'micromark-util-character';\n\n// To do: implement `spaceOrTab`, `spaceOrTabMinMax`, `spaceOrTabWithOptions`.\n\n/**\n * Parse spaces and tabs.\n *\n * There is no `nok` parameter:\n *\n * *   spaces in markdown are often optional, in which case this factory can be\n *     used and `ok` will be switched to whether spaces were found or not\n * *   one line ending or space can be detected with `markdownSpace(code)` right\n *     before using `factorySpace`\n *\n * ###### Examples\n *\n * Where `\u2409` represents a tab (plus how much it expands) and `\u2420` represents a\n * single space.\n *\n * ```markdown\n * \u2409\n * \u2420\u2420\u2420\u2420\n * \u2409\u2420\n * ```\n *\n * @param {Effects} effects\n *   Context.\n * @param {State} ok\n *   State switched to when successful.\n * @param {TokenType} type\n *   Type (`' \\t'`).\n * @param {number | undefined} [max=Infinity]\n *   Max (exclusive).\n * @returns {State}\n *   Start state.\n */\nexport function factorySpace(effects, ok, type, max) {\n  const limit = max ? max - 1 : Number.POSITIVE_INFINITY;\n  let size = 0;\n  return start;\n\n  /** @type {State} */\n  function start(code) {\n    if (markdownSpace(code)) {\n      effects.enter(type);\n      return prefix(code);\n    }\n    return ok(code);\n  }\n\n  /** @type {State} */\n  function prefix(code) {\n    if (markdownSpace(code) && size++ < limit) {\n      effects.consume(code);\n      return prefix;\n    }\n    effects.exit(type);\n    return ok(code);\n  }\n}", "/**\n * @import {\n *   InitialConstruct,\n *   Initializer,\n *   State,\n *   TokenizeContext,\n *   Token\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding } from 'micromark-util-character';\n/** @type {InitialConstruct} */\nexport const content = {\n  tokenize: initializeContent\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Initializer}\n *   Content.\n */\nfunction initializeContent(effects) {\n  const contentStart = effects.attempt(this.parser.constructs.contentInitial, afterContentStartConstruct, paragraphInitial);\n  /** @type {Token} */\n  let previous;\n  return contentStart;\n\n  /** @type {State} */\n  function afterContentStartConstruct(code) {\n    if (code === null) {\n      effects.consume(code);\n      return;\n    }\n    effects.enter(\"lineEnding\");\n    effects.consume(code);\n    effects.exit(\"lineEnding\");\n    return factorySpace(effects, contentStart, \"linePrefix\");\n  }\n\n  /** @type {State} */\n  function paragraphInitial(code) {\n    effects.enter(\"paragraph\");\n    return lineStart(code);\n  }\n\n  /** @type {State} */\n  function lineStart(code) {\n    const token = effects.enter(\"chunkText\", {\n      contentType: \"text\",\n      previous\n    });\n    if (previous) {\n      previous.next = token;\n    }\n    previous = token;\n    return data(code);\n  }\n\n  /** @type {State} */\n  function data(code) {\n    if (code === null) {\n      effects.exit(\"chunkText\");\n      effects.exit(\"paragraph\");\n      effects.consume(code);\n      return;\n    }\n    if (markdownLineEnding(code)) {\n      effects.consume(code);\n      effects.exit(\"chunkText\");\n      return lineStart;\n    }\n\n    // Data.\n    effects.consume(code);\n    return data;\n  }\n}", "/**\n * @import {\n *   Construct,\n *   ContainerState,\n *   InitialConstruct,\n *   Initializer,\n *   Point,\n *   State,\n *   TokenizeContext,\n *   Tokenizer,\n *   Token\n * } from 'micromark-util-types'\n */\n\n/**\n * @typedef {[Construct, ContainerState]} StackItem\n *   Construct and its state.\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding } from 'micromark-util-character';\nimport { splice } from 'micromark-util-chunked';\n/** @type {InitialConstruct} */\nexport const document = {\n  tokenize: initializeDocument\n};\n\n/** @type {Construct} */\nconst containerConstruct = {\n  tokenize: tokenizeContainer\n};\n\n/**\n * @this {TokenizeContext}\n *   Self.\n * @type {Initializer}\n *   Initializer.\n */\nfunction initializeDocument(effects) {\n  const self = this;\n  /** @type {Array<StackItem>} */\n  const stack = [];\n  let continued = 0;\n  /** @type {TokenizeContext | undefined} */\n  let childFlow;\n  /** @type {Token | undefined} */\n  let childToken;\n  /** @type {number} */\n  let lineStartOffset;\n  return start;\n\n  /** @type {State} */\n  function start(code) {\n    // First we iterate through the open blocks, starting with the root\n    // document, and descending through last children down to the last open\n    // block.\n    // Each block imposes a condition that the line must satisfy if the block is\n    // to remain open.\n    // For example, a block quote requires a `>` character.\n    // A paragraph requires a non-blank line.\n    // In this phase we may match all or just some of the open blocks.\n    // But we cannot close unmatched blocks yet, because we may have a lazy\n    // continuation line.\n    if (continued < stack.length) {\n      const item = stack[continued];\n      self.containerState = item[1];\n      return effects.attempt(item[0].continuation, documentContinue, checkNewContainers)(code);\n    }\n\n    // Done.\n    return checkNewContainers(code);\n  }\n\n  /** @type {State} */\n  function documentContinue(code) {\n    continued++;\n\n    // Note: this field is called `_closeFlow` but it also closes containers.\n    // Perhaps a good idea to rename it but it\u2019s already used in the wild by\n    // extensions.\n    if (self.containerState._closeFlow) {\n      self.containerState._closeFlow = undefined;\n      if (childFlow) {\n        closeFlow();\n      }\n\n      // Note: this algorithm for moving events around is similar to the\n      // algorithm when dealing with lazy lines in `writeToChild`.\n      const indexBeforeExits = self.events.length;\n      let indexBeforeFlow = indexBeforeExits;\n      /** @type {Point | undefined} */\n      let point;\n\n      // Find the flow chunk.\n      while (indexBeforeFlow--) {\n        if (self.events[indexBeforeFlow][0] === 'exit' && self.events[indexBeforeFlow][1].type === \"chunkFlow\") {\n          point = self.events[indexBeforeFlow][1].end;\n          break;\n        }\n      }\n      exitContainers(continued);\n\n      // Fix positions.\n      let index = indexBeforeExits;\n      while (index < self.events.length) {\n        self.events[index][1].end = {\n          ...point\n        };\n        index++;\n      }\n\n      // Inject the exits earlier (they\u2019re still also at the end).\n      splice(self.events, indexBeforeFlow + 1, 0, self.events.slice(indexBeforeExits));\n\n      // Discard the duplicate exits.\n      self.events.length = index;\n      return checkNewContainers(code);\n    }\n    return start(code);\n  }\n\n  /** @type {State} */\n  function checkNewContainers(code) {\n    // Next, after consuming the continuation markers for existing blocks, we\n    // look for new block starts (e.g. `>` for a block quote).\n    // If we encounter a new block start, we close any blocks unmatched in\n    // step 1 before creating the new block as a child of the last matched\n    // block.\n    if (continued === stack.length) {\n      // No need to `check` whether there\u2019s a container, of `exitContainers`\n      // would be moot.\n      // We can instead immediately `attempt` to parse one.\n      if (!childFlow) {\n        return documentContinued(code);\n      }\n\n      // If we have concrete content, such as block HTML or fenced code,\n      // we can\u2019t have containers \u201Cpierce\u201D into them, so we can immediately\n      // start.\n      if (childFlow.currentConstruct && childFlow.currentConstruct.concrete) {\n        return flowStart(code);\n      }\n\n      // If we do have flow, it could still be a blank line,\n      // but we\u2019d be interrupting it w/ a new container if there\u2019s a current\n      // construct.\n      // To do: next major: remove `_gfmTableDynamicInterruptHack` (no longer\n      // needed in micromark-extension-gfm-table@1.0.6).\n      self.interrupt = Boolean(childFlow.currentConstruct && !childFlow._gfmTableDynamicInterruptHack);\n    }\n\n    // Check if there is a new container.\n    self.containerState = {};\n    return effects.check(containerConstruct, thereIsANewContainer, thereIsNoNewContainer)(code);\n  }\n\n  /** @type {State} */\n  function thereIsANewContainer(code) {\n    if (childFlow) closeFlow();\n    exitContainers(continued);\n    return documentContinued(code);\n  }\n\n  /** @type {State} */\n  function thereIsNoNewContainer(code) {\n    self.parser.lazy[self.now().line] = continued !== stack.length;\n    lineStartOffset = self.now().offset;\n    return flowStart(code);\n  }\n\n  /** @type {State} */\n  function documentContinued(code) {\n    // Try new containers.\n    self.containerState = {};\n    return effects.attempt(containerConstruct, containerContinue, flowStart)(code);\n  }\n\n  /** @type {State} */\n  function containerContinue(code) {\n    continued++;\n    stack.push([self.currentConstruct, self.containerState]);\n    // Try another.\n    return documentContinued(code);\n  }\n\n  /** @type {State} */\n  function flowStart(code) {\n    if (code === null) {\n      if (childFlow) closeFlow();\n      exitContainers(0);\n      effects.consume(code);\n      return;\n    }\n    childFlow = childFlow || self.parser.flow(self.now());\n    effects.enter(\"chunkFlow\", {\n      _tokenizer: childFlow,\n      contentType: \"flow\",\n      previous: childToken\n    });\n    return flowContinue(code);\n  }\n\n  /** @type {State} */\n  function flowContinue(code) {\n    if (code === null) {\n      writeToChild(effects.exit(\"chunkFlow\"), true);\n      exitContainers(0);\n      effects.consume(code);\n      return;\n    }\n    if (markdownLineEnding(code)) {\n      effects.consume(code);\n      writeToChild(effects.exit(\"chunkFlow\"));\n      // Get ready for the next line.\n      continued = 0;\n      self.interrupt = undefined;\n      return start;\n    }\n    effects.consume(code);\n    return flowContinue;\n  }\n\n  /**\n   * @param {Token} token\n   *   Token.\n   * @param {boolean | undefined} [endOfFile]\n   *   Whether the token is at the end of the file (default: `false`).\n   * @returns {undefined}\n   *   Nothing.\n   */\n  function writeToChild(token, endOfFile) {\n    const stream = self.sliceStream(token);\n    if (endOfFile) stream.push(null);\n    token.previous = childToken;\n    if (childToken) childToken.next = token;\n    childToken = token;\n    childFlow.defineSkip(token.start);\n    childFlow.write(stream);\n\n    // Alright, so we just added a lazy line:\n    //\n    // ```markdown\n    // > a\n    // b.\n    //\n    // Or:\n    //\n    // > ~~~c\n    // d\n    //\n    // Or:\n    //\n    // > | e |\n    // f\n    // ```\n    //\n    // The construct in the second example (fenced code) does not accept lazy\n    // lines, so it marked itself as done at the end of its first line, and\n    // then the content construct parses `d`.\n    // Most constructs in markdown match on the first line: if the first line\n    // forms a construct, a non-lazy line can\u2019t \u201Cunmake\u201D it.\n    //\n    // The construct in the third example is potentially a GFM table, and\n    // those are *weird*.\n    // It *could* be a table, from the first line, if the following line\n    // matches a condition.\n    // In this case, that second line is lazy, which \u201Cunmakes\u201D the first line\n    // and turns the whole into one content block.\n    //\n    // We\u2019ve now parsed the non-lazy and the lazy line, and can figure out\n    // whether the lazy line started a new flow block.\n    // If it did, we exit the current containers between the two flow blocks.\n    if (self.parser.lazy[token.start.line]) {\n      let index = childFlow.events.length;\n      while (index--) {\n        if (\n        // The token starts before the line ending\u2026\n        childFlow.events[index][1].start.offset < lineStartOffset && (\n        // \u2026and either is not ended yet\u2026\n        !childFlow.events[index][1].end ||\n        // \u2026or ends after it.\n        childFlow.events[index][1].end.offset > lineStartOffset)) {\n          // Exit: there\u2019s still something open, which means it\u2019s a lazy line\n          // part of something.\n          return;\n        }\n      }\n\n      // Note: this algorithm for moving events around is similar to the\n      // algorithm when closing flow in `documentContinue`.\n      const indexBeforeExits = self.events.length;\n      let indexBeforeFlow = indexBeforeExits;\n      /** @type {boolean | undefined} */\n      let seen;\n      /** @type {Point | undefined} */\n      let point;\n\n      // Find the previous chunk (the one before the lazy line).\n      while (indexBeforeFlow--) {\n        if (self.events[indexBeforeFlow][0] === 'exit' && self.events[indexBeforeFlow][1].type === \"chunkFlow\") {\n          if (seen) {\n            point = self.events[indexBeforeFlow][1].end;\n            break;\n          }\n          seen = true;\n        }\n      }\n      exitContainers(continued);\n\n      // Fix positions.\n      index = indexBeforeExits;\n      while (index < self.events.length) {\n        self.events[index][1].end = {\n          ...point\n        };\n        index++;\n      }\n\n      // Inject the exits earlier (they\u2019re still also at the end).\n      splice(self.events, indexBeforeFlow + 1, 0, self.events.slice(indexBeforeExits));\n\n      // Discard the duplicate exits.\n      self.events.length = index;\n    }\n  }\n\n  /**\n   * @param {number} size\n   *   Size.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  function exitContainers(size) {\n    let index = stack.length;\n\n    // Exit open containers.\n    while (index-- > size) {\n      const entry = stack[index];\n      self.containerState = entry[1];\n      entry[0].exit.call(self, effects);\n    }\n    stack.length = size;\n  }\n  function closeFlow() {\n    childFlow.write([null]);\n    childToken = undefined;\n    childFlow = undefined;\n    self.containerState._closeFlow = undefined;\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n *   Tokenizer.\n */\nfunction tokenizeContainer(effects, ok, nok) {\n  // Always populated by defaults.\n\n  return factorySpace(effects, effects.attempt(this.parser.constructs.document, ok, nok), \"linePrefix\", this.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4);\n}", "/**\n * @import {Code} from 'micromark-util-types'\n */\n\nimport { markdownLineEndingOrSpace, unicodePunctuation, unicodeWhitespace } from 'micromark-util-character';\n/**\n * Classify whether a code represents whitespace, punctuation, or something\n * else.\n *\n * Used for attention (emphasis, strong), whose sequences can open or close\n * based on the class of surrounding characters.\n *\n * > \uD83D\uDC49 **Note**: eof (`null`) is seen as whitespace.\n *\n * @param {Code} code\n *   Code.\n * @returns {typeof constants.characterGroupWhitespace | typeof constants.characterGroupPunctuation | undefined}\n *   Group.\n */\nexport function classifyCharacter(code) {\n  if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n    return 1;\n  }\n  if (unicodePunctuation(code)) {\n    return 2;\n  }\n}", "/**\n * @import {Event, Resolver, TokenizeContext} from 'micromark-util-types'\n */\n\n/**\n * Call all `resolveAll`s.\n *\n * @param {ReadonlyArray<{resolveAll?: Resolver | undefined}>} constructs\n *   List of constructs, optionally with `resolveAll`s.\n * @param {Array<Event>} events\n *   List of events.\n * @param {TokenizeContext} context\n *   Context used by `tokenize`.\n * @returns {Array<Event>}\n *   Changed events.\n */\nexport function resolveAll(constructs, events, context) {\n  /** @type {Array<Resolver>} */\n  const called = []\n  let index = -1\n\n  while (++index < constructs.length) {\n    const resolve = constructs[index].resolveAll\n\n    if (resolve && !called.includes(resolve)) {\n      events = resolve(events, context)\n      called.push(resolve)\n    }\n  }\n\n  return events\n}\n", "/**\n * @import {\n *   Code,\n *   Construct,\n *   Event,\n *   Point,\n *   Resolver,\n *   State,\n *   TokenizeContext,\n *   Tokenizer,\n *   Token\n * } from 'micromark-util-types'\n */\n\nimport { push, splice } from 'micromark-util-chunked';\nimport { classifyCharacter } from 'micromark-util-classify-character';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/** @type {Construct} */\nexport const attention = {\n  name: 'attention',\n  resolveAll: resolveAllAttention,\n  tokenize: tokenizeAttention\n};\n\n/**\n * Take all events and resolve attention to emphasis or strong.\n *\n * @type {Resolver}\n */\n// eslint-disable-next-line complexity\nfunction resolveAllAttention(events, context) {\n  let index = -1;\n  /** @type {number} */\n  let open;\n  /** @type {Token} */\n  let group;\n  /** @type {Token} */\n  let text;\n  /** @type {Token} */\n  let openingSequence;\n  /** @type {Token} */\n  let closingSequence;\n  /** @type {number} */\n  let use;\n  /** @type {Array<Event>} */\n  let nextEvents;\n  /** @type {number} */\n  let offset;\n\n  // Walk through all events.\n  //\n  // Note: performance of this is fine on an mb of normal markdown, but it\u2019s\n  // a bottleneck for malicious stuff.\n  while (++index < events.length) {\n    // Find a token that can close.\n    if (events[index][0] === 'enter' && events[index][1].type === 'attentionSequence' && events[index][1]._close) {\n      open = index;\n\n      // Now walk back to find an opener.\n      while (open--) {\n        // Find a token that can open the closer.\n        if (events[open][0] === 'exit' && events[open][1].type === 'attentionSequence' && events[open][1]._open &&\n        // If the markers are the same:\n        context.sliceSerialize(events[open][1]).charCodeAt(0) === context.sliceSerialize(events[index][1]).charCodeAt(0)) {\n          // If the opening can close or the closing can open,\n          // and the close size *is not* a multiple of three,\n          // but the sum of the opening and closing size *is* multiple of three,\n          // then don\u2019t match.\n          if ((events[open][1]._close || events[index][1]._open) && (events[index][1].end.offset - events[index][1].start.offset) % 3 && !((events[open][1].end.offset - events[open][1].start.offset + events[index][1].end.offset - events[index][1].start.offset) % 3)) {\n            continue;\n          }\n\n          // Number of markers to use from the sequence.\n          use = events[open][1].end.offset - events[open][1].start.offset > 1 && events[index][1].end.offset - events[index][1].start.offset > 1 ? 2 : 1;\n          const start = {\n            ...events[open][1].end\n          };\n          const end = {\n            ...events[index][1].start\n          };\n          movePoint(start, -use);\n          movePoint(end, use);\n          openingSequence = {\n            type: use > 1 ? \"strongSequence\" : \"emphasisSequence\",\n            start,\n            end: {\n              ...events[open][1].end\n            }\n          };\n          closingSequence = {\n            type: use > 1 ? \"strongSequence\" : \"emphasisSequence\",\n            start: {\n              ...events[index][1].start\n            },\n            end\n          };\n          text = {\n            type: use > 1 ? \"strongText\" : \"emphasisText\",\n            start: {\n              ...events[open][1].end\n            },\n            end: {\n              ...events[index][1].start\n            }\n          };\n          group = {\n            type: use > 1 ? \"strong\" : \"emphasis\",\n            start: {\n              ...openingSequence.start\n            },\n            end: {\n              ...closingSequence.end\n            }\n          };\n          events[open][1].end = {\n            ...openingSequence.start\n          };\n          events[index][1].start = {\n            ...closingSequence.end\n          };\n          nextEvents = [];\n\n          // If there are more markers in the opening, add them before.\n          if (events[open][1].end.offset - events[open][1].start.offset) {\n            nextEvents = push(nextEvents, [['enter', events[open][1], context], ['exit', events[open][1], context]]);\n          }\n\n          // Opening.\n          nextEvents = push(nextEvents, [['enter', group, context], ['enter', openingSequence, context], ['exit', openingSequence, context], ['enter', text, context]]);\n\n          // Always populated by defaults.\n\n          // Between.\n          nextEvents = push(nextEvents, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + 1, index), context));\n\n          // Closing.\n          nextEvents = push(nextEvents, [['exit', text, context], ['enter', closingSequence, context], ['exit', closingSequence, context], ['exit', group, context]]);\n\n          // If there are more markers in the closing, add them after.\n          if (events[index][1].end.offset - events[index][1].start.offset) {\n            offset = 2;\n            nextEvents = push(nextEvents, [['enter', events[index][1], context], ['exit', events[index][1], context]]);\n          } else {\n            offset = 0;\n          }\n          splice(events, open - 1, index - open + 3, nextEvents);\n          index = open + nextEvents.length - offset - 2;\n          break;\n        }\n      }\n    }\n  }\n\n  // Remove remaining sequences.\n  index = -1;\n  while (++index < events.length) {\n    if (events[index][1].type === 'attentionSequence') {\n      events[index][1].type = 'data';\n    }\n  }\n  return events;\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeAttention(effects, ok) {\n  const attentionMarkers = this.parser.constructs.attentionMarkers.null;\n  const previous = this.previous;\n  const before = classifyCharacter(previous);\n\n  /** @type {NonNullable<Code>} */\n  let marker;\n  return start;\n\n  /**\n   * Before a sequence.\n   *\n   * ```markdown\n   * > | **\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    marker = code;\n    effects.enter('attentionSequence');\n    return inside(code);\n  }\n\n  /**\n   * In a sequence.\n   *\n   * ```markdown\n   * > | **\n   *     ^^\n   * ```\n   *\n   * @type {State}\n   */\n  function inside(code) {\n    if (code === marker) {\n      effects.consume(code);\n      return inside;\n    }\n    const token = effects.exit('attentionSequence');\n\n    // To do: next major: move this to resolver, just like `markdown-rs`.\n    const after = classifyCharacter(code);\n\n    // Always populated by defaults.\n\n    const open = !after || after === 2 && before || attentionMarkers.includes(code);\n    const close = !before || before === 2 && after || attentionMarkers.includes(previous);\n    token._open = Boolean(marker === 42 ? open : open && (before || !close));\n    token._close = Boolean(marker === 42 ? close : close && (after || !open));\n    return ok(code);\n  }\n}\n\n/**\n * Move a point a bit.\n *\n * Note: `move` only works inside lines! It\u2019s not possible to move past other\n * chunks (replacement characters, tabs, or line endings).\n *\n * @param {Point} point\n *   Point.\n * @param {number} offset\n *   Amount to move.\n * @returns {undefined}\n *   Nothing.\n */\nfunction movePoint(point, offset) {\n  point.column += offset;\n  point.offset += offset;\n  point._bufferIndex += offset;\n}", "/**\n * @import {\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { asciiAlphanumeric, asciiAlpha, asciiAtext, asciiControl } from 'micromark-util-character';\n/** @type {Construct} */\nexport const autolink = {\n  name: 'autolink',\n  tokenize: tokenizeAutolink\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeAutolink(effects, ok, nok) {\n  let size = 0;\n  return start;\n\n  /**\n   * Start of an autolink.\n   *\n   * ```markdown\n   * > | a<https://example.com>b\n   *      ^\n   * > | a<user@example.com>b\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter(\"autolink\");\n    effects.enter(\"autolinkMarker\");\n    effects.consume(code);\n    effects.exit(\"autolinkMarker\");\n    effects.enter(\"autolinkProtocol\");\n    return open;\n  }\n\n  /**\n   * After `<`, at protocol or atext.\n   *\n   * ```markdown\n   * > | a<https://example.com>b\n   *       ^\n   * > | a<user@example.com>b\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function open(code) {\n    if (asciiAlpha(code)) {\n      effects.consume(code);\n      return schemeOrEmailAtext;\n    }\n    if (code === 64) {\n      return nok(code);\n    }\n    return emailAtext(code);\n  }\n\n  /**\n   * At second byte of protocol or atext.\n   *\n   * ```markdown\n   * > | a<https://example.com>b\n   *        ^\n   * > | a<user@example.com>b\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function schemeOrEmailAtext(code) {\n    // ASCII alphanumeric and `+`, `-`, and `.`.\n    if (code === 43 || code === 45 || code === 46 || asciiAlphanumeric(code)) {\n      // Count the previous alphabetical from `open` too.\n      size = 1;\n      return schemeInsideOrEmailAtext(code);\n    }\n    return emailAtext(code);\n  }\n\n  /**\n   * In ambiguous protocol or atext.\n   *\n   * ```markdown\n   * > | a<https://example.com>b\n   *        ^\n   * > | a<user@example.com>b\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function schemeInsideOrEmailAtext(code) {\n    if (code === 58) {\n      effects.consume(code);\n      size = 0;\n      return urlInside;\n    }\n\n    // ASCII alphanumeric and `+`, `-`, and `.`.\n    if ((code === 43 || code === 45 || code === 46 || asciiAlphanumeric(code)) && size++ < 32) {\n      effects.consume(code);\n      return schemeInsideOrEmailAtext;\n    }\n    size = 0;\n    return emailAtext(code);\n  }\n\n  /**\n   * After protocol, in URL.\n   *\n   * ```markdown\n   * > | a<https://example.com>b\n   *             ^\n   * ```\n   *\n   * @type {State}\n   */\n  function urlInside(code) {\n    if (code === 62) {\n      effects.exit(\"autolinkProtocol\");\n      effects.enter(\"autolinkMarker\");\n      effects.consume(code);\n      effects.exit(\"autolinkMarker\");\n      effects.exit(\"autolink\");\n      return ok;\n    }\n\n    // ASCII control, space, or `<`.\n    if (code === null || code === 32 || code === 60 || asciiControl(code)) {\n      return nok(code);\n    }\n    effects.consume(code);\n    return urlInside;\n  }\n\n  /**\n   * In email atext.\n   *\n   * ```markdown\n   * > | a<user.name@example.com>b\n   *              ^\n   * ```\n   *\n   * @type {State}\n   */\n  function emailAtext(code) {\n    if (code === 64) {\n      effects.consume(code);\n      return emailAtSignOrDot;\n    }\n    if (asciiAtext(code)) {\n      effects.consume(code);\n      return emailAtext;\n    }\n    return nok(code);\n  }\n\n  /**\n   * In label, after at-sign or dot.\n   *\n   * ```markdown\n   * > | a<user.name@example.com>b\n   *                 ^       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function emailAtSignOrDot(code) {\n    return asciiAlphanumeric(code) ? emailLabel(code) : nok(code);\n  }\n\n  /**\n   * In label, where `.` and `>` are allowed.\n   *\n   * ```markdown\n   * > | a<user.name@example.com>b\n   *                   ^\n   * ```\n   *\n   * @type {State}\n   */\n  function emailLabel(code) {\n    if (code === 46) {\n      effects.consume(code);\n      size = 0;\n      return emailAtSignOrDot;\n    }\n    if (code === 62) {\n      // Exit, then change the token type.\n      effects.exit(\"autolinkProtocol\").type = \"autolinkEmail\";\n      effects.enter(\"autolinkMarker\");\n      effects.consume(code);\n      effects.exit(\"autolinkMarker\");\n      effects.exit(\"autolink\");\n      return ok;\n    }\n    return emailValue(code);\n  }\n\n  /**\n   * In label, where `.` and `>` are *not* allowed.\n   *\n   * Though, this is also used in `emailLabel` to parse other values.\n   *\n   * ```markdown\n   * > | a<user.name@ex-ample.com>b\n   *                    ^\n   * ```\n   *\n   * @type {State}\n   */\n  function emailValue(code) {\n    // ASCII alphanumeric or `-`.\n    if ((code === 45 || asciiAlphanumeric(code)) && size++ < 63) {\n      const next = code === 45 ? emailValue : emailLabel;\n      effects.consume(code);\n      return next;\n    }\n    return nok(code);\n  }\n}", "/**\n * @import {\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blankLine = {\n  partial: true,\n  tokenize: tokenizeBlankLine\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLine(effects, ok, nok) {\n  return start;\n\n  /**\n   * Start of blank line.\n   *\n   * > \uD83D\uDC49 **Note**: `\u2420` represents a space character.\n   *\n   * ```markdown\n   * > | \u2420\u2420\u240A\n   *     ^\n   * > | \u240A\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    return markdownSpace(code) ? factorySpace(effects, after, \"linePrefix\")(code) : after(code);\n  }\n\n  /**\n   * At eof/eol, after optional whitespace.\n   *\n   * > \uD83D\uDC49 **Note**: `\u2420` represents a space character.\n   *\n   * ```markdown\n   * > | \u2420\u2420\u240A\n   *       ^\n   * > | \u240A\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n  }\n}", "/**\n * @import {\n *   Construct,\n *   Exiter,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blockQuote = {\n  continuation: {\n    tokenize: tokenizeBlockQuoteContinuation\n  },\n  exit,\n  name: 'blockQuote',\n  tokenize: tokenizeBlockQuoteStart\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeBlockQuoteStart(effects, ok, nok) {\n  const self = this;\n  return start;\n\n  /**\n   * Start of block quote.\n   *\n   * ```markdown\n   * > | > a\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    if (code === 62) {\n      const state = self.containerState;\n      if (!state.open) {\n        effects.enter(\"blockQuote\", {\n          _container: true\n        });\n        state.open = true;\n      }\n      effects.enter(\"blockQuotePrefix\");\n      effects.enter(\"blockQuoteMarker\");\n      effects.consume(code);\n      effects.exit(\"blockQuoteMarker\");\n      return after;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After `>`, before optional whitespace.\n   *\n   * ```markdown\n   * > | > a\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    if (markdownSpace(code)) {\n      effects.enter(\"blockQuotePrefixWhitespace\");\n      effects.consume(code);\n      effects.exit(\"blockQuotePrefixWhitespace\");\n      effects.exit(\"blockQuotePrefix\");\n      return ok;\n    }\n    effects.exit(\"blockQuotePrefix\");\n    return ok(code);\n  }\n}\n\n/**\n * Start of block quote continuation.\n *\n * ```markdown\n *   | > a\n * > | > b\n *     ^\n * ```\n *\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeBlockQuoteContinuation(effects, ok, nok) {\n  const self = this;\n  return contStart;\n\n  /**\n   * Start of block quote continuation.\n   *\n   * Also used to parse the first block quote opening.\n   *\n   * ```markdown\n   *   | > a\n   * > | > b\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function contStart(code) {\n    if (markdownSpace(code)) {\n      // Always populated by defaults.\n\n      return factorySpace(effects, contBefore, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code);\n    }\n    return contBefore(code);\n  }\n\n  /**\n   * At `>`, after optional whitespace.\n   *\n   * Also used to parse the first block quote opening.\n   *\n   * ```markdown\n   *   | > a\n   * > | > b\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function contBefore(code) {\n    return effects.attempt(blockQuote, ok, nok)(code);\n  }\n}\n\n/** @type {Exiter} */\nfunction exit(effects) {\n  effects.exit(\"blockQuote\");\n}", "/**\n * @import {\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { asciiPunctuation } from 'micromark-util-character';\n/** @type {Construct} */\nexport const characterEscape = {\n  name: 'characterEscape',\n  tokenize: tokenizeCharacterEscape\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeCharacterEscape(effects, ok, nok) {\n  return start;\n\n  /**\n   * Start of character escape.\n   *\n   * ```markdown\n   * > | a\\*b\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter(\"characterEscape\");\n    effects.enter(\"escapeMarker\");\n    effects.consume(code);\n    effects.exit(\"escapeMarker\");\n    return inside;\n  }\n\n  /**\n   * After `\\`, at punctuation.\n   *\n   * ```markdown\n   * > | a\\*b\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function inside(code) {\n    // ASCII punctuation.\n    if (asciiPunctuation(code)) {\n      effects.enter(\"characterEscapeValue\");\n      effects.consume(code);\n      effects.exit(\"characterEscapeValue\");\n      effects.exit(\"characterEscape\");\n      return ok;\n    }\n    return nok(code);\n  }\n}", "/**\n * @import {\n *   Code,\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { decodeNamedCharacterReference } from 'decode-named-character-reference';\nimport { asciiAlphanumeric, asciiDigit, asciiHexDigit } from 'micromark-util-character';\n/** @type {Construct} */\nexport const characterReference = {\n  name: 'characterReference',\n  tokenize: tokenizeCharacterReference\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeCharacterReference(effects, ok, nok) {\n  const self = this;\n  let size = 0;\n  /** @type {number} */\n  let max;\n  /** @type {(code: Code) => boolean} */\n  let test;\n  return start;\n\n  /**\n   * Start of character reference.\n   *\n   * ```markdown\n   * > | a&amp;b\n   *      ^\n   * > | a&#123;b\n   *      ^\n   * > | a&#x9;b\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter(\"characterReference\");\n    effects.enter(\"characterReferenceMarker\");\n    effects.consume(code);\n    effects.exit(\"characterReferenceMarker\");\n    return open;\n  }\n\n  /**\n   * After `&`, at `#` for numeric references or alphanumeric for named\n   * references.\n   *\n   * ```markdown\n   * > | a&amp;b\n   *       ^\n   * > | a&#123;b\n   *       ^\n   * > | a&#x9;b\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function open(code) {\n    if (code === 35) {\n      effects.enter(\"characterReferenceMarkerNumeric\");\n      effects.consume(code);\n      effects.exit(\"characterReferenceMarkerNumeric\");\n      return numeric;\n    }\n    effects.enter(\"characterReferenceValue\");\n    max = 31;\n    test = asciiAlphanumeric;\n    return value(code);\n  }\n\n  /**\n   * After `#`, at `x` for hexadecimals or digit for decimals.\n   *\n   * ```markdown\n   * > | a&#123;b\n   *        ^\n   * > | a&#x9;b\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function numeric(code) {\n    if (code === 88 || code === 120) {\n      effects.enter(\"characterReferenceMarkerHexadecimal\");\n      effects.consume(code);\n      effects.exit(\"characterReferenceMarkerHexadecimal\");\n      effects.enter(\"characterReferenceValue\");\n      max = 6;\n      test = asciiHexDigit;\n      return value;\n    }\n    effects.enter(\"characterReferenceValue\");\n    max = 7;\n    test = asciiDigit;\n    return value(code);\n  }\n\n  /**\n   * After markers (`&#x`, `&#`, or `&`), in value, before `;`.\n   *\n   * The character reference kind defines what and how many characters are\n   * allowed.\n   *\n   * ```markdown\n   * > | a&amp;b\n   *       ^^^\n   * > | a&#123;b\n   *        ^^^\n   * > | a&#x9;b\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function value(code) {\n    if (code === 59 && size) {\n      const token = effects.exit(\"characterReferenceValue\");\n      if (test === asciiAlphanumeric && !decodeNamedCharacterReference(self.sliceSerialize(token))) {\n        return nok(code);\n      }\n\n      // To do: `markdown-rs` uses a different name:\n      // `CharacterReferenceMarkerSemi`.\n      effects.enter(\"characterReferenceMarker\");\n      effects.consume(code);\n      effects.exit(\"characterReferenceMarker\");\n      effects.exit(\"characterReference\");\n      return ok;\n    }\n    if (test(code) && size++ < max) {\n      effects.consume(code);\n      return value;\n    }\n    return nok(code);\n  }\n}", "/**\n * @import {\n *   Code,\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nconst nonLazyContinuation = {\n  partial: true,\n  tokenize: tokenizeNonLazyContinuation\n};\n\n/** @type {Construct} */\nexport const codeFenced = {\n  concrete: true,\n  name: 'codeFenced',\n  tokenize: tokenizeCodeFenced\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeCodeFenced(effects, ok, nok) {\n  const self = this;\n  /** @type {Construct} */\n  const closeStart = {\n    partial: true,\n    tokenize: tokenizeCloseStart\n  };\n  let initialPrefix = 0;\n  let sizeOpen = 0;\n  /** @type {NonNullable<Code>} */\n  let marker;\n  return start;\n\n  /**\n   * Start of code.\n   *\n   * ```markdown\n   * > | ~~~js\n   *     ^\n   *   | alert(1)\n   *   | ~~~\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    // To do: parse whitespace like `markdown-rs`.\n    return beforeSequenceOpen(code);\n  }\n\n  /**\n   * In opening fence, after prefix, at sequence.\n   *\n   * ```markdown\n   * > | ~~~js\n   *     ^\n   *   | alert(1)\n   *   | ~~~\n   * ```\n   *\n   * @type {State}\n   */\n  function beforeSequenceOpen(code) {\n    const tail = self.events[self.events.length - 1];\n    initialPrefix = tail && tail[1].type === \"linePrefix\" ? tail[2].sliceSerialize(tail[1], true).length : 0;\n    marker = code;\n    effects.enter(\"codeFenced\");\n    effects.enter(\"codeFencedFence\");\n    effects.enter(\"codeFencedFenceSequence\");\n    return sequenceOpen(code);\n  }\n\n  /**\n   * In opening fence sequence.\n   *\n   * ```markdown\n   * > | ~~~js\n   *      ^\n   *   | alert(1)\n   *   | ~~~\n   * ```\n   *\n   * @type {State}\n   */\n  function sequenceOpen(code) {\n    if (code === marker) {\n      sizeOpen++;\n      effects.consume(code);\n      return sequenceOpen;\n    }\n    if (sizeOpen < 3) {\n      return nok(code);\n    }\n    effects.exit(\"codeFencedFenceSequence\");\n    return markdownSpace(code) ? factorySpace(effects, infoBefore, \"whitespace\")(code) : infoBefore(code);\n  }\n\n  /**\n   * In opening fence, after the sequence (and optional whitespace), before info.\n   *\n   * ```markdown\n   * > | ~~~js\n   *        ^\n   *   | alert(1)\n   *   | ~~~\n   * ```\n   *\n   * @type {State}\n   */\n  function infoBefore(code) {\n    if (code === null || markdownLineEnding(code)) {\n      effects.exit(\"codeFencedFence\");\n      return self.interrupt ? ok(code) : effects.check(nonLazyContinuation, atNonLazyBreak, after)(code);\n    }\n    effects.enter(\"codeFencedFenceInfo\");\n    effects.enter(\"chunkString\", {\n      contentType: \"string\"\n    });\n    return info(code);\n  }\n\n  /**\n   * In info.\n   *\n   * ```markdown\n   * > | ~~~js\n   *        ^\n   *   | alert(1)\n   *   | ~~~\n   * ```\n   *\n   * @type {State}\n   */\n  function info(code) {\n    if (code === null || markdownLineEnding(code)) {\n      effects.exit(\"chunkString\");\n      effects.exit(\"codeFencedFenceInfo\");\n      return infoBefore(code);\n    }\n    if (markdownSpace(code)) {\n      effects.exit(\"chunkString\");\n      effects.exit(\"codeFencedFenceInfo\");\n      return factorySpace(effects, metaBefore, \"whitespace\")(code);\n    }\n    if (code === 96 && code === marker) {\n      return nok(code);\n    }\n    effects.consume(code);\n    return info;\n  }\n\n  /**\n   * In opening fence, after info and whitespace, before meta.\n   *\n   * ```markdown\n   * > | ~~~js eval\n   *           ^\n   *   | alert(1)\n   *   | ~~~\n   * ```\n   *\n   * @type {State}\n   */\n  function metaBefore(code) {\n    if (code === null || markdownLineEnding(code)) {\n      return infoBefore(code);\n    }\n    effects.enter(\"codeFencedFenceMeta\");\n    effects.enter(\"chunkString\", {\n      contentType: \"string\"\n    });\n    return meta(code);\n  }\n\n  /**\n   * In meta.\n   *\n   * ```markdown\n   * > | ~~~js eval\n   *           ^\n   *   | alert(1)\n   *   | ~~~\n   * ```\n   *\n   * @type {State}\n   */\n  function meta(code) {\n    if (code === null || markdownLineEnding(code)) {\n      effects.exit(\"chunkString\");\n      effects.exit(\"codeFencedFenceMeta\");\n      return infoBefore(code);\n    }\n    if (code === 96 && code === marker) {\n      return nok(code);\n    }\n    effects.consume(code);\n    return meta;\n  }\n\n  /**\n   * At eol/eof in code, before a non-lazy closing fence or content.\n   *\n   * ```markdown\n   * > | ~~~js\n   *          ^\n   * > | alert(1)\n   *             ^\n   *   | ~~~\n   * ```\n   *\n   * @type {State}\n   */\n  function atNonLazyBreak(code) {\n    return effects.attempt(closeStart, after, contentBefore)(code);\n  }\n\n  /**\n   * Before code content, not a closing fence, at eol.\n   *\n   * ```markdown\n   *   | ~~~js\n   * > | alert(1)\n   *             ^\n   *   | ~~~\n   * ```\n   *\n   * @type {State}\n   */\n  function contentBefore(code) {\n    effects.enter(\"lineEnding\");\n    effects.consume(code);\n    effects.exit(\"lineEnding\");\n    return contentStart;\n  }\n\n  /**\n   * Before code content, not a closing fence.\n   *\n   * ```markdown\n   *   | ~~~js\n   * > | alert(1)\n   *     ^\n   *   | ~~~\n   * ```\n   *\n   * @type {State}\n   */\n  function contentStart(code) {\n    return initialPrefix > 0 && markdownSpace(code) ? factorySpace(effects, beforeContentChunk, \"linePrefix\", initialPrefix + 1)(code) : beforeContentChunk(code);\n  }\n\n  /**\n   * Before code content, after optional prefix.\n   *\n   * ```markdown\n   *   | ~~~js\n   * > | alert(1)\n   *     ^\n   *   | ~~~\n   * ```\n   *\n   * @type {State}\n   */\n  function beforeContentChunk(code) {\n    if (code === null || markdownLineEnding(code)) {\n      return effects.check(nonLazyContinuation, atNonLazyBreak, after)(code);\n    }\n    effects.enter(\"codeFlowValue\");\n    return contentChunk(code);\n  }\n\n  /**\n   * In code content.\n   *\n   * ```markdown\n   *   | ~~~js\n   * > | alert(1)\n   *     ^^^^^^^^\n   *   | ~~~\n   * ```\n   *\n   * @type {State}\n   */\n  function contentChunk(code) {\n    if (code === null || markdownLineEnding(code)) {\n      effects.exit(\"codeFlowValue\");\n      return beforeContentChunk(code);\n    }\n    effects.consume(code);\n    return contentChunk;\n  }\n\n  /**\n   * After code.\n   *\n   * ```markdown\n   *   | ~~~js\n   *   | alert(1)\n   * > | ~~~\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    effects.exit(\"codeFenced\");\n    return ok(code);\n  }\n\n  /**\n   * @this {TokenizeContext}\n   *   Context.\n   * @type {Tokenizer}\n   */\n  function tokenizeCloseStart(effects, ok, nok) {\n    let size = 0;\n    return startBefore;\n\n    /**\n     *\n     *\n     * @type {State}\n     */\n    function startBefore(code) {\n      effects.enter(\"lineEnding\");\n      effects.consume(code);\n      effects.exit(\"lineEnding\");\n      return start;\n    }\n\n    /**\n     * Before closing fence, at optional whitespace.\n     *\n     * ```markdown\n     *   | ~~~js\n     *   | alert(1)\n     * > | ~~~\n     *     ^\n     * ```\n     *\n     * @type {State}\n     */\n    function start(code) {\n      // Always populated by defaults.\n\n      // To do: `enter` here or in next state?\n      effects.enter(\"codeFencedFence\");\n      return markdownSpace(code) ? factorySpace(effects, beforeSequenceClose, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code) : beforeSequenceClose(code);\n    }\n\n    /**\n     * In closing fence, after optional whitespace, at sequence.\n     *\n     * ```markdown\n     *   | ~~~js\n     *   | alert(1)\n     * > | ~~~\n     *     ^\n     * ```\n     *\n     * @type {State}\n     */\n    function beforeSequenceClose(code) {\n      if (code === marker) {\n        effects.enter(\"codeFencedFenceSequence\");\n        return sequenceClose(code);\n      }\n      return nok(code);\n    }\n\n    /**\n     * In closing fence sequence.\n     *\n     * ```markdown\n     *   | ~~~js\n     *   | alert(1)\n     * > | ~~~\n     *     ^\n     * ```\n     *\n     * @type {State}\n     */\n    function sequenceClose(code) {\n      if (code === marker) {\n        size++;\n        effects.consume(code);\n        return sequenceClose;\n      }\n      if (size >= sizeOpen) {\n        effects.exit(\"codeFencedFenceSequence\");\n        return markdownSpace(code) ? factorySpace(effects, sequenceCloseAfter, \"whitespace\")(code) : sequenceCloseAfter(code);\n      }\n      return nok(code);\n    }\n\n    /**\n     * After closing fence sequence, after optional whitespace.\n     *\n     * ```markdown\n     *   | ~~~js\n     *   | alert(1)\n     * > | ~~~\n     *        ^\n     * ```\n     *\n     * @type {State}\n     */\n    function sequenceCloseAfter(code) {\n      if (code === null || markdownLineEnding(code)) {\n        effects.exit(\"codeFencedFence\");\n        return ok(code);\n      }\n      return nok(code);\n    }\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeNonLazyContinuation(effects, ok, nok) {\n  const self = this;\n  return start;\n\n  /**\n   *\n   *\n   * @type {State}\n   */\n  function start(code) {\n    if (code === null) {\n      return nok(code);\n    }\n    effects.enter(\"lineEnding\");\n    effects.consume(code);\n    effects.exit(\"lineEnding\");\n    return lineStart;\n  }\n\n  /**\n   *\n   *\n   * @type {State}\n   */\n  function lineStart(code) {\n    return self.parser.lazy[self.now().line] ? nok(code) : ok(code);\n  }\n}", "/**\n * @import {\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const codeIndented = {\n  name: 'codeIndented',\n  tokenize: tokenizeCodeIndented\n};\n\n/** @type {Construct} */\nconst furtherStart = {\n  partial: true,\n  tokenize: tokenizeFurtherStart\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeCodeIndented(effects, ok, nok) {\n  const self = this;\n  return start;\n\n  /**\n   * Start of code (indented).\n   *\n   * > **Parsing note**: it is not needed to check if this first line is a\n   * > filled line (that it has a non-whitespace character), because blank lines\n   * > are parsed already, so we never run into that.\n   *\n   * ```markdown\n   * > |     aaa\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    // To do: manually check if interrupting like `markdown-rs`.\n\n    effects.enter(\"codeIndented\");\n    // To do: use an improved `space_or_tab` function like `markdown-rs`,\n    // so that we can drop the next state.\n    return factorySpace(effects, afterPrefix, \"linePrefix\", 4 + 1)(code);\n  }\n\n  /**\n   * At start, after 1 or 4 spaces.\n   *\n   * ```markdown\n   * > |     aaa\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function afterPrefix(code) {\n    const tail = self.events[self.events.length - 1];\n    return tail && tail[1].type === \"linePrefix\" && tail[2].sliceSerialize(tail[1], true).length >= 4 ? atBreak(code) : nok(code);\n  }\n\n  /**\n   * At a break.\n   *\n   * ```markdown\n   * > |     aaa\n   *         ^  ^\n   * ```\n   *\n   * @type {State}\n   */\n  function atBreak(code) {\n    if (code === null) {\n      return after(code);\n    }\n    if (markdownLineEnding(code)) {\n      return effects.attempt(furtherStart, atBreak, after)(code);\n    }\n    effects.enter(\"codeFlowValue\");\n    return inside(code);\n  }\n\n  /**\n   * In code content.\n   *\n   * ```markdown\n   * > |     aaa\n   *         ^^^^\n   * ```\n   *\n   * @type {State}\n   */\n  function inside(code) {\n    if (code === null || markdownLineEnding(code)) {\n      effects.exit(\"codeFlowValue\");\n      return atBreak(code);\n    }\n    effects.consume(code);\n    return inside;\n  }\n\n  /** @type {State} */\n  function after(code) {\n    effects.exit(\"codeIndented\");\n    // To do: allow interrupting like `markdown-rs`.\n    // Feel free to interrupt.\n    // tokenizer.interrupt = false\n    return ok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeFurtherStart(effects, ok, nok) {\n  const self = this;\n  return furtherStart;\n\n  /**\n   * At eol, trying to parse another indent.\n   *\n   * ```markdown\n   * > |     aaa\n   *            ^\n   *   |     bbb\n   * ```\n   *\n   * @type {State}\n   */\n  function furtherStart(code) {\n    // To do: improve `lazy` / `pierce` handling.\n    // If this is a lazy line, it can\u2019t be code.\n    if (self.parser.lazy[self.now().line]) {\n      return nok(code);\n    }\n    if (markdownLineEnding(code)) {\n      effects.enter(\"lineEnding\");\n      effects.consume(code);\n      effects.exit(\"lineEnding\");\n      return furtherStart;\n    }\n\n    // To do: the code here in `micromark-js` is a bit different from\n    // `markdown-rs` because there it can attempt spaces.\n    // We can\u2019t yet.\n    //\n    // To do: use an improved `space_or_tab` function like `markdown-rs`,\n    // so that we can drop the next state.\n    return factorySpace(effects, afterPrefix, \"linePrefix\", 4 + 1)(code);\n  }\n\n  /**\n   * At start, after 1 or 4 spaces.\n   *\n   * ```markdown\n   * > |     aaa\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function afterPrefix(code) {\n    const tail = self.events[self.events.length - 1];\n    return tail && tail[1].type === \"linePrefix\" && tail[2].sliceSerialize(tail[1], true).length >= 4 ? ok(code) : markdownLineEnding(code) ? furtherStart(code) : nok(code);\n  }\n}", "/**\n * @import {\n *   Construct,\n *   Previous,\n *   Resolver,\n *   State,\n *   TokenizeContext,\n *   Tokenizer,\n *   Token\n * } from 'micromark-util-types'\n */\n\nimport { markdownLineEnding } from 'micromark-util-character';\n/** @type {Construct} */\nexport const codeText = {\n  name: 'codeText',\n  previous,\n  resolve: resolveCodeText,\n  tokenize: tokenizeCodeText\n};\n\n// To do: next major: don\u2019t resolve, like `markdown-rs`.\n/** @type {Resolver} */\nfunction resolveCodeText(events) {\n  let tailExitIndex = events.length - 4;\n  let headEnterIndex = 3;\n  /** @type {number} */\n  let index;\n  /** @type {number | undefined} */\n  let enter;\n\n  // If we start and end with an EOL or a space.\n  if ((events[headEnterIndex][1].type === \"lineEnding\" || events[headEnterIndex][1].type === 'space') && (events[tailExitIndex][1].type === \"lineEnding\" || events[tailExitIndex][1].type === 'space')) {\n    index = headEnterIndex;\n\n    // And we have data.\n    while (++index < tailExitIndex) {\n      if (events[index][1].type === \"codeTextData\") {\n        // Then we have padding.\n        events[headEnterIndex][1].type = \"codeTextPadding\";\n        events[tailExitIndex][1].type = \"codeTextPadding\";\n        headEnterIndex += 2;\n        tailExitIndex -= 2;\n        break;\n      }\n    }\n  }\n\n  // Merge adjacent spaces and data.\n  index = headEnterIndex - 1;\n  tailExitIndex++;\n  while (++index <= tailExitIndex) {\n    if (enter === undefined) {\n      if (index !== tailExitIndex && events[index][1].type !== \"lineEnding\") {\n        enter = index;\n      }\n    } else if (index === tailExitIndex || events[index][1].type === \"lineEnding\") {\n      events[enter][1].type = \"codeTextData\";\n      if (index !== enter + 2) {\n        events[enter][1].end = events[index - 1][1].end;\n        events.splice(enter + 2, index - enter - 2);\n        tailExitIndex -= index - enter - 2;\n        index = enter + 2;\n      }\n      enter = undefined;\n    }\n  }\n  return events;\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Previous}\n */\nfunction previous(code) {\n  // If there is a previous code, there will always be a tail.\n  return code !== 96 || this.events[this.events.length - 1][1].type === \"characterEscape\";\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeCodeText(effects, ok, nok) {\n  const self = this;\n  let sizeOpen = 0;\n  /** @type {number} */\n  let size;\n  /** @type {Token} */\n  let token;\n  return start;\n\n  /**\n   * Start of code (text).\n   *\n   * ```markdown\n   * > | `a`\n   *     ^\n   * > | \\`a`\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter(\"codeText\");\n    effects.enter(\"codeTextSequence\");\n    return sequenceOpen(code);\n  }\n\n  /**\n   * In opening sequence.\n   *\n   * ```markdown\n   * > | `a`\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function sequenceOpen(code) {\n    if (code === 96) {\n      effects.consume(code);\n      sizeOpen++;\n      return sequenceOpen;\n    }\n    effects.exit(\"codeTextSequence\");\n    return between(code);\n  }\n\n  /**\n   * Between something and something else.\n   *\n   * ```markdown\n   * > | `a`\n   *      ^^\n   * ```\n   *\n   * @type {State}\n   */\n  function between(code) {\n    // EOF.\n    if (code === null) {\n      return nok(code);\n    }\n\n    // To do: next major: don\u2019t do spaces in resolve, but when compiling,\n    // like `markdown-rs`.\n    // Tabs don\u2019t work, and virtual spaces don\u2019t make sense.\n    if (code === 32) {\n      effects.enter('space');\n      effects.consume(code);\n      effects.exit('space');\n      return between;\n    }\n\n    // Closing fence? Could also be data.\n    if (code === 96) {\n      token = effects.enter(\"codeTextSequence\");\n      size = 0;\n      return sequenceClose(code);\n    }\n    if (markdownLineEnding(code)) {\n      effects.enter(\"lineEnding\");\n      effects.consume(code);\n      effects.exit(\"lineEnding\");\n      return between;\n    }\n\n    // Data.\n    effects.enter(\"codeTextData\");\n    return data(code);\n  }\n\n  /**\n   * In data.\n   *\n   * ```markdown\n   * > | `a`\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function data(code) {\n    if (code === null || code === 32 || code === 96 || markdownLineEnding(code)) {\n      effects.exit(\"codeTextData\");\n      return between(code);\n    }\n    effects.consume(code);\n    return data;\n  }\n\n  /**\n   * In closing sequence.\n   *\n   * ```markdown\n   * > | `a`\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function sequenceClose(code) {\n    // More.\n    if (code === 96) {\n      effects.consume(code);\n      size++;\n      return sequenceClose;\n    }\n\n    // Done!\n    if (size === sizeOpen) {\n      effects.exit(\"codeTextSequence\");\n      effects.exit(\"codeText\");\n      return ok(code);\n    }\n\n    // More or less accents: mark as data.\n    token.type = \"codeTextData\";\n    return data(code);\n  }\n}", "/**\n * Some of the internal operations of micromark do lots of editing\n * operations on very large arrays. This runs into problems with two\n * properties of most circa-2020 JavaScript interpreters:\n *\n *  - Array-length modifications at the high end of an array (push/pop) are\n *    expected to be common and are implemented in (amortized) time\n *    proportional to the number of elements added or removed, whereas\n *    other operations (shift/unshift and splice) are much less efficient.\n *  - Function arguments are passed on the stack, so adding tens of thousands\n *    of elements to an array with `arr.push(...newElements)` will frequently\n *    cause stack overflows. (see <https://stackoverflow.com/questions/22123769/rangeerror-maximum-call-stack-size-exceeded-why>)\n *\n * SpliceBuffers are an implementation of gap buffers, which are a\n * generalization of the \"queue made of two stacks\" idea. The splice buffer\n * maintains a cursor, and moving the cursor has cost proportional to the\n * distance the cursor moves, but inserting, deleting, or splicing in\n * new information at the cursor is as efficient as the push/pop operation.\n * This allows for an efficient sequence of splices (or pushes, pops, shifts,\n * or unshifts) as long such edits happen at the same part of the array or\n * generally sweep through the array from the beginning to the end.\n *\n * The interface for splice buffers also supports large numbers of inputs by\n * passing a single array argument rather passing multiple arguments on the\n * function call stack.\n *\n * @template T\n *   Item type.\n */\nexport class SpliceBuffer {\n  /**\n   * @param {ReadonlyArray<T> | null | undefined} [initial]\n   *   Initial items (optional).\n   * @returns\n   *   Splice buffer.\n   */\n  constructor(initial) {\n    /** @type {Array<T>} */\n    this.left = initial ? [...initial] : [];\n    /** @type {Array<T>} */\n    this.right = [];\n  }\n\n  /**\n   * Array access;\n   * does not move the cursor.\n   *\n   * @param {number} index\n   *   Index.\n   * @return {T}\n   *   Item.\n   */\n  get(index) {\n    if (index < 0 || index >= this.left.length + this.right.length) {\n      throw new RangeError('Cannot access index `' + index + '` in a splice buffer of size `' + (this.left.length + this.right.length) + '`');\n    }\n    if (index < this.left.length) return this.left[index];\n    return this.right[this.right.length - index + this.left.length - 1];\n  }\n\n  /**\n   * The length of the splice buffer, one greater than the largest index in the\n   * array.\n   */\n  get length() {\n    return this.left.length + this.right.length;\n  }\n\n  /**\n   * Remove and return `list[0]`;\n   * moves the cursor to `0`.\n   *\n   * @returns {T | undefined}\n   *   Item, optional.\n   */\n  shift() {\n    this.setCursor(0);\n    return this.right.pop();\n  }\n\n  /**\n   * Slice the buffer to get an array;\n   * does not move the cursor.\n   *\n   * @param {number} start\n   *   Start.\n   * @param {number | null | undefined} [end]\n   *   End (optional).\n   * @returns {Array<T>}\n   *   Array of items.\n   */\n  slice(start, end) {\n    /** @type {number} */\n    const stop = end === null || end === undefined ? Number.POSITIVE_INFINITY : end;\n    if (stop < this.left.length) {\n      return this.left.slice(start, stop);\n    }\n    if (start > this.left.length) {\n      return this.right.slice(this.right.length - stop + this.left.length, this.right.length - start + this.left.length).reverse();\n    }\n    return this.left.slice(start).concat(this.right.slice(this.right.length - stop + this.left.length).reverse());\n  }\n\n  /**\n   * Mimics the behavior of Array.prototype.splice() except for the change of\n   * interface necessary to avoid segfaults when patching in very large arrays.\n   *\n   * This operation moves cursor is moved to `start` and results in the cursor\n   * placed after any inserted items.\n   *\n   * @param {number} start\n   *   Start;\n   *   zero-based index at which to start changing the array;\n   *   negative numbers count backwards from the end of the array and values\n   *   that are out-of bounds are clamped to the appropriate end of the array.\n   * @param {number | null | undefined} [deleteCount=0]\n   *   Delete count (default: `0`);\n   *   maximum number of elements to delete, starting from start.\n   * @param {Array<T> | null | undefined} [items=[]]\n   *   Items to include in place of the deleted items (default: `[]`).\n   * @return {Array<T>}\n   *   Any removed items.\n   */\n  splice(start, deleteCount, items) {\n    /** @type {number} */\n    const count = deleteCount || 0;\n    this.setCursor(Math.trunc(start));\n    const removed = this.right.splice(this.right.length - count, Number.POSITIVE_INFINITY);\n    if (items) chunkedPush(this.left, items);\n    return removed.reverse();\n  }\n\n  /**\n   * Remove and return the highest-numbered item in the array, so\n   * `list[list.length - 1]`;\n   * Moves the cursor to `length`.\n   *\n   * @returns {T | undefined}\n   *   Item, optional.\n   */\n  pop() {\n    this.setCursor(Number.POSITIVE_INFINITY);\n    return this.left.pop();\n  }\n\n  /**\n   * Inserts a single item to the high-numbered side of the array;\n   * moves the cursor to `length`.\n   *\n   * @param {T} item\n   *   Item.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  push(item) {\n    this.setCursor(Number.POSITIVE_INFINITY);\n    this.left.push(item);\n  }\n\n  /**\n   * Inserts many items to the high-numbered side of the array.\n   * Moves the cursor to `length`.\n   *\n   * @param {Array<T>} items\n   *   Items.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  pushMany(items) {\n    this.setCursor(Number.POSITIVE_INFINITY);\n    chunkedPush(this.left, items);\n  }\n\n  /**\n   * Inserts a single item to the low-numbered side of the array;\n   * Moves the cursor to `0`.\n   *\n   * @param {T} item\n   *   Item.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  unshift(item) {\n    this.setCursor(0);\n    this.right.push(item);\n  }\n\n  /**\n   * Inserts many items to the low-numbered side of the array;\n   * moves the cursor to `0`.\n   *\n   * @param {Array<T>} items\n   *   Items.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  unshiftMany(items) {\n    this.setCursor(0);\n    chunkedPush(this.right, items.reverse());\n  }\n\n  /**\n   * Move the cursor to a specific position in the array. Requires\n   * time proportional to the distance moved.\n   *\n   * If `n < 0`, the cursor will end up at the beginning.\n   * If `n > length`, the cursor will end up at the end.\n   *\n   * @param {number} n\n   *   Position.\n   * @return {undefined}\n   *   Nothing.\n   */\n  setCursor(n) {\n    if (n === this.left.length || n > this.left.length && this.right.length === 0 || n < 0 && this.left.length === 0) return;\n    if (n < this.left.length) {\n      // Move cursor to the this.left\n      const removed = this.left.splice(n, Number.POSITIVE_INFINITY);\n      chunkedPush(this.right, removed.reverse());\n    } else {\n      // Move cursor to the this.right\n      const removed = this.right.splice(this.left.length + this.right.length - n, Number.POSITIVE_INFINITY);\n      chunkedPush(this.left, removed.reverse());\n    }\n  }\n}\n\n/**\n * Avoid stack overflow by pushing items onto the stack in segments\n *\n * @template T\n *   Item type.\n * @param {Array<T>} list\n *   List to inject into.\n * @param {ReadonlyArray<T>} right\n *   Items to inject.\n * @return {undefined}\n *   Nothing.\n */\nfunction chunkedPush(list, right) {\n  /** @type {number} */\n  let chunkStart = 0;\n  if (right.length < 10000) {\n    list.push(...right);\n  } else {\n    while (chunkStart < right.length) {\n      list.push(...right.slice(chunkStart, chunkStart + 10000));\n      chunkStart += 10000;\n    }\n  }\n}", "/**\n * @import {Chunk, Event, Token} from 'micromark-util-types'\n */\n\nimport { splice } from 'micromark-util-chunked';\nimport { SpliceBuffer } from './lib/splice-buffer.js';\n\n// Hidden API exposed for testing.\nexport { SpliceBuffer } from './lib/splice-buffer.js';\n\n/**\n * Tokenize subcontent.\n *\n * @param {Array<Event>} eventsArray\n *   List of events.\n * @returns {boolean}\n *   Whether subtokens were found.\n */\n// eslint-disable-next-line complexity\nexport function subtokenize(eventsArray) {\n  /** @type {Record<string, number>} */\n  const jumps = {};\n  let index = -1;\n  /** @type {Event} */\n  let event;\n  /** @type {number | undefined} */\n  let lineIndex;\n  /** @type {number} */\n  let otherIndex;\n  /** @type {Event} */\n  let otherEvent;\n  /** @type {Array<Event>} */\n  let parameters;\n  /** @type {Array<Event>} */\n  let subevents;\n  /** @type {boolean | undefined} */\n  let more;\n  const events = new SpliceBuffer(eventsArray);\n  while (++index < events.length) {\n    while (index in jumps) {\n      index = jumps[index];\n    }\n    event = events.get(index);\n\n    // Add a hook for the GFM tasklist extension, which needs to know if text\n    // is in the first content of a list item.\n    if (index && event[1].type === \"chunkFlow\" && events.get(index - 1)[1].type === \"listItemPrefix\") {\n      subevents = event[1]._tokenizer.events;\n      otherIndex = 0;\n      if (otherIndex < subevents.length && subevents[otherIndex][1].type === \"lineEndingBlank\") {\n        otherIndex += 2;\n      }\n      if (otherIndex < subevents.length && subevents[otherIndex][1].type === \"content\") {\n        while (++otherIndex < subevents.length) {\n          if (subevents[otherIndex][1].type === \"content\") {\n            break;\n          }\n          if (subevents[otherIndex][1].type === \"chunkText\") {\n            subevents[otherIndex][1]._isInFirstContentOfListItem = true;\n            otherIndex++;\n          }\n        }\n      }\n    }\n\n    // Enter.\n    if (event[0] === 'enter') {\n      if (event[1].contentType) {\n        Object.assign(jumps, subcontent(events, index));\n        index = jumps[index];\n        more = true;\n      }\n    }\n    // Exit.\n    else if (event[1]._container) {\n      otherIndex = index;\n      lineIndex = undefined;\n      while (otherIndex--) {\n        otherEvent = events.get(otherIndex);\n        if (otherEvent[1].type === \"lineEnding\" || otherEvent[1].type === \"lineEndingBlank\") {\n          if (otherEvent[0] === 'enter') {\n            if (lineIndex) {\n              events.get(lineIndex)[1].type = \"lineEndingBlank\";\n            }\n            otherEvent[1].type = \"lineEnding\";\n            lineIndex = otherIndex;\n          }\n        } else if (otherEvent[1].type === \"linePrefix\") {\n          // Move past.\n        } else {\n          break;\n        }\n      }\n      if (lineIndex) {\n        // Fix position.\n        event[1].end = {\n          ...events.get(lineIndex)[1].start\n        };\n\n        // Switch container exit w/ line endings.\n        parameters = events.slice(lineIndex, index);\n        parameters.unshift(event);\n        events.splice(lineIndex, index - lineIndex + 1, parameters);\n      }\n    }\n  }\n\n  // The changes to the `events` buffer must be copied back into the eventsArray\n  splice(eventsArray, 0, Number.POSITIVE_INFINITY, events.slice(0));\n  return !more;\n}\n\n/**\n * Tokenize embedded tokens.\n *\n * @param {SpliceBuffer<Event>} events\n *   Events.\n * @param {number} eventIndex\n *   Index.\n * @returns {Record<string, number>}\n *   Gaps.\n */\nfunction subcontent(events, eventIndex) {\n  const token = events.get(eventIndex)[1];\n  const context = events.get(eventIndex)[2];\n  let startPosition = eventIndex - 1;\n  /** @type {Array<number>} */\n  const startPositions = [];\n  const tokenizer = token._tokenizer || context.parser[token.contentType](token.start);\n  const childEvents = tokenizer.events;\n  /** @type {Array<[number, number]>} */\n  const jumps = [];\n  /** @type {Record<string, number>} */\n  const gaps = {};\n  /** @type {Array<Chunk>} */\n  let stream;\n  /** @type {Token | undefined} */\n  let previous;\n  let index = -1;\n  /** @type {Token | undefined} */\n  let current = token;\n  let adjust = 0;\n  let start = 0;\n  const breaks = [start];\n\n  // Loop forward through the linked tokens to pass them in order to the\n  // subtokenizer.\n  while (current) {\n    // Find the position of the event for this token.\n    while (events.get(++startPosition)[1] !== current) {\n      // Empty.\n    }\n    startPositions.push(startPosition);\n    if (!current._tokenizer) {\n      stream = context.sliceStream(current);\n      if (!current.next) {\n        stream.push(null);\n      }\n      if (previous) {\n        tokenizer.defineSkip(current.start);\n      }\n      if (current._isInFirstContentOfListItem) {\n        tokenizer._gfmTasklistFirstContentOfListItem = true;\n      }\n      tokenizer.write(stream);\n      if (current._isInFirstContentOfListItem) {\n        tokenizer._gfmTasklistFirstContentOfListItem = undefined;\n      }\n    }\n\n    // Unravel the next token.\n    previous = current;\n    current = current.next;\n  }\n\n  // Now, loop back through all events (and linked tokens), to figure out which\n  // parts belong where.\n  current = token;\n  while (++index < childEvents.length) {\n    if (\n    // Find a void token that includes a break.\n    childEvents[index][0] === 'exit' && childEvents[index - 1][0] === 'enter' && childEvents[index][1].type === childEvents[index - 1][1].type && childEvents[index][1].start.line !== childEvents[index][1].end.line) {\n      start = index + 1;\n      breaks.push(start);\n      // Help GC.\n      current._tokenizer = undefined;\n      current.previous = undefined;\n      current = current.next;\n    }\n  }\n\n  // Help GC.\n  tokenizer.events = [];\n\n  // If there\u2019s one more token (which is the cases for lines that end in an\n  // EOF), that\u2019s perfect: the last point we found starts it.\n  // If there isn\u2019t then make sure any remaining content is added to it.\n  if (current) {\n    // Help GC.\n    current._tokenizer = undefined;\n    current.previous = undefined;\n  } else {\n    breaks.pop();\n  }\n\n  // Now splice the events from the subtokenizer into the current events,\n  // moving back to front so that splice indices aren\u2019t affected.\n  index = breaks.length;\n  while (index--) {\n    const slice = childEvents.slice(breaks[index], breaks[index + 1]);\n    const start = startPositions.pop();\n    jumps.push([start, start + slice.length - 1]);\n    events.splice(start, 2, slice);\n  }\n  jumps.reverse();\n  index = -1;\n  while (++index < jumps.length) {\n    gaps[adjust + jumps[index][0]] = adjust + jumps[index][1];\n    adjust += jumps[index][1] - jumps[index][0] - 1;\n  }\n  return gaps;\n}", "/**\n * @import {\n *   Construct,\n *   Resolver,\n *   State,\n *   TokenizeContext,\n *   Tokenizer,\n *   Token\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding } from 'micromark-util-character';\nimport { subtokenize } from 'micromark-util-subtokenize';\n/**\n * No name because it must not be turned off.\n * @type {Construct}\n */\nexport const content = {\n  resolve: resolveContent,\n  tokenize: tokenizeContent\n};\n\n/** @type {Construct} */\nconst continuationConstruct = {\n  partial: true,\n  tokenize: tokenizeContinuation\n};\n\n/**\n * Content is transparent: it\u2019s parsed right now. That way, definitions are also\n * parsed right now: before text in paragraphs (specifically, media) are parsed.\n *\n * @type {Resolver}\n */\nfunction resolveContent(events) {\n  subtokenize(events);\n  return events;\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeContent(effects, ok) {\n  /** @type {Token | undefined} */\n  let previous;\n  return chunkStart;\n\n  /**\n   * Before a content chunk.\n   *\n   * ```markdown\n   * > | abc\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function chunkStart(code) {\n    effects.enter(\"content\");\n    previous = effects.enter(\"chunkContent\", {\n      contentType: \"content\"\n    });\n    return chunkInside(code);\n  }\n\n  /**\n   * In a content chunk.\n   *\n   * ```markdown\n   * > | abc\n   *     ^^^\n   * ```\n   *\n   * @type {State}\n   */\n  function chunkInside(code) {\n    if (code === null) {\n      return contentEnd(code);\n    }\n\n    // To do: in `markdown-rs`, each line is parsed on its own, and everything\n    // is stitched together resolving.\n    if (markdownLineEnding(code)) {\n      return effects.check(continuationConstruct, contentContinue, contentEnd)(code);\n    }\n\n    // Data.\n    effects.consume(code);\n    return chunkInside;\n  }\n\n  /**\n   *\n   *\n   * @type {State}\n   */\n  function contentEnd(code) {\n    effects.exit(\"chunkContent\");\n    effects.exit(\"content\");\n    return ok(code);\n  }\n\n  /**\n   *\n   *\n   * @type {State}\n   */\n  function contentContinue(code) {\n    effects.consume(code);\n    effects.exit(\"chunkContent\");\n    previous.next = effects.enter(\"chunkContent\", {\n      contentType: \"content\",\n      previous\n    });\n    previous = previous.next;\n    return chunkInside;\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeContinuation(effects, ok, nok) {\n  const self = this;\n  return startLookahead;\n\n  /**\n   *\n   *\n   * @type {State}\n   */\n  function startLookahead(code) {\n    effects.exit(\"chunkContent\");\n    effects.enter(\"lineEnding\");\n    effects.consume(code);\n    effects.exit(\"lineEnding\");\n    return factorySpace(effects, prefixed, \"linePrefix\");\n  }\n\n  /**\n   *\n   *\n   * @type {State}\n   */\n  function prefixed(code) {\n    if (code === null || markdownLineEnding(code)) {\n      return nok(code);\n    }\n\n    // Always populated by defaults.\n\n    const tail = self.events[self.events.length - 1];\n    if (!self.parser.constructs.disable.null.includes('codeIndented') && tail && tail[1].type === \"linePrefix\" && tail[2].sliceSerialize(tail[1], true).length >= 4) {\n      return ok(code);\n    }\n    return effects.interrupt(self.parser.constructs.flow, nok, ok)(code);\n  }\n}", "/**\n * @import {Effects, State, TokenType} from 'micromark-util-types'\n */\n\nimport { asciiControl, markdownLineEndingOrSpace, markdownLineEnding } from 'micromark-util-character';\n/**\n * Parse destinations.\n *\n * ###### Examples\n *\n * ```markdown\n * <a>\n * <a\\>b>\n * <a b>\n * <a)>\n * a\n * a\\)b\n * a(b)c\n * a(b)\n * ```\n *\n * @param {Effects} effects\n *   Context.\n * @param {State} ok\n *   State switched to when successful.\n * @param {State} nok\n *   State switched to when unsuccessful.\n * @param {TokenType} type\n *   Type for whole (`<a>` or `b`).\n * @param {TokenType} literalType\n *   Type when enclosed (`<a>`).\n * @param {TokenType} literalMarkerType\n *   Type for enclosing (`<` and `>`).\n * @param {TokenType} rawType\n *   Type when not enclosed (`b`).\n * @param {TokenType} stringType\n *   Type for the value (`a` or `b`).\n * @param {number | undefined} [max=Infinity]\n *   Depth of nested parens (inclusive).\n * @returns {State}\n *   Start state.\n */\nexport function factoryDestination(effects, ok, nok, type, literalType, literalMarkerType, rawType, stringType, max) {\n  const limit = max || Number.POSITIVE_INFINITY;\n  let balance = 0;\n  return start;\n\n  /**\n   * Start of destination.\n   *\n   * ```markdown\n   * > | <aa>\n   *     ^\n   * > | aa\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    if (code === 60) {\n      effects.enter(type);\n      effects.enter(literalType);\n      effects.enter(literalMarkerType);\n      effects.consume(code);\n      effects.exit(literalMarkerType);\n      return enclosedBefore;\n    }\n\n    // ASCII control, space, closing paren.\n    if (code === null || code === 32 || code === 41 || asciiControl(code)) {\n      return nok(code);\n    }\n    effects.enter(type);\n    effects.enter(rawType);\n    effects.enter(stringType);\n    effects.enter(\"chunkString\", {\n      contentType: \"string\"\n    });\n    return raw(code);\n  }\n\n  /**\n   * After `<`, at an enclosed destination.\n   *\n   * ```markdown\n   * > | <aa>\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function enclosedBefore(code) {\n    if (code === 62) {\n      effects.enter(literalMarkerType);\n      effects.consume(code);\n      effects.exit(literalMarkerType);\n      effects.exit(literalType);\n      effects.exit(type);\n      return ok;\n    }\n    effects.enter(stringType);\n    effects.enter(\"chunkString\", {\n      contentType: \"string\"\n    });\n    return enclosed(code);\n  }\n\n  /**\n   * In enclosed destination.\n   *\n   * ```markdown\n   * > | <aa>\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function enclosed(code) {\n    if (code === 62) {\n      effects.exit(\"chunkString\");\n      effects.exit(stringType);\n      return enclosedBefore(code);\n    }\n    if (code === null || code === 60 || markdownLineEnding(code)) {\n      return nok(code);\n    }\n    effects.consume(code);\n    return code === 92 ? enclosedEscape : enclosed;\n  }\n\n  /**\n   * After `\\`, at a special character.\n   *\n   * ```markdown\n   * > | <a\\*a>\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function enclosedEscape(code) {\n    if (code === 60 || code === 62 || code === 92) {\n      effects.consume(code);\n      return enclosed;\n    }\n    return enclosed(code);\n  }\n\n  /**\n   * In raw destination.\n   *\n   * ```markdown\n   * > | aa\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function raw(code) {\n    if (!balance && (code === null || code === 41 || markdownLineEndingOrSpace(code))) {\n      effects.exit(\"chunkString\");\n      effects.exit(stringType);\n      effects.exit(rawType);\n      effects.exit(type);\n      return ok(code);\n    }\n    if (balance < limit && code === 40) {\n      effects.consume(code);\n      balance++;\n      return raw;\n    }\n    if (code === 41) {\n      effects.consume(code);\n      balance--;\n      return raw;\n    }\n\n    // ASCII control (but *not* `\\0`) and space and `(`.\n    // Note: in `markdown-rs`, `\\0` exists in codes, in `micromark-js` it\n    // doesn\u2019t.\n    if (code === null || code === 32 || code === 40 || asciiControl(code)) {\n      return nok(code);\n    }\n    effects.consume(code);\n    return code === 92 ? rawEscape : raw;\n  }\n\n  /**\n   * After `\\`, at special character.\n   *\n   * ```markdown\n   * > | a\\*a\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function rawEscape(code) {\n    if (code === 40 || code === 41 || code === 92) {\n      effects.consume(code);\n      return raw;\n    }\n    return raw(code);\n  }\n}", "/**\n * @import {\n *   Effects,\n *   State,\n *   TokenizeContext,\n *   TokenType\n * } from 'micromark-util-types'\n */\n\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/**\n * Parse labels.\n *\n * > \uD83D\uDC49 **Note**: labels in markdown are capped at 999 characters in the string.\n *\n * ###### Examples\n *\n * ```markdown\n * [a]\n * [a\n * b]\n * [a\\]b]\n * ```\n *\n * @this {TokenizeContext}\n *   Tokenize context.\n * @param {Effects} effects\n *   Context.\n * @param {State} ok\n *   State switched to when successful.\n * @param {State} nok\n *   State switched to when unsuccessful.\n * @param {TokenType} type\n *   Type of the whole label (`[a]`).\n * @param {TokenType} markerType\n *   Type for the markers (`[` and `]`).\n * @param {TokenType} stringType\n *   Type for the identifier (`a`).\n * @returns {State}\n *   Start state.\n */\nexport function factoryLabel(effects, ok, nok, type, markerType, stringType) {\n  const self = this;\n  let size = 0;\n  /** @type {boolean} */\n  let seen;\n  return start;\n\n  /**\n   * Start of label.\n   *\n   * ```markdown\n   * > | [a]\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter(type);\n    effects.enter(markerType);\n    effects.consume(code);\n    effects.exit(markerType);\n    effects.enter(stringType);\n    return atBreak;\n  }\n\n  /**\n   * In label, at something, before something else.\n   *\n   * ```markdown\n   * > | [a]\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function atBreak(code) {\n    if (size > 999 || code === null || code === 91 || code === 93 && !seen ||\n    // To do: remove in the future once we\u2019ve switched from\n    // `micromark-extension-footnote` to `micromark-extension-gfm-footnote`,\n    // which doesn\u2019t need this.\n    // Hidden footnotes hook.\n    /* c8 ignore next 3 */\n    code === 94 && !size && '_hiddenFootnoteSupport' in self.parser.constructs) {\n      return nok(code);\n    }\n    if (code === 93) {\n      effects.exit(stringType);\n      effects.enter(markerType);\n      effects.consume(code);\n      effects.exit(markerType);\n      effects.exit(type);\n      return ok;\n    }\n\n    // To do: indent? Link chunks and EOLs together?\n    if (markdownLineEnding(code)) {\n      effects.enter(\"lineEnding\");\n      effects.consume(code);\n      effects.exit(\"lineEnding\");\n      return atBreak;\n    }\n    effects.enter(\"chunkString\", {\n      contentType: \"string\"\n    });\n    return labelInside(code);\n  }\n\n  /**\n   * In label, in text.\n   *\n   * ```markdown\n   * > | [a]\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelInside(code) {\n    if (code === null || code === 91 || code === 93 || markdownLineEnding(code) || size++ > 999) {\n      effects.exit(\"chunkString\");\n      return atBreak(code);\n    }\n    effects.consume(code);\n    if (!seen) seen = !markdownSpace(code);\n    return code === 92 ? labelEscape : labelInside;\n  }\n\n  /**\n   * After `\\`, at a special character.\n   *\n   * ```markdown\n   * > | [a\\*a]\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelEscape(code) {\n    if (code === 91 || code === 92 || code === 93) {\n      effects.consume(code);\n      size++;\n      return labelInside;\n    }\n    return labelInside(code);\n  }\n}", "/**\n * @import {\n *   Code,\n *   Effects,\n *   State,\n *   TokenType\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding } from 'micromark-util-character';\n/**\n * Parse titles.\n *\n * ###### Examples\n *\n * ```markdown\n * \"a\"\n * 'b'\n * (c)\n * \"a\n * b\"\n * 'a\n *     b'\n * (a\\)b)\n * ```\n *\n * @param {Effects} effects\n *   Context.\n * @param {State} ok\n *   State switched to when successful.\n * @param {State} nok\n *   State switched to when unsuccessful.\n * @param {TokenType} type\n *   Type of the whole title (`\"a\"`, `'b'`, `(c)`).\n * @param {TokenType} markerType\n *   Type for the markers (`\"`, `'`, `(`, and `)`).\n * @param {TokenType} stringType\n *   Type for the value (`a`).\n * @returns {State}\n *   Start state.\n */\nexport function factoryTitle(effects, ok, nok, type, markerType, stringType) {\n  /** @type {NonNullable<Code>} */\n  let marker;\n  return start;\n\n  /**\n   * Start of title.\n   *\n   * ```markdown\n   * > | \"a\"\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    if (code === 34 || code === 39 || code === 40) {\n      effects.enter(type);\n      effects.enter(markerType);\n      effects.consume(code);\n      effects.exit(markerType);\n      marker = code === 40 ? 41 : code;\n      return begin;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After opening marker.\n   *\n   * This is also used at the closing marker.\n   *\n   * ```markdown\n   * > | \"a\"\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function begin(code) {\n    if (code === marker) {\n      effects.enter(markerType);\n      effects.consume(code);\n      effects.exit(markerType);\n      effects.exit(type);\n      return ok;\n    }\n    effects.enter(stringType);\n    return atBreak(code);\n  }\n\n  /**\n   * At something, before something else.\n   *\n   * ```markdown\n   * > | \"a\"\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function atBreak(code) {\n    if (code === marker) {\n      effects.exit(stringType);\n      return begin(marker);\n    }\n    if (code === null) {\n      return nok(code);\n    }\n\n    // Note: blank lines can\u2019t exist in content.\n    if (markdownLineEnding(code)) {\n      // To do: use `space_or_tab_eol_with_options`, connect.\n      effects.enter(\"lineEnding\");\n      effects.consume(code);\n      effects.exit(\"lineEnding\");\n      return factorySpace(effects, atBreak, \"linePrefix\");\n    }\n    effects.enter(\"chunkString\", {\n      contentType: \"string\"\n    });\n    return inside(code);\n  }\n\n  /**\n   *\n   *\n   * @type {State}\n   */\n  function inside(code) {\n    if (code === marker || code === null || markdownLineEnding(code)) {\n      effects.exit(\"chunkString\");\n      return atBreak(code);\n    }\n    effects.consume(code);\n    return code === 92 ? escape : inside;\n  }\n\n  /**\n   * After `\\`, at a special character.\n   *\n   * ```markdown\n   * > | \"a\\*b\"\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function escape(code) {\n    if (code === marker || code === 92) {\n      effects.consume(code);\n      return inside;\n    }\n    return inside(code);\n  }\n}", "/**\n * @import {Effects, State} from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/**\n * Parse spaces and tabs.\n *\n * There is no `nok` parameter:\n *\n * *   line endings or spaces in markdown are often optional, in which case this\n *     factory can be used and `ok` will be switched to whether spaces were found\n *     or not\n * *   one line ending or space can be detected with\n *     `markdownLineEndingOrSpace(code)` right before using `factoryWhitespace`\n *\n * @param {Effects} effects\n *   Context.\n * @param {State} ok\n *   State switched to when successful.\n * @returns {State}\n *   Start state.\n */\nexport function factoryWhitespace(effects, ok) {\n  /** @type {boolean} */\n  let seen;\n  return start;\n\n  /** @type {State} */\n  function start(code) {\n    if (markdownLineEnding(code)) {\n      effects.enter(\"lineEnding\");\n      effects.consume(code);\n      effects.exit(\"lineEnding\");\n      seen = true;\n      return start;\n    }\n    if (markdownSpace(code)) {\n      return factorySpace(effects, start, seen ? \"linePrefix\" : \"lineSuffix\")(code);\n    }\n    return ok(code);\n  }\n}", "/**\n * @import {\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factoryDestination } from 'micromark-factory-destination';\nimport { factoryLabel } from 'micromark-factory-label';\nimport { factorySpace } from 'micromark-factory-space';\nimport { factoryTitle } from 'micromark-factory-title';\nimport { factoryWhitespace } from 'micromark-factory-whitespace';\nimport { markdownLineEndingOrSpace, markdownLineEnding, markdownSpace } from 'micromark-util-character';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\n/** @type {Construct} */\nexport const definition = {\n  name: 'definition',\n  tokenize: tokenizeDefinition\n};\n\n/** @type {Construct} */\nconst titleBefore = {\n  partial: true,\n  tokenize: tokenizeTitleBefore\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeDefinition(effects, ok, nok) {\n  const self = this;\n  /** @type {string} */\n  let identifier;\n  return start;\n\n  /**\n   * At start of a definition.\n   *\n   * ```markdown\n   * > | [a]: b \"c\"\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    // Do not interrupt paragraphs (but do follow definitions).\n    // To do: do `interrupt` the way `markdown-rs` does.\n    // To do: parse whitespace the way `markdown-rs` does.\n    effects.enter(\"definition\");\n    return before(code);\n  }\n\n  /**\n   * After optional whitespace, at `[`.\n   *\n   * ```markdown\n   * > | [a]: b \"c\"\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function before(code) {\n    // To do: parse whitespace the way `markdown-rs` does.\n\n    return factoryLabel.call(self, effects, labelAfter,\n    // Note: we don\u2019t need to reset the way `markdown-rs` does.\n    nok, \"definitionLabel\", \"definitionLabelMarker\", \"definitionLabelString\")(code);\n  }\n\n  /**\n   * After label.\n   *\n   * ```markdown\n   * > | [a]: b \"c\"\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelAfter(code) {\n    identifier = normalizeIdentifier(self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1));\n    if (code === 58) {\n      effects.enter(\"definitionMarker\");\n      effects.consume(code);\n      effects.exit(\"definitionMarker\");\n      return markerAfter;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After marker.\n   *\n   * ```markdown\n   * > | [a]: b \"c\"\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function markerAfter(code) {\n    // Note: whitespace is optional.\n    return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, destinationBefore)(code) : destinationBefore(code);\n  }\n\n  /**\n   * Before destination.\n   *\n   * ```markdown\n   * > | [a]: b \"c\"\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function destinationBefore(code) {\n    return factoryDestination(effects, destinationAfter,\n    // Note: we don\u2019t need to reset the way `markdown-rs` does.\n    nok, \"definitionDestination\", \"definitionDestinationLiteral\", \"definitionDestinationLiteralMarker\", \"definitionDestinationRaw\", \"definitionDestinationString\")(code);\n  }\n\n  /**\n   * After destination.\n   *\n   * ```markdown\n   * > | [a]: b \"c\"\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function destinationAfter(code) {\n    return effects.attempt(titleBefore, after, after)(code);\n  }\n\n  /**\n   * After definition.\n   *\n   * ```markdown\n   * > | [a]: b\n   *           ^\n   * > | [a]: b \"c\"\n   *               ^\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    return markdownSpace(code) ? factorySpace(effects, afterWhitespace, \"whitespace\")(code) : afterWhitespace(code);\n  }\n\n  /**\n   * After definition, after optional whitespace.\n   *\n   * ```markdown\n   * > | [a]: b\n   *           ^\n   * > | [a]: b \"c\"\n   *               ^\n   * ```\n   *\n   * @type {State}\n   */\n  function afterWhitespace(code) {\n    if (code === null || markdownLineEnding(code)) {\n      effects.exit(\"definition\");\n\n      // Note: we don\u2019t care about uniqueness.\n      // It\u2019s likely that that doesn\u2019t happen very frequently.\n      // It is more likely that it wastes precious time.\n      self.parser.defined.push(identifier);\n\n      // To do: `markdown-rs` interrupt.\n      // // You\u2019d be interrupting.\n      // tokenizer.interrupt = true\n      return ok(code);\n    }\n    return nok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeTitleBefore(effects, ok, nok) {\n  return titleBefore;\n\n  /**\n   * After destination, at whitespace.\n   *\n   * ```markdown\n   * > | [a]: b\n   *           ^\n   * > | [a]: b \"c\"\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function titleBefore(code) {\n    return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, beforeMarker)(code) : nok(code);\n  }\n\n  /**\n   * At title.\n   *\n   * ```markdown\n   *   | [a]: b\n   * > | \"c\"\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function beforeMarker(code) {\n    return factoryTitle(effects, titleAfter, nok, \"definitionTitle\", \"definitionTitleMarker\", \"definitionTitleString\")(code);\n  }\n\n  /**\n   * After title.\n   *\n   * ```markdown\n   * > | [a]: b \"c\"\n   *               ^\n   * ```\n   *\n   * @type {State}\n   */\n  function titleAfter(code) {\n    return markdownSpace(code) ? factorySpace(effects, titleAfterOptionalWhitespace, \"whitespace\")(code) : titleAfterOptionalWhitespace(code);\n  }\n\n  /**\n   * After title, after optional whitespace.\n   *\n   * ```markdown\n   * > | [a]: b \"c\"\n   *               ^\n   * ```\n   *\n   * @type {State}\n   */\n  function titleAfterOptionalWhitespace(code) {\n    return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n  }\n}", "/**\n * @import {\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { markdownLineEnding } from 'micromark-util-character';\n/** @type {Construct} */\nexport const hardBreakEscape = {\n  name: 'hardBreakEscape',\n  tokenize: tokenizeHardBreakEscape\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeHardBreakEscape(effects, ok, nok) {\n  return start;\n\n  /**\n   * Start of a hard break (escape).\n   *\n   * ```markdown\n   * > | a\\\n   *      ^\n   *   | b\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter(\"hardBreakEscape\");\n    effects.consume(code);\n    return after;\n  }\n\n  /**\n   * After `\\`, at eol.\n   *\n   * ```markdown\n   * > | a\\\n   *       ^\n   *   | b\n   * ```\n   *\n   *  @type {State}\n   */\n  function after(code) {\n    if (markdownLineEnding(code)) {\n      effects.exit(\"hardBreakEscape\");\n      return ok(code);\n    }\n    return nok(code);\n  }\n}", "/**\n * @import {\n *   Construct,\n *   Resolver,\n *   State,\n *   TokenizeContext,\n *   Tokenizer,\n *   Token\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEndingOrSpace, markdownLineEnding, markdownSpace } from 'micromark-util-character';\nimport { splice } from 'micromark-util-chunked';\n/** @type {Construct} */\nexport const headingAtx = {\n  name: 'headingAtx',\n  resolve: resolveHeadingAtx,\n  tokenize: tokenizeHeadingAtx\n};\n\n/** @type {Resolver} */\nfunction resolveHeadingAtx(events, context) {\n  let contentEnd = events.length - 2;\n  let contentStart = 3;\n  /** @type {Token} */\n  let content;\n  /** @type {Token} */\n  let text;\n\n  // Prefix whitespace, part of the opening.\n  if (events[contentStart][1].type === \"whitespace\") {\n    contentStart += 2;\n  }\n\n  // Suffix whitespace, part of the closing.\n  if (contentEnd - 2 > contentStart && events[contentEnd][1].type === \"whitespace\") {\n    contentEnd -= 2;\n  }\n  if (events[contentEnd][1].type === \"atxHeadingSequence\" && (contentStart === contentEnd - 1 || contentEnd - 4 > contentStart && events[contentEnd - 2][1].type === \"whitespace\")) {\n    contentEnd -= contentStart + 1 === contentEnd ? 2 : 4;\n  }\n  if (contentEnd > contentStart) {\n    content = {\n      type: \"atxHeadingText\",\n      start: events[contentStart][1].start,\n      end: events[contentEnd][1].end\n    };\n    text = {\n      type: \"chunkText\",\n      start: events[contentStart][1].start,\n      end: events[contentEnd][1].end,\n      contentType: \"text\"\n    };\n    splice(events, contentStart, contentEnd - contentStart + 1, [['enter', content, context], ['enter', text, context], ['exit', text, context], ['exit', content, context]]);\n  }\n  return events;\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeHeadingAtx(effects, ok, nok) {\n  let size = 0;\n  return start;\n\n  /**\n   * Start of a heading (atx).\n   *\n   * ```markdown\n   * > | ## aa\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    // To do: parse indent like `markdown-rs`.\n    effects.enter(\"atxHeading\");\n    return before(code);\n  }\n\n  /**\n   * After optional whitespace, at `#`.\n   *\n   * ```markdown\n   * > | ## aa\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function before(code) {\n    effects.enter(\"atxHeadingSequence\");\n    return sequenceOpen(code);\n  }\n\n  /**\n   * In opening sequence.\n   *\n   * ```markdown\n   * > | ## aa\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function sequenceOpen(code) {\n    if (code === 35 && size++ < 6) {\n      effects.consume(code);\n      return sequenceOpen;\n    }\n\n    // Always at least one `#`.\n    if (code === null || markdownLineEndingOrSpace(code)) {\n      effects.exit(\"atxHeadingSequence\");\n      return atBreak(code);\n    }\n    return nok(code);\n  }\n\n  /**\n   * After something, before something else.\n   *\n   * ```markdown\n   * > | ## aa\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function atBreak(code) {\n    if (code === 35) {\n      effects.enter(\"atxHeadingSequence\");\n      return sequenceFurther(code);\n    }\n    if (code === null || markdownLineEnding(code)) {\n      effects.exit(\"atxHeading\");\n      // To do: interrupt like `markdown-rs`.\n      // // Feel free to interrupt.\n      // tokenizer.interrupt = false\n      return ok(code);\n    }\n    if (markdownSpace(code)) {\n      return factorySpace(effects, atBreak, \"whitespace\")(code);\n    }\n\n    // To do: generate `data` tokens, add the `text` token later.\n    // Needs edit map, see: `markdown.rs`.\n    effects.enter(\"atxHeadingText\");\n    return data(code);\n  }\n\n  /**\n   * In further sequence (after whitespace).\n   *\n   * Could be normal \u201Cvisible\u201D hashes in the heading or a final sequence.\n   *\n   * ```markdown\n   * > | ## aa ##\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function sequenceFurther(code) {\n    if (code === 35) {\n      effects.consume(code);\n      return sequenceFurther;\n    }\n    effects.exit(\"atxHeadingSequence\");\n    return atBreak(code);\n  }\n\n  /**\n   * In text.\n   *\n   * ```markdown\n   * > | ## aa\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function data(code) {\n    if (code === null || code === 35 || markdownLineEndingOrSpace(code)) {\n      effects.exit(\"atxHeadingText\");\n      return atBreak(code);\n    }\n    effects.consume(code);\n    return data;\n  }\n}", "/**\n * List of lowercase HTML \u201Cblock\u201D tag names.\n *\n * The list, when parsing HTML (flow), results in more relaxed rules (condition\n * 6).\n * Because they are known blocks, the HTML-like syntax doesn\u2019t have to be\n * strictly parsed.\n * For tag names not in this list, a more strict algorithm (condition 7) is used\n * to detect whether the HTML-like syntax is seen as HTML (flow) or not.\n *\n * This is copied from:\n * <https://spec.commonmark.org/0.30/#html-blocks>.\n *\n * > \uD83D\uDC49 **Note**: `search` was added in `CommonMark@0.31`.\n */\nexport const htmlBlockNames = [\n  'address',\n  'article',\n  'aside',\n  'base',\n  'basefont',\n  'blockquote',\n  'body',\n  'caption',\n  'center',\n  'col',\n  'colgroup',\n  'dd',\n  'details',\n  'dialog',\n  'dir',\n  'div',\n  'dl',\n  'dt',\n  'fieldset',\n  'figcaption',\n  'figure',\n  'footer',\n  'form',\n  'frame',\n  'frameset',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'head',\n  'header',\n  'hr',\n  'html',\n  'iframe',\n  'legend',\n  'li',\n  'link',\n  'main',\n  'menu',\n  'menuitem',\n  'nav',\n  'noframes',\n  'ol',\n  'optgroup',\n  'option',\n  'p',\n  'param',\n  'search',\n  'section',\n  'summary',\n  'table',\n  'tbody',\n  'td',\n  'tfoot',\n  'th',\n  'thead',\n  'title',\n  'tr',\n  'track',\n  'ul'\n]\n\n/**\n * List of lowercase HTML \u201Craw\u201D tag names.\n *\n * The list, when parsing HTML (flow), results in HTML that can include lines\n * without exiting, until a closing tag also in this list is found (condition\n * 1).\n *\n * This module is copied from:\n * <https://spec.commonmark.org/0.30/#html-blocks>.\n *\n * > \uD83D\uDC49 **Note**: `textarea` was added in `CommonMark@0.30`.\n */\nexport const htmlRawNames = ['pre', 'script', 'style', 'textarea']\n", "/**\n * @import {\n *   Code,\n *   Construct,\n *   Resolver,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { asciiAlphanumeric, asciiAlpha, markdownLineEndingOrSpace, markdownLineEnding, markdownSpace } from 'micromark-util-character';\nimport { htmlBlockNames, htmlRawNames } from 'micromark-util-html-tag-name';\nimport { blankLine } from './blank-line.js';\n\n/** @type {Construct} */\nexport const htmlFlow = {\n  concrete: true,\n  name: 'htmlFlow',\n  resolveTo: resolveToHtmlFlow,\n  tokenize: tokenizeHtmlFlow\n};\n\n/** @type {Construct} */\nconst blankLineBefore = {\n  partial: true,\n  tokenize: tokenizeBlankLineBefore\n};\nconst nonLazyContinuationStart = {\n  partial: true,\n  tokenize: tokenizeNonLazyContinuationStart\n};\n\n/** @type {Resolver} */\nfunction resolveToHtmlFlow(events) {\n  let index = events.length;\n  while (index--) {\n    if (events[index][0] === 'enter' && events[index][1].type === \"htmlFlow\") {\n      break;\n    }\n  }\n  if (index > 1 && events[index - 2][1].type === \"linePrefix\") {\n    // Add the prefix start to the HTML token.\n    events[index][1].start = events[index - 2][1].start;\n    // Add the prefix start to the HTML line token.\n    events[index + 1][1].start = events[index - 2][1].start;\n    // Remove the line prefix.\n    events.splice(index - 2, 2);\n  }\n  return events;\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeHtmlFlow(effects, ok, nok) {\n  const self = this;\n  /** @type {number} */\n  let marker;\n  /** @type {boolean} */\n  let closingTag;\n  /** @type {string} */\n  let buffer;\n  /** @type {number} */\n  let index;\n  /** @type {Code} */\n  let markerB;\n  return start;\n\n  /**\n   * Start of HTML (flow).\n   *\n   * ```markdown\n   * > | <x />\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    // To do: parse indent like `markdown-rs`.\n    return before(code);\n  }\n\n  /**\n   * At `<`, after optional whitespace.\n   *\n   * ```markdown\n   * > | <x />\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function before(code) {\n    effects.enter(\"htmlFlow\");\n    effects.enter(\"htmlFlowData\");\n    effects.consume(code);\n    return open;\n  }\n\n  /**\n   * After `<`, at tag name or other stuff.\n   *\n   * ```markdown\n   * > | <x />\n   *      ^\n   * > | <!doctype>\n   *      ^\n   * > | <!--xxx-->\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function open(code) {\n    if (code === 33) {\n      effects.consume(code);\n      return declarationOpen;\n    }\n    if (code === 47) {\n      effects.consume(code);\n      closingTag = true;\n      return tagCloseStart;\n    }\n    if (code === 63) {\n      effects.consume(code);\n      marker = 3;\n      // To do:\n      // tokenizer.concrete = true\n      // To do: use `markdown-rs` style interrupt.\n      // While we\u2019re in an instruction instead of a declaration, we\u2019re on a `?`\n      // right now, so we do need to search for `>`, similar to declarations.\n      return self.interrupt ? ok : continuationDeclarationInside;\n    }\n\n    // ASCII alphabetical.\n    if (asciiAlpha(code)) {\n      // Always the case.\n      effects.consume(code);\n      buffer = String.fromCharCode(code);\n      return tagName;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After `<!`, at declaration, comment, or CDATA.\n   *\n   * ```markdown\n   * > | <!doctype>\n   *       ^\n   * > | <!--xxx-->\n   *       ^\n   * > | <![CDATA[>&<]]>\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function declarationOpen(code) {\n    if (code === 45) {\n      effects.consume(code);\n      marker = 2;\n      return commentOpenInside;\n    }\n    if (code === 91) {\n      effects.consume(code);\n      marker = 5;\n      index = 0;\n      return cdataOpenInside;\n    }\n\n    // ASCII alphabetical.\n    if (asciiAlpha(code)) {\n      effects.consume(code);\n      marker = 4;\n      // // Do not form containers.\n      // tokenizer.concrete = true\n      return self.interrupt ? ok : continuationDeclarationInside;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After `<!-`, inside a comment, at another `-`.\n   *\n   * ```markdown\n   * > | <!--xxx-->\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function commentOpenInside(code) {\n    if (code === 45) {\n      effects.consume(code);\n      // // Do not form containers.\n      // tokenizer.concrete = true\n      return self.interrupt ? ok : continuationDeclarationInside;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After `<![`, inside CDATA, expecting `CDATA[`.\n   *\n   * ```markdown\n   * > | <![CDATA[>&<]]>\n   *        ^^^^^^\n   * ```\n   *\n   * @type {State}\n   */\n  function cdataOpenInside(code) {\n    const value = \"CDATA[\";\n    if (code === value.charCodeAt(index++)) {\n      effects.consume(code);\n      if (index === value.length) {\n        // // Do not form containers.\n        // tokenizer.concrete = true\n        return self.interrupt ? ok : continuation;\n      }\n      return cdataOpenInside;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After `</`, in closing tag, at tag name.\n   *\n   * ```markdown\n   * > | </x>\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagCloseStart(code) {\n    if (asciiAlpha(code)) {\n      // Always the case.\n      effects.consume(code);\n      buffer = String.fromCharCode(code);\n      return tagName;\n    }\n    return nok(code);\n  }\n\n  /**\n   * In tag name.\n   *\n   * ```markdown\n   * > | <ab>\n   *      ^^\n   * > | </ab>\n   *       ^^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagName(code) {\n    if (code === null || code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {\n      const slash = code === 47;\n      const name = buffer.toLowerCase();\n      if (!slash && !closingTag && htmlRawNames.includes(name)) {\n        marker = 1;\n        // // Do not form containers.\n        // tokenizer.concrete = true\n        return self.interrupt ? ok(code) : continuation(code);\n      }\n      if (htmlBlockNames.includes(buffer.toLowerCase())) {\n        marker = 6;\n        if (slash) {\n          effects.consume(code);\n          return basicSelfClosing;\n        }\n\n        // // Do not form containers.\n        // tokenizer.concrete = true\n        return self.interrupt ? ok(code) : continuation(code);\n      }\n      marker = 7;\n      // Do not support complete HTML when interrupting.\n      return self.interrupt && !self.parser.lazy[self.now().line] ? nok(code) : closingTag ? completeClosingTagAfter(code) : completeAttributeNameBefore(code);\n    }\n\n    // ASCII alphanumerical and `-`.\n    if (code === 45 || asciiAlphanumeric(code)) {\n      effects.consume(code);\n      buffer += String.fromCharCode(code);\n      return tagName;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After closing slash of a basic tag name.\n   *\n   * ```markdown\n   * > | <div/>\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function basicSelfClosing(code) {\n    if (code === 62) {\n      effects.consume(code);\n      // // Do not form containers.\n      // tokenizer.concrete = true\n      return self.interrupt ? ok : continuation;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After closing slash of a complete tag name.\n   *\n   * ```markdown\n   * > | <x/>\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function completeClosingTagAfter(code) {\n    if (markdownSpace(code)) {\n      effects.consume(code);\n      return completeClosingTagAfter;\n    }\n    return completeEnd(code);\n  }\n\n  /**\n   * At an attribute name.\n   *\n   * At first, this state is used after a complete tag name, after whitespace,\n   * where it expects optional attributes or the end of the tag.\n   * It is also reused after attributes, when expecting more optional\n   * attributes.\n   *\n   * ```markdown\n   * > | <a />\n   *        ^\n   * > | <a :b>\n   *        ^\n   * > | <a _b>\n   *        ^\n   * > | <a b>\n   *        ^\n   * > | <a >\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function completeAttributeNameBefore(code) {\n    if (code === 47) {\n      effects.consume(code);\n      return completeEnd;\n    }\n\n    // ASCII alphanumerical and `:` and `_`.\n    if (code === 58 || code === 95 || asciiAlpha(code)) {\n      effects.consume(code);\n      return completeAttributeName;\n    }\n    if (markdownSpace(code)) {\n      effects.consume(code);\n      return completeAttributeNameBefore;\n    }\n    return completeEnd(code);\n  }\n\n  /**\n   * In attribute name.\n   *\n   * ```markdown\n   * > | <a :b>\n   *         ^\n   * > | <a _b>\n   *         ^\n   * > | <a b>\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function completeAttributeName(code) {\n    // ASCII alphanumerical and `-`, `.`, `:`, and `_`.\n    if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) {\n      effects.consume(code);\n      return completeAttributeName;\n    }\n    return completeAttributeNameAfter(code);\n  }\n\n  /**\n   * After attribute name, at an optional initializer, the end of the tag, or\n   * whitespace.\n   *\n   * ```markdown\n   * > | <a b>\n   *         ^\n   * > | <a b=c>\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function completeAttributeNameAfter(code) {\n    if (code === 61) {\n      effects.consume(code);\n      return completeAttributeValueBefore;\n    }\n    if (markdownSpace(code)) {\n      effects.consume(code);\n      return completeAttributeNameAfter;\n    }\n    return completeAttributeNameBefore(code);\n  }\n\n  /**\n   * Before unquoted, double quoted, or single quoted attribute value, allowing\n   * whitespace.\n   *\n   * ```markdown\n   * > | <a b=c>\n   *          ^\n   * > | <a b=\"c\">\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function completeAttributeValueBefore(code) {\n    if (code === null || code === 60 || code === 61 || code === 62 || code === 96) {\n      return nok(code);\n    }\n    if (code === 34 || code === 39) {\n      effects.consume(code);\n      markerB = code;\n      return completeAttributeValueQuoted;\n    }\n    if (markdownSpace(code)) {\n      effects.consume(code);\n      return completeAttributeValueBefore;\n    }\n    return completeAttributeValueUnquoted(code);\n  }\n\n  /**\n   * In double or single quoted attribute value.\n   *\n   * ```markdown\n   * > | <a b=\"c\">\n   *           ^\n   * > | <a b='c'>\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function completeAttributeValueQuoted(code) {\n    if (code === markerB) {\n      effects.consume(code);\n      markerB = null;\n      return completeAttributeValueQuotedAfter;\n    }\n    if (code === null || markdownLineEnding(code)) {\n      return nok(code);\n    }\n    effects.consume(code);\n    return completeAttributeValueQuoted;\n  }\n\n  /**\n   * In unquoted attribute value.\n   *\n   * ```markdown\n   * > | <a b=c>\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function completeAttributeValueUnquoted(code) {\n    if (code === null || code === 34 || code === 39 || code === 47 || code === 60 || code === 61 || code === 62 || code === 96 || markdownLineEndingOrSpace(code)) {\n      return completeAttributeNameAfter(code);\n    }\n    effects.consume(code);\n    return completeAttributeValueUnquoted;\n  }\n\n  /**\n   * After double or single quoted attribute value, before whitespace or the\n   * end of the tag.\n   *\n   * ```markdown\n   * > | <a b=\"c\">\n   *            ^\n   * ```\n   *\n   * @type {State}\n   */\n  function completeAttributeValueQuotedAfter(code) {\n    if (code === 47 || code === 62 || markdownSpace(code)) {\n      return completeAttributeNameBefore(code);\n    }\n    return nok(code);\n  }\n\n  /**\n   * In certain circumstances of a complete tag where only an `>` is allowed.\n   *\n   * ```markdown\n   * > | <a b=\"c\">\n   *             ^\n   * ```\n   *\n   * @type {State}\n   */\n  function completeEnd(code) {\n    if (code === 62) {\n      effects.consume(code);\n      return completeAfter;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After `>` in a complete tag.\n   *\n   * ```markdown\n   * > | <x>\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function completeAfter(code) {\n    if (code === null || markdownLineEnding(code)) {\n      // // Do not form containers.\n      // tokenizer.concrete = true\n      return continuation(code);\n    }\n    if (markdownSpace(code)) {\n      effects.consume(code);\n      return completeAfter;\n    }\n    return nok(code);\n  }\n\n  /**\n   * In continuation of any HTML kind.\n   *\n   * ```markdown\n   * > | <!--xxx-->\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function continuation(code) {\n    if (code === 45 && marker === 2) {\n      effects.consume(code);\n      return continuationCommentInside;\n    }\n    if (code === 60 && marker === 1) {\n      effects.consume(code);\n      return continuationRawTagOpen;\n    }\n    if (code === 62 && marker === 4) {\n      effects.consume(code);\n      return continuationClose;\n    }\n    if (code === 63 && marker === 3) {\n      effects.consume(code);\n      return continuationDeclarationInside;\n    }\n    if (code === 93 && marker === 5) {\n      effects.consume(code);\n      return continuationCdataInside;\n    }\n    if (markdownLineEnding(code) && (marker === 6 || marker === 7)) {\n      effects.exit(\"htmlFlowData\");\n      return effects.check(blankLineBefore, continuationAfter, continuationStart)(code);\n    }\n    if (code === null || markdownLineEnding(code)) {\n      effects.exit(\"htmlFlowData\");\n      return continuationStart(code);\n    }\n    effects.consume(code);\n    return continuation;\n  }\n\n  /**\n   * In continuation, at eol.\n   *\n   * ```markdown\n   * > | <x>\n   *        ^\n   *   | asd\n   * ```\n   *\n   * @type {State}\n   */\n  function continuationStart(code) {\n    return effects.check(nonLazyContinuationStart, continuationStartNonLazy, continuationAfter)(code);\n  }\n\n  /**\n   * In continuation, at eol, before non-lazy content.\n   *\n   * ```markdown\n   * > | <x>\n   *        ^\n   *   | asd\n   * ```\n   *\n   * @type {State}\n   */\n  function continuationStartNonLazy(code) {\n    effects.enter(\"lineEnding\");\n    effects.consume(code);\n    effects.exit(\"lineEnding\");\n    return continuationBefore;\n  }\n\n  /**\n   * In continuation, before non-lazy content.\n   *\n   * ```markdown\n   *   | <x>\n   * > | asd\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function continuationBefore(code) {\n    if (code === null || markdownLineEnding(code)) {\n      return continuationStart(code);\n    }\n    effects.enter(\"htmlFlowData\");\n    return continuation(code);\n  }\n\n  /**\n   * In comment continuation, after one `-`, expecting another.\n   *\n   * ```markdown\n   * > | <!--xxx-->\n   *             ^\n   * ```\n   *\n   * @type {State}\n   */\n  function continuationCommentInside(code) {\n    if (code === 45) {\n      effects.consume(code);\n      return continuationDeclarationInside;\n    }\n    return continuation(code);\n  }\n\n  /**\n   * In raw continuation, after `<`, at `/`.\n   *\n   * ```markdown\n   * > | <script>console.log(1)</script>\n   *                            ^\n   * ```\n   *\n   * @type {State}\n   */\n  function continuationRawTagOpen(code) {\n    if (code === 47) {\n      effects.consume(code);\n      buffer = '';\n      return continuationRawEndTag;\n    }\n    return continuation(code);\n  }\n\n  /**\n   * In raw continuation, after `</`, in a raw tag name.\n   *\n   * ```markdown\n   * > | <script>console.log(1)</script>\n   *                             ^^^^^^\n   * ```\n   *\n   * @type {State}\n   */\n  function continuationRawEndTag(code) {\n    if (code === 62) {\n      const name = buffer.toLowerCase();\n      if (htmlRawNames.includes(name)) {\n        effects.consume(code);\n        return continuationClose;\n      }\n      return continuation(code);\n    }\n    if (asciiAlpha(code) && buffer.length < 8) {\n      // Always the case.\n      effects.consume(code);\n      buffer += String.fromCharCode(code);\n      return continuationRawEndTag;\n    }\n    return continuation(code);\n  }\n\n  /**\n   * In cdata continuation, after `]`, expecting `]>`.\n   *\n   * ```markdown\n   * > | <![CDATA[>&<]]>\n   *                  ^\n   * ```\n   *\n   * @type {State}\n   */\n  function continuationCdataInside(code) {\n    if (code === 93) {\n      effects.consume(code);\n      return continuationDeclarationInside;\n    }\n    return continuation(code);\n  }\n\n  /**\n   * In declaration or instruction continuation, at `>`.\n   *\n   * ```markdown\n   * > | <!-->\n   *         ^\n   * > | <?>\n   *       ^\n   * > | <!q>\n   *        ^\n   * > | <!--ab-->\n   *             ^\n   * > | <![CDATA[>&<]]>\n   *                   ^\n   * ```\n   *\n   * @type {State}\n   */\n  function continuationDeclarationInside(code) {\n    if (code === 62) {\n      effects.consume(code);\n      return continuationClose;\n    }\n\n    // More dashes.\n    if (code === 45 && marker === 2) {\n      effects.consume(code);\n      return continuationDeclarationInside;\n    }\n    return continuation(code);\n  }\n\n  /**\n   * In closed continuation: everything we get until the eol/eof is part of it.\n   *\n   * ```markdown\n   * > | <!doctype>\n   *               ^\n   * ```\n   *\n   * @type {State}\n   */\n  function continuationClose(code) {\n    if (code === null || markdownLineEnding(code)) {\n      effects.exit(\"htmlFlowData\");\n      return continuationAfter(code);\n    }\n    effects.consume(code);\n    return continuationClose;\n  }\n\n  /**\n   * Done.\n   *\n   * ```markdown\n   * > | <!doctype>\n   *               ^\n   * ```\n   *\n   * @type {State}\n   */\n  function continuationAfter(code) {\n    effects.exit(\"htmlFlow\");\n    // // Feel free to interrupt.\n    // tokenizer.interrupt = false\n    // // No longer concrete.\n    // tokenizer.concrete = false\n    return ok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeNonLazyContinuationStart(effects, ok, nok) {\n  const self = this;\n  return start;\n\n  /**\n   * At eol, before continuation.\n   *\n   * ```markdown\n   * > | * ```js\n   *            ^\n   *   | b\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    if (markdownLineEnding(code)) {\n      effects.enter(\"lineEnding\");\n      effects.consume(code);\n      effects.exit(\"lineEnding\");\n      return after;\n    }\n    return nok(code);\n  }\n\n  /**\n   * A continuation.\n   *\n   * ```markdown\n   *   | * ```js\n   * > | b\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    return self.parser.lazy[self.now().line] ? nok(code) : ok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLineBefore(effects, ok, nok) {\n  return start;\n\n  /**\n   * Before eol, expecting blank line.\n   *\n   * ```markdown\n   * > | <div>\n   *          ^\n   *   |\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter(\"lineEnding\");\n    effects.consume(code);\n    effects.exit(\"lineEnding\");\n    return effects.attempt(blankLine, ok, nok);\n  }\n}", "/**\n * @import {\n *   Code,\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { asciiAlphanumeric, asciiAlpha, markdownLineEndingOrSpace, markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const htmlText = {\n  name: 'htmlText',\n  tokenize: tokenizeHtmlText\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeHtmlText(effects, ok, nok) {\n  const self = this;\n  /** @type {NonNullable<Code> | undefined} */\n  let marker;\n  /** @type {number} */\n  let index;\n  /** @type {State} */\n  let returnState;\n  return start;\n\n  /**\n   * Start of HTML (text).\n   *\n   * ```markdown\n   * > | a <b> c\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter(\"htmlText\");\n    effects.enter(\"htmlTextData\");\n    effects.consume(code);\n    return open;\n  }\n\n  /**\n   * After `<`, at tag name or other stuff.\n   *\n   * ```markdown\n   * > | a <b> c\n   *        ^\n   * > | a <!doctype> c\n   *        ^\n   * > | a <!--b--> c\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function open(code) {\n    if (code === 33) {\n      effects.consume(code);\n      return declarationOpen;\n    }\n    if (code === 47) {\n      effects.consume(code);\n      return tagCloseStart;\n    }\n    if (code === 63) {\n      effects.consume(code);\n      return instruction;\n    }\n\n    // ASCII alphabetical.\n    if (asciiAlpha(code)) {\n      effects.consume(code);\n      return tagOpen;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After `<!`, at declaration, comment, or CDATA.\n   *\n   * ```markdown\n   * > | a <!doctype> c\n   *         ^\n   * > | a <!--b--> c\n   *         ^\n   * > | a <![CDATA[>&<]]> c\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function declarationOpen(code) {\n    if (code === 45) {\n      effects.consume(code);\n      return commentOpenInside;\n    }\n    if (code === 91) {\n      effects.consume(code);\n      index = 0;\n      return cdataOpenInside;\n    }\n    if (asciiAlpha(code)) {\n      effects.consume(code);\n      return declaration;\n    }\n    return nok(code);\n  }\n\n  /**\n   * In a comment, after `<!-`, at another `-`.\n   *\n   * ```markdown\n   * > | a <!--b--> c\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function commentOpenInside(code) {\n    if (code === 45) {\n      effects.consume(code);\n      return commentEnd;\n    }\n    return nok(code);\n  }\n\n  /**\n   * In comment.\n   *\n   * ```markdown\n   * > | a <!--b--> c\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function comment(code) {\n    if (code === null) {\n      return nok(code);\n    }\n    if (code === 45) {\n      effects.consume(code);\n      return commentClose;\n    }\n    if (markdownLineEnding(code)) {\n      returnState = comment;\n      return lineEndingBefore(code);\n    }\n    effects.consume(code);\n    return comment;\n  }\n\n  /**\n   * In comment, after `-`.\n   *\n   * ```markdown\n   * > | a <!--b--> c\n   *             ^\n   * ```\n   *\n   * @type {State}\n   */\n  function commentClose(code) {\n    if (code === 45) {\n      effects.consume(code);\n      return commentEnd;\n    }\n    return comment(code);\n  }\n\n  /**\n   * In comment, after `--`.\n   *\n   * ```markdown\n   * > | a <!--b--> c\n   *              ^\n   * ```\n   *\n   * @type {State}\n   */\n  function commentEnd(code) {\n    return code === 62 ? end(code) : code === 45 ? commentClose(code) : comment(code);\n  }\n\n  /**\n   * After `<![`, in CDATA, expecting `CDATA[`.\n   *\n   * ```markdown\n   * > | a <![CDATA[>&<]]> b\n   *          ^^^^^^\n   * ```\n   *\n   * @type {State}\n   */\n  function cdataOpenInside(code) {\n    const value = \"CDATA[\";\n    if (code === value.charCodeAt(index++)) {\n      effects.consume(code);\n      return index === value.length ? cdata : cdataOpenInside;\n    }\n    return nok(code);\n  }\n\n  /**\n   * In CDATA.\n   *\n   * ```markdown\n   * > | a <![CDATA[>&<]]> b\n   *                ^^^\n   * ```\n   *\n   * @type {State}\n   */\n  function cdata(code) {\n    if (code === null) {\n      return nok(code);\n    }\n    if (code === 93) {\n      effects.consume(code);\n      return cdataClose;\n    }\n    if (markdownLineEnding(code)) {\n      returnState = cdata;\n      return lineEndingBefore(code);\n    }\n    effects.consume(code);\n    return cdata;\n  }\n\n  /**\n   * In CDATA, after `]`, at another `]`.\n   *\n   * ```markdown\n   * > | a <![CDATA[>&<]]> b\n   *                    ^\n   * ```\n   *\n   * @type {State}\n   */\n  function cdataClose(code) {\n    if (code === 93) {\n      effects.consume(code);\n      return cdataEnd;\n    }\n    return cdata(code);\n  }\n\n  /**\n   * In CDATA, after `]]`, at `>`.\n   *\n   * ```markdown\n   * > | a <![CDATA[>&<]]> b\n   *                     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function cdataEnd(code) {\n    if (code === 62) {\n      return end(code);\n    }\n    if (code === 93) {\n      effects.consume(code);\n      return cdataEnd;\n    }\n    return cdata(code);\n  }\n\n  /**\n   * In declaration.\n   *\n   * ```markdown\n   * > | a <!b> c\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function declaration(code) {\n    if (code === null || code === 62) {\n      return end(code);\n    }\n    if (markdownLineEnding(code)) {\n      returnState = declaration;\n      return lineEndingBefore(code);\n    }\n    effects.consume(code);\n    return declaration;\n  }\n\n  /**\n   * In instruction.\n   *\n   * ```markdown\n   * > | a <?b?> c\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function instruction(code) {\n    if (code === null) {\n      return nok(code);\n    }\n    if (code === 63) {\n      effects.consume(code);\n      return instructionClose;\n    }\n    if (markdownLineEnding(code)) {\n      returnState = instruction;\n      return lineEndingBefore(code);\n    }\n    effects.consume(code);\n    return instruction;\n  }\n\n  /**\n   * In instruction, after `?`, at `>`.\n   *\n   * ```markdown\n   * > | a <?b?> c\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function instructionClose(code) {\n    return code === 62 ? end(code) : instruction(code);\n  }\n\n  /**\n   * After `</`, in closing tag, at tag name.\n   *\n   * ```markdown\n   * > | a </b> c\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagCloseStart(code) {\n    // ASCII alphabetical.\n    if (asciiAlpha(code)) {\n      effects.consume(code);\n      return tagClose;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After `</x`, in a tag name.\n   *\n   * ```markdown\n   * > | a </b> c\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagClose(code) {\n    // ASCII alphanumerical and `-`.\n    if (code === 45 || asciiAlphanumeric(code)) {\n      effects.consume(code);\n      return tagClose;\n    }\n    return tagCloseBetween(code);\n  }\n\n  /**\n   * In closing tag, after tag name.\n   *\n   * ```markdown\n   * > | a </b> c\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagCloseBetween(code) {\n    if (markdownLineEnding(code)) {\n      returnState = tagCloseBetween;\n      return lineEndingBefore(code);\n    }\n    if (markdownSpace(code)) {\n      effects.consume(code);\n      return tagCloseBetween;\n    }\n    return end(code);\n  }\n\n  /**\n   * After `<x`, in opening tag name.\n   *\n   * ```markdown\n   * > | a <b> c\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagOpen(code) {\n    // ASCII alphanumerical and `-`.\n    if (code === 45 || asciiAlphanumeric(code)) {\n      effects.consume(code);\n      return tagOpen;\n    }\n    if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {\n      return tagOpenBetween(code);\n    }\n    return nok(code);\n  }\n\n  /**\n   * In opening tag, after tag name.\n   *\n   * ```markdown\n   * > | a <b> c\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagOpenBetween(code) {\n    if (code === 47) {\n      effects.consume(code);\n      return end;\n    }\n\n    // ASCII alphabetical and `:` and `_`.\n    if (code === 58 || code === 95 || asciiAlpha(code)) {\n      effects.consume(code);\n      return tagOpenAttributeName;\n    }\n    if (markdownLineEnding(code)) {\n      returnState = tagOpenBetween;\n      return lineEndingBefore(code);\n    }\n    if (markdownSpace(code)) {\n      effects.consume(code);\n      return tagOpenBetween;\n    }\n    return end(code);\n  }\n\n  /**\n   * In attribute name.\n   *\n   * ```markdown\n   * > | a <b c> d\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagOpenAttributeName(code) {\n    // ASCII alphabetical and `-`, `.`, `:`, and `_`.\n    if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) {\n      effects.consume(code);\n      return tagOpenAttributeName;\n    }\n    return tagOpenAttributeNameAfter(code);\n  }\n\n  /**\n   * After attribute name, before initializer, the end of the tag, or\n   * whitespace.\n   *\n   * ```markdown\n   * > | a <b c> d\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagOpenAttributeNameAfter(code) {\n    if (code === 61) {\n      effects.consume(code);\n      return tagOpenAttributeValueBefore;\n    }\n    if (markdownLineEnding(code)) {\n      returnState = tagOpenAttributeNameAfter;\n      return lineEndingBefore(code);\n    }\n    if (markdownSpace(code)) {\n      effects.consume(code);\n      return tagOpenAttributeNameAfter;\n    }\n    return tagOpenBetween(code);\n  }\n\n  /**\n   * Before unquoted, double quoted, or single quoted attribute value, allowing\n   * whitespace.\n   *\n   * ```markdown\n   * > | a <b c=d> e\n   *            ^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagOpenAttributeValueBefore(code) {\n    if (code === null || code === 60 || code === 61 || code === 62 || code === 96) {\n      return nok(code);\n    }\n    if (code === 34 || code === 39) {\n      effects.consume(code);\n      marker = code;\n      return tagOpenAttributeValueQuoted;\n    }\n    if (markdownLineEnding(code)) {\n      returnState = tagOpenAttributeValueBefore;\n      return lineEndingBefore(code);\n    }\n    if (markdownSpace(code)) {\n      effects.consume(code);\n      return tagOpenAttributeValueBefore;\n    }\n    effects.consume(code);\n    return tagOpenAttributeValueUnquoted;\n  }\n\n  /**\n   * In double or single quoted attribute value.\n   *\n   * ```markdown\n   * > | a <b c=\"d\"> e\n   *             ^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagOpenAttributeValueQuoted(code) {\n    if (code === marker) {\n      effects.consume(code);\n      marker = undefined;\n      return tagOpenAttributeValueQuotedAfter;\n    }\n    if (code === null) {\n      return nok(code);\n    }\n    if (markdownLineEnding(code)) {\n      returnState = tagOpenAttributeValueQuoted;\n      return lineEndingBefore(code);\n    }\n    effects.consume(code);\n    return tagOpenAttributeValueQuoted;\n  }\n\n  /**\n   * In unquoted attribute value.\n   *\n   * ```markdown\n   * > | a <b c=d> e\n   *            ^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagOpenAttributeValueUnquoted(code) {\n    if (code === null || code === 34 || code === 39 || code === 60 || code === 61 || code === 96) {\n      return nok(code);\n    }\n    if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {\n      return tagOpenBetween(code);\n    }\n    effects.consume(code);\n    return tagOpenAttributeValueUnquoted;\n  }\n\n  /**\n   * After double or single quoted attribute value, before whitespace or the end\n   * of the tag.\n   *\n   * ```markdown\n   * > | a <b c=\"d\"> e\n   *               ^\n   * ```\n   *\n   * @type {State}\n   */\n  function tagOpenAttributeValueQuotedAfter(code) {\n    if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {\n      return tagOpenBetween(code);\n    }\n    return nok(code);\n  }\n\n  /**\n   * In certain circumstances of a tag where only an `>` is allowed.\n   *\n   * ```markdown\n   * > | a <b c=\"d\"> e\n   *               ^\n   * ```\n   *\n   * @type {State}\n   */\n  function end(code) {\n    if (code === 62) {\n      effects.consume(code);\n      effects.exit(\"htmlTextData\");\n      effects.exit(\"htmlText\");\n      return ok;\n    }\n    return nok(code);\n  }\n\n  /**\n   * At eol.\n   *\n   * > \uD83D\uDC49 **Note**: we can\u2019t have blank lines in text, so no need to worry about\n   * > empty tokens.\n   *\n   * ```markdown\n   * > | a <!--a\n   *            ^\n   *   | b-->\n   * ```\n   *\n   * @type {State}\n   */\n  function lineEndingBefore(code) {\n    effects.exit(\"htmlTextData\");\n    effects.enter(\"lineEnding\");\n    effects.consume(code);\n    effects.exit(\"lineEnding\");\n    return lineEndingAfter;\n  }\n\n  /**\n   * After eol, at optional whitespace.\n   *\n   * > \uD83D\uDC49 **Note**: we can\u2019t have blank lines in text, so no need to worry about\n   * > empty tokens.\n   *\n   * ```markdown\n   *   | a <!--a\n   * > | b-->\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function lineEndingAfter(code) {\n    // Always populated by defaults.\n\n    return markdownSpace(code) ? factorySpace(effects, lineEndingAfterPrefix, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code) : lineEndingAfterPrefix(code);\n  }\n\n  /**\n   * After eol, after optional whitespace.\n   *\n   * > \uD83D\uDC49 **Note**: we can\u2019t have blank lines in text, so no need to worry about\n   * > empty tokens.\n   *\n   * ```markdown\n   *   | a <!--a\n   * > | b-->\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function lineEndingAfterPrefix(code) {\n    effects.enter(\"htmlTextData\");\n    return returnState(code);\n  }\n}", "/**\n * @import {\n *   Construct,\n *   Event,\n *   Resolver,\n *   State,\n *   TokenizeContext,\n *   Tokenizer,\n *   Token\n * } from 'micromark-util-types'\n */\n\nimport { factoryDestination } from 'micromark-factory-destination';\nimport { factoryLabel } from 'micromark-factory-label';\nimport { factoryTitle } from 'micromark-factory-title';\nimport { factoryWhitespace } from 'micromark-factory-whitespace';\nimport { markdownLineEndingOrSpace } from 'micromark-util-character';\nimport { push, splice } from 'micromark-util-chunked';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/** @type {Construct} */\nexport const labelEnd = {\n  name: 'labelEnd',\n  resolveAll: resolveAllLabelEnd,\n  resolveTo: resolveToLabelEnd,\n  tokenize: tokenizeLabelEnd\n};\n\n/** @type {Construct} */\nconst resourceConstruct = {\n  tokenize: tokenizeResource\n};\n/** @type {Construct} */\nconst referenceFullConstruct = {\n  tokenize: tokenizeReferenceFull\n};\n/** @type {Construct} */\nconst referenceCollapsedConstruct = {\n  tokenize: tokenizeReferenceCollapsed\n};\n\n/** @type {Resolver} */\nfunction resolveAllLabelEnd(events) {\n  let index = -1;\n  /** @type {Array<Event>} */\n  const newEvents = [];\n  while (++index < events.length) {\n    const token = events[index][1];\n    newEvents.push(events[index]);\n    if (token.type === \"labelImage\" || token.type === \"labelLink\" || token.type === \"labelEnd\") {\n      // Remove the marker.\n      const offset = token.type === \"labelImage\" ? 4 : 2;\n      token.type = \"data\";\n      index += offset;\n    }\n  }\n\n  // If the events are equal, we don't have to copy newEvents to events\n  if (events.length !== newEvents.length) {\n    splice(events, 0, events.length, newEvents);\n  }\n  return events;\n}\n\n/** @type {Resolver} */\nfunction resolveToLabelEnd(events, context) {\n  let index = events.length;\n  let offset = 0;\n  /** @type {Token} */\n  let token;\n  /** @type {number | undefined} */\n  let open;\n  /** @type {number | undefined} */\n  let close;\n  /** @type {Array<Event>} */\n  let media;\n\n  // Find an opening.\n  while (index--) {\n    token = events[index][1];\n    if (open) {\n      // If we see another link, or inactive link label, we\u2019ve been here before.\n      if (token.type === \"link\" || token.type === \"labelLink\" && token._inactive) {\n        break;\n      }\n\n      // Mark other link openings as inactive, as we can\u2019t have links in\n      // links.\n      if (events[index][0] === 'enter' && token.type === \"labelLink\") {\n        token._inactive = true;\n      }\n    } else if (close) {\n      if (events[index][0] === 'enter' && (token.type === \"labelImage\" || token.type === \"labelLink\") && !token._balanced) {\n        open = index;\n        if (token.type !== \"labelLink\") {\n          offset = 2;\n          break;\n        }\n      }\n    } else if (token.type === \"labelEnd\") {\n      close = index;\n    }\n  }\n  const group = {\n    type: events[open][1].type === \"labelLink\" ? \"link\" : \"image\",\n    start: {\n      ...events[open][1].start\n    },\n    end: {\n      ...events[events.length - 1][1].end\n    }\n  };\n  const label = {\n    type: \"label\",\n    start: {\n      ...events[open][1].start\n    },\n    end: {\n      ...events[close][1].end\n    }\n  };\n  const text = {\n    type: \"labelText\",\n    start: {\n      ...events[open + offset + 2][1].end\n    },\n    end: {\n      ...events[close - 2][1].start\n    }\n  };\n  media = [['enter', group, context], ['enter', label, context]];\n\n  // Opening marker.\n  media = push(media, events.slice(open + 1, open + offset + 3));\n\n  // Text open.\n  media = push(media, [['enter', text, context]]);\n\n  // Always populated by defaults.\n\n  // Between.\n  media = push(media, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + offset + 4, close - 3), context));\n\n  // Text close, marker close, label close.\n  media = push(media, [['exit', text, context], events[close - 2], events[close - 1], ['exit', label, context]]);\n\n  // Reference, resource, or so.\n  media = push(media, events.slice(close + 1));\n\n  // Media close.\n  media = push(media, [['exit', group, context]]);\n  splice(events, open, events.length, media);\n  return events;\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeLabelEnd(effects, ok, nok) {\n  const self = this;\n  let index = self.events.length;\n  /** @type {Token} */\n  let labelStart;\n  /** @type {boolean} */\n  let defined;\n\n  // Find an opening.\n  while (index--) {\n    if ((self.events[index][1].type === \"labelImage\" || self.events[index][1].type === \"labelLink\") && !self.events[index][1]._balanced) {\n      labelStart = self.events[index][1];\n      break;\n    }\n  }\n  return start;\n\n  /**\n   * Start of label end.\n   *\n   * ```markdown\n   * > | [a](b) c\n   *       ^\n   * > | [a][b] c\n   *       ^\n   * > | [a][] b\n   *       ^\n   * > | [a] b\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    // If there is not an okay opening.\n    if (!labelStart) {\n      return nok(code);\n    }\n\n    // If the corresponding label (link) start is marked as inactive,\n    // it means we\u2019d be wrapping a link, like this:\n    //\n    // ```markdown\n    // > | a [b [c](d) e](f) g.\n    //                  ^\n    // ```\n    //\n    // We can\u2019t have that, so it\u2019s just balanced brackets.\n    if (labelStart._inactive) {\n      return labelEndNok(code);\n    }\n    defined = self.parser.defined.includes(normalizeIdentifier(self.sliceSerialize({\n      start: labelStart.end,\n      end: self.now()\n    })));\n    effects.enter(\"labelEnd\");\n    effects.enter(\"labelMarker\");\n    effects.consume(code);\n    effects.exit(\"labelMarker\");\n    effects.exit(\"labelEnd\");\n    return after;\n  }\n\n  /**\n   * After `]`.\n   *\n   * ```markdown\n   * > | [a](b) c\n   *       ^\n   * > | [a][b] c\n   *       ^\n   * > | [a][] b\n   *       ^\n   * > | [a] b\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    // Note: `markdown-rs` also parses GFM footnotes here, which for us is in\n    // an extension.\n\n    // Resource (`[asd](fgh)`)?\n    if (code === 40) {\n      return effects.attempt(resourceConstruct, labelEndOk, defined ? labelEndOk : labelEndNok)(code);\n    }\n\n    // Full (`[asd][fgh]`) or collapsed (`[asd][]`) reference?\n    if (code === 91) {\n      return effects.attempt(referenceFullConstruct, labelEndOk, defined ? referenceNotFull : labelEndNok)(code);\n    }\n\n    // Shortcut (`[asd]`) reference?\n    return defined ? labelEndOk(code) : labelEndNok(code);\n  }\n\n  /**\n   * After `]`, at `[`, but not at a full reference.\n   *\n   * > \uD83D\uDC49 **Note**: we only get here if the label is defined.\n   *\n   * ```markdown\n   * > | [a][] b\n   *        ^\n   * > | [a] b\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function referenceNotFull(code) {\n    return effects.attempt(referenceCollapsedConstruct, labelEndOk, labelEndNok)(code);\n  }\n\n  /**\n   * Done, we found something.\n   *\n   * ```markdown\n   * > | [a](b) c\n   *           ^\n   * > | [a][b] c\n   *           ^\n   * > | [a][] b\n   *          ^\n   * > | [a] b\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelEndOk(code) {\n    // Note: `markdown-rs` does a bunch of stuff here.\n    return ok(code);\n  }\n\n  /**\n   * Done, it\u2019s nothing.\n   *\n   * There was an okay opening, but we didn\u2019t match anything.\n   *\n   * ```markdown\n   * > | [a](b c\n   *        ^\n   * > | [a][b c\n   *        ^\n   * > | [a] b\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelEndNok(code) {\n    labelStart._balanced = true;\n    return nok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeResource(effects, ok, nok) {\n  return resourceStart;\n\n  /**\n   * At a resource.\n   *\n   * ```markdown\n   * > | [a](b) c\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function resourceStart(code) {\n    effects.enter(\"resource\");\n    effects.enter(\"resourceMarker\");\n    effects.consume(code);\n    effects.exit(\"resourceMarker\");\n    return resourceBefore;\n  }\n\n  /**\n   * In resource, after `(`, at optional whitespace.\n   *\n   * ```markdown\n   * > | [a](b) c\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function resourceBefore(code) {\n    return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, resourceOpen)(code) : resourceOpen(code);\n  }\n\n  /**\n   * In resource, after optional whitespace, at `)` or a destination.\n   *\n   * ```markdown\n   * > | [a](b) c\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function resourceOpen(code) {\n    if (code === 41) {\n      return resourceEnd(code);\n    }\n    return factoryDestination(effects, resourceDestinationAfter, resourceDestinationMissing, \"resourceDestination\", \"resourceDestinationLiteral\", \"resourceDestinationLiteralMarker\", \"resourceDestinationRaw\", \"resourceDestinationString\", 32)(code);\n  }\n\n  /**\n   * In resource, after destination, at optional whitespace.\n   *\n   * ```markdown\n   * > | [a](b) c\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function resourceDestinationAfter(code) {\n    return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, resourceBetween)(code) : resourceEnd(code);\n  }\n\n  /**\n   * At invalid destination.\n   *\n   * ```markdown\n   * > | [a](<<) b\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function resourceDestinationMissing(code) {\n    return nok(code);\n  }\n\n  /**\n   * In resource, after destination and whitespace, at `(` or title.\n   *\n   * ```markdown\n   * > | [a](b ) c\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function resourceBetween(code) {\n    if (code === 34 || code === 39 || code === 40) {\n      return factoryTitle(effects, resourceTitleAfter, nok, \"resourceTitle\", \"resourceTitleMarker\", \"resourceTitleString\")(code);\n    }\n    return resourceEnd(code);\n  }\n\n  /**\n   * In resource, after title, at optional whitespace.\n   *\n   * ```markdown\n   * > | [a](b \"c\") d\n   *              ^\n   * ```\n   *\n   * @type {State}\n   */\n  function resourceTitleAfter(code) {\n    return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, resourceEnd)(code) : resourceEnd(code);\n  }\n\n  /**\n   * In resource, at `)`.\n   *\n   * ```markdown\n   * > | [a](b) d\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function resourceEnd(code) {\n    if (code === 41) {\n      effects.enter(\"resourceMarker\");\n      effects.consume(code);\n      effects.exit(\"resourceMarker\");\n      effects.exit(\"resource\");\n      return ok;\n    }\n    return nok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeReferenceFull(effects, ok, nok) {\n  const self = this;\n  return referenceFull;\n\n  /**\n   * In a reference (full), at the `[`.\n   *\n   * ```markdown\n   * > | [a][b] d\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function referenceFull(code) {\n    return factoryLabel.call(self, effects, referenceFullAfter, referenceFullMissing, \"reference\", \"referenceMarker\", \"referenceString\")(code);\n  }\n\n  /**\n   * In a reference (full), after `]`.\n   *\n   * ```markdown\n   * > | [a][b] d\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function referenceFullAfter(code) {\n    return self.parser.defined.includes(normalizeIdentifier(self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1))) ? ok(code) : nok(code);\n  }\n\n  /**\n   * In reference (full) that was missing.\n   *\n   * ```markdown\n   * > | [a][b d\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function referenceFullMissing(code) {\n    return nok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeReferenceCollapsed(effects, ok, nok) {\n  return referenceCollapsedStart;\n\n  /**\n   * In reference (collapsed), at `[`.\n   *\n   * > \uD83D\uDC49 **Note**: we only get here if the label is defined.\n   *\n   * ```markdown\n   * > | [a][] d\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function referenceCollapsedStart(code) {\n    // We only attempt a collapsed label if there\u2019s a `[`.\n\n    effects.enter(\"reference\");\n    effects.enter(\"referenceMarker\");\n    effects.consume(code);\n    effects.exit(\"referenceMarker\");\n    return referenceCollapsedOpen;\n  }\n\n  /**\n   * In reference (collapsed), at `]`.\n   *\n   * > \uD83D\uDC49 **Note**: we only get here if the label is defined.\n   *\n   * ```markdown\n   * > | [a][] d\n   *         ^\n   * ```\n   *\n   *  @type {State}\n   */\n  function referenceCollapsedOpen(code) {\n    if (code === 93) {\n      effects.enter(\"referenceMarker\");\n      effects.consume(code);\n      effects.exit(\"referenceMarker\");\n      effects.exit(\"reference\");\n      return ok;\n    }\n    return nok(code);\n  }\n}", "/**\n * @import {\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { labelEnd } from './label-end.js';\n\n/** @type {Construct} */\nexport const labelStartImage = {\n  name: 'labelStartImage',\n  resolveAll: labelEnd.resolveAll,\n  tokenize: tokenizeLabelStartImage\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeLabelStartImage(effects, ok, nok) {\n  const self = this;\n  return start;\n\n  /**\n   * Start of label (image) start.\n   *\n   * ```markdown\n   * > | a ![b] c\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter(\"labelImage\");\n    effects.enter(\"labelImageMarker\");\n    effects.consume(code);\n    effects.exit(\"labelImageMarker\");\n    return open;\n  }\n\n  /**\n   * After `!`, at `[`.\n   *\n   * ```markdown\n   * > | a ![b] c\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function open(code) {\n    if (code === 91) {\n      effects.enter(\"labelMarker\");\n      effects.consume(code);\n      effects.exit(\"labelMarker\");\n      effects.exit(\"labelImage\");\n      return after;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After `![`.\n   *\n   * ```markdown\n   * > | a ![b] c\n   *         ^\n   * ```\n   *\n   * This is needed in because, when GFM footnotes are enabled, images never\n   * form when started with a `^`.\n   * Instead, links form:\n   *\n   * ```markdown\n   * ![^a](b)\n   *\n   * ![^a][b]\n   *\n   * [b]: c\n   * ```\n   *\n   * ```html\n   * <p>!<a href=\\\"b\\\">^a</a></p>\n   * <p>!<a href=\\\"c\\\">^a</a></p>\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    // To do: use a new field to do this, this is still needed for\n    // `micromark-extension-gfm-footnote`, but the `label-start-link`\n    // behavior isn\u2019t.\n    // Hidden footnotes hook.\n    /* c8 ignore next 3 */\n    return code === 94 && '_hiddenFootnoteSupport' in self.parser.constructs ? nok(code) : ok(code);\n  }\n}", "/**\n * @import {\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { labelEnd } from './label-end.js';\n\n/** @type {Construct} */\nexport const labelStartLink = {\n  name: 'labelStartLink',\n  resolveAll: labelEnd.resolveAll,\n  tokenize: tokenizeLabelStartLink\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeLabelStartLink(effects, ok, nok) {\n  const self = this;\n  return start;\n\n  /**\n   * Start of label (link) start.\n   *\n   * ```markdown\n   * > | a [b] c\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter(\"labelLink\");\n    effects.enter(\"labelMarker\");\n    effects.consume(code);\n    effects.exit(\"labelMarker\");\n    effects.exit(\"labelLink\");\n    return after;\n  }\n\n  /** @type {State} */\n  function after(code) {\n    // To do: this isn\u2019t needed in `micromark-extension-gfm-footnote`,\n    // remove.\n    // Hidden footnotes hook.\n    /* c8 ignore next 3 */\n    return code === 94 && '_hiddenFootnoteSupport' in self.parser.constructs ? nok(code) : ok(code);\n  }\n}", "/**\n * @import {\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding } from 'micromark-util-character';\n/** @type {Construct} */\nexport const lineEnding = {\n  name: 'lineEnding',\n  tokenize: tokenizeLineEnding\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeLineEnding(effects, ok) {\n  return start;\n\n  /** @type {State} */\n  function start(code) {\n    effects.enter(\"lineEnding\");\n    effects.consume(code);\n    effects.exit(\"lineEnding\");\n    return factorySpace(effects, ok, \"linePrefix\");\n  }\n}", "/**\n * @import {\n *   Code,\n *   Construct,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const thematicBreak = {\n  name: 'thematicBreak',\n  tokenize: tokenizeThematicBreak\n};\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeThematicBreak(effects, ok, nok) {\n  let size = 0;\n  /** @type {NonNullable<Code>} */\n  let marker;\n  return start;\n\n  /**\n   * Start of thematic break.\n   *\n   * ```markdown\n   * > | ***\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter(\"thematicBreak\");\n    // To do: parse indent like `markdown-rs`.\n    return before(code);\n  }\n\n  /**\n   * After optional whitespace, at marker.\n   *\n   * ```markdown\n   * > | ***\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function before(code) {\n    marker = code;\n    return atBreak(code);\n  }\n\n  /**\n   * After something, before something else.\n   *\n   * ```markdown\n   * > | ***\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function atBreak(code) {\n    if (code === marker) {\n      effects.enter(\"thematicBreakSequence\");\n      return sequence(code);\n    }\n    if (size >= 3 && (code === null || markdownLineEnding(code))) {\n      effects.exit(\"thematicBreak\");\n      return ok(code);\n    }\n    return nok(code);\n  }\n\n  /**\n   * In sequence.\n   *\n   * ```markdown\n   * > | ***\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function sequence(code) {\n    if (code === marker) {\n      effects.consume(code);\n      size++;\n      return sequence;\n    }\n    effects.exit(\"thematicBreakSequence\");\n    return markdownSpace(code) ? factorySpace(effects, atBreak, \"whitespace\")(code) : atBreak(code);\n  }\n}", "/**\n * @import {\n *   Code,\n *   Construct,\n *   Exiter,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { asciiDigit, markdownSpace } from 'micromark-util-character';\nimport { blankLine } from './blank-line.js';\nimport { thematicBreak } from './thematic-break.js';\n\n/** @type {Construct} */\nexport const list = {\n  continuation: {\n    tokenize: tokenizeListContinuation\n  },\n  exit: tokenizeListEnd,\n  name: 'list',\n  tokenize: tokenizeListStart\n};\n\n/** @type {Construct} */\nconst listItemPrefixWhitespaceConstruct = {\n  partial: true,\n  tokenize: tokenizeListItemPrefixWhitespace\n};\n\n/** @type {Construct} */\nconst indentConstruct = {\n  partial: true,\n  tokenize: tokenizeIndent\n};\n\n// To do: `markdown-rs` parses list items on their own and later stitches them\n// together.\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeListStart(effects, ok, nok) {\n  const self = this;\n  const tail = self.events[self.events.length - 1];\n  let initialSize = tail && tail[1].type === \"linePrefix\" ? tail[2].sliceSerialize(tail[1], true).length : 0;\n  let size = 0;\n  return start;\n\n  /** @type {State} */\n  function start(code) {\n    const kind = self.containerState.type || (code === 42 || code === 43 || code === 45 ? \"listUnordered\" : \"listOrdered\");\n    if (kind === \"listUnordered\" ? !self.containerState.marker || code === self.containerState.marker : asciiDigit(code)) {\n      if (!self.containerState.type) {\n        self.containerState.type = kind;\n        effects.enter(kind, {\n          _container: true\n        });\n      }\n      if (kind === \"listUnordered\") {\n        effects.enter(\"listItemPrefix\");\n        return code === 42 || code === 45 ? effects.check(thematicBreak, nok, atMarker)(code) : atMarker(code);\n      }\n      if (!self.interrupt || code === 49) {\n        effects.enter(\"listItemPrefix\");\n        effects.enter(\"listItemValue\");\n        return inside(code);\n      }\n    }\n    return nok(code);\n  }\n\n  /** @type {State} */\n  function inside(code) {\n    if (asciiDigit(code) && ++size < 10) {\n      effects.consume(code);\n      return inside;\n    }\n    if ((!self.interrupt || size < 2) && (self.containerState.marker ? code === self.containerState.marker : code === 41 || code === 46)) {\n      effects.exit(\"listItemValue\");\n      return atMarker(code);\n    }\n    return nok(code);\n  }\n\n  /**\n   * @type {State}\n   **/\n  function atMarker(code) {\n    effects.enter(\"listItemMarker\");\n    effects.consume(code);\n    effects.exit(\"listItemMarker\");\n    self.containerState.marker = self.containerState.marker || code;\n    return effects.check(blankLine,\n    // Can\u2019t be empty when interrupting.\n    self.interrupt ? nok : onBlank, effects.attempt(listItemPrefixWhitespaceConstruct, endOfPrefix, otherPrefix));\n  }\n\n  /** @type {State} */\n  function onBlank(code) {\n    self.containerState.initialBlankLine = true;\n    initialSize++;\n    return endOfPrefix(code);\n  }\n\n  /** @type {State} */\n  function otherPrefix(code) {\n    if (markdownSpace(code)) {\n      effects.enter(\"listItemPrefixWhitespace\");\n      effects.consume(code);\n      effects.exit(\"listItemPrefixWhitespace\");\n      return endOfPrefix;\n    }\n    return nok(code);\n  }\n\n  /** @type {State} */\n  function endOfPrefix(code) {\n    self.containerState.size = initialSize + self.sliceSerialize(effects.exit(\"listItemPrefix\"), true).length;\n    return ok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeListContinuation(effects, ok, nok) {\n  const self = this;\n  self.containerState._closeFlow = undefined;\n  return effects.check(blankLine, onBlank, notBlank);\n\n  /** @type {State} */\n  function onBlank(code) {\n    self.containerState.furtherBlankLines = self.containerState.furtherBlankLines || self.containerState.initialBlankLine;\n\n    // We have a blank line.\n    // Still, try to consume at most the items size.\n    return factorySpace(effects, ok, \"listItemIndent\", self.containerState.size + 1)(code);\n  }\n\n  /** @type {State} */\n  function notBlank(code) {\n    if (self.containerState.furtherBlankLines || !markdownSpace(code)) {\n      self.containerState.furtherBlankLines = undefined;\n      self.containerState.initialBlankLine = undefined;\n      return notInCurrentItem(code);\n    }\n    self.containerState.furtherBlankLines = undefined;\n    self.containerState.initialBlankLine = undefined;\n    return effects.attempt(indentConstruct, ok, notInCurrentItem)(code);\n  }\n\n  /** @type {State} */\n  function notInCurrentItem(code) {\n    // While we do continue, we signal that the flow should be closed.\n    self.containerState._closeFlow = true;\n    // As we\u2019re closing flow, we\u2019re no longer interrupting.\n    self.interrupt = undefined;\n    // Always populated by defaults.\n\n    return factorySpace(effects, effects.attempt(list, ok, nok), \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeIndent(effects, ok, nok) {\n  const self = this;\n  return factorySpace(effects, afterPrefix, \"listItemIndent\", self.containerState.size + 1);\n\n  /** @type {State} */\n  function afterPrefix(code) {\n    const tail = self.events[self.events.length - 1];\n    return tail && tail[1].type === \"listItemIndent\" && tail[2].sliceSerialize(tail[1], true).length === self.containerState.size ? ok(code) : nok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Exiter}\n */\nfunction tokenizeListEnd(effects) {\n  effects.exit(this.containerState.type);\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeListItemPrefixWhitespace(effects, ok, nok) {\n  const self = this;\n\n  // Always populated by defaults.\n\n  return factorySpace(effects, afterPrefix, \"listItemPrefixWhitespace\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4 + 1);\n\n  /** @type {State} */\n  function afterPrefix(code) {\n    const tail = self.events[self.events.length - 1];\n    return !markdownSpace(code) && tail && tail[1].type === \"listItemPrefixWhitespace\" ? ok(code) : nok(code);\n  }\n}", "/**\n * @import {\n *   Code,\n *   Construct,\n *   Resolver,\n *   State,\n *   TokenizeContext,\n *   Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const setextUnderline = {\n  name: 'setextUnderline',\n  resolveTo: resolveToSetextUnderline,\n  tokenize: tokenizeSetextUnderline\n};\n\n/** @type {Resolver} */\nfunction resolveToSetextUnderline(events, context) {\n  // To do: resolve like `markdown-rs`.\n  let index = events.length;\n  /** @type {number | undefined} */\n  let content;\n  /** @type {number | undefined} */\n  let text;\n  /** @type {number | undefined} */\n  let definition;\n\n  // Find the opening of the content.\n  // It\u2019ll always exist: we don\u2019t tokenize if it isn\u2019t there.\n  while (index--) {\n    if (events[index][0] === 'enter') {\n      if (events[index][1].type === \"content\") {\n        content = index;\n        break;\n      }\n      if (events[index][1].type === \"paragraph\") {\n        text = index;\n      }\n    }\n    // Exit\n    else {\n      if (events[index][1].type === \"content\") {\n        // Remove the content end (if needed we\u2019ll add it later)\n        events.splice(index, 1);\n      }\n      if (!definition && events[index][1].type === \"definition\") {\n        definition = index;\n      }\n    }\n  }\n  const heading = {\n    type: \"setextHeading\",\n    start: {\n      ...events[text][1].start\n    },\n    end: {\n      ...events[events.length - 1][1].end\n    }\n  };\n\n  // Change the paragraph to setext heading text.\n  events[text][1].type = \"setextHeadingText\";\n\n  // If we have definitions in the content, we\u2019ll keep on having content,\n  // but we need move it.\n  if (definition) {\n    events.splice(text, 0, ['enter', heading, context]);\n    events.splice(definition + 1, 0, ['exit', events[content][1], context]);\n    events[content][1].end = {\n      ...events[definition][1].end\n    };\n  } else {\n    events[content][1] = heading;\n  }\n\n  // Add the heading exit at the end.\n  events.push(['exit', heading, context]);\n  return events;\n}\n\n/**\n * @this {TokenizeContext}\n *   Context.\n * @type {Tokenizer}\n */\nfunction tokenizeSetextUnderline(effects, ok, nok) {\n  const self = this;\n  /** @type {NonNullable<Code>} */\n  let marker;\n  return start;\n\n  /**\n   * At start of heading (setext) underline.\n   *\n   * ```markdown\n   *   | aa\n   * > | ==\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    let index = self.events.length;\n    /** @type {boolean | undefined} */\n    let paragraph;\n    // Find an opening.\n    while (index--) {\n      // Skip enter/exit of line ending, line prefix, and content.\n      // We can now either have a definition or a paragraph.\n      if (self.events[index][1].type !== \"lineEnding\" && self.events[index][1].type !== \"linePrefix\" && self.events[index][1].type !== \"content\") {\n        paragraph = self.events[index][1].type === \"paragraph\";\n        break;\n      }\n    }\n\n    // To do: handle lazy/pierce like `markdown-rs`.\n    // To do: parse indent like `markdown-rs`.\n    if (!self.parser.lazy[self.now().line] && (self.interrupt || paragraph)) {\n      effects.enter(\"setextHeadingLine\");\n      marker = code;\n      return before(code);\n    }\n    return nok(code);\n  }\n\n  /**\n   * After optional whitespace, at `-` or `=`.\n   *\n   * ```markdown\n   *   | aa\n   * > | ==\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function before(code) {\n    effects.enter(\"setextHeadingLineSequence\");\n    return inside(code);\n  }\n\n  /**\n   * In sequence.\n   *\n   * ```markdown\n   *   | aa\n   * > | ==\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function inside(code) {\n    if (code === marker) {\n      effects.consume(code);\n      return inside;\n    }\n    effects.exit(\"setextHeadingLineSequence\");\n    return markdownSpace(code) ? factorySpace(effects, after, \"lineSuffix\")(code) : after(code);\n  }\n\n  /**\n   * After sequence, after optional whitespace.\n   *\n   * ```markdown\n   *   | aa\n   * > | ==\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    if (code === null || markdownLineEnding(code)) {\n      effects.exit(\"setextHeadingLine\");\n      return ok(code);\n    }\n    return nok(code);\n  }\n}", "/**\n * @import {\n *   InitialConstruct,\n *   Initializer,\n *   State,\n *   TokenizeContext\n * } from 'micromark-util-types'\n */\n\nimport { blankLine, content } from 'micromark-core-commonmark';\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding } from 'micromark-util-character';\n/** @type {InitialConstruct} */\nexport const flow = {\n  tokenize: initializeFlow\n};\n\n/**\n * @this {TokenizeContext}\n *   Self.\n * @type {Initializer}\n *   Initializer.\n */\nfunction initializeFlow(effects) {\n  const self = this;\n  const initial = effects.attempt(\n  // Try to parse a blank line.\n  blankLine, atBlankEnding,\n  // Try to parse initial flow (essentially, only code).\n  effects.attempt(this.parser.constructs.flowInitial, afterConstruct, factorySpace(effects, effects.attempt(this.parser.constructs.flow, afterConstruct, effects.attempt(content, afterConstruct)), \"linePrefix\")));\n  return initial;\n\n  /** @type {State} */\n  function atBlankEnding(code) {\n    if (code === null) {\n      effects.consume(code);\n      return;\n    }\n    effects.enter(\"lineEndingBlank\");\n    effects.consume(code);\n    effects.exit(\"lineEndingBlank\");\n    self.currentConstruct = undefined;\n    return initial;\n  }\n\n  /** @type {State} */\n  function afterConstruct(code) {\n    if (code === null) {\n      effects.consume(code);\n      return;\n    }\n    effects.enter(\"lineEnding\");\n    effects.consume(code);\n    effects.exit(\"lineEnding\");\n    self.currentConstruct = undefined;\n    return initial;\n  }\n}", "/**\n * @import {\n *   Code,\n *   InitialConstruct,\n *   Initializer,\n *   Resolver,\n *   State,\n *   TokenizeContext\n * } from 'micromark-util-types'\n */\n\nexport const resolver = {\n  resolveAll: createResolver()\n};\nexport const string = initializeFactory('string');\nexport const text = initializeFactory('text');\n\n/**\n * @param {'string' | 'text'} field\n *   Field.\n * @returns {InitialConstruct}\n *   Construct.\n */\nfunction initializeFactory(field) {\n  return {\n    resolveAll: createResolver(field === 'text' ? resolveAllLineSuffixes : undefined),\n    tokenize: initializeText\n  };\n\n  /**\n   * @this {TokenizeContext}\n   *   Context.\n   * @type {Initializer}\n   */\n  function initializeText(effects) {\n    const self = this;\n    const constructs = this.parser.constructs[field];\n    const text = effects.attempt(constructs, start, notText);\n    return start;\n\n    /** @type {State} */\n    function start(code) {\n      return atBreak(code) ? text(code) : notText(code);\n    }\n\n    /** @type {State} */\n    function notText(code) {\n      if (code === null) {\n        effects.consume(code);\n        return;\n      }\n      effects.enter(\"data\");\n      effects.consume(code);\n      return data;\n    }\n\n    /** @type {State} */\n    function data(code) {\n      if (atBreak(code)) {\n        effects.exit(\"data\");\n        return text(code);\n      }\n\n      // Data.\n      effects.consume(code);\n      return data;\n    }\n\n    /**\n     * @param {Code} code\n     *   Code.\n     * @returns {boolean}\n     *   Whether the code is a break.\n     */\n    function atBreak(code) {\n      if (code === null) {\n        return true;\n      }\n      const list = constructs[code];\n      let index = -1;\n      if (list) {\n        // Always populated by defaults.\n\n        while (++index < list.length) {\n          const item = list[index];\n          if (!item.previous || item.previous.call(self, self.previous)) {\n            return true;\n          }\n        }\n      }\n      return false;\n    }\n  }\n}\n\n/**\n * @param {Resolver | undefined} [extraResolver]\n *   Resolver.\n * @returns {Resolver}\n *   Resolver.\n */\nfunction createResolver(extraResolver) {\n  return resolveAllText;\n\n  /** @type {Resolver} */\n  function resolveAllText(events, context) {\n    let index = -1;\n    /** @type {number | undefined} */\n    let enter;\n\n    // A rather boring computation (to merge adjacent `data` events) which\n    // improves mm performance by 29%.\n    while (++index <= events.length) {\n      if (enter === undefined) {\n        if (events[index] && events[index][1].type === \"data\") {\n          enter = index;\n          index++;\n        }\n      } else if (!events[index] || events[index][1].type !== \"data\") {\n        // Don\u2019t do anything if there is one data token.\n        if (index !== enter + 2) {\n          events[enter][1].end = events[index - 1][1].end;\n          events.splice(enter + 2, index - enter - 2);\n          index = enter + 2;\n        }\n        enter = undefined;\n      }\n    }\n    return extraResolver ? extraResolver(events, context) : events;\n  }\n}\n\n/**\n * A rather ugly set of instructions which again looks at chunks in the input\n * stream.\n * The reason to do this here is that it is *much* faster to parse in reverse.\n * And that we can\u2019t hook into `null` to split the line suffix before an EOF.\n * To do: figure out if we can make this into a clean utility, or even in core.\n * As it will be useful for GFMs literal autolink extension (and maybe even\n * tables?)\n *\n * @type {Resolver}\n */\nfunction resolveAllLineSuffixes(events, context) {\n  let eventIndex = 0; // Skip first.\n\n  while (++eventIndex <= events.length) {\n    if ((eventIndex === events.length || events[eventIndex][1].type === \"lineEnding\") && events[eventIndex - 1][1].type === \"data\") {\n      const data = events[eventIndex - 1][1];\n      const chunks = context.sliceStream(data);\n      let index = chunks.length;\n      let bufferIndex = -1;\n      let size = 0;\n      /** @type {boolean | undefined} */\n      let tabs;\n      while (index--) {\n        const chunk = chunks[index];\n        if (typeof chunk === 'string') {\n          bufferIndex = chunk.length;\n          while (chunk.charCodeAt(bufferIndex - 1) === 32) {\n            size++;\n            bufferIndex--;\n          }\n          if (bufferIndex) break;\n          bufferIndex = -1;\n        }\n        // Number\n        else if (chunk === -2) {\n          tabs = true;\n          size++;\n        } else if (chunk === -1) {\n          // Empty\n        } else {\n          // Replacement character, exit.\n          index++;\n          break;\n        }\n      }\n      if (size) {\n        const token = {\n          type: eventIndex === events.length || tabs || size < 2 ? \"lineSuffix\" : \"hardBreakTrailing\",\n          start: {\n            _bufferIndex: index ? bufferIndex : data.start._bufferIndex + bufferIndex,\n            _index: data.start._index + index,\n            line: data.end.line,\n            column: data.end.column - size,\n            offset: data.end.offset - size\n          },\n          end: {\n            ...data.end\n          }\n        };\n        data.end = {\n          ...token.start\n        };\n        if (data.start.offset === data.end.offset) {\n          Object.assign(data, token);\n        } else {\n          events.splice(eventIndex, 0, ['enter', token, context], ['exit', token, context]);\n          eventIndex += 2;\n        }\n      }\n      eventIndex++;\n    }\n  }\n  return events;\n}", "/**\n * @import {Extension} from 'micromark-util-types'\n */\n\nimport { attention, autolink, blockQuote, characterEscape, characterReference, codeFenced, codeIndented, codeText, definition, hardBreakEscape, headingAtx, htmlFlow, htmlText, labelEnd, labelStartImage, labelStartLink, lineEnding, list, setextUnderline, thematicBreak } from 'micromark-core-commonmark';\nimport { resolver as resolveText } from './initialize/text.js';\n\n/** @satisfies {Extension['document']} */\nexport const document = {\n  [42]: list,\n  [43]: list,\n  [45]: list,\n  [48]: list,\n  [49]: list,\n  [50]: list,\n  [51]: list,\n  [52]: list,\n  [53]: list,\n  [54]: list,\n  [55]: list,\n  [56]: list,\n  [57]: list,\n  [62]: blockQuote\n};\n\n/** @satisfies {Extension['contentInitial']} */\nexport const contentInitial = {\n  [91]: definition\n};\n\n/** @satisfies {Extension['flowInitial']} */\nexport const flowInitial = {\n  [-2]: codeIndented,\n  [-1]: codeIndented,\n  [32]: codeIndented\n};\n\n/** @satisfies {Extension['flow']} */\nexport const flow = {\n  [35]: headingAtx,\n  [42]: thematicBreak,\n  [45]: [setextUnderline, thematicBreak],\n  [60]: htmlFlow,\n  [61]: setextUnderline,\n  [95]: thematicBreak,\n  [96]: codeFenced,\n  [126]: codeFenced\n};\n\n/** @satisfies {Extension['string']} */\nexport const string = {\n  [38]: characterReference,\n  [92]: characterEscape\n};\n\n/** @satisfies {Extension['text']} */\nexport const text = {\n  [-5]: lineEnding,\n  [-4]: lineEnding,\n  [-3]: lineEnding,\n  [33]: labelStartImage,\n  [38]: characterReference,\n  [42]: attention,\n  [60]: [autolink, htmlText],\n  [91]: labelStartLink,\n  [92]: [hardBreakEscape, characterEscape],\n  [93]: labelEnd,\n  [95]: attention,\n  [96]: codeText\n};\n\n/** @satisfies {Extension['insideSpan']} */\nexport const insideSpan = {\n  null: [attention, resolveText]\n};\n\n/** @satisfies {Extension['attentionMarkers']} */\nexport const attentionMarkers = {\n  null: [42, 95]\n};\n\n/** @satisfies {Extension['disable']} */\nexport const disable = {\n  null: []\n};", "/**\n * @import {\n *   Chunk,\n *   Code,\n *   ConstructRecord,\n *   Construct,\n *   Effects,\n *   InitialConstruct,\n *   ParseContext,\n *   Point,\n *   State,\n *   TokenizeContext,\n *   Token\n * } from 'micromark-util-types'\n */\n\n/**\n * @callback Restore\n *   Restore the state.\n * @returns {undefined}\n *   Nothing.\n *\n * @typedef Info\n *   Info.\n * @property {Restore} restore\n *   Restore.\n * @property {number} from\n *   From.\n *\n * @callback ReturnHandle\n *   Handle a successful run.\n * @param {Construct} construct\n *   Construct.\n * @param {Info} info\n *   Info.\n * @returns {undefined}\n *   Nothing.\n */\n\nimport { markdownLineEnding } from 'micromark-util-character';\nimport { push, splice } from 'micromark-util-chunked';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/**\n * Create a tokenizer.\n * Tokenizers deal with one type of data (e.g., containers, flow, text).\n * The parser is the object dealing with it all.\n * `initialize` works like other constructs, except that only its `tokenize`\n * function is used, in which case it doesn\u2019t receive an `ok` or `nok`.\n * `from` can be given to set the point before the first character, although\n * when further lines are indented, they must be set with `defineSkip`.\n *\n * @param {ParseContext} parser\n *   Parser.\n * @param {InitialConstruct} initialize\n *   Construct.\n * @param {Omit<Point, '_bufferIndex' | '_index'> | undefined} [from]\n *   Point (optional).\n * @returns {TokenizeContext}\n *   Context.\n */\nexport function createTokenizer(parser, initialize, from) {\n  /** @type {Point} */\n  let point = {\n    _bufferIndex: -1,\n    _index: 0,\n    line: from && from.line || 1,\n    column: from && from.column || 1,\n    offset: from && from.offset || 0\n  };\n  /** @type {Record<string, number>} */\n  const columnStart = {};\n  /** @type {Array<Construct>} */\n  const resolveAllConstructs = [];\n  /** @type {Array<Chunk>} */\n  let chunks = [];\n  /** @type {Array<Token>} */\n  let stack = [];\n  /** @type {boolean | undefined} */\n  let consumed = true;\n\n  /**\n   * Tools used for tokenizing.\n   *\n   * @type {Effects}\n   */\n  const effects = {\n    attempt: constructFactory(onsuccessfulconstruct),\n    check: constructFactory(onsuccessfulcheck),\n    consume,\n    enter,\n    exit,\n    interrupt: constructFactory(onsuccessfulcheck, {\n      interrupt: true\n    })\n  };\n\n  /**\n   * State and tools for resolving and serializing.\n   *\n   * @type {TokenizeContext}\n   */\n  const context = {\n    code: null,\n    containerState: {},\n    defineSkip,\n    events: [],\n    now,\n    parser,\n    previous: null,\n    sliceSerialize,\n    sliceStream,\n    write\n  };\n\n  /**\n   * The state function.\n   *\n   * @type {State | undefined}\n   */\n  let state = initialize.tokenize.call(context, effects);\n\n  /**\n   * Track which character we expect to be consumed, to catch bugs.\n   *\n   * @type {Code}\n   */\n  let expectedCode;\n  if (initialize.resolveAll) {\n    resolveAllConstructs.push(initialize);\n  }\n  return context;\n\n  /** @type {TokenizeContext['write']} */\n  function write(slice) {\n    chunks = push(chunks, slice);\n    main();\n\n    // Exit if we\u2019re not done, resolve might change stuff.\n    if (chunks[chunks.length - 1] !== null) {\n      return [];\n    }\n    addResult(initialize, 0);\n\n    // Otherwise, resolve, and exit.\n    context.events = resolveAll(resolveAllConstructs, context.events, context);\n    return context.events;\n  }\n\n  //\n  // Tools.\n  //\n\n  /** @type {TokenizeContext['sliceSerialize']} */\n  function sliceSerialize(token, expandTabs) {\n    return serializeChunks(sliceStream(token), expandTabs);\n  }\n\n  /** @type {TokenizeContext['sliceStream']} */\n  function sliceStream(token) {\n    return sliceChunks(chunks, token);\n  }\n\n  /** @type {TokenizeContext['now']} */\n  function now() {\n    // This is a hot path, so we clone manually instead of `Object.assign({}, point)`\n    const {\n      _bufferIndex,\n      _index,\n      line,\n      column,\n      offset\n    } = point;\n    return {\n      _bufferIndex,\n      _index,\n      line,\n      column,\n      offset\n    };\n  }\n\n  /** @type {TokenizeContext['defineSkip']} */\n  function defineSkip(value) {\n    columnStart[value.line] = value.column;\n    accountForPotentialSkip();\n  }\n\n  //\n  // State management.\n  //\n\n  /**\n   * Main loop (note that `_index` and `_bufferIndex` in `point` are modified by\n   * `consume`).\n   * Here is where we walk through the chunks, which either include strings of\n   * several characters, or numerical character codes.\n   * The reason to do this in a loop instead of a call is so the stack can\n   * drain.\n   *\n   * @returns {undefined}\n   *   Nothing.\n   */\n  function main() {\n    /** @type {number} */\n    let chunkIndex;\n    while (point._index < chunks.length) {\n      const chunk = chunks[point._index];\n\n      // If we\u2019re in a buffer chunk, loop through it.\n      if (typeof chunk === 'string') {\n        chunkIndex = point._index;\n        if (point._bufferIndex < 0) {\n          point._bufferIndex = 0;\n        }\n        while (point._index === chunkIndex && point._bufferIndex < chunk.length) {\n          go(chunk.charCodeAt(point._bufferIndex));\n        }\n      } else {\n        go(chunk);\n      }\n    }\n  }\n\n  /**\n   * Deal with one code.\n   *\n   * @param {Code} code\n   *   Code.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  function go(code) {\n    consumed = undefined;\n    expectedCode = code;\n    state = state(code);\n  }\n\n  /** @type {Effects['consume']} */\n  function consume(code) {\n    if (markdownLineEnding(code)) {\n      point.line++;\n      point.column = 1;\n      point.offset += code === -3 ? 2 : 1;\n      accountForPotentialSkip();\n    } else if (code !== -1) {\n      point.column++;\n      point.offset++;\n    }\n\n    // Not in a string chunk.\n    if (point._bufferIndex < 0) {\n      point._index++;\n    } else {\n      point._bufferIndex++;\n\n      // At end of string chunk.\n      if (point._bufferIndex ===\n      // Points w/ non-negative `_bufferIndex` reference\n      // strings.\n      /** @type {string} */\n      chunks[point._index].length) {\n        point._bufferIndex = -1;\n        point._index++;\n      }\n    }\n\n    // Expose the previous character.\n    context.previous = code;\n\n    // Mark as consumed.\n    consumed = true;\n  }\n\n  /** @type {Effects['enter']} */\n  function enter(type, fields) {\n    /** @type {Token} */\n    // @ts-expect-error Patch instead of assign required fields to help GC.\n    const token = fields || {};\n    token.type = type;\n    token.start = now();\n    context.events.push(['enter', token, context]);\n    stack.push(token);\n    return token;\n  }\n\n  /** @type {Effects['exit']} */\n  function exit(type) {\n    const token = stack.pop();\n    token.end = now();\n    context.events.push(['exit', token, context]);\n    return token;\n  }\n\n  /**\n   * Use results.\n   *\n   * @type {ReturnHandle}\n   */\n  function onsuccessfulconstruct(construct, info) {\n    addResult(construct, info.from);\n  }\n\n  /**\n   * Discard results.\n   *\n   * @type {ReturnHandle}\n   */\n  function onsuccessfulcheck(_, info) {\n    info.restore();\n  }\n\n  /**\n   * Factory to attempt/check/interrupt.\n   *\n   * @param {ReturnHandle} onreturn\n   *   Callback.\n   * @param {{interrupt?: boolean | undefined} | undefined} [fields]\n   *   Fields.\n   */\n  function constructFactory(onreturn, fields) {\n    return hook;\n\n    /**\n     * Handle either an object mapping codes to constructs, a list of\n     * constructs, or a single construct.\n     *\n     * @param {Array<Construct> | ConstructRecord | Construct} constructs\n     *   Constructs.\n     * @param {State} returnState\n     *   State.\n     * @param {State | undefined} [bogusState]\n     *   State.\n     * @returns {State}\n     *   State.\n     */\n    function hook(constructs, returnState, bogusState) {\n      /** @type {ReadonlyArray<Construct>} */\n      let listOfConstructs;\n      /** @type {number} */\n      let constructIndex;\n      /** @type {Construct} */\n      let currentConstruct;\n      /** @type {Info} */\n      let info;\n      return Array.isArray(constructs) ? /* c8 ignore next 1 */\n      handleListOfConstructs(constructs) : 'tokenize' in constructs ?\n      // Looks like a construct.\n      handleListOfConstructs([(/** @type {Construct} */constructs)]) : handleMapOfConstructs(constructs);\n\n      /**\n       * Handle a list of construct.\n       *\n       * @param {ConstructRecord} map\n       *   Constructs.\n       * @returns {State}\n       *   State.\n       */\n      function handleMapOfConstructs(map) {\n        return start;\n\n        /** @type {State} */\n        function start(code) {\n          const left = code !== null && map[code];\n          const all = code !== null && map.null;\n          const list = [\n          // To do: add more extension tests.\n          /* c8 ignore next 2 */\n          ...(Array.isArray(left) ? left : left ? [left] : []), ...(Array.isArray(all) ? all : all ? [all] : [])];\n          return handleListOfConstructs(list)(code);\n        }\n      }\n\n      /**\n       * Handle a list of construct.\n       *\n       * @param {ReadonlyArray<Construct>} list\n       *   Constructs.\n       * @returns {State}\n       *   State.\n       */\n      function handleListOfConstructs(list) {\n        listOfConstructs = list;\n        constructIndex = 0;\n        if (list.length === 0) {\n          return bogusState;\n        }\n        return handleConstruct(list[constructIndex]);\n      }\n\n      /**\n       * Handle a single construct.\n       *\n       * @param {Construct} construct\n       *   Construct.\n       * @returns {State}\n       *   State.\n       */\n      function handleConstruct(construct) {\n        return start;\n\n        /** @type {State} */\n        function start(code) {\n          // To do: not needed to store if there is no bogus state, probably?\n          // Currently doesn\u2019t work because `inspect` in document does a check\n          // w/o a bogus, which doesn\u2019t make sense. But it does seem to help perf\n          // by not storing.\n          info = store();\n          currentConstruct = construct;\n          if (!construct.partial) {\n            context.currentConstruct = construct;\n          }\n\n          // Always populated by defaults.\n\n          if (construct.name && context.parser.constructs.disable.null.includes(construct.name)) {\n            return nok(code);\n          }\n          return construct.tokenize.call(\n          // If we do have fields, create an object w/ `context` as its\n          // prototype.\n          // This allows a \u201Clive binding\u201D, which is needed for `interrupt`.\n          fields ? Object.assign(Object.create(context), fields) : context, effects, ok, nok)(code);\n        }\n      }\n\n      /** @type {State} */\n      function ok(code) {\n        consumed = true;\n        onreturn(currentConstruct, info);\n        return returnState;\n      }\n\n      /** @type {State} */\n      function nok(code) {\n        consumed = true;\n        info.restore();\n        if (++constructIndex < listOfConstructs.length) {\n          return handleConstruct(listOfConstructs[constructIndex]);\n        }\n        return bogusState;\n      }\n    }\n  }\n\n  /**\n   * @param {Construct} construct\n   *   Construct.\n   * @param {number} from\n   *   From.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  function addResult(construct, from) {\n    if (construct.resolveAll && !resolveAllConstructs.includes(construct)) {\n      resolveAllConstructs.push(construct);\n    }\n    if (construct.resolve) {\n      splice(context.events, from, context.events.length - from, construct.resolve(context.events.slice(from), context));\n    }\n    if (construct.resolveTo) {\n      context.events = construct.resolveTo(context.events, context);\n    }\n  }\n\n  /**\n   * Store state.\n   *\n   * @returns {Info}\n   *   Info.\n   */\n  function store() {\n    const startPoint = now();\n    const startPrevious = context.previous;\n    const startCurrentConstruct = context.currentConstruct;\n    const startEventsIndex = context.events.length;\n    const startStack = Array.from(stack);\n    return {\n      from: startEventsIndex,\n      restore\n    };\n\n    /**\n     * Restore state.\n     *\n     * @returns {undefined}\n     *   Nothing.\n     */\n    function restore() {\n      point = startPoint;\n      context.previous = startPrevious;\n      context.currentConstruct = startCurrentConstruct;\n      context.events.length = startEventsIndex;\n      stack = startStack;\n      accountForPotentialSkip();\n    }\n  }\n\n  /**\n   * Move the current point a bit forward in the line when it\u2019s on a column\n   * skip.\n   *\n   * @returns {undefined}\n   *   Nothing.\n   */\n  function accountForPotentialSkip() {\n    if (point.line in columnStart && point.column < 2) {\n      point.column = columnStart[point.line];\n      point.offset += columnStart[point.line] - 1;\n    }\n  }\n}\n\n/**\n * Get the chunks from a slice of chunks in the range of a token.\n *\n * @param {ReadonlyArray<Chunk>} chunks\n *   Chunks.\n * @param {Pick<Token, 'end' | 'start'>} token\n *   Token.\n * @returns {Array<Chunk>}\n *   Chunks.\n */\nfunction sliceChunks(chunks, token) {\n  const startIndex = token.start._index;\n  const startBufferIndex = token.start._bufferIndex;\n  const endIndex = token.end._index;\n  const endBufferIndex = token.end._bufferIndex;\n  /** @type {Array<Chunk>} */\n  let view;\n  if (startIndex === endIndex) {\n    // @ts-expect-error `_bufferIndex` is used on string chunks.\n    view = [chunks[startIndex].slice(startBufferIndex, endBufferIndex)];\n  } else {\n    view = chunks.slice(startIndex, endIndex);\n    if (startBufferIndex > -1) {\n      const head = view[0];\n      if (typeof head === 'string') {\n        view[0] = head.slice(startBufferIndex);\n      } else {\n        view.shift();\n      }\n    }\n    if (endBufferIndex > 0) {\n      // @ts-expect-error `_bufferIndex` is used on string chunks.\n      view.push(chunks[endIndex].slice(0, endBufferIndex));\n    }\n  }\n  return view;\n}\n\n/**\n * Get the string value of a slice of chunks.\n *\n * @param {ReadonlyArray<Chunk>} chunks\n *   Chunks.\n * @param {boolean | undefined} [expandTabs=false]\n *   Whether to expand tabs (default: `false`).\n * @returns {string}\n *   Result.\n */\nfunction serializeChunks(chunks, expandTabs) {\n  let index = -1;\n  /** @type {Array<string>} */\n  const result = [];\n  /** @type {boolean | undefined} */\n  let atTab;\n  while (++index < chunks.length) {\n    const chunk = chunks[index];\n    /** @type {string} */\n    let value;\n    if (typeof chunk === 'string') {\n      value = chunk;\n    } else switch (chunk) {\n      case -5:\n        {\n          value = \"\\r\";\n          break;\n        }\n      case -4:\n        {\n          value = \"\\n\";\n          break;\n        }\n      case -3:\n        {\n          value = \"\\r\" + \"\\n\";\n          break;\n        }\n      case -2:\n        {\n          value = expandTabs ? \" \" : \"\\t\";\n          break;\n        }\n      case -1:\n        {\n          if (!expandTabs && atTab) continue;\n          value = \" \";\n          break;\n        }\n      default:\n        {\n          // Currently only replacement character.\n          value = String.fromCharCode(chunk);\n        }\n    }\n    atTab = chunk === -2;\n    result.push(value);\n  }\n  return result.join('');\n}", "/**\n * @import {\n *   Create,\n *   FullNormalizedExtension,\n *   InitialConstruct,\n *   ParseContext,\n *   ParseOptions\n * } from 'micromark-util-types'\n */\n\nimport { combineExtensions } from 'micromark-util-combine-extensions';\nimport { content } from './initialize/content.js';\nimport { document } from './initialize/document.js';\nimport { flow } from './initialize/flow.js';\nimport { string, text } from './initialize/text.js';\nimport * as defaultConstructs from './constructs.js';\nimport { createTokenizer } from './create-tokenizer.js';\n\n/**\n * @param {ParseOptions | null | undefined} [options]\n *   Configuration (optional).\n * @returns {ParseContext}\n *   Parser.\n */\nexport function parse(options) {\n  const settings = options || {};\n  const constructs = /** @type {FullNormalizedExtension} */\n  combineExtensions([defaultConstructs, ...(settings.extensions || [])]);\n\n  /** @type {ParseContext} */\n  const parser = {\n    constructs,\n    content: create(content),\n    defined: [],\n    document: create(document),\n    flow: create(flow),\n    lazy: {},\n    string: create(string),\n    text: create(text)\n  };\n  return parser;\n\n  /**\n   * @param {InitialConstruct} initial\n   *   Construct to start with.\n   * @returns {Create}\n   *   Create a tokenizer.\n   */\n  function create(initial) {\n    return creator;\n    /** @type {Create} */\n    function creator(from) {\n      return createTokenizer(parser, initial, from);\n    }\n  }\n}", "/**\n * @import {Event} from 'micromark-util-types'\n */\n\nimport { subtokenize } from 'micromark-util-subtokenize';\n\n/**\n * @param {Array<Event>} events\n *   Events.\n * @returns {Array<Event>}\n *   Events.\n */\nexport function postprocess(events) {\n  while (!subtokenize(events)) {\n    // Empty\n  }\n  return events;\n}", "/**\n * @import {Chunk, Code, Encoding, Value} from 'micromark-util-types'\n */\n\n/**\n * @callback Preprocessor\n *   Preprocess a value.\n * @param {Value} value\n *   Value.\n * @param {Encoding | null | undefined} [encoding]\n *   Encoding when `value` is a typed array (optional).\n * @param {boolean | null | undefined} [end=false]\n *   Whether this is the last chunk (default: `false`).\n * @returns {Array<Chunk>}\n *   Chunks.\n */\n\nconst search = /[\\0\\t\\n\\r]/g;\n\n/**\n * @returns {Preprocessor}\n *   Preprocess a value.\n */\nexport function preprocess() {\n  let column = 1;\n  let buffer = '';\n  /** @type {boolean | undefined} */\n  let start = true;\n  /** @type {boolean | undefined} */\n  let atCarriageReturn;\n  return preprocessor;\n\n  /** @type {Preprocessor} */\n  // eslint-disable-next-line complexity\n  function preprocessor(value, encoding, end) {\n    /** @type {Array<Chunk>} */\n    const chunks = [];\n    /** @type {RegExpMatchArray | null} */\n    let match;\n    /** @type {number} */\n    let next;\n    /** @type {number} */\n    let startPosition;\n    /** @type {number} */\n    let endPosition;\n    /** @type {Code} */\n    let code;\n    value = buffer + (typeof value === 'string' ? value.toString() : new TextDecoder(encoding || undefined).decode(value));\n    startPosition = 0;\n    buffer = '';\n    if (start) {\n      // To do: `markdown-rs` actually parses BOMs (byte order mark).\n      if (value.charCodeAt(0) === 65279) {\n        startPosition++;\n      }\n      start = undefined;\n    }\n    while (startPosition < value.length) {\n      search.lastIndex = startPosition;\n      match = search.exec(value);\n      endPosition = match && match.index !== undefined ? match.index : value.length;\n      code = value.charCodeAt(endPosition);\n      if (!match) {\n        buffer = value.slice(startPosition);\n        break;\n      }\n      if (code === 10 && startPosition === endPosition && atCarriageReturn) {\n        chunks.push(-3);\n        atCarriageReturn = undefined;\n      } else {\n        if (atCarriageReturn) {\n          chunks.push(-5);\n          atCarriageReturn = undefined;\n        }\n        if (startPosition < endPosition) {\n          chunks.push(value.slice(startPosition, endPosition));\n          column += endPosition - startPosition;\n        }\n        switch (code) {\n          case 0:\n            {\n              chunks.push(65533);\n              column++;\n              break;\n            }\n          case 9:\n            {\n              next = Math.ceil(column / 4) * 4;\n              chunks.push(-2);\n              while (column++ < next) chunks.push(-1);\n              break;\n            }\n          case 10:\n            {\n              chunks.push(-4);\n              column = 1;\n              break;\n            }\n          default:\n            {\n              atCarriageReturn = true;\n              column = 1;\n            }\n        }\n      }\n      startPosition = endPosition + 1;\n    }\n    if (end) {\n      if (atCarriageReturn) chunks.push(-5);\n      if (buffer) chunks.push(buffer);\n      chunks.push(null);\n    }\n    return chunks;\n  }\n}", "import { decodeNamedCharacterReference } from 'decode-named-character-reference';\nimport { decodeNumericCharacterReference } from 'micromark-util-decode-numeric-character-reference';\nconst characterEscapeOrReference = /\\\\([!-/:-@[-`{-~])|&(#(?:\\d{1,7}|x[\\da-f]{1,6})|[\\da-z]{1,31});/gi;\n\n/**\n * Decode markdown strings (which occur in places such as fenced code info\n * strings, destinations, labels, and titles).\n *\n * The \u201Cstring\u201D content type allows character escapes and -references.\n * This decodes those.\n *\n * @param {string} value\n *   Value to decode.\n * @returns {string}\n *   Decoded value.\n */\nexport function decodeString(value) {\n  return value.replace(characterEscapeOrReference, decode);\n}\n\n/**\n * @param {string} $0\n *   Match.\n * @param {string} $1\n *   Character escape.\n * @param {string} $2\n *   Character reference.\n * @returns {string}\n *   Decoded value\n */\nfunction decode($0, $1, $2) {\n  if ($1) {\n    // Escape.\n    return $1;\n  }\n\n  // Reference.\n  const head = $2.charCodeAt(0);\n  if (head === 35) {\n    const head = $2.charCodeAt(1);\n    const hex = head === 120 || head === 88;\n    return decodeNumericCharacterReference($2.slice(hex ? 2 : 1), hex ? 16 : 10);\n  }\n  return decodeNamedCharacterReference($2) || $0;\n}", "/**\n * @import {\n *   Break,\n *   Blockquote,\n *   Code,\n *   Definition,\n *   Emphasis,\n *   Heading,\n *   Html,\n *   Image,\n *   InlineCode,\n *   Link,\n *   ListItem,\n *   List,\n *   Nodes,\n *   Paragraph,\n *   PhrasingContent,\n *   ReferenceType,\n *   Root,\n *   Strong,\n *   Text,\n *   ThematicBreak\n * } from 'mdast'\n * @import {\n *   Encoding,\n *   Event,\n *   Token,\n *   Value\n * } from 'micromark-util-types'\n * @import {Point} from 'unist'\n * @import {\n *   CompileContext,\n *   CompileData,\n *   Config,\n *   Extension,\n *   Handle,\n *   OnEnterError,\n *   Options\n * } from './types.js'\n */\n\nimport { toString } from 'mdast-util-to-string';\nimport { parse, postprocess, preprocess } from 'micromark';\nimport { decodeNumericCharacterReference } from 'micromark-util-decode-numeric-character-reference';\nimport { decodeString } from 'micromark-util-decode-string';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\nimport { decodeNamedCharacterReference } from 'decode-named-character-reference';\nimport { stringifyPosition } from 'unist-util-stringify-position';\nconst own = {}.hasOwnProperty;\n\n/**\n * Turn markdown into a syntax tree.\n *\n * @overload\n * @param {Value} value\n * @param {Encoding | null | undefined} [encoding]\n * @param {Options | null | undefined} [options]\n * @returns {Root}\n *\n * @overload\n * @param {Value} value\n * @param {Options | null | undefined} [options]\n * @returns {Root}\n *\n * @param {Value} value\n *   Markdown to parse.\n * @param {Encoding | Options | null | undefined} [encoding]\n *   Character encoding for when `value` is `Buffer`.\n * @param {Options | null | undefined} [options]\n *   Configuration.\n * @returns {Root}\n *   mdast tree.\n */\nexport function fromMarkdown(value, encoding, options) {\n  if (typeof encoding !== 'string') {\n    options = encoding;\n    encoding = undefined;\n  }\n  return compiler(options)(postprocess(parse(options).document().write(preprocess()(value, encoding, true))));\n}\n\n/**\n * Note this compiler only understand complete buffering, not streaming.\n *\n * @param {Options | null | undefined} [options]\n */\nfunction compiler(options) {\n  /** @type {Config} */\n  const config = {\n    transforms: [],\n    canContainEols: ['emphasis', 'fragment', 'heading', 'paragraph', 'strong'],\n    enter: {\n      autolink: opener(link),\n      autolinkProtocol: onenterdata,\n      autolinkEmail: onenterdata,\n      atxHeading: opener(heading),\n      blockQuote: opener(blockQuote),\n      characterEscape: onenterdata,\n      characterReference: onenterdata,\n      codeFenced: opener(codeFlow),\n      codeFencedFenceInfo: buffer,\n      codeFencedFenceMeta: buffer,\n      codeIndented: opener(codeFlow, buffer),\n      codeText: opener(codeText, buffer),\n      codeTextData: onenterdata,\n      data: onenterdata,\n      codeFlowValue: onenterdata,\n      definition: opener(definition),\n      definitionDestinationString: buffer,\n      definitionLabelString: buffer,\n      definitionTitleString: buffer,\n      emphasis: opener(emphasis),\n      hardBreakEscape: opener(hardBreak),\n      hardBreakTrailing: opener(hardBreak),\n      htmlFlow: opener(html, buffer),\n      htmlFlowData: onenterdata,\n      htmlText: opener(html, buffer),\n      htmlTextData: onenterdata,\n      image: opener(image),\n      label: buffer,\n      link: opener(link),\n      listItem: opener(listItem),\n      listItemValue: onenterlistitemvalue,\n      listOrdered: opener(list, onenterlistordered),\n      listUnordered: opener(list),\n      paragraph: opener(paragraph),\n      reference: onenterreference,\n      referenceString: buffer,\n      resourceDestinationString: buffer,\n      resourceTitleString: buffer,\n      setextHeading: opener(heading),\n      strong: opener(strong),\n      thematicBreak: opener(thematicBreak)\n    },\n    exit: {\n      atxHeading: closer(),\n      atxHeadingSequence: onexitatxheadingsequence,\n      autolink: closer(),\n      autolinkEmail: onexitautolinkemail,\n      autolinkProtocol: onexitautolinkprotocol,\n      blockQuote: closer(),\n      characterEscapeValue: onexitdata,\n      characterReferenceMarkerHexadecimal: onexitcharacterreferencemarker,\n      characterReferenceMarkerNumeric: onexitcharacterreferencemarker,\n      characterReferenceValue: onexitcharacterreferencevalue,\n      characterReference: onexitcharacterreference,\n      codeFenced: closer(onexitcodefenced),\n      codeFencedFence: onexitcodefencedfence,\n      codeFencedFenceInfo: onexitcodefencedfenceinfo,\n      codeFencedFenceMeta: onexitcodefencedfencemeta,\n      codeFlowValue: onexitdata,\n      codeIndented: closer(onexitcodeindented),\n      codeText: closer(onexitcodetext),\n      codeTextData: onexitdata,\n      data: onexitdata,\n      definition: closer(),\n      definitionDestinationString: onexitdefinitiondestinationstring,\n      definitionLabelString: onexitdefinitionlabelstring,\n      definitionTitleString: onexitdefinitiontitlestring,\n      emphasis: closer(),\n      hardBreakEscape: closer(onexithardbreak),\n      hardBreakTrailing: closer(onexithardbreak),\n      htmlFlow: closer(onexithtmlflow),\n      htmlFlowData: onexitdata,\n      htmlText: closer(onexithtmltext),\n      htmlTextData: onexitdata,\n      image: closer(onexitimage),\n      label: onexitlabel,\n      labelText: onexitlabeltext,\n      lineEnding: onexitlineending,\n      link: closer(onexitlink),\n      listItem: closer(),\n      listOrdered: closer(),\n      listUnordered: closer(),\n      paragraph: closer(),\n      referenceString: onexitreferencestring,\n      resourceDestinationString: onexitresourcedestinationstring,\n      resourceTitleString: onexitresourcetitlestring,\n      resource: onexitresource,\n      setextHeading: closer(onexitsetextheading),\n      setextHeadingLineSequence: onexitsetextheadinglinesequence,\n      setextHeadingText: onexitsetextheadingtext,\n      strong: closer(),\n      thematicBreak: closer()\n    }\n  };\n  configure(config, (options || {}).mdastExtensions || []);\n\n  /** @type {CompileData} */\n  const data = {};\n  return compile;\n\n  /**\n   * Turn micromark events into an mdast tree.\n   *\n   * @param {Array<Event>} events\n   *   Events.\n   * @returns {Root}\n   *   mdast tree.\n   */\n  function compile(events) {\n    /** @type {Root} */\n    let tree = {\n      type: 'root',\n      children: []\n    };\n    /** @type {Omit<CompileContext, 'sliceSerialize'>} */\n    const context = {\n      stack: [tree],\n      tokenStack: [],\n      config,\n      enter,\n      exit,\n      buffer,\n      resume,\n      data\n    };\n    /** @type {Array<number>} */\n    const listStack = [];\n    let index = -1;\n    while (++index < events.length) {\n      // We preprocess lists to add `listItem` tokens, and to infer whether\n      // items the list itself are spread out.\n      if (events[index][1].type === \"listOrdered\" || events[index][1].type === \"listUnordered\") {\n        if (events[index][0] === 'enter') {\n          listStack.push(index);\n        } else {\n          const tail = listStack.pop();\n          index = prepareList(events, tail, index);\n        }\n      }\n    }\n    index = -1;\n    while (++index < events.length) {\n      const handler = config[events[index][0]];\n      if (own.call(handler, events[index][1].type)) {\n        handler[events[index][1].type].call(Object.assign({\n          sliceSerialize: events[index][2].sliceSerialize\n        }, context), events[index][1]);\n      }\n    }\n\n    // Handle tokens still being open.\n    if (context.tokenStack.length > 0) {\n      const tail = context.tokenStack[context.tokenStack.length - 1];\n      const handler = tail[1] || defaultOnError;\n      handler.call(context, undefined, tail[0]);\n    }\n\n    // Figure out `root` position.\n    tree.position = {\n      start: point(events.length > 0 ? events[0][1].start : {\n        line: 1,\n        column: 1,\n        offset: 0\n      }),\n      end: point(events.length > 0 ? events[events.length - 2][1].end : {\n        line: 1,\n        column: 1,\n        offset: 0\n      })\n    };\n\n    // Call transforms.\n    index = -1;\n    while (++index < config.transforms.length) {\n      tree = config.transforms[index](tree) || tree;\n    }\n    return tree;\n  }\n\n  /**\n   * @param {Array<Event>} events\n   * @param {number} start\n   * @param {number} length\n   * @returns {number}\n   */\n  function prepareList(events, start, length) {\n    let index = start - 1;\n    let containerBalance = -1;\n    let listSpread = false;\n    /** @type {Token | undefined} */\n    let listItem;\n    /** @type {number | undefined} */\n    let lineIndex;\n    /** @type {number | undefined} */\n    let firstBlankLineIndex;\n    /** @type {boolean | undefined} */\n    let atMarker;\n    while (++index <= length) {\n      const event = events[index];\n      switch (event[1].type) {\n        case \"listUnordered\":\n        case \"listOrdered\":\n        case \"blockQuote\":\n          {\n            if (event[0] === 'enter') {\n              containerBalance++;\n            } else {\n              containerBalance--;\n            }\n            atMarker = undefined;\n            break;\n          }\n        case \"lineEndingBlank\":\n          {\n            if (event[0] === 'enter') {\n              if (listItem && !atMarker && !containerBalance && !firstBlankLineIndex) {\n                firstBlankLineIndex = index;\n              }\n              atMarker = undefined;\n            }\n            break;\n          }\n        case \"linePrefix\":\n        case \"listItemValue\":\n        case \"listItemMarker\":\n        case \"listItemPrefix\":\n        case \"listItemPrefixWhitespace\":\n          {\n            // Empty.\n\n            break;\n          }\n        default:\n          {\n            atMarker = undefined;\n          }\n      }\n      if (!containerBalance && event[0] === 'enter' && event[1].type === \"listItemPrefix\" || containerBalance === -1 && event[0] === 'exit' && (event[1].type === \"listUnordered\" || event[1].type === \"listOrdered\")) {\n        if (listItem) {\n          let tailIndex = index;\n          lineIndex = undefined;\n          while (tailIndex--) {\n            const tailEvent = events[tailIndex];\n            if (tailEvent[1].type === \"lineEnding\" || tailEvent[1].type === \"lineEndingBlank\") {\n              if (tailEvent[0] === 'exit') continue;\n              if (lineIndex) {\n                events[lineIndex][1].type = \"lineEndingBlank\";\n                listSpread = true;\n              }\n              tailEvent[1].type = \"lineEnding\";\n              lineIndex = tailIndex;\n            } else if (tailEvent[1].type === \"linePrefix\" || tailEvent[1].type === \"blockQuotePrefix\" || tailEvent[1].type === \"blockQuotePrefixWhitespace\" || tailEvent[1].type === \"blockQuoteMarker\" || tailEvent[1].type === \"listItemIndent\") {\n              // Empty\n            } else {\n              break;\n            }\n          }\n          if (firstBlankLineIndex && (!lineIndex || firstBlankLineIndex < lineIndex)) {\n            listItem._spread = true;\n          }\n\n          // Fix position.\n          listItem.end = Object.assign({}, lineIndex ? events[lineIndex][1].start : event[1].end);\n          events.splice(lineIndex || index, 0, ['exit', listItem, event[2]]);\n          index++;\n          length++;\n        }\n\n        // Create a new list item.\n        if (event[1].type === \"listItemPrefix\") {\n          /** @type {Token} */\n          const item = {\n            type: 'listItem',\n            _spread: false,\n            start: Object.assign({}, event[1].start),\n            // @ts-expect-error: we\u2019ll add `end` in a second.\n            end: undefined\n          };\n          listItem = item;\n          events.splice(index, 0, ['enter', item, event[2]]);\n          index++;\n          length++;\n          firstBlankLineIndex = undefined;\n          atMarker = true;\n        }\n      }\n    }\n    events[start][1]._spread = listSpread;\n    return length;\n  }\n\n  /**\n   * Create an opener handle.\n   *\n   * @param {(token: Token) => Nodes} create\n   *   Create a node.\n   * @param {Handle | undefined} [and]\n   *   Optional function to also run.\n   * @returns {Handle}\n   *   Handle.\n   */\n  function opener(create, and) {\n    return open;\n\n    /**\n     * @this {CompileContext}\n     * @param {Token} token\n     * @returns {undefined}\n     */\n    function open(token) {\n      enter.call(this, create(token), token);\n      if (and) and.call(this, token);\n    }\n  }\n\n  /**\n   * @type {CompileContext['buffer']}\n   */\n  function buffer() {\n    this.stack.push({\n      type: 'fragment',\n      children: []\n    });\n  }\n\n  /**\n   * @type {CompileContext['enter']}\n   */\n  function enter(node, token, errorHandler) {\n    const parent = this.stack[this.stack.length - 1];\n    /** @type {Array<Nodes>} */\n    const siblings = parent.children;\n    siblings.push(node);\n    this.stack.push(node);\n    this.tokenStack.push([token, errorHandler || undefined]);\n    node.position = {\n      start: point(token.start),\n      // @ts-expect-error: `end` will be patched later.\n      end: undefined\n    };\n  }\n\n  /**\n   * Create a closer handle.\n   *\n   * @param {Handle | undefined} [and]\n   *   Optional function to also run.\n   * @returns {Handle}\n   *   Handle.\n   */\n  function closer(and) {\n    return close;\n\n    /**\n     * @this {CompileContext}\n     * @param {Token} token\n     * @returns {undefined}\n     */\n    function close(token) {\n      if (and) and.call(this, token);\n      exit.call(this, token);\n    }\n  }\n\n  /**\n   * @type {CompileContext['exit']}\n   */\n  function exit(token, onExitError) {\n    const node = this.stack.pop();\n    const open = this.tokenStack.pop();\n    if (!open) {\n      throw new Error('Cannot close `' + token.type + '` (' + stringifyPosition({\n        start: token.start,\n        end: token.end\n      }) + '): it\u2019s not open');\n    } else if (open[0].type !== token.type) {\n      if (onExitError) {\n        onExitError.call(this, token, open[0]);\n      } else {\n        const handler = open[1] || defaultOnError;\n        handler.call(this, token, open[0]);\n      }\n    }\n    node.position.end = point(token.end);\n  }\n\n  /**\n   * @type {CompileContext['resume']}\n   */\n  function resume() {\n    return toString(this.stack.pop());\n  }\n\n  //\n  // Handlers.\n  //\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onenterlistordered() {\n    this.data.expectingFirstListItemValue = true;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onenterlistitemvalue(token) {\n    if (this.data.expectingFirstListItemValue) {\n      const ancestor = this.stack[this.stack.length - 2];\n      ancestor.start = Number.parseInt(this.sliceSerialize(token), 10);\n      this.data.expectingFirstListItemValue = undefined;\n    }\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitcodefencedfenceinfo() {\n    const data = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    node.lang = data;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitcodefencedfencemeta() {\n    const data = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    node.meta = data;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitcodefencedfence() {\n    // Exit if this is the closing fence.\n    if (this.data.flowCodeInside) return;\n    this.buffer();\n    this.data.flowCodeInside = true;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitcodefenced() {\n    const data = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    node.value = data.replace(/^(\\r?\\n|\\r)|(\\r?\\n|\\r)$/g, '');\n    this.data.flowCodeInside = undefined;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitcodeindented() {\n    const data = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    node.value = data.replace(/(\\r?\\n|\\r)$/g, '');\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitdefinitionlabelstring(token) {\n    const label = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    node.label = label;\n    node.identifier = normalizeIdentifier(this.sliceSerialize(token)).toLowerCase();\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitdefinitiontitlestring() {\n    const data = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    node.title = data;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitdefinitiondestinationstring() {\n    const data = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    node.url = data;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitatxheadingsequence(token) {\n    const node = this.stack[this.stack.length - 1];\n    if (!node.depth) {\n      const depth = this.sliceSerialize(token).length;\n      node.depth = depth;\n    }\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitsetextheadingtext() {\n    this.data.setextHeadingSlurpLineEnding = true;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitsetextheadinglinesequence(token) {\n    const node = this.stack[this.stack.length - 1];\n    node.depth = this.sliceSerialize(token).codePointAt(0) === 61 ? 1 : 2;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitsetextheading() {\n    this.data.setextHeadingSlurpLineEnding = undefined;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onenterdata(token) {\n    const node = this.stack[this.stack.length - 1];\n    /** @type {Array<Nodes>} */\n    const siblings = node.children;\n    let tail = siblings[siblings.length - 1];\n    if (!tail || tail.type !== 'text') {\n      // Add a new text node.\n      tail = text();\n      tail.position = {\n        start: point(token.start),\n        // @ts-expect-error: we\u2019ll add `end` later.\n        end: undefined\n      };\n      siblings.push(tail);\n    }\n    this.stack.push(tail);\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexitdata(token) {\n    const tail = this.stack.pop();\n    tail.value += this.sliceSerialize(token);\n    tail.position.end = point(token.end);\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexitlineending(token) {\n    const context = this.stack[this.stack.length - 1];\n    // If we\u2019re at a hard break, include the line ending in there.\n    if (this.data.atHardBreak) {\n      const tail = context.children[context.children.length - 1];\n      tail.position.end = point(token.end);\n      this.data.atHardBreak = undefined;\n      return;\n    }\n    if (!this.data.setextHeadingSlurpLineEnding && config.canContainEols.includes(context.type)) {\n      onenterdata.call(this, token);\n      onexitdata.call(this, token);\n    }\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexithardbreak() {\n    this.data.atHardBreak = true;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexithtmlflow() {\n    const data = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    node.value = data;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexithtmltext() {\n    const data = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    node.value = data;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexitcodetext() {\n    const data = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    node.value = data;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexitlink() {\n    const node = this.stack[this.stack.length - 1];\n    // Note: there are also `identifier` and `label` fields on this link node!\n    // These are used / cleaned here.\n\n    // To do: clean.\n    if (this.data.inReference) {\n      /** @type {ReferenceType} */\n      const referenceType = this.data.referenceType || 'shortcut';\n      node.type += 'Reference';\n      // @ts-expect-error: mutate.\n      node.referenceType = referenceType;\n      // @ts-expect-error: mutate.\n      delete node.url;\n      delete node.title;\n    } else {\n      // @ts-expect-error: mutate.\n      delete node.identifier;\n      // @ts-expect-error: mutate.\n      delete node.label;\n    }\n    this.data.referenceType = undefined;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexitimage() {\n    const node = this.stack[this.stack.length - 1];\n    // Note: there are also `identifier` and `label` fields on this link node!\n    // These are used / cleaned here.\n\n    // To do: clean.\n    if (this.data.inReference) {\n      /** @type {ReferenceType} */\n      const referenceType = this.data.referenceType || 'shortcut';\n      node.type += 'Reference';\n      // @ts-expect-error: mutate.\n      node.referenceType = referenceType;\n      // @ts-expect-error: mutate.\n      delete node.url;\n      delete node.title;\n    } else {\n      // @ts-expect-error: mutate.\n      delete node.identifier;\n      // @ts-expect-error: mutate.\n      delete node.label;\n    }\n    this.data.referenceType = undefined;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexitlabeltext(token) {\n    const string = this.sliceSerialize(token);\n    const ancestor = this.stack[this.stack.length - 2];\n    // @ts-expect-error: stash this on the node, as it might become a reference\n    // later.\n    ancestor.label = decodeString(string);\n    // @ts-expect-error: same as above.\n    ancestor.identifier = normalizeIdentifier(string).toLowerCase();\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexitlabel() {\n    const fragment = this.stack[this.stack.length - 1];\n    const value = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    // Assume a reference.\n    this.data.inReference = true;\n    if (node.type === 'link') {\n      /** @type {Array<PhrasingContent>} */\n      const children = fragment.children;\n      node.children = children;\n    } else {\n      node.alt = value;\n    }\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexitresourcedestinationstring() {\n    const data = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    node.url = data;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexitresourcetitlestring() {\n    const data = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    node.title = data;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexitresource() {\n    this.data.inReference = undefined;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onenterreference() {\n    this.data.referenceType = 'collapsed';\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexitreferencestring(token) {\n    const label = this.resume();\n    const node = this.stack[this.stack.length - 1];\n    // @ts-expect-error: stash this on the node, as it might become a reference\n    // later.\n    node.label = label;\n    // @ts-expect-error: same as above.\n    node.identifier = normalizeIdentifier(this.sliceSerialize(token)).toLowerCase();\n    this.data.referenceType = 'full';\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n\n  function onexitcharacterreferencemarker(token) {\n    this.data.characterReferenceType = token.type;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitcharacterreferencevalue(token) {\n    const data = this.sliceSerialize(token);\n    const type = this.data.characterReferenceType;\n    /** @type {string} */\n    let value;\n    if (type) {\n      value = decodeNumericCharacterReference(data, type === \"characterReferenceMarkerNumeric\" ? 10 : 16);\n      this.data.characterReferenceType = undefined;\n    } else {\n      const result = decodeNamedCharacterReference(data);\n      value = result;\n    }\n    const tail = this.stack[this.stack.length - 1];\n    tail.value += value;\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitcharacterreference(token) {\n    const tail = this.stack.pop();\n    tail.position.end = point(token.end);\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitautolinkprotocol(token) {\n    onexitdata.call(this, token);\n    const node = this.stack[this.stack.length - 1];\n    node.url = this.sliceSerialize(token);\n  }\n\n  /**\n   * @this {CompileContext}\n   * @type {Handle}\n   */\n  function onexitautolinkemail(token) {\n    onexitdata.call(this, token);\n    const node = this.stack[this.stack.length - 1];\n    node.url = 'mailto:' + this.sliceSerialize(token);\n  }\n\n  //\n  // Creaters.\n  //\n\n  /** @returns {Blockquote} */\n  function blockQuote() {\n    return {\n      type: 'blockquote',\n      children: []\n    };\n  }\n\n  /** @returns {Code} */\n  function codeFlow() {\n    return {\n      type: 'code',\n      lang: null,\n      meta: null,\n      value: ''\n    };\n  }\n\n  /** @returns {InlineCode} */\n  function codeText() {\n    return {\n      type: 'inlineCode',\n      value: ''\n    };\n  }\n\n  /** @returns {Definition} */\n  function definition() {\n    return {\n      type: 'definition',\n      identifier: '',\n      label: null,\n      title: null,\n      url: ''\n    };\n  }\n\n  /** @returns {Emphasis} */\n  function emphasis() {\n    return {\n      type: 'emphasis',\n      children: []\n    };\n  }\n\n  /** @returns {Heading} */\n  function heading() {\n    return {\n      type: 'heading',\n      // @ts-expect-error `depth` will be set later.\n      depth: 0,\n      children: []\n    };\n  }\n\n  /** @returns {Break} */\n  function hardBreak() {\n    return {\n      type: 'break'\n    };\n  }\n\n  /** @returns {Html} */\n  function html() {\n    return {\n      type: 'html',\n      value: ''\n    };\n  }\n\n  /** @returns {Image} */\n  function image() {\n    return {\n      type: 'image',\n      title: null,\n      url: '',\n      alt: null\n    };\n  }\n\n  /** @returns {Link} */\n  function link() {\n    return {\n      type: 'link',\n      title: null,\n      url: '',\n      children: []\n    };\n  }\n\n  /**\n   * @param {Token} token\n   * @returns {List}\n   */\n  function list(token) {\n    return {\n      type: 'list',\n      ordered: token.type === 'listOrdered',\n      start: null,\n      spread: token._spread,\n      children: []\n    };\n  }\n\n  /**\n   * @param {Token} token\n   * @returns {ListItem}\n   */\n  function listItem(token) {\n    return {\n      type: 'listItem',\n      spread: token._spread,\n      checked: null,\n      children: []\n    };\n  }\n\n  /** @returns {Paragraph} */\n  function paragraph() {\n    return {\n      type: 'paragraph',\n      children: []\n    };\n  }\n\n  /** @returns {Strong} */\n  function strong() {\n    return {\n      type: 'strong',\n      children: []\n    };\n  }\n\n  /** @returns {Text} */\n  function text() {\n    return {\n      type: 'text',\n      value: ''\n    };\n  }\n\n  /** @returns {ThematicBreak} */\n  function thematicBreak() {\n    return {\n      type: 'thematicBreak'\n    };\n  }\n}\n\n/**\n * Copy a point-like value.\n *\n * @param {Point} d\n *   Point-like value.\n * @returns {Point}\n *   unist point.\n */\nfunction point(d) {\n  return {\n    line: d.line,\n    column: d.column,\n    offset: d.offset\n  };\n}\n\n/**\n * @param {Config} combined\n * @param {Array<Array<Extension> | Extension>} extensions\n * @returns {undefined}\n */\nfunction configure(combined, extensions) {\n  let index = -1;\n  while (++index < extensions.length) {\n    const value = extensions[index];\n    if (Array.isArray(value)) {\n      configure(combined, value);\n    } else {\n      extension(combined, value);\n    }\n  }\n}\n\n/**\n * @param {Config} combined\n * @param {Extension} extension\n * @returns {undefined}\n */\nfunction extension(combined, extension) {\n  /** @type {keyof Extension} */\n  let key;\n  for (key in extension) {\n    if (own.call(extension, key)) {\n      switch (key) {\n        case 'canContainEols':\n          {\n            const right = extension[key];\n            if (right) {\n              combined[key].push(...right);\n            }\n            break;\n          }\n        case 'transforms':\n          {\n            const right = extension[key];\n            if (right) {\n              combined[key].push(...right);\n            }\n            break;\n          }\n        case 'enter':\n        case 'exit':\n          {\n            const right = extension[key];\n            if (right) {\n              Object.assign(combined[key], right);\n            }\n            break;\n          }\n        // No default\n      }\n    }\n  }\n}\n\n/** @type {OnEnterError} */\nfunction defaultOnError(left, right) {\n  if (left) {\n    throw new Error('Cannot close `' + left.type + '` (' + stringifyPosition({\n      start: left.start,\n      end: left.end\n    }) + '): a different token (`' + right.type + '`, ' + stringifyPosition({\n      start: right.start,\n      end: right.end\n    }) + ') is open');\n  } else {\n    throw new Error('Cannot close document, a token (`' + right.type + '`, ' + stringifyPosition({\n      start: right.start,\n      end: right.end\n    }) + ') is still open');\n  }\n}", "/**\n * @typedef {import('mdast').Root} Root\n * @typedef {import('mdast-util-from-markdown').Options} FromMarkdownOptions\n * @typedef {import('unified').Parser<Root>} Parser\n * @typedef {import('unified').Processor<Root>} Processor\n */\n\n/**\n * @typedef {Omit<FromMarkdownOptions, 'extensions' | 'mdastExtensions'>} Options\n */\n\nimport {fromMarkdown} from 'mdast-util-from-markdown'\n\n/**\n * Aadd support for parsing from markdown.\n *\n * @param {Readonly<Options> | null | undefined} [options]\n *   Configuration (optional).\n * @returns {undefined}\n *   Nothing.\n */\nexport default function remarkParse(options) {\n  /** @type {Processor} */\n  // @ts-expect-error: TS in JSDoc generates wrong types if `this` is typed regularly.\n  const self = this\n\n  self.parser = parser\n\n  /**\n   * @type {Parser}\n   */\n  function parser(doc) {\n    return fromMarkdown(doc, {\n      ...self.data('settings'),\n      ...options,\n      // Note: these options are not in the readme.\n      // The goal is for them to be set by plugins on `data` instead of being\n      // passed by users.\n      extensions: self.data('micromarkExtensions') || [],\n      mdastExtensions: self.data('fromMarkdownExtensions') || []\n    })\n  }\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('mdast').Blockquote} Blockquote\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `blockquote` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Blockquote} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function blockquote(state, node) {\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'blockquote',\n    properties: {},\n    children: state.wrap(state.all(node), true)\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').Text} Text\n * @typedef {import('mdast').Break} Break\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `break` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Break} node\n *   mdast node.\n * @returns {Array<Element | Text>}\n *   hast element content.\n */\nexport function hardBreak(state, node) {\n  /** @type {Element} */\n  const result = {type: 'element', tagName: 'br', properties: {}, children: []}\n  state.patch(node, result)\n  return [state.applyData(node, result), {type: 'text', value: '\\n'}]\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').Properties} Properties\n * @typedef {import('mdast').Code} Code\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `code` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Code} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function code(state, node) {\n  const value = node.value ? node.value + '\\n' : ''\n  /** @type {Properties} */\n  const properties = {}\n\n  if (node.lang) {\n    properties.className = ['language-' + node.lang]\n  }\n\n  // Create `<code>`.\n  /** @type {Element} */\n  let result = {\n    type: 'element',\n    tagName: 'code',\n    properties,\n    children: [{type: 'text', value}]\n  }\n\n  if (node.meta) {\n    result.data = {meta: node.meta}\n  }\n\n  state.patch(node, result)\n  result = state.applyData(node, result)\n\n  // Create `<pre>`.\n  result = {type: 'element', tagName: 'pre', properties: {}, children: [result]}\n  state.patch(node, result)\n  return result\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('mdast').Delete} Delete\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `delete` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Delete} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function strikethrough(state, node) {\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'del',\n    properties: {},\n    children: state.all(node)\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('mdast').Emphasis} Emphasis\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `emphasis` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Emphasis} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function emphasis(state, node) {\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'em',\n    properties: {},\n    children: state.all(node)\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('mdast').FootnoteReference} FootnoteReference\n * @typedef {import('../state.js').State} State\n */\n\nimport {normalizeUri} from 'micromark-util-sanitize-uri'\n\n/**\n * Turn an mdast `footnoteReference` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {FootnoteReference} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function footnoteReference(state, node) {\n  const clobberPrefix =\n    typeof state.options.clobberPrefix === 'string'\n      ? state.options.clobberPrefix\n      : 'user-content-'\n  const id = String(node.identifier).toUpperCase()\n  const safeId = normalizeUri(id.toLowerCase())\n  const index = state.footnoteOrder.indexOf(id)\n  /** @type {number} */\n  let counter\n\n  let reuseCounter = state.footnoteCounts.get(id)\n\n  if (reuseCounter === undefined) {\n    reuseCounter = 0\n    state.footnoteOrder.push(id)\n    counter = state.footnoteOrder.length\n  } else {\n    counter = index + 1\n  }\n\n  reuseCounter += 1\n  state.footnoteCounts.set(id, reuseCounter)\n\n  /** @type {Element} */\n  const link = {\n    type: 'element',\n    tagName: 'a',\n    properties: {\n      href: '#' + clobberPrefix + 'fn-' + safeId,\n      id:\n        clobberPrefix +\n        'fnref-' +\n        safeId +\n        (reuseCounter > 1 ? '-' + reuseCounter : ''),\n      dataFootnoteRef: true,\n      ariaDescribedBy: ['footnote-label']\n    },\n    children: [{type: 'text', value: String(counter)}]\n  }\n  state.patch(node, link)\n\n  /** @type {Element} */\n  const sup = {\n    type: 'element',\n    tagName: 'sup',\n    properties: {},\n    children: [link]\n  }\n  state.patch(node, sup)\n  return state.applyData(node, sup)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('mdast').Heading} Heading\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `heading` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Heading} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function heading(state, node) {\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'h' + node.depth,\n    properties: {},\n    children: state.all(node)\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('mdast').Html} Html\n * @typedef {import('../state.js').State} State\n * @typedef {import('../../index.js').Raw} Raw\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `html` node into hast (`raw` node in dangerous mode, otherwise\n * nothing).\n *\n * @param {State} state\n *   Info passed around.\n * @param {Html} node\n *   mdast node.\n * @returns {Element | Raw | undefined}\n *   hast node.\n */\nexport function html(state, node) {\n  if (state.options.allowDangerousHtml) {\n    /** @type {Raw} */\n    const result = {type: 'raw', value: node.value}\n    state.patch(node, result)\n    return state.applyData(node, result)\n  }\n\n  return undefined\n}\n", "/**\n * @typedef {import('hast').ElementContent} ElementContent\n *\n * @typedef {import('mdast').Nodes} Nodes\n * @typedef {import('mdast').Reference} Reference\n *\n * @typedef {import('./state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Return the content of a reference without definition as plain text.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Extract<Nodes, Reference>} node\n *   Reference node (image, link).\n * @returns {Array<ElementContent>}\n *   hast content.\n */\nexport function revert(state, node) {\n  const subtype = node.referenceType\n  let suffix = ']'\n\n  if (subtype === 'collapsed') {\n    suffix += '[]'\n  } else if (subtype === 'full') {\n    suffix += '[' + (node.label || node.identifier) + ']'\n  }\n\n  if (node.type === 'imageReference') {\n    return [{type: 'text', value: '![' + node.alt + suffix}]\n  }\n\n  const contents = state.all(node)\n  const head = contents[0]\n\n  if (head && head.type === 'text') {\n    head.value = '[' + head.value\n  } else {\n    contents.unshift({type: 'text', value: '['})\n  }\n\n  const tail = contents[contents.length - 1]\n\n  if (tail && tail.type === 'text') {\n    tail.value += suffix\n  } else {\n    contents.push({type: 'text', value: suffix})\n  }\n\n  return contents\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').ElementContent} ElementContent\n * @typedef {import('hast').Properties} Properties\n * @typedef {import('mdast').ImageReference} ImageReference\n * @typedef {import('../state.js').State} State\n */\n\nimport {normalizeUri} from 'micromark-util-sanitize-uri'\nimport {revert} from '../revert.js'\n\n/**\n * Turn an mdast `imageReference` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {ImageReference} node\n *   mdast node.\n * @returns {Array<ElementContent> | ElementContent}\n *   hast node.\n */\nexport function imageReference(state, node) {\n  const id = String(node.identifier).toUpperCase()\n  const definition = state.definitionById.get(id)\n\n  if (!definition) {\n    return revert(state, node)\n  }\n\n  /** @type {Properties} */\n  const properties = {src: normalizeUri(definition.url || ''), alt: node.alt}\n\n  if (definition.title !== null && definition.title !== undefined) {\n    properties.title = definition.title\n  }\n\n  /** @type {Element} */\n  const result = {type: 'element', tagName: 'img', properties, children: []}\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').Properties} Properties\n * @typedef {import('mdast').Image} Image\n * @typedef {import('../state.js').State} State\n */\n\nimport {normalizeUri} from 'micromark-util-sanitize-uri'\n\n/**\n * Turn an mdast `image` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Image} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function image(state, node) {\n  /** @type {Properties} */\n  const properties = {src: normalizeUri(node.url)}\n\n  if (node.alt !== null && node.alt !== undefined) {\n    properties.alt = node.alt\n  }\n\n  if (node.title !== null && node.title !== undefined) {\n    properties.title = node.title\n  }\n\n  /** @type {Element} */\n  const result = {type: 'element', tagName: 'img', properties, children: []}\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').Text} Text\n * @typedef {import('mdast').InlineCode} InlineCode\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `inlineCode` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {InlineCode} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function inlineCode(state, node) {\n  /** @type {Text} */\n  const text = {type: 'text', value: node.value.replace(/\\r?\\n|\\r/g, ' ')}\n  state.patch(node, text)\n\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'code',\n    properties: {},\n    children: [text]\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').ElementContent} ElementContent\n * @typedef {import('hast').Properties} Properties\n * @typedef {import('mdast').LinkReference} LinkReference\n * @typedef {import('../state.js').State} State\n */\n\nimport {normalizeUri} from 'micromark-util-sanitize-uri'\nimport {revert} from '../revert.js'\n\n/**\n * Turn an mdast `linkReference` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {LinkReference} node\n *   mdast node.\n * @returns {Array<ElementContent> | ElementContent}\n *   hast node.\n */\nexport function linkReference(state, node) {\n  const id = String(node.identifier).toUpperCase()\n  const definition = state.definitionById.get(id)\n\n  if (!definition) {\n    return revert(state, node)\n  }\n\n  /** @type {Properties} */\n  const properties = {href: normalizeUri(definition.url || '')}\n\n  if (definition.title !== null && definition.title !== undefined) {\n    properties.title = definition.title\n  }\n\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'a',\n    properties,\n    children: state.all(node)\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').Properties} Properties\n * @typedef {import('mdast').Link} Link\n * @typedef {import('../state.js').State} State\n */\n\nimport {normalizeUri} from 'micromark-util-sanitize-uri'\n\n/**\n * Turn an mdast `link` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Link} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function link(state, node) {\n  /** @type {Properties} */\n  const properties = {href: normalizeUri(node.url)}\n\n  if (node.title !== null && node.title !== undefined) {\n    properties.title = node.title\n  }\n\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'a',\n    properties,\n    children: state.all(node)\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').ElementContent} ElementContent\n * @typedef {import('hast').Properties} Properties\n * @typedef {import('mdast').ListItem} ListItem\n * @typedef {import('mdast').Parents} Parents\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `listItem` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {ListItem} node\n *   mdast node.\n * @param {Parents | undefined} parent\n *   Parent of `node`.\n * @returns {Element}\n *   hast node.\n */\nexport function listItem(state, node, parent) {\n  const results = state.all(node)\n  const loose = parent ? listLoose(parent) : listItemLoose(node)\n  /** @type {Properties} */\n  const properties = {}\n  /** @type {Array<ElementContent>} */\n  const children = []\n\n  if (typeof node.checked === 'boolean') {\n    const head = results[0]\n    /** @type {Element} */\n    let paragraph\n\n    if (head && head.type === 'element' && head.tagName === 'p') {\n      paragraph = head\n    } else {\n      paragraph = {type: 'element', tagName: 'p', properties: {}, children: []}\n      results.unshift(paragraph)\n    }\n\n    if (paragraph.children.length > 0) {\n      paragraph.children.unshift({type: 'text', value: ' '})\n    }\n\n    paragraph.children.unshift({\n      type: 'element',\n      tagName: 'input',\n      properties: {type: 'checkbox', checked: node.checked, disabled: true},\n      children: []\n    })\n\n    // According to github-markdown-css, this class hides bullet.\n    // See: <https://github.com/sindresorhus/github-markdown-css>.\n    properties.className = ['task-list-item']\n  }\n\n  let index = -1\n\n  while (++index < results.length) {\n    const child = results[index]\n\n    // Add eols before nodes, except if this is a loose, first paragraph.\n    if (\n      loose ||\n      index !== 0 ||\n      child.type !== 'element' ||\n      child.tagName !== 'p'\n    ) {\n      children.push({type: 'text', value: '\\n'})\n    }\n\n    if (child.type === 'element' && child.tagName === 'p' && !loose) {\n      children.push(...child.children)\n    } else {\n      children.push(child)\n    }\n  }\n\n  const tail = results[results.length - 1]\n\n  // Add a final eol.\n  if (tail && (loose || tail.type !== 'element' || tail.tagName !== 'p')) {\n    children.push({type: 'text', value: '\\n'})\n  }\n\n  /** @type {Element} */\n  const result = {type: 'element', tagName: 'li', properties, children}\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n\n/**\n * @param {Parents} node\n * @return {Boolean}\n */\nfunction listLoose(node) {\n  let loose = false\n  if (node.type === 'list') {\n    loose = node.spread || false\n    const children = node.children\n    let index = -1\n\n    while (!loose && ++index < children.length) {\n      loose = listItemLoose(children[index])\n    }\n  }\n\n  return loose\n}\n\n/**\n * @param {ListItem} node\n * @return {Boolean}\n */\nfunction listItemLoose(node) {\n  const spread = node.spread\n\n  return spread === null || spread === undefined\n    ? node.children.length > 1\n    : spread\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').Properties} Properties\n * @typedef {import('mdast').List} List\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `list` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {List} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function list(state, node) {\n  /** @type {Properties} */\n  const properties = {}\n  const results = state.all(node)\n  let index = -1\n\n  if (typeof node.start === 'number' && node.start !== 1) {\n    properties.start = node.start\n  }\n\n  // Like GitHub, add a class for custom styling.\n  while (++index < results.length) {\n    const child = results[index]\n\n    if (\n      child.type === 'element' &&\n      child.tagName === 'li' &&\n      child.properties &&\n      Array.isArray(child.properties.className) &&\n      child.properties.className.includes('task-list-item')\n    ) {\n      properties.className = ['contains-task-list']\n      break\n    }\n  }\n\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: node.ordered ? 'ol' : 'ul',\n    properties,\n    children: state.wrap(results, true)\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('mdast').Paragraph} Paragraph\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `paragraph` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Paragraph} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function paragraph(state, node) {\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'p',\n    properties: {},\n    children: state.all(node)\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Parents} HastParents\n * @typedef {import('hast').Root} HastRoot\n * @typedef {import('mdast').Root} MdastRoot\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `root` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {MdastRoot} node\n *   mdast node.\n * @returns {HastParents}\n *   hast node.\n */\nexport function root(state, node) {\n  /** @type {HastRoot} */\n  const result = {type: 'root', children: state.wrap(state.all(node))}\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('mdast').Strong} Strong\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `strong` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Strong} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function strong(state, node) {\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'strong',\n    properties: {},\n    children: state.all(node)\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('mdast').Table} Table\n * @typedef {import('../state.js').State} State\n */\n\nimport {pointEnd, pointStart} from 'unist-util-position'\n\n/**\n * Turn an mdast `table` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {Table} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function table(state, node) {\n  const rows = state.all(node)\n  const firstRow = rows.shift()\n  /** @type {Array<Element>} */\n  const tableContent = []\n\n  if (firstRow) {\n    /** @type {Element} */\n    const head = {\n      type: 'element',\n      tagName: 'thead',\n      properties: {},\n      children: state.wrap([firstRow], true)\n    }\n    state.patch(node.children[0], head)\n    tableContent.push(head)\n  }\n\n  if (rows.length > 0) {\n    /** @type {Element} */\n    const body = {\n      type: 'element',\n      tagName: 'tbody',\n      properties: {},\n      children: state.wrap(rows, true)\n    }\n\n    const start = pointStart(node.children[1])\n    const end = pointEnd(node.children[node.children.length - 1])\n    if (start && end) body.position = {start, end}\n    tableContent.push(body)\n  }\n\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'table',\n    properties: {},\n    children: state.wrap(tableContent, true)\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').ElementContent} ElementContent\n * @typedef {import('hast').Properties} Properties\n * @typedef {import('mdast').Parents} Parents\n * @typedef {import('mdast').TableRow} TableRow\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `tableRow` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {TableRow} node\n *   mdast node.\n * @param {Parents | undefined} parent\n *   Parent of `node`.\n * @returns {Element}\n *   hast node.\n */\nexport function tableRow(state, node, parent) {\n  const siblings = parent ? parent.children : undefined\n  // Generate a body row when without parent.\n  const rowIndex = siblings ? siblings.indexOf(node) : 1\n  const tagName = rowIndex === 0 ? 'th' : 'td'\n  // To do: option to use `style`?\n  const align = parent && parent.type === 'table' ? parent.align : undefined\n  const length = align ? align.length : node.children.length\n  let cellIndex = -1\n  /** @type {Array<ElementContent>} */\n  const cells = []\n\n  while (++cellIndex < length) {\n    // Note: can also be undefined.\n    const cell = node.children[cellIndex]\n    /** @type {Properties} */\n    const properties = {}\n    const alignValue = align ? align[cellIndex] : undefined\n\n    if (alignValue) {\n      properties.align = alignValue\n    }\n\n    /** @type {Element} */\n    let result = {type: 'element', tagName, properties, children: []}\n\n    if (cell) {\n      result.children = state.all(cell)\n      state.patch(cell, result)\n      result = state.applyData(cell, result)\n    }\n\n    cells.push(result)\n  }\n\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'tr',\n    properties: {},\n    children: state.wrap(cells, true)\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('mdast').TableCell} TableCell\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `tableCell` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {TableCell} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function tableCell(state, node) {\n  // Note: this function is normally not called: see `table-row` for how rows\n  // and their cells are compiled.\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'td', // Assume body cell.\n    properties: {},\n    children: state.all(node)\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "const tab = 9 /* `\\t` */\nconst space = 32 /* ` ` */\n\n/**\n * Remove initial and final spaces and tabs at the line breaks in `value`.\n * Does not trim initial and final spaces and tabs of the value itself.\n *\n * @param {string} value\n *   Value to trim.\n * @returns {string}\n *   Trimmed value.\n */\nexport function trimLines(value) {\n  const source = String(value)\n  const search = /\\r?\\n|\\r/g\n  let match = search.exec(source)\n  let last = 0\n  /** @type {Array<string>} */\n  const lines = []\n\n  while (match) {\n    lines.push(\n      trimLine(source.slice(last, match.index), last > 0, true),\n      match[0]\n    )\n\n    last = match.index + match[0].length\n    match = search.exec(source)\n  }\n\n  lines.push(trimLine(source.slice(last), last > 0, false))\n\n  return lines.join('')\n}\n\n/**\n * @param {string} value\n *   Line to trim.\n * @param {boolean} start\n *   Whether to trim the start of the line.\n * @param {boolean} end\n *   Whether to trim the end of the line.\n * @returns {string}\n *   Trimmed line.\n */\nfunction trimLine(value, start, end) {\n  let startIndex = 0\n  let endIndex = value.length\n\n  if (start) {\n    let code = value.codePointAt(startIndex)\n\n    while (code === tab || code === space) {\n      startIndex++\n      code = value.codePointAt(startIndex)\n    }\n  }\n\n  if (end) {\n    let code = value.codePointAt(endIndex - 1)\n\n    while (code === tab || code === space) {\n      endIndex--\n      code = value.codePointAt(endIndex - 1)\n    }\n  }\n\n  return endIndex > startIndex ? value.slice(startIndex, endIndex) : ''\n}\n", "/**\n * @typedef {import('hast').Element} HastElement\n * @typedef {import('hast').Text} HastText\n * @typedef {import('mdast').Text} MdastText\n * @typedef {import('../state.js').State} State\n */\n\nimport {trimLines} from 'trim-lines'\n\n/**\n * Turn an mdast `text` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {MdastText} node\n *   mdast node.\n * @returns {HastElement | HastText}\n *   hast node.\n */\nexport function text(state, node) {\n  /** @type {HastText} */\n  const result = {type: 'text', value: trimLines(String(node.value))}\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('mdast').ThematicBreak} ThematicBreak\n * @typedef {import('../state.js').State} State\n */\n\n// Make VS Code show references to the above types.\n''\n\n/**\n * Turn an mdast `thematicBreak` node into hast.\n *\n * @param {State} state\n *   Info passed around.\n * @param {ThematicBreak} node\n *   mdast node.\n * @returns {Element}\n *   hast node.\n */\nexport function thematicBreak(state, node) {\n  /** @type {Element} */\n  const result = {\n    type: 'element',\n    tagName: 'hr',\n    properties: {},\n    children: []\n  }\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n", "import {blockquote} from './blockquote.js'\nimport {hardBreak} from './break.js'\nimport {code} from './code.js'\nimport {strikethrough} from './delete.js'\nimport {emphasis} from './emphasis.js'\nimport {footnoteReference} from './footnote-reference.js'\nimport {heading} from './heading.js'\nimport {html} from './html.js'\nimport {imageReference} from './image-reference.js'\nimport {image} from './image.js'\nimport {inlineCode} from './inline-code.js'\nimport {linkReference} from './link-reference.js'\nimport {link} from './link.js'\nimport {listItem} from './list-item.js'\nimport {list} from './list.js'\nimport {paragraph} from './paragraph.js'\nimport {root} from './root.js'\nimport {strong} from './strong.js'\nimport {table} from './table.js'\nimport {tableRow} from './table-row.js'\nimport {tableCell} from './table-cell.js'\nimport {text} from './text.js'\nimport {thematicBreak} from './thematic-break.js'\n\n/**\n * Default handlers for nodes.\n *\n * @satisfies {import('../state.js').Handlers}\n */\nexport const handlers = {\n  blockquote,\n  break: hardBreak,\n  code,\n  delete: strikethrough,\n  emphasis,\n  footnoteReference,\n  heading,\n  html,\n  imageReference,\n  image,\n  inlineCode,\n  linkReference,\n  link,\n  listItem,\n  list,\n  paragraph,\n  // @ts-expect-error: root is different, but hard to type.\n  root,\n  strong,\n  table,\n  tableCell,\n  tableRow,\n  text,\n  thematicBreak,\n  toml: ignore,\n  yaml: ignore,\n  definition: ignore,\n  footnoteDefinition: ignore\n}\n\n// Return nothing for nodes that are ignored.\nfunction ignore() {\n  return undefined\n}\n", "export const VOID       = -1;\nexport const PRIMITIVE  = 0;\nexport const ARRAY      = 1;\nexport const OBJECT     = 2;\nexport const DATE       = 3;\nexport const REGEXP     = 4;\nexport const MAP        = 5;\nexport const SET        = 6;\nexport const ERROR      = 7;\nexport const BIGINT     = 8;\n// export const SYMBOL = 9;\n", "import {\n  VOID, PRIMITIVE,\n  ARRAY, OBJECT,\n  DATE, REGEXP, MAP, SET,\n  ERROR, BIGINT\n} from './types.js';\n\nconst env = typeof self === 'object' ? self : globalThis;\n\nconst deserializer = ($, _) => {\n  const as = (out, index) => {\n    $.set(index, out);\n    return out;\n  };\n\n  const unpair = index => {\n    if ($.has(index))\n      return $.get(index);\n\n    const [type, value] = _[index];\n    switch (type) {\n      case PRIMITIVE:\n      case VOID:\n        return as(value, index);\n      case ARRAY: {\n        const arr = as([], index);\n        for (const index of value)\n          arr.push(unpair(index));\n        return arr;\n      }\n      case OBJECT: {\n        const object = as({}, index);\n        for (const [key, index] of value)\n          object[unpair(key)] = unpair(index);\n        return object;\n      }\n      case DATE:\n        return as(new Date(value), index);\n      case REGEXP: {\n        const {source, flags} = value;\n        return as(new RegExp(source, flags), index);\n      }\n      case MAP: {\n        const map = as(new Map, index);\n        for (const [key, index] of value)\n          map.set(unpair(key), unpair(index));\n        return map;\n      }\n      case SET: {\n        const set = as(new Set, index);\n        for (const index of value)\n          set.add(unpair(index));\n        return set;\n      }\n      case ERROR: {\n        const {name, message} = value;\n        return as(new env[name](message), index);\n      }\n      case BIGINT:\n        return as(BigInt(value), index);\n      case 'BigInt':\n        return as(Object(BigInt(value)), index);\n      case 'ArrayBuffer':\n        return as(new Uint8Array(value).buffer, value);\n      case 'DataView': {\n        const { buffer } = new Uint8Array(value);\n        return as(new DataView(buffer), value);\n      }\n    }\n    return as(new env[type](value), index);\n  };\n\n  return unpair;\n};\n\n/**\n * @typedef {Array<string,any>} Record a type representation\n */\n\n/**\n * Returns a deserialized value from a serialized array of Records.\n * @param {Record[]} serialized a previously serialized value.\n * @returns {any}\n */\nexport const deserialize = serialized => deserializer(new Map, serialized)(0);\n", "import {\n  VOID, PRIMITIVE,\n  ARRAY, OBJECT,\n  DATE, REGEXP, MAP, SET,\n  ERROR, BIGINT\n} from './types.js';\n\nconst EMPTY = '';\n\nconst {toString} = {};\nconst {keys} = Object;\n\nconst typeOf = value => {\n  const type = typeof value;\n  if (type !== 'object' || !value)\n    return [PRIMITIVE, type];\n\n  const asString = toString.call(value).slice(8, -1);\n  switch (asString) {\n    case 'Array':\n      return [ARRAY, EMPTY];\n    case 'Object':\n      return [OBJECT, EMPTY];\n    case 'Date':\n      return [DATE, EMPTY];\n    case 'RegExp':\n      return [REGEXP, EMPTY];\n    case 'Map':\n      return [MAP, EMPTY];\n    case 'Set':\n      return [SET, EMPTY];\n    case 'DataView':\n      return [ARRAY, asString];\n  }\n\n  if (asString.includes('Array'))\n    return [ARRAY, asString];\n\n  if (asString.includes('Error'))\n    return [ERROR, asString];\n\n  return [OBJECT, asString];\n};\n\nconst shouldSkip = ([TYPE, type]) => (\n  TYPE === PRIMITIVE &&\n  (type === 'function' || type === 'symbol')\n);\n\nconst serializer = (strict, json, $, _) => {\n\n  const as = (out, value) => {\n    const index = _.push(out) - 1;\n    $.set(value, index);\n    return index;\n  };\n\n  const pair = value => {\n    if ($.has(value))\n      return $.get(value);\n\n    let [TYPE, type] = typeOf(value);\n    switch (TYPE) {\n      case PRIMITIVE: {\n        let entry = value;\n        switch (type) {\n          case 'bigint':\n            TYPE = BIGINT;\n            entry = value.toString();\n            break;\n          case 'function':\n          case 'symbol':\n            if (strict)\n              throw new TypeError('unable to serialize ' + type);\n            entry = null;\n            break;\n          case 'undefined':\n            return as([VOID], value);\n        }\n        return as([TYPE, entry], value);\n      }\n      case ARRAY: {\n        if (type) {\n          let spread = value;\n          if (type === 'DataView') {\n            spread = new Uint8Array(value.buffer);\n          }\n          else if (type === 'ArrayBuffer') {\n            spread = new Uint8Array(value);\n          }\n          return as([type, [...spread]], value);\n        }\n\n        const arr = [];\n        const index = as([TYPE, arr], value);\n        for (const entry of value)\n          arr.push(pair(entry));\n        return index;\n      }\n      case OBJECT: {\n        if (type) {\n          switch (type) {\n            case 'BigInt':\n              return as([type, value.toString()], value);\n            case 'Boolean':\n            case 'Number':\n            case 'String':\n              return as([type, value.valueOf()], value);\n          }\n        }\n\n        if (json && ('toJSON' in value))\n          return pair(value.toJSON());\n\n        const entries = [];\n        const index = as([TYPE, entries], value);\n        for (const key of keys(value)) {\n          if (strict || !shouldSkip(typeOf(value[key])))\n            entries.push([pair(key), pair(value[key])]);\n        }\n        return index;\n      }\n      case DATE:\n        return as([TYPE, value.toISOString()], value);\n      case REGEXP: {\n        const {source, flags} = value;\n        return as([TYPE, {source, flags}], value);\n      }\n      case MAP: {\n        const entries = [];\n        const index = as([TYPE, entries], value);\n        for (const [key, entry] of value) {\n          if (strict || !(shouldSkip(typeOf(key)) || shouldSkip(typeOf(entry))))\n            entries.push([pair(key), pair(entry)]);\n        }\n        return index;\n      }\n      case SET: {\n        const entries = [];\n        const index = as([TYPE, entries], value);\n        for (const entry of value) {\n          if (strict || !shouldSkip(typeOf(entry)))\n            entries.push(pair(entry));\n        }\n        return index;\n      }\n    }\n\n    const {message} = value;\n    return as([TYPE, {name: type, message}], value);\n  };\n\n  return pair;\n};\n\n/**\n * @typedef {Array<string,any>} Record a type representation\n */\n\n/**\n * Returns an array of serialized Records.\n * @param {any} value a serializable value.\n * @param {{json?: boolean, lossy?: boolean}?} options an object with a `lossy` or `json` property that,\n *  if `true`, will not throw errors on incompatible types, and behave more\n *  like JSON stringify would behave. Symbol and Function will be discarded.\n * @returns {Record[]}\n */\n export const serialize = (value, {json, lossy} = {}) => {\n  const _ = [];\n  return serializer(!(json || lossy), !!json, new Map, _)(value), _;\n};\n", "import {deserialize} from './deserialize.js';\nimport {serialize} from './serialize.js';\n\n/**\n * @typedef {Array<string,any>} Record a type representation\n */\n\n/**\n * Returns an array of serialized Records.\n * @param {any} any a serializable value.\n * @param {{transfer?: any[], json?: boolean, lossy?: boolean}?} options an object with\n * a transfer option (ignored when polyfilled) and/or non standard fields that\n * fallback to the polyfill if present.\n * @returns {Record[]}\n */\nexport default typeof structuredClone === \"function\" ?\n  /* c8 ignore start */\n  (any, options) => (\n    options && ('json' in options || 'lossy' in options) ?\n      deserialize(serialize(any, options)) : structuredClone(any)\n  ) :\n  (any, options) => deserialize(serialize(any, options));\n  /* c8 ignore stop */\n\nexport {deserialize, serialize};\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').ElementContent} ElementContent\n *\n * @typedef {import('./state.js').State} State\n */\n\n/**\n * @callback FootnoteBackContentTemplate\n *   Generate content for the backreference dynamically.\n *\n *   For the following markdown:\n *\n *   ```markdown\n *   Alpha[^micromark], bravo[^micromark], and charlie[^remark].\n *\n *   [^remark]: things about remark\n *   [^micromark]: things about micromark\n *   ```\n *\n *   This function will be called with:\n *\n *   *  `0` and `0` for the backreference from `things about micromark` to\n *      `alpha`, as it is the first used definition, and the first call to it\n *   *  `0` and `1` for the backreference from `things about micromark` to\n *      `bravo`, as it is the first used definition, and the second call to it\n *   *  `1` and `0` for the backreference from `things about remark` to\n *      `charlie`, as it is the second used definition\n * @param {number} referenceIndex\n *   Index of the definition in the order that they are first referenced,\n *   0-indexed.\n * @param {number} rereferenceIndex\n *   Index of calls to the same definition, 0-indexed.\n * @returns {Array<ElementContent> | ElementContent | string}\n *   Content for the backreference when linking back from definitions to their\n *   reference.\n *\n * @callback FootnoteBackLabelTemplate\n *   Generate a back label dynamically.\n *\n *   For the following markdown:\n *\n *   ```markdown\n *   Alpha[^micromark], bravo[^micromark], and charlie[^remark].\n *\n *   [^remark]: things about remark\n *   [^micromark]: things about micromark\n *   ```\n *\n *   This function will be called with:\n *\n *   *  `0` and `0` for the backreference from `things about micromark` to\n *      `alpha`, as it is the first used definition, and the first call to it\n *   *  `0` and `1` for the backreference from `things about micromark` to\n *      `bravo`, as it is the first used definition, and the second call to it\n *   *  `1` and `0` for the backreference from `things about remark` to\n *      `charlie`, as it is the second used definition\n * @param {number} referenceIndex\n *   Index of the definition in the order that they are first referenced,\n *   0-indexed.\n * @param {number} rereferenceIndex\n *   Index of calls to the same definition, 0-indexed.\n * @returns {string}\n *   Back label to use when linking back from definitions to their reference.\n */\n\nimport structuredClone from '@ungap/structured-clone'\nimport {normalizeUri} from 'micromark-util-sanitize-uri'\n\n/**\n * Generate the default content that GitHub uses on backreferences.\n *\n * @param {number} _\n *   Index of the definition in the order that they are first referenced,\n *   0-indexed.\n * @param {number} rereferenceIndex\n *   Index of calls to the same definition, 0-indexed.\n * @returns {Array<ElementContent>}\n *   Content.\n */\nexport function defaultFootnoteBackContent(_, rereferenceIndex) {\n  /** @type {Array<ElementContent>} */\n  const result = [{type: 'text', value: '\u21A9'}]\n\n  if (rereferenceIndex > 1) {\n    result.push({\n      type: 'element',\n      tagName: 'sup',\n      properties: {},\n      children: [{type: 'text', value: String(rereferenceIndex)}]\n    })\n  }\n\n  return result\n}\n\n/**\n * Generate the default label that GitHub uses on backreferences.\n *\n * @param {number} referenceIndex\n *   Index of the definition in the order that they are first referenced,\n *   0-indexed.\n * @param {number} rereferenceIndex\n *   Index of calls to the same definition, 0-indexed.\n * @returns {string}\n *   Label.\n */\nexport function defaultFootnoteBackLabel(referenceIndex, rereferenceIndex) {\n  return (\n    'Back to reference ' +\n    (referenceIndex + 1) +\n    (rereferenceIndex > 1 ? '-' + rereferenceIndex : '')\n  )\n}\n\n/**\n * Generate a hast footer for called footnote definitions.\n *\n * @param {State} state\n *   Info passed around.\n * @returns {Element | undefined}\n *   `section` element or `undefined`.\n */\n// eslint-disable-next-line complexity\nexport function footer(state) {\n  const clobberPrefix =\n    typeof state.options.clobberPrefix === 'string'\n      ? state.options.clobberPrefix\n      : 'user-content-'\n  const footnoteBackContent =\n    state.options.footnoteBackContent || defaultFootnoteBackContent\n  const footnoteBackLabel =\n    state.options.footnoteBackLabel || defaultFootnoteBackLabel\n  const footnoteLabel = state.options.footnoteLabel || 'Footnotes'\n  const footnoteLabelTagName = state.options.footnoteLabelTagName || 'h2'\n  const footnoteLabelProperties = state.options.footnoteLabelProperties || {\n    className: ['sr-only']\n  }\n  /** @type {Array<ElementContent>} */\n  const listItems = []\n  let referenceIndex = -1\n\n  while (++referenceIndex < state.footnoteOrder.length) {\n    const definition = state.footnoteById.get(\n      state.footnoteOrder[referenceIndex]\n    )\n\n    if (!definition) {\n      continue\n    }\n\n    const content = state.all(definition)\n    const id = String(definition.identifier).toUpperCase()\n    const safeId = normalizeUri(id.toLowerCase())\n    let rereferenceIndex = 0\n    /** @type {Array<ElementContent>} */\n    const backReferences = []\n    const counts = state.footnoteCounts.get(id)\n\n    // eslint-disable-next-line no-unmodified-loop-condition\n    while (counts !== undefined && ++rereferenceIndex <= counts) {\n      if (backReferences.length > 0) {\n        backReferences.push({type: 'text', value: ' '})\n      }\n\n      let children =\n        typeof footnoteBackContent === 'string'\n          ? footnoteBackContent\n          : footnoteBackContent(referenceIndex, rereferenceIndex)\n\n      if (typeof children === 'string') {\n        children = {type: 'text', value: children}\n      }\n\n      backReferences.push({\n        type: 'element',\n        tagName: 'a',\n        properties: {\n          href:\n            '#' +\n            clobberPrefix +\n            'fnref-' +\n            safeId +\n            (rereferenceIndex > 1 ? '-' + rereferenceIndex : ''),\n          dataFootnoteBackref: '',\n          ariaLabel:\n            typeof footnoteBackLabel === 'string'\n              ? footnoteBackLabel\n              : footnoteBackLabel(referenceIndex, rereferenceIndex),\n          className: ['data-footnote-backref']\n        },\n        children: Array.isArray(children) ? children : [children]\n      })\n    }\n\n    const tail = content[content.length - 1]\n\n    if (tail && tail.type === 'element' && tail.tagName === 'p') {\n      const tailTail = tail.children[tail.children.length - 1]\n      if (tailTail && tailTail.type === 'text') {\n        tailTail.value += ' '\n      } else {\n        tail.children.push({type: 'text', value: ' '})\n      }\n\n      tail.children.push(...backReferences)\n    } else {\n      content.push(...backReferences)\n    }\n\n    /** @type {Element} */\n    const listItem = {\n      type: 'element',\n      tagName: 'li',\n      properties: {id: clobberPrefix + 'fn-' + safeId},\n      children: state.wrap(content, true)\n    }\n\n    state.patch(definition, listItem)\n\n    listItems.push(listItem)\n  }\n\n  if (listItems.length === 0) {\n    return\n  }\n\n  return {\n    type: 'element',\n    tagName: 'section',\n    properties: {dataFootnotes: true, className: ['footnotes']},\n    children: [\n      {\n        type: 'element',\n        tagName: footnoteLabelTagName,\n        properties: {\n          ...structuredClone(footnoteLabelProperties),\n          id: 'footnote-label'\n        },\n        children: [{type: 'text', value: footnoteLabel}]\n      },\n      {type: 'text', value: '\\n'},\n      {\n        type: 'element',\n        tagName: 'ol',\n        properties: {},\n        children: state.wrap(listItems, true)\n      },\n      {type: 'text', value: '\\n'}\n    ]\n  }\n}\n", "/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n */\n\n/**\n * @template Fn\n * @template Fallback\n * @typedef {Fn extends (value: any) => value is infer Thing ? Thing : Fallback} Predicate\n */\n\n/**\n * @callback Check\n *   Check that an arbitrary value is a node.\n * @param {unknown} this\n *   The given context.\n * @param {unknown} [node]\n *   Anything (typically a node).\n * @param {number | null | undefined} [index]\n *   The node\u2019s position in its parent.\n * @param {Parent | null | undefined} [parent]\n *   The node\u2019s parent.\n * @returns {boolean}\n *   Whether this is a node and passes a test.\n *\n * @typedef {Record<string, unknown> | Node} Props\n *   Object to check for equivalence.\n *\n *   Note: `Node` is included as it is common but is not indexable.\n *\n * @typedef {Array<Props | TestFunction | string> | Props | TestFunction | string | null | undefined} Test\n *   Check for an arbitrary node.\n *\n * @callback TestFunction\n *   Check if a node passes a test.\n * @param {unknown} this\n *   The given context.\n * @param {Node} node\n *   A node.\n * @param {number | undefined} [index]\n *   The node\u2019s position in its parent.\n * @param {Parent | undefined} [parent]\n *   The node\u2019s parent.\n * @returns {boolean | undefined | void}\n *   Whether this node passes the test.\n *\n *   Note: `void` is included until TS sees no return as `undefined`.\n */\n\n/**\n * Check if `node` is a `Node` and whether it passes the given test.\n *\n * @param {unknown} node\n *   Thing to check, typically `Node`.\n * @param {Test} test\n *   A check for a specific node.\n * @param {number | null | undefined} index\n *   The node\u2019s position in its parent.\n * @param {Parent | null | undefined} parent\n *   The node\u2019s parent.\n * @param {unknown} context\n *   Context object (`this`) to pass to `test` functions.\n * @returns {boolean}\n *   Whether `node` is a node and passes a test.\n */\nexport const is =\n  // Note: overloads in JSDoc can\u2019t yet use different `@template`s.\n  /**\n   * @type {(\n   *   (<Condition extends string>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & {type: Condition}) &\n   *   (<Condition extends Props>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Condition) &\n   *   (<Condition extends TestFunction>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Predicate<Condition, Node>) &\n   *   ((node?: null | undefined) => false) &\n   *   ((node: unknown, test?: null | undefined, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node) &\n   *   ((node: unknown, test?: Test, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => boolean)\n   * )}\n   */\n  (\n    /**\n     * @param {unknown} [node]\n     * @param {Test} [test]\n     * @param {number | null | undefined} [index]\n     * @param {Parent | null | undefined} [parent]\n     * @param {unknown} [context]\n     * @returns {boolean}\n     */\n    // eslint-disable-next-line max-params\n    function (node, test, index, parent, context) {\n      const check = convert(test)\n\n      if (\n        index !== undefined &&\n        index !== null &&\n        (typeof index !== 'number' ||\n          index < 0 ||\n          index === Number.POSITIVE_INFINITY)\n      ) {\n        throw new Error('Expected positive finite index')\n      }\n\n      if (\n        parent !== undefined &&\n        parent !== null &&\n        (!is(parent) || !parent.children)\n      ) {\n        throw new Error('Expected parent node')\n      }\n\n      if (\n        (parent === undefined || parent === null) !==\n        (index === undefined || index === null)\n      ) {\n        throw new Error('Expected both parent and index')\n      }\n\n      return looksLikeANode(node)\n        ? check.call(context, node, index, parent)\n        : false\n    }\n  )\n\n/**\n * Generate an assertion from a test.\n *\n * Useful if you\u2019re going to test many nodes, for example when creating a\n * utility where something else passes a compatible test.\n *\n * The created function is a bit faster because it expects valid input only:\n * a `node`, `index`, and `parent`.\n *\n * @param {Test} test\n *   *   when nullish, checks if `node` is a `Node`.\n *   *   when `string`, works like passing `(node) => node.type === test`.\n *   *   when `function` checks if function passed the node is true.\n *   *   when `object`, checks that all keys in test are in node, and that they have (strictly) equal values.\n *   *   when `array`, checks if any one of the subtests pass.\n * @returns {Check}\n *   An assertion.\n */\nexport const convert =\n  // Note: overloads in JSDoc can\u2019t yet use different `@template`s.\n  /**\n   * @type {(\n   *   (<Condition extends string>(test: Condition) => (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & {type: Condition}) &\n   *   (<Condition extends Props>(test: Condition) => (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Condition) &\n   *   (<Condition extends TestFunction>(test: Condition) => (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Predicate<Condition, Node>) &\n   *   ((test?: null | undefined) => (node?: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node) &\n   *   ((test?: Test) => Check)\n   * )}\n   */\n  (\n    /**\n     * @param {Test} [test]\n     * @returns {Check}\n     */\n    function (test) {\n      if (test === null || test === undefined) {\n        return ok\n      }\n\n      if (typeof test === 'function') {\n        return castFactory(test)\n      }\n\n      if (typeof test === 'object') {\n        return Array.isArray(test) ? anyFactory(test) : propsFactory(test)\n      }\n\n      if (typeof test === 'string') {\n        return typeFactory(test)\n      }\n\n      throw new Error('Expected function, string, or object as test')\n    }\n  )\n\n/**\n * @param {Array<Props | TestFunction | string>} tests\n * @returns {Check}\n */\nfunction anyFactory(tests) {\n  /** @type {Array<Check>} */\n  const checks = []\n  let index = -1\n\n  while (++index < tests.length) {\n    checks[index] = convert(tests[index])\n  }\n\n  return castFactory(any)\n\n  /**\n   * @this {unknown}\n   * @type {TestFunction}\n   */\n  function any(...parameters) {\n    let index = -1\n\n    while (++index < checks.length) {\n      if (checks[index].apply(this, parameters)) return true\n    }\n\n    return false\n  }\n}\n\n/**\n * Turn an object into a test for a node with a certain fields.\n *\n * @param {Props} check\n * @returns {Check}\n */\nfunction propsFactory(check) {\n  const checkAsRecord = /** @type {Record<string, unknown>} */ (check)\n\n  return castFactory(all)\n\n  /**\n   * @param {Node} node\n   * @returns {boolean}\n   */\n  function all(node) {\n    const nodeAsRecord = /** @type {Record<string, unknown>} */ (\n      /** @type {unknown} */ (node)\n    )\n\n    /** @type {string} */\n    let key\n\n    for (key in check) {\n      if (nodeAsRecord[key] !== checkAsRecord[key]) return false\n    }\n\n    return true\n  }\n}\n\n/**\n * Turn a string into a test for a node with a certain type.\n *\n * @param {string} check\n * @returns {Check}\n */\nfunction typeFactory(check) {\n  return castFactory(type)\n\n  /**\n   * @param {Node} node\n   */\n  function type(node) {\n    return node && node.type === check\n  }\n}\n\n/**\n * Turn a custom test into a test for a node that passes that test.\n *\n * @param {TestFunction} testFunction\n * @returns {Check}\n */\nfunction castFactory(testFunction) {\n  return check\n\n  /**\n   * @this {unknown}\n   * @type {Check}\n   */\n  function check(value, index, parent) {\n    return Boolean(\n      looksLikeANode(value) &&\n        testFunction.call(\n          this,\n          value,\n          typeof index === 'number' ? index : undefined,\n          parent || undefined\n        )\n    )\n  }\n}\n\nfunction ok() {\n  return true\n}\n\n/**\n * @param {unknown} value\n * @returns {value is Node}\n */\nfunction looksLikeANode(value) {\n  return value !== null && typeof value === 'object' && 'type' in value\n}\n", "/**\n * @param {string} d\n * @returns {string}\n */\nexport function color(d) {\n  return '\\u001B[33m' + d + '\\u001B[39m'\n}\n", "/**\n * @typedef {import('unist').Node} UnistNode\n * @typedef {import('unist').Parent} UnistParent\n */\n\n/**\n * @typedef {Exclude<import('unist-util-is').Test, undefined> | undefined} Test\n *   Test from `unist-util-is`.\n *\n *   Note: we have remove and add `undefined`, because otherwise when generating\n *   automatic `.d.ts` files, TS tries to flatten paths from a local perspective,\n *   which doesn\u2019t work when publishing on npm.\n */\n\n/**\n * @typedef {(\n *   Fn extends (value: any) => value is infer Thing\n *   ? Thing\n *   : Fallback\n * )} Predicate\n *   Get the value of a type guard `Fn`.\n * @template Fn\n *   Value; typically function that is a type guard (such as `(x): x is Y`).\n * @template Fallback\n *   Value to yield if `Fn` is not a type guard.\n */\n\n/**\n * @typedef {(\n *   Check extends null | undefined // No test.\n *   ? Value\n *   : Value extends {type: Check} // String (type) test.\n *   ? Value\n *   : Value extends Check // Partial test.\n *   ? Value\n *   : Check extends Function // Function test.\n *   ? Predicate<Check, Value> extends Value\n *     ? Predicate<Check, Value>\n *     : never\n *   : never // Some other test?\n * )} MatchesOne\n *   Check whether a node matches a primitive check in the type system.\n * @template Value\n *   Value; typically unist `Node`.\n * @template Check\n *   Value; typically `unist-util-is`-compatible test, but not arrays.\n */\n\n/**\n * @typedef {(\n *   Check extends Array<any>\n *   ? MatchesOne<Value, Check[keyof Check]>\n *   : MatchesOne<Value, Check>\n * )} Matches\n *   Check whether a node matches a check in the type system.\n * @template Value\n *   Value; typically unist `Node`.\n * @template Check\n *   Value; typically `unist-util-is`-compatible test.\n */\n\n/**\n * @typedef {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10} Uint\n *   Number; capped reasonably.\n */\n\n/**\n * @typedef {I extends 0 ? 1 : I extends 1 ? 2 : I extends 2 ? 3 : I extends 3 ? 4 : I extends 4 ? 5 : I extends 5 ? 6 : I extends 6 ? 7 : I extends 7 ? 8 : I extends 8 ? 9 : 10} Increment\n *   Increment a number in the type system.\n * @template {Uint} [I=0]\n *   Index.\n */\n\n/**\n * @typedef {(\n *   Node extends UnistParent\n *   ? Node extends {children: Array<infer Children>}\n *     ? Child extends Children ? Node : never\n *     : never\n *   : never\n * )} InternalParent\n *   Collect nodes that can be parents of `Child`.\n * @template {UnistNode} Node\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n */\n\n/**\n * @typedef {InternalParent<InclusiveDescendant<Tree>, Child>} Parent\n *   Collect nodes in `Tree` that can be parents of `Child`.\n * @template {UnistNode} Tree\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n */\n\n/**\n * @typedef {(\n *   Depth extends Max\n *   ? never\n *   :\n *     | InternalParent<Node, Child>\n *     | InternalAncestor<Node, InternalParent<Node, Child>, Max, Increment<Depth>>\n * )} InternalAncestor\n *   Collect nodes in `Tree` that can be ancestors of `Child`.\n * @template {UnistNode} Node\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n * @template {Uint} [Max=10]\n *   Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n *   Current depth.\n */\n\n/**\n * @typedef {InternalAncestor<InclusiveDescendant<Tree>, Child>} Ancestor\n *   Collect nodes in `Tree` that can be ancestors of `Child`.\n * @template {UnistNode} Tree\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n */\n\n/**\n * @typedef {(\n *   Tree extends UnistParent\n *     ? Depth extends Max\n *       ? Tree\n *       : Tree | InclusiveDescendant<Tree['children'][number], Max, Increment<Depth>>\n *     : Tree\n * )} InclusiveDescendant\n *   Collect all (inclusive) descendants of `Tree`.\n *\n *   > \uD83D\uDC49 **Note**: for performance reasons, this seems to be the fastest way to\n *   > recurse without actually running into an infinite loop, which the\n *   > previous version did.\n *   >\n *   > Practically, a max of `2` is typically enough assuming a `Root` is\n *   > passed, but it doesn\u2019t improve performance.\n *   > It gets higher with `List > ListItem > Table > TableRow > TableCell`.\n *   > Using up to `10` doesn\u2019t hurt or help either.\n * @template {UnistNode} Tree\n *   Tree type.\n * @template {Uint} [Max=10]\n *   Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n *   Current depth.\n */\n\n/**\n * @typedef {'skip' | boolean} Action\n *   Union of the action types.\n *\n * @typedef {number} Index\n *   Move to the sibling at `index` next (after node itself is completely\n *   traversed).\n *\n *   Useful if mutating the tree, such as removing the node the visitor is\n *   currently on, or any of its previous siblings.\n *   Results less than 0 or greater than or equal to `children.length` stop\n *   traversing the parent.\n *\n * @typedef {[(Action | null | undefined | void)?, (Index | null | undefined)?]} ActionTuple\n *   List with one or two values, the first an action, the second an index.\n *\n * @typedef {Action | ActionTuple | Index | null | undefined | void} VisitorResult\n *   Any value that can be returned from a visitor.\n */\n\n/**\n * @callback Visitor\n *   Handle a node (matching `test`, if given).\n *\n *   Visitors are free to transform `node`.\n *   They can also transform the parent of node (the last of `ancestors`).\n *\n *   Replacing `node` itself, if `SKIP` is not returned, still causes its\n *   descendants to be walked (which is a bug).\n *\n *   When adding or removing previous siblings of `node` (or next siblings, in\n *   case of reverse), the `Visitor` should return a new `Index` to specify the\n *   sibling to traverse after `node` is traversed.\n *   Adding or removing next siblings of `node` (or previous siblings, in case\n *   of reverse) is handled as expected without needing to return a new `Index`.\n *\n *   Removing the children property of an ancestor still results in them being\n *   traversed.\n * @param {Visited} node\n *   Found node.\n * @param {Array<VisitedParents>} ancestors\n *   Ancestors of `node`.\n * @returns {VisitorResult}\n *   What to do next.\n *\n *   An `Index` is treated as a tuple of `[CONTINUE, Index]`.\n *   An `Action` is treated as a tuple of `[Action]`.\n *\n *   Passing a tuple back only makes sense if the `Action` is `SKIP`.\n *   When the `Action` is `EXIT`, that action can be returned.\n *   When the `Action` is `CONTINUE`, `Index` can be returned.\n * @template {UnistNode} [Visited=UnistNode]\n *   Visited node type.\n * @template {UnistParent} [VisitedParents=UnistParent]\n *   Ancestor type.\n */\n\n/**\n * @typedef {Visitor<Matches<InclusiveDescendant<Tree>, Check>, Ancestor<Tree, Matches<InclusiveDescendant<Tree>, Check>>>} BuildVisitor\n *   Build a typed `Visitor` function from a tree and a test.\n *\n *   It will infer which values are passed as `node` and which as `parents`.\n * @template {UnistNode} [Tree=UnistNode]\n *   Tree type.\n * @template {Test} [Check=Test]\n *   Test type.\n */\n\nimport {convert} from 'unist-util-is'\nimport {color} from 'unist-util-visit-parents/do-not-use-color'\n\n/** @type {Readonly<ActionTuple>} */\nconst empty = []\n\n/**\n * Continue traversing as normal.\n */\nexport const CONTINUE = true\n\n/**\n * Stop traversing immediately.\n */\nexport const EXIT = false\n\n/**\n * Do not traverse this node\u2019s children.\n */\nexport const SKIP = 'skip'\n\n/**\n * Visit nodes, with ancestral information.\n *\n * This algorithm performs *depth-first* *tree traversal* in *preorder*\n * (**NLR**) or if `reverse` is given, in *reverse preorder* (**NRL**).\n *\n * You can choose for which nodes `visitor` is called by passing a `test`.\n * For complex tests, you should test yourself in `visitor`, as it will be\n * faster and will have improved type information.\n *\n * Walking the tree is an intensive task.\n * Make use of the return values of the visitor when possible.\n * Instead of walking a tree multiple times, walk it once, use `unist-util-is`\n * to check if a node matches, and then perform different operations.\n *\n * You can change the tree.\n * See `Visitor` for more info.\n *\n * @overload\n * @param {Tree} tree\n * @param {Check} check\n * @param {BuildVisitor<Tree, Check>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @overload\n * @param {Tree} tree\n * @param {BuildVisitor<Tree>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @param {UnistNode} tree\n *   Tree to traverse.\n * @param {Visitor | Test} test\n *   `unist-util-is`-compatible test\n * @param {Visitor | boolean | null | undefined} [visitor]\n *   Handle each node.\n * @param {boolean | null | undefined} [reverse]\n *   Traverse in reverse preorder (NRL) instead of the default preorder (NLR).\n * @returns {undefined}\n *   Nothing.\n *\n * @template {UnistNode} Tree\n *   Node type.\n * @template {Test} Check\n *   `unist-util-is`-compatible test.\n */\nexport function visitParents(tree, test, visitor, reverse) {\n  /** @type {Test} */\n  let check\n\n  if (typeof test === 'function' && typeof visitor !== 'function') {\n    reverse = visitor\n    // @ts-expect-error no visitor given, so `visitor` is test.\n    visitor = test\n  } else {\n    // @ts-expect-error visitor given, so `test` isn\u2019t a visitor.\n    check = test\n  }\n\n  const is = convert(check)\n  const step = reverse ? -1 : 1\n\n  factory(tree, undefined, [])()\n\n  /**\n   * @param {UnistNode} node\n   * @param {number | undefined} index\n   * @param {Array<UnistParent>} parents\n   */\n  function factory(node, index, parents) {\n    const value = /** @type {Record<string, unknown>} */ (\n      node && typeof node === 'object' ? node : {}\n    )\n\n    if (typeof value.type === 'string') {\n      const name =\n        // `hast`\n        typeof value.tagName === 'string'\n          ? value.tagName\n          : // `xast`\n          typeof value.name === 'string'\n          ? value.name\n          : undefined\n\n      Object.defineProperty(visit, 'name', {\n        value:\n          'node (' + color(node.type + (name ? '<' + name + '>' : '')) + ')'\n      })\n    }\n\n    return visit\n\n    function visit() {\n      /** @type {Readonly<ActionTuple>} */\n      let result = empty\n      /** @type {Readonly<ActionTuple>} */\n      let subresult\n      /** @type {number} */\n      let offset\n      /** @type {Array<UnistParent>} */\n      let grandparents\n\n      if (!test || is(node, index, parents[parents.length - 1] || undefined)) {\n        // @ts-expect-error: `visitor` is now a visitor.\n        result = toResult(visitor(node, parents))\n\n        if (result[0] === EXIT) {\n          return result\n        }\n      }\n\n      if ('children' in node && node.children) {\n        const nodeAsParent = /** @type {UnistParent} */ (node)\n\n        if (nodeAsParent.children && result[0] !== SKIP) {\n          offset = (reverse ? nodeAsParent.children.length : -1) + step\n          grandparents = parents.concat(nodeAsParent)\n\n          while (offset > -1 && offset < nodeAsParent.children.length) {\n            const child = nodeAsParent.children[offset]\n\n            subresult = factory(child, offset, grandparents)()\n\n            if (subresult[0] === EXIT) {\n              return subresult\n            }\n\n            offset =\n              typeof subresult[1] === 'number' ? subresult[1] : offset + step\n          }\n        }\n      }\n\n      return result\n    }\n  }\n}\n\n/**\n * Turn a return value into a clean result.\n *\n * @param {VisitorResult} value\n *   Valid return values from visitors.\n * @returns {Readonly<ActionTuple>}\n *   Clean result.\n */\nfunction toResult(value) {\n  if (Array.isArray(value)) {\n    return value\n  }\n\n  if (typeof value === 'number') {\n    return [CONTINUE, value]\n  }\n\n  return value === null || value === undefined ? empty : [value]\n}\n", "/**\n * @typedef {import('unist').Node} UnistNode\n * @typedef {import('unist').Parent} UnistParent\n * @typedef {import('unist-util-visit-parents').VisitorResult} VisitorResult\n */\n\n/**\n * @typedef {Exclude<import('unist-util-is').Test, undefined> | undefined} Test\n *   Test from `unist-util-is`.\n *\n *   Note: we have remove and add `undefined`, because otherwise when generating\n *   automatic `.d.ts` files, TS tries to flatten paths from a local perspective,\n *   which doesn\u2019t work when publishing on npm.\n */\n\n// To do: use types from `unist-util-visit-parents` when it\u2019s released.\n\n/**\n * @typedef {(\n *   Fn extends (value: any) => value is infer Thing\n *   ? Thing\n *   : Fallback\n * )} Predicate\n *   Get the value of a type guard `Fn`.\n * @template Fn\n *   Value; typically function that is a type guard (such as `(x): x is Y`).\n * @template Fallback\n *   Value to yield if `Fn` is not a type guard.\n */\n\n/**\n * @typedef {(\n *   Check extends null | undefined // No test.\n *   ? Value\n *   : Value extends {type: Check} // String (type) test.\n *   ? Value\n *   : Value extends Check // Partial test.\n *   ? Value\n *   : Check extends Function // Function test.\n *   ? Predicate<Check, Value> extends Value\n *     ? Predicate<Check, Value>\n *     : never\n *   : never // Some other test?\n * )} MatchesOne\n *   Check whether a node matches a primitive check in the type system.\n * @template Value\n *   Value; typically unist `Node`.\n * @template Check\n *   Value; typically `unist-util-is`-compatible test, but not arrays.\n */\n\n/**\n * @typedef {(\n *   Check extends Array<any>\n *   ? MatchesOne<Value, Check[keyof Check]>\n *   : MatchesOne<Value, Check>\n * )} Matches\n *   Check whether a node matches a check in the type system.\n * @template Value\n *   Value; typically unist `Node`.\n * @template Check\n *   Value; typically `unist-util-is`-compatible test.\n */\n\n/**\n * @typedef {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10} Uint\n *   Number; capped reasonably.\n */\n\n/**\n * @typedef {I extends 0 ? 1 : I extends 1 ? 2 : I extends 2 ? 3 : I extends 3 ? 4 : I extends 4 ? 5 : I extends 5 ? 6 : I extends 6 ? 7 : I extends 7 ? 8 : I extends 8 ? 9 : 10} Increment\n *   Increment a number in the type system.\n * @template {Uint} [I=0]\n *   Index.\n */\n\n/**\n * @typedef {(\n *   Node extends UnistParent\n *   ? Node extends {children: Array<infer Children>}\n *     ? Child extends Children ? Node : never\n *     : never\n *   : never\n * )} InternalParent\n *   Collect nodes that can be parents of `Child`.\n * @template {UnistNode} Node\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n */\n\n/**\n * @typedef {InternalParent<InclusiveDescendant<Tree>, Child>} Parent\n *   Collect nodes in `Tree` that can be parents of `Child`.\n * @template {UnistNode} Tree\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n */\n\n/**\n * @typedef {(\n *   Depth extends Max\n *   ? never\n *   :\n *     | InternalParent<Node, Child>\n *     | InternalAncestor<Node, InternalParent<Node, Child>, Max, Increment<Depth>>\n * )} InternalAncestor\n *   Collect nodes in `Tree` that can be ancestors of `Child`.\n * @template {UnistNode} Node\n *   All node types in a tree.\n * @template {UnistNode} Child\n *   Node to search for.\n * @template {Uint} [Max=10]\n *   Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n *   Current depth.\n */\n\n/**\n * @typedef {(\n *   Tree extends UnistParent\n *     ? Depth extends Max\n *       ? Tree\n *       : Tree | InclusiveDescendant<Tree['children'][number], Max, Increment<Depth>>\n *     : Tree\n * )} InclusiveDescendant\n *   Collect all (inclusive) descendants of `Tree`.\n *\n *   > \uD83D\uDC49 **Note**: for performance reasons, this seems to be the fastest way to\n *   > recurse without actually running into an infinite loop, which the\n *   > previous version did.\n *   >\n *   > Practically, a max of `2` is typically enough assuming a `Root` is\n *   > passed, but it doesn\u2019t improve performance.\n *   > It gets higher with `List > ListItem > Table > TableRow > TableCell`.\n *   > Using up to `10` doesn\u2019t hurt or help either.\n * @template {UnistNode} Tree\n *   Tree type.\n * @template {Uint} [Max=10]\n *   Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n *   Current depth.\n */\n\n/**\n * @callback Visitor\n *   Handle a node (matching `test`, if given).\n *\n *   Visitors are free to transform `node`.\n *   They can also transform `parent`.\n *\n *   Replacing `node` itself, if `SKIP` is not returned, still causes its\n *   descendants to be walked (which is a bug).\n *\n *   When adding or removing previous siblings of `node` (or next siblings, in\n *   case of reverse), the `Visitor` should return a new `Index` to specify the\n *   sibling to traverse after `node` is traversed.\n *   Adding or removing next siblings of `node` (or previous siblings, in case\n *   of reverse) is handled as expected without needing to return a new `Index`.\n *\n *   Removing the children property of `parent` still results in them being\n *   traversed.\n * @param {Visited} node\n *   Found node.\n * @param {Visited extends UnistNode ? number | undefined : never} index\n *   Index of `node` in `parent`.\n * @param {Ancestor extends UnistParent ? Ancestor | undefined : never} parent\n *   Parent of `node`.\n * @returns {VisitorResult}\n *   What to do next.\n *\n *   An `Index` is treated as a tuple of `[CONTINUE, Index]`.\n *   An `Action` is treated as a tuple of `[Action]`.\n *\n *   Passing a tuple back only makes sense if the `Action` is `SKIP`.\n *   When the `Action` is `EXIT`, that action can be returned.\n *   When the `Action` is `CONTINUE`, `Index` can be returned.\n * @template {UnistNode} [Visited=UnistNode]\n *   Visited node type.\n * @template {UnistParent} [Ancestor=UnistParent]\n *   Ancestor type.\n */\n\n/**\n * @typedef {Visitor<Visited, Parent<Ancestor, Visited>>} BuildVisitorFromMatch\n *   Build a typed `Visitor` function from a node and all possible parents.\n *\n *   It will infer which values are passed as `node` and which as `parent`.\n * @template {UnistNode} Visited\n *   Node type.\n * @template {UnistParent} Ancestor\n *   Parent type.\n */\n\n/**\n * @typedef {(\n *   BuildVisitorFromMatch<\n *     Matches<Descendant, Check>,\n *     Extract<Descendant, UnistParent>\n *   >\n * )} BuildVisitorFromDescendants\n *   Build a typed `Visitor` function from a list of descendants and a test.\n *\n *   It will infer which values are passed as `node` and which as `parent`.\n * @template {UnistNode} Descendant\n *   Node type.\n * @template {Test} Check\n *   Test type.\n */\n\n/**\n * @typedef {(\n *   BuildVisitorFromDescendants<\n *     InclusiveDescendant<Tree>,\n *     Check\n *   >\n * )} BuildVisitor\n *   Build a typed `Visitor` function from a tree and a test.\n *\n *   It will infer which values are passed as `node` and which as `parent`.\n * @template {UnistNode} [Tree=UnistNode]\n *   Node type.\n * @template {Test} [Check=Test]\n *   Test type.\n */\n\nimport {visitParents} from 'unist-util-visit-parents'\n\nexport {CONTINUE, EXIT, SKIP} from 'unist-util-visit-parents'\n\n/**\n * Visit nodes.\n *\n * This algorithm performs *depth-first* *tree traversal* in *preorder*\n * (**NLR**) or if `reverse` is given, in *reverse preorder* (**NRL**).\n *\n * You can choose for which nodes `visitor` is called by passing a `test`.\n * For complex tests, you should test yourself in `visitor`, as it will be\n * faster and will have improved type information.\n *\n * Walking the tree is an intensive task.\n * Make use of the return values of the visitor when possible.\n * Instead of walking a tree multiple times, walk it once, use `unist-util-is`\n * to check if a node matches, and then perform different operations.\n *\n * You can change the tree.\n * See `Visitor` for more info.\n *\n * @overload\n * @param {Tree} tree\n * @param {Check} check\n * @param {BuildVisitor<Tree, Check>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @overload\n * @param {Tree} tree\n * @param {BuildVisitor<Tree>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @param {UnistNode} tree\n *   Tree to traverse.\n * @param {Visitor | Test} testOrVisitor\n *   `unist-util-is`-compatible test (optional, omit to pass a visitor).\n * @param {Visitor | boolean | null | undefined} [visitorOrReverse]\n *   Handle each node (when test is omitted, pass `reverse`).\n * @param {boolean | null | undefined} [maybeReverse=false]\n *   Traverse in reverse preorder (NRL) instead of the default preorder (NLR).\n * @returns {undefined}\n *   Nothing.\n *\n * @template {UnistNode} Tree\n *   Node type.\n * @template {Test} Check\n *   `unist-util-is`-compatible test.\n */\nexport function visit(tree, testOrVisitor, visitorOrReverse, maybeReverse) {\n  /** @type {boolean | null | undefined} */\n  let reverse\n  /** @type {Test} */\n  let test\n  /** @type {Visitor} */\n  let visitor\n\n  if (\n    typeof testOrVisitor === 'function' &&\n    typeof visitorOrReverse !== 'function'\n  ) {\n    test = undefined\n    visitor = testOrVisitor\n    reverse = visitorOrReverse\n  } else {\n    // @ts-expect-error: assume the overload with test was given.\n    test = testOrVisitor\n    // @ts-expect-error: assume the overload with test was given.\n    visitor = visitorOrReverse\n    reverse = maybeReverse\n  }\n\n  visitParents(tree, test, overload, reverse)\n\n  /**\n   * @param {UnistNode} node\n   * @param {Array<UnistParent>} parents\n   */\n  function overload(node, parents) {\n    const parent = parents[parents.length - 1]\n    const index = parent ? parent.children.indexOf(node) : undefined\n    return visitor(node, index, parent)\n  }\n}\n", "/**\n * @typedef {import('hast').Element} HastElement\n * @typedef {import('hast').ElementContent} HastElementContent\n * @typedef {import('hast').Nodes} HastNodes\n * @typedef {import('hast').Properties} HastProperties\n * @typedef {import('hast').RootContent} HastRootContent\n * @typedef {import('hast').Text} HastText\n *\n * @typedef {import('mdast').Definition} MdastDefinition\n * @typedef {import('mdast').FootnoteDefinition} MdastFootnoteDefinition\n * @typedef {import('mdast').Nodes} MdastNodes\n * @typedef {import('mdast').Parents} MdastParents\n *\n * @typedef {import('vfile').VFile} VFile\n *\n * @typedef {import('./footer.js').FootnoteBackContentTemplate} FootnoteBackContentTemplate\n * @typedef {import('./footer.js').FootnoteBackLabelTemplate} FootnoteBackLabelTemplate\n */\n\n/**\n * @callback Handler\n *   Handle a node.\n * @param {State} state\n *   Info passed around.\n * @param {any} node\n *   mdast node to handle.\n * @param {MdastParents | undefined} parent\n *   Parent of `node`.\n * @returns {Array<HastElementContent> | HastElementContent | undefined}\n *   hast node.\n *\n * @typedef {Partial<Record<MdastNodes['type'], Handler>>} Handlers\n *   Handle nodes.\n *\n * @typedef Options\n *   Configuration (optional).\n * @property {boolean | null | undefined} [allowDangerousHtml=false]\n *   Whether to persist raw HTML in markdown in the hast tree (default:\n *   `false`).\n * @property {string | null | undefined} [clobberPrefix='user-content-']\n *   Prefix to use before the `id` property on footnotes to prevent them from\n *   *clobbering* (default: `'user-content-'`).\n *\n *   Pass `''` for trusted markdown and when you are careful with\n *   polyfilling.\n *   You could pass a different prefix.\n *\n *   DOM clobbering is this:\n *\n *   ```html\n *   <p id=\"x\"></p>\n *   <script>alert(x) // `x` now refers to the `p#x` DOM element</script>\n *   ```\n *\n *   The above example shows that elements are made available by browsers, by\n *   their ID, on the `window` object.\n *   This is a security risk because you might be expecting some other variable\n *   at that place.\n *   It can also break polyfills.\n *   Using a prefix solves these problems.\n * @property {VFile | null | undefined} [file]\n *   Corresponding virtual file representing the input document (optional).\n * @property {FootnoteBackContentTemplate | string | null | undefined} [footnoteBackContent]\n *   Content of the backreference back to references (default: `defaultFootnoteBackContent`).\n *\n *   The default value is:\n *\n *   ```js\n *   function defaultFootnoteBackContent(_, rereferenceIndex) {\n *     const result = [{type: 'text', value: '\u21A9'}]\n *\n *     if (rereferenceIndex > 1) {\n *       result.push({\n *         type: 'element',\n *         tagName: 'sup',\n *         properties: {},\n *         children: [{type: 'text', value: String(rereferenceIndex)}]\n *       })\n *     }\n *\n *     return result\n *   }\n *   ```\n *\n *   This content is used in the `a` element of each backreference (the `\u21A9`\n *   links).\n * @property {FootnoteBackLabelTemplate | string | null | undefined} [footnoteBackLabel]\n *   Label to describe the backreference back to references (default:\n *   `defaultFootnoteBackLabel`).\n *\n *   The default value is:\n *\n *   ```js\n *   function defaultFootnoteBackLabel(referenceIndex, rereferenceIndex) {\n *    return (\n *      'Back to reference ' +\n *      (referenceIndex + 1) +\n *      (rereferenceIndex > 1 ? '-' + rereferenceIndex : '')\n *    )\n *   }\n *   ```\n *\n *   Change it when the markdown is not in English.\n *\n *   This label is used in the `ariaLabel` property on each backreference\n *   (the `\u21A9` links).\n *   It affects users of assistive technology.\n * @property {string | null | undefined} [footnoteLabel='Footnotes']\n *   Textual label to use for the footnotes section (default: `'Footnotes'`).\n *\n *   Change it when the markdown is not in English.\n *\n *   This label is typically hidden visually (assuming a `sr-only` CSS class\n *   is defined that does that) and so affects screen readers only.\n *   If you do have such a class, but want to show this section to everyone,\n *   pass different properties with the `footnoteLabelProperties` option.\n * @property {HastProperties | null | undefined} [footnoteLabelProperties={className: ['sr-only']}]\n *   Properties to use on the footnote label (default: `{className:\n *   ['sr-only']}`).\n *\n *   Change it to show the label and add other properties.\n *\n *   This label is typically hidden visually (assuming an `sr-only` CSS class\n *   is defined that does that) and so affects screen readers only.\n *   If you do have such a class, but want to show this section to everyone,\n *   pass an empty string.\n *   You can also add different properties.\n *\n *   > **Note**: `id: 'footnote-label'` is always added, because footnote\n *   > calls use it with `aria-describedby` to provide an accessible label.\n * @property {string | null | undefined} [footnoteLabelTagName='h2']\n *   HTML tag name to use for the footnote label element (default: `'h2'`).\n *\n *   Change it to match your document structure.\n *\n *   This label is typically hidden visually (assuming a `sr-only` CSS class\n *   is defined that does that) and so affects screen readers only.\n *   If you do have such a class, but want to show this section to everyone,\n *   pass different properties with the `footnoteLabelProperties` option.\n * @property {Handlers | null | undefined} [handlers]\n *   Extra handlers for nodes (optional).\n * @property {Array<MdastNodes['type']> | null | undefined} [passThrough]\n *   List of custom mdast node types to pass through (keep) in hast (note that\n *   the node itself is passed, but eventual children are transformed)\n *   (optional).\n * @property {Handler | null | undefined} [unknownHandler]\n *   Handler for all unknown nodes (optional).\n *\n * @typedef State\n *   Info passed around.\n * @property {(node: MdastNodes) => Array<HastElementContent>} all\n *   Transform the children of an mdast parent to hast.\n * @property {<Type extends HastNodes>(from: MdastNodes, to: Type) => HastElement | Type} applyData\n *   Honor the `data` of `from`, and generate an element instead of `node`.\n * @property {Map<string, MdastDefinition>} definitionById\n *   Definitions by their identifier.\n * @property {Map<string, MdastFootnoteDefinition>} footnoteById\n *   Footnote definitions by their identifier.\n * @property {Map<string, number>} footnoteCounts\n *   Counts for how often the same footnote was called.\n * @property {Array<string>} footnoteOrder\n *   Identifiers of order when footnote calls first appear in tree order.\n * @property {Handlers} handlers\n *   Applied handlers.\n * @property {(node: MdastNodes, parent: MdastParents | undefined) => Array<HastElementContent> | HastElementContent | undefined} one\n *   Transform an mdast node to hast.\n * @property {Options} options\n *   Configuration.\n * @property {(from: MdastNodes, node: HastNodes) => undefined} patch\n *   Copy a node\u2019s positional info.\n * @property {<Type extends HastRootContent>(nodes: Array<Type>, loose?: boolean | undefined) => Array<HastText | Type>} wrap\n *   Wrap `nodes` with line endings between each node, adds initial/final line endings when `loose`.\n */\n\nimport structuredClone from '@ungap/structured-clone'\nimport {visit} from 'unist-util-visit'\nimport {position} from 'unist-util-position'\nimport {handlers as defaultHandlers} from './handlers/index.js'\n\nconst own = {}.hasOwnProperty\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Create `state` from an mdast tree.\n *\n * @param {MdastNodes} tree\n *   mdast node to transform.\n * @param {Options | null | undefined} [options]\n *   Configuration (optional).\n * @returns {State}\n *   `state` function.\n */\nexport function createState(tree, options) {\n  const settings = options || emptyOptions\n  /** @type {Map<string, MdastDefinition>} */\n  const definitionById = new Map()\n  /** @type {Map<string, MdastFootnoteDefinition>} */\n  const footnoteById = new Map()\n  /** @type {Map<string, number>} */\n  const footnoteCounts = new Map()\n  /** @type {Handlers} */\n  // @ts-expect-error: the root handler returns a root.\n  // Hard to type.\n  const handlers = {...defaultHandlers, ...settings.handlers}\n\n  /** @type {State} */\n  const state = {\n    all,\n    applyData,\n    definitionById,\n    footnoteById,\n    footnoteCounts,\n    footnoteOrder: [],\n    handlers,\n    one,\n    options: settings,\n    patch,\n    wrap\n  }\n\n  visit(tree, function (node) {\n    if (node.type === 'definition' || node.type === 'footnoteDefinition') {\n      const map = node.type === 'definition' ? definitionById : footnoteById\n      const id = String(node.identifier).toUpperCase()\n\n      // Mimick CM behavior of link definitions.\n      // See: <https://github.com/syntax-tree/mdast-util-definitions/blob/9032189/lib/index.js#L20-L21>.\n      if (!map.has(id)) {\n        // @ts-expect-error: node type matches map.\n        map.set(id, node)\n      }\n    }\n  })\n\n  return state\n\n  /**\n   * Transform an mdast node into a hast node.\n   *\n   * @param {MdastNodes} node\n   *   mdast node.\n   * @param {MdastParents | undefined} [parent]\n   *   Parent of `node`.\n   * @returns {Array<HastElementContent> | HastElementContent | undefined}\n   *   Resulting hast node.\n   */\n  function one(node, parent) {\n    const type = node.type\n    const handle = state.handlers[type]\n\n    if (own.call(state.handlers, type) && handle) {\n      return handle(state, node, parent)\n    }\n\n    if (state.options.passThrough && state.options.passThrough.includes(type)) {\n      if ('children' in node) {\n        const {children, ...shallow} = node\n        const result = structuredClone(shallow)\n        // @ts-expect-error: TS doesn\u2019t understand\u2026\n        result.children = state.all(node)\n        // @ts-expect-error: TS doesn\u2019t understand\u2026\n        return result\n      }\n\n      // @ts-expect-error: it\u2019s custom.\n      return structuredClone(node)\n    }\n\n    const unknown = state.options.unknownHandler || defaultUnknownHandler\n\n    return unknown(state, node, parent)\n  }\n\n  /**\n   * Transform the children of an mdast node into hast nodes.\n   *\n   * @param {MdastNodes} parent\n   *   mdast node to compile\n   * @returns {Array<HastElementContent>}\n   *   Resulting hast nodes.\n   */\n  function all(parent) {\n    /** @type {Array<HastElementContent>} */\n    const values = []\n\n    if ('children' in parent) {\n      const nodes = parent.children\n      let index = -1\n      while (++index < nodes.length) {\n        const result = state.one(nodes[index], parent)\n\n        // To do: see if we van clean this? Can we merge texts?\n        if (result) {\n          if (index && nodes[index - 1].type === 'break') {\n            if (!Array.isArray(result) && result.type === 'text') {\n              result.value = trimMarkdownSpaceStart(result.value)\n            }\n\n            if (!Array.isArray(result) && result.type === 'element') {\n              const head = result.children[0]\n\n              if (head && head.type === 'text') {\n                head.value = trimMarkdownSpaceStart(head.value)\n              }\n            }\n          }\n\n          if (Array.isArray(result)) {\n            values.push(...result)\n          } else {\n            values.push(result)\n          }\n        }\n      }\n    }\n\n    return values\n  }\n}\n\n/**\n * Copy a node\u2019s positional info.\n *\n * @param {MdastNodes} from\n *   mdast node to copy from.\n * @param {HastNodes} to\n *   hast node to copy into.\n * @returns {undefined}\n *   Nothing.\n */\nfunction patch(from, to) {\n  if (from.position) to.position = position(from)\n}\n\n/**\n * Honor the `data` of `from` and maybe generate an element instead of `to`.\n *\n * @template {HastNodes} Type\n *   Node type.\n * @param {MdastNodes} from\n *   mdast node to use data from.\n * @param {Type} to\n *   hast node to change.\n * @returns {HastElement | Type}\n *   Nothing.\n */\nfunction applyData(from, to) {\n  /** @type {HastElement | Type} */\n  let result = to\n\n  // Handle `data.hName`, `data.hProperties, `data.hChildren`.\n  if (from && from.data) {\n    const hName = from.data.hName\n    const hChildren = from.data.hChildren\n    const hProperties = from.data.hProperties\n\n    if (typeof hName === 'string') {\n      // Transforming the node resulted in an element with a different name\n      // than wanted:\n      if (result.type === 'element') {\n        result.tagName = hName\n      }\n      // Transforming the node resulted in a non-element, which happens for\n      // raw, text, and root nodes (unless custom handlers are passed).\n      // The intent of `hName` is to create an element, but likely also to keep\n      // the content around (otherwise: pass `hChildren`).\n      else {\n        /** @type {Array<HastElementContent>} */\n        // @ts-expect-error: assume no doctypes in `root`.\n        const children = 'children' in result ? result.children : [result]\n        result = {type: 'element', tagName: hName, properties: {}, children}\n      }\n    }\n\n    if (result.type === 'element' && hProperties) {\n      Object.assign(result.properties, structuredClone(hProperties))\n    }\n\n    if (\n      'children' in result &&\n      result.children &&\n      hChildren !== null &&\n      hChildren !== undefined\n    ) {\n      result.children = hChildren\n    }\n  }\n\n  return result\n}\n\n/**\n * Transform an unknown node.\n *\n * @param {State} state\n *   Info passed around.\n * @param {MdastNodes} node\n *   Unknown mdast node.\n * @returns {HastElement | HastText}\n *   Resulting hast node.\n */\nfunction defaultUnknownHandler(state, node) {\n  const data = node.data || {}\n  /** @type {HastElement | HastText} */\n  const result =\n    'value' in node &&\n    !(own.call(data, 'hProperties') || own.call(data, 'hChildren'))\n      ? {type: 'text', value: node.value}\n      : {\n          type: 'element',\n          tagName: 'div',\n          properties: {},\n          children: state.all(node)\n        }\n\n  state.patch(node, result)\n  return state.applyData(node, result)\n}\n\n/**\n * Wrap `nodes` with line endings between each node.\n *\n * @template {HastRootContent} Type\n *   Node type.\n * @param {Array<Type>} nodes\n *   List of nodes to wrap.\n * @param {boolean | undefined} [loose=false]\n *   Whether to add line endings at start and end (default: `false`).\n * @returns {Array<HastText | Type>}\n *   Wrapped nodes.\n */\nexport function wrap(nodes, loose) {\n  /** @type {Array<HastText | Type>} */\n  const result = []\n  let index = -1\n\n  if (loose) {\n    result.push({type: 'text', value: '\\n'})\n  }\n\n  while (++index < nodes.length) {\n    if (index) result.push({type: 'text', value: '\\n'})\n    result.push(nodes[index])\n  }\n\n  if (loose && nodes.length > 0) {\n    result.push({type: 'text', value: '\\n'})\n  }\n\n  return result\n}\n\n/**\n * Trim spaces and tabs at the start of `value`.\n *\n * @param {string} value\n *   Value to trim.\n * @returns {string}\n *   Result.\n */\nfunction trimMarkdownSpaceStart(value) {\n  let index = 0\n  let code = value.charCodeAt(index)\n\n  while (code === 9 || code === 32) {\n    index++\n    code = value.charCodeAt(index)\n  }\n\n  return value.slice(index)\n}\n", "/**\n * @typedef {import('hast').Nodes} HastNodes\n * @typedef {import('mdast').Nodes} MdastNodes\n * @typedef {import('./state.js').Options} Options\n */\n\nimport {ok as assert} from 'devlop'\nimport {footer} from './footer.js'\nimport {createState} from './state.js'\n\n/**\n * Transform mdast to hast.\n *\n * ##### Notes\n *\n * ###### HTML\n *\n * Raw HTML is available in mdast as `html` nodes and can be embedded in hast\n * as semistandard `raw` nodes.\n * Most utilities ignore `raw` nodes but two notable ones don\u2019t:\n *\n * *   `hast-util-to-html` also has an option `allowDangerousHtml` which will\n *     output the raw HTML.\n *     This is typically discouraged as noted by the option name but is useful\n *     if you completely trust authors\n * *   `hast-util-raw` can handle the raw embedded HTML strings by parsing them\n *     into standard hast nodes (`element`, `text`, etc).\n *     This is a heavy task as it needs a full HTML parser, but it is the only\n *     way to support untrusted content\n *\n * ###### Footnotes\n *\n * Many options supported here relate to footnotes.\n * Footnotes are not specified by CommonMark, which we follow by default.\n * They are supported by GitHub, so footnotes can be enabled in markdown with\n * `mdast-util-gfm`.\n *\n * The options `footnoteBackLabel` and `footnoteLabel` define natural language\n * that explains footnotes, which is hidden for sighted users but shown to\n * assistive technology.\n * When your page is not in English, you must define translated values.\n *\n * Back references use ARIA attributes, but the section label itself uses a\n * heading that is hidden with an `sr-only` class.\n * To show it to sighted users, define different attributes in\n * `footnoteLabelProperties`.\n *\n * ###### Clobbering\n *\n * Footnotes introduces a problem, as it links footnote calls to footnote\n * definitions on the page through `id` attributes generated from user content,\n * which results in DOM clobbering.\n *\n * DOM clobbering is this:\n *\n * ```html\n * <p id=x></p>\n * <script>alert(x) // `x` now refers to the DOM `p#x` element</script>\n * ```\n *\n * Elements by their ID are made available by browsers on the `window` object,\n * which is a security risk.\n * Using a prefix solves this problem.\n *\n * More information on how to handle clobbering and the prefix is explained in\n * Example: headings (DOM clobbering) in `rehype-sanitize`.\n *\n * ###### Unknown nodes\n *\n * Unknown nodes are nodes with a type that isn\u2019t in `handlers` or `passThrough`.\n * The default behavior for unknown nodes is:\n *\n * *   when the node has a `value` (and doesn\u2019t have `data.hName`,\n *     `data.hProperties`, or `data.hChildren`, see later), create a hast `text`\n *     node\n * *   otherwise, create a `<div>` element (which could be changed with\n *     `data.hName`), with its children mapped from mdast to hast as well\n *\n * This behavior can be changed by passing an `unknownHandler`.\n *\n * @param {MdastNodes} tree\n *   mdast tree.\n * @param {Options | null | undefined} [options]\n *   Configuration (optional).\n * @returns {HastNodes}\n *   hast tree.\n */\nexport function toHast(tree, options) {\n  const state = createState(tree, options)\n  const node = state.one(tree, undefined)\n  const foot = footer(state)\n  /** @type {HastNodes} */\n  const result = Array.isArray(node)\n    ? {type: 'root', children: node}\n    : node || {type: 'root', children: []}\n\n  if (foot) {\n    // If there\u2019s a footer, there were definitions, meaning block\n    // content.\n    // So `result` is a parent node.\n    assert('children' in result)\n    result.children.push({type: 'text', value: '\\n'}, foot)\n  }\n\n  return result\n}\n", "// Include `data` fields in mdast and `raw` nodes in hast.\n/// <reference types=\"mdast-util-to-hast\" />\n\n/**\n * @import {Root as HastRoot} from 'hast'\n * @import {Root as MdastRoot} from 'mdast'\n * @import {Options as ToHastOptions} from 'mdast-util-to-hast'\n * @import {Processor} from 'unified'\n * @import {VFile} from 'vfile'\n */\n\n/**\n * @typedef {Omit<ToHastOptions, 'file'>} Options\n *\n * @callback TransformBridge\n *   Bridge-mode.\n *\n *   Runs the destination with the new hast tree.\n *   Discards result.\n * @param {MdastRoot} tree\n *   Tree.\n * @param {VFile} file\n *   File.\n * @returns {Promise<undefined>}\n *   Nothing.\n *\n * @callback TransformMutate\n *  Mutate-mode.\n *\n *  Further transformers run on the hast tree.\n * @param {MdastRoot} tree\n *   Tree.\n * @param {VFile} file\n *   File.\n * @returns {HastRoot}\n *   Tree (hast).\n */\n\nimport {toHast} from 'mdast-util-to-hast'\n\n/**\n * Turn markdown into HTML.\n *\n * ##### Notes\n *\n * ###### Signature\n *\n * *   if a processor is given, runs the (rehype) plugins used on it with a\n *     hast tree, then discards the result (*bridge mode*)\n * *   otherwise, returns a hast tree, the plugins used after `remarkRehype`\n *     are rehype plugins (*mutate mode*)\n *\n * > \uD83D\uDC49 **Note**: It\u2019s highly unlikely that you want to pass a `processor`.\n *\n * ###### HTML\n *\n * Raw HTML is available in mdast as `html` nodes and can be embedded in hast\n * as semistandard `raw` nodes.\n * Most plugins ignore `raw` nodes but two notable ones don\u2019t:\n *\n * *   `rehype-stringify` also has an option `allowDangerousHtml` which will\n *     output the raw HTML.\n *     This is typically discouraged as noted by the option name but is useful if\n *     you completely trust authors\n * *   `rehype-raw` can handle the raw embedded HTML strings by parsing them\n *     into standard hast nodes (`element`, `text`, etc).\n *     This is a heavy task as it needs a full HTML parser, but it is the only way\n *     to support untrusted content\n *\n * ###### Footnotes\n *\n * Many options supported here relate to footnotes.\n * Footnotes are not specified by CommonMark, which we follow by default.\n * They are supported by GitHub, so footnotes can be enabled in markdown with\n * `remark-gfm`.\n *\n * The options `footnoteBackLabel` and `footnoteLabel` define natural language\n * that explains footnotes, which is hidden for sighted users but shown to\n * assistive technology.\n * When your page is not in English, you must define translated values.\n *\n * Back references use ARIA attributes, but the section label itself uses a\n * heading that is hidden with an `sr-only` class.\n * To show it to sighted users, define different attributes in\n * `footnoteLabelProperties`.\n *\n * ###### Clobbering\n *\n * Footnotes introduces a problem, as it links footnote calls to footnote\n * definitions on the page through `id` attributes generated from user content,\n * which results in DOM clobbering.\n *\n * DOM clobbering is this:\n *\n * ```html\n * <p id=x></p>\n * <script>alert(x) // `x` now refers to the DOM `p#x` element</script>\n * ```\n *\n * Elements by their ID are made available by browsers on the `window` object,\n * which is a security risk.\n * Using a prefix solves this problem.\n *\n * More information on how to handle clobbering and the prefix is explained in\n * *Example: headings (DOM clobbering)* in `rehype-sanitize`.\n *\n * ###### Unknown nodes\n *\n * Unknown nodes are nodes with a type that isn\u2019t in `handlers` or `passThrough`.\n * The default behavior for unknown nodes is:\n *\n * *   when the node has a `value` (and doesn\u2019t have `data.hName`,\n *     `data.hProperties`, or `data.hChildren`, see later), create a hast `text`\n *     node\n * *   otherwise, create a `<div>` element (which could be changed with\n *     `data.hName`), with its children mapped from mdast to hast as well\n *\n * This behavior can be changed by passing an `unknownHandler`.\n *\n * @overload\n * @param {Processor} processor\n * @param {Readonly<Options> | null | undefined} [options]\n * @returns {TransformBridge}\n *\n * @overload\n * @param {Readonly<Options> | null | undefined} [options]\n * @returns {TransformMutate}\n *\n * @param {Readonly<Options> | Processor | null | undefined} [destination]\n *   Processor or configuration (optional).\n * @param {Readonly<Options> | null | undefined} [options]\n *   When a processor was given, configuration (optional).\n * @returns {TransformBridge | TransformMutate}\n *   Transform.\n */\nexport default function remarkRehype(destination, options) {\n  if (destination && 'run' in destination) {\n    /**\n     * @type {TransformBridge}\n     */\n    return async function (tree, file) {\n      // Cast because root in -> root out.\n      const hastTree = /** @type {HastRoot} */ (\n        toHast(tree, {file, ...options})\n      )\n      await destination.run(hastTree, file)\n    }\n  }\n\n  /**\n   * @type {TransformMutate}\n   */\n  return function (tree, file) {\n    // Cast because root in -> root out.\n    // To do: in the future, disallow ` || options` fallback.\n    // With `unified-engine`, `destination` can be `undefined` but\n    // `options` will be the file set.\n    // We should not pass that as `options`.\n    return /** @type {HastRoot} */ (\n      toHast(tree, {file, ...(destination || options)})\n    )\n  }\n}\n", "/**\n * Throw a given error.\n *\n * @param {Error|null|undefined} [error]\n *   Maybe error.\n * @returns {asserts error is null|undefined}\n */\nexport function bail(error) {\n  if (error) {\n    throw error\n  }\n}\n", "/**\n * @typedef {import('trough').Pipeline} Pipeline\n *\n * @typedef {import('unist').Node} Node\n *\n * @typedef {import('vfile').Compatible} Compatible\n * @typedef {import('vfile').Value} Value\n *\n * @typedef {import('../index.js').CompileResultMap} CompileResultMap\n * @typedef {import('../index.js').Data} Data\n * @typedef {import('../index.js').Settings} Settings\n */\n\n/**\n * @typedef {CompileResultMap[keyof CompileResultMap]} CompileResults\n *   Acceptable results from compilers.\n *\n *   To register custom results, add them to\n *   {@linkcode CompileResultMap}.\n */\n\n/**\n * @template {Node} [Tree=Node]\n *   The node that the compiler receives (default: `Node`).\n * @template {CompileResults} [Result=CompileResults]\n *   The thing that the compiler yields (default: `CompileResults`).\n * @callback Compiler\n *   A **compiler** handles the compiling of a syntax tree to something else\n *   (in most cases, text) (TypeScript type).\n *\n *   It is used in the stringify phase and called with a {@linkcode Node}\n *   and {@linkcode VFile} representation of the document to compile.\n *   It should return the textual representation of the given tree (typically\n *   `string`).\n *\n *   > **Note**: unified typically compiles by serializing: most compilers\n *   > return `string` (or `Uint8Array`).\n *   > Some compilers, such as the one configured with\n *   > [`rehype-react`][rehype-react], return other values (in this case, a\n *   > React tree).\n *   > If you\u2019re using a compiler that doesn\u2019t serialize, expect different\n *   > result values.\n *   >\n *   > To register custom results in TypeScript, add them to\n *   > {@linkcode CompileResultMap}.\n *\n *   [rehype-react]: https://github.com/rehypejs/rehype-react\n * @param {Tree} tree\n *   Tree to compile.\n * @param {VFile} file\n *   File associated with `tree`.\n * @returns {Result}\n *   New content: compiled text (`string` or `Uint8Array`, for `file.value`) or\n *   something else (for `file.result`).\n */\n\n/**\n * @template {Node} [Tree=Node]\n *   The node that the parser yields (default: `Node`)\n * @callback Parser\n *   A **parser** handles the parsing of text to a syntax tree.\n *\n *   It is used in the parse phase and is called with a `string` and\n *   {@linkcode VFile} of the document to parse.\n *   It must return the syntax tree representation of the given file\n *   ({@linkcode Node}).\n * @param {string} document\n *   Document to parse.\n * @param {VFile} file\n *   File associated with `document`.\n * @returns {Tree}\n *   Node representing the given file.\n */\n\n/**\n * @typedef {(\n *   Plugin<Array<any>, any, any> |\n *   PluginTuple<Array<any>, any, any> |\n *   Preset\n * )} Pluggable\n *   Union of the different ways to add plugins and settings.\n */\n\n/**\n * @typedef {Array<Pluggable>} PluggableList\n *   List of plugins and presets.\n */\n\n// Note: we can\u2019t use `callback` yet as it messes up `this`:\n//  <https://github.com/microsoft/TypeScript/issues/55197>.\n/**\n * @template {Array<unknown>} [PluginParameters=[]]\n *   Arguments passed to the plugin (default: `[]`, the empty tuple).\n * @template {Node | string | undefined} [Input=Node]\n *   Value that is expected as input (default: `Node`).\n *\n *   *   If the plugin returns a {@linkcode Transformer}, this\n *       should be the node it expects.\n *   *   If the plugin sets a {@linkcode Parser}, this should be\n *       `string`.\n *   *   If the plugin sets a {@linkcode Compiler}, this should be the\n *       node it expects.\n * @template [Output=Input]\n *   Value that is yielded as output (default: `Input`).\n *\n *   *   If the plugin returns a {@linkcode Transformer}, this\n *       should be the node that that yields.\n *   *   If the plugin sets a {@linkcode Parser}, this should be the\n *       node that it yields.\n *   *   If the plugin sets a {@linkcode Compiler}, this should be\n *       result it yields.\n * @typedef {(\n *   (this: Processor, ...parameters: PluginParameters) =>\n *     Input extends string ? // Parser.\n *        Output extends Node | undefined ? undefined | void : never :\n *     Output extends CompileResults ? // Compiler.\n *        Input extends Node | undefined ? undefined | void : never :\n *     Transformer<\n *       Input extends Node ? Input : Node,\n *       Output extends Node ? Output : Node\n *     > | undefined | void\n * )} Plugin\n *   Single plugin.\n *\n *   Plugins configure the processors they are applied on in the following\n *   ways:\n *\n *   *   they change the processor, such as the parser, the compiler, or by\n *       configuring data\n *   *   they specify how to handle trees and files\n *\n *   In practice, they are functions that can receive options and configure the\n *   processor (`this`).\n *\n *   > **Note**: plugins are called when the processor is *frozen*, not when\n *   > they are applied.\n */\n\n/**\n * Tuple of a plugin and its configuration.\n *\n * The first item is a plugin, the rest are its parameters.\n *\n * @template {Array<unknown>} [TupleParameters=[]]\n *   Arguments passed to the plugin (default: `[]`, the empty tuple).\n * @template {Node | string | undefined} [Input=undefined]\n *   Value that is expected as input (optional).\n *\n *   *   If the plugin returns a {@linkcode Transformer}, this\n *       should be the node it expects.\n *   *   If the plugin sets a {@linkcode Parser}, this should be\n *       `string`.\n *   *   If the plugin sets a {@linkcode Compiler}, this should be the\n *       node it expects.\n * @template [Output=undefined] (optional).\n *   Value that is yielded as output.\n *\n *   *   If the plugin returns a {@linkcode Transformer}, this\n *       should be the node that that yields.\n *   *   If the plugin sets a {@linkcode Parser}, this should be the\n *       node that it yields.\n *   *   If the plugin sets a {@linkcode Compiler}, this should be\n *       result it yields.\n * @typedef {(\n *   [\n *     plugin: Plugin<TupleParameters, Input, Output>,\n *     ...parameters: TupleParameters\n *   ]\n * )} PluginTuple\n */\n\n/**\n * @typedef Preset\n *   Sharable configuration.\n *\n *   They can contain plugins and settings.\n * @property {PluggableList | undefined} [plugins]\n *   List of plugins and presets (optional).\n * @property {Settings | undefined} [settings]\n *   Shared settings for parsers and compilers (optional).\n */\n\n/**\n * @template {VFile} [File=VFile]\n *   The file that the callback receives (default: `VFile`).\n * @callback ProcessCallback\n *   Callback called when the process is done.\n *\n *   Called with either an error or a result.\n * @param {Error | undefined} [error]\n *   Fatal error (optional).\n * @param {File | undefined} [file]\n *   Processed file (optional).\n * @returns {undefined}\n *   Nothing.\n */\n\n/**\n * @template {Node} [Tree=Node]\n *   The tree that the callback receives (default: `Node`).\n * @callback RunCallback\n *   Callback called when transformers are done.\n *\n *   Called with either an error or results.\n * @param {Error | undefined} [error]\n *   Fatal error (optional).\n * @param {Tree | undefined} [tree]\n *   Transformed tree (optional).\n * @param {VFile | undefined} [file]\n *   File (optional).\n * @returns {undefined}\n *   Nothing.\n */\n\n/**\n * @template {Node} [Output=Node]\n *   Node type that the transformer yields (default: `Node`).\n * @callback TransformCallback\n *   Callback passed to transforms.\n *\n *   If the signature of a `transformer` accepts a third argument, the\n *   transformer may perform asynchronous operations, and must call it.\n * @param {Error | undefined} [error]\n *   Fatal error to stop the process (optional).\n * @param {Output | undefined} [tree]\n *   New, changed, tree (optional).\n * @param {VFile | undefined} [file]\n *   New, changed, file (optional).\n * @returns {undefined}\n *   Nothing.\n */\n\n/**\n * @template {Node} [Input=Node]\n *   Node type that the transformer expects (default: `Node`).\n * @template {Node} [Output=Input]\n *   Node type that the transformer yields (default: `Input`).\n * @callback Transformer\n *   Transformers handle syntax trees and files.\n *\n *   They are functions that are called each time a syntax tree and file are\n *   passed through the run phase.\n *   When an error occurs in them (either because it\u2019s thrown, returned,\n *   rejected, or passed to `next`), the process stops.\n *\n *   The run phase is handled by [`trough`][trough], see its documentation for\n *   the exact semantics of these functions.\n *\n *   > **Note**: you should likely ignore `next`: don\u2019t accept it.\n *   > it supports callback-style async work.\n *   > But promises are likely easier to reason about.\n *\n *   [trough]: https://github.com/wooorm/trough#function-fninput-next\n * @param {Input} tree\n *   Tree to handle.\n * @param {VFile} file\n *   File to handle.\n * @param {TransformCallback<Output>} next\n *   Callback.\n * @returns {(\n *   Promise<Output | undefined | void> |\n *   Promise<never> | // For some reason this is needed separately.\n *   Output |\n *   Error |\n *   undefined |\n *   void\n * )}\n *   If you accept `next`, nothing.\n *   Otherwise:\n *\n *   *   `Error` \u2014 fatal error to stop the process\n *   *   `Promise<undefined>` or `undefined` \u2014 the next transformer keeps using\n *       same tree\n *   *   `Promise<Node>` or `Node` \u2014 new, changed, tree\n */\n\n/**\n * @template {Node | undefined} ParseTree\n *   Output of `parse`.\n * @template {Node | undefined} HeadTree\n *   Input for `run`.\n * @template {Node | undefined} TailTree\n *   Output for `run`.\n * @template {Node | undefined} CompileTree\n *   Input of `stringify`.\n * @template {CompileResults | undefined} CompileResult\n *   Output of `stringify`.\n * @template {Node | string | undefined} Input\n *   Input of plugin.\n * @template Output\n *   Output of plugin (optional).\n * @typedef {(\n *   Input extends string\n *     ? Output extends Node | undefined\n *       ? // Parser.\n *         Processor<\n *           Output extends undefined ? ParseTree : Output,\n *           HeadTree,\n *           TailTree,\n *           CompileTree,\n *           CompileResult\n *         >\n *       : // Unknown.\n *         Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>\n *     : Output extends CompileResults\n *     ? Input extends Node | undefined\n *       ? // Compiler.\n *         Processor<\n *           ParseTree,\n *           HeadTree,\n *           TailTree,\n *           Input extends undefined ? CompileTree : Input,\n *           Output extends undefined ? CompileResult : Output\n *         >\n *       : // Unknown.\n *         Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>\n *     : Input extends Node | undefined\n *     ? Output extends Node | undefined\n *       ? // Transform.\n *         Processor<\n *           ParseTree,\n *           HeadTree extends undefined ? Input : HeadTree,\n *           Output extends undefined ? TailTree : Output,\n *           CompileTree,\n *           CompileResult\n *         >\n *       : // Unknown.\n *         Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>\n *     : // Unknown.\n *       Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>\n * )} UsePlugin\n *   Create a processor based on the input/output of a {@link Plugin plugin}.\n */\n\n/**\n * @template {CompileResults | undefined} Result\n *   Node type that the transformer yields.\n * @typedef {(\n *   Result extends Value | undefined ?\n *     VFile :\n *     VFile & {result: Result}\n *   )} VFileWithOutput\n *   Type to generate a {@linkcode VFile} corresponding to a compiler result.\n *\n *   If a result that is not acceptable on a `VFile` is used, that will\n *   be stored on the `result` field of {@linkcode VFile}.\n */\n\nimport {bail} from 'bail'\nimport extend from 'extend'\nimport {ok as assert} from 'devlop'\nimport isPlainObj from 'is-plain-obj'\nimport {trough} from 'trough'\nimport {VFile} from 'vfile'\nimport {CallableInstance} from './callable-instance.js'\n\n// To do: next major: drop `Compiler`, `Parser`: prefer lowercase.\n\n// To do: we could start yielding `never` in TS when a parser is missing and\n// `parse` is called.\n// Currently, we allow directly setting `processor.parser`, which is untyped.\n\nconst own = {}.hasOwnProperty\n\n/**\n * @template {Node | undefined} [ParseTree=undefined]\n *   Output of `parse` (optional).\n * @template {Node | undefined} [HeadTree=undefined]\n *   Input for `run` (optional).\n * @template {Node | undefined} [TailTree=undefined]\n *   Output for `run` (optional).\n * @template {Node | undefined} [CompileTree=undefined]\n *   Input of `stringify` (optional).\n * @template {CompileResults | undefined} [CompileResult=undefined]\n *   Output of `stringify` (optional).\n * @extends {CallableInstance<[], Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>>}\n */\nexport class Processor extends CallableInstance {\n  /**\n   * Create a processor.\n   */\n  constructor() {\n    // If `Processor()` is called (w/o new), `copy` is called instead.\n    super('copy')\n\n    /**\n     * Compiler to use (deprecated).\n     *\n     * @deprecated\n     *   Use `compiler` instead.\n     * @type {(\n     *   Compiler<\n     *     CompileTree extends undefined ? Node : CompileTree,\n     *     CompileResult extends undefined ? CompileResults : CompileResult\n     *   > |\n     *   undefined\n     * )}\n     */\n    this.Compiler = undefined\n\n    /**\n     * Parser to use (deprecated).\n     *\n     * @deprecated\n     *   Use `parser` instead.\n     * @type {(\n     *   Parser<ParseTree extends undefined ? Node : ParseTree> |\n     *   undefined\n     * )}\n     */\n    this.Parser = undefined\n\n    // Note: the following fields are considered private.\n    // However, they are needed for tests, and TSC generates an untyped\n    // `private freezeIndex` field for, which trips `type-coverage` up.\n    // Instead, we use `@deprecated` to visualize that they shouldn\u2019t be used.\n    /**\n     * Internal list of configured plugins.\n     *\n     * @deprecated\n     *   This is a private internal property and should not be used.\n     * @type {Array<PluginTuple<Array<unknown>>>}\n     */\n    this.attachers = []\n\n    /**\n     * Compiler to use.\n     *\n     * @type {(\n     *   Compiler<\n     *     CompileTree extends undefined ? Node : CompileTree,\n     *     CompileResult extends undefined ? CompileResults : CompileResult\n     *   > |\n     *   undefined\n     * )}\n     */\n    this.compiler = undefined\n\n    /**\n     * Internal state to track where we are while freezing.\n     *\n     * @deprecated\n     *   This is a private internal property and should not be used.\n     * @type {number}\n     */\n    this.freezeIndex = -1\n\n    /**\n     * Internal state to track whether we\u2019re frozen.\n     *\n     * @deprecated\n     *   This is a private internal property and should not be used.\n     * @type {boolean | undefined}\n     */\n    this.frozen = undefined\n\n    /**\n     * Internal state.\n     *\n     * @deprecated\n     *   This is a private internal property and should not be used.\n     * @type {Data}\n     */\n    this.namespace = {}\n\n    /**\n     * Parser to use.\n     *\n     * @type {(\n     *   Parser<ParseTree extends undefined ? Node : ParseTree> |\n     *   undefined\n     * )}\n     */\n    this.parser = undefined\n\n    /**\n     * Internal list of configured transformers.\n     *\n     * @deprecated\n     *   This is a private internal property and should not be used.\n     * @type {Pipeline}\n     */\n    this.transformers = trough()\n  }\n\n  /**\n   * Copy a processor.\n   *\n   * @deprecated\n   *   This is a private internal method and should not be used.\n   * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n   *   New *unfrozen* processor ({@linkcode Processor}) that is\n   *   configured to work the same as its ancestor.\n   *   When the descendant processor is configured in the future it does not\n   *   affect the ancestral processor.\n   */\n  copy() {\n    // Cast as the type parameters will be the same after attaching.\n    const destination =\n      /** @type {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>} */ (\n        new Processor()\n      )\n    let index = -1\n\n    while (++index < this.attachers.length) {\n      const attacher = this.attachers[index]\n      destination.use(...attacher)\n    }\n\n    destination.data(extend(true, {}, this.namespace))\n\n    return destination\n  }\n\n  /**\n   * Configure the processor with info available to all plugins.\n   * Information is stored in an object.\n   *\n   * Typically, options can be given to a specific plugin, but sometimes it\n   * makes sense to have information shared with several plugins.\n   * For example, a list of HTML elements that are self-closing, which is\n   * needed during all phases.\n   *\n   * > **Note**: setting information cannot occur on *frozen* processors.\n   * > Call the processor first to create a new unfrozen processor.\n   *\n   * > **Note**: to register custom data in TypeScript, augment the\n   * > {@linkcode Data} interface.\n   *\n   * @example\n   *   This example show how to get and set info:\n   *\n   *   ```js\n   *   import {unified} from 'unified'\n   *\n   *   const processor = unified().data('alpha', 'bravo')\n   *\n   *   processor.data('alpha') // => 'bravo'\n   *\n   *   processor.data() // => {alpha: 'bravo'}\n   *\n   *   processor.data({charlie: 'delta'})\n   *\n   *   processor.data() // => {charlie: 'delta'}\n   *   ```\n   *\n   * @template {keyof Data} Key\n   *\n   * @overload\n   * @returns {Data}\n   *\n   * @overload\n   * @param {Data} dataset\n   * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n   *\n   * @overload\n   * @param {Key} key\n   * @returns {Data[Key]}\n   *\n   * @overload\n   * @param {Key} key\n   * @param {Data[Key]} value\n   * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n   *\n   * @param {Data | Key} [key]\n   *   Key to get or set, or entire dataset to set, or nothing to get the\n   *   entire dataset (optional).\n   * @param {Data[Key]} [value]\n   *   Value to set (optional).\n   * @returns {unknown}\n   *   The current processor when setting, the value at `key` when getting, or\n   *   the entire dataset when getting without key.\n   */\n  data(key, value) {\n    if (typeof key === 'string') {\n      // Set `key`.\n      if (arguments.length === 2) {\n        assertUnfrozen('data', this.frozen)\n        this.namespace[key] = value\n        return this\n      }\n\n      // Get `key`.\n      return (own.call(this.namespace, key) && this.namespace[key]) || undefined\n    }\n\n    // Set space.\n    if (key) {\n      assertUnfrozen('data', this.frozen)\n      this.namespace = key\n      return this\n    }\n\n    // Get space.\n    return this.namespace\n  }\n\n  /**\n   * Freeze a processor.\n   *\n   * Frozen processors are meant to be extended and not to be configured\n   * directly.\n   *\n   * When a processor is frozen it cannot be unfrozen.\n   * New processors working the same way can be created by calling the\n   * processor.\n   *\n   * It\u2019s possible to freeze processors explicitly by calling `.freeze()`.\n   * Processors freeze automatically when `.parse()`, `.run()`, `.runSync()`,\n   * `.stringify()`, `.process()`, or `.processSync()` are called.\n   *\n   * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n   *   The current processor.\n   */\n  freeze() {\n    if (this.frozen) {\n      return this\n    }\n\n    // Cast so that we can type plugins easier.\n    // Plugins are supposed to be usable on different processors, not just on\n    // this exact processor.\n    const self = /** @type {Processor} */ (/** @type {unknown} */ (this))\n\n    while (++this.freezeIndex < this.attachers.length) {\n      const [attacher, ...options] = this.attachers[this.freezeIndex]\n\n      if (options[0] === false) {\n        continue\n      }\n\n      if (options[0] === true) {\n        options[0] = undefined\n      }\n\n      const transformer = attacher.call(self, ...options)\n\n      if (typeof transformer === 'function') {\n        this.transformers.use(transformer)\n      }\n    }\n\n    this.frozen = true\n    this.freezeIndex = Number.POSITIVE_INFINITY\n\n    return this\n  }\n\n  /**\n   * Parse text to a syntax tree.\n   *\n   * > **Note**: `parse` freezes the processor if not already *frozen*.\n   *\n   * > **Note**: `parse` performs the parse phase, not the run phase or other\n   * > phases.\n   *\n   * @param {Compatible | undefined} [file]\n   *   file to parse (optional); typically `string` or `VFile`; any value\n   *   accepted as `x` in `new VFile(x)`.\n   * @returns {ParseTree extends undefined ? Node : ParseTree}\n   *   Syntax tree representing `file`.\n   */\n  parse(file) {\n    this.freeze()\n    const realFile = vfile(file)\n    const parser = this.parser || this.Parser\n    assertParser('parse', parser)\n    return parser(String(realFile), realFile)\n  }\n\n  /**\n   * Process the given file as configured on the processor.\n   *\n   * > **Note**: `process` freezes the processor if not already *frozen*.\n   *\n   * > **Note**: `process` performs the parse, run, and stringify phases.\n   *\n   * @overload\n   * @param {Compatible | undefined} file\n   * @param {ProcessCallback<VFileWithOutput<CompileResult>>} done\n   * @returns {undefined}\n   *\n   * @overload\n   * @param {Compatible | undefined} [file]\n   * @returns {Promise<VFileWithOutput<CompileResult>>}\n   *\n   * @param {Compatible | undefined} [file]\n   *   File (optional); typically `string` or `VFile`]; any value accepted as\n   *   `x` in `new VFile(x)`.\n   * @param {ProcessCallback<VFileWithOutput<CompileResult>> | undefined} [done]\n   *   Callback (optional).\n   * @returns {Promise<VFile> | undefined}\n   *   Nothing if `done` is given.\n   *   Otherwise a promise, rejected with a fatal error or resolved with the\n   *   processed file.\n   *\n   *   The parsed, transformed, and compiled value is available at\n   *   `file.value` (see note).\n   *\n   *   > **Note**: unified typically compiles by serializing: most\n   *   > compilers return `string` (or `Uint8Array`).\n   *   > Some compilers, such as the one configured with\n   *   > [`rehype-react`][rehype-react], return other values (in this case, a\n   *   > React tree).\n   *   > If you\u2019re using a compiler that doesn\u2019t serialize, expect different\n   *   > result values.\n   *   >\n   *   > To register custom results in TypeScript, add them to\n   *   > {@linkcode CompileResultMap}.\n   *\n   *   [rehype-react]: https://github.com/rehypejs/rehype-react\n   */\n  process(file, done) {\n    const self = this\n\n    this.freeze()\n    assertParser('process', this.parser || this.Parser)\n    assertCompiler('process', this.compiler || this.Compiler)\n\n    return done ? executor(undefined, done) : new Promise(executor)\n\n    // Note: `void`s needed for TS.\n    /**\n     * @param {((file: VFileWithOutput<CompileResult>) => undefined | void) | undefined} resolve\n     * @param {(error: Error | undefined) => undefined | void} reject\n     * @returns {undefined}\n     */\n    function executor(resolve, reject) {\n      const realFile = vfile(file)\n      // Assume `ParseTree` (the result of the parser) matches `HeadTree` (the\n      // input of the first transform).\n      const parseTree =\n        /** @type {HeadTree extends undefined ? Node : HeadTree} */ (\n          /** @type {unknown} */ (self.parse(realFile))\n        )\n\n      self.run(parseTree, realFile, function (error, tree, file) {\n        if (error || !tree || !file) {\n          return realDone(error)\n        }\n\n        // Assume `TailTree` (the output of the last transform) matches\n        // `CompileTree` (the input of the compiler).\n        const compileTree =\n          /** @type {CompileTree extends undefined ? Node : CompileTree} */ (\n            /** @type {unknown} */ (tree)\n          )\n\n        const compileResult = self.stringify(compileTree, file)\n\n        if (looksLikeAValue(compileResult)) {\n          file.value = compileResult\n        } else {\n          file.result = compileResult\n        }\n\n        realDone(error, /** @type {VFileWithOutput<CompileResult>} */ (file))\n      })\n\n      /**\n       * @param {Error | undefined} error\n       * @param {VFileWithOutput<CompileResult> | undefined} [file]\n       * @returns {undefined}\n       */\n      function realDone(error, file) {\n        if (error || !file) {\n          reject(error)\n        } else if (resolve) {\n          resolve(file)\n        } else {\n          assert(done, '`done` is defined if `resolve` is not')\n          done(undefined, file)\n        }\n      }\n    }\n  }\n\n  /**\n   * Process the given file as configured on the processor.\n   *\n   * An error is thrown if asynchronous transforms are configured.\n   *\n   * > **Note**: `processSync` freezes the processor if not already *frozen*.\n   *\n   * > **Note**: `processSync` performs the parse, run, and stringify phases.\n   *\n   * @param {Compatible | undefined} [file]\n   *   File (optional); typically `string` or `VFile`; any value accepted as\n   *   `x` in `new VFile(x)`.\n   * @returns {VFileWithOutput<CompileResult>}\n   *   The processed file.\n   *\n   *   The parsed, transformed, and compiled value is available at\n   *   `file.value` (see note).\n   *\n   *   > **Note**: unified typically compiles by serializing: most\n   *   > compilers return `string` (or `Uint8Array`).\n   *   > Some compilers, such as the one configured with\n   *   > [`rehype-react`][rehype-react], return other values (in this case, a\n   *   > React tree).\n   *   > If you\u2019re using a compiler that doesn\u2019t serialize, expect different\n   *   > result values.\n   *   >\n   *   > To register custom results in TypeScript, add them to\n   *   > {@linkcode CompileResultMap}.\n   *\n   *   [rehype-react]: https://github.com/rehypejs/rehype-react\n   */\n  processSync(file) {\n    /** @type {boolean} */\n    let complete = false\n    /** @type {VFileWithOutput<CompileResult> | undefined} */\n    let result\n\n    this.freeze()\n    assertParser('processSync', this.parser || this.Parser)\n    assertCompiler('processSync', this.compiler || this.Compiler)\n\n    this.process(file, realDone)\n    assertDone('processSync', 'process', complete)\n    assert(result, 'we either bailed on an error or have a tree')\n\n    return result\n\n    /**\n     * @type {ProcessCallback<VFileWithOutput<CompileResult>>}\n     */\n    function realDone(error, file) {\n      complete = true\n      bail(error)\n      result = file\n    }\n  }\n\n  /**\n   * Run *transformers* on a syntax tree.\n   *\n   * > **Note**: `run` freezes the processor if not already *frozen*.\n   *\n   * > **Note**: `run` performs the run phase, not other phases.\n   *\n   * @overload\n   * @param {HeadTree extends undefined ? Node : HeadTree} tree\n   * @param {RunCallback<TailTree extends undefined ? Node : TailTree>} done\n   * @returns {undefined}\n   *\n   * @overload\n   * @param {HeadTree extends undefined ? Node : HeadTree} tree\n   * @param {Compatible | undefined} file\n   * @param {RunCallback<TailTree extends undefined ? Node : TailTree>} done\n   * @returns {undefined}\n   *\n   * @overload\n   * @param {HeadTree extends undefined ? Node : HeadTree} tree\n   * @param {Compatible | undefined} [file]\n   * @returns {Promise<TailTree extends undefined ? Node : TailTree>}\n   *\n   * @param {HeadTree extends undefined ? Node : HeadTree} tree\n   *   Tree to transform and inspect.\n   * @param {(\n   *   RunCallback<TailTree extends undefined ? Node : TailTree> |\n   *   Compatible\n   * )} [file]\n   *   File associated with `node` (optional); any value accepted as `x` in\n   *   `new VFile(x)`.\n   * @param {RunCallback<TailTree extends undefined ? Node : TailTree>} [done]\n   *   Callback (optional).\n   * @returns {Promise<TailTree extends undefined ? Node : TailTree> | undefined}\n   *   Nothing if `done` is given.\n   *   Otherwise, a promise rejected with a fatal error or resolved with the\n   *   transformed tree.\n   */\n  run(tree, file, done) {\n    assertNode(tree)\n    this.freeze()\n\n    const transformers = this.transformers\n\n    if (!done && typeof file === 'function') {\n      done = file\n      file = undefined\n    }\n\n    return done ? executor(undefined, done) : new Promise(executor)\n\n    // Note: `void`s needed for TS.\n    /**\n     * @param {(\n     *   ((tree: TailTree extends undefined ? Node : TailTree) => undefined | void) |\n     *   undefined\n     * )} resolve\n     * @param {(error: Error) => undefined | void} reject\n     * @returns {undefined}\n     */\n    function executor(resolve, reject) {\n      assert(\n        typeof file !== 'function',\n        '`file` can\u2019t be a `done` anymore, we checked'\n      )\n      const realFile = vfile(file)\n      transformers.run(tree, realFile, realDone)\n\n      /**\n       * @param {Error | undefined} error\n       * @param {Node} outputTree\n       * @param {VFile} file\n       * @returns {undefined}\n       */\n      function realDone(error, outputTree, file) {\n        const resultingTree =\n          /** @type {TailTree extends undefined ? Node : TailTree} */ (\n            outputTree || tree\n          )\n\n        if (error) {\n          reject(error)\n        } else if (resolve) {\n          resolve(resultingTree)\n        } else {\n          assert(done, '`done` is defined if `resolve` is not')\n          done(undefined, resultingTree, file)\n        }\n      }\n    }\n  }\n\n  /**\n   * Run *transformers* on a syntax tree.\n   *\n   * An error is thrown if asynchronous transforms are configured.\n   *\n   * > **Note**: `runSync` freezes the processor if not already *frozen*.\n   *\n   * > **Note**: `runSync` performs the run phase, not other phases.\n   *\n   * @param {HeadTree extends undefined ? Node : HeadTree} tree\n   *   Tree to transform and inspect.\n   * @param {Compatible | undefined} [file]\n   *   File associated with `node` (optional); any value accepted as `x` in\n   *   `new VFile(x)`.\n   * @returns {TailTree extends undefined ? Node : TailTree}\n   *   Transformed tree.\n   */\n  runSync(tree, file) {\n    /** @type {boolean} */\n    let complete = false\n    /** @type {(TailTree extends undefined ? Node : TailTree) | undefined} */\n    let result\n\n    this.run(tree, file, realDone)\n\n    assertDone('runSync', 'run', complete)\n    assert(result, 'we either bailed on an error or have a tree')\n    return result\n\n    /**\n     * @type {RunCallback<TailTree extends undefined ? Node : TailTree>}\n     */\n    function realDone(error, tree) {\n      bail(error)\n      result = tree\n      complete = true\n    }\n  }\n\n  /**\n   * Compile a syntax tree.\n   *\n   * > **Note**: `stringify` freezes the processor if not already *frozen*.\n   *\n   * > **Note**: `stringify` performs the stringify phase, not the run phase\n   * > or other phases.\n   *\n   * @param {CompileTree extends undefined ? Node : CompileTree} tree\n   *   Tree to compile.\n   * @param {Compatible | undefined} [file]\n   *   File associated with `node` (optional); any value accepted as `x` in\n   *   `new VFile(x)`.\n   * @returns {CompileResult extends undefined ? Value : CompileResult}\n   *   Textual representation of the tree (see note).\n   *\n   *   > **Note**: unified typically compiles by serializing: most compilers\n   *   > return `string` (or `Uint8Array`).\n   *   > Some compilers, such as the one configured with\n   *   > [`rehype-react`][rehype-react], return other values (in this case, a\n   *   > React tree).\n   *   > If you\u2019re using a compiler that doesn\u2019t serialize, expect different\n   *   > result values.\n   *   >\n   *   > To register custom results in TypeScript, add them to\n   *   > {@linkcode CompileResultMap}.\n   *\n   *   [rehype-react]: https://github.com/rehypejs/rehype-react\n   */\n  stringify(tree, file) {\n    this.freeze()\n    const realFile = vfile(file)\n    const compiler = this.compiler || this.Compiler\n    assertCompiler('stringify', compiler)\n    assertNode(tree)\n\n    return compiler(tree, realFile)\n  }\n\n  /**\n   * Configure the processor to use a plugin, a list of usable values, or a\n   * preset.\n   *\n   * If the processor is already using a plugin, the previous plugin\n   * configuration is changed based on the options that are passed in.\n   * In other words, the plugin is not added a second time.\n   *\n   * > **Note**: `use` cannot be called on *frozen* processors.\n   * > Call the processor first to create a new unfrozen processor.\n   *\n   * @example\n   *   There are many ways to pass plugins to `.use()`.\n   *   This example gives an overview:\n   *\n   *   ```js\n   *   import {unified} from 'unified'\n   *\n   *   unified()\n   *     // Plugin with options:\n   *     .use(pluginA, {x: true, y: true})\n   *     // Passing the same plugin again merges configuration (to `{x: true, y: false, z: true}`):\n   *     .use(pluginA, {y: false, z: true})\n   *     // Plugins:\n   *     .use([pluginB, pluginC])\n   *     // Two plugins, the second with options:\n   *     .use([pluginD, [pluginE, {}]])\n   *     // Preset with plugins and settings:\n   *     .use({plugins: [pluginF, [pluginG, {}]], settings: {position: false}})\n   *     // Settings only:\n   *     .use({settings: {position: false}})\n   *   ```\n   *\n   * @template {Array<unknown>} [Parameters=[]]\n   * @template {Node | string | undefined} [Input=undefined]\n   * @template [Output=Input]\n   *\n   * @overload\n   * @param {Preset | null | undefined} [preset]\n   * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n   *\n   * @overload\n   * @param {PluggableList} list\n   * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n   *\n   * @overload\n   * @param {Plugin<Parameters, Input, Output>} plugin\n   * @param {...(Parameters | [boolean])} parameters\n   * @returns {UsePlugin<ParseTree, HeadTree, TailTree, CompileTree, CompileResult, Input, Output>}\n   *\n   * @param {PluggableList | Plugin | Preset | null | undefined} value\n   *   Usable value.\n   * @param {...unknown} parameters\n   *   Parameters, when a plugin is given as a usable value.\n   * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n   *   Current processor.\n   */\n  use(value, ...parameters) {\n    const attachers = this.attachers\n    const namespace = this.namespace\n\n    assertUnfrozen('use', this.frozen)\n\n    if (value === null || value === undefined) {\n      // Empty.\n    } else if (typeof value === 'function') {\n      addPlugin(value, parameters)\n    } else if (typeof value === 'object') {\n      if (Array.isArray(value)) {\n        addList(value)\n      } else {\n        addPreset(value)\n      }\n    } else {\n      throw new TypeError('Expected usable value, not `' + value + '`')\n    }\n\n    return this\n\n    /**\n     * @param {Pluggable} value\n     * @returns {undefined}\n     */\n    function add(value) {\n      if (typeof value === 'function') {\n        addPlugin(value, [])\n      } else if (typeof value === 'object') {\n        if (Array.isArray(value)) {\n          const [plugin, ...parameters] =\n            /** @type {PluginTuple<Array<unknown>>} */ (value)\n          addPlugin(plugin, parameters)\n        } else {\n          addPreset(value)\n        }\n      } else {\n        throw new TypeError('Expected usable value, not `' + value + '`')\n      }\n    }\n\n    /**\n     * @param {Preset} result\n     * @returns {undefined}\n     */\n    function addPreset(result) {\n      if (!('plugins' in result) && !('settings' in result)) {\n        throw new Error(\n          'Expected usable value but received an empty preset, which is probably a mistake: presets typically come with `plugins` and sometimes with `settings`, but this has neither'\n        )\n      }\n\n      addList(result.plugins)\n\n      if (result.settings) {\n        namespace.settings = extend(true, namespace.settings, result.settings)\n      }\n    }\n\n    /**\n     * @param {PluggableList | null | undefined} plugins\n     * @returns {undefined}\n     */\n    function addList(plugins) {\n      let index = -1\n\n      if (plugins === null || plugins === undefined) {\n        // Empty.\n      } else if (Array.isArray(plugins)) {\n        while (++index < plugins.length) {\n          const thing = plugins[index]\n          add(thing)\n        }\n      } else {\n        throw new TypeError('Expected a list of plugins, not `' + plugins + '`')\n      }\n    }\n\n    /**\n     * @param {Plugin} plugin\n     * @param {Array<unknown>} parameters\n     * @returns {undefined}\n     */\n    function addPlugin(plugin, parameters) {\n      let index = -1\n      let entryIndex = -1\n\n      while (++index < attachers.length) {\n        if (attachers[index][0] === plugin) {\n          entryIndex = index\n          break\n        }\n      }\n\n      if (entryIndex === -1) {\n        attachers.push([plugin, ...parameters])\n      }\n      // Only set if there was at least a `primary` value, otherwise we\u2019d change\n      // `arguments.length`.\n      else if (parameters.length > 0) {\n        let [primary, ...rest] = parameters\n        const currentPrimary = attachers[entryIndex][1]\n        if (isPlainObj(currentPrimary) && isPlainObj(primary)) {\n          primary = extend(true, currentPrimary, primary)\n        }\n\n        attachers[entryIndex] = [plugin, primary, ...rest]\n      }\n    }\n  }\n}\n\n// Note: this returns a *callable* instance.\n// That\u2019s why it\u2019s documented as a function.\n/**\n * Create a new processor.\n *\n * @example\n *   This example shows how a new processor can be created (from `remark`) and linked\n *   to **stdin**(4) and **stdout**(4).\n *\n *   ```js\n *   import process from 'node:process'\n *   import concatStream from 'concat-stream'\n *   import {remark} from 'remark'\n *\n *   process.stdin.pipe(\n *     concatStream(function (buf) {\n *       process.stdout.write(String(remark().processSync(buf)))\n *     })\n *   )\n *   ```\n *\n * @returns\n *   New *unfrozen* processor (`processor`).\n *\n *   This processor is configured to work the same as its ancestor.\n *   When the descendant processor is configured in the future it does not\n *   affect the ancestral processor.\n */\nexport const unified = new Processor().freeze()\n\n/**\n * Assert a parser is available.\n *\n * @param {string} name\n * @param {unknown} value\n * @returns {asserts value is Parser}\n */\nfunction assertParser(name, value) {\n  if (typeof value !== 'function') {\n    throw new TypeError('Cannot `' + name + '` without `parser`')\n  }\n}\n\n/**\n * Assert a compiler is available.\n *\n * @param {string} name\n * @param {unknown} value\n * @returns {asserts value is Compiler}\n */\nfunction assertCompiler(name, value) {\n  if (typeof value !== 'function') {\n    throw new TypeError('Cannot `' + name + '` without `compiler`')\n  }\n}\n\n/**\n * Assert the processor is not frozen.\n *\n * @param {string} name\n * @param {unknown} frozen\n * @returns {asserts frozen is false}\n */\nfunction assertUnfrozen(name, frozen) {\n  if (frozen) {\n    throw new Error(\n      'Cannot call `' +\n        name +\n        '` on a frozen processor.\\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.'\n    )\n  }\n}\n\n/**\n * Assert `node` is a unist node.\n *\n * @param {unknown} node\n * @returns {asserts node is Node}\n */\nfunction assertNode(node) {\n  // `isPlainObj` unfortunately uses `any` instead of `unknown`.\n  // type-coverage:ignore-next-line\n  if (!isPlainObj(node) || typeof node.type !== 'string') {\n    throw new TypeError('Expected node, got `' + node + '`')\n    // Fine.\n  }\n}\n\n/**\n * Assert that `complete` is `true`.\n *\n * @param {string} name\n * @param {string} asyncName\n * @param {unknown} complete\n * @returns {asserts complete is true}\n */\nfunction assertDone(name, asyncName, complete) {\n  if (!complete) {\n    throw new Error(\n      '`' + name + '` finished async. Use `' + asyncName + '` instead'\n    )\n  }\n}\n\n/**\n * @param {Compatible | undefined} [value]\n * @returns {VFile}\n */\nfunction vfile(value) {\n  return looksLikeAVFile(value) ? value : new VFile(value)\n}\n\n/**\n * @param {Compatible | undefined} [value]\n * @returns {value is VFile}\n */\nfunction looksLikeAVFile(value) {\n  return Boolean(\n    value &&\n      typeof value === 'object' &&\n      'message' in value &&\n      'messages' in value\n  )\n}\n\n/**\n * @param {unknown} [value]\n * @returns {value is Value}\n */\nfunction looksLikeAValue(value) {\n  return typeof value === 'string' || isUint8Array(value)\n}\n\n/**\n * Assert `value` is an `Uint8Array`.\n *\n * @param {unknown} value\n *   thing.\n * @returns {value is Uint8Array}\n *   Whether `value` is an `Uint8Array`.\n */\nfunction isUint8Array(value) {\n  return Boolean(\n    value &&\n      typeof value === 'object' &&\n      'byteLength' in value &&\n      'byteOffset' in value\n  )\n}\n", "export default function isPlainObject(value) {\n\tif (typeof value !== 'object' || value === null) {\n\t\treturn false;\n\t}\n\n\tconst prototype = Object.getPrototypeOf(value);\n\treturn (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value);\n}\n", "/**\n * @typedef {(error?: Error|null|undefined, ...output: Array<any>) => void} Callback\n * @typedef {(...input: Array<any>) => any} Middleware\n *\n * @typedef {(...input: Array<any>) => void} Run\n *   Call all middleware.\n * @typedef {(fn: Middleware) => Pipeline} Use\n *   Add `fn` (middleware) to the list.\n * @typedef {{run: Run, use: Use}} Pipeline\n *   Middleware.\n */\n\n/**\n * Create new middleware.\n *\n * @returns {Pipeline}\n */\nexport function trough() {\n  /** @type {Array<Middleware>} */\n  const fns = []\n  /** @type {Pipeline} */\n  const pipeline = {run, use}\n\n  return pipeline\n\n  /** @type {Run} */\n  function run(...values) {\n    let middlewareIndex = -1\n    /** @type {Callback} */\n    const callback = values.pop()\n\n    if (typeof callback !== 'function') {\n      throw new TypeError('Expected function as last argument, not ' + callback)\n    }\n\n    next(null, ...values)\n\n    /**\n     * Run the next `fn`, or we\u2019re done.\n     *\n     * @param {Error|null|undefined} error\n     * @param {Array<any>} output\n     */\n    function next(error, ...output) {\n      const fn = fns[++middlewareIndex]\n      let index = -1\n\n      if (error) {\n        callback(error)\n        return\n      }\n\n      // Copy non-nullish input into values.\n      while (++index < values.length) {\n        if (output[index] === null || output[index] === undefined) {\n          output[index] = values[index]\n        }\n      }\n\n      // Save the newly created `output` for the next call.\n      values = output\n\n      // Next or done.\n      if (fn) {\n        wrap(fn, next)(...output)\n      } else {\n        callback(null, ...output)\n      }\n    }\n  }\n\n  /** @type {Use} */\n  function use(middelware) {\n    if (typeof middelware !== 'function') {\n      throw new TypeError(\n        'Expected `middelware` to be a function, not ' + middelware\n      )\n    }\n\n    fns.push(middelware)\n    return pipeline\n  }\n}\n\n/**\n * Wrap `middleware`.\n * Can be sync or async; return a promise, receive a callback, or return new\n * values and errors.\n *\n * @param {Middleware} middleware\n * @param {Callback} callback\n */\nexport function wrap(middleware, callback) {\n  /** @type {boolean} */\n  let called\n\n  return wrapped\n\n  /**\n   * Call `middleware`.\n   * @this {any}\n   * @param {Array<any>} parameters\n   * @returns {void}\n   */\n  function wrapped(...parameters) {\n    const fnExpectsCallback = middleware.length > parameters.length\n    /** @type {any} */\n    let result\n\n    if (fnExpectsCallback) {\n      parameters.push(done)\n    }\n\n    try {\n      result = middleware.apply(this, parameters)\n    } catch (error) {\n      const exception = /** @type {Error} */ (error)\n\n      // Well, this is quite the pickle.\n      // `middleware` received a callback and called it synchronously, but that\n      // threw an error.\n      // The only thing left to do is to throw the thing instead.\n      if (fnExpectsCallback && called) {\n        throw exception\n      }\n\n      return done(exception)\n    }\n\n    if (!fnExpectsCallback) {\n      if (result instanceof Promise) {\n        result.then(then, done)\n      } else if (result instanceof Error) {\n        done(result)\n      } else {\n        then(result)\n      }\n    }\n  }\n\n  /**\n   * Call `callback`, only once.\n   * @type {Callback}\n   */\n  function done(error, ...output) {\n    if (!called) {\n      called = true\n      callback(error, ...output)\n    }\n  }\n\n  /**\n   * Call `done` with one value.\n   *\n   * @param {any} [value]\n   */\n  function then(value) {\n    done(null, value)\n  }\n}\n", "export {default as minpath} from 'node:path'\n", "export {default as minproc} from 'node:process'\n", "export {fileURLToPath as urlToPath} from 'node:url'\nexport {isUrl} from './minurl.shared.js'\n", "/**\n * Checks if a value has the shape of a WHATWG URL object.\n *\n * Using a symbol or instanceof would not be able to recognize URL objects\n * coming from other implementations (e.g. in Electron), so instead we are\n * checking some well known properties for a lack of a better test.\n *\n * We use `href` and `protocol` as they are the only properties that are\n * easy to retrieve and calculate due to the lazy nature of the getters.\n *\n * We check for auth attribute to distinguish legacy url instance with\n * WHATWG URL instance.\n *\n * @param {unknown} fileUrlOrPath\n *   File path or URL.\n * @returns {fileUrlOrPath is URL}\n *   Whether it\u2019s a URL.\n */\n// From: <https://github.com/nodejs/node/blob/6a3403c/lib/internal/url.js#L720>\nexport function isUrl(fileUrlOrPath) {\n  return Boolean(\n    fileUrlOrPath !== null &&\n      typeof fileUrlOrPath === 'object' &&\n      'href' in fileUrlOrPath &&\n      fileUrlOrPath.href &&\n      'protocol' in fileUrlOrPath &&\n      fileUrlOrPath.protocol &&\n      // @ts-expect-error: indexing is fine.\n      fileUrlOrPath.auth === undefined\n  )\n}\n", "/**\n * @import {Node, Point, Position} from 'unist'\n * @import {Options as MessageOptions} from 'vfile-message'\n * @import {Compatible, Data, Map, Options, Value} from 'vfile'\n */\n\n/**\n * @typedef {object & {type: string, position?: Position | undefined}} NodeLike\n */\n\nimport {VFileMessage} from 'vfile-message'\nimport {minpath} from '#minpath'\nimport {minproc} from '#minproc'\nimport {urlToPath, isUrl} from '#minurl'\n\n/**\n * Order of setting (least specific to most), we need this because otherwise\n * `{stem: 'a', path: '~/b.js'}` would throw, as a path is needed before a\n * stem can be set.\n */\nconst order = /** @type {const} */ ([\n  'history',\n  'path',\n  'basename',\n  'stem',\n  'extname',\n  'dirname'\n])\n\nexport class VFile {\n  /**\n   * Create a new virtual file.\n   *\n   * `options` is treated as:\n   *\n   * *   `string` or `Uint8Array` \u2014 `{value: options}`\n   * *   `URL` \u2014 `{path: options}`\n   * *   `VFile` \u2014 shallow copies its data over to the new file\n   * *   `object` \u2014 all fields are shallow copied over to the new file\n   *\n   * Path related fields are set in the following order (least specific to\n   * most specific): `history`, `path`, `basename`, `stem`, `extname`,\n   * `dirname`.\n   *\n   * You cannot set `dirname` or `extname` without setting either `history`,\n   * `path`, `basename`, or `stem` too.\n   *\n   * @param {Compatible | null | undefined} [value]\n   *   File value.\n   * @returns\n   *   New instance.\n   */\n  constructor(value) {\n    /** @type {Options | VFile} */\n    let options\n\n    if (!value) {\n      options = {}\n    } else if (isUrl(value)) {\n      options = {path: value}\n    } else if (typeof value === 'string' || isUint8Array(value)) {\n      options = {value}\n    } else {\n      options = value\n    }\n\n    /* eslint-disable no-unused-expressions */\n\n    /**\n     * Base of `path` (default: `process.cwd()` or `'/'` in browsers).\n     *\n     * @type {string}\n     */\n    // Prevent calling `cwd` (which could be expensive) if it\u2019s not needed;\n    // the empty string will be overridden in the next block.\n    this.cwd = 'cwd' in options ? '' : minproc.cwd()\n\n    /**\n     * Place to store custom info (default: `{}`).\n     *\n     * It\u2019s OK to store custom data directly on the file but moving it to\n     * `data` is recommended.\n     *\n     * @type {Data}\n     */\n    this.data = {}\n\n    /**\n     * List of file paths the file moved between.\n     *\n     * The first is the original path and the last is the current path.\n     *\n     * @type {Array<string>}\n     */\n    this.history = []\n\n    /**\n     * List of messages associated with the file.\n     *\n     * @type {Array<VFileMessage>}\n     */\n    this.messages = []\n\n    /**\n     * Raw value.\n     *\n     * @type {Value}\n     */\n    this.value\n\n    // The below are non-standard, they are \u201Cwell-known\u201D.\n    // As in, used in several tools.\n    /**\n     * Source map.\n     *\n     * This type is equivalent to the `RawSourceMap` type from the `source-map`\n     * module.\n     *\n     * @type {Map | null | undefined}\n     */\n    this.map\n\n    /**\n     * Custom, non-string, compiled, representation.\n     *\n     * This is used by unified to store non-string results.\n     * One example is when turning markdown into React nodes.\n     *\n     * @type {unknown}\n     */\n    this.result\n\n    /**\n     * Whether a file was saved to disk.\n     *\n     * This is used by vfile reporters.\n     *\n     * @type {boolean}\n     */\n    this.stored\n    /* eslint-enable no-unused-expressions */\n\n    // Set path related properties in the correct order.\n    let index = -1\n\n    while (++index < order.length) {\n      const field = order[index]\n\n      // Note: we specifically use `in` instead of `hasOwnProperty` to accept\n      // `vfile`s too.\n      if (\n        field in options &&\n        options[field] !== undefined &&\n        options[field] !== null\n      ) {\n        // @ts-expect-error: TS doesn\u2019t understand basic reality.\n        this[field] = field === 'history' ? [...options[field]] : options[field]\n      }\n    }\n\n    /** @type {string} */\n    let field\n\n    // Set non-path related properties.\n    for (field in options) {\n      // @ts-expect-error: fine to set other things.\n      if (!order.includes(field)) {\n        // @ts-expect-error: fine to set other things.\n        this[field] = options[field]\n      }\n    }\n  }\n\n  /**\n   * Get the basename (including extname) (example: `'index.min.js'`).\n   *\n   * @returns {string | undefined}\n   *   Basename.\n   */\n  get basename() {\n    return typeof this.path === 'string'\n      ? minpath.basename(this.path)\n      : undefined\n  }\n\n  /**\n   * Set basename (including extname) (`'index.min.js'`).\n   *\n   * Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\\'`\n   * on windows).\n   * Cannot be nullified (use `file.path = file.dirname` instead).\n   *\n   * @param {string} basename\n   *   Basename.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  set basename(basename) {\n    assertNonEmpty(basename, 'basename')\n    assertPart(basename, 'basename')\n    this.path = minpath.join(this.dirname || '', basename)\n  }\n\n  /**\n   * Get the parent path (example: `'~'`).\n   *\n   * @returns {string | undefined}\n   *   Dirname.\n   */\n  get dirname() {\n    return typeof this.path === 'string'\n      ? minpath.dirname(this.path)\n      : undefined\n  }\n\n  /**\n   * Set the parent path (example: `'~'`).\n   *\n   * Cannot be set if there\u2019s no `path` yet.\n   *\n   * @param {string | undefined} dirname\n   *   Dirname.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  set dirname(dirname) {\n    assertPath(this.basename, 'dirname')\n    this.path = minpath.join(dirname || '', this.basename)\n  }\n\n  /**\n   * Get the extname (including dot) (example: `'.js'`).\n   *\n   * @returns {string | undefined}\n   *   Extname.\n   */\n  get extname() {\n    return typeof this.path === 'string'\n      ? minpath.extname(this.path)\n      : undefined\n  }\n\n  /**\n   * Set the extname (including dot) (example: `'.js'`).\n   *\n   * Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\\'`\n   * on windows).\n   * Cannot be set if there\u2019s no `path` yet.\n   *\n   * @param {string | undefined} extname\n   *   Extname.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  set extname(extname) {\n    assertPart(extname, 'extname')\n    assertPath(this.dirname, 'extname')\n\n    if (extname) {\n      if (extname.codePointAt(0) !== 46 /* `.` */) {\n        throw new Error('`extname` must start with `.`')\n      }\n\n      if (extname.includes('.', 1)) {\n        throw new Error('`extname` cannot contain multiple dots')\n      }\n    }\n\n    this.path = minpath.join(this.dirname, this.stem + (extname || ''))\n  }\n\n  /**\n   * Get the full path (example: `'~/index.min.js'`).\n   *\n   * @returns {string}\n   *   Path.\n   */\n  get path() {\n    return this.history[this.history.length - 1]\n  }\n\n  /**\n   * Set the full path (example: `'~/index.min.js'`).\n   *\n   * Cannot be nullified.\n   * You can set a file URL (a `URL` object with a `file:` protocol) which will\n   * be turned into a path with `url.fileURLToPath`.\n   *\n   * @param {URL | string} path\n   *   Path.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  set path(path) {\n    if (isUrl(path)) {\n      path = urlToPath(path)\n    }\n\n    assertNonEmpty(path, 'path')\n\n    if (this.path !== path) {\n      this.history.push(path)\n    }\n  }\n\n  /**\n   * Get the stem (basename w/o extname) (example: `'index.min'`).\n   *\n   * @returns {string | undefined}\n   *   Stem.\n   */\n  get stem() {\n    return typeof this.path === 'string'\n      ? minpath.basename(this.path, this.extname)\n      : undefined\n  }\n\n  /**\n   * Set the stem (basename w/o extname) (example: `'index.min'`).\n   *\n   * Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\\'`\n   * on windows).\n   * Cannot be nullified (use `file.path = file.dirname` instead).\n   *\n   * @param {string} stem\n   *   Stem.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  set stem(stem) {\n    assertNonEmpty(stem, 'stem')\n    assertPart(stem, 'stem')\n    this.path = minpath.join(this.dirname || '', stem + (this.extname || ''))\n  }\n\n  // Normal prototypal methods.\n  /**\n   * Create a fatal message for `reason` associated with the file.\n   *\n   * The `fatal` field of the message is set to `true` (error; file not usable)\n   * and the `file` field is set to the current file path.\n   * The message is added to the `messages` field on `file`.\n   *\n   * > \uD83E\uDEA6 **Note**: also has obsolete signatures.\n   *\n   * @overload\n   * @param {string} reason\n   * @param {MessageOptions | null | undefined} [options]\n   * @returns {never}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns {never}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns {never}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {string | null | undefined} [origin]\n   * @returns {never}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns {never}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns {never}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {string | null | undefined} [origin]\n   * @returns {never}\n   *\n   * @param {Error | VFileMessage | string} causeOrReason\n   *   Reason for message, should use markdown.\n   * @param {Node | NodeLike | MessageOptions | Point | Position | string | null | undefined} [optionsOrParentOrPlace]\n   *   Configuration (optional).\n   * @param {string | null | undefined} [origin]\n   *   Place in code where the message originates (example:\n   *   `'my-package:my-rule'` or `'my-rule'`).\n   * @returns {never}\n   *   Never.\n   * @throws {VFileMessage}\n   *   Message.\n   */\n  fail(causeOrReason, optionsOrParentOrPlace, origin) {\n    // @ts-expect-error: the overloads are fine.\n    const message = this.message(causeOrReason, optionsOrParentOrPlace, origin)\n\n    message.fatal = true\n\n    throw message\n  }\n\n  /**\n   * Create an info message for `reason` associated with the file.\n   *\n   * The `fatal` field of the message is set to `undefined` (info; change\n   * likely not needed) and the `file` field is set to the current file path.\n   * The message is added to the `messages` field on `file`.\n   *\n   * > \uD83E\uDEA6 **Note**: also has obsolete signatures.\n   *\n   * @overload\n   * @param {string} reason\n   * @param {MessageOptions | null | undefined} [options]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @param {Error | VFileMessage | string} causeOrReason\n   *   Reason for message, should use markdown.\n   * @param {Node | NodeLike | MessageOptions | Point | Position | string | null | undefined} [optionsOrParentOrPlace]\n   *   Configuration (optional).\n   * @param {string | null | undefined} [origin]\n   *   Place in code where the message originates (example:\n   *   `'my-package:my-rule'` or `'my-rule'`).\n   * @returns {VFileMessage}\n   *   Message.\n   */\n  info(causeOrReason, optionsOrParentOrPlace, origin) {\n    // @ts-expect-error: the overloads are fine.\n    const message = this.message(causeOrReason, optionsOrParentOrPlace, origin)\n\n    message.fatal = undefined\n\n    return message\n  }\n\n  /**\n   * Create a message for `reason` associated with the file.\n   *\n   * The `fatal` field of the message is set to `false` (warning; change may be\n   * needed) and the `file` field is set to the current file path.\n   * The message is added to the `messages` field on `file`.\n   *\n   * > \uD83E\uDEA6 **Note**: also has obsolete signatures.\n   *\n   * @overload\n   * @param {string} reason\n   * @param {MessageOptions | null | undefined} [options]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @param {Error | VFileMessage | string} causeOrReason\n   *   Reason for message, should use markdown.\n   * @param {Node | NodeLike | MessageOptions | Point | Position | string | null | undefined} [optionsOrParentOrPlace]\n   *   Configuration (optional).\n   * @param {string | null | undefined} [origin]\n   *   Place in code where the message originates (example:\n   *   `'my-package:my-rule'` or `'my-rule'`).\n   * @returns {VFileMessage}\n   *   Message.\n   */\n  message(causeOrReason, optionsOrParentOrPlace, origin) {\n    const message = new VFileMessage(\n      // @ts-expect-error: the overloads are fine.\n      causeOrReason,\n      optionsOrParentOrPlace,\n      origin\n    )\n\n    if (this.path) {\n      message.name = this.path + ':' + message.name\n      message.file = this.path\n    }\n\n    message.fatal = false\n\n    this.messages.push(message)\n\n    return message\n  }\n\n  /**\n   * Serialize the file.\n   *\n   * > **Note**: which encodings are supported depends on the engine.\n   * > For info on Node.js, see:\n   * > <https://nodejs.org/api/util.html#whatwg-supported-encodings>.\n   *\n   * @param {string | null | undefined} [encoding='utf8']\n   *   Character encoding to understand `value` as when it\u2019s a `Uint8Array`\n   *   (default: `'utf-8'`).\n   * @returns {string}\n   *   Serialized file.\n   */\n  toString(encoding) {\n    if (this.value === undefined) {\n      return ''\n    }\n\n    if (typeof this.value === 'string') {\n      return this.value\n    }\n\n    const decoder = new TextDecoder(encoding || undefined)\n    return decoder.decode(this.value)\n  }\n}\n\n/**\n * Assert that `part` is not a path (as in, does not contain `path.sep`).\n *\n * @param {string | null | undefined} part\n *   File path part.\n * @param {string} name\n *   Part name.\n * @returns {undefined}\n *   Nothing.\n */\nfunction assertPart(part, name) {\n  if (part && part.includes(minpath.sep)) {\n    throw new Error(\n      '`' + name + '` cannot be a path: did not expect `' + minpath.sep + '`'\n    )\n  }\n}\n\n/**\n * Assert that `part` is not empty.\n *\n * @param {string | undefined} part\n *   Thing.\n * @param {string} name\n *   Part name.\n * @returns {asserts part is string}\n *   Nothing.\n */\nfunction assertNonEmpty(part, name) {\n  if (!part) {\n    throw new Error('`' + name + '` cannot be empty')\n  }\n}\n\n/**\n * Assert `path` exists.\n *\n * @param {string | undefined} path\n *   Path.\n * @param {string} name\n *   Dependency name.\n * @returns {asserts path is string}\n *   Nothing.\n */\nfunction assertPath(path, name) {\n  if (!path) {\n    throw new Error('Setting `' + name + '` requires `path` to be set too')\n  }\n}\n\n/**\n * Assert `value` is an `Uint8Array`.\n *\n * @param {unknown} value\n *   thing.\n * @returns {value is Uint8Array}\n *   Whether `value` is an `Uint8Array`.\n */\nfunction isUint8Array(value) {\n  return Boolean(\n    value &&\n      typeof value === 'object' &&\n      'byteLength' in value &&\n      'byteOffset' in value\n  )\n}\n", "export const CallableInstance =\n  /**\n   * @type {new <Parameters extends Array<unknown>, Result>(property: string | symbol) => (...parameters: Parameters) => Result}\n   */\n  (\n    /** @type {unknown} */\n    (\n      /**\n       * @this {Function}\n       * @param {string | symbol} property\n       * @returns {(...parameters: Array<unknown>) => unknown}\n       */\n      function (property) {\n        const self = this\n        const constr = self.constructor\n        const proto = /** @type {Record<string | symbol, Function>} */ (\n          // Prototypes do exist.\n          // type-coverage:ignore-next-line\n          constr.prototype\n        )\n        const value = proto[property]\n        /** @type {(...parameters: Array<unknown>) => unknown} */\n        const apply = function () {\n          return value.apply(apply, arguments)\n        }\n\n        Object.setPrototypeOf(apply, proto)\n\n        // Not needed for us in `unified`: we only call this on the `copy`\n        // function,\n        // and we don't need to add its fields (`length`, `name`)\n        // over.\n        // See also: GH-246.\n        // const names = Object.getOwnPropertyNames(value)\n        //\n        // for (const p of names) {\n        //   const descriptor = Object.getOwnPropertyDescriptor(value, p)\n        //   if (descriptor) Object.defineProperty(apply, p, descriptor)\n        // }\n\n        return apply\n      }\n    )\n  )\n", "import React, { useCallback, useMemo } from 'react';\n\nimport { useDeleteHandler, useUserRole } from './hooks';\nimport { MessageDeleted as DefaultMessageDeleted } from './MessageDeleted';\nimport { MessageTimestamp } from './MessageTimestamp';\nimport { getMessageActions } from './utils';\n\nimport { Avatar } from '../Avatar';\nimport { Gallery } from '../Gallery';\nimport { MessageActions } from '../MessageActions';\n\nimport { useChatContext } from '../../context/ChatContext';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { useMessageContext } from '../../context/MessageContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { renderText } from './renderText';\n\nimport type { LocalMessage, TranslationLanguages } from 'stream-chat';\n\nconst selectColor = (number: number, dark: boolean) => {\n  const hue = number * 137.508; // use golden angle approximation\n  return `hsl(${hue},${dark ? '50%' : '85%'}, ${dark ? '75%' : '55%'})`;\n};\n\nconst hashUserId = (userId: string) => {\n  const hash = userId.split('').reduce((acc, c) => {\n    acc = (acc << 5) - acc + c.charCodeAt(0);\n    return acc & acc;\n  }, 0);\n  return Math.abs(hash) / 10 ** Math.ceil(Math.log10(Math.abs(hash) + 1));\n};\n\nconst getUserColor = (theme: string, userId: string) =>\n  selectColor(hashUserId(userId), theme.includes('dark'));\n\nexport type FixedHeightMessageProps = {\n  groupedByUser?: boolean;\n  message?: LocalMessage;\n};\n\nconst UnMemoizedFixedHeightMessage = (props: FixedHeightMessageProps) => {\n  const { groupedByUser: propGroupedByUser, message: propMessage } = props;\n\n  const { theme } = useChatContext('FixedHeightMessage');\n\n  const { groupedByUser: contextGroupedByUser, message: contextMessage } =\n    useMessageContext('FixedHeightMessage');\n\n  const { MessageDeleted = DefaultMessageDeleted } =\n    useComponentContext('FixedHeightMessage');\n\n  const { userLanguage } = useTranslationContext('FixedHeightMessage');\n\n  const groupedByUser =\n    propGroupedByUser !== undefined ? propGroupedByUser : contextGroupedByUser;\n  const message = propMessage || contextMessage;\n\n  const handleDelete = useDeleteHandler(message);\n  const role = useUserRole(message);\n\n  const messageTextToRender =\n    message?.i18n?.[`${userLanguage}_text` as `${TranslationLanguages}_text`] ||\n    message?.text;\n\n  const renderedText = useMemo(\n    () => renderText(messageTextToRender, message.mentioned_users),\n    [message.mentioned_users, messageTextToRender],\n  );\n\n  const userId = message.user?.id || '';\n  const userColor = useMemo(() => getUserColor(theme, userId), [userId, theme]);\n\n  const messageActionsHandler = useCallback(\n    () => getMessageActions(['delete'], { canDelete: role.canDelete }),\n    [role],\n  );\n\n  const images = message?.attachments?.filter(({ type }) => type === 'image');\n\n  return (\n    <div\n      className={`str-chat__virtual-message__wrapper ${\n        role.isMyMessage ? 'str-chat__virtual-message__wrapper--me' : ''\n      } ${groupedByUser ? 'str-chat__virtual-message__wrapper--group' : ''}`}\n      key={message.id}\n    >\n      {message.user && (\n        <Avatar\n          image={message.user.image}\n          name={message.user.name || message.user.id}\n          user={message.user}\n        />\n      )}\n      <div className='str-chat__virtual-message__content'>\n        <div className='str-chat__virtual-message__meta'>\n          <div className='str-chat__virtual-message__author' style={{ color: userColor }}>\n            <strong>{message.user?.name || 'unknown'}</strong>\n          </div>\n        </div>\n        {message.deleted_at || message.type === 'deleted' ? (\n          <MessageDeleted message={message} />\n        ) : (\n          <>\n            {images && <Gallery images={images} />}\n            <div className='str-chat__virtual-message__text' data-testid='msg-text'>\n              {renderedText}\n              <div className='str-chat__virtual-message__data'>\n                <MessageActions\n                  customWrapperClass='str-chat__virtual-message__actions'\n                  getMessageActions={messageActionsHandler}\n                  handleDelete={handleDelete}\n                  message={message}\n                  mine={() => role.isMyMessage}\n                />\n                <span className='str-chat__virtual-message__date'>\n                  <MessageTimestamp\n                    customClass='str-chat__message-simple-timestamp'\n                    message={message}\n                  />\n                </span>\n              </div>\n            </div>\n          </>\n        )}\n      </div>\n    </div>\n  );\n};\n\n/**\n * @deprecated - This UI component will be removed in the next major release.\n *\n * FixedHeightMessage - This component renders a single message.\n * It uses fixed height elements to make sure it works well in VirtualizedMessageList\n */\nexport const FixedHeightMessage = React.memo(\n  UnMemoizedFixedHeightMessage,\n) as typeof UnMemoizedFixedHeightMessage;\n", "import { useCallback, useRef } from 'react';\n\nexport type StableCallback<A extends unknown[], R> = (...args: A) => R;\n\n/**\n * A utility hook implementing a stable callback. It takes in an unstable method that\n * is supposed to be invoked somewhere deeper in the DOM tree without making it\n * change its reference every time the parent component rerenders. It will also return\n * the value of the callback if it does return one.\n * A common use-case would be having a function whose invocation depends on state\n * somewhere high up in the DOM tree and wanting to use the same function deeper\n * down, for example in a leaf node and simply using useCallback results in\n * cascading dependency hell. If we wrap it in useStableCallback, we would be able\n * to:\n * - Use the same function as a dependency of another hook (since it is stable)\n * - Still invoke it and get the latest state\n *\n * **Caveats:**\n * - Never wrap a function that is supposed to return a React.ReactElement in\n *   useStableCallback, since React will not know that the DOM needs to be updated\n *   whenever the callback value changes (for example, renderItem from FlatList must\n *   never be wrapped in this hook)\n * - Always prefer using a standard useCallback/stable function wherever possible\n *   (the purpose of useStableCallback is to bridge the gap between top level contexts\n *   and cascading rereders in downstream components - **not** as an escape hatch)\n * @param callback - the callback we want to stabilize\n */\nexport const useStableCallback = <A extends unknown[], R>(\n  callback: StableCallback<A, R>,\n): StableCallback<A, R> => {\n  const ref = useRef(callback);\n  ref.current = callback;\n\n  return useCallback<StableCallback<A, R>>((...args) => ref.current(...args), []);\n};\n", "import { useChannelActionContext } from '../../../context/ChannelActionContext';\nimport { useChannelStateContext } from '../../../context/ChannelStateContext';\n\nimport type React from 'react';\nimport type { LocalMessage } from 'stream-chat';\nimport { useStableCallback } from '../../../utils/useStableCallback';\n\nexport type FormData = Record<string, string>;\n\nexport type ActionHandlerReturnType = (\n  dataOrName?: string | FormData,\n  value?: string,\n  event?: React.BaseSyntheticEvent,\n) => Promise<void> | void;\n\nexport const handleActionWarning = `Action handler was called, but it is missing one of its required arguments. \nMake sure the ChannelAction and ChannelState contexts are properly set and the hook is initialized with a valid message.`;\n\nexport function useActionHandler(message?: LocalMessage): ActionHandlerReturnType {\n  const { removeMessage, updateMessage } = useChannelActionContext('useActionHandler');\n  const { channel } = useChannelStateContext('useActionHandler');\n\n  return useStableCallback(async (dataOrName, value, event) => {\n    if (event) event.preventDefault();\n\n    if (!message || !updateMessage || !removeMessage || !channel) {\n      console.warn(handleActionWarning);\n      return;\n    }\n\n    const messageId = message.id;\n    let formData: FormData = {};\n\n    // deprecated: value&name should be removed in favor of data obj\n    if (typeof dataOrName === 'string') {\n      formData[dataOrName] = value as string;\n    } else {\n      formData = { ...dataOrName };\n    }\n\n    if (messageId) {\n      const data = await channel.sendAction(messageId, formData);\n\n      if (data?.message) {\n        updateMessage(data.message);\n      } else {\n        removeMessage(message);\n      }\n    }\n  });\n}\n", "import deepequal from 'react-fast-compare';\nimport emojiRegex from 'emoji-regex';\n\nimport type { TFunction } from 'i18next';\nimport type {\n  ChannelConfigWithInfo,\n  LocalMessage,\n  LocalMessageBase,\n  MessageResponse,\n  Mute,\n  StreamChat,\n  UserResponse,\n} from 'stream-chat';\nimport type { PinPermissions } from './hooks';\nimport type { MessageProps } from './types';\nimport type {\n  ComponentContextValue,\n  CustomMessageActions,\n  MessageContextValue,\n} from '../../context';\n\n/**\n * Following function validates a function which returns notification message.\n * It validates if the first parameter is function and also if return value of function is string or no.\n */\nexport const validateAndGetMessage = <T extends unknown[]>(\n  func: (...args: T) => unknown,\n  args: T,\n) => {\n  if (!func || typeof func !== 'function') return null;\n\n  // below is due to tests passing a single argument\n  // rather than an array.\n  if (!Array.isArray(args)) {\n    args = [args] as unknown as T;\n  }\n\n  const returnValue = func(...args);\n\n  if (typeof returnValue !== 'string') return null;\n\n  return returnValue;\n};\n\n/**\n * Tell if the owner of the current message is muted\n */\nexport const isUserMuted = (message: LocalMessage, mutes?: Mute[]) => {\n  if (!mutes || !message) return false;\n\n  const userMuted = mutes.filter((el) => el.target.id === message.user?.id);\n  return !!userMuted.length;\n};\n\nexport const OPTIONAL_MESSAGE_ACTIONS = {\n  deleteForMe: 'deleteForMe',\n};\n\nexport const MESSAGE_ACTIONS = {\n  delete: 'delete',\n  edit: 'edit',\n  flag: 'flag',\n  markUnread: 'markUnread',\n  mute: 'mute',\n  pin: 'pin',\n  quote: 'quote',\n  react: 'react',\n  remindMe: 'remindMe',\n  reply: 'reply',\n  saveForLater: 'saveForLater',\n};\n\nexport type MessageActionsArray<T extends string = string> = Array<\n  keyof typeof MESSAGE_ACTIONS | keyof typeof OPTIONAL_MESSAGE_ACTIONS | T\n>;\n\n// @deprecated in favor of `channelCapabilities` - TODO: remove in next major release\nexport const defaultPinPermissions: PinPermissions = {\n  commerce: {\n    admin: true,\n    anonymous: false,\n    channel_member: false,\n    channel_moderator: true,\n    guest: false,\n    member: false,\n    moderator: true,\n    owner: true,\n    user: false,\n  },\n  gaming: {\n    admin: true,\n    anonymous: false,\n    channel_member: false,\n    channel_moderator: true,\n    guest: false,\n    member: false,\n    moderator: true,\n    owner: false,\n    user: false,\n  },\n  livestream: {\n    admin: true,\n    anonymous: false,\n    channel_member: false,\n    channel_moderator: true,\n    guest: false,\n    member: false,\n    moderator: true,\n    owner: true,\n    user: false,\n  },\n  messaging: {\n    admin: true,\n    anonymous: false,\n    channel_member: true,\n    channel_moderator: true,\n    guest: false,\n    member: true,\n    moderator: true,\n    owner: true,\n    user: false,\n  },\n  team: {\n    admin: true,\n    anonymous: false,\n    channel_member: true,\n    channel_moderator: true,\n    guest: false,\n    member: true,\n    moderator: true,\n    owner: true,\n    user: false,\n  },\n};\n\nexport type Capabilities = {\n  canDelete?: boolean;\n  canEdit?: boolean;\n  canFlag?: boolean;\n  canMarkUnread?: boolean;\n  canMute?: boolean;\n  canPin?: boolean;\n  canQuote?: boolean;\n  canReact?: boolean;\n  canReply?: boolean;\n};\n\nexport const getMessageActions = (\n  actions: MessageActionsArray | boolean,\n  {\n    canDelete,\n    canEdit,\n    canFlag,\n    canMarkUnread,\n    canMute,\n    canPin,\n    canQuote,\n    canReact,\n    canReply,\n  }: Capabilities,\n  channelConfig?: ChannelConfigWithInfo,\n): MessageActionsArray => {\n  const messageActionsAfterPermission: MessageActionsArray = [];\n  let messageActions: MessageActionsArray = [];\n\n  if (actions && typeof actions === 'boolean') {\n    // If value of actions is true, then populate all the possible values\n    messageActions = Object.keys(MESSAGE_ACTIONS);\n  } else if (actions && actions.length > 0) {\n    messageActions = [...actions];\n  } else {\n    return [];\n  }\n\n  if (canDelete && messageActions.indexOf(MESSAGE_ACTIONS.delete) > -1) {\n    messageActionsAfterPermission.push(MESSAGE_ACTIONS.delete);\n  }\n\n  if (canDelete && messageActions.indexOf(OPTIONAL_MESSAGE_ACTIONS.deleteForMe) > -1) {\n    messageActionsAfterPermission.push(OPTIONAL_MESSAGE_ACTIONS.deleteForMe);\n  }\n\n  if (canEdit && messageActions.indexOf(MESSAGE_ACTIONS.edit) > -1) {\n    messageActionsAfterPermission.push(MESSAGE_ACTIONS.edit);\n  }\n\n  if (canFlag && messageActions.indexOf(MESSAGE_ACTIONS.flag) > -1) {\n    messageActionsAfterPermission.push(MESSAGE_ACTIONS.flag);\n  }\n\n  if (canMarkUnread && messageActions.indexOf(MESSAGE_ACTIONS.markUnread) > -1) {\n    messageActionsAfterPermission.push(MESSAGE_ACTIONS.markUnread);\n  }\n\n  if (canMute && messageActions.indexOf(MESSAGE_ACTIONS.mute) > -1) {\n    messageActionsAfterPermission.push(MESSAGE_ACTIONS.mute);\n  }\n\n  if (canPin && messageActions.indexOf(MESSAGE_ACTIONS.pin) > -1) {\n    messageActionsAfterPermission.push(MESSAGE_ACTIONS.pin);\n  }\n\n  if (canQuote && messageActions.indexOf(MESSAGE_ACTIONS.quote) > -1) {\n    messageActionsAfterPermission.push(MESSAGE_ACTIONS.quote);\n  }\n\n  if (canReact && messageActions.indexOf(MESSAGE_ACTIONS.react) > -1) {\n    messageActionsAfterPermission.push(MESSAGE_ACTIONS.react);\n  }\n\n  if (\n    channelConfig?.['user_message_reminders'] &&\n    messageActions.indexOf(MESSAGE_ACTIONS.remindMe) > -1\n  ) {\n    messageActionsAfterPermission.push(MESSAGE_ACTIONS.remindMe);\n  }\n\n  if (canReply && messageActions.indexOf(MESSAGE_ACTIONS.reply) > -1) {\n    messageActionsAfterPermission.push(MESSAGE_ACTIONS.reply);\n  }\n\n  if (\n    channelConfig?.['user_message_reminders'] &&\n    messageActions.indexOf(MESSAGE_ACTIONS.saveForLater) > -1\n  ) {\n    messageActionsAfterPermission.push(MESSAGE_ACTIONS.saveForLater);\n  }\n\n  return messageActionsAfterPermission;\n};\n\nexport const ACTIONS_NOT_WORKING_IN_THREAD = [\n  MESSAGE_ACTIONS.pin,\n  MESSAGE_ACTIONS.reply,\n  MESSAGE_ACTIONS.markUnread,\n];\n\n/**\n * @deprecated use `shouldRenderMessageActions` instead\n */\nexport const showMessageActionsBox = (\n  actions: MessageActionsArray,\n  inThread?: boolean | undefined,\n) => shouldRenderMessageActions({ inThread, messageActions: actions });\n\nexport const shouldRenderMessageActions = ({\n  customMessageActions,\n  CustomMessageActionsList,\n  inThread,\n  messageActions,\n}: {\n  messageActions: MessageActionsArray;\n  customMessageActions?: CustomMessageActions;\n  CustomMessageActionsList?: ComponentContextValue['CustomMessageActionsList'];\n  inThread?: boolean;\n}) => {\n  if (\n    typeof CustomMessageActionsList !== 'undefined' ||\n    typeof customMessageActions !== 'undefined'\n  )\n    return true;\n\n  if (!messageActions.length) return false;\n\n  if (\n    inThread &&\n    messageActions.filter((action) => !ACTIONS_NOT_WORKING_IN_THREAD.includes(action))\n      .length === 0\n  ) {\n    return false;\n  }\n\n  if (\n    messageActions.length === 1 &&\n    (messageActions.includes(MESSAGE_ACTIONS.react) ||\n      messageActions.includes(MESSAGE_ACTIONS.reply))\n  ) {\n    return false;\n  }\n\n  if (\n    messageActions.length === 2 &&\n    messageActions.includes(MESSAGE_ACTIONS.react) &&\n    messageActions.includes(MESSAGE_ACTIONS.reply)\n  ) {\n    return false;\n  }\n\n  return true;\n};\n\nfunction areMessagesEqual(prevMessage: LocalMessage, nextMessage: LocalMessage): boolean {\n  const areBaseMessagesEqual = (\n    prevMessage: LocalMessageBase,\n    nextMessage: LocalMessageBase,\n  ) =>\n    prevMessage.deleted_at === nextMessage.deleted_at &&\n    prevMessage.latest_reactions?.length === nextMessage.latest_reactions?.length &&\n    prevMessage.own_reactions?.length === nextMessage.own_reactions?.length &&\n    prevMessage.pinned === nextMessage.pinned &&\n    prevMessage.reply_count === nextMessage.reply_count &&\n    prevMessage.status === nextMessage.status &&\n    prevMessage.text === nextMessage.text &&\n    prevMessage.type === nextMessage.type &&\n    prevMessage.updated_at === nextMessage.updated_at &&\n    prevMessage.user?.updated_at === nextMessage.user?.updated_at;\n\n  return (\n    areBaseMessagesEqual(prevMessage, nextMessage) &&\n    Boolean(prevMessage.quoted_message) === Boolean(nextMessage.quoted_message) &&\n    ((!prevMessage.quoted_message && !nextMessage.quoted_message) ||\n      areBaseMessagesEqual(\n        prevMessage.quoted_message as LocalMessageBase,\n        nextMessage.quoted_message as LocalMessageBase,\n      ))\n  );\n}\n\nexport const areMessagePropsEqual = (\n  prevProps: MessageProps & {\n    mutes?: Mute[];\n    showDetailedReactions?: boolean;\n  },\n  nextProps: MessageProps & {\n    mutes?: Mute[];\n    showDetailedReactions?: boolean;\n  },\n) => {\n  const { message: prevMessage, Message: prevMessageUI } = prevProps;\n  const { message: nextMessage, Message: nextMessageUI } = nextProps;\n\n  if (prevMessageUI !== nextMessageUI) return false;\n  if (prevProps.endOfGroup !== nextProps.endOfGroup) return false;\n\n  if (nextProps.showDetailedReactions !== prevProps.showDetailedReactions) {\n    return false;\n  }\n\n  if (nextProps.closeReactionSelectorOnClick !== prevProps.closeReactionSelectorOnClick) {\n    return false;\n  }\n\n  const messagesAreEqual = areMessagesEqual(prevMessage, nextMessage);\n  if (!messagesAreEqual) return false;\n\n  const deepEqualProps =\n    deepequal(nextProps.messageActions, prevProps.messageActions) &&\n    deepequal(nextProps.readBy, prevProps.readBy) &&\n    deepequal(nextProps.deliveredTo, prevProps.deliveredTo) &&\n    deepequal(nextProps.highlighted, prevProps.highlighted) &&\n    deepequal(nextProps.groupStyles, prevProps.groupStyles) && // last 3 messages can have different group styles\n    deepequal(nextProps.mutes, prevProps.mutes) &&\n    deepequal(nextProps.lastReceivedId, prevProps.lastReceivedId);\n\n  if (!deepEqualProps) return false;\n\n  return (\n    prevProps.messageListRect === nextProps.messageListRect // MessageList wrapper layout changes\n  );\n};\n\nexport const areMessageUIPropsEqual = (\n  prevProps: MessageContextValue & {\n    showDetailedReactions?: boolean;\n  },\n  nextProps: MessageContextValue & {\n    showDetailedReactions?: boolean;\n  },\n) => {\n  const { lastReceivedId: prevLastReceivedId, message: prevMessage } = prevProps;\n  const { lastReceivedId: nextLastReceivedId, message: nextMessage } = nextProps;\n\n  if (prevProps.editing !== nextProps.editing) return false;\n  if (prevProps.highlighted !== nextProps.highlighted) return false;\n  if (prevProps.endOfGroup !== nextProps.endOfGroup) return false;\n  if (prevProps.mutes?.length !== nextProps.mutes?.length) return false;\n  if (prevProps.readBy?.length !== nextProps.readBy?.length) return false;\n  if (prevProps.deliveredTo?.length !== nextProps.deliveredTo?.length) return false;\n  if (prevProps.groupStyles !== nextProps.groupStyles) return false;\n\n  if (prevProps.showDetailedReactions !== nextProps.showDetailedReactions) {\n    return false;\n  }\n\n  if (\n    (prevMessage.id === prevLastReceivedId || prevMessage.id === nextLastReceivedId) &&\n    prevLastReceivedId !== nextLastReceivedId\n  ) {\n    return false;\n  }\n\n  return areMessagesEqual(prevMessage, nextMessage);\n};\n\nexport const messageHasReactions = (message?: LocalMessage) =>\n  Object.values(message?.reaction_groups ?? {}).some(({ count }) => count > 0);\n\nexport const messageHasAttachments = (message?: LocalMessage) =>\n  !!message?.attachments && !!message.attachments.length;\n\nexport const getImages = (message?: MessageResponse) => {\n  if (!message?.attachments) {\n    return [];\n  }\n  return message.attachments.filter((item) => item.type === 'image');\n};\n\nexport const getNonImageAttachments = (message?: MessageResponse) => {\n  if (!message?.attachments) {\n    return [];\n  }\n  return message.attachments.filter((item) => item.type !== 'image');\n};\n\nexport interface TooltipUsernameMapper {\n  (user: UserResponse): string;\n}\n\n/**\n * Default Tooltip Username mapper implementation.\n *\n * @param user the user.\n */\nexport const mapToUserNameOrId: TooltipUsernameMapper = (user) => user.name || user.id;\n\nexport const getReadByTooltipText = (\n  users: UserResponse[],\n  t: TFunction,\n  client: StreamChat,\n  tooltipUserNameMapper: TooltipUsernameMapper,\n) => {\n  let outStr = '';\n\n  if (!t) {\n    throw new Error(\n      'getReadByTooltipText was called, but translation function is not available',\n    );\n  }\n\n  if (!tooltipUserNameMapper) {\n    throw new Error(\n      'getReadByTooltipText was called, but tooltipUserNameMapper function is not available',\n    );\n  }\n  // first filter out client user, so restLength won't count it\n  const otherUsers = users\n    .filter((item) => item && client?.user && item.id !== client.user.id)\n    .map(tooltipUserNameMapper);\n\n  const slicedArr = otherUsers.slice(0, 5);\n  const restLength = otherUsers.length - slicedArr.length;\n\n  if (slicedArr.length === 1) {\n    outStr = `${slicedArr[0]} `;\n  } else if (slicedArr.length === 2) {\n    // joins all with \"and\" but =no commas\n    // example: \"bob and sam\"\n    outStr = t('{{ firstUser }} and {{ secondUser }}', {\n      firstUser: slicedArr[0],\n      secondUser: slicedArr[1],\n    });\n  } else if (slicedArr.length > 2) {\n    // joins all with commas, but last one gets \", and\" (oxford comma!)\n    // example: \"bob, joe, sam and 4 more\"\n    if (restLength === 0) {\n      // mutate slicedArr to remove last user to display it separately\n      const lastUser = slicedArr.splice(slicedArr.length - 1, 1);\n      outStr = t('{{ commaSeparatedUsers }}, and {{ lastUser }}', {\n        commaSeparatedUsers: slicedArr.join(', '),\n        lastUser,\n      });\n    } else {\n      outStr = t('{{ commaSeparatedUsers }} and {{ moreCount }} more', {\n        commaSeparatedUsers: slicedArr.join(', '),\n        moreCount: restLength,\n      });\n    }\n  }\n\n  return outStr;\n};\n\nexport const isOnlyEmojis = (text?: string) => {\n  if (!text) return false;\n\n  const noEmojis = text.replace(emojiRegex(), '');\n  const noSpace = noEmojis.replace(/[\\s\\n]/gm, '');\n\n  return !noSpace;\n};\n\nexport const isMessageBounced = (\n  message: Pick<LocalMessage, 'type' | 'moderation' | 'moderation_details'>,\n) =>\n  message.type === 'error' &&\n  (message.moderation_details?.action === 'MESSAGE_RESPONSE_ACTION_BOUNCE' ||\n    message.moderation?.action === 'bounce');\n\nexport const isMessageBlocked = (\n  message: Pick<LocalMessage, 'type' | 'moderation' | 'moderation_details'>,\n) =>\n  message.type === 'error' &&\n  (message.moderation_details?.action === 'MESSAGE_RESPONSE_ACTION_REMOVE' ||\n    message.moderation?.action === 'remove');\n\nexport const isMessageEdited = (message: Pick<LocalMessage, 'message_text_updated_at'>) =>\n  !!message.message_text_updated_at;\n", "import { validateAndGetMessage } from '../utils';\n\nimport { useChannelActionContext } from '../../../context/ChannelActionContext';\nimport { useChatContext } from '../../../context/ChatContext';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\nimport type { DeleteMessageOptions, LocalMessage } from 'stream-chat';\nimport type { ReactEventHandler } from '../types';\n\nexport type DeleteMessageNotifications = {\n  getErrorNotification?: (message: LocalMessage) => string;\n  notify?: (notificationText: string, type: 'success' | 'error') => void;\n};\n\nexport const useDeleteHandler = (\n  message?: LocalMessage,\n  notifications: DeleteMessageNotifications = {},\n): ReactEventHandler => {\n  const { getErrorNotification, notify } = notifications;\n\n  const { deleteMessage, updateMessage } = useChannelActionContext('useDeleteHandler');\n  const { client } = useChatContext('useDeleteHandler');\n  const { t } = useTranslationContext('useDeleteHandler');\n\n  return async (event, options?: DeleteMessageOptions) => {\n    event.preventDefault();\n    if (!message?.id || !client || !updateMessage) {\n      return;\n    }\n\n    try {\n      const deletedMessage = await deleteMessage(message, options);\n      updateMessage(deletedMessage);\n    } catch (e) {\n      const errorMessage =\n        getErrorNotification && validateAndGetMessage(getErrorNotification, [message]);\n\n      if (notify) notify(errorMessage || t('Error deleting message'), 'error');\n    }\n  };\n};\n", "import { useState } from 'react';\n\nimport type { ReactEventHandler } from '../types';\n\nexport type EditHandlerReturnType = {\n  clearEdit: (event?: React.BaseSyntheticEvent) => void;\n  editing: boolean;\n  setEdit: ReactEventHandler;\n};\n\nexport const useEditHandler = (\n  customInitialState = false,\n  customSetEditing?: (event?: React.BaseSyntheticEvent) => void,\n  customClearEditingHandler?: (event?: React.BaseSyntheticEvent) => void,\n): EditHandlerReturnType => {\n  const [editing, setEditing] = useState(customInitialState);\n\n  const setEdit =\n    customSetEditing ||\n    ((event) => {\n      if (event?.preventDefault) {\n        event.preventDefault();\n      }\n      setEditing(true);\n    });\n\n  const clearEdit =\n    customClearEditingHandler ||\n    ((event) => {\n      if (event?.preventDefault) {\n        event.preventDefault();\n      }\n      setEditing(false);\n    });\n\n  return { clearEdit, editing, setEdit };\n};\n", "import { validateAndGetMessage } from '../utils';\n\nimport { useChatContext } from '../../../context/ChatContext';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { ReactEventHandler } from '../types';\n\nexport const missingUseFlagHandlerParameterWarning =\n  'useFlagHandler was called but it is missing one or more necessary parameters.';\n\nexport type FlagMessageNotifications = {\n  getErrorNotification?: (message: LocalMessage) => string;\n  getSuccessNotification?: (message: LocalMessage) => string;\n  notify?: (notificationText: string, type: 'success' | 'error') => void;\n};\n\nexport const useFlagHandler = (\n  message?: LocalMessage,\n  notifications: FlagMessageNotifications = {},\n): ReactEventHandler => {\n  const { client } = useChatContext('useFlagHandler');\n  const { t } = useTranslationContext('useFlagHandler');\n\n  return async (event) => {\n    event.preventDefault();\n\n    const { getErrorNotification, getSuccessNotification, notify } = notifications;\n\n    if (!client || !t || !notify || !message?.id) {\n      console.warn(missingUseFlagHandlerParameterWarning);\n      return;\n    }\n\n    if (client.user?.banned) {\n      return notify(t('Error adding flag'), 'error');\n    }\n\n    try {\n      await client.flagMessage(message.id);\n\n      const successMessage =\n        getSuccessNotification &&\n        validateAndGetMessage(getSuccessNotification, [message]);\n\n      notify(successMessage || t('Message has been successfully flagged'), 'success');\n    } catch (e) {\n      const errorMessage =\n        getErrorNotification && validateAndGetMessage(getErrorNotification, [message]);\n\n      notify(errorMessage || t('Error adding flag'), 'error');\n    }\n  };\n};\n", "import { useChannelActionContext } from '../../../context/ChannelActionContext';\n\nimport type React from 'react';\nimport type { LocalMessage, UserResponse } from 'stream-chat';\n\nimport type { ReactEventHandler } from '../types';\n\nexport type CustomMentionHandler = (\n  event: React.BaseSyntheticEvent,\n  mentioned_users: UserResponse[],\n) => void;\n\nexport type MentionedUserEventHandler = (\n  event: React.BaseSyntheticEvent,\n  mentionedUsers: UserResponse[],\n) => void;\n\nfunction createEventHandler(\n  fn?: CustomMentionHandler,\n  message?: LocalMessage,\n): ReactEventHandler {\n  return (event) => {\n    if (typeof fn !== 'function' || !message?.mentioned_users?.length) {\n      return;\n    }\n    fn(event, message.mentioned_users);\n  };\n}\n\nexport const useMentionsHandler = (\n  message?: LocalMessage,\n  customMentionHandler?: {\n    onMentionsClick?: CustomMentionHandler;\n    onMentionsHover?: CustomMentionHandler;\n  },\n) => {\n  const {\n    onMentionsClick: contextOnMentionsClick,\n    onMentionsHover: contextOnMentionsHover,\n  } = useChannelActionContext('useMentionsHandler');\n\n  const onMentionsClick =\n    customMentionHandler?.onMentionsClick || contextOnMentionsClick || (() => null);\n\n  const onMentionsHover =\n    customMentionHandler?.onMentionsHover || contextOnMentionsHover || (() => null);\n\n  return {\n    onMentionsClick: createEventHandler(onMentionsClick, message),\n    onMentionsHover: createEventHandler(onMentionsHover, message),\n  };\n};\n", "import { validateAndGetMessage } from '../utils';\nimport { useChannelStateContext, useTranslationContext } from '../../../context';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { ReactEventHandler } from '../types';\n\nexport type MarkUnreadHandlerNotifications = {\n  getErrorNotification?: (message: LocalMessage) => string;\n  getSuccessNotification?: (message: LocalMessage) => string;\n  notify?: (notificationText: string, type: 'success' | 'error') => void;\n};\n\nexport const useMarkUnreadHandler = (\n  message?: LocalMessage,\n  notifications: MarkUnreadHandlerNotifications = {},\n): ReactEventHandler => {\n  const { getErrorNotification, getSuccessNotification, notify } = notifications;\n\n  const { channel } = useChannelStateContext('useMarkUnreadHandler');\n  const { t } = useTranslationContext('useMarkUnreadHandler');\n\n  return async (event) => {\n    event.preventDefault();\n    if (!message?.id) {\n      console.warn('Mark unread handler does not have access to message id');\n      return;\n    }\n\n    try {\n      await channel.markUnread({ message_id: message.id });\n      if (!notify) return;\n      const successMessage =\n        getSuccessNotification &&\n        validateAndGetMessage(getSuccessNotification, [message]);\n      if (successMessage) notify(successMessage, 'success');\n    } catch (e) {\n      if (!notify) return;\n      const errorMessage =\n        getErrorNotification && validateAndGetMessage(getErrorNotification, [message]);\n      if (getErrorNotification && !errorMessage) return;\n      notify(\n        errorMessage ||\n          t(\n            'Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.',\n          ),\n        'error',\n      );\n    }\n  };\n};\n", "import { isUserMuted, validateAndGetMessage } from '../utils';\n\nimport { useChannelStateContext } from '../../../context/ChannelStateContext';\nimport { useChatContext } from '../../../context/ChatContext';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\nimport type { LocalMessage, UserResponse } from 'stream-chat';\n\nimport type { ReactEventHandler } from '../types';\n\nexport const missingUseMuteHandlerParamsWarning =\n  'useMuteHandler was called but it is missing one or more necessary parameter.';\n\nexport type MuteUserNotifications = {\n  getErrorNotification?: (user: UserResponse) => string;\n  getSuccessNotification?: (user: UserResponse) => string;\n  notify?: (notificationText: string, type: 'success' | 'error') => void;\n};\n\nexport const useMuteHandler = (\n  message?: LocalMessage,\n  notifications: MuteUserNotifications = {},\n): ReactEventHandler => {\n  const { mutes } = useChannelStateContext('useMuteHandler');\n  const { client } = useChatContext('useMuteHandler');\n  const { t } = useTranslationContext('useMuteHandler');\n\n  return async (event) => {\n    event.preventDefault();\n\n    const { getErrorNotification, getSuccessNotification, notify } = notifications;\n\n    if (!t || !message?.user || !notify || !client) {\n      console.warn(missingUseMuteHandlerParamsWarning);\n      return;\n    }\n\n    if (!isUserMuted(message, mutes)) {\n      try {\n        await client.muteUser(message.user.id);\n\n        const successMessage =\n          getSuccessNotification &&\n          validateAndGetMessage(getSuccessNotification, [message.user]);\n\n        notify(\n          successMessage ||\n            t('{{ user }} has been muted', {\n              user: message.user.name || message.user.id,\n            }),\n          'success',\n        );\n      } catch (e) {\n        const errorMessage =\n          getErrorNotification &&\n          validateAndGetMessage(getErrorNotification, [message.user]);\n\n        notify(errorMessage || t('Error muting a user ...'), 'error');\n      }\n    } else {\n      try {\n        await client.unmuteUser(message.user.id);\n\n        const fallbackMessage = t('{{ user }} has been unmuted', {\n          user: message.user.name || message.user.id,\n        });\n\n        const successMessage =\n          (getSuccessNotification &&\n            validateAndGetMessage(getSuccessNotification, [message.user])) ||\n          fallbackMessage;\n\n        if (typeof successMessage === 'string') {\n          notify(successMessage, 'success');\n        }\n      } catch (e) {\n        const errorMessage =\n          (getErrorNotification &&\n            validateAndGetMessage(getErrorNotification, [message.user])) ||\n          t('Error unmuting a user ...');\n\n        if (typeof errorMessage === 'string') {\n          notify(errorMessage, 'error');\n        }\n      }\n    }\n  };\n};\n", "import { useChannelActionContext } from '../../../context/ChannelActionContext';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { ReactEventHandler } from '../types';\n\nexport const useOpenThreadHandler = (\n  message?: LocalMessage,\n  customOpenThread?: (message: LocalMessage, event: React.BaseSyntheticEvent) => void,\n): ReactEventHandler => {\n  const { openThread: channelOpenThread } =\n    useChannelActionContext('useOpenThreadHandler');\n\n  const openThread = customOpenThread || channelOpenThread;\n\n  return (event) => {\n    if (!openThread || !message) {\n      console.warn(\n        'Open thread handler was called but it is missing one of its parameters',\n      );\n      return;\n    }\n\n    openThread(message, event);\n  };\n};\n", "import { defaultPinPermissions, validateAndGetMessage } from '../utils';\n\nimport { useChannelActionContext } from '../../../context/ChannelActionContext';\nimport { useChannelStateContext } from '../../../context/ChannelStateContext';\nimport { useChatContext } from '../../../context/ChatContext';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { ReactEventHandler } from '../types';\n\n// @deprecated in favor of `channelCapabilities` - TODO: remove in next major release\nexport type PinEnabledUserRoles<T extends string = string> = Partial<\n  Record<T, boolean>\n> & {\n  admin?: boolean;\n  anonymous?: boolean;\n  channel_member?: boolean;\n  channel_moderator?: boolean;\n  guest?: boolean;\n  member?: boolean;\n  moderator?: boolean;\n  owner?: boolean;\n  user?: boolean;\n};\n\n// @deprecated in favor of `channelCapabilities` - TODO: remove in next major release\nexport type PinPermissions<\n  T extends string = string,\n  U extends string = string,\n> = Partial<Record<T, PinEnabledUserRoles<U>>> & {\n  commerce?: PinEnabledUserRoles<U>;\n  gaming?: PinEnabledUserRoles<U>;\n  livestream?: PinEnabledUserRoles<U>;\n  messaging?: PinEnabledUserRoles<U>;\n  team?: PinEnabledUserRoles<U>;\n};\n\nexport type PinMessageNotifications = {\n  getErrorNotification?: (message: LocalMessage) => string;\n  notify?: (notificationText: string, type: 'success' | 'error') => void;\n};\n\nexport const usePinHandler = (\n  message: LocalMessage,\n  // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release\n  _permissions: PinPermissions = defaultPinPermissions, // eslint-disable-line\n  notifications: PinMessageNotifications = {},\n) => {\n  const { getErrorNotification, notify } = notifications;\n\n  const { updateMessage } = useChannelActionContext('usePinHandler');\n  const { channelCapabilities = {} } = useChannelStateContext('usePinHandler');\n  const { client } = useChatContext('usePinHandler');\n  const { t } = useTranslationContext('usePinHandler');\n\n  const canPin = !!channelCapabilities['pin-message'];\n\n  const handlePin: ReactEventHandler = async (event) => {\n    event.preventDefault();\n\n    if (!message) return;\n\n    if (!message.pinned) {\n      try {\n        const optimisticMessage: LocalMessage = {\n          ...message,\n          pinned: true,\n          pinned_at: new Date(),\n          pinned_by: client.user,\n        };\n\n        updateMessage(optimisticMessage);\n\n        await client.pinMessage(message);\n      } catch (e) {\n        const errorMessage =\n          getErrorNotification && validateAndGetMessage(getErrorNotification, [message]);\n\n        if (notify) notify(errorMessage || t('Error pinning message'), 'error');\n        updateMessage(message);\n      }\n    } else {\n      try {\n        const optimisticMessage = {\n          ...message,\n          pin_expires: null,\n          pinned: false,\n          pinned_at: null,\n          pinned_by: null,\n        };\n\n        updateMessage(optimisticMessage);\n\n        await client.unpinMessage(message);\n      } catch (e) {\n        const errorMessage =\n          getErrorNotification && validateAndGetMessage(getErrorNotification, [message]);\n\n        if (notify) notify(errorMessage || t('Error removing message pin'), 'error');\n        updateMessage(message);\n      }\n    }\n  };\n\n  return { canPin, handlePin };\n};\n", "import type React from 'react';\nimport { useCallback } from 'react';\nimport throttle from 'lodash.throttle';\n\nimport { useThreadContext } from '../../Threads';\nimport { useChannelActionContext } from '../../../context/ChannelActionContext';\nimport { useChannelStateContext } from '../../../context/ChannelStateContext';\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { LocalMessage, Reaction, ReactionResponse } from 'stream-chat';\n\nexport const reactionHandlerWarning = `Reaction handler was called, but it is missing one of its required arguments.\nMake sure the ChannelAction and ChannelState contexts are properly set and the hook is initialized with a valid message.`;\n\nexport const useReactionHandler = (message?: LocalMessage) => {\n  const thread = useThreadContext();\n  const { updateMessage } = useChannelActionContext('useReactionHandler');\n  const { channel, channelCapabilities } = useChannelStateContext('useReactionHandler');\n  const { client } = useChatContext('useReactionHandler');\n\n  const createMessagePreview = useCallback(\n    (add: boolean, reaction: ReactionResponse, message: LocalMessage): LocalMessage => {\n      const newReactionGroups = message?.reaction_groups || {};\n      const reactionType = reaction.type;\n      const hasReaction = !!newReactionGroups[reactionType];\n\n      if (add) {\n        const timestamp = new Date().toISOString();\n        newReactionGroups[reactionType] = hasReaction\n          ? {\n              ...newReactionGroups[reactionType],\n              count: newReactionGroups[reactionType].count + 1,\n            }\n          : {\n              count: 1,\n              first_reaction_at: timestamp,\n              last_reaction_at: timestamp,\n              sum_scores: 1,\n            };\n      } else {\n        if (hasReaction && newReactionGroups[reactionType].count > 1) {\n          newReactionGroups[reactionType] = {\n            ...newReactionGroups[reactionType],\n            count: newReactionGroups[reactionType].count - 1,\n          };\n        } else {\n          delete newReactionGroups[reactionType];\n        }\n      }\n\n      const newReactions: ReactionResponse[] | undefined = add\n        ? [reaction, ...(message?.latest_reactions || [])]\n        : message.latest_reactions?.filter(\n            (item) => !(item.type === reaction.type && item.user_id === reaction.user_id),\n          );\n\n      const newOwnReactions = add\n        ? [reaction, ...(message?.own_reactions || [])]\n        : message?.own_reactions?.filter((item) => item.type !== reaction.type);\n\n      return {\n        ...message,\n        latest_reactions: newReactions || message.latest_reactions,\n        own_reactions: newOwnReactions,\n        reaction_groups: newReactionGroups,\n      };\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [client.user, client.userID],\n  );\n\n  const createReactionPreview = (type: string) => ({\n    message_id: message?.id,\n    score: 1,\n    type,\n    user: client.user,\n    user_id: client.user?.id,\n  });\n\n  const toggleReaction = throttle(async (id: string, type: string, add: boolean) => {\n    if (!message || !channelCapabilities['send-reaction']) return;\n\n    const newReaction = createReactionPreview(type) as ReactionResponse;\n    const tempMessage = createMessagePreview(add, newReaction, message);\n\n    try {\n      updateMessage(tempMessage);\n      thread?.upsertReplyLocally({ message: tempMessage });\n\n      const messageResponse = add\n        ? await channel.sendReaction(id, { type } as Reaction)\n        : await channel.deleteReaction(id, type);\n\n      // seems useless as we're expecting WS event to come in and replace this anyway\n      updateMessage(messageResponse.message);\n    } catch (error) {\n      // revert to the original message if the API call fails\n      updateMessage(message);\n      thread?.upsertReplyLocally({ message });\n    }\n  }, 1000);\n\n  return async (reactionType: string, event?: React.BaseSyntheticEvent) => {\n    if (event?.preventDefault) {\n      event.preventDefault();\n    }\n\n    if (!message) {\n      return console.warn(reactionHandlerWarning);\n    }\n\n    let userExistingReaction = null as unknown as ReactionResponse;\n\n    if (message.own_reactions) {\n      message.own_reactions.forEach((reaction) => {\n        // own user should only ever contain the current user id\n        // just in case we check to prevent bugs with message updates from breaking reactions\n        if (\n          reaction.user &&\n          client.userID === reaction.user.id &&\n          reaction.type === reactionType\n        ) {\n          userExistingReaction = reaction;\n        } else if (reaction.user && client.userID !== reaction.user.id) {\n          console.warn(\n            `message.own_reactions contained reactions from a different user, this indicates a bug`,\n          );\n        }\n      });\n    }\n\n    try {\n      if (userExistingReaction) {\n        await toggleReaction(message.id, userExistingReaction.type, false);\n      } else {\n        await toggleReaction(message.id, reactionType, true);\n      }\n    } catch (error) {\n      console.log({ error });\n    }\n  };\n};\n", "import type { RetrySendMessage } from '../../../context/ChannelActionContext';\nimport { useChannelActionContext } from '../../../context/ChannelActionContext';\n\nexport const useRetryHandler = (\n  customRetrySendMessage?: RetrySendMessage,\n): RetrySendMessage => {\n  const { retrySendMessage: contextRetrySendMessage } =\n    useChannelActionContext('useRetryHandler');\n\n  const retrySendMessage = customRetrySendMessage || contextRetrySendMessage;\n\n  return async (message) => {\n    if (message) {\n      await retrySendMessage(message);\n    }\n  };\n};\n", "import type { User } from 'stream-chat';\n\nimport type { ReactEventHandler } from '../types';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type UserEventHandler = (event: React.BaseSyntheticEvent, user: User) => void;\n\nexport const useUserHandler = (\n  message?: LocalMessage,\n  eventHandlers?: {\n    onUserClickHandler?: UserEventHandler;\n    onUserHoverHandler?: UserEventHandler;\n  },\n): {\n  onUserClick: ReactEventHandler;\n  onUserHover: ReactEventHandler;\n} => ({\n  onUserClick: (event) => {\n    if (typeof eventHandlers?.onUserClickHandler !== 'function' || !message?.user) {\n      return;\n    }\n    eventHandlers.onUserClickHandler(event, message.user);\n  },\n  onUserHover: (event) => {\n    if (typeof eventHandlers?.onUserHoverHandler !== 'function' || !message?.user) {\n      return;\n    }\n\n    eventHandlers.onUserHoverHandler(event, message.user);\n  },\n});\n", "import { useChannelStateContext } from '../../../context/ChannelStateContext';\nimport { useChatContext } from '../../../context/ChatContext';\nimport type { LocalMessage } from 'stream-chat';\n\nexport const useUserRole = (\n  message: LocalMessage,\n  onlySenderCanEdit?: boolean,\n  disableQuotedMessages?: boolean,\n) => {\n  const { channel, channelCapabilities = {} } = useChannelStateContext('useUserRole');\n  const { client } = useChatContext('useUserRole');\n\n  /**\n   * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.\n   * `isAdmin` will be removed in future release. See `channelCapabilities`.\n   */\n  const isAdmin =\n    client.user?.role === 'admin' || channel.state.membership.role === 'admin';\n\n  /**\n   * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.\n   * `isOwner` will be removed in future release. See `channelCapabilities`.\n   */\n  const isOwner = channel.state.membership.role === 'owner';\n\n  /**\n   * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.\n   * `isModerator` will be removed in future release. See `channelCapabilities`.\n   */\n  const isModerator =\n    client.user?.role === 'channel_moderator' ||\n    channel.state.membership.role === 'channel_moderator' ||\n    channel.state.membership.role === 'moderator' ||\n    channel.state.membership.is_moderator === true ||\n    channel.state.membership.channel_role === 'channel_moderator';\n\n  const isMyMessage = client.userID === message.user?.id;\n\n  const canEdit =\n    !message.poll &&\n    ((!onlySenderCanEdit && channelCapabilities['update-any-message']) ||\n      (isMyMessage && channelCapabilities['update-own-message']));\n\n  const canDelete =\n    channelCapabilities['delete-any-message'] ||\n    (isMyMessage && channelCapabilities['delete-own-message']);\n\n  const canFlag = !isMyMessage && channelCapabilities['flag-message'];\n  const canMarkUnread = channelCapabilities['read-events'];\n  const canMute = !isMyMessage && channelCapabilities['mute-channel'];\n  const canQuote = !disableQuotedMessages && channelCapabilities['quote-message'];\n  const canReact = channelCapabilities['send-reaction'];\n  const canReply = channelCapabilities['send-reply'];\n\n  return {\n    canDelete,\n    canEdit,\n    canFlag,\n    canMarkUnread,\n    canMute,\n    canQuote,\n    canReact,\n    canReply,\n    isAdmin,\n    isModerator,\n    isMyMessage,\n    isOwner,\n  };\n};\n", "import { useChatContext, useTranslationContext } from '../../../context';\nimport type {\n  LocalMessage,\n  ReactionResponse,\n  ReactionSort,\n  StreamChat,\n} from 'stream-chat';\nimport type { ReactionType } from '../../Reactions/types';\n\nexport const MAX_MESSAGE_REACTIONS_TO_FETCH = 1000;\n\ntype FetchMessageReactionsNotifications = {\n  getErrorNotification?: (message: LocalMessage) => string;\n  notify?: (notificationText: string, type: 'success' | 'error') => void;\n};\n\nexport function useReactionsFetcher(\n  message: LocalMessage,\n  notifications: FetchMessageReactionsNotifications = {},\n) {\n  const { client } = useChatContext('useRectionsFetcher');\n  const { t } = useTranslationContext('useReactionFetcher');\n  const { getErrorNotification, notify } = notifications;\n\n  return async (reactionType?: ReactionType, sort?: ReactionSort) => {\n    try {\n      return await fetchMessageReactions(client, message.id, reactionType, sort);\n    } catch (e) {\n      const errorMessage = getErrorNotification?.(message);\n      notify?.(errorMessage || t('Error fetching reactions'), 'error');\n      throw e;\n    }\n  };\n}\n\nasync function fetchMessageReactions(\n  client: StreamChat,\n  messageId: string,\n  reactionType?: ReactionType,\n  sort?: ReactionSort,\n) {\n  const reactions: ReactionResponse[] = [];\n  const limit = 25;\n  let next: string | undefined;\n  let hasNext = true;\n\n  while (hasNext && reactions.length < MAX_MESSAGE_REACTIONS_TO_FETCH) {\n    const response = await client.queryReactions(\n      messageId,\n      reactionType ? { type: reactionType } : {},\n      sort,\n      { limit, next },\n    );\n\n    reactions.push(...response.reactions);\n    next = response.next;\n    hasNext = Boolean(next);\n  }\n\n  return reactions;\n}\n", "import { useEffect, useRef, useState } from 'react';\n\nimport { useStableCallback } from '../../../utils/useStableCallback';\nimport type { StreamedMessageTextProps } from '../StreamedMessageText';\n\nexport type UseMessageTextStreamingProps = Pick<\n  StreamedMessageTextProps,\n  'streamingLetterIntervalMs' | 'renderingLetterCount'\n> & { text: string };\n\nconst DEFAULT_LETTER_INTERVAL = 30;\nconst DEFAULT_RENDERING_LETTER_COUNT = 2;\n\n/**\n * A hook that returns text in a streamed, typewriter fashion. The speed of streaming is\n * configurable.\n * @param {number} [streamingLetterIntervalMs=30] - The timeout between each typing animation in milliseconds.\n * @param {number} [renderingLetterCount=2] - The number of letters to be rendered each time we update.\n * @param {string} text - The text that we want to render in a typewriter fashion.\n * @returns {{ streamedMessageText: string }} - A substring of the text property, up until we've finished rendering the typewriter animation.\n */\nexport const useMessageTextStreaming = ({\n  renderingLetterCount = DEFAULT_RENDERING_LETTER_COUNT,\n  streamingLetterIntervalMs = DEFAULT_LETTER_INTERVAL,\n  text,\n}: UseMessageTextStreamingProps) => {\n  const [streamedMessageText, setStreamedMessageText] = useState<string>(text);\n  const textCursor = useRef<number>(text.length);\n\n  useEffect(() => {\n    const textLength = text.length;\n\n    const interval = setInterval(() => {\n      if (!text || textCursor.current >= textLength) {\n        clearInterval(interval);\n        return;\n      }\n      const newCursorValue = textCursor.current + renderingLetterCount;\n      const newText = text.substring(0, newCursorValue);\n      textCursor.current += newText.length - textCursor.current;\n      setStreamedMessageText(newText);\n    }, streamingLetterIntervalMs);\n\n    return () => {\n      clearInterval(interval);\n    };\n  }, [streamingLetterIntervalMs, renderingLetterCount, text]);\n\n  const skipAnimation = useStableCallback(() => {\n    textCursor.current = text.length;\n    setStreamedMessageText(text);\n  });\n\n  return { skipAnimation, streamedMessageText } as const;\n};\n", "import { useCallback } from 'react';\nimport { useChatContext } from '../../../context';\nimport { useStateStore } from '../../../store';\nimport type { ReminderManagerState } from 'stream-chat';\n\nexport const useMessageReminder = (messageId: string) => {\n  const { client } = useChatContext();\n  const reminderSelector = useCallback(\n    (state: ReminderManagerState) => ({\n      reminder: state.reminders.get(messageId),\n    }),\n    [messageId],\n  );\n  const { reminder } = useStateStore(client.reminders.state, reminderSelector);\n  return reminder;\n};\n", "import React from 'react';\n\nimport { useUserRole } from './hooks/useUserRole';\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nimport type { LocalMessage } from 'stream-chat';\n\nexport type MessageDeletedProps = {\n  message: LocalMessage;\n};\n\nexport const MessageDeleted = (props: MessageDeletedProps) => {\n  const { message } = props;\n\n  const { t } = useTranslationContext('MessageDeleted');\n\n  const { isMyMessage } = useUserRole(message);\n\n  const messageClasses = isMyMessage\n    ? 'str-chat__message str-chat__message--me str-chat__message-simple str-chat__message-simple--me'\n    : 'str-chat__message str-chat__message-simple str-chat__message--other';\n\n  return (\n    <div\n      className={`${messageClasses} str-chat__message--deleted ${message.type} `}\n      data-testid={'message-deleted-component'}\n      key={message.id}\n    >\n      <div className='str-chat__message--deleted-inner'>\n        {t('This message was deleted...')}\n      </div>\n    </div>\n  );\n};\n", "import React from 'react';\nimport { useMessageContext } from '../../context/MessageContext';\nimport { Timestamp as DefaultTimestamp } from './Timestamp';\nimport { useComponentContext } from '../../context';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { TimestampFormatterOptions } from '../../i18n/types';\n\nexport type MessageTimestampProps = TimestampFormatterOptions & {\n  /* Adds a CSS class name to the component's outer `time` container. */\n  customClass?: string;\n  /* The `StreamChat` message object, which provides necessary data to the underlying UI components (overrides the value from `MessageContext`) */\n  message?: LocalMessage;\n};\n\nconst UnMemoizedMessageTimestamp = (props: MessageTimestampProps) => {\n  const { message: propMessage, ...timestampProps } = props;\n  const { message: contextMessage } = useMessageContext('MessageTimestamp');\n  const { Timestamp = DefaultTimestamp } = useComponentContext('MessageTimestamp');\n  const message = propMessage || contextMessage;\n  return <Timestamp timestamp={message.created_at} {...timestampProps} />;\n};\n\nexport const MessageTimestamp = React.memo(\n  UnMemoizedMessageTimestamp,\n) as typeof UnMemoizedMessageTimestamp;\n", "import React, { forwardRef, useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport { DownloadButton } from '../Attachment';\n\nexport type BaseImageProps = React.ComponentPropsWithRef<'img'>;\n\nexport const BaseImage = forwardRef<HTMLImageElement, BaseImageProps>(function BaseImage(\n  { ...props },\n  ref,\n) {\n  const { className: propsClassName, onError: propsOnError } = props;\n  const [error, setError] = useState(false);\n\n  useEffect(\n    () => () => {\n      setError(false);\n    },\n    [props.src],\n  );\n\n  return (\n    <>\n      <img\n        data-testid='str-chat__base-image'\n        {...props}\n        className={clsx(propsClassName, 'str-chat__base-image', {\n          'str-chat__base-image--load-failed': error,\n        })}\n        onError={(e) => {\n          setError(true);\n          propsOnError?.(e);\n        }}\n        ref={ref}\n      />\n      {error && <DownloadButton assetUrl={props.src} />}\n    </>\n  );\n});\n", "import type { CSSProperties, MutableRefObject } from 'react';\nimport React, { useState } from 'react';\nimport { sanitizeUrl } from '@braintree/sanitize-url';\nimport clsx from 'clsx';\n\nimport { BaseImage as DefaultBaseImage } from './BaseImage';\nimport { Modal as DefaultModal } from '../Modal';\nimport { ModalGallery as DefaultModalGallery } from './ModalGallery';\n\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nimport type { Attachment } from 'stream-chat';\n\nexport type GalleryProps = {\n  images: ((\n    | {\n        image_url?: string | undefined;\n        thumb_url?: string | undefined;\n      }\n    | Attachment\n  ) & { previewUrl?: string; style?: CSSProperties })[];\n  innerRefs?: MutableRefObject<(HTMLElement | null)[]>;\n};\n\nconst UnMemoizedGallery = (props: GalleryProps) => {\n  const { images, innerRefs } = props;\n\n  const [index, setIndex] = useState(0);\n  const [modalOpen, setModalOpen] = useState(false);\n\n  const {\n    BaseImage = DefaultBaseImage,\n    Modal = DefaultModal,\n    ModalGallery = DefaultModalGallery,\n  } = useComponentContext('Gallery');\n  const { t } = useTranslationContext('Gallery');\n\n  const imageFallbackTitle = t('User uploaded content');\n\n  const countImagesDisplayedInPreview = 4;\n  const lastImageIndexInPreview = countImagesDisplayedInPreview - 1;\n\n  const toggleModal = (selectedIndex: number) => {\n    if (modalOpen) {\n      setModalOpen(false);\n    } else {\n      setIndex(selectedIndex);\n      setModalOpen(true);\n    }\n  };\n\n  const renderImages = images.slice(0, countImagesDisplayedInPreview).map((image, i) =>\n    i === lastImageIndexInPreview && images.length > countImagesDisplayedInPreview ? (\n      <button\n        className='str-chat__gallery-placeholder'\n        data-testid='gallery-image-last'\n        key={`gallery-image-${i}`}\n        onClick={() => toggleModal(i)}\n        style={{\n          backgroundImage: `url(${\n            images[lastImageIndexInPreview].previewUrl ||\n            images[lastImageIndexInPreview].image_url ||\n            images[lastImageIndexInPreview].thumb_url\n          })`,\n          ...image.style,\n        }}\n        {...(innerRefs?.current && {\n          ref: (r) => {\n            innerRefs.current[i] = r;\n          },\n        })}\n      >\n        <p>\n          {t('{{ imageCount }} more', {\n            imageCount: images.length - countImagesDisplayedInPreview,\n          })}\n        </p>\n      </button>\n    ) : (\n      <button\n        className='str-chat__gallery-image'\n        data-testid='gallery-image'\n        key={`gallery-image-${i}`}\n        onClick={() => toggleModal(i)}\n      >\n        <BaseImage\n          alt={(image as Attachment)?.fallback || imageFallbackTitle}\n          src={sanitizeUrl(image.previewUrl || image.image_url || image.thumb_url)}\n          style={image.style}\n          title={(image as Attachment)?.fallback || imageFallbackTitle}\n          {...(innerRefs?.current && {\n            ref: (r) => {\n              innerRefs.current[i] = r;\n            },\n          })}\n        />\n      </button>\n    ),\n  );\n\n  const className = clsx('str-chat__gallery', {\n    'str-chat__gallery--square': images.length > lastImageIndexInPreview,\n    'str-chat__gallery-two-rows': images.length > 2,\n  });\n\n  return (\n    <div className={className}>\n      {renderImages}\n      <Modal\n        className='str-chat__gallery-modal'\n        onClose={() => setModalOpen((modalOpen) => !modalOpen)}\n        open={modalOpen}\n      >\n        <ModalGallery images={images} index={index} />\n      </Modal>\n    </div>\n  );\n};\n\n/**\n * Displays images in a simple responsive grid with a light box to view the images.\n */\nexport const Gallery = React.memo(UnMemoizedGallery) as typeof UnMemoizedGallery;\n", "import clsx from 'clsx';\nimport type { PropsWithChildren } from 'react';\nimport { useCallback } from 'react';\nimport React, { useEffect, useRef } from 'react';\nimport { FocusScope } from '@react-aria/focus';\n\nimport { CloseIconRound } from './icons';\n\nimport { modalDialogManagerId, useTranslationContext } from '../../context';\nimport {\n  DialogPortalEntry,\n  modalDialogId,\n  useModalDialog,\n  useModalDialogIsOpen,\n} from '../Dialog';\nimport type { ModalCloseEvent, ModalCloseSource, ModalProps } from './Modal';\n\nexport const GlobalModal = ({\n  children,\n  className,\n  onClose,\n  onCloseAttempt,\n  open,\n}: PropsWithChildren<ModalProps>) => {\n  const { t } = useTranslationContext('Modal');\n\n  const dialog = useModalDialog();\n  const isOpen = useModalDialogIsOpen();\n  const innerRef = useRef<HTMLDivElement | null>(null);\n  const closeButtonRef = useRef<HTMLButtonElement | null>(null);\n\n  const maybeClose = useCallback(\n    (source: ModalCloseSource, event: ModalCloseEvent) => {\n      const allow = onCloseAttempt?.(source, event);\n      if (allow !== false) {\n        onClose?.(event);\n        dialog.close();\n      }\n    },\n    [dialog, onClose, onCloseAttempt],\n  );\n\n  const handleClick = (event: React.MouseEvent<HTMLButtonElement | HTMLDivElement>) => {\n    const target = event.target as HTMLButtonElement | HTMLDivElement;\n    if (!innerRef.current || !closeButtonRef.current) return;\n    if (innerRef.current?.contains(target)) return;\n\n    if (closeButtonRef.current.contains(target)) {\n      maybeClose('button', event);\n    } else if (!innerRef.current.contains(target)) {\n      maybeClose('overlay', event);\n    }\n  };\n\n  useEffect(() => {\n    if (!isOpen) return;\n\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (event.key === 'Escape') maybeClose('escape', event);\n    };\n\n    document.addEventListener('keydown', handleKeyDown);\n    return () => document.removeEventListener('keydown', handleKeyDown);\n  }, [isOpen, maybeClose]);\n\n  useEffect(() => {\n    if (open && !dialog.isOpen) {\n      dialog.open();\n    }\n  }, [dialog, open]);\n\n  if (!open || !isOpen) return null;\n\n  return (\n    <DialogPortalEntry dialogId={modalDialogId} dialogManagerId={modalDialogManagerId}>\n      <div\n        className={clsx(\n          'str-chat str-chat__modal str-chat-react__modal str-chat__modal--open',\n          className,\n        )}\n        onClick={handleClick}\n      >\n        <FocusScope autoFocus contain>\n          <button\n            className='str-chat__modal__close-button'\n            ref={closeButtonRef}\n            title={t('Close')}\n            type='button'\n          >\n            <CloseIconRound />\n          </button>\n          <div\n            className='str-chat__modal__inner str-chat-react__modal__inner'\n            ref={innerRef}\n          >\n            {children}\n          </div>\n        </FocusScope>\n      </div>\n    </DialogPortalEntry>\n  );\n};\n", "import React from 'react';\n\nexport const CloseIconRound = () => (\n  <svg\n    data-testid='close-icon-round'\n    fill='none'\n    height='28'\n    viewBox='0 0 28 28'\n    width='28'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <rect fill='#72767E' height='28' rx='14' width='28' />\n    <circle cx='14' cy='14' fill='#72767E' r='12' />\n    <path\n      clipRule='evenodd'\n      d='M28 14C28 21.732 21.732 28 14 28C6.26801 28 0 21.732 0 14C0 6.26801 6.26801 0 14 0C21.732 0 28 6.26801 28 14ZM26 14C26 20.6274 20.6274 26 14 26C7.37258 26 2 20.6274 2 14C2 7.37258 7.37258 2 14 2C20.6274 2 26 7.37258 26 14ZM19.59 7L21 8.41L15.41 14L21 19.59L19.59 21L14 15.41L8.41 21L7 19.59L12.59 14L7 8.41L8.41 7L14 12.59L19.59 7Z'\n      fill='white'\n      fillRule='evenodd'\n    />\n  </svg>\n);\n", "import clsx from 'clsx';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useDialogIsOpen, useDialogOnNearestManager } from './hooks';\nimport { useDialogAnchor } from './DialogAnchor';\nimport type { ComponentProps, ComponentType } from 'react';\nimport type { PopperLikePlacement } from './hooks';\n\ntype ButtonWithSubmenu = ComponentProps<'button'> & {\n  children: React.ReactNode;\n  placement: PopperLikePlacement;\n  Submenu: ComponentType;\n  submenuContainerProps?: ComponentProps<'div'>;\n};\nexport const ButtonWithSubmenu = ({\n  children,\n  className,\n  placement,\n  Submenu,\n  submenuContainerProps,\n  ...buttonProps\n}: ButtonWithSubmenu) => {\n  const buttonRef = useRef<HTMLButtonElement | null>(null);\n  const [dialogContainer, setDialogContainer] = useState<HTMLDivElement | null>(null);\n  const keepSubmenuOpen = useRef(false);\n  const dialogCloseTimeout = useRef<NodeJS.Timeout | null>(null);\n  const dialogId = useMemo(() => `submenu-${Math.random().toString(36).slice(2)}`, []);\n  const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId });\n  const dialogIsOpen = useDialogIsOpen(dialogId, dialogManager?.id);\n  const { setPopperElement, styles } = useDialogAnchor<HTMLDivElement>({\n    open: dialogIsOpen,\n    placement,\n    referenceElement: buttonRef.current,\n  });\n\n  const closeDialogLazily = useCallback(() => {\n    if (dialogCloseTimeout.current) clearTimeout(dialogCloseTimeout.current);\n    dialogCloseTimeout.current = setTimeout(() => {\n      if (keepSubmenuOpen.current) return;\n      dialog.close();\n    }, 100);\n  }, [dialog]);\n\n  const handleClose = useCallback(\n    (event: Event) => {\n      const parentButton = buttonRef.current;\n      if (!dialogIsOpen || !parentButton) return;\n      event.stopPropagation();\n      closeDialogLazily();\n      parentButton.focus();\n    },\n    [closeDialogLazily, dialogIsOpen, buttonRef],\n  );\n\n  const handleFocusParentButton = () => {\n    if (dialogIsOpen) return;\n    dialog.open();\n    keepSubmenuOpen.current = true;\n  };\n\n  useEffect(() => {\n    const parentButton = buttonRef.current;\n    if (!dialogIsOpen || !parentButton) return;\n    const hideOnEscape = (event: KeyboardEvent) => {\n      if (event.key !== 'Escape') return;\n      handleClose(event);\n      keepSubmenuOpen.current = false;\n    };\n\n    document.addEventListener('keyup', hideOnEscape, { capture: true });\n\n    return () => {\n      document.removeEventListener('keyup', hideOnEscape, { capture: true });\n    };\n  }, [dialogIsOpen, handleClose]);\n\n  return (\n    <>\n      <button\n        aria-selected='false'\n        className={clsx(className, 'str_chat__button-with-submenu', {\n          'str_chat__button-with-submenu--submenu-open': dialogIsOpen,\n        })}\n        onBlur={() => {\n          keepSubmenuOpen.current = false;\n          closeDialogLazily();\n        }}\n        onClick={(event) => {\n          event.stopPropagation();\n          dialog.toggle();\n        }}\n        onFocus={handleFocusParentButton}\n        onMouseEnter={handleFocusParentButton}\n        onMouseLeave={() => {\n          keepSubmenuOpen.current = false;\n          closeDialogLazily();\n        }}\n        ref={buttonRef}\n        role='option'\n        {...buttonProps}\n      >\n        {children}\n      </button>\n      {dialogIsOpen && (\n        <div\n          onBlur={(event) => {\n            const isBlurredDescendant =\n              event.relatedTarget instanceof Node &&\n              dialogContainer?.contains(event.relatedTarget);\n            if (isBlurredDescendant) return;\n            keepSubmenuOpen.current = false;\n            closeDialogLazily();\n          }}\n          onFocus={() => {\n            keepSubmenuOpen.current = true;\n          }}\n          onMouseEnter={() => {\n            keepSubmenuOpen.current = true;\n          }}\n          onMouseLeave={() => {\n            keepSubmenuOpen.current = false;\n            closeDialogLazily();\n          }}\n          ref={(element) => {\n            setPopperElement(element);\n            setDialogContainer(element);\n          }}\n          style={styles}\n          tabIndex={-1}\n          {...submenuContainerProps}\n        >\n          <Submenu />\n        </div>\n      )}\n    </>\n  );\n};\n", "import clsx from 'clsx';\nimport type { ComponentProps, PropsWithChildren } from 'react';\nimport React, { useEffect, useState } from 'react';\nimport { FocusScope } from '@react-aria/focus';\nimport { DialogPortalEntry } from './DialogPortal';\nimport { useDialog, useDialogIsOpen } from './hooks';\nimport { usePopoverPosition } from './hooks/usePopoverPosition';\nimport type { PopperLikePlacement } from './hooks';\n\nexport interface DialogAnchorOptions {\n  open: boolean;\n  placement: PopperLikePlacement;\n  referenceElement: HTMLElement | null;\n  allowFlip?: boolean;\n}\n\nexport function useDialogAnchor<T extends HTMLElement>({\n  allowFlip,\n  open,\n  placement,\n  referenceElement,\n}: DialogAnchorOptions) {\n  const [popperElement, setPopperElement] = useState<T | null>(null);\n  const { refs, strategy, update, x, y } = usePopoverPosition({\n    allowFlip,\n    freeze: true,\n    placement,\n  });\n\n  useEffect(() => {\n    refs.setReference(referenceElement);\n  }, [referenceElement, refs]);\n\n  useEffect(() => {\n    refs.setFloating(popperElement);\n  }, [popperElement, refs]);\n\n  useEffect(() => {\n    if (open && popperElement) {\n      // Since the popper's reference element might not be (and usually is not) visible\n      // all the time, it's safer to force popper update before showing it.\n      // update is non-null only if popperElement is non-null\n      update?.();\n    }\n  }, [open, placement, popperElement, update]);\n\n  if (popperElement && !open) {\n    setPopperElement(null);\n  }\n\n  return {\n    setPopperElement,\n    styles: {\n      left: x ?? 0,\n      position: strategy,\n      top: y ?? 0,\n    } as React.CSSProperties,\n  };\n}\n\nexport type DialogAnchorProps = PropsWithChildren<Partial<DialogAnchorOptions>> & {\n  id: string;\n  dialogManagerId?: string;\n  focus?: boolean;\n  trapFocus?: boolean;\n} & ComponentProps<'div'>;\n\nexport const DialogAnchor = ({\n  allowFlip = true,\n  children,\n  className,\n  dialogManagerId,\n  focus = true,\n  id,\n  placement = 'auto',\n  referenceElement = null,\n  tabIndex,\n  trapFocus,\n  ...restDivProps\n}: DialogAnchorProps) => {\n  const dialog = useDialog({ dialogManagerId, id });\n  const open = useDialogIsOpen(id, dialogManagerId);\n  const { setPopperElement, styles } = useDialogAnchor<HTMLDivElement>({\n    allowFlip,\n    open,\n    placement,\n    referenceElement,\n  });\n\n  useEffect(() => {\n    if (!open) return;\n    const hideOnEscape = (event: KeyboardEvent) => {\n      if (event.key !== 'Escape') return;\n      dialog?.close();\n    };\n\n    document.addEventListener('keyup', hideOnEscape);\n\n    return () => {\n      document.removeEventListener('keyup', hideOnEscape);\n    };\n  }, [dialog, open]);\n\n  // prevent rendering the dialog contents if the dialog should not be open / shown\n  if (!open) {\n    return null;\n  }\n\n  return (\n    <DialogPortalEntry dialogId={id} dialogManagerId={dialogManagerId}>\n      <FocusScope autoFocus={focus} contain={trapFocus} restoreFocus>\n        <div\n          {...restDivProps}\n          className={clsx('str-chat__dialog-contents', className)}\n          data-testid='str-chat__dialog-contents'\n          ref={setPopperElement}\n          style={styles}\n          tabIndex={typeof tabIndex !== 'undefined' ? tabIndex : 0}\n        >\n          {children}\n        </div>\n      </FocusScope>\n    </DialogPortalEntry>\n  );\n};\n", "import {\n  autoPlacement,\n  autoUpdate,\n  flip as flipMw,\n  offset as offsetMw,\n  type Placement,\n  shift as shiftMw,\n  size as sizeMw,\n  useFloating,\n} from '@floating-ui/react';\nimport type { AutoPlacementOptions } from '@floating-ui/core';\n\nconst hasResizeObserver = typeof window !== 'undefined' && 'ResizeObserver' in window;\n\nexport type PopperLikePlacement = Placement | 'auto' | 'auto-start' | 'auto-end';\n\nfunction autoMiddlewareFor(p: PopperLikePlacement) {\n  if (!String(p).startsWith('auto')) return null;\n  const alignment: AutoPlacementOptions['alignment'] =\n    p === 'auto-start' ? 'start' : p === 'auto-end' ? 'end' : undefined;\n  return autoPlacement({ alignment });\n}\n\ntype OffsetOpt =\n  | number\n  | { mainAxis?: number; crossAxis?: number; alignmentAxis?: number }\n  | [crossAxis: number, mainAxis: number]; // keep your tuple compat\n\nfunction toOffsetMw(opt?: OffsetOpt) {\n  if (opt == null) return null;\n  if (Array.isArray(opt)) {\n    const [crossAxis, mainAxis] = opt;\n    return offsetMw({ crossAxis, mainAxis });\n  }\n  if (typeof opt === 'number') return offsetMw(opt);\n  return offsetMw(opt);\n}\n\nexport type UsePopoverParams = {\n  placement?: PopperLikePlacement;\n  /** Add flip() when placement is not 'auto*' */\n  allowFlip?: boolean;\n  /** Keep in viewport; default true to match common popper setups */\n  allowShift?: boolean;\n  /** The floating UI is fitted to the available space (by constraining its max size) instead of letting it overflow; default false */\n  fitAvailableSpace?: boolean;\n  /** Offset (number, object, or [crossAxis, mainAxis] tuple) */\n  offset?: OffsetOpt;\n  /**\n   * Freeze behavior like Popper's eventListeners: { scroll:false, resize:false }.\n   * If true \u2192 no autoUpdate (you can call `update()` manually).\n   */\n  freeze?: boolean;\n  /**\n   * Fine-grained control of autoUpdate triggers (only if freeze=false).\n   * Defaults match Popper's \"disabled\" example when all set to false.\n   */\n  autoUpdateOptions?: Partial<Parameters<typeof autoUpdate>[3]>;\n};\n\nexport function usePopoverPosition({\n  allowFlip = true,\n  allowShift = true,\n  autoUpdateOptions,\n  fitAvailableSpace = false,\n  freeze = false,\n  offset,\n  placement = 'bottom-start',\n}: UsePopoverParams) {\n  const autoMw = autoMiddlewareFor(placement);\n  const offsetMiddleware = toOffsetMw(offset);\n  const isSidePlacement = placement.startsWith('left') || placement.startsWith('right');\n\n  const middleware = [\n    // offset first (mirrors common Popper setups)\n    ...(offsetMiddleware ? [offsetMiddleware] : []),\n\n    // choose between autoPlacement (Popper's \"auto*\") OR flip()\n    // only allow flip when not explicitly 'left*' or 'right*'\n    ...(autoMw ? [autoMw] : allowFlip && !isSidePlacement ? [flipMw()] : []),\n\n    // viewport collision adjustments\n    ...(allowShift ? [shiftMw({ padding: 8 })] : []),\n\n    // optional size constraining\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    ...(fitAvailableSpace ? [sizeMw({ apply: () => {} })] : []),\n  ];\n\n  // if placement is 'auto*', seed with any static placement; autoPlacement will pick the final one\n  const seedPlacement: Placement = String(placement).startsWith('auto')\n    ? 'bottom'\n    : (placement as Placement);\n\n  return useFloating({\n    middleware,\n    placement: seedPlacement,\n    strategy: 'fixed',\n    whileElementsMounted: freeze\n      ? undefined\n      : (reference, floating, update) =>\n          autoUpdate(reference, floating, update, {\n            ancestorResize: true,\n            ancestorScroll: true,\n            animationFrame: false,\n            elementResize: hasResizeObserver,\n            ...autoUpdateOptions,\n          }),\n  });\n}\n", "import clsx from 'clsx';\nimport { type PropsWithChildren, useCallback } from 'react';\nimport React, { useEffect, useRef } from 'react';\nimport { FocusScope } from '@react-aria/focus';\n\nimport { CloseIconRound } from './icons';\n\nimport { useTranslationContext } from '../../context';\n\nexport type ModalCloseEvent =\n  | KeyboardEvent\n  | React.KeyboardEvent\n  | React.MouseEvent<HTMLButtonElement | HTMLDivElement>;\n\nexport type ModalCloseSource = 'overlay' | 'button' | 'escape';\n\nexport type ModalProps = {\n  /** If true, modal is opened or visible. */\n  open: boolean;\n  /** Custom class to be applied to the modal root div */\n  className?: string;\n  /** Callback handler for closing of modal. */\n  onClose?: (event: ModalCloseEvent) => void;\n  /** Optional handler to intercept closing logic. Return false to prevent onClose. */\n  onCloseAttempt?: (source: ModalCloseSource, event: ModalCloseEvent) => boolean;\n};\n\nexport const Modal = ({\n  children,\n  className,\n  onClose,\n  onCloseAttempt,\n  open,\n}: PropsWithChildren<ModalProps>) => {\n  const { t } = useTranslationContext('Modal');\n\n  const innerRef = useRef<HTMLDivElement | null>(null);\n  const closeButtonRef = useRef<HTMLButtonElement | null>(null);\n\n  const maybeClose = useCallback(\n    (source: ModalCloseSource, event: ModalCloseEvent) => {\n      const allow = onCloseAttempt?.(source, event);\n      if (allow !== false) {\n        onClose?.(event);\n      }\n    },\n    [onClose, onCloseAttempt],\n  );\n\n  const handleClick = (event: React.MouseEvent<HTMLButtonElement | HTMLDivElement>) => {\n    const target = event.target as HTMLButtonElement | HTMLDivElement;\n    if (!innerRef.current || !closeButtonRef.current) return;\n\n    if (closeButtonRef.current.contains(target)) {\n      maybeClose('button', event);\n    } else if (!innerRef.current.contains(target)) {\n      maybeClose('overlay', event);\n    }\n  };\n\n  useEffect(() => {\n    if (!open) return;\n\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (event.key === 'Escape') maybeClose('escape', event);\n    };\n\n    document.addEventListener('keydown', handleKeyDown);\n    return () => document.removeEventListener('keydown', handleKeyDown);\n  }, [maybeClose, open]);\n\n  if (!open) return null;\n\n  return (\n    <div\n      className={clsx('str-chat__modal str-chat__modal--open', className)}\n      onClick={handleClick}\n    >\n      <FocusScope autoFocus contain>\n        <button\n          className='str-chat__modal__close-button'\n          ref={closeButtonRef}\n          title={t('Close')}\n        >\n          <CloseIconRound />\n        </button>\n        <div\n          className='str-chat__modal__inner str-chat-react__modal__inner'\n          ref={innerRef}\n        >\n          {children}\n        </div>\n      </FocusScope>\n    </div>\n  );\n};\n", "import React, { useMemo } from 'react';\nimport type { ReactImageGalleryItem } from 'react-image-gallery';\nimport ImageGallery from 'react-image-gallery';\nimport { BaseImage } from './BaseImage';\nimport { useTranslationContext } from '../../context';\n\nimport type { Attachment } from 'stream-chat';\n\nexport type ModalGalleryProps = {\n  /** The images for the Carousel component */\n  images: Attachment[];\n  /** The index for the component */\n  index?: number;\n};\n\nconst onError: React.ReactEventHandler<HTMLImageElement> = (e) => {\n  // Prevent having alt attribute on img as the img takes the height of the alt text\n  // instead of the CSS / element width & height when the CSS mask (fallback) is applied.\n  (e.target as HTMLImageElement).alt = '';\n};\n\nconst renderItem = ({ original, originalAlt }: ReactImageGalleryItem) => (\n  <BaseImage\n    alt={originalAlt}\n    className='image-gallery-image'\n    onError={onError}\n    src={original}\n  />\n);\n\nexport const ModalGallery = (props: ModalGalleryProps) => {\n  const { images, index } = props;\n  const { t } = useTranslationContext('ModalGallery');\n\n  const formattedArray = useMemo(\n    () =>\n      images.map((image) => {\n        const imageSrc = image.image_url || image.thumb_url || '';\n        return {\n          original: imageSrc,\n          originalAlt: t('User uploaded content'),\n          source: imageSrc,\n        };\n      }),\n    [images, t],\n  );\n\n  return (\n    // @ts-expect-error ignore the TS error as react-image-gallery was on @types/react@18 while stream-chat-react being upgraded to React 19 (https://github.com/xiaolin/react-image-gallery/issues/809)\n    <ImageGallery\n      items={formattedArray}\n      renderItem={renderItem}\n      showIndex={true}\n      showPlayButton={false}\n      showThumbnails={false}\n      startIndex={index}\n    />\n  );\n};\n", "import type { CSSProperties, MutableRefObject } from 'react';\nimport { useCallback } from 'react';\nimport React, { useState } from 'react';\nimport { sanitizeUrl } from '@braintree/sanitize-url';\n\nimport { BaseImage as DefaultBaseImage } from './BaseImage';\nimport { Modal as DefaultModal } from '../Modal';\nimport { ModalGallery as DefaultModalGallery } from './ModalGallery';\nimport { useComponentContext } from '../../context';\n\nimport type { Attachment } from 'stream-chat';\nimport type { Dimensions } from '../../types/types';\n\nexport type ImageProps = {\n  dimensions?: Dimensions;\n  innerRef?: MutableRefObject<HTMLImageElement | null>;\n  previewUrl?: string;\n  style?: CSSProperties;\n} & (\n  | {\n      /** The text fallback for the image */\n      fallback?: string;\n      /** The full size image url */\n      image_url?: string;\n      /** The thumb url */\n      thumb_url?: string;\n    }\n  | Attachment\n);\n\n/**\n * A simple component that displays an image.\n */\nexport const ImageComponent = (props: ImageProps) => {\n  const {\n    dimensions = {},\n    fallback,\n    image_url,\n    innerRef,\n    previewUrl,\n    style,\n    thumb_url,\n  } = props;\n\n  const [modalIsOpen, setModalIsOpen] = useState(false);\n  const {\n    BaseImage = DefaultBaseImage,\n    Modal = DefaultModal,\n    ModalGallery = DefaultModalGallery,\n  } = useComponentContext('ImageComponent');\n\n  const imageSrc = sanitizeUrl(previewUrl || image_url || thumb_url);\n  const closeModal = useCallback(() => {\n    setModalIsOpen(false);\n  }, []);\n\n  const openModal = useCallback(() => {\n    setModalIsOpen(true);\n  }, []);\n\n  return (\n    <>\n      <BaseImage\n        alt={fallback}\n        className='str-chat__message-attachment--img'\n        data-testid='image-test'\n        onClick={openModal}\n        src={imageSrc}\n        style={style}\n        tabIndex={0}\n        title={fallback}\n        {...dimensions}\n        {...(innerRef && { ref: innerRef })}\n      />\n      <Modal className='str-chat__image-modal' onClose={closeModal} open={modalIsOpen}>\n        <ModalGallery images={[props]} index={0} />\n      </Modal>\n    </>\n  );\n};\n", "import clsx from 'clsx';\nimport type { PropsWithChildren } from 'react';\nimport React, { useCallback, useRef } from 'react';\n\nimport { MessageActionsBox } from './MessageActionsBox';\n\nimport { DialogAnchor, useDialogIsOpen, useDialogOnNearestManager } from '../Dialog';\nimport { ActionsIcon as DefaultActionsIcon } from '../Message/icons';\nimport { isUserMuted, shouldRenderMessageActions } from '../Message/utils';\n\nimport { useChatContext } from '../../context/ChatContext';\nimport type { MessageContextValue } from '../../context/MessageContext';\nimport { useMessageContext } from '../../context/MessageContext';\nimport { useComponentContext, useTranslationContext } from '../../context';\n\nimport type { IconProps } from '../../types/types';\n\ntype MessageContextPropsToPick =\n  | 'getMessageActions'\n  | 'handleDelete'\n  | 'handleFlag'\n  | 'handleMarkUnread'\n  | 'handleMute'\n  | 'handlePin'\n  | 'message';\n\nexport type MessageActionsProps = Partial<\n  Pick<MessageContextValue, MessageContextPropsToPick>\n> & {\n  /* Custom component rendering the icon used in message actions button. This button invokes the message actions menu. */\n  ActionsIcon?: React.ComponentType<IconProps>;\n  /* Custom CSS class to be added to the `div` wrapping the component */\n  customWrapperClass?: string;\n  /* If true, renders the wrapper component as a `span`, not a `div` */\n  inline?: boolean;\n  /* Function that returns whether the message was sent by the connected user */\n  mine?: () => boolean;\n};\n\nexport const MessageActions = (props: MessageActionsProps) => {\n  const {\n    ActionsIcon = DefaultActionsIcon,\n    customWrapperClass = '',\n    getMessageActions: propGetMessageActions,\n    handleDelete: propHandleDelete,\n    handleFlag: propHandleFlag,\n    handleMarkUnread: propHandleMarkUnread,\n    handleMute: propHandleMute,\n    handlePin: propHandlePin,\n    inline,\n    message: propMessage,\n    mine,\n  } = props;\n\n  const { mutes } = useChatContext('MessageActions');\n\n  const {\n    customMessageActions,\n    getMessageActions: contextGetMessageActions,\n    handleDelete: contextHandleDelete,\n    handleFlag: contextHandleFlag,\n    handleMarkUnread: contextHandleMarkUnread,\n    handleMute: contextHandleMute,\n    handlePin: contextHandlePin,\n    isMyMessage,\n    message: contextMessage,\n    setEditingState,\n    threadList,\n  } = useMessageContext('MessageActions');\n\n  const { CustomMessageActionsList } = useComponentContext('MessageActions');\n\n  const { t } = useTranslationContext('MessageActions');\n\n  const getMessageActions = propGetMessageActions || contextGetMessageActions;\n  const handleDelete = propHandleDelete || contextHandleDelete;\n  const handleFlag = propHandleFlag || contextHandleFlag;\n  const handleMarkUnread = propHandleMarkUnread || contextHandleMarkUnread;\n  const handleMute = propHandleMute || contextHandleMute;\n  const handlePin = propHandlePin || contextHandlePin;\n  const message = propMessage || contextMessage;\n  const isMine = mine ? mine() : isMyMessage();\n\n  const isMuted = useCallback(() => isUserMuted(message, mutes), [message, mutes]);\n\n  const dialogIdNamespace = threadList ? '-thread-' : '';\n  const dialogId = `message-actions${dialogIdNamespace}--${message.id}`;\n  const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId });\n  const dialogIsOpen = useDialogIsOpen(dialogId, dialogManager?.id);\n\n  const messageActions = getMessageActions();\n\n  const renderMessageActions = shouldRenderMessageActions({\n    customMessageActions,\n    CustomMessageActionsList,\n    inThread: threadList,\n    messageActions,\n  });\n\n  const actionsBoxButtonRef = useRef<HTMLButtonElement | null>(null);\n\n  if (!renderMessageActions) return null;\n\n  return (\n    <MessageActionsWrapper\n      customWrapperClass={customWrapperClass}\n      inline={inline}\n      toggleOpen={dialog?.toggle}\n    >\n      <DialogAnchor\n        dialogManagerId={dialogManager?.id}\n        id={dialogId}\n        placement={isMine ? 'top-end' : 'top-start'}\n        referenceElement={actionsBoxButtonRef.current}\n        tabIndex={-1}\n        trapFocus\n      >\n        <MessageActionsBox\n          getMessageActions={getMessageActions}\n          handleDelete={handleDelete}\n          handleEdit={setEditingState}\n          handleFlag={handleFlag}\n          handleMarkUnread={handleMarkUnread}\n          handleMute={handleMute}\n          handlePin={handlePin}\n          isUserMuted={isMuted}\n          mine={isMine}\n          open={dialogIsOpen}\n        />\n      </DialogAnchor>\n      <button\n        aria-expanded={dialogIsOpen}\n        aria-haspopup='true'\n        aria-label={t('aria/Open Message Actions Menu')}\n        className='str-chat__message-actions-box-button'\n        data-testid='message-actions-toggle-button'\n        ref={actionsBoxButtonRef}\n      >\n        <ActionsIcon className='str-chat__message-action-icon' />\n      </button>\n    </MessageActionsWrapper>\n  );\n};\n\nexport type MessageActionsWrapperProps = {\n  customWrapperClass?: string;\n  inline?: boolean;\n  toggleOpen?: () => void;\n};\n\nexport const MessageActionsWrapper = (\n  props: PropsWithChildren<MessageActionsWrapperProps>,\n) => {\n  const { children, customWrapperClass, inline, toggleOpen } = props;\n\n  const defaultWrapperClass = clsx(\n    'str-chat__message-simple__actions__action',\n    'str-chat__message-simple__actions__action--options',\n    'str-chat__message-actions-container',\n  );\n\n  const wrapperProps = {\n    className: customWrapperClass || defaultWrapperClass,\n    'data-testid': 'message-actions',\n    onClick: toggleOpen,\n  };\n\n  if (inline) return <span {...wrapperProps}>{children}</span>;\n\n  return <div {...wrapperProps}>{children}</div>;\n};\n", "import clsx from 'clsx';\nimport type { ComponentProps } from 'react';\nimport React from 'react';\nimport { CustomMessageActionsList as DefaultCustomMessageActionsList } from './CustomMessageActionsList';\nimport { RemindMeActionButton } from './RemindMeSubmenu';\nimport { OPTIONAL_MESSAGE_ACTIONS, useMessageReminder } from '../Message';\nimport { useMessageComposer } from '../MessageInput';\nimport {\n  useChatContext,\n  useComponentContext,\n  useMessageContext,\n  useTranslationContext,\n} from '../../context';\nimport { MESSAGE_ACTIONS } from '../Message/utils';\nimport type { MessageContextValue } from '../../context';\n\ntype PropsDrilledToMessageActionsBox =\n  | 'getMessageActions'\n  | 'handleDelete'\n  | 'handleEdit'\n  | 'handleMarkUnread'\n  | 'handleFlag'\n  | 'handleMute'\n  | 'handlePin';\n\nexport type MessageActionsBoxProps = Pick<\n  MessageContextValue,\n  PropsDrilledToMessageActionsBox\n> & {\n  isUserMuted: () => boolean;\n  mine: boolean;\n  open: boolean;\n} & ComponentProps<'div'>;\n\nconst UnMemoizedMessageActionsBox = (props: MessageActionsBoxProps) => {\n  const {\n    className,\n    getMessageActions,\n    handleDelete,\n    handleEdit,\n    handleFlag,\n    handleMarkUnread,\n    handleMute,\n    handlePin,\n    isUserMuted,\n    mine,\n    open,\n    ...restDivProps\n  } = props;\n\n  const { client } = useChatContext();\n  const { CustomMessageActionsList = DefaultCustomMessageActionsList } =\n    useComponentContext('MessageActionsBox');\n  const { customMessageActions, message, threadList } =\n    useMessageContext('MessageActionsBox');\n  const { t } = useTranslationContext('MessageActionsBox');\n  const messageComposer = useMessageComposer();\n  const reminder = useMessageReminder(message.id);\n\n  const messageActions = getMessageActions();\n\n  const handleQuote = () => {\n    messageComposer.setQuotedMessage(message);\n\n    const elements = message.parent_id\n      ? document.querySelectorAll('.str-chat__thread .str-chat__textarea__textarea')\n      : document.getElementsByClassName('str-chat__textarea__textarea');\n    const textarea = elements.item(0);\n\n    if (textarea instanceof HTMLTextAreaElement) {\n      textarea.focus();\n    }\n  };\n\n  const rootClassName = clsx('str-chat__message-actions-box', className, {\n    'str-chat__message-actions-box--open': open,\n  });\n\n  const buttonClassName =\n    'str-chat__message-actions-list-item str-chat__message-actions-list-item-button';\n\n  return (\n    <div {...restDivProps} className={rootClassName} data-testid='message-actions-box'>\n      <div\n        aria-label={t('aria/Message Options')}\n        className='str-chat__message-actions-list'\n        role='listbox'\n      >\n        <CustomMessageActionsList\n          customMessageActions={customMessageActions}\n          message={message}\n        />\n        {messageActions.indexOf(MESSAGE_ACTIONS.quote) > -1 && (\n          <button\n            aria-selected='false'\n            className={buttonClassName}\n            onClick={handleQuote}\n            role='option'\n          >\n            {t('Reply')}\n          </button>\n        )}\n        {messageActions.indexOf(MESSAGE_ACTIONS.pin) > -1 && !message.parent_id && (\n          <button\n            aria-selected='false'\n            className={buttonClassName}\n            onClick={handlePin}\n            role='option'\n          >\n            {!message.pinned ? t('Pin') : t('Unpin')}\n          </button>\n        )}\n        {messageActions.indexOf(MESSAGE_ACTIONS.markUnread) > -1 &&\n          !threadList &&\n          !!message.id && (\n            <button\n              aria-selected='false'\n              className={buttonClassName}\n              onClick={handleMarkUnread}\n              role='option'\n            >\n              {t('Mark as unread')}\n            </button>\n          )}\n        {messageActions.indexOf(MESSAGE_ACTIONS.flag) > -1 && (\n          <button\n            aria-selected='false'\n            className={buttonClassName}\n            onClick={handleFlag}\n            role='option'\n          >\n            {t('Flag')}\n          </button>\n        )}\n        {messageActions.indexOf(MESSAGE_ACTIONS.mute) > -1 && (\n          <button\n            aria-selected='false'\n            className={buttonClassName}\n            onClick={handleMute}\n            role='option'\n          >\n            {isUserMuted() ? t('Unmute') : t('Mute')}\n          </button>\n        )}\n        {messageActions.indexOf(MESSAGE_ACTIONS.edit) > -1 && (\n          <button\n            aria-selected='false'\n            className={buttonClassName}\n            onClick={handleEdit}\n            role='option'\n          >\n            {t('Edit Message')}\n          </button>\n        )}\n        {messageActions.indexOf(MESSAGE_ACTIONS.delete) > -1 && (\n          <button\n            aria-selected='false'\n            className={buttonClassName}\n            onClick={handleDelete}\n            role='option'\n          >\n            {t('Delete')}\n          </button>\n        )}\n        {messageActions.indexOf(OPTIONAL_MESSAGE_ACTIONS.deleteForMe) > -1 &&\n          !message.deleted_for_me && (\n            <button\n              aria-selected='false'\n              className={buttonClassName}\n              onClick={(e) => handleDelete(e, { deleteForMe: true })}\n              role='option'\n            >\n              {t('Delete for me')}\n            </button>\n          )}\n        {messageActions.indexOf(MESSAGE_ACTIONS.remindMe) > -1 && (\n          <RemindMeActionButton className={buttonClassName} isMine={mine} />\n        )}\n        {messageActions.indexOf(MESSAGE_ACTIONS.saveForLater) > -1 && (\n          <button\n            aria-selected='false'\n            className={buttonClassName}\n            onClick={() =>\n              reminder\n                ? client.reminders.deleteReminder(reminder.id)\n                : client.reminders.createReminder({ messageId: message.id })\n            }\n            role='option'\n          >\n            {reminder ? t('Remove reminder') : t('Save for later')}\n          </button>\n        )}\n      </div>\n    </div>\n  );\n};\n\n/**\n * A popup box that displays the available actions on a message, such as edit, delete, pin, etc.\n */\nexport const MessageActionsBox = React.memo(\n  UnMemoizedMessageActionsBox,\n) as typeof UnMemoizedMessageActionsBox;\n", "import React from 'react';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { CustomMessageActions } from '../../context/MessageContext';\n\nexport type CustomMessageActionsListProps = {\n  message: LocalMessage;\n  customMessageActions?: CustomMessageActions;\n};\n\nexport const CustomMessageActionsList = (props: CustomMessageActionsListProps) => {\n  const { customMessageActions, message } = props;\n\n  if (!customMessageActions) return null;\n\n  const customActionsArray = Object.keys(customMessageActions);\n\n  return (\n    <>\n      {customActionsArray.map((customAction) => {\n        const customHandler = customMessageActions[customAction];\n\n        return (\n          <button\n            aria-selected='false'\n            className='str-chat__message-actions-list-item str-chat__message-actions-list-item-button'\n            key={customAction}\n            onClick={(event) => customHandler(message, event)}\n            role='option'\n          >\n            {customAction}\n          </button>\n        );\n      })}\n    </>\n  );\n};\n", "import React from 'react';\nimport { useChatContext, useMessageContext, useTranslationContext } from '../../context';\nimport { ButtonWithSubmenu } from '../Dialog';\nimport type { ComponentProps } from 'react';\n\nexport const RemindMeActionButton = ({\n  className,\n  isMine,\n}: { isMine: boolean } & ComponentProps<'button'>) => {\n  const { t } = useTranslationContext();\n\n  return (\n    <ButtonWithSubmenu\n      aria-selected='false'\n      className={className}\n      placement={isMine ? 'left-start' : 'right-start'}\n      Submenu={RemindMeSubmenu}\n    >\n      {t('Remind Me')}\n    </ButtonWithSubmenu>\n  );\n};\n\nexport const RemindMeSubmenu = () => {\n  const { t } = useTranslationContext();\n  const { client } = useChatContext();\n  const { message } = useMessageContext();\n  return (\n    <div\n      aria-label={t('aria/Remind Me Options')}\n      className='str-chat__message-actions-box__submenu'\n      role='listbox'\n    >\n      {client.reminders.scheduledOffsetsMs.map((offsetMs) => (\n        <button\n          className='str-chat__message-actions-list-item-button'\n          key={`reminder-offset-option--${offsetMs}`}\n          onClick={() => {\n            client.reminders.upsertReminder({\n              messageId: message.id,\n              remind_at: new Date(new Date().getTime() + offsetMs).toISOString(),\n            });\n          }}\n        >\n          {t('duration/Remind Me', { milliseconds: offsetMs })}\n        </button>\n      ))}\n      {/* todo: potential improvement to add a custom option that would trigger rendering modal with custom date picker - we need date picker */}\n    </div>\n  );\n};\n", "import React from 'react';\n\nimport type { PinIndicatorProps } from './types';\n\nimport type { IconProps } from '../../types/types';\n\nexport const ActionsIcon = ({ className = '' }: IconProps) => (\n  <svg\n    className={className}\n    height='4'\n    viewBox='0 0 11 4'\n    width='11'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      d='M1.5 3a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z'\n      fillRule='nonzero'\n    />\n  </svg>\n);\n\nexport const ReactionIcon = ({ className = '' }: IconProps) => (\n  <svg\n    className={className}\n    height='12'\n    viewBox='0 0 12 12'\n    width='12'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <g clipRule='evenodd' fillRule='evenodd'>\n      <path d='M6 1.2C3.3 1.2 1.2 3.3 1.2 6c0 2.7 2.1 4.8 4.8 4.8 2.7 0 4.8-2.1 4.8-4.8 0-2.7-2.1-4.8-4.8-4.8zM0 6c0-3.3 2.7-6 6-6s6 2.7 6 6-2.7 6-6 6-6-2.7-6-6z' />\n      <path d='M5.4 4.5c0 .5-.4.9-.9.9s-.9-.4-.9-.9.4-.9.9-.9.9.4.9.9zM8.4 4.5c0 .5-.4.9-.9.9s-.9-.4-.9-.9.4-.9.9-.9.9.4.9.9zM3.3 6.7c.3-.2.6-.1.8.1.3.4.8.9 1.5 1 .6.2 1.4.1 2.4-1 .2-.2.6-.3.8 0 .2.2.3.6 0 .8-1.1 1.3-2.4 1.7-3.5 1.5-1-.2-1.8-.9-2.2-1.5-.2-.3-.1-.7.2-.9z' />\n    </g>\n  </svg>\n);\n\nexport const ThreadIcon = ({ className = '' }: IconProps) => (\n  <svg className={className} height='10' width='14' xmlns='http://www.w3.org/2000/svg'>\n    <path\n      d='M8.516 3c4.78 0 4.972 6.5 4.972 6.5-1.6-2.906-2.847-3.184-4.972-3.184v2.872L3.772 4.994 8.516.5V3zM.484 5l4.5-4.237v1.78L2.416 5l2.568 2.125v1.828L.484 5z'\n      fillRule='evenodd'\n    />\n  </svg>\n);\n\nexport const PinIcon = () => (\n  <svg height='13' viewBox='0 0 14 13' width='14' xmlns='http://www.w3.org/2000/svg'>\n    <path\n      d='M13.3518 6.686L6.75251 0.0866699L5.80984 1.02867L6.75318 1.972V1.97334L3.45318 5.272L3.45251 5.27334L2.50984 4.32934L1.56718 5.27267L4.39584 8.10067L0.624512 11.8713L1.56718 12.814L5.33851 9.04334L8.16718 11.8713L9.10984 10.9293L8.16718 9.986L11.4672 6.686L12.4098 7.62867L13.3518 6.686ZM7.22451 9.04267L7.22385 9.04334L4.39584 6.21467L7.69518 2.91467L10.5232 5.74267L7.22451 9.04267Z'\n      fillRule='evenodd'\n    />\n  </svg>\n);\n\nexport const PinIndicator = ({ message, t }: PinIndicatorProps) => {\n  if (!message || !t) return null;\n\n  return (\n    <div style={{ alignItems: 'center', display: 'flex' }}>\n      <PinIcon />\n      <div\n        style={{\n          fontSize: '14px',\n          marginBottom: '0',\n          marginLeft: '8px',\n          marginTop: '0',\n        }}\n      >\n        {message.pinned_by\n          ? `${t('Pinned by')} ${message.pinned_by?.name || message.pinned_by?.id}`\n          : t('Message pinned')}\n      </div>\n    </div>\n  );\n};\n\nexport const MessageSentIcon = () => (\n  <svg\n    data-testid='message-sent-icon'\n    fill='currentColor'\n    viewBox='0 0 10 8'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      clipRule='evenodd'\n      d='M9.47116 1.80482C9.73151 1.54447 9.73151 1.12236 9.47116 0.862011C9.21081 0.601661 8.7887 0.601661 8.52835 0.862011L3.66646 5.7239L1.47108 3.52851C1.21073 3.26816 0.788619 3.26816 0.52827 3.52851C0.26792 3.78886 0.26792 4.21097 0.52827 4.47132L3.18877 7.13182C3.19083 7.13394 3.19292 7.13605 3.19502 7.13815C3.45537 7.3985 3.87748 7.3985 4.13783 7.13815L9.47116 1.80482Z'\n      fillRule='evenodd'\n    />\n  </svg>\n);\n\nexport const MessageDeliveredIcon = () => (\n  <svg\n    data-testid='delivered-icon'\n    fill='currentColor'\n    viewBox='0 0 14 8'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      clipRule='evenodd'\n      d='M9.50041 0.862011C9.76149 1.12236 9.76149 1.54447 9.50041 1.80482L6.63046 4.66681L7.69051 5.72392L12.566 0.862011C12.827 0.601661 13.2503 0.601661 13.5114 0.862011C13.7725 1.12236 13.7725 1.54447 13.5114 1.80482L8.16321 7.13815C7.90214 7.3985 7.47885 7.3985 7.21778 7.13815C7.2164 7.13678 7.21502 7.13539 7.21366 7.13401L5.68502 5.60962L4.15223 7.13815C3.89115 7.3985 3.46787 7.3985 3.20679 7.13815L3.19746 7.12866L0.53272 4.47132C0.271645 4.21097 0.271645 3.78886 0.53272 3.52851C0.793794 3.26816 1.21708 3.26816 1.47815 3.52851L3.6796 5.72385L5.20067 4.207L5.21216 4.19526L5.22393 4.1838L8.55498 0.862011C8.81605 0.601661 9.23934 0.601661 9.50041 0.862011Z'\n      // fill='#005DFF'\n      fillRule='evenodd'\n    />\n  </svg>\n);\n\nexport const MessageErrorIcon = () => (\n  <div className='str-chat__message-error-icon'>\n    <svg\n      data-testid='error'\n      fill='none'\n      height='24'\n      viewBox='0 0 24 24'\n      width='24'\n      xmlns='http://www.w3.org/2000/svg'\n    >\n      <path\n        d='M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2Z'\n        fill='black'\n        id='background'\n      />\n      <path d='M13 17H11V15H13V17ZM13 13H11V7H13V13Z' fill='white' />\n    </svg>\n  </div>\n);\n", "export function escapeRegExp(text: string) {\n  return text.replace(/[-[\\]{}()*+?.,/\\\\^$|#]/g, '\\\\$&');\n}\n\nexport const detectHttp = /(http(s?):\\/\\/)?(www\\.)?/;\n\nexport const messageCodeBlocks = (message: string) => {\n  const codeRegex = /```[a-z]*\\n[\\s\\S]*?\\n```|`[a-z]*[\\s\\S]*?`/gm;\n  const matches = message.match(codeRegex);\n  return matches || [];\n};\n\nexport const matchMarkdownLinks = (message: string) => {\n  const regexMdLinks = /\\[([^[]+)\\](\\(.*\\))/gm;\n  const matches = message.match(regexMdLinks);\n  const singleMatch = /\\[([^[]+)\\]\\((.*)\\)/;\n\n  const links = matches\n    ? matches.map((match) => {\n        const i = singleMatch.exec(match);\n        return i && [i[1], i[2]];\n      })\n    : [];\n\n  return links.flat();\n};\n", "/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').Parents} Parents\n */\n\n/**\n * @template Fn\n * @template Fallback\n * @typedef {Fn extends (value: any) => value is infer Thing ? Thing : Fallback} Predicate\n */\n\n/**\n * @callback Check\n *   Check that an arbitrary value is an element.\n * @param {unknown} this\n *   Context object (`this`) to call `test` with\n * @param {unknown} [element]\n *   Anything (typically a node).\n * @param {number | null | undefined} [index]\n *   Position of `element` in its parent.\n * @param {Parents | null | undefined} [parent]\n *   Parent of `element`.\n * @returns {boolean}\n *   Whether this is an element and passes a test.\n *\n * @typedef {Array<TestFunction | string> | TestFunction | string | null | undefined} Test\n *   Check for an arbitrary element.\n *\n *   * when `string`, checks that the element has that tag name\n *   * when `function`, see `TestFunction`\n *   * when `Array`, checks if one of the subtests pass\n *\n * @callback TestFunction\n *   Check if an element passes a test.\n * @param {unknown} this\n *   The given context.\n * @param {Element} element\n *   An element.\n * @param {number | undefined} [index]\n *   Position of `element` in its parent.\n * @param {Parents | undefined} [parent]\n *   Parent of `element`.\n * @returns {boolean | undefined | void}\n *   Whether this element passes the test.\n *\n *   Note: `void` is included until TS sees no return as `undefined`.\n */\n\n/**\n * Check if `element` is an `Element` and whether it passes the given test.\n *\n * @param element\n *   Thing to check, typically `element`.\n * @param test\n *   Check for a specific element.\n * @param index\n *   Position of `element` in its parent.\n * @param parent\n *   Parent of `element`.\n * @param context\n *   Context object (`this`) to call `test` with.\n * @returns\n *   Whether `element` is an `Element` and passes a test.\n * @throws\n *   When an incorrect `test`, `index`, or `parent` is given; there is no error\n *   thrown when `element` is not a node or not an element.\n */\nexport const isElement =\n  // Note: overloads in JSDoc can\u2019t yet use different `@template`s.\n  /**\n   * @type {(\n   *   (<Condition extends TestFunction>(element: unknown, test: Condition, index?: number | null | undefined, parent?: Parents | null | undefined, context?: unknown) => element is Element & Predicate<Condition, Element>) &\n   *   (<Condition extends string>(element: unknown, test: Condition, index?: number | null | undefined, parent?: Parents | null | undefined, context?: unknown) => element is Element & {tagName: Condition}) &\n   *   ((element?: null | undefined) => false) &\n   *   ((element: unknown, test?: null | undefined, index?: number | null | undefined, parent?: Parents | null | undefined, context?: unknown) => element is Element) &\n   *   ((element: unknown, test?: Test, index?: number | null | undefined, parent?: Parents | null | undefined, context?: unknown) => boolean)\n   * )}\n   */\n  (\n    /**\n     * @param {unknown} [element]\n     * @param {Test | undefined} [test]\n     * @param {number | null | undefined} [index]\n     * @param {Parents | null | undefined} [parent]\n     * @param {unknown} [context]\n     * @returns {boolean}\n     */\n    // eslint-disable-next-line max-params\n    function (element, test, index, parent, context) {\n      const check = convertElement(test)\n\n      if (\n        index !== null &&\n        index !== undefined &&\n        (typeof index !== 'number' ||\n          index < 0 ||\n          index === Number.POSITIVE_INFINITY)\n      ) {\n        throw new Error('Expected positive finite `index`')\n      }\n\n      if (\n        parent !== null &&\n        parent !== undefined &&\n        (!parent.type || !parent.children)\n      ) {\n        throw new Error('Expected valid `parent`')\n      }\n\n      if (\n        (index === null || index === undefined) !==\n        (parent === null || parent === undefined)\n      ) {\n        throw new Error('Expected both `index` and `parent`')\n      }\n\n      return looksLikeAnElement(element)\n        ? check.call(context, element, index, parent)\n        : false\n    }\n  )\n\n/**\n * Generate a check from a test.\n *\n * Useful if you\u2019re going to test many nodes, for example when creating a\n * utility where something else passes a compatible test.\n *\n * The created function is a bit faster because it expects valid input only:\n * an `element`, `index`, and `parent`.\n *\n * @param test\n *   A test for a specific element.\n * @returns\n *   A check.\n */\nexport const convertElement =\n  // Note: overloads in JSDoc can\u2019t yet use different `@template`s.\n  /**\n   * @type {(\n   *   (<Condition extends TestFunction>(test: Condition) => (element: unknown, index?: number | null | undefined, parent?: Parents | null | undefined, context?: unknown) => element is Element & Predicate<Condition, Element>) &\n   *   (<Condition extends string>(test: Condition) => (element: unknown, index?: number | null | undefined, parent?: Parents | null | undefined, context?: unknown) => element is Element & {tagName: Condition}) &\n   *   ((test?: null | undefined) => (element?: unknown, index?: number | null | undefined, parent?: Parents | null | undefined, context?: unknown) => element is Element) &\n   *   ((test?: Test) => Check)\n   * )}\n   */\n  (\n    /**\n     * @param {Test | null | undefined} [test]\n     * @returns {Check}\n     */\n    function (test) {\n      if (test === null || test === undefined) {\n        return element\n      }\n\n      if (typeof test === 'string') {\n        return tagNameFactory(test)\n      }\n\n      // Assume array.\n      if (typeof test === 'object') {\n        return anyFactory(test)\n      }\n\n      if (typeof test === 'function') {\n        return castFactory(test)\n      }\n\n      throw new Error('Expected function, string, or array as `test`')\n    }\n  )\n\n/**\n * Handle multiple tests.\n *\n * @param {Array<TestFunction | string>} tests\n * @returns {Check}\n */\nfunction anyFactory(tests) {\n  /** @type {Array<Check>} */\n  const checks = []\n  let index = -1\n\n  while (++index < tests.length) {\n    checks[index] = convertElement(tests[index])\n  }\n\n  return castFactory(any)\n\n  /**\n   * @this {unknown}\n   * @type {TestFunction}\n   */\n  function any(...parameters) {\n    let index = -1\n\n    while (++index < checks.length) {\n      if (checks[index].apply(this, parameters)) return true\n    }\n\n    return false\n  }\n}\n\n/**\n * Turn a string into a test for an element with a certain type.\n *\n * @param {string} check\n * @returns {Check}\n */\nfunction tagNameFactory(check) {\n  return castFactory(tagName)\n\n  /**\n   * @param {Element} element\n   * @returns {boolean}\n   */\n  function tagName(element) {\n    return element.tagName === check\n  }\n}\n\n/**\n * Turn a custom test into a test for an element that passes that test.\n *\n * @param {TestFunction} testFunction\n * @returns {Check}\n */\nfunction castFactory(testFunction) {\n  return check\n\n  /**\n   * @this {unknown}\n   * @type {Check}\n   */\n  function check(value, index, parent) {\n    return Boolean(\n      looksLikeAnElement(value) &&\n        testFunction.call(\n          this,\n          value,\n          typeof index === 'number' ? index : undefined,\n          parent || undefined\n        )\n    )\n  }\n}\n\n/**\n * Make sure something is an element.\n *\n * @param {unknown} element\n * @returns {element is Element}\n */\nfunction element(element) {\n  return Boolean(\n    element &&\n      typeof element === 'object' &&\n      'type' in element &&\n      element.type === 'element' &&\n      'tagName' in element &&\n      typeof element.tagName === 'string'\n  )\n}\n\n/**\n * @param {unknown} value\n * @returns {value is Element}\n */\nfunction looksLikeAnElement(value) {\n  return (\n    value !== null &&\n    typeof value === 'object' &&\n    'type' in value &&\n    'tagName' in value\n  )\n}\n", "export default function escapeStringRegexp(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\t// Escape characters with special meaning either inside or outside character sets.\n\t// Use a simple backslash escape when it\u2019s always valid, and a `\\xnn` escape when the simpler form would be disallowed by Unicode patterns\u2019 stricter grammar.\n\treturn string\n\t\t.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n\t\t.replace(/-/g, '\\\\x2d');\n}\n", "/**\n * @typedef {import('hast').Nodes} Nodes\n * @typedef {import('hast').Parents} Parents\n * @typedef {import('hast').Root} Root\n * @typedef {import('hast').RootContent} RootContent\n * @typedef {import('hast').Text} Text\n * @typedef {import('hast-util-is-element').Test} Test\n * @typedef {import('unist-util-visit-parents').VisitorResult} VisitorResult\n */\n\n/**\n * @typedef {RegExp | string} Find\n *   Pattern to find.\n *\n *   Strings are escaped and then turned into global expressions.\n *\n * @typedef {Array<FindAndReplaceTuple>} FindAndReplaceList\n *   Several find and replaces, in array form.\n *\n * @typedef {[Find, Replace?]} FindAndReplaceTuple\n *   Find and replace in tuple form.\n *\n * @typedef RegExpMatchObject\n *   Info on the match.\n * @property {number} index\n *   The index of the search at which the result was found.\n * @property {string} input\n *   A copy of the search string in the text node.\n * @property {[...Array<Parents>, Text]} stack\n *   All ancestors of the text node, where the last node is the text itself.\n *\n * @typedef {ReplaceFunction | string | null | undefined} Replace\n *   Thing to replace with.\n *\n * @callback ReplaceFunction\n *   Callback called when a search matches.\n * @param {...any} parameters\n *   The parameters are the result of corresponding search expression:\n *\n *   * `value` (`string`) \u2014 whole match\n *   * `...capture` (`Array<string>`) \u2014 matches from regex capture groups\n *   * `match` (`RegExpMatchObject`) \u2014 info on the match\n * @returns {Array<RootContent> | RootContent | string | false | null | undefined}\n *   Thing to replace with.\n *\n *   * when `null`, `undefined`, `''`, remove the match\n *   * \u2026or when `false`, do not replace at all\n *   * \u2026or when `string`, replace with a text node of that value\n *   * \u2026or when `Node` or `Array<Node>`, replace with those nodes\n *\n * @typedef {[RegExp, ReplaceFunction]} Pair\n *   Normalized find and replace.\n * @typedef {Array<Pair>} Pairs\n *   All find and replaced.\n *\n * @typedef Options\n *   Configuration.\n * @property {Test | null | undefined} [ignore]\n *   Test for which elements to ignore (optional).\n */\n\nimport {visitParents} from 'unist-util-visit-parents'\nimport {convertElement} from 'hast-util-is-element'\nimport escape from 'escape-string-regexp'\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Default tag names to ignore.\n *\n * The defaults are `math`, `script`, `style`, `svg`, and `title`.\n *\n * @type {Array<string>}\n */\nexport const defaultIgnore = ['math', 'script', 'style', 'svg', 'title']\n\n/**\n * Find patterns in a tree and replace them.\n *\n * The algorithm searches the tree in *preorder* for complete values in `Text`\n * nodes.\n * Partial matches are not supported.\n *\n * @param {Nodes} tree\n *   Tree to change.\n * @param {FindAndReplaceList | FindAndReplaceTuple} list\n *   One or more find-and-replace pairs.\n * @param {Readonly<Options> | null | undefined} [options]\n *   Configuration (when `find` is not `Find`).\n * @returns {undefined}\n *   Nothing.\n */\nexport function findAndReplace(tree, list, options) {\n  const settings = options || emptyOptions\n  const ignored = convertElement(settings.ignore || defaultIgnore)\n  const pairs = toPairs(list)\n  let pairIndex = -1\n\n  while (++pairIndex < pairs.length) {\n    visitParents(tree, 'text', visitor)\n  }\n\n  /** @type {import('unist-util-visit-parents').BuildVisitor<Root, 'text'>} */\n  function visitor(node, parents) {\n    let index = -1\n    /** @type {Parents | undefined} */\n    let grandparent\n\n    while (++index < parents.length) {\n      const parent = parents[index]\n      /** @type {Array<Nodes> | undefined} */\n      const siblings = grandparent ? grandparent.children : undefined\n\n      if (\n        ignored(\n          parent,\n          siblings ? siblings.indexOf(parent) : undefined,\n          grandparent\n        )\n      ) {\n        return\n      }\n\n      grandparent = parent\n    }\n\n    if (grandparent) {\n      return handler(node, parents)\n    }\n  }\n\n  /**\n   * Handle a text node which is not in an ignored parent.\n   *\n   * @param {Text} node\n   *   Text node.\n   * @param {Array<Parents>} parents\n   *   Parents.\n   * @returns {VisitorResult}\n   *   Result.\n   */\n  function handler(node, parents) {\n    const parent = parents[parents.length - 1]\n    const find = pairs[pairIndex][0]\n    const replace = pairs[pairIndex][1]\n    let start = 0\n    /** @type {Array<Nodes>} */\n    const siblings = parent.children\n    const index = siblings.indexOf(node)\n    let change = false\n    /** @type {Array<RootContent>} */\n    let nodes = []\n\n    find.lastIndex = 0\n\n    let match = find.exec(node.value)\n\n    while (match) {\n      const position = match.index\n      /** @type {RegExpMatchObject} */\n      const matchObject = {\n        index: match.index,\n        input: match.input,\n        stack: [...parents, node]\n      }\n      let value = replace(...match, matchObject)\n\n      if (typeof value === 'string') {\n        value = value.length > 0 ? {type: 'text', value} : undefined\n      }\n\n      // It wasn\u2019t a match after all.\n      if (value === false) {\n        // False acts as if there was no match.\n        // So we need to reset `lastIndex`, which currently being at the end of\n        // the current match, to the beginning.\n        find.lastIndex = position + 1\n      } else {\n        if (start !== position) {\n          nodes.push({type: 'text', value: node.value.slice(start, position)})\n        }\n\n        if (Array.isArray(value)) {\n          nodes.push(...value)\n        } else if (value) {\n          nodes.push(value)\n        }\n\n        start = position + match[0].length\n        change = true\n      }\n\n      if (!find.global) {\n        break\n      }\n\n      match = find.exec(node.value)\n    }\n\n    if (change) {\n      if (start < node.value.length) {\n        nodes.push({type: 'text', value: node.value.slice(start)})\n      }\n\n      parent.children.splice(index, 1, ...nodes)\n    } else {\n      nodes = [node]\n    }\n\n    return index + nodes.length\n  }\n}\n\n/**\n * Turn a tuple or a list of tuples into pairs.\n *\n * @param {FindAndReplaceList | FindAndReplaceTuple} tupleOrList\n *   Schema.\n * @returns {Pairs}\n *   Clean pairs.\n */\nfunction toPairs(tupleOrList) {\n  /** @type {Pairs} */\n  const result = []\n\n  if (!Array.isArray(tupleOrList)) {\n    throw new TypeError('Expected find and replace tuple or list of tuples')\n  }\n\n  /** @type {FindAndReplaceList} */\n  // @ts-expect-error: correct.\n  const list =\n    !tupleOrList[0] || Array.isArray(tupleOrList[0])\n      ? tupleOrList\n      : [tupleOrList]\n\n  let index = -1\n\n  while (++index < list.length) {\n    const tuple = list[index]\n    result.push([toExpression(tuple[0]), toFunction(tuple[1])])\n  }\n\n  return result\n}\n\n/**\n * Turn a find into an expression.\n *\n * @param {Find} find\n *   Find.\n * @returns {RegExp}\n *   Expression.\n */\nfunction toExpression(find) {\n  return typeof find === 'string' ? new RegExp(escape(find), 'g') : find\n}\n\n/**\n * Turn a replace into a function.\n *\n * @param {Replace} replace\n *   Replace.\n * @returns {ReplaceFunction}\n *   Function.\n */\nfunction toFunction(replace) {\n  return typeof replace === 'function'\n    ? replace\n    : function () {\n        return replace\n      }\n}\n", "/**\n * @typedef {import('unist').Node} Node\n */\n\n/**\n * @typedef {Array<Node> | string} ChildrenOrValue\n *   List to use as `children` or value to use as `value`.\n *\n * @typedef {Record<string, unknown>} Props\n *   Other fields to add to the node.\n */\n\n/**\n * Build a node.\n *\n * @template {string} T\n * @template {Props} P\n * @template {Array<Node>} C\n *\n * @overload\n * @param {T} type\n * @returns {{type: T}}\n *\n * @overload\n * @param {T} type\n * @param {P} props\n * @returns {{type: T} & P}\n *\n * @overload\n * @param {T} type\n * @param {string} value\n * @returns {{type: T, value: string}}\n *\n * @overload\n * @param {T} type\n * @param {P} props\n * @param {string} value\n * @returns {{type: T, value: string} & P}\n *\n * @overload\n * @param {T} type\n * @param {C} children\n * @returns {{type: T, children: C}}\n *\n * @overload\n * @param {T} type\n * @param {P} props\n * @param {C} children\n * @returns {{type: T, children: C} & P}\n *\n * @param {string} type\n *   Node type.\n * @param {ChildrenOrValue | Props | null | undefined} [props]\n *   Fields assigned to node (default: `undefined`).\n * @param {ChildrenOrValue | null | undefined} [value]\n *   Children of node or value of `node` (cast to string).\n * @returns {Node}\n *   Built node.\n */\nexport function u(type, props, value) {\n  /** @type {Node} */\n  const node = {type: String(type)}\n\n  if (\n    (value === undefined || value === null) &&\n    (typeof props === 'string' || Array.isArray(props))\n  ) {\n    value = props\n  } else {\n    Object.assign(node, props)\n  }\n\n  if (Array.isArray(value)) {\n    // @ts-expect-error: create a parent.\n    node.children = value\n  } else if (value !== undefined && value !== null) {\n    // @ts-expect-error: create a literal.\n    node.value = String(value)\n  }\n\n  return node\n}\n", "import type { ReplaceFunction } from 'hast-util-find-and-replace';\nimport { findAndReplace } from 'hast-util-find-and-replace';\nimport { u } from 'unist-builder';\nimport emojiRegex from 'emoji-regex';\n\nimport type { Nodes } from 'hast-util-find-and-replace/lib';\n\nexport const emojiMarkdownPlugin = () => {\n  const replace: ReplaceFunction = (match) =>\n    u('element', { properties: {}, tagName: 'emoji' }, [u('text', match)]);\n\n  const transform = (node: Nodes) => findAndReplace(node, [emojiRegex(), replace]);\n\n  return transform;\n};\n", "import { escapeRegExp } from '../regex';\nimport type { ReplaceFunction } from 'hast-util-find-and-replace';\nimport { findAndReplace } from 'hast-util-find-and-replace';\nimport { u } from 'unist-builder';\nimport { visit } from 'unist-util-visit';\n\nimport type { Nodes } from 'hast-util-find-and-replace/lib';\nimport type { Element } from 'hast';\nimport type { UserResponse } from 'stream-chat';\n\nexport const mentionsMarkdownPlugin = (mentioned_users: UserResponse[]) => () => {\n  const mentioned_usernames = mentioned_users\n    .map((user) => user.name || user.id)\n    .filter(Boolean)\n    .map(escapeRegExp);\n\n  const mentionedUsersRegex = new RegExp(\n    mentioned_usernames.map((username) => `@${username}`).join('|'),\n    'g',\n  );\n\n  const replace: ReplaceFunction = (match) => {\n    const usernameOrId = match.replace('@', '');\n    const user = mentioned_users.find(\n      ({ id, name }) => name === usernameOrId || id === usernameOrId,\n    );\n    return u('element', { mentionedUser: user, properties: {}, tagName: 'mention' }, [\n      u('text', match),\n    ]);\n  };\n\n  const transform = (tree: Nodes) => {\n    if (!mentioned_usernames.length) return;\n\n    // handles special cases of mentions where user.name is an e-mail\n    // Remark GFM translates all e-mail-like text nodes to links creating\n    // two separate child nodes \"@\" and \"your.name@as.email\" instead of\n    // keeping it as one text node with value \"@your.name@as.email\"\n    // this piece finds these two separated nodes and merges them together\n    // before \"replace\" function takes over\n    visit(tree, (node, index, parent) => {\n      if (typeof index === 'undefined') return;\n      if (!parent) return;\n\n      const nextChild = parent.children.at(index + 1) as Element;\n      const nextChildHref = nextChild?.properties?.href as string | undefined;\n\n      if (\n        node.type === 'text' &&\n        // text value has to have @ sign at the end of the string\n        // and no other characters except whitespace can precede it\n        // valid cases:   \"text @\", \"@\", \" @\"\n        // invalid cases: \"text@\", \"@text\",\n        /.?\\s?@$|^@$/.test(node.value) &&\n        nextChildHref?.startsWith('mailto:')\n      ) {\n        const newTextValue = node.value.replace(/@$/, '');\n        const username = nextChildHref.replace('mailto:', '');\n        parent.children[index] = u('text', newTextValue);\n        parent.children[index + 1] = u('text', `@${username}`);\n      }\n    });\n\n    findAndReplace(tree, [mentionedUsersRegex, replace]);\n  };\n\n  return transform;\n};\n", "import type { Visitor } from 'unist-util-visit';\nimport { visit } from 'unist-util-visit';\n\nimport type { Nodes } from 'hast-util-find-and-replace/lib';\n\nconst visitor: Visitor = (node) => {\n  if (node.type !== 'html') return;\n\n  node.type = 'text';\n};\nconst transform = (tree: Nodes) => {\n  visit(tree, visitor);\n};\n\nexport const htmlToTextPlugin = () => transform;\n", "import { SKIP, visit, type VisitorResult } from 'unist-util-visit';\nimport type { Image, Link, Parent, Text } from 'mdast';\nimport type { Node } from 'unist';\n\ntype ImgVisitor = (\n  node: Image,\n  index: number | null,\n  parent: Parent | null,\n) => VisitorResult;\n\nexport type ImageToLinkPluginOptions = {\n  getTextLabelFrom?: 'alt' | 'title' | 'url';\n};\n\nconst text = (value: string): Text => ({ type: 'text', value });\n\n/**\n * Converts image Markdown links (![Minion](https://octodex.github.com/images/minion.png))\n * to HTML <a href={url}>{url | title | alt}</a>\n *\n * By default, the anchor text content is the image url so that image preview can be generated / enriched on the server.\n * @param getTextLabelFrom\n */\nexport function imageToLink({ getTextLabelFrom = 'url' }: ImageToLinkPluginOptions = {}) {\n  return (tree: Node) => {\n    const visitor: ImgVisitor = (node, index, parent) => {\n      if (parent == null || index == null) return;\n\n      const label = node[getTextLabelFrom] ?? node.url; // node.alt || node.title || node.url;\n      const link: Link = {\n        children: [text(label)],\n        title: node.title ?? node.alt ?? node.url,\n        type: 'link',\n        url: node.url,\n      };\n\n      parent.children.splice(index, 1, link);\n      return [SKIP, index + 1] as const;\n    };\n\n    visit(tree, 'image', visitor);\n  };\n}\n", "import type { Plugin } from 'unified';\nimport { visit } from 'unist-util-visit';\nimport type { Node, Parent as UnistParent } from 'unist';\nimport type { Root, RootContent, ThematicBreak } from 'mdast';\n\n/** Type guard: does the node have mdast children? */\nfunction isParentWithChildren(\n  node: Node,\n): node is UnistParent & { children: RootContent[] } {\n  const maybe = node as unknown as { children?: unknown };\n  return Array.isArray(maybe.children);\n}\n\n/** Build a single <br> by mapping a standard mdast node via data.hName */\nfunction brNode(): ThematicBreak {\n  return { data: { hName: 'br' }, type: 'thematicBreak' };\n}\n\n/**\n * Inserts runs of <br> between sibling block nodes to preserve the exact\n * number of *blank source lines* between them. No paragraph wrappers are added.\n *\n * Works because `mdast-util-to-hast` respects `data.hName`, turning our\n * `thematicBreak` into `<br>`. Multiple blank lines -> multiple `<br>` siblings.\n */\nexport const keepLineBreaksPlugin: Plugin<[], Root> = () => (tree) => {\n  visit(\n    tree as unknown as UnistParent, // visit needs a Unist parent-like root\n    isParentWithChildren, // limit to parents with children\n    (parent) => {\n      const children = parent.children as RootContent[];\n      if (children.length < 2) return;\n\n      const out: RootContent[] = [];\n\n      for (let i = 0; i < children.length; i++) {\n        const curr = children[i];\n        out.push(curr);\n\n        if (i === children.length - 1) break;\n\n        const next = children[i + 1];\n\n        const currEndLine =\n          curr.position && curr.position.end ? curr.position.end.line : undefined;\n        const nextStartLine =\n          next.position && next.position.start ? next.position.start.line : undefined;\n\n        if (typeof currEndLine !== 'number' || typeof nextStartLine !== 'number') {\n          continue;\n        }\n\n        // Markdown already separates blocks by at least one visual gap.\n        // We add back only the *extra* blank lines from the source.\n        const extraBlankLines = Math.max(0, nextStartLine - currEndLine - 1);\n        if (extraBlankLines > 0) {\n          for (let k = 0; k < extraBlankLines; k++) {\n            out.push(brNode());\n          }\n        }\n      }\n\n      parent.children = out;\n    },\n  );\n};\n", "// remark-plusplus-ins.ts\nimport type { Plugin } from 'unified';\nimport { SKIP, visit } from 'unist-util-visit';\nimport type { Visitor } from 'unist-util-visit';\nimport type { Parent, PhrasingContent, Text } from 'mdast';\n\n/**\n * \\S \u2192 first char must be non-whitespace\n * (?:...)?\u2192 optional middle+closing when length > 1\n * [\\s\\S]*?\u2192 anything (including newlines), lazy\n * final \\S\u2192 last char non-whitespace (only required when there\u2019s more than 1)\n *\n * Matches:\n * ++a++\n * Does not match:\n * ++++\n * ++ ++\n */\nconst INS_REGEX = /\\+\\+(\\S(?:[\\s\\S]*?\\S)?)\\+\\+/g;\nconst IGNORE_NODE_TYPES = new Set([\n  'code',\n  'inlineCode',\n  'link',\n  'linkReference',\n  'definition',\n  'math',\n  'inlineMath',\n]);\n\n/**\n * Converts MD \"++Some text++\" to inserted text element rendered in HTML as <ins>Some text</ins>\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/ins\n */\nexport const plusPlusToEmphasis: Plugin<[]> = () => {\n  const visitor: Visitor = (node, index, parent) => {\n    // 1) Don\u2019t traverse inside ignored nodes\n    if (IGNORE_NODE_TYPES.has(node.type)) return SKIP;\n\n    // 2) Only transform text nodes with a valid parent + index\n    if (node.type !== 'text' || parent == null || typeof index !== 'number') return;\n\n    const value = (node as Text).value;\n\n    // Reset lastIndex to 0 per node so each node is scanned from the beginning\n    INS_REGEX.lastIndex = 0;\n\n    let match: RegExpExecArray | null;\n    let last = 0;\n    const out: PhrasingContent[] = [];\n\n    while ((match = INS_REGEX.exec(value))) {\n      const [full, inner] = match;\n      const start = match.index;\n\n      if (start > last) out.push({ type: 'text', value: value.slice(last, start) });\n\n      // Render as <ins>\u2026</ins> (remark-rehype respects data.hName)\n      out.push({\n        children: [{ type: 'text', value: inner }],\n        data: { hName: 'ins' },\n        type: 'emphasis',\n      });\n\n      last = start + full.length;\n    }\n\n    if (out.length === 0) return; // nothing to change\n    if (last < value.length) out.push({ type: 'text', value: value.slice(last) });\n\n    (parent as Parent).children.splice(index, 1, ...out);\n\n    // Skip re-visiting the replaced range; continue after inserted nodes\n    return [SKIP, index + out.length];\n  };\n\n  return (tree) => visit(tree, visitor);\n};\n", "import type { Plugin } from 'unified';\nimport type { Paragraph, Root, Text } from 'mdast';\n\n/**\n * Replace the parsed Markdown tree with a single paragraph containing the\n * original source as a plain text node. No Markdown formatting is interpreted.\n * React will escape it.\n */\nexport const remarkIgnoreMarkdown: Plugin<[], Root> = () => (tree, file) => {\n  const source = String(file.value ?? '');\n\n  const text: Text = { type: 'text', value: source };\n  const paragraph: Paragraph = { children: [text], type: 'paragraph' };\n\n  tree.children = [paragraph];\n};\n", "import React from 'react';\nimport ReactMarkdown, { defaultUrlTransform } from 'react-markdown';\nimport { find } from 'linkifyjs';\nimport remarkGfm from 'remark-gfm';\nimport type { ComponentType } from 'react';\nimport type { Options } from 'react-markdown/lib';\nimport type { UserResponse } from 'stream-chat';\nimport type { PluggableList } from 'unified'; // A sub-dependency of react-markdown. The type is not declared or re-exported from anywhere else\n\nimport { Anchor, Emoji, Mention } from './componentRenderers';\nimport { detectHttp, matchMarkdownLinks, messageCodeBlocks } from './regex';\nimport { emojiMarkdownPlugin, mentionsMarkdownPlugin } from './rehypePlugins';\nimport {\n  htmlToTextPlugin,\n  imageToLink,\n  keepLineBreaksPlugin,\n  plusPlusToEmphasis,\n} from './remarkPlugins';\nimport { ErrorBoundary } from '../../UtilityComponents';\nimport type { MentionProps } from './componentRenderers';\n\nexport type RenderTextPluginConfigurator = (\n  defaultPlugins: PluggableList,\n) => PluggableList;\n\nexport const defaultAllowedTagNames: Array<\n  keyof JSX.IntrinsicElements | 'emoji' | 'mention'\n> = [\n  'html',\n  'text',\n  'br',\n  'p',\n  'em',\n  'strong',\n  'a',\n  'ol',\n  'ul',\n  'li',\n  'code',\n  'pre',\n  'blockquote',\n  'del',\n  'table',\n  'thead',\n  'tbody',\n  'th',\n  'tr',\n  'td',\n  'tfoot',\n  // custom types (tagNames)\n  'emoji',\n  'mention',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'ins',\n];\n\nfunction formatUrlForDisplay(url: string) {\n  try {\n    return decodeURIComponent(url).replace(detectHttp, '');\n  } catch (e) {\n    return url;\n  }\n}\n\nfunction encodeDecode(url: string) {\n  try {\n    return encodeURI(decodeURIComponent(url));\n  } catch (error) {\n    return url;\n  }\n}\n\nconst urlTransform = (uri: string) =>\n  uri.startsWith('app://') ? uri : defaultUrlTransform(uri);\n\nconst getPluginsForward: RenderTextPluginConfigurator = (plugins: PluggableList) =>\n  plugins;\n\nexport const markDownRenderers: RenderTextOptions['customMarkDownRenderers'] = {\n  a: Anchor,\n  emoji: Emoji,\n  mention: Mention,\n};\n\nexport type RenderTextOptions = {\n  allowedTagNames?: Array<\n    keyof JSX.IntrinsicElements | 'emoji' | 'mention' | (string & {})\n  >;\n  customMarkDownRenderers?: Options['components'] &\n    Partial<{\n      emoji: ComponentType;\n      mention: ComponentType<MentionProps>;\n    }>;\n  getRehypePlugins?: RenderTextPluginConfigurator;\n  getRemarkPlugins?: RenderTextPluginConfigurator;\n};\n\nexport const renderText = (\n  text?: string,\n  mentionedUsers?: UserResponse[],\n  {\n    allowedTagNames = defaultAllowedTagNames,\n    customMarkDownRenderers,\n    getRehypePlugins = getPluginsForward,\n    getRemarkPlugins = getPluginsForward,\n  }: RenderTextOptions = {},\n) => {\n  // take the @ mentions and turn them into markdown?\n  // translate links\n  if (!text) return null;\n  if (text.trim().length === 1) return <>{text}</>;\n\n  let newText = text;\n  const markdownLinks = matchMarkdownLinks(newText);\n  const codeBlocks = messageCodeBlocks(newText);\n\n  // Extract all valid links/emails within text and replace it with proper markup\n  // Revert the link order to avoid getting out of sync of the original start and end positions of links\n  // - due to the addition of new characters when creating Markdown links\n  const links = [...find(newText, 'email'), ...find(newText, 'url')];\n  for (let i = links.length - 1; i >= 0; i--) {\n    const { end, href, start, type, value } = links[i];\n    const linkIsInBlock = codeBlocks.some((block) => block?.includes(value));\n\n    // check if message is already  markdown\n    const noParsingNeeded =\n      markdownLinks &&\n      markdownLinks.filter((text) => {\n        const strippedHref = href?.replace(detectHttp, '');\n        const strippedText = text?.replace(detectHttp, '');\n\n        if (!strippedHref || !strippedText) return false;\n\n        return strippedHref.includes(strippedText) || strippedText.includes(strippedHref);\n      });\n\n    if (noParsingNeeded.length > 0 || linkIsInBlock) continue;\n\n    try {\n      // special case for mentions:\n      // it could happen that a user's name matches with an e-mail format pattern.\n      // in that case, we check whether the found e-mail is actually a mention\n      // by naively checking for an existence of @ sign in front of it.\n      if (type === 'email' && mentionedUsers) {\n        const emailMatchesWithName = mentionedUsers.find((u) => u.name === value);\n        if (emailMatchesWithName) {\n          // FIXME: breaks if the mention symbol is not '@'\n          const isMention = newText.charAt(start - 1) === '@';\n          // in case of mention, we leave the match in its original form,\n          // and we let `mentionsMarkdownPlugin` to do its job\n          newText =\n            newText.slice(0, start) +\n            (isMention ? value : `[${value}](${encodeDecode(href)})`) +\n            newText.slice(end);\n        }\n      } else {\n        const displayLink = type === 'email' ? value : formatUrlForDisplay(href);\n\n        newText =\n          newText.slice(0, start) +\n          `[${displayLink}](${encodeDecode(href)})` +\n          newText.slice(end);\n      }\n    } catch (e) {\n      void e;\n    }\n  }\n\n  const remarkPlugins: PluggableList = [\n    htmlToTextPlugin,\n    keepLineBreaksPlugin,\n    [remarkGfm, { singleTilde: false }],\n    plusPlusToEmphasis,\n    imageToLink,\n  ];\n  const rehypePlugins: PluggableList = [emojiMarkdownPlugin];\n\n  if (mentionedUsers?.length) {\n    rehypePlugins.push(mentionsMarkdownPlugin(mentionedUsers));\n  }\n\n  return (\n    <ErrorBoundary fallback={<>{text}</>}>\n      <ReactMarkdown\n        allowedElements={allowedTagNames}\n        components={{\n          ...markDownRenderers,\n          ...customMarkDownRenderers,\n        }}\n        rehypePlugins={getRehypePlugins(rehypePlugins)}\n        remarkPlugins={getRemarkPlugins(remarkPlugins)}\n        skipHtml\n        unwrapDisallowed\n        urlTransform={urlTransform}\n      >\n        {newText}\n      </ReactMarkdown>\n    </ErrorBoundary>\n  );\n};\n", "/**\n * Count how often a character (or substring) is used in a string.\n *\n * @param {string} value\n *   Value to search in.\n * @param {string} character\n *   Character (or substring) to look for.\n * @return {number}\n *   Number of times `character` occurred in `value`.\n */\nexport function ccount(value, character) {\n  const source = String(value)\n\n  if (typeof character !== 'string') {\n    throw new TypeError('Expected character')\n  }\n\n  let count = 0\n  let index = source.indexOf(character)\n\n  while (index !== -1) {\n    count++\n    index = source.indexOf(character, index + character.length)\n  }\n\n  return count\n}\n", "export default function escapeStringRegexp(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\t// Escape characters with special meaning either inside or outside character sets.\n\t// Use a simple backslash escape when it\u2019s always valid, and a `\\xnn` escape when the simpler form would be disallowed by Unicode patterns\u2019 stricter grammar.\n\treturn string\n\t\t.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n\t\t.replace(/-/g, '\\\\x2d');\n}\n", "/**\n * @import {Nodes, Parents, PhrasingContent, Root, Text} from 'mdast'\n * @import {BuildVisitor, Test, VisitorResult} from 'unist-util-visit-parents'\n */\n\n/**\n * @typedef RegExpMatchObject\n *   Info on the match.\n * @property {number} index\n *   The index of the search at which the result was found.\n * @property {string} input\n *   A copy of the search string in the text node.\n * @property {[...Array<Parents>, Text]} stack\n *   All ancestors of the text node, where the last node is the text itself.\n *\n * @typedef {RegExp | string} Find\n *   Pattern to find.\n *\n *   Strings are escaped and then turned into global expressions.\n *\n * @typedef {Array<FindAndReplaceTuple>} FindAndReplaceList\n *   Several find and replaces, in array form.\n *\n * @typedef {[Find, Replace?]} FindAndReplaceTuple\n *   Find and replace in tuple form.\n *\n * @typedef {ReplaceFunction | string | null | undefined} Replace\n *   Thing to replace with.\n *\n * @callback ReplaceFunction\n *   Callback called when a search matches.\n * @param {...any} parameters\n *   The parameters are the result of corresponding search expression:\n *\n *   * `value` (`string`) \u2014 whole match\n *   * `...capture` (`Array<string>`) \u2014 matches from regex capture groups\n *   * `match` (`RegExpMatchObject`) \u2014 info on the match\n * @returns {Array<PhrasingContent> | PhrasingContent | string | false | null | undefined}\n *   Thing to replace with.\n *\n *   * when `null`, `undefined`, `''`, remove the match\n *   * \u2026or when `false`, do not replace at all\n *   * \u2026or when `string`, replace with a text node of that value\n *   * \u2026or when `Node` or `Array<Node>`, replace with those nodes\n *\n * @typedef {[RegExp, ReplaceFunction]} Pair\n *   Normalized find and replace.\n *\n * @typedef {Array<Pair>} Pairs\n *   All find and replaced.\n *\n * @typedef Options\n *   Configuration.\n * @property {Test | null | undefined} [ignore]\n *   Test for which nodes to ignore (optional).\n */\n\nimport escape from 'escape-string-regexp'\nimport {visitParents} from 'unist-util-visit-parents'\nimport {convert} from 'unist-util-is'\n\n/**\n * Find patterns in a tree and replace them.\n *\n * The algorithm searches the tree in *preorder* for complete values in `Text`\n * nodes.\n * Partial matches are not supported.\n *\n * @param {Nodes} tree\n *   Tree to change.\n * @param {FindAndReplaceList | FindAndReplaceTuple} list\n *   Patterns to find.\n * @param {Options | null | undefined} [options]\n *   Configuration (when `find` is not `Find`).\n * @returns {undefined}\n *   Nothing.\n */\nexport function findAndReplace(tree, list, options) {\n  const settings = options || {}\n  const ignored = convert(settings.ignore || [])\n  const pairs = toPairs(list)\n  let pairIndex = -1\n\n  while (++pairIndex < pairs.length) {\n    visitParents(tree, 'text', visitor)\n  }\n\n  /** @type {BuildVisitor<Root, 'text'>} */\n  function visitor(node, parents) {\n    let index = -1\n    /** @type {Parents | undefined} */\n    let grandparent\n\n    while (++index < parents.length) {\n      const parent = parents[index]\n      /** @type {Array<Nodes> | undefined} */\n      const siblings = grandparent ? grandparent.children : undefined\n\n      if (\n        ignored(\n          parent,\n          siblings ? siblings.indexOf(parent) : undefined,\n          grandparent\n        )\n      ) {\n        return\n      }\n\n      grandparent = parent\n    }\n\n    if (grandparent) {\n      return handler(node, parents)\n    }\n  }\n\n  /**\n   * Handle a text node which is not in an ignored parent.\n   *\n   * @param {Text} node\n   *   Text node.\n   * @param {Array<Parents>} parents\n   *   Parents.\n   * @returns {VisitorResult}\n   *   Result.\n   */\n  function handler(node, parents) {\n    const parent = parents[parents.length - 1]\n    const find = pairs[pairIndex][0]\n    const replace = pairs[pairIndex][1]\n    let start = 0\n    /** @type {Array<Nodes>} */\n    const siblings = parent.children\n    const index = siblings.indexOf(node)\n    let change = false\n    /** @type {Array<PhrasingContent>} */\n    let nodes = []\n\n    find.lastIndex = 0\n\n    let match = find.exec(node.value)\n\n    while (match) {\n      const position = match.index\n      /** @type {RegExpMatchObject} */\n      const matchObject = {\n        index: match.index,\n        input: match.input,\n        stack: [...parents, node]\n      }\n      let value = replace(...match, matchObject)\n\n      if (typeof value === 'string') {\n        value = value.length > 0 ? {type: 'text', value} : undefined\n      }\n\n      // It wasn\u2019t a match after all.\n      if (value === false) {\n        // False acts as if there was no match.\n        // So we need to reset `lastIndex`, which currently being at the end of\n        // the current match, to the beginning.\n        find.lastIndex = position + 1\n      } else {\n        if (start !== position) {\n          nodes.push({\n            type: 'text',\n            value: node.value.slice(start, position)\n          })\n        }\n\n        if (Array.isArray(value)) {\n          nodes.push(...value)\n        } else if (value) {\n          nodes.push(value)\n        }\n\n        start = position + match[0].length\n        change = true\n      }\n\n      if (!find.global) {\n        break\n      }\n\n      match = find.exec(node.value)\n    }\n\n    if (change) {\n      if (start < node.value.length) {\n        nodes.push({type: 'text', value: node.value.slice(start)})\n      }\n\n      parent.children.splice(index, 1, ...nodes)\n    } else {\n      nodes = [node]\n    }\n\n    return index + nodes.length\n  }\n}\n\n/**\n * Turn a tuple or a list of tuples into pairs.\n *\n * @param {FindAndReplaceList | FindAndReplaceTuple} tupleOrList\n *   Schema.\n * @returns {Pairs}\n *   Clean pairs.\n */\nfunction toPairs(tupleOrList) {\n  /** @type {Pairs} */\n  const result = []\n\n  if (!Array.isArray(tupleOrList)) {\n    throw new TypeError('Expected find and replace tuple or list of tuples')\n  }\n\n  /** @type {FindAndReplaceList} */\n  // @ts-expect-error: correct.\n  const list =\n    !tupleOrList[0] || Array.isArray(tupleOrList[0])\n      ? tupleOrList\n      : [tupleOrList]\n\n  let index = -1\n\n  while (++index < list.length) {\n    const tuple = list[index]\n    result.push([toExpression(tuple[0]), toFunction(tuple[1])])\n  }\n\n  return result\n}\n\n/**\n * Turn a find into an expression.\n *\n * @param {Find} find\n *   Find.\n * @returns {RegExp}\n *   Expression.\n */\nfunction toExpression(find) {\n  return typeof find === 'string' ? new RegExp(escape(find), 'g') : find\n}\n\n/**\n * Turn a replace into a function.\n *\n * @param {Replace} replace\n *   Replace.\n * @returns {ReplaceFunction}\n *   Function.\n */\nfunction toFunction(replace) {\n  return typeof replace === 'function'\n    ? replace\n    : function () {\n        return replace\n      }\n}\n", "/**\n * @import {RegExpMatchObject, ReplaceFunction} from 'mdast-util-find-and-replace'\n * @import {CompileContext, Extension as FromMarkdownExtension, Handle as FromMarkdownHandle, Transform as FromMarkdownTransform} from 'mdast-util-from-markdown'\n * @import {ConstructName, Options as ToMarkdownExtension} from 'mdast-util-to-markdown'\n * @import {Link, PhrasingContent} from 'mdast'\n */\n\nimport {ccount} from 'ccount'\nimport {ok as assert} from 'devlop'\nimport {unicodePunctuation, unicodeWhitespace} from 'micromark-util-character'\nimport {findAndReplace} from 'mdast-util-find-and-replace'\n\n/** @type {ConstructName} */\nconst inConstruct = 'phrasing'\n/** @type {Array<ConstructName>} */\nconst notInConstruct = ['autolink', 'link', 'image', 'label']\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM autolink\n * literals in markdown.\n *\n * @returns {FromMarkdownExtension}\n *   Extension for `mdast-util-to-markdown` to enable GFM autolink literals.\n */\nexport function gfmAutolinkLiteralFromMarkdown() {\n  return {\n    transforms: [transformGfmAutolinkLiterals],\n    enter: {\n      literalAutolink: enterLiteralAutolink,\n      literalAutolinkEmail: enterLiteralAutolinkValue,\n      literalAutolinkHttp: enterLiteralAutolinkValue,\n      literalAutolinkWww: enterLiteralAutolinkValue\n    },\n    exit: {\n      literalAutolink: exitLiteralAutolink,\n      literalAutolinkEmail: exitLiteralAutolinkEmail,\n      literalAutolinkHttp: exitLiteralAutolinkHttp,\n      literalAutolinkWww: exitLiteralAutolinkWww\n    }\n  }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM autolink\n * literals in markdown.\n *\n * @returns {ToMarkdownExtension}\n *   Extension for `mdast-util-to-markdown` to enable GFM autolink literals.\n */\nexport function gfmAutolinkLiteralToMarkdown() {\n  return {\n    unsafe: [\n      {\n        character: '@',\n        before: '[+\\\\-.\\\\w]',\n        after: '[\\\\-.\\\\w]',\n        inConstruct,\n        notInConstruct\n      },\n      {\n        character: '.',\n        before: '[Ww]',\n        after: '[\\\\-.\\\\w]',\n        inConstruct,\n        notInConstruct\n      },\n      {\n        character: ':',\n        before: '[ps]',\n        after: '\\\\/',\n        inConstruct,\n        notInConstruct\n      }\n    ]\n  }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterLiteralAutolink(token) {\n  this.enter({type: 'link', title: null, url: '', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterLiteralAutolinkValue(token) {\n  this.config.enter.autolinkProtocol.call(this, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolinkHttp(token) {\n  this.config.exit.autolinkProtocol.call(this, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolinkWww(token) {\n  this.config.exit.data.call(this, token)\n  const node = this.stack[this.stack.length - 1]\n  assert(node.type === 'link')\n  node.url = 'http://' + this.sliceSerialize(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolinkEmail(token) {\n  this.config.exit.autolinkEmail.call(this, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolink(token) {\n  this.exit(token)\n}\n\n/** @type {FromMarkdownTransform} */\nfunction transformGfmAutolinkLiterals(tree) {\n  findAndReplace(\n    tree,\n    [\n      [/(https?:\\/\\/|www(?=\\.))([-.\\w]+)([^ \\t\\r\\n]*)/gi, findUrl],\n      [/(?<=^|\\s|\\p{P}|\\p{S})([-.\\w+]+)@([-\\w]+(?:\\.[-\\w]+)+)/gu, findEmail]\n    ],\n    {ignore: ['link', 'linkReference']}\n  )\n}\n\n/**\n * @type {ReplaceFunction}\n * @param {string} _\n * @param {string} protocol\n * @param {string} domain\n * @param {string} path\n * @param {RegExpMatchObject} match\n * @returns {Array<PhrasingContent> | Link | false}\n */\n// eslint-disable-next-line max-params\nfunction findUrl(_, protocol, domain, path, match) {\n  let prefix = ''\n\n  // Not an expected previous character.\n  if (!previous(match)) {\n    return false\n  }\n\n  // Treat `www` as part of the domain.\n  if (/^w/i.test(protocol)) {\n    domain = protocol + domain\n    protocol = ''\n    prefix = 'http://'\n  }\n\n  if (!isCorrectDomain(domain)) {\n    return false\n  }\n\n  const parts = splitUrl(domain + path)\n\n  if (!parts[0]) return false\n\n  /** @type {Link} */\n  const result = {\n    type: 'link',\n    title: null,\n    url: prefix + protocol + parts[0],\n    children: [{type: 'text', value: protocol + parts[0]}]\n  }\n\n  if (parts[1]) {\n    return [result, {type: 'text', value: parts[1]}]\n  }\n\n  return result\n}\n\n/**\n * @type {ReplaceFunction}\n * @param {string} _\n * @param {string} atext\n * @param {string} label\n * @param {RegExpMatchObject} match\n * @returns {Link | false}\n */\nfunction findEmail(_, atext, label, match) {\n  if (\n    // Not an expected previous character.\n    !previous(match, true) ||\n    // Label ends in not allowed character.\n    /[-\\d_]$/.test(label)\n  ) {\n    return false\n  }\n\n  return {\n    type: 'link',\n    title: null,\n    url: 'mailto:' + atext + '@' + label,\n    children: [{type: 'text', value: atext + '@' + label}]\n  }\n}\n\n/**\n * @param {string} domain\n * @returns {boolean}\n */\nfunction isCorrectDomain(domain) {\n  const parts = domain.split('.')\n\n  if (\n    parts.length < 2 ||\n    (parts[parts.length - 1] &&\n      (/_/.test(parts[parts.length - 1]) ||\n        !/[a-zA-Z\\d]/.test(parts[parts.length - 1]))) ||\n    (parts[parts.length - 2] &&\n      (/_/.test(parts[parts.length - 2]) ||\n        !/[a-zA-Z\\d]/.test(parts[parts.length - 2])))\n  ) {\n    return false\n  }\n\n  return true\n}\n\n/**\n * @param {string} url\n * @returns {[string, string | undefined]}\n */\nfunction splitUrl(url) {\n  const trailExec = /[!\"&'),.:;<>?\\]}]+$/.exec(url)\n\n  if (!trailExec) {\n    return [url, undefined]\n  }\n\n  url = url.slice(0, trailExec.index)\n\n  let trail = trailExec[0]\n  let closingParenIndex = trail.indexOf(')')\n  const openingParens = ccount(url, '(')\n  let closingParens = ccount(url, ')')\n\n  while (closingParenIndex !== -1 && openingParens > closingParens) {\n    url += trail.slice(0, closingParenIndex + 1)\n    trail = trail.slice(closingParenIndex + 1)\n    closingParenIndex = trail.indexOf(')')\n    closingParens++\n  }\n\n  return [url, trail]\n}\n\n/**\n * @param {RegExpMatchObject} match\n * @param {boolean | null | undefined} [email=false]\n * @returns {boolean}\n */\nfunction previous(match, email) {\n  const code = match.input.charCodeAt(match.index - 1)\n\n  return (\n    (match.index === 0 ||\n      unicodeWhitespace(code) ||\n      unicodePunctuation(code)) &&\n    // If it\u2019s an email, the previous character should not be a slash.\n    (!email || code !== 47)\n  )\n}\n", "/**\n * @import {\n *   CompileContext,\n *   Extension as FromMarkdownExtension,\n *   Handle as FromMarkdownHandle\n * } from 'mdast-util-from-markdown'\n * @import {ToMarkdownOptions} from 'mdast-util-gfm-footnote'\n * @import {\n *   Handle as ToMarkdownHandle,\n *   Map,\n *   Options as ToMarkdownExtension\n * } from 'mdast-util-to-markdown'\n * @import {FootnoteDefinition, FootnoteReference} from 'mdast'\n */\n\nimport {ok as assert} from 'devlop'\nimport {normalizeIdentifier} from 'micromark-util-normalize-identifier'\n\nfootnoteReference.peek = footnoteReferencePeek\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCallString() {\n  this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCall(token) {\n  this.enter({type: 'footnoteReference', identifier: '', label: ''}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinitionLabelString() {\n  this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinition(token) {\n  this.enter(\n    {type: 'footnoteDefinition', identifier: '', label: '', children: []},\n    token\n  )\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCallString(token) {\n  const label = this.resume()\n  const node = this.stack[this.stack.length - 1]\n  assert(node.type === 'footnoteReference')\n  node.identifier = normalizeIdentifier(\n    this.sliceSerialize(token)\n  ).toLowerCase()\n  node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCall(token) {\n  this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinitionLabelString(token) {\n  const label = this.resume()\n  const node = this.stack[this.stack.length - 1]\n  assert(node.type === 'footnoteDefinition')\n  node.identifier = normalizeIdentifier(\n    this.sliceSerialize(token)\n  ).toLowerCase()\n  node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinition(token) {\n  this.exit(token)\n}\n\n/** @type {ToMarkdownHandle} */\nfunction footnoteReferencePeek() {\n  return '['\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {FootnoteReference} node\n */\nfunction footnoteReference(node, _, state, info) {\n  const tracker = state.createTracker(info)\n  let value = tracker.move('[^')\n  const exit = state.enter('footnoteReference')\n  const subexit = state.enter('reference')\n  value += tracker.move(\n    state.safe(state.associationId(node), {after: ']', before: value})\n  )\n  subexit()\n  exit()\n  value += tracker.move(']')\n  return value\n}\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @returns {FromMarkdownExtension}\n *   Extension for `mdast-util-from-markdown`.\n */\nexport function gfmFootnoteFromMarkdown() {\n  return {\n    enter: {\n      gfmFootnoteCallString: enterFootnoteCallString,\n      gfmFootnoteCall: enterFootnoteCall,\n      gfmFootnoteDefinitionLabelString: enterFootnoteDefinitionLabelString,\n      gfmFootnoteDefinition: enterFootnoteDefinition\n    },\n    exit: {\n      gfmFootnoteCallString: exitFootnoteCallString,\n      gfmFootnoteCall: exitFootnoteCall,\n      gfmFootnoteDefinitionLabelString: exitFootnoteDefinitionLabelString,\n      gfmFootnoteDefinition: exitFootnoteDefinition\n    }\n  }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @param {ToMarkdownOptions | null | undefined} [options]\n *   Configuration (optional).\n * @returns {ToMarkdownExtension}\n *   Extension for `mdast-util-to-markdown`.\n */\nexport function gfmFootnoteToMarkdown(options) {\n  // To do: next major: change default.\n  let firstLineBlank = false\n\n  if (options && options.firstLineBlank) {\n    firstLineBlank = true\n  }\n\n  return {\n    handlers: {footnoteDefinition, footnoteReference},\n    // This is on by default already.\n    unsafe: [{character: '[', inConstruct: ['label', 'phrasing', 'reference']}]\n  }\n\n  /**\n   * @type {ToMarkdownHandle}\n   * @param {FootnoteDefinition} node\n   */\n  function footnoteDefinition(node, _, state, info) {\n    const tracker = state.createTracker(info)\n    let value = tracker.move('[^')\n    const exit = state.enter('footnoteDefinition')\n    const subexit = state.enter('label')\n    value += tracker.move(\n      state.safe(state.associationId(node), {before: value, after: ']'})\n    )\n    subexit()\n\n    value += tracker.move(']:')\n\n    if (node.children && node.children.length > 0) {\n      tracker.shift(4)\n\n      value += tracker.move(\n        (firstLineBlank ? '\\n' : ' ') +\n          state.indentLines(\n            state.containerFlow(node, tracker.current()),\n            firstLineBlank ? mapAll : mapExceptFirst\n          )\n      )\n    }\n\n    exit()\n\n    return value\n  }\n}\n\n/** @type {Map} */\nfunction mapExceptFirst(line, index, blank) {\n  return index === 0 ? line : mapAll(line, index, blank)\n}\n\n/** @type {Map} */\nfunction mapAll(line, index, blank) {\n  return (blank ? '' : '    ') + line\n}\n", "/**\n * @typedef {import('mdast').Delete} Delete\n *\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n *\n * @typedef {import('mdast-util-to-markdown').ConstructName} ConstructName\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n */\n\n/**\n * List of constructs that occur in phrasing (paragraphs, headings), but cannot\n * contain strikethrough.\n * So they sort of cancel each other out.\n * Note: could use a better name.\n *\n * Note: keep in sync with: <https://github.com/syntax-tree/mdast-util-to-markdown/blob/8ce8dbf/lib/unsafe.js#L14>\n *\n * @type {Array<ConstructName>}\n */\nconst constructsWithoutStrikethrough = [\n  'autolink',\n  'destinationLiteral',\n  'destinationRaw',\n  'reference',\n  'titleQuote',\n  'titleApostrophe'\n]\n\nhandleDelete.peek = peekDelete\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM\n * strikethrough in markdown.\n *\n * @returns {FromMarkdownExtension}\n *   Extension for `mdast-util-from-markdown` to enable GFM strikethrough.\n */\nexport function gfmStrikethroughFromMarkdown() {\n  return {\n    canContainEols: ['delete'],\n    enter: {strikethrough: enterStrikethrough},\n    exit: {strikethrough: exitStrikethrough}\n  }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM\n * strikethrough in markdown.\n *\n * @returns {ToMarkdownExtension}\n *   Extension for `mdast-util-to-markdown` to enable GFM strikethrough.\n */\nexport function gfmStrikethroughToMarkdown() {\n  return {\n    unsafe: [\n      {\n        character: '~',\n        inConstruct: 'phrasing',\n        notInConstruct: constructsWithoutStrikethrough\n      }\n    ],\n    handlers: {delete: handleDelete}\n  }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterStrikethrough(token) {\n  this.enter({type: 'delete', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitStrikethrough(token) {\n  this.exit(token)\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {Delete} node\n */\nfunction handleDelete(node, _, state, info) {\n  const tracker = state.createTracker(info)\n  const exit = state.enter('strikethrough')\n  let value = tracker.move('~~')\n  value += state.containerPhrasing(node, {\n    ...tracker.current(),\n    before: value,\n    after: '~'\n  })\n  value += tracker.move('~~')\n  exit()\n  return value\n}\n\n/** @type {ToMarkdownHandle} */\nfunction peekDelete() {\n  return '~'\n}\n", "/**\n * @typedef Options\n *   Configuration (optional).\n * @property {string|null|Array<string|null|undefined>} [align]\n *   One style for all columns, or styles for their respective columns.\n *   Each style is either `'l'` (left), `'r'` (right), or `'c'` (center).\n *   Other values are treated as `''`, which doesn\u2019t place the colon in the\n *   alignment row but does align left.\n *   *Only the lowercased first character is used, so `Right` is fine.*\n * @property {boolean} [padding=true]\n *   Whether to add a space of padding between delimiters and cells.\n *\n *   When `true`, there is padding:\n *\n *   ```markdown\n *   | Alpha | B     |\n *   | ----- | ----- |\n *   | C     | Delta |\n *   ```\n *\n *   When `false`, there is no padding:\n *\n *   ```markdown\n *   |Alpha|B    |\n *   |-----|-----|\n *   |C    |Delta|\n *   ```\n * @property {boolean} [delimiterStart=true]\n *   Whether to begin each row with the delimiter.\n *\n *   > \uD83D\uDC49 **Note**: please don\u2019t use this: it could create fragile structures\n *   > that aren\u2019t understandable to some markdown parsers.\n *\n *   When `true`, there are starting delimiters:\n *\n *   ```markdown\n *   | Alpha | B     |\n *   | ----- | ----- |\n *   | C     | Delta |\n *   ```\n *\n *   When `false`, there are no starting delimiters:\n *\n *   ```markdown\n *   Alpha | B     |\n *   ----- | ----- |\n *   C     | Delta |\n *   ```\n * @property {boolean} [delimiterEnd=true]\n *   Whether to end each row with the delimiter.\n *\n *   > \uD83D\uDC49 **Note**: please don\u2019t use this: it could create fragile structures\n *   > that aren\u2019t understandable to some markdown parsers.\n *\n *   When `true`, there are ending delimiters:\n *\n *   ```markdown\n *   | Alpha | B     |\n *   | ----- | ----- |\n *   | C     | Delta |\n *   ```\n *\n *   When `false`, there are no ending delimiters:\n *\n *   ```markdown\n *   | Alpha | B\n *   | ----- | -----\n *   | C     | Delta\n *   ```\n * @property {boolean} [alignDelimiters=true]\n *   Whether to align the delimiters.\n *   By default, they are aligned:\n *\n *   ```markdown\n *   | Alpha | B     |\n *   | ----- | ----- |\n *   | C     | Delta |\n *   ```\n *\n *   Pass `false` to make them staggered:\n *\n *   ```markdown\n *   | Alpha | B |\n *   | - | - |\n *   | C | Delta |\n *   ```\n * @property {(value: string) => number} [stringLength]\n *   Function to detect the length of table cell content.\n *   This is used when aligning the delimiters (`|`) between table cells.\n *   Full-width characters and emoji mess up delimiter alignment when viewing\n *   the markdown source.\n *   To fix this, you can pass this function, which receives the cell content\n *   and returns its \u201Cvisible\u201D size.\n *   Note that what is and isn\u2019t visible depends on where the text is displayed.\n *\n *   Without such a function, the following:\n *\n *   ```js\n *   markdownTable([\n *     ['Alpha', 'Bravo'],\n *     ['\u4E2D\u6587', 'Charlie'],\n *     ['\uD83D\uDC69\u200D\u2764\uFE0F\u200D\uD83D\uDC69', 'Delta']\n *   ])\n *   ```\n *\n *   Yields:\n *\n *   ```markdown\n *   | Alpha | Bravo |\n *   | - | - |\n *   | \u4E2D\u6587 | Charlie |\n *   | \uD83D\uDC69\u200D\u2764\uFE0F\u200D\uD83D\uDC69 | Delta |\n *   ```\n *\n *   With [`string-width`](https://github.com/sindresorhus/string-width):\n *\n *   ```js\n *   import stringWidth from 'string-width'\n *\n *   markdownTable(\n *     [\n *       ['Alpha', 'Bravo'],\n *       ['\u4E2D\u6587', 'Charlie'],\n *       ['\uD83D\uDC69\u200D\u2764\uFE0F\u200D\uD83D\uDC69', 'Delta']\n *     ],\n *     {stringLength: stringWidth}\n *   )\n *   ```\n *\n *   Yields:\n *\n *   ```markdown\n *   | Alpha | Bravo   |\n *   | ----- | ------- |\n *   | \u4E2D\u6587  | Charlie |\n *   | \uD83D\uDC69\u200D\u2764\uFE0F\u200D\uD83D\uDC69    | Delta   |\n *   ```\n */\n\n/**\n * @typedef {Options} MarkdownTableOptions\n * @todo\n *   Remove next major.\n */\n\n/**\n * Generate a markdown ([GFM](https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting/organizing-information-with-tables)) table..\n *\n * @param {Array<Array<string|null|undefined>>} table\n *   Table data (matrix of strings).\n * @param {Options} [options]\n *   Configuration (optional).\n * @returns {string}\n */\nexport function markdownTable(table, options = {}) {\n  const align = (options.align || []).concat()\n  const stringLength = options.stringLength || defaultStringLength\n  /** @type {Array<number>} Character codes as symbols for alignment per column. */\n  const alignments = []\n  /** @type {Array<Array<string>>} Cells per row. */\n  const cellMatrix = []\n  /** @type {Array<Array<number>>} Sizes of each cell per row. */\n  const sizeMatrix = []\n  /** @type {Array<number>} */\n  const longestCellByColumn = []\n  let mostCellsPerRow = 0\n  let rowIndex = -1\n\n  // This is a superfluous loop if we don\u2019t align delimiters, but otherwise we\u2019d\n  // do superfluous work when aligning, so optimize for aligning.\n  while (++rowIndex < table.length) {\n    /** @type {Array<string>} */\n    const row = []\n    /** @type {Array<number>} */\n    const sizes = []\n    let columnIndex = -1\n\n    if (table[rowIndex].length > mostCellsPerRow) {\n      mostCellsPerRow = table[rowIndex].length\n    }\n\n    while (++columnIndex < table[rowIndex].length) {\n      const cell = serialize(table[rowIndex][columnIndex])\n\n      if (options.alignDelimiters !== false) {\n        const size = stringLength(cell)\n        sizes[columnIndex] = size\n\n        if (\n          longestCellByColumn[columnIndex] === undefined ||\n          size > longestCellByColumn[columnIndex]\n        ) {\n          longestCellByColumn[columnIndex] = size\n        }\n      }\n\n      row.push(cell)\n    }\n\n    cellMatrix[rowIndex] = row\n    sizeMatrix[rowIndex] = sizes\n  }\n\n  // Figure out which alignments to use.\n  let columnIndex = -1\n\n  if (typeof align === 'object' && 'length' in align) {\n    while (++columnIndex < mostCellsPerRow) {\n      alignments[columnIndex] = toAlignment(align[columnIndex])\n    }\n  } else {\n    const code = toAlignment(align)\n\n    while (++columnIndex < mostCellsPerRow) {\n      alignments[columnIndex] = code\n    }\n  }\n\n  // Inject the alignment row.\n  columnIndex = -1\n  /** @type {Array<string>} */\n  const row = []\n  /** @type {Array<number>} */\n  const sizes = []\n\n  while (++columnIndex < mostCellsPerRow) {\n    const code = alignments[columnIndex]\n    let before = ''\n    let after = ''\n\n    if (code === 99 /* `c` */) {\n      before = ':'\n      after = ':'\n    } else if (code === 108 /* `l` */) {\n      before = ':'\n    } else if (code === 114 /* `r` */) {\n      after = ':'\n    }\n\n    // There *must* be at least one hyphen-minus in each alignment cell.\n    let size =\n      options.alignDelimiters === false\n        ? 1\n        : Math.max(\n            1,\n            longestCellByColumn[columnIndex] - before.length - after.length\n          )\n\n    const cell = before + '-'.repeat(size) + after\n\n    if (options.alignDelimiters !== false) {\n      size = before.length + size + after.length\n\n      if (size > longestCellByColumn[columnIndex]) {\n        longestCellByColumn[columnIndex] = size\n      }\n\n      sizes[columnIndex] = size\n    }\n\n    row[columnIndex] = cell\n  }\n\n  // Inject the alignment row.\n  cellMatrix.splice(1, 0, row)\n  sizeMatrix.splice(1, 0, sizes)\n\n  rowIndex = -1\n  /** @type {Array<string>} */\n  const lines = []\n\n  while (++rowIndex < cellMatrix.length) {\n    const row = cellMatrix[rowIndex]\n    const sizes = sizeMatrix[rowIndex]\n    columnIndex = -1\n    /** @type {Array<string>} */\n    const line = []\n\n    while (++columnIndex < mostCellsPerRow) {\n      const cell = row[columnIndex] || ''\n      let before = ''\n      let after = ''\n\n      if (options.alignDelimiters !== false) {\n        const size =\n          longestCellByColumn[columnIndex] - (sizes[columnIndex] || 0)\n        const code = alignments[columnIndex]\n\n        if (code === 114 /* `r` */) {\n          before = ' '.repeat(size)\n        } else if (code === 99 /* `c` */) {\n          if (size % 2) {\n            before = ' '.repeat(size / 2 + 0.5)\n            after = ' '.repeat(size / 2 - 0.5)\n          } else {\n            before = ' '.repeat(size / 2)\n            after = before\n          }\n        } else {\n          after = ' '.repeat(size)\n        }\n      }\n\n      if (options.delimiterStart !== false && !columnIndex) {\n        line.push('|')\n      }\n\n      if (\n        options.padding !== false &&\n        // Don\u2019t add the opening space if we\u2019re not aligning and the cell is\n        // empty: there will be a closing space.\n        !(options.alignDelimiters === false && cell === '') &&\n        (options.delimiterStart !== false || columnIndex)\n      ) {\n        line.push(' ')\n      }\n\n      if (options.alignDelimiters !== false) {\n        line.push(before)\n      }\n\n      line.push(cell)\n\n      if (options.alignDelimiters !== false) {\n        line.push(after)\n      }\n\n      if (options.padding !== false) {\n        line.push(' ')\n      }\n\n      if (\n        options.delimiterEnd !== false ||\n        columnIndex !== mostCellsPerRow - 1\n      ) {\n        line.push('|')\n      }\n    }\n\n    lines.push(\n      options.delimiterEnd === false\n        ? line.join('').replace(/ +$/, '')\n        : line.join('')\n    )\n  }\n\n  return lines.join('\\n')\n}\n\n/**\n * @param {string|null|undefined} [value]\n * @returns {string}\n */\nfunction serialize(value) {\n  return value === null || value === undefined ? '' : String(value)\n}\n\n/**\n * @param {string} value\n * @returns {number}\n */\nfunction defaultStringLength(value) {\n  return value.length\n}\n\n/**\n * @param {string|null|undefined} value\n * @returns {number}\n */\nfunction toAlignment(value) {\n  const code = typeof value === 'string' ? value.codePointAt(0) : 0\n\n  return code === 67 /* `C` */ || code === 99 /* `c` */\n    ? 99 /* `c` */\n    : code === 76 /* `L` */ || code === 108 /* `l` */\n    ? 108 /* `l` */\n    : code === 82 /* `R` */ || code === 114 /* `r` */\n    ? 114 /* `r` */\n    : 0\n}\n", "/**\n * @import {Blockquote, Parents} from 'mdast'\n * @import {Info, Map, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {Blockquote} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function blockquote(node, _, state, info) {\n  const exit = state.enter('blockquote')\n  const tracker = state.createTracker(info)\n  tracker.move('> ')\n  tracker.shift(2)\n  const value = state.indentLines(\n    state.containerFlow(node, tracker.current()),\n    map\n  )\n  exit()\n  return value\n}\n\n/** @type {Map} */\nfunction map(line, _, blank) {\n  return '>' + (blank ? '' : ' ') + line\n}\n", "/**\n * @import {ConstructName, Unsafe} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {Array<ConstructName>} stack\n * @param {Unsafe} pattern\n * @returns {boolean}\n */\nexport function patternInScope(stack, pattern) {\n  return (\n    listInScope(stack, pattern.inConstruct, true) &&\n    !listInScope(stack, pattern.notInConstruct, false)\n  )\n}\n\n/**\n * @param {Array<ConstructName>} stack\n * @param {Unsafe['inConstruct']} list\n * @param {boolean} none\n * @returns {boolean}\n */\nfunction listInScope(stack, list, none) {\n  if (typeof list === 'string') {\n    list = [list]\n  }\n\n  if (!list || list.length === 0) {\n    return none\n  }\n\n  let index = -1\n\n  while (++index < list.length) {\n    if (stack.includes(list[index])) {\n      return true\n    }\n  }\n\n  return false\n}\n", "/**\n * @import {Break, Parents} from 'mdast'\n * @import {Info, State} from 'mdast-util-to-markdown'\n */\n\nimport {patternInScope} from '../util/pattern-in-scope.js'\n\n/**\n * @param {Break} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function hardBreak(_, _1, state, info) {\n  let index = -1\n\n  while (++index < state.unsafe.length) {\n    // If we can\u2019t put eols in this construct (setext headings, tables), use a\n    // space instead.\n    if (\n      state.unsafe[index].character === '\\n' &&\n      patternInScope(state.stack, state.unsafe[index])\n    ) {\n      return /[ \\t]/.test(info.before) ? '' : ' '\n    }\n  }\n\n  return '\\\\\\n'\n}\n", "/**\n * Get the count of the longest repeating streak of `character` in `value`.\n *\n * @param {string} value\n *   Content to search in.\n * @param {string} character\n *   Single character to look for.\n * @returns {number}\n *   Count of most frequent adjacent `character`s in `value`.\n */\nexport function longestStreak(value, character) {\n  const source = String(value)\n  let index = source.indexOf(character)\n  let expected = index\n  let count = 0\n  let max = 0\n\n  if (typeof character !== 'string' || character.length !== 1) {\n    throw new Error('Expected character')\n  }\n\n  while (index !== -1) {\n    if (index === expected) {\n      if (++count > max) {\n        max = count\n      }\n    } else {\n      count = 1\n    }\n\n    expected = index + 1\n    index = source.indexOf(character, expected)\n  }\n\n  return max\n}\n", "/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Code} from 'mdast'\n */\n\n/**\n * @param {Code} node\n * @param {State} state\n * @returns {boolean}\n */\nexport function formatCodeAsIndented(node, state) {\n  return Boolean(\n    state.options.fences === false &&\n      node.value &&\n      // If there\u2019s no info\u2026\n      !node.lang &&\n      // And there\u2019s a non-whitespace character\u2026\n      /[^ \\r\\n]/.test(node.value) &&\n      // And the value doesn\u2019t start or end in a blank\u2026\n      !/^[\\t ]*(?:[\\r\\n]|$)|(?:^|[\\r\\n])[\\t ]*$/.test(node.value)\n  )\n}\n", "/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['fence'], null | undefined>}\n */\nexport function checkFence(state) {\n  const marker = state.options.fence || '`'\n\n  if (marker !== '`' && marker !== '~') {\n    throw new Error(\n      'Cannot serialize code with `' +\n        marker +\n        '` for `options.fence`, expected `` ` `` or `~`'\n    )\n  }\n\n  return marker\n}\n", "/**\n * @import {Info, Map, State} from 'mdast-util-to-markdown'\n * @import {Code, Parents} from 'mdast'\n */\n\nimport {longestStreak} from 'longest-streak'\nimport {formatCodeAsIndented} from '../util/format-code-as-indented.js'\nimport {checkFence} from '../util/check-fence.js'\n\n/**\n * @param {Code} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function code(node, _, state, info) {\n  const marker = checkFence(state)\n  const raw = node.value || ''\n  const suffix = marker === '`' ? 'GraveAccent' : 'Tilde'\n\n  if (formatCodeAsIndented(node, state)) {\n    const exit = state.enter('codeIndented')\n    const value = state.indentLines(raw, map)\n    exit()\n    return value\n  }\n\n  const tracker = state.createTracker(info)\n  const sequence = marker.repeat(Math.max(longestStreak(raw, marker) + 1, 3))\n  const exit = state.enter('codeFenced')\n  let value = tracker.move(sequence)\n\n  if (node.lang) {\n    const subexit = state.enter(`codeFencedLang${suffix}`)\n    value += tracker.move(\n      state.safe(node.lang, {\n        before: value,\n        after: ' ',\n        encode: ['`'],\n        ...tracker.current()\n      })\n    )\n    subexit()\n  }\n\n  if (node.lang && node.meta) {\n    const subexit = state.enter(`codeFencedMeta${suffix}`)\n    value += tracker.move(' ')\n    value += tracker.move(\n      state.safe(node.meta, {\n        before: value,\n        after: '\\n',\n        encode: ['`'],\n        ...tracker.current()\n      })\n    )\n    subexit()\n  }\n\n  value += tracker.move('\\n')\n\n  if (raw) {\n    value += tracker.move(raw + '\\n')\n  }\n\n  value += tracker.move(sequence)\n  exit()\n  return value\n}\n\n/** @type {Map} */\nfunction map(line, _, blank) {\n  return (blank ? '' : '    ') + line\n}\n", "/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['quote'], null | undefined>}\n */\nexport function checkQuote(state) {\n  const marker = state.options.quote || '\"'\n\n  if (marker !== '\"' && marker !== \"'\") {\n    throw new Error(\n      'Cannot serialize title with `' +\n        marker +\n        '` for `options.quote`, expected `\"`, or `\\'`'\n    )\n  }\n\n  return marker\n}\n", "/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Definition, Parents} from 'mdast'\n */\n\nimport {checkQuote} from '../util/check-quote.js'\n\n/**\n * @param {Definition} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function definition(node, _, state, info) {\n  const quote = checkQuote(state)\n  const suffix = quote === '\"' ? 'Quote' : 'Apostrophe'\n  const exit = state.enter('definition')\n  let subexit = state.enter('label')\n  const tracker = state.createTracker(info)\n  let value = tracker.move('[')\n  value += tracker.move(\n    state.safe(state.associationId(node), {\n      before: value,\n      after: ']',\n      ...tracker.current()\n    })\n  )\n  value += tracker.move(']: ')\n\n  subexit()\n\n  if (\n    // If there\u2019s no url, or\u2026\n    !node.url ||\n    // If there are control characters or whitespace.\n    /[\\0- \\u007F]/.test(node.url)\n  ) {\n    subexit = state.enter('destinationLiteral')\n    value += tracker.move('<')\n    value += tracker.move(\n      state.safe(node.url, {before: value, after: '>', ...tracker.current()})\n    )\n    value += tracker.move('>')\n  } else {\n    // No whitespace, raw is prettier.\n    subexit = state.enter('destinationRaw')\n    value += tracker.move(\n      state.safe(node.url, {\n        before: value,\n        after: node.title ? ' ' : '\\n',\n        ...tracker.current()\n      })\n    )\n  }\n\n  subexit()\n\n  if (node.title) {\n    subexit = state.enter(`title${suffix}`)\n    value += tracker.move(' ' + quote)\n    value += tracker.move(\n      state.safe(node.title, {\n        before: value,\n        after: quote,\n        ...tracker.current()\n      })\n    )\n    value += tracker.move(quote)\n    subexit()\n  }\n\n  exit()\n\n  return value\n}\n", "/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['emphasis'], null | undefined>}\n */\nexport function checkEmphasis(state) {\n  const marker = state.options.emphasis || '*'\n\n  if (marker !== '*' && marker !== '_') {\n    throw new Error(\n      'Cannot serialize emphasis with `' +\n        marker +\n        '` for `options.emphasis`, expected `*`, or `_`'\n    )\n  }\n\n  return marker\n}\n", "/**\n * Encode a code point as a character reference.\n *\n * @param {number} code\n *   Code point to encode.\n * @returns {string}\n *   Encoded character reference.\n */\nexport function encodeCharacterReference(code) {\n  return '&#x' + code.toString(16).toUpperCase() + ';'\n}\n", "/**\n * @import {EncodeSides} from '../types.js'\n */\n\nimport {classifyCharacter} from 'micromark-util-classify-character'\n\n/**\n * Check whether to encode (as a character reference) the characters\n * surrounding an attention run.\n *\n * Which characters are around an attention run influence whether it works or\n * not.\n *\n * See <https://github.com/orgs/syntax-tree/discussions/60> for more info.\n * See this markdown in a particular renderer to see what works:\n *\n * ```markdown\n * |                         | A (letter inside) | B (punctuation inside) | C (whitespace inside) | D (nothing inside) |\n * | ----------------------- | ----------------- | ---------------------- | --------------------- | ------------------ |\n * | 1 (letter outside)      | x*y*z             | x*.*z                  | x* *z                 | x**z               |\n * | 2 (punctuation outside) | .*y*.             | .*.*.                  | .* *.                 | .**.               |\n * | 3 (whitespace outside)  | x *y* z           | x *.* z                | x * * z               | x ** z             |\n * | 4 (nothing outside)     | *x*               | *.*                    | * *                   | **                 |\n * ```\n *\n * @param {number} outside\n *   Code point on the outer side of the run.\n * @param {number} inside\n *   Code point on the inner side of the run.\n * @param {'*' | '_'} marker\n *   Marker of the run.\n *   Underscores are handled more strictly (they form less often) than\n *   asterisks.\n * @returns {EncodeSides}\n *   Whether to encode characters.\n */\n// Important: punctuation must never be encoded.\n// Punctuation is solely used by markdown constructs.\n// And by encoding itself.\n// Encoding them will break constructs or double encode things.\nexport function encodeInfo(outside, inside, marker) {\n  const outsideKind = classifyCharacter(outside)\n  const insideKind = classifyCharacter(inside)\n\n  // Letter outside:\n  if (outsideKind === undefined) {\n    return insideKind === undefined\n      ? // Letter inside:\n        // we have to encode *both* letters for `_` as it is looser.\n        // it already forms for `*` (and GFMs `~`).\n        marker === '_'\n        ? {inside: true, outside: true}\n        : {inside: false, outside: false}\n      : insideKind === 1\n        ? // Whitespace inside: encode both (letter, whitespace).\n          {inside: true, outside: true}\n        : // Punctuation inside: encode outer (letter)\n          {inside: false, outside: true}\n  }\n\n  // Whitespace outside:\n  if (outsideKind === 1) {\n    return insideKind === undefined\n      ? // Letter inside: already forms.\n        {inside: false, outside: false}\n      : insideKind === 1\n        ? // Whitespace inside: encode both (whitespace).\n          {inside: true, outside: true}\n        : // Punctuation inside: already forms.\n          {inside: false, outside: false}\n  }\n\n  // Punctuation outside:\n  return insideKind === undefined\n    ? // Letter inside: already forms.\n      {inside: false, outside: false}\n    : insideKind === 1\n      ? // Whitespace inside: encode inner (whitespace).\n        {inside: true, outside: false}\n      : // Punctuation inside: already forms.\n        {inside: false, outside: false}\n}\n", "/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Emphasis, Parents} from 'mdast'\n */\n\nimport {checkEmphasis} from '../util/check-emphasis.js'\nimport {encodeCharacterReference} from '../util/encode-character-reference.js'\nimport {encodeInfo} from '../util/encode-info.js'\n\nemphasis.peek = emphasisPeek\n\n/**\n * @param {Emphasis} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function emphasis(node, _, state, info) {\n  const marker = checkEmphasis(state)\n  const exit = state.enter('emphasis')\n  const tracker = state.createTracker(info)\n  const before = tracker.move(marker)\n\n  let between = tracker.move(\n    state.containerPhrasing(node, {\n      after: marker,\n      before,\n      ...tracker.current()\n    })\n  )\n  const betweenHead = between.charCodeAt(0)\n  const open = encodeInfo(\n    info.before.charCodeAt(info.before.length - 1),\n    betweenHead,\n    marker\n  )\n\n  if (open.inside) {\n    between = encodeCharacterReference(betweenHead) + between.slice(1)\n  }\n\n  const betweenTail = between.charCodeAt(between.length - 1)\n  const close = encodeInfo(info.after.charCodeAt(0), betweenTail, marker)\n\n  if (close.inside) {\n    between = between.slice(0, -1) + encodeCharacterReference(betweenTail)\n  }\n\n  const after = tracker.move(marker)\n\n  exit()\n\n  state.attentionEncodeSurroundingInfo = {\n    after: close.outside,\n    before: open.outside\n  }\n  return before + between + after\n}\n\n/**\n * @param {Emphasis} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @returns {string}\n */\nfunction emphasisPeek(_, _1, state) {\n  return state.options.emphasis || '*'\n}\n", "/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Heading} from 'mdast'\n */\n\nimport {EXIT, visit} from 'unist-util-visit'\nimport {toString} from 'mdast-util-to-string'\n\n/**\n * @param {Heading} node\n * @param {State} state\n * @returns {boolean}\n */\nexport function formatHeadingAsSetext(node, state) {\n  let literalWithBreak = false\n\n  // Look for literals with a line break.\n  // Note that this also\n  visit(node, function (node) {\n    if (\n      ('value' in node && /\\r?\\n|\\r/.test(node.value)) ||\n      node.type === 'break'\n    ) {\n      literalWithBreak = true\n      return EXIT\n    }\n  })\n\n  return Boolean(\n    (!node.depth || node.depth < 3) &&\n      toString(node) &&\n      (state.options.setext || literalWithBreak)\n  )\n}\n", "/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Heading, Parents} from 'mdast'\n */\n\nimport {encodeCharacterReference} from '../util/encode-character-reference.js'\nimport {formatHeadingAsSetext} from '../util/format-heading-as-setext.js'\n\n/**\n * @param {Heading} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function heading(node, _, state, info) {\n  const rank = Math.max(Math.min(6, node.depth || 1), 1)\n  const tracker = state.createTracker(info)\n\n  if (formatHeadingAsSetext(node, state)) {\n    const exit = state.enter('headingSetext')\n    const subexit = state.enter('phrasing')\n    const value = state.containerPhrasing(node, {\n      ...tracker.current(),\n      before: '\\n',\n      after: '\\n'\n    })\n    subexit()\n    exit()\n\n    return (\n      value +\n      '\\n' +\n      (rank === 1 ? '=' : '-').repeat(\n        // The whole size\u2026\n        value.length -\n          // Minus the position of the character after the last EOL (or\n          // 0 if there is none)\u2026\n          (Math.max(value.lastIndexOf('\\r'), value.lastIndexOf('\\n')) + 1)\n      )\n    )\n  }\n\n  const sequence = '#'.repeat(rank)\n  const exit = state.enter('headingAtx')\n  const subexit = state.enter('phrasing')\n\n  // Note: for proper tracking, we should reset the output positions when there\n  // is no content returned, because then the space is not output.\n  // Practically, in that case, there is no content, so it doesn\u2019t matter that\n  // we\u2019ve tracked one too many characters.\n  tracker.move(sequence + ' ')\n\n  let value = state.containerPhrasing(node, {\n    before: '# ',\n    after: '\\n',\n    ...tracker.current()\n  })\n\n  if (/^[\\t ]/.test(value)) {\n    // To do: what effect has the character reference on tracking?\n    value = encodeCharacterReference(value.charCodeAt(0)) + value.slice(1)\n  }\n\n  value = value ? sequence + ' ' + value : sequence\n\n  if (state.options.closeAtx) {\n    value += ' ' + sequence\n  }\n\n  subexit()\n  exit()\n\n  return value\n}\n", "/**\n * @import {Html} from 'mdast'\n */\n\nhtml.peek = htmlPeek\n\n/**\n * @param {Html} node\n * @returns {string}\n */\nexport function html(node) {\n  return node.value || ''\n}\n\n/**\n * @returns {string}\n */\nfunction htmlPeek() {\n  return '<'\n}\n", "/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Image, Parents} from 'mdast'\n */\n\nimport {checkQuote} from '../util/check-quote.js'\n\nimage.peek = imagePeek\n\n/**\n * @param {Image} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function image(node, _, state, info) {\n  const quote = checkQuote(state)\n  const suffix = quote === '\"' ? 'Quote' : 'Apostrophe'\n  const exit = state.enter('image')\n  let subexit = state.enter('label')\n  const tracker = state.createTracker(info)\n  let value = tracker.move('![')\n  value += tracker.move(\n    state.safe(node.alt, {before: value, after: ']', ...tracker.current()})\n  )\n  value += tracker.move('](')\n\n  subexit()\n\n  if (\n    // If there\u2019s no url but there is a title\u2026\n    (!node.url && node.title) ||\n    // If there are control characters or whitespace.\n    /[\\0- \\u007F]/.test(node.url)\n  ) {\n    subexit = state.enter('destinationLiteral')\n    value += tracker.move('<')\n    value += tracker.move(\n      state.safe(node.url, {before: value, after: '>', ...tracker.current()})\n    )\n    value += tracker.move('>')\n  } else {\n    // No whitespace, raw is prettier.\n    subexit = state.enter('destinationRaw')\n    value += tracker.move(\n      state.safe(node.url, {\n        before: value,\n        after: node.title ? ' ' : ')',\n        ...tracker.current()\n      })\n    )\n  }\n\n  subexit()\n\n  if (node.title) {\n    subexit = state.enter(`title${suffix}`)\n    value += tracker.move(' ' + quote)\n    value += tracker.move(\n      state.safe(node.title, {\n        before: value,\n        after: quote,\n        ...tracker.current()\n      })\n    )\n    value += tracker.move(quote)\n    subexit()\n  }\n\n  value += tracker.move(')')\n  exit()\n\n  return value\n}\n\n/**\n * @returns {string}\n */\nfunction imagePeek() {\n  return '!'\n}\n", "/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {ImageReference, Parents} from 'mdast'\n */\n\nimageReference.peek = imageReferencePeek\n\n/**\n * @param {ImageReference} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function imageReference(node, _, state, info) {\n  const type = node.referenceType\n  const exit = state.enter('imageReference')\n  let subexit = state.enter('label')\n  const tracker = state.createTracker(info)\n  let value = tracker.move('![')\n  const alt = state.safe(node.alt, {\n    before: value,\n    after: ']',\n    ...tracker.current()\n  })\n  value += tracker.move(alt + '][')\n\n  subexit()\n  // Hide the fact that we\u2019re in phrasing, because escapes don\u2019t work.\n  const stack = state.stack\n  state.stack = []\n  subexit = state.enter('reference')\n  // Note: for proper tracking, we should reset the output positions when we end\n  // up making a `shortcut` reference, because then there is no brace output.\n  // Practically, in that case, there is no content, so it doesn\u2019t matter that\n  // we\u2019ve tracked one too many characters.\n  const reference = state.safe(state.associationId(node), {\n    before: value,\n    after: ']',\n    ...tracker.current()\n  })\n  subexit()\n  state.stack = stack\n  exit()\n\n  if (type === 'full' || !alt || alt !== reference) {\n    value += tracker.move(reference + ']')\n  } else if (type === 'shortcut') {\n    // Remove the unwanted `[`.\n    value = value.slice(0, -1)\n  } else {\n    value += tracker.move(']')\n  }\n\n  return value\n}\n\n/**\n * @returns {string}\n */\nfunction imageReferencePeek() {\n  return '!'\n}\n", "/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {InlineCode, Parents} from 'mdast'\n */\n\ninlineCode.peek = inlineCodePeek\n\n/**\n * @param {InlineCode} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @returns {string}\n */\nexport function inlineCode(node, _, state) {\n  let value = node.value || ''\n  let sequence = '`'\n  let index = -1\n\n  // If there is a single grave accent on its own in the code, use a fence of\n  // two.\n  // If there are two in a row, use one.\n  while (new RegExp('(^|[^`])' + sequence + '([^`]|$)').test(value)) {\n    sequence += '`'\n  }\n\n  // If this is not just spaces or eols (tabs don\u2019t count), and either the\n  // first or last character are a space, eol, or tick, then pad with spaces.\n  if (\n    /[^ \\r\\n]/.test(value) &&\n    ((/^[ \\r\\n]/.test(value) && /[ \\r\\n]$/.test(value)) || /^`|`$/.test(value))\n  ) {\n    value = ' ' + value + ' '\n  }\n\n  // We have a potential problem: certain characters after eols could result in\n  // blocks being seen.\n  // For example, if someone injected the string `'\\n# b'`, then that would\n  // result in an ATX heading.\n  // We can\u2019t escape characters in `inlineCode`, but because eols are\n  // transformed to spaces when going from markdown to HTML anyway, we can swap\n  // them out.\n  while (++index < state.unsafe.length) {\n    const pattern = state.unsafe[index]\n    const expression = state.compilePattern(pattern)\n    /** @type {RegExpExecArray | null} */\n    let match\n\n    // Only look for `atBreak`s.\n    // Btw: note that `atBreak` patterns will always start the regex at LF or\n    // CR.\n    if (!pattern.atBreak) continue\n\n    while ((match = expression.exec(value))) {\n      let position = match.index\n\n      // Support CRLF (patterns only look for one of the characters).\n      if (\n        value.charCodeAt(position) === 10 /* `\\n` */ &&\n        value.charCodeAt(position - 1) === 13 /* `\\r` */\n      ) {\n        position--\n      }\n\n      value = value.slice(0, position) + ' ' + value.slice(match.index + 1)\n    }\n  }\n\n  return sequence + value + sequence\n}\n\n/**\n * @returns {string}\n */\nfunction inlineCodePeek() {\n  return '`'\n}\n", "/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Link} from 'mdast'\n */\n\nimport {toString} from 'mdast-util-to-string'\n\n/**\n * @param {Link} node\n * @param {State} state\n * @returns {boolean}\n */\nexport function formatLinkAsAutolink(node, state) {\n  const raw = toString(node)\n\n  return Boolean(\n    !state.options.resourceLink &&\n      // If there\u2019s a url\u2026\n      node.url &&\n      // And there\u2019s a no title\u2026\n      !node.title &&\n      // And the content of `node` is a single text node\u2026\n      node.children &&\n      node.children.length === 1 &&\n      node.children[0].type === 'text' &&\n      // And if the url is the same as the content\u2026\n      (raw === node.url || 'mailto:' + raw === node.url) &&\n      // And that starts w/ a protocol\u2026\n      /^[a-z][a-z+.-]+:/i.test(node.url) &&\n      // And that doesn\u2019t contain ASCII control codes (character escapes and\n      // references don\u2019t work), space, or angle brackets\u2026\n      !/[\\0- <>\\u007F]/.test(node.url)\n  )\n}\n", "/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Link, Parents} from 'mdast'\n * @import {Exit} from '../types.js'\n */\n\nimport {checkQuote} from '../util/check-quote.js'\nimport {formatLinkAsAutolink} from '../util/format-link-as-autolink.js'\n\nlink.peek = linkPeek\n\n/**\n * @param {Link} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function link(node, _, state, info) {\n  const quote = checkQuote(state)\n  const suffix = quote === '\"' ? 'Quote' : 'Apostrophe'\n  const tracker = state.createTracker(info)\n  /** @type {Exit} */\n  let exit\n  /** @type {Exit} */\n  let subexit\n\n  if (formatLinkAsAutolink(node, state)) {\n    // Hide the fact that we\u2019re in phrasing, because escapes don\u2019t work.\n    const stack = state.stack\n    state.stack = []\n    exit = state.enter('autolink')\n    let value = tracker.move('<')\n    value += tracker.move(\n      state.containerPhrasing(node, {\n        before: value,\n        after: '>',\n        ...tracker.current()\n      })\n    )\n    value += tracker.move('>')\n    exit()\n    state.stack = stack\n    return value\n  }\n\n  exit = state.enter('link')\n  subexit = state.enter('label')\n  let value = tracker.move('[')\n  value += tracker.move(\n    state.containerPhrasing(node, {\n      before: value,\n      after: '](',\n      ...tracker.current()\n    })\n  )\n  value += tracker.move('](')\n  subexit()\n\n  if (\n    // If there\u2019s no url but there is a title\u2026\n    (!node.url && node.title) ||\n    // If there are control characters or whitespace.\n    /[\\0- \\u007F]/.test(node.url)\n  ) {\n    subexit = state.enter('destinationLiteral')\n    value += tracker.move('<')\n    value += tracker.move(\n      state.safe(node.url, {before: value, after: '>', ...tracker.current()})\n    )\n    value += tracker.move('>')\n  } else {\n    // No whitespace, raw is prettier.\n    subexit = state.enter('destinationRaw')\n    value += tracker.move(\n      state.safe(node.url, {\n        before: value,\n        after: node.title ? ' ' : ')',\n        ...tracker.current()\n      })\n    )\n  }\n\n  subexit()\n\n  if (node.title) {\n    subexit = state.enter(`title${suffix}`)\n    value += tracker.move(' ' + quote)\n    value += tracker.move(\n      state.safe(node.title, {\n        before: value,\n        after: quote,\n        ...tracker.current()\n      })\n    )\n    value += tracker.move(quote)\n    subexit()\n  }\n\n  value += tracker.move(')')\n\n  exit()\n  return value\n}\n\n/**\n * @param {Link} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @returns {string}\n */\nfunction linkPeek(node, _, state) {\n  return formatLinkAsAutolink(node, state) ? '<' : '['\n}\n", "/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {LinkReference, Parents} from 'mdast'\n */\n\nlinkReference.peek = linkReferencePeek\n\n/**\n * @param {LinkReference} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function linkReference(node, _, state, info) {\n  const type = node.referenceType\n  const exit = state.enter('linkReference')\n  let subexit = state.enter('label')\n  const tracker = state.createTracker(info)\n  let value = tracker.move('[')\n  const text = state.containerPhrasing(node, {\n    before: value,\n    after: ']',\n    ...tracker.current()\n  })\n  value += tracker.move(text + '][')\n\n  subexit()\n  // Hide the fact that we\u2019re in phrasing, because escapes don\u2019t work.\n  const stack = state.stack\n  state.stack = []\n  subexit = state.enter('reference')\n  // Note: for proper tracking, we should reset the output positions when we end\n  // up making a `shortcut` reference, because then there is no brace output.\n  // Practically, in that case, there is no content, so it doesn\u2019t matter that\n  // we\u2019ve tracked one too many characters.\n  const reference = state.safe(state.associationId(node), {\n    before: value,\n    after: ']',\n    ...tracker.current()\n  })\n  subexit()\n  state.stack = stack\n  exit()\n\n  if (type === 'full' || !text || text !== reference) {\n    value += tracker.move(reference + ']')\n  } else if (type === 'shortcut') {\n    // Remove the unwanted `[`.\n    value = value.slice(0, -1)\n  } else {\n    value += tracker.move(']')\n  }\n\n  return value\n}\n\n/**\n * @returns {string}\n */\nfunction linkReferencePeek() {\n  return '['\n}\n", "/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['bullet'], null | undefined>}\n */\nexport function checkBullet(state) {\n  const marker = state.options.bullet || '*'\n\n  if (marker !== '*' && marker !== '+' && marker !== '-') {\n    throw new Error(\n      'Cannot serialize items with `' +\n        marker +\n        '` for `options.bullet`, expected `*`, `+`, or `-`'\n    )\n  }\n\n  return marker\n}\n", "/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\nimport {checkBullet} from './check-bullet.js'\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['bullet'], null | undefined>}\n */\nexport function checkBulletOther(state) {\n  const bullet = checkBullet(state)\n  const bulletOther = state.options.bulletOther\n\n  if (!bulletOther) {\n    return bullet === '*' ? '-' : '*'\n  }\n\n  if (bulletOther !== '*' && bulletOther !== '+' && bulletOther !== '-') {\n    throw new Error(\n      'Cannot serialize items with `' +\n        bulletOther +\n        '` for `options.bulletOther`, expected `*`, `+`, or `-`'\n    )\n  }\n\n  if (bulletOther === bullet) {\n    throw new Error(\n      'Expected `bullet` (`' +\n        bullet +\n        '`) and `bulletOther` (`' +\n        bulletOther +\n        '`) to be different'\n    )\n  }\n\n  return bulletOther\n}\n", "/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['bulletOrdered'], null | undefined>}\n */\nexport function checkBulletOrdered(state) {\n  const marker = state.options.bulletOrdered || '.'\n\n  if (marker !== '.' && marker !== ')') {\n    throw new Error(\n      'Cannot serialize items with `' +\n        marker +\n        '` for `options.bulletOrdered`, expected `.` or `)`'\n    )\n  }\n\n  return marker\n}\n", "/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['rule'], null | undefined>}\n */\nexport function checkRule(state) {\n  const marker = state.options.rule || '*'\n\n  if (marker !== '*' && marker !== '-' && marker !== '_') {\n    throw new Error(\n      'Cannot serialize rules with `' +\n        marker +\n        '` for `options.rule`, expected `*`, `-`, or `_`'\n    )\n  }\n\n  return marker\n}\n", "/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {List, Parents} from 'mdast'\n */\n\nimport {checkBullet} from '../util/check-bullet.js'\nimport {checkBulletOther} from '../util/check-bullet-other.js'\nimport {checkBulletOrdered} from '../util/check-bullet-ordered.js'\nimport {checkRule} from '../util/check-rule.js'\n\n/**\n * @param {List} node\n * @param {Parents | undefined} parent\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function list(node, parent, state, info) {\n  const exit = state.enter('list')\n  const bulletCurrent = state.bulletCurrent\n  /** @type {string} */\n  let bullet = node.ordered ? checkBulletOrdered(state) : checkBullet(state)\n  /** @type {string} */\n  const bulletOther = node.ordered\n    ? bullet === '.'\n      ? ')'\n      : '.'\n    : checkBulletOther(state)\n  let useDifferentMarker =\n    parent && state.bulletLastUsed ? bullet === state.bulletLastUsed : false\n\n  if (!node.ordered) {\n    const firstListItem = node.children ? node.children[0] : undefined\n\n    // If there\u2019s an empty first list item directly in two list items,\n    // we have to use a different bullet:\n    //\n    // ```markdown\n    // * - *\n    // ```\n    //\n    // \u2026because otherwise it would become one big thematic break.\n    if (\n      // Bullet could be used as a thematic break marker:\n      (bullet === '*' || bullet === '-') &&\n      // Empty first list item:\n      firstListItem &&\n      (!firstListItem.children || !firstListItem.children[0]) &&\n      // Directly in two other list items:\n      state.stack[state.stack.length - 1] === 'list' &&\n      state.stack[state.stack.length - 2] === 'listItem' &&\n      state.stack[state.stack.length - 3] === 'list' &&\n      state.stack[state.stack.length - 4] === 'listItem' &&\n      // That are each the first child.\n      state.indexStack[state.indexStack.length - 1] === 0 &&\n      state.indexStack[state.indexStack.length - 2] === 0 &&\n      state.indexStack[state.indexStack.length - 3] === 0\n    ) {\n      useDifferentMarker = true\n    }\n\n    // If there\u2019s a thematic break at the start of the first list item,\n    // we have to use a different bullet:\n    //\n    // ```markdown\n    // * ---\n    // ```\n    //\n    // \u2026because otherwise it would become one big thematic break.\n    if (checkRule(state) === bullet && firstListItem) {\n      let index = -1\n\n      while (++index < node.children.length) {\n        const item = node.children[index]\n\n        if (\n          item &&\n          item.type === 'listItem' &&\n          item.children &&\n          item.children[0] &&\n          item.children[0].type === 'thematicBreak'\n        ) {\n          useDifferentMarker = true\n          break\n        }\n      }\n    }\n  }\n\n  if (useDifferentMarker) {\n    bullet = bulletOther\n  }\n\n  state.bulletCurrent = bullet\n  const value = state.containerFlow(node, info)\n  state.bulletLastUsed = bullet\n  state.bulletCurrent = bulletCurrent\n  exit()\n  return value\n}\n", "/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['listItemIndent'], null | undefined>}\n */\nexport function checkListItemIndent(state) {\n  const style = state.options.listItemIndent || 'one'\n\n  if (style !== 'tab' && style !== 'one' && style !== 'mixed') {\n    throw new Error(\n      'Cannot serialize items with `' +\n        style +\n        '` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`'\n    )\n  }\n\n  return style\n}\n", "/**\n * @import {Info, Map, State} from 'mdast-util-to-markdown'\n * @import {ListItem, Parents} from 'mdast'\n */\n\nimport {checkBullet} from '../util/check-bullet.js'\nimport {checkListItemIndent} from '../util/check-list-item-indent.js'\n\n/**\n * @param {ListItem} node\n * @param {Parents | undefined} parent\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function listItem(node, parent, state, info) {\n  const listItemIndent = checkListItemIndent(state)\n  let bullet = state.bulletCurrent || checkBullet(state)\n\n  // Add the marker value for ordered lists.\n  if (parent && parent.type === 'list' && parent.ordered) {\n    bullet =\n      (typeof parent.start === 'number' && parent.start > -1\n        ? parent.start\n        : 1) +\n      (state.options.incrementListMarker === false\n        ? 0\n        : parent.children.indexOf(node)) +\n      bullet\n  }\n\n  let size = bullet.length + 1\n\n  if (\n    listItemIndent === 'tab' ||\n    (listItemIndent === 'mixed' &&\n      ((parent && parent.type === 'list' && parent.spread) || node.spread))\n  ) {\n    size = Math.ceil(size / 4) * 4\n  }\n\n  const tracker = state.createTracker(info)\n  tracker.move(bullet + ' '.repeat(size - bullet.length))\n  tracker.shift(size)\n  const exit = state.enter('listItem')\n  const value = state.indentLines(\n    state.containerFlow(node, tracker.current()),\n    map\n  )\n  exit()\n\n  return value\n\n  /** @type {Map} */\n  function map(line, index, blank) {\n    if (index) {\n      return (blank ? '' : ' '.repeat(size)) + line\n    }\n\n    return (blank ? bullet : bullet + ' '.repeat(size - bullet.length)) + line\n  }\n}\n", "/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Paragraph, Parents} from 'mdast'\n */\n\n/**\n * @param {Paragraph} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function paragraph(node, _, state, info) {\n  const exit = state.enter('paragraph')\n  const subexit = state.enter('phrasing')\n  const value = state.containerPhrasing(node, info)\n  subexit()\n  exit()\n  return value\n}\n", "/**\n * @typedef {import('mdast').Html} Html\n * @typedef {import('mdast').PhrasingContent} PhrasingContent\n */\n\nimport {convert} from 'unist-util-is'\n\n/**\n * Check if the given value is *phrasing content*.\n *\n * > \uD83D\uDC49 **Note**: Excludes `html`, which can be both phrasing or flow.\n *\n * @param node\n *   Thing to check, typically `Node`.\n * @returns\n *   Whether `value` is phrasing content.\n */\n\nexport const phrasing =\n  /** @type {(node?: unknown) => node is Exclude<PhrasingContent, Html>} */\n  (\n    convert([\n      'break',\n      'delete',\n      'emphasis',\n      // To do: next major: removed since footnotes were added to GFM.\n      'footnote',\n      'footnoteReference',\n      'image',\n      'imageReference',\n      'inlineCode',\n      // Enabled by `mdast-util-math`:\n      'inlineMath',\n      'link',\n      'linkReference',\n      // Enabled by `mdast-util-mdx`:\n      'mdxJsxTextElement',\n      // Enabled by `mdast-util-mdx`:\n      'mdxTextExpression',\n      'strong',\n      'text',\n      // Enabled by `mdast-util-directive`:\n      'textDirective'\n    ])\n  )\n", "/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Parents, Root} from 'mdast'\n */\n\nimport {phrasing} from 'mdast-util-phrasing'\n\n/**\n * @param {Root} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function root(node, _, state, info) {\n  // Note: `html` nodes are ambiguous.\n  const hasPhrasing = node.children.some(function (d) {\n    return phrasing(d)\n  })\n\n  const container = hasPhrasing ? state.containerPhrasing : state.containerFlow\n  return container.call(state, node, info)\n}\n", "/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['strong'], null | undefined>}\n */\nexport function checkStrong(state) {\n  const marker = state.options.strong || '*'\n\n  if (marker !== '*' && marker !== '_') {\n    throw new Error(\n      'Cannot serialize strong with `' +\n        marker +\n        '` for `options.strong`, expected `*`, or `_`'\n    )\n  }\n\n  return marker\n}\n", "/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Parents, Strong} from 'mdast'\n */\n\nimport {checkStrong} from '../util/check-strong.js'\nimport {encodeCharacterReference} from '../util/encode-character-reference.js'\nimport {encodeInfo} from '../util/encode-info.js'\n\nstrong.peek = strongPeek\n\n/**\n * @param {Strong} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function strong(node, _, state, info) {\n  const marker = checkStrong(state)\n  const exit = state.enter('strong')\n  const tracker = state.createTracker(info)\n  const before = tracker.move(marker + marker)\n\n  let between = tracker.move(\n    state.containerPhrasing(node, {\n      after: marker,\n      before,\n      ...tracker.current()\n    })\n  )\n  const betweenHead = between.charCodeAt(0)\n  const open = encodeInfo(\n    info.before.charCodeAt(info.before.length - 1),\n    betweenHead,\n    marker\n  )\n\n  if (open.inside) {\n    between = encodeCharacterReference(betweenHead) + between.slice(1)\n  }\n\n  const betweenTail = between.charCodeAt(between.length - 1)\n  const close = encodeInfo(info.after.charCodeAt(0), betweenTail, marker)\n\n  if (close.inside) {\n    between = between.slice(0, -1) + encodeCharacterReference(betweenTail)\n  }\n\n  const after = tracker.move(marker + marker)\n\n  exit()\n\n  state.attentionEncodeSurroundingInfo = {\n    after: close.outside,\n    before: open.outside\n  }\n  return before + between + after\n}\n\n/**\n * @param {Strong} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @returns {string}\n */\nfunction strongPeek(_, _1, state) {\n  return state.options.strong || '*'\n}\n", "/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Parents, Text} from 'mdast'\n */\n\n/**\n * @param {Text} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function text(node, _, state, info) {\n  return state.safe(node.value, info)\n}\n", "/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['ruleRepetition'], null | undefined>}\n */\nexport function checkRuleRepetition(state) {\n  const repetition = state.options.ruleRepetition || 3\n\n  if (repetition < 3) {\n    throw new Error(\n      'Cannot serialize rules with repetition `' +\n        repetition +\n        '` for `options.ruleRepetition`, expected `3` or more'\n    )\n  }\n\n  return repetition\n}\n", "/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Parents, ThematicBreak} from 'mdast'\n */\n\nimport {checkRuleRepetition} from '../util/check-rule-repetition.js'\nimport {checkRule} from '../util/check-rule.js'\n\n/**\n * @param {ThematicBreak} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @returns {string}\n */\nexport function thematicBreak(_, _1, state) {\n  const value = (\n    checkRule(state) + (state.options.ruleSpaces ? ' ' : '')\n  ).repeat(checkRuleRepetition(state))\n\n  return state.options.ruleSpaces ? value.slice(0, -1) : value\n}\n", "import {blockquote} from './blockquote.js'\nimport {hardBreak} from './break.js'\nimport {code} from './code.js'\nimport {definition} from './definition.js'\nimport {emphasis} from './emphasis.js'\nimport {heading} from './heading.js'\nimport {html} from './html.js'\nimport {image} from './image.js'\nimport {imageReference} from './image-reference.js'\nimport {inlineCode} from './inline-code.js'\nimport {link} from './link.js'\nimport {linkReference} from './link-reference.js'\nimport {list} from './list.js'\nimport {listItem} from './list-item.js'\nimport {paragraph} from './paragraph.js'\nimport {root} from './root.js'\nimport {strong} from './strong.js'\nimport {text} from './text.js'\nimport {thematicBreak} from './thematic-break.js'\n\n/**\n * Default (CommonMark) handlers.\n */\nexport const handle = {\n  blockquote,\n  break: hardBreak,\n  code,\n  definition,\n  emphasis,\n  hardBreak,\n  heading,\n  html,\n  image,\n  imageReference,\n  inlineCode,\n  link,\n  linkReference,\n  list,\n  listItem,\n  paragraph,\n  root,\n  strong,\n  text,\n  thematicBreak\n}\n", "/**\n * @typedef {import('mdast').InlineCode} InlineCode\n * @typedef {import('mdast').Table} Table\n * @typedef {import('mdast').TableCell} TableCell\n * @typedef {import('mdast').TableRow} TableRow\n *\n * @typedef {import('markdown-table').Options} MarkdownTableOptions\n *\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n *\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').State} State\n * @typedef {import('mdast-util-to-markdown').Info} Info\n */\n\n/**\n * @typedef Options\n *   Configuration.\n * @property {boolean | null | undefined} [tableCellPadding=true]\n *   Whether to add a space of padding between delimiters and cells (default:\n *   `true`).\n * @property {boolean | null | undefined} [tablePipeAlign=true]\n *   Whether to align the delimiters (default: `true`).\n * @property {MarkdownTableOptions['stringLength'] | null | undefined} [stringLength]\n *   Function to detect the length of table cell content, used when aligning\n *   the delimiters between cells (optional).\n */\n\nimport {ok as assert} from 'devlop'\nimport {markdownTable} from 'markdown-table'\nimport {defaultHandlers} from 'mdast-util-to-markdown'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM tables in\n * markdown.\n *\n * @returns {FromMarkdownExtension}\n *   Extension for `mdast-util-from-markdown` to enable GFM tables.\n */\nexport function gfmTableFromMarkdown() {\n  return {\n    enter: {\n      table: enterTable,\n      tableData: enterCell,\n      tableHeader: enterCell,\n      tableRow: enterRow\n    },\n    exit: {\n      codeText: exitCodeText,\n      table: exitTable,\n      tableData: exit,\n      tableHeader: exit,\n      tableRow: exit\n    }\n  }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterTable(token) {\n  const align = token._align\n  assert(align, 'expected `_align` on table')\n  this.enter(\n    {\n      type: 'table',\n      align: align.map(function (d) {\n        return d === 'none' ? null : d\n      }),\n      children: []\n    },\n    token\n  )\n  this.data.inTable = true\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitTable(token) {\n  this.exit(token)\n  this.data.inTable = undefined\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterRow(token) {\n  this.enter({type: 'tableRow', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exit(token) {\n  this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterCell(token) {\n  this.enter({type: 'tableCell', children: []}, token)\n}\n\n// Overwrite the default code text data handler to unescape escaped pipes when\n// they are in tables.\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitCodeText(token) {\n  let value = this.resume()\n\n  if (this.data.inTable) {\n    value = value.replace(/\\\\([\\\\|])/g, replace)\n  }\n\n  const node = this.stack[this.stack.length - 1]\n  assert(node.type === 'inlineCode')\n  node.value = value\n  this.exit(token)\n}\n\n/**\n * @param {string} $0\n * @param {string} $1\n * @returns {string}\n */\nfunction replace($0, $1) {\n  // Pipes work, backslashes don\u2019t (but can\u2019t escape pipes).\n  return $1 === '|' ? $1 : $0\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM tables in\n * markdown.\n *\n * @param {Options | null | undefined} [options]\n *   Configuration.\n * @returns {ToMarkdownExtension}\n *   Extension for `mdast-util-to-markdown` to enable GFM tables.\n */\nexport function gfmTableToMarkdown(options) {\n  const settings = options || {}\n  const padding = settings.tableCellPadding\n  const alignDelimiters = settings.tablePipeAlign\n  const stringLength = settings.stringLength\n  const around = padding ? ' ' : '|'\n\n  return {\n    unsafe: [\n      {character: '\\r', inConstruct: 'tableCell'},\n      {character: '\\n', inConstruct: 'tableCell'},\n      // A pipe, when followed by a tab or space (padding), or a dash or colon\n      // (unpadded delimiter row), could result in a table.\n      {atBreak: true, character: '|', after: '[\\t :-]'},\n      // A pipe in a cell must be encoded.\n      {character: '|', inConstruct: 'tableCell'},\n      // A colon must be followed by a dash, in which case it could start a\n      // delimiter row.\n      {atBreak: true, character: ':', after: '-'},\n      // A delimiter row can also start with a dash, when followed by more\n      // dashes, a colon, or a pipe.\n      // This is a stricter version than the built in check for lists, thematic\n      // breaks, and setex heading underlines though:\n      // <https://github.com/syntax-tree/mdast-util-to-markdown/blob/51a2038/lib/unsafe.js#L57>\n      {atBreak: true, character: '-', after: '[:|-]'}\n    ],\n    handlers: {\n      inlineCode: inlineCodeWithTable,\n      table: handleTable,\n      tableCell: handleTableCell,\n      tableRow: handleTableRow\n    }\n  }\n\n  /**\n   * @type {ToMarkdownHandle}\n   * @param {Table} node\n   */\n  function handleTable(node, _, state, info) {\n    return serializeData(handleTableAsData(node, state, info), node.align)\n  }\n\n  /**\n   * This function isn\u2019t really used normally, because we handle rows at the\n   * table level.\n   * But, if someone passes in a table row, this ensures we make somewhat sense.\n   *\n   * @type {ToMarkdownHandle}\n   * @param {TableRow} node\n   */\n  function handleTableRow(node, _, state, info) {\n    const row = handleTableRowAsData(node, state, info)\n    const value = serializeData([row])\n    // `markdown-table` will always add an align row\n    return value.slice(0, value.indexOf('\\n'))\n  }\n\n  /**\n   * @type {ToMarkdownHandle}\n   * @param {TableCell} node\n   */\n  function handleTableCell(node, _, state, info) {\n    const exit = state.enter('tableCell')\n    const subexit = state.enter('phrasing')\n    const value = state.containerPhrasing(node, {\n      ...info,\n      before: around,\n      after: around\n    })\n    subexit()\n    exit()\n    return value\n  }\n\n  /**\n   * @param {Array<Array<string>>} matrix\n   * @param {Array<string | null | undefined> | null | undefined} [align]\n   */\n  function serializeData(matrix, align) {\n    return markdownTable(matrix, {\n      align,\n      // @ts-expect-error: `markdown-table` types should support `null`.\n      alignDelimiters,\n      // @ts-expect-error: `markdown-table` types should support `null`.\n      padding,\n      // @ts-expect-error: `markdown-table` types should support `null`.\n      stringLength\n    })\n  }\n\n  /**\n   * @param {Table} node\n   * @param {State} state\n   * @param {Info} info\n   */\n  function handleTableAsData(node, state, info) {\n    const children = node.children\n    let index = -1\n    /** @type {Array<Array<string>>} */\n    const result = []\n    const subexit = state.enter('table')\n\n    while (++index < children.length) {\n      result[index] = handleTableRowAsData(children[index], state, info)\n    }\n\n    subexit()\n\n    return result\n  }\n\n  /**\n   * @param {TableRow} node\n   * @param {State} state\n   * @param {Info} info\n   */\n  function handleTableRowAsData(node, state, info) {\n    const children = node.children\n    let index = -1\n    /** @type {Array<string>} */\n    const result = []\n    const subexit = state.enter('tableRow')\n\n    while (++index < children.length) {\n      // Note: the positional info as used here is incorrect.\n      // Making it correct would be impossible due to aligning cells?\n      // And it would need copy/pasting `markdown-table` into this project.\n      result[index] = handleTableCell(children[index], node, state, info)\n    }\n\n    subexit()\n\n    return result\n  }\n\n  /**\n   * @type {ToMarkdownHandle}\n   * @param {InlineCode} node\n   */\n  function inlineCodeWithTable(node, parent, state) {\n    let value = defaultHandlers.inlineCode(node, parent, state)\n\n    if (state.stack.includes('tableCell')) {\n      value = value.replace(/\\|/g, '\\\\$&')\n    }\n\n    return value\n  }\n}\n", "/**\n * @typedef {import('mdast').ListItem} ListItem\n * @typedef {import('mdast').Paragraph} Paragraph\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n */\n\nimport {ok as assert} from 'devlop'\nimport {defaultHandlers} from 'mdast-util-to-markdown'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM task\n * list items in markdown.\n *\n * @returns {FromMarkdownExtension}\n *   Extension for `mdast-util-from-markdown` to enable GFM task list items.\n */\nexport function gfmTaskListItemFromMarkdown() {\n  return {\n    exit: {\n      taskListCheckValueChecked: exitCheck,\n      taskListCheckValueUnchecked: exitCheck,\n      paragraph: exitParagraphWithTaskListItem\n    }\n  }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM task list\n * items in markdown.\n *\n * @returns {ToMarkdownExtension}\n *   Extension for `mdast-util-to-markdown` to enable GFM task list items.\n */\nexport function gfmTaskListItemToMarkdown() {\n  return {\n    unsafe: [{atBreak: true, character: '-', after: '[:|-]'}],\n    handlers: {listItem: listItemWithTaskListItem}\n  }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitCheck(token) {\n  // We\u2019re always in a paragraph, in a list item.\n  const node = this.stack[this.stack.length - 2]\n  assert(node.type === 'listItem')\n  node.checked = token.type === 'taskListCheckValueChecked'\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitParagraphWithTaskListItem(token) {\n  const parent = this.stack[this.stack.length - 2]\n\n  if (\n    parent &&\n    parent.type === 'listItem' &&\n    typeof parent.checked === 'boolean'\n  ) {\n    const node = this.stack[this.stack.length - 1]\n    assert(node.type === 'paragraph')\n    const head = node.children[0]\n\n    if (head && head.type === 'text') {\n      const siblings = parent.children\n      let index = -1\n      /** @type {Paragraph | undefined} */\n      let firstParaghraph\n\n      while (++index < siblings.length) {\n        const sibling = siblings[index]\n        if (sibling.type === 'paragraph') {\n          firstParaghraph = sibling\n          break\n        }\n      }\n\n      if (firstParaghraph === node) {\n        // Must start with a space or a tab.\n        head.value = head.value.slice(1)\n\n        if (head.value.length === 0) {\n          node.children.shift()\n        } else if (\n          node.position &&\n          head.position &&\n          typeof head.position.start.offset === 'number'\n        ) {\n          head.position.start.column++\n          head.position.start.offset++\n          node.position.start = Object.assign({}, head.position.start)\n        }\n      }\n    }\n  }\n\n  this.exit(token)\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {ListItem} node\n */\nfunction listItemWithTaskListItem(node, parent, state, info) {\n  const head = node.children[0]\n  const checkable =\n    typeof node.checked === 'boolean' && head && head.type === 'paragraph'\n  const checkbox = '[' + (node.checked ? 'x' : ' ') + '] '\n  const tracker = state.createTracker(info)\n\n  if (checkable) {\n    tracker.move(checkbox)\n  }\n\n  let value = defaultHandlers.listItem(node, parent, state, {\n    ...info,\n    ...tracker.current()\n  })\n\n  if (checkable) {\n    value = value.replace(/^(?:[*+-]|\\d+\\.)([\\r\\n]| {1,3})/, check)\n  }\n\n  return value\n\n  /**\n   * @param {string} $0\n   * @returns {string}\n   */\n  function check($0) {\n    return $0 + checkbox\n  }\n}\n", "/**\n * @import {Extension as FromMarkdownExtension} from 'mdast-util-from-markdown'\n * @import {Options} from 'mdast-util-gfm'\n * @import {Options as ToMarkdownExtension} from 'mdast-util-to-markdown'\n */\n\nimport {\n  gfmAutolinkLiteralFromMarkdown,\n  gfmAutolinkLiteralToMarkdown\n} from 'mdast-util-gfm-autolink-literal'\nimport {\n  gfmFootnoteFromMarkdown,\n  gfmFootnoteToMarkdown\n} from 'mdast-util-gfm-footnote'\nimport {\n  gfmStrikethroughFromMarkdown,\n  gfmStrikethroughToMarkdown\n} from 'mdast-util-gfm-strikethrough'\nimport {gfmTableFromMarkdown, gfmTableToMarkdown} from 'mdast-util-gfm-table'\nimport {\n  gfmTaskListItemFromMarkdown,\n  gfmTaskListItemToMarkdown\n} from 'mdast-util-gfm-task-list-item'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM (autolink\n * literals, footnotes, strikethrough, tables, tasklists).\n *\n * @returns {Array<FromMarkdownExtension>}\n *   Extension for `mdast-util-from-markdown` to enable GFM (autolink literals,\n *   footnotes, strikethrough, tables, tasklists).\n */\nexport function gfmFromMarkdown() {\n  return [\n    gfmAutolinkLiteralFromMarkdown(),\n    gfmFootnoteFromMarkdown(),\n    gfmStrikethroughFromMarkdown(),\n    gfmTableFromMarkdown(),\n    gfmTaskListItemFromMarkdown()\n  ]\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM (autolink\n * literals, footnotes, strikethrough, tables, tasklists).\n *\n * @param {Options | null | undefined} [options]\n *   Configuration (optional).\n * @returns {ToMarkdownExtension}\n *   Extension for `mdast-util-to-markdown` to enable GFM (autolink literals,\n *   footnotes, strikethrough, tables, tasklists).\n */\nexport function gfmToMarkdown(options) {\n  return {\n    extensions: [\n      gfmAutolinkLiteralToMarkdown(),\n      gfmFootnoteToMarkdown(options),\n      gfmStrikethroughToMarkdown(),\n      gfmTableToMarkdown(options),\n      gfmTaskListItemToMarkdown()\n    ]\n  }\n}\n", "/**\n * @import {Code, ConstructRecord, Event, Extension, Previous, State, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { asciiAlpha, asciiAlphanumeric, asciiControl, markdownLineEndingOrSpace, unicodePunctuation, unicodeWhitespace } from 'micromark-util-character';\nconst wwwPrefix = {\n  tokenize: tokenizeWwwPrefix,\n  partial: true\n};\nconst domain = {\n  tokenize: tokenizeDomain,\n  partial: true\n};\nconst path = {\n  tokenize: tokenizePath,\n  partial: true\n};\nconst trail = {\n  tokenize: tokenizeTrail,\n  partial: true\n};\nconst emailDomainDotTrail = {\n  tokenize: tokenizeEmailDomainDotTrail,\n  partial: true\n};\nconst wwwAutolink = {\n  name: 'wwwAutolink',\n  tokenize: tokenizeWwwAutolink,\n  previous: previousWww\n};\nconst protocolAutolink = {\n  name: 'protocolAutolink',\n  tokenize: tokenizeProtocolAutolink,\n  previous: previousProtocol\n};\nconst emailAutolink = {\n  name: 'emailAutolink',\n  tokenize: tokenizeEmailAutolink,\n  previous: previousEmail\n};\n\n/** @type {ConstructRecord} */\nconst text = {};\n\n/**\n * Create an extension for `micromark` to support GitHub autolink literal\n * syntax.\n *\n * @returns {Extension}\n *   Extension for `micromark` that can be passed in `extensions` to enable GFM\n *   autolink literal syntax.\n */\nexport function gfmAutolinkLiteral() {\n  return {\n    text\n  };\n}\n\n/** @type {Code} */\nlet code = 48;\n\n// Add alphanumerics.\nwhile (code < 123) {\n  text[code] = emailAutolink;\n  code++;\n  if (code === 58) code = 65;else if (code === 91) code = 97;\n}\ntext[43] = emailAutolink;\ntext[45] = emailAutolink;\ntext[46] = emailAutolink;\ntext[95] = emailAutolink;\ntext[72] = [emailAutolink, protocolAutolink];\ntext[104] = [emailAutolink, protocolAutolink];\ntext[87] = [emailAutolink, wwwAutolink];\ntext[119] = [emailAutolink, wwwAutolink];\n\n// To do: perform email autolink literals on events, afterwards.\n// That\u2019s where `markdown-rs` and `cmark-gfm` perform it.\n// It should look for `@`, then for atext backwards, and then for a label\n// forwards.\n// To do: `mailto:`, `xmpp:` protocol as prefix.\n\n/**\n * Email autolink literal.\n *\n * ```markdown\n * > | a contact@example.org b\n *       ^^^^^^^^^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeEmailAutolink(effects, ok, nok) {\n  const self = this;\n  /** @type {boolean | undefined} */\n  let dot;\n  /** @type {boolean} */\n  let data;\n  return start;\n\n  /**\n   * Start of email autolink literal.\n   *\n   * ```markdown\n   * > | a contact@example.org b\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    if (!gfmAtext(code) || !previousEmail.call(self, self.previous) || previousUnbalanced(self.events)) {\n      return nok(code);\n    }\n    effects.enter('literalAutolink');\n    effects.enter('literalAutolinkEmail');\n    return atext(code);\n  }\n\n  /**\n   * In email atext.\n   *\n   * ```markdown\n   * > | a contact@example.org b\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function atext(code) {\n    if (gfmAtext(code)) {\n      effects.consume(code);\n      return atext;\n    }\n    if (code === 64) {\n      effects.consume(code);\n      return emailDomain;\n    }\n    return nok(code);\n  }\n\n  /**\n   * In email domain.\n   *\n   * The reference code is a bit overly complex as it handles the `@`, of which\n   * there may be just one.\n   * Source: <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L318>\n   *\n   * ```markdown\n   * > | a contact@example.org b\n   *               ^\n   * ```\n   *\n   * @type {State}\n   */\n  function emailDomain(code) {\n    // Dot followed by alphanumerical (not `-` or `_`).\n    if (code === 46) {\n      return effects.check(emailDomainDotTrail, emailDomainAfter, emailDomainDot)(code);\n    }\n\n    // Alphanumerical, `-`, and `_`.\n    if (code === 45 || code === 95 || asciiAlphanumeric(code)) {\n      data = true;\n      effects.consume(code);\n      return emailDomain;\n    }\n\n    // To do: `/` if xmpp.\n\n    // Note: normally we\u2019d truncate trailing punctuation from the link.\n    // However, email autolink literals cannot contain any of those markers,\n    // except for `.`, but that can only occur if it isn\u2019t trailing.\n    // So we can ignore truncating!\n    return emailDomainAfter(code);\n  }\n\n  /**\n   * In email domain, on dot that is not a trail.\n   *\n   * ```markdown\n   * > | a contact@example.org b\n   *                      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function emailDomainDot(code) {\n    effects.consume(code);\n    dot = true;\n    return emailDomain;\n  }\n\n  /**\n   * After email domain.\n   *\n   * ```markdown\n   * > | a contact@example.org b\n   *                          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function emailDomainAfter(code) {\n    // Domain must not be empty, must include a dot, and must end in alphabetical.\n    // Source: <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L332>.\n    if (data && dot && asciiAlpha(self.previous)) {\n      effects.exit('literalAutolinkEmail');\n      effects.exit('literalAutolink');\n      return ok(code);\n    }\n    return nok(code);\n  }\n}\n\n/**\n * `www` autolink literal.\n *\n * ```markdown\n * > | a www.example.org b\n *       ^^^^^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeWwwAutolink(effects, ok, nok) {\n  const self = this;\n  return wwwStart;\n\n  /**\n   * Start of www autolink literal.\n   *\n   * ```markdown\n   * > | www.example.com/a?b#c\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function wwwStart(code) {\n    if (code !== 87 && code !== 119 || !previousWww.call(self, self.previous) || previousUnbalanced(self.events)) {\n      return nok(code);\n    }\n    effects.enter('literalAutolink');\n    effects.enter('literalAutolinkWww');\n    // Note: we *check*, so we can discard the `www.` we parsed.\n    // If it worked, we consider it as a part of the domain.\n    return effects.check(wwwPrefix, effects.attempt(domain, effects.attempt(path, wwwAfter), nok), nok)(code);\n  }\n\n  /**\n   * After a www autolink literal.\n   *\n   * ```markdown\n   * > | www.example.com/a?b#c\n   *                          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function wwwAfter(code) {\n    effects.exit('literalAutolinkWww');\n    effects.exit('literalAutolink');\n    return ok(code);\n  }\n}\n\n/**\n * Protocol autolink literal.\n *\n * ```markdown\n * > | a https://example.org b\n *       ^^^^^^^^^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeProtocolAutolink(effects, ok, nok) {\n  const self = this;\n  let buffer = '';\n  let seen = false;\n  return protocolStart;\n\n  /**\n   * Start of protocol autolink literal.\n   *\n   * ```markdown\n   * > | https://example.com/a?b#c\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function protocolStart(code) {\n    if ((code === 72 || code === 104) && previousProtocol.call(self, self.previous) && !previousUnbalanced(self.events)) {\n      effects.enter('literalAutolink');\n      effects.enter('literalAutolinkHttp');\n      buffer += String.fromCodePoint(code);\n      effects.consume(code);\n      return protocolPrefixInside;\n    }\n    return nok(code);\n  }\n\n  /**\n   * In protocol.\n   *\n   * ```markdown\n   * > | https://example.com/a?b#c\n   *     ^^^^^\n   * ```\n   *\n   * @type {State}\n   */\n  function protocolPrefixInside(code) {\n    // `5` is size of `https`\n    if (asciiAlpha(code) && buffer.length < 5) {\n      // @ts-expect-error: definitely number.\n      buffer += String.fromCodePoint(code);\n      effects.consume(code);\n      return protocolPrefixInside;\n    }\n    if (code === 58) {\n      const protocol = buffer.toLowerCase();\n      if (protocol === 'http' || protocol === 'https') {\n        effects.consume(code);\n        return protocolSlashesInside;\n      }\n    }\n    return nok(code);\n  }\n\n  /**\n   * In slashes.\n   *\n   * ```markdown\n   * > | https://example.com/a?b#c\n   *           ^^\n   * ```\n   *\n   * @type {State}\n   */\n  function protocolSlashesInside(code) {\n    if (code === 47) {\n      effects.consume(code);\n      if (seen) {\n        return afterProtocol;\n      }\n      seen = true;\n      return protocolSlashesInside;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After protocol, before domain.\n   *\n   * ```markdown\n   * > | https://example.com/a?b#c\n   *             ^\n   * ```\n   *\n   * @type {State}\n   */\n  function afterProtocol(code) {\n    // To do: this is different from `markdown-rs`:\n    // https://github.com/wooorm/markdown-rs/blob/b3a921c761309ae00a51fe348d8a43adbc54b518/src/construct/gfm_autolink_literal.rs#L172-L182\n    return code === null || asciiControl(code) || markdownLineEndingOrSpace(code) || unicodeWhitespace(code) || unicodePunctuation(code) ? nok(code) : effects.attempt(domain, effects.attempt(path, protocolAfter), nok)(code);\n  }\n\n  /**\n   * After a protocol autolink literal.\n   *\n   * ```markdown\n   * > | https://example.com/a?b#c\n   *                              ^\n   * ```\n   *\n   * @type {State}\n   */\n  function protocolAfter(code) {\n    effects.exit('literalAutolinkHttp');\n    effects.exit('literalAutolink');\n    return ok(code);\n  }\n}\n\n/**\n * `www` prefix.\n *\n * ```markdown\n * > | a www.example.org b\n *       ^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeWwwPrefix(effects, ok, nok) {\n  let size = 0;\n  return wwwPrefixInside;\n\n  /**\n   * In www prefix.\n   *\n   * ```markdown\n   * > | www.example.com\n   *     ^^^^\n   * ```\n   *\n   * @type {State}\n   */\n  function wwwPrefixInside(code) {\n    if ((code === 87 || code === 119) && size < 3) {\n      size++;\n      effects.consume(code);\n      return wwwPrefixInside;\n    }\n    if (code === 46 && size === 3) {\n      effects.consume(code);\n      return wwwPrefixAfter;\n    }\n    return nok(code);\n  }\n\n  /**\n   * After www prefix.\n   *\n   * ```markdown\n   * > | www.example.com\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function wwwPrefixAfter(code) {\n    // If there is *anything*, we can link.\n    return code === null ? nok(code) : ok(code);\n  }\n}\n\n/**\n * Domain.\n *\n * ```markdown\n * > | a https://example.org b\n *               ^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDomain(effects, ok, nok) {\n  /** @type {boolean | undefined} */\n  let underscoreInLastSegment;\n  /** @type {boolean | undefined} */\n  let underscoreInLastLastSegment;\n  /** @type {boolean | undefined} */\n  let seen;\n  return domainInside;\n\n  /**\n   * In domain.\n   *\n   * ```markdown\n   * > | https://example.com/a\n   *             ^^^^^^^^^^^\n   * ```\n   *\n   * @type {State}\n   */\n  function domainInside(code) {\n    // Check whether this marker, which is a trailing punctuation\n    // marker, optionally followed by more trailing markers, and then\n    // followed by an end.\n    if (code === 46 || code === 95) {\n      return effects.check(trail, domainAfter, domainAtPunctuation)(code);\n    }\n\n    // GH documents that only alphanumerics (other than `-`, `.`, and `_`) can\n    // occur, which sounds like ASCII only, but they also support `www.\u9EDE\u770B.com`,\n    // so that\u2019s Unicode.\n    // Instead of some new production for Unicode alphanumerics, markdown\n    // already has that for Unicode punctuation and whitespace, so use those.\n    // Source: <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L12>.\n    if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code) || code !== 45 && unicodePunctuation(code)) {\n      return domainAfter(code);\n    }\n    seen = true;\n    effects.consume(code);\n    return domainInside;\n  }\n\n  /**\n   * In domain, at potential trailing punctuation, that was not trailing.\n   *\n   * ```markdown\n   * > | https://example.com\n   *                    ^\n   * ```\n   *\n   * @type {State}\n   */\n  function domainAtPunctuation(code) {\n    // There is an underscore in the last segment of the domain\n    if (code === 95) {\n      underscoreInLastSegment = true;\n    }\n    // Otherwise, it\u2019s a `.`: save the last segment underscore in the\n    // penultimate segment slot.\n    else {\n      underscoreInLastLastSegment = underscoreInLastSegment;\n      underscoreInLastSegment = undefined;\n    }\n    effects.consume(code);\n    return domainInside;\n  }\n\n  /**\n   * After domain.\n   *\n   * ```markdown\n   * > | https://example.com/a\n   *                        ^\n   * ```\n   *\n   * @type {State} */\n  function domainAfter(code) {\n    // Note: that\u2019s GH says a dot is needed, but it\u2019s not true:\n    // <https://github.com/github/cmark-gfm/issues/279>\n    if (underscoreInLastLastSegment || underscoreInLastSegment || !seen) {\n      return nok(code);\n    }\n    return ok(code);\n  }\n}\n\n/**\n * Path.\n *\n * ```markdown\n * > | a https://example.org/stuff b\n *                          ^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizePath(effects, ok) {\n  let sizeOpen = 0;\n  let sizeClose = 0;\n  return pathInside;\n\n  /**\n   * In path.\n   *\n   * ```markdown\n   * > | https://example.com/a\n   *                        ^^\n   * ```\n   *\n   * @type {State}\n   */\n  function pathInside(code) {\n    if (code === 40) {\n      sizeOpen++;\n      effects.consume(code);\n      return pathInside;\n    }\n\n    // To do: `markdown-rs` also needs this.\n    // If this is a paren, and there are less closings than openings,\n    // we don\u2019t check for a trail.\n    if (code === 41 && sizeClose < sizeOpen) {\n      return pathAtPunctuation(code);\n    }\n\n    // Check whether this trailing punctuation marker is optionally\n    // followed by more trailing markers, and then followed\n    // by an end.\n    if (code === 33 || code === 34 || code === 38 || code === 39 || code === 41 || code === 42 || code === 44 || code === 46 || code === 58 || code === 59 || code === 60 || code === 63 || code === 93 || code === 95 || code === 126) {\n      return effects.check(trail, ok, pathAtPunctuation)(code);\n    }\n    if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n      return ok(code);\n    }\n    effects.consume(code);\n    return pathInside;\n  }\n\n  /**\n   * In path, at potential trailing punctuation, that was not trailing.\n   *\n   * ```markdown\n   * > | https://example.com/a\"b\n   *                          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function pathAtPunctuation(code) {\n    // Count closing parens.\n    if (code === 41) {\n      sizeClose++;\n    }\n    effects.consume(code);\n    return pathInside;\n  }\n}\n\n/**\n * Trail.\n *\n * This calls `ok` if this *is* the trail, followed by an end, which means\n * the entire trail is not part of the link.\n * It calls `nok` if this *is* part of the link.\n *\n * ```markdown\n * > | https://example.com\").\n *                        ^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTrail(effects, ok, nok) {\n  return trail;\n\n  /**\n   * In trail of domain or path.\n   *\n   * ```markdown\n   * > | https://example.com\").\n   *                        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function trail(code) {\n    // Regular trailing punctuation.\n    if (code === 33 || code === 34 || code === 39 || code === 41 || code === 42 || code === 44 || code === 46 || code === 58 || code === 59 || code === 63 || code === 95 || code === 126) {\n      effects.consume(code);\n      return trail;\n    }\n\n    // `&` followed by one or more alphabeticals and then a `;`, is\n    // as a whole considered as trailing punctuation.\n    // In all other cases, it is considered as continuation of the URL.\n    if (code === 38) {\n      effects.consume(code);\n      return trailCharacterReferenceStart;\n    }\n\n    // Needed because we allow literals after `[`, as we fix:\n    // <https://github.com/github/cmark-gfm/issues/278>.\n    // Check that it is not followed by `(` or `[`.\n    if (code === 93) {\n      effects.consume(code);\n      return trailBracketAfter;\n    }\n    if (\n    // `<` is an end.\n    code === 60 ||\n    // So is whitespace.\n    code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n      return ok(code);\n    }\n    return nok(code);\n  }\n\n  /**\n   * In trail, after `]`.\n   *\n   * > \uD83D\uDC49 **Note**: this deviates from `cmark-gfm` to fix a bug.\n   * > See end of <https://github.com/github/cmark-gfm/issues/278> for more.\n   *\n   * ```markdown\n   * > | https://example.com](\n   *                         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function trailBracketAfter(code) {\n    // Whitespace or something that could start a resource or reference is the end.\n    // Switch back to trail otherwise.\n    if (code === null || code === 40 || code === 91 || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n      return ok(code);\n    }\n    return trail(code);\n  }\n\n  /**\n   * In character-reference like trail, after `&`.\n   *\n   * ```markdown\n   * > | https://example.com&amp;).\n   *                         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function trailCharacterReferenceStart(code) {\n    // When non-alpha, it\u2019s not a trail.\n    return asciiAlpha(code) ? trailCharacterReferenceInside(code) : nok(code);\n  }\n\n  /**\n   * In character-reference like trail.\n   *\n   * ```markdown\n   * > | https://example.com&amp;).\n   *                         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function trailCharacterReferenceInside(code) {\n    // Switch back to trail if this is well-formed.\n    if (code === 59) {\n      effects.consume(code);\n      return trail;\n    }\n    if (asciiAlpha(code)) {\n      effects.consume(code);\n      return trailCharacterReferenceInside;\n    }\n\n    // It\u2019s not a trail.\n    return nok(code);\n  }\n}\n\n/**\n * Dot in email domain trail.\n *\n * This calls `ok` if this *is* the trail, followed by an end, which means\n * the trail is not part of the link.\n * It calls `nok` if this *is* part of the link.\n *\n * ```markdown\n * > | contact@example.org.\n *                        ^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeEmailDomainDotTrail(effects, ok, nok) {\n  return start;\n\n  /**\n   * Dot.\n   *\n   * ```markdown\n   * > | contact@example.org.\n   *                    ^   ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    // Must be dot.\n    effects.consume(code);\n    return after;\n  }\n\n  /**\n   * After dot.\n   *\n   * ```markdown\n   * > | contact@example.org.\n   *                     ^   ^\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    // Not a trail if alphanumeric.\n    return asciiAlphanumeric(code) ? nok(code) : ok(code);\n  }\n}\n\n/**\n * See:\n * <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L156>.\n *\n * @type {Previous}\n */\nfunction previousWww(code) {\n  return code === null || code === 40 || code === 42 || code === 95 || code === 91 || code === 93 || code === 126 || markdownLineEndingOrSpace(code);\n}\n\n/**\n * See:\n * <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L214>.\n *\n * @type {Previous}\n */\nfunction previousProtocol(code) {\n  return !asciiAlpha(code);\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Previous}\n */\nfunction previousEmail(code) {\n  // Do not allow a slash \u201Cinside\u201D atext.\n  // The reference code is a bit weird, but that\u2019s what it results in.\n  // Source: <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L307>.\n  // Other than slash, every preceding character is allowed.\n  return !(code === 47 || gfmAtext(code));\n}\n\n/**\n * @param {Code} code\n * @returns {boolean}\n */\nfunction gfmAtext(code) {\n  return code === 43 || code === 45 || code === 46 || code === 95 || asciiAlphanumeric(code);\n}\n\n/**\n * @param {Array<Event>} events\n * @returns {boolean}\n */\nfunction previousUnbalanced(events) {\n  let index = events.length;\n  let result = false;\n  while (index--) {\n    const token = events[index][1];\n    if ((token.type === 'labelLink' || token.type === 'labelImage') && !token._balanced) {\n      result = true;\n      break;\n    }\n\n    // If we\u2019ve seen this token, and it was marked as not having any unbalanced\n    // bracket before it, we can exit.\n    if (token._gfmAutolinkLiteralWalkedInto) {\n      result = false;\n      break;\n    }\n  }\n  if (events.length > 0 && !result) {\n    // Mark the last token as \u201Cwalked into\u201D w/o finding\n    // anything.\n    events[events.length - 1][1]._gfmAutolinkLiteralWalkedInto = true;\n  }\n  return result;\n}", "/**\n * @import {Event, Exiter, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { blankLine } from 'micromark-core-commonmark';\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEndingOrSpace } from 'micromark-util-character';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\nconst indent = {\n  tokenize: tokenizeIndent,\n  partial: true\n};\n\n// To do: micromark should support a `_hiddenGfmFootnoteSupport`, which only\n// affects label start (image).\n// That will let us drop `tokenizePotentialGfmFootnote*`.\n// It currently has a `_hiddenFootnoteSupport`, which affects that and more.\n// That can be removed when `micromark-extension-footnote` is archived.\n\n/**\n * Create an extension for `micromark` to enable GFM footnote syntax.\n *\n * @returns {Extension}\n *   Extension for `micromark` that can be passed in `extensions` to\n *   enable GFM footnote syntax.\n */\nexport function gfmFootnote() {\n  /** @type {Extension} */\n  return {\n    document: {\n      [91]: {\n        name: 'gfmFootnoteDefinition',\n        tokenize: tokenizeDefinitionStart,\n        continuation: {\n          tokenize: tokenizeDefinitionContinuation\n        },\n        exit: gfmFootnoteDefinitionEnd\n      }\n    },\n    text: {\n      [91]: {\n        name: 'gfmFootnoteCall',\n        tokenize: tokenizeGfmFootnoteCall\n      },\n      [93]: {\n        name: 'gfmPotentialFootnoteCall',\n        add: 'after',\n        tokenize: tokenizePotentialGfmFootnoteCall,\n        resolveTo: resolveToPotentialGfmFootnoteCall\n      }\n    }\n  };\n}\n\n// To do: remove after micromark update.\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizePotentialGfmFootnoteCall(effects, ok, nok) {\n  const self = this;\n  let index = self.events.length;\n  const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n  /** @type {Token} */\n  let labelStart;\n\n  // Find an opening.\n  while (index--) {\n    const token = self.events[index][1];\n    if (token.type === \"labelImage\") {\n      labelStart = token;\n      break;\n    }\n\n    // Exit if we\u2019ve walked far enough.\n    if (token.type === 'gfmFootnoteCall' || token.type === \"labelLink\" || token.type === \"label\" || token.type === \"image\" || token.type === \"link\") {\n      break;\n    }\n  }\n  return start;\n\n  /**\n   * @type {State}\n   */\n  function start(code) {\n    if (!labelStart || !labelStart._balanced) {\n      return nok(code);\n    }\n    const id = normalizeIdentifier(self.sliceSerialize({\n      start: labelStart.end,\n      end: self.now()\n    }));\n    if (id.codePointAt(0) !== 94 || !defined.includes(id.slice(1))) {\n      return nok(code);\n    }\n    effects.enter('gfmFootnoteCallLabelMarker');\n    effects.consume(code);\n    effects.exit('gfmFootnoteCallLabelMarker');\n    return ok(code);\n  }\n}\n\n// To do: remove after micromark update.\n/** @type {Resolver} */\nfunction resolveToPotentialGfmFootnoteCall(events, context) {\n  let index = events.length;\n  /** @type {Token | undefined} */\n  let labelStart;\n\n  // Find an opening.\n  while (index--) {\n    if (events[index][1].type === \"labelImage\" && events[index][0] === 'enter') {\n      labelStart = events[index][1];\n      break;\n    }\n  }\n  // Change the `labelImageMarker` to a `data`.\n  events[index + 1][1].type = \"data\";\n  events[index + 3][1].type = 'gfmFootnoteCallLabelMarker';\n\n  // The whole (without `!`):\n  /** @type {Token} */\n  const call = {\n    type: 'gfmFootnoteCall',\n    start: Object.assign({}, events[index + 3][1].start),\n    end: Object.assign({}, events[events.length - 1][1].end)\n  };\n  // The `^` marker\n  /** @type {Token} */\n  const marker = {\n    type: 'gfmFootnoteCallMarker',\n    start: Object.assign({}, events[index + 3][1].end),\n    end: Object.assign({}, events[index + 3][1].end)\n  };\n  // Increment the end 1 character.\n  marker.end.column++;\n  marker.end.offset++;\n  marker.end._bufferIndex++;\n  /** @type {Token} */\n  const string = {\n    type: 'gfmFootnoteCallString',\n    start: Object.assign({}, marker.end),\n    end: Object.assign({}, events[events.length - 1][1].start)\n  };\n  /** @type {Token} */\n  const chunk = {\n    type: \"chunkString\",\n    contentType: 'string',\n    start: Object.assign({}, string.start),\n    end: Object.assign({}, string.end)\n  };\n\n  /** @type {Array<Event>} */\n  const replacement = [\n  // Take the `labelImageMarker` (now `data`, the `!`)\n  events[index + 1], events[index + 2], ['enter', call, context],\n  // The `[`\n  events[index + 3], events[index + 4],\n  // The `^`.\n  ['enter', marker, context], ['exit', marker, context],\n  // Everything in between.\n  ['enter', string, context], ['enter', chunk, context], ['exit', chunk, context], ['exit', string, context],\n  // The ending (`]`, properly parsed and labelled).\n  events[events.length - 2], events[events.length - 1], ['exit', call, context]];\n  events.splice(index, events.length - index + 1, ...replacement);\n  return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeGfmFootnoteCall(effects, ok, nok) {\n  const self = this;\n  const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n  let size = 0;\n  /** @type {boolean} */\n  let data;\n\n  // Note: the implementation of `markdown-rs` is different, because it houses\n  // core *and* extensions in one project.\n  // Therefore, it can include footnote logic inside `label-end`.\n  // We can\u2019t do that, but luckily, we can parse footnotes in a simpler way than\n  // needed for labels.\n  return start;\n\n  /**\n   * Start of footnote label.\n   *\n   * ```markdown\n   * > | a [^b] c\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter('gfmFootnoteCall');\n    effects.enter('gfmFootnoteCallLabelMarker');\n    effects.consume(code);\n    effects.exit('gfmFootnoteCallLabelMarker');\n    return callStart;\n  }\n\n  /**\n   * After `[`, at `^`.\n   *\n   * ```markdown\n   * > | a [^b] c\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function callStart(code) {\n    if (code !== 94) return nok(code);\n    effects.enter('gfmFootnoteCallMarker');\n    effects.consume(code);\n    effects.exit('gfmFootnoteCallMarker');\n    effects.enter('gfmFootnoteCallString');\n    effects.enter('chunkString').contentType = 'string';\n    return callData;\n  }\n\n  /**\n   * In label.\n   *\n   * ```markdown\n   * > | a [^b] c\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function callData(code) {\n    if (\n    // Too long.\n    size > 999 ||\n    // Closing brace with nothing.\n    code === 93 && !data ||\n    // Space or tab is not supported by GFM for some reason.\n    // `\\n` and `[` not being supported makes sense.\n    code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n      return nok(code);\n    }\n    if (code === 93) {\n      effects.exit('chunkString');\n      const token = effects.exit('gfmFootnoteCallString');\n      if (!defined.includes(normalizeIdentifier(self.sliceSerialize(token)))) {\n        return nok(code);\n      }\n      effects.enter('gfmFootnoteCallLabelMarker');\n      effects.consume(code);\n      effects.exit('gfmFootnoteCallLabelMarker');\n      effects.exit('gfmFootnoteCall');\n      return ok;\n    }\n    if (!markdownLineEndingOrSpace(code)) {\n      data = true;\n    }\n    size++;\n    effects.consume(code);\n    return code === 92 ? callEscape : callData;\n  }\n\n  /**\n   * On character after escape.\n   *\n   * ```markdown\n   * > | a [^b\\c] d\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function callEscape(code) {\n    if (code === 91 || code === 92 || code === 93) {\n      effects.consume(code);\n      size++;\n      return callData;\n    }\n    return callData(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionStart(effects, ok, nok) {\n  const self = this;\n  const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n  /** @type {string} */\n  let identifier;\n  let size = 0;\n  /** @type {boolean | undefined} */\n  let data;\n  return start;\n\n  /**\n   * Start of GFM footnote definition.\n   *\n   * ```markdown\n   * > | [^a]: b\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function start(code) {\n    effects.enter('gfmFootnoteDefinition')._container = true;\n    effects.enter('gfmFootnoteDefinitionLabel');\n    effects.enter('gfmFootnoteDefinitionLabelMarker');\n    effects.consume(code);\n    effects.exit('gfmFootnoteDefinitionLabelMarker');\n    return labelAtMarker;\n  }\n\n  /**\n   * In label, at caret.\n   *\n   * ```markdown\n   * > | [^a]: b\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelAtMarker(code) {\n    if (code === 94) {\n      effects.enter('gfmFootnoteDefinitionMarker');\n      effects.consume(code);\n      effects.exit('gfmFootnoteDefinitionMarker');\n      effects.enter('gfmFootnoteDefinitionLabelString');\n      effects.enter('chunkString').contentType = 'string';\n      return labelInside;\n    }\n    return nok(code);\n  }\n\n  /**\n   * In label.\n   *\n   * > \uD83D\uDC49 **Note**: `cmark-gfm` prevents whitespace from occurring in footnote\n   * > definition labels.\n   *\n   * ```markdown\n   * > | [^a]: b\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelInside(code) {\n    if (\n    // Too long.\n    size > 999 ||\n    // Closing brace with nothing.\n    code === 93 && !data ||\n    // Space or tab is not supported by GFM for some reason.\n    // `\\n` and `[` not being supported makes sense.\n    code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n      return nok(code);\n    }\n    if (code === 93) {\n      effects.exit('chunkString');\n      const token = effects.exit('gfmFootnoteDefinitionLabelString');\n      identifier = normalizeIdentifier(self.sliceSerialize(token));\n      effects.enter('gfmFootnoteDefinitionLabelMarker');\n      effects.consume(code);\n      effects.exit('gfmFootnoteDefinitionLabelMarker');\n      effects.exit('gfmFootnoteDefinitionLabel');\n      return labelAfter;\n    }\n    if (!markdownLineEndingOrSpace(code)) {\n      data = true;\n    }\n    size++;\n    effects.consume(code);\n    return code === 92 ? labelEscape : labelInside;\n  }\n\n  /**\n   * After `\\`, at a special character.\n   *\n   * > \uD83D\uDC49 **Note**: `cmark-gfm` currently does not support escaped brackets:\n   * > <https://github.com/github/cmark-gfm/issues/240>\n   *\n   * ```markdown\n   * > | [^a\\*b]: c\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelEscape(code) {\n    if (code === 91 || code === 92 || code === 93) {\n      effects.consume(code);\n      size++;\n      return labelInside;\n    }\n    return labelInside(code);\n  }\n\n  /**\n   * After definition label.\n   *\n   * ```markdown\n   * > | [^a]: b\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function labelAfter(code) {\n    if (code === 58) {\n      effects.enter('definitionMarker');\n      effects.consume(code);\n      effects.exit('definitionMarker');\n      if (!defined.includes(identifier)) {\n        defined.push(identifier);\n      }\n\n      // Any whitespace after the marker is eaten, forming indented code\n      // is not possible.\n      // No space is also fine, just like a block quote marker.\n      return factorySpace(effects, whitespaceAfter, 'gfmFootnoteDefinitionWhitespace');\n    }\n    return nok(code);\n  }\n\n  /**\n   * After definition prefix.\n   *\n   * ```markdown\n   * > | [^a]: b\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function whitespaceAfter(code) {\n    // `markdown-rs` has a wrapping token for the prefix that is closed here.\n    return ok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionContinuation(effects, ok, nok) {\n  /// Start of footnote definition continuation.\n  ///\n  /// ```markdown\n  ///   | [^a]: b\n  /// > |     c\n  ///     ^\n  /// ```\n  //\n  // Either a blank line, which is okay, or an indented thing.\n  return effects.check(blankLine, ok, effects.attempt(indent, ok, nok));\n}\n\n/** @type {Exiter} */\nfunction gfmFootnoteDefinitionEnd(effects) {\n  effects.exit('gfmFootnoteDefinition');\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeIndent(effects, ok, nok) {\n  const self = this;\n  return factorySpace(effects, afterPrefix, 'gfmFootnoteDefinitionIndent', 4 + 1);\n\n  /**\n   * @type {State}\n   */\n  function afterPrefix(code) {\n    const tail = self.events[self.events.length - 1];\n    return tail && tail[1].type === 'gfmFootnoteDefinitionIndent' && tail[2].sliceSerialize(tail[1], true).length === 4 ? ok(code) : nok(code);\n  }\n}", "/**\n * @import {Options} from 'micromark-extension-gfm-strikethrough'\n * @import {Event, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { splice } from 'micromark-util-chunked';\nimport { classifyCharacter } from 'micromark-util-classify-character';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/**\n * Create an extension for `micromark` to enable GFM strikethrough syntax.\n *\n * @param {Options | null | undefined} [options={}]\n *   Configuration.\n * @returns {Extension}\n *   Extension for `micromark` that can be passed in `extensions`, to\n *   enable GFM strikethrough syntax.\n */\nexport function gfmStrikethrough(options) {\n  const options_ = options || {};\n  let single = options_.singleTilde;\n  const tokenizer = {\n    name: 'strikethrough',\n    tokenize: tokenizeStrikethrough,\n    resolveAll: resolveAllStrikethrough\n  };\n  if (single === null || single === undefined) {\n    single = true;\n  }\n  return {\n    text: {\n      [126]: tokenizer\n    },\n    insideSpan: {\n      null: [tokenizer]\n    },\n    attentionMarkers: {\n      null: [126]\n    }\n  };\n\n  /**\n   * Take events and resolve strikethrough.\n   *\n   * @type {Resolver}\n   */\n  function resolveAllStrikethrough(events, context) {\n    let index = -1;\n\n    // Walk through all events.\n    while (++index < events.length) {\n      // Find a token that can close.\n      if (events[index][0] === 'enter' && events[index][1].type === 'strikethroughSequenceTemporary' && events[index][1]._close) {\n        let open = index;\n\n        // Now walk back to find an opener.\n        while (open--) {\n          // Find a token that can open the closer.\n          if (events[open][0] === 'exit' && events[open][1].type === 'strikethroughSequenceTemporary' && events[open][1]._open &&\n          // If the sizes are the same:\n          events[index][1].end.offset - events[index][1].start.offset === events[open][1].end.offset - events[open][1].start.offset) {\n            events[index][1].type = 'strikethroughSequence';\n            events[open][1].type = 'strikethroughSequence';\n\n            /** @type {Token} */\n            const strikethrough = {\n              type: 'strikethrough',\n              start: Object.assign({}, events[open][1].start),\n              end: Object.assign({}, events[index][1].end)\n            };\n\n            /** @type {Token} */\n            const text = {\n              type: 'strikethroughText',\n              start: Object.assign({}, events[open][1].end),\n              end: Object.assign({}, events[index][1].start)\n            };\n\n            // Opening.\n            /** @type {Array<Event>} */\n            const nextEvents = [['enter', strikethrough, context], ['enter', events[open][1], context], ['exit', events[open][1], context], ['enter', text, context]];\n            const insideSpan = context.parser.constructs.insideSpan.null;\n            if (insideSpan) {\n              // Between.\n              splice(nextEvents, nextEvents.length, 0, resolveAll(insideSpan, events.slice(open + 1, index), context));\n            }\n\n            // Closing.\n            splice(nextEvents, nextEvents.length, 0, [['exit', text, context], ['enter', events[index][1], context], ['exit', events[index][1], context], ['exit', strikethrough, context]]);\n            splice(events, open - 1, index - open + 3, nextEvents);\n            index = open + nextEvents.length - 2;\n            break;\n          }\n        }\n      }\n    }\n    index = -1;\n    while (++index < events.length) {\n      if (events[index][1].type === 'strikethroughSequenceTemporary') {\n        events[index][1].type = \"data\";\n      }\n    }\n    return events;\n  }\n\n  /**\n   * @this {TokenizeContext}\n   * @type {Tokenizer}\n   */\n  function tokenizeStrikethrough(effects, ok, nok) {\n    const previous = this.previous;\n    const events = this.events;\n    let size = 0;\n    return start;\n\n    /** @type {State} */\n    function start(code) {\n      if (previous === 126 && events[events.length - 1][1].type !== \"characterEscape\") {\n        return nok(code);\n      }\n      effects.enter('strikethroughSequenceTemporary');\n      return more(code);\n    }\n\n    /** @type {State} */\n    function more(code) {\n      const before = classifyCharacter(previous);\n      if (code === 126) {\n        // If this is the third marker, exit.\n        if (size > 1) return nok(code);\n        effects.consume(code);\n        size++;\n        return more;\n      }\n      if (size < 2 && !single) return nok(code);\n      const token = effects.exit('strikethroughSequenceTemporary');\n      const after = classifyCharacter(code);\n      token._open = !after || after === 2 && Boolean(before);\n      token._close = !before || before === 2 && Boolean(after);\n      return ok(code);\n    }\n  }\n}", "/**\n * @import {Event} from 'micromark-util-types'\n */\n\n// Port of `edit_map.rs` from `markdown-rs`.\n// This should move to `markdown-js` later.\n\n// Deal with several changes in events, batching them together.\n//\n// Preferably, changes should be kept to a minimum.\n// Sometimes, it\u2019s needed to change the list of events, because parsing can be\n// messy, and it helps to expose a cleaner interface of events to the compiler\n// and other users.\n// It can also help to merge many adjacent similar events.\n// And, in other cases, it\u2019s needed to parse subcontent: pass some events\n// through another tokenizer and inject the result.\n\n/**\n * @typedef {[number, number, Array<Event>]} Change\n * @typedef {[number, number, number]} Jump\n */\n\n/**\n * Tracks a bunch of edits.\n */\nexport class EditMap {\n  /**\n   * Create a new edit map.\n   */\n  constructor() {\n    /**\n     * Record of changes.\n     *\n     * @type {Array<Change>}\n     */\n    this.map = [];\n  }\n\n  /**\n   * Create an edit: a remove and/or add at a certain place.\n   *\n   * @param {number} index\n   * @param {number} remove\n   * @param {Array<Event>} add\n   * @returns {undefined}\n   */\n  add(index, remove, add) {\n    addImplementation(this, index, remove, add);\n  }\n\n  // To do: add this when moving to `micromark`.\n  // /**\n  //  * Create an edit: but insert `add` before existing additions.\n  //  *\n  //  * @param {number} index\n  //  * @param {number} remove\n  //  * @param {Array<Event>} add\n  //  * @returns {undefined}\n  //  */\n  // addBefore(index, remove, add) {\n  //   addImplementation(this, index, remove, add, true)\n  // }\n\n  /**\n   * Done, change the events.\n   *\n   * @param {Array<Event>} events\n   * @returns {undefined}\n   */\n  consume(events) {\n    this.map.sort(function (a, b) {\n      return a[0] - b[0];\n    });\n\n    /* c8 ignore next 3 -- `resolve` is never called without tables, so without edits. */\n    if (this.map.length === 0) {\n      return;\n    }\n\n    // To do: if links are added in events, like they are in `markdown-rs`,\n    // this is needed.\n    // // Calculate jumps: where items in the current list move to.\n    // /** @type {Array<Jump>} */\n    // const jumps = []\n    // let index = 0\n    // let addAcc = 0\n    // let removeAcc = 0\n    // while (index < this.map.length) {\n    //   const [at, remove, add] = this.map[index]\n    //   removeAcc += remove\n    //   addAcc += add.length\n    //   jumps.push([at, removeAcc, addAcc])\n    //   index += 1\n    // }\n    //\n    // . shiftLinks(events, jumps)\n\n    let index = this.map.length;\n    /** @type {Array<Array<Event>>} */\n    const vecs = [];\n    while (index > 0) {\n      index -= 1;\n      vecs.push(events.slice(this.map[index][0] + this.map[index][1]), this.map[index][2]);\n\n      // Truncate rest.\n      events.length = this.map[index][0];\n    }\n    vecs.push(events.slice());\n    events.length = 0;\n    let slice = vecs.pop();\n    while (slice) {\n      for (const element of slice) {\n        events.push(element);\n      }\n      slice = vecs.pop();\n    }\n\n    // Truncate everything.\n    this.map.length = 0;\n  }\n}\n\n/**\n * Create an edit.\n *\n * @param {EditMap} editMap\n * @param {number} at\n * @param {number} remove\n * @param {Array<Event>} add\n * @returns {undefined}\n */\nfunction addImplementation(editMap, at, remove, add) {\n  let index = 0;\n\n  /* c8 ignore next 3 -- `resolve` is never called without tables, so without edits. */\n  if (remove === 0 && add.length === 0) {\n    return;\n  }\n  while (index < editMap.map.length) {\n    if (editMap.map[index][0] === at) {\n      editMap.map[index][1] += remove;\n\n      // To do: before not used by tables, use when moving to micromark.\n      // if (before) {\n      //   add.push(...editMap.map[index][2])\n      //   editMap.map[index][2] = add\n      // } else {\n      editMap.map[index][2].push(...add);\n      // }\n\n      return;\n    }\n    index += 1;\n  }\n  editMap.map.push([at, remove, add]);\n}\n\n// /**\n//  * Shift `previous` and `next` links according to `jumps`.\n//  *\n//  * This fixes links in case there are events removed or added between them.\n//  *\n//  * @param {Array<Event>} events\n//  * @param {Array<Jump>} jumps\n//  */\n// function shiftLinks(events, jumps) {\n//   let jumpIndex = 0\n//   let index = 0\n//   let add = 0\n//   let rm = 0\n\n//   while (index < events.length) {\n//     const rmCurr = rm\n\n//     while (jumpIndex < jumps.length && jumps[jumpIndex][0] <= index) {\n//       add = jumps[jumpIndex][2]\n//       rm = jumps[jumpIndex][1]\n//       jumpIndex += 1\n//     }\n\n//     // Ignore items that will be removed.\n//     if (rm > rmCurr) {\n//       index += rm - rmCurr\n//     } else {\n//       // ?\n//       // if let Some(link) = &events[index].link {\n//       //     if let Some(next) = link.next {\n//       //         events[next].link.as_mut().unwrap().previous = Some(index + add - rm);\n//       //         while jumpIndex < jumps.len() && jumps[jumpIndex].0 <= next {\n//       //             add = jumps[jumpIndex].2;\n//       //             rm = jumps[jumpIndex].1;\n//       //             jumpIndex += 1;\n//       //         }\n//       //         events[index].link.as_mut().unwrap().next = Some(next + add - rm);\n//       //         index = next;\n//       //         continue;\n//       //     }\n//       // }\n//       index += 1\n//     }\n//   }\n// }", "/**\n * @import {Event} from 'micromark-util-types'\n */\n\n/**\n * @typedef {'center' | 'left' | 'none' | 'right'} Align\n */\n\n/**\n * Figure out the alignment of a GFM table.\n *\n * @param {Readonly<Array<Event>>} events\n *   List of events.\n * @param {number} index\n *   Table enter event.\n * @returns {Array<Align>}\n *   List of aligns.\n */\nexport function gfmTableAlign(events, index) {\n  let inDelimiterRow = false;\n  /** @type {Array<Align>} */\n  const align = [];\n  while (index < events.length) {\n    const event = events[index];\n    if (inDelimiterRow) {\n      if (event[0] === 'enter') {\n        // Start of alignment value: set a new column.\n        // To do: `markdown-rs` uses `tableDelimiterCellValue`.\n        if (event[1].type === 'tableContent') {\n          align.push(events[index + 1][1].type === 'tableDelimiterMarker' ? 'left' : 'none');\n        }\n      }\n      // Exits:\n      // End of alignment value: change the column.\n      // To do: `markdown-rs` uses `tableDelimiterCellValue`.\n      else if (event[1].type === 'tableContent') {\n        if (events[index - 1][1].type === 'tableDelimiterMarker') {\n          const alignIndex = align.length - 1;\n          align[alignIndex] = align[alignIndex] === 'left' ? 'center' : 'right';\n        }\n      }\n      // Done!\n      else if (event[1].type === 'tableDelimiterRow') {\n        break;\n      }\n    } else if (event[0] === 'enter' && event[1].type === 'tableDelimiterRow') {\n      inDelimiterRow = true;\n    }\n    index += 1;\n  }\n  return align;\n}", "/**\n * @import {Event, Extension, Point, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\n/**\n * @typedef {[number, number, number, number]} Range\n *   Cell info.\n *\n * @typedef {0 | 1 | 2 | 3} RowKind\n *   Where we are: `1` for head row, `2` for delimiter row, `3` for body row.\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nimport { EditMap } from './edit-map.js';\nimport { gfmTableAlign } from './infer.js';\n\n/**\n * Create an HTML extension for `micromark` to support GitHub tables syntax.\n *\n * @returns {Extension}\n *   Extension for `micromark` that can be passed in `extensions` to enable GFM\n *   table syntax.\n */\nexport function gfmTable() {\n  return {\n    flow: {\n      null: {\n        name: 'table',\n        tokenize: tokenizeTable,\n        resolveAll: resolveTable\n      }\n    }\n  };\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTable(effects, ok, nok) {\n  const self = this;\n  let size = 0;\n  let sizeB = 0;\n  /** @type {boolean | undefined} */\n  let seen;\n  return start;\n\n  /**\n   * Start of a GFM table.\n   *\n   * If there is a valid table row or table head before, then we try to parse\n   * another row.\n   * Otherwise, we try to parse a head.\n   *\n   * ```markdown\n   * > | | a |\n   *     ^\n   *   | | - |\n   * > | | b |\n   *     ^\n   * ```\n   * @type {State}\n   */\n  function start(code) {\n    let index = self.events.length - 1;\n    while (index > -1) {\n      const type = self.events[index][1].type;\n      if (type === \"lineEnding\" ||\n      // Note: markdown-rs uses `whitespace` instead of `linePrefix`\n      type === \"linePrefix\") index--;else break;\n    }\n    const tail = index > -1 ? self.events[index][1].type : null;\n    const next = tail === 'tableHead' || tail === 'tableRow' ? bodyRowStart : headRowBefore;\n\n    // Don\u2019t allow lazy body rows.\n    if (next === bodyRowStart && self.parser.lazy[self.now().line]) {\n      return nok(code);\n    }\n    return next(code);\n  }\n\n  /**\n   * Before table head row.\n   *\n   * ```markdown\n   * > | | a |\n   *     ^\n   *   | | - |\n   *   | | b |\n   * ```\n   *\n   * @type {State}\n   */\n  function headRowBefore(code) {\n    effects.enter('tableHead');\n    effects.enter('tableRow');\n    return headRowStart(code);\n  }\n\n  /**\n   * Before table head row, after whitespace.\n   *\n   * ```markdown\n   * > | | a |\n   *     ^\n   *   | | - |\n   *   | | b |\n   * ```\n   *\n   * @type {State}\n   */\n  function headRowStart(code) {\n    if (code === 124) {\n      return headRowBreak(code);\n    }\n\n    // To do: micromark-js should let us parse our own whitespace in extensions,\n    // like `markdown-rs`:\n    //\n    // ```js\n    // // 4+ spaces.\n    // if (markdownSpace(code)) {\n    //   return nok(code)\n    // }\n    // ```\n\n    seen = true;\n    // Count the first character, that isn\u2019t a pipe, double.\n    sizeB += 1;\n    return headRowBreak(code);\n  }\n\n  /**\n   * At break in table head row.\n   *\n   * ```markdown\n   * > | | a |\n   *     ^\n   *       ^\n   *         ^\n   *   | | - |\n   *   | | b |\n   * ```\n   *\n   * @type {State}\n   */\n  function headRowBreak(code) {\n    if (code === null) {\n      // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don\u2018t.\n      return nok(code);\n    }\n    if (markdownLineEnding(code)) {\n      // If anything other than one pipe (ignoring whitespace) was used, it\u2019s fine.\n      if (sizeB > 1) {\n        sizeB = 0;\n        // To do: check if this works.\n        // Feel free to interrupt:\n        self.interrupt = true;\n        effects.exit('tableRow');\n        effects.enter(\"lineEnding\");\n        effects.consume(code);\n        effects.exit(\"lineEnding\");\n        return headDelimiterStart;\n      }\n\n      // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don\u2018t.\n      return nok(code);\n    }\n    if (markdownSpace(code)) {\n      // To do: check if this is fine.\n      // effects.attempt(State::Next(StateName::GfmTableHeadRowBreak), State::Nok)\n      // State::Retry(space_or_tab(tokenizer))\n      return factorySpace(effects, headRowBreak, \"whitespace\")(code);\n    }\n    sizeB += 1;\n    if (seen) {\n      seen = false;\n      // Header cell count.\n      size += 1;\n    }\n    if (code === 124) {\n      effects.enter('tableCellDivider');\n      effects.consume(code);\n      effects.exit('tableCellDivider');\n      // Whether a delimiter was seen.\n      seen = true;\n      return headRowBreak;\n    }\n\n    // Anything else is cell data.\n    effects.enter(\"data\");\n    return headRowData(code);\n  }\n\n  /**\n   * In table head row data.\n   *\n   * ```markdown\n   * > | | a |\n   *       ^\n   *   | | - |\n   *   | | b |\n   * ```\n   *\n   * @type {State}\n   */\n  function headRowData(code) {\n    if (code === null || code === 124 || markdownLineEndingOrSpace(code)) {\n      effects.exit(\"data\");\n      return headRowBreak(code);\n    }\n    effects.consume(code);\n    return code === 92 ? headRowEscape : headRowData;\n  }\n\n  /**\n   * In table head row escape.\n   *\n   * ```markdown\n   * > | | a\\-b |\n   *         ^\n   *   | | ---- |\n   *   | | c    |\n   * ```\n   *\n   * @type {State}\n   */\n  function headRowEscape(code) {\n    if (code === 92 || code === 124) {\n      effects.consume(code);\n      return headRowData;\n    }\n    return headRowData(code);\n  }\n\n  /**\n   * Before delimiter row.\n   *\n   * ```markdown\n   *   | | a |\n   * > | | - |\n   *     ^\n   *   | | b |\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterStart(code) {\n    // Reset `interrupt`.\n    self.interrupt = false;\n\n    // Note: in `markdown-rs`, we need to handle piercing here too.\n    if (self.parser.lazy[self.now().line]) {\n      return nok(code);\n    }\n    effects.enter('tableDelimiterRow');\n    // Track if we\u2019ve seen a `:` or `|`.\n    seen = false;\n    if (markdownSpace(code)) {\n      return factorySpace(effects, headDelimiterBefore, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code);\n    }\n    return headDelimiterBefore(code);\n  }\n\n  /**\n   * Before delimiter row, after optional whitespace.\n   *\n   * Reused when a `|` is found later, to parse another cell.\n   *\n   * ```markdown\n   *   | | a |\n   * > | | - |\n   *     ^\n   *   | | b |\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterBefore(code) {\n    if (code === 45 || code === 58) {\n      return headDelimiterValueBefore(code);\n    }\n    if (code === 124) {\n      seen = true;\n      // If we start with a pipe, we open a cell marker.\n      effects.enter('tableCellDivider');\n      effects.consume(code);\n      effects.exit('tableCellDivider');\n      return headDelimiterCellBefore;\n    }\n\n    // More whitespace / empty row not allowed at start.\n    return headDelimiterNok(code);\n  }\n\n  /**\n   * After `|`, before delimiter cell.\n   *\n   * ```markdown\n   *   | | a |\n   * > | | - |\n   *      ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterCellBefore(code) {\n    if (markdownSpace(code)) {\n      return factorySpace(effects, headDelimiterValueBefore, \"whitespace\")(code);\n    }\n    return headDelimiterValueBefore(code);\n  }\n\n  /**\n   * Before delimiter cell value.\n   *\n   * ```markdown\n   *   | | a |\n   * > | | - |\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterValueBefore(code) {\n    // Align: left.\n    if (code === 58) {\n      sizeB += 1;\n      seen = true;\n      effects.enter('tableDelimiterMarker');\n      effects.consume(code);\n      effects.exit('tableDelimiterMarker');\n      return headDelimiterLeftAlignmentAfter;\n    }\n\n    // Align: none.\n    if (code === 45) {\n      sizeB += 1;\n      // To do: seems weird that this *isn\u2019t* left aligned, but that state is used?\n      return headDelimiterLeftAlignmentAfter(code);\n    }\n    if (code === null || markdownLineEnding(code)) {\n      return headDelimiterCellAfter(code);\n    }\n    return headDelimiterNok(code);\n  }\n\n  /**\n   * After delimiter cell left alignment marker.\n   *\n   * ```markdown\n   *   | | a  |\n   * > | | :- |\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterLeftAlignmentAfter(code) {\n    if (code === 45) {\n      effects.enter('tableDelimiterFiller');\n      return headDelimiterFiller(code);\n    }\n\n    // Anything else is not ok after the left-align colon.\n    return headDelimiterNok(code);\n  }\n\n  /**\n   * In delimiter cell filler.\n   *\n   * ```markdown\n   *   | | a |\n   * > | | - |\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterFiller(code) {\n    if (code === 45) {\n      effects.consume(code);\n      return headDelimiterFiller;\n    }\n\n    // Align is `center` if it was `left`, `right` otherwise.\n    if (code === 58) {\n      seen = true;\n      effects.exit('tableDelimiterFiller');\n      effects.enter('tableDelimiterMarker');\n      effects.consume(code);\n      effects.exit('tableDelimiterMarker');\n      return headDelimiterRightAlignmentAfter;\n    }\n    effects.exit('tableDelimiterFiller');\n    return headDelimiterRightAlignmentAfter(code);\n  }\n\n  /**\n   * After delimiter cell right alignment marker.\n   *\n   * ```markdown\n   *   | |  a |\n   * > | | -: |\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterRightAlignmentAfter(code) {\n    if (markdownSpace(code)) {\n      return factorySpace(effects, headDelimiterCellAfter, \"whitespace\")(code);\n    }\n    return headDelimiterCellAfter(code);\n  }\n\n  /**\n   * After delimiter cell.\n   *\n   * ```markdown\n   *   | |  a |\n   * > | | -: |\n   *          ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterCellAfter(code) {\n    if (code === 124) {\n      return headDelimiterBefore(code);\n    }\n    if (code === null || markdownLineEnding(code)) {\n      // Exit when:\n      // * there was no `:` or `|` at all (it\u2019s a thematic break or setext\n      //   underline instead)\n      // * the header cell count is not the delimiter cell count\n      if (!seen || size !== sizeB) {\n        return headDelimiterNok(code);\n      }\n\n      // Note: in markdown-rs`, a reset is needed here.\n      effects.exit('tableDelimiterRow');\n      effects.exit('tableHead');\n      // To do: in `markdown-rs`, resolvers need to be registered manually.\n      // effects.register_resolver(ResolveName::GfmTable)\n      return ok(code);\n    }\n    return headDelimiterNok(code);\n  }\n\n  /**\n   * In delimiter row, at a disallowed byte.\n   *\n   * ```markdown\n   *   | | a |\n   * > | | x |\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function headDelimiterNok(code) {\n    // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don\u2018t.\n    return nok(code);\n  }\n\n  /**\n   * Before table body row.\n   *\n   * ```markdown\n   *   | | a |\n   *   | | - |\n   * > | | b |\n   *     ^\n   * ```\n   *\n   * @type {State}\n   */\n  function bodyRowStart(code) {\n    // Note: in `markdown-rs` we need to manually take care of a prefix,\n    // but in `micromark-js` that is done for us, so if we\u2019re here, we\u2019re\n    // never at whitespace.\n    effects.enter('tableRow');\n    return bodyRowBreak(code);\n  }\n\n  /**\n   * At break in table body row.\n   *\n   * ```markdown\n   *   | | a |\n   *   | | - |\n   * > | | b |\n   *     ^\n   *       ^\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function bodyRowBreak(code) {\n    if (code === 124) {\n      effects.enter('tableCellDivider');\n      effects.consume(code);\n      effects.exit('tableCellDivider');\n      return bodyRowBreak;\n    }\n    if (code === null || markdownLineEnding(code)) {\n      effects.exit('tableRow');\n      return ok(code);\n    }\n    if (markdownSpace(code)) {\n      return factorySpace(effects, bodyRowBreak, \"whitespace\")(code);\n    }\n\n    // Anything else is cell content.\n    effects.enter(\"data\");\n    return bodyRowData(code);\n  }\n\n  /**\n   * In table body row data.\n   *\n   * ```markdown\n   *   | | a |\n   *   | | - |\n   * > | | b |\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function bodyRowData(code) {\n    if (code === null || code === 124 || markdownLineEndingOrSpace(code)) {\n      effects.exit(\"data\");\n      return bodyRowBreak(code);\n    }\n    effects.consume(code);\n    return code === 92 ? bodyRowEscape : bodyRowData;\n  }\n\n  /**\n   * In table body row escape.\n   *\n   * ```markdown\n   *   | | a    |\n   *   | | ---- |\n   * > | | b\\-c |\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function bodyRowEscape(code) {\n    if (code === 92 || code === 124) {\n      effects.consume(code);\n      return bodyRowData;\n    }\n    return bodyRowData(code);\n  }\n}\n\n/** @type {Resolver} */\n\nfunction resolveTable(events, context) {\n  let index = -1;\n  let inFirstCellAwaitingPipe = true;\n  /** @type {RowKind} */\n  let rowKind = 0;\n  /** @type {Range} */\n  let lastCell = [0, 0, 0, 0];\n  /** @type {Range} */\n  let cell = [0, 0, 0, 0];\n  let afterHeadAwaitingFirstBodyRow = false;\n  let lastTableEnd = 0;\n  /** @type {Token | undefined} */\n  let currentTable;\n  /** @type {Token | undefined} */\n  let currentBody;\n  /** @type {Token | undefined} */\n  let currentCell;\n  const map = new EditMap();\n  while (++index < events.length) {\n    const event = events[index];\n    const token = event[1];\n    if (event[0] === 'enter') {\n      // Start of head.\n      if (token.type === 'tableHead') {\n        afterHeadAwaitingFirstBodyRow = false;\n\n        // Inject previous (body end and) table end.\n        if (lastTableEnd !== 0) {\n          flushTableEnd(map, context, lastTableEnd, currentTable, currentBody);\n          currentBody = undefined;\n          lastTableEnd = 0;\n        }\n\n        // Inject table start.\n        currentTable = {\n          type: 'table',\n          start: Object.assign({}, token.start),\n          // Note: correct end is set later.\n          end: Object.assign({}, token.end)\n        };\n        map.add(index, 0, [['enter', currentTable, context]]);\n      } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') {\n        inFirstCellAwaitingPipe = true;\n        currentCell = undefined;\n        lastCell = [0, 0, 0, 0];\n        cell = [0, index + 1, 0, 0];\n\n        // Inject table body start.\n        if (afterHeadAwaitingFirstBodyRow) {\n          afterHeadAwaitingFirstBodyRow = false;\n          currentBody = {\n            type: 'tableBody',\n            start: Object.assign({}, token.start),\n            // Note: correct end is set later.\n            end: Object.assign({}, token.end)\n          };\n          map.add(index, 0, [['enter', currentBody, context]]);\n        }\n        rowKind = token.type === 'tableDelimiterRow' ? 2 : currentBody ? 3 : 1;\n      }\n      // Cell data.\n      else if (rowKind && (token.type === \"data\" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) {\n        inFirstCellAwaitingPipe = false;\n\n        // First value in cell.\n        if (cell[2] === 0) {\n          if (lastCell[1] !== 0) {\n            cell[0] = cell[1];\n            currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell);\n            lastCell = [0, 0, 0, 0];\n          }\n          cell[2] = index;\n        }\n      } else if (token.type === 'tableCellDivider') {\n        if (inFirstCellAwaitingPipe) {\n          inFirstCellAwaitingPipe = false;\n        } else {\n          if (lastCell[1] !== 0) {\n            cell[0] = cell[1];\n            currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell);\n          }\n          lastCell = cell;\n          cell = [lastCell[1], index, 0, 0];\n        }\n      }\n    }\n    // Exit events.\n    else if (token.type === 'tableHead') {\n      afterHeadAwaitingFirstBodyRow = true;\n      lastTableEnd = index;\n    } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') {\n      lastTableEnd = index;\n      if (lastCell[1] !== 0) {\n        cell[0] = cell[1];\n        currentCell = flushCell(map, context, lastCell, rowKind, index, currentCell);\n      } else if (cell[1] !== 0) {\n        currentCell = flushCell(map, context, cell, rowKind, index, currentCell);\n      }\n      rowKind = 0;\n    } else if (rowKind && (token.type === \"data\" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) {\n      cell[3] = index;\n    }\n  }\n  if (lastTableEnd !== 0) {\n    flushTableEnd(map, context, lastTableEnd, currentTable, currentBody);\n  }\n  map.consume(context.events);\n\n  // To do: move this into `html`, when events are exposed there.\n  // That\u2019s what `markdown-rs` does.\n  // That needs updates to `mdast-util-gfm-table`.\n  index = -1;\n  while (++index < context.events.length) {\n    const event = context.events[index];\n    if (event[0] === 'enter' && event[1].type === 'table') {\n      event[1]._align = gfmTableAlign(context.events, index);\n    }\n  }\n  return events;\n}\n\n/**\n * Generate a cell.\n *\n * @param {EditMap} map\n * @param {Readonly<TokenizeContext>} context\n * @param {Readonly<Range>} range\n * @param {RowKind} rowKind\n * @param {number | undefined} rowEnd\n * @param {Token | undefined} previousCell\n * @returns {Token | undefined}\n */\n// eslint-disable-next-line max-params\nfunction flushCell(map, context, range, rowKind, rowEnd, previousCell) {\n  // `markdown-rs` uses:\n  // rowKind === 2 ? 'tableDelimiterCell' : 'tableCell'\n  const groupName = rowKind === 1 ? 'tableHeader' : rowKind === 2 ? 'tableDelimiter' : 'tableData';\n  // `markdown-rs` uses:\n  // rowKind === 2 ? 'tableDelimiterCellValue' : 'tableCellText'\n  const valueName = 'tableContent';\n\n  // Insert an exit for the previous cell, if there is one.\n  //\n  // ```markdown\n  // > | | aa | bb | cc |\n  //          ^-- exit\n  //           ^^^^-- this cell\n  // ```\n  if (range[0] !== 0) {\n    previousCell.end = Object.assign({}, getPoint(context.events, range[0]));\n    map.add(range[0], 0, [['exit', previousCell, context]]);\n  }\n\n  // Insert enter of this cell.\n  //\n  // ```markdown\n  // > | | aa | bb | cc |\n  //           ^-- enter\n  //           ^^^^-- this cell\n  // ```\n  const now = getPoint(context.events, range[1]);\n  previousCell = {\n    type: groupName,\n    start: Object.assign({}, now),\n    // Note: correct end is set later.\n    end: Object.assign({}, now)\n  };\n  map.add(range[1], 0, [['enter', previousCell, context]]);\n\n  // Insert text start at first data start and end at last data end, and\n  // remove events between.\n  //\n  // ```markdown\n  // > | | aa | bb | cc |\n  //            ^-- enter\n  //             ^-- exit\n  //           ^^^^-- this cell\n  // ```\n  if (range[2] !== 0) {\n    const relatedStart = getPoint(context.events, range[2]);\n    const relatedEnd = getPoint(context.events, range[3]);\n    /** @type {Token} */\n    const valueToken = {\n      type: valueName,\n      start: Object.assign({}, relatedStart),\n      end: Object.assign({}, relatedEnd)\n    };\n    map.add(range[2], 0, [['enter', valueToken, context]]);\n    if (rowKind !== 2) {\n      // Fix positional info on remaining events\n      const start = context.events[range[2]];\n      const end = context.events[range[3]];\n      start[1].end = Object.assign({}, end[1].end);\n      start[1].type = \"chunkText\";\n      start[1].contentType = \"text\";\n\n      // Remove if needed.\n      if (range[3] > range[2] + 1) {\n        const a = range[2] + 1;\n        const b = range[3] - range[2] - 1;\n        map.add(a, b, []);\n      }\n    }\n    map.add(range[3] + 1, 0, [['exit', valueToken, context]]);\n  }\n\n  // Insert an exit for the last cell, if at the row end.\n  //\n  // ```markdown\n  // > | | aa | bb | cc |\n  //                    ^-- exit\n  //               ^^^^^^-- this cell (the last one contains two \u201Cbetween\u201D parts)\n  // ```\n  if (rowEnd !== undefined) {\n    previousCell.end = Object.assign({}, getPoint(context.events, rowEnd));\n    map.add(rowEnd, 0, [['exit', previousCell, context]]);\n    previousCell = undefined;\n  }\n  return previousCell;\n}\n\n/**\n * Generate table end (and table body end).\n *\n * @param {Readonly<EditMap>} map\n * @param {Readonly<TokenizeContext>} context\n * @param {number} index\n * @param {Token} table\n * @param {Token | undefined} tableBody\n */\n// eslint-disable-next-line max-params\nfunction flushTableEnd(map, context, index, table, tableBody) {\n  /** @type {Array<Event>} */\n  const exits = [];\n  const related = getPoint(context.events, index);\n  if (tableBody) {\n    tableBody.end = Object.assign({}, related);\n    exits.push(['exit', tableBody, context]);\n  }\n  table.end = Object.assign({}, related);\n  exits.push(['exit', table, context]);\n  map.add(index + 1, 0, exits);\n}\n\n/**\n * @param {Readonly<Array<Event>>} events\n * @param {number} index\n * @returns {Readonly<Point>}\n */\nfunction getPoint(events, index) {\n  const event = events[index];\n  const side = event[0] === 'enter' ? 'start' : 'end';\n  return event[1][side];\n}", "/**\n * @import {Extension, State, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nconst tasklistCheck = {\n  name: 'tasklistCheck',\n  tokenize: tokenizeTasklistCheck\n};\n\n/**\n * Create an HTML extension for `micromark` to support GFM task list items\n * syntax.\n *\n * @returns {Extension}\n *   Extension for `micromark` that can be passed in `htmlExtensions` to\n *   support GFM task list items when serializing to HTML.\n */\nexport function gfmTaskListItem() {\n  return {\n    text: {\n      [91]: tasklistCheck\n    }\n  };\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTasklistCheck(effects, ok, nok) {\n  const self = this;\n  return open;\n\n  /**\n   * At start of task list item check.\n   *\n   * ```markdown\n   * > | * [x] y.\n   *       ^\n   * ```\n   *\n   * @type {State}\n   */\n  function open(code) {\n    if (\n    // Exit if there\u2019s stuff before.\n    self.previous !== null ||\n    // Exit if not in the first content that is the first child of a list\n    // item.\n    !self._gfmTasklistFirstContentOfListItem) {\n      return nok(code);\n    }\n    effects.enter('taskListCheck');\n    effects.enter('taskListCheckMarker');\n    effects.consume(code);\n    effects.exit('taskListCheckMarker');\n    return inside;\n  }\n\n  /**\n   * In task list item check.\n   *\n   * ```markdown\n   * > | * [x] y.\n   *        ^\n   * ```\n   *\n   * @type {State}\n   */\n  function inside(code) {\n    // Currently we match how GH works in files.\n    // To match how GH works in comments, use `markdownSpace` (`[\\t ]`) instead\n    // of `markdownLineEndingOrSpace` (`[\\t\\n\\r ]`).\n    if (markdownLineEndingOrSpace(code)) {\n      effects.enter('taskListCheckValueUnchecked');\n      effects.consume(code);\n      effects.exit('taskListCheckValueUnchecked');\n      return close;\n    }\n    if (code === 88 || code === 120) {\n      effects.enter('taskListCheckValueChecked');\n      effects.consume(code);\n      effects.exit('taskListCheckValueChecked');\n      return close;\n    }\n    return nok(code);\n  }\n\n  /**\n   * At close of task list item check.\n   *\n   * ```markdown\n   * > | * [x] y.\n   *         ^\n   * ```\n   *\n   * @type {State}\n   */\n  function close(code) {\n    if (code === 93) {\n      effects.enter('taskListCheckMarker');\n      effects.consume(code);\n      effects.exit('taskListCheckMarker');\n      effects.exit('taskListCheck');\n      return after;\n    }\n    return nok(code);\n  }\n\n  /**\n   * @type {State}\n   */\n  function after(code) {\n    // EOL in paragraph means there must be something else after it.\n    if (markdownLineEnding(code)) {\n      return ok(code);\n    }\n\n    // Space or tab?\n    // Check what comes after.\n    if (markdownSpace(code)) {\n      return effects.check({\n        tokenize: spaceThenNonSpace\n      }, ok, nok)(code);\n    }\n\n    // EOF, or non-whitespace, both wrong.\n    return nok(code);\n  }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction spaceThenNonSpace(effects, ok, nok) {\n  return factorySpace(effects, after, \"whitespace\");\n\n  /**\n   * After whitespace, after task list item check.\n   *\n   * ```markdown\n   * > | * [x] y.\n   *           ^\n   * ```\n   *\n   * @type {State}\n   */\n  function after(code) {\n    // EOF means there was nothing, so bad.\n    // EOL means there\u2019s content after it, so good.\n    // Impossible to have more spaces.\n    // Anything else is good.\n    return code === null ? nok(code) : ok(code);\n  }\n}", "/**\n * @typedef {import('micromark-extension-gfm-footnote').HtmlOptions} HtmlOptions\n * @typedef {import('micromark-extension-gfm-strikethrough').Options} Options\n * @typedef {import('micromark-util-types').Extension} Extension\n * @typedef {import('micromark-util-types').HtmlExtension} HtmlExtension\n */\n\nimport {\n  combineExtensions,\n  combineHtmlExtensions\n} from 'micromark-util-combine-extensions'\nimport {\n  gfmAutolinkLiteral,\n  gfmAutolinkLiteralHtml\n} from 'micromark-extension-gfm-autolink-literal'\nimport {gfmFootnote, gfmFootnoteHtml} from 'micromark-extension-gfm-footnote'\nimport {\n  gfmStrikethrough,\n  gfmStrikethroughHtml\n} from 'micromark-extension-gfm-strikethrough'\nimport {gfmTable, gfmTableHtml} from 'micromark-extension-gfm-table'\nimport {gfmTagfilterHtml} from 'micromark-extension-gfm-tagfilter'\nimport {\n  gfmTaskListItem,\n  gfmTaskListItemHtml\n} from 'micromark-extension-gfm-task-list-item'\n\n/**\n * Create an extension for `micromark` to enable GFM syntax.\n *\n * @param {Options | null | undefined} [options]\n *   Configuration (optional).\n *\n *   Passed to `micromark-extens-gfm-strikethrough`.\n * @returns {Extension}\n *   Extension for `micromark` that can be passed in `extensions` to enable GFM\n *   syntax.\n */\nexport function gfm(options) {\n  return combineExtensions([\n    gfmAutolinkLiteral(),\n    gfmFootnote(),\n    gfmStrikethrough(options),\n    gfmTable(),\n    gfmTaskListItem()\n  ])\n}\n\n/**\n * Create an extension for `micromark` to support GFM when serializing to HTML.\n *\n * @param {HtmlOptions | null | undefined} [options]\n *   Configuration (optional).\n *\n *   Passed to `micromark-extens-gfm-footnote`.\n * @returns {HtmlExtension}\n *   Extension for `micromark` that can be passed in `htmlExtensions` to\n *   support GFM when serializing to HTML.\n */\nexport function gfmHtml(options) {\n  return combineHtmlExtensions([\n    gfmAutolinkLiteralHtml(),\n    gfmFootnoteHtml(options),\n    gfmStrikethroughHtml(),\n    gfmTableHtml(),\n    gfmTagfilterHtml(),\n    gfmTaskListItemHtml()\n  ])\n}\n", "/**\n * @import {Root} from 'mdast'\n * @import {Options} from 'remark-gfm'\n * @import {} from 'remark-parse'\n * @import {} from 'remark-stringify'\n * @import {Processor} from 'unified'\n */\n\nimport {gfmFromMarkdown, gfmToMarkdown} from 'mdast-util-gfm'\nimport {gfm} from 'micromark-extension-gfm'\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Add support GFM (autolink literals, footnotes, strikethrough, tables,\n * tasklists).\n *\n * @param {Options | null | undefined} [options]\n *   Configuration (optional).\n * @returns {undefined}\n *   Nothing.\n */\nexport default function remarkGfm(options) {\n  // @ts-expect-error: TS is wrong about `this`.\n  // eslint-disable-next-line unicorn/no-this-assignment\n  const self = /** @type {Processor<Root>} */ (this)\n  const settings = options || emptyOptions\n  const data = self.data()\n\n  const micromarkExtensions =\n    data.micromarkExtensions || (data.micromarkExtensions = [])\n  const fromMarkdownExtensions =\n    data.fromMarkdownExtensions || (data.fromMarkdownExtensions = [])\n  const toMarkdownExtensions =\n    data.toMarkdownExtensions || (data.toMarkdownExtensions = [])\n\n  micromarkExtensions.push(gfm(settings))\n  fromMarkdownExtensions.push(gfmFromMarkdown())\n  toMarkdownExtensions.push(gfmToMarkdown(settings))\n}\n", "import clsx from 'clsx';\nimport type { ComponentProps } from 'react';\nimport React from 'react';\n\nexport const Anchor = ({ children, href }: ComponentProps<'a'>) => {\n  const isEmail = href?.startsWith('mailto:');\n  const isUrl = href?.startsWith('http');\n\n  if (!href || (!isEmail && !isUrl)) return <>{children}</>;\n\n  return (\n    <a\n      className={clsx({ 'str-chat__message-url-link': isUrl })}\n      href={href}\n      rel='nofollow noreferrer noopener'\n      target='_blank'\n    >\n      {children}\n    </a>\n  );\n};\n", "import React from 'react';\nimport type { PropsWithChildrenOnly } from '../../../../types/types';\n\nexport const Emoji = ({ children }: PropsWithChildrenOnly) => (\n  <span className='inline-text-emoji' data-testid='inline-text-emoji'>\n    {children}\n  </span>\n);\n", "import type { PropsWithChildren } from 'react';\nimport React from 'react';\n\nimport type { UserResponse } from 'stream-chat';\n\nexport type MentionProps = PropsWithChildren<{\n  node: {\n    mentionedUser: UserResponse;\n  };\n}>;\n\nexport const Mention = ({ children, node: { mentionedUser } }: MentionProps) => (\n  <span className='str-chat__message-mention' data-user-id={mentionedUser.id}>\n    {children}\n  </span>\n);\n", "import React, { useCallback, useMemo } from 'react';\n\nimport {\n  useActionHandler,\n  useDeleteHandler,\n  useEditHandler,\n  useFlagHandler,\n  useMarkUnreadHandler,\n  useMentionsHandler,\n  useMuteHandler,\n  useOpenThreadHandler,\n  usePinHandler,\n  useReactionHandler,\n  useReactionsFetcher,\n  useRetryHandler,\n  useUserHandler,\n  useUserRole,\n} from './hooks';\nimport { areMessagePropsEqual, getMessageActions, MESSAGE_ACTIONS } from './utils';\n\nimport type { MessageContextValue } from '../../context';\nimport {\n  MessageProvider,\n  useChannelActionContext,\n  useChannelStateContext,\n  useChatContext,\n  useComponentContext,\n} from '../../context';\n\nimport { MessageSimple as DefaultMessage } from './MessageSimple';\n\nimport type { MessageProps } from './types';\n\ntype MessagePropsToOmit =\n  | 'onMentionsClick'\n  | 'onMentionsHover'\n  | 'openThread'\n  | 'retrySendMessage';\n\ntype MessageContextPropsToPick =\n  | 'handleAction'\n  | 'handleDelete'\n  | 'handleFetchReactions'\n  | 'handleFlag'\n  | 'handleMarkUnread'\n  | 'handleMute'\n  | 'handleOpenThread'\n  | 'handlePin'\n  | 'handleReaction'\n  | 'handleRetry'\n  | 'mutes'\n  | 'onMentionsClickMessage'\n  | 'onMentionsHoverMessage'\n  | 'reactionDetailsSort'\n  | 'sortReactions'\n  | 'sortReactionDetails';\n\ntype MessageWithContextProps = Omit<MessageProps, MessagePropsToOmit> &\n  Pick<MessageContextValue, MessageContextPropsToPick> & {\n    canPin: boolean;\n    userRoles: ReturnType<typeof useUserRole>;\n  };\n\nconst MessageWithContext = (props: MessageWithContextProps) => {\n  const {\n    canPin,\n    groupedByUser,\n    Message: propMessage,\n    message,\n    messageActions = Object.keys(MESSAGE_ACTIONS),\n    onUserClick: propOnUserClick,\n    onUserHover: propOnUserHover,\n    userRoles,\n  } = props;\n\n  const { client, isMessageAIGenerated } = useChatContext('Message');\n  const { channelConfig, read } = useChannelStateContext('Message');\n  const { Message: contextMessage } = useComponentContext('Message');\n\n  const actionsEnabled = message.type === 'regular' && message.status === 'received';\n  const MessageUIComponent = propMessage ?? contextMessage ?? DefaultMessage;\n\n  const { clearEdit, editing, setEdit } = useEditHandler();\n\n  const { onUserClick, onUserHover } = useUserHandler(message, {\n    onUserClickHandler: propOnUserClick,\n    onUserHoverHandler: propOnUserHover,\n  });\n\n  const {\n    canDelete,\n    canEdit,\n    canFlag,\n    canMarkUnread,\n    canMute,\n    canQuote,\n    canReact,\n    canReply,\n    isMyMessage,\n  } = userRoles;\n\n  const messageIsUnread = useMemo(\n    () =>\n      !!(\n        !isMyMessage &&\n        client.user?.id &&\n        read &&\n        (!read[client.user.id] ||\n          (message?.created_at &&\n            new Date(message.created_at).getTime() >\n              read[client.user.id].last_read.getTime()))\n      ),\n    [client, isMyMessage, message.created_at, read],\n  );\n\n  const messageActionsHandler = useCallback(\n    () =>\n      getMessageActions(\n        messageActions,\n        {\n          canDelete,\n          canEdit,\n          canFlag,\n          canMarkUnread,\n          canMute,\n          canPin,\n          canQuote,\n          canReact,\n          canReply,\n        },\n        channelConfig,\n      ),\n\n    [\n      messageActions,\n      canDelete,\n      canEdit,\n      canFlag,\n      canMarkUnread,\n      canMute,\n      canPin,\n      canQuote,\n      canReact,\n      canReply,\n      channelConfig,\n    ],\n  );\n\n  const {\n    canPin: canPinPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n    messageActions: messageActionsPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n    onlySenderCanEdit: onlySenderCanEditPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n    onUserClick: onUserClickPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n    onUserHover: onUserHoverPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n    userRoles: userRolesPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n    ...rest\n  } = props;\n\n  const messageContextValue: MessageContextValue = {\n    ...rest,\n    actionsEnabled,\n    clearEditingState: clearEdit,\n    editing,\n    getMessageActions: messageActionsHandler,\n    handleEdit: setEdit,\n    isMessageAIGenerated,\n    isMyMessage: () => isMyMessage,\n    messageIsUnread,\n    onUserClick,\n    onUserHover,\n    setEditingState: setEdit,\n  };\n\n  return (\n    <MessageProvider value={messageContextValue}>\n      <MessageUIComponent groupedByUser={groupedByUser} />\n      {/* TODO - remove prop in next major release, maintains VML backwards compatibility */}\n    </MessageProvider>\n  );\n};\n\nconst MemoizedMessage = React.memo(\n  MessageWithContext,\n  areMessagePropsEqual,\n) as typeof MessageWithContext;\n\n/**\n * The Message component is a context provider which implements all the logic required for rendering\n * an individual message. The actual UI of the message is delegated via the Message prop on Channel.\n */\nexport const Message = (props: MessageProps) => {\n  const {\n    closeReactionSelectorOnClick,\n    disableQuotedMessages,\n    getDeleteMessageErrorNotification,\n    getFetchReactionsErrorNotification,\n    getFlagMessageErrorNotification,\n    getFlagMessageSuccessNotification,\n    getMarkMessageUnreadErrorNotification,\n    getMarkMessageUnreadSuccessNotification,\n    getMuteUserErrorNotification,\n    getMuteUserSuccessNotification,\n    getPinMessageErrorNotification,\n    message,\n    onlySenderCanEdit = false,\n    onMentionsClick: propOnMentionsClick,\n    onMentionsHover: propOnMentionsHover,\n    openThread: propOpenThread,\n    pinPermissions,\n    reactionDetailsSort,\n    retrySendMessage: propRetrySendMessage,\n    sortReactionDetails,\n    sortReactions,\n  } = props;\n\n  const { addNotification } = useChannelActionContext('Message');\n  const { highlightedMessageId, mutes } = useChannelStateContext('Message');\n\n  const handleAction = useActionHandler(message);\n  const handleOpenThread = useOpenThreadHandler(message, propOpenThread);\n  const handleReaction = useReactionHandler(message);\n  const handleRetry = useRetryHandler(propRetrySendMessage);\n  const userRoles = useUserRole(message, onlySenderCanEdit, disableQuotedMessages);\n\n  const handleFetchReactions = useReactionsFetcher(message, {\n    getErrorNotification: getFetchReactionsErrorNotification,\n    notify: addNotification,\n  });\n\n  const handleDelete = useDeleteHandler(message, {\n    getErrorNotification: getDeleteMessageErrorNotification,\n    notify: addNotification,\n  });\n\n  const handleFlag = useFlagHandler(message, {\n    getErrorNotification: getFlagMessageErrorNotification,\n    getSuccessNotification: getFlagMessageSuccessNotification,\n    notify: addNotification,\n  });\n\n  const handleMarkUnread = useMarkUnreadHandler(message, {\n    getErrorNotification: getMarkMessageUnreadErrorNotification,\n    getSuccessNotification: getMarkMessageUnreadSuccessNotification,\n    notify: addNotification,\n  });\n\n  const handleMute = useMuteHandler(message, {\n    getErrorNotification: getMuteUserErrorNotification,\n    getSuccessNotification: getMuteUserSuccessNotification,\n    notify: addNotification,\n  });\n\n  const { onMentionsClick, onMentionsHover } = useMentionsHandler(message, {\n    onMentionsClick: propOnMentionsClick,\n    onMentionsHover: propOnMentionsHover,\n  });\n\n  const { canPin, handlePin } = usePinHandler(message, pinPermissions, {\n    getErrorNotification: getPinMessageErrorNotification,\n    notify: addNotification,\n  });\n\n  const highlighted = highlightedMessageId === message.id;\n\n  return (\n    <MemoizedMessage\n      additionalMessageInputProps={props.additionalMessageInputProps}\n      autoscrollToBottom={props.autoscrollToBottom}\n      canPin={canPin}\n      closeReactionSelectorOnClick={closeReactionSelectorOnClick}\n      customMessageActions={props.customMessageActions}\n      deliveredTo={props.deliveredTo}\n      disableQuotedMessages={props.disableQuotedMessages}\n      endOfGroup={props.endOfGroup}\n      firstOfGroup={props.firstOfGroup}\n      formatDate={props.formatDate}\n      groupedByUser={props.groupedByUser}\n      groupStyles={props.groupStyles}\n      handleAction={handleAction}\n      handleDelete={handleDelete}\n      handleFetchReactions={handleFetchReactions}\n      handleFlag={handleFlag}\n      handleMarkUnread={handleMarkUnread}\n      handleMute={handleMute}\n      handleOpenThread={handleOpenThread}\n      handlePin={handlePin}\n      handleReaction={handleReaction}\n      handleRetry={handleRetry}\n      highlighted={highlighted}\n      initialMessage={props.initialMessage}\n      lastOwnMessage={props.lastOwnMessage}\n      lastReceivedId={props.lastReceivedId}\n      message={message}\n      Message={props.Message}\n      messageActions={props.messageActions}\n      messageListRect={props.messageListRect}\n      mutes={mutes}\n      onMentionsClickMessage={onMentionsClick}\n      onMentionsHoverMessage={onMentionsHover}\n      onUserClick={props.onUserClick}\n      onUserHover={props.onUserHover}\n      pinPermissions={props.pinPermissions}\n      reactionDetailsSort={reactionDetailsSort}\n      readBy={props.readBy}\n      renderText={props.renderText}\n      returnAllReadData={props.returnAllReadData}\n      sortReactionDetails={sortReactionDetails}\n      sortReactions={sortReactions}\n      threadList={props.threadList}\n      unsafeHTML={props.unsafeHTML}\n      userRoles={userRoles}\n    />\n  );\n};\n", "import React, { useMemo, useState } from 'react';\nimport clsx from 'clsx';\n\nimport { MessageErrorIcon } from './icons';\nimport { MessageBouncePrompt as DefaultMessageBouncePrompt } from '../MessageBounce';\nimport { MessageDeleted as DefaultMessageDeleted } from './MessageDeleted';\nimport { MessageBlocked as DefaultMessageBlocked } from './MessageBlocked';\nimport { MessageOptions as DefaultMessageOptions } from './MessageOptions';\nimport { MessageRepliesCountButton as DefaultMessageRepliesCountButton } from './MessageRepliesCountButton';\nimport { MessageStatus as DefaultMessageStatus } from './MessageStatus';\nimport { MessageText } from './MessageText';\nimport { MessageTimestamp as DefaultMessageTimestamp } from './MessageTimestamp';\nimport { StreamedMessageText as DefaultStreamedMessageText } from './StreamedMessageText';\nimport { isDateSeparatorMessage } from '../MessageList';\nimport { MessageIsThreadReplyInChannelButtonIndicator as DefaultMessageIsThreadReplyInChannelButtonIndicator } from './MessageIsThreadReplyInChannelButtonIndicator';\nimport { ReminderNotification as DefaultReminderNotification } from './ReminderNotification';\nimport { useMessageReminder } from './hooks';\nimport {\n  areMessageUIPropsEqual,\n  isMessageBlocked,\n  isMessageBounced,\n  isMessageEdited,\n  messageHasAttachments,\n  messageHasReactions,\n} from './utils';\n\nimport { Avatar as DefaultAvatar } from '../Avatar';\nimport { Attachment as DefaultAttachment } from '../Attachment';\nimport { EditMessageModal as DefaultEditMessageModal } from '../MessageInput';\nimport { Poll } from '../Poll';\nimport { ReactionsList as DefaultReactionList } from '../Reactions';\nimport { MessageBounceModal } from '../MessageBounce/MessageBounceModal';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport type { MessageContextValue } from '../../context/MessageContext';\nimport { useMessageContext } from '../../context/MessageContext';\n\nimport { useChatContext, useTranslationContext } from '../../context';\nimport { MessageEditedTimestamp } from './MessageEditedTimestamp';\n\nimport type { MessageUIComponentProps } from './types';\n\ntype MessageSimpleWithContextProps = MessageContextValue;\n\nconst MessageSimpleWithContext = (props: MessageSimpleWithContextProps) => {\n  const {\n    additionalMessageInputProps,\n    editing,\n    endOfGroup,\n    firstOfGroup,\n    groupedByUser,\n    handleAction,\n    handleOpenThread,\n    handleRetry,\n    highlighted,\n    isMessageAIGenerated,\n    isMyMessage,\n    message,\n    onUserClick,\n    onUserHover,\n    renderText,\n    threadList,\n  } = props;\n  const { client } = useChatContext('MessageSimple');\n  const { t } = useTranslationContext('MessageSimple');\n  const [isBounceDialogOpen, setIsBounceDialogOpen] = useState(false);\n  const [isEditedTimestampOpen, setEditedTimestampOpen] = useState(false);\n  const reminder = useMessageReminder(message.id);\n\n  const {\n    Attachment = DefaultAttachment,\n    Avatar = DefaultAvatar,\n    EditMessageModal = DefaultEditMessageModal,\n    MessageOptions = DefaultMessageOptions,\n    // TODO: remove this \"passthrough\" in the next\n    // major release and use the new default instead\n    MessageActions = MessageOptions,\n    MessageBlocked = DefaultMessageBlocked,\n    MessageBouncePrompt = DefaultMessageBouncePrompt,\n    MessageDeleted = DefaultMessageDeleted,\n    MessageIsThreadReplyInChannelButtonIndicator = DefaultMessageIsThreadReplyInChannelButtonIndicator,\n    MessageRepliesCountButton = DefaultMessageRepliesCountButton,\n    MessageStatus = DefaultMessageStatus,\n    MessageTimestamp = DefaultMessageTimestamp,\n    ReactionsList = DefaultReactionList,\n    ReminderNotification = DefaultReminderNotification,\n    StreamedMessageText = DefaultStreamedMessageText,\n    PinIndicator,\n  } = useComponentContext('MessageSimple');\n  const hasAttachment = messageHasAttachments(message);\n  const hasReactions = messageHasReactions(message);\n  const isAIGenerated = useMemo(\n    () => isMessageAIGenerated?.(message),\n    [isMessageAIGenerated, message],\n  );\n  const finalAttachments = useMemo(\n    () =>\n      !message.shared_location && !message.attachments\n        ? []\n        : !message.shared_location\n          ? message.attachments\n          : [message.shared_location, ...(message.attachments ?? [])],\n    [message],\n  );\n\n  if (isDateSeparatorMessage(message)) {\n    return null;\n  }\n\n  if (message.deleted_at || message.type === 'deleted') {\n    return <MessageDeleted message={message} />;\n  }\n\n  if (isMessageBlocked(message)) {\n    return <MessageBlocked />;\n  }\n\n  const showMetadata = !groupedByUser || endOfGroup;\n  const showReplyCountButton = !threadList && !!message.reply_count;\n  const showIsReplyInChannel =\n    !threadList && message.show_in_channel && message.parent_id;\n  const allowRetry = message.status === 'failed' && message.error?.status !== 403;\n  const isBounced = isMessageBounced(message);\n  const isEdited = isMessageEdited(message) && !isAIGenerated;\n\n  let handleClick: (() => void) | undefined = undefined;\n\n  if (allowRetry) {\n    handleClick = () => handleRetry(message);\n  } else if (isBounced) {\n    handleClick = () => setIsBounceDialogOpen(true);\n  } else if (isEdited) {\n    handleClick = () => setEditedTimestampOpen((prev) => !prev);\n  }\n\n  const rootClassName = clsx(\n    'str-chat__message str-chat__message-simple',\n    `str-chat__message--${message.type}`,\n    `str-chat__message--${message.status}`,\n    isMyMessage()\n      ? 'str-chat__message--me str-chat__message-simple--me'\n      : 'str-chat__message--other',\n    message.text ? 'str-chat__message--has-text' : 'has-no-text',\n    {\n      'str-chat__message--has-attachment': hasAttachment,\n      'str-chat__message--highlighted': highlighted,\n      'str-chat__message--pinned pinned-message': message.pinned,\n      'str-chat__message--with-reactions': hasReactions,\n      'str-chat__message-send-can-be-retried':\n        message?.status === 'failed' && message?.error?.status !== 403,\n      'str-chat__message-with-thread-link': showReplyCountButton || showIsReplyInChannel,\n      'str-chat__virtual-message__wrapper--end': endOfGroup,\n      'str-chat__virtual-message__wrapper--first': firstOfGroup,\n      'str-chat__virtual-message__wrapper--group': groupedByUser,\n    },\n  );\n\n  const poll = message.poll_id && client.polls.fromState(message.poll_id);\n\n  return (\n    <>\n      {editing && (\n        <EditMessageModal additionalMessageInputProps={additionalMessageInputProps} />\n      )}\n      {isBounceDialogOpen && (\n        <MessageBounceModal\n          MessageBouncePrompt={MessageBouncePrompt}\n          onClose={() => setIsBounceDialogOpen(false)}\n          open={isBounceDialogOpen}\n        />\n      )}\n      {\n        <div className={rootClassName} key={message.id}>\n          {PinIndicator && <PinIndicator />}\n          {!!reminder && <ReminderNotification reminder={reminder} />}\n          {message.user && (\n            <Avatar\n              image={message.user.image}\n              name={message.user.name || message.user.id}\n              onClick={onUserClick}\n              onMouseOver={onUserHover}\n              user={message.user}\n            />\n          )}\n          <div\n            className={clsx('str-chat__message-inner', {\n              'str-chat__simple-message--error-failed': allowRetry || isBounced,\n            })}\n            data-testid='message-inner'\n            onClick={handleClick}\n            onKeyUp={handleClick}\n          >\n            <MessageActions />\n            <div className='str-chat__message-reactions-host'>\n              {hasReactions && <ReactionsList reverse />}\n            </div>\n            <div className='str-chat__message-bubble'>\n              {poll && <Poll poll={poll} />}\n              {finalAttachments?.length && !message.quoted_message ? (\n                <Attachment actionHandler={handleAction} attachments={finalAttachments} />\n              ) : null}\n              {isAIGenerated ? (\n                <StreamedMessageText message={message} renderText={renderText} />\n              ) : (\n                <MessageText message={message} renderText={renderText} />\n              )}\n              <MessageErrorIcon />\n            </div>\n          </div>\n          {showReplyCountButton && (\n            <MessageRepliesCountButton\n              onClick={handleOpenThread}\n              reply_count={message.reply_count}\n            />\n          )}\n          {showIsReplyInChannel && <MessageIsThreadReplyInChannelButtonIndicator />}\n          {showMetadata && (\n            <div className='str-chat__message-metadata'>\n              <MessageStatus />\n              {!isMyMessage() && !!message.user && (\n                <span className='str-chat__message-simple-name'>\n                  {message.user.name || message.user.id}\n                </span>\n              )}\n              <MessageTimestamp customClass='str-chat__message-simple-timestamp' />\n              {isEdited && (\n                <span className='str-chat__mesage-simple-edited'>{t('Edited')}</span>\n              )}\n              {isEdited && (\n                <MessageEditedTimestamp calendar open={isEditedTimestampOpen} />\n              )}\n            </div>\n          )}\n        </div>\n      }\n    </>\n  );\n};\n\nconst MemoizedMessageSimple = React.memo(\n  MessageSimpleWithContext,\n  areMessageUIPropsEqual,\n) as typeof MessageSimpleWithContext;\n\n/**\n * The default UI component that renders a message and receives functionality and logic from the MessageContext.\n */\nexport const MessageSimple = (props: MessageUIComponentProps) => {\n  const messageContext = useMessageContext('MessageSimple');\n\n  return <MemoizedMessageSimple {...messageContext} {...props} />;\n};\n", "import type { ComponentType, PropsWithChildren } from 'react';\nimport React from 'react';\nimport type { ModalProps } from '../Modal';\nimport { Modal as DefaultModal } from '../Modal';\nimport { MessageBounceProvider, useComponentContext } from '../../context';\nimport type { MessageBouncePromptProps } from './MessageBouncePrompt';\n\nexport type MessageBounceModalProps = PropsWithChildren<\n  ModalProps & {\n    MessageBouncePrompt: ComponentType<MessageBouncePromptProps>;\n  }\n>;\n\nexport function MessageBounceModal({\n  MessageBouncePrompt,\n  ...modalProps\n}: MessageBounceModalProps) {\n  const { Modal = DefaultModal } = useComponentContext();\n  return (\n    <Modal className='str-chat__message-bounce-modal' {...modalProps}>\n      <MessageBounceProvider>\n        <MessageBouncePrompt onClose={modalProps.onClose} />\n      </MessageBounceProvider>\n    </Modal>\n  );\n}\n", "import React from 'react';\nimport { useMessageBounceContext, useTranslationContext } from '../../context';\n\nimport type { MouseEventHandler, PropsWithChildren } from 'react';\n\nimport type { ModalProps } from '../Modal';\n\nexport type MessageBouncePromptProps = PropsWithChildren<Pick<ModalProps, 'onClose'>>;\n\nexport function MessageBouncePrompt({ children, onClose }: MessageBouncePromptProps) {\n  const { handleDelete, handleEdit, handleRetry } =\n    useMessageBounceContext('MessageBouncePrompt');\n  const { t } = useTranslationContext('MessageBouncePrompt');\n\n  function createHandler(\n    handle: MouseEventHandler<HTMLButtonElement>,\n  ): MouseEventHandler<HTMLButtonElement> {\n    return (e) => {\n      handle(e);\n      onClose?.(e);\n    };\n  }\n\n  return (\n    <div className='str-chat__message-bounce-prompt' data-testid='message-bounce-prompt'>\n      <div className='str-chat__message-bounce-prompt-header'>\n        {children ?? t('This message did not meet our content guidelines')}\n      </div>\n      <div className='str-chat__message-bounce-actions'>\n        <button\n          className='str-chat__message-bounce-edit'\n          data-testid='message-bounce-edit'\n          onClick={createHandler(handleEdit)}\n          type='button'\n        >\n          {t('Edit Message')}\n        </button>\n        <button\n          className='str-chat__message-bounce-send'\n          data-testid='message-bounce-send'\n          onClick={createHandler(handleRetry)}\n        >\n          {t('Send Anyway')}\n        </button>\n        <button\n          className='str-chat__message-bounce-delete'\n          data-testid='message-bounce-delete'\n          onClick={createHandler(handleDelete)}\n        >\n          {t('Delete')}\n        </button>\n      </div>\n    </div>\n  );\n}\n", "import React from 'react';\nimport clsx from 'clsx';\n\nimport { useUserRole } from './hooks/useUserRole';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useMessageContext } from '../../context';\n\nexport const MessageBlocked = () => {\n  const { message } = useMessageContext();\n  const { t } = useTranslationContext('MessageBlocked');\n\n  const { isMyMessage } = useUserRole(message);\n\n  const messageClasses = clsx(\n    'str-chat__message str-chat__message-simple str-chat__message--blocked',\n    message.type,\n    {\n      'str-chat__message--me str-chat__message-simple--me': isMyMessage,\n      'str-chat__message--other': !isMyMessage,\n    },\n  );\n\n  return (\n    <div\n      className={messageClasses}\n      data-testid='message-blocked-component'\n      key={message.id}\n    >\n      <div className='str-chat__message--blocked-inner'>\n        {t('Message was blocked by moderation policies')}\n      </div>\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport React from 'react';\n\nimport {\n  ActionsIcon as DefaultActionsIcon,\n  ReactionIcon as DefaultReactionIcon,\n  ThreadIcon as DefaultThreadIcon,\n} from './icons';\nimport { MESSAGE_ACTIONS } from './utils';\nimport { MessageActions } from '../MessageActions';\nimport { useDialogIsOpen } from '../Dialog';\nimport { ReactionSelectorWithButton } from '../Reactions/ReactionSelectorWithButton';\n\nimport { useMessageContext, useTranslationContext } from '../../context';\n\nimport type { IconProps } from '../../types/types';\nimport type { MessageContextValue } from '../../context/MessageContext';\n\nexport type MessageOptionsProps = Partial<\n  Pick<MessageContextValue, 'handleOpenThread'>\n> & {\n  /* Custom component rendering the icon used in message actions button. This button invokes the message actions menu. */\n  ActionsIcon?: React.ComponentType<IconProps>;\n  /* If true, show the `ThreadIcon` and enable navigation into a `Thread` component. */\n  displayReplies?: boolean;\n  /* Custom component rendering the icon used in a button invoking reactions selector for a given message. */\n  ReactionIcon?: React.ComponentType<IconProps>;\n  /* Theme string to be added to CSS class names. */\n  theme?: string;\n  /* Custom component rendering the icon used in a message options button opening thread */\n  ThreadIcon?: React.ComponentType<IconProps>;\n};\n\nconst UnMemoizedMessageOptions = (props: MessageOptionsProps) => {\n  const {\n    ActionsIcon = DefaultActionsIcon,\n    displayReplies = true,\n    handleOpenThread: propHandleOpenThread,\n    ReactionIcon = DefaultReactionIcon,\n    theme = 'simple',\n    ThreadIcon = DefaultThreadIcon,\n  } = props;\n\n  const {\n    getMessageActions,\n    handleOpenThread: contextHandleOpenThread,\n    initialMessage,\n    message,\n    threadList,\n  } = useMessageContext('MessageOptions');\n\n  const { t } = useTranslationContext('MessageOptions');\n\n  // It is necessary to namespace the dialog IDs because a message with the same ID\n  // can appear in the main message list as well as in the thread message list.\n  // Without the namespace, the search for dialog would be performed by the message ID only\n  // which could return the dialog for a message in another message list (which would not be rendered).\n  const dialogIdNamespace = threadList ? '-thread-' : '';\n\n  const messageActionsDialogIsOpen = useDialogIsOpen(\n    `message-actions${dialogIdNamespace}--${message.id}`,\n  );\n  const reactionSelectorDialogIsOpen = useDialogIsOpen(\n    `reaction-selector${dialogIdNamespace}--${message.id}`,\n  );\n  const handleOpenThread = propHandleOpenThread || contextHandleOpenThread;\n\n  const messageActions = getMessageActions();\n\n  const shouldShowReactions = messageActions.indexOf(MESSAGE_ACTIONS.react) > -1;\n  const shouldShowReplies =\n    messageActions.indexOf(MESSAGE_ACTIONS.reply) > -1 && displayReplies && !threadList;\n\n  if (\n    !message.type ||\n    message.type === 'error' ||\n    message.type === 'system' ||\n    message.type === 'ephemeral' ||\n    message.status === 'failed' ||\n    message.status === 'sending' ||\n    initialMessage\n  ) {\n    return null;\n  }\n\n  return (\n    <div\n      className={clsx(`str-chat__message-${theme}__actions str-chat__message-options`, {\n        'str-chat__message-options--active':\n          messageActionsDialogIsOpen || reactionSelectorDialogIsOpen,\n      })}\n      data-testid='message-options'\n    >\n      <MessageActions ActionsIcon={ActionsIcon} />\n      {shouldShowReplies && (\n        <button\n          aria-label={t('aria/Open Thread')}\n          className={`str-chat__message-${theme}__actions__action str-chat__message-${theme}__actions__action--thread str-chat__message-reply-in-thread-button`}\n          data-testid='thread-action'\n          onClick={handleOpenThread}\n        >\n          <ThreadIcon className='str-chat__message-action-icon' />\n        </button>\n      )}\n      {shouldShowReactions && <ReactionSelectorWithButton ReactionIcon={ReactionIcon} />}\n    </div>\n  );\n};\n\nexport const MessageOptions = React.memo(\n  UnMemoizedMessageOptions,\n) as typeof UnMemoizedMessageOptions;\n", "import type { ElementRef } from 'react';\nimport React, { useRef } from 'react';\nimport { ReactionSelector as DefaultReactionSelector } from './ReactionSelector';\nimport { DialogAnchor, useDialogIsOpen, useDialogOnNearestManager } from '../Dialog';\nimport {\n  useComponentContext,\n  useMessageContext,\n  useTranslationContext,\n} from '../../context';\n\nimport type { IconProps } from '../../types/types';\n\ntype ReactionSelectorWithButtonProps = {\n  /* Custom component rendering the icon used in a button invoking reactions selector for a given message. */\n  ReactionIcon: React.ComponentType<IconProps>;\n};\n\n/**\n * Internal convenience component - not to be exported. It just groups the button and the dialog anchor and thus prevents\n * cluttering the parent component.\n */\nexport const ReactionSelectorWithButton = ({\n  ReactionIcon,\n}: ReactionSelectorWithButtonProps) => {\n  const { t } = useTranslationContext('ReactionSelectorWithButton');\n  const { isMyMessage, message, threadList } = useMessageContext('MessageOptions');\n  const { ReactionSelector = DefaultReactionSelector } =\n    useComponentContext('MessageOptions');\n  const buttonRef = useRef<ElementRef<'button'>>(null);\n  const dialogIdNamespace = threadList ? '-thread-' : '';\n  const dialogId = `reaction-selector${dialogIdNamespace}--${message.id}`;\n  const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId });\n  const dialogIsOpen = useDialogIsOpen(dialogId, dialogManager?.id);\n\n  return (\n    <>\n      <DialogAnchor\n        dialogManagerId={dialogManager?.id}\n        id={dialogId}\n        placement={isMyMessage() ? 'top-end' : 'top-start'}\n        referenceElement={buttonRef.current}\n        trapFocus\n      >\n        <ReactionSelector />\n      </DialogAnchor>\n      <button\n        aria-expanded={dialogIsOpen}\n        aria-label={t('aria/Open Reaction Selector')}\n        className='str-chat__message-reactions-button'\n        data-testid='message-reaction-action'\n        onClick={() => dialog?.toggle()}\n        ref={buttonRef}\n      >\n        <ReactionIcon className='str-chat__message-action-icon' />\n      </button>\n    </>\n  );\n};\n", "import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\n\nimport { Avatar as DefaultAvatar } from '../Avatar';\nimport { useDialog } from '../Dialog';\nimport { defaultReactionOptions } from './reactionOptions';\nimport { isMutableRef } from './utils/utils';\n\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { useMessageContext } from '../../context/MessageContext';\n\nimport type { ReactionGroupResponse, ReactionResponse } from 'stream-chat';\nimport type { AvatarProps } from '../Avatar';\n\nimport type { ReactionOptions } from './reactionOptions';\n\nexport type ReactionSelectorProps = {\n  /** Custom UI component to display user avatar, defaults to and accepts same props as: [Avatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/Avatar.tsx) */\n  Avatar?: React.ElementType<AvatarProps>;\n  /** If true, shows the user's avatar with the reaction */\n  detailedView?: boolean;\n  /** Function that adds/removes a reaction on a message (overrides the function stored in `MessageContext`) */\n  handleReaction?: (\n    reactionType: string,\n    event: React.BaseSyntheticEvent,\n  ) => Promise<void>;\n  /** An array of the reaction objects to display in the list */\n  latest_reactions?: ReactionResponse[];\n  /** An array of the own reaction objects to distinguish own reactions visually */\n  own_reactions?: ReactionResponse[];\n  /**\n   * An object that keeps track of the count of each type of reaction on a message\n   * @deprecated This override value is no longer taken into account. Use `reaction_groups` to override reaction counts instead.\n   * */\n  reaction_counts?: Record<string, number>;\n  /** An object containing summary for each reaction type on a message */\n  reaction_groups?: Record<string, ReactionGroupResponse>;\n  /**\n   * @deprecated\n   * A list of the currently supported reactions on a message\n   * */\n  reactionOptions?: ReactionOptions;\n  /** If true, adds a CSS class that reverses the horizontal positioning of the selector */\n  reverse?: boolean;\n};\n\nconst UnMemoizedReactionSelector = (props: ReactionSelectorProps) => {\n  const {\n    Avatar: propAvatar,\n    detailedView = true,\n    handleReaction: propHandleReaction,\n    latest_reactions: propLatestReactions,\n    own_reactions: propOwnReactions,\n    reaction_groups: propReactionGroups,\n    reactionOptions: propReactionOptions,\n    reverse = false,\n  } = props;\n\n  const {\n    Avatar: contextAvatar,\n    reactionOptions: contextReactionOptions = defaultReactionOptions,\n  } = useComponentContext('ReactionSelector');\n  const {\n    closeReactionSelectorOnClick,\n    handleReaction: contextHandleReaction,\n    message,\n  } = useMessageContext('ReactionSelector');\n  const dialogId = `reaction-selector--${message.id}`;\n  const dialog = useDialog({ id: dialogId });\n  const reactionOptions = propReactionOptions ?? contextReactionOptions;\n\n  const Avatar = propAvatar || contextAvatar || DefaultAvatar;\n  const handleReaction = propHandleReaction || contextHandleReaction;\n  const latestReactions = propLatestReactions || message?.latest_reactions || [];\n  const ownReactions = propOwnReactions || message?.own_reactions || [];\n  const reactionGroups = propReactionGroups || message?.reaction_groups || {};\n\n  const [tooltipReactionType, setTooltipReactionType] = useState<string | null>(null);\n  const [tooltipPositions, setTooltipPositions] = useState<{\n    arrow: number;\n    tooltip: number;\n  } | null>(null);\n\n  const rootRef = useRef<HTMLDivElement | null>(null);\n  const targetRef = useRef<HTMLDivElement | null>(null);\n  const tooltipRef = useRef<HTMLDivElement | null>(null);\n\n  const showTooltip = useCallback(\n    (event: React.MouseEvent<HTMLDivElement>, reactionType: string) => {\n      targetRef.current = event.currentTarget;\n      setTooltipReactionType(reactionType);\n    },\n    [],\n  );\n\n  const hideTooltip = useCallback(() => {\n    setTooltipReactionType(null);\n    setTooltipPositions(null);\n  }, []);\n\n  useEffect(() => {\n    if (!tooltipReactionType || !rootRef.current) return;\n    const tooltip = tooltipRef.current?.getBoundingClientRect();\n    const target = targetRef.current?.getBoundingClientRect();\n\n    const container = isMutableRef(rootRef)\n      ? rootRef.current?.getBoundingClientRect()\n      : null;\n\n    if (!tooltip || !target || !container) return;\n\n    const tooltipPosition =\n      tooltip.width === container.width || tooltip.x < container.x\n        ? 0\n        : target.left + target.width / 2 - container.left - tooltip.width / 2;\n\n    const arrowPosition = target.x - tooltip.x + target.width / 2 - tooltipPosition;\n\n    setTooltipPositions({\n      arrow: arrowPosition,\n      tooltip: tooltipPosition,\n    });\n  }, [tooltipReactionType, rootRef]);\n\n  const getUsersPerReactionType = (type: string | null) =>\n    latestReactions\n      .map((reaction) => {\n        if (reaction.type === type) {\n          return reaction.user?.name || reaction.user?.id;\n        }\n        return null;\n      })\n      .filter(Boolean);\n\n  const iHaveReactedWithReaction = (reactionType: string) =>\n    ownReactions.find((reaction) => reaction.type === reactionType);\n\n  const getLatestUserForReactionType = (type: string | null) =>\n    latestReactions.find((reaction) => reaction.type === type && !!reaction.user)?.user ||\n    undefined;\n\n  return (\n    <div\n      className={clsx(\n        'str-chat__reaction-selector str-chat__message-reaction-selector str-chat-react__message-reaction-selector',\n        {\n          'str-chat__reaction-selector--reverse': reverse,\n        },\n      )}\n      data-testid='reaction-selector'\n      ref={rootRef}\n    >\n      {!!tooltipReactionType && detailedView && (\n        <div\n          className='str-chat__reaction-selector-tooltip'\n          ref={tooltipRef}\n          style={{\n            left: tooltipPositions?.tooltip,\n            visibility: tooltipPositions ? 'visible' : 'hidden',\n          }}\n        >\n          <div className='arrow' style={{ left: tooltipPositions?.arrow }} />\n          {getUsersPerReactionType(tooltipReactionType)?.map((user, i, users) => (\n            <span className='latest-user-username' key={`key-${i}-${user}`}>\n              {`${user}${i < users.length - 1 ? ', ' : ''}`}\n            </span>\n          ))}\n        </div>\n      )}\n      <ul className='str-chat__message-reactions-list str-chat__message-reactions-options'>\n        {reactionOptions.map(({ Component, name: reactionName, type: reactionType }) => {\n          const latestUser = getLatestUserForReactionType(reactionType);\n          const count = reactionGroups[reactionType]?.count ?? 0;\n          return (\n            <li key={reactionType}>\n              <button\n                aria-label={`Select Reaction: ${reactionName || reactionType}`}\n                className={clsx(\n                  'str-chat__message-reactions-list-item str-chat__message-reactions-option',\n                  {\n                    'str-chat__message-reactions-option-selected':\n                      iHaveReactedWithReaction(reactionType),\n                  },\n                )}\n                data-testid='select-reaction-button'\n                data-text={reactionType}\n                onClick={(event) => {\n                  handleReaction(reactionType, event);\n                  if (closeReactionSelectorOnClick) {\n                    dialog.close();\n                  }\n                }}\n              >\n                {!!count && detailedView && (\n                  <div\n                    className='latest-user str-chat__message-reactions-last-user'\n                    onClick={hideTooltip}\n                    onMouseEnter={(e) => showTooltip(e, reactionType)}\n                    onMouseLeave={hideTooltip}\n                  >\n                    {latestUser ? (\n                      <Avatar\n                        image={latestUser.image}\n                        name={latestUser.name}\n                        size={20}\n                        user={latestUser}\n                      />\n                    ) : (\n                      <div className='latest-user-not-found' />\n                    )}\n                  </div>\n                )}\n                <span className='str-chat__message-reaction-emoji'>\n                  <Component />\n                </span>\n                {Boolean(count) && detailedView && (\n                  <span className='str-chat__message-reactions-list-item__count'>\n                    {count || ''}\n                  </span>\n                )}\n              </button>\n            </li>\n          );\n        })}\n      </ul>\n    </div>\n  );\n};\n\n/**\n * Component that allows a user to select a reaction.\n */\nexport const ReactionSelector = React.memo(\n  UnMemoizedReactionSelector,\n) as typeof UnMemoizedReactionSelector;\n", "/* eslint-disable sort-keys */\n\nimport React from 'react';\n\nimport { StreamEmoji } from './StreamEmoji';\n\nexport type ReactionOptions = Array<{\n  Component: React.ComponentType;\n  type: string;\n  name?: string;\n}>;\n\nexport const defaultReactionOptions: ReactionOptions = [\n  {\n    type: 'haha',\n    Component: () => <StreamEmoji fallback='\uD83D\uDE02' type='haha' />,\n    name: 'Joy',\n  },\n  {\n    type: 'like',\n    Component: () => <StreamEmoji fallback='\uD83D\uDC4D' type='like' />,\n    name: 'Thumbs up',\n  },\n  {\n    type: 'love',\n    Component: () => <StreamEmoji fallback='\u2764\uFE0F' type='love' />,\n    name: 'Heart',\n  },\n  { type: 'sad', Component: () => <StreamEmoji fallback='\uD83D\uDE14' type='sad' />, name: 'Sad' },\n  {\n    type: 'wow',\n    Component: () => <StreamEmoji fallback='\uD83D\uDE32' type='wow' />,\n    name: 'Astonished',\n  },\n];\n", "import React from 'react';\n\nimport type { SpriteImageProps } from './SpriteImage';\nimport { SpriteImage } from './SpriteImage';\n\nimport type { Readable } from '../../types/types';\n\nconst StreamSpriteEmojiPositions = {\n  angry: [1, 1],\n  haha: [1, 0],\n  like: [0, 0],\n  love: [1, 2],\n  sad: [0, 1],\n  wow: [0, 2],\n};\n\ntype StreamEmojiType = keyof typeof StreamSpriteEmojiPositions;\n\nconst STREAM_SPRITE_URL = 'https://getstream.imgix.net/images/emoji-sprite.png';\n\nexport const StreamEmoji = ({\n  fallback,\n  type,\n}: Readable<{ type: StreamEmojiType } & Pick<SpriteImageProps, 'fallback'>>) => {\n  const position = StreamSpriteEmojiPositions[type] as [number, number];\n  return (\n    <SpriteImage\n      columns={2}\n      fallback={fallback}\n      position={position}\n      rows={3}\n      spriteUrl={STREAM_SPRITE_URL}\n      style={\n        {\n          '--str-chat__sprite-image-height': 'var(--str-chat__stream-emoji-size, 18px)',\n        } as React.CSSProperties\n      }\n    />\n  );\n};\n", "import React, { useEffect, useState } from 'react';\n\nimport { getImageDimensions } from './utils/utils';\n\nexport type SpriteImageProps = {\n  columns: number;\n  position: [number, number];\n  rows: number;\n  spriteUrl: string;\n  fallback?: React.ReactNode;\n  height?: number;\n  style?: React.CSSProperties;\n  width?: number;\n};\n\nexport const SpriteImage = ({\n  columns,\n  fallback,\n  height,\n  position,\n  rows,\n  spriteUrl,\n  style,\n  width,\n}: SpriteImageProps) => {\n  const [[spriteWidth, spriteHeight], setSpriteDimensions] = useState([0, 0]);\n\n  useEffect(() => {\n    getImageDimensions(spriteUrl).then(setSpriteDimensions).catch(console.error);\n  }, [spriteUrl]);\n\n  const [x, y] = position;\n\n  if (!spriteHeight || !spriteWidth) return <>{fallback}</>;\n\n  return (\n    <div\n      data-testid='sprite-image'\n      style={\n        {\n          ...style,\n          '--str-chat__sprite-image-resize-ratio':\n            'var(--str-chat__sprite-image-resize-ratio-x, var(--str-chat__sprite-image-resize-ratio-y, 1))',\n          '--str-chat__sprite-image-resize-ratio-x':\n            'calc(var(--str-chat__sprite-image-width) / var(--str-chat__sprite-item-width))',\n          '--str-chat__sprite-image-resize-ratio-y':\n            'calc(var(--str-chat__sprite-image-height) / var(--str-chat__sprite-item-height))',\n          '--str-chat__sprite-item-height': `${spriteHeight / rows}`,\n          '--str-chat__sprite-item-width': `${spriteWidth / columns}`,\n          ...(Number.isFinite(height)\n            ? { '--str-chat__sprite-image-height': `${height}px` }\n            : {}),\n          ...(Number.isFinite(width)\n            ? { '--str-chat__sprite-image-width': `${width}px` }\n            : {}),\n          backgroundImage: `url('${spriteUrl}')`,\n          backgroundPosition: `${x * (100 / (columns - 1))}% ${y * (100 / (rows - 1))}%`,\n          backgroundSize: `${columns * 100}% ${rows * 100}%`,\n          height:\n            'var(--str-chat__sprite-image-height, calc(var(--str-chat__sprite-item-height) * var(--str-chat__sprite-image-resize-ratio)))',\n          width:\n            'var(--str-chat__sprite-image-width, calc(var(--str-chat__sprite-item-width) * var(--str-chat__sprite-image-resize-ratio)))',\n        } as React.CSSProperties\n      }\n    />\n  );\n};\n", "import type { ForwardedRef, MutableRefObject } from 'react';\n\nexport const isMutableRef = <T>(\n  ref: ForwardedRef<T> | null,\n): ref is MutableRefObject<T> => {\n  if (ref) {\n    return (ref as MutableRefObject<T>).current !== undefined;\n  }\n  return false;\n};\n\nexport const getImageDimensions = (source: string) =>\n  new Promise<[number, number]>((resolve, reject) => {\n    const image = new Image();\n\n    image.addEventListener(\n      'load',\n      () => {\n        resolve([image.width, image.height]);\n      },\n      { once: true },\n    );\n\n    image.addEventListener('error', () => reject(`Couldn't load image from ${source}`), {\n      once: true,\n    });\n\n    image.src = source;\n  });\n", "import type { MouseEventHandler } from 'react';\nimport React from 'react';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useChannelStateContext } from '../../context';\n\nexport type MessageRepliesCountButtonProps = {\n  /* If supplied, adds custom text to the end of a multiple replies message */\n  labelPlural?: string;\n  /* If supplied, adds custom text to the end of a single reply message */\n  labelSingle?: string;\n  /* Function to navigate into an existing thread on a message */\n  onClick?: MouseEventHandler;\n  /* The amount of replies (i.e., threaded messages) on a message */\n  reply_count?: number;\n};\n\nconst UnMemoizedMessageRepliesCountButton = (props: MessageRepliesCountButtonProps) => {\n  const { labelPlural, labelSingle, onClick, reply_count = 0 } = props;\n  const { channelCapabilities } = useChannelStateContext();\n\n  const { t } = useTranslationContext('MessageRepliesCountButton');\n\n  if (!reply_count) return null;\n\n  let replyCountText = t('replyCount', { count: reply_count });\n\n  if (labelPlural && reply_count > 1) {\n    replyCountText = `${reply_count} ${labelPlural}`;\n  } else if (labelSingle) {\n    replyCountText = `1 ${labelSingle}`;\n  }\n\n  return (\n    <div className='str-chat__message-replies-count-button-wrapper'>\n      <button\n        className='str-chat__message-replies-count-button'\n        data-testid='replies-count-button'\n        disabled={!channelCapabilities['send-reply']}\n        onClick={onClick}\n      >\n        {replyCountText}\n      </button>\n    </div>\n  );\n};\n\nexport const MessageRepliesCountButton = React.memo(\n  UnMemoizedMessageRepliesCountButton,\n) as typeof UnMemoizedMessageRepliesCountButton;\n", "import React, { useState } from 'react';\nimport clsx from 'clsx';\n\nimport { MessageDeliveredIcon, MessageSentIcon } from './icons';\nimport type { TooltipUsernameMapper } from './utils';\nimport { getReadByTooltipText, mapToUserNameOrId } from './utils';\n\nimport type { AvatarProps } from '../Avatar';\nimport { Avatar as DefaultAvatar } from '../Avatar';\nimport { LoadingIndicator } from '../Loading';\nimport { PopperTooltip } from '../Tooltip';\nimport { useEnterLeaveHandlers } from '../Tooltip/hooks';\n\nimport { useChatContext } from '../../context/ChatContext';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { useMessageContext } from '../../context/MessageContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nexport type MessageStatusProps = {\n  /* Custom UI component to display a user's avatar (overrides the value from `ComponentContext`) */\n  Avatar?: React.ComponentType<AvatarProps>;\n  /* Custom component to render when message is considered delivered, not read. The default UI renders MessageDeliveredIcon and a tooltip with string 'Delivered'. */\n  MessageDeliveredStatus?: React.ComponentType;\n  /* Custom component to render when message is considered delivered and read. The default UI renders the last reader's Avatar and a tooltip with string readers' names. */\n  MessageReadStatus?: React.ComponentType;\n  /* Custom component to render when message is considered as being the in the process of delivery. The default UI renders LoadingIndicator and a tooltip with string 'Sending'. */\n  MessageSendingStatus?: React.ComponentType;\n  /* Custom component to render when message is considered created on the server, but not delivered. The default UI renders MessageSentIcon and a tooltip with string 'Sent'. */\n  MessageSentStatus?: React.ComponentType;\n  /* Message type string to be added to CSS class names. */\n  messageType?: string;\n  /* Allows to customize the username(s) that appear on the message status tooltip */\n  tooltipUserNameMapper?: TooltipUsernameMapper;\n};\n\nconst UnMemoizedMessageStatus = (props: MessageStatusProps) => {\n  const {\n    Avatar: propAvatar,\n    MessageDeliveredStatus,\n    MessageReadStatus,\n    MessageSendingStatus,\n    MessageSentStatus,\n    messageType = 'simple',\n    tooltipUserNameMapper = mapToUserNameOrId,\n  } = props;\n\n  const { handleEnter, handleLeave, tooltipVisible } =\n    useEnterLeaveHandlers<HTMLSpanElement>();\n\n  const { client } = useChatContext('MessageStatus');\n  const { Avatar: contextAvatar } = useComponentContext('MessageStatus');\n  const {\n    deliveredTo,\n    isMyMessage,\n    lastOwnMessage,\n    message,\n    readBy,\n    returnAllReadData,\n    threadList,\n  } = useMessageContext('MessageStatus');\n  const { t } = useTranslationContext('MessageStatus');\n  const [referenceElement, setReferenceElement] = useState<HTMLSpanElement | null>(null);\n\n  const Avatar = propAvatar || contextAvatar || DefaultAvatar;\n\n  if (!isMyMessage() || message.type === 'error') return null;\n\n  const justReadByMe = readBy?.length === 1 && readBy[0].id === client.user?.id;\n  const deliveredOnlyToMe =\n    deliveredTo?.length === 1 && deliveredTo[0].id === client.user?.id;\n  const sending = message.status === 'sending';\n  const read = !!(readBy?.length && !justReadByMe && !threadList);\n  const delivered = !!(deliveredTo?.length && !deliveredOnlyToMe && !read && !threadList);\n  const sent =\n    (returnAllReadData || lastOwnMessage?.id === message.id) &&\n    message.status === 'received' &&\n    !delivered &&\n    !read &&\n    !threadList;\n\n  const readersWithoutOwnUser = read\n    ? readBy.filter((item) => item.id !== client.user?.id)\n    : [];\n  const [lastReadUser] = readersWithoutOwnUser;\n\n  return (\n    <span\n      className={clsx(\n        `str-chat__message-${messageType}-status str-chat__message-status`,\n        {\n          'str-chat__message-status-delivered': delivered,\n          'str-chat__message-status-read-by': read,\n          'str-chat__message-status-sending': sending,\n          'str-chat__message-status-sent': sent,\n        },\n      )}\n      data-testid={clsx({\n        'message-status-delivered': delivered,\n        'message-status-read-by': read,\n        'message-status-sending': sending,\n        'message-status-sent': sent,\n      })}\n      onMouseEnter={handleEnter}\n      onMouseLeave={handleLeave}\n      ref={setReferenceElement}\n    >\n      {sending &&\n        (MessageSendingStatus ? (\n          <MessageSendingStatus />\n        ) : (\n          <>\n            <PopperTooltip\n              offset={[0, 5]}\n              referenceElement={referenceElement}\n              visible={tooltipVisible}\n            >\n              {t('Sending...')}\n            </PopperTooltip>\n            <LoadingIndicator />\n          </>\n        ))}\n\n      {sent &&\n        (MessageSentStatus ? (\n          <MessageSentStatus />\n        ) : (\n          <>\n            <PopperTooltip\n              offset={[0, 5]}\n              referenceElement={referenceElement}\n              visible={tooltipVisible}\n            >\n              {t('Sent')}\n            </PopperTooltip>\n            <MessageSentIcon />\n          </>\n        ))}\n\n      {delivered &&\n        (MessageDeliveredStatus ? (\n          <MessageDeliveredStatus />\n        ) : (\n          <>\n            <PopperTooltip\n              offset={[0, 5]}\n              referenceElement={referenceElement}\n              visible={tooltipVisible}\n            >\n              {t('Delivered')}\n            </PopperTooltip>\n            <MessageDeliveredIcon />\n          </>\n        ))}\n\n      {read &&\n        (MessageReadStatus ? (\n          <MessageReadStatus />\n        ) : (\n          <>\n            <PopperTooltip\n              offset={[0, 5]}\n              referenceElement={referenceElement}\n              visible={tooltipVisible}\n            >\n              {getReadByTooltipText(readBy, t, client, tooltipUserNameMapper)}\n            </PopperTooltip>\n\n            <Avatar\n              className='str-chat__avatar--message-status'\n              image={lastReadUser.image}\n              name={lastReadUser.name || lastReadUser.id}\n              user={lastReadUser}\n            />\n\n            {readersWithoutOwnUser.length > 1 && (\n              <span\n                className={`str-chat__message-${messageType}-status-number`}\n                data-testid='message-status-read-by-many'\n              >\n                {readersWithoutOwnUser.length}\n              </span>\n            )}\n          </>\n        ))}\n    </span>\n  );\n};\n\nexport const MessageStatus = React.memo(\n  UnMemoizedMessageStatus,\n) as typeof UnMemoizedMessageStatus;\n", "import type { ComponentProps } from 'react';\nimport React, { useEffect, useState } from 'react';\nimport type { PopperLikePlacement } from '../Dialog';\nimport { usePopoverPosition } from '../Dialog/hooks/usePopoverPosition';\n\nexport const Tooltip = ({ children, ...rest }: ComponentProps<'div'>) => (\n  <div className='str-chat__tooltip' {...rest}>\n    {children}\n  </div>\n);\n\nexport type PopperTooltipProps<T extends HTMLElement> = React.PropsWithChildren<{\n  /** Reference element to which the tooltip should attach to */\n  referenceElement: T | null;\n  /** Popper's modifier (offset) property - [xAxis offset, yAxis offset], default [0, 10] */\n  offset?: [number, number];\n  /** Popper's placement property defining default position of the tooltip, default 'top' */\n  placement?: PopperLikePlacement;\n  /** Tells component whether to render its contents */\n  visible?: boolean;\n}>;\n\nexport const PopperTooltip = <T extends HTMLElement>({\n  children,\n  offset = [0, 10],\n  placement = 'top',\n  referenceElement,\n  visible = false,\n}: PopperTooltipProps<T>) => {\n  const [popperElement, setPopperElement] = useState<HTMLDivElement | null>(null);\n  const {\n    placement: resolvedPlacement,\n    refs,\n    strategy,\n    x,\n    y,\n  } = usePopoverPosition({\n    offset,\n    placement,\n  });\n\n  useEffect(() => {\n    refs.setReference(referenceElement);\n  }, [referenceElement, refs]);\n\n  useEffect(() => {\n    refs.setFloating(popperElement);\n  }, [popperElement, refs]);\n\n  if (!visible) return null;\n\n  return (\n    <div\n      className='str-chat__tooltip'\n      data-placement={resolvedPlacement}\n      ref={setPopperElement}\n      style={{ left: x ?? 0, position: strategy, top: y ?? 0 }}\n    >\n      {children}\n    </div>\n  );\n};\n", "import type React from 'react';\nimport { useCallback, useState } from 'react';\n\nexport const useEnterLeaveHandlers = <T extends HTMLElement>({\n  onMouseEnter,\n  onMouseLeave,\n}: Partial<Record<'onMouseEnter' | 'onMouseLeave', React.MouseEventHandler<T>>> = {}) => {\n  const [tooltipVisible, setTooltipVisible] = useState(false);\n\n  const handleEnter: React.MouseEventHandler<T> = useCallback(\n    (e) => {\n      setTooltipVisible(true);\n      onMouseEnter?.(e);\n    },\n    [onMouseEnter],\n  );\n\n  const handleLeave: React.MouseEventHandler<T> = useCallback(\n    (e) => {\n      setTooltipVisible(false);\n      onMouseLeave?.(e);\n    },\n    [onMouseLeave],\n  );\n\n  return { handleEnter, handleLeave, tooltipVisible };\n};\n", "import clsx from 'clsx';\nimport React, { useMemo } from 'react';\n\nimport { QuotedMessage as DefaultQuotedMessage } from './QuotedMessage';\nimport { isOnlyEmojis, messageHasAttachments } from './utils';\n\nimport {\n  useComponentContext,\n  useMessageContext,\n  useTranslationContext,\n} from '../../context';\nimport { renderText as defaultRenderText } from './renderText';\nimport { MessageErrorText } from './MessageErrorText';\n\nimport type { LocalMessage, TranslationLanguages } from 'stream-chat';\nimport type { MessageContextValue } from '../../context';\n\nexport type MessageTextProps = {\n  /* Replaces the CSS class name placed on the component's inner `div` container */\n  customInnerClass?: string;\n  /* Adds a CSS class name to the component's outer `div` container */\n  customWrapperClass?: string;\n  /* The `StreamChat` message object, which provides necessary data to the underlying UI components (overrides the value stored in `MessageContext`) */\n  message?: LocalMessage;\n  /* Theme string to be added to CSS class names */\n  theme?: string;\n} & Pick<MessageContextValue, 'renderText'>;\n\nconst UnMemoizedMessageTextComponent = (props: MessageTextProps) => {\n  const {\n    customInnerClass,\n    customWrapperClass = '',\n    message: propMessage,\n    renderText: propsRenderText,\n    theme = 'simple',\n  } = props;\n\n  const { QuotedMessage = DefaultQuotedMessage } = useComponentContext('MessageText');\n\n  const {\n    message: contextMessage,\n    onMentionsClickMessage,\n    onMentionsHoverMessage,\n    renderText: contextRenderText,\n    unsafeHTML,\n  } = useMessageContext('MessageText');\n\n  const renderText = propsRenderText ?? contextRenderText ?? defaultRenderText;\n\n  const { userLanguage } = useTranslationContext('MessageText');\n  const message = propMessage || contextMessage;\n  const hasAttachment = messageHasAttachments(message);\n\n  const messageTextToRender =\n    message.i18n?.[`${userLanguage}_text` as `${TranslationLanguages}_text`] ||\n    message.text;\n\n  const messageText = useMemo(\n    () => renderText(messageTextToRender, message.mentioned_users),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [message.mentioned_users, messageTextToRender],\n  );\n\n  const wrapperClass = customWrapperClass || 'str-chat__message-text';\n  const innerClass =\n    customInnerClass ||\n    `str-chat__message-text-inner str-chat__message-${theme}-text-inner`;\n\n  if (!messageTextToRender && !message.quoted_message) return null;\n\n  return (\n    <div className={wrapperClass} tabIndex={0}>\n      <div\n        className={clsx(innerClass, {\n          [`str-chat__message-${theme}-text-inner--has-attachment`]: hasAttachment,\n          [` str-chat__message-${theme}-text-inner--is-emoji`]:\n            isOnlyEmojis(message.text) && !message.quoted_message,\n        })}\n        data-testid='message-text-inner-wrapper'\n        onClick={onMentionsClickMessage}\n        onMouseOver={onMentionsHoverMessage}\n      >\n        {message.quoted_message && <QuotedMessage />}\n        <MessageErrorText message={message} theme={theme} />\n        {unsafeHTML && message.html ? (\n          <div dangerouslySetInnerHTML={{ __html: message.html }} />\n        ) : (\n          <div>{messageText}</div>\n        )}\n      </div>\n    </div>\n  );\n};\n\nexport const MessageText = React.memo(\n  UnMemoizedMessageTextComponent,\n) as typeof UnMemoizedMessageTextComponent;\n", "import React, { useMemo } from 'react';\nimport clsx from 'clsx';\nimport type { TranslationLanguages } from 'stream-chat';\n\nimport { Attachment as DefaultAttachment } from '../Attachment';\nimport { Avatar as DefaultAvatar } from '../Avatar';\nimport { Poll } from '../Poll';\nimport { useChatContext } from '../../context/ChatContext';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { useMessageContext } from '../../context/MessageContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useChannelActionContext } from '../../context/ChannelActionContext';\nimport { renderText as defaultRenderText } from './renderText';\nimport type { MessageContextValue } from '../../context/MessageContext';\nimport { useActionHandler } from './';\n\nexport type QuotedMessageProps = Pick<MessageContextValue, 'renderText'>;\n\nexport const QuotedMessage = ({ renderText: propsRenderText }: QuotedMessageProps) => {\n  const { Attachment = DefaultAttachment, Avatar: ContextAvatar } =\n    useComponentContext('QuotedMessage');\n  const { client } = useChatContext();\n  const {\n    isMyMessage,\n    message,\n    renderText: contextRenderText,\n  } = useMessageContext('QuotedMessage');\n  const { t, userLanguage } = useTranslationContext('QuotedMessage');\n  const { jumpToMessage } = useChannelActionContext('QuotedMessage');\n  const actionHandler = useActionHandler(message);\n\n  const renderText = propsRenderText ?? contextRenderText ?? defaultRenderText;\n\n  const Avatar = ContextAvatar || DefaultAvatar;\n\n  const { quoted_message } = message;\n\n  const poll = quoted_message?.poll_id && client.polls.fromState(quoted_message.poll_id);\n  const quotedMessageDeleted =\n    quoted_message?.deleted_at || quoted_message?.type === 'deleted';\n\n  const quotedMessageText = quotedMessageDeleted\n    ? t('This message was deleted...')\n    : quoted_message?.i18n?.[`${userLanguage}_text` as `${TranslationLanguages}_text`] ||\n      quoted_message?.text;\n\n  const quotedMessageAttachment =\n    quoted_message?.attachments?.length && !quotedMessageDeleted\n      ? quoted_message.attachments[0]\n      : null;\n\n  const renderedText = useMemo(\n    () => renderText(quotedMessageText, quoted_message?.mentioned_users),\n    [quotedMessageText, quoted_message?.mentioned_users, renderText],\n  );\n\n  if (!quoted_message) return null;\n  if (!quoted_message.poll && !quotedMessageText && !quotedMessageAttachment) return null;\n\n  return (\n    <>\n      <div\n        className={clsx('str-chat__quoted-message-preview', { mine: isMyMessage() })}\n        data-testid='quoted-message'\n        onClickCapture={(e) => {\n          e.stopPropagation();\n          e.preventDefault();\n          jumpToMessage(quoted_message.id);\n        }}\n      >\n        {quoted_message.user && (\n          <Avatar\n            className='str-chat__avatar--quoted-message-sender'\n            image={quoted_message.user.image}\n            name={quoted_message.user.name || quoted_message.user.id}\n            user={quoted_message.user}\n          />\n        )}\n        <div\n          className='str-chat__quoted-message-bubble'\n          data-testid='quoted-message-contents'\n        >\n          {poll ? (\n            <Poll isQuoted poll={poll} />\n          ) : (\n            <>\n              {quotedMessageAttachment && (\n                <Attachment attachments={[quotedMessageAttachment]} isQuoted />\n              )}\n              <div\n                className='str-chat__quoted-message-bubble__text'\n                data-testid='quoted-message-text'\n              >\n                {renderedText}\n              </div>\n            </>\n          )}\n        </div>\n      </div>\n      {message.attachments?.length ? (\n        <Attachment actionHandler={actionHandler} attachments={message.attachments} />\n      ) : null}\n    </>\n  );\n};\n", "import React from 'react';\nimport { PollContent as DefaultPollContent } from './PollContent';\nimport { QuotedPoll as DefaultQuotedPoll } from './QuotedPoll';\nimport { PollProvider, useComponentContext } from '../../context';\nimport type { Poll as PollClass } from 'stream-chat';\n\nexport const Poll = ({ isQuoted, poll }: { poll: PollClass; isQuoted?: boolean }) => {\n  const { PollContent = DefaultPollContent, QuotedPoll = DefaultQuotedPoll } =\n    useComponentContext();\n  return poll ? (\n    <PollProvider poll={poll}>{isQuoted ? <QuotedPoll /> : <PollContent />}</PollProvider>\n  ) : null;\n};\n", "import clsx from 'clsx';\nimport React from 'react';\nimport { PollHeader as DefaultPollHeader } from './PollHeader';\nimport { PollActions as DefaultPollActions } from './PollActions';\nimport { PollOptionList } from './PollOptionList';\nimport { MAX_OPTIONS_DISPLAYED } from './constants';\nimport { useComponentContext, usePollContext } from '../../context';\nimport { useStateStore } from '../../store';\nimport type { PollState } from 'stream-chat';\n\ntype PollStateSelectorPollContentReturnValue = { is_closed: boolean | undefined };\nconst pollStateSelectorPollContent = (\n  nextValue: PollState,\n): PollStateSelectorPollContentReturnValue => ({ is_closed: nextValue.is_closed });\nexport const PollContent = () => {\n  const { PollActions = DefaultPollActions, PollHeader = DefaultPollHeader } =\n    useComponentContext();\n  const { poll } = usePollContext();\n  const { is_closed } = useStateStore(poll.state, pollStateSelectorPollContent);\n\n  return (\n    <div className={clsx('str-chat__poll', { 'str-chat__poll--closed': is_closed })}>\n      <PollHeader />\n      <PollOptionList optionsDisplayCount={MAX_OPTIONS_DISPLAYED} />\n      <PollActions />\n    </div>\n  );\n};\n", "import React, { useMemo } from 'react';\nimport { usePollContext, useTranslationContext } from '../../context';\nimport { useStateStore } from '../../store';\nimport type { PollOption, PollState } from 'stream-chat';\n\ntype PollStateSelectorReturnValue = {\n  enforce_unique_vote: boolean;\n  is_closed: boolean | undefined;\n  max_votes_allowed: number;\n  name: string;\n  options: PollOption[];\n};\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n  enforce_unique_vote: nextValue.enforce_unique_vote,\n  is_closed: nextValue.is_closed,\n  max_votes_allowed: nextValue.max_votes_allowed,\n  name: nextValue.name,\n  options: nextValue.options,\n});\n\nexport const PollHeader = () => {\n  const { t } = useTranslationContext('PollHeader');\n\n  const { poll } = usePollContext();\n  const { enforce_unique_vote, is_closed, max_votes_allowed, name, options } =\n    useStateStore(poll.state, pollStateSelector);\n\n  const selectionInstructions = useMemo(() => {\n    if (is_closed) return t('Vote ended');\n    if (enforce_unique_vote || options.length === 1) return t('Select one');\n    if (max_votes_allowed)\n      return t('Select up to {{count}}', {\n        count: max_votes_allowed > options.length ? options.length : max_votes_allowed,\n      });\n    if (options.length > 1) return t('Select one or more');\n    return '';\n  }, [is_closed, enforce_unique_vote, max_votes_allowed, options.length, t]);\n\n  if (!name) return;\n\n  return (\n    <div className='str-chat__poll-header'>\n      <div className='str-chat__poll-title'>{name}</div>\n      <div className='str-chat__poll-subtitle'>{selectionInstructions}</div>\n    </div>\n  );\n};\n", "import React from 'react';\nimport { FormDialog } from '../../Dialog/FormDialog';\nimport { useStateStore } from '../../../store';\nimport { usePollContext, useTranslationContext } from '../../../context';\nimport type { PollAnswer, PollState } from 'stream-chat';\n\ntype PollStateSelectorReturnValue = { ownAnswer: PollAnswer | undefined };\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n  ownAnswer: nextValue.ownAnswer,\n});\n\nexport type AddCommentFormProps = {\n  close: () => void;\n  messageId: string;\n};\n\nexport const AddCommentForm = ({ close, messageId }: AddCommentFormProps) => {\n  const { t } = useTranslationContext('AddCommentForm');\n\n  const { poll } = usePollContext();\n  const { ownAnswer } = useStateStore(poll.state, pollStateSelector);\n\n  return (\n    <FormDialog<{ comment: '' }>\n      className='str-chat__prompt-dialog str-chat__modal__poll-add-comment'\n      close={close}\n      fields={{\n        comment: {\n          element: 'input',\n          props: {\n            id: 'comment',\n            name: 'comment',\n            required: true,\n            type: 'text',\n            value: ownAnswer?.answer_text ?? '',\n          },\n          validator: (value) => {\n            const valueString = typeof value !== 'undefined' ? value.toString() : value;\n            const trimmedValue = valueString?.trim();\n            if (!trimmedValue) {\n              return new Error(t('This field cannot be empty or contain only spaces'));\n            }\n            return;\n          },\n        },\n      }}\n      onSubmit={async (value) => {\n        await poll.addAnswer(value.comment, messageId);\n      }}\n      shouldDisableSubmitButton={(value) =>\n        !value.comment || value.comment === ownAnswer?.answer_text\n      }\n      title={ownAnswer ? t('Update your comment') : t('Add a comment')}\n    />\n  );\n};\n", "import type { ChangeEvent, ChangeEventHandler, ComponentProps } from 'react';\nimport React, { useCallback, useState } from 'react';\nimport clsx from 'clsx';\nimport { FieldError } from '../Form/FieldError';\nimport { useTranslationContext } from '../../context';\n\ntype FormElements = 'input' | 'textarea';\ntype FieldId = string;\ntype Validator = (\n  value: string | readonly string[] | number | boolean | undefined,\n) => Error | undefined;\n\nexport type FieldConfig = {\n  element: FormElements;\n  props: ComponentProps<FormElements>;\n  label?: React.ReactNode;\n  validator?: Validator;\n};\n\ntype TextInputFormProps<F extends FormValue<Record<FieldId, FieldConfig>>> = {\n  close: () => void;\n  fields: Record<FieldId, FieldConfig>;\n  onSubmit: (formValue: F) => Promise<void>;\n  className?: string;\n  shouldDisableSubmitButton?: (formValue: F) => boolean;\n  title?: string;\n};\n\ntype FormValue<F extends Record<FieldId, FieldConfig>> = {\n  [K in keyof F]: F[K]['props']['value'];\n};\n\nexport const FormDialog = <\n  F extends FormValue<Record<FieldId, FieldConfig>> = FormValue<\n    Record<FieldId, FieldConfig>\n  >,\n>({\n  className,\n  close,\n  fields,\n  onSubmit,\n  shouldDisableSubmitButton,\n  title,\n}: TextInputFormProps<F>) => {\n  const { t } = useTranslationContext();\n  const [fieldErrors, setFieldErrors] = useState<Record<FieldId, Error>>({});\n  const [value, setValue] = useState<F>(() => {\n    let acc: Partial<F> = {};\n    for (const [id, config] of Object.entries(fields)) {\n      acc = { ...acc, [id]: config.props.value };\n    }\n    return acc as F;\n  });\n\n  const handleChange = useCallback<\n    ChangeEventHandler<HTMLInputElement | HTMLTextAreaElement>\n  >(\n    (event) => {\n      const fieldId = event.target.id;\n      const fieldConfig = fields[fieldId];\n      if (!fieldConfig) return;\n\n      const error = fieldConfig.validator?.(event.target.value);\n      if (error) {\n        setFieldErrors((prev) => ({ [fieldId]: error, ...prev }));\n      } else {\n        setFieldErrors((prev) => {\n          delete prev[fieldId];\n          return prev;\n        });\n      }\n      setValue((prev) => ({ ...prev, [fieldId]: event.target.value }));\n\n      if (!fieldConfig.props.onChange) return;\n\n      if (fieldConfig.element === 'input') {\n        (fieldConfig.props.onChange as ChangeEventHandler<HTMLInputElement>)(\n          event as ChangeEvent<HTMLInputElement>,\n        );\n      } else if (fieldConfig.element === 'textarea') {\n        (fieldConfig.props.onChange as ChangeEventHandler<HTMLTextAreaElement>)(\n          event as ChangeEvent<HTMLTextAreaElement>,\n        );\n      }\n    },\n    [fields],\n  );\n\n  const handleSubmit = async () => {\n    if (!Object.keys(value).length) return;\n    const errors: Record<FieldId, Error> = {};\n    for (const [id, fieldValue] of Object.entries(value)) {\n      const thisFieldError = fields[id].validator?.(fieldValue);\n      if (thisFieldError) {\n        errors[id] = thisFieldError;\n      }\n    }\n    if (Object.keys(errors).length) {\n      setFieldErrors(errors);\n      return;\n    }\n    await onSubmit(value);\n    close();\n  };\n\n  return (\n    <div className={clsx('str-chat__dialog str-chat__dialog--form', className)}>\n      <div className='str-chat__dialog__body'>\n        {title && <div className='str-chat__dialog__title'>{title}</div>}\n        <form\n          autoComplete='off'\n          onSubmit={(e) => {\n            e.preventDefault();\n            handleSubmit();\n          }}\n        >\n          {Object.entries(fields).map(([id, fieldConfig]) => (\n            <div className='str-chat__dialog__field' key={`dialog-field-${id}`}>\n              {fieldConfig.label && (\n                <label\n                  className={clsx(\n                    `str-chat__dialog__title str-chat__dialog__title--${id}`,\n                  )}\n                  htmlFor={id}\n                >\n                  {fieldConfig.label}\n                </label>\n              )}\n              {React.createElement(fieldConfig.element, {\n                id,\n                ...fieldConfig.props,\n                onChange: handleChange,\n                value: value[id],\n              })}\n              <FieldError text={fieldErrors[id]?.message} />\n            </div>\n          ))}\n          <div className='str-chat__dialog__controls'>\n            <button\n              className='str-chat__dialog__controls-button str-chat__dialog__controls-button--cancel'\n              onClick={close}\n              type='button'\n            >\n              {t('Cancel')}\n            </button>\n            <button\n              className='str-chat__dialog__controls-button str-chat__dialog__controls-button--submit'\n              disabled={\n                Object.keys(fieldErrors).length > 0 || shouldDisableSubmitButton?.(value)\n              }\n              type='submit'\n            >\n              {t('Send')}\n            </button>\n          </div>\n        </form>\n      </div>\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport type { ComponentProps } from 'react';\nimport React from 'react';\n\ntype FieldErrorProps = ComponentProps<'div'> & {\n  text?: string;\n};\nexport const FieldError = ({ className, text, ...props }: FieldErrorProps) => (\n  <div {...props} className={clsx('str-chat__form-field-error', className)}>\n    {text}\n  </div>\n);\n", "import type { ComponentProps } from 'react';\nimport React from 'react';\nimport clsx from 'clsx';\n\nexport type ConfirmationDialogProps = {\n  actions: ComponentProps<'button'>[];\n  prompt: string;\n  className?: string;\n  title?: string;\n};\n\nexport const PromptDialog = ({\n  actions,\n  className,\n  prompt,\n  title,\n}: ConfirmationDialogProps) => (\n  <div className={clsx('str-chat__dialog str-chat__dialog--prompt', className)}>\n    <div className='str-chat__dialog__body'>\n      {title && <div className='str-chat__dialog__title'>{title}</div>}\n      <div className='str-chat__dialog__prompt'>{prompt}</div>\n    </div>\n    <div className='str-chat__dialog__controls'>\n      {actions.map(({ className, ...props }, i) => (\n        <button\n          className={clsx(`str-chat__dialog__controls-button`, className)}\n          key={`prompt-dialog__controls-button--${i}`}\n          {...props}\n        />\n      ))}\n    </div>\n  </div>\n);\n", "import { PromptDialog } from '../../Dialog/PromptDialog';\nimport React from 'react';\nimport { usePollContext, useTranslationContext } from '../../../context';\n\nexport type EndPollDialogProps = {\n  close: () => void;\n};\n\nexport const EndPollDialog = ({ close }: EndPollDialogProps) => {\n  const { t } = useTranslationContext('SuggestPollOptionForm');\n  const { poll } = usePollContext();\n\n  return (\n    <PromptDialog\n      actions={[\n        {\n          children: t('Cancel'),\n          className: 'str-chat__dialog__controls-button--cancel',\n          onClick: close,\n        },\n        {\n          children: t('End'),\n          className:\n            '.str-chat__dialog__controls-button--submit str-chat__dialog__controls-button--end-poll',\n          onClick: poll.close,\n        },\n      ]}\n      className='str-chat__modal__end-vote'\n      prompt={t('Nobody will be able to vote in this poll anymore.')}\n      title={t('End vote')}\n    />\n  );\n};\n", "import clsx from 'clsx';\nimport React, { useCallback, useState } from 'react';\nimport { PollAction } from './PollAction';\nimport type { AddCommentFormProps } from './AddCommentForm';\nimport { AddCommentForm as DefaultAddCommentForm } from './AddCommentForm';\nimport type { SuggestPollOptionFormProps } from './SuggestPollOptionForm';\nimport { SuggestPollOptionForm as DefaultSuggestPollOptionForm } from './SuggestPollOptionForm';\nimport type { EndPollDialogProps } from './EndPollDialog';\nimport { EndPollDialog as DefaultEndPollDialog } from './EndPollDialog';\nimport type { PollAnswerListProps } from './PollAnswerList';\nimport { PollAnswerList as DefaultPollAnswerList } from './PollAnswerList';\nimport type { FullPollOptionsListingProps } from './PollOptionsFullList';\nimport { PollOptionsFullList as DefaultPollOptionsFullList } from './PollOptionsFullList';\nimport type { PollResultsProps } from './PollResults';\nimport { PollResults as DefaultPollResults } from './PollResults';\nimport { MAX_OPTIONS_DISPLAYED, MAX_POLL_OPTIONS } from '../constants';\nimport {\n  useChannelStateContext,\n  useChatContext,\n  useMessageContext,\n  usePollContext,\n  useTranslationContext,\n} from '../../../context';\nimport { useStateStore } from '../../../store';\n\nimport type { PollAnswer, PollOption, PollState } from 'stream-chat';\n\nconst COMMON_MODAL_CLASS = 'str-chat__poll-action-modal' as const;\n\ntype ModalName =\n  | 'suggest-option'\n  | 'add-comment'\n  | 'view-all-options'\n  | 'view-comments'\n  | 'view-results'\n  | 'end-vote';\n\ntype PollStateSelectorReturnValue = {\n  allow_answers: boolean | undefined;\n  allow_user_suggested_options: boolean | undefined;\n  answers_count: number;\n  created_by_id: string;\n  is_closed: boolean | undefined;\n  options: PollOption[];\n  ownAnswer: PollAnswer | undefined;\n};\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n  allow_answers: nextValue.allow_answers,\n  allow_user_suggested_options: nextValue.allow_user_suggested_options,\n  answers_count: nextValue.answers_count,\n  created_by_id: nextValue.created_by_id,\n  is_closed: nextValue.is_closed,\n  options: nextValue.options,\n  ownAnswer: nextValue.ownAnswer,\n});\n\nexport type PollActionsProps = {\n  AddCommentForm?: React.ComponentType<AddCommentFormProps>;\n  EndPollDialog?: React.ComponentType<EndPollDialogProps>;\n  PollAnswerList?: React.ComponentType<PollAnswerListProps>;\n  PollOptionsFullList?: React.ComponentType<FullPollOptionsListingProps>;\n  PollResults?: React.ComponentType<PollResultsProps>;\n  SuggestPollOptionForm?: React.ComponentType<SuggestPollOptionFormProps>;\n};\n\nexport const PollActions = ({\n  AddCommentForm = DefaultAddCommentForm,\n  EndPollDialog = DefaultEndPollDialog,\n  PollAnswerList = DefaultPollAnswerList,\n  PollOptionsFullList = DefaultPollOptionsFullList,\n  PollResults = DefaultPollResults,\n  SuggestPollOptionForm = DefaultSuggestPollOptionForm,\n}: PollActionsProps) => {\n  const { client } = useChatContext();\n  const { t } = useTranslationContext('PollActions');\n  const { channelCapabilities = {} } = useChannelStateContext('PollActions');\n  const { message } = useMessageContext('PollActions');\n  const { poll } = usePollContext();\n  const {\n    allow_answers,\n    allow_user_suggested_options,\n    answers_count,\n    created_by_id,\n    is_closed,\n    options,\n    ownAnswer,\n  } = useStateStore(poll.state, pollStateSelector);\n  const [modalOpen, setModalOpen] = useState<ModalName | undefined>();\n\n  const canCastVote = channelCapabilities['cast-poll-vote'] && !is_closed;\n  const closeModal = useCallback(() => setModalOpen(undefined), []);\n  const onUpdateAnswerClick = useCallback(() => setModalOpen('add-comment'), []);\n\n  return (\n    <div className='str-chat__poll-actions'>\n      {options.length > MAX_OPTIONS_DISPLAYED && (\n        <PollAction\n          buttonText={t('See all options ({{count}})', {\n            count: options.length,\n          })}\n          closeModal={closeModal}\n          modalClassName={COMMON_MODAL_CLASS}\n          modalIsOpen={modalOpen === 'view-all-options'}\n          openModal={() => setModalOpen('view-all-options')}\n        >\n          <PollOptionsFullList close={closeModal} />\n        </PollAction>\n      )}\n\n      {canCastVote &&\n        allow_user_suggested_options &&\n        options.length < MAX_POLL_OPTIONS && (\n          <PollAction\n            buttonText={t('Suggest an option')}\n            closeModal={closeModal}\n            modalClassName={clsx(\n              COMMON_MODAL_CLASS,\n              'str-chat__suggest-poll-option-modal',\n            )}\n            modalIsOpen={modalOpen === 'suggest-option'}\n            openModal={() => setModalOpen('suggest-option')}\n          >\n            <SuggestPollOptionForm close={closeModal} messageId={message.id} />\n          </PollAction>\n        )}\n\n      {!is_closed && allow_answers && (\n        <PollAction\n          buttonText={ownAnswer ? t('Update your comment') : t('Add a comment')}\n          closeModal={closeModal}\n          modalClassName={clsx(COMMON_MODAL_CLASS, 'str-chat__add-poll-answer-modal')}\n          modalIsOpen={modalOpen === 'add-comment'}\n          openModal={() => setModalOpen('add-comment')}\n        >\n          <AddCommentForm close={closeModal} messageId={message.id} />\n        </PollAction>\n      )}\n\n      {answers_count > 0 && channelCapabilities['query-poll-votes'] && (\n        <PollAction\n          buttonText={t('View {{count}} comments', { count: answers_count })}\n          closeModal={closeModal}\n          modalClassName={clsx(COMMON_MODAL_CLASS, 'str-chat__poll-answer-list-modal')}\n          modalIsOpen={modalOpen === 'view-comments'}\n          openModal={() => setModalOpen('view-comments')}\n        >\n          <PollAnswerList\n            close={closeModal}\n            onUpdateOwnAnswerClick={onUpdateAnswerClick}\n          />\n        </PollAction>\n      )}\n\n      <PollAction\n        buttonText={t('View results')}\n        closeModal={closeModal}\n        modalClassName={clsx(COMMON_MODAL_CLASS, 'str-chat__poll-results-modal')}\n        modalIsOpen={modalOpen === 'view-results'}\n        openModal={() => setModalOpen('view-results')}\n      >\n        <PollResults close={closeModal} />\n      </PollAction>\n\n      {!is_closed && created_by_id === client.user?.id && (\n        <PollAction\n          buttonText={t('End vote')}\n          closeModal={closeModal}\n          modalClassName={clsx(COMMON_MODAL_CLASS, 'str-chat__end-poll-modal')}\n          modalIsOpen={modalOpen === 'end-vote'}\n          openModal={() => setModalOpen('end-vote')}\n        >\n          <EndPollDialog close={closeModal} />\n        </PollAction>\n      )}\n    </div>\n  );\n};\n", "import type { PropsWithChildren } from 'react';\nimport React from 'react';\nimport { Modal as DefaultModal } from '../../Modal';\nimport { useComponentContext } from '../../../context';\n\nexport type PollActionProps = {\n  buttonText: string;\n  closeModal: () => void;\n  modalIsOpen: boolean;\n  openModal: () => void;\n  modalClassName?: string;\n};\n\nexport const PollAction = ({\n  buttonText,\n  children,\n  closeModal,\n  modalClassName,\n  modalIsOpen,\n  openModal,\n}: PropsWithChildren<PollActionProps>) => {\n  const { Modal = DefaultModal } = useComponentContext();\n  return (\n    <>\n      <button className='str-chat__poll-action' onClick={openModal}>\n        {buttonText}\n      </button>\n      <Modal className={modalClassName} onClose={closeModal} open={modalIsOpen}>\n        {children}\n      </Modal>\n    </>\n  );\n};\n", "import React from 'react';\nimport { FormDialog } from '../../Dialog/FormDialog';\nimport { useChatContext, usePollContext, useTranslationContext } from '../../../context';\nimport { useStateStore } from '../../../store';\nimport type { PollOption, PollState } from 'stream-chat';\n\ntype PollStateSelectorReturnValue = { options: PollOption[] };\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n  options: nextValue.options,\n});\n\nexport type SuggestPollOptionFormProps = {\n  close: () => void;\n  messageId: string;\n};\n\nexport const SuggestPollOptionForm = ({\n  close,\n  messageId,\n}: SuggestPollOptionFormProps) => {\n  const { client } = useChatContext('SuggestPollOptionForm');\n  const { t } = useTranslationContext('SuggestPollOptionForm');\n  const { poll } = usePollContext();\n  const { options } = useStateStore(poll.state, pollStateSelector);\n\n  return (\n    <FormDialog<{ optionText: '' }>\n      className='str-chat__prompt-dialog str-chat__modal__suggest-poll-option'\n      close={close}\n      fields={{\n        optionText: {\n          element: 'input',\n          props: {\n            id: 'optionText',\n            name: 'optionText',\n            required: true,\n            type: 'text',\n            value: '',\n          },\n          validator: (value) => {\n            const valueString = typeof value !== 'undefined' ? value.toString() : value;\n            const trimmedValue = valueString?.trim();\n            if (!trimmedValue) {\n              return new Error(t('This field cannot be empty or contain only spaces'));\n            }\n            const existingOption = options.find((option) => option.text === trimmedValue);\n            if (existingOption) {\n              return new Error(t('Option already exists'));\n            }\n            return;\n          },\n        },\n      }}\n      onSubmit={async (value) => {\n        const { poll_option } = await client.createPollOption(poll.id, {\n          text: value.optionText,\n        });\n        poll.castVote(poll_option.id, messageId);\n      }}\n      shouldDisableSubmitButton={(value) => !value.optionText}\n      title={t('Suggest an option')}\n    />\n  );\n};\n", "import React from 'react';\nimport { ModalHeader } from '../../Modal/ModalHeader';\nimport { PollVote } from '../PollVote';\nimport { usePollAnswerPagination } from '../hooks';\nimport { InfiniteScrollPaginator } from '../../InfiniteScrollPaginator/InfiniteScrollPaginator';\nimport { LoadingIndicator } from '../../Loading';\nimport { useStateStore } from '../../../store';\nimport { usePollContext, useTranslationContext } from '../../../context';\n\nimport type { PollAnswer, PollState } from 'stream-chat';\n\ntype PollStateSelectorReturnValue = {\n  is_closed: boolean | undefined;\n  ownAnswer: PollAnswer | undefined;\n};\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n  is_closed: nextValue.is_closed,\n  ownAnswer: nextValue.ownAnswer,\n});\n\nexport type PollAnswerListProps = {\n  onUpdateOwnAnswerClick: () => void;\n  close?: () => void;\n};\n\nexport const PollAnswerList = ({\n  close,\n  onUpdateOwnAnswerClick,\n}: PollAnswerListProps) => {\n  const { t } = useTranslationContext();\n  const { poll } = usePollContext();\n  const { is_closed, ownAnswer } = useStateStore(poll.state, pollStateSelector);\n\n  const { answers, error, hasNextPage, loading, loadMore } = usePollAnswerPagination();\n\n  return (\n    <div className='str-chat__modal__poll-answer-list'>\n      <ModalHeader close={close} title={t('Poll comments')} />\n      <div className='str-chat__modal__poll-answer-list__body'>\n        <InfiniteScrollPaginator loadNextOnScrollToBottom={loadMore} threshold={40}>\n          <div className='str-chat__poll-answer-list'>\n            {answers.map((answer) => (\n              <div className='str-chat__poll-answer' key={`comment-${answer.id}`}>\n                {answer.answer_text && (\n                  <p className='str-chat__poll-answer__text'>{answer.answer_text}</p>\n                )}\n                <PollVote key={`poll-vote-${answer.id}`} vote={answer} />\n              </div>\n            ))}\n          </div>\n          {hasNextPage && (\n            <div className='str-chat__loading-indicator-placeholder'>\n              {loading && <LoadingIndicator />}\n            </div>\n          )}\n        </InfiniteScrollPaginator>\n        {error?.message && <div>{error?.message}</div>}\n      </div>\n      {answers.length > 0 && !is_closed && (\n        <button className='str-chat__poll-action' onClick={onUpdateOwnAnswerClick}>\n          {ownAnswer ? t('Update your comment') : t('Add a comment')}\n        </button>\n      )}\n    </div>\n  );\n};\n", "import React from 'react';\nimport clsx from 'clsx';\n\nexport type ModalHeaderProps = {\n  title: string;\n  className?: string;\n  close?: () => void;\n  goBack?: () => void;\n};\n\nexport const ModalHeader = ({ className, close, goBack, title }: ModalHeaderProps) => (\n  <div className={clsx('str-chat__modal-header', className)}>\n    {goBack && (\n      <button className='str-chat__modal-header__go-back-button' onClick={goBack} />\n    )}\n    <div className='str-chat__modal-header__title'>{title}</div>\n    {close && <button className='str-chat__modal-header__close-button' onClick={close} />}\n  </div>\n);\n", "import React, { useState } from 'react';\nimport { Avatar } from '../Avatar';\nimport { PopperTooltip } from '../Tooltip';\nimport { useEnterLeaveHandlers } from '../Tooltip/hooks';\nimport { useChatContext, useTranslationContext } from '../../context';\n\nimport type { PollVote as PollVoteType } from 'stream-chat';\n\nconst PollVoteTimestamp = ({ timestamp }: { timestamp: string }) => {\n  const { t } = useTranslationContext();\n  const { handleEnter, handleLeave, tooltipVisible } =\n    useEnterLeaveHandlers<HTMLSpanElement>();\n  const [referenceElement, setReferenceElement] = useState<HTMLSpanElement | null>(null);\n  const timestampDate = new Date(timestamp);\n  return (\n    <div\n      className='str-chat__poll-vote__timestamp'\n      onMouseEnter={handleEnter}\n      onMouseLeave={handleLeave}\n      ref={setReferenceElement}\n    >\n      {t('timestamp/PollVote', { timestamp: timestampDate })}\n      <PopperTooltip\n        offset={[0, 5]}\n        placement='bottom'\n        referenceElement={referenceElement}\n        visible={tooltipVisible}\n      >\n        {t('timestamp/PollVoteTooltip', { timestamp: timestampDate })}\n      </PopperTooltip>\n    </div>\n  );\n};\n\ntype PollVoteProps = {\n  vote: PollVoteType;\n};\n\nconst PollVoteAuthor = ({ vote }: PollVoteProps) => {\n  const { t } = useTranslationContext();\n  const { client } = useChatContext();\n  const { handleEnter, handleLeave, tooltipVisible } =\n    useEnterLeaveHandlers<HTMLSpanElement>();\n  const [referenceElement, setReferenceElement] = useState<HTMLSpanElement | null>(null);\n  const displayName =\n    client.user?.id && client.user.id === vote.user?.id\n      ? t('You')\n      : vote.user?.name || t('Anonymous');\n\n  return (\n    <div\n      className='str-chat__poll-vote__author'\n      onMouseEnter={handleEnter}\n      onMouseLeave={handleLeave}\n      ref={setReferenceElement}\n    >\n      {vote.user && (\n        <Avatar\n          className='str-chat__avatar--poll-vote-author'\n          image={vote.user.image}\n          key={`poll-vote-${vote.id}-avatar-${vote.user.id}`}\n          name={vote.user.name}\n        />\n      )}\n      <div className='str-chat__poll-vote__author__name'>{displayName}</div>\n      <PopperTooltip\n        offset={[0, 5]}\n        placement='bottom'\n        referenceElement={referenceElement}\n        visible={tooltipVisible}\n      >\n        {displayName}\n      </PopperTooltip>\n    </div>\n  );\n};\n\nexport const PollVote = ({ vote }: PollVoteProps) => (\n  <div className='str-chat__poll-vote'>\n    <PollVoteAuthor vote={vote} />\n    <PollVoteTimestamp timestamp={vote.created_at} />\n  </div>\n);\n\nexport type PollVoteListingProps = {\n  votes: PollVoteType[];\n};\n\nexport const PollVoteListing = ({ votes }: PollVoteListingProps) => (\n  <div className='str-chat__poll-vote-listing'>\n    {votes.map((vote) => (\n      <PollVote key={`poll-vote-${vote.id}`} vote={vote} />\n    ))}\n  </div>\n);\n", "import { useCallback } from 'react';\nimport { useManagePollVotesRealtime } from './useManagePollVotesRealtime';\nimport type {\n  CursorPaginatorState,\n  PaginationFn,\n} from '../../InfiniteScrollPaginator/hooks/useCursorPaginator';\nimport { useCursorPaginator } from '../../InfiniteScrollPaginator/hooks/useCursorPaginator';\nimport { usePollContext } from '../../../context';\n\nimport { useStateStore } from '../../../store';\nimport type { PollAnswer, PollAnswersQueryParams, PollVote } from 'stream-chat';\n\nconst paginationStateSelector = (\n  state: CursorPaginatorState<PollVote>,\n): [Error | undefined, boolean, boolean] => [\n  state.error,\n  state.hasNextPage,\n  state.loading,\n];\n\ntype UsePollAnswerPaginationParams = {\n  paginationParams?: PollAnswersQueryParams;\n};\n\nexport const usePollAnswerPagination = ({\n  paginationParams,\n}: UsePollAnswerPaginationParams = {}) => {\n  const { poll } = usePollContext();\n\n  const paginationFn = useCallback<PaginationFn<PollAnswer>>(\n    async (next) => {\n      const { next: newNext, votes } = await poll.queryAnswers({\n        filter: paginationParams?.filter,\n        options: !next\n          ? paginationParams?.options\n          : { ...paginationParams?.options, next },\n        sort: { created_at: -1, ...paginationParams?.sort },\n      });\n      return { items: votes, next: newNext };\n    },\n    [paginationParams, poll],\n  );\n\n  const { cursorPaginatorState, loadMore } = useCursorPaginator(paginationFn, true);\n  const answers = useManagePollVotesRealtime<PollAnswer>('answer', cursorPaginatorState);\n  const [error, hasNextPage, loading] = useStateStore(\n    cursorPaginatorState,\n    paginationStateSelector,\n  );\n\n  return {\n    answers,\n    error,\n    hasNextPage,\n    loading,\n    loadMore,\n  };\n};\n", "import { useEffect, useState } from 'react';\nimport { isVoteAnswer } from 'stream-chat';\nimport { useChatContext } from '../../../context';\nimport type { Event, PollAnswer, PollVote } from 'stream-chat';\n\nimport type { CursorPaginatorStateStore } from '../../InfiniteScrollPaginator/hooks/useCursorPaginator';\n\nexport function useManagePollVotesRealtime<T extends PollVote | PollAnswer = PollVote>(\n  managedVoteType: 'answer' | 'vote',\n  cursorPaginatorState?: CursorPaginatorStateStore<T>,\n  optionId?: string,\n) {\n  const { client } = useChatContext();\n  const [votesInRealtime, setVotesInRealtime] = useState<T[]>(\n    cursorPaginatorState?.getLatestValue().items ?? [],\n  );\n\n  useEffect(\n    () =>\n      cursorPaginatorState?.subscribeWithSelector(\n        (state) => [state.latestPageItems],\n        ([latestPageItems]) =>\n          setVotesInRealtime((prev) => [...prev, ...latestPageItems]),\n      ),\n    [cursorPaginatorState],\n  );\n\n  useEffect(() => {\n    const handleVoteEvent = (event: Event) => {\n      if (!event.poll_vote) return;\n      const isAnswer = isVoteAnswer(event.poll_vote);\n      if (\n        (managedVoteType === 'answer' && !isAnswer) ||\n        (managedVoteType === 'vote' &&\n          (isAnswer || event.poll_vote.option_id !== optionId))\n      )\n        return;\n\n      if (event.type === 'poll.vote_removed') {\n        setVotesInRealtime((prev) =>\n          event.poll_vote\n            ? prev.filter((vote) => vote.id !== (event.poll_vote as T).id)\n            : prev,\n        );\n      }\n      if (event.type === 'poll.vote_changed') {\n        setVotesInRealtime((prev) =>\n          event.poll_vote\n            ? prev.filter((vote) => vote.id !== (event.poll_vote as T).id)\n            : prev,\n        );\n      }\n      if (['poll.vote_casted', 'poll.vote_changed'].includes(event.type)) {\n        setVotesInRealtime((prev) =>\n          event.poll_vote ? [event.poll_vote as T, ...prev] : prev,\n        );\n      }\n    };\n\n    const voteCastedSubscription = client.on('poll.vote_casted', handleVoteEvent);\n    const voteRemovedSubscription = client.on('poll.vote_removed', handleVoteEvent);\n    const voteChangedSubscription = client.on('poll.vote_changed', handleVoteEvent);\n\n    return () => {\n      voteCastedSubscription.unsubscribe();\n      voteRemovedSubscription.unsubscribe();\n      voteChangedSubscription.unsubscribe();\n    };\n  }, [client, optionId, managedVoteType]);\n\n  return votesInRealtime;\n}\n", "import uniqBy from 'lodash.uniqby';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { StateStore } from 'stream-chat';\n\nexport type CursorPaginatorState<T> = {\n  hasNextPage: boolean;\n  items: T[];\n  latestPageItems: T[];\n  loading: boolean;\n  error?: Error;\n  next?: string | null;\n};\n\nexport type CursorPaginatorStateStore<T> = StateStore<CursorPaginatorState<T>>;\n\nexport type PaginationFn<T> = (next?: string) => Promise<{ items: T[]; next?: string }>;\n\nexport const useCursorPaginator = <T>(\n  paginationFn: PaginationFn<T>,\n  loadFirstPage?: boolean,\n) => {\n  const cursorPaginatorState = useMemo(\n    () =>\n      new StateStore<CursorPaginatorState<T>>({\n        hasNextPage: true,\n        items: [],\n        latestPageItems: [],\n        loading: false,\n      }),\n    [],\n  );\n\n  const loadMore = useCallback(async () => {\n    const { loading, next: currentNext } = cursorPaginatorState.getLatestValue();\n    if (currentNext === null || loading) return;\n\n    cursorPaginatorState.partialNext({ loading: true });\n\n    try {\n      const { items, next } = await paginationFn(currentNext);\n      cursorPaginatorState.next((prev) => ({\n        ...prev,\n        hasNextPage: !!next,\n        items: uniqBy(prev.items.concat(items), 'id'),\n        latestPageItems: items,\n        next: next || null,\n      }));\n    } catch (error) {\n      cursorPaginatorState.partialNext({ error: error as Error });\n    }\n    cursorPaginatorState.partialNext({ loading: false });\n  }, [cursorPaginatorState, paginationFn]);\n\n  useEffect(() => {\n    const { items } = cursorPaginatorState.getLatestValue();\n    if (!loadFirstPage || items.length) return;\n    loadMore();\n  }, [cursorPaginatorState, loadFirstPage, loadMore]);\n\n  return {\n    cursorPaginatorState,\n    loadMore,\n  };\n};\n", "import { useCallback } from 'react';\nimport { useManagePollVotesRealtime } from './useManagePollVotesRealtime';\nimport type {\n  CursorPaginatorState,\n  PaginationFn,\n} from '../../InfiniteScrollPaginator/hooks/useCursorPaginator';\nimport { useCursorPaginator } from '../../InfiniteScrollPaginator/hooks/useCursorPaginator';\nimport { useStateStore } from '../../../store';\nimport { usePollContext } from '../../../context';\n\nimport type { PollOptionVotesQueryParams, PollVote } from 'stream-chat';\n\nconst paginationStateSelector = (\n  state: CursorPaginatorState<PollVote>,\n): [Error | undefined, boolean, boolean] => [\n  state.error,\n  state.hasNextPage,\n  state.loading,\n];\n\ntype UsePollOptionVotesPaginationParams = {\n  paginationParams: PollOptionVotesQueryParams;\n};\n\nexport const usePollOptionVotesPagination = ({\n  paginationParams,\n}: UsePollOptionVotesPaginationParams) => {\n  const { poll } = usePollContext();\n\n  const paginationFn = useCallback<PaginationFn<PollVote>>(\n    async (next) => {\n      const { next: newNext, votes } = await poll.queryOptionVotes({\n        filter: paginationParams.filter,\n        options: !next\n          ? paginationParams?.options\n          : { ...paginationParams?.options, next },\n        sort: { created_at: -1, ...paginationParams?.sort },\n      });\n      return { items: votes, next: newNext };\n    },\n    [paginationParams, poll],\n  );\n\n  const { cursorPaginatorState, loadMore } = useCursorPaginator(paginationFn, true);\n  const votes = useManagePollVotesRealtime<PollVote>(\n    'vote',\n    cursorPaginatorState,\n    paginationParams.filter.option_id,\n  );\n  const [error, hasNextPage, loading] = useStateStore(\n    cursorPaginatorState,\n    paginationStateSelector,\n  );\n\n  return {\n    error,\n    hasNextPage,\n    loading,\n    loadMore,\n    votes,\n  };\n};\n", "import clsx from 'clsx';\nimport debounce from 'lodash.debounce';\nimport type { PropsWithChildren } from 'react';\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD } from '../../constants/limits';\n\n/**\n * Prevents Chrome hangups\n * See: https://stackoverflow.com/questions/47524205/random-high-content-download-time-in-chrome/47684257#47684257\n */\nconst mousewheelListener = (event: Event) => {\n  if (event instanceof WheelEvent && event.deltaY === 1) {\n    event.preventDefault();\n  }\n};\n\nexport type InfiniteScrollPaginatorProps = React.ComponentProps<'div'> & {\n  listenToScroll?: (\n    distanceFromBottom: number,\n    distanceFromTop: number,\n    threshold: number,\n  ) => void;\n  loadNextDebounceMs?: number;\n  loadNextOnScrollToBottom?: () => void;\n  loadNextOnScrollToTop?: () => void;\n  /** Offset from when to start the loadNextPage call */\n  threshold?: number;\n  useCapture?: boolean;\n};\n\nexport const InfiniteScrollPaginator = (\n  props: PropsWithChildren<InfiniteScrollPaginatorProps>,\n) => {\n  const {\n    children,\n    className,\n    listenToScroll,\n    loadNextDebounceMs = 500,\n    loadNextOnScrollToBottom,\n    loadNextOnScrollToTop,\n    threshold = DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD,\n    useCapture = false,\n    ...componentProps\n  } = props;\n\n  const rootRef = useRef<HTMLDivElement | null>(null);\n  const childRef = useRef<HTMLDivElement | null>(null);\n\n  const scrollListener = useMemo(\n    () =>\n      debounce(() => {\n        const root = rootRef.current;\n        const child = childRef.current;\n        if (!root || root.offsetParent === null || !child) {\n          return;\n        }\n\n        const distanceFromBottom =\n          child.scrollHeight - root.scrollTop - root.clientHeight;\n        const distanceFromTop = root.scrollTop;\n\n        if (listenToScroll) {\n          listenToScroll(distanceFromBottom, distanceFromTop, threshold);\n        }\n\n        if (distanceFromTop < Number(threshold)) {\n          loadNextOnScrollToTop?.();\n        }\n\n        if (distanceFromBottom < Number(threshold)) {\n          loadNextOnScrollToBottom?.();\n        }\n      }, loadNextDebounceMs),\n    [\n      listenToScroll,\n      loadNextDebounceMs,\n      loadNextOnScrollToBottom,\n      loadNextOnScrollToTop,\n      threshold,\n    ],\n  );\n\n  useEffect(() => {\n    const scrollElement = rootRef.current;\n    if (!scrollElement) return;\n\n    scrollElement.addEventListener('scroll', scrollListener, useCapture);\n\n    return () => {\n      scrollElement.removeEventListener('scroll', scrollListener, useCapture);\n    };\n  }, [scrollListener, useCapture]);\n\n  useEffect(() => {\n    const root = rootRef.current;\n    if (!root || typeof ResizeObserver === 'undefined' || !scrollListener) return;\n    const observer = new ResizeObserver(scrollListener);\n    observer.observe(root as Element);\n\n    return () => {\n      observer.disconnect();\n    };\n  }, [scrollListener]);\n\n  useEffect(() => {\n    const root = rootRef.current;\n    if (root) {\n      root.addEventListener('wheel', mousewheelListener, { passive: false });\n    }\n    return () => {\n      if (root) {\n        root.removeEventListener('wheel', mousewheelListener, useCapture);\n      }\n    };\n  }, [useCapture]);\n\n  return (\n    <div\n      {...componentProps}\n      className={clsx('str-chat__infinite-scroll-paginator', className)}\n      ref={rootRef}\n    >\n      <div className='str-chat__infinite-scroll-paginator__content' ref={childRef}>\n        {children}\n      </div>\n    </div>\n  );\n};\n", "export const DEFAULT_NEXT_CHANNEL_PAGE_SIZE = 25;\nexport const DEFAULT_JUMP_TO_PAGE_SIZE = 25;\nexport const DEFAULT_THREAD_PAGE_SIZE = 25;\nexport const DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD = 250;\nexport const DEFAULT_HIGHLIGHT_DURATION = 500;\n", "import React from 'react';\nimport { ModalHeader } from '../../Modal/ModalHeader';\nimport { PollOptionList } from '../PollOptionList';\nimport { useStateStore } from '../../../store';\nimport { usePollContext, useTranslationContext } from '../../../context';\n\nimport type { PollState } from 'stream-chat';\n\ntype PollStateSelectorReturnValue = { name: string };\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n  name: nextValue.name,\n});\n\nexport type FullPollOptionsListingProps = {\n  close?: () => void;\n};\n\nexport const PollOptionsFullList = ({ close }: FullPollOptionsListingProps) => {\n  const { t } = useTranslationContext();\n  const { poll } = usePollContext();\n  const { name } = useStateStore(poll.state, pollStateSelector);\n\n  return (\n    <div className={'str-chat__modal__poll-option-list'}>\n      <ModalHeader close={close} title={t('Poll options')} />\n      <div className='str-chat__modal__poll-option-list__body'>\n        <div className='str-chat__modal__poll-option-list__title'>{name}</div>\n        <PollOptionList />\n      </div>\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport React from 'react';\nimport { PollOptionSelector as DefaultPollOptionSelector } from './PollOptionSelector';\nimport { useStateStore } from '../../store';\nimport { useComponentContext, usePollContext } from '../../context';\nimport type { PollOption, PollState } from 'stream-chat';\n\ntype PollStateSelectorReturnValue = { options: PollOption[] };\n\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n  options: nextValue.options,\n});\n\nexport type PollOptionListProps = {\n  optionsDisplayCount?: number;\n};\n\nexport const PollOptionList = ({ optionsDisplayCount }: PollOptionListProps) => {\n  const { PollOptionSelector = DefaultPollOptionSelector } = useComponentContext();\n  const { poll } = usePollContext();\n  const { options } = useStateStore(poll.state, pollStateSelector);\n\n  return (\n    <div\n      className={clsx('str-chat__poll-option-list', {\n        'str-chat__poll-option-list--full': typeof optionsDisplayCount === 'undefined',\n      })}\n    >\n      {options.slice(0, optionsDisplayCount ?? options.length).map((option) => (\n        <PollOptionSelector\n          displayAvatarCount={3}\n          key={`poll-option-${option.id}`}\n          option={option}\n        />\n      ))}\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport debounce from 'lodash.debounce';\nimport React, { useMemo } from 'react';\nimport { isVoteAnswer } from 'stream-chat';\nimport { Avatar } from '../Avatar';\nimport {\n  useChannelStateContext,\n  useMessageContext,\n  usePollContext,\n  useTranslationContext,\n} from '../../context';\nimport { useStateStore } from '../../store';\nimport type { PollOption, PollState, PollVote, VotingVisibility } from 'stream-chat';\n\ntype AmountBarProps = {\n  amount: number;\n  className?: string;\n};\n\nexport const AmountBar = ({ amount, className }: AmountBarProps) => (\n  <div\n    className={clsx('str-chat__amount-bar', className)}\n    data-testid='amount-bar'\n    role='progressbar'\n    style={\n      {\n        '--str-chat__amount-bar-fulfillment': amount + '%',\n      } as React.CSSProperties\n    }\n  />\n);\n\nexport type CheckmarkProps = { checked?: boolean };\n\nexport const Checkmark = ({ checked }: CheckmarkProps) => (\n  <div\n    className={clsx('str-chat__checkmark', { 'str-chat__checkmark--checked': checked })}\n  />\n);\n\ntype PollStateSelectorReturnValue = {\n  is_closed: boolean | undefined;\n  latest_votes_by_option: Record<string, PollVote[]>;\n  maxVotedOptionIds: string[];\n  ownVotesByOptionId: Record<string, PollVote>;\n  vote_counts_by_option: Record<string, number>;\n  voting_visibility: VotingVisibility | undefined;\n};\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n  is_closed: nextValue.is_closed,\n  latest_votes_by_option: nextValue.latest_votes_by_option,\n  maxVotedOptionIds: nextValue.maxVotedOptionIds,\n  ownVotesByOptionId: nextValue.ownVotesByOptionId,\n  vote_counts_by_option: nextValue.vote_counts_by_option,\n  voting_visibility: nextValue.voting_visibility,\n});\n\nexport type PollOptionSelectorProps = {\n  option: PollOption;\n  displayAvatarCount?: number;\n  voteCountVerbose?: boolean;\n};\n\nexport const PollOptionSelector = ({\n  displayAvatarCount,\n  option,\n  voteCountVerbose,\n}: PollOptionSelectorProps) => {\n  const { t } = useTranslationContext();\n  const { channelCapabilities = {} } = useChannelStateContext('PollOptionsShortlist');\n  const { message } = useMessageContext();\n\n  const { poll } = usePollContext();\n  const {\n    is_closed,\n    latest_votes_by_option,\n    maxVotedOptionIds,\n    ownVotesByOptionId,\n    vote_counts_by_option,\n    voting_visibility,\n  } = useStateStore(poll.state, pollStateSelector);\n  const canCastVote = channelCapabilities['cast-poll-vote'] && !is_closed;\n  const winningOptionCount = maxVotedOptionIds[0]\n    ? vote_counts_by_option[maxVotedOptionIds[0]]\n    : 0;\n\n  const toggleVote = useMemo(\n    () =>\n      debounce(() => {\n        if (!canCastVote) return;\n        const haveVotedForTheOption = !!ownVotesByOptionId[option.id];\n        return haveVotedForTheOption\n          ? poll.removeVote(ownVotesByOptionId[option.id].id, message.id)\n          : poll.castVote(option.id, message.id);\n      }, 100),\n    [canCastVote, message.id, option.id, ownVotesByOptionId, poll],\n  );\n\n  return (\n    <div\n      className={clsx('str-chat__poll-option', {\n        'str-chat__poll-option--votable': canCastVote,\n      })}\n      key={`base-poll-option-${option.id}`}\n      onClick={toggleVote}\n    >\n      {canCastVote && <Checkmark checked={!!ownVotesByOptionId[option.id]} />}\n      <div className='str-chat__poll-option-data'>\n        <p className='str-chat__poll-option-text'>{option.text}</p>\n        {displayAvatarCount && voting_visibility === 'public' && (\n          <div className='str-chat__poll-option-voters'>\n            {latest_votes_by_option?.[option.id] &&\n              (latest_votes_by_option[option.id] as PollVote[])\n                .filter((vote) => !!vote.user && !isVoteAnswer(vote))\n                .slice(0, displayAvatarCount)\n                .map(({ user }) => (\n                  <Avatar\n                    image={user?.image}\n                    key={`poll-option-${option.id}-avatar-${user?.id}`}\n                    name={user?.name}\n                  />\n                ))}\n          </div>\n        )}\n        <div className='str-chat__poll-option-vote-count'>\n          {voteCountVerbose\n            ? t('{{count}} votes', {\n                count: vote_counts_by_option[option.id] ?? 0,\n              })\n            : (vote_counts_by_option[option.id] ?? 0)}\n        </div>\n      </div>\n      <AmountBar\n        amount={\n          (winningOptionCount &&\n            (vote_counts_by_option[option.id] ?? 0) / winningOptionCount) * 100\n        }\n        className={clsx('str-chat__poll-option__votes-bar', {\n          'str-chat__poll-option__votes-bar--winner':\n            is_closed &&\n            maxVotedOptionIds.length === 1 &&\n            maxVotedOptionIds[0] === option.id,\n        })}\n      />\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport React, { useCallback, useState } from 'react';\nimport { PollOptionVotesList } from './PollOptionVotesList';\nimport { PollOptionWithLatestVotes } from './PollOptionWithLatestVotes';\nimport { ModalHeader } from '../../../Modal/ModalHeader';\nimport { useStateStore } from '../../../../store';\nimport { usePollContext, useTranslationContext } from '../../../../context';\nimport type { PollOption, PollState } from 'stream-chat';\n\ntype PollStateSelectorReturnValue = {\n  name: string;\n  options: PollOption[];\n  vote_counts_by_option: Record<string, number>;\n};\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n  name: nextValue.name,\n  options: [...nextValue.options],\n  vote_counts_by_option: nextValue.vote_counts_by_option,\n});\n\nexport type PollResultsProps = {\n  close?: () => void;\n};\n\nexport const PollResults = ({ close }: PollResultsProps) => {\n  const { t } = useTranslationContext();\n  const { poll } = usePollContext();\n  const { name, options, vote_counts_by_option } = useStateStore(\n    poll.state,\n    pollStateSelector,\n  );\n  const [optionToView, setOptionToView] = useState<PollOption>();\n\n  const goBack = useCallback(() => setOptionToView(undefined), []);\n\n  return (\n    <div\n      className={clsx('str-chat__modal__poll-results', {\n        'str-chat__modal__poll-results--option-detail': optionToView,\n      })}\n    >\n      {optionToView ? (\n        <>\n          <ModalHeader close={close} goBack={goBack} title={optionToView.text} />\n          <div className='str-chat__modal__poll-results__body'>\n            <PollOptionVotesList\n              key={`poll-option-detail-${optionToView.id}`}\n              option={optionToView}\n            />\n          </div>\n        </>\n      ) : (\n        <>\n          <ModalHeader close={close} title={t('Poll results')} />\n          <div className='str-chat__modal__poll-results__body'>\n            <div className='str-chat__modal__poll-results__title'>{name}</div>\n            <div className='str-chat__modal__poll-results__option-list'>\n              {options\n                .sort((next, current) =>\n                  (vote_counts_by_option[current.id] ?? 0) >=\n                  (vote_counts_by_option[next.id] ?? 0)\n                    ? 1\n                    : -1,\n                )\n                .map((option) => (\n                  <PollOptionWithLatestVotes\n                    key={`poll-option-${option.id}`}\n                    option={option}\n                    showAllVotes={() => setOptionToView(option)}\n                  />\n                ))}\n            </div>\n          </div>\n        </>\n      )}\n    </div>\n  );\n};\n", "import React, { useMemo } from 'react';\nimport { PollVoteListing } from '../../PollVote';\nimport { usePollOptionVotesPagination } from '../../hooks';\nimport { LoadingIndicator } from '../../../Loading';\nimport { InfiniteScrollPaginator } from '../../../InfiniteScrollPaginator/InfiniteScrollPaginator';\nimport { PollOptionWithVotesHeader } from './PollOptionWithVotesHeader';\nimport type { PollOption, PollOptionVotesQueryParams } from 'stream-chat';\n\nexport type PollOptionVotesListingProps = {\n  option: PollOption;\n};\n\nexport const PollOptionVotesList = ({ option }: PollOptionVotesListingProps) => {\n  const paginationParams = useMemo<PollOptionVotesQueryParams>(\n    () => ({ filter: { option_id: option.id } }),\n    [option.id],\n  );\n  const { error, hasNextPage, loading, loadMore, votes } = usePollOptionVotesPagination({\n    paginationParams,\n  });\n\n  return (\n    <div className='str-chat__poll-option str-chat__poll-option--full-vote-list'>\n      <PollOptionWithVotesHeader option={option} />\n      <InfiniteScrollPaginator loadNextOnScrollToBottom={loadMore} threshold={40}>\n        <PollVoteListing votes={votes} />\n        {hasNextPage && (\n          <div className='str-chat__loading-indicator-placeholder'>\n            {loading && <LoadingIndicator />}\n          </div>\n        )}\n      </InfiniteScrollPaginator>\n      {error && error.message}\n    </div>\n  );\n};\n", "import React from 'react';\nimport { useStateStore } from '../../../../store';\nimport { usePollContext, useTranslationContext } from '../../../../context';\nimport type { PollOption, PollState } from 'stream-chat';\n\ntype PollStateSelectorReturnValue = {\n  maxVotedOptionIds: string[];\n  vote_counts_by_option: Record<string, number>;\n};\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n  maxVotedOptionIds: nextValue.maxVotedOptionIds,\n  vote_counts_by_option: nextValue.vote_counts_by_option,\n});\n\nexport type PollResultOptionVoteCounterProps = {\n  optionId: string;\n};\n\nexport const PollResultOptionVoteCounter = ({\n  optionId,\n}: PollResultOptionVoteCounterProps) => {\n  const { t } = useTranslationContext();\n  const { poll } = usePollContext();\n  const { maxVotedOptionIds, vote_counts_by_option } = useStateStore(\n    poll.state,\n    pollStateSelector,\n  );\n\n  return (\n    <div className='str-chat__poll-result-option-vote-counter'>\n      {maxVotedOptionIds.length === 1 && maxVotedOptionIds[0] === optionId && (\n        <div className='str-chat__poll-result-winning-option-icon' />\n      )}\n      <span className='str-chat__poll-result-option-vote-count'>\n        {t('{{count}} votes', { count: vote_counts_by_option[optionId] ?? 0 })}\n      </span>\n    </div>\n  );\n};\n\nexport type PollOptionWithVotesHeaderProps = {\n  option: PollOption;\n};\n\nexport const PollOptionWithVotesHeader = ({ option }: PollOptionWithVotesHeaderProps) => (\n  <div className='str-chat__poll-option__header'>\n    <div className='str-chat__poll-option__option-text'>{option.text}</div>\n    <PollResultOptionVoteCounter optionId={option.id} />\n  </div>\n);\n", "import React from 'react';\nimport { PollOptionWithVotesHeader } from './PollOptionWithVotesHeader';\nimport { PollVoteListing } from '../../PollVote';\nimport { useStateStore } from '../../../../store';\nimport {\n  useChannelStateContext,\n  usePollContext,\n  useTranslationContext,\n} from '../../../../context';\nimport type { PollOption, PollState, PollVote } from 'stream-chat';\n\ntype PollStateSelectorReturnValue = {\n  latest_votes_by_option: Record<string, PollVote[]>;\n};\n\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n  latest_votes_by_option: nextValue.latest_votes_by_option,\n});\n\nexport type PollOptionWithVotesProps = {\n  option: PollOption;\n  countVotesPreview?: number;\n  showAllVotes?: () => void;\n};\n\nexport const PollOptionWithLatestVotes = ({\n  countVotesPreview = 5,\n  option,\n  showAllVotes,\n}: PollOptionWithVotesProps) => {\n  const { t } = useTranslationContext();\n  const { channelCapabilities = {} } = useChannelStateContext(\n    'PollOptionWithLatestVotes',\n  );\n  const { poll } = usePollContext();\n  const { latest_votes_by_option } = useStateStore(poll.state, pollStateSelector);\n\n  const votes = latest_votes_by_option && latest_votes_by_option[option.id];\n\n  return (\n    <div className='str-chat__poll-option'>\n      <PollOptionWithVotesHeader option={option} />\n      {votes && <PollVoteListing votes={votes.slice(0, countVotesPreview)} />}\n      {channelCapabilities['query-poll-votes'] &&\n        showAllVotes &&\n        votes?.length > countVotesPreview && (\n          <button\n            className='str-chat__poll-option__show-all-votes-button'\n            onClick={showAllVotes}\n          >\n            {t('Show all')}\n          </button>\n        )}\n    </div>\n  );\n};\n", "export const MAX_POLL_OPTIONS = 100 as const;\n\nexport const MAX_OPTIONS_DISPLAYED = 10 as const;\n", "import clsx from 'clsx';\nimport React from 'react';\nimport { usePollContext } from '../../context';\nimport { useStateStore } from '../../store';\nimport type { PollState } from 'stream-chat';\n\ntype PollStateSelectorQuotedPollReturnValue = {\n  is_closed: boolean | undefined;\n  name: string;\n};\nconst pollStateSelectorQuotedPoll = (\n  nextValue: PollState,\n): PollStateSelectorQuotedPollReturnValue => ({\n  is_closed: nextValue.is_closed,\n  name: nextValue.name,\n});\n\nexport const QuotedPoll = () => {\n  const { poll } = usePollContext();\n  const { is_closed, name } = useStateStore(poll.state, pollStateSelectorQuotedPoll);\n\n  return (\n    <div\n      className={clsx('str-chat__quoted-poll-preview', {\n        'str-chat__quoted-poll-preview--closed': is_closed,\n      })}\n    >\n      <div className='str-chat__quoted-poll-preview__icon'>\uD83D\uDCCA</div>\n      <div className='str-chat__quoted-poll-preview__name'>{name}</div>\n    </div>\n  );\n};\n", "import React, { useCallback } from 'react';\nimport type { PollComposerState } from 'stream-chat';\nimport { VotingVisibility } from 'stream-chat';\nimport { MultipleAnswersField } from './MultipleAnswersField';\nimport { NameField } from './NameField';\nimport { OptionFieldSet } from './OptionFieldSet';\nimport { PollCreationDialogControls } from './PollCreationDialogControls';\nimport { ModalHeader } from '../../Modal/ModalHeader';\nimport { SimpleSwitchField } from '../../Form/SwitchField';\nimport { useMessageComposer } from '../../MessageInput';\nimport { useTranslationContext } from '../../../context';\nimport { useStateStore } from '../../../store';\n\nexport type PollCreationDialogProps = {\n  close: () => void;\n};\n\nconst pollComposerStateSelector = (state: PollComposerState) => ({\n  allow_answers: state.data.allow_answers,\n  allow_user_suggested_options: state.data.allow_user_suggested_options,\n  voting_visibility: state.data.voting_visibility,\n});\n\nexport const PollCreationDialog = ({ close }: PollCreationDialogProps) => {\n  const { t } = useTranslationContext();\n  const { pollComposer } = useMessageComposer();\n  const { allow_answers, allow_user_suggested_options, voting_visibility } =\n    useStateStore(pollComposer.state, pollComposerStateSelector);\n\n  const onClose = useCallback(() => {\n    pollComposer.initState();\n    close();\n  }, [pollComposer, close]);\n\n  return (\n    <div\n      className='str-chat__dialog str-chat__poll-creation-dialog'\n      data-testid='poll-creation-dialog'\n    >\n      <ModalHeader close={onClose} title={t('Create poll')} />\n      <div className='str-chat__dialog__body'>\n        <form autoComplete='off'>\n          <NameField />\n          <OptionFieldSet />\n          <MultipleAnswersField />\n          <SimpleSwitchField\n            checked={voting_visibility === 'anonymous'}\n            id='voting_visibility'\n            labelText={t('Anonymous poll')}\n            onChange={(e) =>\n              pollComposer.updateFields({\n                voting_visibility: e.target.checked\n                  ? VotingVisibility.anonymous\n                  : VotingVisibility.public,\n              })\n            }\n          />\n          <SimpleSwitchField\n            checked={allow_user_suggested_options}\n            id='allow_user_suggested_options'\n            labelText={t('Allow option suggestion')}\n            onChange={(e) =>\n              pollComposer.updateFields({\n                allow_user_suggested_options: e.target.checked,\n              })\n            }\n          />\n          <SimpleSwitchField\n            checked={allow_answers}\n            id='allow_answers'\n            labelText={t('Allow comments')}\n            onChange={(e) =>\n              pollComposer.updateFields({ allow_answers: e.target.checked })\n            }\n          />\n        </form>\n      </div>\n      <PollCreationDialogControls close={close} />\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport React, { useMemo } from 'react';\nimport { SimpleSwitchField } from '../../Form/SwitchField';\nimport { FieldError } from '../../Form/FieldError';\nimport { useTranslationContext } from '../../../context';\nimport { useMessageComposer } from '../../MessageInput';\nimport { useStateStore } from '../../../store';\nimport type { PollComposerState } from 'stream-chat';\n\nconst pollComposerStateSelector = (state: PollComposerState) => ({\n  enforce_unique_vote: state.data.enforce_unique_vote,\n  error: state.errors.max_votes_allowed,\n  max_votes_allowed: state.data.max_votes_allowed,\n});\n\nexport const MultipleAnswersField = () => {\n  const { t } = useTranslationContext();\n  const { pollComposer } = useMessageComposer();\n  const { enforce_unique_vote, error, max_votes_allowed } = useStateStore(\n    pollComposer.state,\n    pollComposerStateSelector,\n  );\n\n  const knownValidationErrors = useMemo<Record<string, string>>(\n    () => ({\n      'Enforce unique vote is enabled': t('Enforce unique vote is enabled'),\n      'Type a number from 2 to 10': t('Type a number from 2 to 10'),\n    }),\n    [t],\n  );\n\n  return (\n    <div\n      className={clsx('str-chat__form__expandable-field', {\n        'str-chat__form__expandable-field--expanded': !enforce_unique_vote,\n      })}\n    >\n      <SimpleSwitchField\n        checked={!enforce_unique_vote}\n        id='enforce_unique_vote'\n        labelText={t('Multiple answers')}\n        onChange={(e) => {\n          pollComposer.updateFields({ enforce_unique_vote: !e.target.checked });\n        }}\n      />\n      {!enforce_unique_vote && (\n        <div\n          className={clsx('str-chat__form__input-field', {\n            'str-chat__form__input-field--has-error': error,\n          })}\n        >\n          <div className={clsx('str-chat__form__input-field__value')}>\n            <FieldError\n              className='str-chat__form__input-field__error'\n              data-testid={'poll-max-votes-allowed-input-field-error'}\n              text={error && (knownValidationErrors[error] ?? t('Error'))}\n            />\n            <input\n              id='max_votes_allowed'\n              onBlur={() => {\n                pollComposer.handleFieldBlur('max_votes_allowed');\n              }}\n              onChange={(e) => {\n                const nativeFieldValidation = !e.target.validity.valid\n                  ? {\n                      max_votes_allowed: t('Only numbers are allowed'),\n                    }\n                  : undefined;\n                pollComposer.updateFields(\n                  {\n                    max_votes_allowed: !nativeFieldValidation\n                      ? e.target.value\n                      : pollComposer.max_votes_allowed,\n                  },\n                  nativeFieldValidation,\n                );\n              }}\n              placeholder={t('Maximum number of votes (from 2 to 10)')}\n              type='text'\n              value={max_votes_allowed}\n            />\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport type {\n  ComponentProps,\n  ElementRef,\n  KeyboardEventHandler,\n  PropsWithChildren,\n} from 'react';\nimport React, { useRef } from 'react';\n\nexport type SwitchFieldProps = PropsWithChildren<ComponentProps<'input'>>;\n\nexport const SwitchField = ({ children, ...props }: SwitchFieldProps) => {\n  const inputRef = useRef<ElementRef<'input'>>(null);\n  const handleKeyUp: KeyboardEventHandler<HTMLDivElement> = (event) => {\n    if (![' ', 'Enter'].includes(event.key) || !inputRef.current) return;\n    event.preventDefault();\n    inputRef.current.click();\n  };\n\n  return (\n    <div\n      className={clsx('str-chat__form__field str-chat__form__switch-field', {\n        'str-chat__form__field str-chat__form__switch-field--disabled': props.disabled,\n      })}\n    >\n      <label>\n        <div className='str-chat__form__field str-chat__form__switch-field-content'>\n          {children}\n        </div>\n        <input type='checkbox' {...props} ref={inputRef} />\n        <div\n          className={clsx('str-chat__form__switch-field__switch', {\n            'str-chat__form__switch-field__switch--on': props.checked,\n          })}\n          onKeyUp={handleKeyUp}\n          tabIndex={0}\n        >\n          <div className='str-chat__form__switch-field__switch-handle' />\n        </div>\n      </label>\n    </div>\n  );\n};\n\nexport type SimpleSwitchFieldProps = ComponentProps<'input'> & {\n  labelText: string;\n};\n\nexport const SimpleSwitchField = ({ labelText, ...props }: SimpleSwitchFieldProps) => (\n  <SwitchField {...props}>\n    <div className='str-chat__form__field str-chat__form__switch-field__text'>\n      {labelText}\n    </div>\n  </SwitchField>\n);\n", "import React, { useMemo } from 'react';\nimport clsx from 'clsx';\nimport { FieldError } from '../../Form/FieldError';\nimport { useTranslationContext } from '../../../context';\nimport { useMessageComposer } from '../../MessageInput';\nimport { useStateStore } from '../../../store';\nimport type { PollComposerState } from 'stream-chat';\n\nconst pollComposerStateSelector = (state: PollComposerState) => ({\n  error: state.errors.name,\n  name: state.data.name,\n});\n\nexport const NameField = () => {\n  const { t } = useTranslationContext();\n  const { pollComposer } = useMessageComposer();\n  const { error, name } = useStateStore(pollComposer.state, pollComposerStateSelector);\n  const knownValidationErrors = useMemo<Record<string, string>>(\n    () => ({\n      'Question is required': t('Question is required'),\n    }),\n    [t],\n  );\n\n  return (\n    <div\n      className={clsx(\n        'str-chat__form__field str-chat__form__input-field str-chat__form__input-field--with-label',\n        {\n          'str-chat__form__input-field--has-error': error,\n        },\n      )}\n    >\n      <label className='str-chat__form__field-label' htmlFor='name'>\n        {t('Question')}\n      </label>\n      <div className={clsx('str-chat__form__input-field__value')}>\n        <FieldError\n          className='str-chat__form__input-field__error'\n          data-testid={'poll-name-input-field-error'}\n          text={error && (knownValidationErrors[error] ?? t('Error'))}\n        />\n        <input\n          id='name'\n          onBlur={() => {\n            pollComposer.handleFieldBlur('name');\n          }}\n          onChange={(e) => {\n            pollComposer.updateFields({ name: e.target.value });\n          }}\n          placeholder={t('Ask a question')}\n          type='text'\n          value={name}\n        />\n      </div>\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport React, { useCallback, useMemo } from 'react';\nimport { FieldError } from '../../Form/FieldError';\nimport { DragAndDropContainer } from '../../DragAndDrop/DragAndDropContainer';\nimport { useTranslationContext } from '../../../context';\nimport { useMessageComposer } from '../../MessageInput';\nimport { useStateStore } from '../../../store';\nimport type { PollComposerState } from 'stream-chat';\n\nconst pollComposerStateSelector = (state: PollComposerState) => ({\n  errors: state.errors.options,\n  options: state.data.options,\n});\n\nexport const OptionFieldSet = () => {\n  const { pollComposer } = useMessageComposer();\n  const { errors, options } = useStateStore(\n    pollComposer.state,\n    pollComposerStateSelector,\n  );\n  const { t } = useTranslationContext('OptionFieldSet');\n\n  const knownValidationErrors = useMemo<Record<string, string>>(\n    () => ({\n      'Option already exists': t('Option already exists'),\n      'Option is empty': t('Option is empty'),\n    }),\n    [t],\n  );\n\n  const onSetNewOrder = useCallback(\n    (newOrder: number[]) => {\n      const prevOptions = pollComposer.options;\n      pollComposer.updateFields({ options: newOrder.map((index) => prevOptions[index]) });\n    },\n    [pollComposer],\n  );\n\n  const draggable = options.length > 1;\n\n  return (\n    <fieldset className='str-chat__form__field str-chat__form__input-fieldset'>\n      <legend className='str-chat__form__field-label'>{t('Options')}</legend>\n      <DragAndDropContainer\n        className='str-chat__form__input-fieldset__values'\n        draggable={draggable}\n        onSetNewOrder={onSetNewOrder}\n      >\n        {options.map((option, i) => {\n          const error = errors?.[option.id];\n          return (\n            <div\n              className={clsx('str-chat__form__input-field', {\n                'str-chat__form__input-field--draggable': draggable,\n                'str-chat__form__input-field--has-error': error,\n              })}\n              key={`new-poll-option-${i}`}\n            >\n              <div className='str-chat__form__input-field__value'>\n                <FieldError\n                  className='str-chat__form__input-field__error'\n                  data-testid={'poll-option-input-field-error'}\n                  text={error && (knownValidationErrors[error] ?? t('Error'))}\n                />\n                <input\n                  id={option.id}\n                  onBlur={() => {\n                    pollComposer.handleFieldBlur('options');\n                  }}\n                  onChange={(e) => {\n                    pollComposer.updateFields({\n                      options: { index: i, text: e.target.value },\n                    });\n                  }}\n                  onKeyUp={(event) => {\n                    const isFocusedLastOptionField = i === options.length - 1;\n                    if (event.key === 'Enter' && !isFocusedLastOptionField) {\n                      const nextInputId = options[i + 1].id;\n                      document.getElementById(nextInputId)?.focus();\n                    }\n                  }}\n                  placeholder={t('Add an option')}\n                  type='text'\n                  value={option.text}\n                />\n              </div>\n              {draggable && <div className='str-chat__drag-handle' />}\n            </div>\n          );\n        })}\n      </DragAndDropContainer>\n    </fieldset>\n  );\n};\n", "import type { PropsWithChildren } from 'react';\nimport React, { useEffect, useState } from 'react';\nimport clsx from 'clsx';\n\nexport type DragAndDropContainerProps = PropsWithChildren<{\n  className?: string;\n  draggable?: boolean;\n  onSetNewOrder?: (newOrder: number[]) => void;\n}>;\n\nexport const DragAndDropContainer = ({\n  children,\n  className,\n  draggable,\n  onSetNewOrder,\n}: DragAndDropContainerProps) => {\n  const [order, setOrder] = useState<number[]>([]);\n  const [dragStartIndex, setDragStartIndex] = useState<number | null>(null);\n  const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);\n  const [container, setContainer] = useState<HTMLDivElement | null>(null);\n\n  const moveDirection =\n    dragStartIndex === null || dragOverIndex === null\n      ? undefined\n      : dragStartIndex <= dragOverIndex\n        ? 'down'\n        : 'up';\n\n  const childrenArray = React.Children.toArray(children);\n\n  useEffect(() => {\n    setOrder(React.Children.map(children, (_, index) => index) || []);\n  }, [children]);\n\n  useEffect(() => {\n    if (!container) return;\n\n    const handleDragStart = (e: DragEvent) => {\n      const target = e.target as HTMLElement;\n      const draggableItem = target.closest('.str-chat__drag-and-drop-container__item');\n      if (e.dataTransfer) {\n        e.dataTransfer.effectAllowed = 'move';\n      }\n\n      if (draggableItem instanceof HTMLElement) {\n        const index = Array.from(draggableItem.parentElement?.children || []).indexOf(\n          draggableItem,\n        );\n        setDragStartIndex(index);\n        e.dataTransfer?.setData('text/plain', index.toString());\n        draggableItem.style.opacity = '0.3';\n      }\n    };\n\n    const handleDragOver = (e: DragEvent) => {\n      e.preventDefault();\n      const target = e.target as HTMLElement;\n      const draggableItem = target.closest('.str-chat__drag-and-drop-container__item');\n      if (draggableItem instanceof HTMLElement) {\n        const index = Array.from(draggableItem.parentElement?.children || []).indexOf(\n          draggableItem,\n        );\n        setDragOverIndex(index);\n      }\n    };\n\n    const handleDragLeave = () => {\n      setDragOverIndex(null);\n    };\n\n    const handleDrop = (e: DragEvent) => {\n      e.preventDefault();\n      const draggedIndex = parseInt(e.dataTransfer?.getData('text/plain') || '-1', 10);\n      const target = e.target as HTMLElement;\n      const draggableItem = target.closest('.str-chat__drag-and-drop-container__item');\n      if (draggableItem instanceof HTMLElement) {\n        const dropIndex = Array.from(draggableItem.parentElement?.children || []).indexOf(\n          draggableItem,\n        );\n        if (draggedIndex !== -1 && draggedIndex !== dropIndex) {\n          setOrder((prevOrder) => {\n            const newOrder = [...prevOrder];\n            const [removed] = newOrder.splice(draggedIndex, 1);\n            newOrder.splice(dropIndex, 0, removed);\n            onSetNewOrder?.(newOrder);\n            return newOrder;\n          });\n        }\n      }\n      setDragStartIndex(null);\n      setDragOverIndex(null);\n    };\n\n    const handleDragEnd = (e: DragEvent) => {\n      const target = e.target as HTMLElement;\n      if (target instanceof HTMLElement) {\n        target.style.opacity = '';\n      }\n      setDragStartIndex(null);\n      setDragOverIndex(null);\n    };\n\n    container.addEventListener('dragstart', handleDragStart);\n    container.addEventListener('dragover', handleDragOver);\n    container.addEventListener('dragleave', handleDragLeave);\n    container.addEventListener('drop', handleDrop);\n    container.addEventListener('dragend', handleDragEnd);\n\n    return () => {\n      container.removeEventListener('dragstart', handleDragStart);\n      container.removeEventListener('dragover', handleDragOver);\n      container.removeEventListener('dragleave', handleDragLeave);\n      container.removeEventListener('drop', handleDrop);\n      container.removeEventListener('dragend', handleDragEnd);\n    };\n  }, [container, onSetNewOrder]);\n\n  return (\n    <div\n      className={clsx('str-chat__drag-and-drop-container', className)}\n      ref={setContainer}\n    >\n      {order.map((originalIndex, currentIndex) => {\n        const child = childrenArray[originalIndex];\n        return (\n          <div\n            className={clsx('str-chat__drag-and-drop-container__item', {\n              'str-chat__drag-and-drop-container__item--dragged-over-from-bottom':\n                moveDirection === 'up' && dragOverIndex === currentIndex,\n              'str-chat__drag-and-drop-container__item--dragged-over-from-top':\n                moveDirection === 'down' && dragOverIndex === currentIndex,\n            })}\n            draggable={draggable}\n            key={\n              React.isValidElement(child) ? child.key : `draggable-item-${originalIndex}`\n            }\n          >\n            {child}\n          </div>\n        );\n      })}\n    </div>\n  );\n};\n", "import React from 'react';\nimport { useCanCreatePoll, useMessageComposer } from '../../MessageInput';\nimport { useMessageInputContext, useTranslationContext } from '../../../context';\n\nexport type PollCreationDialogControlsProps = {\n  close: () => void;\n};\n\nexport const PollCreationDialogControls = ({\n  close,\n}: PollCreationDialogControlsProps) => {\n  const { t } = useTranslationContext('PollCreationDialogControls');\n  const { handleSubmit: handleSubmitMessage } = useMessageInputContext();\n  const messageComposer = useMessageComposer();\n  const canCreatePoll = useCanCreatePoll();\n\n  return (\n    <div className='str-chat__dialog__controls'>\n      <button\n        className='str-chat__dialog__controls-button str-chat__dialog__controls-button--cancel'\n        onClick={() => {\n          messageComposer.pollComposer.initState();\n          close();\n        }}\n        type='button'\n      >\n        {t('Cancel')}\n      </button>\n      <button\n        className='str-chat__dialog__controls-button str-chat__dialog__controls-button--submit'\n        disabled={!canCreatePoll}\n        onClick={() => {\n          messageComposer\n            .createPoll()\n            .then(() => handleSubmitMessage())\n            .then(() => {\n              messageComposer.pollComposer.initState();\n              close();\n            })\n            .catch(console.error);\n        }}\n        type='submit'\n      >\n        {t('Create')}\n      </button>\n    </div>\n  );\n};\n", "import React from 'react';\n\nimport { isMessageBounced } from './utils';\nimport { useTranslationContext } from '../../context';\n\nimport type { LocalMessage } from 'stream-chat';\n\nexport interface MessageErrorTextProps {\n  message: LocalMessage;\n  theme: string;\n}\n\nexport function MessageErrorText({ message, theme }: MessageErrorTextProps) {\n  const { t } = useTranslationContext('MessageText');\n\n  if (message.type === 'error' && !isMessageBounced(message)) {\n    return (\n      <div\n        className={`str-chat__${theme}-message--error-message str-chat__message--error-message`}\n      >\n        {t('Error \u00B7 Unsent')}\n      </div>\n    );\n  }\n\n  if (message.status === 'failed') {\n    return (\n      <div\n        className={`str-chat__${theme}-message--error-message str-chat__message--error-message`}\n      >\n        {message.error?.status !== 403\n          ? t('Message Failed \u00B7 Click to try again')\n          : t('Message Failed \u00B7 Unauthorized')}\n      </div>\n    );\n  }\n\n  return null;\n}\n", "import React, { useEffect } from 'react';\n\nimport type { MessageTextProps } from './MessageText';\nimport { MessageText } from './MessageText';\n\nimport { useChannelStateContext, useMessageContext } from '../../context';\nimport { useMessageTextStreaming } from './hooks';\n\nexport type StreamedMessageTextProps = Pick<\n  MessageTextProps,\n  'message' | 'renderText'\n> & {\n  renderingLetterCount?: number;\n  streamingLetterIntervalMs?: number;\n};\n\nexport const StreamedMessageText = (props: StreamedMessageTextProps) => {\n  const {\n    message: messageFromProps,\n    renderingLetterCount,\n    renderText,\n    streamingLetterIntervalMs,\n  } = props;\n  const { message: messageFromContext } = useMessageContext('StreamedMessageText');\n  const { channel } = useChannelStateContext();\n  const message = messageFromProps || messageFromContext;\n  const { text = '' } = message;\n  const { skipAnimation, streamedMessageText } = useMessageTextStreaming({\n    renderingLetterCount,\n    streamingLetterIntervalMs,\n    text,\n  });\n\n  useEffect(() => {\n    channel?.on('ai_indicator.stop', () => {\n      skipAnimation();\n    });\n  }, [channel, skipAnimation]);\n\n  return (\n    <MessageText\n      message={{ ...message, text: streamedMessageText }}\n      renderText={renderText}\n    />\n  );\n};\n", "import React, { useEffect, useState } from 'react';\n\nimport type { Event } from 'stream-chat';\n\nimport { CustomNotification } from './CustomNotification';\nimport { useChatContext, useTranslationContext } from '../../context';\n\nconst UnMemoizedConnectionStatus = () => {\n  const { client } = useChatContext('ConnectionStatus');\n  const { t } = useTranslationContext('ConnectionStatus');\n\n  const [online, setOnline] = useState(true);\n\n  useEffect(() => {\n    const connectionChanged = ({ online: onlineStatus = false }: Event) => {\n      if (online !== onlineStatus) {\n        setOnline(onlineStatus);\n      }\n    };\n\n    client.on('connection.changed', connectionChanged);\n    return () => client.off('connection.changed', connectionChanged);\n  }, [client, online]);\n\n  return (\n    <CustomNotification\n      active={!online}\n      className='str-chat__connection-status-notification'\n      type='error'\n    >\n      {t('Connection failure, reconnecting now...')}\n    </CustomNotification>\n  );\n};\n\nexport const ConnectionStatus = React.memo(UnMemoizedConnectionStatus);\n", "import type { PropsWithChildren } from 'react';\nimport React from 'react';\nimport clsx from 'clsx';\nimport type { NotificationSeverity } from 'stream-chat';\n\nexport type CustomNotificationProps = {\n  type?: NotificationSeverity | string;\n  active?: boolean;\n  className?: string;\n};\n\nconst UnMemoizedCustomNotification = (\n  props: PropsWithChildren<CustomNotificationProps>,\n) => {\n  const { active, children, className, type } = props;\n\n  if (!active) return null;\n\n  return (\n    <div\n      aria-live='polite'\n      className={clsx(\n        `str-chat__custom-notification`,\n        `str-chat__notification`,\n        `str-chat-react__notification`,\n        { [`notification-${type}`]: type },\n        className,\n      )}\n      data-testid='custom-notification'\n    >\n      {children}\n    </div>\n  );\n};\n\nexport const CustomNotification = React.memo(\n  UnMemoizedCustomNotification,\n) as typeof UnMemoizedCustomNotification;\n", "import React from 'react';\n\nimport { Message } from '../Message/Message';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type GiphyPreviewMessageProps = {\n  message: LocalMessage;\n};\n\nexport const GiphyPreviewMessage = (props: GiphyPreviewMessageProps) => {\n  const { message } = props;\n\n  return (\n    <div className='giphy-preview-message'>\n      <Message message={message} />\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport React from 'react';\n\nimport {\n  useEnrichedMessages,\n  useMessageListElements,\n  useScrollLocationLogic,\n  useUnreadMessagesNotification,\n} from './hooks/MessageList';\nimport { useMarkRead } from './hooks/useMarkRead';\n\nimport { MessageNotification as DefaultMessageNotification } from './MessageNotification';\nimport { MessageListNotifications as DefaultMessageListNotifications } from './MessageListNotifications';\nimport { UnreadMessagesNotification as DefaultUnreadMessagesNotification } from './UnreadMessagesNotification';\n\nimport type { ChannelActionContextValue } from '../../context/ChannelActionContext';\nimport { useChannelActionContext } from '../../context/ChannelActionContext';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport { DialogManagerProvider } from '../../context';\nimport { useChatContext } from '../../context/ChatContext';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { MessageListContextProvider } from '../../context/MessageListContext';\nimport { EmptyStateIndicator as DefaultEmptyStateIndicator } from '../EmptyStateIndicator';\nimport type { InfiniteScrollProps } from '../InfiniteScrollPaginator/InfiniteScroll';\nimport { InfiniteScroll } from '../InfiniteScrollPaginator/InfiniteScroll';\nimport { LoadingIndicator as DefaultLoadingIndicator } from '../Loading';\nimport { defaultPinPermissions, MESSAGE_ACTIONS } from '../Message/utils';\nimport { TypingIndicator as DefaultTypingIndicator } from '../TypingIndicator';\nimport { MessageListMainPanel as DefaultMessageListMainPanel } from './MessageListMainPanel';\n\nimport { defaultRenderMessages } from './renderMessages';\nimport { useStableId } from '../UtilityComponents/useStableId';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { MessageRenderer } from './renderMessages';\nimport type { GroupStyle, ProcessMessagesParams, RenderedMessage } from './utils';\nimport type { MessageProps } from '../Message/types';\nimport type { ChannelStateContextValue } from '../../context/ChannelStateContext';\n\nimport {\n  DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD,\n  DEFAULT_NEXT_CHANNEL_PAGE_SIZE,\n} from '../../constants/limits';\nimport { useLastOwnMessage } from './hooks/useLastOwnMessage';\n\ntype MessageListWithContextProps = Omit<\n  ChannelStateContextValue,\n  'members' | 'mutes' | 'watchers'\n> &\n  MessageListProps;\n\nconst MessageListWithContext = (props: MessageListWithContextProps) => {\n  const {\n    channel,\n    channelUnreadUiState,\n    disableDateSeparator = false,\n    groupStyles,\n    hasMoreNewer = false,\n    headerPosition,\n    hideDeletedMessages = false,\n    hideNewMessageSeparator = false,\n    highlightedMessageId,\n    internalInfiniteScrollProps: {\n      threshold: loadMoreScrollThreshold = DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD,\n      ...restInternalInfiniteScrollProps\n    } = {},\n    jumpToLatestMessage = () => Promise.resolve(),\n    loadMore: loadMoreCallback,\n    loadMoreNewer: loadMoreNewerCallback, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release\n    maxTimeBetweenGroupedMessages,\n    messageActions = Object.keys(MESSAGE_ACTIONS),\n    messageLimit = DEFAULT_NEXT_CHANNEL_PAGE_SIZE,\n    messages = [],\n    noGroupByUser = false,\n    notifications,\n    pinPermissions = defaultPinPermissions,\n    reactionDetailsSort,\n    renderMessages = defaultRenderMessages,\n    returnAllReadData = false,\n    reviewProcessedMessage,\n    showUnreadNotificationAlways,\n    sortReactionDetails,\n    sortReactions,\n    suppressAutoscroll,\n    threadList = false,\n    unsafeHTML = false,\n  } = props;\n\n  const [listElement, setListElement] = React.useState<HTMLDivElement | null>(null);\n\n  const { customClasses } = useChatContext('MessageList');\n\n  const {\n    EmptyStateIndicator = DefaultEmptyStateIndicator,\n    LoadingIndicator = DefaultLoadingIndicator,\n    MessageListMainPanel = DefaultMessageListMainPanel,\n    MessageListNotifications = DefaultMessageListNotifications,\n    MessageListWrapper = 'ul',\n    MessageNotification = DefaultMessageNotification,\n    TypingIndicator = DefaultTypingIndicator,\n    UnreadMessagesNotification = DefaultUnreadMessagesNotification,\n  } = useComponentContext('MessageList');\n\n  const {\n    hasNewMessages,\n    isMessageListScrolledToBottom,\n    onScroll,\n    scrollToBottom,\n    wrapperRect,\n  } = useScrollLocationLogic({\n    hasMoreNewer,\n    listElement,\n    loadMoreScrollThreshold,\n    messages, // todo: is it correct to base the scroll logic on an array that does not contain date separators or intro?\n    scrolledUpThreshold: props.scrolledUpThreshold,\n    suppressAutoscroll,\n  });\n\n  const { show: showUnreadMessagesNotification } = useUnreadMessagesNotification({\n    isMessageListScrolledToBottom,\n    showAlways: !!showUnreadNotificationAlways,\n    unreadCount: channelUnreadUiState?.unread_messages,\n  });\n\n  useMarkRead({\n    isMessageListScrolledToBottom,\n    messageListIsThread: threadList,\n    wasMarkedUnread: !!channelUnreadUiState?.first_unread_message_id,\n  });\n\n  const { messageGroupStyles, messages: enrichedMessages } = useEnrichedMessages({\n    channel,\n    disableDateSeparator,\n    groupStyles,\n    headerPosition,\n    hideDeletedMessages,\n    hideNewMessageSeparator,\n    maxTimeBetweenGroupedMessages,\n    messages,\n    noGroupByUser,\n    reviewProcessedMessage,\n  });\n\n  const lastOwnMessage = useLastOwnMessage({\n    messages,\n    ownUserId: channel.getClient().user?.id,\n  });\n\n  const elements = useMessageListElements({\n    channelUnreadUiState,\n    enrichedMessages,\n    internalMessageProps: {\n      additionalMessageInputProps: props.additionalMessageInputProps,\n      closeReactionSelectorOnClick: props.closeReactionSelectorOnClick,\n      customMessageActions: props.customMessageActions,\n      disableQuotedMessages: props.disableQuotedMessages,\n      formatDate: props.formatDate,\n      getDeleteMessageErrorNotification: props.getDeleteMessageErrorNotification,\n      getFlagMessageErrorNotification: props.getFlagMessageErrorNotification,\n      getFlagMessageSuccessNotification: props.getFlagMessageSuccessNotification,\n      getMarkMessageUnreadErrorNotification: props.getMarkMessageUnreadErrorNotification,\n      getMarkMessageUnreadSuccessNotification:\n        props.getMarkMessageUnreadSuccessNotification,\n      getMuteUserErrorNotification: props.getMuteUserErrorNotification,\n      getMuteUserSuccessNotification: props.getMuteUserSuccessNotification,\n      getPinMessageErrorNotification: props.getPinMessageErrorNotification,\n      Message: props.Message,\n      messageActions,\n      messageListRect: wrapperRect,\n      onlySenderCanEdit: props.onlySenderCanEdit,\n      onMentionsClick: props.onMentionsClick,\n      onMentionsHover: props.onMentionsHover,\n      onUserClick: props.onUserClick,\n      onUserHover: props.onUserHover,\n      openThread: props.openThread,\n      pinPermissions,\n      reactionDetailsSort,\n      renderText: props.renderText,\n      retrySendMessage: props.retrySendMessage,\n      sortReactionDetails,\n      sortReactions,\n      unsafeHTML,\n    },\n    lastOwnMessage,\n    messageGroupStyles,\n    messages,\n    renderMessages,\n    returnAllReadData,\n    threadList,\n  });\n\n  const messageListClass = customClasses?.messageList || 'str-chat__list';\n\n  const loadMore = React.useCallback(() => {\n    if (loadMoreCallback) {\n      loadMoreCallback(messageLimit);\n    }\n  }, [loadMoreCallback, messageLimit]);\n\n  const loadMoreNewer = React.useCallback(() => {\n    if (loadMoreNewerCallback) {\n      loadMoreNewerCallback(messageLimit);\n    }\n  }, [loadMoreNewerCallback, messageLimit]);\n\n  const scrollToBottomFromNotification = React.useCallback(async () => {\n    if (hasMoreNewer) {\n      await jumpToLatestMessage();\n    } else {\n      scrollToBottom();\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [scrollToBottom, hasMoreNewer]);\n\n  React.useLayoutEffect(() => {\n    if (highlightedMessageId) {\n      const element = listElement?.querySelector(\n        `[data-message-id='${highlightedMessageId}']`,\n      );\n      element?.scrollIntoView({ block: 'center' });\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [highlightedMessageId]);\n\n  const id = useStableId();\n\n  const showEmptyStateIndicator = elements.length === 0 && !threadList;\n  const dialogManagerId = threadList\n    ? `message-list-dialog-manager-thread-${id}`\n    : `message-list-dialog-manager-${id}`;\n\n  return (\n    <MessageListContextProvider\n      value={{\n        listElement,\n        processedMessages: enrichedMessages,\n        scrollToBottom,\n      }}\n    >\n      <MessageListMainPanel>\n        <DialogManagerProvider id={dialogManagerId}>\n          {!threadList && showUnreadMessagesNotification && (\n            <UnreadMessagesNotification\n              unreadCount={channelUnreadUiState?.unread_messages}\n            />\n          )}\n          <div\n            className={clsx(messageListClass, customClasses?.threadList)}\n            onScroll={onScroll}\n            ref={setListElement}\n            tabIndex={0}\n          >\n            {showEmptyStateIndicator ? (\n              <EmptyStateIndicator listType={threadList ? 'thread' : 'message'} />\n            ) : (\n              <InfiniteScroll\n                className='str-chat__message-list-scroll'\n                data-testid='reverse-infinite-scroll'\n                hasNextPage={props.hasMoreNewer}\n                hasPreviousPage={props.hasMore}\n                head={props.head}\n                isLoading={props.loadingMore}\n                loader={\n                  <div className='str-chat__list__loading' key='loading-indicator'>\n                    {props.loadingMore && <LoadingIndicator size={20} />}\n                  </div>\n                }\n                loadNextPage={loadMoreNewer}\n                loadPreviousPage={loadMore}\n                threshold={loadMoreScrollThreshold}\n                {...restInternalInfiniteScrollProps}\n              >\n                <MessageListWrapper className='str-chat__ul'>\n                  {elements}\n                </MessageListWrapper>\n                <TypingIndicator threadList={threadList} />\n\n                <div key='bottom' />\n              </InfiniteScroll>\n            )}\n          </div>\n        </DialogManagerProvider>\n      </MessageListMainPanel>\n      <MessageListNotifications\n        hasNewMessages={hasNewMessages}\n        isMessageListScrolledToBottom={isMessageListScrolledToBottom}\n        isNotAtLatestMessageSet={hasMoreNewer}\n        MessageNotification={MessageNotification}\n        notifications={notifications}\n        scrollToBottom={scrollToBottomFromNotification}\n        threadList={threadList}\n        unreadCount={threadList ? undefined : channelUnreadUiState?.unread_messages}\n      />\n    </MessageListContextProvider>\n  );\n};\n\ntype PropsDrilledToMessage =\n  | 'additionalMessageInputProps'\n  | 'closeReactionSelectorOnClick'\n  | 'customMessageActions'\n  | 'disableQuotedMessages'\n  | 'formatDate'\n  | 'getDeleteMessageErrorNotification'\n  | 'getFlagMessageErrorNotification'\n  | 'getFlagMessageSuccessNotification'\n  | 'getMarkMessageUnreadErrorNotification'\n  | 'getMarkMessageUnreadSuccessNotification'\n  | 'getMuteUserErrorNotification'\n  | 'getMuteUserSuccessNotification'\n  | 'getPinMessageErrorNotification'\n  | 'Message'\n  | 'messageActions'\n  | 'onlySenderCanEdit'\n  | 'onMentionsClick'\n  | 'onMentionsHover'\n  | 'onUserClick'\n  | 'onUserHover'\n  | 'openThread'\n  | 'pinPermissions' // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release\n  | 'reactionDetailsSort'\n  | 'renderText'\n  | 'retrySendMessage'\n  | 'sortReactions'\n  | 'sortReactionDetails'\n  | 'unsafeHTML';\n\nexport type MessageListProps = Partial<Pick<MessageProps, PropsDrilledToMessage>> & {\n  /** Disables the injection of date separator components in MessageList, defaults to `false` */\n  disableDateSeparator?: boolean;\n  /** Callback function to set group styles for each message */\n  groupStyles?: (\n    message: RenderedMessage,\n    previousMessage: RenderedMessage,\n    nextMessage: RenderedMessage,\n    noGroupByUser: boolean,\n    maxTimeBetweenGroupedMessages?: number,\n  ) => GroupStyle;\n  /** Whether the list has more items to load */\n  hasMore?: boolean;\n  /** Element to be rendered at the top of the thread message list. By default, these are the Message and ThreadStart components */\n  head?: React.ReactElement;\n  /** Position to render HeaderComponent */\n  headerPosition?: number;\n  /** Hides the MessageDeleted components from the list, defaults to `false` */\n  hideDeletedMessages?: boolean;\n  /** Hides the DateSeparator component when new messages are received in a channel that's watched but not active, defaults to false */\n  hideNewMessageSeparator?: boolean;\n  /** Overrides the default props passed to [InfiniteScroll](https://github.com/GetStream/stream-chat-react/blob/master/src/components/InfiniteScrollPaginator/InfiniteScroll.tsx) */\n  internalInfiniteScrollProps?: Partial<InfiniteScrollProps>;\n  /** Function called when latest messages should be loaded, after the list has jumped at an earlier message set */\n  jumpToLatestMessage?: () => Promise<void>;\n  /** Whether or not the list is currently loading more items */\n  loadingMore?: boolean;\n  /** Whether or not the list is currently loading newer items */\n  loadingMoreNewer?: boolean;\n  /** Function called when more messages are to be loaded, defaults to function stored in [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/) */\n  loadMore?: ChannelActionContextValue['loadMore'] | (() => Promise<void>);\n  /** Function called when newer messages are to be loaded, defaults to function stored in [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/) */\n  loadMoreNewer?: ChannelActionContextValue['loadMoreNewer'] | (() => Promise<void>);\n  /** Maximum time in milliseconds that should occur between messages to still consider them grouped together */\n  maxTimeBetweenGroupedMessages?: number;\n  /** The limit to use when paginating messages */\n  messageLimit?: number;\n  /** The messages to render in the list, defaults to messages stored in [ChannelStateContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_state_context/) */\n  messages?: LocalMessage[];\n  /** If true, turns off message UI grouping by user */\n  noGroupByUser?: boolean;\n  /** Overrides the way MessageList renders messages */\n  renderMessages?: MessageRenderer;\n  /** If true, `readBy` data supplied to the `Message` components will include all user read states per sent message */\n  returnAllReadData?: boolean;\n  /**\n   * Allows to review changes introduced to messages array on per message basis (e.g. date separator injection before a message).\n   * The array returned from the function is appended to the array of messages that are later rendered into React elements in the `MessageList`.\n   */\n  reviewProcessedMessage?: ProcessMessagesParams['reviewProcessedMessage'];\n  /**\n   * The pixel threshold under which the message list is considered to be so near to the bottom,\n   * so that if a new message is delivered, the list will be scrolled to the absolute bottom.\n   * Defaults to 200px\n   */\n  scrolledUpThreshold?: number;\n  /**\n   * The floating notification informing about unread messages will be shown when the\n   * UnreadMessagesSeparator is not visible. The default is false, that means the notification\n   * is shown only when viewing unread messages.\n   */\n  showUnreadNotificationAlways?: boolean;\n  /** If true, indicates the message list is a thread  */\n  threadList?: boolean; // todo: refactor needed - message list should have a state in which among others it would be optionally flagged as thread\n};\n\n/**\n * The MessageList component renders a list of Messages.\n * It is a consumer of the following contexts:\n * - [ChannelStateContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_state_context/)\n * - [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/)\n * - [ComponentContext](https://getstream.io/chat/docs/sdk/react/contexts/component_context/)\n * - [TypingContext](https://getstream.io/chat/docs/sdk/react/contexts/typing_context/)\n */\nexport const MessageList = (props: MessageListProps) => {\n  const { jumpToLatestMessage, loadMore, loadMoreNewer } =\n    useChannelActionContext('MessageList');\n\n  const {\n    members: membersPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n    mutes: mutesPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n    watchers: watchersPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n    ...restChannelStateContext\n  } = useChannelStateContext('MessageList');\n\n  return (\n    <MessageListWithContext\n      jumpToLatestMessage={jumpToLatestMessage}\n      loadMore={loadMore}\n      loadMoreNewer={loadMoreNewer}\n      {...restChannelStateContext}\n      {...props}\n    />\n  );\n};\n", "import { useMemo } from 'react';\n\nimport type { GroupStyle, ProcessMessagesParams, RenderedMessage } from '../../utils';\nimport { getGroupStyles, insertIntro, processMessages } from '../../utils';\n\nimport { useChatContext } from '../../../../context/ChatContext';\nimport { useComponentContext } from '../../../../context/ComponentContext';\n\nimport type { Channel, LocalMessage } from 'stream-chat';\n\nexport const useEnrichedMessages = (args: {\n  channel: Channel;\n  disableDateSeparator: boolean;\n  hideDeletedMessages: boolean;\n  hideNewMessageSeparator: boolean;\n  messages: LocalMessage[];\n  noGroupByUser: boolean;\n  groupStyles?: (\n    message: RenderedMessage,\n    previousMessage: RenderedMessage,\n    nextMessage: RenderedMessage,\n    noGroupByUser: boolean,\n    maxTimeBetweenGroupedMessages?: number,\n  ) => GroupStyle;\n  headerPosition?: number;\n  maxTimeBetweenGroupedMessages?: number;\n  reviewProcessedMessage?: ProcessMessagesParams['reviewProcessedMessage'];\n}) => {\n  const {\n    channel,\n    disableDateSeparator,\n    groupStyles,\n    headerPosition,\n    hideDeletedMessages,\n    hideNewMessageSeparator,\n    maxTimeBetweenGroupedMessages,\n    messages,\n    noGroupByUser,\n    reviewProcessedMessage,\n  } = args;\n\n  const { client } = useChatContext('useEnrichedMessages');\n  const { HeaderComponent } = useComponentContext('useEnrichedMessages');\n\n  const lastRead = useMemo(() => channel.lastRead?.(), [channel]);\n\n  const enableDateSeparator = !disableDateSeparator;\n\n  let messagesWithDates =\n    !enableDateSeparator && !hideDeletedMessages && hideNewMessageSeparator\n      ? messages\n      : processMessages({\n          enableDateSeparator,\n          hideDeletedMessages,\n          hideNewMessageSeparator,\n          lastRead,\n          messages,\n          reviewProcessedMessage,\n          userId: client.userID || '',\n        });\n\n  if (HeaderComponent) {\n    messagesWithDates = insertIntro(messagesWithDates, headerPosition);\n  }\n\n  const groupStylesFn = groupStyles || getGroupStyles;\n  const messageGroupStyles = useMemo(\n    () =>\n      messagesWithDates.reduce<Record<string, GroupStyle>>((acc, message, i) => {\n        const style = groupStylesFn(\n          message,\n          messagesWithDates[i - 1],\n          messagesWithDates[i + 1],\n          noGroupByUser,\n          maxTimeBetweenGroupedMessages,\n        );\n        if (style) acc[message.id] = style;\n        return acc;\n      }, {}),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [maxTimeBetweenGroupedMessages, messagesWithDates, noGroupByUser],\n  );\n\n  return { messageGroupStyles, messages: messagesWithDates };\n};\n", "import { nanoid } from 'nanoid';\n\nimport { CUSTOM_MESSAGE_TYPE } from '../../constants/messageTypes';\nimport { isMessageEdited } from '../Message/utils';\nimport { isDate } from '../../i18n';\n\nimport type { LocalMessage, MessageLabel } from 'stream-chat';\n\ntype IntroMessage = {\n  customType: typeof CUSTOM_MESSAGE_TYPE.intro;\n  id: string;\n};\n\ntype DateSeparatorMessage = {\n  customType: typeof CUSTOM_MESSAGE_TYPE.date;\n  date: Date;\n  id: string;\n  type: MessageLabel;\n  unread: boolean;\n};\n\nexport type RenderedMessage = LocalMessage | DateSeparatorMessage | IntroMessage;\n\ntype ProcessMessagesContext = {\n  /** the connected user ID */\n  userId: string;\n  /** Enable date separator */\n  enableDateSeparator?: boolean;\n  /** Enable deleted messages to be filtered out of resulting message list */\n  hideDeletedMessages?: boolean;\n  /** Disable date separator display for unread incoming messages */\n  hideNewMessageSeparator?: boolean;\n  /** Sets the threshold after everything is considered unread */\n  lastRead?: Date | null;\n};\n\nexport type ProcessMessagesParams = ProcessMessagesContext & {\n  messages: LocalMessage[];\n  reviewProcessedMessage?: (params: {\n    /** array of messages representing the changes applied around a given processed message */\n    changes: RenderedMessage[];\n    /** configuration params and information forwarded from `processMessages` */\n    context: ProcessMessagesContext;\n    /** index of the processed message in the original messages array */\n    index: number;\n    /** array of messages retrieved from the back-end */\n    messages: LocalMessage[];\n    /** newly built array of messages to be later rendered */\n    processedMessages: RenderedMessage[];\n  }) => LocalMessage[];\n  /** Signals whether to separate giphy preview as well as used to set the giphy preview state */\n  setGiphyPreviewMessage?: React.Dispatch<React.SetStateAction<LocalMessage | undefined>>;\n};\n\n/**\n * processMessages - Transform the input message list according to config parameters\n *\n * Inserts date separators btw. messages created on different dates or before unread incoming messages. By default:\n * - enabled in main message list\n * - disabled in virtualized message list\n * - disabled in thread\n *\n * Allows to filter out deleted messages, contolled by hideDeletedMessages param. This is disabled by default.\n *\n * Sets Giphy preview message for VirtualizedMessageList\n *\n * The only required params are messages and userId, the rest are config params:\n *\n * @return {LocalMessage[]} Transformed list of messages\n */\nexport const processMessages = (params: ProcessMessagesParams) => {\n  const { messages, reviewProcessedMessage, setGiphyPreviewMessage, ...context } = params;\n  const {\n    enableDateSeparator,\n    hideDeletedMessages,\n    hideNewMessageSeparator,\n    lastRead,\n    userId,\n  } = context;\n\n  let unread = false;\n  let ephemeralMessagePresent = false;\n  let lastDateSeparator;\n  const newMessages: RenderedMessage[] = [];\n\n  for (let i = 0; i < messages.length; i += 1) {\n    const message = messages[i];\n\n    if (hideDeletedMessages && message.type === 'deleted') {\n      continue;\n    }\n\n    if (\n      setGiphyPreviewMessage &&\n      message.type === 'ephemeral' &&\n      message.command === 'giphy'\n    ) {\n      ephemeralMessagePresent = true;\n      setGiphyPreviewMessage(message);\n      continue;\n    }\n\n    const changes: RenderedMessage[] = [];\n    const messageDate =\n      (message.created_at &&\n        isDate(message.created_at) &&\n        message.created_at.toDateString()) ||\n      '';\n    const previousMessage = messages[i - 1];\n    let prevMessageDate = messageDate;\n\n    if (\n      enableDateSeparator &&\n      previousMessage?.created_at &&\n      isDate(previousMessage.created_at)\n    ) {\n      prevMessageDate = previousMessage.created_at.toDateString();\n    }\n\n    if (!unread && !hideNewMessageSeparator) {\n      unread =\n        (lastRead && message.created_at && new Date(lastRead) < message.created_at) ||\n        false;\n\n      // do not show date separator for current user's messages\n      if (enableDateSeparator && unread && message.user?.id !== userId) {\n        changes.push({\n          customType: CUSTOM_MESSAGE_TYPE.date,\n          date: message.created_at,\n          id: makeDateMessageId(message.created_at),\n          unread,\n        } as DateSeparatorMessage);\n      }\n    }\n\n    if (\n      enableDateSeparator &&\n      (i === 0 || // always put date separator before the first message\n        messageDate !== prevMessageDate || // add date separator btw. 2 messages created on different date\n        // if hiding deleted messages replace the previous deleted message(s) with A separator if the last rendered message was created on different date\n        (hideDeletedMessages &&\n          previousMessage?.type === 'deleted' &&\n          lastDateSeparator !== messageDate)) &&\n      !isDateSeparatorMessage(changes[changes.length - 1]) // do not show two date separators in a row)\n    ) {\n      lastDateSeparator = messageDate;\n\n      changes.push(\n        {\n          customType: CUSTOM_MESSAGE_TYPE.date,\n          date: message.created_at,\n          id: makeDateMessageId(message.created_at),\n        } as DateSeparatorMessage,\n        message,\n      );\n    } else {\n      changes.push(message);\n    }\n\n    newMessages.push(\n      ...(reviewProcessedMessage?.({\n        changes,\n        context,\n        index: i,\n        messages,\n        processedMessages: newMessages,\n      }) || changes),\n    );\n  }\n\n  // clean up the giphy preview component state after a Cancel action\n  if (setGiphyPreviewMessage && !ephemeralMessagePresent) {\n    setGiphyPreviewMessage(undefined);\n  }\n\n  return newMessages;\n};\n\nexport const makeIntroMessage = (): IntroMessage => ({\n  customType: CUSTOM_MESSAGE_TYPE.intro,\n  id: nanoid(),\n});\n\nexport const makeDateMessageId = (date?: string | Date) => {\n  let idSuffix;\n  try {\n    idSuffix = !date ? nanoid() : date instanceof Date ? date.toISOString() : date;\n  } catch (e) {\n    idSuffix = nanoid();\n  }\n  return `${CUSTOM_MESSAGE_TYPE.date}-${idSuffix}`;\n};\n\n// fast since it usually iterates just the last few messages\nexport const getLastReceived = (messages: RenderedMessage[]) => {\n  for (let i = messages.length - 1; i > 0; i -= 1) {\n    if ((messages[i] as LocalMessage).status === 'received') {\n      return messages[i].id;\n    }\n  }\n\n  return null;\n};\n\nexport const insertIntro = (messages: RenderedMessage[], headerPosition?: number) => {\n  const newMessages = messages;\n  const intro = makeIntroMessage();\n\n  // if no headerPosition is set, HeaderComponent will go at the top\n  if (!headerPosition) {\n    newMessages.unshift(intro);\n    return newMessages;\n  }\n\n  // if no messages, intro gets inserted\n  if (!newMessages.length) {\n    newMessages.unshift(intro);\n    return newMessages;\n  }\n\n  // else loop over the messages\n  for (let i = 0; i < messages.length; i += 1) {\n    const messageTime = isDate((messages[i] as LocalMessage).created_at)\n      ? (messages[i] as LocalMessage).created_at.getTime()\n      : null;\n\n    const nextMessageTime = isDate((messages[i + 1] as LocalMessage).created_at)\n      ? (messages[i + 1] as LocalMessage).created_at.getTime()\n      : null;\n\n    // header position is smaller than message time so comes after;\n    if (messageTime && messageTime < headerPosition) {\n      // if header position is also smaller than message time continue;\n      if (nextMessageTime && nextMessageTime < headerPosition) {\n        if (messages[i + 1] && isDateSeparatorMessage(messages[i + 1])) continue;\n        if (!nextMessageTime) {\n          newMessages.push(intro);\n          return newMessages;\n        }\n      } else {\n        newMessages.splice(i + 1, 0, intro);\n        return newMessages;\n      }\n    }\n  }\n\n  return newMessages;\n};\n\nexport type GroupStyle = '' | 'middle' | 'top' | 'bottom' | 'single';\n\nexport const getGroupStyles = (\n  message: RenderedMessage,\n  previousMessage: RenderedMessage,\n  nextMessage: RenderedMessage,\n  noGroupByUser: boolean,\n  maxTimeBetweenGroupedMessages?: number,\n): GroupStyle => {\n  if (isDateSeparatorMessage(message) || isIntroMessage(message)) return '';\n\n  if (noGroupByUser || message.attachments?.length !== 0) return 'single';\n\n  const isTopMessage =\n    !previousMessage ||\n    isIntroMessage(previousMessage) ||\n    isDateSeparatorMessage(previousMessage) ||\n    previousMessage.type === 'system' ||\n    previousMessage.type === 'error' ||\n    previousMessage.attachments?.length !== 0 ||\n    message.user?.id !== previousMessage.user?.id ||\n    previousMessage.deleted_at ||\n    (message.reaction_groups && Object.keys(message.reaction_groups).length > 0) ||\n    isMessageEdited(previousMessage) ||\n    (maxTimeBetweenGroupedMessages !== undefined &&\n      previousMessage.created_at &&\n      message.created_at &&\n      new Date(message.created_at).getTime() -\n        new Date(previousMessage.created_at).getTime() >\n        maxTimeBetweenGroupedMessages);\n\n  const isBottomMessage =\n    !nextMessage ||\n    isIntroMessage(nextMessage) ||\n    isDateSeparatorMessage(nextMessage) ||\n    nextMessage.type === 'system' ||\n    nextMessage.type === 'error' ||\n    nextMessage.attachments?.length !== 0 ||\n    message.user?.id !== nextMessage.user?.id ||\n    nextMessage.deleted_at ||\n    (nextMessage.reaction_groups &&\n      Object.keys(nextMessage.reaction_groups).length > 0) ||\n    isMessageEdited(message) ||\n    (maxTimeBetweenGroupedMessages !== undefined &&\n      nextMessage.created_at &&\n      message.created_at &&\n      new Date(nextMessage.created_at).getTime() -\n        new Date(message.created_at).getTime() >\n        maxTimeBetweenGroupedMessages);\n\n  if (!isTopMessage && !isBottomMessage) {\n    if (message.deleted_at || message.type === 'error') return 'single';\n    return 'middle';\n  }\n\n  if (isBottomMessage) {\n    if (isTopMessage || message.deleted_at || message.type === 'error') return 'single';\n    return 'bottom';\n  }\n\n  if (isTopMessage) return 'top';\n\n  return '';\n};\n\n// \"Probably\" included, because it may happen that the last page was returned and it has exactly the size of the limit\n// but the back-end cannot provide us with information on whether it has still more messages in the DB\n// FIXME: once the pagination state is moved from Channel to MessageList, these should be moved as well.\n//  The MessageList should have configurable the limit for performing the requests.\n//  This parameter would then be used within these functions\nexport const hasMoreMessagesProbably = (returnedCountMessages: number, limit: number) =>\n  returnedCountMessages >= limit;\n\n// @deprecated\nexport const hasNotMoreMessages = (returnedCountMessages: number, limit: number) =>\n  returnedCountMessages < limit;\n\nexport function isIntroMessage(message: unknown): message is IntroMessage {\n  return (message as IntroMessage).customType === CUSTOM_MESSAGE_TYPE.intro;\n}\n\nexport function isDateSeparatorMessage(\n  message: unknown,\n): message is DateSeparatorMessage {\n  return (\n    message !== null &&\n    typeof message === 'object' &&\n    (message as DateSeparatorMessage).customType === CUSTOM_MESSAGE_TYPE.date &&\n    isDate((message as DateSeparatorMessage).date)\n  );\n}\n\nexport function isLocalMessage(message: unknown): message is LocalMessage {\n  return !isDateSeparatorMessage(message) && !isIntroMessage(message);\n}\n\nexport const getIsFirstUnreadMessage = ({\n  firstUnreadMessageId,\n  isFirstMessage,\n  lastReadDate,\n  lastReadMessageId,\n  message,\n  previousMessage,\n  unreadMessageCount = 0,\n}: {\n  isFirstMessage: boolean;\n  message: LocalMessage;\n  firstUnreadMessageId?: string;\n  lastReadDate?: Date;\n  lastReadMessageId?: string;\n  previousMessage?: RenderedMessage;\n  unreadMessageCount?: number;\n}) => {\n  // prevent showing unread indicator in threads\n  if (message.parent_id) return false;\n\n  const createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();\n  const lastReadTimestamp = lastReadDate?.getTime();\n\n  const messageIsUnread =\n    !!createdAtTimestamp && !!lastReadTimestamp && createdAtTimestamp > lastReadTimestamp;\n\n  const previousMessageIsLastRead =\n    !!lastReadMessageId && lastReadMessageId === previousMessage?.id;\n\n  return (\n    firstUnreadMessageId === message.id ||\n    (!!unreadMessageCount &&\n      messageIsUnread &&\n      (isFirstMessage || previousMessageIsLastRead))\n  );\n};\n", "export const CUSTOM_MESSAGE_TYPE = {\n  date: 'message.date',\n  intro: 'channel.intro',\n} as const;\n", "{\n  \"{{ commaSeparatedUsers }} and {{ moreCount }} more\": \"{{ commaSeparatedUsers }} und {{moreCount}} mehr\",\n  \"{{ commaSeparatedUsers }}, and {{ lastUser }}\": \"{{ commaSeparatedUsers }} und {{ lastUser }}\",\n  \"{{ firstUser }} and {{ secondUser }}\": \"{{ firstUser }} und {{ secondUser }}\",\n  \"{{ imageCount }} more\": \"{{ imageCount }} mehr\",\n  \"{{ memberCount }} members\": \"{{ memberCount }} Mitglieder\",\n  \"{{ user }} has been muted\": \"{{ user }} wurde stummgeschaltet\",\n  \"{{ user }} has been unmuted\": \"Die Stummschaltung von {{ user }} wurde aufgehoben\",\n  \"{{ user }} is typing...\": \"{{ user }} tippt...\",\n  \"{{ users }} and {{ user }} are typing...\": \"{{ users }} und {{ user }} tippen...\",\n  \"{{ users }} and more are typing...\": \"{{ users }} und mehr tippen...\",\n  \"{{ watcherCount }} online\": \"{{ watcherCount }} online\",\n  \"{{count}} unread_one\": \"{{count}} ungelesen\",\n  \"{{count}} unread_other\": \"{{count}} ungelesen\",\n  \"{{count}} votes_one\": \"{{count}} Stimme\",\n  \"{{count}} votes_other\": \"{{count}} Stimmen\",\n  \"\uD83C\uDFD9 Attachment...\": \"\uD83C\uDFD9 Anhang...\",\n  \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\": \"\uD83D\uDCCA {{createdBy}} hat erstellt: {{ pollName}}\",\n  \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\": \"\uD83D\uDCCA {{votedBy}} hat abgestimmt: {{pollOptionText}}\",\n  \"\uD83D\uDCCDShared location\": \"\uD83D\uDCCDGeteilter Standort\",\n  \"Add a comment\": \"Einen Kommentar hinzuf\u00FCgen\",\n  \"Add an option\": \"Eine Option hinzuf\u00FCgen\",\n  \"All results loaded\": \"Alle Ergebnisse geladen\",\n  \"Allow access to camera\": \"Zugriff auf Kamera erlauben\",\n  \"Allow access to microphone\": \"Zugriff auf Mikrofon erlauben\",\n  \"Allow comments\": \"Kommentare erlauben\",\n  \"Allow option suggestion\": \"Optionsvorschl\u00E4ge erlauben\",\n  \"Also send as a direct message\": \"Auch als Direktnachricht senden\",\n  \"Also send in channel\": \"Auch im Kanal senden\",\n  \"An error has occurred during recording\": \"Ein Fehler ist w\u00E4hrend der Aufnahme aufgetreten\",\n  \"An error has occurred during the recording processing\": \"Ein Fehler ist w\u00E4hrend der Aufnahmeverarbeitung aufgetreten\",\n  \"Anonymous\": \"Anonym\",\n  \"Anonymous poll\": \"Anonyme Umfrage\",\n  \"Archive\": \"Archivieren\",\n  \"aria/Attachment\": \"Anhang\",\n  \"aria/Cancel Reply\": \"Antwort abbrechen\",\n  \"aria/Cancel upload\": \"Upload abbrechen\",\n  \"aria/Channel list\": \"Kanalliste\",\n  \"aria/Channel search results\": \"Kanalsuchergebnisse\",\n  \"aria/Close thread\": \"Thread schlie\u00DFen\",\n  \"aria/Download attachment\": \"Anhang herunterladen\",\n  \"aria/Emoji picker\": \"Emoji-Auswahl\",\n  \"aria/File input\": \"Dateieingabe\",\n  \"aria/File upload\": \"Datei hochladen\",\n  \"aria/Image input\": \"Bildeingabe\",\n  \"aria/Load More Channels\": \"Mehr Kan\u00E4le laden\",\n  \"aria/Menu\": \"Men\u00FC\",\n  \"aria/Message Options\": \"Nachrichtenoptionen\",\n  \"aria/Open Attachment Selector\": \"Anhang-Auswahl \u00F6ffnen\",\n  \"aria/Open Menu\": \"Men\u00FC \u00F6ffnen\",\n  \"aria/Open Message Actions Menu\": \"Nachrichtenaktionsmen\u00FC \u00F6ffnen\",\n  \"aria/Open Reaction Selector\": \"Reaktionsauswahl \u00F6ffnen\",\n  \"aria/Open Thread\": \"Thread \u00F6ffnen\",\n  \"aria/Reaction list\": \"Reaktionsliste\",\n  \"aria/Remind Me Options\": \"Erinnerungsoptionen\",\n  \"aria/Remove attachment\": \"Anhang entfernen\",\n  \"aria/Remove location attachment\": \"Standortanhang entfernen\",\n  \"aria/Retry upload\": \"Upload erneut versuchen\",\n  \"aria/Search results\": \"Suchergebnisse\",\n  \"aria/Search results header filter button\": \"Suchergebnisse-Kopfzeilen-Filterbutton\",\n  \"aria/Send\": \"Senden\",\n  \"aria/Stop AI Generation\": \"KI-Generierung stoppen\",\n  \"Ask a question\": \"Eine Frage stellen\",\n  \"Attach\": \"Anh\u00E4ngen\",\n  \"Attach files\": \"Dateien anh\u00E4ngen\",\n  \"Attachment upload blocked due to {{reason}}\": \"Anhang-Upload blockiert wegen {{reason}}\",\n  \"Attachment upload failed due to {{reason}}\": \"Anhang-Upload fehlgeschlagen wegen {{reason}}\",\n  \"ban-command-args\": \"[@Benutzername] [Text]\",\n  \"ban-command-description\": \"Einen Benutzer verbannen\",\n  \"Cancel\": \"Abbrechen\",\n  \"Cannot seek in the recording\": \"In der Aufnahme kann nicht gesucht werden\",\n  \"Channel Missing\": \"Kanal fehlt\",\n  \"Close\": \"Schlie\u00DFen\",\n  \"Close emoji picker\": \"Emoji-Auswahl schlie\u00DFen\",\n  \"Commands matching\": \"\u00DCbereinstimmende Befehle\",\n  \"Connection failure, reconnecting now...\": \"Verbindungsfehler, Wiederherstellung der Verbindung...\",\n  \"Create\": \"Erstellen\",\n  \"Create poll\": \"Umfrage erstellen\",\n  \"Current location\": \"Aktueller Standort\",\n  \"Delete\": \"L\u00F6schen\",\n  \"Delete for me\": \"F\u00FCr mich l\u00F6schen\",\n  \"Delivered\": \"Zugestellt\",\n  \"Download attachment {{ name }}\": \"Anhang {{ name }} herunterladen\",\n  \"Drag your files here\": \"Ziehen Sie Ihre Dateien hierher\",\n  \"Drag your files here to add to your post\": \"Ziehen Sie Ihre Dateien hierher, um sie Ihrem Beitrag hinzuzuf\u00FCgen\",\n  \"Due {{ timeLeft }}\": \"F\u00E4llig {{ timeLeft }}\",\n  \"Due since {{ dueSince }}\": \"F\u00E4llig seit {{ dueSince }}\",\n  \"duration/Message reminder\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Remind Me\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Share Location\": \"{{ milliseconds | durationFormatter }}\",\n  \"Edit Message\": \"Nachricht bearbeiten\",\n  \"Edit message request failed\": \"Anfrage zum Bearbeiten der Nachricht fehlgeschlagen\",\n  \"Edited\": \"Bearbeitet\",\n  \"Emoji matching\": \"Passende Emojis\",\n  \"Empty message...\": \"Leere Nachricht...\",\n  \"End\": \"Beenden\",\n  \"End vote\": \"Abstimmung beenden\",\n  \"Enforce unique vote is enabled\": \"Eindeutige Abstimmung ist aktiviert\",\n  \"Error\": \"Error\",\n  \"Error \u00B7 Unsent\": \"Fehler \u00B7 Nicht gesendet\",\n  \"Error adding flag\": \"Fehler beim Hinzuf\u00FCgen des Flags\",\n  \"Error connecting to chat, refresh the page to try again.\": \"Verbindungsfehler zum Chat, aktualisieren Sie die Seite, um es erneut zu versuchen.\",\n  \"Error deleting message\": \"Fehler beim L\u00F6schen der Nachricht\",\n  \"Error fetching reactions\": \"Fehler beim Laden von Reaktionen\",\n  \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\": \"Fehler beim Markieren der Nachricht als ungelesen. Kann keine \u00E4lteren ungelesenen Nachrichten markieren als die neuesten 100 Kanalnachrichten.\",\n  \"Error muting a user ...\": \"Fehler beim Stummschalten eines Nutzers.\",\n  \"Error pinning message\": \"Fehler beim Pinnen der Nachricht\",\n  \"Error removing message pin\": \"Fehler beim Entfernen der gepinnten Nachricht\",\n  \"Error reproducing the recording\": \"Fehler bei der Wiedergabe der Aufnahme\",\n  \"Error starting recording\": \"Fehler beim Starten der Aufnahme\",\n  \"Error unmuting a user ...\": \"Fehler beim Aufheben der Stummschaltung eines Nutzers ...\",\n  \"Error uploading attachment\": \"Fehler beim Hochladen des Anhangs\",\n  \"Error uploading file\": \"Fehler beim Hochladen der Datei\",\n  \"Error uploading image\": \"Fehler beim Hochladen des Bildes\",\n  \"Error: {{ errorMessage }}\": \"Fehler: {{ errorMessage }}\",\n  \"Failed to create the poll\": \"Fehler beim Erstellen der Umfrage\",\n  \"Failed to create the poll due to {{reason}}\": \"Die Umfrage konnte aufgrund von {{reason}} nicht erstellt werden\",\n  \"Failed to jump to the first unread message\": \"Fehler beim Springen zur ersten ungelesenen Nachricht\",\n  \"Failed to mark channel as read\": \"Fehler beim Markieren des Kanals als gelesen\",\n  \"Failed to play the recording\": \"Wiedergabe der Aufnahme fehlgeschlagen\",\n  \"Failed to retrieve location\": \"Standort konnte nicht abgerufen werden\",\n  \"Failed to share location\": \"Standort konnte nicht geteilt werden\",\n  \"File\": \"Datei\",\n  \"File is too large: {{ size }}, maximum upload size is {{ limit }}\": \"Datei ist zu gro\u00DF: {{ size }}, maximale Upload-Gr\u00F6\u00DFe betr\u00E4gt {{ limit }}\",\n  \"Flag\": \"Melden\",\n  \"Generating...\": \"Generieren...\",\n  \"giphy-command-args\": \"[Text]\",\n  \"giphy-command-description\": \"Poste ein zuf\u00E4lliges Gif in den Kanal\",\n  \"Latest Messages\": \"Neueste Nachrichten\",\n  \"live\": \"live\",\n  \"Live for {{duration}}\": \"Live f\u00FCr {{duration}}\",\n  \"Live location\": \"Live-Standort\",\n  \"Live until {{ timestamp }}\": \"Live bis {{ timestamp }}\",\n  \"Load more\": \"Mehr laden\",\n  \"Location\": \"Standort\",\n  \"Location sharing ended\": \"Standortfreigabe beendet\",\n  \"Mark as unread\": \"Als ungelesen markieren\",\n  \"Maximum number of votes (from 2 to 10)\": \"Maximale Anzahl der Stimmen (von 2 bis 10)\",\n  \"Menu\": \"Men\u00FC\",\n  \"Message deleted\": \"Nachricht gel\u00F6scht\",\n  \"Message Failed \u00B7 Click to try again\": \"Nachricht fehlgeschlagen \u00B7 Klicken, um es erneut zu versuchen\",\n  \"Message Failed \u00B7 Unauthorized\": \"Nachricht fehlgeschlagen \u00B7 Nicht autorisiert\",\n  \"Message has been successfully flagged\": \"Nachricht wurde erfolgreich gemeldet\",\n  \"Message pinned\": \"Nachricht angeheftet\",\n  \"Message was blocked by moderation policies\": \"Nachricht wurde durch moderationsrichtlinien blockiert\",\n  \"Messages have been marked unread.\": \"Nachrichten wurden als ungelesen markiert.\",\n  \"Missing permissions to upload the attachment\": \"Fehlende Berechtigungen zum Hochladen des Anhangs\",\n  \"Multiple answers\": \"Mehrere Antworten\",\n  \"Mute\": \"Stummschalten\",\n  \"mute-command-args\": \"[@Benutzername]\",\n  \"mute-command-description\": \"Stummschalten eines Benutzers\",\n  \"network error\": \"Netzwerkfehler\",\n  \"New\": \"Neu\",\n  \"New Messages!\": \"Neue Nachrichten!\",\n  \"No chats here yet\u2026\": \"Noch keine Chats hier...\",\n  \"No results found\": \"Keine Ergebnisse gefunden\",\n  \"Nobody will be able to vote in this poll anymore.\": \"Niemand kann mehr in dieser Umfrage abstimmen.\",\n  \"Nothing yet...\": \"Noch nichts...\",\n  \"Ok\": \"Ok\",\n  \"Only numbers are allowed\": \"Nur Zahlen sind erlaubt\",\n  \"Open emoji picker\": \"Emoji-Auswahl \u00F6ffnen\",\n  \"Option already exists\": \"Option existiert bereits\",\n  \"Option is empty\": \"Option ist leer\",\n  \"Options\": \"Optionen\",\n  \"People matching\": \"Passende Personen\",\n  \"Pin\": \"Anheften\",\n  \"Pinned by\": \"Angeheftet von\",\n  \"Poll\": \"Umfrage\",\n  \"Poll comments\": \"Umfragekommentare\",\n  \"Poll options\": \"Umfrageoptionen\",\n  \"Poll results\": \"Umfrageergebnisse\",\n  \"Question\": \"Frage\",\n  \"Question is required\": \"Frage ist erforderlich\",\n  \"Quote\": \"Zitieren\",\n  \"Reached the vote limit. Remove an existing vote first.\": \"Das Abstimmungslimit wurde erreicht. Entfernen Sie zuerst eine bestehende Stimme.\",\n  \"Recording format is not supported and cannot be reproduced\": \"Aufnahmeformat wird nicht unterst\u00FCtzt und kann nicht wiedergegeben werden\",\n  \"Remind Me\": \"Erinnern\",\n  \"Remove reminder\": \"Erinnerung entfernen\",\n  \"Reply\": \"Antworten\",\n  \"Reply to Message\": \"Auf Nachricht antworten\",\n  \"replyCount_one\": \"1 Antwort\",\n  \"replyCount_other\": \"{{ count }} Antworten\",\n  \"Save for later\": \"F\u00FCr sp\u00E4ter speichern\",\n  \"Saved for later\": \"F\u00FCr sp\u00E4ter gespeichert\",\n  \"Search\": \"Suche\",\n  \"search-results-header-filter-source-button-label--channels\": \"Kan\u00E4le\",\n  \"search-results-header-filter-source-button-label--messages\": \"Nachrichten\",\n  \"search-results-header-filter-source-button-label--users\": \"Benutzer\",\n  \"Searching for {{ searchSourceType }}...\": \"Searching for {{ searchSourceType }}...\",\n  \"Searching...\": \"Suchen...\",\n  \"searchResultsCount_one\": \"1 Ergebnis\",\n  \"searchResultsCount_other\": \"{{ count }} Ergebnisse\",\n  \"See all options ({{count}})_one\": \"Alle Optionen anzeigen ({{count}})\",\n  \"See all options ({{count}})_other\": \"Alle Optionen anzeigen ({{count}})\",\n  \"Select one\": \"Eine ausw\u00E4hlen\",\n  \"Select one or more\": \"Eine oder mehrere ausw\u00E4hlen\",\n  \"Select up to {{count}}_one\": \"Bis zu {{count}} ausw\u00E4hlen\",\n  \"Select up to {{count}}_other\": \"Bis zu {{count}} ausw\u00E4hlen\",\n  \"Send\": \"Senden\",\n  \"Send Anyway\": \"Trotzdem senden\",\n  \"Send message request failed\": \"Senden der Nachrichtenanfrage fehlgeschlagen\",\n  \"Sending...\": \"Senden...\",\n  \"Sent\": \"Gesendet\",\n  \"Share\": \"Teilen\",\n  \"Share live location for\": \"Live-Standort teilen f\u00FCr\",\n  \"Share Location\": \"Standort teilen\",\n  \"Shared live location\": \"Geteilter Live-Standort\",\n  \"Show all\": \"Alle anzeigen\",\n  \"Shuffle\": \"Mischen\",\n  \"size limit\": \"Gr\u00F6\u00DFenbeschr\u00E4nkung\",\n  \"Slow Mode ON\": \"Langsamer Modus EIN\",\n  \"Some of the files will not be accepted\": \"Einige der Dateien werden nicht akzeptiert\",\n  \"Start typing to search\": \"Tippen Sie, um zu suchen\",\n  \"Stop sharing\": \"Teilen beenden\",\n  \"Submit\": \"Absenden\",\n  \"Suggest an option\": \"Eine Option vorschlagen\",\n  \"Thinking...\": \"Denken...\",\n  \"this content could not be displayed\": \"Dieser Inhalt konnte nicht angezeigt werden\",\n  \"This field cannot be empty or contain only spaces\": \"Dieses Feld darf nicht leer sein oder nur Leerzeichen enthalten\",\n  \"This message did not meet our content guidelines\": \"Diese Nachricht entsprach nicht unseren Inhaltsrichtlinien\",\n  \"This message was deleted...\": \"Diese Nachricht wurde gel\u00F6scht...\",\n  \"Thread\": \"Thread\",\n  \"Thread has not been found\": \"Thread wurde nicht gefunden\",\n  \"Thread reply\": \"Thread-Antwort\",\n  \"timestamp/DateSeparator\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/LiveLocation\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/MessageTimestamp\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/PollVote\": \"{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}\",\n  \"timestamp/PollVoteTooltip\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/ReminderNotification\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/SystemMessage\": \"{{ timestamp | timestampFormatter(format: dddd L) }}\",\n  \"To start recording, allow the camera access in your browser\": \"Um mit der Aufnahme zu beginnen, erlauben Sie den Zugriff auf die Kamera in Ihrem Browser\",\n  \"To start recording, allow the microphone access in your browser\": \"Um mit der Aufnahme zu beginnen, erlauben Sie den Zugriff auf das Mikrofon in Ihrem Browser\",\n  \"translationBuilderTopic/notification\": \"{{value, notification}}\",\n  \"Type a number from 2 to 10\": \"Geben Sie eine Zahl von 2 bis 10 ein\",\n  \"Type your message\": \"Nachricht eingeben\",\n  \"Unarchive\": \"Archivierung aufheben\",\n  \"unban-command-args\": \"[@Benutzername]\",\n  \"unban-command-description\": \"Einen Benutzer entbannen\",\n  \"unknown error\": \"Unbekannter Fehler\",\n  \"Unmute\": \"Stummschaltung aufheben\",\n  \"unmute-command-args\": \"[@Benutzername]\",\n  \"unmute-command-description\": \"Stummschaltung eines Benutzers aufheben\",\n  \"Unpin\": \"Anheftung aufheben\",\n  \"Unread messages\": \"Ungelesene Nachrichten\",\n  \"unreadMessagesSeparatorText_one\": \"1 ungelesene Nachricht\",\n  \"unreadMessagesSeparatorText_other\": \"{{count}} ungelesene Nachrichten\",\n  \"Unsupported attachment\": \"Nicht unterst\u00FCtzter Anhang\",\n  \"unsupported file type\": \"Nicht unterst\u00FCtzter Dateityp\",\n  \"Update your comment\": \"Ihren Kommentar aktualisieren\",\n  \"Upload type: \\\"{{ type }}\\\" is not allowed\": \"Upload-Typ: \\\"{{ type }}\\\" ist nicht erlaubt\",\n  \"User uploaded content\": \"Vom Benutzer hochgeladener Inhalt\",\n  \"View {{count}} comments_one\": \"{{count}} Kommentar anzeigen\",\n  \"View {{count}} comments_other\": \"{{count}} Kommentare anzeigen\",\n  \"View results\": \"Ergebnisse anzeigen\",\n  \"Voice message\": \"Sprachnachricht\",\n  \"Vote ended\": \"Abstimmung beendet\",\n  \"Wait until all attachments have uploaded\": \"Bitte warten, bis alle Anh\u00E4nge hochgeladen wurden\",\n  \"You\": \"Du\",\n  \"You have no channels currently\": \"Du hast momentan noch keine Kan\u00E4le\",\n  \"You've reached the maximum number of files\": \"Die maximale Anzahl an Dateien ist erreicht\"\n}\n", "{\n  \"{{ commaSeparatedUsers }} and {{ moreCount }} more\": \"{{ commaSeparatedUsers }} and {{ moreCount }} more\",\n  \"{{ commaSeparatedUsers }}, and {{ lastUser }}\": \"{{ commaSeparatedUsers }}, and {{ lastUser }}\",\n  \"{{ firstUser }} and {{ secondUser }}\": \"{{ firstUser }} and {{ secondUser }}\",\n  \"{{ imageCount }} more\": \"{{ imageCount }} more\",\n  \"{{ memberCount }} members\": \"{{ memberCount }} members\",\n  \"{{ user }} has been muted\": \"{{ user }} has been muted\",\n  \"{{ user }} has been unmuted\": \"{{ user }} has been unmuted\",\n  \"{{ user }} is typing...\": \"{{ user }} is typing...\",\n  \"{{ users }} and {{ user }} are typing...\": \"{{ users }} and {{ user }} are typing...\",\n  \"{{ users }} and more are typing...\": \"{{ users }} and more are typing...\",\n  \"{{ watcherCount }} online\": \"{{ watcherCount }} online\",\n  \"{{count}} unread_one\": \"{{count}} unread\",\n  \"{{count}} unread_other\": \"{{count}} unread\",\n  \"{{count}} votes_one\": \"{{count}} vote\",\n  \"{{count}} votes_other\": \"{{count}} votes\",\n  \"\uD83C\uDFD9 Attachment...\": \"\uD83C\uDFD9 Attachment...\",\n  \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\": \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\",\n  \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\": \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\",\n  \"\uD83D\uDCCDShared location\": \"\uD83D\uDCCDShared location\",\n  \"Add a comment\": \"Add a comment\",\n  \"Add an option\": \"Add an option\",\n  \"All results loaded\": \"All results loaded\",\n  \"Allow access to camera\": \"Allow access to camera\",\n  \"Allow access to microphone\": \"Allow access to microphone\",\n  \"Allow comments\": \"Allow comments\",\n  \"Allow option suggestion\": \"Allow option suggestion\",\n  \"Also send as a direct message\": \"Also send as a direct message\",\n  \"Also send in channel\": \"Also send in channel\",\n  \"An error has occurred during recording\": \"An error has occurred during recording\",\n  \"An error has occurred during the recording processing\": \"An error has occurred during the recording processing\",\n  \"Anonymous\": \"Anonymous\",\n  \"Anonymous poll\": \"Anonymous poll\",\n  \"Archive\": \"Archive\",\n  \"aria/Attachment\": \"Attachment\",\n  \"aria/Cancel Reply\": \"Cancel Reply\",\n  \"aria/Cancel upload\": \"Cancel upload\",\n  \"aria/Channel list\": \"Channel list\",\n  \"aria/Channel search results\": \"Channel search results\",\n  \"aria/Close thread\": \"Close thread\",\n  \"aria/Download attachment\": \"aria/Download attachment\",\n  \"aria/Emoji picker\": \"Emoji picker\",\n  \"aria/File input\": \"File input\",\n  \"aria/File upload\": \"File upload\",\n  \"aria/Image input\": \"Image input\",\n  \"aria/Load More Channels\": \"Load More Channels\",\n  \"aria/Menu\": \"Menu\",\n  \"aria/Message Options\": \"Message Options\",\n  \"aria/Open Attachment Selector\": \"aria/Open Attachment Selector\",\n  \"aria/Open Menu\": \"Open Menu\",\n  \"aria/Open Message Actions Menu\": \"Open Message Actions Menu\",\n  \"aria/Open Reaction Selector\": \"Open Reaction Selector\",\n  \"aria/Open Thread\": \"Open Thread\",\n  \"aria/Reaction list\": \"Reaction list\",\n  \"aria/Remind Me Options\": \"aria/Remind Me Options\",\n  \"aria/Remove attachment\": \"Remove attachment\",\n  \"aria/Remove location attachment\": \"Remove location attachment\",\n  \"aria/Retry upload\": \"Retry upload\",\n  \"aria/Search results\": \"Search results\",\n  \"aria/Search results header filter button\": \"Search results header filter button\",\n  \"aria/Send\": \"Send\",\n  \"aria/Stop AI Generation\": \"Stop AI Generation\",\n  \"Ask a question\": \"Ask a question\",\n  \"Attach\": \"Attach\",\n  \"Attach files\": \"Attach files\",\n  \"Attachment upload blocked due to {{reason}}\": \"Attachment upload blocked due to {{reason}}\",\n  \"Attachment upload failed due to {{reason}}\": \"Attachment upload failed due to {{reason}}\",\n  \"ban-command-args\": \"[@username] [text]\",\n  \"ban-command-description\": \"Ban a user\",\n  \"Cancel\": \"Cancel\",\n  \"Cannot seek in the recording\": \"Cannot seek in the recording\",\n  \"Channel Missing\": \"Channel Missing\",\n  \"Close\": \"Close\",\n  \"Close emoji picker\": \"Close emoji picker\",\n  \"Commands matching\": \"Commands matching\",\n  \"Connection failure, reconnecting now...\": \"Connection failure, reconnecting now...\",\n  \"Create\": \"Create\",\n  \"Create poll\": \"Create poll\",\n  \"Current location\": \"Current location\",\n  \"Delete\": \"Delete\",\n  \"Delete for me\": \"Delete for me\",\n  \"Delivered\": \"Delivered\",\n  \"Download attachment {{ name }}\": \"Download attachment {{ name }}\",\n  \"Drag your files here\": \"Drag your files here\",\n  \"Drag your files here to add to your post\": \"Drag your files here to add to your post\",\n  \"Due {{ timeLeft }}\": \"Due {{ timeLeft }}\",\n  \"Due since {{ dueSince }}\": \"Due since {{ dueSince }}\",\n  \"duration/Message reminder\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Remind Me\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Share Location\": \"{{ milliseconds | durationFormatter }}\",\n  \"Edit Message\": \"Edit Message\",\n  \"Edit message request failed\": \"Edit message request failed\",\n  \"Edited\": \"Edited\",\n  \"Emoji matching\": \"Emoji matching\",\n  \"Empty message...\": \"Empty message...\",\n  \"End\": \"End\",\n  \"End vote\": \"End vote\",\n  \"Enforce unique vote is enabled\": \"Enforce unique vote is enabled\",\n  \"Error\": \"Error\",\n  \"Error \u00B7 Unsent\": \"Error \u00B7 Unsent\",\n  \"Error adding flag\": \"Error adding flag\",\n  \"Error connecting to chat, refresh the page to try again.\": \"Error connecting to chat, refresh the page to try again.\",\n  \"Error deleting message\": \"Error deleting message\",\n  \"Error fetching reactions\": \"Error loading reactions\",\n  \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\": \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\",\n  \"Error muting a user ...\": \"Error muting a user ...\",\n  \"Error pinning message\": \"Error pinning message\",\n  \"Error removing message pin\": \"Error removing message pin\",\n  \"Error reproducing the recording\": \"Error reproducing the recording\",\n  \"Error starting recording\": \"Error starting recording\",\n  \"Error unmuting a user ...\": \"Error unmuting a user ...\",\n  \"Error uploading attachment\": \"Error uploading attachment\",\n  \"Error uploading file\": \"Error uploading file\",\n  \"Error uploading image\": \"Error uploading image\",\n  \"Error: {{ errorMessage }}\": \"Error: {{ errorMessage }}\",\n  \"Failed to create the poll\": \"Failed to create the poll\",\n  \"Failed to create the poll due to {{reason}}\": \"Failed to create the poll due to {{reason}}\",\n  \"Failed to jump to the first unread message\": \"Failed to jump to the first unread message\",\n  \"Failed to mark channel as read\": \"Failed to mark channel as read\",\n  \"Failed to play the recording\": \"Failed to play the recording\",\n  \"Failed to retrieve location\": \"Failed to retrieve location\",\n  \"Failed to share location\": \"Failed to share location\",\n  \"File\": \"File\",\n  \"File is too large: {{ size }}, maximum upload size is {{ limit }}\": \"File is too large: {{ size }}, maximum upload size is {{ limit }}\",\n  \"Flag\": \"Flag\",\n  \"Generating...\": \"Generating...\",\n  \"giphy-command-args\": \"[text]\",\n  \"giphy-command-description\": \"Post a random gif to the channel\",\n  \"Latest Messages\": \"Latest Messages\",\n  \"live\": \"live\",\n  \"Live for {{duration}}\": \"Live for {{duration}}\",\n  \"Live location\": \"Live location\",\n  \"Live until {{ timestamp }}\": \"Live until {{ timestamp }}\",\n  \"Load more\": \"Load more\",\n  \"Location\": \"Location\",\n  \"Location sharing ended\": \"Location sharing ended\",\n  \"Mark as unread\": \"Mark as unread\",\n  \"Maximum number of votes (from 2 to 10)\": \"Maximum number of votes (from 2 to 10)\",\n  \"Menu\": \"Menu\",\n  \"Message deleted\": \"Message deleted\",\n  \"Message Failed \u00B7 Click to try again\": \"Message Failed \u00B7 Click to try again\",\n  \"Message Failed \u00B7 Unauthorized\": \"Message Failed \u00B7 Unauthorized\",\n  \"Message has been successfully flagged\": \"Message has been successfully flagged\",\n  \"Message pinned\": \"Message pinned\",\n  \"Message was blocked by moderation policies\": \"Message was blocked by moderation policies\",\n  \"Messages have been marked unread.\": \"Messages have been marked unread.\",\n  \"Missing permissions to upload the attachment\": \"Missing permissions to upload the attachment\",\n  \"Multiple answers\": \"Multiple answers\",\n  \"Mute\": \"Mute\",\n  \"mute-command-args\": \"[@username]\",\n  \"mute-command-description\": \"Mute a user\",\n  \"network error\": \"network error\",\n  \"New\": \"New\",\n  \"New Messages!\": \"New Messages!\",\n  \"No chats here yet\u2026\": \"No chats here yet\u2026\",\n  \"No results found\": \"No results found\",\n  \"Nobody will be able to vote in this poll anymore.\": \"Nobody will be able to vote in this poll anymore.\",\n  \"Nothing yet...\": \"Nothing yet...\",\n  \"Ok\": \"Ok\",\n  \"Only numbers are allowed\": \"Only numbers are allowed\",\n  \"Open emoji picker\": \"Open emoji picker\",\n  \"Option already exists\": \"Option already exists\",\n  \"Option is empty\": \"Option is empty\",\n  \"Options\": \"Options\",\n  \"People matching\": \"People matching\",\n  \"Pin\": \"Pin\",\n  \"Pinned by\": \"Pinned by\",\n  \"Poll\": \"Poll\",\n  \"Poll comments\": \"Poll comments\",\n  \"Poll options\": \"Poll options\",\n  \"Poll results\": \"Poll results\",\n  \"Question\": \"Question\",\n  \"Question is required\": \"Question is required\",\n  \"Quote\": \"Quote\",\n  \"Reached the vote limit. Remove an existing vote first.\": \"Reached the vote limit. Remove an existing vote first.\",\n  \"Recording format is not supported and cannot be reproduced\": \"Recording format is not supported and cannot be reproduced\",\n  \"Remind Me\": \"Remind Me\",\n  \"Remove reminder\": \"Remove reminder\",\n  \"Reply\": \"Reply\",\n  \"Reply to Message\": \"Reply to Message\",\n  \"replyCount_one\": \"1 reply\",\n  \"replyCount_other\": \"{{ count }} replies\",\n  \"Save for later\": \"Save for later\",\n  \"Saved for later\": \"Saved for later\",\n  \"Search\": \"Search\",\n  \"search-results-header-filter-source-button-label--channels\": \"channels\",\n  \"search-results-header-filter-source-button-label--messages\": \"messages\",\n  \"search-results-header-filter-source-button-label--users\": \"users\",\n  \"Searching for {{ searchSourceType }}...\": \"Searching for {{ searchSourceType }}...\",\n  \"Searching...\": \"Searching...\",\n  \"searchResultsCount_one\": \"1 result\",\n  \"searchResultsCount_other\": \"{{ count }} results\",\n  \"See all options ({{count}})_one\": \"See all options ({{count}})\",\n  \"See all options ({{count}})_other\": \"See all options ({{count}})\",\n  \"Select one\": \"Select one\",\n  \"Select one or more\": \"Select one or more\",\n  \"Select up to {{count}}_one\": \"Select up to {{count}}\",\n  \"Select up to {{count}}_other\": \"Select up to {{count}}\",\n  \"Send\": \"Send\",\n  \"Send Anyway\": \"Send Anyway\",\n  \"Send message request failed\": \"Send message request failed\",\n  \"Sending...\": \"Sending...\",\n  \"Sent\": \"Sent\",\n  \"Share\": \"Share\",\n  \"Share live location for\": \"Share live location for\",\n  \"Share Location\": \"Share Location\",\n  \"Shared live location\": \"Shared live location\",\n  \"Show all\": \"Show all\",\n  \"Shuffle\": \"Shuffle\",\n  \"size limit\": \"size limit\",\n  \"Slow Mode ON\": \"Slow Mode ON\",\n  \"Some of the files will not be accepted\": \"Some of the files will not be accepted\",\n  \"Start typing to search\": \"Start typing to search\",\n  \"Stop sharing\": \"Stop sharing\",\n  \"Submit\": \"Submit\",\n  \"Suggest an option\": \"Suggest an option\",\n  \"Thinking...\": \"Thinking...\",\n  \"this content could not be displayed\": \"this content could not be displayed\",\n  \"This field cannot be empty or contain only spaces\": \"This field cannot be empty or contain only spaces\",\n  \"This message did not meet our content guidelines\": \"This message did not meet our content guidelines\",\n  \"This message was deleted...\": \"This message was deleted...\",\n  \"Thread\": \"Thread\",\n  \"Thread has not been found\": \"Thread has not been found\",\n  \"Thread reply\": \"Thread reply\",\n  \"timestamp/DateSeparator\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/LiveLocation\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/MessageTimestamp\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/PollVote\": \"{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}\",\n  \"timestamp/PollVoteTooltip\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/ReminderNotification\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/SystemMessage\": \"{{ timestamp | timestampFormatter(format: dddd L) }}\",\n  \"To start recording, allow the camera access in your browser\": \"To start recording, allow the camera access in your browser\",\n  \"To start recording, allow the microphone access in your browser\": \"To start recording, allow the microphone access in your browser\",\n  \"translationBuilderTopic/notification\": \"{{value, notification}}\",\n  \"Type a number from 2 to 10\": \"Type a number from 2 to 10\",\n  \"Type your message\": \"Type your message\",\n  \"Unarchive\": \"Unarchive\",\n  \"unban-command-args\": \"[@username]\",\n  \"unban-command-description\": \"Unban a user\",\n  \"unknown error\": \"unknown error\",\n  \"Unmute\": \"Unmute\",\n  \"unmute-command-args\": \"[@username]\",\n  \"unmute-command-description\": \"Unmute a user\",\n  \"Unpin\": \"Unpin\",\n  \"Unread messages\": \"Unread messages\",\n  \"unreadMessagesSeparatorText_one\": \"1 unread message\",\n  \"unreadMessagesSeparatorText_other\": \"{{count}} unread messages\",\n  \"Unsupported attachment\": \"Unsupported attachment\",\n  \"unsupported file type\": \"unsupported file type\",\n  \"Update your comment\": \"Update your comment\",\n  \"Upload type: \\\"{{ type }}\\\" is not allowed\": \"Upload type: \\\"{{ type }}\\\" is not allowed\",\n  \"User uploaded content\": \"User uploaded content\",\n  \"View {{count}} comments_one\": \"View {{count}} comment\",\n  \"View {{count}} comments_other\": \"View {{count}} comments\",\n  \"View results\": \"View results\",\n  \"Voice message\": \"Voice message\",\n  \"Vote ended\": \"Vote ended\",\n  \"Wait until all attachments have uploaded\": \"Wait until all attachments have uploaded\",\n  \"You\": \"You\",\n  \"You have no channels currently\": \"You have no channels currently\",\n  \"You've reached the maximum number of files\": \"You've reached the maximum number of files\"\n}\n", "{\n  \"{{ commaSeparatedUsers }} and {{ moreCount }} more\": \"{{ commaSeparatedUsers }} y {{ moreCount }} m\u00E1s\",\n  \"{{ commaSeparatedUsers }}, and {{ lastUser }}\": \"{{ commaSeparatedUsers }} y {{ lastUser }}\",\n  \"{{ firstUser }} and {{ secondUser }}\": \"{{ firstUser }} y {{ secondUser }}\",\n  \"{{ imageCount }} more\": \"{{ imageCount }} m\u00E1s\",\n  \"{{ memberCount }} members\": \"{{ memberCount }} miembros\",\n  \"{{ user }} has been muted\": \"{{ user }} ha sido silenciado\",\n  \"{{ user }} has been unmuted\": \"Se ha desactivado el silencio de {{ user }}\",\n  \"{{ user }} is typing...\": \"{{ user }} est\u00E1 escribiendo...\",\n  \"{{ users }} and {{ user }} are typing...\": \"{{ users }} y {{ user }} est\u00E1n escribiendo...\",\n  \"{{ users }} and more are typing...\": \"{{ users }} y m\u00E1s est\u00E1n escribiendo...\",\n  \"{{ watcherCount }} online\": \"{{ watcherCount }} en l\u00EDnea\",\n  \"{{count}} unread_one\": \"{{count}} no le\u00EDdo\",\n  \"{{count}} unread_many\": \"{{count}} no le\u00EDdos\",\n  \"{{count}} unread_other\": \"{{count}} no le\u00EDdos\",\n  \"{{count}} votes_one\": \"1 voto\",\n  \"{{count}} votes_many\": \"{{count}} votos\",\n  \"{{count}} votes_other\": \"{{count}} votos\",\n  \"\uD83C\uDFD9 Attachment...\": \"\uD83C\uDFD9 Adjunto...\",\n  \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\": \"\uD83D\uDCCA {{createdBy}} cre\u00F3: {{ pollName}}\",\n  \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\": \"\uD83D\uDCCA {{votedBy}} vot\u00F3: {{pollOptionText}}\",\n  \"\uD83D\uDCCDShared location\": \"\uD83D\uDCCDUbicaci\u00F3n compartida\",\n  \"Add a comment\": \"Agregar un comentario\",\n  \"Add an option\": \"Agregar una opci\u00F3n\",\n  \"All results loaded\": \"Todos los resultados cargados\",\n  \"Allow access to camera\": \"Permitir acceso a la c\u00E1mara\",\n  \"Allow access to microphone\": \"Permitir acceso al micr\u00F3fono\",\n  \"Allow comments\": \"Permitir comentarios\",\n  \"Allow option suggestion\": \"Permitir sugerencia de opciones\",\n  \"Also send as a direct message\": \"Tambi\u00E9n enviar como mensaje directo\",\n  \"Also send in channel\": \"Tambi\u00E9n enviar en el canal\",\n  \"An error has occurred during recording\": \"Se ha producido un error durante la grabaci\u00F3n\",\n  \"An error has occurred during the recording processing\": \"Se ha producido un error durante el procesamiento de la grabaci\u00F3n\",\n  \"Anonymous\": \"An\u00F3nimo\",\n  \"Anonymous poll\": \"Encuesta an\u00F3nima\",\n  \"Archive\": \"Archivo\",\n  \"aria/Attachment\": \"Adjunto\",\n  \"aria/Cancel Reply\": \"Cancelar respuesta\",\n  \"aria/Cancel upload\": \"Cancelar carga\",\n  \"aria/Channel list\": \"Lista de canales\",\n  \"aria/Channel search results\": \"Resultados de b\u00FAsqueda de canales\",\n  \"aria/Close thread\": \"Cerrar hilo\",\n  \"aria/Download attachment\": \"Descargar adjunto\",\n  \"aria/Emoji picker\": \"Selector de emojis\",\n  \"aria/File input\": \"Entrada de archivo\",\n  \"aria/File upload\": \"Carga de archivo\",\n  \"aria/Image input\": \"Entrada de imagen\",\n  \"aria/Load More Channels\": \"Cargar m\u00E1s canales\",\n  \"aria/Menu\": \"Men\u00FA\",\n  \"aria/Message Options\": \"Opciones de mensaje\",\n  \"aria/Open Attachment Selector\": \"Abrir selector de adjuntos\",\n  \"aria/Open Menu\": \"Abrir men\u00FA\",\n  \"aria/Open Message Actions Menu\": \"Abrir men\u00FA de acciones de mensaje\",\n  \"aria/Open Reaction Selector\": \"Abrir selector de reacciones\",\n  \"aria/Open Thread\": \"Abrir hilo\",\n  \"aria/Reaction list\": \"Lista de reacciones\",\n  \"aria/Remind Me Options\": \"Opciones de recordatorio\",\n  \"aria/Remove attachment\": \"Eliminar adjunto\",\n  \"aria/Remove location attachment\": \"Eliminar adjunto de ubicaci\u00F3n\",\n  \"aria/Retry upload\": \"Reintentar carga\",\n  \"aria/Search results\": \"Resultados de b\u00FAsqueda\",\n  \"aria/Search results header filter button\": \"Bot\u00F3n de filtro del encabezado de resultados de b\u00FAsqueda\",\n  \"aria/Send\": \"Enviar\",\n  \"aria/Stop AI Generation\": \"Detener generaci\u00F3n de IA\",\n  \"Ask a question\": \"Hacer una pregunta\",\n  \"Attach\": \"Adjuntar\",\n  \"Attach files\": \"Adjuntar archivos\",\n  \"Attachment upload blocked due to {{reason}}\": \"Carga de adjunto bloqueada debido a {{reason}}\",\n  \"Attachment upload failed due to {{reason}}\": \"Carga de adjunto fallida debido a {{reason}}\",\n  \"ban-command-args\": \"[@usuario] [texto]\",\n  \"ban-command-description\": \"Prohibir a un usuario\",\n  \"Cancel\": \"Cancelar\",\n  \"Cannot seek in the recording\": \"No se puede buscar en la grabaci\u00F3n\",\n  \"Channel Missing\": \"Falta canal\",\n  \"Close\": \"Cerrar\",\n  \"Close emoji picker\": \"Cerrar el selector de emojis\",\n  \"Commands matching\": \"Coincidencia de comandos\",\n  \"Connection failure, reconnecting now...\": \"Fallo de conexi\u00F3n, reconectando ahora...\",\n  \"Create\": \"Crear\",\n  \"Create poll\": \"Crear encuesta\",\n  \"Current location\": \"Ubicaci\u00F3n actual\",\n  \"Delete\": \"Borrar\",\n  \"Delete for me\": \"Eliminar para m\u00ED\",\n  \"Delivered\": \"Entregado\",\n  \"Download attachment {{ name }}\": \"Descargar adjunto {{ name }}\",\n  \"Drag your files here\": \"Arrastra tus archivos aqu\u00ED\",\n  \"Drag your files here to add to your post\": \"Arrastra tus archivos aqu\u00ED para agregarlos a tu publicaci\u00F3n\",\n  \"Due {{ timeLeft }}\": \"Vence en {{ timeLeft }}\",\n  \"Due since {{ dueSince }}\": \"Vencido desde {{ dueSince }}\",\n  \"duration/Message reminder\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Remind Me\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Share Location\": \"{{ milliseconds | durationFormatter }}\",\n  \"Edit Message\": \"Editar mensaje\",\n  \"Edit message request failed\": \"Error al editar la solicitud de mensaje\",\n  \"Edited\": \"Editado\",\n  \"Emoji matching\": \"Coincidencia de emoji\",\n  \"Empty message...\": \"Mensaje vac\u00EDo...\",\n  \"End\": \"Final\",\n  \"End vote\": \"Finalizar votaci\u00F3n\",\n  \"Enforce unique vote is enabled\": \"El voto \u00FAnico est\u00E1 habilitado\",\n  \"Error\": \"Error\",\n  \"Error \u00B7 Unsent\": \"Error \u00B7 No enviado\",\n  \"Error adding flag\": \"Error al agregar la bandera\",\n  \"Error connecting to chat, refresh the page to try again.\": \"Error al conectarse al chat, actualice la p\u00E1gina para volver a intentarlo.\",\n  \"Error deleting message\": \"Error al eliminar el mensaje\",\n  \"Error fetching reactions\": \"Error al cargar las reacciones\",\n  \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\": \"Error al marcar el mensaje como no le\u00EDdo. No se pueden marcar mensajes no le\u00EDdos m\u00E1s antiguos que los \u00FAltimos 100 mensajes del canal.\",\n  \"Error muting a user ...\": \"Error al silenciar el usuario...\",\n  \"Error pinning message\": \"Error al fijar el mensaje\",\n  \"Error removing message pin\": \"Error al quitar el pin del mensaje\",\n  \"Error reproducing the recording\": \"Error al reproducir la grabaci\u00F3n\",\n  \"Error starting recording\": \"Error al iniciar la grabaci\u00F3n\",\n  \"Error unmuting a user ...\": \"Error al desactivar el silencio del usuario...\",\n  \"Error uploading attachment\": \"Error al subir el archivo adjunto\",\n  \"Error uploading file\": \"Error al cargar el archivo\",\n  \"Error uploading image\": \"Error al subir la imagen\",\n  \"Error: {{ errorMessage }}\": \"Error: {{ errorMessage }}\",\n  \"Failed to create the poll\": \"Error al crear la encuesta\",\n  \"Failed to create the poll due to {{reason}}\": \"No se pudo crear la encuesta debido a {{reason}}\",\n  \"Failed to jump to the first unread message\": \"Error al saltar al primer mensaje no le\u00EDdo\",\n  \"Failed to mark channel as read\": \"Error al marcar el canal como le\u00EDdo\",\n  \"Failed to play the recording\": \"No se pudo reproducir la grabaci\u00F3n\",\n  \"Failed to retrieve location\": \"No se pudo obtener la ubicaci\u00F3n\",\n  \"Failed to share location\": \"No se pudo compartir la ubicaci\u00F3n\",\n  \"File\": \"Archivo\",\n  \"File is too large: {{ size }}, maximum upload size is {{ limit }}\": \"El archivo es demasiado grande: {{ size }}, el tama\u00F1o m\u00E1ximo de carga es de {{ limit }}\",\n  \"Flag\": \"Marcar\",\n  \"Generating...\": \"Generando...\",\n  \"giphy-command-args\": \"[texto]\",\n  \"giphy-command-description\": \"Publicar un gif aleatorio en el canal\",\n  \"Latest Messages\": \"\u00DAltimos mensajes\",\n  \"live\": \"En vivo\",\n  \"Live for {{duration}}\": \"En vivo durante {{duration}}\",\n  \"Live location\": \"Ubicaci\u00F3n en vivo\",\n  \"Live until {{ timestamp }}\": \"En vivo hasta {{ timestamp }}\",\n  \"Load more\": \"Cargar m\u00E1s\",\n  \"Location\": \"Ubicaci\u00F3n\",\n  \"Location sharing ended\": \"Compartir ubicaci\u00F3n terminado\",\n  \"Mark as unread\": \"Marcar como no le\u00EDdo\",\n  \"Maximum number of votes (from 2 to 10)\": \"N\u00FAmero m\u00E1ximo de votos (de 2 a 10)\",\n  \"Menu\": \"Men\u00FA\",\n  \"Message deleted\": \"Mensaje eliminado\",\n  \"Message Failed \u00B7 Click to try again\": \"Mensaje fallido \u00B7 Haga clic para volver a intentarlo\",\n  \"Message Failed \u00B7 Unauthorized\": \"Mensaje fallido \u00B7 No autorizado\",\n  \"Message has been successfully flagged\": \"El mensaje se marc\u00F3 correctamente\",\n  \"Message pinned\": \"Mensaje fijado\",\n  \"Message was blocked by moderation policies\": \"El mensaje fue bloqueado por las pol\u00EDticas de moderaci\u00F3n\",\n  \"Messages have been marked unread.\": \"Los mensajes han sido marcados como no le\u00EDdos.\",\n  \"Missing permissions to upload the attachment\": \"Faltan permisos para subir el archivo adjunto\",\n  \"Multiple answers\": \"M\u00FAltiples respuestas\",\n  \"Mute\": \"Silenciar\",\n  \"mute-command-args\": \"[@usuario]\",\n  \"mute-command-description\": \"Silenciar a un usuario\",\n  \"network error\": \"error de red\",\n  \"New\": \"Nuevo\",\n  \"New Messages!\": \"\u00A1Nuevos mensajes!\",\n  \"No chats here yet\u2026\": \"A\u00FAn no hay mensajes aqu\u00ED...\",\n  \"No results found\": \"No se han encontrado resultados\",\n  \"Nobody will be able to vote in this poll anymore.\": \"Nadie podr\u00E1 votar en esta encuesta.\",\n  \"Nothing yet...\": \"Nada a\u00FAn...\",\n  \"Ok\": \"Ok\",\n  \"Only numbers are allowed\": \"Solo se permiten n\u00FAmeros\",\n  \"Open emoji picker\": \"Abrir el selector de emojis\",\n  \"Option already exists\": \"La opci\u00F3n ya existe\",\n  \"Option is empty\": \"La opci\u00F3n est\u00E1 vac\u00EDa\",\n  \"Options\": \"Opciones\",\n  \"People matching\": \"Personas que coinciden\",\n  \"Pin\": \"Fijar\",\n  \"Pinned by\": \"Fijado por\",\n  \"Poll\": \"Encuesta\",\n  \"Poll comments\": \"Comentarios de la encuesta\",\n  \"Poll options\": \"Opciones de la encuesta\",\n  \"Poll results\": \"Resultados de la encuesta\",\n  \"Question\": \"Pregunta\",\n  \"Question is required\": \"La pregunta es obligatoria\",\n  \"Quote\": \"Citar\",\n  \"Reached the vote limit. Remove an existing vote first.\": \"Se ha alcanzado el l\u00EDmite de votos. Elimina un voto existente primero.\",\n  \"Recording format is not supported and cannot be reproduced\": \"El formato de grabaci\u00F3n no es compatible y no se puede reproducir\",\n  \"Remind Me\": \"Recordarme\",\n  \"Remove reminder\": \"Eliminar recordatorio\",\n  \"Reply\": \"Responder\",\n  \"Reply to Message\": \"Responder al mensaje\",\n  \"replyCount_one\": \"1 respuesta\",\n  \"replyCount_many\": \"{{ count }} respuestas\",\n  \"replyCount_other\": \"{{ count }} respuestas\",\n  \"Save for later\": \"Guardar para m\u00E1s tarde\",\n  \"Saved for later\": \"Guardado para m\u00E1s tarde\",\n  \"Search\": \"Buscar\",\n  \"search-results-header-filter-source-button-label--channels\": \"canales\",\n  \"search-results-header-filter-source-button-label--messages\": \"mensajes\",\n  \"search-results-header-filter-source-button-label--users\": \"usuarios\",\n  \"Searching for {{ searchSourceType }}...\": \"Buscando {{ searchSourceType }}...\",\n  \"Searching...\": \"Buscando...\",\n  \"searchResultsCount_one\": \"1 resultado\",\n  \"searchResultsCount_many\": \"{{ count }} resultados\",\n  \"searchResultsCount_other\": \"{{ count }} resultados\",\n  \"See all options ({{count}})_one\": \"Ver todas las opciones ({{count}})\",\n  \"See all options ({{count}})_many\": \"Ver todas las opciones ({{count}})\",\n  \"See all options ({{count}})_other\": \"Ver todas las opciones ({{count}})\",\n  \"Select one\": \"Seleccionar uno\",\n  \"Select one or more\": \"Seleccionar uno o m\u00E1s\",\n  \"Select up to {{count}}_one\": \"Selecciona hasta {{count}}\",\n  \"Select up to {{count}}_many\": \"Selecciona hasta {{count}}\",\n  \"Select up to {{count}}_other\": \"Selecciona hasta {{count}}\",\n  \"Send\": \"Enviar\",\n  \"Send Anyway\": \"Enviar de todos modos\",\n  \"Send message request failed\": \"Error al enviar la solicitud de mensaje\",\n  \"Sending...\": \"Enviando...\",\n  \"Sent\": \"Enviado\",\n  \"Share\": \"Compartir\",\n  \"Share live location for\": \"Compartir ubicaci\u00F3n en vivo durante\",\n  \"Share Location\": \"Compartir ubicaci\u00F3n\",\n  \"Shared live location\": \"Ubicaci\u00F3n en vivo compartida\",\n  \"Show all\": \"Mostrar todo\",\n  \"Shuffle\": \"Mezclar\",\n  \"size limit\": \"l\u00EDmite de tama\u00F1o\",\n  \"Slow Mode ON\": \"Modo lento activado\",\n  \"Some of the files will not be accepted\": \"Algunos archivos no ser\u00E1n aceptados\",\n  \"Start typing to search\": \"Empieza a escribir para buscar\",\n  \"Stop sharing\": \"Dejar de compartir\",\n  \"Submit\": \"Enviar\",\n  \"Suggest an option\": \"Sugerir una opci\u00F3n\",\n  \"Thinking...\": \"Pensando...\",\n  \"this content could not be displayed\": \"Este contenido no se pudo mostrar\",\n  \"This field cannot be empty or contain only spaces\": \"Este campo no puede estar vac\u00EDo o contener solo espacios\",\n  \"This message did not meet our content guidelines\": \"Este mensaje no cumple con nuestras directrices de contenido\",\n  \"This message was deleted...\": \"Este mensaje fue eliminado...\",\n  \"Thread\": \"Hilo\",\n  \"Thread has not been found\": \"No se ha encontrado el hilo\",\n  \"Thread reply\": \"Respuesta en hilo\",\n  \"timestamp/DateSeparator\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/LiveLocation\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/MessageTimestamp\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/PollVote\": \"{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}\",\n  \"timestamp/PollVoteTooltip\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/ReminderNotification\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/SystemMessage\": \"{{ timestamp | timestampFormatter(format: dddd L) }}\",\n  \"To start recording, allow the camera access in your browser\": \"Para comenzar a grabar, permita el acceso a la c\u00E1mara en su navegador\",\n  \"To start recording, allow the microphone access in your browser\": \"Para comenzar a grabar, permita el acceso al micr\u00F3fono en su navegador\",\n  \"translationBuilderTopic/notification\": \"{{value, notification}}\",\n  \"Type a number from 2 to 10\": \"Escribe un n\u00FAmero del 2 al 10\",\n  \"Type your message\": \"Escribe tu mensaje\",\n  \"Unarchive\": \"Desarchivar\",\n  \"unban-command-args\": \"[@usuario]\",\n  \"unban-command-description\": \"Quitar la prohibici\u00F3n a un usuario\",\n  \"unknown error\": \"error desconocido\",\n  \"Unmute\": \"Activar sonido\",\n  \"unmute-command-args\": \"[@usuario]\",\n  \"unmute-command-description\": \"Desactivar el silencio de un usuario\",\n  \"Unpin\": \"Desfijar\",\n  \"Unread messages\": \"Mensajes no le\u00EDdos\",\n  \"unreadMessagesSeparatorText_one\": \"1 mensaje no le\u00EDdo\",\n  \"unreadMessagesSeparatorText_many\": \"{{count}} mensajes no le\u00EDdos\",\n  \"unreadMessagesSeparatorText_other\": \"{{count}} mensajes no le\u00EDdos\",\n  \"Unsupported attachment\": \"Adjunto no compatible\",\n  \"unsupported file type\": \"tipo de archivo no compatible\",\n  \"Update your comment\": \"Actualizar tu comentario\",\n  \"Upload type: \\\"{{ type }}\\\" is not allowed\": \"Tipo de carga: \\\"{{ type }}\\\" no est\u00E1 permitido\",\n  \"User uploaded content\": \"Contenido subido por el usuario\",\n  \"View {{count}} comments_one\": \"Ver {{count}} comentario\",\n  \"View {{count}} comments_many\": \"Ver {{count}} comentarios\",\n  \"View {{count}} comments_other\": \"Ver {{count}} comentarios\",\n  \"View results\": \"Ver resultados\",\n  \"Voice message\": \"Mensaje de voz\",\n  \"Vote ended\": \"Votaci\u00F3n finalizada\",\n  \"Wait until all attachments have uploaded\": \"Espere hasta que se hayan cargado todos los archivos adjuntos\",\n  \"You\": \"T\u00FA\",\n  \"You have no channels currently\": \"Actualmente no tienes canales\",\n  \"You've reached the maximum number of files\": \"Has alcanzado el n\u00FAmero m\u00E1ximo de archivos\"\n}\n", "{\n  \"{{ commaSeparatedUsers }} and {{ moreCount }} more\": \"{{ commaSeparatedUsers }} et {{ moreCount }} autres\",\n  \"{{ commaSeparatedUsers }}, and {{ lastUser }}\": \"{{ commaSeparatedUsers }} et {{ lastUser }}\",\n  \"{{ firstUser }} and {{ secondUser }}\": \"{{ firstUser }} et {{ secondUser }}\",\n  \"{{ imageCount }} more\": \"{{ imageCount }} suppl\u00E9mentaires\",\n  \"{{ memberCount }} members\": \"{{ memberCount }} membres\",\n  \"{{ user }} has been muted\": \"{{ user }} a \u00E9t\u00E9 mis en sourdine\",\n  \"{{ user }} has been unmuted\": \"{{ user }} n'est plus en sourdine\",\n  \"{{ user }} is typing...\": \"{{ user }} est en train d'\u00E9crire...\",\n  \"{{ users }} and {{ user }} are typing...\": \"{{ users }} et {{ user }} sont en train d'\u00E9crire...\",\n  \"{{ users }} and more are typing...\": \"{{ users }} et plus sont en train d'\u00E9crire...\",\n  \"{{ watcherCount }} online\": \"{{ watcherCount }} en ligne\",\n  \"{{count}} unread_one\": \"{{count}} non lu\",\n  \"{{count}} unread_many\": \"{{count}} non lus\",\n  \"{{count}} unread_other\": \"{{count}} non lus\",\n  \"{{count}} votes_one\": \"{{count}} vote\",\n  \"{{count}} votes_many\": \"{{count}} votes\",\n  \"{{count}} votes_other\": \"{{count}} votes\",\n  \"\uD83C\uDFD9 Attachment...\": \"\uD83C\uDFD9 Pi\u00E8ce jointe...\",\n  \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\": \"\uD83D\uDCCA {{createdBy}} a cr\u00E9\u00E9 : {{ pollName}}\",\n  \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\": \"\uD83D\uDCCA {{votedBy}} a vot\u00E9 : {{pollOptionText}}\",\n  \"\uD83D\uDCCDShared location\": \"\uD83D\uDCCDEmplacement partag\u00E9\",\n  \"Add a comment\": \"Ajouter un commentaire\",\n  \"Add an option\": \"Ajouter une option\",\n  \"All results loaded\": \"Tous les r\u00E9sultats sont charg\u00E9s\",\n  \"Allow access to camera\": \"Autoriser l'acc\u00E8s \u00E0 la cam\u00E9ra\",\n  \"Allow access to microphone\": \"Autoriser l'acc\u00E8s au microphone\",\n  \"Allow comments\": \"Autoriser les commentaires\",\n  \"Allow option suggestion\": \"Autoriser la suggestion d'options\",\n  \"Also send as a direct message\": \"\u00C9galement envoyer en message direct\",\n  \"Also send in channel\": \"\u00C9galement envoyer dans le canal\",\n  \"An error has occurred during recording\": \"Une erreur s'est produite pendant l'enregistrement\",\n  \"An error has occurred during the recording processing\": \"Une erreur s'est produite pendant le traitement de l'enregistrement\",\n  \"Anonymous\": \"Anonyme\",\n  \"Anonymous poll\": \"Sondage anonyme\",\n  \"Archive\": \"Archive\",\n  \"aria/Attachment\": \"Pi\u00E8ce jointe\",\n  \"aria/Cancel Reply\": \"Annuler la r\u00E9ponse\",\n  \"aria/Cancel upload\": \"Annuler le t\u00E9l\u00E9chargement\",\n  \"aria/Channel list\": \"Liste des canaux\",\n  \"aria/Channel search results\": \"R\u00E9sultats de recherche de canaux\",\n  \"aria/Close thread\": \"Fermer le fil\",\n  \"aria/Download attachment\": \"T\u00E9l\u00E9charger la pi\u00E8ce jointe\",\n  \"aria/Emoji picker\": \"S\u00E9lecteur d'\u00E9mojis\",\n  \"aria/File input\": \"Entr\u00E9e de fichier\",\n  \"aria/File upload\": \"T\u00E9l\u00E9chargement de fichier\",\n  \"aria/Image input\": \"Entr\u00E9e d'image\",\n  \"aria/Load More Channels\": \"Charger plus de canaux\",\n  \"aria/Menu\": \"Menu\",\n  \"aria/Message Options\": \"Options du message\",\n  \"aria/Open Attachment Selector\": \"Ouvrir le s\u00E9lecteur de pi\u00E8ces jointes\",\n  \"aria/Open Menu\": \"Ouvrir le menu\",\n  \"aria/Open Message Actions Menu\": \"Ouvrir le menu des actions du message\",\n  \"aria/Open Reaction Selector\": \"Ouvrir le s\u00E9lecteur de r\u00E9actions\",\n  \"aria/Open Thread\": \"Ouvrir le fil\",\n  \"aria/Reaction list\": \"Liste des r\u00E9actions\",\n  \"aria/Remind Me Options\": \"Options de rappel\",\n  \"aria/Remove attachment\": \"Supprimer la pi\u00E8ce jointe\",\n  \"aria/Remove location attachment\": \"Supprimer la pi\u00E8ce jointe d'emplacement\",\n  \"aria/Retry upload\": \"R\u00E9essayer le t\u00E9l\u00E9chargement\",\n  \"aria/Search results\": \"R\u00E9sultats de recherche\",\n  \"aria/Search results header filter button\": \"Bouton de filtre d'en-t\u00EAte des r\u00E9sultats de recherche\",\n  \"aria/Send\": \"Envoyer\",\n  \"aria/Stop AI Generation\": \"Arr\u00EAter la g\u00E9n\u00E9ration d'IA\",\n  \"Ask a question\": \"Poser une question\",\n  \"Attach\": \"Joindre\",\n  \"Attach files\": \"Joindre des fichiers\",\n  \"Attachment upload blocked due to {{reason}}\": \"T\u00E9l\u00E9chargement de pi\u00E8ce jointe bloqu\u00E9 en raison de {{reason}}\",\n  \"Attachment upload failed due to {{reason}}\": \"\u00C9chec du t\u00E9l\u00E9chargement de la pi\u00E8ce jointe en raison de {{reason}}\",\n  \"ban-command-args\": \"[@nomdutilisateur] [texte]\",\n  \"ban-command-description\": \"Bannir un utilisateur\",\n  \"Cancel\": \"Annuler\",\n  \"Cannot seek in the recording\": \"Impossible de rechercher dans l'enregistrement\",\n  \"Channel Missing\": \"Canal Manquant\",\n  \"Close\": \"Fermer\",\n  \"Close emoji picker\": \"Fermer le s\u00E9lecteur d'\u00E9mojis\",\n  \"Commands matching\": \"Correspondance des commandes\",\n  \"Connection failure, reconnecting now...\": \"\u00C9chec de la connexion, reconnexion en cours...\",\n  \"Create\": \"Cr\u00E9er\",\n  \"Create poll\": \"Cr\u00E9er un sondage\",\n  \"Current location\": \"Emplacement actuel\",\n  \"Delete\": \"Supprimer\",\n  \"Delete for me\": \"Supprimer pour moi\",\n  \"Delivered\": \"Publi\u00E9\",\n  \"Download attachment {{ name }}\": \"T\u00E9l\u00E9charger la pi\u00E8ce jointe {{ name }}\",\n  \"Drag your files here\": \"Glissez vos fichiers ici\",\n  \"Drag your files here to add to your post\": \"Glissez vos fichiers ici pour les ajouter \u00E0 votre publication\",\n  \"Due {{ timeLeft }}\": \"\u00C9ch\u00E9ance dans {{ timeLeft }}\",\n  \"Due since {{ dueSince }}\": \"\u00C9ch\u00E9ance depuis {{ dueSince }}\",\n  \"duration/Message reminder\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Remind Me\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Share Location\": \"{{ milliseconds | durationFormatter }}\",\n  \"Edit Message\": \"\u00C9diter un message\",\n  \"Edit message request failed\": \"\u00C9chec de la demande de modification du message\",\n  \"Edited\": \"Modifi\u00E9\",\n  \"Emoji matching\": \"Correspondance d'\u00E9mojis\",\n  \"Empty message...\": \"Message vide...\",\n  \"End\": \"Fin\",\n  \"End vote\": \"Fin du vote\",\n  \"Enforce unique vote is enabled\": \"Le vote unique est activ\u00E9\",\n  \"Error\": \"Erreur\",\n  \"Error \u00B7 Unsent\": \"Erreur - Non envoy\u00E9\",\n  \"Error adding flag\": \"Erreur lors de l'ajout du signalement\",\n  \"Error connecting to chat, refresh the page to try again.\": \"Erreur de connexion au chat, rafra\u00EEchissez la page pour r\u00E9essayer.\",\n  \"Error deleting message\": \"Erreur lors de la suppression du message\",\n  \"Error fetching reactions\": \"Erreur lors du chargement des r\u00E9actions\",\n  \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\": \"Erreur lors de la marque du message comme non lu. Impossible de marquer des messages non lus plus anciens que les 100 derniers messages du canal.\",\n  \"Error muting a user ...\": \"Erreur lors de la mise en sourdine d'un utilisateur...\",\n  \"Error pinning message\": \"Erreur lors de l'\u00E9pinglage du message\",\n  \"Error removing message pin\": \"Erreur lors du retrait de l'\u00E9pinglage du message\",\n  \"Error reproducing the recording\": \"Erreur lors de la reproduction de l'enregistrement\",\n  \"Error starting recording\": \"Erreur lors du d\u00E9marrage de l'enregistrement\",\n  \"Error unmuting a user ...\": \"Erreur lors du d\u00E9marrage de la sourdine d'un utilisateur ...\",\n  \"Error uploading attachment\": \"Erreur lors du t\u00E9l\u00E9chargement de la pi\u00E8ce jointe\",\n  \"Error uploading file\": \"Erreur lors du t\u00E9l\u00E9chargement du fichier\",\n  \"Error uploading image\": \"Erreur lors de l'envoi de l'image\",\n  \"Error: {{ errorMessage }}\": \"Erreur : {{ errorMessage }}\",\n  \"Failed to create the poll\": \"\u00C9chec de la cr\u00E9ation du sondage\",\n  \"Failed to create the poll due to {{reason}}\": \"\u00C9chec de la cr\u00E9ation du sondage en raison de {{reason}}\",\n  \"Failed to jump to the first unread message\": \"\u00C9chec du saut vers le premier message non lu\",\n  \"Failed to mark channel as read\": \"\u00C9chec du marquage du canal comme lu\",\n  \"Failed to play the recording\": \"Impossible de lire l'enregistrement\",\n  \"Failed to retrieve location\": \"Impossible de r\u00E9cup\u00E9rer l'emplacement\",\n  \"Failed to share location\": \"Impossible de partager l'emplacement\",\n  \"File\": \"Fichier\",\n  \"File is too large: {{ size }}, maximum upload size is {{ limit }}\": \"Le fichier est trop volumineux : {{ size }}, la taille maximale de t\u00E9l\u00E9chargement est de {{ limit }}\",\n  \"Flag\": \"Signaler\",\n  \"Generating...\": \"G\u00E9n\u00E9ration...\",\n  \"giphy-command-args\": \"[texte]\",\n  \"giphy-command-description\": \"Poster un GIF al\u00E9atoire dans le canal\",\n  \"Latest Messages\": \"Derniers messages\",\n  \"live\": \"en direct\",\n  \"Live for {{duration}}\": \"En direct pendant {{duration}}\",\n  \"Live location\": \"Emplacement en direct\",\n  \"Live until {{ timestamp }}\": \"En direct jusqu'\u00E0 {{ timestamp }}\",\n  \"Load more\": \"Charger plus\",\n  \"Location\": \"Emplacement\",\n  \"Location sharing ended\": \"Partage d'emplacement termin\u00E9\",\n  \"Mark as unread\": \"Marquer comme non lu\",\n  \"Maximum number of votes (from 2 to 10)\": \"Nombre maximum de votes (de 2 \u00E0 10)\",\n  \"Menu\": \"Menu\",\n  \"Message deleted\": \"Message supprim\u00E9\",\n  \"Message Failed \u00B7 Click to try again\": \"\u00C9chec de l'envoi du message - Cliquez pour r\u00E9essayer\",\n  \"Message Failed \u00B7 Unauthorized\": \"\u00C9chec de l'envoi du message - Non autoris\u00E9\",\n  \"Message has been successfully flagged\": \"Le message a \u00E9t\u00E9 signal\u00E9 avec succ\u00E8s\",\n  \"Message pinned\": \"Message \u00E9pingl\u00E9\",\n  \"Message was blocked by moderation policies\": \"Le message a \u00E9t\u00E9 bloqu\u00E9 par les politiques de mod\u00E9ration\",\n  \"Messages have been marked unread.\": \"Les messages ont \u00E9t\u00E9 marqu\u00E9s comme non lus.\",\n  \"Missing permissions to upload the attachment\": \"Autorisations manquantes pour t\u00E9l\u00E9charger la pi\u00E8ce jointe\",\n  \"Multiple answers\": \"R\u00E9ponses multiples\",\n  \"Mute\": \"Muet\",\n  \"mute-command-args\": \"[@nomdutilisateur]\",\n  \"mute-command-description\": \"Muter un utilisateur\",\n  \"network error\": \"erreur r\u00E9seau\",\n  \"New\": \"Nouveau\",\n  \"New Messages!\": \"Nouveaux Messages!\",\n  \"No chats here yet\u2026\": \"Pas encore de messages ici...\",\n  \"No results found\": \"Aucun r\u00E9sultat trouv\u00E9\",\n  \"Nobody will be able to vote in this poll anymore.\": \"Personne ne pourra plus voter dans ce sondage.\",\n  \"Nothing yet...\": \"Rien pour l'instant...\",\n  \"Ok\": \"D'accord\",\n  \"Only numbers are allowed\": \"Seuls les chiffres sont autoris\u00E9s\",\n  \"Open emoji picker\": \"Ouvrir le s\u00E9lecteur d'\u00E9mojis\",\n  \"Option already exists\": \"L'option existe d\u00E9j\u00E0\",\n  \"Option is empty\": \"L'option est vide\",\n  \"Options\": \"Options\",\n  \"People matching\": \"Correspondance de personnes\",\n  \"Pin\": \"\u00C9pingler\",\n  \"Pinned by\": \"\u00C9pingl\u00E9 par\",\n  \"Poll\": \"Sondage\",\n  \"Poll comments\": \"Commentaires du sondage\",\n  \"Poll options\": \"Options du sondage\",\n  \"Poll results\": \"R\u00E9sultats du sondage\",\n  \"Question\": \"Question\",\n  \"Question is required\": \"La question est obligatoire\",\n  \"Quote\": \"Citer\",\n  \"Reached the vote limit. Remove an existing vote first.\": \"La limite de votes a \u00E9t\u00E9 atteinte. Supprimez d'abord un vote existant.\",\n  \"Recording format is not supported and cannot be reproduced\": \"Le format d'enregistrement n'est pas pris en charge et ne peut pas \u00EAtre reproduit\",\n  \"Remind Me\": \"Me rappeler\",\n  \"Remove reminder\": \"Supprimer le rappel\",\n  \"Reply\": \"R\u00E9pondre\",\n  \"Reply to Message\": \"R\u00E9pondre au message\",\n  \"replyCount_one\": \"1 r\u00E9ponse\",\n  \"replyCount_many\": \"{{ count }} r\u00E9ponses\",\n  \"replyCount_other\": \"{{ count }} r\u00E9ponses\",\n  \"Save for later\": \"Enregistrer pour plus tard\",\n  \"Saved for later\": \"Enregistr\u00E9 pour plus tard\",\n  \"Search\": \"Rechercher\",\n  \"search-results-header-filter-source-button-label--channels\": \"canaux\",\n  \"search-results-header-filter-source-button-label--messages\": \"messages\",\n  \"search-results-header-filter-source-button-label--users\": \"utilisateurs\",\n  \"Searching for {{ searchSourceType }}...\": \"Recherche de {{ searchSourceType }}...\",\n  \"Searching...\": \"Recherche en cours...\",\n  \"searchResultsCount_one\": \"1 r\u00E9sultat\",\n  \"searchResultsCount_many\": \"{{ count }} r\u00E9sultats\",\n  \"searchResultsCount_other\": \"{{ count }} r\u00E9sultats\",\n  \"See all options ({{count}})_one\": \"Voir toutes les options ({{count}})\",\n  \"See all options ({{count}})_many\": \"Voir toutes les options ({{count}})\",\n  \"See all options ({{count}})_other\": \"Voir toutes les options ({{count}})\",\n  \"Select one\": \"S\u00E9lectionner un\",\n  \"Select one or more\": \"S\u00E9lectionner un ou plusieurs\",\n  \"Select up to {{count}}_one\": \"S\u00E9lectionner jusqu'\u00E0 {{count}}\",\n  \"Select up to {{count}}_many\": \"S\u00E9lectionner jusqu'\u00E0 {{count}}\",\n  \"Select up to {{count}}_other\": \"S\u00E9lectionner jusqu'\u00E0 {{count}}\",\n  \"Send\": \"Envoyer\",\n  \"Send Anyway\": \"Envoyer quand m\u00EAme\",\n  \"Send message request failed\": \"\u00C9chec de la demande d'envoi de message\",\n  \"Sending...\": \"Envoi en cours...\",\n  \"Sent\": \"Envoy\u00E9\",\n  \"Share\": \"Partager\",\n  \"Share live location for\": \"Partager l'emplacement en direct pendant\",\n  \"Share Location\": \"Partager l'emplacement\",\n  \"Shared live location\": \"Emplacement en direct partag\u00E9\",\n  \"Show all\": \"Tout afficher\",\n  \"Shuffle\": \"M\u00E9langer\",\n  \"size limit\": \"limite de taille\",\n  \"Slow Mode ON\": \"Mode lent activ\u00E9\",\n  \"Some of the files will not be accepted\": \"Certains fichiers ne seront pas accept\u00E9s\",\n  \"Start typing to search\": \"Commencez \u00E0 taper pour rechercher\",\n  \"Stop sharing\": \"Arr\u00EAter de partager\",\n  \"Submit\": \"Envoyer\",\n  \"Suggest an option\": \"Sugg\u00E9rer une option\",\n  \"Thinking...\": \"R\u00E9flexion...\",\n  \"this content could not be displayed\": \"ce contenu n'a pas pu \u00EAtre affich\u00E9\",\n  \"This field cannot be empty or contain only spaces\": \"Ce champ ne peut pas \u00EAtre vide ou contenir uniquement des espaces\",\n  \"This message did not meet our content guidelines\": \"Ce message ne respecte pas nos directives de contenu\",\n  \"This message was deleted...\": \"Ce message a \u00E9t\u00E9 supprim\u00E9...\",\n  \"Thread\": \"Fil de discussion\",\n  \"Thread has not been found\": \"Le fil de discussion n'a pas \u00E9t\u00E9 trouv\u00E9\",\n  \"Thread reply\": \"R\u00E9ponse dans le fil\",\n  \"timestamp/DateSeparator\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/LiveLocation\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/MessageTimestamp\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/PollVote\": \"{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}\",\n  \"timestamp/PollVoteTooltip\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/ReminderNotification\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/SystemMessage\": \"{{ timestamp | timestampFormatter(format: dddd L) }}\",\n  \"To start recording, allow the camera access in your browser\": \"Pour commencer l'enregistrement, autorisez l'acc\u00E8s \u00E0 la cam\u00E9ra dans votre navigateur\",\n  \"To start recording, allow the microphone access in your browser\": \"Pour commencer l'enregistrement, autorisez l'acc\u00E8s au microphone dans votre navigateur\",\n  \"translationBuilderTopic/notification\": \"{{value, notification}}\",\n  \"Type a number from 2 to 10\": \"Tapez un nombre de 2 \u00E0 10\",\n  \"Type your message\": \"Tapez votre message\",\n  \"Unarchive\": \"D\u00E9sarchiver\",\n  \"unban-command-args\": \"[@nomdutilisateur]\",\n  \"unban-command-description\": \"D\u00E9bannir un utilisateur\",\n  \"unknown error\": \"erreur inconnue\",\n  \"Unmute\": \"D\u00E9sactiver muet\",\n  \"unmute-command-args\": \"[@nomdutilisateur]\",\n  \"unmute-command-description\": \"D\u00E9muter un utilisateur\",\n  \"Unpin\": \"D\u00E9tacher\",\n  \"Unread messages\": \"Messages non lus\",\n  \"unreadMessagesSeparatorText_one\": \"1 message non lu\",\n  \"unreadMessagesSeparatorText_many\": \"{{count}} messages non lus\",\n  \"unreadMessagesSeparatorText_other\": \"{{count}} messages non lus\",\n  \"Unsupported attachment\": \"Pi\u00E8ce jointe non prise en charge\",\n  \"unsupported file type\": \"type de fichier non pris en charge\",\n  \"Update your comment\": \"Mettre \u00E0 jour votre commentaire\",\n  \"Upload type: \\\"{{ type }}\\\" is not allowed\": \"Le type de fichier : \\\"{{ type }}\\\" n'est pas autoris\u00E9\",\n  \"User uploaded content\": \"Contenu t\u00E9l\u00E9charg\u00E9 par l'utilisateur\",\n  \"View {{count}} comments_one\": \"Voir {{count}} commentaire\",\n  \"View {{count}} comments_many\": \"Voir {{count}} commentaires\",\n  \"View {{count}} comments_other\": \"Voir {{count}} commentaires\",\n  \"View results\": \"Voir les r\u00E9sultats\",\n  \"Voice message\": \"Message vocal\",\n  \"Vote ended\": \"Vote termin\u00E9\",\n  \"Wait until all attachments have uploaded\": \"Attendez que toutes les pi\u00E8ces jointes soient t\u00E9l\u00E9charg\u00E9es\",\n  \"You\": \"Vous\",\n  \"You have no channels currently\": \"Vous n'avez actuellement aucun canal\",\n  \"You've reached the maximum number of files\": \"Vous avez atteint le nombre maximal de fichiers\"\n}\n", "{\n  \"{{ commaSeparatedUsers }} and {{ moreCount }} more\": \"{{ commaSeparatedUsers }} \u0914\u0930 {{ moreCount }} \u0914\u0930\",\n  \"{{ commaSeparatedUsers }}, and {{ lastUser }}\": \"{{ commaSeparatedUsers }} \u0914\u0930 {{ lastUser }}\",\n  \"{{ firstUser }} and {{ secondUser }}\": \"{{ firstUser }} \u0914\u0930 {{ secondUser }}\",\n  \"{{ imageCount }} more\": \"{{ imageCount }} \u0914\u0930\",\n  \"{{ memberCount }} members\": \"{{ memberCount }} \u092E\u0947\u0902\u092C\u0930\u094D\u0938\",\n  \"{{ user }} has been muted\": \"{{ user }} \u0915\u094B \u092E\u094D\u092F\u0942\u091F \u0915\u0930 \u0926\u093F\u092F\u093E \u0917\u092F\u093E \u0939\u0948\",\n  \"{{ user }} has been unmuted\": \"{{ user }} \u0915\u094B \u0905\u0928\u092E\u094D\u092F\u0942\u091F \u0915\u0930 \u0926\u093F\u092F\u093E \u0917\u092F\u093E \u0939\u0948\",\n  \"{{ user }} is typing...\": \"{{ user }} \u091F\u093E\u0907\u092A \u0915\u0930 \u0930\u0939\u093E \u0939\u0948...\",\n  \"{{ users }} and {{ user }} are typing...\": \"{{ users }} \u0914\u0930 {{ user }} \u091F\u093E\u0907\u092A \u0915\u0930 \u0930\u0939\u0947 \u0939\u0948\u0902...\",\n  \"{{ users }} and more are typing...\": \"{{ users }} \u0914\u0930 \u0905\u0927\u093F\u0915 \u091F\u093E\u0907\u092A \u0915\u0930 \u0930\u0939\u0947 \u0939\u0948\u0902...\",\n  \"{{ watcherCount }} online\": \"{{ watcherCount }} \u0911\u0928\u0932\u093E\u0907\u0928\",\n  \"{{count}} unread_one\": \"{{count}} \u0905\u092A\u0920\u093F\u0924\",\n  \"{{count}} unread_other\": \"{{count}} \u0905\u092A\u0920\u093F\u0924\",\n  \"{{count}} votes_one\": \"{{count}} \u0935\u094B\u091F\",\n  \"{{count}} votes_other\": \"{{count}} \u0935\u094B\u091F\",\n  \"\uD83C\uDFD9 Attachment...\": \"\uD83C\uDFD9 \u0905\u091F\u0948\u091A\u092E\u0947\u0902\u091F\",\n  \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\": \"\uD83D\uDCCA {{createdBy}} \u0928\u0947 \u092C\u0928\u093E\u092F\u093E: {{ pollName}}\",\n  \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\": \"\uD83D\uDCCA {{votedBy}} \u0928\u0947 \u0935\u094B\u091F \u0926\u093F\u092F\u093E: {{pollOptionText}}\",\n  \"\uD83D\uDCCDShared location\": \"\uD83D\uDCCD\u0938\u093E\u091D\u093E \u0915\u093F\u092F\u093E \u0917\u092F\u093E \u0938\u094D\u0925\u093E\u0928\",\n  \"Add a comment\": \"\u090F\u0915 \u091F\u093F\u092A\u094D\u092A\u0923\u0940 \u091C\u094B\u0921\u093C\u0947\u0902\",\n  \"Add an option\": \"\u090F\u0915 \u0935\u093F\u0915\u0932\u094D\u092A \u091C\u094B\u0921\u093C\u0947\u0902\",\n  \"All results loaded\": \"\u0938\u092D\u0940 \u092A\u0930\u093F\u0923\u093E\u092E \u0932\u094B\u0921 \u0939\u094B \u0917\u090F\",\n  \"Allow access to camera\": \"\u0915\u0948\u092E\u0930\u093E \u0924\u0915 \u092A\u0939\u0941\u0901\u091A \u0926\u0947\u0902\",\n  \"Allow access to microphone\": \"\u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928 \u0924\u0915 \u092A\u0939\u0941\u0901\u091A \u0926\u0947\u0902\",\n  \"Allow comments\": \"\u091F\u093F\u092A\u094D\u092A\u0923\u093F\u092F\u093E\u0901 \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0926\u0947\u0902\",\n  \"Allow option suggestion\": \"\u0935\u093F\u0915\u0932\u094D\u092A \u0938\u0941\u091D\u093E\u0935 \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0926\u0947\u0902\",\n  \"Also send as a direct message\": \"\u0938\u0940\u0927\u0947 \u0938\u0902\u0926\u0947\u0936 \u0915\u0947 \u0930\u0942\u092A \u092E\u0947\u0902 \u092D\u0940 \u092D\u0947\u091C\u0947\u0902\",\n  \"Also send in channel\": \"\u091A\u0948\u0928\u0932 \u092E\u0947\u0902 \u092D\u0940 \u092D\u0947\u091C\u0947\u0902\",\n  \"An error has occurred during recording\": \"\u0930\u0947\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u0947 \u0926\u094C\u0930\u093E\u0928 \u090F\u0915 \u0924\u094D\u0930\u0941\u091F\u093F \u0906 \u0917\u0908 \u0939\u0948\",\n  \"An error has occurred during the recording processing\": \"\u0930\u0947\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u092A\u094D\u0930\u094B\u0938\u0947\u0938\u093F\u0902\u0917 \u0915\u0947 \u0926\u094C\u0930\u093E\u0928 \u090F\u0915 \u0924\u094D\u0930\u0941\u091F\u093F \u0906 \u0917\u0908 \u0939\u0948\",\n  \"Anonymous\": \"\u0917\u0941\u092E\u0928\u093E\u092E\",\n  \"Anonymous poll\": \"\u0917\u0941\u092E\u0928\u093E\u092E \u092E\u0924\u0926\u093E\u0928\",\n  \"Archive\": \"\u0906\u0930\u094D\u0915\u093E\u0907\u0935\",\n  \"aria/Attachment\": \"\u0905\u0928\u0941\u0932\u0917\u094D\u0928\u0915\",\n  \"aria/Cancel Reply\": \"\u0909\u0924\u094D\u0924\u0930 \u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902\",\n  \"aria/Cancel upload\": \"\u0905\u092A\u0932\u094B\u0921 \u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902\",\n  \"aria/Channel list\": \"\u091A\u0948\u0928\u0932 \u0938\u0942\u091A\u0940\",\n  \"aria/Channel search results\": \"\u091A\u0948\u0928\u0932 \u0916\u094B\u091C \u092A\u0930\u093F\u0923\u093E\u092E\",\n  \"aria/Close thread\": \"\u0925\u094D\u0930\u0947\u0921 \u092C\u0902\u0926 \u0915\u0930\u0947\u0902\",\n  \"aria/Download attachment\": \"\u0905\u0928\u0941\u0932\u0917\u094D\u0928\u0915 \u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0915\u0930\u0947\u0902\",\n  \"aria/Emoji picker\": \"\u0907\u092E\u094B\u091C\u0940 \u091A\u0941\u0928\u0928\u0947 \u0935\u093E\u0932\u093E\",\n  \"aria/File input\": \"\u092B\u093C\u093E\u0907\u0932 \u0907\u0928\u092A\u0941\u091F\",\n  \"aria/File upload\": \"\u092B\u093C\u093E\u0907\u0932 \u0905\u092A\u0932\u094B\u0921\",\n  \"aria/Image input\": \"\u091B\u0935\u093F \u0907\u0928\u092A\u0941\u091F\",\n  \"aria/Load More Channels\": \"\u0914\u0930 \u091A\u0948\u0928\u0932 \u0932\u094B\u0921 \u0915\u0930\u0947\u0902\",\n  \"aria/Menu\": \"\u092E\u0947\u0928\u094D\u092F\u0942\",\n  \"aria/Message Options\": \"\u0938\u0902\u0926\u0947\u0936 \u0935\u093F\u0915\u0932\u094D\u092A\",\n  \"aria/Open Attachment Selector\": \"\u0905\u091F\u0948\u091A\u092E\u0947\u0902\u091F \u091A\u092F\u0928\u0915\u0930\u094D\u0924\u093E \u0916\u094B\u0932\u0947\u0902\",\n  \"aria/Open Menu\": \"\u092E\u0947\u0928\u094D\u092F\u0942 \u0916\u094B\u0932\u0947\u0902\",\n  \"aria/Open Message Actions Menu\": \"\u0938\u0902\u0926\u0947\u0936 \u0915\u094D\u0930\u093F\u092F\u093E \u092E\u0947\u0928\u094D\u092F\u0942 \u0916\u094B\u0932\u0947\u0902\",\n  \"aria/Open Reaction Selector\": \"\u092A\u094D\u0930\u0924\u093F\u0915\u094D\u0930\u093F\u092F\u093E \u091A\u092F\u0928\u0915\u0930\u094D\u0924\u093E \u0916\u094B\u0932\u0947\u0902\",\n  \"aria/Open Thread\": \"\u0925\u094D\u0930\u0947\u0921 \u0916\u094B\u0932\u0947\u0902\",\n  \"aria/Reaction list\": \"\u092A\u094D\u0930\u0924\u093F\u0915\u094D\u0930\u093F\u092F\u093E \u0938\u0942\u091A\u0940\",\n  \"aria/Remind Me Options\": \"\u0930\u093F\u092E\u093E\u0907\u0902\u0921\u0930 \u0935\u093F\u0915\u0932\u094D\u092A\",\n  \"aria/Remove attachment\": \"\u0938\u0902\u0932\u0917\u094D\u0928\u0915 \u0939\u091F\u093E\u090F\u0902\",\n  \"aria/Remove location attachment\": \"\u0938\u094D\u0925\u093E\u0928 \u0938\u0902\u0932\u0917\u094D\u0928\u0915 \u0939\u091F\u093E\u090F\u0902\",\n  \"aria/Retry upload\": \"\u0905\u092A\u0932\u094B\u0921 \u092A\u0941\u0928\u0903 \u092A\u094D\u0930\u092F\u093E\u0938 \u0915\u0930\u0947\u0902\",\n  \"aria/Search results\": \"\u0916\u094B\u091C \u092A\u0930\u093F\u0923\u093E\u092E\",\n  \"aria/Search results header filter button\": \"\u0916\u094B\u091C \u092A\u0930\u093F\u0923\u093E\u092E \u0939\u0947\u0921\u0930 \u092B\u093C\u093F\u0932\u094D\u091F\u0930 \u092C\u091F\u0928\",\n  \"aria/Send\": \"\u092D\u0947\u091C\u0947\u0902\",\n  \"aria/Stop AI Generation\": \"\u090F\u0906\u0908 \u091C\u0928\u0930\u0947\u0936\u0928 \u0930\u094B\u0915\u0947\u0902\",\n  \"Ask a question\": \"\u090F\u0915 \u092A\u094D\u0930\u0936\u094D\u0928 \u092A\u0942\u091B\u0947\u0902\",\n  \"Attach\": \"\u0938\u0902\u0932\u0917\u094D\u0928 \u0915\u0930\u0947\u0902\",\n  \"Attach files\": \"\u092B\u093E\u0907\u0932\u094D\u0938 \u0905\u091F\u0948\u091A \u0915\u0930\u0947\",\n  \"Attachment upload blocked due to {{reason}}\": \"{{reason}} \u0915\u0947 \u0915\u093E\u0930\u0923 \u0905\u091F\u0948\u091A\u092E\u0947\u0902\u091F \u0905\u092A\u0932\u094B\u0921 \u092C\u094D\u0932\u0949\u0915 \u0915\u093F\u092F\u093E \u0917\u092F\u093E\",\n  \"Attachment upload failed due to {{reason}}\": \"{{reason}} \u0915\u0947 \u0915\u093E\u0930\u0923 \u0905\u091F\u0948\u091A\u092E\u0947\u0902\u091F \u0905\u092A\u0932\u094B\u0921 \u0935\u093F\u092B\u0932 \u0930\u0939\u093E\",\n  \"ban-command-args\": \"[@\u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u0928\u093E\u092E] [\u092A\u093E\u0920]\",\n  \"ban-command-description\": \"\u090F\u0915 \u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0915\u094B \u092A\u094D\u0930\u0924\u093F\u0937\u0947\u0927\u093F\u0924 \u0915\u0930\u0947\u0902\",\n  \"Cancel\": \"\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902\",\n  \"Cannot seek in the recording\": \"\u0930\u0947\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u092E\u0947\u0902 \u0916\u094B\u091C \u0928\u0939\u0940\u0902 \u0915\u0940 \u091C\u093E \u0938\u0915\u0924\u0940\",\n  \"Channel Missing\": \"\u091A\u0948\u0928\u0932 \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948\",\n  \"Close\": \"\u092C\u0902\u0926 \u0915\u0930\u0947\",\n  \"Close emoji picker\": \"\u0907\u092E\u094B\u091C\u0940 \u092A\u093F\u0915\u0930 \u092C\u0902\u0926 \u0915\u0930\u0947\u0902\",\n  \"Commands matching\": \"\u092E\u0947\u0932 \u0916\u093E\u0924\u0940 \u0939\u0948\",\n  \"Connection failure, reconnecting now...\": \"\u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u0935\u093F\u092B\u0932 \u0930\u0939\u093E, \u0905\u092C \u092A\u0941\u0928\u0903 \u0915\u0928\u0947\u0915\u094D\u091F \u0939\u094B \u0930\u0939\u093E \u0939\u0948 ...\",\n  \"Create\": \"\u092C\u0928\u093E\u090F\u0901\",\n  \"Create poll\": \"\u092E\u0924\u0926\u093E\u0928 \u092C\u0928\u093E\u090F\u0901\",\n  \"Current location\": \"\u0935\u0930\u094D\u0924\u092E\u093E\u0928 \u0938\u094D\u0925\u093E\u0928\",\n  \"Delete\": \"\u0921\u093F\u0932\u0940\u091F\",\n  \"Delete for me\": \"\u092E\u0947\u0930\u0947 \u0932\u093F\u090F \u0921\u093F\u0932\u0940\u091F \u0915\u0930\u0947\u0902\",\n  \"Delivered\": \"\u092A\u0939\u0941\u0902\u091A \u0917\u092F\u093E\",\n  \"Download attachment {{ name }}\": \"\u0905\u0928\u0941\u0932\u0917\u094D\u0928\u0915 {{ name }} \u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0915\u0930\u0947\u0902\",\n  \"Drag your files here\": \"\u0905\u092A\u0928\u0940 \u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u092F\u0939\u093E\u0901 \u0916\u0940\u0902\u091A\u0947\u0902\",\n  \"Drag your files here to add to your post\": \"\u0905\u092A\u0928\u0940 \u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u092F\u0939\u093E\u0901 \u0916\u0940\u0902\u091A\u0947\u0902 \u0914\u0930 \u0905\u092A\u0928\u0947 \u092A\u094B\u0938\u094D\u091F \u092E\u0947\u0902 \u091C\u094B\u0921\u093C\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F\",\n  \"Due {{ timeLeft }}\": \"{{ timeLeft }} \u092E\u0947\u0902 \u0926\u0947\u092F\",\n  \"Due since {{ dueSince }}\": \"{{ dueSince }} \u0938\u0947 \u0926\u0947\u092F\",\n  \"duration/Message reminder\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Remind Me\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Share Location\": \"{{ milliseconds | durationFormatter }}\",\n  \"Edit Message\": \"\u092E\u0948\u0938\u0947\u091C \u092E\u0947\u0902 \u092C\u0926\u0932\u093E\u0935 \u0915\u0930\u0947\",\n  \"Edit message request failed\": \"\u0938\u0902\u0926\u0947\u0936 \u0938\u0902\u092A\u093E\u0926\u093F\u0924 \u0915\u0930\u0928\u0947 \u0915\u093E \u0905\u0928\u0941\u0930\u094B\u0927 \u0935\u093F\u092B\u0932 \u0930\u0939\u093E\",\n  \"Edited\": \"\u0938\u0902\u092A\u093E\u0926\u093F\u0924\",\n  \"Emoji matching\": \"\u0907\u092E\u094B\u091C\u0940 \u092E\u093F\u0932\u093E\u0928\",\n  \"Empty message...\": \"\u0916\u093E\u0932\u0940 \u0938\u0902\u0926\u0947\u0936 ...\",\n  \"End\": \"\u0938\u092E\u093E\u092A\u094D\u0924\",\n  \"End vote\": \"\u092E\u0924 \u0938\u092E\u093E\u092A\u094D\u0924 \u0915\u0930\u0947\u0902\",\n  \"Enforce unique vote is enabled\": \"\u0905\u0928\u094B\u0916\u093E \u0935\u094B\u091F \u0938\u0915\u094D\u0937\u092E \u0939\u0948\",\n  \"Error\": \"\u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Error \u00B7 Unsent\": \"\u092B\u0947\u0932\",\n  \"Error adding flag\": \"\u0927\u094D\u0935\u091C \u091C\u094B\u0921\u093C\u0928\u0947 \u092E\u0947\u0902 \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Error connecting to chat, refresh the page to try again.\": \"\u091A\u0948\u091F \u0938\u0947 \u0915\u0928\u0947\u0915\u094D\u091F \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0924\u094D\u0930\u0941\u091F\u093F, \u092A\u0947\u091C \u0915\u094B \u0930\u093F\u092B\u094D\u0930\u0947\u0936 \u0915\u0930\u0947\u0902\",\n  \"Error deleting message\": \"\u0938\u0902\u0926\u0947\u0936 \u0939\u091F\u093E\u0928\u0947 \u092E\u0947\u0902 \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Error fetching reactions\": \"\u092A\u094D\u0930\u0924\u093F\u0915\u094D\u0930\u093F\u092F\u093E\u090F\u0901 \u0932\u094B\u0921 \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Error marking message unread\": \"\u0938\u0902\u0926\u0947\u0936 \u0915\u094B \u0905\u092A\u0920\u093F\u0924 \u091A\u093F\u0939\u094D\u0928\u093F\u0924 \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\": \"\u0938\u0902\u0926\u0947\u0936 \u0915\u094B \u0905\u092A\u0920\u093F\u0924 \u092E\u093E\u0930\u094D\u0915 \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0924\u094D\u0930\u0941\u091F\u093F\u0964 \u0938\u092C\u0938\u0947 \u0928\u090F 100 \u091A\u0948\u0928\u0932 \u0938\u0902\u0926\u0947\u0936 \u0938\u0947 \u092A\u0939\u0932\u0947 \u0915\u0947 \u0938\u092D\u0940 \u0905\u092A\u0920\u093F\u0924 \u0938\u0902\u0926\u0947\u0936\u094B\u0902 \u0915\u094B \u0905\u092A\u0920\u093F\u0924 \u092E\u093E\u0930\u094D\u0915 \u0928\u0939\u0940\u0902 \u0915\u093F\u092F\u093E \u091C\u093E \u0938\u0915\u0924\u093E \u0939\u0948\u0964\",\n  \"Error muting a user ...\": \"\u092F\u0942\u091C\u0930 \u0915\u094B \u092E\u094D\u092F\u0942\u091F \u0915\u0930\u0928\u0947 \u0915\u093E \u092A\u094D\u0930\u092F\u093E\u0938 \u092B\u0947\u0932 \u0939\u0941\u0906\",\n  \"Error pinning message\": \"\u0938\u0902\u0926\u0947\u0936 \u0915\u094B \u092A\u093F\u0928 \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Error removing message pin\": \"\u0938\u0902\u0926\u0947\u0936 \u092A\u093F\u0928 \u0928\u093F\u0915\u093E\u0932\u0928\u0947 \u092E\u0947\u0902 \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Error reproducing the recording\": \"\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u092A\u0941\u0928: \u0909\u0924\u094D\u092A\u0928\u094D\u0928 \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Error starting recording\": \"\u0930\u0947\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0936\u0941\u0930\u0942 \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Error unmuting a user ...\": \"\u092F\u0942\u091C\u0930 \u0915\u094B \u0905\u0928\u092E\u094D\u092F\u0942\u091F \u0915\u0930\u0928\u0947 \u0915\u093E \u092A\u094D\u0930\u092F\u093E\u0938 \u092B\u0947\u0932 \u0939\u0941\u0906\",\n  \"Error uploading attachment\": \"\u0905\u091F\u0948\u091A\u092E\u0947\u0902\u091F \u0905\u092A\u0932\u094B\u0921 \u0915\u0930\u0924\u0947 \u0938\u092E\u092F \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Error uploading file\": \"\u092B\u093C\u093E\u0907\u0932 \u0905\u092A\u0932\u094B\u0921 \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Error uploading image\": \"\u091B\u0935\u093F \u0905\u092A\u0932\u094B\u0921 \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Error: {{ errorMessage }}\": \"\u092B\u0947\u0932: {{ errorMessage }}\",\n  \"Failed to create the poll\": \"\u092E\u0924\u0926\u093E\u0928 \u092C\u0928\u093E\u0928\u0947 \u092E\u0947\u0902 \u0935\u093F\u092B\u0932\",\n  \"Failed to create the poll due to {{reason}}\": \"\u092E\u0924\u0926\u093E\u0928 {{reason}} \u0915\u0947 \u0915\u093E\u0930\u0923 \u0928\u0939\u0940\u0902 \u092C\u0928 \u0938\u0915\u093E\",\n  \"Failed to jump to the first unread message\": \"\u092A\u0939\u0932\u0947 \u0905\u092A\u0920\u093F\u0924 \u0938\u0902\u0926\u0947\u0936 \u092A\u0930 \u091C\u093E\u0928\u0947 \u092E\u0947\u0902 \u0935\u093F\u092B\u0932\",\n  \"Failed to mark channel as read\": \"\u091A\u0948\u0928\u0932 \u0915\u094B \u092A\u0922\u093C\u093E \u0939\u0941\u0906 \u091A\u093F\u0939\u094D\u0928\u093F\u0924 \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0935\u093F\u092B\u0932\u0964\",\n  \"Failed to play the recording\": \"\u0930\u0947\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u092A\u094D\u0932\u0947 \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0935\u093F\u092B\u0932\",\n  \"Failed to retrieve location\": \"\u0938\u094D\u0925\u093E\u0928 \u092A\u094D\u0930\u093E\u092A\u094D\u0924 \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0935\u093F\u092B\u0932\",\n  \"Failed to share location\": \"\u0938\u094D\u0925\u093E\u0928 \u0938\u093E\u091D\u093E \u0915\u0930\u0928\u0947 \u092E\u0947\u0902 \u0935\u093F\u092B\u0932\",\n  \"File\": \"\u092B\u093C\u093E\u0907\u0932\",\n  \"File is too large: {{ size }}, maximum upload size is {{ limit }}\": \"\u092B\u093C\u093E\u0907\u0932 \u092C\u0939\u0941\u0924 \u092C\u0921\u093C\u0940 \u0939\u0948: {{ size }}, \u0905\u0927\u093F\u0915\u0924\u092E \u0905\u092A\u0932\u094B\u0921 \u0938\u093E\u0907\u091C\u093C {{ limit }} \u0939\u0948\",\n  \"Flag\": \"\u092B\u094D\u0932\u0948\u0917 \u0915\u0930\u0947\",\n  \"Generating...\": \"\u092C\u0928\u093E \u0930\u0939\u093E \u0939\u0948...\",\n  \"giphy-command-args\": \"[\u092A\u093E\u0920]\",\n  \"giphy-command-description\": \"\u091A\u0948\u0928\u0932 \u092A\u0930 \u090F\u0915 \u0915\u094D\u0930\u0949\u092B\u093F\u0932 \u091C\u0940\u0906\u0907\u090F\u092B \u092A\u094B\u0938\u094D\u091F \u0915\u0930\u0947\u0902\",\n  \"Latest Messages\": \"\u0928\u0935\u0940\u0928\u0924\u092E \u0938\u0902\u0926\u0947\u0936\",\n  \"live\": \"\u0932\u093E\u0907\u0935\",\n  \"Live for {{duration}}\": \"{{duration}} \u0915\u0947 \u0932\u093F\u090F \u0932\u093E\u0907\u0935\",\n  \"Live location\": \"\u0932\u093E\u0907\u0935 \u0938\u094D\u0925\u093E\u0928\",\n  \"Live until {{ timestamp }}\": \"{{ timestamp }} \u0924\u0915 \u0932\u093E\u0907\u0935\",\n  \"Load more\": \"\u0914\u0930 \u0932\u094B\u0921 \u0915\u0930\u0947\u0902\",\n  \"Location\": \"\u0938\u094D\u0925\u093E\u0928\",\n  \"Location sharing ended\": \"\u0938\u094D\u0925\u093E\u0928 \u0938\u093E\u091D\u093E \u0915\u0930\u0928\u093E \u0938\u092E\u093E\u092A\u094D\u0924\",\n  \"Mark as unread\": \"\u0905\u092A\u0920\u093F\u0924 \u091A\u093F\u0939\u094D\u0928\u093F\u0924 \u0915\u0930\u0947\u0902\",\n  \"Maximum number of votes (from 2 to 10)\": \"\u0905\u0927\u093F\u0915\u0924\u092E \u0935\u094B\u091F\u094B\u0902 \u0915\u0940 \u0938\u0902\u0916\u094D\u092F\u093E (2 \u0938\u0947 10)\",\n  \"Menu\": \"\u092E\u0947\u0928\u094D\u092F\u0942\",\n  \"Message deleted\": \"\u092E\u0948\u0938\u0947\u091C \u0939\u091F\u093E \u0926\u093F\u092F\u093E \u0917\u092F\u093E\",\n  \"Message Failed \u00B7 Click to try again\": \"\u092E\u0948\u0938\u0947\u091C \u092B\u093C\u0948\u0932 - \u092A\u0941\u0928\u0903 \u0915\u094B\u0936\u093F\u0936 \u0915\u0930\u0947\u0902\",\n  \"Message Failed \u00B7 Unauthorized\": \"\u092E\u0948\u0938\u0947\u091C \u092B\u093C\u0948\u0932 - \u0905\u0928\u0927\u093F\u0915\u0943\u0924\",\n  \"Message has been successfully flagged\": \"\u092E\u0948\u0938\u0947\u091C \u0915\u094B \u092B\u094D\u0932\u0948\u0917 \u0915\u0930 \u0926\u093F\u092F\u093E \u0917\u092F\u093E \u0939\u0948\",\n  \"Message pinned\": \"\u0938\u0902\u0926\u0947\u0936 \u092A\u093F\u0928 \u0915\u093F\u092F\u093E \u0917\u092F\u093E\",\n  \"Message was blocked by moderation policies\": \"\u0938\u0902\u0926\u0947\u0936 \u0915\u094B \u092E\u0949\u0921\u0930\u0947\u0936\u0928 \u0928\u0940\u0924\u093F\u092F\u094B\u0902 \u0926\u094D\u0935\u093E\u0930\u093E \u092C\u094D\u0932\u0949\u0915 \u0915\u0930 \u0926\u093F\u092F\u093E \u0917\u092F\u093E \u0939\u0948\",\n  \"Messages have been marked unread.\": \"\u0938\u0902\u0926\u0947\u0936\u094B\u0902 \u0915\u094B \u0905\u092A\u0920\u093F\u0924 \u091A\u093F\u0939\u094D\u0928\u093F\u0924 \u0915\u093F\u092F\u093E \u0917\u092F\u093E \u0939\u0948\u0964\",\n  \"Missing permissions to upload the attachment\": \"\u0905\u091F\u0948\u091A\u092E\u0947\u0902\u091F \u0905\u092A\u0932\u094B\u0921 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0905\u0928\u0941\u092E\u0924\u093F\u092F\u093E\u0902 \u0917\u093E\u092F\u092C\",\n  \"Multiple answers\": \"\u0915\u0908 \u0909\u0924\u094D\u0924\u0930\",\n  \"Mute\": \"\u092E\u094D\u092F\u0942\u091F \u0915\u0930\u0947\",\n  \"mute-command-args\": \"[@\u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u0928\u093E\u092E]\",\n  \"mute-command-description\": \"\u090F\u0915 \u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0915\u094B \u092E\u094D\u092F\u0942\u091F \u0915\u0930\u0947\u0902\",\n  \"network error\": \"\u0928\u0947\u091F\u0935\u0930\u094D\u0915 \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"New\": \"\u0928\u090F\",\n  \"New Messages!\": \"\u0928\u090F \u092E\u0948\u0938\u0947\u091C!\",\n  \"No chats here yet\u2026\": \"\u092F\u0939\u093E\u0902 \u0905\u092D\u0940 \u0924\u0915 \u0915\u094B\u0908 \u091A\u0948\u091F \u0928\u0939\u0940\u0902...\",\n  \"No results found\": \"\u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\",\n  \"Nobody will be able to vote in this poll anymore.\": \"\u0905\u092C \u0915\u094B\u0908 \u092D\u0940 \u0907\u0938 \u092E\u0924\u0926\u093E\u0928 \u092E\u0947\u0902 \u092E\u0924\u0926\u093E\u0928 \u0928\u0939\u0940\u0902 \u0915\u0930 \u0938\u0915\u0947\u0917\u093E\u0964\",\n  \"Nothing yet...\": \"\u0915\u094B\u0908 \u092E\u0948\u0938\u0947\u091C \u0928\u0939\u0940\u0902 \u0939\u0948\",\n  \"Ok\": \"\u0920\u0940\u0915 \u0939\u0948\",\n  \"Only numbers are allowed\": \"\u0915\u0947\u0935\u0932 \u0938\u0902\u0916\u094D\u092F\u093E\u090F\u0901 \u0905\u0928\u0941\u092E\u0924 \u0939\u0948\u0902\",\n  \"Open emoji picker\": \"\u0907\u092E\u094B\u091C\u0940 \u092A\u093F\u0915\u0930 \u0916\u094B\u0932\u093F\u092F\u0947\",\n  \"Option already exists\": \"\u0935\u093F\u0915\u0932\u094D\u092A \u092A\u0939\u0932\u0947 \u0938\u0947 \u092E\u094C\u091C\u0942\u0926 \u0939\u0948\",\n  \"Option is empty\": \"\u0935\u093F\u0915\u0932\u094D\u092A \u0916\u093E\u0932\u0940 \u0939\u0948\",\n  \"Options\": \"\u0935\u093F\u0915\u0932\u094D\u092A\",\n  \"People matching\": \"\u092E\u0947\u0932 \u0916\u093E\u0924\u0947 \u0932\u094B\u0917\",\n  \"Pin\": \"\u092A\u093F\u0928\",\n  \"Pinned by\": \"\u0926\u094D\u0935\u093E\u0930\u093E \u092A\u093F\u0928 \u0915\u093F\u092F\u093E \u0917\u092F\u093E\",\n  \"Poll\": \"\u092E\u0924\u0926\u093E\u0928\",\n  \"Poll comments\": \"\u092E\u0924\u0926\u093E\u0928 \u091F\u093F\u092A\u094D\u092A\u0923\u093F\u092F\u093E\u0901\",\n  \"Poll options\": \"\u092E\u0924\u0926\u093E\u0928 \u0935\u093F\u0915\u0932\u094D\u092A\",\n  \"Poll results\": \"\u092E\u0924\u0926\u093E\u0928 \u092A\u0930\u093F\u0923\u093E\u092E\",\n  \"Question\": \"\u092A\u094D\u0930\u0936\u094D\u0928\",\n  \"Question is required\": \"\u092A\u094D\u0930\u0936\u094D\u0928 \u0906\u0935\u0936\u094D\u092F\u0915 \u0939\u0948\",\n  \"Quote\": \"\u0909\u0926\u094D\u0927\u0930\u0923\",\n  \"Reached the vote limit. Remove an existing vote first.\": \"\u092E\u0924\u0926\u093E\u0928 \u0938\u0940\u092E\u093E \u0924\u0915 \u092A\u0939\u0941\u0902\u091A \u0917\u092F\u093E\u0964 \u092A\u0939\u0932\u0947 \u090F\u0915 \u092E\u094C\u091C\u0942\u0926\u093E \u0935\u094B\u091F \u0939\u091F\u093E\u090F\u0902\u0964\",\n  \"Recording format is not supported and cannot be reproduced\": \"\u0930\u0947\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u092B\u093C\u0949\u0930\u094D\u092E\u0947\u091F \u0938\u092E\u0930\u094D\u0925\u093F\u0924 \u0928\u0939\u0940\u0902 \u0939\u0948 \u0914\u0930 \u092A\u0941\u0928\u0903 \u0909\u0924\u094D\u092A\u0928\u094D\u0928 \u0928\u0939\u0940\u0902 \u0915\u093F\u092F\u093E \u091C\u093E \u0938\u0915\u0924\u093E\",\n  \"Remind Me\": \"\u092E\u0941\u091D\u0947 \u092F\u093E\u0926 \u0926\u093F\u0932\u093E\u090F\u0902\",\n  \"Remove reminder\": \"\u0930\u093F\u092E\u093E\u0907\u0902\u0921\u0930 \u0939\u091F\u093E\u090F\u0902\",\n  \"Reply\": \"\u091C\u0935\u093E\u092C \u0926\u0947 \u0926\u094B\",\n  \"Reply to Message\": \"\u0938\u0902\u0926\u0947\u0936 \u0915\u093E \u091C\u0935\u093E\u092C \u0926\u0947\u0902\",\n  \"replyCount_one\": \"1 \u0930\u093F\u092A\u094D\u0932\u093E\u0908\",\n  \"replyCount_other\": \"{{ count }} \u0930\u093F\u092A\u094D\u0932\u093E\u0908\",\n  \"Save for later\": \"\u092C\u093E\u0926 \u0915\u0947 \u0932\u093F\u090F \u0938\u0939\u0947\u091C\u0947\u0902\",\n  \"Saved for later\": \"\u092C\u093E\u0926 \u0915\u0947 \u0932\u093F\u090F \u0938\u0939\u0947\u091C\u093E \u0917\u092F\u093E\",\n  \"Search\": \"\u0916\u094B\u091C\",\n  \"search-results-header-filter-source-button-label--channels\": \"\u091A\u0948\u0928\u0932\u094D\u0938\",\n  \"search-results-header-filter-source-button-label--messages\": \"\u0938\u0902\u0926\u0947\u0936\",\n  \"search-results-header-filter-source-button-label--users\": \"\u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E\",\n  \"Searching for {{ searchSourceType }}...\": \"{{ searchSourceType }} \u0916\u094B\u091C \u0930\u0939\u0947 \u0939\u0948\u0902...\",\n  \"Searching...\": \"\u0916\u094B\u091C \u0915\u0930...\",\n  \"searchResultsCount_one\": \"1 \u092A\u0930\u093F\u0923\u093E\u092E\",\n  \"searchResultsCount_other\": \"{{ count }} \u092A\u0930\u093F\u0923\u093E\u092E\",\n  \"See all options ({{count}})_one\": \"\u0938\u092D\u0940 \u0935\u093F\u0915\u0932\u094D\u092A \u0926\u0947\u0916\u0947\u0902 ({{count}})\",\n  \"See all options ({{count}})_other\": \"\u0938\u092D\u0940 \u0935\u093F\u0915\u0932\u094D\u092A \u0926\u0947\u0916\u0947\u0902 ({{count}})\",\n  \"Select one\": \"\u090F\u0915 \u091A\u0941\u0928\u0947\u0902\",\n  \"Select one or more\": \"\u090F\u0915 \u092F\u093E \u0905\u0927\u093F\u0915 \u091A\u0941\u0928\u0947\u0902\",\n  \"Select up to {{count}}_one\": \"\u0905\u0927\u093F\u0915\u0924\u092E {{count}} \u0924\u0915 \u091A\u0941\u0928\u0947\u0902\",\n  \"Select up to {{count}}_other\": \"\u0905\u0927\u093F\u0915\u0924\u092E {{count}} \u0924\u0915 \u091A\u0941\u0928\u0947\u0902\",\n  \"Send\": \"\u092D\u0947\u091C\u0947\",\n  \"Send Anyway\": \"\u0935\u0948\u0938\u0947 \u092D\u0940 \u092D\u0947\u091C\u0947\u0902\",\n  \"Send message request failed\": \"\u0938\u0902\u0926\u0947\u0936 \u092D\u0947\u091C\u0928\u0947 \u0915\u093E \u0905\u0928\u0941\u0930\u094B\u0927 \u0935\u093F\u092B\u0932 \u0930\u0939\u093E\",\n  \"Sending...\": \"\u092D\u0947\u091C\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948\",\n  \"Sent\": \"\u092D\u0947\u091C\u093E \u0917\u092F\u093E\",\n  \"Share\": \"\u0938\u093E\u091D\u093E \u0915\u0930\u0947\u0902\",\n  \"Share live location for\": \"\u0932\u093E\u0907\u0935 \u0938\u094D\u0925\u093E\u0928 \u0938\u093E\u091D\u093E \u0915\u0930\u0947\u0902\",\n  \"Share Location\": \"\u0938\u094D\u0925\u093E\u0928 \u0938\u093E\u091D\u093E \u0915\u0930\u0947\u0902\",\n  \"Shared live location\": \"\u0938\u093E\u091D\u093E \u0915\u093F\u092F\u093E \u0917\u092F\u093E \u0932\u093E\u0907\u0935 \u0938\u094D\u0925\u093E\u0928\",\n  \"Show all\": \"\u0938\u092D\u0940 \u0926\u093F\u0916\u093E\u090F\u0901\",\n  \"Shuffle\": \"\u092E\u093F\u0936\u094D\u0930\u093F\u0924 \u0915\u0930\u0947\u0902\",\n  \"size limit\": \"\u0906\u0915\u093E\u0930 \u0938\u0940\u092E\u093E\",\n  \"Slow Mode ON\": \"\u0938\u094D\u0932\u094B \u092E\u094B\u0921 \u0911\u0928\",\n  \"Some of the files will not be accepted\": \"\u0915\u0941\u091B \u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u0938\u094D\u0935\u0940\u0915\u093E\u0930 \u0928\u0939\u0940\u0902 \u0915\u0940 \u091C\u093E\u090F\u0902\u0917\u0940\",\n  \"Start typing to search\": \"\u0916\u094B\u091C\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u091F\u093E\u0907\u092A \u0915\u0930\u0928\u093E \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902\",\n  \"Stop sharing\": \"\u0938\u093E\u091D\u093E \u0915\u0930\u0928\u093E \u092C\u0902\u0926 \u0915\u0930\u0947\u0902\",\n  \"Submit\": \"\u091C\u092E\u093E \u0915\u0930\u0947\u0902\",\n  \"Suggest an option\": \"\u090F\u0915 \u0935\u093F\u0915\u0932\u094D\u092A \u0938\u0941\u091D\u093E\u0935 \u0926\u0947\u0902\",\n  \"Thinking...\": \"\u0938\u094B\u091A \u0930\u0939\u093E \u0939\u0948...\",\n  \"this content could not be displayed\": \"\u092F\u0939 \u0915\u0949\u0928\u094D\u091F\u0947\u0902\u091F \u0932\u094B\u0921 \u0928\u0939\u0940\u0902 \u0939\u094B \u092A\u093E\u092F\u093E\",\n  \"This field cannot be empty or contain only spaces\": \"\u092F\u0939 \u092B\u093C\u0940\u0932\u094D\u0921 \u0916\u093E\u0932\u0940 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u0924\u093E \u092F\u093E \u0915\u0947\u0935\u0932 \u0930\u093F\u0915\u094D\u0924 \u0938\u094D\u0925\u093E\u0928 \u0928\u0939\u0940\u0902 \u0930\u0916 \u0938\u0915\u0924\u093E\",\n  \"This message did not meet our content guidelines\": \"\u092F\u0939 \u0938\u0902\u0926\u0947\u0936 \u0939\u092E\u093E\u0930\u0947 \u0938\u093E\u092E\u0917\u094D\u0930\u0940 \u0926\u093F\u0936\u093E\u0928\u093F\u0930\u094D\u0926\u0947\u0936\u094B\u0902 \u0915\u0947 \u0905\u0928\u0941\u0930\u0942\u092A \u0928\u0939\u0940\u0902 \u0925\u093E\",\n  \"This message was deleted...\": \"\u092E\u0948\u0938\u0947\u091C \u0939\u091F\u093E \u0926\u093F\u092F\u093E \u0917\u092F\u093E\",\n  \"Thread\": \"\u0930\u093F\u092A\u094D\u0932\u093E\u0908 \u0925\u094D\u0930\u0947\u0921\",\n  \"Thread has not been found\": \"\u0925\u094D\u0930\u0947\u0921 \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\",\n  \"Thread reply\": \"\u0925\u094D\u0930\u0947\u0921 \u092E\u0947\u0902 \u0909\u0924\u094D\u0924\u0930\",\n  \"timestamp/DateSeparator\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/LiveLocation\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/MessageTimestamp\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/PollVote\": \"{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}\",\n  \"timestamp/PollVoteTooltip\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/ReminderNotification\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/SystemMessage\": \"{{ timestamp | timestampFormatter(format: dddd L) }}\",\n  \"To start recording, allow the camera access in your browser\": \"\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0936\u0941\u0930\u0942 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F, \u0905\u092A\u0928\u0947 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u092E\u0947\u0902 \u0915\u0948\u092E\u0930\u093E \u0924\u0915 \u092A\u0939\u0941\u0901\u091A \u0926\u0947\u0902\",\n  \"To start recording, allow the microphone access in your browser\": \"\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0936\u0941\u0930\u0942 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F, \u0905\u092A\u0928\u0947 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u092E\u0947\u0902 \u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928 \u0924\u0915 \u092A\u0939\u0941\u0901\u091A \u0926\u0947\u0902\",\n  \"translationBuilderTopic/notification\": \"{{value, notification}}\",\n  \"Type a number from 2 to 10\": \"2 \u0938\u0947 10 \u0924\u0915 \u0915\u093E \u090F\u0915 \u0928\u0902\u092C\u0930 \u091F\u093E\u0907\u092A \u0915\u0930\u0947\u0902\",\n  \"Type your message\": \"\u0905\u092A\u0928\u093E \u092E\u0948\u0938\u0947\u091C \u0932\u093F\u0916\u0947\",\n  \"Unarchive\": \"\u0905\u0928\u0906\u0930\u094D\u0915\u093E\u0907\u0935\",\n  \"unban-command-args\": \"[@\u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u0928\u093E\u092E]\",\n  \"unban-command-description\": \"\u090F\u0915 \u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0915\u094B \u092A\u094D\u0930\u0924\u093F\u0937\u0947\u0927 \u0938\u0947 \u092E\u0941\u0915\u094D\u0924 \u0915\u0930\u0947\u0902\",\n  \"unknown error\": \"\u0905\u091C\u094D\u091E\u093E\u0924 \u0924\u094D\u0930\u0941\u091F\u093F\",\n  \"Unmute\": \"\u0905\u0928\u092E\u094D\u092F\u0942\u091F\",\n  \"unmute-command-args\": \"[@\u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u0928\u093E\u092E]\",\n  \"unmute-command-description\": \"\u090F\u0915 \u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0915\u094B \u0905\u0928\u092E\u094D\u092F\u0942\u091F \u0915\u0930\u0947\u0902\",\n  \"Unpin\": \"\u0905\u0928\u092A\u093F\u0928\",\n  \"Unread messages\": \"\u0905\u092A\u0920\u093F\u0924 \u0938\u0902\u0926\u0947\u0936\",\n  \"unreadMessagesSeparatorText_one\": \"1 \u0905\u092A\u0920\u093F\u0924 \u0938\u0902\u0926\u0947\u0936\",\n  \"unreadMessagesSeparatorText_other\": \"{{count}} \u0905\u092A\u0920\u093F\u0924 \u0938\u0902\u0926\u0947\u0936\",\n  \"Unsupported attachment\": \"\u0905\u0938\u092E\u0930\u094D\u0925\u093F\u0924 \u0905\u091F\u0948\u091A\u092E\u0947\u0902\u091F\",\n  \"unsupported file type\": \"\u0905\u0938\u092E\u0930\u094D\u0925\u093F\u0924 \u092B\u093C\u093E\u0907\u0932 \u092A\u094D\u0930\u0915\u093E\u0930\",\n  \"Update your comment\": \"\u0905\u092A\u0928\u0947 \u091F\u093F\u092A\u094D\u092A\u0923\u0940 \u0915\u094B \u0905\u092A\u0921\u0947\u091F \u0915\u0930\u0947\u0902\",\n  \"Upload type: \\\"{{ type }}\\\" is not allowed\": \"\u0905\u092A\u0932\u094B\u0921 \u092A\u094D\u0930\u0915\u093E\u0930: \\\"{{ type }}\\\" \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0928\u0939\u0940\u0902 \u0939\u0948\",\n  \"User uploaded content\": \"\u0909\u092A\u092F\u094B\u0917\u0915\u0930\u094D\u0924\u093E \u0905\u092A\u0932\u094B\u0921 \u0915\u0940 \u0917\u0908 \u0938\u093E\u092E\u0917\u094D\u0930\u0940\",\n  \"View {{count}} comments_one\": \"\u0926\u0947\u0916\u0947\u0902 {{count}} \u091F\u093F\u092A\u094D\u092A\u0923\u0940\",\n  \"View {{count}} comments_other\": \"\u0926\u0947\u0916\u0947\u0902 {{count}} \u091F\u093F\u092A\u094D\u092A\u0923\u093F\u092F\u093E\u0901\",\n  \"View results\": \"\u092A\u0930\u093F\u0923\u093E\u092E \u0926\u0947\u0916\u0947\u0902\",\n  \"Voice message\": \"\u0906\u0935\u093E\u091C \u0938\u0902\u0926\u0947\u0936\",\n  \"Vote ended\": \"\u092E\u0924\u0926\u093E\u0928 \u0938\u092E\u093E\u092A\u094D\u0924\",\n  \"Wait until all attachments have uploaded\": \"\u0938\u092D\u0940 \u0905\u091F\u0948\u091A\u092E\u0947\u0902\u091F \u0905\u092A\u0932\u094B\u0921 \u0939\u094B\u0928\u0947 \u0924\u0915 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0915\u0930\u0947\u0902\",\n  \"You\": \"\u0906\u092A\",\n  \"You have no channels currently\": \"\u0906\u092A\u0915\u0947 \u092A\u093E\u0938 \u0915\u094B\u0908 \u091A\u0948\u0928\u0932 \u0928\u0939\u0940\u0902 \u0939\u0948\",\n  \"You've reached the maximum number of files\": \"\u0906\u092A \u0905\u0927\u093F\u0915\u0924\u092E \u092B\u093C\u093E\u0907\u0932\u094B\u0902 \u0924\u0915 \u092A\u0939\u0941\u0901\u091A \u0917\u090F \u0939\u0948\u0902\"\n}\n", "{\n  \"{{ commaSeparatedUsers }} and {{ moreCount }} more\": \"{{ commaSeparatedUsers }} e altri {{ moreCount }}\",\n  \"{{ commaSeparatedUsers }}, and {{ lastUser }}\": \"{{ commaSeparatedUsers }} e {{ lastUser }}\",\n  \"{{ firstUser }} and {{ secondUser }}\": \"{{ firstUser }} e {{ secondUser }}\",\n  \"{{ imageCount }} more\": \"+ {{ imageCount }}\",\n  \"{{ memberCount }} members\": \"{{ memberCount }} membri\",\n  \"{{ user }} has been muted\": \"{{ user }} \u00E8 stato silenziato\",\n  \"{{ user }} has been unmuted\": \"Notifiche riattivate per {{ user }}\",\n  \"{{ user }} is typing...\": \"{{ user }} sta digitando...\",\n  \"{{ users }} and {{ user }} are typing...\": \"{{ users }} e {{ user }} stanno digitando...\",\n  \"{{ users }} and more are typing...\": \"{{ users }} e altri stanno digitando...\",\n  \"{{ watcherCount }} online\": \"{{ watcherCount }} online\",\n  \"{{count}} unread_one\": \"{{count}} non letto\",\n  \"{{count}} unread_many\": \"{{count}} non letti\",\n  \"{{count}} unread_other\": \"{{count}} non letti\",\n  \"{{count}} votes_one\": \"{{count}} voto\",\n  \"{{count}} votes_many\": \"{{count}} voti\",\n  \"{{count}} votes_other\": \"{{count}} voti\",\n  \"\uD83C\uDFD9 Attachment...\": \"\uD83C\uDFD9 Allegato...\",\n  \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\": \"\uD83D\uDCCA {{createdBy}} ha creato: {{ pollName}}\",\n  \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\": \"\uD83D\uDCCA {{votedBy}} ha votato: {{pollOptionText}}\",\n  \"\uD83D\uDCCDShared location\": \"\uD83D\uDCCDPosizione condivisa\",\n  \"Add a comment\": \"Aggiungi un commento\",\n  \"Add an option\": \"Aggiungi un'opzione\",\n  \"All results loaded\": \"Tutti i risultati caricati\",\n  \"Allow access to camera\": \"Consenti l'accesso alla fotocamera\",\n  \"Allow access to microphone\": \"Consenti l'accesso al microfono\",\n  \"Allow comments\": \"Consenti i commenti\",\n  \"Allow option suggestion\": \"Consenti il suggerimento di opzioni\",\n  \"Also send as a direct message\": \"Invia anche come messaggio diretto\",\n  \"Also send in channel\": \"Invia anche nel canale\",\n  \"An error has occurred during recording\": \"Si \u00E8 verificato un errore durante la registrazione\",\n  \"An error has occurred during the recording processing\": \"Si \u00E8 verificato un errore durante l'elaborazione della registrazione\",\n  \"Anonymous\": \"Anonimo\",\n  \"Anonymous poll\": \"Sondaggio anonimo\",\n  \"Archive\": \"Archivia\",\n  \"aria/Attachment\": \"Allegato\",\n  \"aria/Cancel Reply\": \"Annulla risposta\",\n  \"aria/Cancel upload\": \"Annulla caricamento\",\n  \"aria/Channel list\": \"Elenco dei canali\",\n  \"aria/Channel search results\": \"Risultati della ricerca dei canali\",\n  \"aria/Close thread\": \"Chiudi discussione\",\n  \"aria/Download attachment\": \"Scarica l'allegato\",\n  \"aria/Emoji picker\": \"Selettore di emoji\",\n  \"aria/File input\": \"Input di file\",\n  \"aria/File upload\": \"Caricamento di file\",\n  \"aria/Image input\": \"Input di immagine\",\n  \"aria/Load More Channels\": \"Carica altri canali\",\n  \"aria/Menu\": \"Menu\",\n  \"aria/Message Options\": \"Opzioni di messaggio\",\n  \"aria/Open Attachment Selector\": \"Apri selettore allegati\",\n  \"aria/Open Menu\": \"Apri menu\",\n  \"aria/Open Message Actions Menu\": \"Apri il menu delle azioni di messaggio\",\n  \"aria/Open Reaction Selector\": \"Apri il selettore di reazione\",\n  \"aria/Open Thread\": \"Apri discussione\",\n  \"aria/Reaction list\": \"Elenco delle reazioni\",\n  \"aria/Remind Me Options\": \"Opzioni promemoria\",\n  \"aria/Remove attachment\": \"Rimuovi allegato\",\n  \"aria/Remove location attachment\": \"Rimuovi allegato posizione\",\n  \"aria/Retry upload\": \"Riprova caricamento\",\n  \"aria/Search results\": \"Risultati della ricerca\",\n  \"aria/Search results header filter button\": \"Pulsante filtro intestazione risultati ricerca\",\n  \"aria/Send\": \"Invia\",\n  \"aria/Stop AI Generation\": \"Interrompi generazione IA\",\n  \"Ask a question\": \"Fai una domanda\",\n  \"Attach\": \"Allega\",\n  \"Attach files\": \"Allega file\",\n  \"Attachment upload blocked due to {{reason}}\": \"Caricamento allegato bloccato a causa di {{reason}}\",\n  \"Attachment upload failed due to {{reason}}\": \"Caricamento allegato fallito a causa di {{reason}}\",\n  \"ban-command-args\": \"[@nomeutente] [testo]\",\n  \"ban-command-description\": \"Vietare un utente\",\n  \"Cancel\": \"Annulla\",\n  \"Cannot seek in the recording\": \"Impossibile cercare nella registrazione\",\n  \"Channel Missing\": \"Il canale non esiste\",\n  \"Close\": \"Chiudi\",\n  \"Close emoji picker\": \"Chiudi il selettore di emoji\",\n  \"Commands matching\": \"Comandi corrispondenti\",\n  \"Connection failure, reconnecting now...\": \"Errore di connessione, riconnessione in corso...\",\n  \"Create\": \"Crea\",\n  \"Create poll\": \"Crea sondaggio\",\n  \"Current location\": \"Posizione attuale\",\n  \"Delete\": \"Elimina\",\n  \"Delete for me\": \"Elimina per me\",\n  \"Delivered\": \"Consegnato\",\n  \"Download attachment {{ name }}\": \"Scarica l'allegato {{ name }}\",\n  \"Drag your files here\": \"Trascina i tuoi file qui\",\n  \"Drag your files here to add to your post\": \"Trascina i tuoi file qui per aggiungerli al tuo post\",\n  \"Due {{ timeLeft }}\": \"Scadenza tra {{ timeLeft }}\",\n  \"Due since {{ dueSince }}\": \"Scaduto dal {{ dueSince }}\",\n  \"duration/Message reminder\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Remind Me\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Share Location\": \"{{ milliseconds | durationFormatter }}\",\n  \"Edit Message\": \"Modifica messaggio\",\n  \"Edit message request failed\": \"Richiesta di modifica del messaggio non riuscita\",\n  \"Edited\": \"Modificato\",\n  \"Emoji matching\": \"Abbinamento emoji\",\n  \"Empty message...\": \"Messaggio vuoto...\",\n  \"End\": \"Fine\",\n  \"End vote\": \"Termina il voto\",\n  \"Enforce unique vote is enabled\": \"Il voto unico \u00E8 abilitato\",\n  \"Error\": \"Errore\",\n  \"Error \u00B7 Unsent\": \"Errore \u00B7 Non inviato\",\n  \"Error adding flag\": \"Errore durante l'aggiunta del flag\",\n  \"Error connecting to chat, refresh the page to try again.\": \"Errore di connessione alla chat, aggiorna la pagina per riprovare.\",\n  \"Error deleting message\": \"Errore durante l'eliminazione del messaggio\",\n  \"Error fetching reactions\": \"Errore nel caricamento delle reazioni\",\n  \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\": \"Errore durante la marcatura del messaggio come non letto. Impossibile marcare messaggi non letti pi\u00F9 vecchi dei pi\u00F9 recenti 100 messaggi del canale.\",\n  \"Error muting a user ...\": \"Errore nel silenziare un utente ...\",\n  \"Error pinning message\": \"Errore durante il blocco del messaggio\",\n  \"Error removing message pin\": \"Errore durante la rimozione del PIN del messaggio\",\n  \"Error reproducing the recording\": \"Errore durante la riproduzione della registrazione\",\n  \"Error starting recording\": \"Errore durante l'avvio della registrazione\",\n  \"Error unmuting a user ...\": \"Errore nel riattivare un utente ...\",\n  \"Error uploading attachment\": \"Errore durante il caricamento dell'allegato\",\n  \"Error uploading file\": \"Errore durante il caricamento del file\",\n  \"Error uploading image\": \"Errore durante il caricamento dell'immagine\",\n  \"Error: {{ errorMessage }}\": \"Errore: {{ errorMessage }}\",\n  \"Failed to create the poll\": \"Impossibile creare il sondaggio\",\n  \"Failed to create the poll due to {{reason}}\": \"Impossibile creare il sondaggio a causa di {{reason}}\",\n  \"Failed to jump to the first unread message\": \"Impossibile passare al primo messaggio non letto\",\n  \"Failed to mark channel as read\": \"Impossibile contrassegnare il canale come letto\",\n  \"Failed to play the recording\": \"Impossibile riprodurre la registrazione\",\n  \"Failed to retrieve location\": \"Impossibile recuperare la posizione\",\n  \"Failed to share location\": \"Impossibile condividere la posizione\",\n  \"File\": \"File\",\n  \"File is too large: {{ size }}, maximum upload size is {{ limit }}\": \"Il file \u00E8 troppo grande: {{ size }}, la dimensione massima di caricamento \u00E8 {{ limit }}\",\n  \"Flag\": \"Segnala\",\n  \"Generating...\": \"Generando...\",\n  \"giphy-command-args\": \"[testo]\",\n  \"giphy-command-description\": \"Pubblica un gif casuale sul canale\",\n  \"Latest Messages\": \"Ultimi messaggi\",\n  \"live\": \"live\",\n  \"Live for {{duration}}\": \"Live per {{duration}}\",\n  \"Live location\": \"Posizione live\",\n  \"Live until {{ timestamp }}\": \"Live fino a {{ timestamp }}\",\n  \"Load more\": \"Carica di pi\u00F9\",\n  \"Location\": \"Posizione\",\n  \"Location sharing ended\": \"Condivisione posizione terminata\",\n  \"Mark as unread\": \"Contrassegna come non letto\",\n  \"Maximum number of votes (from 2 to 10)\": \"Numero massimo di voti (da 2 a 10)\",\n  \"Menu\": \"Men\u00F9\",\n  \"Message deleted\": \"Messaggio cancellato\",\n  \"Message Failed \u00B7 Click to try again\": \"Invio messaggio fallito \u00B7 Clicca per riprovare\",\n  \"Message Failed \u00B7 Unauthorized\": \"Invio messaggio fallito \u00B7 Non autorizzato\",\n  \"Message has been successfully flagged\": \"Il messaggio \u00E8 stato segnalato con successo\",\n  \"Message pinned\": \"Messaggio bloccato\",\n  \"Message was blocked by moderation policies\": \"Il messaggio \u00E8 stato bloccato dalle politiche di moderazione\",\n  \"Messages have been marked unread.\": \"I messaggi sono stati contrassegnati come non letti.\",\n  \"Missing permissions to upload the attachment\": \"Autorizzazioni mancanti per caricare l'allegato\",\n  \"Multiple answers\": \"Risposte multiple\",\n  \"Mute\": \"Silenzia\",\n  \"mute-command-args\": \"[@nomeutente]\",\n  \"mute-command-description\": \"Silenzia un utente\",\n  \"network error\": \"errore di rete\",\n  \"New\": \"Nuovo\",\n  \"New Messages!\": \"Nuovi messaggi!\",\n  \"No chats here yet\u2026\": \"Non ci sono ancora messaggi qui...\",\n  \"No results found\": \"Nessun risultato trovato\",\n  \"Nobody will be able to vote in this poll anymore.\": \"Nessuno potr\u00E0 pi\u00F9 votare in questo sondaggio.\",\n  \"Nothing yet...\": \"Ancora niente...\",\n  \"Ok\": \"Ok\",\n  \"Only numbers are allowed\": \"Sono consentiti solo numeri\",\n  \"Open emoji picker\": \"Apri il selettore di emoji\",\n  \"Option already exists\": \"L'opzione esiste gi\u00E0\",\n  \"Option is empty\": \"L'opzione \u00E8 vuota\",\n  \"Options\": \"Opzioni\",\n  \"People matching\": \"Persone che corrispondono\",\n  \"Pin\": \"Pin\",\n  \"Pinned by\": \"Appuntato da\",\n  \"Poll\": \"Sondaggio\",\n  \"Poll comments\": \"Commenti del sondaggio\",\n  \"Poll options\": \"Opzioni del sondaggio\",\n  \"Poll results\": \"Risultati del sondaggio\",\n  \"Question\": \"Domanda\",\n  \"Question is required\": \"La domanda \u00E8 obbligatoria\",\n  \"Quote\": \"Citazione\",\n  \"Reached the vote limit. Remove an existing vote first.\": \"Raggiunto il limite di voti. Rimuovi prima un voto esistente.\",\n  \"Recording format is not supported and cannot be reproduced\": \"Il formato di registrazione non \u00E8 supportato e non pu\u00F2 essere riprodotto\",\n  \"Remind Me\": \"Ricordami\",\n  \"Remove reminder\": \"Rimuovi promemoria\",\n  \"Reply\": \"Rispondi\",\n  \"Reply to Message\": \"Rispondi al messaggio\",\n  \"replyCount_one\": \"Una risposta\",\n  \"replyCount_many\": \"{{ count }} risposte\",\n  \"replyCount_other\": \"{{ count }} risposte\",\n  \"Save for later\": \"Salva per dopo\",\n  \"Saved for later\": \"Salvato per dopo\",\n  \"Search\": \"Cerca\",\n  \"search-results-header-filter-source-button-label--channels\": \"canali\",\n  \"search-results-header-filter-source-button-label--messages\": \"messaggi\",\n  \"search-results-header-filter-source-button-label--users\": \"utenti\",\n  \"Searching for {{ searchSourceType }}...\": \"Ricerca di {{ searchSourceType }}...\",\n  \"Searching...\": \"Ricerca in corso...\",\n  \"searchResultsCount_one\": \"1 risultato\",\n  \"searchResultsCount_many\": \"{{ count }} risultati\",\n  \"searchResultsCount_other\": \"{{ count }} risultati\",\n  \"See all options ({{count}})_one\": \"Vedi tutte le opzioni ({{count}})\",\n  \"See all options ({{count}})_many\": \"Vedi tutte le opzioni ({{count}})\",\n  \"See all options ({{count}})_other\": \"Vedi tutte le opzioni ({{count}})\",\n  \"Select one\": \"Seleziona uno\",\n  \"Select one or more\": \"Seleziona uno o pi\u00F9\",\n  \"Select up to {{count}}_one\": \"Seleziona fino a {{count}}\",\n  \"Select up to {{count}}_many\": \"Seleziona fino a {{count}}\",\n  \"Select up to {{count}}_other\": \"Seleziona fino a {{count}}\",\n  \"Send\": \"Invia\",\n  \"Send Anyway\": \"Invia comunque\",\n  \"Send message request failed\": \"Richiesta di invio messaggio non riuscita\",\n  \"Sending...\": \"Invio in corso...\",\n  \"Sent\": \"Inviato\",\n  \"Share\": \"Condividi\",\n  \"Share live location for\": \"Condividi posizione live per\",\n  \"Share Location\": \"Condividi posizione\",\n  \"Shared live location\": \"Posizione live condivisa\",\n  \"Show all\": \"Mostra tutto\",\n  \"Shuffle\": \"Mescolare\",\n  \"size limit\": \"limite di dimensione\",\n  \"Slow Mode ON\": \"Modalit\u00E0 lenta attivata\",\n  \"Some of the files will not be accepted\": \"Alcuni dei file non saranno accettati\",\n  \"Start typing to search\": \"Inizia a digitare per cercare\",\n  \"Stop sharing\": \"Ferma condivisione\",\n  \"Submit\": \"Invia\",\n  \"Suggest an option\": \"Suggerisci un'opzione\",\n  \"Thinking...\": \"Pensando...\",\n  \"this content could not be displayed\": \"questo contenuto non pu\u00F2 essere mostrato\",\n  \"This field cannot be empty or contain only spaces\": \"Questo campo non pu\u00F2 essere vuoto o contenere solo spazi\",\n  \"This message did not meet our content guidelines\": \"Questo messaggio non soddisfa le nostre linee guida sui contenuti\",\n  \"This message was deleted...\": \"Questo messaggio \u00E8 stato cancellato...\",\n  \"Thread\": \"Discussione\",\n  \"Thread has not been found\": \"Discussione non trovata\",\n  \"Thread reply\": \"Risposta nella discussione\",\n  \"timestamp/DateSeparator\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/LiveLocation\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/MessageTimestamp\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/PollVote\": \"{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}\",\n  \"timestamp/PollVoteTooltip\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/ReminderNotification\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/SystemMessage\": \"{{ timestamp | timestampFormatter(format: dddd L) }}\",\n  \"To start recording, allow the camera access in your browser\": \"Per iniziare a registrare, consenti l'accesso alla fotocamera nel tuo browser\",\n  \"To start recording, allow the microphone access in your browser\": \"Per iniziare a registrare, consenti l'accesso al microfono nel tuo browser\",\n  \"translationBuilderTopic/notification\": \"{{value, notification}}\",\n  \"Type a number from 2 to 10\": \"Digita un numero da 2 a 10\",\n  \"Type your message\": \"Scrivi il tuo messaggio\",\n  \"Unarchive\": \"Ripristina\",\n  \"unban-command-args\": \"[@nomeutente]\",\n  \"unban-command-description\": \"Togliere il divieto a un utente\",\n  \"unknown error\": \"errore sconosciuto\",\n  \"Unmute\": \"Riattiva il notifiche\",\n  \"unmute-command-args\": \"[@nomeutente]\",\n  \"unmute-command-description\": \"Togliere il silenzio a un utente\",\n  \"Unpin\": \"Sblocca\",\n  \"Unread messages\": \"Messaggi non letti\",\n  \"unreadMessagesSeparatorText_one\": \"1 messaggio non letto\",\n  \"unreadMessagesSeparatorText_many\": \"{{count}} messaggi non letti\",\n  \"unreadMessagesSeparatorText_other\": \"{{count}} messaggi non letti\",\n  \"Unsupported attachment\": \"Allegato non supportato\",\n  \"unsupported file type\": \"tipo di file non supportato\",\n  \"Update your comment\": \"Aggiorna il tuo commento\",\n  \"Upload type: \\\"{{ type }}\\\" is not allowed\": \"Tipo di caricamento: \\\"{{ type }}\\\" non \u00E8 consentito\",\n  \"User uploaded content\": \"Contenuto caricato dall'utente\",\n  \"View {{count}} comments_one\": \"Visualizza {{count}} commento\",\n  \"View {{count}} comments_many\": \"Visualizza {{count}} commenti\",\n  \"View {{count}} comments_other\": \"Visualizza {{count}} commenti\",\n  \"View results\": \"Vedi risultati\",\n  \"Voice message\": \"Messaggio vocale\",\n  \"Vote ended\": \"Voto terminato\",\n  \"Wait until all attachments have uploaded\": \"Attendi il caricamento di tutti gli allegati\",\n  \"You\": \"Tu\",\n  \"You have no channels currently\": \"Al momento non sono presenti canali\",\n  \"You've reached the maximum number of files\": \"Hai raggiunto il numero massimo di file\"\n}\n", "{\n  \"{{ commaSeparatedUsers }} and {{ moreCount }} more\": \"{{ commaSeparatedUsers }} \u3068 {{ moreCount }} \u4ED6\u4EBA\",\n  \"{{ commaSeparatedUsers }}, and {{ lastUser }}\": \"{{ commaSeparatedUsers }} \u3068 {{ lastUser }}\",\n  \"{{ firstUser }} and {{ secondUser }}\": \"{{ firstUser }} \u3068 {{ secondUser }}\",\n  \"{{ imageCount }} more\": \"{{ imageCount }} \u30A4\u30E1\u30FC\u30B8\",\n  \"{{ memberCount }} members\": \"{{ memberCount }} \u30E1\u30F3\u30D0\u30FC\",\n  \"{{ user }} has been muted\": \"{{ user }} \u7121\u97F3\u3055\u308C\u3066\u3044\u307E\u3059\",\n  \"{{ user }} has been unmuted\": \"{{ user }} \u7121\u97F3\u3055\u308C\u3066\u3044\u307E\u305B\u3093\",\n  \"{{ user }} is typing...\": \"{{ user }} \u304C\u5165\u529B\u4E2D...\",\n  \"{{ users }} and {{ user }} are typing...\": \"{{ users }} \u3068 {{ user }} \u304C\u5165\u529B\u4E2D...\",\n  \"{{ users }} and more are typing...\": \"{{ users }} \u3068\u305D\u306E\u4ED6\u304C\u5165\u529B\u4E2D...\",\n  \"{{ watcherCount }} online\": \"{{ watcherCount }} \u30AA\u30F3\u30E9\u30A4\u30F3\",\n  \"{{count}} unread_other\": \"{{count}} \u672A\u8AAD\",\n  \"{{count}} votes_other\": \"{{count}} \u7968\",\n  \"\uD83C\uDFD9 Attachment...\": \"\uD83C\uDFD9 \u30A2\u30BF\u30C3\u30C1\u30E1\u30F3\u30C8...\",\n  \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\": \"\uD83D\uDCCA {{createdBy}} \u304C\u4F5C\u6210: {{ pollName}}\",\n  \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\": \"\uD83D\uDCCA {{votedBy}} \u304C\u6295\u7968: {{pollOptionText}}\",\n  \"\uD83D\uDCCDShared location\": \"\uD83D\uDCCD\u5171\u6709\u3055\u308C\u305F\u4F4D\u7F6E\u60C5\u5831\",\n  \"Add a comment\": \"\u30B3\u30E1\u30F3\u30C8\u3092\u8FFD\u52A0\",\n  \"Add an option\": \"\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u8FFD\u52A0\",\n  \"All results loaded\": \"\u3059\u3079\u3066\u306E\u7D50\u679C\u304C\u8AAD\u307F\u8FBC\u307E\u308C\u307E\u3057\u305F\",\n  \"Allow access to camera\": \"\u30AB\u30E1\u30E9\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u8A31\u53EF\u3059\u308B\",\n  \"Allow access to microphone\": \"\u30DE\u30A4\u30AF\u30ED\u30D5\u30A9\u30F3\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u8A31\u53EF\u3059\u308B\",\n  \"Allow comments\": \"\u30B3\u30E1\u30F3\u30C8\u3092\u8A31\u53EF\",\n  \"Allow option suggestion\": \"\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u63D0\u6848\u3092\u8A31\u53EF\",\n  \"Also send as a direct message\": \"\u30C0\u30A4\u30EC\u30AF\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\u3068\u3057\u3066\u3082\u9001\u4FE1\",\n  \"Also send in channel\": \"\u30C1\u30E3\u30F3\u30CD\u30EB\u306B\u3082\u9001\u4FE1\",\n  \"An error has occurred during recording\": \"\u9332\u97F3\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\",\n  \"An error has occurred during the recording processing\": \"\u9332\u97F3\u51E6\u7406\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\",\n  \"Anonymous\": \"\u533F\u540D\",\n  \"Anonymous poll\": \"\u533F\u540D\u6295\u7968\",\n  \"Archive\": \"\u30A2\u30FC\u30AB\u30A4\u30D6\",\n  \"aria/Attachment\": \"\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB\",\n  \"aria/Cancel Reply\": \"\u8FD4\u4FE1\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\",\n  \"aria/Cancel upload\": \"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\",\n  \"aria/Channel list\": \"\u30C1\u30E3\u30F3\u30CD\u30EB\u4E00\u89A7\",\n  \"aria/Channel search results\": \"\u30C1\u30E3\u30F3\u30CD\u30EB\u691C\u7D22\u7D50\u679C\",\n  \"aria/Close thread\": \"\u30B9\u30EC\u30C3\u30C9\u3092\u9589\u3058\u308B\",\n  \"aria/Download attachment\": \"\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\",\n  \"aria/Emoji picker\": \"\u7D75\u6587\u5B57\u30D4\u30C3\u30AB\u30FC\",\n  \"aria/File input\": \"\u30D5\u30A1\u30A4\u30EB\u5165\u529B\",\n  \"aria/File upload\": \"\u30D5\u30A1\u30A4\u30EB\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\",\n  \"aria/Image input\": \"\u753B\u50CF\u5165\u529B\",\n  \"aria/Load More Channels\": \"\u3055\u3089\u306B\u30C1\u30E3\u30F3\u30CD\u30EB\u3092\u8AAD\u307F\u8FBC\u3080\",\n  \"aria/Menu\": \"\u30E1\u30CB\u30E5\u30FC\",\n  \"aria/Message Options\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u30AA\u30D7\u30B7\u30E7\u30F3\",\n  \"aria/Open Attachment Selector\": \"\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB\u9078\u629E\u3092\u958B\u304F\",\n  \"aria/Open Menu\": \"\u30E1\u30CB\u30E5\u30FC\u3092\u958B\u304F\",\n  \"aria/Open Message Actions Menu\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u30A2\u30AF\u30B7\u30E7\u30F3\u30E1\u30CB\u30E5\u30FC\u3092\u958B\u304F\",\n  \"aria/Open Reaction Selector\": \"\u30EA\u30A2\u30AF\u30B7\u30E7\u30F3\u30BB\u30EC\u30AF\u30BF\u30FC\u3092\u958B\u304F\",\n  \"aria/Open Thread\": \"\u30B9\u30EC\u30C3\u30C9\u3092\u958B\u304F\",\n  \"aria/Reaction list\": \"\u30EA\u30A2\u30AF\u30B7\u30E7\u30F3\u4E00\u89A7\",\n  \"aria/Remind Me Options\": \"\u30EA\u30DE\u30A4\u30F3\u30C0\u30FC\u30AA\u30D7\u30B7\u30E7\u30F3\",\n  \"aria/Remove attachment\": \"\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\",\n  \"aria/Remove location attachment\": \"\u4F4D\u7F6E\u60C5\u5831\u306E\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\",\n  \"aria/Retry upload\": \"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3092\u518D\u8A66\u884C\",\n  \"aria/Search results\": \"\u691C\u7D22\u7D50\u679C\",\n  \"aria/Search results header filter button\": \"\u691C\u7D22\u7D50\u679C\u30D8\u30C3\u30C0\u30FC\u30D5\u30A3\u30EB\u30BF\u30FC\u30DC\u30BF\u30F3\",\n  \"aria/Send\": \"\u9001\u4FE1\",\n  \"aria/Stop AI Generation\": \"AI\u751F\u6210\u3092\u505C\u6B62\",\n  \"Ask a question\": \"\u8CEA\u554F\u3059\u308B\",\n  \"Attach\": \"\u6DFB\u4ED8\",\n  \"Attach files\": \"\u30D5\u30A1\u30A4\u30EB\u3092\u6DFB\u4ED8\u3059\u308B\",\n  \"Attachment upload blocked due to {{reason}}\": \"{{reason}}\u306E\u305F\u3081\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB\u306E\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u304C\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u307E\u3057\u305F\",\n  \"Attachment upload failed due to {{reason}}\": \"{{reason}}\u306E\u305F\u3081\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB\u306E\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\",\n  \"ban-command-args\": \"[@\u30E6\u30FC\u30B6\u540D] [\u30C6\u30AD\u30B9\u30C8]\",\n  \"ban-command-description\": \"\u30E6\u30FC\u30B6\u30FC\u3092\u7981\u6B62\u3059\u308B\",\n  \"Cancel\": \"\u30AD\u30E3\u30F3\u30BB\u30EB\",\n  \"Cannot seek in the recording\": \"\u9332\u97F3\u4E2D\u306B\u30B7\u30FC\u30AF\u3067\u304D\u307E\u305B\u3093\",\n  \"Channel Missing\": \"\u30C1\u30E3\u30CD\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\",\n  \"Close\": \"\u9589\u3081\u308B\",\n  \"Close emoji picker\": \"\u7D75\u6587\u5B57\u30D4\u30C3\u30AB\u30FC\u3092\u9589\u3081\u308B\",\n  \"Commands matching\": \"\u4E00\u81F4\u3059\u308B\u30B3\u30DE\u30F3\u30C9\",\n  \"Connection failure, reconnecting now...\": \"\u63A5\u7D9A\u304C\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u518D\u63A5\u7D9A\u4E2D...\",\n  \"Create\": \"\u4F5C\u6210\",\n  \"Create poll\": \"\u6295\u7968\u3092\u4F5C\u6210\",\n  \"Current location\": \"\u73FE\u5728\u306E\u4F4D\u7F6E\",\n  \"Delete\": \"\u6D88\u53BB\",\n  \"Delete for me\": \"\u81EA\u5206\u7528\u306B\u524A\u9664\",\n  \"Delivered\": \"\u914D\u4FE1\u3057\u307E\u3057\u305F\",\n  \"Download attachment {{ name }}\": \"\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB {{ name }} \u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\",\n  \"Drag your files here\": \"\u3053\u3053\u306B\u30D5\u30A1\u30A4\u30EB\u3092\u30C9\u30E9\u30C3\u30B0\",\n  \"Drag your files here to add to your post\": \"\u6295\u7A3F\u306B\u8FFD\u52A0\u3059\u308B\u305F\u3081\u306B\u3053\u3053\u306B\u30D5\u30A1\u30A4\u30EB\u3092\u30C9\u30E9\u30C3\u30B0\",\n  \"Due {{ timeLeft }}\": \"{{ timeLeft }}\u306B\u671F\u9650\u5207\u308C\",\n  \"Due since {{ dueSince }}\": \"{{ dueSince }}\u304B\u3089\u671F\u9650\u5207\u308C\",\n  \"duration/Message reminder\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Remind Me\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Share Location\": \"{{ milliseconds | durationFormatter }}\",\n  \"Edit Message\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u7DE8\u96C6\",\n  \"Edit message request failed\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u7DE8\u96C6\u8981\u6C42\u304C\u5931\u6557\u3057\u307E\u3057\u305F\",\n  \"Edited\": \"\u7DE8\u96C6\u6E08\u307F\",\n  \"Emoji matching\": \"\u7D75\u6587\u5B57\u30DE\u30C3\u30C1\u30F3\u30B0\",\n  \"Empty message...\": \"\u7A7A\u306E\u30E1\u30C3\u30BB\u30FC\u30B8...\",\n  \"End\": \"\u7D42\u4E86\",\n  \"End vote\": \"\u6295\u7968\u3092\u7D42\u4E86\",\n  \"Enforce unique vote is enabled\": \"\u4E00\u610F\u306E\u6295\u7968\u304C\u6709\u52B9\u306B\u306A\u3063\u3066\u3044\u307E\u3059\",\n  \"Error\": \"\u30A8\u30E9\u30FC\",\n  \"Error \u00B7 Unsent\": \"\u30A8\u30E9\u30FC\u30FB\u672A\u9001\u4FE1\",\n  \"Error adding flag\": \"\u30D5\u30E9\u30B0\u3092\u8FFD\u52A0\u306E\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\",\n  \"Error connecting to chat, refresh the page to try again.\": \"\u30C1\u30E3\u30C3\u30C8\u3078\u306E\u63A5\u7D9A\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30DA\u30FC\u30B8\u3092\u66F4\u65B0\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n  \"Error deleting message\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u524A\u9664\u3059\u308B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\",\n  \"Error fetching reactions\": \"\u53CD\u5FDC\u306E\u8AAD\u307F\u8FBC\u307F\u30A8\u30E9\u30FC\",\n  \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u672A\u8AAD\u306B\u3059\u308B\u969B\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u6700\u65B0\u306E100\u4EF6\u306E\u30C1\u30E3\u30F3\u30CD\u30EB\u30E1\u30C3\u30BB\u30FC\u30B8\u3088\u308A\u53E4\u3044\u672A\u8AAD\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u30DE\u30FC\u30AF\u3067\u304D\u307E\u305B\u3093\u3002\",\n  \"Error muting a user ...\": \"\u30E6\u30FC\u30B6\u30FC\u3092\u7121\u97F3\u3059\u308B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F...\",\n  \"Error pinning message\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u30D4\u30F3\u306E\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\",\n  \"Error removing message pin\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u30D4\u30F3\u3092\u524A\u9664\u306E\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\",\n  \"Error reproducing the recording\": \"\u9332\u97F3\u306E\u518D\u751F\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\",\n  \"Error starting recording\": \"\u9332\u97F3\u306E\u958B\u59CB\u6642\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\",\n  \"Error unmuting a user ...\": \"\u30E6\u30FC\u30B6\u30FC\u306E\u7121\u97F3\u89E3\u9664\u306E\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F...\",\n  \"Error uploading attachment\": \"\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB\u306E\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\",\n  \"Error uploading file\": \"\u30D5\u30A1\u30A4\u30EB\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u306E\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\",\n  \"Error uploading image\": \"\u753B\u50CF\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u306E\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\",\n  \"Error: {{ errorMessage }}\": \"\u30A8\u30E9\u30FC: {{ errorMessage }}\",\n  \"Failed to create the poll\": \"\u6295\u7968\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F\",\n  \"Failed to create the poll due to {{reason}}\": \"{{reason}} \u306E\u305F\u3081\u6295\u7968\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F\",\n  \"Failed to jump to the first unread message\": \"\u6700\u521D\u306E\u672A\u8AAD\u30E1\u30C3\u30BB\u30FC\u30B8\u306B\u30B8\u30E3\u30F3\u30D7\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\",\n  \"Failed to mark channel as read\": \"\u30C1\u30E3\u30F3\u30CD\u30EB\u3092\u65E2\u8AAD\u306B\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\",\n  \"Failed to play the recording\": \"\u9332\u97F3\u306E\u518D\u751F\u306B\u5931\u6557\u3057\u307E\u3057\u305F\",\n  \"Failed to retrieve location\": \"\u4F4D\u7F6E\u60C5\u5831\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\",\n  \"Failed to share location\": \"\u4F4D\u7F6E\u60C5\u5831\u306E\u5171\u6709\u306B\u5931\u6557\u3057\u307E\u3057\u305F\",\n  \"File\": \"\u30D5\u30A1\u30A4\u30EB\",\n  \"File is too large: {{ size }}, maximum upload size is {{ limit }}\": \"\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF1A{{ size }}\u3001\u6700\u5927\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u30B5\u30A4\u30BA\u306F{{ limit }}\u3067\u3059\",\n  \"Flag\": \"\u30D5\u30E9\u30B0\",\n  \"Generating...\": \"\u751F\u6210\u4E2D...\",\n  \"giphy-command-args\": \"[\u30C6\u30AD\u30B9\u30C8]\",\n  \"giphy-command-description\": \"\u30C1\u30E3\u30F3\u30CD\u30EB\u306B\u30E9\u30F3\u30C0\u30E0\u306AGIF\u3092\u6295\u7A3F\u3059\u308B\",\n  \"Latest Messages\": \"\u6700\u65B0\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\",\n  \"live\": \"\u30E9\u30A4\u30D6\",\n  \"Live for {{duration}}\": \"{{duration}}\u9593\u30E9\u30A4\u30D6\",\n  \"Live location\": \"\u30E9\u30A4\u30D6\u4F4D\u7F6E\u60C5\u5831\",\n  \"Live until {{ timestamp }}\": \"{{ timestamp }}\u307E\u3067\u30E9\u30A4\u30D6\",\n  \"Load more\": \"\u3082\u3063\u3068\u8AAD\u307F\u8FBC\u3080\",\n  \"Location\": \"\u4F4D\u7F6E\u60C5\u5831\",\n  \"Location sharing ended\": \"\u4F4D\u7F6E\u60C5\u5831\u306E\u5171\u6709\u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\",\n  \"Mark as unread\": \"\u672A\u8AAD\u3068\u3057\u3066\u30DE\u30FC\u30AF\",\n  \"Maximum number of votes (from 2 to 10)\": \"\u6700\u5927\u6295\u7968\u6570\uFF082\u304B\u308910\u307E\u3067\uFF09\",\n  \"Menu\": \"\u30E1\u30CB\u30E5\u30FC\",\n  \"Message deleted\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u524A\u9664\u3055\u308C\u307E\u3057\u305F\",\n  \"Message Failed \u00B7 Click to try again\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u5931\u6557\u3057\u307E\u3057\u305F \u00B7 \u30AF\u30EA\u30C3\u30AF\u3057\u3066\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\",\n  \"Message Failed \u00B7 Unauthorized\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u5931\u6557\u3057\u307E\u3057\u305F \u00B7 \u8A31\u53EF\u3055\u308C\u3066\u3044\u307E\u305B\u3093\",\n  \"Message has been successfully flagged\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u306B\u6B63\u5E38\u306B\u30D5\u30E9\u30B0\u304C\u4ED8\u3051\u3089\u308C\u307E\u3057\u305F\",\n  \"Message pinned\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u306B\u30D4\u30F3\u304C\u4ED8\u3051\u3089\u308C\u307E\u3057\u305F\",\n  \"Message was blocked by moderation policies\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u30E2\u30C7\u30EC\u30FC\u30B7\u30E7\u30F3\u30DD\u30EA\u30B7\u30FC\u306B\u3088\u3063\u3066\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u307E\u3057\u305F\",\n  \"Messages have been marked unread.\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u672A\u8AAD\u3068\u3057\u3066\u30DE\u30FC\u30AF\u3055\u308C\u307E\u3057\u305F\u3002\",\n  \"Missing permissions to upload the attachment\": \"\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3059\u308B\u305F\u3081\u306E\u8A31\u53EF\u304C\u3042\u308A\u307E\u305B\u3093\",\n  \"Multiple answers\": \"\u8907\u6570\u56DE\u7B54\",\n  \"Mute\": \"\u7121\u97F3\",\n  \"mute-command-args\": \"[@\u30E6\u30FC\u30B6\u540D]\",\n  \"mute-command-description\": \"\u30E6\u30FC\u30B6\u30FC\u3092\u30DF\u30E5\u30FC\u30C8\u3059\u308B\",\n  \"network error\": \"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\",\n  \"New\": \"\u65B0\u3057\u3044\",\n  \"New Messages!\": \"\u65B0\u3057\u3044\u30E1\u30C3\u30BB\u30FC\u30B8!\",\n  \"No chats here yet\u2026\": \"\u3053\u3053\u306B\u306F\u307E\u3060\u30C1\u30E3\u30C3\u30C8\u306F\u3042\u308A\u307E\u305B\u3093\u2026\",\n  \"No results found\": \"\u7D50\u679C\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\",\n  \"Nobody will be able to vote in this poll anymore.\": \"\u3053\u306E\u6295\u7968\u3067\u306F\u3001\u8AB0\u3082\u6295\u7968\u3067\u304D\u306A\u304F\u306A\u308A\u307E\u3059\u3002\",\n  \"Nothing yet...\": \"\u307E\u3060\u4F55\u3082\u3042\u308A\u307E\u305B\u3093...\",\n  \"Ok\": \"OK\",\n  \"Only numbers are allowed\": \"\u6570\u5B57\u306E\u307F\u8A31\u53EF\u3055\u308C\u3066\u3044\u307E\u3059\",\n  \"Open emoji picker\": \"\u7D75\u6587\u5B57\u30D4\u30C3\u30AB\u30FC\u3092\u958B\u304F\",\n  \"Option already exists\": \"\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\",\n  \"Option is empty\": \"\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u7A7A\u3067\u3059\",\n  \"Options\": \"\u30AA\u30D7\u30B7\u30E7\u30F3\",\n  \"People matching\": \"\u4E00\u81F4\u3059\u308B\u4EBA\",\n  \"Pin\": \"\u30D4\u30F3\",\n  \"Pinned by\": \"\u30D4\u30F3\u3057\u305F\u65B9\",\n  \"Poll\": \"\u6295\u7968\",\n  \"Poll comments\": \"\u6295\u7968\u30B3\u30E1\u30F3\u30C8\",\n  \"Poll options\": \"\u6295\u7968\u30AA\u30D7\u30B7\u30E7\u30F3\",\n  \"Poll results\": \"\u6295\u7968\u7D50\u679C\",\n  \"Question\": \"\u8CEA\u554F\",\n  \"Question is required\": \"\u8CEA\u554F\u306F\u5FC5\u9808\u3067\u3059\",\n  \"Quote\": \"\u5F15\u7528\",\n  \"Reached the vote limit. Remove an existing vote first.\": \"\u6295\u7968\u5236\u9650\u306B\u9054\u3057\u307E\u3057\u305F\u3002\u65E2\u5B58\u306E\u6295\u7968\u3092\u5148\u306B\u524A\u9664\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n  \"Recording format is not supported and cannot be reproduced\": \"\u9332\u97F3\u5F62\u5F0F\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u304A\u3089\u305A\u3001\u518D\u751F\u3067\u304D\u307E\u305B\u3093\",\n  \"Remind Me\": \"\u30EA\u30DE\u30A4\u30F3\u30C0\u30FC\",\n  \"Remove reminder\": \"\u30EA\u30DE\u30A4\u30F3\u30C0\u30FC\u3092\u524A\u9664\",\n  \"Reply\": \"\u8FD4\u4E8B\",\n  \"Reply to Message\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u306B\u8FD4\u4FE1\",\n  \"replyCount_one\": \"1\u4EF6\u306E\u8FD4\u4FE1\",\n  \"replyCount_other\": \"{{ count }} \u8FD4\u4FE1\",\n  \"Save for later\": \"\u5F8C\u3067\u4FDD\u5B58\",\n  \"Saved for later\": \"\u5F8C\u3067\u4FDD\u5B58\u6E08\u307F\",\n  \"Search\": \"\u63A2\u3059\",\n  \"search-results-header-filter-source-button-label--channels\": \"\u30C1\u30E3\u30F3\u30CD\u30EB\",\n  \"search-results-header-filter-source-button-label--messages\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\",\n  \"search-results-header-filter-source-button-label--users\": \"\u30E6\u30FC\u30B6\u30FC\",\n  \"Searching for {{ searchSourceType }}...\": \"{{ searchSourceType }}\u3092\u691C\u7D22\u4E2D...\",\n  \"Searching...\": \"\u691C\u7D22\u4E2D...\",\n  \"searchResultsCount_one\": \"1\u4EF6\u306E\u7D50\u679C\",\n  \"searchResultsCount_other\": \"{{ count }}\u4EF6\u306E\u7D50\u679C\",\n  \"See all options ({{count}})_other\": \"\u3059\u3079\u3066\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u898B\u308B ({{count}})\",\n  \"Select one\": \"1\u3064\u9078\u629E\",\n  \"Select one or more\": \"1\u3064\u4EE5\u4E0A\u9078\u629E\",\n  \"Select up to {{count}}_other\": \"\u6700\u5927{{count}}\u307E\u3067\u9078\u629E\",\n  \"Send\": \"\u9001\u4FE1\",\n  \"Send Anyway\": \"\u3068\u306B\u304B\u304F\u9001\u4FE1\u3059\u308B\",\n  \"Send message request failed\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u9001\u4FE1\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u5931\u6557\u3057\u307E\u3057\u305F\",\n  \"Sending...\": \"\u9001\u4FE1\u4E2D...\",\n  \"Sent\": \"\u9001\u4FE1\u6E08\u307F\",\n  \"Share\": \"\u5171\u6709\",\n  \"Share live location for\": \"\u30E9\u30A4\u30D6\u4F4D\u7F6E\u60C5\u5831\u3092\u5171\u6709\",\n  \"Share Location\": \"\u4F4D\u7F6E\u60C5\u5831\u3092\u5171\u6709\",\n  \"Shared live location\": \"\u5171\u6709\u3055\u308C\u305F\u30E9\u30A4\u30D6\u4F4D\u7F6E\u60C5\u5831\",\n  \"Show all\": \"\u3059\u3079\u3066\u8868\u793A\",\n  \"Shuffle\": \"\u30B7\u30E3\u30C3\u30D5\u30EB\",\n  \"size limit\": \"\u30B5\u30A4\u30BA\u5236\u9650\",\n  \"Slow Mode ON\": \"\u30B9\u30ED\u30FC\u30E2\u30FC\u30C9\u30AA\u30F3\",\n  \"Some of the files will not be accepted\": \"\u4E00\u90E8\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u53D7\u3051\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\",\n  \"Start typing to search\": \"\u691C\u7D22\u3059\u308B\u306B\u306F\u5165\u529B\u3092\u958B\u59CB\u3057\u3066\u304F\u3060\u3055\u3044\",\n  \"Stop sharing\": \"\u5171\u6709\u3092\u505C\u6B62\",\n  \"Submit\": \"\u9001\u4FE1\",\n  \"Suggest an option\": \"\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u63D0\u6848\",\n  \"Thinking...\": \"\u8003\u3048\u4E2D...\",\n  \"this content could not be displayed\": \"\u3053\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u306F\u8868\u793A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\",\n  \"This field cannot be empty or contain only spaces\": \"\u3053\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\u306F\u7A7A\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002\u307E\u305F\u3001\u7A7A\u767D\u6587\u5B57\u306E\u307F\u3092\u542B\u3080\u3053\u3068\u3082\u3067\u304D\u307E\u305B\u3093\",\n  \"This message did not meet our content guidelines\": \"\u3053\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u30B3\u30F3\u30C6\u30F3\u30C4\u30AC\u30A4\u30C9\u30E9\u30A4\u30F3\u306B\u9069\u5408\u3057\u3066\u3044\u307E\u305B\u3093\",\n  \"This message was deleted...\": \"\u3053\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u524A\u9664\u3055\u308C\u307E\u3057\u305F...\",\n  \"Thread\": \"\u30B9\u30EC\u30C3\u30C9\",\n  \"Thread has not been found\": \"\u30B9\u30EC\u30C3\u30C9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\",\n  \"Thread reply\": \"\u30B9\u30EC\u30C3\u30C9\u306E\u8FD4\u4FE1\",\n  \"timestamp/DateSeparator\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/LiveLocation\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/MessageTimestamp\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/PollVote\": \"{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}\",\n  \"timestamp/PollVoteTooltip\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/ReminderNotification\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/SystemMessage\": \"{{ timestamp | timestampFormatter(format: dddd L) }}\",\n  \"To start recording, allow the camera access in your browser\": \"\u9332\u97F3\u3092\u958B\u59CB\u3059\u308B\u306B\u306F\u3001\u30D6\u30E9\u30A6\u30B6\u30FC\u3067\u30AB\u30E1\u30E9\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u8A31\u53EF\u3057\u3066\u304F\u3060\u3055\u3044\",\n  \"To start recording, allow the microphone access in your browser\": \"\u9332\u97F3\u3092\u958B\u59CB\u3059\u308B\u306B\u306F\u3001\u30D6\u30E9\u30A6\u30B6\u30FC\u3067\u30DE\u30A4\u30AF\u30ED\u30D5\u30A9\u30F3\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u8A31\u53EF\u3057\u3066\u304F\u3060\u3055\u3044\",\n  \"translationBuilderTopic/notification\": \"{{value, notification}}\",\n  \"Type a number from 2 to 10\": \"2\u304B\u308910\u307E\u3067\u306E\u6570\u5B57\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\",\n  \"Type your message\": \"\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\",\n  \"Unarchive\": \"\u30A2\u30FC\u30AB\u30A4\u30D6\u89E3\u9664\",\n  \"unban-command-args\": \"[@\u30E6\u30FC\u30B6\u540D]\",\n  \"unban-command-description\": \"\u30E6\u30FC\u30B6\u30FC\u306E\u7981\u6B62\u3092\u89E3\u9664\u3059\u308B\",\n  \"unknown error\": \"\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\",\n  \"Unmute\": \"\u7121\u97F3\u3092\u89E3\u9664\u3059\u308B\",\n  \"unmute-command-args\": \"[@\u30E6\u30FC\u30B6\u540D]\",\n  \"unmute-command-description\": \"\u30E6\u30FC\u30B6\u30FC\u306E\u30DF\u30E5\u30FC\u30C8\u3092\u89E3\u9664\u3059\u308B\",\n  \"Unpin\": \"\u30D4\u30F3\u3092\u89E3\u9664\u3059\u308B\",\n  \"Unread messages\": \"\u672A\u8AAD\u30E1\u30C3\u30BB\u30FC\u30B8\",\n  \"unreadMessagesSeparatorText_other\": \"\u672A\u8AAD\u30E1\u30C3\u30BB\u30FC\u30B8 {{count}} \u4EF6\",\n  \"Unsupported attachment\": \"\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u306A\u3044\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB\",\n  \"unsupported file type\": \"\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u306A\u3044\u30D5\u30A1\u30A4\u30EB\u5F62\u5F0F\",\n  \"Update your comment\": \"\u30B3\u30E1\u30F3\u30C8\u3092\u66F4\u65B0\",\n  \"Upload type: \\\"{{ type }}\\\" is not allowed\": \"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u30BF\u30A4\u30D7\uFF1A\\\"{{ type }}\\\"\u306F\u8A31\u53EF\u3055\u308C\u3066\u3044\u307E\u305B\u3093\",\n  \"User uploaded content\": \"\u30E6\u30FC\u30B6\u30FC\u304C\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3057\u305F\u30B3\u30F3\u30C6\u30F3\u30C4\",\n  \"View {{count}} comments_other\": \"{{count}} \u30B3\u30E1\u30F3\u30C8\u3092\u8868\u793A\",\n  \"View results\": \"\u7D50\u679C\u3092\u8868\u793A\",\n  \"Voice message\": \"\u30DC\u30A4\u30B9\u30E1\u30C3\u30BB\u30FC\u30B8\",\n  \"Vote ended\": \"\u6295\u7968\u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\",\n  \"Wait until all attachments have uploaded\": \"\u3059\u3079\u3066\u306E\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB\u304C\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3055\u308C\u308B\u307E\u3067\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\",\n  \"You\": \"\u3042\u306A\u305F\",\n  \"You have no channels currently\": \"\u73FE\u5728\u30C1\u30E3\u30F3\u30CD\u30EB\u306F\u3042\u308A\u307E\u305B\u3093\",\n  \"You've reached the maximum number of files\": \"\u30D5\u30A1\u30A4\u30EB\u306E\u6700\u5927\u6570\u306B\u9054\u3057\u307E\u3057\u305F\"\n}\n", "{\n  \"{{ commaSeparatedUsers }} and {{ moreCount }} more\": \"{{ commaSeparatedUsers }} \uADF8\uB9AC\uACE0 {{ moreCount }}\uBA85 \uB354\",\n  \"{{ commaSeparatedUsers }}, and {{ lastUser }}\": \"{{ commaSeparatedUsers }} \uADF8\uB9AC\uACE0 {{ lastUser }}\",\n  \"{{ firstUser }} and {{ secondUser }}\": \"{{ firstUser }} \uADF8\uB9AC\uACE0 {{ secondUser }}\",\n  \"{{ imageCount }} more\": \"{{ imageCount }}\uAC1C \uB354\",\n  \"{{ memberCount }} members\": \"{{ memberCount }}\uBA85\",\n  \"{{ user }} has been muted\": \"{{ user }} \uC74C\uC18C\uAC70\uB418\uC5C8\uC2B5\uB2C8\uB2E4\",\n  \"{{ user }} has been unmuted\": \"{{ user }} \uC74C\uC18C\uAC70\uAC00 \uD574\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4\",\n  \"{{ user }} is typing...\": \"{{ user }}\uC774(\uAC00) \uC785\uB825 \uC911\uC785\uB2C8\uB2E4...\",\n  \"{{ users }} and {{ user }} are typing...\": \"{{ users }}\uC640(\uACFC) {{ user }}\uC774(\uAC00) \uC785\uB825 \uC911\uC785\uB2C8\uB2E4...\",\n  \"{{ users }} and more are typing...\": \"{{ users }}\uC640(\uACFC) \uB354 \uB9CE\uC740 \uC0AC\uB78C\uB4E4\uC774 \uC785\uB825 \uC911\uC785\uB2C8\uB2E4...\",\n  \"{{ watcherCount }} online\": \"{{ watcherCount }} \uC628\uB77C\uC778\",\n  \"{{count}} unread_other\": \"{{count}} \uC77D\uC9C0 \uC54A\uC74C\",\n  \"{{count}} votes_other\": \"{{count}} \uD22C\uD45C\",\n  \"\uD83C\uDFD9 Attachment...\": \"\uD83C\uDFD9 \uBD80\uCC29...\",\n  \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\": \"\uD83D\uDCCA {{createdBy}}\uC774(\uAC00) \uC0DD\uC131\uD568: {{ pollName}}\",\n  \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\": \"\uD83D\uDCCA {{votedBy}}\uC774(\uAC00) \uD22C\uD45C\uD568: {{pollOptionText}}\",\n  \"\uD83D\uDCCDShared location\": \"\uD83D\uDCCD\uACF5\uC720\uB41C \uC704\uCE58\",\n  \"Add a comment\": \"\uB313\uAE00 \uCD94\uAC00\",\n  \"Add an option\": \"\uC635\uC158 \uCD94\uAC00\",\n  \"All results loaded\": \"\uBAA8\uB4E0 \uACB0\uACFC\uAC00 \uB85C\uB4DC\uB418\uC5C8\uC2B5\uB2C8\uB2E4\",\n  \"Allow access to camera\": \"\uCE74\uBA54\uB77C\uC5D0 \uB300\uD55C \uC561\uC138\uC2A4 \uD5C8\uC6A9\",\n  \"Allow access to microphone\": \"\uB9C8\uC774\uD06C\uB85C\uD3F0\uC5D0 \uB300\uD55C \uC561\uC138\uC2A4 \uD5C8\uC6A9\",\n  \"Allow comments\": \"\uB313\uAE00 \uD5C8\uC6A9\",\n  \"Allow option suggestion\": \"\uC635\uC158 \uC81C\uC548 \uD5C8\uC6A9\",\n  \"Also send as a direct message\": \"\uB2E4\uC774\uB809\uD2B8 \uBA54\uC2DC\uC9C0\uB85C\uB3C4 \uBCF4\uB0B4\uAE30\",\n  \"Also send in channel\": \"\uCC44\uB110\uC5D0\uB3C4 \uBCF4\uB0B4\uAE30\",\n  \"An error has occurred during recording\": \"\uB179\uC74C \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4\",\n  \"An error has occurred during the recording processing\": \"\uB179\uC74C \uCC98\uB9AC \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4\",\n  \"Anonymous\": \"\uC775\uBA85\",\n  \"Anonymous poll\": \"\uC775\uBA85 \uD22C\uD45C\",\n  \"Archive\": \"\uC544\uCE74\uC774\uBE0C\",\n  \"aria/Attachment\": \"\uCCA8\uBD80 \uD30C\uC77C\",\n  \"aria/Cancel Reply\": \"\uB2F5\uC7A5 \uCDE8\uC18C\",\n  \"aria/Cancel upload\": \"\uC5C5\uB85C\uB4DC \uCDE8\uC18C\",\n  \"aria/Channel list\": \"\uCC44\uB110 \uBAA9\uB85D\",\n  \"aria/Channel search results\": \"\uCC44\uB110 \uAC80\uC0C9 \uACB0\uACFC\",\n  \"aria/Close thread\": \"\uC2A4\uB808\uB4DC \uB2EB\uAE30\",\n  \"aria/Download attachment\": \"\uCCA8\uBD80 \uD30C\uC77C \uB2E4\uC6B4\uB85C\uB4DC\",\n  \"aria/Emoji picker\": \"\uC774\uBAA8\uC9C0 \uC120\uD0DD\uAE30\",\n  \"aria/File input\": \"\uD30C\uC77C \uC785\uB825\",\n  \"aria/File upload\": \"\uD30C\uC77C \uC5C5\uB85C\uB4DC\",\n  \"aria/Image input\": \"\uC774\uBBF8\uC9C0 \uC785\uB825\",\n  \"aria/Load More Channels\": \"\uB354 \uB9CE\uC740 \uCC44\uB110 \uBD88\uB7EC\uC624\uAE30\",\n  \"aria/Menu\": \"\uBA54\uB274\",\n  \"aria/Message Options\": \"\uBA54\uC2DC\uC9C0 \uC635\uC158\",\n  \"aria/Open Attachment Selector\": \"\uCCA8\uBD80 \uD30C\uC77C \uC120\uD0DD\uAE30 \uC5F4\uAE30\",\n  \"aria/Open Menu\": \"\uBA54\uB274 \uC5F4\uAE30\",\n  \"aria/Open Message Actions Menu\": \"\uBA54\uC2DC\uC9C0 \uC561\uC158 \uBA54\uB274 \uC5F4\uAE30\",\n  \"aria/Open Reaction Selector\": \"\uBC18\uC751 \uC120\uD0DD\uAE30 \uC5F4\uAE30\",\n  \"aria/Open Thread\": \"\uC2A4\uB808\uB4DC \uC5F4\uAE30\",\n  \"aria/Reaction list\": \"\uBC18\uC751 \uBAA9\uB85D\",\n  \"aria/Remind Me Options\": \"\uC54C\uB9BC \uC635\uC158\",\n  \"aria/Remove attachment\": \"\uCCA8\uBD80 \uD30C\uC77C \uC81C\uAC70\",\n  \"aria/Remove location attachment\": \"\uC704\uCE58 \uCCA8\uBD80 \uD30C\uC77C \uC81C\uAC70\",\n  \"aria/Retry upload\": \"\uC5C5\uB85C\uB4DC \uB2E4\uC2DC \uC2DC\uB3C4\",\n  \"aria/Search results\": \"\uAC80\uC0C9 \uACB0\uACFC\",\n  \"aria/Search results header filter button\": \"\uAC80\uC0C9 \uACB0\uACFC \uD5E4\uB354 \uD544\uD130 \uBC84\uD2BC\",\n  \"aria/Send\": \"\uBCF4\uB0B4\uAE30\",\n  \"aria/Stop AI Generation\": \"AI \uC0DD\uC131 \uC911\uC9C0\",\n  \"Ask a question\": \"\uC9C8\uBB38\uD558\uAE30\",\n  \"Attach\": \"\uCCA8\uBD80\",\n  \"Attach files\": \"\uD30C\uC77C \uCCA8\uBD80\",\n  \"Attachment upload blocked due to {{reason}}\": \"{{reason}}\uB85C \uC778\uD574 \uCCA8\uBD80 \uD30C\uC77C \uC5C5\uB85C\uB4DC\uAC00 \uCC28\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4\",\n  \"Attachment upload failed due to {{reason}}\": \"{{reason}}\uB85C \uC778\uD574 \uCCA8\uBD80 \uD30C\uC77C \uC5C5\uB85C\uB4DC\uAC00 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4\",\n  \"ban-command-args\": \"[@\uC0AC\uC6A9\uC790\uC774\uB984] [\uD14D\uC2A4\uD2B8]\",\n  \"ban-command-description\": \"\uC0AC\uC6A9\uC790\uB97C \uCC28\uB2E8\",\n  \"Cancel\": \"\uCDE8\uC18C\",\n  \"Cannot seek in the recording\": \"\uB179\uC74C\uC5D0\uC11C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4\",\n  \"Channel Missing\": \"\uCC44\uB110 \uB204\uB77D\",\n  \"Close\": \"\uB2EB\uAE30\",\n  \"Close emoji picker\": \"\uC774\uBAA8\uD2F0\uCF58 \uC120\uD0DD\uAE30 \uB2EB\uAE30\",\n  \"Commands matching\": \"\uC77C\uCE58\uD558\uB294 \uBA85\uB839\",\n  \"Connection failure, reconnecting now...\": \"\uC5F0\uACB0 \uC2E4\uD328, \uC9C0\uAE08 \uB2E4\uC2DC \uC5F0\uACB0 \uC911...\",\n  \"Create\": \"\uC0DD\uC131\",\n  \"Create poll\": \"\uD22C\uD45C \uC0DD\uC131\",\n  \"Current location\": \"\uD604\uC7AC \uC704\uCE58\",\n  \"Delete\": \"\uC0AD\uC81C\",\n  \"Delete for me\": \"\uB098\uB9CC \uC0AD\uC81C\",\n  \"Delivered\": \"\uBC30\uB2EC\uB428\",\n  \"Download attachment {{ name }}\": \"\uCCA8\uBD80 \uD30C\uC77C {{ name }} \uB2E4\uC6B4\uB85C\uB4DC\",\n  \"Drag your files here\": \"\uC5EC\uAE30\uB85C \uD30C\uC77C\uC744 \uB04C\uC5B4\uB2E4 \uB193\uC73C\uC138\uC694\",\n  \"Drag your files here to add to your post\": \"\uAC8C\uC2DC\uBB3C\uC5D0 \uCD94\uAC00\uD558\uB824\uBA74 \uD30C\uC77C\uC744 \uC5EC\uAE30\uB85C \uB04C\uC5B4\uB2E4 \uB193\uC73C\uC138\uC694\",\n  \"Due {{ timeLeft }}\": \"{{ timeLeft }}\uC5D0 \uAE30\uD55C\",\n  \"Due since {{ dueSince }}\": \"{{ dueSince }}\uBD80\uD130 \uAE30\uD55C\",\n  \"duration/Message reminder\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Remind Me\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Share Location\": \"{{ milliseconds | durationFormatter }}\",\n  \"Edit Message\": \"\uBA54\uC2DC\uC9C0 \uC218\uC815\",\n  \"Edit message request failed\": \"\uBA54\uC2DC\uC9C0 \uC218\uC815 \uC694\uCCAD \uC2E4\uD328\",\n  \"Edited\": \"\uD3B8\uC9D1\uB428\",\n  \"Emoji matching\": \"\uC774\uBAA8\uD2F0\uCF58 \uB9E4\uCE6D\",\n  \"Empty message...\": \"\uBE48 \uBA54\uC2DC\uC9C0...\",\n  \"End\": \"\uC885\uB8CC\",\n  \"End vote\": \"\uD22C\uD45C \uC885\uB8CC\",\n  \"Enforce unique vote is enabled\": \"\uACE0\uC720 \uD22C\uD45C\uAC00 \uD65C\uC131\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4\",\n  \"Error\": \"\uC624\uB958\",\n  \"Error \u00B7 Unsent\": \"\uC624\uB958 \u00B7 \uC804\uC1A1\uB418\uC9C0 \uC54A\uC74C\",\n  \"Error adding flag\": \"\uD50C\uB798\uADF8\uB97C \uCD94\uAC00\uD558\uB294 \uB3D9\uC548 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\",\n  \"Error connecting to chat, refresh the page to try again.\": \"\uCC44\uD305\uC5D0 \uC5F0\uACB0\uD558\uB294 \uB3D9\uC548 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uD398\uC774\uC9C0\uB97C \uC0C8\uB85C\uACE0\uCE68\uD558\uC5EC \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.\",\n  \"Error deleting message\": \"\uBA54\uC2DC\uC9C0\uB97C \uC0AD\uC81C\uD558\uB294 \uC911\uC5D0 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\",\n  \"Error fetching reactions\": \"\uBC18\uC751 \uB85C\uB529 \uC624\uB958.\",\n  \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\": \"\uBA54\uC2DC\uC9C0\uB97C \uC77D\uC9C0 \uC54A\uC74C\uC73C\uB85C \uD45C\uC2DC\uD558\uB294 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uAC00\uC7A5 \uCD5C\uADFC 100\uAC1C\uC758 \uCC44\uB110 \uBA54\uC2DC\uC9C0\uBCF4\uB2E4 \uC624\uB798\uB41C \uC77D\uC9C0 \uC54A\uC740 \uBA54\uC2DC\uC9C0\uB294 \uD45C\uC2DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\",\n  \"Error muting a user ...\": \"\uC0AC\uC6A9\uC790\uB97C \uC74C\uC18C\uAC70\uD558\uB294 \uC911\uC5D0 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4...\",\n  \"Error pinning message\": \"\uBA54\uC2DC\uC9C0\uB97C \uD540\uD558\uB294 \uC911\uC5D0 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\",\n  \"Error removing message pin\": \"\uBA54\uC2DC\uC9C0 \uD540\uC744 \uC81C\uAC70\uD558\uB294 \uC911\uC5D0 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\",\n  \"Error reproducing the recording\": \"\uB179\uC74C \uC7AC\uC0DD \uC911 \uC624\uB958 \uBC1C\uC0DD\",\n  \"Error starting recording\": \"\uB179\uC74C \uC2DC\uC791 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4\",\n  \"Error unmuting a user ...\": \"\uC0AC\uC6A9\uC790 \uC74C\uC18C\uAC70 \uD574\uC81C \uC911 \uC624\uB958 \uBC1C\uC0DD...\",\n  \"Error uploading attachment\": \"\uCCA8\uBD80 \uD30C\uC77C \uC5C5\uB85C\uB4DC \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4\",\n  \"Error uploading file\": \"\uD30C\uC77C \uC5C5\uB85C\uB4DC \uC624\uB958\",\n  \"Error uploading image\": \"\uC774\uBBF8\uC9C0\uB97C \uC5C5\uB85C\uB4DC\uD558\uB294 \uB3D9\uC548 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\",\n  \"Error: {{ errorMessage }}\": \"\uC624\uB958: {{ errorMessage }}\",\n  \"Failed to create the poll\": \"\uD22C\uD45C \uC0DD\uC131 \uC2E4\uD328\",\n  \"Failed to create the poll due to {{reason}}\": \"{{reason}} \uB54C\uBB38\uC5D0 \uD22C\uD45C\uB97C \uC0DD\uC131\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4\",\n  \"Failed to jump to the first unread message\": \"\uCCAB \uBC88\uC9F8 \uC77D\uC9C0 \uC54A\uC740 \uBA54\uC2DC\uC9C0\uB85C \uC774\uB3D9\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4\",\n  \"Failed to mark channel as read\": \"\uCC44\uB110\uC744 \uC77D\uC74C\uC73C\uB85C \uD45C\uC2DC\uD558\uB294 \uB370 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4\",\n  \"Failed to play the recording\": \"\uB179\uC74C\uC744 \uC7AC\uC0DD\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4\",\n  \"Failed to retrieve location\": \"\uC704\uCE58\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4\",\n  \"Failed to share location\": \"\uC704\uCE58\uB97C \uACF5\uC720\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4\",\n  \"File\": \"\uD30C\uC77C\",\n  \"File is too large: {{ size }}, maximum upload size is {{ limit }}\": \"\uD30C\uC77C\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4: {{ size }}, \uCD5C\uB300 \uC5C5\uB85C\uB4DC \uD06C\uAE30\uB294 {{ limit }}\uC785\uB2C8\uB2E4\",\n  \"Flag\": \"\uD50C\uB798\uADF8\",\n  \"Generating...\": \"\uC0DD\uC131 \uC911...\",\n  \"giphy-command-args\": \"[\uD14D\uC2A4\uD2B8]\",\n  \"giphy-command-description\": \"\uCC44\uB110\uC5D0 \uBB34\uC791\uC704 GIF \uAC8C\uC2DC\",\n  \"Latest Messages\": \"\uCD5C\uC2E0 \uBA54\uC2DC\uC9C0\",\n  \"live\": \"\uB77C\uC774\uBE0C\",\n  \"Live for {{duration}}\": \"{{duration}} \uB3D9\uC548 \uB77C\uC774\uBE0C\",\n  \"Live location\": \"\uB77C\uC774\uBE0C \uC704\uCE58\",\n  \"Live until {{ timestamp }}\": \"{{ timestamp }}\uAE4C\uC9C0 \uB77C\uC774\uBE0C\",\n  \"Load more\": \"\uB354 \uBD88\uB7EC\uC624\uAE30\",\n  \"Location\": \"\uC704\uCE58\",\n  \"Location sharing ended\": \"\uC704\uCE58 \uACF5\uC720\uAC00 \uC885\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4\",\n  \"Mark as unread\": \"\uC77D\uC9C0 \uC54A\uC74C\uC73C\uB85C \uD45C\uC2DC\",\n  \"Maximum number of votes (from 2 to 10)\": \"\uCD5C\uB300 \uD22C\uD45C \uC218 (2\uC5D0\uC11C 10\uAE4C\uC9C0)\",\n  \"Menu\": \"\uBA54\uB274\",\n  \"Message deleted\": \"\uBA54\uC2DC\uC9C0\uAC00 \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\",\n  \"Message Failed \u00B7 Click to try again\": \"\uBA54\uC2DC\uC9C0 \uC2E4\uD328 \u00B7 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uB824\uBA74 \uD074\uB9AD\uD558\uC138\uC694.\",\n  \"Message Failed \u00B7 Unauthorized\": \"\uBA54\uC2DC\uC9C0 \uC2E4\uD328 \u00B7 \uC2B9\uC778\uB418\uC9C0 \uC54A\uC74C\",\n  \"Message has been successfully flagged\": \"\uBA54\uC2DC\uC9C0\uC5D0 \uD50C\uB798\uADF8\uAC00 \uC9C0\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\",\n  \"Message pinned\": \"\uBA54\uC2DC\uC9C0 \uD540\uD588\uC2B5\uB2C8\uB2E4\",\n  \"Message was blocked by moderation policies\": \"\uBA54\uC2DC\uC9C0\uAC00 \uAD00\uB9AC \uC815\uCC45\uC5D0 \uC758\uD574 \uCC28\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\",\n  \"Messages have been marked unread.\": \"\uBA54\uC2DC\uC9C0\uAC00 \uC77D\uC9C0 \uC54A\uC74C\uC73C\uB85C \uD45C\uC2DC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\",\n  \"Missing permissions to upload the attachment\": \"\uCCA8\uBD80 \uD30C\uC77C\uC744 \uC5C5\uB85C\uB4DC\uD558\uB824\uBA74 \uAD8C\uD55C\uC774 \uD544\uC694\uD569\uB2C8\uB2E4\",\n  \"Multiple answers\": \"\uBCF5\uC218 \uC751\uB2F5\",\n  \"Mute\": \"\uBB34\uC74C\",\n  \"mute-command-args\": \"[@\uC0AC\uC6A9\uC790\uC774\uB984]\",\n  \"mute-command-description\": \"\uC0AC\uC6A9\uC790 \uC74C\uC18C\uAC70\",\n  \"network error\": \"\uB124\uD2B8\uC6CC\uD06C \uC624\uB958\",\n  \"New\": \"\uC0C8\uB85C\uC6B4\",\n  \"New Messages!\": \"\uC0C8 \uBA54\uC2DC\uC9C0!\",\n  \"No chats here yet\u2026\": \"\uC544\uC9C1 \uCC44\uD305\uC774 \uC5C6\uC2B5\uB2C8\uB2E4...\",\n  \"No results found\": \"\uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4\",\n  \"Nobody will be able to vote in this poll anymore.\": \"\uC774 \uD22C\uD45C\uC5D0 \uB354 \uC774\uC0C1 \uC544\uBB34\uB3C4 \uD22C\uD45C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\",\n  \"Nothing yet...\": \"\uC544\uC9C1 \uC544\uBB34\uAC83\uB3C4...\",\n  \"Ok\": \"\uD655\uC778\",\n  \"Only numbers are allowed\": \"\uC22B\uC790\uB9CC \uC785\uB825 \uAC00\uB2A5\uD569\uB2C8\uB2E4\",\n  \"Open emoji picker\": \"\uC774\uBAA8\uC9C0 \uC120\uD0DD\uAE30 \uC5F4\uAE30\",\n  \"Option already exists\": \"\uC635\uC158\uC774 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4\",\n  \"Option is empty\": \"\uC635\uC158\uC774 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4\",\n  \"Options\": \"\uC635\uC158\",\n  \"People matching\": \"\uC77C\uCE58\uD558\uB294 \uC0AC\uB78C\",\n  \"Pin\": \"\uD540\",\n  \"Pinned by\": \"\uD540\uD588\uB358 \uBD84:\",\n  \"Poll\": \"\uD22C\uD45C\",\n  \"Poll comments\": \"\uD22C\uD45C \uB313\uAE00\",\n  \"Poll options\": \"\uD22C\uD45C \uC635\uC158\",\n  \"Poll results\": \"\uD22C\uD45C \uACB0\uACFC\",\n  \"Question\": \"\uC9C8\uBB38\",\n  \"Question is required\": \"\uC9C8\uBB38\uC774 \uD544\uC694\uD569\uB2C8\uB2E4\",\n  \"Quote\": \"\uC778\uC6A9\",\n  \"Reached the vote limit. Remove an existing vote first.\": \"\uD22C\uD45C \uD55C\uB3C4\uC5D0 \uB3C4\uB2EC\uD588\uC2B5\uB2C8\uB2E4. \uAE30\uC874 \uD22C\uD45C\uB97C \uBA3C\uC800 \uC81C\uAC70\uD558\uC138\uC694.\",\n  \"Recording format is not supported and cannot be reproduced\": \"\uB179\uC74C \uD615\uC2DD\uC774 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uC7AC\uC0DD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4\",\n  \"Remind Me\": \"\uC54C\uB9BC \uC124\uC815\",\n  \"Remove reminder\": \"\uC54C\uB9BC \uC81C\uAC70\",\n  \"Reply\": \"\uB2F5\uC7A5\",\n  \"Reply to Message\": \"\uBA54\uC2DC\uC9C0\uC5D0 \uB2F5\uC7A5\",\n  \"replyCount_one\": \"\uB2F5\uC7A5 1\uAC1C\",\n  \"replyCount_other\": \"{{ count }} \uB2F5\uC7A5\",\n  \"Save for later\": \"\uB098\uC911\uC5D0 \uC800\uC7A5\",\n  \"Saved for later\": \"\uB098\uC911\uC5D0 \uC800\uC7A5\uB428\",\n  \"Search\": \"\uCC3E\uB2E4\",\n  \"search-results-header-filter-source-button-label--channels\": \"\uCC44\uB110\",\n  \"search-results-header-filter-source-button-label--messages\": \"\uBA54\uC2DC\uC9C0\",\n  \"search-results-header-filter-source-button-label--users\": \"\uC0AC\uC6A9\uC790\",\n  \"Searching for {{ searchSourceType }}...\": \"{{ searchSourceType }} \uAC80\uC0C9 \uC911...\",\n  \"Searching...\": \"\uC218\uC0C9...\",\n  \"searchResultsCount_one\": \"1\uAC1C\uC758 \uACB0\uACFC\",\n  \"searchResultsCount_other\": \"{{ count }}\uAC1C \uACB0\uACFC\",\n  \"See all options ({{count}})_other\": \"\uBAA8\uB4E0 \uC635\uC158 \uBCF4\uAE30 ({{count}})\",\n  \"Select one\": \"\uD558\uB098 \uC120\uD0DD\",\n  \"Select one or more\": \"\uD558\uB098 \uC774\uC0C1 \uC120\uD0DD\",\n  \"Select up to {{count}}_other\": \"{{count}}\uAC1C\uAE4C\uC9C0 \uC120\uD0DD\",\n  \"Send\": \"\uBCF4\uB0B4\uB2E4\",\n  \"Send Anyway\": \"\uC5B4\uCA0C\uB4E0 \uBCF4\uB0B4\uAE30\",\n  \"Send message request failed\": \"\uBA54\uC2DC\uC9C0 \uBCF4\uB0B4\uAE30 \uC694\uCCAD \uC2E4\uD328\",\n  \"Sending...\": \"\uBC30\uC0C1\uC911...\",\n  \"Sent\": \"\uC804\uC1A1\uB428\",\n  \"Share\": \"\uACF5\uC720\",\n  \"Share live location for\": \"\uB77C\uC774\uBE0C \uC704\uCE58 \uACF5\uC720\",\n  \"Share Location\": \"\uC704\uCE58 \uACF5\uC720\",\n  \"Shared live location\": \"\uACF5\uC720\uB41C \uB77C\uC774\uBE0C \uC704\uCE58\",\n  \"Show all\": \"\uBAA8\uB450 \uBCF4\uAE30\",\n  \"Shuffle\": \"\uC154\uD50C\",\n  \"size limit\": \"\uD06C\uAE30 \uC81C\uD55C\",\n  \"Slow Mode ON\": \"\uC2AC\uB85C\uC6B0 \uBAA8\uB4DC \uCF1C\uC9D0\",\n  \"Some of the files will not be accepted\": \"\uC77C\uBD80 \uD30C\uC77C\uC740 \uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4\",\n  \"Start typing to search\": \"\uAC80\uC0C9\uD558\uB824\uBA74 \uC785\uB825\uC744 \uC2DC\uC791\uD558\uC138\uC694\",\n  \"Stop sharing\": \"\uACF5\uC720 \uC911\uC9C0\",\n  \"Submit\": \"\uC81C\uCD9C\",\n  \"Suggest an option\": \"\uC635\uC158 \uC81C\uC548\",\n  \"Thinking...\": \"\uC0DD\uAC01 \uC911...\",\n  \"this content could not be displayed\": \"\uC774 \uCF58\uD150\uCE20\uB97C \uD45C\uC2DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4\",\n  \"This field cannot be empty or contain only spaces\": \"\uC774 \uD544\uB4DC\uB294 \uBE44\uC6CC\uB458 \uC218 \uC5C6\uC73C\uBA70 \uACF5\uBC31\uB9CC \uD3EC\uD568\uD560 \uC218\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4\",\n  \"This message did not meet our content guidelines\": \"\uC774 \uBA54\uC2DC\uC9C0\uB294 \uCF58\uD150\uCE20 \uAC00\uC774\uB4DC\uB77C\uC778\uC744 \uCDA9\uC871\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\",\n  \"This message was deleted...\": \"\uC774 \uBA54\uC2DC\uC9C0\uB294 \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4...\",\n  \"Thread\": \"\uC2A4\uB808\uB4DC\",\n  \"Thread has not been found\": \"\uC2A4\uB808\uB4DC\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4\",\n  \"Thread reply\": \"\uC2A4\uB808\uB4DC \uB2F5\uC7A5\",\n  \"timestamp/DateSeparator\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/LiveLocation\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/MessageTimestamp\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/PollVote\": \"{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}\",\n  \"timestamp/PollVoteTooltip\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/ReminderNotification\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/SystemMessage\": \"{{ timestamp | timestampFormatter(format: dddd L) }}\",\n  \"To start recording, allow the camera access in your browser\": \"\uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uCE74\uBA54\uB77C \uC561\uC138\uC2A4\uB97C \uD5C8\uC6A9\uD558\uC5EC \uB179\uC74C\uC744 \uC2DC\uC791\uD569\uB2C8\uB2E4\",\n  \"To start recording, allow the microphone access in your browser\": \"\uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uB9C8\uC774\uD06C\uB85C\uD3F0 \uC561\uC138\uC2A4\uB97C \uD5C8\uC6A9\uD558\uC5EC \uB179\uC74C\uC744 \uC2DC\uC791\uD569\uB2C8\uB2E4\",\n  \"translationBuilderTopic/notification\": \"{{value, notification}}\",\n  \"Type a number from 2 to 10\": \"2\uC5D0\uC11C 10 \uC0AC\uC774\uC758 \uC22B\uC790\uB97C \uC785\uB825\uD558\uC138\uC694\",\n  \"Type your message\": \"\uBA54\uC2DC\uC9C0 \uC785\uB825\",\n  \"Unarchive\": \"\uC544\uCE74\uC774\uBE0C \uD574\uC81C\",\n  \"unban-command-args\": \"[@\uC0AC\uC6A9\uC790\uC774\uB984]\",\n  \"unban-command-description\": \"\uC0AC\uC6A9\uC790 \uCC28\uB2E8 \uD574\uC81C\",\n  \"unknown error\": \"\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\",\n  \"Unmute\": \"\uC74C\uC18C\uAC70 \uD574\uC81C\",\n  \"unmute-command-args\": \"[@\uC0AC\uC6A9\uC790\uC774\uB984]\",\n  \"unmute-command-description\": \"\uC0AC\uC6A9\uC790 \uC74C\uC18C\uAC70 \uD574\uC81C\",\n  \"Unpin\": \"\uD540 \uD574\uC81C\",\n  \"Unread messages\": \"\uC77D\uC9C0 \uC54A\uC740 \uBA54\uC2DC\uC9C0\",\n  \"unreadMessagesSeparatorText_other\": \"\uC77D\uC9C0 \uC54A\uC740 \uBA54\uC2DC\uC9C0 {{count}}\uAC1C\",\n  \"Unsupported attachment\": \"\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uCCA8\uBD80 \uD30C\uC77C\",\n  \"unsupported file type\": \"\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uD30C\uC77C \uD615\uC2DD\",\n  \"Update your comment\": \"\uB313\uAE00 \uC5C5\uB370\uC774\uD2B8\",\n  \"Upload type: \\\"{{ type }}\\\" is not allowed\": \"\uC5C5\uB85C\uB4DC \uC720\uD615: \\\"{{ type }}\\\"\uC740(\uB294) \uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\",\n  \"User uploaded content\": \"\uC0AC\uC6A9\uC790 \uC5C5\uB85C\uB4DC \uCF58\uD150\uCE20\",\n  \"View {{count}} comments_other\": \"{{count}}\uAC1C\uC758 \uB313\uAE00 \uBCF4\uAE30\",\n  \"View results\": \"\uACB0\uACFC \uBCF4\uAE30\",\n  \"Voice message\": \"\uC74C\uC131 \uBA54\uC2DC\uC9C0\",\n  \"Vote ended\": \"\uD22C\uD45C \uC885\uB8CC\",\n  \"Wait until all attachments have uploaded\": \"\uBAA8\uB4E0 \uCCA8\uBD80 \uD30C\uC77C\uC774 \uC5C5\uB85C\uB4DC\uB420 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9BD\uB2C8\uB2E4.\",\n  \"You\": \"\uB2F9\uC2E0\",\n  \"You have no channels currently\": \"\uD604\uC7AC \uCC44\uB110\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.\",\n  \"You've reached the maximum number of files\": \"\uCD5C\uB300 \uD30C\uC77C \uC218\uC5D0 \uB3C4\uB2EC\uD588\uC2B5\uB2C8\uB2E4.\"\n}\n", "{\n  \"{{ commaSeparatedUsers }} and {{ moreCount }} more\": \"{{ commaSeparatedUsers }} en {{ moreCount }} meer\",\n  \"{{ commaSeparatedUsers }}, and {{ lastUser }}\": \"{{ commaSeparatedUsers }} en {{ lastUser }}\",\n  \"{{ firstUser }} and {{ secondUser }}\": \"{{ firstUser }} en {{ secondUser }}\",\n  \"{{ imageCount }} more\": \"+{{ imageCount }}\",\n  \"{{ memberCount }} members\": \"{{ memberCount }} deelnemers\",\n  \"{{ user }} has been muted\": \"{{ user }} is gedempt\",\n  \"{{ user }} has been unmuted\": \"{{ user }} is niet meer gedempt\",\n  \"{{ user }} is typing...\": \"{{ user }} is aan het typen...\",\n  \"{{ users }} and {{ user }} are typing...\": \"{{ users }} en {{ user }} zijn aan het typen...\",\n  \"{{ users }} and more are typing...\": \"{{ users }} en meer zijn aan het typen...\",\n  \"{{ watcherCount }} online\": \"{{ watcherCount }} online\",\n  \"{{count}} unread_one\": \"{{count}} ongelezen\",\n  \"{{count}} unread_other\": \"{{count}} ongelezen\",\n  \"{{count}} votes_one\": \"{{count}} stem\",\n  \"{{count}} votes_other\": \"{{count}} stemmen\",\n  \"\uD83C\uDFD9 Attachment...\": \"\uD83C\uDFD9 Bijlage...\",\n  \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\": \"\uD83D\uDCCA {{createdBy}} heeft gemaakt: {{ pollName}}\",\n  \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\": \"\uD83D\uDCCA {{votedBy}} heeft gestemd: {{pollOptionText}}\",\n  \"\uD83D\uDCCDShared location\": \"\uD83D\uDCCDGedeelde locatie\",\n  \"Add a comment\": \"Voeg een opmerking toe\",\n  \"Add an option\": \"Voeg een optie toe\",\n  \"All results loaded\": \"Alle resultaten geladen\",\n  \"Allow access to camera\": \"Toegang tot camera toestaan\",\n  \"Allow access to microphone\": \"Toegang tot microfoon toestaan\",\n  \"Allow comments\": \"Sta opmerkingen toe\",\n  \"Allow option suggestion\": \"Sta optie-suggesties toe\",\n  \"Also send as a direct message\": \"Ook als direct bericht versturen\",\n  \"Also send in channel\": \"Ook in kanaal versturen\",\n  \"An error has occurred during recording\": \"Er is een fout opgetreden tijdens het opnemen\",\n  \"An error has occurred during the recording processing\": \"Er is een fout opgetreden tijdens de verwerking van de opname\",\n  \"Anonymous\": \"Anoniem\",\n  \"Anonymous poll\": \"Anonieme peiling\",\n  \"Archive\": \"Archief\",\n  \"aria/Attachment\": \"Bijlage\",\n  \"aria/Cancel Reply\": \"Antwoord annuleren\",\n  \"aria/Cancel upload\": \"Upload annuleren\",\n  \"aria/Channel list\": \"Kanaallijst\",\n  \"aria/Channel search results\": \"Zoekresultaten voor kanalen\",\n  \"aria/Close thread\": \"Draad sluiten\",\n  \"aria/Download attachment\": \"Bijlage downloaden\",\n  \"aria/Emoji picker\": \"Emoji kiezer\",\n  \"aria/File input\": \"Bestandsinvoer\",\n  \"aria/File upload\": \"Bestand uploaden\",\n  \"aria/Image input\": \"Afbeelding invoeren\",\n  \"aria/Load More Channels\": \"Meer kanalen laden\",\n  \"aria/Menu\": \"Menu\",\n  \"aria/Message Options\": \"Berichtopties\",\n  \"aria/Open Attachment Selector\": \"Open bijlage selector\",\n  \"aria/Open Menu\": \"Menu openen\",\n  \"aria/Open Message Actions Menu\": \"Menu voor berichtacties openen\",\n  \"aria/Open Reaction Selector\": \"Reactiekiezer openen\",\n  \"aria/Open Thread\": \"Draad openen\",\n  \"aria/Reaction list\": \"Reactielijst\",\n  \"aria/Remind Me Options\": \"Herinneringsopties\",\n  \"aria/Remove attachment\": \"Bijlage verwijderen\",\n  \"aria/Remove location attachment\": \"Locatie bijlage verwijderen\",\n  \"aria/Retry upload\": \"Upload opnieuw proberen\",\n  \"aria/Search results\": \"Zoekresultaten\",\n  \"aria/Search results header filter button\": \"Zoekresultaten header filter knop\",\n  \"aria/Send\": \"Verzenden\",\n  \"aria/Stop AI Generation\": \"AI-generatie stoppen\",\n  \"Ask a question\": \"Stel een vraag\",\n  \"Attach\": \"Bijvoegen\",\n  \"Attach files\": \"Bijlage toevoegen\",\n  \"Attachment upload blocked due to {{reason}}\": \"Bijlage upload geblokkeerd vanwege {{reason}}\",\n  \"Attachment upload failed due to {{reason}}\": \"Bijlage upload mislukt vanwege {{reason}}\",\n  \"ban-command-args\": \"[@gebruikersnaam] [tekst]\",\n  \"ban-command-description\": \"Een gebruiker verbannen\",\n  \"Cancel\": \"Annuleer\",\n  \"Cannot seek in the recording\": \"Kan niet zoeken in de opname\",\n  \"Channel Missing\": \"Kanaal niet gevonden\",\n  \"Close\": \"Sluit\",\n  \"Close emoji picker\": \"Sluit de emoji-kiezer\",\n  \"Commands matching\": \"Bijpassende opdrachten\",\n  \"Connection failure, reconnecting now...\": \"Verbindingsfout, opnieuw verbinden...\",\n  \"Create\": \"Maak\",\n  \"Create poll\": \"Maak peiling\",\n  \"Current location\": \"Huidige locatie\",\n  \"Delete\": \"Verwijder\",\n  \"Delete for me\": \"Voor mij verwijderen\",\n  \"Delivered\": \"Afgeleverd\",\n  \"Download attachment {{ name }}\": \"Bijlage {{ name }} downloaden\",\n  \"Drag your files here\": \"Sleep je bestanden hier naartoe\",\n  \"Drag your files here to add to your post\": \"Sleep je bestanden hier naartoe om aan je bericht toe te voegen\",\n  \"Due {{ timeLeft }}\": \"Vervallen in {{ timeLeft }}\",\n  \"Due since {{ dueSince }}\": \"Vervallen sinds {{ dueSince }}\",\n  \"duration/Message reminder\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Remind Me\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Share Location\": \"{{ milliseconds | durationFormatter }}\",\n  \"Edit Message\": \"Bericht bewerken\",\n  \"Edit message request failed\": \"Verzoek om bericht bewerken mislukt\",\n  \"Edited\": \"Bewerkt\",\n  \"Emoji matching\": \"Emoji-overeenkomsten\",\n  \"Empty message...\": \"Leeg bericht...\",\n  \"End\": \"Einde\",\n  \"End vote\": \"Einde stem\",\n  \"Enforce unique vote is enabled\": \"Unieke stem is ingeschakeld\",\n  \"Error\": \"Fout\",\n  \"Error \u00B7 Unsent\": \"Fout \u00B7 niet verzonden\",\n  \"Error adding flag\": \"Fout bij toevoegen van vlag\",\n  \"Error connecting to chat, refresh the page to try again.\": \"Fout bij het verbinden, ververs de pagina om nogmaals te proberen\",\n  \"Error deleting message\": \"Fout bij verwijderen van bericht\",\n  \"Error fetching reactions\": \"Fout bij het laden van reacties\",\n  \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\": \"Fout bij markeren van bericht als ongelezen. Kan geen oudere ongelezen berichten markeren dan de nieuwste 100 kanaalberichten.\",\n  \"Error muting a user ...\": \"Fout bij het muten van de gebruiker\",\n  \"Error pinning message\": \"Fout bij vastzetten van bericht\",\n  \"Error removing message pin\": \"Fout bij verwijderen van berichtpin\",\n  \"Error reproducing the recording\": \"Fout bij het afspelen van de opname\",\n  \"Error starting recording\": \"Fout bij het starten van de opname\",\n  \"Error unmuting a user ...\": \"Fout bij het unmuten van de gebruiker\",\n  \"Error uploading attachment\": \"Fout bij het uploaden van de bijlage\",\n  \"Error uploading file\": \"Fout bij uploaden bestand\",\n  \"Error uploading image\": \"Fout bij uploaden afbeelding\",\n  \"Error: {{ errorMessage }}\": \"Fout: {{ errorMessage }}\",\n  \"Failed to create the poll\": \"Fout bij het maken van de peiling\",\n  \"Failed to create the poll due to {{reason}}\": \"Peiling kon niet worden aangemaakt vanwege {{reason}}\",\n  \"Failed to jump to the first unread message\": \"Niet gelukt om naar het eerste ongelezen bericht te springen\",\n  \"Failed to mark channel as read\": \"Kanaal kon niet als gelezen worden gemarkeerd\",\n  \"Failed to play the recording\": \"Kan de opname niet afspelen\",\n  \"Failed to retrieve location\": \"Locatie kon niet worden opgehaald\",\n  \"Failed to share location\": \"Locatie kon niet worden gedeeld\",\n  \"File\": \"Bestand\",\n  \"File is too large: {{ size }}, maximum upload size is {{ limit }}\": \"Bestand is te groot: {{ size }}, maximale uploadgrootte is {{ limit }}\",\n  \"Flag\": \"Markeer\",\n  \"Generating...\": \"Genereren...\",\n  \"giphy-command-args\": \"[tekst]\",\n  \"giphy-command-description\": \"Plaats een willekeurige gif in het kanaal\",\n  \"Latest Messages\": \"Laatste berichten\",\n  \"live\": \"live\",\n  \"Live for {{duration}}\": \"Live voor {{duration}}\",\n  \"Live location\": \"Live locatie\",\n  \"Live until {{ timestamp }}\": \"Live tot {{ timestamp }}\",\n  \"Load more\": \"Meer laden\",\n  \"Location\": \"Locatie\",\n  \"Location sharing ended\": \"Locatie delen be\u00EBindigd\",\n  \"Mark as unread\": \"Markeren als ongelezen\",\n  \"Maximum number of votes (from 2 to 10)\": \"Maximaal aantal stemmen (van 2 tot 10)\",\n  \"Menu\": \"Menu\",\n  \"Message deleted\": \"Bericht verwijderd\",\n  \"Message Failed \u00B7 Click to try again\": \"Bericht mislukt, klik om het nogmaals te proberen\",\n  \"Message Failed \u00B7 Unauthorized\": \"Bericht mislukt, ongeautoriseerd\",\n  \"Message has been successfully flagged\": \"Bericht is succesvol gemarkeerd\",\n  \"Message pinned\": \"Bericht vastgezet\",\n  \"Message was blocked by moderation policies\": \"Bericht is geblokkeerd door moderatiebeleid\",\n  \"Messages have been marked unread.\": \"Berichten zijn gemarkeerd als ongelezen.\",\n  \"Missing permissions to upload the attachment\": \"Missende toestemmingen om de bijlage te uploaden\",\n  \"Multiple answers\": \"Meerdere antwoorden\",\n  \"Mute\": \"Dempen\",\n  \"mute-command-args\": \"[@gebruikersnaam]\",\n  \"mute-command-description\": \"Een gebruiker dempen\",\n  \"network error\": \"netwerkfout\",\n  \"New\": \"Nieuwe\",\n  \"New Messages!\": \"Nieuwe Berichten!\",\n  \"No chats here yet\u2026\": \"Nog geen chats hier...\",\n  \"No results found\": \"Geen resultaten gevonden\",\n  \"Nobody will be able to vote in this poll anymore.\": \"Niemand kan meer stemmen in deze peiling.\",\n  \"Nothing yet...\": \"Nog niets ...\",\n  \"Ok\": \"Ok\u00E9\",\n  \"Only numbers are allowed\": \"Alleen nummers zijn toegestaan\",\n  \"Open emoji picker\": \"Emoji-kiezer openen\",\n  \"Option already exists\": \"Optie bestaat al\",\n  \"Option is empty\": \"Optie is leeg\",\n  \"Options\": \"Opties\",\n  \"People matching\": \"Mensen die matchen\",\n  \"Pin\": \"Pin\",\n  \"Pinned by\": \"Vastgemaakt door\",\n  \"Poll\": \"Peiling\",\n  \"Poll comments\": \"Peiling opmerkingen\",\n  \"Poll options\": \"Peiling opties\",\n  \"Poll results\": \"Peiling resultaten\",\n  \"Question\": \"Vraag\",\n  \"Question is required\": \"Vraag is verplicht\",\n  \"Quote\": \"Citeer\",\n  \"Reached the vote limit. Remove an existing vote first.\": \"Stemlimiet bereikt. Verwijder eerst een bestaande stem.\",\n  \"Recording format is not supported and cannot be reproduced\": \"Opnameformaat wordt niet ondersteund en kan niet worden gereproduceerd\",\n  \"Remind Me\": \"Herinner mij\",\n  \"Remove reminder\": \"Herinnering verwijderen\",\n  \"Reply\": \"Antwoord\",\n  \"Reply to Message\": \"Antwoord op bericht\",\n  \"replyCount_one\": \"1 antwoord\",\n  \"replyCount_other\": \"{{ count }} antwoorden\",\n  \"Save for later\": \"Bewaren voor later\",\n  \"Saved for later\": \"Bewaard voor later\",\n  \"Search\": \"Zoeken\",\n  \"search-results-header-filter-source-button-label--channels\": \"kanalen\",\n  \"search-results-header-filter-source-button-label--messages\": \"berichten\",\n  \"search-results-header-filter-source-button-label--users\": \"gebruikers\",\n  \"Searching for {{ searchSourceType }}...\": \"Zoeken naar {{ searchSourceType }}...\",\n  \"Searching...\": \"Zoeken...\",\n  \"searchResultsCount_one\": \"1 resultaat\",\n  \"searchResultsCount_other\": \"{{ count }} resultaten\",\n  \"See all options ({{count}})_one\": \"Bekijk alle opties ({{count}})\",\n  \"See all options ({{count}})_other\": \"Bekijk alle opties ({{count}})\",\n  \"Select one\": \"Selecteer er een\",\n  \"Select one or more\": \"Selecteer een of meer\",\n  \"Select up to {{count}}_one\": \"Selecteer tot {{count}}\",\n  \"Select up to {{count}}_other\": \"Selecteer tot {{count}}\",\n  \"Send\": \"Verstuur\",\n  \"Send Anyway\": \"Toch versturen\",\n  \"Send message request failed\": \"Verzoek om bericht te verzenden mislukt\",\n  \"Sending...\": \"Aan het verzenden...\",\n  \"Sent\": \"Verzonden\",\n  \"Share\": \"Delen\",\n  \"Share live location for\": \"Live locatie delen voor\",\n  \"Share Location\": \"Locatie delen\",\n  \"Shared live location\": \"Gedeelde live locatie\",\n  \"Show all\": \"Toon alles\",\n  \"Shuffle\": \"Schudden\",\n  \"size limit\": \"grootte limiet\",\n  \"Slow Mode ON\": \"Langzame modus aan\",\n  \"Some of the files will not be accepted\": \"Sommige bestanden zullen niet worden geaccepteerd\",\n  \"Start typing to search\": \"Begin met typen om te zoeken\",\n  \"Stop sharing\": \"Delen stoppen\",\n  \"Submit\": \"Versturen\",\n  \"Suggest an option\": \"Stel een optie voor\",\n  \"Thinking...\": \"Denken...\",\n  \"this content could not be displayed\": \"Deze inhoud kan niet weergegeven worden\",\n  \"This field cannot be empty or contain only spaces\": \"Dit veld mag niet leeg zijn of alleen spaties bevatten\",\n  \"This message did not meet our content guidelines\": \"Dit bericht voldeed niet aan onze inhoudsrichtlijnen\",\n  \"This message was deleted...\": \"Dit bericht was verwijderd\",\n  \"Thread\": \"Draadje\",\n  \"Thread has not been found\": \"Draadje niet gevonden\",\n  \"Thread reply\": \"Draadje antwoord\",\n  \"timestamp/DateSeparator\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/LiveLocation\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/MessageTimestamp\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/PollVote\": \"{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}\",\n  \"timestamp/PollVoteTooltip\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/ReminderNotification\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/SystemMessage\": \"{{ timestamp | timestampFormatter(format: dddd L) }}\",\n  \"To start recording, allow the camera access in your browser\": \"Om te beginnen met opnemen, sta toegang tot de camera toe in uw browser\",\n  \"To start recording, allow the microphone access in your browser\": \"Om te beginnen met opnemen, sta toegang tot de microfoon toe in uw browser\",\n  \"translationBuilderTopic/notification\": \"{{value, notification}}\",\n  \"Type a number from 2 to 10\": \"Typ een getal van 2 tot 10\",\n  \"Type your message\": \"Type je bericht\",\n  \"Unarchive\": \"Uit archief halen\",\n  \"unban-command-args\": \"[@gebruikersnaam]\",\n  \"unban-command-description\": \"Een gebruiker debannen\",\n  \"unknown error\": \"onbekende fout\",\n  \"Unmute\": \"Dempen opheffen\",\n  \"unmute-command-args\": \"[@gebruikersnaam]\",\n  \"unmute-command-description\": \"Een gebruiker niet meer dempen\",\n  \"Unpin\": \"Losmaken\",\n  \"Unread messages\": \"Ongelezen berichten\",\n  \"unreadMessagesSeparatorText_one\": \"1 ongelezen bericht\",\n  \"unreadMessagesSeparatorText_other\": \"{{count}} ongelezen berichten\",\n  \"Unsupported attachment\": \"Niet-ondersteunde bijlage\",\n  \"unsupported file type\": \"niet-ondersteund bestandstype\",\n  \"Update your comment\": \"Werk je opmerking bij\",\n  \"Upload type: \\\"{{ type }}\\\" is not allowed\": \"Uploadtype: \\\"{{ type }}\\\" is niet toegestaan\",\n  \"User uploaded content\": \"Gebruikersge\u00FCploade inhoud\",\n  \"View {{count}} comments_one\": \"Bekijk {{count}} opmerkingen\",\n  \"View {{count}} comments_other\": \"Bekijk {{count}} opmerkingen\",\n  \"View results\": \"Bekijk resultaten\",\n  \"Voice message\": \"Spraakbericht\",\n  \"Vote ended\": \"Stemmen be\u00EBindigd\",\n  \"Wait until all attachments have uploaded\": \"Wacht tot alle bijlagen zijn ge\u00FCpload\",\n  \"You\": \"Jij\",\n  \"You have no channels currently\": \"Er zijn geen chats beschikbaar\",\n  \"You've reached the maximum number of files\": \"Je hebt het maximale aantal bestanden bereikt\"\n}\n", "{\n  \"{{ commaSeparatedUsers }} and {{ moreCount }} more\": \"{{ commaSeparatedUsers }} e mais {{ moreCount }}\",\n  \"{{ commaSeparatedUsers }}, and {{ lastUser }}\": \"{{ commaSeparatedUsers }} e {{ lastUser }}\",\n  \"{{ firstUser }} and {{ secondUser }}\": \"{{ firstUser }} e {{ secondUser }}\",\n  \"{{ imageCount }} more\": \"{{ imageCount }} mais\",\n  \"{{ memberCount }} members\": \"{{ memberCount }} membros\",\n  \"{{ user }} has been muted\": \"{{ user }} foi silenciado\",\n  \"{{ user }} has been unmuted\": \"{{ user }} foi reativado\",\n  \"{{ user }} is typing...\": \"{{ user }} est\u00E1 digitando...\",\n  \"{{ users }} and {{ user }} are typing...\": \"{{ users }} e {{ user }} est\u00E3o digitando...\",\n  \"{{ users }} and more are typing...\": \"{{ users }} e mais est\u00E3o digitando...\",\n  \"{{ watcherCount }} online\": \"{{ watcherCount }} online\",\n  \"{{count}} unread_one\": \"{{count}} n\u00E3o lido\",\n  \"{{count}} unread_many\": \"{{count}} n\u00E3o lidos\",\n  \"{{count}} unread_other\": \"{{count}} n\u00E3o lidos\",\n  \"{{count}} votes_one\": \"{{count}} voto\",\n  \"{{count}} votes_many\": \"{{count}} votos\",\n  \"{{count}} votes_other\": \"{{count}} votos\",\n  \"\uD83C\uDFD9 Attachment...\": \"\uD83C\uDFD9 Anexo...\",\n  \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\": \"\uD83D\uDCCA {{createdBy}} criou: {{ pollName}}\",\n  \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\": \"\uD83D\uDCCA {{votedBy}} votou: {{pollOptionText}}\",\n  \"\uD83D\uDCCDShared location\": \"\uD83D\uDCCDLocaliza\u00E7\u00E3o compartilhada\",\n  \"Add a comment\": \"Adicionar um coment\u00E1rio\",\n  \"Add an option\": \"Adicionar uma op\u00E7\u00E3o\",\n  \"All results loaded\": \"Todos os resultados carregados\",\n  \"Allow access to camera\": \"Permitir acesso \u00E0 c\u00E2mera\",\n  \"Allow access to microphone\": \"Permitir acesso ao microfone\",\n  \"Allow comments\": \"Permitir coment\u00E1rios\",\n  \"Allow option suggestion\": \"Permitir sugest\u00E3o de op\u00E7\u00E3o\",\n  \"Also send as a direct message\": \"Tamb\u00E9m enviar como mensagem direta\",\n  \"Also send in channel\": \"Tamb\u00E9m enviar no canal\",\n  \"An error has occurred during recording\": \"Ocorreu um erro durante a grava\u00E7\u00E3o\",\n  \"An error has occurred during the recording processing\": \"Ocorreu um erro durante o processamento da grava\u00E7\u00E3o\",\n  \"Anonymous\": \"An\u00F4nimo\",\n  \"Anonymous poll\": \"Enquete an\u00F4nima\",\n  \"Archive\": \"Arquivar\",\n  \"aria/Attachment\": \"Anexo\",\n  \"aria/Cancel Reply\": \"Cancelar resposta\",\n  \"aria/Cancel upload\": \"Cancelar upload\",\n  \"aria/Channel list\": \"Lista de canais\",\n  \"aria/Channel search results\": \"Resultados de pesquisa de canais\",\n  \"aria/Close thread\": \"Fechar t\u00F3pico\",\n  \"aria/Download attachment\": \"Baixar anexo\",\n  \"aria/Emoji picker\": \"Seletor de emojis\",\n  \"aria/File input\": \"Entrada de arquivo\",\n  \"aria/File upload\": \"Carregar arquivo\",\n  \"aria/Image input\": \"Entrada de imagem\",\n  \"aria/Load More Channels\": \"Carregar mais canais\",\n  \"aria/Menu\": \"Menu\",\n  \"aria/Message Options\": \"Op\u00E7\u00F5es de mensagem\",\n  \"aria/Open Attachment Selector\": \"Abrir seletor de anexos\",\n  \"aria/Open Menu\": \"Abrir menu\",\n  \"aria/Open Message Actions Menu\": \"Abrir menu de a\u00E7\u00F5es de mensagem\",\n  \"aria/Open Reaction Selector\": \"Abrir seletor de rea\u00E7\u00F5es\",\n  \"aria/Open Thread\": \"Abrir t\u00F3pico\",\n  \"aria/Reaction list\": \"Lista de rea\u00E7\u00F5es\",\n  \"aria/Remind Me Options\": \"Op\u00E7\u00F5es de lembrete\",\n  \"aria/Remove attachment\": \"Remover anexo\",\n  \"aria/Remove location attachment\": \"Remover anexo de localiza\u00E7\u00E3o\",\n  \"aria/Retry upload\": \"Tentar upload novamente\",\n  \"aria/Search results\": \"Resultados da pesquisa\",\n  \"aria/Search results header filter button\": \"Bot\u00E3o de filtro do cabe\u00E7alho dos resultados da pesquisa\",\n  \"aria/Send\": \"Enviar\",\n  \"aria/Stop AI Generation\": \"Parar gera\u00E7\u00E3o de IA\",\n  \"Ask a question\": \"Fa\u00E7a uma pergunta\",\n  \"Attach\": \"Anexar\",\n  \"Attach files\": \"Anexar arquivos\",\n  \"Attachment upload blocked due to {{reason}}\": \"Upload de anexo bloqueado devido a {{reason}}\",\n  \"Attachment upload failed due to {{reason}}\": \"Upload de anexo falhou devido a {{reason}}\",\n  \"ban-command-args\": \"[@nomedeusu\u00E1rio] [texto]\",\n  \"ban-command-description\": \"Banir um usu\u00E1rio\",\n  \"Cancel\": \"Cancelar\",\n  \"Cannot seek in the recording\": \"N\u00E3o \u00E9 poss\u00EDvel buscar na grava\u00E7\u00E3o\",\n  \"Channel Missing\": \"Canal ausente\",\n  \"Close\": \"Fechar\",\n  \"Close emoji picker\": \"Fechar seletor de emoji\",\n  \"Commands matching\": \"Comandos correspondentes\",\n  \"Connection failure, reconnecting now...\": \"Falha de conex\u00E3o, reconectando agora...\",\n  \"Create\": \"Criar\",\n  \"Create poll\": \"Criar enquete\",\n  \"Current location\": \"Localiza\u00E7\u00E3o atual\",\n  \"Delete\": \"Excluir\",\n  \"Delete for me\": \"Excluir para mim\",\n  \"Delivered\": \"Entregue\",\n  \"Download attachment {{ name }}\": \"Baixar anexo {{ name }}\",\n  \"Drag your files here\": \"Arraste seus arquivos aqui\",\n  \"Drag your files here to add to your post\": \"Arraste seus arquivos aqui para adicionar ao seu post\",\n  \"Due {{ timeLeft }}\": \"Vence em {{ timeLeft }}\",\n  \"Due since {{ dueSince }}\": \"Vencido desde {{ dueSince }}\",\n  \"duration/Message reminder\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Remind Me\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Share Location\": \"{{ milliseconds | durationFormatter }}\",\n  \"Edit Message\": \"Editar Mensagem\",\n  \"Edit message request failed\": \"O pedido de edi\u00E7\u00E3o da mensagem falhou\",\n  \"Edited\": \"Editada\",\n  \"Emoji matching\": \"Emoji correspondente\",\n  \"Empty message...\": \"Mensagem vazia...\",\n  \"End\": \"Fim\",\n  \"End vote\": \"Encerrar vota\u00E7\u00E3o\",\n  \"Enforce unique vote is enabled\": \"Voto \u00FAnico est\u00E1 habilitado\",\n  \"Error\": \"Erro\",\n  \"Error \u00B7 Unsent\": \"Erro \u00B7 N\u00E3o enviado\",\n  \"Error adding flag\": \"Erro ao reportar\",\n  \"Error connecting to chat, refresh the page to try again.\": \"Erro ao conectar ao bate-papo, atualize a p\u00E1gina para tentar novamente.\",\n  \"Error deleting message\": \"Erro ao deletar mensagem\",\n  \"Error fetching reactions\": \"Erro ao carregar rea\u00E7\u00F5es\",\n  \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\": \"Erro ao marcar a mensagem como n\u00E3o lida. N\u00E3o \u00E9 poss\u00EDvel marcar mensagens n\u00E3o lidas mais antigas do que as 100 mensagens mais recentes do canal.\",\n  \"Error muting a user ...\": \"Erro ao silenciar um usu\u00E1rio...\",\n  \"Error pinning message\": \"Erro ao fixar mensagem\",\n  \"Error removing message pin\": \"Erro ao remover o PIN da mensagem\",\n  \"Error reproducing the recording\": \"Erro ao reproduzir a grava\u00E7\u00E3o\",\n  \"Error starting recording\": \"Erro ao iniciar a grava\u00E7\u00E3o\",\n  \"Error unmuting a user ...\": \"Erro ao ativar o som de um usu\u00E1rio...\",\n  \"Error uploading attachment\": \"Erro ao carregar o anexo\",\n  \"Error uploading file\": \"Erro ao enviar arquivo\",\n  \"Error uploading image\": \"Erro ao carregar a imagem\",\n  \"Error: {{ errorMessage }}\": \"Erro: {{ errorMessage }}\",\n  \"Failed to create the poll\": \"Falha ao criar a pesquisa\",\n  \"Failed to create the poll due to {{reason}}\": \"Falha ao criar a enquete devido a {{reason}}\",\n  \"Failed to jump to the first unread message\": \"Falha ao pular para a primeira mensagem n\u00E3o lida\",\n  \"Failed to mark channel as read\": \"Falha ao marcar o canal como lido\",\n  \"Failed to play the recording\": \"Falha ao reproduzir a grava\u00E7\u00E3o\",\n  \"Failed to retrieve location\": \"Falha ao obter localiza\u00E7\u00E3o\",\n  \"Failed to share location\": \"Falha ao compartilhar localiza\u00E7\u00E3o\",\n  \"File\": \"Arquivo\",\n  \"File is too large: {{ size }}, maximum upload size is {{ limit }}\": \"O arquivo \u00E9 muito grande: {{ size }}, o tamanho m\u00E1ximo de upload \u00E9 {{ limit }}\",\n  \"Flag\": \"Reportar\",\n  \"Generating...\": \"Gerando...\",\n  \"giphy-command-args\": \"[texto]\",\n  \"giphy-command-description\": \"Postar um gif aleat\u00F3rio no canal\",\n  \"Latest Messages\": \"Mensagens mais recentes\",\n  \"live\": \"ao vivo\",\n  \"Live for {{duration}}\": \"Ao vivo por {{duration}}\",\n  \"Live location\": \"Localiza\u00E7\u00E3o ao vivo\",\n  \"Live until {{ timestamp }}\": \"Ao vivo at\u00E9 {{ timestamp }}\",\n  \"Load more\": \"Carregar mais\",\n  \"Location\": \"Localiza\u00E7\u00E3o\",\n  \"Location sharing ended\": \"Compartilhamento de localiza\u00E7\u00E3o encerrado\",\n  \"Mark as unread\": \"Marcar como n\u00E3o lida\",\n  \"Maximum number of votes (from 2 to 10)\": \"N\u00FAmero m\u00E1ximo de votos (de 2 a 10)\",\n  \"Menu\": \"Menu\",\n  \"Message deleted\": \"Mensagem apagada\",\n  \"Message Failed \u00B7 Click to try again\": \"A mensagem falhou \u00B7 Clique para tentar novamente\",\n  \"Message Failed \u00B7 Unauthorized\": \"A mensagem falhou \u00B7 n\u00E3o autorizado\",\n  \"Message has been successfully flagged\": \"A mensagem foi reportada com sucesso\",\n  \"Message pinned\": \"Mensagem fixada\",\n  \"Message was blocked by moderation policies\": \"A mensagem foi bloqueada pelas pol\u00EDticas de modera\u00E7\u00E3o\",\n  \"Messages have been marked unread.\": \"Mensagens foram marcadas como n\u00E3o lidas.\",\n  \"Missing permissions to upload the attachment\": \"Faltando permiss\u00F5es para enviar o anexo\",\n  \"Multiple answers\": \"M\u00FAltiplas respostas\",\n  \"Mute\": \"Silenciar\",\n  \"mute-command-args\": \"[@nomedeusu\u00E1rio]\",\n  \"mute-command-description\": \"Silenciar um usu\u00E1rio\",\n  \"network error\": \"erro de rede\",\n  \"New\": \"Novo\",\n  \"New Messages!\": \"Novas Mensagens!\",\n  \"No chats here yet\u2026\": \"Ainda n\u00E3o h\u00E1 conversas aqui...\",\n  \"No results found\": \"Nenhum resultado encontrado\",\n  \"Nobody will be able to vote in this poll anymore.\": \"Ningu\u00E9m mais poder\u00E1 votar nesta pesquisa.\",\n  \"Nothing yet...\": \"Nada ainda...\",\n  \"Ok\": \"Ok\",\n  \"Only numbers are allowed\": \"Apenas n\u00FAmeros s\u00E3o permitidos\",\n  \"Open emoji picker\": \"Abrir seletor de emoji\",\n  \"Option already exists\": \"Op\u00E7\u00E3o j\u00E1 existe\",\n  \"Option is empty\": \"A op\u00E7\u00E3o est\u00E1 vazia\",\n  \"Options\": \"Op\u00E7\u00F5es\",\n  \"People matching\": \"Pessoas correspondentes\",\n  \"Pin\": \"Fixar\",\n  \"Pinned by\": \"Fixado por\",\n  \"Poll\": \"Enquete\",\n  \"Poll comments\": \"Coment\u00E1rios da pesquisa\",\n  \"Poll options\": \"Op\u00E7\u00F5es da pesquisa\",\n  \"Poll results\": \"Resultados da pesquisa\",\n  \"Question\": \"Pergunta\",\n  \"Question is required\": \"A pergunta \u00E9 obrigat\u00F3ria\",\n  \"Quote\": \"Citar\",\n  \"Reached the vote limit. Remove an existing vote first.\": \"Limite de votos atingido. Remova um voto existente primeiro.\",\n  \"Recording format is not supported and cannot be reproduced\": \"Formato de grava\u00E7\u00E3o n\u00E3o \u00E9 suportado e n\u00E3o pode ser reproduzido\",\n  \"Remind Me\": \"Lembrar-me\",\n  \"Remove reminder\": \"Remover lembrete\",\n  \"Reply\": \"Responder\",\n  \"Reply to Message\": \"Responder \u00E0 mensagem\",\n  \"replyCount_one\": \"1 resposta\",\n  \"replyCount_many\": \"{{ count }} respostas\",\n  \"replyCount_other\": \"{{ count }} respostas\",\n  \"Save for later\": \"Salvar para depois\",\n  \"Saved for later\": \"Salvo para depois\",\n  \"Search\": \"Buscar\",\n  \"search-results-header-filter-source-button-label--channels\": \"canais\",\n  \"search-results-header-filter-source-button-label--messages\": \"mensagens\",\n  \"search-results-header-filter-source-button-label--users\": \"usu\u00E1rios\",\n  \"Searching for {{ searchSourceType }}...\": \"Buscando {{ searchSourceType }}...\",\n  \"Searching...\": \"Buscando...\",\n  \"searchResultsCount_one\": \"1 resultado\",\n  \"searchResultsCount_many\": \"{{ count }} resultados\",\n  \"searchResultsCount_other\": \"{{ count }} resultados\",\n  \"See all options ({{count}})_one\": \"Ver todas as op\u00E7\u00F5es ({{count}})\",\n  \"See all options ({{count}})_many\": \"Ver todas as op\u00E7\u00F5es ({{count}})\",\n  \"See all options ({{count}})_other\": \"Ver todas as op\u00E7\u00F5es ({{count}})\",\n  \"Select one\": \"Selecionar um\",\n  \"Select one or more\": \"Selecionar um ou mais\",\n  \"Select up to {{count}}_one\": \"Selecionar at\u00E9 {{count}}\",\n  \"Select up to {{count}}_many\": \"Selecionar at\u00E9 {{count}}\",\n  \"Select up to {{count}}_other\": \"Selecionar at\u00E9 {{count}}\",\n  \"Send\": \"Enviar\",\n  \"Send Anyway\": \"Enviar de qualquer forma\",\n  \"Send message request failed\": \"O pedido de envio da mensagem falhou\",\n  \"Sending...\": \"Enviando...\",\n  \"Sent\": \"Enviado\",\n  \"Share\": \"Compartilhar\",\n  \"Share live location for\": \"Compartilhar localiza\u00E7\u00E3o ao vivo por\",\n  \"Share Location\": \"Compartilhar localiza\u00E7\u00E3o\",\n  \"Shared live location\": \"Localiza\u00E7\u00E3o ao vivo compartilhada\",\n  \"Show all\": \"Mostrar tudo\",\n  \"Shuffle\": \"Embaralhar\",\n  \"size limit\": \"limite de tamanho\",\n  \"Slow Mode ON\": \"Modo lento LIGADO\",\n  \"Some of the files will not be accepted\": \"Alguns arquivos n\u00E3o ser\u00E3o aceitos\",\n  \"Start typing to search\": \"Comece a digitar para pesquisar\",\n  \"Stop sharing\": \"Parar de compartilhar\",\n  \"Submit\": \"Enviar\",\n  \"Suggest an option\": \"Sugerir uma op\u00E7\u00E3o\",\n  \"Thinking...\": \"Pensando...\",\n  \"this content could not be displayed\": \"este conte\u00FAdo n\u00E3o p\u00F4de ser exibido\",\n  \"This field cannot be empty or contain only spaces\": \"Este campo n\u00E3o pode estar vazio ou conter apenas espa\u00E7os\",\n  \"This message did not meet our content guidelines\": \"Esta mensagem n\u00E3o corresponde \u00E0s nossas diretrizes de conte\u00FAdo\",\n  \"This message was deleted...\": \"Esta mensagem foi exclu\u00EDda...\",\n  \"Thread\": \"Fio\",\n  \"Thread has not been found\": \"Fio n\u00E3o encontrado\",\n  \"Thread reply\": \"Resposta no fio\",\n  \"timestamp/DateSeparator\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/LiveLocation\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/MessageTimestamp\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/PollVote\": \"{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}\",\n  \"timestamp/PollVoteTooltip\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/ReminderNotification\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/SystemMessage\": \"{{ timestamp | timestampFormatter(format: dddd L) }}\",\n  \"To start recording, allow the camera access in your browser\": \"Para come\u00E7ar a gravar, permita o acesso \u00E0 c\u00E2mera no seu navegador\",\n  \"To start recording, allow the microphone access in your browser\": \"Para come\u00E7ar a gravar, permita o acesso ao microfone no seu navegador\",\n  \"translationBuilderTopic/notification\": \"{{value, notification}}\",\n  \"Type a number from 2 to 10\": \"Digite um n\u00FAmero de 2 a 10\",\n  \"Type your message\": \"Digite sua mensagem\",\n  \"Unarchive\": \"Desarquivar\",\n  \"unban-command-args\": \"[@nomedeusu\u00E1rio]\",\n  \"unban-command-description\": \"Desbanir um usu\u00E1rio\",\n  \"unknown error\": \"erro desconhecido\",\n  \"Unmute\": \"Ativar som\",\n  \"unmute-command-args\": \"[@nomedeusu\u00E1rio]\",\n  \"unmute-command-description\": \"Retirar o silenciamento de um usu\u00E1rio\",\n  \"Unpin\": \"Desfixar\",\n  \"Unread messages\": \"Mensagens n\u00E3o lidas\",\n  \"unreadMessagesSeparatorText_one\": \"1 mensagem n\u00E3o lida\",\n  \"unreadMessagesSeparatorText_many\": \"{{count}} mensagens n\u00E3o lidas\",\n  \"unreadMessagesSeparatorText_other\": \"{{count}} mensagens n\u00E3o lidas\",\n  \"Unsupported attachment\": \"Anexo n\u00E3o suportado\",\n  \"unsupported file type\": \"tipo de arquivo n\u00E3o suportado\",\n  \"Update your comment\": \"Atualizar seu coment\u00E1rio\",\n  \"Upload type: \\\"{{ type }}\\\" is not allowed\": \"Tipo de upload: \\\"{{ type }}\\\" n\u00E3o \u00E9 permitido\",\n  \"User uploaded content\": \"Conte\u00FAdo enviado pelo usu\u00E1rio\",\n  \"View {{count}} comments_one\": \"Ver {{count}} coment\u00E1rio\",\n  \"View {{count}} comments_many\": \"Ver {{count}} coment\u00E1rios\",\n  \"View {{count}} comments_other\": \"Ver {{count}} coment\u00E1rios\",\n  \"View results\": \"Ver resultados\",\n  \"Voice message\": \"Mensagem de voz\",\n  \"Vote ended\": \"Vota\u00E7\u00E3o encerrada\",\n  \"Wait until all attachments have uploaded\": \"Espere at\u00E9 que todos os anexos tenham sido carregados\",\n  \"You\": \"Voc\u00EA\",\n  \"You have no channels currently\": \"Voc\u00EA n\u00E3o tem canais atualmente\",\n  \"You've reached the maximum number of files\": \"Voc\u00EA atingiu o n\u00FAmero m\u00E1ximo de arquivos\"\n}\n", "{\n  \"{{ commaSeparatedUsers }} and {{ moreCount }} more\": \"{{ commaSeparatedUsers }} \u0438 {{ moreCount }} \u0435\u0449\u0435\",\n  \"{{ commaSeparatedUsers }}, and {{ lastUser }}\": \"{{ commaSeparatedUsers }} \u0438 {{ lastUser }}\",\n  \"{{ firstUser }} and {{ secondUser }}\": \"{{ firstUser }} \u0438 {{ secondUser }}\",\n  \"{{ imageCount }} more\": \"\u0415\u0449\u0451 {{ imageCount }}\",\n  \"{{ memberCount }} members\": \"{{ memberCount }} \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u0432\",\n  \"{{ user }} has been muted\": \"\u0412\u044B \u043E\u0442\u043F\u0438\u0441\u0430\u043B\u0438\u0441\u044C \u043E\u0442 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0439 \u043E\u0442 {{ user }}\",\n  \"{{ user }} has been unmuted\": \"\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E\u0442 {{ user }} \u0431\u044B\u043B\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u044B\",\n  \"{{ user }} is typing...\": \"{{ user }} \u043F\u0435\u0447\u0430\u0442\u0430\u0435\u0442...\",\n  \"{{ users }} and {{ user }} are typing...\": \"{{ users }} \u0438 {{ user }} \u043F\u0435\u0447\u0430\u0442\u0430\u044E\u0442...\",\n  \"{{ users }} and more are typing...\": \"{{ users }} \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043F\u0435\u0447\u0430\u0442\u0430\u044E\u0442...\",\n  \"{{ watcherCount }} online\": \"{{ watcherCount }} \u0432 \u0441\u0435\u0442\u0438\",\n  \"{{count}} unread_one\": \"{{count}} \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u043E\u0435\",\n  \"{{count}} unread_few\": \"{{count}} \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0445\",\n  \"{{count}} unread_many\": \"{{count}} \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0445\",\n  \"{{count}} unread_other\": \"{{count}} \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0445\",\n  \"{{count}} votes_one\": \"{{count}} \u0433\u043E\u043B\u043E\u0441\",\n  \"{{count}} votes_few\": \"{{count}} \u0433\u043E\u043B\u043E\u0441\u0430\",\n  \"{{count}} votes_many\": \"{{count}} \u0433\u043E\u043B\u043E\u0441\u043E\u0432\",\n  \"{{count}} votes_other\": \"{{count}} \u0433\u043E\u043B\u043E\u0441\u043E\u0432\",\n  \"\uD83C\uDFD9 Attachment...\": \"\uD83C\uDFD9 \u0412\u043B\u043E\u0436\u0435\u043D\u0438\u0435...\",\n  \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\": \"\uD83D\uDCCA {{createdBy}} \u0441\u043E\u0437\u0434\u0430\u043B(\u0430): {{ pollName}}\",\n  \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\": \"\uD83D\uDCCA {{votedBy}} \u043F\u0440\u043E\u0433\u043E\u043B\u043E\u0441\u043E\u0432\u0430\u043B(\u0430): {{pollOptionText}}\",\n  \"\uD83D\uDCCDShared location\": \"\uD83D\uDCCD\u041E\u0431\u0449\u0435\u0435 \u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435\",\n  \"Add a comment\": \"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439\",\n  \"Add an option\": \"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432\u0430\u0440\u0438\u0430\u043D\u0442\",\n  \"All results loaded\": \"\u0412\u0441\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u044B\",\n  \"Allow access to camera\": \"\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u043A\u0430\u043C\u0435\u0440\u0435\",\n  \"Allow access to microphone\": \"\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D\u0443\",\n  \"Allow comments\": \"\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438\",\n  \"Allow option suggestion\": \"\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432\",\n  \"Also send as a direct message\": \"\u0422\u0430\u043A\u0436\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u043A\u0430\u043A \u043B\u0438\u0447\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435\",\n  \"Also send in channel\": \"\u0422\u0430\u043A\u0436\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0432 \u043A\u0430\u043D\u0430\u043B\",\n  \"An error has occurred during recording\": \"\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0437\u0430\u043F\u0438\u0441\u0438\",\n  \"An error has occurred during the recording processing\": \"\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u0437\u0430\u043F\u0438\u0441\u0438\",\n  \"Anonymous\": \"\u0410\u043D\u043E\u043D\u0438\u043C\",\n  \"Anonymous poll\": \"\u0410\u043D\u043E\u043D\u0438\u043C\u043D\u044B\u0439 \u043E\u043F\u0440\u043E\u0441\",\n  \"Archive\": \"A\u0440\u0445\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u0442\u044C\",\n  \"aria/Attachment\": \"\u0412\u043B\u043E\u0436\u0435\u043D\u0438\u0435\",\n  \"aria/Cancel Reply\": \"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u043E\u0442\u0432\u0435\u0442\",\n  \"aria/Cancel upload\": \"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0443\",\n  \"aria/Channel list\": \"\u0421\u043F\u0438\u0441\u043E\u043A \u043A\u0430\u043D\u0430\u043B\u043E\u0432\",\n  \"aria/Channel search results\": \"\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043F\u043E\u0438\u0441\u043A\u0430 \u043F\u043E \u043A\u0430\u043D\u0430\u043B\u0430\u043C\",\n  \"aria/Close thread\": \"\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0442\u0435\u043C\u0443\",\n  \"aria/Download attachment\": \"\u0421\u043A\u0430\u0447\u0430\u0442\u044C \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435\",\n  \"aria/Emoji picker\": \"\u0412\u044B\u0431\u043E\u0440 \u044D\u043C\u043E\u0434\u0437\u0438\",\n  \"aria/File input\": \"\u0412\u0432\u043E\u0434 \u0444\u0430\u0439\u043B\u0430\",\n  \"aria/File upload\": \"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0444\u0430\u0439\u043B\u0430\",\n  \"aria/Image input\": \"\u0412\u0432\u043E\u0434 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F\",\n  \"aria/Load More Channels\": \"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435 \u043A\u0430\u043D\u0430\u043B\u043E\u0432\",\n  \"aria/Menu\": \"\u041C\u0435\u043D\u044E\",\n  \"aria/Message Options\": \"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\",\n  \"aria/Open Attachment Selector\": \"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432\u044B\u0431\u043E\u0440 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0439\",\n  \"aria/Open Menu\": \"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043C\u0435\u043D\u044E\",\n  \"aria/Open Message Actions Menu\": \"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043C\u0435\u043D\u044E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\u043C\u0438\",\n  \"aria/Open Reaction Selector\": \"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0435\u043B\u0435\u043A\u0442\u043E\u0440 \u0440\u0435\u0430\u043A\u0446\u0438\u0439\",\n  \"aria/Open Thread\": \"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0442\u0435\u043C\u0443\",\n  \"aria/Reaction list\": \"\u0421\u043F\u0438\u0441\u043E\u043A \u0440\u0435\u0430\u043A\u0446\u0438\u0439\",\n  \"aria/Remind Me Options\": \"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u044F\",\n  \"aria/Remove attachment\": \"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435\",\n  \"aria/Remove location attachment\": \"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F\",\n  \"aria/Retry upload\": \"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0443\",\n  \"aria/Search results\": \"\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043F\u043E\u0438\u0441\u043A\u0430\",\n  \"aria/Search results header filter button\": \"\u041A\u043D\u043E\u043F\u043A\u0430 \u0444\u0438\u043B\u044C\u0442\u0440\u0430 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E\u0438\u0441\u043A\u0430\",\n  \"aria/Send\": \"\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C\",\n  \"aria/Stop AI Generation\": \"\u041E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044E \u0418\u0418\",\n  \"Ask a question\": \"\u0417\u0430\u0434\u0430\u0442\u044C \u0432\u043E\u043F\u0440\u043E\u0441\",\n  \"Attach\": \"\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C\",\n  \"Attach files\": \"\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u0444\u0430\u0439\u043B\u044B\",\n  \"Attachment upload blocked due to {{reason}}\": \"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0437\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u0430 \u0438\u0437-\u0437\u0430 {{reason}}\",\n  \"Attachment upload failed due to {{reason}}\": \"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043D\u0435 \u0443\u0434\u0430\u043B\u0430\u0441\u044C \u0438\u0437-\u0437\u0430 {{reason}}\",\n  \"ban-command-args\": \"[@\u0438\u043C\u044F\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F] [\u0442\u0435\u043A\u0441\u0442]\",\n  \"ban-command-description\": \"\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\",\n  \"Cancel\": \"\u041E\u0442\u043C\u0435\u043D\u0430\",\n  \"Cannot seek in the recording\": \"\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043E\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044C \u043F\u043E\u0438\u0441\u043A \u0432 \u0437\u0430\u043F\u0438\u0441\u0438\",\n  \"Channel Missing\": \"\u041A\u0430\u043D\u0430\u043B \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\",\n  \"Close\": \"\u0417\u0430\u043A\u0440\u044B\u0442\u044C\",\n  \"Close emoji picker\": \"\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u043E\u043A\u043D\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0441\u043C\u0430\u0439\u043B\u043E\u0432\",\n  \"Commands matching\": \"\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\",\n  \"Connection failure, reconnecting now...\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F, \u043F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435...\",\n  \"Create\": \"\u0421\u043E\u0437\u0434\u0430\u0442\u044C\",\n  \"Create poll\": \"\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043E\u043F\u0440\u043E\u0441\",\n  \"Current location\": \"\u0422\u0435\u043A\u0443\u0449\u0435\u0435 \u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435\",\n  \"Delete\": \"\u0423\u0434\u0430\u043B\u0438\u0442\u044C\",\n  \"Delete for me\": \"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0434\u043B\u044F \u043C\u0435\u043D\u044F\",\n  \"Delivered\": \"\u041E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E\",\n  \"Download attachment {{ name }}\": \"\u0421\u043A\u0430\u0447\u0430\u0442\u044C \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435 {{ name }}\",\n  \"Drag your files here\": \"\u041F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0432\u0430\u0448\u0438 \u0444\u0430\u0439\u043B\u044B \u0441\u044E\u0434\u0430\",\n  \"Drag your files here to add to your post\": \"\u041F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0432\u0430\u0448\u0438 \u0444\u0430\u0439\u043B\u044B \u0441\u044E\u0434\u0430, \u0447\u0442\u043E\u0431\u044B \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0438\u0445 \u0432 \u0432\u0430\u0448 \u043F\u043E\u0441\u0442\",\n  \"Due {{ timeLeft }}\": \"\u041F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043E \u0432 {{ timeLeft }}\",\n  \"Due since {{ dueSince }}\": \"\u041F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043E \u0441 {{ dueSince }}\",\n  \"duration/Message reminder\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Remind Me\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Share Location\": \"{{ milliseconds | durationFormatter }}\",\n  \"Edit Message\": \"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435\",\n  \"Edit message request failed\": \"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0437\u0430\u043F\u0440\u043E\u0441 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\",\n  \"Edited\": \"\u041E\u0442\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043E\",\n  \"Emoji matching\": \"\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u044D\u043C\u043E\u0434\u0437\u0438\",\n  \"Empty message...\": \"\u041F\u0443\u0441\u0442\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435...\",\n  \"End\": \"\u041A\u043E\u043D\u0435\u0446\",\n  \"End vote\": \"\u0417\u0430\u043A\u043E\u043D\u0447\u0438\u0442\u044C \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u0430\u043D\u0438\u0435\",\n  \"Enforce unique vote is enabled\": \"\u0423\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u0430\u043D\u0438\u0435 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E\",\n  \"Error\": \"\u041E\u0448\u0438\u0431\u043A\u0430\",\n  \"Error \u00B7 Unsent\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u00B7 \u041D\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E\",\n  \"Error adding flag\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0444\u043B\u0430\u0433\u0430\",\n  \"Error connecting to chat, refresh the page to try again.\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u043A \u0447\u0430\u0442\u0443, \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043F\u0440\u043E\u0431\u043E\u0432\u0430\u0442\u044C \u0441\u043D\u043E\u0432\u0430.\",\n  \"Error deleting message\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\",\n  \"Error fetching reactions\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u0440\u0435\u0430\u043A\u0446\u0438\u0439\",\n  \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043E\u0442\u043C\u0435\u0442\u043A\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043A\u0430\u043A \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u043E\u0433\u043E. \u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043E\u0442\u043C\u0435\u0442\u0438\u0442\u044C \u043A\u0430\u043A \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0441\u0442\u0430\u0440\u0448\u0435 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0445 100 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0432 \u043A\u0430\u043D\u0430\u043B\u0435.\",\n  \"Error muting a user ...\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0439 \u043E\u0442 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F...\",\n  \"Error pinning message\": \"\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0435 \u043F\u0440\u0438 \u0437\u0430\u043A\u0440\u0435\u043F\u043B\u0435\u043D\u0438\u0438\",\n  \"Error removing message pin\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438 \u0431\u0443\u043B\u0430\u0432\u043A\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\",\n  \"Error reproducing the recording\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u0432\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0437\u0430\u043F\u0438\u0441\u0438\",\n  \"Error starting recording\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0435 \u0437\u0430\u043F\u0438\u0441\u0438\",\n  \"Error unmuting a user ...\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0439...\",\n  \"Error uploading attachment\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u044F\",\n  \"Error uploading file\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u0444\u0430\u0439\u043B\u0430\",\n  \"Error uploading image\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F\",\n  \"Error: {{ errorMessage }}\": \"\u041E\u0448\u0438\u0431\u043A\u0430: {{ errorMessage }}\",\n  \"Failed to create the poll\": \"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u043E\u043F\u0440\u043E\u0441\",\n  \"Failed to create the poll due to {{reason}}\": \"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u043E\u043F\u0440\u043E\u0441 \u0438\u0437-\u0437\u0430 {{reason}}\",\n  \"Failed to jump to the first unread message\": \"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u0435\u0440\u0432\u043E\u043C\u0443 \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u043E\u043C\u0443 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044E\",\n  \"Failed to mark channel as read\": \"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u043C\u0435\u0442\u0438\u0442\u044C \u043A\u0430\u043D\u0430\u043B \u043A\u0430\u043A \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0439\",\n  \"Failed to play the recording\": \"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0432\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0437\u0430\u043F\u0438\u0441\u044C\",\n  \"Failed to retrieve location\": \"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435\",\n  \"Failed to share location\": \"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F \u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C\",\n  \"File\": \"\u0424\u0430\u0439\u043B\",\n  \"File is too large: {{ size }}, maximum upload size is {{ limit }}\": \"\u0424\u0430\u0439\u043B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0439: {{ size }}, \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0441\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 {{ limit }}\",\n  \"Flag\": \"\u041F\u043E\u0436\u0430\u043B\u043E\u0432\u0430\u0442\u044C\u0441\u044F\",\n  \"Generating...\": \"\u0413\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u044E...\",\n  \"giphy-command-args\": \"[\u0442\u0435\u043A\u0441\u0442]\",\n  \"giphy-command-description\": \"\u041E\u043F\u0443\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u0442\u044C \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u0443\u044E GIF-\u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044E \u0432 \u043A\u0430\u043D\u0430\u043B\u0435\",\n  \"Latest Messages\": \"\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\",\n  \"live\": \"\u0412 \u043F\u0440\u044F\u043C\u043E\u043C \u044D\u0444\u0438\u0440\u0435\",\n  \"Live for {{duration}}\": \"\u0412 \u043F\u0440\u044F\u043C\u043E\u043C \u044D\u0444\u0438\u0440\u0435 {{duration}}\",\n  \"Live location\": \"\u041C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0432 \u043F\u0440\u044F\u043C\u043E\u043C \u044D\u0444\u0438\u0440\u0435\",\n  \"Live until {{ timestamp }}\": \"\u0412 \u043F\u0440\u044F\u043C\u043E\u043C \u044D\u0444\u0438\u0440\u0435 \u0434\u043E {{ timestamp }}\",\n  \"Load more\": \"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435\",\n  \"Location\": \"\u041C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435\",\n  \"Location sharing ended\": \"\u041E\u0431\u043C\u0435\u043D \u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\",\n  \"Mark as unread\": \"\u041E\u0442\u043C\u0435\u0442\u0438\u0442\u044C \u043A\u0430\u043A \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u043E\u0435\",\n  \"Maximum number of votes (from 2 to 10)\": \"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0433\u043E\u043B\u043E\u0441\u043E\u0432 (\u043E\u0442 2 \u0434\u043E 10)\",\n  \"Menu\": \"\u041C\u0435\u043D\u044E\",\n  \"Message deleted\": \"\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0443\u0434\u0430\u043B\u0435\u043D\u043E\",\n  \"Message Failed \u00B7 Click to try again\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u00B7 \u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C\",\n  \"Message Failed \u00B7 Unauthorized\": \"\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u00B7 \u041D\u0435\u0430\u0432\u0442\u043E\u0440\u0438\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0439\",\n  \"Message has been successfully flagged\": \"\u0416\u0430\u043B\u043E\u0431\u0430 \u043D\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0431\u044B\u043B\u0430 \u043F\u0440\u0438\u043D\u044F\u0442\u0430\",\n  \"Message pinned\": \"\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0437\u0430\u043A\u0440\u0435\u043F\u043B\u0435\u043D\u043E\",\n  \"Message was blocked by moderation policies\": \"\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0431\u044B\u043B\u043E \u0437\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043E \u043C\u043E\u0434\u0435\u0440\u0430\u0446\u0438\u0435\u0439\",\n  \"Messages have been marked unread.\": \"\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0431\u044B\u043B\u0438 \u043E\u0442\u043C\u0435\u0447\u0435\u043D\u044B \u043A\u0430\u043A \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0435.\",\n  \"Missing permissions to upload the attachment\": \"\u041E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u044F\",\n  \"Multiple answers\": \"\u041D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043E\u0442\u0432\u0435\u0442\u043E\u0432\",\n  \"Mute\": \"\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F\",\n  \"mute-command-args\": \"[@\u0438\u043C\u044F\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F]\",\n  \"mute-command-description\": \"\u0412\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D \u0443 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\",\n  \"network error\": \"\u043E\u0448\u0438\u0431\u043A\u0430 \u0441\u0435\u0442\u0438\",\n  \"New\": \"\u041D\u043E\u0432\u044B\u0435\",\n  \"New Messages!\": \"\u041D\u043E\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F!\",\n  \"No chats here yet\u2026\": \"\u0417\u0434\u0435\u0441\u044C \u0435\u0449\u0435 \u043D\u0435\u0442 \u0447\u0430\u0442\u043E\u0432...\",\n  \"No results found\": \"\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B\",\n  \"Nobody will be able to vote in this poll anymore.\": \"\u041D\u0438\u043A\u0442\u043E \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u0441\u043C\u043E\u0436\u0435\u0442 \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u0430\u0442\u044C \u0432 \u044D\u0442\u043E\u043C \u043E\u043F\u0440\u043E\u0441\u0435.\",\n  \"Nothing yet...\": \"\u041F\u043E\u043A\u0430 \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435\u0442...\",\n  \"Ok\": \"\u041E\u043A\",\n  \"Only numbers are allowed\": \"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u0446\u0438\u0444\u0440\u044B\",\n  \"Open emoji picker\": \"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432\u044B\u0431\u043E\u0440 \u0441\u043C\u0430\u0439\u043B\u043E\u0432\",\n  \"Option already exists\": \"\u0412\u0430\u0440\u0438\u0430\u043D\u0442 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\",\n  \"Option is empty\": \"\u0412\u0430\u0440\u0438\u0430\u043D\u0442 \u043F\u0443\u0441\u0442\",\n  \"Options\": \"\u0412\u0430\u0440\u0438\u0430\u043D\u0442\u044B\",\n  \"People matching\": \"\u0421\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0449\u0438\u0435 \u043B\u044E\u0434\u0438\",\n  \"Pin\": \"\u0417\u0430\u043A\u0440\u0435\u043F\u0438\u0442\u044C\",\n  \"Pinned by\": \"\u0417\u0430\u043A\u0440\u0435\u043F\u043B\u0435\u043D\u043E\",\n  \"Poll\": \"\u041E\u043F\u0440\u043E\u0441\",\n  \"Poll comments\": \"\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u043A \u043E\u043F\u0440\u043E\u0441\u0443\",\n  \"Poll options\": \"\u041E\u043F\u0446\u0438\u0438 \u043E\u043F\u0440\u043E\u0441\u0430\",\n  \"Poll results\": \"\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043E\u043F\u0440\u043E\u0441\u0430\",\n  \"Question\": \"\u0412\u043E\u043F\u0440\u043E\u0441\",\n  \"Question is required\": \"\u0412\u043E\u043F\u0440\u043E\u0441 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u0435\u043D\",\n  \"Quote\": \"\u0426\u0438\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C\",\n  \"Reached the vote limit. Remove an existing vote first.\": \"\u0414\u043E\u0441\u0442\u0438\u0433\u043D\u0443\u0442 \u043B\u0438\u043C\u0438\u0442 \u0433\u043E\u043B\u043E\u0441\u043E\u0432. \u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u0443\u0434\u0430\u043B\u0438\u0442\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0439 \u0433\u043E\u043B\u043E\u0441.\",\n  \"Recording format is not supported and cannot be reproduced\": \"\u0424\u043E\u0440\u043C\u0430\u0442 \u0437\u0430\u043F\u0438\u0441\u0438 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0438 \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0432\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0434\u0435\u043D\",\n  \"Remind Me\": \"\u041D\u0430\u043F\u043E\u043C\u043D\u0438\u0442\u044C \u043C\u043D\u0435\",\n  \"Remove reminder\": \"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0435\",\n  \"Reply\": \"\u041E\u0442\u0432\u0435\u0442\u0438\u0442\u044C\",\n  \"Reply to Message\": \"\u041E\u0442\u0432\u0435\u0442\u0438\u0442\u044C \u043D\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435\",\n  \"replyCount_one\": \"1 \u043E\u0442\u0432\u0435\u0442\",\n  \"replyCount_few\": \"{{ count }} \u043E\u0442\u0432\u0435\u0442\u043E\u0432\",\n  \"replyCount_many\": \"{{ count }} \u043E\u0442\u0432\u0435\u0442\u043E\u0432\",\n  \"replyCount_other\": \"{{ count }} \u043E\u0442\u0432\u0435\u0442\u043E\u0432\",\n  \"Save for later\": \"\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u043D\u0430 \u043F\u043E\u0442\u043E\u043C\",\n  \"Saved for later\": \"\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043E \u043D\u0430 \u043F\u043E\u0442\u043E\u043C\",\n  \"Search\": \"\u041F\u043E\u0438\u0441\u043A\",\n  \"search-results-header-filter-source-button-label--channels\": \"\u043A\u0430\u043D\u0430\u043B\u044B\",\n  \"search-results-header-filter-source-button-label--messages\": \"\u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\",\n  \"search-results-header-filter-source-button-label--users\": \"\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438\",\n  \"Searching for {{ searchSourceType }}...\": \"\u041F\u043E\u0438\u0441\u043A {{ searchSourceType }}...\",\n  \"Searching...\": \"\u0418\u0449\u0435\u043C...\",\n  \"searchResultsCount_one\": \"1 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\",\n  \"searchResultsCount_few\": \"{{ count }} \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430\",\n  \"searchResultsCount_many\": \"{{ count }} \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432\",\n  \"searchResultsCount_other\": \"{{ count }} \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432\",\n  \"See all options ({{count}})_one\": \"\u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B ({{count}})\",\n  \"See all options ({{count}})_few\": \"\u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B ({{count}})\",\n  \"See all options ({{count}})_many\": \"\u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B ({{count}})\",\n  \"See all options ({{count}})_other\": \"\u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B ({{count}})\",\n  \"Select one\": \"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043E\u0434\u0438\u043D\",\n  \"Select one or more\": \"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043E\u0434\u0438\u043D \u0438\u043B\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E\",\n  \"Select up to {{count}}_one\": \"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u043E {{count}}\",\n  \"Select up to {{count}}_few\": \"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u043E {{count}}\",\n  \"Select up to {{count}}_many\": \"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u043E {{count}}\",\n  \"Select up to {{count}}_other\": \"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u043E {{count}}\",\n  \"Send\": \"\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C\",\n  \"Send Anyway\": \"\u041C\u043D\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043D\u043E, \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C\",\n  \"Send message request failed\": \"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0437\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u0443 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\",\n  \"Sending...\": \"\u041E\u0442\u043F\u0440\u0430\u0432\u043A\u0430...\",\n  \"Sent\": \"\u041E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E\",\n  \"Share\": \"\u041F\u043E\u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F\",\n  \"Share live location for\": \"\u041F\u043E\u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F \u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C \u0432 \u043F\u0440\u044F\u043C\u043E\u043C \u044D\u0444\u0438\u0440\u0435 \u043D\u0430\",\n  \"Share Location\": \"\u041F\u043E\u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F \u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C\",\n  \"Shared live location\": \"\u041E\u0431\u0449\u0435\u0435 \u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0432 \u043F\u0440\u044F\u043C\u043E\u043C \u044D\u0444\u0438\u0440\u0435\",\n  \"Show all\": \"\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432\u0441\u0435\",\n  \"Shuffle\": \"\u041F\u0435\u0440\u0435\u043C\u0435\u0448\u0430\u0442\u044C\",\n  \"size limit\": \"\u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u0435 \u0440\u0430\u0437\u043C\u0435\u0440\u0430\",\n  \"Slow Mode ON\": \"\u041C\u0435\u0434\u043B\u0435\u043D\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C \u0432\u043A\u043B\u044E\u0447\u0435\u043D\",\n  \"Some of the files will not be accepted\": \"\u041D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0444\u0430\u0439\u043B\u044B \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043F\u0440\u0438\u043D\u044F\u0442\u044B\",\n  \"Start typing to search\": \"\u041D\u0430\u0447\u043D\u0438\u0442\u0435 \u0432\u0432\u043E\u0434\u0438\u0442\u044C \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430\",\n  \"Stop sharing\": \"\u041F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u0442\u044C \u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F\",\n  \"Submit\": \"\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C\",\n  \"Suggest an option\": \"\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0438\u0442\u044C \u0432\u0430\u0440\u0438\u0430\u043D\u0442\",\n  \"Thinking...\": \"\u0414\u0443\u043C\u0430\u044E...\",\n  \"this content could not be displayed\": \"\u042D\u0442\u043E\u0442 \u043A\u043E\u043D\u0442\u0435\u043D\u0442 \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D \u0432 \u0434\u0430\u043D\u043D\u044B\u0439 \u043C\u043E\u043C\u0435\u043D\u0442\",\n  \"This field cannot be empty or contain only spaces\": \"\u042D\u0442\u043E \u043F\u043E\u043B\u0435 \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043F\u0443\u0441\u0442\u044B\u043C \u0438\u043B\u0438 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u043E\u0431\u0435\u043B\u044B\",\n  \"This message did not meet our content guidelines\": \"\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043D\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043C\",\n  \"This message was deleted...\": \"\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0431\u044B\u043B\u043E \u0443\u0434\u0430\u043B\u0435\u043D\u043E...\",\n  \"Thread\": \"\u0412\u0435\u0442\u043A\u0430\",\n  \"Thread has not been found\": \"\u0412\u0435\u0442\u043A\u0430 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430\",\n  \"Thread reply\": \"\u041E\u0442\u0432\u0435\u0442 \u0432 \u0432\u0435\u0442\u043A\u0435\",\n  \"timestamp/DateSeparator\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/LiveLocation\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/MessageTimestamp\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/PollVote\": \"{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}\",\n  \"timestamp/PollVoteTooltip\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/ReminderNotification\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/SystemMessage\": \"{{ timestamp | timestampFormatter(format: dddd L) }}\",\n  \"To start recording, allow the camera access in your browser\": \"\u0414\u043B\u044F \u043D\u0430\u0447\u0430\u043B\u0430 \u0437\u0430\u043F\u0438\u0441\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0435 \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u043A\u0430\u043C\u0435\u0440\u0435 \u0432 \u0432\u0430\u0448\u0435\u043C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435\",\n  \"To start recording, allow the microphone access in your browser\": \"\u0414\u043B\u044F \u043D\u0430\u0447\u0430\u043B\u0430 \u0437\u0430\u043F\u0438\u0441\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0435 \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D\u0443 \u0432 \u0432\u0430\u0448\u0435\u043C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435\",\n  \"translationBuilderTopic/notification\": \"{{value, notification}}\",\n  \"Type a number from 2 to 10\": \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0447\u0438\u0441\u043B\u043E \u043E\u0442 2 \u0434\u043E 10\",\n  \"Type your message\": \"\u0412\u0430\u0448\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435\",\n  \"Unarchive\": \"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430\",\n  \"unban-command-args\": \"[@\u0438\u043C\u044F\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F]\",\n  \"unban-command-description\": \"\u0420\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\",\n  \"unknown error\": \"\u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430\",\n  \"Unmute\": \"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F\",\n  \"unmute-command-args\": \"[@\u0438\u043C\u044F\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F]\",\n  \"unmute-command-description\": \"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D \u0443 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\",\n  \"Unpin\": \"\u041E\u0442\u043A\u0440\u0435\u043F\u0438\u0442\u044C\",\n  \"Unread messages\": \"\u041D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\",\n  \"unreadMessagesSeparatorText_one\": \"1 \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435\",\n  \"unreadMessagesSeparatorText_few\": \"1 \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\",\n  \"unreadMessagesSeparatorText_many\": \"{{count}} \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439\",\n  \"unreadMessagesSeparatorText_other\": \"{{count}} \u043D\u0435\u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439\",\n  \"Unsupported attachment\": \"\u041D\u0435\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u043E\u0435 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435\",\n  \"unsupported file type\": \"\u043D\u0435\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0439 \u0442\u0438\u043F \u0444\u0430\u0439\u043B\u0430\",\n  \"Update your comment\": \"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u0432\u0430\u0448 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439\",\n  \"Upload type: \\\"{{ type }}\\\" is not allowed\": \"\u0422\u0438\u043F \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438: \\\"{{ type }}\\\" \u043D\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\",\n  \"User uploaded content\": \"\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043B \u043A\u043E\u043D\u0442\u0435\u043D\u0442\",\n  \"View {{count}} comments_one\": \"\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C {{count}} \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439\",\n  \"View {{count}} comments_few\": \"\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C {{count}} \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432\",\n  \"View {{count}} comments_many\": \"\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C {{count}} \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432\",\n  \"View {{count}} comments_other\": \"\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C {{count}} \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432\",\n  \"View results\": \"\u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B\",\n  \"Voice message\": \"\u0413\u043E\u043B\u043E\u0441\u043E\u0432\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435\",\n  \"Vote ended\": \"\u0413\u043E\u043B\u043E\u0441\u043E\u0432\u0430\u043D\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E\",\n  \"Wait until all attachments have uploaded\": \"\u041F\u043E\u0434\u043E\u0436\u0434\u0438\u0442\u0435, \u043F\u043E\u043A\u0430 \u0432\u0441\u0435 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0437\u0430\u0433\u0440\u0443\u0437\u044F\u0442\u0441\u044F\",\n  \"You\": \"\u0412\u044B\",\n  \"You have no channels currently\": \"\u0423 \u0432\u0430\u0441 \u043D\u0435\u0442 \u043A\u0430\u043D\u0430\u043B\u043E\u0432 \u0432 \u0434\u0430\u043D\u043D\u044B\u0439 \u043C\u043E\u043C\u0435\u043D\u0442\",\n  \"You've reached the maximum number of files\": \"\u0412\u044B \u0434\u043E\u0441\u0442\u0438\u0433\u043B\u0438 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0444\u0430\u0439\u043B\u043E\u0432\"\n}\n", "{\n  \"{{ commaSeparatedUsers }} and {{ moreCount }} more\": \"{{ commaSeparatedUsers }} ve {{ moreCount }} daha\",\n  \"{{ commaSeparatedUsers }}, and {{ lastUser }}\": \"{{ commaSeparatedUsers }} ve {{ lastUser }}\",\n  \"{{ firstUser }} and {{ secondUser }}\": \"{{ firstUser }} ve {{ secondUser }}\",\n  \"{{ imageCount }} more\": \"{{ imageCount }} adet daha\",\n  \"{{ memberCount }} members\": \"{{ memberCount }} \u00FCye\",\n  \"{{ user }} has been muted\": \"{{ user }} sessize al\u0131nd\u0131\",\n  \"{{ user }} has been unmuted\": \"{{ user }} sesi a\u00E7\u0131ld\u0131\",\n  \"{{ user }} is typing...\": \"{{ user }} yaz\u0131yor...\",\n  \"{{ users }} and {{ user }} are typing...\": \"{{ users }} ve {{ user }} yaz\u0131yor...\",\n  \"{{ users }} and more are typing...\": \"{{ users }} ve di\u011Ferleri yaz\u0131yor...\",\n  \"{{ watcherCount }} online\": \"{{ watcherCount }} \u00E7evrimi\u00E7i\",\n  \"{{count}} unread_one\": \"{{count}} okunmam\u0131\u015F\",\n  \"{{count}} unread_other\": \"{{count}} okunmam\u0131\u015F\",\n  \"{{count}} votes_one\": \"{{count}} oy\",\n  \"{{count}} votes_other\": \"{{count}} oy\",\n  \"\uD83C\uDFD9 Attachment...\": \"\uD83C\uDFD9 Ek...\",\n  \"\uD83D\uDCCA {{createdBy}} created: {{ pollName}}\": \"\uD83D\uDCCA {{createdBy}} olu\u015Fturdu: {{ pollName}}\",\n  \"\uD83D\uDCCA {{votedBy}} voted: {{pollOptionText}}\": \"\uD83D\uDCCA {{votedBy}} oy verdi: {{pollOptionText}}\",\n  \"\uD83D\uDCCDShared location\": \"\uD83D\uDCCDPayla\u015F\u0131lan konum\",\n  \"Add a comment\": \"Yorum ekle\",\n  \"Add an option\": \"Bir se\u00E7enek ekle\",\n  \"All results loaded\": \"T\u00FCm sonu\u00E7lar y\u00FCklendi\",\n  \"Allow access to camera\": \"Kameraya eri\u015Fime izin ver\",\n  \"Allow access to microphone\": \"Mikrofona eri\u015Fime izin ver\",\n  \"Allow comments\": \"Yorumlara izin ver\",\n  \"Allow option suggestion\": \"Se\u00E7enek \u00F6nerisine izin ver\",\n  \"Also send as a direct message\": \"Ayr\u0131ca do\u011Frudan mesaj olarak g\u00F6nder\",\n  \"Also send in channel\": \"Ayr\u0131ca kanala g\u00F6nder\",\n  \"An error has occurred during recording\": \"Kay\u0131t s\u0131ras\u0131nda bir hata olu\u015Ftu\",\n  \"An error has occurred during the recording processing\": \"Kay\u0131t i\u015Flemi s\u0131ras\u0131nda bir hata olu\u015Ftu\",\n  \"Anonymous\": \"Anonim\",\n  \"Anonymous poll\": \"Anonim anket\",\n  \"Archive\": \"Ar\u015Fivle\",\n  \"aria/Attachment\": \"Ek\",\n  \"aria/Cancel Reply\": \"Cevab\u0131 \u0130ptal Et\",\n  \"aria/Cancel upload\": \"Y\u00FCklemeyi \u0130ptal Et\",\n  \"aria/Channel list\": \"Kanal listesi\",\n  \"aria/Channel search results\": \"Kanal arama sonu\u00E7lar\u0131\",\n  \"aria/Close thread\": \"Konuyu kapat\",\n  \"aria/Download attachment\": \"Ek indir\",\n  \"aria/Emoji picker\": \"Emoji se\u00E7ici\",\n  \"aria/File input\": \"Dosya giri\u015Fi\",\n  \"aria/File upload\": \"Dosya y\u00FCkleme\",\n  \"aria/Image input\": \"Resim giri\u015Fi\",\n  \"aria/Load More Channels\": \"Daha Fazla Kanal Y\u00FCkle\",\n  \"aria/Menu\": \"Men\u00FC\",\n  \"aria/Message Options\": \"Mesaj Se\u00E7enekleri\",\n  \"aria/Open Attachment Selector\": \"Ek Se\u00E7iciyi A\u00E7\",\n  \"aria/Open Menu\": \"Men\u00FCy\u00FC A\u00E7\",\n  \"aria/Open Message Actions Menu\": \"Mesaj \u0130\u015Flemleri Men\u00FCs\u00FCn\u00FC A\u00E7\",\n  \"aria/Open Reaction Selector\": \"Tepki Se\u00E7iciyi A\u00E7\",\n  \"aria/Open Thread\": \"Konuyu A\u00E7\",\n  \"aria/Reaction list\": \"Tepki listesi\",\n  \"aria/Remind Me Options\": \"Hat\u0131rlatma se\u00E7enekleri\",\n  \"aria/Remove attachment\": \"Eki kald\u0131r\",\n  \"aria/Remove location attachment\": \"Konum ekini kald\u0131r\",\n  \"aria/Retry upload\": \"Y\u00FCklemeyi Tekrar Dene\",\n  \"aria/Search results\": \"Arama sonu\u00E7lar\u0131\",\n  \"aria/Search results header filter button\": \"Arama sonu\u00E7lar\u0131 ba\u015Fl\u0131k filtre d\u00FC\u011Fmesi\",\n  \"aria/Send\": \"G\u00F6nder\",\n  \"aria/Stop AI Generation\": \"Yapay Zeka \u00DCretimini Durdur\",\n  \"Ask a question\": \"Bir soru sor\",\n  \"Attach\": \"Ekle\",\n  \"Attach files\": \"Dosya ekle\",\n  \"Attachment upload blocked due to {{reason}}\": \"{{reason}} nedeniyle ek y\u00FCkleme engellendi\",\n  \"Attachment upload failed due to {{reason}}\": \"{{reason}} nedeniyle ek y\u00FCkleme ba\u015Far\u0131s\u0131z oldu\",\n  \"ban-command-args\": \"[@kullan\u0131c\u0131ad\u0131] [metin]\",\n  \"ban-command-description\": \"Bir kullan\u0131c\u0131y\u0131 yasakla\",\n  \"Cancel\": \"\u0130ptal\",\n  \"Cannot seek in the recording\": \"Kay\u0131tta arama yap\u0131lam\u0131yor\",\n  \"Channel Missing\": \"Kanal bulunam\u0131yor\",\n  \"Close\": \"Kapat\",\n  \"Close emoji picker\": \"Emoji se\u00E7iciyi kapat\",\n  \"Commands matching\": \"E\u015Fle\u015Fen komutlar\",\n  \"Connection failure, reconnecting now...\": \"Ba\u011Flant\u0131 hatas\u0131, tekrar ba\u011Flan\u0131l\u0131yor...\",\n  \"Create\": \"Olu\u015Ftur\",\n  \"Create poll\": \"Anket olu\u015Ftur\",\n  \"Current location\": \"Mevcut konum\",\n  \"Delete\": \"Sil\",\n  \"Delete for me\": \"Benim i\u00E7in sil\",\n  \"Delivered\": \"\u0130letildi\",\n  \"Download attachment {{ name }}\": \"Ek {{ name }}'i indir\",\n  \"Drag your files here\": \"Dosyalar\u0131n\u0131z\u0131 buraya s\u00FCr\u00FCkleyin\",\n  \"Drag your files here to add to your post\": \"G\u00F6nderinize eklemek i\u00E7in dosyalar\u0131n\u0131z\u0131 buraya s\u00FCr\u00FCkleyin\",\n  \"Due {{ timeLeft }}\": \"{{ timeLeft }} i\u00E7inde s\u00FCresi dolacak\",\n  \"Due since {{ dueSince }}\": \"{{ dueSince }}'den beri s\u00FCresi dolmu\u015F\",\n  \"duration/Message reminder\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Remind Me\": \"{{ milliseconds | durationFormatter(withSuffix: true) }}\",\n  \"duration/Share Location\": \"{{ milliseconds | durationFormatter }}\",\n  \"Edit Message\": \"Mesaj\u0131 D\u00FCzenle\",\n  \"Edit message request failed\": \"Mesaj d\u00FCzenleme iste\u011Fi ba\u015Far\u0131s\u0131z oldu\",\n  \"Edited\": \"D\u00FCzenlendi\",\n  \"Emoji matching\": \"Emoji e\u015Fle\u015Ftirme\",\n  \"Empty message...\": \"Bo\u015F mesaj...\",\n  \"End\": \"Son\",\n  \"End vote\": \"Oyu bitir\",\n  \"Enforce unique vote is enabled\": \"Benzersiz oy etkinle\u015Ftirildi\",\n  \"Error\": \"Hata\",\n  \"Error \u00B7 Unsent\": \"Hata \u00B7 G\u00F6nderilemedi\",\n  \"Error adding flag\": \"Bayrak eklenirken hata olu\u015Ftu\",\n  \"Error connecting to chat, refresh the page to try again.\": \"Ba\u011Flant\u0131 hatas\u0131, sayfay\u0131 yenileyip tekrar deneyin.\",\n  \"Error deleting message\": \"Mesaj silinirken hata olu\u015Ftu\",\n  \"Error fetching reactions\": \"Reaksiyonlar al\u0131n\u0131rken hata olu\u015Ftu\",\n  \"Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.\": \"Mesaj\u0131 okunmam\u0131\u015F olarak i\u015Faretleme hatas\u0131. En yeni 100 kanal mesaj\u0131ndan daha eski okunmam\u0131\u015F mesajlar\u0131 i\u015Faretleme yap\u0131lamaz.\",\n  \"Error muting a user ...\": \"Kullan\u0131c\u0131y\u0131 sessize al\u0131rken hata olu\u015Ftu ...\",\n  \"Error pinning message\": \"Mesaj sabitlenirken hata olu\u015Ftu\",\n  \"Error removing message pin\": \"Mesaj PIN'i kald\u0131r\u0131l\u0131rken hata olu\u015Ftu\",\n  \"Error reproducing the recording\": \"Kayd\u0131 yeniden \u00FCretme hatas\u0131\",\n  \"Error starting recording\": \"Kay\u0131t ba\u015Flat\u0131l\u0131rken hata olu\u015Ftu\",\n  \"Error unmuting a user ...\": \"Kullan\u0131c\u0131n\u0131n sesini a\u00E7arken hata olu\u015Ftu ...\",\n  \"Error uploading attachment\": \"Ek y\u00FCklenirken hata olu\u015Ftu\",\n  \"Error uploading file\": \"Dosya y\u00FCklenirken hata olu\u015Ftu\",\n  \"Error uploading image\": \"Resmi y\u00FCklerken hata\",\n  \"Error: {{ errorMessage }}\": \"Hata: {{ errorMessage }}\",\n  \"Failed to create the poll\": \"Anket olu\u015Fturulurken hata olu\u015Ftu\",\n  \"Failed to create the poll due to {{reason}}\": \"{{reason}} nedeniyle anket olu\u015Fturulamad\u0131\",\n  \"Failed to jump to the first unread message\": \"\u0130lk okunmam\u0131\u015F mesaja atlamada hata olu\u015Ftu\",\n  \"Failed to mark channel as read\": \"Kanal\u0131 okundu olarak i\u015Faretleme ba\u015Far\u0131s\u0131z oldu\",\n  \"Failed to play the recording\": \"Kay\u0131t oynat\u0131lamad\u0131\",\n  \"Failed to retrieve location\": \"Konum al\u0131namad\u0131\",\n  \"Failed to share location\": \"Konum payla\u015F\u0131lamad\u0131\",\n  \"File\": \"Dosya\",\n  \"File is too large: {{ size }}, maximum upload size is {{ limit }}\": \"Dosya \u00E7ok b\u00FCy\u00FCk: {{ size }}, maksimum y\u00FCkleme boyutu {{ limit }}\",\n  \"Flag\": \"Bayrak\",\n  \"Generating...\": \"Olu\u015Fturuluyor...\",\n  \"giphy-command-args\": \"[metin]\",\n  \"giphy-command-description\": \"Rastgele bir gif'i kanala g\u00F6nder\",\n  \"Latest Messages\": \"Son Mesajlar\",\n  \"live\": \"canl\u0131\",\n  \"Live for {{duration}}\": \"{{duration}} boyunca canl\u0131\",\n  \"Live location\": \"Canl\u0131 konum\",\n  \"Live until {{ timestamp }}\": \"{{ timestamp }}'e kadar canl\u0131\",\n  \"Load more\": \"Daha fazla y\u00FCkle\",\n  \"Location\": \"Konum\",\n  \"Location sharing ended\": \"Konum payla\u015F\u0131m\u0131 sona erdi\",\n  \"Mark as unread\": \"Okunmam\u0131\u015F olarak i\u015Faretle\",\n  \"Maximum number of votes (from 2 to 10)\": \"Maksimum oy say\u0131s\u0131 (2 ile 10 aras\u0131)\",\n  \"Menu\": \"Men\u00FC\",\n  \"Message deleted\": \"Mesaj silindi\",\n  \"Message Failed \u00B7 Click to try again\": \"Mesaj Ba\u015Far\u0131s\u0131z \u00B7 Tekrar denemek i\u00E7in t\u0131klay\u0131n\",\n  \"Message Failed \u00B7 Unauthorized\": \"Mesaj Ba\u015Far\u0131s\u0131z \u00B7 Yetkisiz\",\n  \"Message has been successfully flagged\": \"Mesaj ba\u015Far\u0131yla bayrakland\u0131\",\n  \"Message pinned\": \"Mesaj sabitlendi\",\n  \"Message was blocked by moderation policies\": \"Mesaj moderasyon politikalar\u0131 taraf\u0131ndan engellendi\",\n  \"Messages have been marked unread.\": \"Mesajlar okunmam\u0131\u015F olarak i\u015Faretlendi.\",\n  \"Missing permissions to upload the attachment\": \"Ek y\u00FCklemek i\u00E7in izinler eksik\",\n  \"Multiple answers\": \"\u00C7oklu cevaplar\",\n  \"Mute\": \"Sessiz\",\n  \"mute-command-args\": \"[@kullan\u0131c\u0131ad\u0131]\",\n  \"mute-command-description\": \"Bir kullan\u0131c\u0131n\u0131n sesini kapat\",\n  \"network error\": \"a\u011F hatas\u0131\",\n  \"New\": \"Yeni\",\n  \"New Messages!\": \"Yeni Mesajlar!\",\n  \"No chats here yet\u2026\": \"Hen\u00FCz burada sohbet yok...\",\n  \"No results found\": \"Sonu\u00E7 bulunamad\u0131\",\n  \"Nobody will be able to vote in this poll anymore.\": \"Art\u0131k bu ankette kimse oy kullanamayacak.\",\n  \"Nothing yet...\": \"\u015Eimdilik hi\u00E7bir \u015Fey...\",\n  \"Ok\": \"Tamam\",\n  \"Only numbers are allowed\": \"Sadece say\u0131lar kullan\u0131labilir\",\n  \"Open emoji picker\": \"Emoji klavyesini a\u00E7\",\n  \"Option already exists\": \"Se\u00E7enek zaten mevcut\",\n  \"Option is empty\": \"Se\u00E7enek bo\u015F\",\n  \"Options\": \"Se\u00E7enekler\",\n  \"People matching\": \"E\u015Fle\u015Fen ki\u015Filer\",\n  \"Pin\": \"Sabitle\",\n  \"Pinned by\": \"Sabitleyen\",\n  \"Poll\": \"Anket\",\n  \"Poll comments\": \"Anket yorumlar\u0131\",\n  \"Poll options\": \"Anket se\u00E7enekleri\",\n  \"Poll results\": \"Anket sonu\u00E7lar\u0131\",\n  \"Question\": \"Soru\",\n  \"Question is required\": \"Soru gereklidir\",\n  \"Quote\": \"Al\u0131nt\u0131\",\n  \"Reached the vote limit. Remove an existing vote first.\": \"Oylama s\u0131n\u0131r\u0131na ula\u015F\u0131ld\u0131. \u00D6nce mevcut bir oyu kald\u0131r\u0131n.\",\n  \"Recording format is not supported and cannot be reproduced\": \"Kay\u0131t format\u0131 desteklenmiyor ve \u00E7o\u011Falt\u0131lam\u0131yor\",\n  \"Remind Me\": \"Hat\u0131rlat\",\n  \"Remove reminder\": \"Hat\u0131rlat\u0131c\u0131y\u0131 kald\u0131r\",\n  \"Reply\": \"Cevapla\",\n  \"Reply to Message\": \"Mesaja Cevapla\",\n  \"replyCount_one\": \"1 cevap\",\n  \"replyCount_other\": \"{{ count }} cevap\",\n  \"Save for later\": \"Daha sonra kaydet\",\n  \"Saved for later\": \"Daha sonra kaydedildi\",\n  \"Search\": \"Arama\",\n  \"search-results-header-filter-source-button-label--channels\": \"kanallar\",\n  \"search-results-header-filter-source-button-label--messages\": \"mesajlar\",\n  \"search-results-header-filter-source-button-label--users\": \"kullan\u0131c\u0131lar\",\n  \"Searching for {{ searchSourceType }}...\": \"{{ searchSourceType }} aran\u0131yor...\",\n  \"Searching...\": \"Aran\u0131yor...\",\n  \"searchResultsCount_one\": \"1 sonu\u00E7\",\n  \"searchResultsCount_other\": \"{{ count }} sonu\u00E7\",\n  \"See all options ({{count}})_one\": \"T\u00FCm se\u00E7enekleri g\u00F6ster ({{count}})\",\n  \"See all options ({{count}})_other\": \"T\u00FCm se\u00E7enekleri g\u00F6ster ({{count}})\",\n  \"Select one\": \"Birini se\u00E7in\",\n  \"Select one or more\": \"Bir veya daha fazlas\u0131n\u0131 se\u00E7in\",\n  \"Select up to {{count}}_one\": \"En fazla {{count}}'yi se\u00E7in\",\n  \"Select up to {{count}}_other\": \"En fazla {{count}}'yi se\u00E7in\",\n  \"Send\": \"G\u00F6nder\",\n  \"Send Anyway\": \"Yine de g\u00F6nder\",\n  \"Send message request failed\": \"Mesaj g\u00F6nderme iste\u011Fi ba\u015Far\u0131s\u0131z oldu\",\n  \"Sending...\": \"G\u00F6nderiliyor...\",\n  \"Sent\": \"G\u00F6nderildi\",\n  \"Share\": \"Payla\u015F\",\n  \"Share live location for\": \"Canl\u0131 konum payla\u015F\",\n  \"Share Location\": \"Konum Payla\u015F\",\n  \"Shared live location\": \"Payla\u015F\u0131lan canl\u0131 konum\",\n  \"Show all\": \"T\u00FCm\u00FCn\u00FC g\u00F6ster\",\n  \"Shuffle\": \"Kar\u0131\u015Ft\u0131r\",\n  \"size limit\": \"boyut s\u0131n\u0131r\u0131\",\n  \"Slow Mode ON\": \"Yava\u015F Mod A\u00E7\u0131k\",\n  \"Some of the files will not be accepted\": \"Baz\u0131 dosyalar kabul edilmeyecek\",\n  \"Start typing to search\": \"Aramak i\u00E7in yazmaya ba\u015Flay\u0131n\",\n  \"Stop sharing\": \"Payla\u015F\u0131m\u0131 durdur\",\n  \"Submit\": \"G\u00F6nder\",\n  \"Suggest an option\": \"Bir se\u00E7enek \u00F6nerin\",\n  \"Thinking...\": \"D\u00FC\u015F\u00FCn\u00FCyor...\",\n  \"this content could not be displayed\": \"bu i\u00E7erik g\u00F6sterilemiyor\",\n  \"This field cannot be empty or contain only spaces\": \"Bu alan bo\u015F olamaz veya sadece bo\u015Fluk i\u00E7eremez\",\n  \"This message did not meet our content guidelines\": \"Bu mesaj i\u00E7erik y\u00F6nergelerimize uygun de\u011Fil\",\n  \"This message was deleted...\": \"Bu mesaj silindi...\",\n  \"Thread\": \"Konu\",\n  \"Thread has not been found\": \"Konu bulunamad\u0131\",\n  \"Thread reply\": \"Konu yan\u0131t\u0131\",\n  \"timestamp/DateSeparator\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/LiveLocation\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/MessageTimestamp\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/PollVote\": \"{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}\",\n  \"timestamp/PollVoteTooltip\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/ReminderNotification\": \"{{ timestamp | timestampFormatter(calendar: true) }}\",\n  \"timestamp/SystemMessage\": \"{{ timestamp | timestampFormatter(format: dddd L) }}\",\n  \"To start recording, allow the camera access in your browser\": \"Kay\u0131t yapmaya ba\u015Flamak i\u00E7in taray\u0131c\u0131n\u0131zda kameraya eri\u015Fime izin verin\",\n  \"To start recording, allow the microphone access in your browser\": \"Kay\u0131t yapmaya ba\u015Flamak i\u00E7in taray\u0131c\u0131n\u0131zda mikrofona eri\u015Fime izin verin\",\n  \"translationBuilderTopic/notification\": \"{{value, notification}}\",\n  \"Type a number from 2 to 10\": \"2 ile 10 aras\u0131nda bir say\u0131 yaz\u0131n\",\n  \"Type your message\": \"Mesaj\u0131n\u0131z\u0131 yaz\u0131n\",\n  \"Unarchive\": \"Ar\u015Fivden \u00E7\u0131kar\",\n  \"unban-command-args\": \"[@kullan\u0131c\u0131ad\u0131]\",\n  \"unban-command-description\": \"Bir kullan\u0131c\u0131n\u0131n yasa\u011F\u0131n\u0131 kald\u0131r\",\n  \"unknown error\": \"bilinmeyen hata\",\n  \"Unmute\": \"Sesini a\u00E7\",\n  \"unmute-command-args\": \"[@kullan\u0131c\u0131ad\u0131]\",\n  \"unmute-command-description\": \"Bir kullan\u0131c\u0131n\u0131n sesini a\u00E7\",\n  \"Unpin\": \"Sabitlemeyi kald\u0131r\",\n  \"Unread messages\": \"Okunmam\u0131\u015F mesajlar\",\n  \"unreadMessagesSeparatorText_one\": \"1 okunmam\u0131\u015F mesaj\",\n  \"unreadMessagesSeparatorText_other\": \"{{count}} okunmam\u0131\u015F mesaj\",\n  \"Unsupported attachment\": \"Desteklenmeyen ek\",\n  \"unsupported file type\": \"desteklenmeyen dosya t\u00FCr\u00FC\",\n  \"Update your comment\": \"Yorumunuzu g\u00FCncelleyin\",\n  \"Upload type: \\\"{{ type }}\\\" is not allowed\": \"Y\u00FCkleme t\u00FCr\u00FC: \\\"{{ type }}\\\" izin verilmez\",\n  \"User uploaded content\": \"Kullan\u0131c\u0131 taraf\u0131ndan y\u00FCklenen i\u00E7erik\",\n  \"View {{count}} comments_one\": \"{{count}} yorumu g\u00F6r\u00FCnt\u00FCle\",\n  \"View {{count}} comments_other\": \"{{count}} yorumu g\u00F6r\u00FCnt\u00FCle\",\n  \"View results\": \"Sonu\u00E7lar\u0131 g\u00F6r\u00FCnt\u00FCle\",\n  \"Voice message\": \"Sesli mesaj\",\n  \"Vote ended\": \"Oylama sona erdi\",\n  \"Wait until all attachments have uploaded\": \"T\u00FCm ekler y\u00FCklenene kadar bekleyin\",\n  \"You\": \"Sen\",\n  \"You have no channels currently\": \"Hen\u00FCz kanal\u0131n\u0131z yok\",\n  \"You've reached the maximum number of files\": \"Maksimum dosya say\u0131s\u0131na ula\u015Ft\u0131n\u0131z\"\n}\n", "import i18n from 'i18next';\nimport Dayjs from 'dayjs';\nimport calendar from 'dayjs/plugin/calendar';\nimport updateLocale from 'dayjs/plugin/updateLocale';\nimport LocalizedFormat from 'dayjs/plugin/localizedFormat';\nimport localeData from 'dayjs/plugin/localeData';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport duration from 'dayjs/plugin/duration';\nimport utc from 'dayjs/plugin/utc';\nimport timezone from 'dayjs/plugin/timezone';\nimport { NotificationTranslationTopic, TranslationBuilder } from './TranslationBuilder';\nimport { defaultTranslatorFunction, predefinedFormatters } from './utils';\n\nimport type { TFunction } from 'i18next';\nimport type momentTimezone from 'moment-timezone';\nimport type { TranslationLanguages } from 'stream-chat';\n\nimport type { TranslationTopicConstructor } from './TranslationBuilder';\nimport type { UnknownType } from '../types/types';\nimport type { CustomFormatters, PredefinedFormatters, TDateTimeParser } from './types';\n\nimport {\n  deTranslations,\n  enTranslations,\n  esTranslations,\n  frTranslations,\n  hiTranslations,\n  itTranslations,\n  jaTranslations,\n  koTranslations,\n  nlTranslations,\n  ptTranslations,\n  ruTranslations,\n  trTranslations,\n} from './translations';\n\nimport 'dayjs/locale/de';\nimport 'dayjs/locale/es';\nimport 'dayjs/locale/fr';\nimport 'dayjs/locale/hi';\nimport 'dayjs/locale/it';\nimport 'dayjs/locale/ja';\nimport 'dayjs/locale/ko';\nimport 'dayjs/locale/nl';\nimport 'dayjs/locale/pt';\nimport 'dayjs/locale/ru';\nimport 'dayjs/locale/tr';\n// These locale imports also set these locale globally.\n// So As a last step I am going to import english locale\n// to make sure I don't mess up language at other places in app.\nimport 'dayjs/locale/en';\n\nconst defaultNS = 'translation';\nconst defaultLng = 'en';\n\ntype CalendarLocaleConfig = {\n  lastDay: string;\n  lastWeek: string;\n  nextDay: string;\n  nextWeek: string;\n  sameDay: string;\n  sameElse: string;\n};\n\nDayjs.extend(updateLocale);\nDayjs.extend(utc);\nDayjs.extend(timezone);\n\nDayjs.updateLocale('de', {\n  calendar: {\n    lastDay: '[gestern um] LT',\n    lastWeek: '[letzten] dddd [um] LT',\n    nextDay: '[morgen um] LT',\n    nextWeek: 'dddd [um] LT',\n    sameDay: '[heute um] LT',\n    sameElse: 'L',\n  },\n});\n\nDayjs.updateLocale('es', {\n  calendar: {\n    lastDay: '[ayer a las] LT',\n    lastWeek: '[pasado] dddd [a] LT',\n    nextDay: '[ma\u00F1ana a] LT',\n    nextWeek: 'dddd [a] LT',\n    sameDay: '[hoy a las] LT',\n    sameElse: 'L',\n  },\n});\n\nDayjs.updateLocale('fr', {\n  calendar: {\n    lastDay: '[Hier \u00E0] LT',\n    lastWeek: 'dddd [dernier \u00E0] LT',\n    nextDay: '[Demain \u00E0] LT',\n    nextWeek: 'dddd [\u00E0] LT',\n    sameDay: \"[Aujourd'hui \u00E0] LT\",\n    sameElse: 'L',\n  },\n});\n\nDayjs.updateLocale('hi', {\n  calendar: {\n    lastDay: '[\u0915\u0932] LT',\n    lastWeek: '[\u092A\u093F\u091B\u0932\u0947] dddd, LT',\n    nextDay: '[\u0915\u0932] LT',\n    nextWeek: 'dddd, LT',\n    sameDay: '[\u0906\u091C] LT',\n    sameElse: 'L',\n  },\n  // Hindi notation for meridiems are quite fuzzy in practice. While there exists\n  // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.\n  meridiem(hour: number) {\n    if (hour < 4) {\n      return '\u0930\u093E\u0924';\n    } else if (hour < 10) {\n      return '\u0938\u0941\u092C\u0939';\n    } else if (hour < 17) {\n      return '\u0926\u094B\u092A\u0939\u0930';\n    } else if (hour < 20) {\n      return '\u0936\u093E\u092E';\n    } else {\n      return '\u0930\u093E\u0924';\n    }\n  },\n  meridiemHour(hour: number, meridiem: string) {\n    if (hour === 12) {\n      hour = 0;\n    }\n    if (meridiem === '\u0930\u093E\u0924') {\n      return hour < 4 ? hour : hour + 12;\n    } else if (meridiem === '\u0938\u0941\u092C\u0939') {\n      return hour;\n    } else if (meridiem === '\u0926\u094B\u092A\u0939\u0930') {\n      return hour >= 10 ? hour : hour + 12;\n    } else if (meridiem === '\u0936\u093E\u092E') {\n      return hour + 12;\n    }\n    return hour;\n  },\n  meridiemParse: /\u0930\u093E\u0924|\u0938\u0941\u092C\u0939|\u0926\u094B\u092A\u0939\u0930|\u0936\u093E\u092E/,\n});\n\nDayjs.updateLocale('it', {\n  calendar: {\n    lastDay: '[Ieri alle] LT',\n    lastWeek: '[lo scorso] dddd [alle] LT',\n    nextDay: '[Domani alle] LT',\n    nextWeek: 'dddd [alle] LT',\n    sameDay: '[Oggi alle] LT',\n    sameElse: 'L',\n  },\n});\n\nDayjs.updateLocale('ja', {\n  calendar: {\n    lastDay: '[\u6628\u65E5] LT',\n    lastWeek: 'dddd LT',\n    nextDay: '[\u660E\u65E5] LT',\n    nextWeek: '[\u6B21\u306E] dddd LT',\n    sameDay: '[\u4ECA\u65E5] LT',\n    sameElse: 'L',\n  },\n});\n\nDayjs.updateLocale('ko', {\n  calendar: {\n    lastDay: '[\uC5B4\uC81C] LT',\n    lastWeek: '[\uC9C0\uB09C] dddd LT',\n    nextDay: '[\uB0B4\uC77C] LT',\n    nextWeek: 'dddd LT',\n    sameDay: '[\uC624\uB298] LT',\n    sameElse: 'L',\n  },\n});\n\nDayjs.updateLocale('nl', {\n  calendar: {\n    lastDay: '[gisteren om] LT',\n    lastWeek: '[afgelopen] dddd [om] LT',\n    nextDay: '[morgen om] LT',\n    nextWeek: 'dddd [om] LT',\n    sameDay: '[vandaag om] LT',\n    sameElse: 'L',\n  },\n});\n\nDayjs.updateLocale('pt', {\n  calendar: {\n    lastDay: '[ontem \u00E0s] LT',\n    lastWeek: 'dddd [passada \u00E0s] LT',\n    nextDay: '[amanh\u00E3 \u00E0s] LT',\n    nextWeek: 'dddd [\u00E0s] LT',\n    sameDay: '[hoje \u00E0s] LT',\n    sameElse: 'L',\n  },\n});\n\nDayjs.updateLocale('ru', {\n  calendar: {\n    lastDay: '[\u0412\u0447\u0435\u0440\u0430, \u0432] LT',\n    nextDay: '[\u0417\u0430\u0432\u0442\u0440\u0430, \u0432] LT',\n    sameDay: '[\u0421\u0435\u0433\u043E\u0434\u043D\u044F, \u0432] LT',\n  },\n});\n\nDayjs.updateLocale('tr', {\n  calendar: {\n    lastDay: '[d\u00FCn] LT',\n    lastWeek: '[ge\u00E7en] dddd [saat] LT',\n    nextDay: '[yar\u0131n saat] LT',\n    nextWeek: '[gelecek] dddd [saat] LT',\n    sameDay: '[bug\u00FCn saat] LT',\n    sameElse: 'L',\n  },\n});\n\nconst en_locale = {\n  formats: {},\n  months: [\n    'January',\n    'February',\n    'March',\n    'April',\n    'May',\n    'June',\n    'July',\n    'August',\n    'September',\n    'October',\n    'November',\n    'December',\n  ],\n  relativeTime: {},\n  weekdays: [\n    'Sunday',\n    'Monday',\n    'Tuesday',\n    'Wednesday',\n    'Thursday',\n    'Friday',\n    'Saturday',\n  ],\n};\n\ntype DateTimeParserModule = typeof Dayjs | typeof momentTimezone;\n// Type guards to check DayJs\nconst isDayJs = (dateTimeParser: DateTimeParserModule): dateTimeParser is typeof Dayjs =>\n  (dateTimeParser as typeof Dayjs).extend !== undefined;\n\ntype TimezoneParser = {\n  tz: momentTimezone.MomentTimezone | Dayjs.Dayjs;\n};\nconst supportsTz = (dateTimeParser: unknown): dateTimeParser is TimezoneParser =>\n  (dateTimeParser as TimezoneParser).tz !== undefined;\n\nexport type Streami18nOptions = {\n  DateTimeParser?: DateTimeParserModule;\n  dayjsLocaleConfigForLanguage?: Partial<ILocale> & { calendar?: CalendarLocaleConfig };\n  debug?: boolean;\n  disableDateTimeTranslations?: boolean;\n  formatters?: Partial<PredefinedFormatters> & CustomFormatters;\n  language?: TranslationLanguages;\n  logger?: (message?: string) => void;\n  translationBuilderTopics?: Record<string, TranslationTopicConstructor>;\n  parseMissingKeyHandler?: (key: string, defaultValue?: string) => string;\n  timezone?: string;\n  translationsForLanguage?: Partial<typeof enTranslations>;\n};\n\n/**\n * Wrapper around [i18next](https://www.i18next.com/) class for Stream related i18n.\n * Instance of this class should be provided to Chat component to handle i18n.\n * Stream provides following list of in-built i18n:\n * 1. English (en)\n * 2. Dutch (nl)\n * 3. Russian (ru)\n * 4. Turkish (tr)\n * 5. French (fr)\n * 6. Italian (it)\n * 7. Hindi (hi)\n * 8. Spanish (es)\n * 9. Portuguese (pt)\n * 10. German (de)\n * 11. Japanese (ja)\n * 12. Korean (ko)\n *\n * Simplest way to start using chat components in one of the in-built languages would be following:\n *\n * ```\n * const i18n = new Streami18n({ language 'nl' });\n * <Chat client={chatClient} i18nInstance={i18n}>\n *  ...\n * </Chat>\n * ```\n *\n * If you would like to override certain keys in in-built translation.\n * UI will be automatically updated in this case.\n *\n * ```\n * const i18n = new Streami18n({\n *  language: 'nl',\n *  translationsForLanguage: {\n *    'Nothing yet...': 'Nog Niet ...',\n *    '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} en {{ secondUser }} zijn aan het typen...',\n *  }\n * });\n *\n * If you would like to register additional languages, use registerTranslation. You can add as many languages as you want:\n *\n * i18n.registerTranslation('zh', {\n *  'Nothing yet...': 'Nog Niet ...',\n *  '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} en {{ secondUser }} zijn aan het typen...',\n * });\n *\n * <Chat client={chatClient} i18nInstance={i18n}>\n *  ...\n * </Chat>\n * ```\n *\n * You can use the same function to add whole new language as well.\n *\n * ```\n * const i18n = new Streami18n();\n *\n * i18n.registerTranslation('mr', {\n *  'Nothing yet...': '\u0915\u093E\u0939\u0940\u0939\u0940 \u0928\u093E\u0939\u0940  ...',\n *  '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} \u0906\u0923\u093F {{ secondUser }} \u091F\u0940\u092A\u0940 \u0915\u0930\u0924 \u0906\u0939\u0947\u0924 ',\n * });\n *\n * // Make sure to call setLanguage to reflect new language in UI.\n * i18n.setLanguage('it');\n * <Chat client={chatClient} i18nInstance={i18n}>\n *  ...\n * </Chat>\n * ```\n *\n * ## Datetime i18n\n *\n * Stream react chat components uses [dayjs](https://day.js.org/en/) internally by default to format datetime stamp.\n * e.g., in ChannelPreview, MessageContent components.\n * Dayjs has locale support as well - https://day.js.org/docs/en/i18n/i18n\n * Dayjs is a lightweight alternative to Momentjs with the same modern API.\n *\n * Dayjs provides locale config for plenty of languages, you can check the whole list of locale configs at following url\n * https://github.com/iamkun/dayjs/tree/dev/src/locale\n *\n * You can either provide the dayjs locale config while registering\n * language with Streami18n (either via constructor or registerTranslation()) or you can provide your own Dayjs or Moment instance\n * to Streami18n constructor, which will be then used internally (using the language locale) in components.\n *\n * 1. Via language registration\n *\n * e.g.,\n * ```\n * const i18n = new Streami18n({\n *  language: 'nl',\n *  dayjsLocaleConfigForLanguage: {\n *    months: [...],\n *    monthsShort: [...],\n *    calendar: {\n *      sameDay: ...'\n *    }\n *  }\n * });\n * ```\n *\n * Similarly, you can add locale config for moment while registering translation via `registerTranslation` function.\n *\n * e.g.,\n * ```\n * const i18n = new Streami18n();\n *\n * i18n.registerTranslation(\n *  'mr',\n *  {\n *    'Nothing yet...': '\u0915\u093E\u0939\u0940\u0939\u0940 \u0928\u093E\u0939\u0940  ...',\n *    '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} \u0906\u0923\u093F {{ secondUser }} \u091F\u0940\u092A\u0940 \u0915\u0930\u0924 \u0906\u0939\u0947\u0924 ',\n *  },\n *  {\n *    months: [...],\n *    monthsShort: [...],\n *    calendar: {\n *      sameDay: ...'\n *    }\n *  }\n * );\n *```\n * 2. Provide your own Moment object\n *\n * ```js\n * import 'moment/locale/nl';\n * import 'moment/locale/it';\n * // or if you want to include all locales\n * import 'moment/min/locales';\n *\n * import Moment from moment\n *\n * const i18n = new Streami18n({\n *  language: 'nl',\n *  DateTimeParser: Moment\n * })\n * ```\n *\n * 3. Provide your own Dayjs object\n *\n * ```js\n * import Dayjs from 'dayjs'\n *\n * import 'dayjs/locale/nl';\n * import 'dayjs/locale/it';\n * // or if you want to include all locales\n * import 'dayjs/min/locales';\n *\n * const i18n = new Streami18n({\n *  language: 'nl',\n *  DateTimeParser: Dayjs\n * })\n * ```\n * If you would like to stick with english language for datetimes in Stream components, you can set `disableDateTimeTranslations` to true.\n *\n */\nconst defaultStreami18nOptions = {\n  DateTimeParser: Dayjs,\n  dayjsLocaleConfigForLanguage: null,\n  debug: false,\n  disableDateTimeTranslations: false,\n  language: 'en' as TranslationLanguages,\n  logger: (message?: string) => console.warn(message),\n  /**\n   * Key in the translationBuilderTopics has to match postProcessorName in the translation value.\n   *\n   * {\n   *   \"key\": \"{{value, postProcessorName}}\"\n   * }\n   *\n   * At least the default topics will be supported.\n   */\n  translationBuilderTopics: {\n    notification: NotificationTranslationTopic,\n  },\n};\n\nexport class Streami18n {\n  i18nInstance = i18n.createInstance();\n  translationBuilder: TranslationBuilder;\n  private translationBuilderTopics: Record<string, TranslationTopicConstructor> = {};\n  Dayjs = null;\n  setLanguageCallback: (t: TFunction) => void = () => null;\n  initialized = false;\n\n  t: TFunction = defaultTranslatorFunction;\n  tDateTimeParser: TDateTimeParser;\n\n  translations: {\n    [key: string]: {\n      [key: string]: typeof enTranslations | UnknownType;\n    };\n  } = {\n    de: { [defaultNS]: deTranslations },\n    en: { [defaultNS]: enTranslations },\n    es: { [defaultNS]: esTranslations },\n    fr: { [defaultNS]: frTranslations },\n    hi: { [defaultNS]: hiTranslations },\n    it: { [defaultNS]: itTranslations },\n    ja: { [defaultNS]: jaTranslations },\n    ko: { [defaultNS]: koTranslations },\n    nl: { [defaultNS]: nlTranslations },\n    pt: { [defaultNS]: ptTranslations },\n    ru: { [defaultNS]: ruTranslations },\n    tr: { [defaultNS]: trTranslations },\n  };\n\n  /**\n   * dayjs.defineLanguage('nl') also changes the global locale. We don't want to do that\n   * when user calls registerTranslation() function. So instead we will store the locale configs\n   * given to registerTranslation() function in `dayjsLocales` object, and register the required locale\n   * with moment, when setLanguage is called.\n   * */\n  dayjsLocales: { [key: string]: Partial<ILocale> } = {};\n  // dayjsLocales = {};\n\n  /**\n   * Initialize properties used in constructor\n   */\n  logger: (msg?: string) => void;\n  currentLanguage: TranslationLanguages;\n  DateTimeParser: DateTimeParserModule;\n  formatters: PredefinedFormatters & CustomFormatters = predefinedFormatters;\n  isCustomDateTimeParser: boolean;\n  i18nextConfig: {\n    debug: boolean;\n    fallbackLng: false;\n    interpolation: { escapeValue: boolean; formatSeparator: string };\n    keySeparator: false;\n    lng: string;\n    nsSeparator: false;\n    parseMissingKeyHandler?: (key: string, defaultValue?: string) => string;\n    postProcess?: string[];\n  };\n  /**\n   * A valid TZ identifier string (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)\n   */\n  timezone?: string;\n  /**\n   * Constructor accepts following options:\n   *  - language (String) default: 'en'\n   *    Language code e.g., en, tr\n   *\n   *  - translationsForLanguage (object)\n   *    Translations object. Please check src/i18n/en.json for example.\n   *\n   *  - disableDateTimeTranslations (boolean) default: false\n   *    Disable translations for date-times\n   *\n   *  - debug (boolean) default: false\n   *    Enable debug mode in internal i18n class\n   *\n   *  - logger (function) default: () => {}\n   *    Logger function to log warnings/errors from this class\n   *\n   *  - dayjsLocaleConfigForLanguage (object) default: 'enConfig'\n   *    [Config object](https://momentjs.com/docs/#/i18n/changing-locale/) for internal moment object,\n   *    corresponding to language (param)\n   *\n   *  - DateTimeParser (function) Moment or Dayjs instance/function.\n   *    Make sure to load all the required locales in this Moment or Dayjs instance that you will be provide to Streami18n\n   *\n   * @param {*} options\n   */\n  constructor(options: Streami18nOptions = {}) {\n    const finalOptions = {\n      ...defaultStreami18nOptions,\n      ...options,\n    };\n    // Prepare the i18next configuration.\n    this.logger = finalOptions.logger;\n    this.currentLanguage = finalOptions.language;\n    this.DateTimeParser = finalOptions.DateTimeParser;\n    this.timezone = finalOptions.timezone;\n    this.formatters = { ...predefinedFormatters, ...options?.formatters };\n    this.translationBuilder = new TranslationBuilder(this.i18nInstance);\n    this.translationBuilderTopics = {\n      ...defaultStreami18nOptions.translationBuilderTopics,\n      ...options.translationBuilderTopics,\n    };\n\n    try {\n      if (this.DateTimeParser && isDayJs(this.DateTimeParser)) {\n        this.DateTimeParser.extend(LocalizedFormat);\n        this.DateTimeParser.extend(calendar);\n        this.DateTimeParser.extend(localeData);\n        this.DateTimeParser.extend(relativeTime);\n        this.DateTimeParser.extend(duration);\n      }\n    } catch (error) {\n      throw Error(\n        `Streami18n: Looks like you wanted to provide Dayjs instance, but something went wrong while adding plugins ${error}`,\n      );\n    }\n\n    this.isCustomDateTimeParser = !!options.DateTimeParser;\n    const translationsForLanguage = finalOptions.translationsForLanguage;\n\n    if (translationsForLanguage) {\n      this.translations[this.currentLanguage] = {\n        [defaultNS]:\n          this.translations[this.currentLanguage] &&\n          this.translations[this.currentLanguage][defaultNS]\n            ? {\n                ...this.translations[this.currentLanguage][defaultNS],\n                ...translationsForLanguage,\n              }\n            : translationsForLanguage,\n      };\n    }\n\n    // If translations don't exist for given language, then set it as empty object.\n    if (!this.translations[this.currentLanguage]) {\n      this.translations[this.currentLanguage] = {\n        [defaultNS]: {},\n      };\n    }\n\n    this.i18nextConfig = {\n      debug: finalOptions.debug,\n      fallbackLng: false,\n      interpolation: { escapeValue: false, formatSeparator: '|' },\n      keySeparator: false,\n      lng: this.currentLanguage,\n      nsSeparator: false,\n    };\n\n    const postProcess = Object.keys(this.translationBuilderTopics);\n\n    if (postProcess.length > 0) {\n      this.i18nextConfig.postProcess = postProcess;\n    }\n\n    if (finalOptions.parseMissingKeyHandler) {\n      this.i18nextConfig.parseMissingKeyHandler = finalOptions.parseMissingKeyHandler;\n    }\n\n    this.validateCurrentLanguage();\n\n    const dayjsLocaleConfigForLanguage = finalOptions.dayjsLocaleConfigForLanguage;\n\n    if (dayjsLocaleConfigForLanguage) {\n      this.addOrUpdateLocale(this.currentLanguage, {\n        ...dayjsLocaleConfigForLanguage,\n      });\n    } else if (!this.localeExists(this.currentLanguage)) {\n      this.logger(\n        `Streami18n: Streami18n(...) - Locale config for ${this.currentLanguage} does not exist in momentjs.` +\n          `Please import the locale file using \"import 'moment/locale/${this.currentLanguage}';\" in your app or ` +\n          `register the locale config with Streami18n using registerTranslation(language, translation, customDayjsLocale)`,\n      );\n    }\n\n    this.tDateTimeParser = (timestamp) => {\n      const language =\n        finalOptions.disableDateTimeTranslations ||\n        !this.localeExists(this.currentLanguage)\n          ? defaultLng\n          : this.currentLanguage;\n\n      if (isDayJs(this.DateTimeParser)) {\n        return supportsTz(this.DateTimeParser)\n          ? this.DateTimeParser(timestamp).tz(this.timezone).locale(language)\n          : this.DateTimeParser(timestamp).locale(language);\n      }\n\n      if (supportsTz(this.DateTimeParser) && this.timezone) {\n        return this.DateTimeParser(timestamp).tz(this.timezone).locale(language);\n      }\n      return this.DateTimeParser(timestamp).locale(language);\n    };\n  }\n\n  /**\n   * Initializes the i18next instance with configuration (which enables natural language as default keys)\n   */\n  async init() {\n    this.validateCurrentLanguage();\n\n    try {\n      this.t = await this.i18nInstance.init({\n        ...this.i18nextConfig,\n        lng: this.currentLanguage,\n        resources: this.translations,\n      });\n      this.initialized = true;\n      if (this.formatters) {\n        Object.entries(this.formatters).forEach(([name, formatterFactory]) => {\n          if (!formatterFactory) return;\n          this.i18nInstance.services.formatter?.add(name, formatterFactory(this));\n        });\n      }\n      // Register post-processors after initialization\n      Object.entries(this.translationBuilderTopics).forEach(\n        ([topic, TranslationTopic]) => {\n          this.translationBuilder.registerTopic(topic, TranslationTopic);\n        },\n      );\n    } catch (error) {\n      this.logger(`Something went wrong with init: ${JSON.stringify(error)}`);\n    }\n\n    return {\n      t: this.t,\n      tDateTimeParser: this.tDateTimeParser,\n    };\n  }\n\n  localeExists = (language: TranslationLanguages) => {\n    if (this.isCustomDateTimeParser) return true;\n\n    return Object.keys(Dayjs.Ls).indexOf(language) > -1;\n  };\n\n  validateCurrentLanguage = () => {\n    const availableLanguages = Object.keys(this.translations);\n    if (availableLanguages.indexOf(this.currentLanguage) === -1) {\n      this.logger(\n        `Streami18n: '${this.currentLanguage}' language is not registered.` +\n          ` Please make sure to call streami18n.registerTranslation('${this.currentLanguage}', {...}) or ` +\n          `use one the built-in supported languages - ${this.getAvailableLanguages()}`,\n      );\n\n      this.currentLanguage = defaultLng;\n    }\n  };\n\n  /** Returns an instance of i18next used within this class instance */\n  geti18Instance = () => this.i18nInstance;\n\n  /** Returns list of available languages. */\n  getAvailableLanguages = () => Object.keys(this.translations);\n\n  /** Returns all the translation dictionary for all inbuilt-languages */\n  getTranslations = () => this.translations;\n\n  /**\n   * Returns current version translator function.\n   */\n  async getTranslators() {\n    if (!this.initialized) {\n      if (this.dayjsLocales[this.currentLanguage]) {\n        this.addOrUpdateLocale(\n          this.currentLanguage,\n          this.dayjsLocales[this.currentLanguage],\n        );\n      }\n\n      return await this.init();\n    } else {\n      return {\n        t: this.t,\n        tDateTimeParser: this.tDateTimeParser,\n      };\n    }\n  }\n\n  registerTranslation(\n    language: TranslationLanguages,\n    translation: typeof enTranslations,\n    customDayjsLocale?: Partial<ILocale>,\n  ) {\n    if (!translation) {\n      this.logger(\n        `Streami18n: registerTranslation(language, translation, customDayjsLocale) called without translation`,\n      );\n      return;\n    }\n\n    if (!this.translations[language]) {\n      this.translations[language] = { [defaultNS]: translation };\n    } else {\n      this.translations[language][defaultNS] = translation;\n    }\n\n    if (customDayjsLocale) {\n      this.dayjsLocales[language] = { ...customDayjsLocale };\n    } else if (!this.localeExists(language)) {\n      this.logger(\n        `Streami18n: registerTranslation(language, translation, customDayjsLocale) - ` +\n          `Locale config for ${language} does not exist in Dayjs.` +\n          `Please import the locale file using \"import 'dayjs/locale/${language}';\" in your app or ` +\n          `register the locale config with Streami18n using registerTranslation(language, translation, customDayjsLocale)`,\n      );\n    }\n\n    if (this.initialized) {\n      this.i18nInstance.addResources(language, defaultNS, translation);\n    }\n  }\n\n  addOrUpdateLocale(key: TranslationLanguages, config: Partial<ILocale>) {\n    if (this.localeExists(key)) {\n      Dayjs.updateLocale(key, { ...config });\n    } else {\n      // Merging the custom locale config with en config, so missing keys can default to english.\n      Dayjs.locale({ name: key, ...en_locale, ...config }, undefined, true);\n    }\n  }\n\n  async setLanguage(language: TranslationLanguages) {\n    this.currentLanguage = language;\n\n    if (!this.initialized) return;\n\n    try {\n      const t = await this.i18nInstance.changeLanguage(language);\n      if (this.dayjsLocales[language]) {\n        this.addOrUpdateLocale(\n          this.currentLanguage,\n          this.dayjsLocales[this.currentLanguage],\n        );\n      }\n\n      this.setLanguageCallback(t);\n      return t;\n    } catch (error) {\n      this.logger(`Failed to set language: ${JSON.stringify(error)}`);\n      return this.t;\n    }\n  }\n\n  registerSetLanguageCallback(callback: (t: TFunction) => void) {\n    this.setLanguageCallback = callback;\n  }\n}\n", "import type { i18n, TFunction } from 'i18next';\n\ntype TopicName = string;\ntype TranslatorName = string;\n\nexport type Translator<O extends Record<string, unknown> = Record<string, unknown>> =\n  (params: { key: string; value: string; t: TFunction; options: O }) => string | null;\n\nexport type TranslationTopicOptions<\n  O extends Record<string, unknown> = Record<string, unknown>,\n> = {\n  i18next: i18n;\n  translators?: Record<string, Translator<O>>;\n};\n\nexport abstract class TranslationTopic<\n  O extends Record<string, unknown> = Record<string, unknown>,\n> {\n  protected translators: Map<string, Translator<O>> = new Map();\n  protected i18next: i18n;\n\n  constructor(protected options: TranslationTopicOptions<O>) {\n    this.i18next = options.i18next;\n    if (options.translators) {\n      Object.entries(options.translators).forEach(([name, translator]) => {\n        this.setTranslator(name, translator);\n      });\n    }\n  }\n\n  abstract translate(value: string, key: string, options: O): string;\n\n  setTranslator = (name: string, translator: Translator<O>) => {\n    this.translators.set(name, translator);\n  };\n\n  removeTranslator = (name: string) => {\n    this.translators.delete(name);\n  };\n}\n\nconst forwardTranslation: Translator = ({ value }) => value;\n\nexport type TranslationTopicConstructor = new (\n  options: TranslationTopicOptions,\n) => TranslationTopic;\n\nexport class TranslationBuilder {\n  private topics = new Map<string, TranslationTopic>();\n  // need to keep a registration buffer so that translators can be registered once a topic is registered\n  // what does not happen when Streami18n is instantiated but rather once Streami18n.init() is invoked\n  private translatorRegistrationsBuffer: Record<\n    TopicName,\n    Record<TranslatorName, Translator>\n  > = {};\n\n  constructor(private i18next: i18n) {}\n\n  registerTopic = (name: TopicName, Topic: TranslationTopicConstructor) => {\n    let topic = this.topics.get(name);\n\n    if (!topic) {\n      topic = new Topic({ i18next: this.i18next });\n      this.topics.set(name, topic);\n      this.i18next.use({\n        name,\n        process: (value: string, key: string, options: Record<string, unknown>) => {\n          const topic = this.topics.get(name);\n          if (!topic) return value;\n          return topic.translate(value, key, options);\n        },\n        type: 'postProcessor' as const,\n      });\n    }\n\n    const additionalTranslatorsToRegister = this.translatorRegistrationsBuffer[name];\n    if (additionalTranslatorsToRegister) {\n      Object.entries(additionalTranslatorsToRegister).forEach(\n        ([translatorName, translator]) => {\n          topic.setTranslator(translatorName, translator);\n        },\n      );\n      delete this.translatorRegistrationsBuffer[name];\n    }\n    return topic;\n  };\n\n  disableTopic = (topicName: TopicName) => {\n    const topic = this.topics.get(topicName);\n    if (!topic) return;\n    this.i18next.use({\n      name: topicName,\n      process: forwardTranslation,\n      type: 'postProcessor',\n    });\n    this.topics.delete(topicName);\n  };\n\n  getTopic = (topicName: TopicName) => this.topics.get(topicName);\n\n  registerTranslators(\n    topicName: TopicName,\n    translators: Record<TranslatorName, Translator>,\n  ) {\n    const topic = this.getTopic(topicName);\n    if (!topic) {\n      if (!this.translatorRegistrationsBuffer[topicName])\n        this.translatorRegistrationsBuffer[topicName] = {};\n\n      Object.entries(translators).forEach(([translatorName, translator]) => {\n        this.translatorRegistrationsBuffer[topicName][translatorName] = translator;\n      });\n      return;\n    }\n    Object.entries(translators).forEach(([name, translator]) => {\n      topic.setTranslator(name, translator);\n    });\n  }\n\n  removeTranslators(topicName: TopicName, translators: TranslatorName[]) {\n    const topic = this.getTopic(topicName);\n    if (this.translatorRegistrationsBuffer[topicName]) {\n      translators.forEach((translatorName) => {\n        delete this.translatorRegistrationsBuffer[topicName][translatorName];\n      });\n    }\n    if (!topic) return;\n    translators.forEach((name) => {\n      topic.removeTranslator(name);\n    });\n  }\n}\n", "import type { NotificationTranslatorOptions } from './types';\nimport type { Translator } from '../TranslationBuilder';\n\nexport const attachmentUploadBlockedNotificationTranslator: Translator<\n  NotificationTranslatorOptions\n> = ({ options, t }) => {\n  const { notification } = options;\n  if (!notification) return null;\n  if (typeof notification.metadata?.reason !== 'string') {\n    const reason = t('unknown error');\n    return t('Attachment upload blocked due to {{reason}}', { reason });\n  }\n  if (notification.metadata?.reason === 'size_limit') {\n    const reason = t('size limit');\n    return t('Attachment upload blocked due to {{reason}}', { reason });\n  }\n  const reason = t('unsupported file type');\n  return t('Attachment upload blocked due to {{reason}}', { reason });\n};\n\nexport const attachmentUploadFailedNotificationTranslator: Translator<\n  NotificationTranslatorOptions\n> = ({ options, t }) => {\n  const { notification } = options;\n  if (!notification) return null;\n  const { reason: originalReason } = notification.metadata ?? {};\n  if (typeof originalReason !== 'string') {\n    const reason = t('unknown error');\n    return t('Attachment upload failed due to {{reason}}', { reason });\n  }\n  let reason = originalReason.toLowerCase();\n  if (reason === 'network error') {\n    reason = t('network error');\n    return t('Attachment upload failed due to {{reason}}', { reason });\n  }\n  // custom reason string\n  return t('Attachment upload failed due to {{reason}}', { reason });\n};\n\nexport const attachmentUploadNotTerminatedTranslator: Translator<\n  NotificationTranslatorOptions\n> = ({ options: { notification }, t }) => {\n  if (!notification?.message) return null;\n  return t('Wait until all attachments have uploaded');\n};\n", "import type { Translator } from '../TranslationBuilder';\nimport type { NotificationTranslatorOptions } from './types';\n\nexport const pollCreationFailedNotificationTranslator: Translator<\n  NotificationTranslatorOptions\n> = ({ options: { notification }, t }) => {\n  if (\n    typeof notification?.metadata?.reason === 'string' &&\n    notification.metadata.reason.length\n  ) {\n    return t('Failed to create the poll due to {{reason}}', {\n      reason: notification.metadata.reason.toLowerCase(),\n    });\n  }\n  return t('Failed to create the poll');\n};\n", "import type { Translator } from '../TranslationBuilder';\nimport type { NotificationTranslatorOptions } from './types';\n\nexport const pollVoteCountTrespass: Translator<NotificationTranslatorOptions> = ({ t }) =>\n  t('Reached the vote limit. Remove an existing vote first.');\n", "import type { Translator } from '../TranslationBuilder';\nimport type { NotificationTranslatorOptions } from './types';\n\nexport const browserAudioPlaybackError: Translator<NotificationTranslatorOptions> = ({\n  options,\n  t,\n}) => options.notification?.message ?? t('Error reproducing the recording');\n", "import {\n  attachmentUploadBlockedNotificationTranslator,\n  attachmentUploadFailedNotificationTranslator,\n  attachmentUploadNotTerminatedTranslator,\n} from './attachmentUpload';\nimport { TranslationTopic } from '../../TranslationBuilder';\nimport type { Notification } from 'stream-chat';\nimport type { NotificationTranslatorOptions } from './types';\nimport type { TranslationTopicOptions, Translator } from '../../index';\nimport { pollCreationFailedNotificationTranslator } from './pollComposition';\nimport { pollVoteCountTrespass } from './pollVoteCountTrespass';\nimport { browserAudioPlaybackError } from './browserAudioPlaybackError';\n\nexport const defaultNotificationTranslators: Record<\n  string,\n  Translator<NotificationTranslatorOptions>\n> = {\n  'api:attachment:upload:failed': attachmentUploadFailedNotificationTranslator,\n  'api:poll:create:failed': pollCreationFailedNotificationTranslator,\n  'browser:audio:playback:error': browserAudioPlaybackError,\n  'validation:attachment:upload:blocked': attachmentUploadBlockedNotificationTranslator,\n  'validation:attachment:upload:in-progress': attachmentUploadNotTerminatedTranslator,\n  'validation:poll:castVote:limit': pollVoteCountTrespass,\n};\n\nexport class NotificationTranslationTopic extends TranslationTopic<NotificationTranslatorOptions> {\n  constructor({ i18next, translators }: TranslationTopicOptions) {\n    super({ i18next, translators: defaultNotificationTranslators });\n    if (translators) {\n      Object.entries(translators).forEach(([name, translator]) => {\n        this.setTranslator(name, translator);\n      });\n    }\n  }\n\n  translate = (value: string, key: string, options: { notification?: Notification }) => {\n    const { notification } = options;\n    if (!notification) return value;\n    const translator = notification.type && this.translators.get(notification.type);\n    if (!translator) return value;\n    return translator({ key, options, t: this.i18next.t, value }) || value;\n  };\n}\n", "import type React from 'react';\nimport { useMemo } from 'react';\n\nimport { useLastReadData } from '../useLastReadData';\nimport type { GroupStyle, RenderedMessage } from '../../utils';\nimport { getLastReceived } from '../../utils';\n\nimport { useChatContext } from '../../../../context/ChatContext';\nimport { useComponentContext } from '../../../../context/ComponentContext';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { ChannelUnreadUiState } from '../../../../types/types';\nimport type { MessageRenderer, SharedMessageProps } from '../../renderMessages';\nimport { useChannelStateContext } from '../../../../context';\nimport { useLastDeliveredData } from '../useLastDeliveredData';\n\ntype UseMessageListElementsProps = {\n  messages: LocalMessage[];\n  enrichedMessages: RenderedMessage[];\n  internalMessageProps: SharedMessageProps;\n  messageGroupStyles: Record<string, GroupStyle>;\n  renderMessages: MessageRenderer;\n  returnAllReadData: boolean;\n  threadList: boolean;\n  channelUnreadUiState?: ChannelUnreadUiState;\n  lastOwnMessage?: LocalMessage;\n};\n\nexport const useMessageListElements = (props: UseMessageListElementsProps) => {\n  const {\n    channelUnreadUiState,\n    enrichedMessages,\n    internalMessageProps,\n    lastOwnMessage,\n    messageGroupStyles,\n    messages,\n    renderMessages,\n    returnAllReadData,\n    threadList,\n  } = props;\n\n  const { customClasses } = useChatContext('useMessageListElements');\n  const { channel } = useChannelStateContext();\n  const components = useComponentContext('useMessageListElements');\n\n  // get the readData, but only for messages submitted by the user themselves\n  const readData = useLastReadData({\n    channel,\n    lastOwnMessage,\n    messages,\n    returnAllReadData,\n  });\n\n  const ownMessagesDeliveredToOthers = useLastDeliveredData({\n    channel,\n    lastOwnMessage,\n    messages,\n    returnAllReadData,\n  });\n\n  const lastReceivedMessageId = useMemo(\n    () => getLastReceived(enrichedMessages),\n    [enrichedMessages],\n  );\n\n  const elements: React.ReactNode[] = useMemo(\n    () =>\n      renderMessages({\n        channelUnreadUiState,\n        components,\n        customClasses,\n        lastOwnMessage,\n        lastReceivedMessageId,\n        messageGroupStyles,\n        messages: enrichedMessages,\n        ownMessagesDeliveredToOthers,\n        readData,\n        sharedMessageProps: { ...internalMessageProps, returnAllReadData, threadList },\n      }),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      enrichedMessages,\n      internalMessageProps,\n      lastOwnMessage,\n      lastReceivedMessageId,\n      messageGroupStyles,\n      channelUnreadUiState,\n      readData,\n      renderMessages,\n      returnAllReadData,\n      threadList,\n    ],\n  );\n\n  return elements;\n};\n", "import { useMemo } from 'react';\nimport type { Channel, LocalMessage, UserResponse } from 'stream-chat';\n\ntype UseLastReadDataParams = {\n  channel: Channel;\n  messages: LocalMessage[];\n  returnAllReadData: boolean;\n  lastOwnMessage?: LocalMessage;\n};\n\nexport const useLastReadData = (props: UseLastReadDataParams) => {\n  const { channel, lastOwnMessage, messages, returnAllReadData } = props;\n\n  return useMemo(() => {\n    if (returnAllReadData) {\n      return messages.reduce(\n        (acc, msg) => {\n          acc[msg.id] = channel.messageReceiptsTracker.readersForMessage({\n            msgId: msg.id,\n            timestampMs: msg.created_at.getTime(),\n          });\n          return acc;\n        },\n        {} as Record<string, UserResponse[]>,\n      );\n    }\n\n    if (!lastOwnMessage) return {};\n    return {\n      [lastOwnMessage.id]: channel.messageReceiptsTracker.readersForMessage({\n        msgId: lastOwnMessage.id,\n        timestampMs: lastOwnMessage.created_at.getTime(),\n      }),\n    };\n  }, [channel, lastOwnMessage, messages, returnAllReadData]);\n};\n", "import { useCallback, useEffect, useState } from 'react';\nimport type { Channel, LocalMessage, UserResponse } from 'stream-chat';\n\ntype UseLastDeliveredDataParams = {\n  channel: Channel;\n  messages: LocalMessage[];\n  returnAllReadData: boolean;\n  lastOwnMessage?: LocalMessage;\n};\n\nexport const useLastDeliveredData = (\n  props: UseLastDeliveredDataParams,\n): Record<string, UserResponse[]> => {\n  const { channel, lastOwnMessage, messages, returnAllReadData } = props;\n\n  const calculateForAll = useCallback(\n    () =>\n      messages.reduce(\n        (acc, msg) => {\n          acc[msg.id] = channel.messageReceiptsTracker.deliveredForMessage({\n            msgId: msg.id,\n            timestampMs: msg.created_at.getTime(),\n          });\n          return acc;\n        },\n        {} as Record<string, UserResponse[]>,\n      ),\n    [channel, messages],\n  );\n\n  const calculateForLastOwn = useCallback(() => {\n    if (!lastOwnMessage) return {};\n    return {\n      [lastOwnMessage.id]: channel.messageReceiptsTracker.deliveredForMessage({\n        msgId: lastOwnMessage.id,\n        timestampMs: lastOwnMessage.created_at.getTime(),\n      }),\n    };\n  }, [channel, lastOwnMessage]);\n\n  const [deliveredTo, setDeliveredTo] = useState<Record<string, UserResponse[]>>(\n    returnAllReadData ? calculateForAll : calculateForLastOwn,\n  );\n\n  useEffect(() => {\n    if (!returnAllReadData) return;\n    setDeliveredTo(calculateForAll);\n    return channel.on('message.delivered', () => setDeliveredTo(calculateForAll))\n      .unsubscribe;\n  }, [channel, calculateForAll, returnAllReadData]);\n\n  useEffect(() => {\n    if (returnAllReadData) return;\n    else setDeliveredTo(calculateForLastOwn);\n    return channel.on('message.delivered', () => setDeliveredTo(calculateForLastOwn))\n      .unsubscribe;\n  }, [channel, calculateForLastOwn, returnAllReadData]);\n\n  return deliveredTo;\n};\n", "import { useLayoutEffect, useRef } from 'react';\n\nimport { useChatContext } from '../../../../context/ChatContext';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type ContainerMeasures = {\n  offsetHeight: number;\n  scrollHeight: number;\n};\n\nexport type UseMessageListScrollManagerParams = {\n  loadMoreScrollThreshold: number;\n  messages: LocalMessage[];\n  onScrollBy: (scrollBy: number) => void;\n  scrollContainerMeasures: () => ContainerMeasures;\n  scrolledUpThreshold: number;\n  scrollToBottom: () => void;\n  showNewMessages: () => void;\n};\n\n// FIXME: change this generic name to something like useAdjustScrollPositionToListSize\nexport function useMessageListScrollManager(params: UseMessageListScrollManagerParams) {\n  const {\n    loadMoreScrollThreshold,\n    onScrollBy,\n    scrollContainerMeasures,\n    scrolledUpThreshold,\n    scrollToBottom,\n    showNewMessages,\n  } = params;\n\n  const { client } = useChatContext('useMessageListScrollManager');\n\n  const measures = useRef<ContainerMeasures>({\n    offsetHeight: 0,\n    scrollHeight: 0,\n  });\n  const messages = useRef<LocalMessage[]>(undefined);\n  const scrollTop = useRef(0);\n\n  useLayoutEffect(() => {\n    const prevMeasures = measures.current;\n    const prevMessages = messages.current;\n    const newMessages = params.messages;\n    const lastNewMessage = newMessages[newMessages.length - 1] || {};\n    const lastPrevMessage = prevMessages?.[prevMessages.length - 1];\n    const newMeasures = scrollContainerMeasures();\n\n    const wasAtBottom =\n      prevMeasures.scrollHeight - prevMeasures.offsetHeight - scrollTop.current <\n      scrolledUpThreshold;\n\n    if (typeof prevMessages !== 'undefined') {\n      if (prevMessages.length < newMessages.length) {\n        // messages added to the top\n        if (lastPrevMessage?.id === lastNewMessage.id) {\n          if (scrollTop.current < loadMoreScrollThreshold) {\n            const listHeightDelta = newMeasures.scrollHeight - prevMeasures.scrollHeight;\n            onScrollBy(listHeightDelta);\n          }\n        }\n        // messages added to the bottom\n        else {\n          const lastMessageIsFromCurrentUser = lastNewMessage.user?.id === client.userID;\n\n          if (lastMessageIsFromCurrentUser || wasAtBottom) {\n            scrollToBottom();\n          } else {\n            showNewMessages();\n          }\n        }\n      }\n      // message list length didn't change, but check if last message had reaction/reply update\n      else {\n        const hasNewReactions =\n          lastPrevMessage?.latest_reactions?.length !==\n          lastNewMessage.latest_reactions?.length;\n        const hasNewReplies = lastPrevMessage?.reply_count !== lastNewMessage.reply_count;\n\n        if ((hasNewReactions || hasNewReplies) && wasAtBottom) {\n          scrollToBottom();\n        }\n      }\n    }\n\n    messages.current = newMessages;\n    measures.current = newMeasures;\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [measures, messages, params.messages]);\n\n  return (scrollTopValue: number) => {\n    scrollTop.current = scrollTopValue;\n  };\n}\n", "import type React from 'react';\nimport { useCallback, useLayoutEffect, useRef, useState } from 'react';\n\nimport { useMessageListScrollManager } from './useMessageListScrollManager';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type UseScrollLocationLogicParams = {\n  hasMoreNewer: boolean;\n  listElement: HTMLDivElement | null;\n  loadMoreScrollThreshold: number;\n  suppressAutoscroll: boolean;\n  messages?: LocalMessage[];\n  scrolledUpThreshold?: number;\n};\n\nexport const useScrollLocationLogic = (params: UseScrollLocationLogicParams) => {\n  const {\n    hasMoreNewer,\n    listElement,\n    loadMoreScrollThreshold,\n    messages = [],\n    scrolledUpThreshold = 200,\n    suppressAutoscroll,\n  } = params;\n\n  const [hasNewMessages, setHasNewMessages] = useState(false);\n  const [wrapperRect, setWrapperRect] = useState<DOMRect>();\n\n  const [isMessageListScrolledToBottom, setIsMessageListScrolledToBottom] =\n    useState(true);\n  const closeToBottom = useRef(false);\n  const closeToTop = useRef(false);\n\n  const scrollToBottom = useCallback(() => {\n    if (!listElement?.scrollTo || hasMoreNewer || suppressAutoscroll) {\n      return;\n    }\n\n    listElement.scrollTo({\n      top: listElement.scrollHeight,\n    });\n    setHasNewMessages(false);\n  }, [listElement, hasMoreNewer, suppressAutoscroll]);\n\n  useLayoutEffect(() => {\n    if (listElement) {\n      setWrapperRect(listElement.getBoundingClientRect());\n      scrollToBottom();\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [listElement, hasMoreNewer]);\n\n  const updateScrollTop = useMessageListScrollManager({\n    loadMoreScrollThreshold,\n    messages,\n    onScrollBy: (scrollBy) => {\n      listElement?.scrollBy({ top: scrollBy });\n    },\n\n    scrollContainerMeasures: () => ({\n      offsetHeight: listElement?.offsetHeight || 0,\n      scrollHeight: listElement?.scrollHeight || 0,\n    }),\n    scrolledUpThreshold,\n    scrollToBottom,\n    showNewMessages: () => setHasNewMessages(true),\n  });\n\n  const onScroll = useCallback(\n    (event: React.UIEvent<HTMLDivElement>) => {\n      const element = event.target as HTMLDivElement;\n      const scrollTop = element.scrollTop;\n\n      updateScrollTop(scrollTop);\n\n      const offsetHeight = element.offsetHeight;\n      const scrollHeight = element.scrollHeight;\n\n      const prevCloseToBottom = closeToBottom.current;\n      closeToBottom.current =\n        scrollHeight - (scrollTop + offsetHeight) < scrolledUpThreshold;\n      closeToTop.current = scrollTop < scrolledUpThreshold;\n\n      if (closeToBottom.current) {\n        setHasNewMessages(false);\n      }\n      if (prevCloseToBottom && !closeToBottom.current) {\n        setIsMessageListScrolledToBottom(false);\n      } else if (!prevCloseToBottom && closeToBottom.current) {\n        setIsMessageListScrolledToBottom(true);\n      }\n    },\n    [updateScrollTop, closeToTop, closeToBottom, scrolledUpThreshold],\n  );\n\n  return {\n    hasNewMessages,\n    isMessageListScrolledToBottom,\n    onScroll,\n    scrollToBottom,\n    wrapperRect,\n  };\n};\n", "import { useChannelStateContext } from '../../../../context';\nimport { useEffect, useRef, useState } from 'react';\nimport { MESSAGE_LIST_MAIN_PANEL_CLASS } from '../../MessageListMainPanel';\nimport { UNREAD_MESSAGE_SEPARATOR_CLASS } from '../../UnreadMessagesSeparator';\n\nconst targetScrolledAboveVisibleContainerArea = (element: Element) => {\n  const { bottom: targetBottom } = element.getBoundingClientRect();\n  return targetBottom < 0;\n};\n\nconst targetScrolledBelowVisibleContainerArea = (\n  element: Element,\n  container: Element,\n) => {\n  const { top: targetTop } = element.getBoundingClientRect();\n  const { top: containerBottom } = container.getBoundingClientRect();\n  return targetTop > containerBottom;\n};\n\nexport type UseUnreadMessagesNotificationParams = {\n  isMessageListScrolledToBottom: boolean;\n  showAlways: boolean;\n  unreadCount?: number;\n};\n\nexport const useUnreadMessagesNotification = ({\n  isMessageListScrolledToBottom,\n  showAlways,\n  unreadCount,\n}: UseUnreadMessagesNotificationParams) => {\n  const { messages } = useChannelStateContext('UnreadMessagesNotification');\n  const [show, setShow] = useState(false);\n  const isScrolledAboveTargetTop = useRef(false);\n  const intersectionObserverIsSupported = typeof IntersectionObserver !== 'undefined';\n\n  useEffect(() => {\n    if (!(unreadCount && intersectionObserverIsSupported)) {\n      setShow(false);\n      return;\n    }\n\n    const [msgListPanel] = document.getElementsByClassName(MESSAGE_LIST_MAIN_PANEL_CLASS);\n    if (!msgListPanel) return;\n\n    const [observedTarget] = document.getElementsByClassName(\n      UNREAD_MESSAGE_SEPARATOR_CLASS,\n    );\n    if (!observedTarget) {\n      setShow(true);\n      return;\n    }\n\n    const scrolledBelowSeparator =\n      targetScrolledAboveVisibleContainerArea(observedTarget);\n    const scrolledAboveSeparator = targetScrolledBelowVisibleContainerArea(\n      observedTarget,\n      msgListPanel,\n    );\n\n    setShow(\n      showAlways\n        ? scrolledBelowSeparator || scrolledAboveSeparator\n        : scrolledBelowSeparator,\n    );\n\n    const observer = new IntersectionObserver(\n      (elements) => {\n        if (!elements.length) return;\n        const { boundingClientRect, isIntersecting } = elements[0];\n        if (isIntersecting) {\n          setShow(false);\n          return;\n        }\n        const separatorIsAboveContainerTop = boundingClientRect.bottom < 0;\n        setShow(showAlways || separatorIsAboveContainerTop);\n        isScrolledAboveTargetTop.current = separatorIsAboveContainerTop;\n      },\n      { root: msgListPanel },\n    );\n    observer.observe(observedTarget);\n\n    return () => {\n      observer.disconnect();\n    };\n  }, [\n    intersectionObserverIsSupported,\n    isMessageListScrolledToBottom,\n    messages,\n    showAlways,\n    unreadCount,\n  ]);\n\n  useEffect(() => {\n    /**\n     * Handle situation when scrollToBottom is called from another component when the msg list is scrolled above the observed target (unread separator).\n     * The intersection observer is not triggered when Element.scrollTo() is called. So we end up in a situation when we are scrolled to the bottom\n     * and at the same time scrolled above the observed target.\n     */\n\n    if (\n      unreadCount &&\n      isMessageListScrolledToBottom &&\n      isScrolledAboveTargetTop.current\n    ) {\n      setShow(true);\n      isScrolledAboveTargetTop.current = false;\n    }\n  }, [isMessageListScrolledToBottom, unreadCount]);\n\n  return { show: show && intersectionObserverIsSupported };\n};\n", "import React from 'react';\nimport type { PropsWithChildrenOnly } from '../../types/types';\n\nexport const MESSAGE_LIST_MAIN_PANEL_CLASS =\n  'str-chat__main-panel-inner str-chat__message-list-main-panel' as const;\n\nexport const MessageListMainPanel = ({ children }: PropsWithChildrenOnly) => (\n  <div className={MESSAGE_LIST_MAIN_PANEL_CLASS}>{children}</div>\n);\n", "import React from 'react';\nimport { useTranslationContext } from '../../context';\n\nexport const UNREAD_MESSAGE_SEPARATOR_CLASS = 'str-chat__unread-messages-separator';\n\nexport type UnreadMessagesSeparatorProps = {\n  /**\n   * Configuration parameter to determine, whether the unread count is to be shown on the component. Disabled by default.\n   */\n  showCount?: boolean;\n  /**\n   * The count of unread messages to be displayed if enabled.\n   */\n  unreadCount?: number;\n};\n\nexport const UnreadMessagesSeparator = ({\n  showCount,\n  unreadCount,\n}: UnreadMessagesSeparatorProps) => {\n  const { t } = useTranslationContext('UnreadMessagesSeparator');\n  return (\n    <div\n      className={UNREAD_MESSAGE_SEPARATOR_CLASS}\n      data-testid='unread-messages-separator'\n    >\n      {unreadCount && showCount\n        ? t('unreadMessagesSeparatorText', { count: unreadCount })\n        : t('Unread messages')}\n    </div>\n  );\n};\n", "import { useEffect } from 'react';\nimport {\n  useChannelActionContext,\n  useChannelStateContext,\n  useChatContext,\n} from '../../../context';\nimport type { Channel, Event, LocalMessage, MessageResponse } from 'stream-chat';\n\nconst hasReadLastMessage = (channel: Channel, userId: string) => {\n  const latestMessageIdInChannel = channel.state.latestMessages.slice(-1)[0]?.id;\n  const lastReadMessageIdServer = channel.state.read[userId]?.last_read_message_id;\n  return latestMessageIdInChannel === lastReadMessageIdServer;\n};\n\ntype UseMarkReadParams = {\n  isMessageListScrolledToBottom: boolean;\n  messageListIsThread: boolean;\n  wasMarkedUnread?: boolean;\n};\n\n/**\n * Takes care of marking a channel read. The channel is read only if all the following applies:\n * 1. the message list is not rendered in a thread\n * 2. the message list is scrolled to the bottom\n * 3. the channel was not marked unread by the user\n * @param isMessageListScrolledToBottom\n * @param messageListIsThread\n * @param wasChannelMarkedUnread\n */\nexport const useMarkRead = ({\n  isMessageListScrolledToBottom,\n  messageListIsThread,\n  wasMarkedUnread,\n}: UseMarkReadParams) => {\n  const { client } = useChatContext('useMarkRead');\n  const { markRead, setChannelUnreadUiState } = useChannelActionContext('useMarkRead');\n  const { channel } = useChannelStateContext('useMarkRead');\n\n  useEffect(() => {\n    if (!channel.getConfig()?.read_events) return;\n    const shouldMarkRead = () =>\n      !document.hidden &&\n      !wasMarkedUnread &&\n      !messageListIsThread &&\n      isMessageListScrolledToBottom &&\n      client.user?.id &&\n      !hasReadLastMessage(channel, client.user.id);\n\n    const onVisibilityChange = () => {\n      if (shouldMarkRead()) markRead();\n    };\n\n    const handleMessageNew = (event: Event) => {\n      const mainChannelUpdated =\n        !event.message?.parent_id || event.message?.show_in_channel;\n\n      if (!isMessageListScrolledToBottom || wasMarkedUnread || document.hidden) {\n        setChannelUnreadUiState((prev) => {\n          const previousUnreadCount = prev?.unread_messages ?? 0;\n          const previousLastMessage = getPreviousLastMessage(\n            channel.state.messages,\n            event.message,\n          );\n          return {\n            ...(prev || {}),\n            last_read:\n              prev?.last_read ??\n              (previousUnreadCount === 0 && previousLastMessage?.created_at\n                ? new Date(previousLastMessage.created_at)\n                : new Date(0)), // not having information about the last read message means the whole channel is unread,\n            unread_messages: previousUnreadCount + 1,\n          };\n        });\n      } else if (mainChannelUpdated && shouldMarkRead()) {\n        markRead();\n      }\n    };\n\n    channel.on('message.new', handleMessageNew);\n    document.addEventListener('visibilitychange', onVisibilityChange);\n\n    if (shouldMarkRead()) {\n      markRead();\n    }\n\n    return () => {\n      channel.off('message.new', handleMessageNew);\n      document.removeEventListener('visibilitychange', onVisibilityChange);\n    };\n  }, [\n    channel,\n    client,\n    isMessageListScrolledToBottom,\n    markRead,\n    messageListIsThread,\n    setChannelUnreadUiState,\n    wasMarkedUnread,\n  ]);\n};\n\nfunction getPreviousLastMessage(messages: LocalMessage[], newMessage?: MessageResponse) {\n  if (!newMessage) return;\n  let previousLastMessage;\n  for (let i = messages.length - 1; i >= 0; i--) {\n    const msg = messages[i];\n    if (!msg?.id) break;\n    if (msg.id !== newMessage.id) {\n      previousLastMessage = msg;\n      break;\n    }\n  }\n  return previousLastMessage;\n}\n", "import type { PropsWithChildren } from 'react';\nimport React from 'react';\n\nexport type MessageNotificationProps = PropsWithChildren<{\n  /** button click event handler */\n  onClick: React.MouseEventHandler;\n  /** signals whether the message list is considered (below a threshold) to be scrolled to the bottom. Prop used only by [ScrollToBottomButton](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageList/ScrollToBottomButton.tsx) */\n  isMessageListScrolledToBottom?: boolean;\n  /** Whether or not to show notification. Prop used only by [MessageNotification](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageList/MessageNotification.tsx)  */\n  showNotification?: boolean;\n  /** informs the component whether it is rendered inside a thread message list */\n  threadList?: boolean;\n  /** */\n  unreadCount?: number;\n}>;\n\nconst UnMemoizedMessageNotification = (props: MessageNotificationProps) => {\n  const { children, onClick, showNotification = true } = props;\n\n  if (!showNotification) return null;\n\n  return (\n    <button\n      aria-live='polite'\n      className={`str-chat__message-notification`}\n      data-testid='message-notification'\n      onClick={onClick}\n    >\n      {children}\n    </button>\n  );\n};\n\nexport const MessageNotification = React.memo(\n  UnMemoizedMessageNotification,\n) as typeof UnMemoizedMessageNotification;\n", "import React from 'react';\n\nimport { ConnectionStatus } from './ConnectionStatus';\nimport { CustomNotification } from './CustomNotification';\n\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useNotifications } from '../Notifications/hooks/useNotifications';\nimport type { MessageNotificationProps } from './MessageNotification';\nimport type { ChannelNotifications } from '../../context/ChannelStateContext';\n\nconst ClientNotifications = () => {\n  const clientNotifications = useNotifications();\n  const { t } = useTranslationContext();\n\n  return (\n    <>\n      {clientNotifications.map((notification) => (\n        <CustomNotification\n          active={true}\n          key={notification.id}\n          type={notification.severity}\n        >\n          {t('translationBuilderTopic/notification', { notification })}\n        </CustomNotification>\n      ))}\n    </>\n  );\n};\n\nexport type MessageListNotificationsProps = {\n  hasNewMessages: boolean;\n  isMessageListScrolledToBottom: boolean;\n  isNotAtLatestMessageSet: boolean;\n  MessageNotification: React.ComponentType<MessageNotificationProps>;\n  notifications: ChannelNotifications;\n  scrollToBottom: () => void;\n  threadList?: boolean;\n  unreadCount?: number;\n};\n\nexport const MessageListNotifications = (props: MessageListNotificationsProps) => {\n  const {\n    hasNewMessages,\n    isMessageListScrolledToBottom,\n    isNotAtLatestMessageSet,\n    MessageNotification,\n    notifications,\n    scrollToBottom,\n    threadList,\n    unreadCount,\n  } = props;\n\n  const { t } = useTranslationContext('MessageListNotifications');\n\n  return (\n    <div className='str-chat__list-notifications'>\n      {notifications.map((notification) => (\n        <CustomNotification active={true} key={notification.id} type={notification.type}>\n          {notification.text}\n        </CustomNotification>\n      ))}\n      <ClientNotifications />\n      <ConnectionStatus />\n      <MessageNotification\n        isMessageListScrolledToBottom={isMessageListScrolledToBottom}\n        onClick={scrollToBottom}\n        showNotification={hasNewMessages || isNotAtLatestMessageSet}\n        threadList={threadList}\n        unreadCount={unreadCount}\n      >\n        {isNotAtLatestMessageSet ? t('Latest Messages') : t('New Messages!')}\n      </MessageNotification>\n    </div>\n  );\n};\n", "import { useChatContext } from '../../../context';\nimport { useStateStore } from '../../../store';\nimport type { Notification, NotificationManagerState } from 'stream-chat';\n\nconst selector = (state: NotificationManagerState) => ({\n  notifications: state.notifications,\n});\n\nexport const useNotifications = (): Notification[] => {\n  const { client } = useChatContext();\n  const result = useStateStore(client.notifications.store, selector);\n  return result.notifications;\n};\n", "import React from 'react';\nimport { CloseIcon } from './icons';\nimport { useChannelActionContext, useTranslationContext } from '../../context';\n\nexport type UnreadMessagesNotificationProps = {\n  /**\n   * Configuration parameter to determine the message page size, when jumping to the first unread message.\n   */\n  queryMessageLimit?: number;\n  /**\n   * Configuration parameter to determine, whether the unread count is to be shown on the component. Disabled by default.\n   */\n  showCount?: boolean;\n  /**\n   * The count of unread messages to be displayed if enabled.\n   */\n  unreadCount?: number;\n};\n\nexport const UnreadMessagesNotification = ({\n  queryMessageLimit,\n  showCount,\n  unreadCount,\n}: UnreadMessagesNotificationProps) => {\n  const { jumpToFirstUnreadMessage, markRead } = useChannelActionContext(\n    'UnreadMessagesNotification',\n  );\n  const { t } = useTranslationContext('UnreadMessagesNotification');\n\n  return (\n    <div\n      className='str-chat__unread-messages-notification'\n      data-testid='unread-messages-notification'\n    >\n      <button onClick={() => jumpToFirstUnreadMessage(queryMessageLimit)}>\n        {unreadCount && showCount\n          ? t('{{count}} unread', { count: unreadCount ?? 0 })\n          : t('Unread messages')}\n      </button>\n      <button onClick={() => markRead()}>\n        <CloseIcon />\n      </button>\n    </div>\n  );\n};\n", "import React from 'react';\n\ninterface ArrowProps {\n  className?: string;\n  color?: string;\n}\n\nexport const ArrowUp = ({ className, color }: ArrowProps) => (\n  <svg\n    className={className}\n    data-testid='arrow-up'\n    fill='none'\n    height='24'\n    viewBox='0 0 24 24'\n    width='24'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      d='M16.59 15.7051L12 11.1251L7.41 15.7051L6 14.2951L12 8.29508L18 14.2951L16.59 15.7051Z'\n      fill={color || 'var(--primary-color)'}\n    />\n  </svg>\n);\n\nexport const ArrowDown = ({ className, color }: ArrowProps) => (\n  <svg\n    className={className}\n    data-testid='arrow-down'\n    fill='none'\n    height='24'\n    viewBox='0 0 24 24'\n    width='24'\n    xmlns='http://www.w3.org/2000/svg'\n  >\n    <path\n      d='M7.41 8.29504L12 12.875L16.59 8.29504L18 9.70504L12 15.705L6 9.70504L7.41 8.29504Z'\n      fill={color || 'var(--primary-color)'}\n    />\n  </svg>\n);\n\nexport const CloseIcon = () => (\n  <svg fill='currentColor' viewBox='0 0 14 13' xmlns='http://www.w3.org/2000/svg'>\n    <path d='M1.32227 12.3408C0.944336 11.9629 0.953125 11.3213 1.32227 10.9521L5.60254 6.66309L1.32227 2.38281C0.953125 2.01367 0.944336 1.37207 1.32227 0.994141C1.7002 0.616211 2.3418 0.625 2.71094 0.985352L7 5.27441L11.2803 0.994141C11.6494 0.625 12.291 0.616211 12.6689 0.994141C13.0469 1.37207 13.0381 2.01367 12.6689 2.38281L8.38867 6.66309L12.6689 10.9521C13.0381 11.3213 13.0469 11.9629 12.6689 12.3408C12.291 12.7188 11.6494 12.71 11.2803 12.3408L7 8.06055L2.71094 12.3408C2.3418 12.71 1.7002 12.7188 1.32227 12.3408Z' />\n  </svg>\n);\n", "import type { PropsWithChildren } from 'react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport type { PaginatorProps } from '../../types/types';\nimport { deprecationAndReplacementWarning } from '../../utils/deprecationWarning';\nimport { DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD } from '../../constants/limits';\n\n/**\n * Prevents Chrome hangups\n * See: https://stackoverflow.com/questions/47524205/random-high-content-download-time-in-chrome/47684257#47684257\n */\nconst mousewheelListener = (event: Event) => {\n  if (event instanceof WheelEvent && event.deltaY === 1) {\n    event.preventDefault();\n  }\n};\n\nexport type InfiniteScrollProps = PaginatorProps & {\n  className?: string;\n  element?: React.ElementType;\n  /**\n   * @desc Flag signalling whether more pages with older items can be loaded\n   * @deprecated Use hasPreviousPage prop instead. Planned for removal: https://github.com/GetStream/stream-chat-react/issues/1804\n   */\n  hasMore?: boolean;\n  /**\n   * @desc Flag signalling whether more pages with newer items can be loaded\n   * @deprecated Use hasNextPage prop instead. Planned for removal: https://github.com/GetStream/stream-chat-react/issues/1804\n   */\n  hasMoreNewer?: boolean;\n  /** Element to be rendered at the top of the thread message list. By default, Message and ThreadStart components */\n  head?: React.ReactNode;\n  initialLoad?: boolean;\n  isLoading?: boolean;\n  listenToScroll?: (offset: number, reverseOffset: number, threshold: number) => void;\n  loader?: React.ReactNode;\n  /**\n   * @desc Function that loads previous page with older items\n   * @deprecated Use loadPreviousPage prop instead. Planned for removal: https://github.com/GetStream/stream-chat-react/issues/1804\n   */\n  loadMore?: () => void;\n  /**\n   * @desc Function that loads next page with newer items\n   * @deprecated Use loadNextPage prop instead. Planned for removal: https://github.com/GetStream/stream-chat-react/issues/1804\n   */\n  loadMoreNewer?: () => void;\n  useCapture?: boolean;\n};\n\n/**\n * This component serves a single purpose - load more items on scroll inside the MessageList component\n * It is not a general purpose infinite scroll controller, because:\n * 1. It is re-rendered whenever queryInProgress, hasNext, hasPrev changes. This can lead to scrollListener to have stale data.\n * 2. It pretends to invoke scrollListener on resize event even though this event is emitted only on window resize. It should\n * rather use ResizeObserver. But then again, it ResizeObserver would invoke a stale version of scrollListener.\n *\n * In general, the infinite scroll controller should not aim for checking the loading state and whether there is more data to load.\n * That should be controlled by the loading function.\n */\nexport const InfiniteScroll = (props: PropsWithChildren<InfiniteScrollProps>) => {\n  const {\n    children,\n    element: Component = 'div',\n    hasMore,\n    hasMoreNewer,\n    hasNextPage,\n    hasPreviousPage,\n    head,\n    initialLoad = true,\n    isLoading,\n    listenToScroll,\n    loader,\n    loadMore,\n    loadMoreNewer,\n    loadNextPage,\n    loadPreviousPage,\n    threshold = DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD,\n    useCapture = false,\n    ...elementProps\n  } = props;\n\n  const loadNextPageFn = loadNextPage || loadMoreNewer;\n  const loadPreviousPageFn = loadPreviousPage || loadMore;\n  const hasNextPageFlag = hasNextPage || hasMoreNewer;\n  const hasPreviousPageFlag = hasPreviousPage || hasMore;\n\n  const [scrollComponent, setScrollComponent] = useState<HTMLElement | null>(null);\n  const previousOffset = useRef<number | undefined>(undefined);\n  const previousReverseOffset = useRef<number | undefined>(undefined);\n\n  const scrollListenerRef = useRef<() => void>(undefined);\n  scrollListenerRef.current = () => {\n    const element = scrollComponent;\n\n    if (!element || element.offsetParent === null) {\n      return;\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const parentElement = element.parentElement!;\n\n    const offset =\n      element.scrollHeight - parentElement.scrollTop - parentElement.clientHeight;\n    const reverseOffset = parentElement.scrollTop;\n\n    if (listenToScroll) {\n      listenToScroll(offset, reverseOffset, threshold);\n    }\n\n    if (isLoading) return;\n\n    if (\n      previousOffset.current === offset &&\n      previousReverseOffset.current === reverseOffset\n    )\n      return;\n    previousOffset.current = offset;\n    previousReverseOffset.current = reverseOffset;\n\n    // FIXME: this triggers loadMore call when a user types messages in thread and the scroll container expands\n    if (\n      reverseOffset < Number(threshold) &&\n      typeof loadPreviousPageFn === 'function' &&\n      hasPreviousPageFlag\n    ) {\n      loadPreviousPageFn();\n    }\n\n    if (\n      offset < Number(threshold) &&\n      typeof loadNextPageFn === 'function' &&\n      hasNextPageFlag\n    ) {\n      loadNextPageFn();\n    }\n  };\n\n  useEffect(() => {\n    deprecationAndReplacementWarning(\n      [\n        [{ hasMoreNewer }, { hasNextPage }],\n        [{ loadMoreNewer }, { loadNextPage }],\n        [{ hasMore }, { hasPreviousPage }],\n        [{ loadMore }, { loadPreviousPage }],\n      ],\n      'InfiniteScroll',\n    );\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  useEffect(() => {\n    const scrollElement = scrollComponent?.parentNode;\n\n    if (!scrollElement) return;\n\n    const scrollListener = () => scrollListenerRef.current?.();\n\n    scrollElement.addEventListener('scroll', scrollListener, useCapture);\n    scrollElement.addEventListener('resize', scrollListener, useCapture);\n    scrollListener();\n\n    return () => {\n      scrollElement.removeEventListener('scroll', scrollListener, useCapture);\n      scrollElement.removeEventListener('resize', scrollListener, useCapture);\n    };\n  }, [initialLoad, scrollComponent, useCapture]);\n\n  useEffect(() => {\n    const scrollElement = scrollComponent?.parentNode;\n\n    if (!scrollElement) return;\n\n    scrollElement.addEventListener('wheel', mousewheelListener, { passive: false });\n\n    return () => {\n      scrollElement.removeEventListener('wheel', mousewheelListener, useCapture);\n    };\n  }, [scrollComponent, useCapture]);\n\n  return (\n    <Component {...elementProps} ref={setScrollComponent}>\n      {head}\n      {loader}\n      {children}\n    </Component>\n  );\n};\n", "import React from 'react';\nimport clsx from 'clsx';\n\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport { useChatContext } from '../../context/ChatContext';\nimport { useTypingContext } from '../../context/TypingContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nexport type TypingIndicatorProps = {\n  /** Whether the typing indicator is in a thread */\n  threadList?: boolean;\n};\n\nconst useJoinTypingUsers = (names: string[]) => {\n  const { t } = useTranslationContext();\n\n  if (!names.length) return null;\n\n  const [name, ...rest] = names;\n\n  if (names.length === 1)\n    return t('{{ user }} is typing...', {\n      user: name,\n    });\n\n  const MAX_JOINED_USERS = 3;\n\n  if (names.length > MAX_JOINED_USERS)\n    return t('{{ users }} and more are typing...', {\n      users: names.slice(0, MAX_JOINED_USERS).join(', ').trim(),\n    });\n\n  return t('{{ users }} and {{ user }} are typing...', {\n    user: name,\n    users: rest.join(', ').trim(),\n  });\n};\n\n/**\n * TypingIndicator lists users currently typing, it needs to be a child of Channel component\n */\nconst UnMemoizedTypingIndicator = (props: TypingIndicatorProps) => {\n  const { threadList } = props;\n\n  const { channelConfig, thread } = useChannelStateContext('TypingIndicator');\n  const { client } = useChatContext('TypingIndicator');\n  const { typing = {} } = useTypingContext('TypingIndicator');\n\n  const typingInChannel = !threadList\n    ? Object.values(typing).filter(\n        ({ parent_id, user }) => user?.id !== client.user?.id && !parent_id,\n      )\n    : [];\n\n  const typingInThread = threadList\n    ? Object.values(typing).filter(\n        ({ parent_id, user }) => user?.id !== client.user?.id && parent_id === thread?.id,\n      )\n    : [];\n\n  const typingUserList = (threadList ? typingInThread : typingInChannel)\n    .map(({ user }) => user?.name || user?.id)\n    .filter(Boolean) as string[];\n\n  const joinedTypingUsers = useJoinTypingUsers(typingUserList);\n\n  const isTypingActive =\n    (threadList && typingInThread.length) || (!threadList && typingInChannel.length);\n\n  if (channelConfig?.typing_events === false) {\n    return null;\n  }\n\n  if (!isTypingActive) return null;\n  return (\n    <div\n      className={clsx('str-chat__typing-indicator', {\n        'str-chat__typing-indicator--typing': isTypingActive,\n      })}\n      data-testid='typing-indicator'\n    >\n      <div className='str-chat__typing-indicator__dots'>\n        <span className='str-chat__typing-indicator__dot'></span>\n        <span className='str-chat__typing-indicator__dot'></span>\n        <span className='str-chat__typing-indicator__dot'></span>\n      </div>\n      <div className='str-chat__typing-indicator__users' data-testid='typing-users'>\n        {joinedTypingUsers}\n      </div>\n    </div>\n  );\n};\n\nexport const TypingIndicator = React.memo(\n  UnMemoizedTypingIndicator,\n) as typeof UnMemoizedTypingIndicator;\n", "import type { ReactNode } from 'react';\nimport React, { Fragment } from 'react';\nimport type { GroupStyle, RenderedMessage } from './utils';\nimport { getIsFirstUnreadMessage, isDateSeparatorMessage, isIntroMessage } from './utils';\nimport type { MessageProps } from '../Message';\nimport { Message } from '../Message';\nimport { DateSeparator as DefaultDateSeparator } from '../DateSeparator';\nimport { EventComponent as DefaultMessageSystem } from '../EventComponent';\nimport { UnreadMessagesSeparator as DefaultUnreadMessagesSeparator } from './UnreadMessagesSeparator';\nimport type { LocalMessage, UserResponse } from 'stream-chat';\nimport type { ComponentContextValue, CustomClasses } from '../../context';\nimport type { ChannelUnreadUiState } from '../../types';\n\nexport interface RenderMessagesOptions {\n  components: ComponentContextValue;\n  lastReceivedMessageId: string | null;\n  messageGroupStyles: Record<string, GroupStyle>;\n  messages: Array<RenderedMessage>;\n  ownMessagesDeliveredToOthers: Record<string, UserResponse[]>;\n  /**\n   * Object mapping message IDs of own messages to the users who read those messages.\n   */\n  readData: Record<string, Array<UserResponse>>;\n  /**\n   * Props forwarded to the Message component.\n   */\n  sharedMessageProps: SharedMessageProps;\n  /** Latest own message in currently displayed message set. */\n  lastOwnMessage?: LocalMessage;\n  /**\n   * Current user's channel read state used to render components reflecting unread state.\n   * It does not reflect the back-end state if a channel is marked read on mount.\n   * This is in order to keep the unread UI when an unread channel is open.\n   */\n  channelUnreadUiState?: ChannelUnreadUiState;\n  customClasses?: CustomClasses;\n}\n\nexport type SharedMessageProps = Omit<MessageProps, MessagePropsToOmit>;\n\nexport type MessageRenderer = (options: RenderMessagesOptions) => Array<ReactNode>;\n\ntype MessagePropsToOmit =\n  | 'channel'\n  | 'deliveredTo'\n  | 'groupStyles'\n  | 'initialMessage'\n  | 'lastReceivedId'\n  | 'message'\n  | 'readBy';\n\nexport function defaultRenderMessages({\n  channelUnreadUiState,\n  components,\n  customClasses,\n  lastOwnMessage,\n  lastReceivedMessageId: lastReceivedId,\n  messageGroupStyles,\n  messages,\n  ownMessagesDeliveredToOthers,\n  readData,\n  sharedMessageProps: messageProps,\n}: RenderMessagesOptions) {\n  const {\n    DateSeparator = DefaultDateSeparator,\n    HeaderComponent,\n    MessageListItem = 'li',\n    MessageSystem = DefaultMessageSystem,\n    UnreadMessagesSeparator = DefaultUnreadMessagesSeparator,\n  } = components;\n\n  const renderedMessages = [];\n  let firstMessage;\n  let previousMessage = undefined;\n  for (let index = 0; index < messages.length; index++) {\n    const message = messages[index];\n    if (isDateSeparatorMessage(message)) {\n      renderedMessages.push(\n        <MessageListItem data-index={index} key={`${message.date.toISOString()}-i`}>\n          <DateSeparator\n            date={message.date}\n            formatDate={messageProps.formatDate}\n            unread={message.unread}\n          />\n        </MessageListItem>,\n      );\n    } else if (isIntroMessage(message)) {\n      if (HeaderComponent) {\n        renderedMessages.push(\n          <MessageListItem data-index={index} key='intro'>\n            <HeaderComponent />\n          </MessageListItem>,\n        );\n      }\n    } else if (message.type === 'system') {\n      renderedMessages.push(\n        <MessageListItem\n          data-index={index}\n          data-message-id={message.id}\n          key={message.id || message.created_at.toISOString()}\n        >\n          <MessageSystem message={message} unsafeHTML={messageProps.unsafeHTML} />\n        </MessageListItem>,\n      );\n    } else {\n      if (!firstMessage) {\n        firstMessage = message;\n      }\n      const groupStyles: GroupStyle = messageGroupStyles[message.id] || '';\n      const messageClass =\n        customClasses?.message || `str-chat__li str-chat__li--${groupStyles}`;\n\n      const isFirstUnreadMessage = getIsFirstUnreadMessage({\n        firstUnreadMessageId: channelUnreadUiState?.first_unread_message_id,\n        isFirstMessage: !!firstMessage?.id && firstMessage.id === message.id,\n        lastReadDate: channelUnreadUiState?.last_read,\n        lastReadMessageId: channelUnreadUiState?.last_read_message_id,\n        message,\n        previousMessage,\n        unreadMessageCount: channelUnreadUiState?.unread_messages,\n      });\n\n      renderedMessages.push(\n        <Fragment key={message.id || message.created_at.toISOString()}>\n          {isFirstUnreadMessage && UnreadMessagesSeparator && (\n            <MessageListItem className='str-chat__li str-chat__unread-messages-separator-wrapper'>\n              <UnreadMessagesSeparator\n                unreadCount={channelUnreadUiState?.unread_messages}\n              />\n            </MessageListItem>\n          )}\n          <MessageListItem\n            className={messageClass}\n            data-index={index}\n            data-message-id={message.id}\n            data-testid={messageClass}\n          >\n            <Message\n              deliveredTo={ownMessagesDeliveredToOthers[message.id] || []}\n              groupStyles={[groupStyles]} /* TODO: convert to simple string */\n              lastOwnMessage={lastOwnMessage}\n              lastReceivedId={lastReceivedId}\n              message={message}\n              readBy={readData[message.id] || []}\n              {...messageProps}\n            />\n          </MessageListItem>\n        </Fragment>,\n      );\n      previousMessage = message;\n    }\n  }\n  return renderedMessages;\n}\n", "import React from 'react';\n\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { getDateString } from '../../i18n/utils';\n\nimport type { TimestampFormatterOptions } from '../../i18n/types';\n\nexport type DateSeparatorProps = TimestampFormatterOptions & {\n  /** The date to format */\n  date: Date;\n  /** Override the default formatting of the date. This is a function that has access to the original date object. */\n  formatDate?: (date: Date) => string;\n  /** Set the position of the date in the separator, options are 'left', 'center', 'right', @default right */\n  position?: 'left' | 'center' | 'right';\n  /** If following messages are not new */\n  unread?: boolean;\n};\n\nconst UnMemoizedDateSeparator = (props: DateSeparatorProps) => {\n  const {\n    calendar,\n    date: messageCreatedAt,\n    formatDate,\n    position = 'right',\n    unread,\n    ...restTimestampFormatterOptions\n  } = props;\n\n  const { t, tDateTimeParser } = useTranslationContext('DateSeparator');\n\n  const formattedDate = getDateString({\n    calendar,\n    ...restTimestampFormatterOptions,\n    formatDate,\n    messageCreatedAt,\n    t,\n    tDateTimeParser,\n    timestampTranslationKey: 'timestamp/DateSeparator',\n  });\n\n  return (\n    <div className='str-chat__date-separator' data-testid='date-separator'>\n      {(position === 'right' || position === 'center') && (\n        <hr className='str-chat__date-separator-line' />\n      )}\n      <div className='str-chat__date-separator-date'>\n        {unread ? `${t('New')} - ${formattedDate}` : formattedDate}\n      </div>\n      {(position === 'left' || position === 'center') && (\n        <hr className='str-chat__date-separator-line' />\n      )}\n    </div>\n  );\n};\n\n/**\n * A simple date separator between messages.\n */\nexport const DateSeparator = React.memo(\n  UnMemoizedDateSeparator,\n) as typeof UnMemoizedDateSeparator;\n", "import React from 'react';\n\nimport { Avatar as DefaultAvatar } from '../Avatar';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { getDateString } from '../../i18n/utils';\n\nimport type { Event, LocalMessage } from 'stream-chat';\nimport type { AvatarProps } from '../Avatar';\nimport type { TimestampFormatterOptions } from '../../i18n/types';\n\nexport type EventComponentProps = TimestampFormatterOptions & {\n  /** Message object */\n  message: LocalMessage & {\n    event?: Event;\n  };\n  unsafeHTML?: boolean;\n  /** Custom UI component to display user avatar, defaults to and accepts same props as: [Avatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/Avatar.tsx) */\n  Avatar?: React.ComponentType<AvatarProps>;\n};\n\n/**\n * Component to display system and channel event messages\n */\nconst UnMemoizedEventComponent = (props: EventComponentProps) => {\n  const {\n    Avatar = DefaultAvatar,\n    calendar,\n    calendarFormats,\n    format,\n    message,\n    unsafeHTML = false,\n  } = props;\n\n  const { t, tDateTimeParser } = useTranslationContext('EventComponent');\n  const { created_at = '', event, type } = message;\n  const getDateOptions = { messageCreatedAt: created_at.toString(), tDateTimeParser };\n\n  if (type === 'system')\n    return (\n      <div className='str-chat__message--system' data-testid='message-system'>\n        <div className='str-chat__message--system__text'>\n          <div className='str-chat__message--system__line' />\n          {unsafeHTML ? (\n            <div\n              dangerouslySetInnerHTML={{ __html: message.html || '' }}\n              data-unsafe-inner-html\n            />\n          ) : (\n            <p>{message.text}</p>\n          )}\n          <div className='str-chat__message--system__line' />\n        </div>\n        <div className='str-chat__message--system__date'>\n          <strong>\n            {getDateString({\n              ...getDateOptions,\n              calendar,\n              calendarFormats,\n              format,\n              t,\n              timestampTranslationKey: 'timestamp/SystemMessage',\n            })}\n          </strong>\n        </div>\n      </div>\n    );\n\n  if (event?.type === 'member.removed' || event?.type === 'member.added') {\n    const name = event.user?.name || event.user?.id;\n    const sentence = `${name} ${\n      event.type === 'member.added' ? 'has joined the chat' : 'was removed from the chat'\n    }`;\n\n    return (\n      <div className='str-chat__event-component__channel-event'>\n        <Avatar image={event.user?.image} name={name} user={event.user} />\n        <div className='str-chat__event-component__channel-event__content'>\n          <em className='str-chat__event-component__channel-event__sentence'>\n            {sentence}\n          </em>\n          <div className='str-chat__event-component__channel-event__date'>\n            {getDateString({ ...getDateOptions, format: 'LT' })}\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n  return null;\n};\n\nexport const EventComponent = React.memo(\n  UnMemoizedEventComponent,\n) as typeof UnMemoizedEventComponent;\n", "import { nanoid } from 'nanoid';\nimport { useMemo } from 'react';\n\n/**\n * The ID is generated using the `nanoid` library and is memoized to ensure\n * that it remains the same across renders unless the key changes.\n */\nexport const useStableId = (key?: string) => {\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  const id = useMemo(() => nanoid(), [key]);\n\n  return id;\n};\n", "import { useMemo } from 'react';\nimport { findReverse } from '../../../utils/findReverse';\nimport type { LocalMessage } from 'stream-chat';\n\n// fixme: we should be able to retrieve last own message quickly from the LLC. Should be done when refactoring the LLC Channel state to reactive.\nexport const useLastOwnMessage = ({\n  messages,\n  ownUserId,\n}: {\n  messages?: LocalMessage[];\n  ownUserId?: string;\n}) =>\n  useMemo(\n    () =>\n      messages && findReverse(messages, (msg) => (msg.user && msg.user.id) === ownUserId),\n    [messages, ownUserId],\n  );\n", "// last own message should be tracked in the low-level client\nexport const findReverse = <T>(\n  items: T[],\n  matches: (items: T) => boolean,\n): T | undefined => {\n  for (let i = items.length - 1; i >= 0; i -= 1) {\n    if (matches(items[i])) {\n      return items[i];\n    }\n  }\n\n  return undefined;\n};\n", "import React, { useEffect, useState } from 'react';\nimport clsx from 'clsx';\n\nimport { ArrowDown } from './icons';\n\nimport { useChannelStateContext, useChatContext } from '../../context';\n\nimport type { Event } from 'stream-chat';\nimport type { MessageNotificationProps } from './MessageNotification';\n\nconst UnMemoizedScrollToBottomButton = (\n  props: Pick<\n    MessageNotificationProps,\n    'isMessageListScrolledToBottom' | 'onClick' | 'threadList'\n  >,\n) => {\n  const { isMessageListScrolledToBottom, onClick, threadList } = props;\n\n  const { channel: activeChannel, client } = useChatContext();\n  const { thread } = useChannelStateContext();\n  const [countUnread, setCountUnread] = useState(activeChannel?.countUnread() || 0);\n  const [replyCount, setReplyCount] = useState(thread?.reply_count || 0);\n  const observedEvent = threadList ? 'message.updated' : 'message.new';\n\n  useEffect(() => {\n    const handleEvent = (event: Event) => {\n      const newMessageInAnotherChannel = event.cid !== activeChannel?.cid;\n      const newMessageIsMine = event.user?.id === client.user?.id;\n\n      const isThreadOpen = !!thread;\n      const newMessageIsReply = !!event.message?.parent_id;\n      const dontIncreaseMainListCounterOnNewReply =\n        isThreadOpen && !threadList && newMessageIsReply;\n\n      if (\n        isMessageListScrolledToBottom ||\n        newMessageInAnotherChannel ||\n        newMessageIsMine ||\n        dontIncreaseMainListCounterOnNewReply\n      ) {\n        return;\n      }\n\n      if (event.type === 'message.new') {\n        // cannot rely on channel.countUnread because active channel is automatically marked read\n        setCountUnread((prev) => prev + 1);\n      } else if (event.message?.id === thread?.id) {\n        const newReplyCount = event.message?.reply_count || 0;\n        setCountUnread(() => newReplyCount - replyCount);\n      }\n    };\n    client.on(observedEvent, handleEvent);\n\n    return () => {\n      client.off(observedEvent, handleEvent);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [activeChannel, isMessageListScrolledToBottom, observedEvent, replyCount, thread]);\n\n  useEffect(() => {\n    if (isMessageListScrolledToBottom) {\n      setCountUnread(0);\n      setReplyCount(thread?.reply_count || 0);\n    }\n  }, [isMessageListScrolledToBottom, thread]);\n\n  if (isMessageListScrolledToBottom) return null;\n\n  return (\n    <div className='str-chat__jump-to-latest-message'>\n      <button\n        aria-live='polite'\n        className={`\n        str-chat__message-notification-scroll-to-latest\n        str-chat__circle-fab\n      `}\n        data-testid='message-notification'\n        onClick={onClick}\n      >\n        <ArrowDown />\n        {countUnread > 0 && (\n          <div\n            className={clsx(\n              'str-chat__message-notification',\n              'str-chat__jump-to-latest-unread-count',\n            )}\n            data-testid={'unread-message-notification-counter'}\n          >\n            {countUnread}\n          </div>\n        )}\n      </button>\n    </div>\n  );\n};\n\nexport const ScrollToBottomButton = React.memo(\n  UnMemoizedScrollToBottomButton,\n) as typeof UnMemoizedScrollToBottomButton;\n", "import type { RefObject } from 'react';\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type {\n  ComputeItemKey,\n  ScrollSeekConfiguration,\n  ScrollSeekPlaceholderProps,\n  VirtuosoHandle,\n  VirtuosoProps,\n} from 'react-virtuoso';\nimport { Virtuoso } from 'react-virtuoso';\n\nimport { GiphyPreviewMessage as DefaultGiphyPreviewMessage } from './GiphyPreviewMessage';\nimport { useLastReadData } from './hooks';\nimport {\n  useGiphyPreview,\n  useMessageSetKey,\n  useNewMessageNotification,\n  usePrependedMessagesCount,\n  useScrollToBottomOnNewMessage,\n  useShouldForceScrollToBottom,\n  useUnreadMessagesNotificationVirtualized,\n} from './hooks/VirtualizedMessageList';\nimport { useMarkRead } from './hooks/useMarkRead';\n\nimport { MessageNotification as DefaultMessageNotification } from './MessageNotification';\nimport { MessageListNotifications as DefaultMessageListNotifications } from './MessageListNotifications';\nimport { MessageListMainPanel as DefaultMessageListMainPanel } from './MessageListMainPanel';\nimport type { GroupStyle, ProcessMessagesParams, RenderedMessage } from './utils';\nimport { getGroupStyles, getLastReceived, processMessages } from './utils';\nimport type { MessageProps, MessageUIComponentProps } from '../Message';\nimport { MessageSimple } from '../Message';\nimport { UnreadMessagesNotification as DefaultUnreadMessagesNotification } from './UnreadMessagesNotification';\nimport {\n  calculateFirstItemIndex,\n  calculateItemIndex,\n  EmptyPlaceholder,\n  Header,\n  Item,\n  makeItemsRenderedHandler,\n  messageRenderer,\n} from './VirtualizedMessageListComponents';\n\nimport { UnreadMessagesSeparator as DefaultUnreadMessagesSeparator } from '../MessageList';\nimport { DateSeparator as DefaultDateSeparator } from '../DateSeparator';\nimport { EventComponent as DefaultMessageSystem } from '../EventComponent';\n\nimport { DialogManagerProvider } from '../../context';\nimport type { ChannelActionContextValue } from '../../context/ChannelActionContext';\nimport { useChannelActionContext } from '../../context/ChannelActionContext';\nimport type {\n  ChannelNotifications,\n  ChannelStateContextValue,\n} from '../../context/ChannelStateContext';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport type { ChatContextValue } from '../../context/ChatContext';\nimport { useChatContext } from '../../context/ChatContext';\nimport type { ComponentContextValue } from '../../context/ComponentContext';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { VirtualizedMessageListContextProvider } from '../../context/VirtualizedMessageListContext';\n\nimport type {\n  Channel,\n  LocalMessage,\n  ChannelState as StreamChannelState,\n  UserResponse,\n} from 'stream-chat';\nimport type { UnknownType } from '../../types/types';\nimport { DEFAULT_NEXT_CHANNEL_PAGE_SIZE } from '../../constants/limits';\nimport { useStableId } from '../UtilityComponents/useStableId';\nimport { useLastDeliveredData } from './hooks/useLastDeliveredData';\nimport { useLastOwnMessage } from './hooks/useLastOwnMessage';\n\ntype PropsDrilledToMessage =\n  | 'additionalMessageInputProps'\n  | 'customMessageActions'\n  | 'formatDate'\n  | 'messageActions'\n  | 'openThread'\n  | 'reactionDetailsSort'\n  | 'renderText'\n  | 'sortReactions'\n  | 'sortReactionDetails';\n\ntype VirtualizedMessageListPropsForContext =\n  | PropsDrilledToMessage\n  | 'closeReactionSelectorOnClick'\n  | 'customMessageRenderer'\n  | 'head'\n  | 'loadingMore'\n  | 'Message'\n  | 'returnAllReadData'\n  | 'shouldGroupByUser'\n  | 'threadList';\n\n/**\n * Context object provided to some Virtuoso props that are functions (components rendered by Virtuoso and other functions)\n */\nexport type VirtuosoContext = Required<\n  Pick<\n    ComponentContextValue,\n    'DateSeparator' | 'MessageSystem' | 'UnreadMessagesSeparator'\n  >\n> &\n  Pick<VirtualizedMessageListProps, VirtualizedMessageListPropsForContext> &\n  Pick<ChatContextValue, 'customClasses'> & {\n    /** Latest received message id in the current channel */\n    lastReceivedMessageId: string | null | undefined;\n    /** Object mapping between the message ID and a string representing the position in the group of a sequence of messages posted by the same user. */\n    messageGroupStyles: Record<string, GroupStyle>;\n    /** Number of messages prepended before the first page of messages. This is needed to calculate the virtual position in the virtual list. */\n    numItemsPrepended: number;\n    /** Mapping of message ID of own messages to the array of users, who were delivered the given message */\n    ownMessagesDeliveredToOthers: Record<string, UserResponse[]>;\n    /** Mapping of message ID of own messages to the array of users, who read the given message */\n    ownMessagesReadByOthers: Record<string, UserResponse[]>;\n    /** The original message list enriched with date separators, omitted deleted messages or giphy previews. */\n    processedMessages: RenderedMessage[];\n    /** Instance of VirtuosoHandle object providing the API to navigate in the virtualized list by various scroll actions. */\n    virtuosoRef: RefObject<VirtuosoHandle | null>;\n    /** Latest own message in currently displayed message set. */\n    lastOwnMessage?: LocalMessage;\n    /** Message id which was marked as unread. ALl the messages following this message are considered unrea.  */\n    firstUnreadMessageId?: string;\n    lastReadDate?: Date;\n    /**\n     * The ID of the last message considered read by the current user in the current channel.\n     * All the messages following this message are considered unread.\n     */\n    lastReadMessageId?: string;\n    /** The number of unread messages in the current channel. */\n    unreadMessageCount?: number;\n  };\n\ntype VirtualizedMessageListWithContextProps = VirtualizedMessageListProps & {\n  channel: Channel;\n  hasMore: boolean;\n  hasMoreNewer: boolean;\n  jumpToLatestMessage: () => Promise<void>;\n  loadingMore: boolean;\n  loadingMoreNewer: boolean;\n  notifications: ChannelNotifications;\n  read?: StreamChannelState['read'];\n};\n\nfunction captureResizeObserverExceededError(e: ErrorEvent) {\n  if (\n    e.message === 'ResizeObserver loop completed with undelivered notifications.' ||\n    e.message === 'ResizeObserver loop limit exceeded'\n  ) {\n    e.stopImmediatePropagation();\n  }\n}\n\nfunction useCaptureResizeObserverExceededError() {\n  useEffect(() => {\n    window.addEventListener('error', captureResizeObserverExceededError);\n    return () => {\n      window.removeEventListener('error', captureResizeObserverExceededError);\n    };\n  }, []);\n}\n\nfunction fractionalItemSize(element: HTMLElement) {\n  return element.getBoundingClientRect().height;\n}\n\nfunction findMessageIndex(messages: RenderedMessage[], id: string) {\n  return messages.findIndex((message) => message.id === id);\n}\n\nfunction calculateInitialTopMostItemIndex(\n  messages: RenderedMessage[],\n  highlightedMessageId: string | undefined,\n) {\n  if (highlightedMessageId) {\n    const index = findMessageIndex(messages, highlightedMessageId);\n    if (index !== -1) {\n      return { align: 'center', index } as const;\n    }\n  }\n  return messages.length - 1;\n}\n\nconst VirtualizedMessageListWithContext = (\n  props: VirtualizedMessageListWithContextProps,\n) => {\n  const {\n    additionalMessageInputProps,\n    additionalVirtuosoProps = {},\n    channel,\n    channelUnreadUiState,\n    closeReactionSelectorOnClick,\n    customMessageActions,\n    customMessageRenderer,\n    defaultItemHeight,\n    disableDateSeparator = true,\n    formatDate,\n    groupStyles,\n    hasMoreNewer,\n    head,\n    hideDeletedMessages = false,\n    hideNewMessageSeparator = false,\n    highlightedMessageId,\n    jumpToLatestMessage,\n    loadingMore,\n    loadMore,\n    loadMoreNewer,\n    maxTimeBetweenGroupedMessages,\n    Message: MessageUIComponentFromProps,\n    messageActions,\n    messageLimit = DEFAULT_NEXT_CHANNEL_PAGE_SIZE,\n    messages,\n    notifications,\n    openThread,\n    // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component\n    overscan = 0,\n    reactionDetailsSort,\n    renderText,\n    returnAllReadData = false,\n    reviewProcessedMessage,\n    scrollSeekPlaceHolder,\n    scrollToLatestMessageOnFocus = false,\n    separateGiphyPreview = false,\n    shouldGroupByUser = false,\n    showUnreadNotificationAlways,\n    sortReactionDetails,\n    sortReactions,\n    stickToBottomScrollBehavior = 'smooth',\n    suppressAutoscroll,\n    threadList,\n  } = props;\n\n  const { components: virtuosoComponentsFromProps, ...overridingVirtuosoProps } =\n    additionalVirtuosoProps;\n\n  // Stops errors generated from react-virtuoso to bubble up\n  // to Sentry or other tracking tools.\n  useCaptureResizeObserverExceededError();\n\n  const {\n    DateSeparator = DefaultDateSeparator,\n    GiphyPreviewMessage = DefaultGiphyPreviewMessage,\n    MessageListMainPanel = DefaultMessageListMainPanel,\n    MessageListNotifications = DefaultMessageListNotifications,\n    MessageNotification = DefaultMessageNotification,\n    MessageSystem = DefaultMessageSystem,\n    TypingIndicator,\n    UnreadMessagesNotification = DefaultUnreadMessagesNotification,\n    UnreadMessagesSeparator = DefaultUnreadMessagesSeparator,\n    VirtualMessage: MessageUIComponentFromContext = MessageSimple,\n  } = useComponentContext('VirtualizedMessageList');\n  const MessageUIComponent = MessageUIComponentFromProps || MessageUIComponentFromContext;\n\n  const { client, customClasses } = useChatContext('VirtualizedMessageList');\n\n  const virtuoso = useRef<VirtuosoHandle>(null);\n\n  const lastRead = useMemo(() => channel.lastRead?.(), [channel]);\n\n  const { show: showUnreadMessagesNotification, toggleShowUnreadMessagesNotification } =\n    useUnreadMessagesNotificationVirtualized({\n      lastRead: channelUnreadUiState?.last_read,\n      showAlways: !!showUnreadNotificationAlways,\n      unreadCount: channelUnreadUiState?.unread_messages ?? 0,\n    });\n\n  const { giphyPreviewMessage, setGiphyPreviewMessage } =\n    useGiphyPreview(separateGiphyPreview);\n\n  const processedMessages = useMemo(() => {\n    if (typeof messages === 'undefined') {\n      return [];\n    }\n\n    if (\n      disableDateSeparator &&\n      !hideDeletedMessages &&\n      hideNewMessageSeparator &&\n      !separateGiphyPreview\n    ) {\n      return messages;\n    }\n\n    return processMessages({\n      enableDateSeparator: !disableDateSeparator,\n      hideDeletedMessages,\n      hideNewMessageSeparator,\n      lastRead,\n      messages,\n      reviewProcessedMessage,\n      setGiphyPreviewMessage,\n      userId: client.userID || '',\n    });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [\n    disableDateSeparator,\n    hideDeletedMessages,\n    hideNewMessageSeparator,\n    lastRead,\n    messages,\n    messages?.length,\n    client.userID,\n  ]);\n\n  const lastOwnMessage = useLastOwnMessage({ messages, ownUserId: client.user?.id });\n\n  // get the mapping of own messages to array of users who read them\n  const ownMessagesReadByOthers = useLastReadData({\n    channel,\n    lastOwnMessage,\n    messages: messages || [],\n    returnAllReadData,\n  });\n\n  const ownMessagesDeliveredToOthers = useLastDeliveredData({\n    channel,\n    lastOwnMessage,\n    messages: messages || [],\n    returnAllReadData,\n  });\n\n  const lastReceivedMessageId = useMemo(\n    () => getLastReceived(processedMessages),\n    [processedMessages],\n  );\n\n  const groupStylesFn = groupStyles || getGroupStyles;\n  const messageGroupStyles = useMemo(\n    () =>\n      processedMessages.reduce<Record<string, GroupStyle>>((acc, message, i) => {\n        const style = groupStylesFn(\n          message,\n          processedMessages[i - 1],\n          processedMessages[i + 1],\n          !shouldGroupByUser,\n          maxTimeBetweenGroupedMessages,\n        );\n        if (style && message.id) acc[message.id] = style;\n        return acc;\n      }, {}),\n    // processedMessages were incorrectly rebuilt with a new object identity at some point, hence the .length usage\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      maxTimeBetweenGroupedMessages,\n      processedMessages.length,\n      shouldGroupByUser,\n      groupStylesFn,\n    ],\n  );\n\n  const {\n    atBottom,\n    isMessageListScrolledToBottom,\n    newMessagesNotification,\n    setIsMessageListScrolledToBottom,\n    setNewMessagesNotification,\n  } = useNewMessageNotification(processedMessages, client.userID, hasMoreNewer);\n\n  useMarkRead({\n    isMessageListScrolledToBottom,\n    messageListIsThread: !!threadList,\n    wasMarkedUnread: !!channelUnreadUiState?.first_unread_message_id,\n  });\n\n  const scrollToBottom = useCallback(async () => {\n    if (hasMoreNewer) {\n      await jumpToLatestMessage();\n      return;\n    }\n\n    if (virtuoso.current) {\n      virtuoso.current.scrollToIndex(processedMessages.length - 1);\n    }\n\n    setNewMessagesNotification(false);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [\n    virtuoso,\n    processedMessages,\n    setNewMessagesNotification,\n    // processedMessages were incorrectly rebuilt with a new object identity at some point, hence the .length usage\n    processedMessages.length,\n    hasMoreNewer,\n    jumpToLatestMessage,\n  ]);\n\n  useScrollToBottomOnNewMessage({\n    messages,\n    scrollToBottom,\n    scrollToLatestMessageOnFocus,\n  });\n\n  const numItemsPrepended = usePrependedMessagesCount(\n    processedMessages,\n    !disableDateSeparator,\n  );\n\n  const { messageSetKey } = useMessageSetKey({ messages });\n\n  const shouldForceScrollToBottom = useShouldForceScrollToBottom(\n    processedMessages,\n    client.userID,\n  );\n\n  const handleItemsRendered = useMemo(\n    () =>\n      makeItemsRenderedHandler([toggleShowUnreadMessagesNotification], processedMessages),\n    [processedMessages, toggleShowUnreadMessagesNotification],\n  );\n  const followOutput = (isAtBottom: boolean) => {\n    if (hasMoreNewer || suppressAutoscroll) {\n      return false;\n    }\n\n    if (shouldForceScrollToBottom()) {\n      return isAtBottom ? stickToBottomScrollBehavior : 'auto';\n    }\n    // a message from another user has been received - don't scroll to bottom unless already there\n    return isAtBottom ? stickToBottomScrollBehavior : false;\n  };\n\n  const computeItemKey = useCallback<ComputeItemKey<UnknownType, VirtuosoContext>>(\n    (index, _, { numItemsPrepended, processedMessages }) =>\n      processedMessages[calculateItemIndex(index, numItemsPrepended)].id,\n    [],\n  );\n\n  const atBottomStateChange = (isAtBottom: boolean) => {\n    atBottom.current = isAtBottom;\n    setIsMessageListScrolledToBottom(isAtBottom);\n\n    if (isAtBottom) {\n      loadMoreNewer?.(messageLimit);\n      setNewMessagesNotification?.(false);\n    }\n  };\n  const atTopStateChange = (isAtTop: boolean) => {\n    if (isAtTop) {\n      loadMore?.(messageLimit);\n    }\n  };\n\n  useEffect(() => {\n    let scrollTimeout: ReturnType<typeof setTimeout>;\n    if (highlightedMessageId) {\n      const index = findMessageIndex(processedMessages, highlightedMessageId);\n      if (index !== -1) {\n        scrollTimeout = setTimeout(() => {\n          virtuoso.current?.scrollToIndex({ align: 'center', index });\n        }, 0);\n      }\n    }\n    return () => {\n      clearTimeout(scrollTimeout);\n    };\n  }, [highlightedMessageId, processedMessages]);\n\n  const id = useStableId();\n\n  if (!processedMessages) return null;\n\n  const dialogManagerId = threadList\n    ? `virtualized-message-list-dialog-manager-thread-${id}`\n    : `virtualized-message-list-dialog-manager-${id}`;\n\n  return (\n    <VirtualizedMessageListContextProvider value={{ scrollToBottom }}>\n      <MessageListMainPanel>\n        <DialogManagerProvider id={dialogManagerId}>\n          {!threadList && showUnreadMessagesNotification && (\n            <UnreadMessagesNotification\n              unreadCount={channelUnreadUiState?.unread_messages}\n            />\n          )}\n          <div\n            className={customClasses?.virtualizedMessageList || 'str-chat__virtual-list'}\n          >\n            <Virtuoso<UnknownType, VirtuosoContext>\n              atBottomStateChange={atBottomStateChange}\n              atBottomThreshold={100}\n              atTopStateChange={atTopStateChange}\n              atTopThreshold={100}\n              className='str-chat__message-list-scroll'\n              components={{\n                EmptyPlaceholder,\n                Header,\n                Item,\n                ...virtuosoComponentsFromProps,\n              }}\n              computeItemKey={computeItemKey}\n              context={{\n                additionalMessageInputProps,\n                closeReactionSelectorOnClick,\n                customClasses,\n                customMessageActions,\n                customMessageRenderer,\n                DateSeparator,\n                firstUnreadMessageId: channelUnreadUiState?.first_unread_message_id,\n                formatDate,\n                head,\n                lastOwnMessage,\n                lastReadDate: channelUnreadUiState?.last_read,\n                lastReadMessageId: channelUnreadUiState?.last_read_message_id,\n                lastReceivedMessageId,\n                loadingMore,\n                Message: MessageUIComponent,\n                messageActions,\n                messageGroupStyles,\n                MessageSystem,\n                numItemsPrepended,\n                openThread,\n                ownMessagesDeliveredToOthers,\n                ownMessagesReadByOthers,\n                processedMessages,\n                reactionDetailsSort,\n                renderText,\n                returnAllReadData,\n                shouldGroupByUser,\n                sortReactionDetails,\n                sortReactions,\n                threadList,\n                unreadMessageCount: channelUnreadUiState?.unread_messages,\n                UnreadMessagesSeparator,\n                virtuosoRef: virtuoso,\n              }}\n              firstItemIndex={calculateFirstItemIndex(numItemsPrepended)}\n              followOutput={followOutput}\n              increaseViewportBy={{ bottom: 200, top: 0 }}\n              initialTopMostItemIndex={calculateInitialTopMostItemIndex(\n                processedMessages,\n                highlightedMessageId,\n              )}\n              itemContent={messageRenderer}\n              itemSize={fractionalItemSize}\n              itemsRendered={handleItemsRendered}\n              key={messageSetKey}\n              overscan={overscan}\n              ref={virtuoso}\n              style={{ overflowX: 'hidden' }}\n              totalCount={processedMessages.length}\n              {...overridingVirtuosoProps}\n              {...(scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {})}\n              {...(defaultItemHeight ? { defaultItemHeight } : {})}\n            />\n          </div>\n        </DialogManagerProvider>\n        {TypingIndicator && <TypingIndicator />}\n      </MessageListMainPanel>\n      <MessageListNotifications\n        hasNewMessages={newMessagesNotification}\n        isMessageListScrolledToBottom={isMessageListScrolledToBottom}\n        isNotAtLatestMessageSet={hasMoreNewer}\n        MessageNotification={MessageNotification}\n        notifications={notifications}\n        scrollToBottom={scrollToBottom}\n        threadList={threadList}\n        unreadCount={threadList ? undefined : channelUnreadUiState?.unread_messages}\n      />\n      {giphyPreviewMessage && <GiphyPreviewMessage message={giphyPreviewMessage} />}\n    </VirtualizedMessageListContextProvider>\n  );\n};\n\nexport type VirtualizedMessageListProps = Partial<\n  Pick<MessageProps, PropsDrilledToMessage>\n> & {\n  /** Additional props to be passed the underlying [`react-virtuoso` virtualized list dependency](https://virtuoso.dev/virtuoso-api-reference/) */\n  additionalVirtuosoProps?: VirtuosoProps<UnknownType, VirtuosoContext>;\n  channelUnreadUiState?: ChannelStateContextValue['channelUnreadUiState'];\n  /** If true, picking a reaction from the `ReactionSelector` component will close the selector */\n  closeReactionSelectorOnClick?: boolean;\n  /** Custom render function, if passed, certain UI props are ignored */\n  customMessageRenderer?: (\n    messageList: RenderedMessage[],\n    index: number,\n  ) => React.ReactElement;\n  /** @deprecated Use additionalVirtuosoProps.defaultItemHeight instead. Will be removed with next major release - `v11.0.0`.\n   * If set, the default item height is used for the calculation of the total list height. Use if you expect messages with a lot of height variance\n   * */\n  defaultItemHeight?: number;\n  /** Disables the injection of date separator components in MessageList, defaults to `true` */\n  disableDateSeparator?: boolean;\n  /** Callback function to set group styles for each message */\n  groupStyles?: (\n    message: RenderedMessage,\n    previousMessage: RenderedMessage,\n    nextMessage: RenderedMessage,\n    noGroupByUser: boolean,\n    maxTimeBetweenGroupedMessages?: number,\n  ) => GroupStyle;\n  /** Whether or not the list has more items to load */\n  hasMore?: boolean;\n  /** Whether or not the list has newer items to load */\n  hasMoreNewer?: boolean;\n  /**\n   * @deprecated Use additionalVirtuosoProps.components.Header to override default component rendered above the list ove messages.\n   * Element to be rendered at the top of the thread message list. By default, these are the Message and ThreadStart components\n   */\n  head?: React.ReactElement;\n  /** Hides the `MessageDeleted` components from the list, defaults to `false` */\n  hideDeletedMessages?: boolean;\n  /** Hides the `DateSeparator` component when new messages are received in a channel that's watched but not active, defaults to false */\n  hideNewMessageSeparator?: boolean;\n  /** The id of the message to highlight and center */\n  highlightedMessageId?: string;\n  /** Whether or not the list is currently loading more items */\n  loadingMore?: boolean;\n  /** Whether or not the list is currently loading newer items */\n  loadingMoreNewer?: boolean;\n  /** Function called when more messages are to be loaded, defaults to function stored in [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/) */\n  loadMore?: ChannelActionContextValue['loadMore'] | (() => Promise<void>);\n  /** Function called when new messages are to be loaded, defaults to function stored in [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/) */\n  loadMoreNewer?: ChannelActionContextValue['loadMore'] | (() => Promise<void>);\n  /** Maximum time in milliseconds that should occur between messages to still consider them grouped together */\n  maxTimeBetweenGroupedMessages?: number;\n  /** Custom UI component to display a message, defaults to and accepts same props as [MessageSimple](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageSimple.tsx) */\n  Message?: React.ComponentType<MessageUIComponentProps>;\n  /** The limit to use when paginating messages */\n  messageLimit?: number;\n  /** Optional prop to override the messages available from [ChannelStateContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_state_context/) */\n  messages?: LocalMessage[];\n  /**\n   * @deprecated Use additionalVirtuosoProps.overscan instead. Will be removed with next major release - `v11.0.0`.\n   * The amount of extra content the list should render in addition to what's necessary to fill in the viewport\n   */\n  overscan?: number;\n  /** Keep track of read receipts for each message sent by the user. When disabled, only the last own message delivery / read status is rendered. */\n  returnAllReadData?: boolean;\n  /**\n   * Allows to review changes introduced to messages array on per message basis (e.g. date separator injected before a message).\n   * The array returned from the function is appended to the array of messages that are later rendered into React elements in the `VirtualizedMessageList`.\n   */\n  reviewProcessedMessage?: ProcessMessagesParams['reviewProcessedMessage'];\n  /**\n   * @deprecated Pass additionalVirtuosoProps.scrollSeekConfiguration and specify the placeholder in additionalVirtuosoProps.components.ScrollSeekPlaceholder instead.  Will be removed with next major release - `v11.0.0`.\n   * Performance improvement by showing placeholders if user scrolls fast through list.\n   * it can be used like this:\n   * ```\n   *  {\n   *    enter: (velocity) => Math.abs(velocity) > 120,\n   *    exit: (velocity) => Math.abs(velocity) < 40,\n   *    change: () => null,\n   *    placeholder: ({index, height})=> <div style={{height: height + \"px\"}}>{index}</div>,\n   *  }\n   *  ```\n   */\n  scrollSeekPlaceHolder?: ScrollSeekConfiguration & {\n    placeholder: React.ComponentType<ScrollSeekPlaceholderProps>;\n  };\n  /** When `true`, the list will scroll to the latest message when the window regains focus */\n  scrollToLatestMessageOnFocus?: boolean;\n  /** If true, the Giphy preview will render as a separate component above the `MessageInput`, rather than inline with the other messages in the list */\n  separateGiphyPreview?: boolean;\n  /** If true, group messages belonging to the same user, otherwise show each message individually */\n  shouldGroupByUser?: boolean;\n  /**\n   * The floating notification informing about unread messages will be shown when the\n   * UnreadMessagesSeparator is not visible. The default is false, that means the notification\n   * is shown only when viewing unread messages.\n   */\n  showUnreadNotificationAlways?: boolean;\n  /** The scrollTo behavior when new messages appear. Use `\"smooth\"` for regular chat channels, and `\"auto\"` (which results in instant scroll to bottom) if you expect high throughput. */\n  stickToBottomScrollBehavior?: 'smooth' | 'auto';\n  /** stops the list from autoscrolling when new messages are loaded */\n  suppressAutoscroll?: boolean;\n  /** If true, indicates the message list is a thread  */\n  threadList?: boolean;\n};\n\n/**\n * The VirtualizedMessageList component renders a list of messages in a virtualized list.\n * It is a consumer of the React contexts set in [Channel](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Channel/Channel.tsx).\n */\nexport function VirtualizedMessageList(props: VirtualizedMessageListProps) {\n  const { jumpToLatestMessage, loadMore, loadMoreNewer } = useChannelActionContext(\n    'VirtualizedMessageList',\n  );\n  const {\n    channel,\n    channelUnreadUiState,\n    hasMore,\n    hasMoreNewer,\n    highlightedMessageId,\n    loadingMore,\n    loadingMoreNewer,\n    messages: contextMessages,\n    notifications,\n    read,\n    suppressAutoscroll,\n  } = useChannelStateContext('VirtualizedMessageList');\n\n  const messages = props.messages || contextMessages;\n\n  return (\n    <VirtualizedMessageListWithContext\n      channel={channel}\n      channelUnreadUiState={props.channelUnreadUiState ?? channelUnreadUiState}\n      hasMore={!!hasMore}\n      hasMoreNewer={!!hasMoreNewer}\n      highlightedMessageId={highlightedMessageId}\n      jumpToLatestMessage={jumpToLatestMessage}\n      loadingMore={!!loadingMore}\n      loadingMoreNewer={!!loadingMoreNewer}\n      loadMore={loadMore}\n      loadMoreNewer={loadMoreNewer}\n      messages={messages}\n      notifications={notifications}\n      read={read}\n      suppressAutoscroll={suppressAutoscroll}\n      {...props}\n    />\n  );\n}\n", "import { useEffect, useRef, useState } from 'react';\nimport type { LocalMessage } from 'stream-chat';\nimport type { RenderedMessage } from '../../utils';\n\nexport function useNewMessageNotification(\n  messages: RenderedMessage[],\n  currentUserId: string | undefined,\n  hasMoreNewer?: boolean,\n) {\n  const [newMessagesNotification, setNewMessagesNotification] = useState(false);\n  const [isMessageListScrolledToBottom, setIsMessageListScrolledToBottom] =\n    useState(true);\n  /**\n   * use the flag to avoid the initial \"new messages\" quick blink\n   */\n  const didMount = useRef(false);\n\n  const lastMessageId = useRef('');\n  const atBottom = useRef(false);\n\n  useEffect(() => {\n    if (hasMoreNewer) {\n      setNewMessagesNotification(true);\n      return;\n    }\n    /* handle scrolling behavior for new messages */\n    if (!messages?.length) return;\n\n    const lastMessage = messages[messages.length - 1];\n    const prevMessageId = lastMessageId.current;\n    lastMessageId.current = lastMessage.id || ''; // update last message id\n\n    /* do nothing if new messages are loaded from top(loadMore)  */\n    if (lastMessage.id === prevMessageId) return;\n\n    /* if list is already at the bottom return, followOutput will do the job */\n    if (atBottom.current) return;\n\n    /* if the new message belongs to current user scroll to bottom */\n    if ((lastMessage as LocalMessage).user?.id !== currentUserId && didMount.current) {\n      /* otherwise just show newMessage notification  */\n      setNewMessagesNotification(true);\n    }\n    didMount.current = true;\n  }, [currentUserId, messages, hasMoreNewer]);\n\n  return {\n    atBottom,\n    isMessageListScrolledToBottom,\n    newMessagesNotification,\n    setIsMessageListScrolledToBottom,\n    setNewMessagesNotification,\n  };\n}\n", "import { useMemo, useRef } from 'react';\nimport type { RenderedMessage } from '../../utils';\nimport { isLocalMessage } from '../../utils';\n\nconst STATUSES_EXCLUDED_FROM_PREPEND = {\n  failed: true,\n  sending: true,\n} as const as Record<string, boolean>;\n\nexport function usePrependedMessagesCount(\n  messages: RenderedMessage[],\n  hasDateSeparator: boolean,\n) {\n  const firstRealMessageIndex = hasDateSeparator ? 1 : 0;\n  const firstMessageOnFirstLoadedPage = useRef<RenderedMessage>(undefined);\n  const previousFirstMessageOnFirstLoadedPage = useRef<RenderedMessage>(undefined);\n  const previousNumItemsPrepended = useRef(0);\n\n  const numItemsPrepended = useMemo(() => {\n    if (!messages || !messages.length) {\n      previousNumItemsPrepended.current = 0;\n      return 0;\n    }\n\n    const currentFirstMessage = messages?.[firstRealMessageIndex];\n\n    const noNewMessages =\n      currentFirstMessage?.id === previousFirstMessageOnFirstLoadedPage.current?.id;\n\n    // This is possible only, when sending messages very quickly (basically single char messages submitted like a crazy) in empty channel (first page)\n    // Optimistic UI update, when sending messages, can lead to a situation, when\n    // the order of the messages changes for a moment. This can happen, when a user\n    // sends multiple messages withing few milliseconds. E.g. we send a message A\n    // then message B. At first we have message array with both messages of status \"sending\"\n    // then response for message A is received with a new - later - created_at timestamp\n    // this leads to rearrangement of 1.B (\"sending\"), 2.A (\"received\"). Still firstMessageOnFirstLoadedPage.current\n    // points to message A, but now this message has index 1 => previousNumItemsPrepended.current === 1\n    // That in turn leads to incorrect index calculation in VirtualizedMessageList trying to access a message\n    // at non-existent index. Therefore, we ignore messages of status \"sending\" / \"failed\" in order they are\n    // not considered as prepended messages.\n    const currentFirstMessageStatus = isLocalMessage(currentFirstMessage)\n      ? currentFirstMessage.status\n      : undefined;\n    const firstMsgMovedAfterMessagesInExcludedStatus = !!(\n      currentFirstMessageStatus &&\n      STATUSES_EXCLUDED_FROM_PREPEND[currentFirstMessageStatus]\n    );\n\n    if (noNewMessages || firstMsgMovedAfterMessagesInExcludedStatus) {\n      return previousNumItemsPrepended.current;\n    }\n\n    if (!firstMessageOnFirstLoadedPage.current) {\n      firstMessageOnFirstLoadedPage.current = currentFirstMessage;\n    }\n    previousFirstMessageOnFirstLoadedPage.current = currentFirstMessage;\n    // if new messages were prepended, find out how many\n    // start with this number because there cannot be fewer prepended items than before\n    for (\n      let prependedMessageCount = previousNumItemsPrepended.current;\n      prependedMessageCount < messages.length;\n      prependedMessageCount += 1\n    ) {\n      const messageIsFirstOnFirstLoadedPage =\n        messages[prependedMessageCount].id === firstMessageOnFirstLoadedPage.current?.id;\n\n      if (messageIsFirstOnFirstLoadedPage) {\n        previousNumItemsPrepended.current = prependedMessageCount - firstRealMessageIndex;\n        return previousNumItemsPrepended.current;\n      }\n    }\n\n    // if no match has found, we have jumped - reset the prepended item count.\n    firstMessageOnFirstLoadedPage.current = currentFirstMessage;\n    previousNumItemsPrepended.current = 0;\n    return 0;\n    // TODO: there's a bug here, the messages prop is the same array instance (something mutates it)\n    // that's why the second dependency is necessary\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [firstRealMessageIndex, messages, messages?.length]);\n\n  return numItemsPrepended;\n}\n", "import { useEffect, useRef } from 'react';\nimport type { RenderedMessage } from '../../utils';\nimport type { LocalMessage } from 'stream-chat';\n\nexport function useShouldForceScrollToBottom(\n  messages: RenderedMessage[],\n  currentUserId?: string,\n) {\n  const lastFocusedOwnMessage = useRef('');\n  const initialFocusRegistered = useRef(false);\n\n  function recheckForNewOwnMessage() {\n    if (messages && messages.length > 0) {\n      const lastMessage = messages[messages.length - 1];\n\n      if (\n        (lastMessage as LocalMessage).user?.id === currentUserId &&\n        lastFocusedOwnMessage.current !== lastMessage.id\n      ) {\n        lastFocusedOwnMessage.current = lastMessage.id;\n        return true;\n      }\n    }\n    return false;\n  }\n\n  useEffect(() => {\n    if (messages && messages.length && !initialFocusRegistered.current) {\n      initialFocusRegistered.current = true;\n      recheckForNewOwnMessage();\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [messages, messages?.length]);\n\n  return recheckForNewOwnMessage;\n}\n", "import { useEffect, useState } from 'react';\n\nimport { useChatContext } from '../../../../context/ChatContext';\n\nimport type { EventHandler, LocalMessage } from 'stream-chat';\n\nexport const useGiphyPreview = (separateGiphyPreview: boolean) => {\n  const [giphyPreviewMessage, setGiphyPreviewMessage] = useState<LocalMessage>();\n\n  const { client } = useChatContext('useGiphyPreview');\n\n  useEffect(() => {\n    if (!separateGiphyPreview) return;\n    const handleEvent: EventHandler = (event) => {\n      const { message, user } = event;\n\n      if (message?.command === 'giphy' && user?.id === client.userID) {\n        setGiphyPreviewMessage(undefined);\n      }\n    };\n\n    client.on('message.new', handleEvent);\n    return () => client.off('message.new', handleEvent);\n  }, [client, separateGiphyPreview]);\n\n  return {\n    giphyPreviewMessage,\n    setGiphyPreviewMessage: separateGiphyPreview ? setGiphyPreviewMessage : undefined,\n  };\n};\n", "import { useEffect, useRef, useState } from 'react';\nimport type { LocalMessage } from 'stream-chat';\n\ntype UseMessageSetKeyParams = {\n  messages?: LocalMessage[];\n};\n\nexport const useMessageSetKey = ({ messages }: UseMessageSetKeyParams) => {\n  /**\n   * Logic to update the key of the virtuoso component when the list jumps to a new location.\n   */\n  const [messageSetKey, setMessageSetKey] = useState(+new Date());\n  const firstMessageId = useRef<string | undefined>(undefined);\n\n  useEffect(() => {\n    const continuousSet = messages?.find(\n      (message) => message.id === firstMessageId.current,\n    );\n    if (!continuousSet) {\n      setMessageSetKey(+new Date());\n    }\n    firstMessageId.current = messages?.[0]?.id;\n  }, [messages]);\n\n  return {\n    messageSetKey,\n  };\n};\n", "import { useEffect, useRef, useState } from 'react';\nimport type { RenderedMessage } from '../../utils';\n\ntype UseScrollToBottomOnNewMessageParams = {\n  scrollToBottom: () => void;\n  messages?: RenderedMessage[];\n  /** When `true`, the list will scroll to the latest message when the window regains focus */\n  scrollToLatestMessageOnFocus?: boolean;\n};\n\nexport const useScrollToBottomOnNewMessage = ({\n  messages,\n  scrollToBottom,\n  scrollToLatestMessageOnFocus,\n}: UseScrollToBottomOnNewMessageParams) => {\n  const [newMessagesReceivedInBackground, setNewMessagesReceivedInBackground] =\n    useState(false);\n\n  const scrollToBottomIfConfigured = useRef<(e: Event) => void>(undefined);\n\n  scrollToBottomIfConfigured.current = (event: Event) => {\n    if (\n      !scrollToLatestMessageOnFocus ||\n      !newMessagesReceivedInBackground ||\n      event.target !== window\n    ) {\n      return;\n    }\n\n    setTimeout(scrollToBottom, 100);\n  };\n\n  useEffect(() => {\n    setNewMessagesReceivedInBackground(true);\n  }, [messages]);\n\n  useEffect(() => {\n    const handleFocus = (event: Event) => {\n      scrollToBottomIfConfigured.current?.(event);\n    };\n\n    const handleBlur = () => {\n      setNewMessagesReceivedInBackground(false);\n    };\n\n    if (typeof window !== 'undefined') {\n      window.addEventListener('focus', handleFocus);\n      window.addEventListener('blur', handleBlur);\n    }\n\n    return () => {\n      window.removeEventListener('focus', handleFocus);\n      window.removeEventListener('blur', handleBlur);\n    };\n  }, []);\n};\n", "import { useCallback, useEffect, useState } from 'react';\nimport type { RenderedMessage } from '../../utils';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type UseUnreadMessagesNotificationParams = {\n  showAlways: boolean;\n  unreadCount: number;\n  lastRead?: Date | null;\n};\n\n/**\n * Controls the logic when an `UnreadMessagesNotification` component should be shown.\n * In virtualized message list there is no notion of being scrolled below or above `UnreadMessagesSeparator`.\n * Therefore, the `UnreadMessagesNotification` component is rendered based on timestamps.\n * If the there are unread messages in the channel and the `VirtualizedMessageList` renders\n * messages created later than the last read message in the channel, then the\n * `UnreadMessagesNotification` component is rendered. This is an approximate equivalent to being\n * scrolled below the `UnreadMessagesNotification` component.\n * @param lastRead\n * @param showAlways\n * @param unreadCount\n */\nexport const useUnreadMessagesNotificationVirtualized = ({\n  lastRead,\n  showAlways,\n  unreadCount,\n}: UseUnreadMessagesNotificationParams) => {\n  const [show, setShow] = useState(false);\n\n  const toggleShowUnreadMessagesNotification = useCallback(\n    (renderedMessages: RenderedMessage[]) => {\n      if (!unreadCount) return;\n      const firstRenderedMessage = renderedMessages[0];\n      const lastRenderedMessage = renderedMessages.slice(-1)[0];\n      if (!(firstRenderedMessage && lastRenderedMessage)) return;\n\n      const firstRenderedMessageTime = new Date(\n        (firstRenderedMessage as LocalMessage).created_at ?? 0,\n      ).getTime();\n      const lastRenderedMessageTime = new Date(\n        (lastRenderedMessage as LocalMessage).created_at ?? 0,\n      ).getTime();\n      const lastReadTime = new Date(lastRead ?? 0).getTime();\n\n      const scrolledBelowSeparator =\n        !!lastReadTime && firstRenderedMessageTime > lastReadTime;\n      const scrolledAboveSeparator =\n        !!lastReadTime && lastRenderedMessageTime < lastReadTime;\n\n      setShow(\n        showAlways\n          ? scrolledBelowSeparator || scrolledAboveSeparator\n          : scrolledBelowSeparator,\n      );\n    },\n    [lastRead, showAlways, unreadCount],\n  );\n\n  useEffect(() => {\n    if (!unreadCount) setShow(false);\n  }, [unreadCount]);\n\n  return { show, toggleShowUnreadMessagesNotification };\n};\n", "import clsx from 'clsx';\nimport throttle from 'lodash.throttle';\nimport React from 'react';\nimport type { ItemProps, ListItem } from 'react-virtuoso';\n\nimport { EmptyStateIndicator as DefaultEmptyStateIndicator } from '../EmptyStateIndicator';\nimport { LoadingIndicator as DefaultLoadingIndicator } from '../Loading';\nimport { isMessageEdited, Message } from '../Message';\n\nimport { useComponentContext } from '../../context';\nimport { getIsFirstUnreadMessage, isDateSeparatorMessage, isIntroMessage } from './utils';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { GroupStyle, RenderedMessage } from './utils';\nimport type { VirtuosoContext } from './VirtualizedMessageList';\nimport type { UnknownType } from '../../types/types';\n\nconst PREPEND_OFFSET = 10 ** 7;\n\nexport function calculateItemIndex(virtuosoIndex: number, numItemsPrepended: number) {\n  return virtuosoIndex + numItemsPrepended - PREPEND_OFFSET;\n}\n\nexport function calculateFirstItemIndex(numItemsPrepended: number) {\n  return PREPEND_OFFSET - numItemsPrepended;\n}\n\nexport const makeItemsRenderedHandler = (\n  renderedItemsActions: Array<(msg: RenderedMessage[]) => void>,\n  processedMessages: RenderedMessage[],\n) =>\n  throttle((items: ListItem<UnknownType>[]) => {\n    const renderedMessages = items\n      .map((item) => {\n        if (!item.originalIndex) return undefined;\n        return processedMessages[calculateItemIndex(item.originalIndex, PREPEND_OFFSET)];\n      })\n      .filter((msg) => !!msg);\n    renderedItemsActions.forEach((action) =>\n      action(renderedMessages as RenderedMessage[]),\n    );\n  }, 200);\n\ntype CommonVirtuosoComponentProps = {\n  context?: VirtuosoContext;\n};\n// using 'display: inline-block'\n// traps CSS margins of the item elements, preventing incorrect item measurements\nexport const Item = ({ context, ...props }: ItemProps & CommonVirtuosoComponentProps) => {\n  if (!context) return <></>;\n\n  const message =\n    context.processedMessages[\n      calculateItemIndex(props['data-item-index'], context.numItemsPrepended)\n    ];\n  const groupStyles: GroupStyle = context.messageGroupStyles[message.id];\n\n  return (\n    <div\n      {...props}\n      className={\n        context?.customClasses?.virtualMessage ||\n        clsx('str-chat__virtual-list-message-wrapper str-chat__li', {\n          [`str-chat__li--${groupStyles}`]: groupStyles,\n        })\n      }\n    />\n  );\n};\nexport const Header = ({ context }: CommonVirtuosoComponentProps) => {\n  const { LoadingIndicator = DefaultLoadingIndicator } = useComponentContext(\n    'VirtualizedMessageListHeader',\n  );\n\n  return (\n    <>\n      {context?.head}\n      {context?.loadingMore && LoadingIndicator && (\n        <div className='str-chat__virtual-list__loading'>\n          <LoadingIndicator size={20} />\n        </div>\n      )}\n    </>\n  );\n};\nexport const EmptyPlaceholder = ({ context }: CommonVirtuosoComponentProps) => {\n  const { EmptyStateIndicator = DefaultEmptyStateIndicator } = useComponentContext(\n    'VirtualizedMessageList',\n  );\n  // prevent showing that there are no messages if there actually are messages (for some reason virtuoso decides to render empty placeholder first, even though it has the totalCount prop > 0)\n  if (\n    typeof context?.processedMessages !== 'undefined' &&\n    context.processedMessages.length > 0\n  )\n    return null;\n\n  return (\n    <>\n      {EmptyStateIndicator && (\n        <EmptyStateIndicator listType={context?.threadList ? 'thread' : 'message'} />\n      )}\n    </>\n  );\n};\n\nexport const messageRenderer = (\n  virtuosoIndex: number,\n  _data: UnknownType,\n  virtuosoContext: VirtuosoContext,\n) => {\n  const {\n    additionalMessageInputProps,\n    closeReactionSelectorOnClick,\n    customMessageActions,\n    customMessageRenderer,\n    DateSeparator,\n    firstUnreadMessageId,\n    formatDate,\n    lastOwnMessage,\n    lastReadDate,\n    lastReadMessageId,\n    lastReceivedMessageId,\n    Message: MessageUIComponent,\n    messageActions,\n    messageGroupStyles,\n    MessageSystem,\n    numItemsPrepended,\n    openThread,\n    ownMessagesDeliveredToOthers,\n    ownMessagesReadByOthers,\n    processedMessages: messageList,\n    reactionDetailsSort,\n    renderText,\n    returnAllReadData,\n    shouldGroupByUser,\n    sortReactionDetails,\n    sortReactions,\n    threadList,\n    unreadMessageCount = 0,\n    UnreadMessagesSeparator,\n    virtuosoRef,\n  } = virtuosoContext;\n\n  const streamMessageIndex = calculateItemIndex(virtuosoIndex, numItemsPrepended);\n\n  if (customMessageRenderer) {\n    return customMessageRenderer(messageList, streamMessageIndex);\n  }\n\n  const message = messageList[streamMessageIndex];\n\n  if (!message || isIntroMessage(message)) return <div style={{ height: '1px' }}></div>; // returning null or zero height breaks the virtuoso\n\n  if (isDateSeparatorMessage(message)) {\n    return DateSeparator ? (\n      <DateSeparator date={message.date} unread={message.unread} />\n    ) : null;\n  }\n\n  if (message.type === 'system') {\n    return MessageSystem ? <MessageSystem message={message} /> : null;\n  }\n\n  const maybePrevMessage = messageList[streamMessageIndex - 1] as\n    | LocalMessage\n    | undefined;\n  const maybeNextMessage = messageList[streamMessageIndex + 1] as\n    | LocalMessage\n    | undefined;\n  const groupedByUser =\n    shouldGroupByUser &&\n    streamMessageIndex > 0 &&\n    message.user?.id === maybePrevMessage?.user?.id;\n\n  // FIXME: firstOfGroup & endOfGroup should be derived from groupStyles which apply a more complex logic\n  const firstOfGroup =\n    shouldGroupByUser &&\n    (message.user?.id !== maybePrevMessage?.user?.id ||\n      (maybePrevMessage && isMessageEdited(maybePrevMessage)));\n\n  const endOfGroup =\n    shouldGroupByUser &&\n    (message.user?.id !== maybeNextMessage?.user?.id || isMessageEdited(message));\n\n  const isFirstUnreadMessage = getIsFirstUnreadMessage({\n    firstUnreadMessageId,\n    isFirstMessage: streamMessageIndex === 0,\n    lastReadDate,\n    lastReadMessageId,\n    message,\n    previousMessage: streamMessageIndex ? messageList[streamMessageIndex - 1] : undefined,\n    unreadMessageCount,\n  });\n\n  return (\n    <>\n      {isFirstUnreadMessage && (\n        <div className='str-chat__unread-messages-separator-wrapper'>\n          <UnreadMessagesSeparator unreadCount={unreadMessageCount} />\n        </div>\n      )}\n      <Message\n        additionalMessageInputProps={additionalMessageInputProps}\n        autoscrollToBottom={virtuosoRef.current?.autoscrollToBottom}\n        closeReactionSelectorOnClick={closeReactionSelectorOnClick}\n        customMessageActions={customMessageActions}\n        deliveredTo={ownMessagesDeliveredToOthers[message.id] || []}\n        endOfGroup={endOfGroup}\n        firstOfGroup={firstOfGroup}\n        formatDate={formatDate}\n        groupedByUser={groupedByUser}\n        groupStyles={[messageGroupStyles[message.id] ?? '']}\n        lastOwnMessage={lastOwnMessage}\n        lastReceivedId={lastReceivedMessageId}\n        message={message}\n        Message={MessageUIComponent}\n        messageActions={messageActions}\n        openThread={openThread}\n        reactionDetailsSort={reactionDetailsSort}\n        readBy={ownMessagesReadByOthers[message.id] || []}\n        renderText={renderText}\n        returnAllReadData={returnAllReadData}\n        sortReactionDetails={sortReactionDetails}\n        sortReactions={sortReactions}\n        threadList={threadList}\n      />\n    </>\n  );\n};\n", "import React, { createContext, useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\n\nexport type VirtualizedMessageListContextValue = {\n  /** Function that scrolls the list to the bottom. */\n  scrollToBottom: () => void;\n};\n\nexport const VirtualizedMessageListContext = createContext<\n  VirtualizedMessageListContextValue | undefined\n>(undefined);\n\n/**\n * Context provider for components rendered within the `VirtualizedMessageList`\n */\nexport const VirtualizedMessageListContextProvider = ({\n  children,\n  value,\n}: PropsWithChildren<{\n  value: VirtualizedMessageListContextValue;\n}>) => (\n  <VirtualizedMessageListContext.Provider\n    value={value as VirtualizedMessageListContextValue}\n  >\n    {children}\n  </VirtualizedMessageListContext.Provider>\n);\n\nexport const useVirtualizedMessageListContext = () =>\n  useContext(VirtualizedMessageListContext) as VirtualizedMessageListContextValue;\n", "import React, { useEffect, useRef } from 'react';\nimport type { LocalMessage } from 'stream-chat';\nimport { formatMessage } from 'stream-chat';\nimport {\n  useChannelActionContext,\n  useChannelStateContext,\n  useChatContext,\n  useMessageContext,\n  useTranslationContext,\n} from '../../context';\n\nexport const MessageIsThreadReplyInChannelButtonIndicator = () => {\n  const { client } = useChatContext();\n  const { t } = useTranslationContext();\n  const { channel } = useChannelStateContext();\n  const { openThread } = useChannelActionContext();\n  const { message } = useMessageContext();\n  const parentMessageRef = useRef<LocalMessage | null | undefined>(undefined);\n\n  const querySearchParent = () =>\n    channel\n      .getClient()\n      .search({ cid: channel.cid }, { id: message.parent_id })\n      .then(({ results }) => {\n        if (!results.length) {\n          throw new Error('Thread has not been found');\n        }\n        parentMessageRef.current = formatMessage(results[0].message);\n      })\n      .catch((error: Error) => {\n        client.notifications.addError({\n          message: t('Thread has not been found'),\n          options: {\n            originalError: error,\n            type: 'api:message:search:not-found',\n          },\n          origin: {\n            context: { threadReply: message },\n            emitter: 'MessageIsThreadReplyInChannelButtonIndicator',\n          },\n        });\n      });\n\n  useEffect(() => {\n    if (\n      parentMessageRef.current ||\n      parentMessageRef.current === null ||\n      !message.parent_id\n    )\n      return;\n    const localMessage = channel.state.findMessage(message.parent_id);\n    if (localMessage) {\n      parentMessageRef.current = localMessage;\n      return;\n    }\n  }, [channel, message]);\n\n  if (!message.parent_id) return null;\n\n  return (\n    <div className='str-chat__message-is-thread-reply-button-wrapper'>\n      <button\n        className='str-chat__message-is-thread-reply-button'\n        data-testid='message-is-thread-reply-button'\n        onClick={async () => {\n          if (!parentMessageRef.current) {\n            // search query is performed here in order to prevent multiple search queries in useEffect\n            // due to the message list 3x remounting its items\n            await querySearchParent();\n            if (parentMessageRef.current) {\n              openThread(parentMessageRef.current);\n            } else {\n              // prevent further search queries if the message is not found in the DB\n              parentMessageRef.current = null;\n            }\n            return;\n          }\n          openThread(parentMessageRef.current);\n        }}\n        type='button'\n      >\n        {t('Thread reply')}\n      </button>\n    </div>\n  );\n};\n", "import React from 'react';\nimport { useTranslationContext } from '../../context';\nimport { useStateStore } from '../../store';\nimport type { Reminder, ReminderState } from 'stream-chat';\n\nexport type ReminderNotificationProps = {\n  reminder?: Reminder;\n};\n\nconst reminderStateSelector = (state: ReminderState) => ({\n  timeLeftMs: state.timeLeftMs,\n});\n\nexport const ReminderNotification = ({ reminder }: ReminderNotificationProps) => {\n  const { t } = useTranslationContext();\n  const { timeLeftMs } = useStateStore(reminder?.state, reminderStateSelector) ?? {};\n\n  const stopRefreshBoundaryMs = reminder?.timer.stopRefreshBoundaryMs;\n  const stopRefreshTimeStamp =\n    reminder?.remindAt && stopRefreshBoundaryMs\n      ? reminder?.remindAt.getTime() + stopRefreshBoundaryMs\n      : undefined;\n\n  const isBehindRefreshBoundary =\n    !!stopRefreshTimeStamp && new Date().getTime() > stopRefreshTimeStamp;\n\n  return (\n    <p className='str-chat__message-reminder'>\n      <span>{t('Saved for later')}</span>\n      {reminder?.remindAt && timeLeftMs !== null && (\n        <>\n          <span> | </span>\n          <span>\n            {isBehindRefreshBoundary\n              ? t('Due since {{ dueSince }}', {\n                  dueSince: t('timestamp/ReminderNotification', {\n                    timestamp: reminder.remindAt,\n                  }),\n                })\n              : t('Due {{ timeLeft }}', {\n                  timeLeft: t('duration/Message reminder', {\n                    milliseconds: timeLeftMs,\n                  }),\n                })}\n          </span>\n        </>\n      )}\n    </p>\n  );\n};\n", "import React, { useState } from 'react';\nimport clsx from 'clsx';\n\nimport type { ReactionsListModalProps } from './ReactionsListModal';\nimport { ReactionsListModal as DefaultReactionsListModal } from './ReactionsListModal';\nimport { useProcessReactions } from './hooks/useProcessReactions';\nimport type { MessageContextValue } from '../../context';\nimport { useComponentContext, useTranslationContext } from '../../context';\n\nimport { MAX_MESSAGE_REACTIONS_TO_FETCH } from '../Message/hooks';\n\nimport type { ReactionGroupResponse, ReactionResponse } from 'stream-chat';\nimport type { ReactionOptions } from './reactionOptions';\nimport type {\n  ReactionDetailsComparator,\n  ReactionsComparator,\n  ReactionType,\n} from './types';\n\nexport type ReactionsListProps = Partial<\n  Pick<MessageContextValue, 'handleFetchReactions' | 'reactionDetailsSort'>\n> & {\n  /** An array of the own reaction objects to distinguish own reactions visually */\n  own_reactions?: ReactionResponse[];\n  /**\n   * An object that keeps track of the count of each type of reaction on a message\n   * @deprecated This override value is no longer taken into account. Use `reaction_groups` to override reaction counts instead.\n   * */\n  reaction_counts?: Record<string, number>;\n  /** An object containing summary for each reaction type on a message */\n  reaction_groups?: Record<string, ReactionGroupResponse>;\n  /**\n   * @deprecated\n   * A list of the currently supported reactions on a message\n   * */\n  reactionOptions?: ReactionOptions;\n  /** An array of the reaction objects to display in the list */\n  reactions?: ReactionResponse[];\n  /** Display the reactions in the list in reverse order, defaults to false */\n  reverse?: boolean;\n  /** Comparator function to sort the list of reacted users\n   * @deprecated use `reactionDetailsSort` instead\n   */\n  sortReactionDetails?: ReactionDetailsComparator;\n  /** Comparator function to sort reactions, defaults to chronological order */\n  sortReactions?: ReactionsComparator;\n};\n\nconst UnMemoizedReactionsList = (props: ReactionsListProps) => {\n  const {\n    handleFetchReactions,\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    reactionDetailsSort,\n    reverse = false,\n    sortReactionDetails,\n    ...rest\n  } = props;\n  const { existingReactions, hasReactions, totalReactionCount } =\n    useProcessReactions(rest);\n  const [selectedReactionType, setSelectedReactionType] = useState<ReactionType | null>(\n    null,\n  );\n  const { t } = useTranslationContext('ReactionsList');\n  const { ReactionsListModal = DefaultReactionsListModal } = useComponentContext();\n\n  const handleReactionButtonClick = (reactionType: string) => {\n    if (totalReactionCount > MAX_MESSAGE_REACTIONS_TO_FETCH) {\n      return;\n    }\n\n    setSelectedReactionType(reactionType as ReactionType);\n  };\n\n  if (!hasReactions) return null;\n\n  return (\n    <>\n      <div\n        aria-label={t('aria/Reaction list')}\n        className={clsx('str-chat__reaction-list str-chat__message-reactions-container', {\n          // we are stuck with both classes as both are used in CSS\n          'str-chat__reaction-list--reverse': reverse,\n        })}\n        data-testid='reaction-list'\n        role='figure'\n      >\n        <ul className='str-chat__message-reactions'>\n          {existingReactions.map(\n            ({ EmojiComponent, isOwnReaction, reactionCount, reactionType }) =>\n              EmojiComponent && (\n                <li\n                  className={clsx('str-chat__message-reaction', {\n                    'str-chat__message-reaction-own': isOwnReaction,\n                  })}\n                  key={reactionType}\n                >\n                  <button\n                    aria-label={`Reactions: ${reactionType}`}\n                    data-testid={`reactions-list-button-${reactionType}`}\n                    onClick={() => handleReactionButtonClick(reactionType)}\n                    type='button'\n                  >\n                    <span className='str-chat__message-reaction-emoji'>\n                      <EmojiComponent />\n                    </span>\n                    &nbsp;\n                    <span\n                      className='str-chat__message-reaction-count'\n                      data-testclass='reaction-list-reaction-count'\n                    >\n                      {reactionCount}\n                    </span>\n                  </button>\n                </li>\n              ),\n          )}\n          <li>\n            <span className='str-chat__reaction-list--counter'>{totalReactionCount}</span>\n          </li>\n        </ul>\n      </div>\n      {selectedReactionType !== null && (\n        <ReactionsListModal\n          handleFetchReactions={handleFetchReactions}\n          onClose={() => setSelectedReactionType(null)}\n          onSelectedReactionTypeChange={\n            setSelectedReactionType as ReactionsListModalProps['onSelectedReactionTypeChange']\n          }\n          open={selectedReactionType !== null}\n          reactions={existingReactions}\n          selectedReactionType={selectedReactionType}\n          sortReactionDetails={sortReactionDetails}\n        />\n      )}\n    </>\n  );\n};\n\n/**\n * Component that displays a list of reactions on a message.\n */\nexport const ReactionsList = React.memo(\n  UnMemoizedReactionsList,\n) as typeof UnMemoizedReactionsList;\n", "import React, { useMemo } from 'react';\nimport clsx from 'clsx';\n\nimport type { ReactionDetailsComparator, ReactionSummary, ReactionType } from './types';\n\nimport { Modal as DefaultModal } from '../Modal';\nimport { useFetchReactions } from './hooks/useFetchReactions';\nimport { LoadingIndicator } from '../Loading';\nimport { Avatar } from '../Avatar';\nimport { useComponentContext, useMessageContext } from '../../context';\nimport type { ReactionSort } from 'stream-chat';\nimport type { ModalProps } from '../Modal';\nimport type { MessageContextValue } from '../../context';\n\nexport type ReactionsListModalProps = ModalProps &\n  Partial<Pick<MessageContextValue, 'handleFetchReactions' | 'reactionDetailsSort'>> & {\n    reactions: ReactionSummary[];\n    selectedReactionType: ReactionType;\n    onSelectedReactionTypeChange?: (reactionType: ReactionType) => void;\n    sort?: ReactionSort;\n    /** @deprecated use `sort` instead */\n    sortReactionDetails?: ReactionDetailsComparator;\n  };\n\nconst defaultReactionDetailsSort = { created_at: -1 } as const;\n\nexport function ReactionsListModal({\n  handleFetchReactions,\n  onSelectedReactionTypeChange,\n  reactionDetailsSort: propReactionDetailsSort,\n  reactions,\n  selectedReactionType,\n  sortReactionDetails: propSortReactionDetails,\n  ...modalProps\n}: ReactionsListModalProps) {\n  const { Modal = DefaultModal } = useComponentContext();\n  const selectedReaction = reactions.find(\n    ({ reactionType }) => reactionType === selectedReactionType,\n  );\n  const SelectedEmojiComponent = selectedReaction?.EmojiComponent ?? null;\n  const {\n    reactionDetailsSort: contextReactionDetailsSort,\n    sortReactionDetails: contextSortReactionDetails,\n  } = useMessageContext('ReactionsListModal');\n  const legacySortReactionDetails = propSortReactionDetails ?? contextSortReactionDetails;\n  const reactionDetailsSort =\n    propReactionDetailsSort ?? contextReactionDetailsSort ?? defaultReactionDetailsSort;\n  const { isLoading: areReactionsLoading, reactions: reactionDetails } =\n    useFetchReactions({\n      handleFetchReactions,\n      reactionType: selectedReactionType,\n      shouldFetch: modalProps.open,\n      sort: reactionDetailsSort,\n    });\n\n  const reactionDetailsWithLegacyFallback = useMemo(\n    () =>\n      legacySortReactionDetails\n        ? [...reactionDetails].sort(legacySortReactionDetails)\n        : reactionDetails,\n    [legacySortReactionDetails, reactionDetails],\n  );\n\n  return (\n    <Modal\n      {...modalProps}\n      className={clsx('str-chat__message-reactions-details-modal', modalProps.className)}\n    >\n      <div\n        className='str-chat__message-reactions-details'\n        data-testid='reactions-list-modal'\n      >\n        <div className='str-chat__message-reactions-details-reaction-types'>\n          {reactions.map(\n            ({ EmojiComponent, reactionCount, reactionType }) =>\n              EmojiComponent && (\n                <div\n                  className={clsx('str-chat__message-reactions-details-reaction-type', {\n                    'str-chat__message-reactions-details-reaction-type--selected':\n                      selectedReactionType === reactionType,\n                  })}\n                  data-testid={`reaction-details-selector-${reactionType}`}\n                  key={reactionType}\n                  onClick={() =>\n                    onSelectedReactionTypeChange?.(reactionType as ReactionType)\n                  }\n                >\n                  <span className='str-chat__message-reaction-emoji str-chat__message-reaction-emoji--with-fallback'>\n                    <EmojiComponent />\n                  </span>\n                  &nbsp;\n                  <span className='str-chat__message-reaction-count'>\n                    {reactionCount}\n                  </span>\n                </div>\n              ),\n          )}\n        </div>\n        {SelectedEmojiComponent && (\n          <div className='str-chat__message-reaction-emoji str-chat__message-reaction-emoji--with-fallback str-chat__message-reaction-emoji-big'>\n            <SelectedEmojiComponent />\n          </div>\n        )}\n        <div\n          className='str-chat__message-reactions-details-reacting-users'\n          data-testid='all-reacting-users'\n        >\n          {areReactionsLoading ? (\n            <LoadingIndicator />\n          ) : (\n            reactionDetailsWithLegacyFallback.map(({ user }) => (\n              <div\n                className='str-chat__message-reactions-details-reacting-user'\n                key={user?.id}\n              >\n                <Avatar\n                  className='stream-chat__avatar--reaction'\n                  data-testid='avatar'\n                  image={user?.image as string | undefined}\n                  name={user?.name || user?.id}\n                />\n                <span\n                  className='str-chat__user-item--name'\n                  data-testid='reaction-user-username'\n                >\n                  {user?.name || user?.id}\n                </span>\n              </div>\n            ))\n          )}\n        </div>\n      </div>\n    </Modal>\n  );\n}\n", "import { useEffect, useState } from 'react';\nimport type { ReactionResponse, ReactionSort } from 'stream-chat';\nimport type { MessageContextValue } from '../../../context';\nimport { useMessageContext } from '../../../context';\n\nimport type { ReactionType } from '../types';\n\nexport interface FetchReactionsOptions {\n  reactionType: ReactionType;\n  shouldFetch: boolean;\n  handleFetchReactions?: MessageContextValue['handleFetchReactions'];\n  sort?: ReactionSort;\n}\n\nexport function useFetchReactions(options: FetchReactionsOptions) {\n  const { handleFetchReactions: contextHandleFetchReactions } =\n    useMessageContext('useFetchReactions');\n  const [reactions, setReactions] = useState<ReactionResponse[]>([]);\n  const {\n    handleFetchReactions: propHandleFetchReactions,\n    reactionType,\n    shouldFetch,\n    sort,\n  } = options;\n  const [isLoading, setIsLoading] = useState(shouldFetch);\n  const handleFetchReactions = propHandleFetchReactions ?? contextHandleFetchReactions;\n\n  useEffect(() => {\n    if (!shouldFetch) {\n      return;\n    }\n\n    let cancel = false;\n\n    (async () => {\n      try {\n        setIsLoading(true);\n        const reactions = await handleFetchReactions(reactionType, sort);\n\n        if (!cancel) {\n          setReactions(reactions);\n        }\n      } catch (e) {\n        if (!cancel) {\n          setReactions([]);\n        }\n      } finally {\n        if (!cancel) {\n          setIsLoading(false);\n        }\n      }\n    })();\n\n    return () => {\n      cancel = true;\n    };\n  }, [handleFetchReactions, reactionType, shouldFetch, sort]);\n\n  return { isLoading, reactions };\n}\n", "import { useCallback, useMemo } from 'react';\n\nimport { useComponentContext, useMessageContext } from '../../../context';\nimport { defaultReactionOptions } from '../reactionOptions';\n\nimport type { ReactionsListProps } from '../ReactionsList';\n\nimport type { ReactionsComparator, ReactionSummary } from '../types';\n\ntype SharedReactionListProps =\n  | 'own_reactions'\n  | 'reaction_counts'\n  | 'reaction_groups'\n  | 'reactionOptions'\n  | 'reactions';\n\ntype UseProcessReactionsParams = Pick<ReactionsListProps, SharedReactionListProps> & {\n  sortReactions?: ReactionsComparator;\n};\n\nexport const defaultReactionsSort: ReactionsComparator = (a, b) => {\n  if (a.firstReactionAt && b.firstReactionAt) {\n    return +a.firstReactionAt - +b.firstReactionAt;\n  }\n\n  return a.reactionType.localeCompare(b.reactionType, 'en');\n};\n\nexport const useProcessReactions = (params: UseProcessReactionsParams) => {\n  const {\n    own_reactions: propOwnReactions,\n    reaction_groups: propReactionGroups,\n    reactionOptions: propReactionOptions,\n    reactions: propReactions,\n    sortReactions: propSortReactions,\n  } = params;\n  const { message, sortReactions: contextSortReactions } =\n    useMessageContext('useProcessReactions');\n  const { reactionOptions: contextReactionOptions = defaultReactionOptions } =\n    useComponentContext('useProcessReactions');\n\n  const reactionOptions = propReactionOptions ?? contextReactionOptions;\n  const sortReactions = propSortReactions ?? contextSortReactions ?? defaultReactionsSort;\n  const latestReactions = propReactions || message.latest_reactions;\n  const ownReactions = propOwnReactions || message?.own_reactions;\n  const reactionGroups = propReactionGroups || message?.reaction_groups;\n\n  const isOwnReaction = useCallback(\n    (reactionType: string) =>\n      ownReactions?.some((reaction) => reaction.type === reactionType) ?? false,\n    [ownReactions],\n  );\n\n  const getEmojiByReactionType = useCallback(\n    (reactionType: string) =>\n      reactionOptions.find(({ type }) => type === reactionType)?.Component ?? null,\n    [reactionOptions],\n  );\n\n  const isSupportedReaction = useCallback(\n    (reactionType: string) =>\n      reactionOptions.some((reactionOption) => reactionOption.type === reactionType),\n    [reactionOptions],\n  );\n\n  const getLatestReactedUserNames = useCallback(\n    (reactionType?: string) =>\n      latestReactions?.flatMap((reaction) => {\n        if (reactionType && reactionType === reaction.type) {\n          const username = reaction.user?.name || reaction.user?.id;\n          return username ? [username] : [];\n        }\n        return [];\n      }) ?? [],\n    [latestReactions],\n  );\n\n  const existingReactions: ReactionSummary[] = useMemo(() => {\n    if (!reactionGroups) {\n      return [];\n    }\n\n    const unsortedReactions = Object.entries(reactionGroups).flatMap(\n      ([reactionType, { count, first_reaction_at, last_reaction_at }]) => {\n        if (count === 0 || !isSupportedReaction(reactionType)) {\n          return [];\n        }\n\n        const latestReactedUserNames = getLatestReactedUserNames(reactionType);\n\n        return [\n          {\n            EmojiComponent: getEmojiByReactionType(reactionType),\n            firstReactionAt: first_reaction_at ? new Date(first_reaction_at) : null,\n            isOwnReaction: isOwnReaction(reactionType),\n            lastReactionAt: last_reaction_at ? new Date(last_reaction_at) : null,\n            latestReactedUserNames,\n            reactionCount: count,\n            reactionType,\n            unlistedReactedUserCount: count - latestReactedUserNames.length,\n          },\n        ];\n      },\n    );\n\n    return unsortedReactions.sort(sortReactions);\n  }, [\n    getEmojiByReactionType,\n    getLatestReactedUserNames,\n    isOwnReaction,\n    isSupportedReaction,\n    reactionGroups,\n    sortReactions,\n  ]);\n\n  const hasReactions = existingReactions.length > 0;\n\n  const totalReactionCount = useMemo(\n    () =>\n      existingReactions.reduce((total, { reactionCount }) => total + reactionCount, 0),\n    [existingReactions],\n  );\n\n  return {\n    existingReactions,\n    hasReactions,\n    totalReactionCount,\n  };\n};\n", "import type { PropsWithChildren } from 'react';\nimport React, { useState } from 'react';\nimport clsx from 'clsx';\n\nimport type { ReactionGroupResponse, ReactionResponse } from 'stream-chat';\nimport type { MessageContextValue } from '../../context/MessageContext';\nimport { useMessageContext } from '../../context/MessageContext';\nimport { useProcessReactions } from './hooks/useProcessReactions';\nimport { useEnterLeaveHandlers } from '../Tooltip/hooks';\nimport { PopperTooltip } from '../Tooltip';\n\nimport type { ReactionOptions } from './reactionOptions';\n\ntype WithTooltipProps = {\n  title: React.ReactNode;\n  onMouseEnter?: React.MouseEventHandler;\n  onMouseLeave?: React.MouseEventHandler;\n};\n\nconst WithTooltip = ({\n  children,\n  onMouseEnter,\n  onMouseLeave,\n  title,\n}: PropsWithChildren<WithTooltipProps>) => {\n  const [referenceElement, setReferenceElement] = useState<HTMLSpanElement | null>(null);\n  const { handleEnter, handleLeave, tooltipVisible } = useEnterLeaveHandlers({\n    onMouseEnter,\n    onMouseLeave,\n  });\n\n  return (\n    <>\n      <PopperTooltip referenceElement={referenceElement} visible={tooltipVisible}>\n        {title}\n      </PopperTooltip>\n      <span\n        onMouseEnter={handleEnter}\n        onMouseLeave={handleLeave}\n        ref={setReferenceElement}\n      >\n        {children}\n      </span>\n    </>\n  );\n};\n\nexport type SimpleReactionsListProps = Partial<\n  Pick<MessageContextValue, 'handleFetchReactions' | 'handleReaction'>\n> & {\n  /** An array of the own reaction objects to distinguish own reactions visually */\n  own_reactions?: ReactionResponse[];\n  /**\n   * An object that keeps track of the count of each type of reaction on a message\n   * @deprecated This override value is no longer taken into account. Use `reaction_groups` to override reaction counts instead.\n   * */\n  reaction_counts?: Record<string, number>;\n  /** An object containing summary for each reaction type on a message */\n  reaction_groups?: Record<string, ReactionGroupResponse>;\n  /** A list of the currently supported reactions on a message */\n  reactionOptions?: ReactionOptions;\n  /** An array of the reaction objects to display in the list */\n  reactions?: ReactionResponse[];\n};\n\nconst UnMemoizedSimpleReactionsList = (props: SimpleReactionsListProps) => {\n  const { handleReaction: propHandleReaction, ...rest } = props;\n\n  const { handleReaction: contextHandleReaction } =\n    useMessageContext('SimpleReactionsList');\n\n  const { existingReactions, hasReactions, totalReactionCount } =\n    useProcessReactions(rest);\n\n  const handleReaction = propHandleReaction || contextHandleReaction;\n\n  if (!hasReactions) return null;\n\n  return (\n    <div className='str-chat__message-reactions-container'>\n      <ul\n        className='str-chat__simple-reactions-list str-chat__message-reactions'\n        data-testid='simple-reaction-list'\n      >\n        {existingReactions.map(\n          ({ EmojiComponent, isOwnReaction, latestReactedUserNames, reactionType }) => {\n            const tooltipContent = latestReactedUserNames.join(', ');\n\n            return (\n              EmojiComponent && (\n                <li\n                  className={clsx('str-chat__simple-reactions-list-item', {\n                    'str-chat__message-reaction-own': isOwnReaction,\n                  })}\n                  key={reactionType}\n                  onClick={(event) => handleReaction(reactionType, event)}\n                  onKeyUp={(event) => handleReaction(reactionType, event)}\n                >\n                  <WithTooltip title={tooltipContent}>\n                    <EmojiComponent />\n                  </WithTooltip>\n                </li>\n              )\n            );\n          },\n        )}\n        {\n          <li className='str-chat__simple-reactions-list-item--last-number'>\n            {totalReactionCount}\n          </li>\n        }\n      </ul>\n    </div>\n  );\n};\n\nexport const SimpleReactionsList = React.memo(\n  UnMemoizedSimpleReactionsList,\n) as typeof UnMemoizedSimpleReactionsList;\n", "import React from 'react';\n\nimport clsx from 'clsx';\nimport {\n  useComponentContext,\n  useMessageContext,\n  useTranslationContext,\n} from '../../context';\nimport { Timestamp as DefaultTimestamp } from './Timestamp';\nimport { isMessageEdited } from './utils';\n\nimport type { MessageTimestampProps } from './MessageTimestamp';\n\nexport type MessageEditedTimestampProps = MessageTimestampProps & {\n  open: boolean;\n};\n\nexport function MessageEditedTimestamp({\n  message: propMessage,\n  open,\n  ...timestampProps\n}: MessageEditedTimestampProps) {\n  const { t } = useTranslationContext('MessageEditedTimestamp');\n  const { message: contextMessage } = useMessageContext('MessageEditedTimestamp');\n  const { Timestamp = DefaultTimestamp } = useComponentContext('MessageEditedTimestamp');\n  const message = propMessage || contextMessage;\n\n  if (!isMessageEdited(message)) {\n    return null;\n  }\n\n  return (\n    <div\n      className={clsx(\n        'str-chat__message-edited-timestamp',\n        open\n          ? 'str-chat__message-edited-timestamp--open'\n          : 'str-chat__message-edited-timestamp--collapsed',\n      )}\n      data-testid='message-edited-timestamp'\n    >\n      {t('Edited')}{' '}\n      <Timestamp timestamp={message.message_text_updated_at} {...timestampProps} />\n    </div>\n  );\n}\n", "import { useCallback, useEffect, useState } from 'react';\nimport type { Channel, Event, LocalMessage, UserResponse } from 'stream-chat';\n\nimport { useChatContext } from '../../../context';\n\nexport enum MessageDeliveryStatus {\n  SENT = 'sent',\n  DELIVERED = 'delivered',\n  READ = 'read',\n}\n\ntype UseMessageStatusParamsChannelPreviewProps = {\n  channel: Channel;\n  /** The last message received in a channel */\n  lastMessage?: LocalMessage;\n};\n\nexport const useMessageDeliveryStatus = ({\n  channel,\n  lastMessage,\n}: UseMessageStatusParamsChannelPreviewProps) => {\n  const { client } = useChatContext();\n  const [messageDeliveryStatus, setMessageDeliveryStatus] = useState<\n    MessageDeliveryStatus | undefined\n  >();\n\n  const isOwnMessage = useCallback(\n    (message?: { user?: UserResponse | null }) =>\n      client.user && message && message.user?.id === client.user.id,\n    [client],\n  );\n\n  useEffect(() => {\n    // empty channel\n    if (!lastMessage) {\n      setMessageDeliveryStatus(undefined);\n    }\n\n    const lastMessageIsOwn = isOwnMessage(lastMessage);\n    if (!lastMessage?.created_at || !lastMessageIsOwn) return;\n\n    const msgRef = {\n      msgId: lastMessage.id,\n      timestampMs: lastMessage.created_at.getTime(),\n    };\n    const readersForMessage = channel.messageReceiptsTracker.readersForMessage(msgRef);\n    const deliveredForMessage =\n      channel.messageReceiptsTracker.deliveredForMessage(msgRef);\n    setMessageDeliveryStatus(\n      readersForMessage.length > 1 ||\n        (readersForMessage.length === 1 && readersForMessage[0].id !== client.user?.id)\n        ? MessageDeliveryStatus.READ\n        : deliveredForMessage.length > 1 ||\n            (deliveredForMessage.length === 1 &&\n              deliveredForMessage[0].id !== client.user?.id)\n          ? MessageDeliveryStatus.DELIVERED\n          : MessageDeliveryStatus.SENT,\n    );\n  }, [channel, client, isOwnMessage, lastMessage]);\n\n  useEffect(() => {\n    const handleMessageNew = (event: Event) => {\n      // the last message is not mine, so do not show the delivery status\n      if (!isOwnMessage(event.message)) {\n        return setMessageDeliveryStatus(undefined);\n      }\n      return setMessageDeliveryStatus(MessageDeliveryStatus.SENT);\n    };\n\n    channel.on('message.new', handleMessageNew);\n\n    return () => {\n      channel.off('message.new', handleMessageNew);\n    };\n  }, [channel, isOwnMessage]);\n\n  useEffect(() => {\n    if (!isOwnMessage(lastMessage)) return;\n    const handleMessageDelivered = (event: Event) => {\n      if (\n        event.user?.id !== client.user?.id &&\n        lastMessage &&\n        lastMessage.id === event.last_delivered_message_id\n      )\n        setMessageDeliveryStatus(MessageDeliveryStatus.DELIVERED);\n    };\n\n    const handleMarkRead = (event: Event) => {\n      if (event.user?.id !== client.user?.id)\n        setMessageDeliveryStatus(MessageDeliveryStatus.READ);\n    };\n\n    channel.on('message.delivered', handleMessageDelivered);\n    channel.on('message.read', handleMarkRead);\n\n    return () => {\n      channel.off('message.delivered', handleMessageDelivered);\n      channel.off('message.read', handleMarkRead);\n    };\n  }, [channel, client, isOwnMessage, lastMessage]);\n\n  return {\n    messageDeliveryStatus,\n  };\n};\n", "import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\n\nimport { ThreadProvider } from '../Threads';\nimport { Icon } from '../Threads/icons';\nimport { UnreadCountBadge } from '../Threads/UnreadCountBadge';\nimport { useChatContext } from '../../context';\nimport { useStateStore } from '../../store';\n\nimport type { PropsWithChildren } from 'react';\nimport type { Thread, ThreadManagerState } from 'stream-chat';\nimport clsx from 'clsx';\n\ntype ChatView = 'channels' | 'threads';\n\ntype ChatViewContextValue = {\n  activeChatView: ChatView;\n  setActiveChatView: (cv: ChatViewContextValue['activeChatView']) => void;\n};\n\nconst ChatViewContext = createContext<ChatViewContextValue>({\n  activeChatView: 'channels',\n  setActiveChatView: () => undefined,\n});\n\nexport const ChatView = ({ children }: PropsWithChildren) => {\n  const [activeChatView, setActiveChatView] =\n    useState<ChatViewContextValue['activeChatView']>('channels');\n\n  const { theme } = useChatContext();\n\n  const value = useMemo(() => ({ activeChatView, setActiveChatView }), [activeChatView]);\n\n  return (\n    <ChatViewContext.Provider value={value}>\n      <div className={clsx('str-chat', theme, 'str-chat__chat-view')}>{children}</div>\n    </ChatViewContext.Provider>\n  );\n};\n\nconst ChannelsView = ({ children }: PropsWithChildren) => {\n  const { activeChatView } = useContext(ChatViewContext);\n\n  if (activeChatView !== 'channels') return null;\n\n  return <div className='str-chat__chat-view__channels'>{children}</div>;\n};\n\nexport type ThreadsViewContextValue = {\n  activeThread: Thread | undefined;\n  setActiveThread: (cv: ThreadsViewContextValue['activeThread']) => void;\n};\n\nconst ThreadsViewContext = createContext<ThreadsViewContextValue>({\n  activeThread: undefined,\n  setActiveThread: () => undefined,\n});\n\nexport const useThreadsViewContext = () => useContext(ThreadsViewContext);\n\nconst ThreadsView = ({ children }: PropsWithChildren) => {\n  const { activeChatView } = useContext(ChatViewContext);\n  const [activeThread, setActiveThread] =\n    useState<ThreadsViewContextValue['activeThread']>(undefined);\n\n  const value = useMemo(() => ({ activeThread, setActiveThread }), [activeThread]);\n\n  if (activeChatView !== 'threads') return null;\n\n  return (\n    <ThreadsViewContext.Provider value={value}>\n      <div className='str-chat__chat-view__threads'>{children}</div>\n    </ThreadsViewContext.Provider>\n  );\n};\n\n// thread business logic that's impossible to keep within client but encapsulated for ease of use\nexport const useActiveThread = ({ activeThread }: { activeThread?: Thread }) => {\n  useEffect(() => {\n    if (!activeThread) return;\n\n    const handleVisibilityChange = () => {\n      if (document.visibilityState === 'visible' && document.hasFocus()) {\n        activeThread.activate();\n      }\n      if (document.visibilityState === 'hidden' || !document.hasFocus()) {\n        activeThread.deactivate();\n      }\n    };\n\n    handleVisibilityChange();\n\n    window.addEventListener('focus', handleVisibilityChange);\n    window.addEventListener('blur', handleVisibilityChange);\n    return () => {\n      activeThread.deactivate();\n      window.addEventListener('blur', handleVisibilityChange);\n      window.removeEventListener('focus', handleVisibilityChange);\n    };\n  }, [activeThread]);\n};\n\n// ThreadList under View.Threads context, will access setting function and on item click will set activeThread\n// which can be accessed for the ease of use by ThreadAdapter which forwards it to required ThreadProvider\n// ThreadList can easily live without this context and click handler can be overriden, ThreadAdapter is then no longer needed\n/**\n * // this setup still works\n * const MyCustomComponent = () => {\n *  const [activeThread, setActiveThread] = useState();\n *\n *  return <>\n *    // simplified\n *    <ThreadList onItemPointerDown={setActiveThread} />\n *    <ThreadProvider thread={activeThread}>\n *      <Thread />\n *    </ThreadProvider>\n *  </>\n * }\n *\n */\nconst ThreadAdapter = ({ children }: PropsWithChildren) => {\n  const { activeThread } = useThreadsViewContext();\n\n  useActiveThread({ activeThread });\n\n  return <ThreadProvider thread={activeThread}>{children}</ThreadProvider>;\n};\n\nconst selector = ({ unreadThreadCount }: ThreadManagerState) => ({\n  unreadThreadCount,\n});\n\nconst ChatViewSelector = () => {\n  const { client } = useChatContext();\n  const { unreadThreadCount } = useStateStore(client.threads.state, selector);\n\n  const { activeChatView, setActiveChatView } = useContext(ChatViewContext);\n\n  return (\n    <div className='str-chat__chat-view__selector'>\n      <button\n        aria-selected={activeChatView === 'channels'}\n        className='str-chat__chat-view__selector-button'\n        onPointerDown={() => setActiveChatView('channels')}\n        role='tab'\n      >\n        <Icon.MessageBubbleEmpty />\n        <div className='str-chat__chat-view__selector-button-text'>Channels</div>\n      </button>\n      <button\n        aria-selected={activeChatView === 'threads'}\n        className='str-chat__chat-view__selector-button'\n        onPointerDown={() => setActiveChatView('threads')}\n        role='tab'\n      >\n        <UnreadCountBadge count={unreadThreadCount} position='top-right'>\n          <Icon.MessageBubble />\n        </UnreadCountBadge>\n        <div className='str-chat__chat-view__selector-button-text'>Threads</div>\n      </button>\n    </div>\n  );\n};\n\nChatView.Channels = ChannelsView;\nChatView.Threads = ThreadsView;\nChatView.ThreadAdapter = ThreadAdapter;\nChatView.Selector = ChatViewSelector;\n", "import React from 'react';\nimport { Icon } from '../icons';\n\nexport const ThreadListEmptyPlaceholder = () => (\n  <div className='str-chat__thread-list-empty-placeholder'>\n    <Icon.MessageBubble />\n    {/* TODO: translate */}\n    No threads here yet...\n  </div>\n);\n", "import React from 'react';\n\nimport type { ThreadManagerState } from 'stream-chat';\n\nimport { Icon } from '../icons';\nimport { useChatContext } from '../../../context';\nimport { useStateStore } from '../../../store';\n\nconst selector = (nextValue: ThreadManagerState) => ({\n  unseenThreadIds: nextValue.unseenThreadIds,\n});\n\nexport const ThreadListUnseenThreadsBanner = () => {\n  const { client } = useChatContext();\n  const { unseenThreadIds } = useStateStore(client.threads.state, selector);\n\n  if (!unseenThreadIds.length) return null;\n\n  return (\n    <div className='str-chat__unseen-threads-banner'>\n      {/* TODO: translate */}\n      {unseenThreadIds.length} unread threads\n      <button\n        className='str-chat__unseen-threads-banner__button'\n        onClick={() => client.threads.reload()}\n      >\n        <Icon.Reload />\n      </button>\n    </div>\n  );\n};\n", "import React from 'react';\n\nimport type { ThreadManagerState } from 'stream-chat';\n\nimport { LoadingIndicator as DefaultLoadingIndicator } from '../../Loading';\nimport { useChatContext, useComponentContext } from '../../../context';\nimport { useStateStore } from '../../../store';\n\nconst selector = (nextValue: ThreadManagerState) => ({\n  isLoadingNext: nextValue.pagination.isLoadingNext,\n});\n\nexport const ThreadListLoadingIndicator = () => {\n  const { LoadingIndicator = DefaultLoadingIndicator } = useComponentContext();\n  const { client } = useChatContext();\n  const { isLoadingNext } = useStateStore(client.threads.state, selector);\n\n  if (!isLoadingNext) return null;\n\n  return (\n    <div className='str-chat__thread-list-loading-indicator'>\n      <LoadingIndicator />\n    </div>\n  );\n};\n", "import React, { useEffect } from 'react';\nimport clsx from 'clsx';\n\nimport { LegacyThreadContext } from './LegacyThreadContext';\nimport { MESSAGE_ACTIONS } from '../Message';\nimport type { MessageInputProps } from '../MessageInput';\nimport { MessageInput, MessageInputFlat } from '../MessageInput';\nimport type { MessageListProps, VirtualizedMessageListProps } from '../MessageList';\nimport { MessageList, VirtualizedMessageList } from '../MessageList';\nimport { ThreadHeader as DefaultThreadHeader } from './ThreadHeader';\nimport { ThreadHead as DefaultThreadHead } from '../Thread/ThreadHead';\n\nimport {\n  useChannelActionContext,\n  useChannelStateContext,\n  useChatContext,\n  useComponentContext,\n} from '../../context';\nimport { useThreadContext } from '../Threads';\nimport { useStateStore } from '../../store';\n\nimport type { MessageProps, MessageUIComponentProps } from '../Message/types';\nimport type { MessageActionsArray } from '../Message/utils';\nimport type { ThreadState } from 'stream-chat';\n\nexport type ThreadProps = {\n  /** Additional props for `MessageInput` component: [available props](https://getstream.io/chat/docs/sdk/react/message-input-components/message_input/#props) */\n  additionalMessageInputProps?: MessageInputProps;\n  /** Additional props for `MessageList` component: [available props](https://getstream.io/chat/docs/sdk/react/core-components/message_list/#props) */\n  additionalMessageListProps?: MessageListProps;\n  /** Additional props for `Message` component of the parent message: [available props](https://getstream.io/chat/docs/sdk/react/message-components/message/#props) */\n  additionalParentMessageProps?: Partial<MessageProps>;\n  /** Additional props for `VirtualizedMessageList` component: [available props](https://getstream.io/chat/docs/sdk/react/core-components/virtualized_list/#props) */\n  additionalVirtualizedMessageListProps?: VirtualizedMessageListProps;\n  /** If true, focuses the `MessageInput` component on opening a thread */\n  autoFocus?: boolean;\n  /** Injects date separator components into `Thread`, defaults to `false`. To be passed to the underlying `MessageList` or `VirtualizedMessageList` components */\n  enableDateSeparator?: boolean;\n  /** Custom thread input UI component used to override the default `Input` value stored in `ComponentContext` or the [MessageInputSmall](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/MessageInputSmall.tsx) default */\n  Input?: React.ComponentType;\n  /** Custom thread message UI component used to override the default `Message` value stored in `ComponentContext` */\n  Message?: React.ComponentType<MessageUIComponentProps>;\n  /** Array of allowed message actions (ex: ['edit', 'delete', 'flag', 'mute', 'pin', 'quote', 'react', 'reply']). To disable all actions, provide an empty array. */\n  messageActions?: MessageActionsArray;\n  /** If true, render the `VirtualizedMessageList` instead of the standard `MessageList` component */\n  virtualized?: boolean;\n};\n\n/**\n * The Thread component renders a parent Message with a list of replies\n */\nexport const Thread = (props: ThreadProps) => {\n  const { channel, channelConfig, thread } = useChannelStateContext('Thread');\n  const threadInstance = useThreadContext();\n\n  if (!thread && !threadInstance) return null;\n  if (channelConfig?.replies === false) return null;\n\n  // the wrapper ensures a key variable is set and the component recreates on thread switch\n  return (\n    // FIXME: TS is having trouble here as at least one of the two would always be defined\n    <ThreadInner\n      {...props}\n      key={`thread-${(thread ?? threadInstance)?.id}-${channel?.cid}`}\n    />\n  );\n};\n\nconst selector = (nextValue: ThreadState) => ({\n  isLoadingNext: nextValue.pagination.isLoadingNext,\n  isLoadingPrev: nextValue.pagination.isLoadingPrev,\n  parentMessage: nextValue.parentMessage,\n  replies: nextValue.replies,\n});\n\nconst ThreadInner = (props: ThreadProps & { key: string }) => {\n  const {\n    additionalMessageInputProps,\n    additionalMessageListProps,\n    additionalParentMessageProps,\n    additionalVirtualizedMessageListProps,\n    autoFocus = true,\n    enableDateSeparator = false,\n    Input: PropInput,\n    Message: PropMessage,\n    messageActions = Object.keys(MESSAGE_ACTIONS),\n    virtualized,\n  } = props;\n\n  const threadInstance = useThreadContext();\n\n  const {\n    thread,\n    threadHasMore,\n    threadLoadingMore,\n    threadMessages = [],\n    threadSuppressAutoscroll,\n  } = useChannelStateContext('Thread');\n  const { closeThread, loadMoreThread } = useChannelActionContext('Thread');\n  const { customClasses } = useChatContext('Thread');\n  const {\n    Message: ContextMessage,\n    ThreadHead = DefaultThreadHead,\n    ThreadHeader = DefaultThreadHeader,\n    ThreadInput: ContextInput,\n    VirtualMessage,\n  } = useComponentContext('Thread');\n\n  const { isLoadingNext, isLoadingPrev, parentMessage, replies } =\n    useStateStore(threadInstance?.state, selector) ?? {};\n\n  const ThreadInput =\n    PropInput ?? additionalMessageInputProps?.Input ?? ContextInput ?? MessageInputFlat;\n\n  const ThreadMessage = PropMessage || additionalMessageListProps?.Message;\n  const FallbackMessage = virtualized && VirtualMessage ? VirtualMessage : ContextMessage;\n  const MessageUIComponent = ThreadMessage || FallbackMessage;\n\n  const ThreadMessageList = virtualized ? VirtualizedMessageList : MessageList;\n\n  useEffect(() => {\n    if (threadInstance) return;\n\n    if ((thread?.reply_count ?? 0) > 0) {\n      // FIXME: integrators can customize channel query options but cannot customize channel.getReplies() options\n      loadMoreThread();\n    }\n  }, [thread, loadMoreThread, threadInstance]);\n\n  const threadProps: Pick<\n    VirtualizedMessageListProps,\n    | 'hasMoreNewer'\n    | 'loadMoreNewer'\n    | 'loadingMoreNewer'\n    | 'hasMore'\n    | 'loadMore'\n    | 'loadingMore'\n    | 'messages'\n  > = threadInstance\n    ? {\n        loadingMore: isLoadingPrev,\n        loadingMoreNewer: isLoadingNext,\n        loadMore: threadInstance.loadPrevPage,\n        loadMoreNewer: threadInstance.loadNextPage,\n        messages: replies,\n      }\n    : {\n        hasMore: threadHasMore,\n        loadingMore: threadLoadingMore,\n        loadMore: loadMoreThread,\n        messages: threadMessages,\n      };\n\n  const messageAsThread = thread ?? parentMessage;\n\n  if (!messageAsThread) return null;\n\n  const threadClass =\n    customClasses?.thread ||\n    clsx('str-chat__thread-container str-chat__thread', {\n      'str-chat__thread--virtualized': virtualized,\n    });\n\n  const head = (\n    <ThreadHead\n      key={messageAsThread.id}\n      message={messageAsThread}\n      Message={MessageUIComponent}\n      {...additionalParentMessageProps}\n    />\n  );\n\n  return (\n    // Thread component needs a context which we can use for message composer\n    <LegacyThreadContext.Provider\n      value={{\n        legacyThread: thread ?? undefined,\n      }}\n    >\n      <div className={threadClass}>\n        <ThreadHeader closeThread={closeThread} thread={messageAsThread} />\n        <ThreadMessageList\n          disableDateSeparator={!enableDateSeparator}\n          head={head}\n          Message={MessageUIComponent}\n          messageActions={messageActions}\n          suppressAutoscroll={threadSuppressAutoscroll}\n          threadList\n          {...threadProps}\n          {...(virtualized\n            ? additionalVirtualizedMessageListProps\n            : additionalMessageListProps)}\n        />\n        <MessageInput\n          focus={autoFocus}\n          Input={ThreadInput}\n          isThreadInput\n          parent={thread ?? parentMessage}\n          {...additionalMessageInputProps}\n        />\n      </div>\n    </LegacyThreadContext.Provider>\n  );\n};\n", "import React, { useContext } from 'react';\nimport type { LocalMessage } from 'stream-chat';\n\nexport const LegacyThreadContext = React.createContext<{\n  legacyThread: LocalMessage | undefined;\n}>({ legacyThread: undefined });\n\nexport const useLegacyThreadContext = () => useContext(LegacyThreadContext);\n", "import React from 'react';\n\nimport { useChannelPreviewInfo } from '../ChannelPreview/hooks/useChannelPreviewInfo';\nimport { CloseIcon } from './icons';\n\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nimport type { ChannelPreviewInfoParams } from '../ChannelPreview/hooks/useChannelPreviewInfo';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type ThreadHeaderProps = {\n  /** Callback for closing the thread */\n  closeThread: (event?: React.BaseSyntheticEvent) => void;\n  /** The thread parent message */\n  thread: LocalMessage;\n};\n\nexport const ThreadHeader = (\n  props: ThreadHeaderProps &\n    Pick<ChannelPreviewInfoParams, 'overrideImage' | 'overrideTitle'>,\n) => {\n  const { closeThread, overrideImage, overrideTitle } = props;\n\n  const { t } = useTranslationContext('ThreadHeader');\n  const { channel } = useChannelStateContext('');\n  const { displayTitle } = useChannelPreviewInfo({\n    channel,\n    overrideImage,\n    overrideTitle,\n  });\n\n  return (\n    <div className='str-chat__thread-header'>\n      <div className='str-chat__thread-header-details'>\n        <div className='str-chat__thread-header-title'>{t('Thread')}</div>\n        <div className='str-chat__thread-header-subtitle'>{displayTitle}</div>\n      </div>\n      <button\n        aria-label={t('aria/Close thread')}\n        className='str-chat__close-thread-button'\n        data-testid='close-button'\n        onClick={closeThread}\n      >\n        <CloseIcon />\n      </button>\n    </div>\n  );\n};\n", "import React from 'react';\n\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nexport const CloseIcon = ({ title }: { title?: string }) => {\n  const { t } = useTranslationContext('CloseIcon');\n\n  return (\n    <svg\n      data-testid='close-no-outline'\n      fill='none'\n      viewBox='0 0 24 24'\n      xmlns='http://www.w3.org/2000/svg'\n    >\n      <title>{title ?? t('Close')}</title>\n      <path\n        d='M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12L19 6.41Z'\n        fill='black'\n      />\n    </svg>\n  );\n};\n", "import React from 'react';\n\nimport type { MessageProps } from '../Message';\nimport { Message } from '../Message';\nimport { ThreadStart as DefaultThreadStart } from './ThreadStart';\n\nimport { useComponentContext } from '../../context';\n\nexport const ThreadHead = (props: MessageProps) => {\n  const { ThreadStart = DefaultThreadStart } = useComponentContext('ThreadHead');\n  return (\n    <div className='str-chat__parent-message-li'>\n      <Message initialMessage threadList {...props} />\n      <ThreadStart />\n    </div>\n  );\n};\n", "import React from 'react';\n\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nexport const ThreadStart = () => {\n  const { thread } = useChannelStateContext('ThreadStart');\n  const { t } = useTranslationContext('ThreadStart');\n\n  if (!thread?.reply_count) return null;\n\n  return (\n    <div className='str-chat__thread-start'>\n      {t('replyCount', { count: thread.reply_count })}\n    </div>\n  );\n};\n", "import { useMessageComposer } from './useMessageComposer';\nimport { useStateStore } from '../../../store';\nimport type { AttachmentManagerState } from 'stream-chat';\n\nconst stateSelector = (state: AttachmentManagerState) => ({\n  attachments: state.attachments,\n});\n\nexport const useAttachmentManagerState = () => {\n  const { attachmentManager } = useMessageComposer();\n  const { attachments } = useStateStore(attachmentManager.state, stateSelector);\n  return {\n    attachments,\n    availableUploadSlots: attachmentManager.availableUploadSlots,\n    blockedUploadsCount: attachmentManager.blockedUploadsCount,\n    failedUploadsCount: attachmentManager.failedUploadsCount,\n    isUploadEnabled: attachmentManager.isUploadEnabled,\n    pendingUploadsCount: attachmentManager.pendingUploadsCount,\n    successfulUploadsCount: attachmentManager.successfulUploadsCount,\n    uploadsInProgressCount: attachmentManager.uploadsInProgressCount,\n  };\n};\n", "export const CHANNEL_CONTAINER_ID = 'str-chat__channel';\n", "import type { ComponentProps } from 'react';\nimport React from 'react';\nimport clsx from 'clsx';\n\nexport type DialogMenuButtonProps = ComponentProps<'button'>;\n\nexport const DialogMenuButton = ({\n  children,\n  className,\n  ...props\n}: DialogMenuButtonProps) => (\n  <button className={clsx('str-chat__dialog-menu__button', className)} {...props}>\n    <div className='str-chat__dialog-menu__button-icon' />\n    <div className='str-chat__dialog-menu__button-text'>{children}</div>\n  </button>\n);\n", "import React, {\n  type ComponentType,\n  useCallback,\n  useEffect,\n  useMemo,\n  useState,\n} from 'react';\nimport { useChatContext, useTranslationContext } from '../../context';\nimport { useMessageComposer } from '../MessageInput';\nimport { ModalHeader } from '../Modal/ModalHeader';\nimport { SimpleSwitchField } from '../Form/SwitchField';\nimport { Dropdown, useDropdownContext } from '../Form/Dropdown';\nimport type { Coords } from 'stream-chat';\n\nconst MIN_LIVE_LOCATION_SHARE_DURATION = 60 * 1000; // 1 minute;\n\nconst DEFAULT_SHARE_LOCATION_DURATIONS = [\n  15 * 60 * 1000, // 15 minutes\n  60 * 60 * 1000, // 1 hour\n  8 * 60 * 60 * 1000, // 8 hours\n];\n\nexport type ShareGeolocationMapProps = Partial<Coords> & {\n  loadingLocation: boolean;\n  restartLocationWatching: () => void;\n  geolocationPositionError?: GeolocationPositionError;\n};\n\nexport type ShareLocationDialogProps = {\n  close: () => void;\n  shareDurations?: number[];\n  GeolocationMap?: ComponentType<ShareGeolocationMapProps>;\n  DurationDropdownItems?: ComponentType<DurationDropdownItemsProps>;\n};\n\nconst DefaultGeolocationMap = () => null;\n\nexport const ShareLocationDialog = ({\n  close,\n  GeolocationMap = DefaultGeolocationMap,\n  shareDurations = DEFAULT_SHARE_LOCATION_DURATIONS,\n}: ShareLocationDialogProps) => {\n  const { client } = useChatContext();\n  const { t } = useTranslationContext();\n  const messageComposer = useMessageComposer();\n  const [durations, setDurations] = useState<number[]>([]);\n  const [selectedDuration, setSelectedDuration] = useState<number | undefined>(undefined);\n  const [geolocationPosition, setGeolocationPosition] =\n    useState<GeolocationPosition | null>(null);\n  const [loadingLocation, setLoadingLocation] = useState<boolean>(false);\n  const [geolocationPositionError, setGeolocationPositionError] = useState<\n    GeolocationPositionError | undefined\n  >(undefined);\n\n  const validShareDurations = useMemo(\n    () => shareDurations.filter((d) => d >= MIN_LIVE_LOCATION_SHARE_DURATION),\n    [shareDurations],\n  );\n\n  const openDropdownButtonProps = useMemo(\n    () => ({\n      children: (() => (\n        <div>\n          {t('duration/Share Location', {\n            milliseconds: selectedDuration ?? durations[0],\n          })}\n        </div>\n      ))(), // todo: make it a component\n    }),\n    [durations, selectedDuration, t],\n  );\n\n  const getPosition = useCallback(\n    (): Promise<GeolocationPosition> =>\n      new Promise((resolve, reject) => {\n        navigator.geolocation.getCurrentPosition(\n          (position) => {\n            resolve(position);\n          },\n          (positionError) => {\n            console.warn(positionError);\n            reject(positionError);\n          },\n          { timeout: 1000 },\n        );\n      }),\n    [],\n  );\n\n  const setupPositionWatching = useCallback(() => {\n    setLoadingLocation(true);\n    const watch = navigator.geolocation.watchPosition(\n      (position) => {\n        setGeolocationPosition(position);\n        setLoadingLocation(false);\n        setGeolocationPositionError(undefined);\n      },\n      (error) => {\n        setGeolocationPosition(null);\n        setLoadingLocation(false);\n        setGeolocationPositionError(error);\n      },\n      { timeout: 1000 },\n    );\n\n    return () => {\n      navigator.geolocation.clearWatch(watch);\n    };\n  }, []);\n\n  useEffect(() => setupPositionWatching(), [setupPositionWatching]);\n\n  return (\n    <div\n      className='str-chat__dialog str-chat__share-location-dialog'\n      data-testid='share-location-dialog'\n    >\n      <ModalHeader close={close} title={t('Share Location')} />\n      <div className='str-chat__dialog__body'>\n        <GeolocationMap\n          geolocationPositionError={geolocationPositionError}\n          latitude={geolocationPosition?.coords.latitude}\n          loadingLocation={loadingLocation}\n          longitude={geolocationPosition?.coords.longitude}\n          restartLocationWatching={setupPositionWatching}\n        />\n        {validShareDurations.length > 0 && (\n          <div className='str-chat__live-location-activation'>\n            <SimpleSwitchField\n              checked={durations.length > 0}\n              data-testid='share-location-dialog-live-location-switch'\n              disabled={!geolocationPosition}\n              labelText={t('Share live location for')}\n              onChange={(e) => {\n                e.stopPropagation();\n                if (durations.length > 0) {\n                  setDurations([]);\n                  setSelectedDuration(undefined);\n                } else {\n                  setDurations(validShareDurations);\n                  setSelectedDuration(validShareDurations[0]);\n                }\n              }}\n            />\n            {durations.length > 0 && (\n              <Dropdown\n                openButtonProps={openDropdownButtonProps}\n                placement='bottom-start'\n              >\n                <DurationDropdownItems\n                  durations={durations}\n                  selectDuration={setSelectedDuration}\n                />\n              </Dropdown>\n            )}\n          </div>\n        )}\n      </div>\n      <div className='str-chat__dialog__controls'>\n        <button\n          className='str-chat__dialog__controls-button str-chat__dialog__controls-button--cancel'\n          onClick={() => {\n            messageComposer.locationComposer.initState();\n            close();\n          }}\n        >\n          {t('Cancel')}\n        </button>\n        <button\n          className='str-chat__dialog__controls-button str-chat__dialog__controls-button--submit'\n          disabled={!geolocationPosition}\n          onClick={async () => {\n            let coords = geolocationPosition && {\n              latitude: geolocationPosition.coords.latitude,\n              longitude: geolocationPosition.coords.longitude,\n            };\n            if (!coords) {\n              coords = (await getPosition()).coords;\n            }\n            messageComposer.locationComposer.setData({\n              ...coords,\n              durationMs: selectedDuration,\n            });\n            close();\n          }}\n          type='submit'\n        >\n          {t('Attach')}\n        </button>\n        <button\n          className='str-chat__dialog__controls-button str-chat__dialog__controls-button--submit'\n          disabled={!geolocationPosition}\n          onClick={async () => {\n            let coords = geolocationPosition && {\n              latitude: geolocationPosition.coords.latitude,\n              longitude: geolocationPosition.coords.longitude,\n            };\n            if (!coords) {\n              try {\n                coords = (await getPosition()).coords;\n              } catch (e) {\n                client.notifications.addError({\n                  message: t('Failed to retrieve location'),\n                  options: {\n                    originalError: e instanceof Error ? e : undefined,\n                    type: 'browser-api:location:get:failed',\n                  },\n                  origin: { emitter: 'ShareLocationDialog' },\n                });\n                return;\n              }\n            }\n\n            messageComposer.locationComposer.setData({\n              ...coords,\n              durationMs: selectedDuration,\n            });\n            try {\n              await messageComposer.sendLocation();\n            } catch (err) {\n              client.notifications.addError({\n                message: t('Failed to share location'),\n                options: {\n                  originalError: err instanceof Error ? err : undefined,\n                  type: 'api:location:share:failed',\n                },\n                origin: { emitter: 'ShareLocationDialog' },\n              });\n              return;\n            }\n            close();\n          }}\n          type='submit'\n        >\n          {t('Share')}\n        </button>\n      </div>\n    </div>\n  );\n};\n\nexport type DurationDropdownItemsProps = {\n  durations: number[];\n  selectDuration: (duration: number) => void;\n};\nconst DurationDropdownItems = ({\n  durations,\n  selectDuration,\n}: DurationDropdownItemsProps) => {\n  const { t } = useTranslationContext();\n  const { close } = useDropdownContext();\n  return durations.map((duration) => (\n    <button\n      className='str-chat__live-location-sharing-duration-option'\n      key={`duration-${duration}}`}\n      onClick={() => {\n        selectDuration(duration);\n        close();\n      }}\n      role='option'\n    >\n      {t('duration/Share Location', { milliseconds: duration })}\n    </button>\n  ));\n};\n", "import type { PropsWithChildren } from 'react';\nimport { useRef } from 'react';\nimport { useEffect } from 'react';\nimport React, { useState } from 'react';\nimport { DialogAnchor, useDialog, useDialogIsOpen } from '../Dialog';\nimport { DialogManagerProvider, useTranslationContext } from '../../context';\nimport type { PopperLikePlacement } from '../Dialog';\n\ntype DropdownContextValue = {\n  close(): void;\n};\n\nconst DropdownContext = React.createContext<DropdownContextValue>({\n  close: () => null,\n});\n\ntype DropdownContextProviderProps = DropdownContextValue;\n\nconst DropdownContextProvider = ({\n  children,\n  ...props\n}: PropsWithChildren<DropdownContextProviderProps>) => (\n  <DropdownContext.Provider value={props}>{children}</DropdownContext.Provider>\n);\n\nexport const useDropdownContext = () => React.useContext(DropdownContext);\n\nexport type DropdownProps = PropsWithChildren<{\n  className?: string;\n  openButtonProps?: React.HTMLAttributes<HTMLButtonElement>;\n  placement?: PopperLikePlacement;\n}>;\n\nexport const Dropdown = (props: DropdownProps) => {\n  const dropdownDialogId = `dropdown`;\n\n  return (\n    <div className={'str-chat__dropdown'}>\n      <DialogManagerProvider id={dropdownDialogId}>\n        <DropdownInner {...props} dialogId={dropdownDialogId} />\n      </DialogManagerProvider>\n    </div>\n  );\n};\n\nconst DropdownInner = ({\n  children,\n  dialogId,\n  openButtonProps,\n  placement = 'bottom',\n}: DropdownProps & { dialogId: string }) => {\n  const { t } = useTranslationContext();\n  const [openButton, setOpenButton] = useState<HTMLButtonElement | null>(null);\n  const [dropdownWidth, setDropdownWidth] = useState<string>('');\n  const dropdownRef = useRef<HTMLDivElement | null>(null);\n  const dialog = useDialog({ id: dialogId });\n  const dropdownDialogIsOpen = useDialogIsOpen(dialogId);\n\n  useEffect(() => {\n    if (!openButton || typeof ResizeObserver === 'undefined') return;\n    let timeout: ReturnType<typeof setTimeout>;\n    const observer = new ResizeObserver(([button]) => {\n      if (timeout) clearTimeout(timeout);\n      timeout = setTimeout(() => {\n        const width = button.target.getBoundingClientRect().width + 'px';\n        if (!dropdownRef.current) {\n          setDropdownWidth(width);\n          return;\n        }\n        dropdownRef.current.style.width = width;\n      }, 100);\n    });\n    observer.observe(openButton);\n\n    return () => {\n      observer.disconnect();\n    };\n  }, [openButton]);\n\n  return (\n    <DropdownContextProvider close={dialog.close}>\n      <button\n        aria-expanded={dropdownDialogIsOpen}\n        aria-haspopup='true'\n        aria-label={t('aria/Open Menu')}\n        className='str-chat__dropdown__open-button'\n        data-testid='dropdown-open-button'\n        {...openButtonProps}\n        onClick={() => dialog?.toggle()}\n        ref={setOpenButton}\n      />\n      <DialogAnchor\n        allowFlip={false}\n        id={dialogId}\n        placement={placement}\n        referenceElement={openButton}\n        tabIndex={-1}\n        trapFocus\n      >\n        <div\n          className='str-chat__dropdown__items'\n          ref={dropdownRef}\n          style={{ width: dropdownWidth }}\n        >\n          {children}\n        </div>\n      </DialogAnchor>\n    </DropdownContextProvider>\n  );\n};\n", "import type { PropsWithChildren } from 'react';\nimport React, { createContext, useContext } from 'react';\n\nexport type AttachmentSelectorContextValue = {\n  fileInput: HTMLInputElement | null;\n};\n\nconst AttachmentSelectorContext = createContext<AttachmentSelectorContextValue>({\n  fileInput: null,\n});\n\nexport const AttachmentSelectorContextProvider = ({\n  children,\n  value,\n}: PropsWithChildren<{ value: AttachmentSelectorContextValue }>) => (\n  <AttachmentSelectorContext.Provider value={value}>\n    {children}\n  </AttachmentSelectorContext.Provider>\n);\n\nexport const useAttachmentSelectorContext = () => useContext(AttachmentSelectorContext);\n", "import { useMessageComposer } from './useMessageComposer';\nimport { useStateStore } from '../../../store';\nimport type {\n  AttachmentManagerState,\n  LocationComposerState,\n  PollComposerState,\n} from 'stream-chat';\n\nconst attachmentManagerStateSelector = (state: AttachmentManagerState) => ({\n  attachments: state.attachments,\n});\nconst pollComposerStateSelector = (state: PollComposerState) => ({\n  poll: state.data,\n});\nconst locationComposerStateSelector = (state: LocationComposerState) => ({\n  location: state.location,\n});\n\nexport const useAttachmentsForPreview = () => {\n  const { attachmentManager, locationComposer, pollComposer } = useMessageComposer();\n  const { attachments } = useStateStore(\n    attachmentManager.state,\n    attachmentManagerStateSelector,\n  );\n  const { poll } = useStateStore(pollComposer.state, pollComposerStateSelector);\n  const { location } = useStateStore(\n    locationComposer.state,\n    locationComposerStateSelector,\n  );\n\n  return {\n    attachments,\n    location,\n    poll,\n  };\n};\n", "import { useMessageComposer } from './useMessageComposer';\nimport { useEffect, useState } from 'react';\n\nexport const useCanCreatePoll = () => {\n  const { pollComposer } = useMessageComposer();\n  const [canCreatePoll, setCanCreatePoll] = useState(pollComposer.canCreatePoll);\n  useEffect(\n    () =>\n      pollComposer.state.subscribe(() => {\n        setCanCreatePoll(pollComposer.canCreatePoll);\n      }),\n    [pollComposer],\n  );\n  return canCreatePoll;\n};\n", "import type React from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport type { ChannelResponse } from 'stream-chat';\n\nimport { useChannelStateContext, useChatContext } from '../../../context';\n\nexport type CooldownTimerState = {\n  cooldownInterval: number;\n  setCooldownRemaining: React.Dispatch<React.SetStateAction<number | undefined>>;\n  cooldownRemaining?: number;\n};\n\nexport const useCooldownTimer = (): CooldownTimerState => {\n  const { client, latestMessageDatesByChannels } = useChatContext('useCooldownTimer');\n  const { channel, messages = [] } = useChannelStateContext('useCooldownTimer');\n  const [cooldownRemaining, setCooldownRemaining] = useState<number>();\n\n  const { cooldown: cooldownInterval = 0, own_capabilities } = (channel.data ||\n    {}) as ChannelResponse;\n\n  const skipCooldown = own_capabilities?.includes('skip-slow-mode');\n\n  const ownLatestMessageDate = useMemo(\n    () =>\n      latestMessageDatesByChannels[channel.cid] ??\n      [...messages]\n        .sort(\n          (a, b) => (b.created_at as Date)?.getTime() - (a.created_at as Date)?.getTime(),\n        )\n        .find((v) => v.user?.id === client.user?.id)?.created_at,\n    [messages, client.user?.id, latestMessageDatesByChannels, channel.cid],\n  ) as Date;\n\n  useEffect(() => {\n    const timeSinceOwnLastMessage = ownLatestMessageDate\n      ? // prevent negative values\n        Math.max(0, (new Date().getTime() - ownLatestMessageDate.getTime()) / 1000)\n      : undefined;\n\n    const remaining =\n      !skipCooldown &&\n      typeof timeSinceOwnLastMessage !== 'undefined' &&\n      cooldownInterval > timeSinceOwnLastMessage\n        ? Math.round(cooldownInterval - timeSinceOwnLastMessage)\n        : 0;\n\n    setCooldownRemaining(remaining);\n\n    if (!remaining) return;\n\n    const timeout = setTimeout(() => {\n      setCooldownRemaining(0);\n    }, remaining * 1000);\n\n    return () => {\n      clearTimeout(timeout);\n    };\n  }, [cooldownInterval, ownLatestMessageDate, skipCooldown]);\n\n  return {\n    cooldownInterval,\n    cooldownRemaining,\n    setCooldownRemaining,\n  };\n};\n", "import { useEffect, useRef } from 'react';\nimport type { MessageInputProps } from '../MessageInput';\n\nexport const useTextareaRef = (props: MessageInputProps) => {\n  const { focus } = props;\n  const textareaRef = useRef<HTMLTextAreaElement>(undefined);\n  // Focus\n  useEffect(() => {\n    if (focus && textareaRef.current) {\n      textareaRef.current.focus();\n    }\n  }, [focus]);\n\n  return {\n    textareaRef,\n  };\n};\n", "import { useCallback } from 'react';\nimport { MessageComposer } from 'stream-chat';\nimport { useMessageComposer } from './useMessageComposer';\nimport { useChannelActionContext } from '../../../context/ChannelActionContext';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\nimport type { MessageInputProps } from '../MessageInput';\n\nconst takeStateSnapshot = (messageComposer: MessageComposer) => {\n  const textComposerState = messageComposer.textComposer.state.getLatestValue();\n  const attachmentManagerState = messageComposer.attachmentManager.state.getLatestValue();\n  const linkPreviewsManagerState =\n    messageComposer.linkPreviewsManager.state.getLatestValue();\n  const pollComposerState = messageComposer.pollComposer.state.getLatestValue();\n  const customDataManagerState = messageComposer.customDataManager.state.getLatestValue();\n  const state = messageComposer.state.getLatestValue();\n\n  return () => {\n    messageComposer.state.next(state);\n    messageComposer.textComposer.state.next(textComposerState);\n    messageComposer.attachmentManager.state.next(attachmentManagerState);\n    messageComposer.linkPreviewsManager.state.next(linkPreviewsManagerState);\n    messageComposer.pollComposer.state.next(pollComposerState);\n    messageComposer.customDataManager.state.next(customDataManagerState);\n  };\n};\n\nexport const useSubmitHandler = (props: MessageInputProps) => {\n  const { clearEditingState, overrideSubmitHandler } = props;\n\n  const { addNotification, editMessage, sendMessage } =\n    useChannelActionContext('useSubmitHandler');\n  const { t } = useTranslationContext('useSubmitHandler');\n  const messageComposer = useMessageComposer();\n\n  const handleSubmit = useCallback(\n    async (event?: React.BaseSyntheticEvent) => {\n      event?.preventDefault();\n      const composition = await messageComposer.compose();\n      if (!composition || !composition.message) return;\n\n      const { localMessage, message, sendOptions } = composition;\n\n      if (messageComposer.editedMessage && localMessage.type !== 'error') {\n        try {\n          await editMessage(localMessage, sendOptions);\n          clearEditingState?.();\n        } catch (err) {\n          addNotification(t('Edit message request failed'), 'error');\n        }\n      } else {\n        const restoreComposerStateSnapshot = takeStateSnapshot(messageComposer);\n        try {\n          // FIXME: once MessageComposer has sendMessage method, then the following condition should be encapsulated by it\n          // keep attachments, text, quoted message (treat them as draft) ... if sending a poll\n          const sentPollMessage = !!message.poll_id;\n          if (sentPollMessage) {\n            messageComposer.state.partialNext({\n              id: MessageComposer.generateId(),\n              pollId: null,\n            });\n          } else {\n            messageComposer.clear();\n          }\n          // todo: get rid of overrideSubmitHandler once MessageComposer supports submission flow\n          if (overrideSubmitHandler) {\n            await overrideSubmitHandler({\n              cid: messageComposer.channel.cid,\n              localMessage,\n              message,\n              sendOptions,\n            });\n          } else {\n            await sendMessage({ localMessage, message, options: sendOptions });\n          }\n          if (messageComposer.config.text.publishTypingEvents)\n            await messageComposer.channel.stopTyping();\n        } catch (err) {\n          restoreComposerStateSnapshot();\n          addNotification(t('Send message request failed'), 'error');\n        }\n      }\n    },\n    [\n      addNotification,\n      clearEditingState,\n      editMessage,\n      messageComposer,\n      overrideSubmitHandler,\n      sendMessage,\n      t,\n    ],\n  );\n\n  return { handleSubmit };\n};\n", "import { useCallback } from 'react';\nimport { useMessageComposer } from './useMessageComposer';\nimport { dataTransferItemsToFiles } from '../../ReactFileUtilities';\n\nexport const usePasteHandler = () => {\n  const { attachmentManager, textComposer } = useMessageComposer();\n  const onPaste = useCallback(\n    (clipboardEvent: React.ClipboardEvent<HTMLTextAreaElement>) => {\n      (async (event) => {\n        const { items } = event.clipboardData;\n        event.preventDefault();\n        // Get a promise for the plain text in case no files are\n        // found. This needs to be done here because chrome cleans\n        // up the DataTransferItems after resolving of a promise.\n        let plainTextPromise: Promise<string> | undefined = undefined;\n        for (let i = 0; i < items.length; i++) {\n          const item = items[i];\n          if (item.kind === 'string' && item.type === 'text/plain') {\n            plainTextPromise = new Promise((resolve) => {\n              item.getAsString((string) => {\n                resolve(string);\n              });\n            });\n            break;\n          }\n        }\n\n        const fileLikes = await dataTransferItemsToFiles(Array.from(items));\n\n        if (plainTextPromise) {\n          const pastedText = await plainTextPromise;\n          textComposer.insertText({ text: pastedText });\n        } else {\n          attachmentManager.uploadFiles(fileLikes);\n        }\n      })(clipboardEvent);\n    },\n    [attachmentManager, textComposer],\n  );\n\n  return { onPaste };\n};\n", "import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { MediaRecorderController } from '../classes';\nimport { useTranslationContext } from '../../../context';\nimport { useMessageComposer } from '../../MessageInput';\n\nimport type { LocalVoiceRecordingAttachment } from 'stream-chat';\nimport type { CustomAudioRecordingConfig, MediaRecordingState } from '../classes';\nimport type { MessageInputContextValue } from '../../../context';\n\nexport type RecordingController = {\n  completeRecording: () => void;\n  permissionState?: PermissionState;\n  recorder?: MediaRecorderController;\n  recording?: LocalVoiceRecordingAttachment;\n  recordingState?: MediaRecordingState;\n};\n\ntype UseMediaRecorderParams = Pick<\n  MessageInputContextValue,\n  'asyncMessagesMultiSendEnabled' | 'handleSubmit'\n> & {\n  enabled: boolean;\n  generateRecordingTitle?: (mimeType: string) => string;\n  recordingConfig?: CustomAudioRecordingConfig;\n};\n\nexport const useMediaRecorder = ({\n  asyncMessagesMultiSendEnabled,\n  enabled,\n  generateRecordingTitle,\n  handleSubmit,\n  recordingConfig,\n}: UseMediaRecorderParams): RecordingController => {\n  const { t } = useTranslationContext('useMediaRecorder');\n  const messageComposer = useMessageComposer();\n  const [recording, setRecording] = useState<LocalVoiceRecordingAttachment>();\n  const [recordingState, setRecordingState] = useState<MediaRecordingState>();\n  const [permissionState, setPermissionState] = useState<PermissionState>();\n  const [isScheduledForSubmit, scheduleForSubmit] = useState(false);\n\n  const recorder = useMemo(\n    () =>\n      enabled\n        ? new MediaRecorderController({\n            config: recordingConfig ?? {},\n            generateRecordingTitle,\n            t,\n          })\n        : undefined,\n    [recordingConfig, enabled, generateRecordingTitle, t],\n  );\n\n  const completeRecording = useCallback(async () => {\n    if (!recorder) return;\n    const recording = await recorder.stop();\n    if (!recording) return;\n    await messageComposer.attachmentManager.uploadAttachment(recording);\n    if (!asyncMessagesMultiSendEnabled) {\n      // FIXME: cannot call handleSubmit() directly as the function has stale reference to attachments\n      scheduleForSubmit(true);\n    }\n    recorder.cleanUp();\n  }, [asyncMessagesMultiSendEnabled, messageComposer, recorder]);\n\n  useEffect(() => {\n    if (!isScheduledForSubmit) return;\n    handleSubmit();\n    scheduleForSubmit(false);\n  }, [handleSubmit, isScheduledForSubmit]);\n\n  useEffect(() => {\n    if (!recorder) return;\n    recorder.permission.watch();\n    const recordingSubscription = recorder.recording.subscribe(setRecording);\n    const recordingStateSubscription =\n      recorder.recordingState.subscribe(setRecordingState);\n    const permissionStateSubscription =\n      recorder.permission.state.subscribe(setPermissionState);\n\n    return () => {\n      recorder.cancel();\n      recorder.permission.unwatch();\n      recordingSubscription.unsubscribe();\n      recordingStateSubscription.unsubscribe();\n      permissionStateSubscription.unsubscribe();\n    };\n  }, [recorder]);\n\n  return {\n    completeRecording,\n    permissionState,\n    recorder,\n    recording,\n    recordingState,\n  };\n};\n", "export interface SubscriptionLike {\n  closed: boolean;\n\n  unsubscribe(): void;\n}\n\nexport class Subscription implements SubscriptionLike {\n  closed = false;\n  private _unsubscribe: (() => void) | undefined;\n\n  constructor(unsubscribe?: () => void) {\n    this._unsubscribe = unsubscribe;\n  }\n\n  unsubscribe() {\n    this.closed = true;\n    this._unsubscribe?.();\n  }\n}\n", "type Next<T> = (value: T) => void;\nexport type Observer<T> = {\n  next(value: T): void;\n  complete?(): void;\n  error?(error: Error): void;\n};\nexport type ObserverOrNext<T> = Next<T> | Observer<T>;\n\nexport function createObserver<T>(observerOrNext: ObserverOrNext<T>): Observer<T> {\n  return typeof observerOrNext === 'function' ? { next: observerOrNext } : observerOrNext;\n}\n", "import type { ObserverOrNext } from './Observer';\nimport { createObserver } from './Observer';\nimport { Subscription } from './Subscription';\n\nexport interface Unsubscribable {\n  unsubscribe(): void;\n}\n\ntype Producer<T> = (observer: ObserverOrNext<T>) => Subscription;\n\nexport interface Subscribable<T> {\n  subscribe(observerOrNext: ObserverOrNext<T>): Unsubscribable;\n}\n\nexport class Observable<T> implements Subscribable<T> {\n  protected _closed = false;\n  private _producer: Producer<T> | undefined;\n\n  constructor(producer?: Producer<T>) {\n    if (producer) this._producer = producer;\n  }\n\n  get closed() {\n    return this._closed;\n  }\n\n  subscribe(observerOrNext: ObserverOrNext<T>): Subscription {\n    const observer = createObserver<T>(observerOrNext);\n    if (!this.closed) {\n      this._producer?.(observer);\n    }\n    return new Subscription(() => {\n      this._closed = true;\n    });\n  }\n}\n", "import { Observable } from './Observable';\nimport type { SubscriptionLike } from './Subscription';\nimport { Subscription } from './Subscription';\nimport type { Observer, ObserverOrNext } from './Observer';\nimport { createObserver } from './Observer';\n\nexport class Subject<T> extends Observable<T> implements SubscriptionLike {\n  private _observers: Map<number, Observer<T>> = new Map();\n  private _observerCounter = 0;\n  thrownError: Error | undefined;\n\n  constructor() {\n    super();\n  }\n\n  get observers() {\n    return Array.from(this._observers.values());\n  }\n\n  next(value: T) {\n    if (this.closed) return;\n    const observers = this.observers;\n    for (let i = 0; i < observers.length; i++) {\n      observers[i].next(value);\n    }\n  }\n\n  error(err: Error) {\n    if (this.closed) return;\n    this.thrownError = err;\n    const { observers } = this;\n    for (let i = 0; i < observers.length; i++) {\n      observers[i].error?.(err);\n    }\n    this._observers.clear();\n  }\n\n  complete() {\n    if (this.closed) return;\n    this._closed = true;\n    const { observers } = this;\n    for (let i = 0; i < observers.length; i++) {\n      observers[i].complete?.();\n    }\n    this._observers.clear();\n  }\n\n  subscribe(observerOrNext: ObserverOrNext<T>): Subscription {\n    const observer = createObserver<T>(observerOrNext);\n    if (this.thrownError || this.closed) {\n      const subscription = new Subscription();\n      subscription.closed = true;\n      return subscription;\n    }\n\n    const observerId = this._observerCounter++;\n    this._observers.set(observerId, observer);\n    return new Subscription(() => {\n      this._observers.delete(observerId);\n    });\n  }\n\n  unsubscribe(): void {\n    this._closed = true;\n    this._observers.clear();\n  }\n}\n", "import { Subject } from './Subject';\nimport type { ObserverOrNext } from './Observer';\nimport { createObserver } from './Observer';\nimport type { Subscription } from './Subscription';\n\nexport class BehaviorSubject<T> extends Subject<T> {\n  constructor(private _value: T) {\n    super();\n  }\n\n  get value(): T {\n    const { _value, thrownError } = this;\n    if (thrownError) {\n      throw thrownError;\n    }\n    return _value;\n  }\n\n  subscribe(observerOrNext: ObserverOrNext<T>): Subscription {\n    const observer = createObserver<T>(observerOrNext);\n    const subscription = super.subscribe(observerOrNext);\n    if (!subscription.closed) observer.next(this._value);\n    return subscription;\n  }\n\n  next(value: T): void {\n    super.next((this._value = value));\n  }\n}\n", "import type { RecordedMediaType } from '../../ReactFileUtilities';\nimport type { ChangeEvent } from 'react';\nimport { Subscription } from '../observable/Subscription';\nimport { Subject } from '../observable/Subject';\nimport { BehaviorSubject } from '../observable/BehaviorSubject';\n\nexport enum RecordingPermission {\n  CAM = 'camera',\n  MIC = 'microphone',\n}\n\nconst MEDIA_TO_PERMISSION: Record<RecordedMediaType, RecordingPermission> = {\n  audio: RecordingPermission.MIC,\n  video: RecordingPermission.CAM,\n};\n\nexport type BrowserPermissionOptions = {\n  mediaType: RecordedMediaType;\n};\n\nexport class BrowserPermission {\n  name: string;\n  state = new BehaviorSubject<PermissionState | undefined>(undefined);\n  status = new BehaviorSubject<PermissionStatus | undefined>(undefined);\n  error = new Subject<Error | undefined>();\n\n  private changeSubscriptions: Subscription[] = [];\n\n  constructor({ mediaType }: BrowserPermissionOptions) {\n    this.name = MEDIA_TO_PERMISSION[mediaType];\n  }\n\n  get isWatching() {\n    return this.changeSubscriptions.some((subscription) => !subscription.closed);\n  }\n\n  async watch() {\n    if (!this.status.value) {\n      await this.check();\n      if (!this.status.value) return;\n    }\n\n    const status = this.status.value;\n    const handlePermissionChange = (e: Event) => {\n      const { state } = (e as unknown as ChangeEvent<PermissionStatus>).target;\n      this.state.next(state);\n    };\n    status.addEventListener('change', handlePermissionChange);\n\n    this.changeSubscriptions.push(\n      new Subscription(() => {\n        status.removeEventListener('change', handlePermissionChange);\n      }),\n    );\n  }\n\n  unwatch() {\n    this.changeSubscriptions.forEach((subscription) => subscription.unsubscribe());\n  }\n\n  async check() {\n    if (!this.name) {\n      this.error.next(new Error('Unknown media recording permission'));\n      return;\n    }\n\n    let permissionState: PermissionState;\n    try {\n      const permissionStatus = await navigator.permissions.query({\n        name: this.name as unknown as PermissionName,\n      });\n      permissionState = permissionStatus.state;\n      this.status.next(permissionStatus);\n    } catch (e) {\n      // permission does not exist - cannot be queried\n      // an example would be Firefox - camera, neither microphone perms can be queried\n      permissionState = 'granted' as PermissionState;\n    }\n    this.state.next(permissionState);\n  }\n}\n", "import fixWebmDuration from 'fix-webm-duration';\nimport { nanoid } from 'nanoid';\nimport {\n  AmplitudeRecorder,\n  DEFAULT_AMPLITUDE_RECORDER_CONFIG,\n} from './AmplitudeRecorder';\nimport { BrowserPermission } from './BrowserPermission';\nimport { BehaviorSubject, Subject } from '../observable';\nimport type { TranscoderConfig } from '../transcode';\nimport { transcode } from '../transcode';\nimport { resampleWaveformData } from '../../Attachment';\nimport type { RecordedMediaType } from '../../ReactFileUtilities';\nimport {\n  createFileFromBlobs,\n  getExtensionFromMimeType,\n  getRecordedMediaTypeFromMimeType,\n} from '../../ReactFileUtilities';\nimport { defaultTranslatorFunction } from '../../../i18n';\nimport { mergeDeepUndefined } from '../../../utils/mergeDeep';\nimport type { LocalVoiceRecordingAttachment } from 'stream-chat';\nimport type { AmplitudeRecorderConfig } from './AmplitudeRecorder';\nimport type { TranslationContextValue } from '../../../context';\n\nexport const RECORDED_MIME_TYPE_BY_BROWSER = {\n  audio: {\n    others: 'audio/webm',\n    safari: 'audio/mp4;codecs=mp4a.40.2',\n  },\n} as const;\n\nexport const DEFAULT_AUDIO_TRANSCODER_CONFIG: TranscoderConfig = {\n  sampleRate: 16000,\n} as const;\n\nconst disposeOfMediaStream = (stream?: MediaStream) => {\n  if (!stream?.active) return;\n  stream.getTracks().forEach((track) => {\n    track.stop();\n    stream.removeTrack(track);\n  });\n};\n\nconst logError = (e?: Error) => e && console.error('[MEDIA RECORDER ERROR]', e);\n\ntype MediaRecorderConfig = Omit<MediaRecorderOptions, 'mimeType'> &\n  Required<Pick<MediaRecorderOptions, 'mimeType'>>;\n\nexport type AudioRecorderConfig = {\n  amplitudeRecorderConfig: AmplitudeRecorderConfig;\n  mediaRecorderConfig: MediaRecorderOptions;\n  transcoderConfig: TranscoderConfig;\n};\n\ntype PartialValues<T> = { [P in keyof T]?: Partial<T[P]> };\n\nexport type CustomAudioRecordingConfig = PartialValues<AudioRecorderConfig>;\n\nexport type AudioRecorderOptions = {\n  config?: CustomAudioRecordingConfig;\n  generateRecordingTitle?: (mimeType: string) => string;\n  t?: TranslationContextValue['t'];\n};\n\nexport enum MediaRecordingState {\n  PAUSED = 'paused',\n  RECORDING = 'recording',\n  STOPPED = 'stopped',\n}\n\nexport enum RecordingAttachmentType {\n  VOICE_RECORDING = 'voiceRecording',\n}\n\nexport class MediaRecorderController {\n  permission: BrowserPermission;\n  mediaRecorder: MediaRecorder | undefined;\n  amplitudeRecorder: AmplitudeRecorder | undefined;\n\n  amplitudeRecorderConfig: AmplitudeRecorderConfig;\n  mediaRecorderConfig: MediaRecorderConfig;\n  transcoderConfig: TranscoderConfig;\n\n  startTime: number | undefined;\n  recordedChunkDurations: number[] = [];\n  recordedData: Blob[] = [];\n  recordingUri: string | undefined;\n  mediaType: RecordedMediaType;\n\n  signalRecordingReady: ((r: LocalVoiceRecordingAttachment) => void) | undefined;\n\n  recordingState = new BehaviorSubject<MediaRecordingState | undefined>(undefined);\n  recording = new BehaviorSubject<LocalVoiceRecordingAttachment | undefined>(undefined);\n  error = new Subject<Error | undefined>();\n  notification = new Subject<{ text: string; type: 'success' | 'error' } | undefined>();\n\n  customGenerateRecordingTitle: ((mimeType: string) => string) | undefined;\n  t: TranslationContextValue['t'];\n\n  constructor({ config, generateRecordingTitle, t }: AudioRecorderOptions = {}) {\n    this.t = t || defaultTranslatorFunction;\n\n    this.amplitudeRecorderConfig = mergeDeepUndefined(\n      { ...config?.amplitudeRecorderConfig },\n      DEFAULT_AMPLITUDE_RECORDER_CONFIG,\n    );\n\n    this.mediaRecorderConfig = mergeDeepUndefined(\n      { ...config?.mediaRecorderConfig },\n      {\n        mimeType: MediaRecorder.isTypeSupported('audio/webm')\n          ? RECORDED_MIME_TYPE_BY_BROWSER.audio.others\n          : RECORDED_MIME_TYPE_BY_BROWSER.audio.safari,\n      },\n    );\n\n    this.transcoderConfig = mergeDeepUndefined(\n      { ...config?.transcoderConfig },\n      DEFAULT_AUDIO_TRANSCODER_CONFIG,\n    );\n\n    const mediaType = getRecordedMediaTypeFromMimeType(this.mediaRecorderConfig.mimeType);\n    if (!mediaType) {\n      throw new Error(\n        `Unsupported media type (supported audio or video only). Provided mimeType: ${this.mediaRecorderConfig.mimeType}`,\n      );\n    }\n    this.mediaType = mediaType;\n\n    this.permission = new BrowserPermission({ mediaType });\n\n    this.customGenerateRecordingTitle = generateRecordingTitle;\n  }\n\n  get durationMs() {\n    return this.recordedChunkDurations.reduce((acc, val) => acc + val, 0);\n  }\n\n  generateRecordingTitle = (mimeType: string) => {\n    if (this.customGenerateRecordingTitle) {\n      return this.customGenerateRecordingTitle(mimeType);\n    }\n    return `${this.mediaType}_recording_${new Date().toISOString()}.${getExtensionFromMimeType(\n      mimeType,\n    )}`; // extension needed so that desktop Safari can play the asset\n  };\n\n  makeVoiceRecording = async () => {\n    if (this.recordingUri) URL.revokeObjectURL(this.recordingUri);\n\n    if (!this.recordedData.length) return;\n    const { mimeType } = this.mediaRecorderConfig;\n    let blob = new Blob(this.recordedData, { type: mimeType });\n    if (mimeType.match('audio/webm')) {\n      // The browser does not include duration metadata with the recorded blob\n      blob = await fixWebmDuration(blob, this.durationMs, {\n        logger: () => null, // prevents polluting the browser console\n      });\n    }\n    if (!mimeType.match('audio/mp4')) {\n      blob = await transcode({\n        blob,\n        ...this.transcoderConfig,\n      });\n    }\n\n    if (!blob) return;\n\n    this.recordingUri = URL.createObjectURL(blob);\n    const file = createFileFromBlobs({\n      blobsArray: [blob],\n      fileName: this.generateRecordingTitle(blob.type),\n      mimeType: blob.type,\n    });\n\n    return {\n      asset_url: this.recordingUri,\n      duration: this.durationMs / 1000,\n      file_size: blob.size,\n      localMetadata: {\n        file,\n        id: nanoid(),\n      },\n      mime_type: blob.type,\n      title: file.name,\n      type: RecordingAttachmentType.VOICE_RECORDING,\n      waveform_data: resampleWaveformData(\n        this.amplitudeRecorder?.amplitudes.value ?? [],\n        this.amplitudeRecorderConfig.sampleCount,\n      ),\n    } as LocalVoiceRecordingAttachment;\n  };\n\n  handleErrorEvent = (e: Event) => {\n    const { error } = e as ErrorEvent;\n    logError(error);\n    this.error.next(error);\n    this.notification.next({\n      text: this.t('An error has occurred during recording'),\n      type: 'error',\n    });\n  };\n\n  handleDataavailableEvent = async (e: BlobEvent) => {\n    if (!e.data.size) return;\n    if (this.mediaType !== 'audio') return;\n    try {\n      this.recordedData.push(e.data);\n      const recording = await this.makeVoiceRecording();\n      if (!recording) return;\n      this.signalRecordingReady?.(recording);\n      this.recording.next(recording);\n    } catch (e) {\n      logError(e as Error);\n      this.error.next(e as Error);\n      this.notification.next({\n        text: this.t('An error has occurred during the recording processing'),\n        type: 'error',\n      });\n    }\n  };\n\n  resetRecordingState = () => {\n    this.recordedData = [];\n    this.recording.next(undefined);\n    this.recordingState.next(undefined);\n    this.recordedChunkDurations = [];\n    this.startTime = undefined;\n  };\n\n  cleanUp = () => {\n    this.resetRecordingState();\n    if (this.recordingUri) URL.revokeObjectURL(this.recordingUri);\n    this.amplitudeRecorder?.close();\n    if (this.mediaRecorder) {\n      disposeOfMediaStream(this.mediaRecorder.stream);\n      this.mediaRecorder.removeEventListener(\n        'dataavailable',\n        this.handleDataavailableEvent,\n      );\n      this.mediaRecorder.removeEventListener('error', this.handleErrorEvent);\n    }\n  };\n\n  start = async () => {\n    if (\n      [MediaRecordingState.RECORDING, MediaRecordingState.PAUSED].includes(\n        this.recordingState.value as MediaRecordingState,\n      )\n    ) {\n      const error = new Error('Cannot start recording. Recording already in progress');\n      logError(error);\n      this.error.next(error);\n      return;\n    }\n\n    // account for requirement on iOS as per this bug report: https://bugs.webkit.org/show_bug.cgi?id=252303\n    if (!navigator.mediaDevices) {\n      const error = new Error('Media recording is not supported');\n      logError(error);\n      this.error.next(error);\n      this.notification.next({ text: this.t('Error starting recording'), type: 'error' });\n      return;\n    }\n\n    if (this.mediaType === 'video') {\n      const error = new Error(\n        `Video recording is not supported. Provided MIME type: ${this.mediaRecorderConfig.mimeType}`,\n      );\n      logError(error);\n      this.error.next(error);\n      this.notification.next({ text: this.t('Error starting recording'), type: 'error' });\n      return;\n    }\n\n    if (!this.permission.state.value) {\n      await this.permission.check();\n    }\n\n    if (this.permission.state.value === 'denied') {\n      logError(new Error('Permission denied'));\n      return;\n    }\n\n    try {\n      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      this.mediaRecorder = new MediaRecorder(stream, this.mediaRecorderConfig);\n\n      this.mediaRecorder.addEventListener('dataavailable', this.handleDataavailableEvent);\n      this.mediaRecorder.addEventListener('error', this.handleErrorEvent);\n\n      this.startTime = new Date().getTime();\n      this.mediaRecorder.start();\n\n      if (this.mediaType === 'audio' && stream) {\n        this.amplitudeRecorder = new AmplitudeRecorder({\n          config: this.amplitudeRecorderConfig,\n          stream,\n        });\n        this.amplitudeRecorder.start();\n      }\n\n      this.recordingState.next(MediaRecordingState.RECORDING);\n    } catch (error) {\n      logError(error as Error);\n      this.cancel();\n      this.error.next(error as Error);\n      this.notification.next({ text: this.t('Error starting recording'), type: 'error' });\n    }\n  };\n\n  pause = () => {\n    if (this.recordingState.value !== MediaRecordingState.RECORDING) return;\n    if (this.startTime) {\n      this.recordedChunkDurations.push(new Date().getTime() - this.startTime);\n      this.startTime = undefined;\n    }\n    this.mediaRecorder?.pause();\n    this.amplitudeRecorder?.stop();\n    this.recordingState.next(MediaRecordingState.PAUSED);\n  };\n\n  resume = () => {\n    if (this.recordingState.value !== MediaRecordingState.PAUSED) return;\n    this.startTime = new Date().getTime();\n    this.mediaRecorder?.resume();\n    this.amplitudeRecorder?.start();\n    this.recordingState.next(MediaRecordingState.RECORDING);\n  };\n\n  stop = () => {\n    const recording = this.recording.value;\n    if (recording) return Promise.resolve(recording);\n\n    if (\n      ![MediaRecordingState.PAUSED, MediaRecordingState.RECORDING].includes(\n        (this.mediaRecorder?.state || '') as MediaRecordingState,\n      )\n    )\n      return Promise.resolve(undefined);\n\n    if (this.startTime) {\n      this.recordedChunkDurations.push(new Date().getTime() - this.startTime);\n      this.startTime = undefined;\n    }\n    const result = new Promise<LocalVoiceRecordingAttachment>((res) => {\n      this.signalRecordingReady = res;\n    });\n    this.mediaRecorder?.stop();\n    this.amplitudeRecorder?.stop();\n    this.recordingState.next(MediaRecordingState.STOPPED);\n    return result;\n  };\n\n  cancel = () => {\n    this.stop();\n    this.cleanUp();\n  };\n}\n", "import mergeWith from 'lodash.mergewith';\n\nconst overrideEverything = (_: unknown, source: unknown) => source;\n\nexport const mergeDeep = <TObject, TSource>(target: TObject, source: TSource) =>\n  mergeWith<TObject, TSource>(target, source, overrideEverything);\n\nconst overrideUndefinedOnly = (object: unknown, source: unknown) => object ?? source;\n\nexport const mergeDeepUndefined = <TObject, TSource>(target: TObject, source: TSource) =>\n  mergeWith<TObject, TSource>(target, source, overrideUndefinedOnly);\n", "import { BehaviorSubject } from '../observable/BehaviorSubject';\nimport { Subject } from '../observable/Subject';\nimport { mergeDeepUndefined } from '../../../utils/mergeDeep';\n\nconst MAX_FREQUENCY_AMPLITUDE = 255 as const;\n\nconst logError = (e?: Error) => e && console.error('[AMPLITUDE RECORDER ERROR]', e);\n\nconst rootMeanSquare = (values: Uint8Array) =>\n  Math.sqrt(values.reduce((acc, val) => acc + Math.pow(val, 2), 0) / values.length);\n\n/**\n * fftSize\n * An unsigned integer, representing the window size of the FFT, given in number of samples.\n * A higher value will result in more details in the frequency domain but fewer details\n * in the amplitude domain.\n *\n * Must be a power of 2 between 2^5 and 2^15, so one of: 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, and 32768.\n * Defaults to 32.\n *\n * maxDecibels\n * A double, representing the maximum decibel value for scaling the FFT analysis data,\n * where 0 dB is the loudest possible sound, -10 dB is a 10th of that, etc.\n * The default value is -30 dB.\n *\n * minDecibels\n * A double, representing the minimum decibel value for scaling the FFT analysis data,\n * where 0 dB is the loudest possible sound, -10 dB is a 10th of that, etc.\n * The default value is -100 dB.\n */\nexport type AmplitudeAnalyserConfig = Pick<\n  AnalyserNode,\n  'fftSize' | 'maxDecibels' | 'minDecibels'\n>;\nexport type AmplitudeRecorderConfig = {\n  analyserConfig: AmplitudeAnalyserConfig;\n  sampleCount: number;\n  samplingFrequencyMs: number;\n};\n\nexport const DEFAULT_AMPLITUDE_RECORDER_CONFIG: AmplitudeRecorderConfig = {\n  analyserConfig: {\n    fftSize: 32,\n    maxDecibels: 0,\n    minDecibels: -100,\n  } as AmplitudeAnalyserConfig,\n  sampleCount: 100,\n  samplingFrequencyMs: 60,\n};\n\ntype AmplitudeAnalyserOptions = {\n  stream: MediaStream;\n  config?: AmplitudeRecorderConfig;\n};\n\nexport enum AmplitudeRecorderState {\n  CLOSED = 'closed',\n  RECORDING = 'recording',\n  STOPPED = 'stopped',\n}\n\nexport class AmplitudeRecorder {\n  audioContext: AudioContext | undefined;\n  analyserNode: AnalyserNode | undefined;\n  microphone: MediaStreamAudioSourceNode | undefined;\n  stream: MediaStream;\n\n  config: AmplitudeRecorderConfig;\n\n  amplitudeSamplingInterval: ReturnType<typeof setInterval> | undefined;\n\n  amplitudes = new BehaviorSubject<number[]>([]);\n  state = new BehaviorSubject<AmplitudeRecorderState | undefined>(undefined);\n  error = new Subject<Error | undefined>();\n\n  constructor({ config, stream }: AmplitudeAnalyserOptions) {\n    this.config = mergeDeepUndefined({ ...config }, DEFAULT_AMPLITUDE_RECORDER_CONFIG);\n    this.stream = stream;\n  }\n\n  init() {\n    this.audioContext = new AudioContext();\n    this.analyserNode = this.audioContext.createAnalyser();\n    const { analyserConfig } = this.config;\n    this.analyserNode.fftSize = analyserConfig.fftSize;\n    this.analyserNode.maxDecibels = analyserConfig.maxDecibels;\n    this.analyserNode.minDecibels = analyserConfig.minDecibels;\n\n    this.microphone = this.audioContext.createMediaStreamSource(this.stream);\n    this.microphone.connect(this.analyserNode);\n  }\n\n  stop() {\n    clearInterval(this.amplitudeSamplingInterval);\n    this.amplitudeSamplingInterval = undefined;\n    this.state.next(AmplitudeRecorderState.STOPPED);\n  }\n\n  start = () => {\n    if (this.state.value === AmplitudeRecorderState.CLOSED) return;\n    if (!this.stream) {\n      throw new Error(\n        'Missing MediaStream instance. Cannot to start amplitude recording',\n      );\n    }\n\n    if (this.state.value === AmplitudeRecorderState.RECORDING) this.stop();\n\n    if (!this.analyserNode) {\n      if (!this.stream) return;\n      this.init();\n    }\n\n    this.state.next(AmplitudeRecorderState.RECORDING);\n\n    this.amplitudeSamplingInterval = setInterval(() => {\n      if (!(this.analyserNode && this.state.value === AmplitudeRecorderState.RECORDING))\n        return;\n      const frequencyBins = new Uint8Array(this.analyserNode.frequencyBinCount);\n      try {\n        this.analyserNode.getByteFrequencyData(frequencyBins);\n      } catch (e) {\n        logError(e as Error);\n        this.error.next(e as Error);\n        return;\n      }\n      const normalizedSignalStrength =\n        rootMeanSquare(frequencyBins) / MAX_FREQUENCY_AMPLITUDE;\n      this.amplitudes.next([...this.amplitudes.value, normalizedSignalStrength]);\n    }, this.config.samplingFrequencyMs);\n  };\n\n  close() {\n    if (this.state.value !== AmplitudeRecorderState.STOPPED) this.stop();\n    this.state.next(AmplitudeRecorderState.CLOSED);\n    this.amplitudes.next([]);\n    this.microphone?.disconnect();\n    this.analyserNode?.disconnect();\n    if (this.audioContext?.state !== 'closed') this.audioContext?.close();\n  }\n}\n", "import { readFileAsArrayBuffer } from '../../ReactFileUtilities';\n\n/**\n * In the context of resampling audio data, AudioContext is used to decode the input audio file into an AudioBuffer,\n * which is a fundamental data structure representing audio data.\n * @param file\n */\nexport const toAudioBuffer = async (file: File) => {\n  const audioCtx = new AudioContext();\n\n  const arrayBuffer = await readFileAsArrayBuffer(file);\n  const decodedData = await audioCtx.decodeAudioData(arrayBuffer);\n  if (audioCtx.state !== 'closed') await audioCtx.close();\n  return decodedData;\n};\n\n/**\n * OfflineAudioContext is a specialized type of AudioContext that does not render audio in real-time and is used for offline audio processing tasks.\n * It allows performing audio processing and rendering without actually playing the audio through speakers or outputting it to a destination.\n * In the context of resampling audio data, OfflineAudioContext is used to resample the decoded AudioBuffer from a file to the desired sample rate.\n * It provides more flexibility and control over audio processing, as it can operate at different sample rates and durations compared to real-time audio contexts.\n * @param audioBuffer\n * @param sampleRate\n */\nexport const renderAudio = async (audioBuffer: AudioBuffer, sampleRate: number) => {\n  const offlineAudioCtx = new OfflineAudioContext(\n    audioBuffer.numberOfChannels,\n    audioBuffer.duration * sampleRate,\n    sampleRate,\n  );\n  const source = offlineAudioCtx.createBufferSource();\n  source.buffer = audioBuffer;\n  source.connect(offlineAudioCtx.destination);\n  source.start();\n\n  return await offlineAudioCtx.startRendering();\n};\n", "import { renderAudio, toAudioBuffer } from './audioProcessing';\n\nconst WAV_HEADER_LENGTH_BYTES = 44 as const;\nconst BYTES_PER_SAMPLE = 2 as const;\nconst RIFF_FILE_MAX_BYTES = 4294967295 as const;\n\nconst HEADER = {\n  AUDIO_FORMAT: { offset: 20, value: 1 }, // PCM = 1\n  BITS_PER_SAMPLE: { offset: 34, value: BYTES_PER_SAMPLE * 8 }, // 16 bits encoding\n  BLOCK_ALIGN: { offset: 32 },\n  BYTE_RATE: { offset: 28 },\n  CHANNEL_COUNT: { offset: 22 }, // 1 - mono, 2 - stereo\n  CHUNK_ID: { offset: 0, value: 0x52494646 }, // hex representation of string \"RIFF\" (Resource Interchange File Format) - identifies the file structure that defines a class of more specific file formats, e.g. WAVE\n  CHUNK_SIZE: { offset: 4 },\n  FILE_FORMAT: { offset: 8, value: 0x57415645 }, // hex representation of string \"WAVE\"\n  SAMPLE_RATE: { offset: 24 },\n  SUBCHUNK1_ID: { offset: 12, value: 0x666d7420 }, // hex representation of string \"fmt \" - identifies the start of \"format\" section of the header\n  SUBCHUNK1_SIZE: { offset: 16, value: 16 }, // Subchunk1 Size without SUBCHUNK1_ID and SUBCHUNK1_SIZE fields\n  SUBCHUNK2_ID: { offset: 36, value: 0x64617461 }, // hex representation of string \"data\" - identifies the start of actual audio data section\n  SUBCHUNK2_SIZE: { offset: 40 }, // actual audio data size\n} as const;\n\nconst fourCharsToInt = (chars: string) =>\n  (chars.charCodeAt(0) << 24) |\n  (chars.charCodeAt(1) << 16) |\n  (chars.charCodeAt(2) << 8) |\n  chars.charCodeAt(3);\n\nconst WAV_HEADER_FLAGS = {\n  data: fourCharsToInt('data'),\n  fmt: fourCharsToInt('fmt '),\n  RIFF: fourCharsToInt('RIFF'),\n  WAVE: fourCharsToInt('WAVE'),\n};\n\ntype WriteWaveHeaderParams = {\n  arrayBuffer: ArrayBuffer;\n  // 1 - mono, 2 - stereo\n  channelCount: number;\n  // Number of samples per second, e.g. 44100Hz\n  sampleRate: number;\n};\nconst writeWavHeader = ({\n  arrayBuffer,\n  channelCount,\n  sampleRate,\n}: WriteWaveHeaderParams) => {\n  const byteRate = sampleRate * channelCount * BYTES_PER_SAMPLE; // bytes/sec\n  const blockAlign = channelCount * BYTES_PER_SAMPLE;\n\n  const dataView = new DataView(arrayBuffer);\n  /*\n   * The maximum size of a RIFF file is 4294967295 bytes and since the header takes up 44 bytes there are 4294967251 bytes left for the\n   * data chunk.\n   */\n  const dataChunkSize = Math.min(\n    dataView.byteLength - WAV_HEADER_LENGTH_BYTES,\n    RIFF_FILE_MAX_BYTES - WAV_HEADER_LENGTH_BYTES,\n  );\n\n  dataView.setUint32(HEADER.CHUNK_ID.offset, HEADER.CHUNK_ID.value); // \"RIFF\"\n  dataView.setUint32(HEADER.CHUNK_SIZE.offset, arrayBuffer.byteLength - 8, true); // adjustment for the first two headers - chunk id + file size\n  dataView.setUint32(HEADER.FILE_FORMAT.offset, HEADER.FILE_FORMAT.value); // \"WAVE\"\n\n  dataView.setUint32(HEADER.SUBCHUNK1_ID.offset, HEADER.SUBCHUNK1_ID.value); // \"fmt \"\n  dataView.setUint32(HEADER.SUBCHUNK1_SIZE.offset, HEADER.SUBCHUNK1_SIZE.value, true);\n  dataView.setUint16(HEADER.AUDIO_FORMAT.offset, HEADER.AUDIO_FORMAT.value, true);\n  dataView.setUint16(HEADER.CHANNEL_COUNT.offset, channelCount, true);\n  dataView.setUint32(HEADER.SAMPLE_RATE.offset, sampleRate, true);\n  dataView.setUint32(HEADER.BYTE_RATE.offset, byteRate, true);\n  dataView.setUint16(HEADER.BLOCK_ALIGN.offset, blockAlign, true);\n  dataView.setUint16(HEADER.BITS_PER_SAMPLE.offset, HEADER.BITS_PER_SAMPLE.value, true);\n\n  dataView.setUint32(HEADER.SUBCHUNK2_ID.offset, HEADER.SUBCHUNK2_ID.value); // \"data\"\n  dataView.setUint32(HEADER.SUBCHUNK2_SIZE.offset, dataChunkSize, true);\n};\n\nexport const readWavHeader = (dataView: DataView) => {\n  const header = dataView.getUint32(0, false);\n  if (WAV_HEADER_FLAGS.RIFF !== header) {\n    console.error('Missing RIFF header in WAVE file');\n    return;\n  }\n  if (WAV_HEADER_FLAGS.WAVE !== dataView.getUint32(HEADER.FILE_FORMAT.offset, false)) {\n    console.error('Missing WAVE header in WAVE file');\n    return;\n  }\n  if (WAV_HEADER_FLAGS.fmt !== dataView.getUint32(HEADER.SUBCHUNK1_ID.offset, false)) {\n    console.error('Missing fmt header in WAVE file');\n    return;\n  }\n\n  return {\n    audioDataSizeBytes: dataView.getUint32(HEADER.SUBCHUNK2_SIZE.offset, true),\n    audioDataStartOffset: WAV_HEADER_LENGTH_BYTES,\n    channelCount: dataView.getUint16(HEADER.CHANNEL_COUNT.offset, true),\n    sampleRate: dataView.getUint32(HEADER.SAMPLE_RATE.offset, true),\n  };\n};\n\nconst splitDataByChannel = (audioBuffer: AudioBuffer) =>\n  Array.from({ length: audioBuffer.numberOfChannels }, (_, i) =>\n    audioBuffer.getChannelData(i),\n  );\n\ntype WriteAudioDataParams = {\n  arrayBuffer: ArrayBuffer;\n  dataByChannel: Float32Array[];\n};\n\n/**\n * In a WAV file, samples for each channel are usually interleaved, meaning samples from each channel are grouped together sequentially.\n * For example, in a stereo audio file (2 channels), samples alternate between the left and right channels.\n * @param arrayBuffer\n * @param dataByChannel\n */\nconst writeWavAudioData = ({ arrayBuffer, dataByChannel }: WriteAudioDataParams) => {\n  const dataView = new DataView(arrayBuffer);\n  const channelCount = dataByChannel.length;\n\n  dataByChannel.forEach((channelData, channelIndex) => {\n    let writeOffset = WAV_HEADER_LENGTH_BYTES + channelCount * channelIndex;\n\n    channelData.forEach((float32Value) => {\n      dataView.setInt16(\n        writeOffset,\n        float32Value < 0\n          ? Math.max(-1, float32Value) * 32768\n          : Math.min(1, float32Value) * 32767,\n        true,\n      );\n      writeOffset += channelCount * BYTES_PER_SAMPLE;\n    });\n  });\n};\n\nexport const encodeToWaw = async (file: File, sampleRate: number) => {\n  const audioBuffer = await renderAudio(await toAudioBuffer(file), sampleRate);\n  const numberOfSamples = audioBuffer.duration * sampleRate;\n  const fileSizeBytes =\n    numberOfSamples * audioBuffer.numberOfChannels * BYTES_PER_SAMPLE +\n    WAV_HEADER_LENGTH_BYTES;\n\n  const arrayBuffer = new ArrayBuffer(fileSizeBytes);\n  writeWavHeader({ arrayBuffer, channelCount: audioBuffer.numberOfChannels, sampleRate });\n  writeWavAudioData({ arrayBuffer, dataByChannel: splitDataByChannel(audioBuffer) });\n  return new Blob([arrayBuffer], { type: 'audio/wav' });\n};\n", "import { encodeToWaw } from './wav';\nimport { createFileFromBlobs, getExtensionFromMimeType } from '../../ReactFileUtilities';\n\nexport type TranscoderConfig = {\n  // defaults to 16000Hz\n  sampleRate: number;\n  // Custom encoder function that converts the recorded audio file into a blob with the desired MIME type\n  encoder?: (file: File, sampleRate: number) => Promise<Blob>;\n};\n\nexport type TranscodeParams = TranscoderConfig & {\n  blob: Blob;\n};\n\nexport const transcode = ({\n  blob,\n  encoder = encodeToWaw,\n  sampleRate,\n}: TranscodeParams): Promise<Blob> =>\n  encoder(\n    createFileFromBlobs({\n      blobsArray: [blob],\n      fileName: `audio_recording_${new Date().toISOString()}.${getExtensionFromMimeType(\n        blob.type,\n      )}`,\n      mimeType: blob.type,\n    }),\n    sampleRate,\n  );\n", "import type React from 'react';\nimport { useTextareaRef } from './useTextareaRef';\nimport { useSubmitHandler } from './useSubmitHandler';\nimport { usePasteHandler } from './usePasteHandler';\nimport type { RecordingController } from '../../MediaRecorder/hooks/useMediaRecorder';\nimport { useMediaRecorder } from '../../MediaRecorder/hooks/useMediaRecorder';\nimport type { MessageInputProps } from '../MessageInput';\n\nexport type MessageInputHookProps = {\n  handleSubmit: (event?: React.BaseSyntheticEvent) => void;\n  onPaste: (event: React.ClipboardEvent<HTMLTextAreaElement>) => void;\n  recordingController: RecordingController;\n  textareaRef: React.MutableRefObject<HTMLTextAreaElement | null | undefined>;\n};\n\nexport const useMessageInputControls = (\n  props: MessageInputProps,\n): MessageInputHookProps => {\n  const { asyncMessagesMultiSendEnabled, audioRecordingConfig, audioRecordingEnabled } =\n    props;\n\n  const { textareaRef } = useTextareaRef(props);\n\n  const { handleSubmit } = useSubmitHandler(props);\n\n  const recordingController = useMediaRecorder({\n    asyncMessagesMultiSendEnabled,\n    enabled: !!audioRecordingEnabled,\n    handleSubmit,\n    recordingConfig: audioRecordingConfig,\n  });\n\n  const { onPaste } = usePasteHandler();\n\n  return {\n    handleSubmit,\n    onPaste,\n    recordingController,\n    textareaRef,\n  };\n};\n", "import { useMessageComposer } from './useMessageComposer';\nimport { useStateStore } from '../../../store';\nimport type { EditingAuditState } from 'stream-chat';\n\nconst editingAuditStateStateSelector = (state: EditingAuditState) => state;\n\nexport const useMessageComposerHasSendableData = () => {\n  const messageComposer = useMessageComposer();\n  useStateStore(messageComposer.editingAuditState, editingAuditStateStateSelector);\n  return messageComposer.hasSendableData;\n};\n", "import type { ComponentType } from 'react';\nimport React from 'react';\nimport {\n  isLocalAttachment,\n  isLocalAudioAttachment,\n  isLocalFileAttachment,\n  isLocalImageAttachment,\n  isLocalVideoAttachment,\n  isLocalVoiceRecordingAttachment,\n  isScrapedContent,\n} from 'stream-chat';\nimport type { UnsupportedAttachmentPreviewProps } from './UnsupportedAttachmentPreview';\nimport { UnsupportedAttachmentPreview as DefaultUnknownAttachmentPreview } from './UnsupportedAttachmentPreview';\nimport type { VoiceRecordingPreviewProps } from './VoiceRecordingPreview';\nimport { VoiceRecordingPreview as DefaultVoiceRecordingPreview } from './VoiceRecordingPreview';\nimport type { FileAttachmentPreviewProps } from './FileAttachmentPreview';\nimport DefaultFilePreview from './FileAttachmentPreview';\nimport type { ImageAttachmentPreviewProps } from './ImageAttachmentPreview';\nimport { ImageAttachmentPreview as DefaultImagePreview } from './ImageAttachmentPreview';\nimport { useAttachmentsForPreview, useMessageComposer } from '../hooks';\nimport {\n  GeolocationPreview as DefaultGeolocationPreview,\n  type GeolocationPreviewProps,\n} from './GeolocationPreview';\n\nexport type AttachmentPreviewListProps = {\n  AudioAttachmentPreview?: ComponentType<FileAttachmentPreviewProps>;\n  FileAttachmentPreview?: ComponentType<FileAttachmentPreviewProps>;\n  GeolocationPreview?: ComponentType<GeolocationPreviewProps>;\n  ImageAttachmentPreview?: ComponentType<ImageAttachmentPreviewProps>;\n  UnsupportedAttachmentPreview?: ComponentType<UnsupportedAttachmentPreviewProps>;\n  VideoAttachmentPreview?: ComponentType<FileAttachmentPreviewProps>;\n  VoiceRecordingPreview?: ComponentType<VoiceRecordingPreviewProps>;\n};\n\nexport const AttachmentPreviewList = ({\n  AudioAttachmentPreview = DefaultFilePreview,\n  FileAttachmentPreview = DefaultFilePreview,\n  GeolocationPreview = DefaultGeolocationPreview,\n  ImageAttachmentPreview = DefaultImagePreview,\n  UnsupportedAttachmentPreview = DefaultUnknownAttachmentPreview,\n  VideoAttachmentPreview = DefaultFilePreview,\n  VoiceRecordingPreview = DefaultVoiceRecordingPreview,\n}: AttachmentPreviewListProps) => {\n  const messageComposer = useMessageComposer();\n\n  // todo: we could also allow to attach poll to a message composition\n  const { attachments, location } = useAttachmentsForPreview();\n\n  if (!attachments.length && !location) return null;\n\n  return (\n    <div className='str-chat__attachment-preview-list'>\n      <div\n        className='str-chat__attachment-list-scroll-container'\n        data-testid='attachment-list-scroll-container'\n      >\n        {location && (\n          <GeolocationPreview\n            location={location}\n            // It is not possible to nullify shared_location field so we do not show a preview when editing\n            // to prevent a user from wanting to remove the location\n            remove={\n              messageComposer.editedMessage\n                ? undefined\n                : messageComposer.locationComposer.initState\n            }\n          />\n        )}\n        {attachments.map((attachment) => {\n          if (isScrapedContent(attachment)) return null;\n          if (isLocalVoiceRecordingAttachment(attachment)) {\n            return (\n              <VoiceRecordingPreview\n                attachment={attachment}\n                handleRetry={messageComposer.attachmentManager.uploadAttachment}\n                key={attachment.localMetadata.id || attachment.asset_url}\n                removeAttachments={messageComposer.attachmentManager.removeAttachments}\n              />\n            );\n          } else if (isLocalAudioAttachment(attachment)) {\n            return (\n              <AudioAttachmentPreview\n                attachment={attachment}\n                handleRetry={messageComposer.attachmentManager.uploadAttachment}\n                key={attachment.localMetadata.id || attachment.asset_url}\n                removeAttachments={messageComposer.attachmentManager.removeAttachments}\n              />\n            );\n          } else if (isLocalVideoAttachment(attachment)) {\n            return (\n              <VideoAttachmentPreview\n                attachment={attachment}\n                handleRetry={messageComposer.attachmentManager.uploadAttachment}\n                key={attachment.localMetadata.id || attachment.asset_url}\n                removeAttachments={messageComposer.attachmentManager.removeAttachments}\n              />\n            );\n          } else if (isLocalImageAttachment(attachment)) {\n            return (\n              <ImageAttachmentPreview\n                attachment={attachment}\n                handleRetry={messageComposer.attachmentManager.uploadAttachment}\n                key={attachment.localMetadata.id || attachment.image_url}\n                removeAttachments={messageComposer.attachmentManager.removeAttachments}\n              />\n            );\n          } else if (isLocalFileAttachment(attachment)) {\n            return (\n              <FileAttachmentPreview\n                attachment={attachment}\n                handleRetry={messageComposer.attachmentManager.uploadAttachment}\n                key={attachment.localMetadata.id || attachment.asset_url}\n                removeAttachments={messageComposer.attachmentManager.removeAttachments}\n              />\n            );\n          } else if (isLocalAttachment(attachment)) {\n            return (\n              <UnsupportedAttachmentPreview\n                attachment={attachment}\n                handleRetry={messageComposer.attachmentManager.uploadAttachment}\n                key={attachment.localMetadata.id}\n                removeAttachments={messageComposer.attachmentManager.removeAttachments}\n              />\n            );\n          }\n          return null;\n        })}\n      </div>\n    </div>\n  );\n};\n", "import React from 'react';\nimport { isLocalUploadAttachment } from 'stream-chat';\nimport { CloseIcon, DownloadIcon, LoadingIndicatorIcon, RetryIcon } from '../icons';\nimport { FileIcon } from '../../ReactFileUtilities';\nimport { useTranslationContext } from '../../../context';\nimport type { AnyLocalAttachment, LocalUploadAttachment } from 'stream-chat';\n\nexport type UnsupportedAttachmentPreviewProps<\n  CustomLocalMetadata = Record<string, unknown>,\n> = {\n  attachment: AnyLocalAttachment<CustomLocalMetadata>;\n  handleRetry: (\n    attachment: LocalUploadAttachment,\n  ) => void | Promise<LocalUploadAttachment | undefined>;\n  removeAttachments: (ids: string[]) => void;\n};\n\nexport const UnsupportedAttachmentPreview = ({\n  attachment,\n  handleRetry,\n  removeAttachments,\n}: UnsupportedAttachmentPreviewProps) => {\n  const { t } = useTranslationContext('UnsupportedAttachmentPreview');\n  const title = attachment.title ?? t('Unsupported attachment');\n  return (\n    <div\n      className='str-chat__attachment-preview-unsupported'\n      data-testid='attachment-preview-unknown'\n    >\n      <div className='str-chat__attachment-preview-file-icon'>\n        <FileIcon filename={title} mimeType={attachment.mime_type} />\n      </div>\n\n      <button\n        aria-label={t('aria/Remove attachment')}\n        className='str-chat__attachment-preview-delete'\n        data-testid='file-preview-item-delete-button'\n        disabled={attachment.localMetadata?.uploadState === 'uploading'}\n        onClick={() =>\n          attachment.localMetadata?.id &&\n          removeAttachments([attachment.localMetadata?.id])\n        }\n        type='button'\n      >\n        <CloseIcon />\n      </button>\n\n      {isLocalUploadAttachment(attachment) &&\n        ['blocked', 'failed'].includes(attachment.localMetadata?.uploadState) &&\n        !!handleRetry && (\n          <button\n            className='str-chat__attachment-preview-error str-chat__attachment-preview-error-file'\n            data-testid='file-preview-item-retry-button'\n            onClick={() => handleRetry(attachment)}\n          >\n            <RetryIcon />\n          </button>\n        )}\n\n      <div className='str-chat__attachment-preview-metadata'>\n        <div className='str-chat__attachment-preview-title' title={title}>\n          {title}\n        </div>\n        {attachment.localMetadata?.uploadState === 'finished' &&\n          !!attachment.asset_url && (\n            <a\n              className='str-chat__attachment-preview-file-download'\n              download\n              href={attachment.asset_url}\n              rel='noreferrer'\n              target='_blank'\n            >\n              <DownloadIcon />\n            </a>\n          )}\n        {attachment.localMetadata?.uploadState === 'uploading' && (\n          <LoadingIndicatorIcon size={17} />\n        )}\n      </div>\n    </div>\n  );\n};\n", "import React, { useEffect } from 'react';\nimport { PlayButton } from '../../Attachment';\nimport { RecordingTimer } from '../../MediaRecorder';\nimport { CloseIcon, LoadingIndicatorIcon, RetryIcon } from '../icons';\nimport { FileIcon } from '../../ReactFileUtilities';\nimport type { LocalVoiceRecordingAttachment } from 'stream-chat';\nimport type { UploadAttachmentPreviewProps } from './types';\nimport { useTranslationContext } from '../../../context';\nimport { type AudioPlayerState, useAudioPlayer } from '../../AudioPlayback';\nimport { useStateStore } from '../../../store';\n\nconst audioPlayerStateSelector = (state: AudioPlayerState) => ({\n  isPlaying: state.isPlaying,\n  secondsElapsed: state.secondsElapsed,\n});\n\nexport type VoiceRecordingPreviewProps<CustomLocalMetadata = Record<string, unknown>> =\n  UploadAttachmentPreviewProps<LocalVoiceRecordingAttachment<CustomLocalMetadata>>;\n\nexport const VoiceRecordingPreview = ({\n  attachment,\n  handleRetry,\n  removeAttachments,\n}: VoiceRecordingPreviewProps) => {\n  const { t } = useTranslationContext();\n\n  const audioPlayer = useAudioPlayer({\n    mimeType: attachment.mime_type,\n    src: attachment.asset_url,\n  });\n\n  const { isPlaying, secondsElapsed } =\n    useStateStore(audioPlayer?.state, audioPlayerStateSelector) ?? {};\n\n  useEffect(() => {\n    audioPlayer?.cancelScheduledRemoval();\n    return () => {\n      audioPlayer?.scheduleRemoval();\n    };\n  }, [audioPlayer]);\n\n  if (!audioPlayer) return null;\n\n  return (\n    <div\n      className='str-chat__attachment-preview-voice-recording'\n      data-testid='attachment-preview-voice-recording'\n    >\n      <PlayButton isPlaying={!!isPlaying} onClick={audioPlayer.togglePlay} />\n\n      <button\n        aria-label={t('aria/Remove attachment')}\n        className='str-chat__attachment-preview-delete'\n        data-testid='file-preview-item-delete-button'\n        disabled={attachment.localMetadata?.uploadState === 'uploading'}\n        onClick={() =>\n          attachment.localMetadata?.id && removeAttachments([attachment.localMetadata.id])\n        }\n        type='button'\n      >\n        <CloseIcon />\n      </button>\n\n      {['blocked', 'failed'].includes(attachment.localMetadata?.uploadState) &&\n        !!handleRetry && (\n          <button\n            aria-label={t('aria/Retry upload')}\n            className='str-chat__attachment-preview-error str-chat__attachment-preview-error-file'\n            data-testid='file-preview-item-retry-button'\n            onClick={() => handleRetry(attachment)}\n          >\n            <RetryIcon />\n          </button>\n        )}\n\n      <div className='str-chat__attachment-preview-metadata'>\n        <div className='str-chat__attachment-preview-file-name' title={attachment.title}>\n          {attachment.title}\n        </div>\n        {typeof attachment.duration !== 'undefined' && (\n          <RecordingTimer durationSeconds={secondsElapsed || attachment.duration} />\n        )}\n        {attachment.localMetadata?.uploadState === 'uploading' && (\n          <LoadingIndicatorIcon size={17} />\n        )}\n      </div>\n      <div className='str-chat__attachment-preview-file-icon'>\n        <FileIcon filename={attachment.title} mimeType={attachment.mime_type} />\n      </div>\n    </div>\n  );\n};\n", "import React from 'react';\nimport { useTranslationContext } from '../../context';\n\nimport type { RecordingPermission } from './classes/BrowserPermission';\n\nexport type RecordingPermissionDeniedNotificationProps = {\n  onClose: () => void;\n  permissionName: RecordingPermission;\n};\n\nexport const RecordingPermissionDeniedNotification = ({\n  onClose,\n  permissionName,\n}: RecordingPermissionDeniedNotificationProps) => {\n  const { t } = useTranslationContext();\n  const permissionTranslations = {\n    body: {\n      camera: t('To start recording, allow the camera access in your browser'),\n      microphone: t('To start recording, allow the microphone access in your browser'),\n    },\n    heading: {\n      camera: t('Allow access to camera'),\n      microphone: t('Allow access to microphone'),\n    },\n  };\n\n  return (\n    <div className='str-chat__recording-permission-denied-notification'>\n      <div className='str-chat__recording-permission-denied-notification__heading'>\n        {permissionTranslations.heading[permissionName]}\n      </div>\n      <p className='str-chat__recording-permission-denied-notification__message'>\n        {permissionTranslations.body[permissionName]}\n      </p>\n      <div className='str-chat__recording-permission-denied-notification__dismiss-button-container'>\n        <button\n          className='str-chat__recording-permission-denied-notification__dismiss-button'\n          onClick={onClose}\n        >\n          {t('Ok')}\n        </button>\n      </div>\n    </div>\n  );\n};\n", "import React, { useMemo } from 'react';\nimport { AudioRecordingPreview } from './AudioRecordingPreview';\nimport { AudioRecordingInProgress } from './AudioRecordingInProgress';\nimport { MediaRecordingState } from '../classes';\nimport {\n  BinIcon,\n  CheckSignIcon,\n  LoadingIndicatorIcon,\n  MicIcon,\n  PauseIcon,\n  SendIcon,\n} from '../../MessageInput';\nimport { useMessageInputContext } from '../../../context/MessageInputContext';\n\nexport const AudioRecorder = () => {\n  const messageInputContext = useMessageInputContext();\n  const {\n    recordingController: { completeRecording, recorder, recording, recordingState },\n  } = messageInputContext;\n\n  const isUploadingFile = recording?.localMetadata?.uploadState === 'uploading';\n\n  const state = useMemo(\n    () => ({\n      paused: recordingState === MediaRecordingState.PAUSED,\n      recording: recordingState === MediaRecordingState.RECORDING,\n      stopped: recordingState === MediaRecordingState.STOPPED,\n    }),\n    [recordingState],\n  );\n\n  if (!recorder) return null;\n\n  return (\n    <div className='str-chat__audio_recorder-container'>\n      <div className='str-chat__audio_recorder' data-testid={'audio-recorder'}>\n        <button\n          className='str-chat__audio_recorder__cancel-button'\n          data-testid={'cancel-recording-audio-button'}\n          disabled={isUploadingFile}\n          onClick={recorder.cancel}\n        >\n          <BinIcon />\n        </button>\n\n        {state.stopped && recording?.asset_url ? (\n          <AudioRecordingPreview\n            durationSeconds={recording.duration ?? 0}\n            mimeType={recording.mime_type}\n            src={recording.asset_url}\n            waveformData={recording.waveform_data}\n          />\n        ) : state.paused || state.recording ? (\n          <AudioRecordingInProgress />\n        ) : null}\n\n        {state.paused && (\n          <button\n            className='str-chat__audio_recorder__resume-recording-button'\n            onClick={recorder.resume}\n          >\n            <MicIcon />\n          </button>\n        )}\n        {state.recording && (\n          <button\n            className='str-chat__audio_recorder__pause-recording-button'\n            data-testid={'pause-recording-audio-button'}\n            onClick={recorder.pause}\n          >\n            <PauseIcon />\n          </button>\n        )}\n        {state.stopped ? (\n          <button\n            className='str-chat__audio_recorder__complete-button'\n            data-testid='audio-recorder-complete-button'\n            disabled={isUploadingFile}\n            onClick={completeRecording}\n          >\n            {isUploadingFile ? <LoadingIndicatorIcon /> : <SendIcon />}\n          </button>\n        ) : (\n          <button\n            className='str-chat__audio_recorder__stop-button'\n            data-testid='audio-recorder-stop-button'\n            onClick={recorder.stop}\n          >\n            <CheckSignIcon />\n          </button>\n        )}\n      </div>\n    </div>\n  );\n};\n", "import React, { useEffect } from 'react';\nimport { PauseIcon, PlayIcon } from '../../MessageInput/icons';\nimport { RecordingTimer } from './RecordingTimer';\nimport { WaveProgressBar } from '../../Attachment';\nimport { type AudioPlayerState, useAudioPlayer } from '../../AudioPlayback';\nimport { useStateStore } from '../../../store';\n\nconst audioPlayerStateSelector = (state: AudioPlayerState) => ({\n  isPlaying: state.isPlaying,\n  progress: state.progressPercent,\n  secondsElapsed: state.secondsElapsed,\n});\n\nexport type AudioRecordingPlayerProps = {\n  durationSeconds: number;\n  mimeType?: string;\n  src?: string;\n  waveformData?: number[];\n};\n\nexport const AudioRecordingPreview = ({\n  durationSeconds,\n  mimeType,\n  src,\n  waveformData,\n}: AudioRecordingPlayerProps) => {\n  const audioPlayer = useAudioPlayer({\n    durationSeconds,\n    mimeType,\n    src,\n    waveformData,\n  });\n\n  const { isPlaying, progress, secondsElapsed } =\n    useStateStore(audioPlayer?.state, audioPlayerStateSelector) ?? {};\n\n  const displayedDuration = secondsElapsed || durationSeconds;\n\n  useEffect(() => {\n    audioPlayer?.cancelScheduledRemoval();\n    return () => {\n      audioPlayer?.scheduleRemoval();\n    };\n  }, [audioPlayer]);\n\n  if (!audioPlayer) return;\n\n  return (\n    <React.Fragment>\n      <button\n        className='str-chat__audio_recorder__toggle-playback-button'\n        data-testid='audio-recording-preview-toggle-play-btn'\n        onClick={audioPlayer.togglePlay}\n      >\n        {isPlaying ? <PauseIcon /> : <PlayIcon />}\n      </button>\n      <RecordingTimer durationSeconds={displayedDuration} />\n      <div className='str-chat__wave-progress-bar__track-container'>\n        <WaveProgressBar\n          progress={progress}\n          seek={audioPlayer.seek}\n          waveformData={waveformData || []}\n        />\n      </div>\n    </React.Fragment>\n  );\n};\n", "import clsx from 'clsx';\nimport { displayDuration } from '../../Attachment';\nimport React from 'react';\n\nexport type RecordingTimerProps = {\n  durationSeconds: number;\n};\n\nexport const RecordingTimer = ({ durationSeconds }: RecordingTimerProps) => (\n  <div\n    className={clsx('str-chat__recording-timer', {\n      'str-chat__recording-timer--hours': durationSeconds >= 3600,\n    })}\n  >\n    {displayDuration(durationSeconds)}\n  </div>\n);\n", "import React, { useEffect, useState } from 'react';\nimport { useTimeElapsed } from './hooks/useTimeElapsed';\nimport { useMessageInputContext } from '../../../context';\nimport { RecordingTimer } from './RecordingTimer';\n\ntype WaveformProps = {\n  maxDataPointsDrawn?: number;\n};\n\nconst AudioRecordingWaveform = ({ maxDataPointsDrawn = 100 }: WaveformProps) => {\n  const {\n    recordingController: { recorder },\n  } = useMessageInputContext();\n\n  const [amplitudes, setAmplitudes] = useState<number[]>([]);\n\n  useEffect(() => {\n    if (!recorder?.amplitudeRecorder) return;\n    const amplitudesSubscription =\n      recorder.amplitudeRecorder.amplitudes.subscribe(setAmplitudes);\n    return () => {\n      amplitudesSubscription.unsubscribe();\n    };\n  }, [recorder]);\n\n  if (!recorder) return null;\n\n  return (\n    <div className='str-chat__waveform-box-container'>\n      <div className='str-chat__audio_recorder__waveform-box'>\n        {amplitudes.slice(-maxDataPointsDrawn).map((amplitude, i) => (\n          <div\n            className='str-chat__wave-progress-bar__amplitude-bar'\n            key={`amplitude-${i}-voice-recording`}\n            style={\n              {\n                '--str-chat__wave-progress-bar__amplitude-bar-height': amplitude\n                  ? amplitude * 100 + '%'\n                  : '0%',\n              } as React.CSSProperties\n            }\n          />\n        ))}\n      </div>\n    </div>\n  );\n};\nexport const AudioRecordingInProgress = () => {\n  const { secondsElapsed, startCounter, stopCounter } = useTimeElapsed();\n  const {\n    recordingController: { recorder },\n  } = useMessageInputContext();\n\n  useEffect(() => {\n    if (!recorder?.mediaRecorder) return;\n    const { mediaRecorder } = recorder;\n\n    if (mediaRecorder.state === 'recording') {\n      startCounter();\n    }\n\n    mediaRecorder.addEventListener('start', startCounter);\n    mediaRecorder.addEventListener('resume', startCounter);\n    mediaRecorder.addEventListener('stop', stopCounter);\n    mediaRecorder.addEventListener('pause', stopCounter);\n\n    return () => {\n      mediaRecorder.removeEventListener('start', startCounter);\n      mediaRecorder.removeEventListener('resume', startCounter);\n      mediaRecorder.removeEventListener('stop', stopCounter);\n      mediaRecorder.removeEventListener('pause', stopCounter);\n    };\n  }, [recorder, startCounter, stopCounter]);\n\n  return (\n    <React.Fragment>\n      <RecordingTimer durationSeconds={secondsElapsed} />\n      <AudioRecordingWaveform />\n    </React.Fragment>\n  );\n};\n", "import { useCallback, useEffect, useRef, useState } from 'react';\n\ntype UseTimeElapsedParams = {\n  startOnMount?: boolean;\n};\n\n// todo: provide start timestamp\nexport const useTimeElapsed = ({ startOnMount }: UseTimeElapsedParams = {}) => {\n  const [secondsElapsed, setSecondsElapsed] = useState<number>(0);\n  const updateInterval = useRef<ReturnType<typeof setInterval>>(undefined);\n\n  const startCounter = useCallback(() => {\n    if (updateInterval.current) return;\n    updateInterval.current = setInterval(() => {\n      setSecondsElapsed((prev) => prev + 1);\n    }, 1000);\n  }, []);\n\n  const stopCounter = useCallback(() => {\n    clearInterval(updateInterval.current);\n    updateInterval.current = undefined;\n  }, []);\n\n  useEffect(() => {\n    if (!startOnMount) return;\n    startCounter();\n    return () => {\n      stopCounter();\n    };\n  }, [startCounter, startOnMount, stopCounter]);\n\n  return {\n    secondsElapsed,\n    startCounter,\n    stopCounter,\n  };\n};\n", "import React from 'react';\nimport { MicIcon } from '../../MessageInput/icons';\n\nexport type StartRecordingAudioButtonProps = React.ComponentProps<'button'>;\n\nexport const StartRecordingAudioButton = (props: StartRecordingAudioButtonProps) => (\n  <button\n    aria-label='Start recording audio'\n    className='str-chat__start-recording-audio-button'\n    data-testid='start-recording-audio-button'\n    {...props}\n  >\n    <MicIcon />\n  </button>\n);\n", "import React from 'react';\nimport { useTranslationContext } from '../../../context';\nimport { FileIcon } from '../../ReactFileUtilities';\nimport { CloseIcon, DownloadIcon, LoadingIndicatorIcon, RetryIcon } from '../icons';\n\nimport type {\n  LocalAudioAttachment,\n  LocalFileAttachment,\n  LocalVideoAttachment,\n} from 'stream-chat';\nimport type { UploadAttachmentPreviewProps } from './types';\n\nexport type FileAttachmentPreviewProps<CustomLocalMetadata = unknown> =\n  UploadAttachmentPreviewProps<\n    | LocalFileAttachment<CustomLocalMetadata>\n    | LocalAudioAttachment<CustomLocalMetadata>\n    | LocalVideoAttachment<CustomLocalMetadata>\n  >;\n\nconst FileAttachmentPreview = ({\n  attachment,\n  handleRetry,\n  removeAttachments,\n}: FileAttachmentPreviewProps) => {\n  const { t } = useTranslationContext('FilePreview');\n  const uploadState = attachment.localMetadata?.uploadState;\n\n  return (\n    <div\n      className='str-chat__attachment-preview-file'\n      data-testid='attachment-preview-file'\n    >\n      <div className='str-chat__attachment-preview-file-icon'>\n        <FileIcon filename={attachment.title} mimeType={attachment.mime_type} />\n      </div>\n\n      <button\n        aria-label={t('aria/Remove attachment')}\n        className='str-chat__attachment-preview-delete'\n        data-testid='file-preview-item-delete-button'\n        disabled={uploadState === 'uploading'}\n        onClick={() =>\n          attachment.localMetadata?.id &&\n          removeAttachments([attachment.localMetadata?.id])\n        }\n        type='button'\n      >\n        <CloseIcon />\n      </button>\n\n      {['blocked', 'failed'].includes(uploadState) && !!handleRetry && (\n        <button\n          aria-label={t('aria/Retry upload')}\n          className='str-chat__attachment-preview-error str-chat__attachment-preview-error-file'\n          data-testid='file-preview-item-retry-button'\n          onClick={() => {\n            handleRetry(attachment);\n          }}\n        >\n          <RetryIcon />\n        </button>\n      )}\n\n      <div className='str-chat__attachment-preview-file-end'>\n        <div className='str-chat__attachment-preview-file-name' title={attachment.title}>\n          {attachment.title}\n        </div>\n        {/* undefined if loaded from a draft */}\n        {(typeof uploadState === 'undefined' || uploadState === 'finished') &&\n          !!attachment.asset_url && (\n            <a\n              aria-label={t('aria/Download attachment')}\n              className='str-chat__attachment-preview-file-download'\n              download\n              href={attachment.asset_url}\n              rel='noreferrer'\n              target='_blank'\n              title={t('Download attachment {{ name }}', { name: attachment.title })}\n            >\n              <DownloadIcon />\n            </a>\n          )}\n        {uploadState === 'uploading' && <LoadingIndicatorIcon size={17} />}\n      </div>\n    </div>\n  );\n};\nexport default FileAttachmentPreview;\n", "import clsx from 'clsx';\nimport React, { useCallback, useState } from 'react';\nimport { CloseIcon, LoadingIndicatorIcon, RetryIcon } from '../icons';\nimport { BaseImage as DefaultBaseImage } from '../../Gallery';\nimport { useComponentContext, useTranslationContext } from '../../../context';\nimport type { LocalImageAttachment } from 'stream-chat';\nimport type { UploadAttachmentPreviewProps } from './types';\n\nexport type ImageAttachmentPreviewProps<CustomLocalMetadata = Record<string, unknown>> =\n  UploadAttachmentPreviewProps<LocalImageAttachment<CustomLocalMetadata>>;\n\nexport const ImageAttachmentPreview = ({\n  attachment,\n  handleRetry,\n  removeAttachments,\n}: ImageAttachmentPreviewProps) => {\n  const { t } = useTranslationContext('ImagePreviewItem');\n  const { BaseImage = DefaultBaseImage } = useComponentContext('ImagePreview');\n  const [previewError, setPreviewError] = useState(false);\n\n  const { id, uploadState } = attachment.localMetadata ?? {};\n\n  const handleLoadError = useCallback(() => setPreviewError(true), []);\n  const assetUrl = attachment.image_url || attachment.localMetadata.previewUri;\n\n  return (\n    <div\n      className={clsx('str-chat__attachment-preview-image', {\n        'str-chat__attachment-preview-image--error': previewError,\n      })}\n      data-testid='attachment-preview-image'\n    >\n      <button\n        aria-label={t('aria/Remove attachment')}\n        className='str-chat__attachment-preview-delete'\n        data-testid='image-preview-item-delete-button'\n        disabled={uploadState === 'uploading'}\n        onClick={() => id && removeAttachments([id])}\n        type='button'\n      >\n        <CloseIcon />\n      </button>\n\n      {['blocked', 'failed'].includes(uploadState) && (\n        <button\n          aria-label={t('aria/Retry upload')}\n          className='str-chat__attachment-preview-error str-chat__attachment-preview-error-image'\n          data-testid='image-preview-item-retry-button'\n          onClick={() => handleRetry(attachment)}\n        >\n          <RetryIcon />\n        </button>\n      )}\n\n      {uploadState === 'uploading' && (\n        <div className='str-chat__attachment-preview-image-loading'>\n          <LoadingIndicatorIcon size={17} />\n        </div>\n      )}\n\n      {assetUrl && (\n        <BaseImage\n          alt={attachment.fallback}\n          className='str-chat__attachment-preview-thumbnail'\n          onError={handleLoadError}\n          src={assetUrl}\n          title={attachment.fallback}\n        />\n      )}\n    </div>\n  );\n};\n", "import type { LiveLocationPreview, StaticLocationPreview } from 'stream-chat';\nimport { CloseIcon } from '../icons';\nimport type { ComponentType } from 'react';\nimport React from 'react';\nimport { useTranslationContext } from '../../../context';\nimport { GeolocationIcon } from '../../Attachment/icons';\n\ntype GeolocationPreviewImageProps = {\n  location: StaticLocationPreview | LiveLocationPreview;\n};\n\nconst GeolocationPreviewImage = () => (\n  <div className='str-chat__location-preview-image'>\n    <GeolocationIcon />\n  </div>\n);\n\nexport type GeolocationPreviewProps = {\n  location: StaticLocationPreview | LiveLocationPreview;\n  PreviewImage?: ComponentType<GeolocationPreviewImageProps>;\n  remove?: () => void;\n};\n\nexport const GeolocationPreview = ({\n  location,\n  PreviewImage = GeolocationPreviewImage,\n  remove,\n}: GeolocationPreviewProps) => {\n  const { t } = useTranslationContext();\n  return (\n    <div className='str-chat__location-preview' data-testid='location-preview'>\n      <PreviewImage location={location} />\n      {remove && (\n        <button\n          aria-label={t('aria/Remove location attachment')}\n          className='str-chat__attachment-preview-delete'\n          data-testid='location-preview-item-delete-button'\n          onClick={remove}\n          type='button'\n        >\n          <CloseIcon />\n        </button>\n      )}\n\n      <div className='str-chat__attachment-preview-metadata'>\n        {(location as LiveLocationPreview).durationMs ? (\n          <>\n            <div\n              className='str-chat__attachment-preview-title'\n              title={t('Shared live location')}\n            >\n              {t('Live location')}\n            </div>\n            <div className='str-chat__attachment-preview-subtitle'>\n              {t('Live for {{duration}}', {\n                duration: t('duration/Share Location', {\n                  milliseconds: (location as LiveLocationPreview).durationMs,\n                }),\n              })}\n            </div>\n          </>\n        ) : (\n          <>\n            <div\n              className='str-chat__attachment-preview-title'\n              title={t('Current location')}\n            >\n              {t('Current location')}\n            </div>\n            <div className='str-chat__attachment-preview-subtitle'>\n              {location.latitude}, {location.longitude}\n            </div>\n          </>\n        )}\n      </div>\n    </div>\n  );\n};\n", "import React from 'react';\nimport { useTimer } from './hooks/useTimer';\n\nexport type CooldownTimerProps = {\n  cooldownInterval: number;\n  setCooldownRemaining: React.Dispatch<React.SetStateAction<number | undefined>>;\n};\nexport const CooldownTimer = ({ cooldownInterval }: CooldownTimerProps) => {\n  const secondsLeft = useTimer({ startFrom: cooldownInterval });\n\n  return (\n    <div className='str-chat__message-input-cooldown' data-testid='cooldown-timer'>\n      {secondsLeft}\n    </div>\n  );\n};\n", "import { useEffect, useState } from 'react';\n\nexport const useTimer = ({ startFrom }: { startFrom: number }) => {\n  const [secondsLeft, setSecondsLeft] = useState<number | undefined>();\n\n  useEffect(() => {\n    let countdownTimeout: ReturnType<typeof setTimeout>;\n    if (typeof secondsLeft === 'number' && secondsLeft > 0) {\n      countdownTimeout = setTimeout(() => {\n        setSecondsLeft(secondsLeft - 1);\n      }, 1000);\n    }\n    return () => {\n      clearTimeout(countdownTimeout);\n    };\n  }, [secondsLeft]);\n\n  useEffect(() => {\n    setSecondsLeft(startFrom ?? 0);\n  }, [startFrom]);\n\n  return secondsLeft;\n};\n", "import React, { useCallback, useEffect } from 'react';\nimport { MessageInput } from './MessageInput';\nimport { MessageInputFlat } from './MessageInputFlat';\nimport { Modal as DefaultModal } from '../Modal';\nimport {\n  useComponentContext,\n  useMessageContext,\n  useMessageInputContext,\n  useTranslationContext,\n} from '../../context';\nimport { useMessageComposer, useMessageComposerHasSendableData } from './hooks';\n\nimport type { MessageUIComponentProps } from '../Message';\n\nconst EditMessageFormSendButton = () => {\n  const { t } = useTranslationContext();\n  const hasSendableData = useMessageComposerHasSendableData();\n  return (\n    <button\n      className='str-chat__edit-message-send'\n      data-testid='send-button-edit-form'\n      disabled={!hasSendableData}\n      type='submit'\n    >\n      {t('Send')}\n    </button>\n  );\n};\n\nexport const EditMessageForm = () => {\n  const { t } = useTranslationContext('EditMessageForm');\n  const messageComposer = useMessageComposer();\n  const { clearEditingState, handleSubmit } = useMessageInputContext('EditMessageForm');\n\n  const cancel = useCallback(() => {\n    clearEditingState?.();\n    messageComposer.restore();\n  }, [clearEditingState, messageComposer]);\n\n  useEffect(() => {\n    const onKeyDown = (event: KeyboardEvent) => {\n      if (event.key === 'Escape') cancel();\n    };\n\n    document.addEventListener('keydown', onKeyDown);\n    return () => document.removeEventListener('keydown', onKeyDown);\n  }, [cancel]);\n\n  return (\n    <form\n      autoComplete='off'\n      className='str-chat__edit-message-form'\n      onSubmit={handleSubmit}\n    >\n      <MessageInputFlat />\n      <div className='str-chat__edit-message-form-options'>\n        <button\n          className='str-chat__edit-message-cancel'\n          data-testid='cancel-button'\n          onClick={cancel}\n          type='button'\n        >\n          {t('Cancel')}\n        </button>\n        <EditMessageFormSendButton />\n      </div>\n    </form>\n  );\n};\n\nexport type EditMessageModalProps = Pick<\n  MessageUIComponentProps,\n  'additionalMessageInputProps'\n>;\n\nexport const EditMessageModal = ({\n  additionalMessageInputProps,\n}: EditMessageModalProps) => {\n  const { EditMessageInput = EditMessageForm, Modal = DefaultModal } =\n    useComponentContext();\n  const { clearEditingState } = useMessageContext();\n  const messageComposer = useMessageComposer();\n  const onEditModalClose = useCallback(() => {\n    clearEditingState();\n    messageComposer.restore();\n  }, [clearEditingState, messageComposer]);\n\n  return (\n    <Modal\n      className='str-chat__edit-message-modal'\n      onClose={onEditModalClose}\n      open={true}\n    >\n      <MessageInput\n        clearEditingState={clearEditingState}\n        focus\n        hideSendButton\n        Input={EditMessageInput}\n        {...additionalMessageInputProps}\n      />\n    </Modal>\n  );\n};\n", "import type { PropsWithChildren } from 'react';\nimport React, { useEffect } from 'react';\n\nimport { MessageInputFlat } from './MessageInputFlat';\nimport { useMessageComposer } from './hooks';\nimport { useCooldownTimer } from './hooks/useCooldownTimer';\nimport { useCreateMessageInputContext } from './hooks/useCreateMessageInputContext';\nimport { useMessageInputControls } from './hooks/useMessageInputControls';\nimport type { ComponentContextValue } from '../../context/ComponentContext';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { MessageInputContextProvider } from '../../context/MessageInputContext';\nimport { DialogManagerProvider } from '../../context';\nimport { useStableId } from '../UtilityComponents/useStableId';\n\nimport type { LocalMessage, Message, SendMessageOptions } from 'stream-chat';\n\nimport type { CustomAudioRecordingConfig } from '../MediaRecorder';\nimport { useRegisterDropHandlers } from './WithDragAndDropUpload';\n\nexport type EmojiSearchIndexResult = {\n  id: string;\n  name: string;\n  skins: Array<{ native: string }>;\n  emoticons?: Array<string>;\n  native?: string;\n};\n\nexport interface EmojiSearchIndex {\n  search: (\n    query: string,\n  ) => PromiseLike<Array<EmojiSearchIndexResult>> | Array<EmojiSearchIndexResult> | null;\n}\n\nexport type MessageInputProps = {\n  /**\n   * Additional props to be passed to the underlying `AutoCompleteTextarea` component.\n   * Default value is handled via MessageComposer.\n   * [Available props](https://www.npmjs.com/package/react-textarea-autosize)\n   */\n  additionalTextareaProps?: Omit<\n    React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n    'defaultValue' | 'style' | 'disabled' | 'value'\n  >;\n  /**\n   * When enabled, recorded messages won\u2019t be sent immediately.\n   * Instead, they will \u201Cstack up\u201D with other attachments in the message composer allowing the user to send multiple attachments as part of the same message.\n   */\n  asyncMessagesMultiSendEnabled?: boolean;\n  /** Allows to configure the audio recording parameters for voice messages. */\n  audioRecordingConfig?: CustomAudioRecordingConfig;\n  /** Controls whether the users will be provided with the UI to record voice messages. */\n  audioRecordingEnabled?: boolean;\n  /** Function to clear the editing state while editing a message */\n  clearEditingState?: () => void;\n  /** Mechanism to be used with autocomplete and text replace features of the `MessageInput` component, see [emoji-mart `SearchIndex`](https://github.com/missive/emoji-mart#%EF%B8%8F%EF%B8%8F-headless-search) */\n  emojiSearchIndex?: ComponentContextValue['emojiSearchIndex'];\n  /** If true, focuses the text input on component mount */\n  focus?: boolean;\n  /** Allows to hide MessageInput's send button. */\n  hideSendButton?: boolean;\n  /** Custom UI component handling how the message input is rendered, defaults to and accepts the same props as [MessageInputFlat](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/MessageInputFlat.tsx) */\n  Input?: React.ComponentType<MessageInputProps>;\n  /** @deprecated use messageComposer.threadId to indicate, whether the message is composed within a thread context\n   * Signals that the MessageInput is rendered in a message thread (Thread component)\n   */\n  isThreadInput?: boolean;\n  /** Max number of rows the underlying `textarea` component is allowed to grow */\n  maxRows?: number;\n  /** Min number of rows the underlying `textarea` will start with. The `grow` on MessageInput prop has to be enabled for `minRows` to take effect. */\n  minRows?: number;\n  /** Function to override the default message sending process. Not message updating process. */\n  overrideSubmitHandler?: (params: {\n    cid: string;\n    localMessage: LocalMessage;\n    message: Message;\n    sendOptions: SendMessageOptions;\n  }) => Promise<void> | void;\n  /** When replying in a thread, the parent message object */\n  parent?: LocalMessage;\n  /** If true, will use an optional dependency to support transliteration in the input for mentions, default is false. See: https://github.com/getstream/transliterate */\n  /**\n   * Currently, `Enter` is the default submission key and  `Shift`+`Enter` is the default combination for the new line.\n   * If specified, this function overrides the default behavior specified previously.\n   *\n   * Example of default behavior:\n   * ```tsx\n   * const defaultShouldSubmit = (event) => event.key === \"Enter\" && !event.shiftKey;\n   * ```\n   */\n  shouldSubmit?: (event: React.KeyboardEvent<HTMLTextAreaElement>) => boolean;\n};\n\nconst MessageInputProvider = (props: PropsWithChildren<MessageInputProps>) => {\n  const cooldownTimerState = useCooldownTimer();\n  const messageInputUiApi = useMessageInputControls(props);\n  const { emojiSearchIndex } = useComponentContext('MessageInput');\n\n  const messageInputContextValue = useCreateMessageInputContext({\n    ...cooldownTimerState,\n    ...messageInputUiApi,\n    ...props,\n    emojiSearchIndex: props.emojiSearchIndex ?? emojiSearchIndex,\n  });\n\n  const messageComposer = useMessageComposer();\n\n  useEffect(\n    () => () => {\n      messageComposer.createDraft();\n    },\n    [messageComposer],\n  );\n\n  useEffect(() => {\n    const threadId = messageComposer.threadId;\n    if (\n      !threadId ||\n      !messageComposer.channel ||\n      !messageComposer.compositionIsEmpty ||\n      !messageComposer.config.drafts.enabled\n    )\n      return;\n    // get draft data for legacy thead composer\n    messageComposer.channel\n      .getDraft({ parent_id: threadId })\n      .then(({ draft }) => {\n        if (draft) {\n          messageComposer.initState({ composition: draft });\n        }\n      })\n      .catch(console.error);\n  }, [messageComposer]);\n\n  useRegisterDropHandlers();\n\n  return (\n    <MessageInputContextProvider value={messageInputContextValue}>\n      {props.children}\n    </MessageInputContextProvider>\n  );\n};\n\nconst UnMemoizedMessageInput = (props: MessageInputProps) => {\n  const { Input: PropInput } = props;\n\n  const { Input: ContextInput } = useComponentContext('MessageInput');\n  const messageComposer = useMessageComposer();\n  const id = useStableId();\n\n  const Input = PropInput || ContextInput || MessageInputFlat;\n  const dialogManagerId = messageComposer.threadId\n    ? `message-input-dialog-manager-thread-${id}`\n    : `message-input-dialog-manager-${id}`;\n\n  return (\n    <DialogManagerProvider id={dialogManagerId}>\n      <MessageInputProvider {...props}>\n        <Input />\n      </MessageInputProvider>\n    </DialogManagerProvider>\n  );\n};\n\n/**\n * A high level component that has provides all functionality to the Input it renders.\n */\nexport const MessageInput = React.memo(\n  UnMemoizedMessageInput,\n) as typeof UnMemoizedMessageInput;\n", "import React, { useCallback, useState } from 'react';\n\nimport {\n  AttachmentSelector as DefaultAttachmentSelector,\n  SimpleAttachmentSelector,\n} from './AttachmentSelector';\nimport { AttachmentPreviewList as DefaultAttachmentPreviewList } from './AttachmentPreviewList';\nimport { CooldownTimer as DefaultCooldownTimer } from './CooldownTimer';\nimport { SendButton as DefaultSendButton } from './SendButton';\nimport { StopAIGenerationButton as DefaultStopAIGenerationButton } from './StopAIGenerationButton';\nimport {\n  AudioRecorder as DefaultAudioRecorder,\n  RecordingPermissionDeniedNotification as DefaultRecordingPermissionDeniedNotification,\n  StartRecordingAudioButton as DefaultStartRecordingAudioButton,\n  RecordingPermission,\n} from '../MediaRecorder';\nimport {\n  QuotedMessagePreview as DefaultQuotedMessagePreview,\n  QuotedMessagePreviewHeader,\n} from './QuotedMessagePreview';\nimport { LinkPreviewList as DefaultLinkPreviewList } from './LinkPreviewList';\nimport { SendToChannelCheckbox as DefaultSendToChannelCheckbox } from './SendToChannelCheckbox';\nimport { TextareaComposer as DefaultTextareaComposer } from '../TextareaComposer';\nimport { AIStates, useAIState } from '../AIStateIndicator';\nimport { RecordingAttachmentType } from '../MediaRecorder/classes';\n\nimport { useChatContext } from '../../context/ChatContext';\nimport { useMessageInputContext } from '../../context/MessageInputContext';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { useAttachmentManagerState } from './hooks/useAttachmentManagerState';\nimport { useMessageContext } from '../../context';\nimport { WithDragAndDropUpload } from './WithDragAndDropUpload';\n\nexport const MessageInputFlat = () => {\n  const { message } = useMessageContext();\n  const {\n    asyncMessagesMultiSendEnabled,\n    cooldownRemaining,\n    handleSubmit,\n    hideSendButton,\n    recordingController,\n    setCooldownRemaining,\n  } = useMessageInputContext('MessageInputFlat');\n\n  const {\n    AttachmentPreviewList = DefaultAttachmentPreviewList,\n    AttachmentSelector = message ? SimpleAttachmentSelector : DefaultAttachmentSelector,\n    AudioRecorder = DefaultAudioRecorder,\n    CooldownTimer = DefaultCooldownTimer,\n    EmojiPicker,\n    LinkPreviewList = DefaultLinkPreviewList,\n    QuotedMessagePreview = DefaultQuotedMessagePreview,\n    RecordingPermissionDeniedNotification = DefaultRecordingPermissionDeniedNotification,\n    SendButton = DefaultSendButton,\n    SendToChannelCheckbox = DefaultSendToChannelCheckbox,\n    StartRecordingAudioButton = DefaultStartRecordingAudioButton,\n    StopAIGenerationButton: StopAIGenerationButtonOverride,\n    TextareaComposer = DefaultTextareaComposer,\n  } = useComponentContext();\n  const { channel } = useChatContext('MessageInputFlat');\n  const { aiState } = useAIState(channel);\n\n  const stopGenerating = useCallback(() => channel?.stopAIResponse(), [channel]);\n\n  const [\n    showRecordingPermissionDeniedNotification,\n    setShowRecordingPermissionDeniedNotification,\n  ] = useState(false);\n  const closePermissionDeniedNotification = useCallback(() => {\n    setShowRecordingPermissionDeniedNotification(false);\n  }, []);\n\n  const { attachments } = useAttachmentManagerState();\n\n  if (recordingController.recordingState) return <AudioRecorder />;\n\n  const recordingEnabled = !!(recordingController.recorder && navigator.mediaDevices); // account for requirement on iOS as per this bug report: https://bugs.webkit.org/show_bug.cgi?id=252303\n  const isRecording = !!recordingController.recordingState;\n\n  /**\n   * This bit here is needed to make sure that we can get rid of the default behaviour\n   * if need be. Essentially, this allows us to pass StopAIGenerationButton={null} and\n   * completely circumvent the default logic if it's not what we want. We need it as a\n   * prop because there is no other trivial way to override the SendMessage button otherwise.\n   */\n  const StopAIGenerationButton =\n    StopAIGenerationButtonOverride === undefined\n      ? DefaultStopAIGenerationButton\n      : StopAIGenerationButtonOverride;\n  const shouldDisplayStopAIGeneration =\n    [AIStates.Thinking, AIStates.Generating].includes(aiState) &&\n    !!StopAIGenerationButton;\n\n  return (\n    <WithDragAndDropUpload className='str-chat__message-input' component='div'>\n      {recordingEnabled &&\n        recordingController.permissionState === 'denied' &&\n        showRecordingPermissionDeniedNotification && (\n          <RecordingPermissionDeniedNotification\n            onClose={closePermissionDeniedNotification}\n            permissionName={RecordingPermission.MIC}\n          />\n        )}\n      <LinkPreviewList />\n      <QuotedMessagePreviewHeader />\n\n      <div className='str-chat__message-input-inner'>\n        <AttachmentSelector />\n        <div className='str-chat__message-textarea-container'>\n          <QuotedMessagePreview />\n          <AttachmentPreviewList />\n          <div className='str-chat__message-textarea-with-emoji-picker'>\n            <TextareaComposer />\n            {EmojiPicker && <EmojiPicker />}\n          </div>\n        </div>\n        {shouldDisplayStopAIGeneration ? (\n          <StopAIGenerationButton onClick={stopGenerating} />\n        ) : (\n          !hideSendButton && (\n            <>\n              {cooldownRemaining ? (\n                <CooldownTimer\n                  cooldownInterval={cooldownRemaining}\n                  setCooldownRemaining={setCooldownRemaining}\n                />\n              ) : (\n                <>\n                  <SendButton sendMessage={handleSubmit} />\n                  {recordingEnabled && (\n                    <StartRecordingAudioButton\n                      disabled={\n                        isRecording ||\n                        (!asyncMessagesMultiSendEnabled &&\n                          attachments.some(\n                            (a) => a.type === RecordingAttachmentType.VOICE_RECORDING,\n                          ))\n                      }\n                      onClick={() => {\n                        recordingController.recorder?.start();\n                        setShowRecordingPermissionDeniedNotification(true);\n                      }}\n                    />\n                  )}\n                </>\n              )}\n            </>\n          )\n        )}\n      </div>\n      <SendToChannelCheckbox />\n    </WithDragAndDropUpload>\n  );\n};\n", "import React from 'react';\nimport { SendIcon } from './icons';\nimport { useMessageComposerHasSendableData } from './hooks';\nimport { useTranslationContext } from '../../context';\n\nexport type SendButtonProps = {\n  sendMessage: (event: React.BaseSyntheticEvent) => void;\n} & React.ComponentProps<'button'>;\n\nexport const SendButton = ({ sendMessage, ...rest }: SendButtonProps) => {\n  const { t } = useTranslationContext();\n  const hasSendableData = useMessageComposerHasSendableData();\n  return (\n    <button\n      aria-label={t('aria/Send')}\n      className='str-chat__send-button'\n      data-testid='send-button'\n      disabled={!hasSendableData}\n      onClick={sendMessage}\n      type='button'\n      {...rest}\n    >\n      <SendIcon />\n    </button>\n  );\n};\n", "import React from 'react';\nimport { useTranslationContext } from '../../context';\n\nexport type StopAIGenerationButtonProps = React.ComponentProps<'button'>;\n\nexport const StopAIGenerationButton = ({\n  onClick,\n  ...restProps\n}: StopAIGenerationButtonProps) => {\n  const { t } = useTranslationContext();\n  return (\n    <button\n      aria-label={t('aria/Stop AI Generation')}\n      className='str-chat__stop-ai-generation-button'\n      data-testid='stop-ai-generation-button'\n      onClick={onClick}\n      {...restProps}\n    />\n  );\n};\n", "import React, { useMemo } from 'react';\n\nimport { CloseIcon } from './icons';\nimport { Attachment as DefaultAttachment } from '../Attachment';\nimport { Avatar as DefaultAvatar } from '../Avatar';\nimport { Poll } from '../Poll';\n\nimport { useChatContext } from '../../context/ChatContext';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nimport { useStateStore } from '../../store';\nimport { useMessageComposer } from './hooks';\nimport { renderText as defaultRenderText } from '../Message/renderText';\nimport type { MessageComposerState, TranslationLanguages } from 'stream-chat';\nimport type { MessageContextValue } from '../../context';\n\nconst messageComposerStateStoreSelector = (state: MessageComposerState) => ({\n  quotedMessage: state.quotedMessage,\n});\n\nexport const QuotedMessagePreviewHeader = () => {\n  const { t } = useTranslationContext('QuotedMessagePreview');\n  const messageComposer = useMessageComposer();\n  const { quotedMessage } = useStateStore(\n    messageComposer.state,\n    messageComposerStateStoreSelector,\n  );\n\n  if (!quotedMessage) return null;\n\n  return (\n    <div className='str-chat__quoted-message-preview-header'>\n      <div className='str-chat__quoted-message-reply-to-message'>\n        {t('Reply to Message')}\n      </div>\n      <button\n        aria-label={t('aria/Cancel Reply')}\n        className='str-chat__quoted-message-remove'\n        onClick={() => messageComposer.setQuotedMessage(null)}\n      >\n        <CloseIcon />\n      </button>\n    </div>\n  );\n};\n\nexport type QuotedMessagePreviewProps = {\n  renderText?: MessageContextValue['renderText'];\n};\n\nexport const QuotedMessagePreview = ({\n  renderText = defaultRenderText,\n}: QuotedMessagePreviewProps) => {\n  const { client } = useChatContext();\n  const { Attachment = DefaultAttachment, Avatar = DefaultAvatar } =\n    useComponentContext('QuotedMessagePreview');\n  const { userLanguage } = useTranslationContext('QuotedMessagePreview');\n  const messageComposer = useMessageComposer();\n  const { quotedMessage } = useStateStore(\n    messageComposer.state,\n    messageComposerStateStoreSelector,\n  );\n\n  const quotedMessageText = useMemo(\n    () =>\n      quotedMessage?.i18n?.[`${userLanguage}_text` as `${TranslationLanguages}_text`] ||\n      quotedMessage?.text,\n    [quotedMessage?.i18n, quotedMessage?.text, userLanguage],\n  );\n\n  const renderedText = useMemo(\n    () => renderText(quotedMessageText, quotedMessage?.mentioned_users),\n    [quotedMessage, quotedMessageText, renderText],\n  );\n\n  const quotedMessageAttachments = useMemo(\n    () =>\n      quotedMessage?.attachments?.length ? quotedMessage.attachments.slice(0, 1) : [],\n    [quotedMessage],\n  );\n\n  const poll = quotedMessage?.poll_id && client.polls.fromState(quotedMessage.poll_id);\n\n  if (!quotedMessageText && !quotedMessageAttachments.length && !poll) return null;\n\n  return (\n    <div\n      className='str-chat__quoted-message-preview'\n      data-testid='quoted-message-preview'\n    >\n      {quotedMessage?.user && (\n        <Avatar\n          className='str-chat__avatar--quoted-message-sender'\n          image={quotedMessage.user.image}\n          name={quotedMessage.user.name || quotedMessage.user.id}\n          user={quotedMessage.user}\n        />\n      )}\n      <div className='str-chat__quoted-message-bubble'>\n        {poll ? (\n          <Poll isQuoted poll={poll} />\n        ) : (\n          <>\n            {!!quotedMessageAttachments.length && (\n              <Attachment attachments={quotedMessageAttachments} isQuoted />\n            )}\n            <div\n              className='str-chat__quoted-message-text'\n              data-testid='quoted-message-text'\n            >\n              {renderedText}\n            </div>\n          </>\n        )}\n      </div>\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport React, { useState } from 'react';\nimport type {\n  LinkPreview,\n  LinkPreviewsManagerState,\n  MessageComposerState,\n} from 'stream-chat';\nimport { LinkPreviewsManager } from 'stream-chat';\nimport { useStateStore } from '../../store';\nimport { PopperTooltip } from '../Tooltip';\nimport { useEnterLeaveHandlers } from '../Tooltip/hooks';\nimport { useMessageComposer } from './hooks';\nimport { CloseIcon, LinkIcon } from './icons';\n\nconst linkPreviewsManagerStateSelector = (state: LinkPreviewsManagerState) => ({\n  linkPreviews: Array.from(state.previews.values()).filter(\n    (preview) =>\n      LinkPreviewsManager.previewIsLoaded(preview) ||\n      LinkPreviewsManager.previewIsLoading(preview),\n  ),\n});\n\nconst messageComposerStateSelector = (state: MessageComposerState) => ({\n  quotedMessage: state.quotedMessage,\n});\n\nexport const LinkPreviewList = () => {\n  const messageComposer = useMessageComposer();\n  const { linkPreviewsManager } = messageComposer;\n  const { quotedMessage } = useStateStore(\n    messageComposer.state,\n    messageComposerStateSelector,\n  );\n  const { linkPreviews } = useStateStore(\n    linkPreviewsManager.state,\n    linkPreviewsManagerStateSelector,\n  );\n\n  const showLinkPreviews = linkPreviews.length > 0 && !quotedMessage;\n\n  if (!showLinkPreviews) return null;\n\n  return (\n    <div className='str-chat__link-preview-list'>\n      {linkPreviews.map((linkPreview) => (\n        <LinkPreviewCard key={linkPreview.og_scrape_url} linkPreview={linkPreview} />\n      ))}\n    </div>\n  );\n};\n\ntype LinkPreviewProps = {\n  linkPreview: LinkPreview;\n};\n\nexport const LinkPreviewCard = ({ linkPreview }: LinkPreviewProps) => {\n  const { linkPreviewsManager } = useMessageComposer();\n  const { handleEnter, handleLeave, tooltipVisible } =\n    useEnterLeaveHandlers<HTMLDivElement>();\n  const [referenceElement, setReferenceElement] = useState<HTMLDivElement | null>(null);\n\n  if (\n    !LinkPreviewsManager.previewIsLoaded(linkPreview) &&\n    !LinkPreviewsManager.previewIsLoading(linkPreview)\n  )\n    return null;\n\n  return (\n    <div\n      className={clsx('str-chat__link-preview-card', {\n        'str-chat__link-preview-card--loading':\n          LinkPreviewsManager.previewIsLoading(linkPreview),\n      })}\n      data-testid='link-preview-card'\n    >\n      <PopperTooltip\n        offset={[0, 5]}\n        referenceElement={referenceElement}\n        visible={tooltipVisible}\n      >\n        {linkPreview.og_scrape_url}\n      </PopperTooltip>\n      <div\n        className='str-chat__link-preview-card__icon-container'\n        onMouseEnter={handleEnter}\n        onMouseLeave={handleLeave}\n        ref={setReferenceElement}\n      >\n        <LinkIcon />\n      </div>\n      <div className='str-chat__link-preview-card__content'>\n        <div className='str-chat__link-preview-card__content-title'>\n          {linkPreview.title}\n        </div>\n        <div className='str-chat__link-preview-card__content-description'>\n          {linkPreview.text}\n        </div>\n      </div>\n      <button\n        className='str-chat__link-preview-card__dismiss-button'\n        data-testid='link-preview-card-dismiss-btn'\n        onClick={() => linkPreviewsManager.dismissPreview(linkPreview.og_scrape_url)}\n        type='button'\n      >\n        <CloseIcon />\n      </button>\n    </div>\n  );\n};\n", "import { useMessageComposer } from './hooks';\nimport React from 'react';\nimport type { MessageComposerState } from 'stream-chat';\nimport { useStateStore } from '../../store';\nimport { useTranslationContext } from '../../context';\n\nconst stateSelector = (state: MessageComposerState) => ({\n  showReplyInChannel: state.showReplyInChannel,\n});\n\nexport const SendToChannelCheckbox = () => {\n  const { t } = useTranslationContext();\n  const messageComposer = useMessageComposer();\n  const { showReplyInChannel } = useStateStore(messageComposer.state, stateSelector);\n\n  if (messageComposer.editedMessage || !messageComposer.threadId) return null;\n\n  return (\n    <div className='str-chat__send-to-channel-checkbox__container'>\n      <div className='str-chat__send-to-channel-checkbox__field'>\n        <input\n          id='send-to-channel-checkbox'\n          onClick={messageComposer.toggleShowReplyInChannel}\n          type='checkbox'\n          value={showReplyInChannel.toString()}\n        />\n        <label htmlFor='send-to-channel-checkbox'>\n          {Object.keys(messageComposer.channel.state.members).length === 2\n            ? t('Also send as a direct message')\n            : t('Also send in channel')}\n        </label>\n      </div>\n    </div>\n  );\n};\n", "import type { PropsWithChildren } from 'react';\nimport { useMemo } from 'react';\nimport React from 'react';\nimport type { CommandResponse } from 'stream-chat';\nimport { useTranslationContext } from '../../../context';\n\nexport type CommandItemProps = {\n  entity: CommandResponse;\n};\n\nexport const CommandItem = (props: PropsWithChildren<CommandItemProps>) => {\n  const { t } = useTranslationContext();\n  const { entity } = props;\n  const knownArgsTranslations = useMemo<Record<string, string>>(\n    () => ({\n      ban: t('ban-command-args'),\n      giphy: t('giphy-command-args'),\n      mute: t('mute-command-args'),\n      unban: t('unban-command-args'),\n      unmute: t('unmute-command-args'),\n    }),\n    [t],\n  );\n\n  const knownDescriptionTranslations = useMemo<Record<string, string>>(\n    () => ({\n      ban: t('ban-command-description'),\n      giphy: t('giphy-command-description'),\n      mute: t('mute-command-description'),\n      unban: t('unban-command-description'),\n      unmute: t('unmute-command-description'),\n    }),\n    [t],\n  );\n\n  return (\n    <div className='str-chat__slash-command'>\n      <span className='str-chat__slash-command-header'>\n        <strong>{entity.name}</strong>{' '}\n        {entity.args && (knownArgsTranslations[entity.name ?? ''] ?? t(entity.args))}\n      </span>\n      <br />\n      <span className='str-chat__slash-command-description'>\n        {entity.description &&\n          (knownDescriptionTranslations[entity.name ?? ''] ?? t(entity.description))}\n      </span>\n    </div>\n  );\n};\n", "import React from 'react';\n\nexport type EmoticonItemProps = {\n  entity: {\n    /** Name for emoticon */\n    name: string;\n    /** Native value or actual emoticon */\n    native: string;\n    /** The parts of the Name property of the entity (or id if no name) that can be matched to the user input value.\n     * Default is bold for matches, but can be overwritten in css.\n     * */\n    tokenizedDisplayName: { token: string; parts: string[] };\n  };\n};\n\nexport const EmoticonItem = (props: EmoticonItemProps) => {\n  const { entity } = props;\n  const hasEntity = Object.keys(entity).length;\n  if (!hasEntity) return null;\n\n  const { parts, token } = entity.tokenizedDisplayName ?? ({} as EmoticonItemProps);\n\n  const renderName = () =>\n    parts?.map((part, i) =>\n      part.toLowerCase() === token ? (\n        <span className='str-chat__emoji-item--highlight' key={`part-${i}`}>\n          {part}\n        </span>\n      ) : (\n        <span className='str-chat__emoji-item--part' key={`part-${i}`}>\n          {part}\n        </span>\n      ),\n    ) ?? null;\n\n  return (\n    <div className='str-chat__emoji-item'>\n      <span className='str-chat__emoji-item--entity'>{entity.native}</span>\n      <span className='str-chat__emoji-item--name'>{renderName()}</span>\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport React, { useEffect, useState } from 'react';\nimport type { CommandItemProps } from './CommandItem';\nimport { CommandItem } from './CommandItem';\nimport type { EmoticonItemProps } from './EmoticonItem';\nimport { EmoticonItem } from './EmoticonItem';\nimport type { SuggestionListItemComponentProps } from './SuggestionListItem';\nimport { SuggestionListItem as DefaultSuggestionListItem } from './SuggestionListItem';\nimport { UserItem } from './UserItem';\nimport { useComponentContext } from '../../../context/ComponentContext';\nimport { useStateStore } from '../../../store';\nimport { InfiniteScrollPaginator } from '../../InfiniteScrollPaginator/InfiniteScrollPaginator';\nimport { useMessageComposer } from '../../MessageInput';\nimport type {\n  SearchSourceState,\n  TextComposerState,\n  TextComposerSuggestion,\n} from 'stream-chat';\nimport type { UserItemProps } from './UserItem';\n\ntype SuggestionTrigger = '/' | ':' | '@' | string;\n\nexport type SuggestionListProps = Partial<{\n  suggestionItemComponents: Record<\n    SuggestionTrigger,\n    React.ComponentType<SuggestionListItemComponentProps>\n  >;\n  className?: string;\n  closeOnClickOutside?: boolean;\n  containerClassName?: string;\n  focusedItemIndex: number;\n  setFocusedItemIndex: (index: number) => void;\n}>;\n\nconst textComposerStateSelector = (state: TextComposerState) => ({\n  suggestions: state.suggestions,\n});\n\nconst searchSourceStateSelector = (\n  nextValue: SearchSourceState<TextComposerSuggestion>,\n): { items: TextComposerSuggestion[] } => ({\n  items: nextValue.items ?? [],\n});\n\nexport const defaultComponents: Record<\n  SuggestionTrigger,\n  React.ComponentType<SuggestionListItemComponentProps>\n> = {\n  '/': (props: SuggestionListItemComponentProps) => (\n    <CommandItem entity={props.entity as CommandItemProps['entity']} />\n  ),\n  ':': (props: SuggestionListItemComponentProps) => (\n    <EmoticonItem entity={props.entity as EmoticonItemProps['entity']} />\n  ),\n  '@': (props: SuggestionListItemComponentProps) => (\n    <UserItem entity={props.entity as UserItemProps['entity']} />\n  ),\n} as const;\n\nexport const SuggestionList = ({\n  className,\n  closeOnClickOutside = true,\n  containerClassName,\n  focusedItemIndex,\n  setFocusedItemIndex,\n  suggestionItemComponents = defaultComponents,\n}: SuggestionListProps) => {\n  const { AutocompleteSuggestionItem = DefaultSuggestionListItem } =\n    useComponentContext();\n  const messageComposer = useMessageComposer();\n  const { textComposer } = messageComposer;\n  const { suggestions } = useStateStore(textComposer.state, textComposerStateSelector);\n  const { items } =\n    useStateStore(suggestions?.searchSource.state, searchSourceStateSelector) ?? {};\n  const [container, setContainer] = useState<HTMLDivElement | null>(null);\n\n  const component = suggestions?.trigger\n    ? suggestionItemComponents[suggestions?.trigger]\n    : undefined;\n\n  useEffect(() => {\n    if (!closeOnClickOutside || !suggestions || !container) return;\n    const handleClick = (event: MouseEvent) => {\n      if (container.contains(event.target as Node)) return;\n      textComposer.closeSuggestions();\n    };\n    document.addEventListener('click', handleClick);\n    return () => {\n      document.removeEventListener('click', handleClick);\n    };\n  }, [closeOnClickOutside, suggestions, container, textComposer]);\n\n  if (!suggestions || !items?.length || !component) return null;\n\n  return (\n    <div\n      className={clsx('str-chat__suggestion-list-container', containerClassName)}\n      ref={setContainer}\n    >\n      <InfiniteScrollPaginator\n        loadNextOnScrollToBottom={suggestions.searchSource.search}\n        threshold={100}\n      >\n        <ul\n          className={clsx(\n            'str-chat__suggestion-list str-chat__suggestion-list--react',\n            className,\n          )}\n        >\n          {items.map((item, i) => (\n            <AutocompleteSuggestionItem\n              component={component}\n              focused={focusedItemIndex === i}\n              item={item}\n              key={item.id.toString()}\n              onMouseEnter={() => setFocusedItemIndex?.(i)}\n            />\n          ))}\n        </ul>\n      </InfiniteScrollPaginator>\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport type { Ref } from 'react';\nimport React, { useCallback, useLayoutEffect, useRef } from 'react';\nimport { useMessageComposer } from '../../MessageInput';\nimport type { TextComposerSuggestion } from 'stream-chat';\nimport type { UserItemProps } from './UserItem';\nimport type { CommandItemProps } from './CommandItem';\nimport type { EmoticonItemProps } from './EmoticonItem';\nimport { useMessageInputContext } from '../../../context';\n\nexport type DefaultSuggestionListItemEntity =\n  | UserItemProps['entity']\n  | CommandItemProps['entity']\n  | EmoticonItemProps['entity'];\n\nexport type SuggestionListItemComponentProps = {\n  entity: DefaultSuggestionListItemEntity | unknown;\n  focused: boolean;\n};\n\nexport type SuggestionItemProps = {\n  component: React.ComponentType<SuggestionListItemComponentProps>;\n  item: TextComposerSuggestion;\n  focused: boolean;\n  className?: string;\n  onMouseEnter?: () => void;\n};\n\nexport const SuggestionListItem = React.forwardRef<\n  HTMLButtonElement,\n  SuggestionItemProps\n>(function SuggestionListItem(\n  { className, component: Component, focused, item, onMouseEnter }: SuggestionItemProps,\n  innerRef: Ref<HTMLButtonElement>,\n) {\n  const { textComposer } = useMessageComposer();\n  const { textareaRef } = useMessageInputContext();\n  const containerRef = useRef<HTMLLIElement>(null);\n\n  const handleSelect = useCallback(() => {\n    textComposer.handleSelect(item);\n    textareaRef.current?.focus();\n  }, [item, textareaRef, textComposer]);\n\n  useLayoutEffect(() => {\n    if (!focused) return;\n    containerRef.current?.scrollIntoView({ behavior: 'instant', block: 'nearest' });\n  }, [focused, containerRef]);\n\n  return (\n    <li\n      className={clsx('str-chat__suggestion-list-item', className, {\n        'str-chat__suggestion-item--selected': focused,\n      })}\n      onMouseEnter={onMouseEnter}\n      ref={containerRef}\n    >\n      <button\n        onClick={handleSelect}\n        onKeyDown={(event) => {\n          if (event.key === 'Enter') {\n            handleSelect();\n          }\n        }}\n        ref={innerRef}\n      >\n        <Component entity={item} focused={focused} />\n      </button>\n    </li>\n  );\n});\n", "import React from 'react';\nimport clsx from 'clsx';\n\nimport type { AvatarProps } from '../../Avatar';\nimport { Avatar as DefaultAvatar } from '../../Avatar';\n\nexport type UserItemProps = {\n  /** The user */\n  entity: {\n    /** The parts of the Name property of the entity (or id if no name) that can be matched to the user input value.\n     * Default is bold for matches, but can be overwritten in css.\n     * */\n    tokenizedDisplayName: { token: string; parts: string[] };\n    /** Id of the user */\n    id?: string;\n    /** Image of the user */\n    image?: string;\n    /** Name of the user */\n    name?: string;\n  };\n  /** Custom UI component to display user avatar, defaults to and accepts same props as: [Avatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/Avatar.tsx) */\n  Avatar?: React.ComponentType<AvatarProps>;\n};\n\n/**\n * UI component for mentions rendered in suggestion list\n */\nexport const UserItem = ({ Avatar = DefaultAvatar, entity }: UserItemProps) => {\n  const hasEntity = !!Object.keys(entity).length;\n  if (!hasEntity) return null;\n\n  const { parts, token } = entity.tokenizedDisplayName;\n\n  const renderName = () =>\n    parts.map((part, i) => {\n      const matches = part.toLowerCase() === token;\n      const partWithHTMLSpacesAround = part.replace(/^\\s+|\\s+$/g, '\\u00A0');\n      return (\n        <span\n          className={clsx({\n            'str-chat__emoji-item--highlight': matches,\n            'str-chat__emoji-item--part': !matches,\n          })}\n          key={`part-${i}`}\n        >\n          {partWithHTMLSpacesAround}\n        </span>\n      );\n    });\n\n  return (\n    <div className='str-chat__user-item'>\n      <Avatar\n        className='str-chat__avatar--autocomplete-item'\n        image={entity.image}\n        name={entity.name || entity.id}\n      />\n      <span className='str-chat__user-item--name' data-testid={'user-item-name'}>\n        {renderName()}\n      </span>\n      <div className='str-chat__user-item-at'>@</div>\n    </div>\n  );\n};\n", "import clsx from 'clsx';\nimport type {\n  ChangeEventHandler,\n  SyntheticEvent,\n  TextareaHTMLAttributes,\n  UIEventHandler,\n} from 'react';\nimport React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport Textarea from 'react-textarea-autosize';\nimport { useMessageComposer } from '../MessageInput';\nimport type {\n  AttachmentManagerState,\n  MessageComposerConfig,\n  MessageComposerState,\n  SearchSourceState,\n  TextComposerState,\n} from 'stream-chat';\nimport {\n  useComponentContext,\n  useMessageInputContext,\n  useTranslationContext,\n} from '../../context';\nimport { useStateStore } from '../../store';\nimport { SuggestionList as DefaultSuggestionList } from './SuggestionList';\n\nconst textComposerStateSelector = (state: TextComposerState) => ({\n  selection: state.selection,\n  suggestions: state.suggestions,\n  text: state.text,\n});\n\nconst searchSourceStateSelector = (state: SearchSourceState) => ({\n  isLoadingItems: state.isLoading,\n  items: state.items,\n});\n\nconst configStateSelector = (state: MessageComposerConfig) => ({\n  enabled: state.text.enabled,\n});\n\nconst messageComposerStateSelector = (state: MessageComposerState) => ({\n  quotedMessage: state.quotedMessage,\n});\n\nconst attachmentManagerStateSelector = (state: AttachmentManagerState) => ({\n  attachments: state.attachments,\n});\n\n/**\n * isComposing prevents double submissions in Korean and other languages.\n * starting point for a read:\n * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/isComposing\n * In the long term, the fix should happen by handling keypress, but changing this has unknown implications.\n */\nconst defaultShouldSubmit = (event: React.KeyboardEvent<HTMLTextAreaElement>) =>\n  event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing;\n\nexport type TextareaComposerProps = Omit<\n  TextareaHTMLAttributes<HTMLTextAreaElement>,\n  'style' | 'defaultValue' | 'disabled' | 'value'\n> & {\n  closeSuggestionsOnClickOutside?: boolean;\n  containerClassName?: string;\n  listClassName?: string;\n  maxRows?: number;\n  minRows?: number;\n  shouldSubmit?: (event: React.KeyboardEvent<HTMLTextAreaElement>) => boolean;\n};\n\nexport const TextareaComposer = ({\n  className,\n  closeSuggestionsOnClickOutside,\n  containerClassName,\n  listClassName,\n  maxRows: maxRowsProp,\n  minRows: minRowsProp,\n  onBlur,\n  onChange,\n  onKeyDown,\n  onScroll,\n  onSelect,\n  placeholder: placeholderProp,\n  shouldSubmit: shouldSubmitProp,\n  ...restTextareaProps\n}: TextareaComposerProps) => {\n  const { t } = useTranslationContext();\n  const { AutocompleteSuggestionList = DefaultSuggestionList } = useComponentContext();\n  const {\n    additionalTextareaProps,\n    cooldownRemaining,\n    focus,\n    handleSubmit,\n    maxRows: maxRowsContext,\n    minRows: minRowsContext,\n    onPaste,\n    shouldSubmit: shouldSubmitContext,\n    textareaRef,\n  } = useMessageInputContext();\n  const maxRows = maxRowsProp ?? maxRowsContext ?? 1;\n  const minRows = minRowsProp ?? minRowsContext;\n  const placeholder = placeholderProp ?? additionalTextareaProps?.placeholder;\n  const shouldSubmit = shouldSubmitProp ?? shouldSubmitContext ?? defaultShouldSubmit;\n\n  const messageComposer = useMessageComposer();\n  const { textComposer } = messageComposer;\n  const { selection, suggestions, text } = useStateStore(\n    textComposer.state,\n    textComposerStateSelector,\n  );\n\n  const { enabled } = useStateStore(messageComposer.configState, configStateSelector);\n  const { quotedMessage } = useStateStore(\n    messageComposer.state,\n    messageComposerStateSelector,\n  );\n  const { attachments } = useStateStore(\n    messageComposer.attachmentManager.state,\n    attachmentManagerStateSelector,\n  );\n\n  const { isLoadingItems } =\n    useStateStore(suggestions?.searchSource.state, searchSourceStateSelector) ?? {};\n\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [focusedItemIndex, setFocusedItemIndex] = useState(0);\n\n  const [isComposing, setIsComposing] = useState(false);\n\n  const changeHandler: ChangeEventHandler<HTMLTextAreaElement> = useCallback(\n    (e) => {\n      if (onChange) {\n        onChange(e);\n        return;\n      }\n      if (!textareaRef.current) return;\n      textComposer.handleChange({\n        selection: {\n          end: textareaRef.current.selectionEnd,\n          start: textareaRef.current.selectionStart,\n        },\n        text: e.target.value,\n      });\n    },\n    [onChange, textComposer, textareaRef],\n  );\n\n  const onCompositionEnd = useCallback(() => {\n    setIsComposing(false);\n  }, []);\n\n  const onCompositionStart = useCallback(() => {\n    setIsComposing(true);\n  }, []);\n\n  const keyDownHandler = useCallback(\n    (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n      if (onKeyDown) {\n        onKeyDown(event);\n        return;\n      }\n\n      if (\n        textComposer.suggestions &&\n        textComposer.suggestions.searchSource.items?.length\n      ) {\n        if (event.key === 'Escape') return textComposer.closeSuggestions();\n        const loadedItems = textComposer.suggestions.searchSource.items;\n        if (event.key === 'Enter') {\n          event.preventDefault();\n          textComposer.handleSelect(loadedItems[focusedItemIndex]);\n        }\n        if (event.key === 'ArrowUp') {\n          event.preventDefault();\n          setFocusedItemIndex((prev) => {\n            let nextIndex = prev - 1;\n            if (suggestions?.searchSource.hasNext) {\n              nextIndex = prev;\n            } else if (nextIndex < 0) {\n              nextIndex = loadedItems.length - 1;\n            }\n            return nextIndex;\n          });\n        }\n        if (event.key === 'ArrowDown') {\n          event.preventDefault();\n          setFocusedItemIndex((prev) => {\n            let nextIndex = prev + 1;\n            if (suggestions?.searchSource.hasNext) {\n              nextIndex = prev;\n            } else if (nextIndex >= loadedItems.length) {\n              nextIndex = 0;\n            }\n\n            return nextIndex;\n          });\n        }\n      } else if (\n        shouldSubmit(event) &&\n        textareaRef.current &&\n        messageComposer.hasSendableData\n      ) {\n        if (event.key === 'Enter') {\n          // prevent adding newline when submitting a message with\n          event.preventDefault();\n        }\n        handleSubmit();\n      }\n    },\n    [\n      focusedItemIndex,\n      handleSubmit,\n      messageComposer,\n      onKeyDown,\n      shouldSubmit,\n      suggestions,\n      textComposer,\n      textareaRef,\n    ],\n  );\n\n  const scrollHandler: UIEventHandler<HTMLTextAreaElement> = useCallback(\n    (event) => {\n      if (onScroll) {\n        onScroll(event);\n      } else {\n        textComposer.closeSuggestions();\n      }\n    },\n    [onScroll, textComposer],\n  );\n\n  const setSelection = useCallback(\n    (e: SyntheticEvent<HTMLTextAreaElement>) => {\n      onSelect?.(e);\n      textComposer.setSelection({\n        end: (e.target as HTMLTextAreaElement).selectionEnd,\n        start: (e.target as HTMLTextAreaElement).selectionStart,\n      });\n    },\n    [onSelect, textComposer],\n  );\n\n  useEffect(() => {\n    if (textComposer.suggestions) {\n      setFocusedItemIndex(0);\n    }\n  }, [textComposer.suggestions]);\n\n  useEffect(() => {\n    const textareaIsFocused = textareaRef.current?.matches(':focus');\n    if (!textareaRef.current || textareaIsFocused || !focus) return;\n    textareaRef.current.focus();\n  }, [attachments, focus, quotedMessage, textareaRef]);\n\n  useLayoutEffect(() => {\n    /**\n     * It is important to perform set text and after that the range\n     * to prevent cursor reset to the end of the textarea if doing it in separate effects.\n     */\n    const textarea = textareaRef.current;\n    if (!textarea || isComposing) return;\n\n    /**\n     * The textarea value has to be overridden outside the render cycle so that the events like compositionend can be triggered.\n     * If we have overridden the value during the component rendering, the compositionend event would not be triggered, and\n     * it would not be possible to type composed characters (\u00F4).\n     * On the other hand, just removing the value override via prop (value={text}) would not allow us to change the text based on\n     * middleware results (e.g. replace characters with emojis)\n     */\n    if (textarea.value !== text) {\n      textarea.value = text;\n    }\n\n    const length = textarea.value.length;\n    const start = Math.max(0, Math.min(selection.start, length));\n    const end = Math.max(start, Math.min(selection.end, length));\n\n    if (textarea.selectionStart === start && textarea.selectionEnd === end) return;\n\n    textarea.setSelectionRange(start, end, 'forward');\n  }, [text, selection.start, selection.end, isComposing, textareaRef]);\n\n  return (\n    <div\n      className={clsx(\n        'rta',\n        'str-chat__textarea str-chat__message-textarea-react-host',\n        containerClassName,\n        {\n          ['rta--loading']: isLoadingItems,\n        },\n      )}\n      ref={containerRef}\n    >\n      <Textarea\n        {...{ ...additionalTextareaProps, ...restTextareaProps }}\n        aria-label={cooldownRemaining ? t('Slow Mode ON') : placeholder}\n        className={clsx(\n          'rta__textarea',\n          'str-chat__textarea__textarea str-chat__message-textarea',\n          className,\n        )}\n        data-testid='message-input'\n        disabled={!enabled || !!cooldownRemaining}\n        maxRows={maxRows}\n        minRows={minRows}\n        onBlur={onBlur}\n        onChange={changeHandler}\n        onCompositionEnd={onCompositionEnd}\n        onCompositionStart={onCompositionStart}\n        onKeyDown={keyDownHandler}\n        onPaste={onPaste}\n        onScroll={scrollHandler}\n        onSelect={setSelection}\n        placeholder={placeholder || t('Type your message')}\n        ref={(ref) => {\n          textareaRef.current = ref;\n        }}\n      />\n      {/* todo: X document the layout change for the accessibility purpose (tabIndex) */}\n      {!isComposing && (\n        <AutocompleteSuggestionList\n          className={listClassName}\n          closeOnClickOutside={closeSuggestionsOnClickOutside}\n          focusedItemIndex={focusedItemIndex}\n          setFocusedItemIndex={setFocusedItemIndex}\n        />\n      )}\n    </div>\n  );\n};\n", "import type { CSSProperties, ElementType, PropsWithChildren } from 'react';\nimport React, { useCallback, useContext, useEffect, useMemo, useRef } from 'react';\nimport { useDropzone } from 'react-dropzone';\nimport clsx from 'clsx';\nimport type { MessageComposerConfig } from 'stream-chat';\n\nimport { useMessageInputContext, useTranslationContext } from '../../context';\nimport { useAttachmentManagerState, useMessageComposer } from './hooks';\nimport { useStateStore } from '../../store';\n\nconst DragAndDropUploadContext = React.createContext<{\n  subscribeToDrop: ((fn: (files: File[]) => void) => () => void) | null;\n}>({\n  subscribeToDrop: null,\n});\n\nexport const useDragAndDropUploadContext = () => useContext(DragAndDropUploadContext);\n\n/**\n * @private This hook should be used only once directly in the `MessageInputProvider` to\n * register `uploadNewFiles` functions of the rendered `MessageInputs`. Each `MessageInput`\n * will then be notified when the drop event occurs from within the `WithDragAndDropUpload`\n * component.\n */\nexport const useRegisterDropHandlers = () => {\n  const { subscribeToDrop } = useDragAndDropUploadContext();\n\n  const messageComposer = useMessageComposer();\n\n  useEffect(() => {\n    const unsubscribe = subscribeToDrop?.(messageComposer.attachmentManager.uploadFiles);\n\n    return unsubscribe;\n  }, [subscribeToDrop, messageComposer]);\n};\n\nconst attachmentManagerConfigStateSelector = (state: MessageComposerConfig) => ({\n  acceptedFiles: state.attachments.acceptedFiles,\n  multipleUploads: state.attachments.maxNumberOfFilesPerMessage > 1,\n});\n\n/**\n * Wrapper to replace now deprecated `Channel.dragAndDropWindow` option.\n *\n * @example\n * ```tsx\n * <Channel>\n *  <WithDragAndDropUpload component=\"section\" className=\"message-list-dnd-wrapper\">\n *    <Window>\n *      <MessageList />\n *      <MessageInput />\n *    </Window>\n *  </WithDragAndDropUpload>\n *  <Thread />\n * <Channel>\n * ```\n */\nexport const WithDragAndDropUpload = ({\n  children,\n  className,\n  component: Component = 'div',\n  style,\n}: PropsWithChildren<{\n  acceptedFiles?: string[];\n  /**\n   * @description An element to render as a wrapper onto which drag & drop functionality will be applied.\n   * @default 'div'\n   */\n  component?: ElementType;\n  className?: string;\n  style?: CSSProperties;\n}>) => {\n  const dropHandlersRef = useRef<Set<(f: File[]) => void>>(new Set());\n  const { t } = useTranslationContext();\n\n  const messageInputContext = useMessageInputContext();\n  const dragAndDropUploadContext = useDragAndDropUploadContext();\n  const messageComposer = useMessageComposer();\n  const { isUploadEnabled } = useAttachmentManagerState();\n  const { acceptedFiles, multipleUploads } = useStateStore(\n    messageComposer.configState,\n    attachmentManagerConfigStateSelector,\n  );\n  // if message input context is available, there's no need to use the queue\n  const isWithinMessageInputContext = Object.keys(messageInputContext).length > 0;\n\n  const accept = useMemo(\n    () =>\n      acceptedFiles.reduce<Record<string, Array<string>>>((mediaTypeMap, mediaType) => {\n        mediaTypeMap[mediaType] ??= [];\n        return mediaTypeMap;\n      }, {}),\n    [acceptedFiles],\n  );\n\n  const subscribeToDrop = useCallback((fn: (files: File[]) => void) => {\n    dropHandlersRef.current.add(fn);\n\n    return () => {\n      dropHandlersRef.current.delete(fn);\n    };\n  }, []);\n\n  const handleDrop = useCallback((files: File[]) => {\n    dropHandlersRef.current.forEach((fn) => fn(files));\n  }, []);\n\n  const { getRootProps, isDragActive, isDragReject } = useDropzone({\n    accept,\n    // apply `disabled` rules if available, otherwise allow anything and\n    // let the `uploadNewFiles` handle the limitations internally\n    disabled: isWithinMessageInputContext\n      ? !isUploadEnabled || (messageInputContext.cooldownRemaining ?? 0) > 0\n      : false,\n    multiple: multipleUploads,\n    noClick: true,\n    onDrop: isWithinMessageInputContext\n      ? messageComposer.attachmentManager.uploadFiles\n      : handleDrop,\n  });\n\n  // nested WithDragAndDropUpload components render wrappers without functionality\n  // (MessageInputFlat has a default WithDragAndDropUpload)\n  if (dragAndDropUploadContext.subscribeToDrop !== null) {\n    return <Component className={className}>{children}</Component>;\n  }\n\n  return (\n    <DragAndDropUploadContext.Provider\n      value={{\n        subscribeToDrop,\n      }}\n    >\n      <Component {...getRootProps({ className, style })}>\n        {/* TODO: could be a replaceable component */}\n        {isDragActive && (\n          <div\n            className={clsx('str-chat__dropzone-container', {\n              'str-chat__dropzone-container--not-accepted': isDragReject,\n            })}\n          >\n            {!isDragReject && <p>{t('Drag your files here')}</p>}\n            {isDragReject && <p>{t('Some of the files will not be accepted')}</p>}\n          </div>\n        )}\n        {children}\n      </Component>\n    </DragAndDropUploadContext.Provider>\n  );\n};\n", "import { useMemo } from 'react';\n\nimport type { MessageInputContextValue } from '../../../context/MessageInputContext';\n\nexport const useCreateMessageInputContext = (value: MessageInputContextValue) => {\n  const {\n    additionalTextareaProps,\n    asyncMessagesMultiSendEnabled,\n    audioRecordingEnabled,\n    clearEditingState,\n    cooldownInterval,\n    cooldownRemaining,\n    emojiSearchIndex,\n    focus,\n    handleSubmit,\n    hideSendButton,\n    isThreadInput,\n    maxRows,\n    minRows,\n    onPaste,\n    parent,\n    recordingController,\n    setCooldownRemaining,\n    shouldSubmit,\n    textareaRef,\n  } = value;\n\n  const parentId = parent?.id;\n\n  const messageInputContext: MessageInputContextValue = useMemo(\n    () => ({\n      additionalTextareaProps,\n      asyncMessagesMultiSendEnabled,\n      audioRecordingEnabled,\n      clearEditingState,\n      cooldownInterval,\n      cooldownRemaining,\n      emojiSearchIndex,\n      focus,\n      handleSubmit,\n      hideSendButton,\n      isThreadInput,\n      maxRows,\n      minRows,\n      onPaste,\n      parent,\n      recordingController,\n      setCooldownRemaining,\n      shouldSubmit,\n      textareaRef,\n    }),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      asyncMessagesMultiSendEnabled,\n      audioRecordingEnabled,\n      cooldownInterval,\n      cooldownRemaining,\n      emojiSearchIndex,\n      handleSubmit,\n      hideSendButton,\n      isThreadInput,\n      minRows,\n      parentId,\n      recordingController,\n    ],\n  );\n\n  return messageInputContext;\n};\n", "import React from 'react';\nimport clsx from 'clsx';\nimport ReactPlayer from 'react-player';\n\nimport type { AudioProps } from './Audio';\nimport { ImageComponent } from '../Gallery';\nimport { SafeAnchor } from '../SafeAnchor';\nimport { PlayButton, ProgressBar } from './components';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nimport type { Attachment } from 'stream-chat';\nimport type { RenderAttachmentProps } from './utils';\nimport type { Dimensions } from '../../types/types';\nimport { type AudioPlayerState, useAudioPlayer } from '../AudioPlayback';\nimport { useStateStore } from '../../store';\nimport { useMessageContext } from '../../context';\n\nconst getHostFromURL = (url?: string | null) => {\n  if (url !== undefined && url !== null) {\n    const [trimmedUrl] = url.replace(/^(?:https?:\\/\\/)?(?:www\\.)?/i, '').split('/');\n\n    return trimmedUrl;\n  }\n  return null;\n};\n\nconst UnableToRenderCard = ({ type }: { type?: CardProps['type'] }) => {\n  const { t } = useTranslationContext('Card');\n\n  return (\n    <div\n      className={clsx('str-chat__message-attachment-card', {\n        [`str-chat__message-attachment-card--${type}`]: type,\n      })}\n    >\n      <div className='str-chat__message-attachment-card--content'>\n        <div className='str-chat__message-attachment-card--text'>\n          {t('this content could not be displayed')}\n        </div>\n      </div>\n    </div>\n  );\n};\n\nconst SourceLink = ({\n  author_name,\n  url,\n}: Pick<CardProps, 'author_name'> & { url: string }) => (\n  <div\n    className='str-chat__message-attachment-card--source-link'\n    data-testid='card-source-link'\n  >\n    <SafeAnchor\n      className='str-chat__message-attachment-card--url'\n      href={url}\n      rel='noopener noreferrer'\n      target='_blank'\n    >\n      {author_name || getHostFromURL(url)}\n    </SafeAnchor>\n  </div>\n);\n\ntype CardHeaderProps = Pick<\n  CardProps,\n  'asset_url' | 'title' | 'type' | 'image_url' | 'thumb_url'\n> & {\n  dimensions: Dimensions;\n  image?: string;\n};\n\nconst CardHeader = (props: CardHeaderProps) => {\n  const { asset_url, dimensions, image, image_url, thumb_url, title, type } = props;\n\n  let visual = null;\n  if (asset_url && type === 'video') {\n    visual = (\n      <ReactPlayer\n        className='react-player'\n        controls\n        height='100%'\n        url={asset_url}\n        width='100%'\n      />\n    );\n  } else if (image) {\n    visual = (\n      <ImageComponent\n        dimensions={dimensions}\n        fallback={title || image}\n        image_url={image_url}\n        thumb_url={thumb_url}\n      />\n    );\n  }\n\n  return visual ? (\n    <div\n      className='str-chat__message-attachment-card--header str-chat__message-attachment-card-react--header'\n      data-testid={'card-header'}\n    >\n      {visual}\n    </div>\n  ) : null;\n};\n\ntype CardContentProps = RenderAttachmentProps['attachment'];\n\nconst CardContent = (props: CardContentProps) => {\n  const { author_name, og_scrape_url, text, title, title_link, type } = props;\n  const url = title_link || og_scrape_url;\n\n  return (\n    <div className='str-chat__message-attachment-card--content'>\n      {type === 'audio' ? (\n        <CardAudio og={props} />\n      ) : (\n        <div className='str-chat__message-attachment-card--flex'>\n          {url && <SourceLink author_name={author_name} url={url} />}\n          {title && (\n            <div className='str-chat__message-attachment-card--title'>{title}</div>\n          )}\n          {text && <div className='str-chat__message-attachment-card--text'>{text}</div>}\n        </div>\n      )}\n    </div>\n  );\n};\n\nconst audioPlayerStateSelector = (state: AudioPlayerState) => ({\n  isPlaying: state.isPlaying,\n  progress: state.progressPercent,\n});\n\nconst AudioWidget = ({ mimeType, src }: { src: string; mimeType?: string }) => {\n  /**\n   * Introducing message context. This could be breaking change, therefore the fallback to {} is provided.\n   * If this component is used outside the message context, then there will be no audio player namespacing\n   * => scrolling away from the message in virtualized ML would create a new AudioPlayer instance.\n   *\n   * Edge case: the requester (message) has multiple attachments with the same assetURL - does not happen\n   * with the default SDK components, but can be done with custom API calls.In this case all the Audio\n   * widgets will share the state.\n   */\n  const { message, threadList } = useMessageContext() ?? {};\n\n  const audioPlayer = useAudioPlayer({\n    mimeType,\n    requester:\n      message?.id &&\n      `${threadList ? (message.parent_id ?? message.id) : ''}${message.id}`,\n    src,\n  });\n\n  const { isPlaying, progress } =\n    useStateStore(audioPlayer?.state, audioPlayerStateSelector) ?? {};\n\n  if (!audioPlayer) return;\n\n  return (\n    <div className='str-chat__message-attachment-card-audio-widget--first-row'>\n      <div className='str-chat__message-attachment-audio-widget--play-controls'>\n        <PlayButton isPlaying={!!isPlaying} onClick={audioPlayer.togglePlay} />\n      </div>\n      <ProgressBar onClick={audioPlayer.seek} progress={progress ?? 0} />\n    </div>\n  );\n};\n\nexport const CardAudio = ({\n  og: { asset_url, author_name, mime_type, og_scrape_url, text, title, title_link },\n}: AudioProps) => {\n  const url = title_link || og_scrape_url;\n  const dataTestId = 'card-audio-widget';\n  const rootClassName = 'str-chat__message-attachment-card-audio-widget';\n  return (\n    <div className={rootClassName} data-testid={dataTestId}>\n      {asset_url && <AudioWidget mimeType={mime_type} src={asset_url} />}\n      <div className='str-chat__message-attachment-audio-widget--second-row'>\n        {url && <SourceLink author_name={author_name} url={url} />}\n        {title && (\n          <div className='str-chat__message-attachment-audio-widget--title'>{title}</div>\n        )}\n        {text && (\n          <div className='str-chat__message-attachment-audio-widget--description'>\n            {text}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n};\n\nexport type CardProps = RenderAttachmentProps['attachment'];\n\nconst UnMemoizedCard = (props: CardProps) => {\n  const { asset_url, giphy, image_url, thumb_url, title, title_link, type } = props;\n  const { giphyVersion: giphyVersionName } = useChannelStateContext('CardHeader');\n\n  let image = thumb_url || image_url;\n  const dimensions: { height?: string; width?: string } = {};\n\n  if (type === 'giphy' && typeof giphy !== 'undefined') {\n    const giphyVersion =\n      giphy[giphyVersionName as keyof NonNullable<Attachment['giphy']>];\n    image = giphyVersion.url;\n    dimensions.height = giphyVersion.height;\n    dimensions.width = giphyVersion.width;\n  }\n\n  if (!title && !title_link && !asset_url && !image) {\n    return <UnableToRenderCard />;\n  }\n\n  return (\n    <div\n      className={`str-chat__message-attachment-card str-chat__message-attachment-card--${type}`}\n    >\n      <CardHeader {...props} dimensions={dimensions} image={image} />\n      <CardContent {...props} />\n    </div>\n  );\n};\n\n/**\n * Simple Card Layout for displaying links\n */\nexport const Card = React.memo(UnMemoizedCard) as typeof UnMemoizedCard;\n", "import React from 'react';\nimport { FileIcon } from '../ReactFileUtilities';\nimport type { Attachment } from 'stream-chat';\n\nimport { DownloadButton, FileSizeIndicator } from './components';\n\nexport type FileAttachmentProps = {\n  attachment: Attachment;\n};\n\nconst UnMemoizedFileAttachment = ({ attachment }: FileAttachmentProps) => (\n  <div className='str-chat__message-attachment-file--item' data-testid='attachment-file'>\n    <FileIcon className='str-chat__file-icon' mimeType={attachment.mime_type} />\n    <div className='str-chat__message-attachment-file--item-text'>\n      <div className='str-chat__message-attachment-file--item-first-row'>\n        <div\n          className='str-chat__message-attachment-file--item-name'\n          data-testid='file-title'\n        >\n          {attachment.title}\n        </div>\n        <DownloadButton assetUrl={attachment.asset_url} />\n      </div>\n      <FileSizeIndicator fileSize={attachment.file_size} />\n    </div>\n  </div>\n);\n\nexport const FileAttachment = React.memo(\n  UnMemoizedFileAttachment,\n) as typeof UnMemoizedFileAttachment;\n", "import type { ComponentType } from 'react';\nimport { useEffect } from 'react';\nimport { useRef, useState } from 'react';\nimport React from 'react';\nimport type { Coords, SharedLocationResponse } from 'stream-chat';\nimport { useChatContext, useTranslationContext } from '../../context';\nimport { ExternalLinkIcon, GeolocationIcon } from './icons';\n\nexport type GeolocationMapProps = Coords;\n\nexport type GeolocationProps = {\n  location: SharedLocationResponse;\n  GeolocationAttachmentMapPlaceholder?: ComponentType<GeolocationAttachmentMapPlaceholderProps>;\n  GeolocationMap?: ComponentType<GeolocationMapProps>;\n};\n\nexport const Geolocation = ({\n  GeolocationAttachmentMapPlaceholder = DefaultGeolocationAttachmentMapPlaceholder,\n  GeolocationMap,\n  location,\n}: GeolocationProps) => {\n  const { channel, client } = useChatContext();\n  const { t } = useTranslationContext();\n\n  const [stoppedSharing, setStoppedSharing] = useState(\n    !!location.end_at && new Date(location.end_at).getTime() < new Date().getTime(),\n  );\n  const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n  const isMyLocation = location.user_id === client.userID;\n  const isLiveLocation = !!location.end_at;\n\n  useEffect(() => {\n    if (!location.end_at) return;\n    clearTimeout(timeoutRef.current);\n    timeoutRef.current = setTimeout(\n      () => setStoppedSharing(true),\n      new Date(location.end_at).getTime() - Date.now(),\n    );\n  }, [location.end_at]);\n\n  return (\n    <div\n      className='str-chat__message-attachment-geolocation'\n      data-testid='attachment-geolocation'\n    >\n      <div className='str-chat__message-attachment-geolocation__location-preview'>\n        {GeolocationMap ? (\n          <GeolocationMap latitude={location.latitude} longitude={location.longitude} />\n        ) : (\n          <GeolocationAttachmentMapPlaceholder location={location} />\n        )}\n      </div>\n      <div className='str-chat__message-attachment-geolocation__status'>\n        {isLiveLocation ? (\n          stoppedSharing ? (\n            t('Location sharing ended')\n          ) : isMyLocation ? (\n            <div className='str-chat__message-attachment-geolocation__status--active'>\n              <button\n                className='str-chat__message-attachment-geolocation__stop-sharing-button'\n                onClick={() => channel?.stopLiveLocationSharing(location)}\n                type='button'\n              >\n                {t('Stop sharing')}\n              </button>\n              <div className='str-chat__message-attachment-geolocation__status--active-until'>\n                {t('Live until {{ timestamp }}', {\n                  timestamp: t('timestamp/LiveLocation', { timestamp: location.end_at }),\n                })}\n              </div>\n            </div>\n          ) : (\n            <div className='str-chat__message-attachment-geolocation__status--active'>\n              <div className='str-chat__message-attachment-geolocation__status--active-status'>\n                {t('Live location')}\n              </div>\n              <div className='str-chat__message-attachment-geolocation__status--active-until'>\n                {t('Live until {{ timestamp }}', {\n                  timestamp: t('timestamp/LiveLocation', { timestamp: location.end_at }),\n                })}\n              </div>\n            </div>\n          )\n        ) : (\n          t('Current location')\n        )}\n      </div>\n    </div>\n  );\n};\n\nexport type GeolocationAttachmentMapPlaceholderProps = {\n  location: SharedLocationResponse;\n};\n\nconst DefaultGeolocationAttachmentMapPlaceholder = ({\n  location,\n}: GeolocationAttachmentMapPlaceholderProps) => (\n  <div\n    className='str-chat__message-attachment-geolocation__placeholder'\n    data-testid='geolocation-attachment-map-placeholder'\n  >\n    <GeolocationIcon />\n    <a\n      className='str-chat__message-attachment-geolocation__placeholder-link'\n      href={`https://maps.google.com?q=${[location.latitude, location.longitude].join()}`}\n      rel='noreferrer'\n      target='_blank'\n    >\n      <ExternalLinkIcon />\n    </a>\n  </div>\n);\n", "import React from 'react';\nimport type { Attachment } from 'stream-chat';\n\nimport { FileIcon } from '../ReactFileUtilities';\nimport { useTranslationContext } from '../../context';\n\nexport type UnsupportedAttachmentProps = {\n  attachment: Attachment;\n};\n\nexport const UnsupportedAttachment = ({ attachment }: UnsupportedAttachmentProps) => {\n  const { t } = useTranslationContext('UnsupportedAttachment');\n  return (\n    <div\n      className='str-chat__message-attachment-unsupported'\n      data-testid='attachment-unsupported'\n    >\n      <FileIcon className='str-chat__file-icon' />\n      <div className='str-chat__message-attachment-unsupported__metadata'>\n        <div\n          className='str-chat__message-attachment-unsupported__title'\n          data-testid='unsupported-attachment-title'\n        >\n          {attachment.title || t('Unsupported attachment')}\n        </div>\n      </div>\n    </div>\n  );\n};\n", "import throttle from 'lodash.throttle';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useChannelActionContext, useTranslationContext } from '../../../context';\n\nconst isSeekable = (audioElement: HTMLAudioElement) =>\n  !(audioElement.duration === Infinity || isNaN(audioElement.duration));\n\nexport const elementIsPlaying = (audioElement: HTMLAudioElement | null) =>\n  audioElement && !(audioElement.paused || audioElement.ended);\n\nconst logError = (e: Error) => console.error('[AUDIO PLAYER]', e);\n\nconst DEFAULT_PLAYBACK_RATES = [1.0, 1.5, 2.0];\n\nexport type SeekFn = (params: { clientX: number; currentTarget: HTMLDivElement }) => void;\n\ntype AudioControllerParams = {\n  /** Audio duration in seconds. */\n  durationSeconds?: number;\n  /** The audio MIME type that is checked before the audio is played. If the type is not supported the controller registers error in playbackError. */\n  mimeType?: string;\n  /** An array of fractional numeric values of playback speed to override the defaults (1.0, 1.5, 2.0) */\n  playbackRates?: number[];\n};\n\n/** @deprecated use useAudioPlayer instead */\nexport const useAudioController = ({\n  durationSeconds,\n  mimeType,\n  playbackRates = DEFAULT_PLAYBACK_RATES,\n}: AudioControllerParams = {}) => {\n  const { addNotification } = useChannelActionContext('useAudioController');\n  const { t } = useTranslationContext('useAudioController');\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [playbackError, setPlaybackError] = useState<Error>();\n  const [canPlayRecord, setCanPlayRecord] = useState(true);\n  const [secondsElapsed, setSecondsElapsed] = useState(0);\n  const [playbackRateIndex, setPlaybackRateIndex] = useState<number>(0);\n  const playTimeout = useRef<ReturnType<typeof setTimeout>>(undefined);\n  const audioRef = useRef<HTMLAudioElement | null>(null);\n\n  const registerError = useCallback(\n    (e: Error) => {\n      logError(e as Error);\n      setPlaybackError(e);\n      addNotification(e.message, 'error');\n    },\n    [addNotification],\n  );\n\n  const togglePlay = useCallback(async () => {\n    if (!audioRef.current) return;\n    clearTimeout(playTimeout.current);\n    playTimeout.current = undefined;\n    if (mimeType && !audioRef.current.canPlayType(mimeType)) {\n      registerError(\n        new Error(t('Recording format is not supported and cannot be reproduced')),\n      );\n      setCanPlayRecord(false);\n      return;\n    }\n    if (elementIsPlaying(audioRef.current)) {\n      audioRef.current.pause();\n      setIsPlaying(false);\n    } else {\n      playTimeout.current = setTimeout(() => {\n        if (!audioRef.current) return;\n        try {\n          audioRef.current.pause();\n          setIsPlaying(false);\n        } catch (e) {\n          registerError(new Error(t('Failed to play the recording')));\n        }\n      }, 2000);\n\n      try {\n        await audioRef.current.play();\n        setIsPlaying(true);\n      } catch (e) {\n        registerError(e as Error);\n        setIsPlaying(false);\n      } finally {\n        clearTimeout(playTimeout.current);\n        playTimeout.current = undefined;\n      }\n    }\n  }, [mimeType, registerError, t]);\n\n  const increasePlaybackRate = () => {\n    setPlaybackRateIndex((prev) => {\n      if (!audioRef.current) return prev;\n      const nextIndex = prev === playbackRates.length - 1 ? 0 : prev + 1;\n      audioRef.current.playbackRate = playbackRates[nextIndex];\n      return nextIndex;\n    });\n  };\n\n  const seek = useMemo<SeekFn>(\n    () =>\n      throttle(({ clientX, currentTarget }) => {\n        if (!(currentTarget && audioRef.current)) return;\n        if (!isSeekable(audioRef.current)) {\n          registerError(new Error(t('Cannot seek in the recording')));\n          return;\n        }\n\n        const { width, x } = currentTarget.getBoundingClientRect();\n\n        const ratio = (clientX - x) / width;\n        if (ratio > 1 || ratio < 0) return;\n        const currentTime = ratio * audioRef.current.duration;\n        setSecondsElapsed(currentTime);\n        audioRef.current.currentTime = currentTime;\n      }, 16),\n    [registerError, t],\n  );\n\n  useEffect(() => {\n    if (!audioRef.current) return;\n    const audioElement = audioRef.current;\n\n    const handleEnded = () => {\n      setSecondsElapsed(audioElement?.duration ?? durationSeconds ?? 0);\n      setIsPlaying(false);\n    };\n    audioElement.addEventListener('ended', handleEnded);\n\n    const handleError = () => {\n      addNotification(t('Error reproducing the recording'), 'error');\n      setIsPlaying(false);\n    };\n    audioElement.addEventListener('error', handleError);\n\n    const handleTimeupdate = () => {\n      setSecondsElapsed(audioElement?.currentTime);\n    };\n    audioElement.addEventListener('timeupdate', handleTimeupdate);\n\n    return () => {\n      audioElement.pause();\n      audioElement.removeEventListener('ended', handleEnded);\n      audioElement.removeEventListener('error', handleError);\n      audioElement.removeEventListener('timeupdate', handleTimeupdate);\n    };\n  }, [addNotification, durationSeconds, t]);\n\n  return {\n    audioRef,\n    canPlayRecord,\n    increasePlaybackRate,\n    isPlaying,\n    playbackError,\n    playbackRate: playbackRates[playbackRateIndex],\n    progress:\n      audioRef.current && secondsElapsed\n        ? (secondsElapsed / audioRef.current.duration) * 100\n        : 0,\n    secondsElapsed,\n    seek,\n    togglePlay,\n  };\n};\n", "import { LiveLocationManager } from 'stream-chat';\nimport { useEffect, useMemo } from 'react';\nimport type { LiveLocationManagerConstructorParameters, StreamChat } from 'stream-chat';\n\nconst isMobile = () => /Mobi/i.test(navigator.userAgent);\n/**\n * Checks whether the current browser is Safari.\n */\nexport const isSafari = () => {\n  if (typeof navigator === 'undefined') return false;\n  return /^((?!chrome|android).)*safari/i.test(navigator.userAgent || '');\n};\n\n/**\n * Checks whether the current browser is Firefox.\n */\nexport const isFirefox = () => {\n  if (typeof navigator === 'undefined') return false;\n  return navigator.userAgent?.includes('Firefox');\n};\n\n/**\n * Checks whether the current browser is Google Chrome.\n */\nexport const isChrome = () => {\n  if (typeof navigator === 'undefined') return false;\n  return navigator.userAgent?.includes('Chrome');\n};\n\nconst browser = () => {\n  if (isChrome()) return 'chrome';\n  if (isFirefox()) return 'firefox';\n  if (isSafari()) return 'safari';\n  return 'other';\n};\n\nexport const useLiveLocationSharingManager = ({\n  client,\n  getDeviceId,\n  watchLocation,\n}: Omit<LiveLocationManagerConstructorParameters, 'client' | 'getDeviceId'> & {\n  client?: StreamChat | null;\n  getDeviceId?: () => string;\n}) => {\n  const manager = useMemo(() => {\n    if (!client) return null;\n\n    return new LiveLocationManager({\n      client,\n      getDeviceId:\n        getDeviceId ??\n        (() => `web-${isMobile() ? 'mobile' : 'desktop'}-${browser()}-${client.userID}`),\n      watchLocation,\n    });\n  }, [client, getDeviceId, watchLocation]);\n\n  useEffect(() => {\n    if (!manager) return;\n\n    manager.init();\n\n    return () => {\n      manager.unregisterSubscriptions();\n    };\n  }, [manager]);\n\n  return manager;\n};\n", "import type { ComponentProps, PropsWithChildren } from 'react';\nimport React, {\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useReducer,\n  useRef,\n  useState,\n} from 'react';\nimport clsx from 'clsx';\nimport debounce from 'lodash.debounce';\nimport throttle from 'lodash.throttle';\nimport type {\n  APIErrorResponse,\n  ChannelAPIResponse,\n  ChannelMemberResponse,\n  ChannelQueryOptions,\n  ChannelState,\n  DeleteMessageOptions,\n  ErrorFromResponse,\n  Event,\n  EventAPIResponse,\n  LocalMessage,\n  Message,\n  MessageResponse,\n  SendMessageAPIResponse,\n  SendMessageOptions,\n  Channel as StreamChannel,\n  StreamChat,\n  UpdateMessageOptions,\n} from 'stream-chat';\nimport { localMessageToNewMessagePayload } from 'stream-chat';\n\nimport { initialState, makeChannelReducer } from './channelState';\nimport { useCreateChannelStateContext } from './hooks/useCreateChannelStateContext';\nimport { useCreateTypingContext } from './hooks/useCreateTypingContext';\nimport { useEditMessageHandler } from './hooks/useEditMessageHandler';\nimport { useIsMounted } from './hooks/useIsMounted';\nimport type { OnMentionAction } from './hooks/useMentionsHandlers';\nimport { useMentionsHandlers } from './hooks/useMentionsHandlers';\n\nimport type { LoadingErrorIndicatorProps } from '../Loading';\nimport {\n  LoadingErrorIndicator as DefaultLoadingErrorIndicator,\n  LoadingChannel as DefaultLoadingIndicator,\n} from '../Loading';\n\nimport type {\n  ChannelActionContextValue,\n  ChannelNotifications,\n  ComponentContextValue,\n  MarkReadWrapperOptions,\n} from '../../context';\nimport {\n  ChannelActionProvider,\n  ChannelStateProvider,\n  TypingProvider,\n  useChatContext,\n  useTranslationContext,\n  WithComponents,\n} from '../../context';\n\nimport { CHANNEL_CONTAINER_ID } from './constants';\nimport {\n  DEFAULT_HIGHLIGHT_DURATION,\n  DEFAULT_JUMP_TO_PAGE_SIZE,\n  DEFAULT_NEXT_CHANNEL_PAGE_SIZE,\n  DEFAULT_THREAD_PAGE_SIZE,\n} from '../../constants/limits';\n\nimport { hasMoreMessagesProbably } from '../MessageList';\nimport {\n  getChatContainerClass,\n  useChannelContainerClasses,\n  useImageFlagEmojisOnWindowsClass,\n} from './hooks/useChannelContainerClasses';\nimport { findInMsgSetByDate, findInMsgSetById, makeAddNotifications } from './utils';\nimport { useThreadContext } from '../Threads';\nimport { getChannel } from '../../utils';\nimport type {\n  ChannelUnreadUiState,\n  GiphyVersions,\n  ImageAttachmentSizeHandler,\n  VideoAttachmentSizeHandler,\n} from '../../types/types';\nimport {\n  getImageAttachmentConfiguration,\n  getVideoAttachmentConfiguration,\n} from '../Attachment/attachment-sizing';\nimport { useSearchFocusedMessage } from '../../experimental/Search/hooks';\nimport { WithAudioPlayback } from '../AudioPlayback';\n\ntype ChannelPropsForwardedToComponentContext = Pick<\n  ComponentContextValue,\n  | 'Attachment'\n  | 'AttachmentPreviewList'\n  | 'AttachmentSelector'\n  | 'AttachmentSelectorInitiationButtonContents'\n  | 'AudioRecorder'\n  | 'AutocompleteSuggestionItem'\n  | 'AutocompleteSuggestionList'\n  | 'Avatar'\n  | 'BaseImage'\n  | 'CooldownTimer'\n  | 'CustomMessageActionsList'\n  | 'DateSeparator'\n  | 'EditMessageInput'\n  | 'EditMessageModal'\n  | 'EmojiPicker'\n  | 'emojiSearchIndex'\n  | 'EmptyStateIndicator'\n  | 'FileUploadIcon'\n  | 'GiphyPreviewMessage'\n  | 'HeaderComponent'\n  | 'Input'\n  | 'LinkPreviewList'\n  | 'LoadingIndicator'\n  | 'ShareLocationDialog'\n  | 'Message'\n  | 'MessageActions'\n  | 'MessageBouncePrompt'\n  | 'MessageBlocked'\n  | 'MessageDeleted'\n  | 'MessageIsThreadReplyInChannelButtonIndicator'\n  | 'MessageListNotifications'\n  | 'MessageListMainPanel'\n  | 'MessageNotification'\n  | 'MessageOptions'\n  | 'MessageRepliesCountButton'\n  | 'MessageStatus'\n  | 'MessageSystem'\n  | 'MessageTimestamp'\n  | 'Modal'\n  | 'ModalGallery'\n  | 'PinIndicator'\n  | 'PollActions'\n  | 'PollContent'\n  | 'PollCreationDialog'\n  | 'PollHeader'\n  | 'PollOptionSelector'\n  | 'QuotedMessage'\n  | 'QuotedMessagePreview'\n  | 'QuotedPoll'\n  | 'reactionOptions'\n  | 'ReactionSelector'\n  | 'ReactionsList'\n  | 'ReactionsListModal'\n  | 'ReminderNotification'\n  | 'SendButton'\n  | 'SendToChannelCheckbox'\n  | 'StartRecordingAudioButton'\n  | 'TextareaComposer'\n  | 'ThreadHead'\n  | 'ThreadHeader'\n  | 'ThreadStart'\n  | 'Timestamp'\n  | 'TypingIndicator'\n  | 'UnreadMessagesNotification'\n  | 'UnreadMessagesSeparator'\n  | 'VirtualMessage'\n  | 'StopAIGenerationButton'\n  | 'StreamedMessageText'\n>;\n\nexport type ChannelProps = ChannelPropsForwardedToComponentContext & {\n  /** Custom handler function that runs when the active channel has unread messages and the app is running on a separate browser tab */\n  activeUnreadHandler?: (unread: number, documentTitle: string) => void;\n  /** Allows multiple audio players to play the audio at the same time. Disabled by default. */\n  allowConcurrentAudioPlayback?: boolean;\n  /** The connected and active channel */\n  channel?: StreamChannel;\n  /**\n   * Optional configuration parameters used for the initial channel query.\n   * Applied only if the value of channel.initialized is false.\n   * If the channel instance has already been initialized (channel has been queried),\n   * then the channel query will be skipped and channelQueryOptions will not be applied.\n   */\n  channelQueryOptions?: ChannelQueryOptions;\n  /** Custom action handler to override the default `client.deleteMessage(message.id)` function */\n  doDeleteMessageRequest?: (\n    message: LocalMessage,\n    options?: DeleteMessageOptions,\n  ) => Promise<MessageResponse>;\n  /** Custom action handler to override the default `channel.markRead` request function (advanced usage only) */\n  doMarkReadRequest?: (\n    channel: StreamChannel,\n    setChannelUnreadUiState?: (state: ChannelUnreadUiState) => void,\n  ) => Promise<EventAPIResponse> | void;\n  /** Custom action handler to override the default `channel.sendMessage` request function (advanced usage only) */\n  doSendMessageRequest?: (\n    channel: StreamChannel,\n    message: Message,\n    options?: SendMessageOptions,\n  ) => ReturnType<StreamChannel['sendMessage']> | void;\n  /** Custom action handler to override the default `client.updateMessage` request function (advanced usage only) */\n  doUpdateMessageRequest?: (\n    cid: string,\n    updatedMessage: LocalMessage | MessageResponse,\n    options?: UpdateMessageOptions,\n  ) => ReturnType<StreamChat['updateMessage']>;\n  /** Custom UI component to be shown if no active channel is set, defaults to null and skips rendering the Channel component */\n  EmptyPlaceholder?: React.ReactElement;\n  /** The giphy version to render - check the keys of the [Image Object](https://developers.giphy.com/docs/api/schema#image-object) for possible values. Uses 'fixed_height' by default */\n  giphyVersion?: GiphyVersions;\n  /** A custom function to provide size configuration for image attachments */\n  imageAttachmentSizeHandler?: ImageAttachmentSizeHandler;\n  /**\n   * Allows to prevent triggering the channel.watch() call when mounting the component.\n   * That means that no channel data from the back-end will be received neither channel WS events will be delivered to the client.\n   * Preventing to initialize the channel on mount allows us to postpone the channel creation to a later point in time.\n   */\n  initializeOnMount?: boolean;\n  /** Custom UI component to be shown if the channel query fails, defaults to and accepts same props as: [LoadingErrorIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Loading/LoadingErrorIndicator.tsx) */\n  LoadingErrorIndicator?: React.ComponentType<LoadingErrorIndicatorProps>;\n  /** Configuration parameter to mark the active channel as read when mounted (opened). By default, the channel is marked read on mount. */\n  markReadOnMount?: boolean;\n  /** Custom action handler function to run on click of an @mention in a message */\n  onMentionsClick?: OnMentionAction;\n  /** Custom action handler function to run on hover of an @mention in a message */\n  onMentionsHover?: OnMentionAction;\n  /** You can turn on/off thumbnail generation for video attachments */\n  shouldGenerateVideoThumbnail?: boolean;\n  /** If true, skips the message data string comparison used to memoize the current channel messages (helpful for channels with 1000s of messages) */\n  skipMessageDataMemoization?: boolean;\n  /** A custom function to provide size configuration for video attachments */\n  videoAttachmentSizeHandler?: VideoAttachmentSizeHandler;\n};\n\nconst ChannelContainer = ({\n  children,\n  className: additionalClassName,\n  ...props\n}: PropsWithChildren<ComponentProps<'div'>>) => {\n  const { customClasses, theme } = useChatContext('Channel');\n  const { channelClass, chatClass } = useChannelContainerClasses({\n    customClasses,\n  });\n  const className = clsx(chatClass, theme, channelClass, additionalClassName);\n  return (\n    <div id={CHANNEL_CONTAINER_ID} {...props} className={className}>\n      {children}\n    </div>\n  );\n};\n\nconst UnMemoizedChannel = (props: PropsWithChildren<ChannelProps>) => {\n  const {\n    channel: propsChannel,\n    EmptyPlaceholder = null,\n    LoadingErrorIndicator,\n    LoadingIndicator = DefaultLoadingIndicator,\n  } = props;\n\n  const { channel: contextChannel, channelsQueryState } = useChatContext('Channel');\n\n  const channel = propsChannel || contextChannel;\n\n  if (channelsQueryState.queryInProgress === 'reload' && LoadingIndicator) {\n    return (\n      <ChannelContainer>\n        <LoadingIndicator />\n      </ChannelContainer>\n    );\n  }\n\n  if (channelsQueryState.error && LoadingErrorIndicator) {\n    return (\n      <ChannelContainer>\n        <LoadingErrorIndicator error={channelsQueryState.error} />\n      </ChannelContainer>\n    );\n  }\n\n  if (!channel?.cid) {\n    return <ChannelContainer>{EmptyPlaceholder}</ChannelContainer>;\n  }\n\n  return <ChannelInner {...props} channel={channel} key={channel.cid} />;\n};\n\nconst ChannelInner = (\n  props: PropsWithChildren<\n    ChannelProps & {\n      channel: StreamChannel;\n      key: string;\n    }\n  >,\n) => {\n  const {\n    activeUnreadHandler,\n    allowConcurrentAudioPlayback,\n    channel,\n    channelQueryOptions,\n    children,\n    doDeleteMessageRequest,\n    doMarkReadRequest,\n    doSendMessageRequest,\n    doUpdateMessageRequest,\n    initializeOnMount = true,\n    LoadingErrorIndicator = DefaultLoadingErrorIndicator,\n    LoadingIndicator = DefaultLoadingIndicator,\n    markReadOnMount = true,\n    onMentionsClick,\n    onMentionsHover,\n    skipMessageDataMemoization,\n  } = props;\n\n  const { client, customClasses, latestMessageDatesByChannels, mutes, searchController } =\n    useChatContext('Channel');\n  const { t } = useTranslationContext('Channel');\n  const chatContainerClass = getChatContainerClass(customClasses?.chatContainer);\n  const windowsEmojiClass = useImageFlagEmojisOnWindowsClass();\n  const thread = useThreadContext();\n\n  const [channelConfig, setChannelConfig] = useState(channel.getConfig());\n  const [notifications, setNotifications] = useState<ChannelNotifications>([]);\n  const notificationTimeouts = useRef<Array<NodeJS.Timeout>>([]);\n\n  const [channelUnreadUiState, _setChannelUnreadUiState] =\n    useState<ChannelUnreadUiState>();\n\n  const channelReducer = useMemo(() => makeChannelReducer(), []);\n\n  const [state, dispatch] = useReducer(\n    channelReducer,\n    // channel.initialized === false if client.channel().query() was not called, e.g. ChannelList is not used\n    // => Channel will call channel.watch() in useLayoutEffect => state.loading is used to signal the watch() call state\n    {\n      ...initialState,\n      hasMore: channel.state.messagePagination.hasPrev,\n      loading: !channel.initialized,\n      messages: channel.state.messages,\n    },\n  );\n  const jumpToMessageFromSearch = useSearchFocusedMessage();\n  const isMounted = useIsMounted();\n\n  const originalTitle = useRef('');\n  const lastRead = useRef<Date | undefined>(undefined);\n  const online = useRef(true);\n\n  const clearHighlightedMessageTimeoutId = useRef<ReturnType<typeof setTimeout> | null>(\n    null,\n  );\n\n  const channelCapabilitiesArray = channel.data?.own_capabilities as string[];\n\n  const throttledCopyStateFromChannel = throttle(\n    () => dispatch({ channel, type: 'copyStateFromChannelOnEvent' }),\n    500,\n    {\n      leading: true,\n      trailing: true,\n    },\n  );\n\n  const setChannelUnreadUiState = useMemo(\n    () =>\n      throttle(_setChannelUnreadUiState, 200, {\n        leading: true,\n        trailing: false,\n      }),\n    [],\n  );\n\n  const markRead = useMemo(\n    () =>\n      throttle(\n        async (options?: MarkReadWrapperOptions) => {\n          const { updateChannelUiUnreadState = true } = options ?? {};\n          if (channel.disconnected || !channelConfig?.read_events) {\n            return;\n          }\n\n          lastRead.current = new Date();\n\n          try {\n            if (doMarkReadRequest) {\n              doMarkReadRequest(\n                channel,\n                updateChannelUiUnreadState ? setChannelUnreadUiState : undefined,\n              );\n            } else {\n              const markReadResponse = await channel.markRead();\n              //  markReadResponse.event can be null in case of a user that is not a member of a channel being marked read\n              // in that case event is null and we should not set unread UI\n              if (updateChannelUiUnreadState && markReadResponse?.event) {\n                _setChannelUnreadUiState({\n                  last_read: lastRead.current,\n                  last_read_message_id: markReadResponse.event.last_read_message_id,\n                  unread_messages: 0,\n                });\n              }\n            }\n\n            if (activeUnreadHandler) {\n              activeUnreadHandler(0, originalTitle.current);\n            } else if (originalTitle.current) {\n              document.title = originalTitle.current;\n            }\n          } catch (e) {\n            console.error(t('Failed to mark channel as read'));\n          }\n        },\n        500,\n        { leading: true, trailing: false },\n      ),\n    [\n      activeUnreadHandler,\n      channel,\n      channelConfig,\n      doMarkReadRequest,\n      setChannelUnreadUiState,\n      t,\n    ],\n  );\n\n  const handleEvent = async (event: Event) => {\n    if (event.message) {\n      dispatch({\n        channel,\n        message: event.message,\n        type: 'updateThreadOnEvent',\n      });\n    }\n\n    // ignore the event if it is not targeted at the current channel.\n    // Event targeted at this channel or globally targeted event should lead to state refresh\n    if (event.type === 'user.messages.deleted' && event.cid && event.cid !== channel.cid)\n      return;\n\n    if (event.type === 'user.watching.start' || event.type === 'user.watching.stop')\n      return;\n\n    if (event.type === 'typing.start' || event.type === 'typing.stop') {\n      return dispatch({ channel, type: 'setTyping' });\n    }\n\n    if (event.type === 'connection.changed' && typeof event.online === 'boolean') {\n      online.current = event.online;\n    }\n\n    if (event.type === 'message.new') {\n      const mainChannelUpdated =\n        !event.message?.parent_id || event.message?.show_in_channel;\n\n      if (mainChannelUpdated) {\n        if (\n          document.hidden &&\n          channelConfig?.read_events &&\n          !channel.muteStatus().muted\n        ) {\n          const unread = channel.countUnread(lastRead.current);\n\n          if (activeUnreadHandler) {\n            activeUnreadHandler(unread, originalTitle.current);\n          } else {\n            document.title = `(${unread}) ${originalTitle.current}`;\n          }\n        }\n      }\n\n      if (\n        event.message?.user?.id === client.userID &&\n        event?.message?.created_at &&\n        event?.message?.cid\n      ) {\n        const messageDate = new Date(event.message.created_at);\n        const cid = event.message.cid;\n\n        if (\n          !latestMessageDatesByChannels[cid] ||\n          latestMessageDatesByChannels[cid].getTime() < messageDate.getTime()\n        ) {\n          latestMessageDatesByChannels[cid] = messageDate;\n        }\n      }\n    }\n\n    if (event.type === 'user.deleted') {\n      const oldestID = channel.state?.messages?.[0]?.id;\n\n      /**\n       * As the channel state is not normalized we re-fetch the channel data. Thus, we avoid having to search for user references in the channel state.\n       */\n      // FIXME: we should use channelQueryOptions if they are available\n      await channel.query({\n        messages: { id_lt: oldestID, limit: DEFAULT_NEXT_CHANNEL_PAGE_SIZE },\n        watchers: { limit: DEFAULT_NEXT_CHANNEL_PAGE_SIZE },\n      });\n    }\n\n    if (event.type === 'notification.mark_unread')\n      _setChannelUnreadUiState((prev) => {\n        if (!(event.last_read_at && event.user)) return prev;\n        return {\n          first_unread_message_id: event.first_unread_message_id,\n          last_read: new Date(event.last_read_at),\n          last_read_message_id: event.last_read_message_id,\n          unread_messages: event.unread_messages ?? 0,\n        };\n      });\n\n    if (event.type === 'channel.truncated' && event.cid === channel.cid) {\n      _setChannelUnreadUiState(undefined);\n    }\n\n    throttledCopyStateFromChannel();\n  };\n\n  // useLayoutEffect here to prevent spinner. Use Suspense when it is available in stable release\n  useLayoutEffect(() => {\n    let errored = false;\n    let done = false;\n\n    (async () => {\n      if (!channel.initialized && initializeOnMount) {\n        try {\n          // if active channel has been set without id, we will create a temporary channel id from its member IDs\n          // to keep track of the /query request in progress. This is the same approach of generating temporary id\n          // that the JS client uses to keep track of channel in client.activeChannels\n          const members: string[] = [];\n          if (!channel.id && channel.data?.members) {\n            for (const member of channel.data.members) {\n              let userId: string | undefined;\n              if (typeof member === 'string') {\n                userId = member;\n              } else if (typeof member === 'object') {\n                const { user, user_id } = member as ChannelMemberResponse;\n                userId = user_id || user?.id;\n              }\n              if (userId) {\n                members.push(userId);\n              }\n            }\n          }\n          await getChannel({ channel, client, members, options: channelQueryOptions });\n          const config = channel.getConfig();\n          setChannelConfig(config);\n        } catch (e) {\n          dispatch({ error: e as Error, type: 'setError' });\n          errored = true;\n        }\n      }\n\n      done = true;\n      originalTitle.current = document.title;\n\n      if (!errored) {\n        dispatch({\n          channel,\n          hasMore: channel.state.messagePagination.hasPrev,\n          type: 'initStateFromChannel',\n        });\n\n        if (client.user?.id && channel.state.read[client.user.id]) {\n          // eslint-disable-next-line @typescript-eslint/no-unused-vars\n          const { user, ...ownReadState } = channel.state.read[client.user.id];\n          _setChannelUnreadUiState(ownReadState);\n        }\n        /**\n         * TODO: maybe pass last_read to the countUnread method to get proper value\n         * combined with channel.countUnread adjustment (_countMessageAsUnread)\n         * to allow counting own messages too\n         *\n         * const lastRead = channel.state.read[client.userID as string].last_read;\n         */\n        if (channel.countUnread() > 0 && markReadOnMount)\n          markRead({ updateChannelUiUnreadState: false });\n        // The more complex sync logic is done in Chat\n        client.on('connection.changed', handleEvent);\n        client.on('connection.recovered', handleEvent);\n        client.on('user.updated', handleEvent);\n        client.on('user.deleted', handleEvent);\n        client.on('user.messages.deleted', handleEvent);\n        channel.on(handleEvent);\n      }\n    })();\n    const notificationTimeoutsRef = notificationTimeouts.current;\n\n    return () => {\n      if (errored || !done) return;\n      channel?.off(handleEvent);\n      client.off('connection.changed', handleEvent);\n      client.off('connection.recovered', handleEvent);\n      client.off('user.deleted', handleEvent);\n      notificationTimeoutsRef.forEach(clearTimeout);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [\n    channel.cid,\n    channelQueryOptions,\n    doMarkReadRequest,\n    channelConfig?.read_events,\n    initializeOnMount,\n  ]);\n\n  useEffect(() => {\n    if (!state.thread) return;\n\n    const message = state.messages?.find((m) => m.id === state.thread?.id);\n\n    if (message) dispatch({ message, type: 'setThread' });\n  }, [state.messages, state.thread]);\n\n  const handleHighlightedMessageChange = useCallback(\n    ({\n      highlightDuration,\n      highlightedMessageId,\n    }: {\n      highlightedMessageId: string;\n      highlightDuration?: number;\n    }) => {\n      dispatch({\n        channel,\n        highlightedMessageId,\n        type: 'jumpToMessageFinished',\n      });\n      if (clearHighlightedMessageTimeoutId.current) {\n        clearTimeout(clearHighlightedMessageTimeoutId.current);\n      }\n      clearHighlightedMessageTimeoutId.current = setTimeout(() => {\n        if (searchController._internalState.getLatestValue().focusedMessage) {\n          searchController._internalState.partialNext({ focusedMessage: undefined });\n        }\n        clearHighlightedMessageTimeoutId.current = null;\n        dispatch({ type: 'clearHighlightedMessage' });\n      }, highlightDuration ?? DEFAULT_HIGHLIGHT_DURATION);\n    },\n    [channel, searchController],\n  );\n\n  useEffect(() => {\n    if (!jumpToMessageFromSearch?.id) return;\n    handleHighlightedMessageChange({ highlightedMessageId: jumpToMessageFromSearch.id });\n  }, [jumpToMessageFromSearch, handleHighlightedMessageChange]);\n\n  /** MESSAGE */\n\n  // Adds a temporary notification to message list, will be removed after 5 seconds\n  const addNotification = useMemo(\n    () => makeAddNotifications(setNotifications, notificationTimeouts.current),\n    [],\n  );\n\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  const loadMoreFinished = useCallback(\n    debounce(\n      (hasMore: boolean, messages: ChannelState['messages']) => {\n        if (!isMounted.current) return;\n        dispatch({ hasMore, messages, type: 'loadMoreFinished' });\n      },\n      2000,\n      { leading: true, trailing: true },\n    ),\n    [],\n  );\n\n  const loadMore = async (limit = DEFAULT_NEXT_CHANNEL_PAGE_SIZE) => {\n    if (\n      !online.current ||\n      !window.navigator.onLine ||\n      !channel.state.messagePagination.hasPrev\n    )\n      return 0;\n\n    // prevent duplicate loading events...\n    const oldestMessage = state?.messages?.[0];\n\n    if (\n      state.loadingMore ||\n      state.loadingMoreNewer ||\n      oldestMessage?.status !== 'received'\n    ) {\n      return 0;\n    }\n\n    dispatch({ loadingMore: true, type: 'setLoadingMore' });\n\n    const oldestID = oldestMessage?.id;\n    const perPage = limit;\n    let queryResponse: ChannelAPIResponse;\n\n    try {\n      queryResponse = await channel.query({\n        messages: { id_lt: oldestID, limit: perPage },\n        watchers: { limit: perPage },\n      });\n    } catch (e) {\n      console.warn('message pagination request failed with error', e);\n      dispatch({ loadingMore: false, type: 'setLoadingMore' });\n      return 0;\n    }\n\n    loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);\n\n    return queryResponse.messages.length;\n  };\n\n  const loadMoreNewer = async (limit = DEFAULT_NEXT_CHANNEL_PAGE_SIZE) => {\n    if (\n      !online.current ||\n      !window.navigator.onLine ||\n      !channel.state.messagePagination.hasNext\n    )\n      return 0;\n\n    const newestMessage = state?.messages?.[state?.messages?.length - 1];\n    if (state.loadingMore || state.loadingMoreNewer) return 0;\n\n    dispatch({ loadingMoreNewer: true, type: 'setLoadingMoreNewer' });\n\n    const newestId = newestMessage?.id;\n    const perPage = limit;\n    let queryResponse: ChannelAPIResponse;\n\n    try {\n      queryResponse = await channel.query({\n        messages: { id_gt: newestId, limit: perPage },\n        watchers: { limit: perPage },\n      });\n    } catch (e) {\n      console.warn('message pagination request failed with error', e);\n      dispatch({ loadingMoreNewer: false, type: 'setLoadingMoreNewer' });\n      return 0;\n    }\n\n    dispatch({\n      hasMoreNewer: channel.state.messagePagination.hasNext,\n      messages: channel.state.messages,\n      type: 'loadMoreNewerFinished',\n    });\n    return queryResponse.messages.length;\n  };\n\n  const jumpToMessage: ChannelActionContextValue['jumpToMessage'] = useCallback(\n    async (\n      messageId,\n      messageLimit = DEFAULT_JUMP_TO_PAGE_SIZE,\n      highlightDuration = DEFAULT_HIGHLIGHT_DURATION,\n    ) => {\n      dispatch({ loadingMore: true, type: 'setLoadingMore' });\n      await channel.state.loadMessageIntoState(messageId, undefined, messageLimit);\n\n      loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);\n      handleHighlightedMessageChange({\n        highlightDuration,\n        highlightedMessageId: messageId,\n      });\n    },\n    [channel, handleHighlightedMessageChange, loadMoreFinished],\n  );\n\n  const jumpToLatestMessage: ChannelActionContextValue['jumpToLatestMessage'] =\n    useCallback(async () => {\n      await channel.state.loadMessageIntoState('latest');\n      loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);\n      dispatch({\n        type: 'jumpToLatestMessage',\n      });\n    }, [channel, loadMoreFinished]);\n\n  const jumpToFirstUnreadMessage: ChannelActionContextValue['jumpToFirstUnreadMessage'] =\n    useCallback(\n      async (\n        queryMessageLimit = DEFAULT_JUMP_TO_PAGE_SIZE,\n        highlightDuration = DEFAULT_HIGHLIGHT_DURATION,\n      ) => {\n        if (!channelUnreadUiState?.unread_messages) return;\n        let lastReadMessageId = channelUnreadUiState?.last_read_message_id;\n        let firstUnreadMessageId = channelUnreadUiState?.first_unread_message_id;\n        let isInCurrentMessageSet = false;\n\n        if (firstUnreadMessageId) {\n          const result = findInMsgSetById(firstUnreadMessageId, channel.state.messages);\n          isInCurrentMessageSet = result.index !== -1;\n        } else if (lastReadMessageId) {\n          const result = findInMsgSetById(lastReadMessageId, channel.state.messages);\n          isInCurrentMessageSet = !!result.target;\n          firstUnreadMessageId =\n            result.index > -1 ? channel.state.messages[result.index + 1]?.id : undefined;\n        } else {\n          const lastReadTimestamp = channelUnreadUiState.last_read.getTime();\n          const { index: lastReadMessageIndex, target: lastReadMessage } =\n            findInMsgSetByDate(\n              channelUnreadUiState.last_read,\n              channel.state.messages,\n              true,\n            );\n\n          if (lastReadMessage) {\n            firstUnreadMessageId = channel.state.messages[lastReadMessageIndex + 1]?.id;\n            isInCurrentMessageSet = !!firstUnreadMessageId;\n            lastReadMessageId = lastReadMessage.id;\n          } else {\n            dispatch({ loadingMore: true, type: 'setLoadingMore' });\n            let messages;\n            try {\n              messages = (\n                await channel.query(\n                  {\n                    messages: {\n                      created_at_around: channelUnreadUiState.last_read.toISOString(),\n                      limit: queryMessageLimit,\n                    },\n                  },\n                  'new',\n                )\n              ).messages;\n            } catch (e) {\n              addNotification(t('Failed to jump to the first unread message'), 'error');\n              loadMoreFinished(\n                channel.state.messagePagination.hasPrev,\n                channel.state.messages,\n              );\n              return;\n            }\n\n            const firstMessageWithCreationDate = messages.find((msg) => msg.created_at);\n            if (!firstMessageWithCreationDate) {\n              addNotification(t('Failed to jump to the first unread message'), 'error');\n              loadMoreFinished(\n                channel.state.messagePagination.hasPrev,\n                channel.state.messages,\n              );\n              return;\n            }\n            const firstMessageTimestamp = new Date(\n              firstMessageWithCreationDate.created_at as string,\n            ).getTime();\n            if (lastReadTimestamp < firstMessageTimestamp) {\n              // whole channel is unread\n              firstUnreadMessageId = firstMessageWithCreationDate.id;\n            } else {\n              const result = findInMsgSetByDate(channelUnreadUiState.last_read, messages);\n              lastReadMessageId = result.target?.id;\n            }\n            loadMoreFinished(\n              channel.state.messagePagination.hasPrev,\n              channel.state.messages,\n            );\n          }\n        }\n\n        if (!firstUnreadMessageId && !lastReadMessageId) {\n          addNotification(t('Failed to jump to the first unread message'), 'error');\n          return;\n        }\n\n        if (!isInCurrentMessageSet) {\n          dispatch({ loadingMore: true, type: 'setLoadingMore' });\n          try {\n            const targetId = (firstUnreadMessageId ?? lastReadMessageId) as string;\n            await channel.state.loadMessageIntoState(\n              targetId,\n              undefined,\n              queryMessageLimit,\n            );\n            /**\n             * if the index of the last read message on the page is beyond the half of the page,\n             * we have arrived to the oldest page of the channel\n             */\n            const indexOfTarget = channel.state.messages.findIndex(\n              (message) => message.id === targetId,\n            ) as number;\n            loadMoreFinished(\n              channel.state.messagePagination.hasPrev,\n              channel.state.messages,\n            );\n            firstUnreadMessageId =\n              firstUnreadMessageId ?? channel.state.messages[indexOfTarget + 1]?.id;\n          } catch (e) {\n            addNotification(t('Failed to jump to the first unread message'), 'error');\n            loadMoreFinished(\n              channel.state.messagePagination.hasPrev,\n              channel.state.messages,\n            );\n            return;\n          }\n        }\n\n        if (!firstUnreadMessageId) {\n          addNotification(t('Failed to jump to the first unread message'), 'error');\n          return;\n        }\n        if (!channelUnreadUiState.first_unread_message_id)\n          _setChannelUnreadUiState({\n            ...channelUnreadUiState,\n            first_unread_message_id: firstUnreadMessageId,\n            last_read_message_id: lastReadMessageId,\n          });\n        handleHighlightedMessageChange({\n          highlightDuration,\n          highlightedMessageId: firstUnreadMessageId,\n        });\n      },\n      [\n        addNotification,\n        channel,\n        handleHighlightedMessageChange,\n        loadMoreFinished,\n        t,\n        channelUnreadUiState,\n      ],\n    );\n\n  const deleteMessage = useCallback(\n    async (\n      message: LocalMessage,\n      options?: DeleteMessageOptions,\n    ): Promise<MessageResponse> => {\n      if (!message?.id) {\n        throw new Error('Cannot delete a message - missing message ID.');\n      }\n      let deletedMessage;\n      if (doDeleteMessageRequest) {\n        deletedMessage = await doDeleteMessageRequest(message, options);\n      } else {\n        const result = await client.deleteMessage(message.id, options);\n        deletedMessage = result.message;\n      }\n\n      return deletedMessage;\n    },\n    [client, doDeleteMessageRequest],\n  );\n\n  const updateMessage = (updatedMessage: MessageResponse | LocalMessage) => {\n    // add the message to the local channel state\n    channel.state.addMessageSorted(updatedMessage, true);\n\n    dispatch({\n      channel,\n      parentId: state.thread && updatedMessage.parent_id,\n      type: 'copyMessagesFromChannel',\n    });\n  };\n\n  const doSendMessage = async ({\n    localMessage,\n    message,\n    options,\n  }: {\n    localMessage: LocalMessage;\n    message: Message;\n    options?: SendMessageOptions;\n  }) => {\n    try {\n      let messageResponse: void | SendMessageAPIResponse;\n\n      if (doSendMessageRequest) {\n        messageResponse = await doSendMessageRequest(channel, message, options);\n      } else {\n        messageResponse = await channel.sendMessage(message, options);\n      }\n\n      let existingMessage: LocalMessage | undefined = undefined;\n      for (let i = channel.state.messages.length - 1; i >= 0; i--) {\n        const msg = channel.state.messages[i];\n        if (msg.id && msg.id === message.id) {\n          existingMessage = msg;\n          break;\n        }\n      }\n\n      const responseTimestamp = new Date(\n        messageResponse?.message?.updated_at || 0,\n      ).getTime();\n      const existingMessageTimestamp = existingMessage?.updated_at?.getTime() || 0;\n      const responseIsTheNewest = responseTimestamp > existingMessageTimestamp;\n\n      // Replace the message payload after send is completed\n      // We need to check for the newest message payload, because on slow network, the response can arrive later than WS events message.new, message.updated.\n      // Always override existing message in status \"sending\"\n      if (\n        messageResponse?.message &&\n        (responseIsTheNewest || existingMessage?.status === 'sending')\n      ) {\n        updateMessage({\n          ...messageResponse.message,\n          status: 'received',\n        });\n      }\n    } catch (error) {\n      // error response isn't usable so needs to be stringified then parsed\n      const stringError = JSON.stringify(error);\n      const parsedError = (\n        stringError ? JSON.parse(stringError) : {}\n      ) as ErrorFromResponse<APIErrorResponse>;\n\n      // Handle the case where the message already exists\n      // (typically, when retrying to send a message).\n      // If the message already exists, we can assume it was sent successfully,\n      // so we update the message status to \"received\".\n      // Right now, the only way to check this error is by checking\n      // the combination of the error code and the error description,\n      // since there is no special error code for duplicate messages.\n      if (\n        parsedError.code === 4 &&\n        error instanceof Error &&\n        error.message.includes('already exists')\n      ) {\n        updateMessage({\n          ...localMessage,\n          status: 'received',\n        });\n      } else {\n        updateMessage({\n          ...localMessage,\n          error: parsedError,\n          status: 'failed',\n        });\n\n        thread?.upsertReplyLocally({\n          message: {\n            ...localMessage,\n            error: parsedError,\n            status: 'failed',\n          },\n        });\n      }\n    }\n  };\n\n  const sendMessage = async ({\n    localMessage,\n    message,\n    options,\n  }: {\n    localMessage: LocalMessage;\n    message: Message;\n    options?: SendMessageOptions;\n  }) => {\n    channel.state.filterErrorMessages();\n\n    thread?.upsertReplyLocally({\n      message: localMessage,\n    });\n\n    updateMessage(localMessage);\n\n    await doSendMessage({ localMessage, message, options });\n  };\n\n  const retrySendMessage = async (localMessage: LocalMessage) => {\n    updateMessage({\n      ...localMessage,\n      error: undefined,\n      status: 'sending',\n    });\n\n    await doSendMessage({\n      localMessage,\n      message: localMessageToNewMessagePayload(localMessage),\n    });\n  };\n\n  const removeMessage = (message: LocalMessage) => {\n    channel.state.removeMessage(message);\n\n    dispatch({\n      channel,\n      parentId: state.thread && message.parent_id,\n      type: 'copyMessagesFromChannel',\n    });\n  };\n\n  /** THREAD */\n\n  const openThread = (message: LocalMessage, event?: React.BaseSyntheticEvent) => {\n    event?.preventDefault();\n    dispatch({ channel, message, type: 'openThread' });\n  };\n\n  const closeThread = (event?: React.BaseSyntheticEvent) => {\n    event?.preventDefault();\n    dispatch({ type: 'closeThread' });\n  };\n\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  const loadMoreThreadFinished = useCallback(\n    debounce(\n      (\n        threadHasMore: boolean,\n        threadMessages: Array<ReturnType<ChannelState['formatMessage']>>,\n      ) => {\n        dispatch({\n          threadHasMore,\n          threadMessages,\n          type: 'loadMoreThreadFinished',\n        });\n      },\n      2000,\n      { leading: true, trailing: true },\n    ),\n    [],\n  );\n\n  const loadMoreThread = async (limit: number = DEFAULT_THREAD_PAGE_SIZE) => {\n    // FIXME: should prevent loading more, if state.thread.reply_count === channel.state.threads[parentID].length\n    if (state.threadLoadingMore || !state.thread || !state.threadHasMore) return;\n\n    dispatch({ type: 'startLoadingThread' });\n    const parentId = state.thread.id;\n\n    if (!parentId) {\n      return dispatch({ type: 'closeThread' });\n    }\n\n    const oldMessages = channel.state.threads[parentId] || [];\n    const oldestMessageId = oldMessages[0]?.id;\n\n    try {\n      const queryResponse = await channel.getReplies(parentId, {\n        id_lt: oldestMessageId,\n        limit,\n      });\n\n      const threadHasMoreMessages = hasMoreMessagesProbably(\n        queryResponse.messages.length,\n        limit,\n      );\n      const newThreadMessages = channel.state.threads[parentId] || [];\n\n      // next set loadingMore to false so we can start asking for more data\n      loadMoreThreadFinished(threadHasMoreMessages, newThreadMessages);\n    } catch (e) {\n      loadMoreThreadFinished(false, oldMessages);\n    }\n  };\n\n  const onMentionsHoverOrClick = useMentionsHandlers(onMentionsHover, onMentionsClick);\n\n  const editMessage = useEditMessageHandler(doUpdateMessageRequest);\n\n  const { typing, ...restState } = state;\n\n  const channelStateContextValue = useCreateChannelStateContext({\n    ...restState,\n    channel,\n    channelCapabilitiesArray,\n    channelConfig,\n    channelUnreadUiState,\n    giphyVersion: props.giphyVersion || 'fixed_height',\n    imageAttachmentSizeHandler:\n      props.imageAttachmentSizeHandler || getImageAttachmentConfiguration,\n    mutes,\n    notifications,\n    shouldGenerateVideoThumbnail: props.shouldGenerateVideoThumbnail || true,\n    videoAttachmentSizeHandler:\n      props.videoAttachmentSizeHandler || getVideoAttachmentConfiguration,\n    watcher_count: state.watcherCount,\n  });\n\n  const channelActionContextValue: ChannelActionContextValue = useMemo(\n    () => ({\n      addNotification,\n      closeThread,\n      deleteMessage,\n      dispatch,\n      editMessage,\n      jumpToFirstUnreadMessage,\n      jumpToLatestMessage,\n      jumpToMessage,\n      loadMore,\n      loadMoreNewer,\n      loadMoreThread,\n      markRead,\n      onMentionsClick: onMentionsHoverOrClick,\n      onMentionsHover: onMentionsHoverOrClick,\n      openThread,\n      removeMessage,\n      retrySendMessage,\n      sendMessage,\n      setChannelUnreadUiState,\n      skipMessageDataMemoization,\n      updateMessage,\n    }),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      channel.cid,\n      deleteMessage,\n      loadMore,\n      loadMoreNewer,\n      markRead,\n      jumpToFirstUnreadMessage,\n      jumpToMessage,\n      jumpToLatestMessage,\n      setChannelUnreadUiState,\n    ],\n  );\n\n  const componentContextValue: Partial<ComponentContextValue> = useMemo(\n    () => ({\n      Attachment: props.Attachment,\n      AttachmentPreviewList: props.AttachmentPreviewList,\n      AttachmentSelector: props.AttachmentSelector,\n      AttachmentSelectorInitiationButtonContents:\n        props.AttachmentSelectorInitiationButtonContents,\n      AudioRecorder: props.AudioRecorder,\n      AutocompleteSuggestionItem: props.AutocompleteSuggestionItem,\n      AutocompleteSuggestionList: props.AutocompleteSuggestionList,\n      Avatar: props.Avatar,\n      BaseImage: props.BaseImage,\n      CooldownTimer: props.CooldownTimer,\n      CustomMessageActionsList: props.CustomMessageActionsList,\n      DateSeparator: props.DateSeparator,\n      EditMessageInput: props.EditMessageInput,\n      EditMessageModal: props.EditMessageModal,\n      EmojiPicker: props.EmojiPicker,\n      emojiSearchIndex: props.emojiSearchIndex,\n      EmptyStateIndicator: props.EmptyStateIndicator,\n      FileUploadIcon: props.FileUploadIcon,\n      GiphyPreviewMessage: props.GiphyPreviewMessage,\n      HeaderComponent: props.HeaderComponent,\n      Input: props.Input,\n      LinkPreviewList: props.LinkPreviewList,\n      LoadingIndicator: props.LoadingIndicator,\n      Message: props.Message,\n      MessageActions: props.MessageActions,\n      MessageBlocked: props.MessageBlocked,\n      MessageBouncePrompt: props.MessageBouncePrompt,\n      MessageDeleted: props.MessageDeleted,\n      MessageIsThreadReplyInChannelButtonIndicator:\n        props.MessageIsThreadReplyInChannelButtonIndicator,\n      MessageListNotifications: props.MessageListNotifications,\n      MessageNotification: props.MessageNotification,\n      MessageOptions: props.MessageOptions,\n      MessageRepliesCountButton: props.MessageRepliesCountButton,\n      MessageStatus: props.MessageStatus,\n      MessageSystem: props.MessageSystem,\n      MessageTimestamp: props.MessageTimestamp,\n      Modal: props.Modal,\n      ModalGallery: props.ModalGallery,\n      PinIndicator: props.PinIndicator,\n      PollActions: props.PollActions,\n      PollContent: props.PollContent,\n      PollCreationDialog: props.PollCreationDialog,\n      PollHeader: props.PollHeader,\n      PollOptionSelector: props.PollOptionSelector,\n      QuotedMessage: props.QuotedMessage,\n      QuotedMessagePreview: props.QuotedMessagePreview,\n      QuotedPoll: props.QuotedPoll,\n      reactionOptions: props.reactionOptions,\n      ReactionSelector: props.ReactionSelector,\n      ReactionsList: props.ReactionsList,\n      ReactionsListModal: props.ReactionsListModal,\n      ReminderNotification: props.ReminderNotification,\n      SendButton: props.SendButton,\n      SendToChannelCheckbox: props.SendToChannelCheckbox,\n      ShareLocationDialog: props.ShareLocationDialog,\n      StartRecordingAudioButton: props.StartRecordingAudioButton,\n      StopAIGenerationButton: props.StopAIGenerationButton,\n      StreamedMessageText: props.StreamedMessageText,\n      TextareaComposer: props.TextareaComposer,\n      ThreadHead: props.ThreadHead,\n      ThreadHeader: props.ThreadHeader,\n      ThreadStart: props.ThreadStart,\n      Timestamp: props.Timestamp,\n      TypingIndicator: props.TypingIndicator,\n      UnreadMessagesNotification: props.UnreadMessagesNotification,\n      UnreadMessagesSeparator: props.UnreadMessagesSeparator,\n      VirtualMessage: props.VirtualMessage,\n    }),\n    [\n      props.Attachment,\n      props.AttachmentPreviewList,\n      props.AttachmentSelector,\n      props.AttachmentSelectorInitiationButtonContents,\n      props.AudioRecorder,\n      props.AutocompleteSuggestionItem,\n      props.AutocompleteSuggestionList,\n      props.Avatar,\n      props.BaseImage,\n      props.CooldownTimer,\n      props.CustomMessageActionsList,\n      props.DateSeparator,\n      props.EditMessageInput,\n      props.EditMessageModal,\n      props.EmojiPicker,\n      props.emojiSearchIndex,\n      props.EmptyStateIndicator,\n      props.FileUploadIcon,\n      props.GiphyPreviewMessage,\n      props.HeaderComponent,\n      props.Input,\n      props.LinkPreviewList,\n      props.LoadingIndicator,\n      props.Message,\n      props.MessageActions,\n      props.MessageBlocked,\n      props.MessageBouncePrompt,\n      props.MessageDeleted,\n      props.MessageIsThreadReplyInChannelButtonIndicator,\n      props.MessageListNotifications,\n      props.MessageNotification,\n      props.MessageOptions,\n      props.MessageRepliesCountButton,\n      props.MessageStatus,\n      props.MessageSystem,\n      props.MessageTimestamp,\n      props.Modal,\n      props.ModalGallery,\n      props.PinIndicator,\n      props.PollActions,\n      props.PollContent,\n      props.PollCreationDialog,\n      props.PollHeader,\n      props.PollOptionSelector,\n      props.QuotedMessage,\n      props.QuotedMessagePreview,\n      props.QuotedPoll,\n      props.reactionOptions,\n      props.ReactionSelector,\n      props.ReactionsList,\n      props.ReactionsListModal,\n      props.ReminderNotification,\n      props.SendButton,\n      props.SendToChannelCheckbox,\n      props.ShareLocationDialog,\n      props.StartRecordingAudioButton,\n      props.StopAIGenerationButton,\n      props.StreamedMessageText,\n      props.TextareaComposer,\n      props.ThreadHead,\n      props.ThreadHeader,\n      props.ThreadStart,\n      props.Timestamp,\n      props.TypingIndicator,\n      props.UnreadMessagesNotification,\n      props.UnreadMessagesSeparator,\n      props.VirtualMessage,\n    ],\n  );\n\n  const typingContextValue = useCreateTypingContext({\n    typing,\n  });\n\n  if (state.error) {\n    return (\n      <ChannelContainer>\n        <LoadingErrorIndicator error={state.error} />\n      </ChannelContainer>\n    );\n  }\n\n  if (state.loading) {\n    return (\n      <ChannelContainer>\n        <LoadingIndicator />\n      </ChannelContainer>\n    );\n  }\n\n  if (!channel.watch) {\n    return (\n      <ChannelContainer>\n        <div>{t('Channel Missing')}</div>\n      </ChannelContainer>\n    );\n  }\n\n  return (\n    <ChannelContainer className={windowsEmojiClass}>\n      <ChannelStateProvider value={channelStateContextValue}>\n        <ChannelActionProvider value={channelActionContextValue}>\n          <WithComponents overrides={componentContextValue}>\n            <TypingProvider value={typingContextValue}>\n              <WithAudioPlayback allowConcurrentPlayback={allowConcurrentAudioPlayback}>\n                <div className={clsx(chatContainerClass)}>{children}</div>\n              </WithAudioPlayback>\n            </TypingProvider>\n          </WithComponents>\n        </ChannelActionProvider>\n      </ChannelStateProvider>\n    </ChannelContainer>\n  );\n};\n\n/**\n * A wrapper component that provides channel data and renders children.\n * The Channel component provides the following contexts:\n * - [ChannelStateContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_state_context/)\n * - [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/)\n * - [ComponentContext](https://getstream.io/chat/docs/sdk/react/contexts/component_context/)\n * - [TypingContext](https://getstream.io/chat/docs/sdk/react/contexts/typing_context/)\n */\nexport const Channel = React.memo(UnMemoizedChannel) as typeof UnMemoizedChannel;\n", "import type {\n  Channel,\n  LocalMessage,\n  MessageResponse,\n  ChannelState as StreamChannelState,\n} from 'stream-chat';\n\nimport type { ChannelState } from '../../context/ChannelStateContext';\n\nexport type ChannelStateReducerAction =\n  | {\n      type: 'closeThread';\n    }\n  | {\n      type: 'clearHighlightedMessage';\n    }\n  | {\n      channel: Channel;\n      type: 'copyMessagesFromChannel';\n      parentId?: string | null;\n    }\n  | {\n      channel: Channel;\n      type: 'copyStateFromChannelOnEvent';\n    }\n  | {\n      channel: Channel;\n      highlightedMessageId: string;\n      type: 'jumpToMessageFinished';\n    }\n  | {\n      channel: Channel;\n      hasMore: boolean;\n      type: 'initStateFromChannel';\n    }\n  | {\n      hasMore: boolean;\n      messages: LocalMessage[];\n      type: 'loadMoreFinished';\n    }\n  | {\n      hasMoreNewer: boolean;\n      messages: LocalMessage[];\n      type: 'loadMoreNewerFinished';\n    }\n  | {\n      threadHasMore: boolean;\n      threadMessages: Array<ReturnType<StreamChannelState['formatMessage']>>;\n      type: 'loadMoreThreadFinished';\n    }\n  | {\n      channel: Channel;\n      message: LocalMessage;\n      type: 'openThread';\n    }\n  | {\n      error: Error;\n      type: 'setError';\n    }\n  | {\n      loadingMore: boolean;\n      type: 'setLoadingMore';\n    }\n  | {\n      loadingMoreNewer: boolean;\n      type: 'setLoadingMoreNewer';\n    }\n  | {\n      message: LocalMessage;\n      type: 'setThread';\n    }\n  | {\n      channel: Channel;\n      type: 'setTyping';\n    }\n  | {\n      type: 'startLoadingThread';\n    }\n  | {\n      channel: Channel;\n      message: MessageResponse;\n      type: 'updateThreadOnEvent';\n    }\n  | {\n      type: 'jumpToLatestMessage';\n    };\n\nexport const makeChannelReducer =\n  () => (state: ChannelState, action: ChannelStateReducerAction) => {\n    switch (action.type) {\n      case 'closeThread': {\n        return {\n          ...state,\n          thread: null,\n          threadLoadingMore: false,\n          threadMessages: [],\n        };\n      }\n\n      case 'copyMessagesFromChannel': {\n        const { channel, parentId } = action;\n        return {\n          ...state,\n          messages: [...channel.state.messages],\n          pinnedMessages: [...channel.state.pinnedMessages],\n          // copying messages from channel happens with new message - this resets the suppressAutoscroll\n          suppressAutoscroll: false,\n          threadMessages: parentId\n            ? { ...channel.state.threads }[parentId] || []\n            : state.threadMessages,\n        };\n      }\n\n      case 'copyStateFromChannelOnEvent': {\n        const { channel } = action;\n        return {\n          ...state,\n          members: { ...channel.state.members },\n          messages: [...channel.state.messages],\n          pinnedMessages: [...channel.state.pinnedMessages],\n          read: { ...channel.state.read },\n          watcherCount: channel.state.watcher_count,\n          watchers: { ...channel.state.watchers },\n        };\n      }\n\n      case 'initStateFromChannel': {\n        const { channel, hasMore } = action;\n        return {\n          ...state,\n          hasMore,\n          loading: false,\n          members: { ...channel.state.members },\n          messages: [...channel.state.messages],\n          pinnedMessages: [...channel.state.pinnedMessages],\n          read: { ...channel.state.read },\n          watcherCount: channel.state.watcher_count,\n          watchers: { ...channel.state.watchers },\n        };\n      }\n\n      case 'jumpToLatestMessage': {\n        return {\n          ...state,\n          hasMoreNewer: false,\n          highlightedMessageId: undefined,\n          loading: false,\n          suppressAutoscroll: false,\n        };\n      }\n\n      case 'jumpToMessageFinished': {\n        return {\n          ...state,\n          hasMoreNewer: action.channel.state.messagePagination.hasNext,\n          highlightedMessageId: action.highlightedMessageId,\n          messages: action.channel.state.messages,\n        };\n      }\n\n      case 'clearHighlightedMessage': {\n        return {\n          ...state,\n          highlightedMessageId: undefined,\n        };\n      }\n\n      case 'loadMoreFinished': {\n        const { hasMore, messages } = action;\n        return {\n          ...state,\n          hasMore,\n          loadingMore: false,\n          messages,\n          suppressAutoscroll: false,\n        };\n      }\n\n      case 'loadMoreNewerFinished': {\n        const { hasMoreNewer, messages } = action;\n        return {\n          ...state,\n          hasMoreNewer,\n          loadingMoreNewer: false,\n          messages,\n        };\n      }\n\n      case 'loadMoreThreadFinished': {\n        const { threadHasMore, threadMessages } = action;\n        return {\n          ...state,\n          threadHasMore,\n          threadLoadingMore: false,\n          threadMessages,\n        };\n      }\n\n      case 'openThread': {\n        const { channel, message } = action;\n        return {\n          ...state,\n          thread: message,\n          threadHasMore: true,\n          threadMessages: message.id\n            ? { ...channel.state.threads }[message.id] || []\n            : [],\n          threadSuppressAutoscroll: false,\n        };\n      }\n\n      case 'setError': {\n        const { error } = action;\n        return { ...state, error };\n      }\n\n      case 'setLoadingMore': {\n        const { loadingMore } = action;\n        // suppress the autoscroll behavior\n        return { ...state, loadingMore, suppressAutoscroll: loadingMore };\n      }\n\n      case 'setLoadingMoreNewer': {\n        const { loadingMoreNewer } = action;\n        return { ...state, loadingMoreNewer };\n      }\n\n      case 'setThread': {\n        const { message } = action;\n        return { ...state, thread: message };\n      }\n\n      case 'setTyping': {\n        const { channel } = action;\n        return {\n          ...state,\n          typing: { ...channel.state.typing },\n        };\n      }\n\n      case 'startLoadingThread': {\n        return {\n          ...state,\n          threadLoadingMore: true,\n          threadSuppressAutoscroll: true,\n        };\n      }\n\n      case 'updateThreadOnEvent': {\n        const { channel, message } = action;\n        if (!state.thread) return state;\n        return {\n          ...state,\n          thread:\n            message?.id === state.thread.id\n              ? channel.state.formatMessage(message)\n              : state.thread,\n          threadMessages: state.thread?.id\n            ? { ...channel.state.threads }[state.thread.id] || []\n            : [],\n        };\n      }\n\n      default:\n        return state;\n    }\n  };\n\nexport const initialState = {\n  error: null,\n  hasMore: true,\n  hasMoreNewer: false,\n  loading: true,\n  loadingMore: false,\n  members: {},\n  messages: [],\n  pinnedMessages: [],\n  read: {},\n  suppressAutoscroll: false,\n  thread: null,\n  threadHasMore: true,\n  threadLoadingMore: false,\n  threadMessages: [],\n  threadSuppressAutoscroll: false,\n  typing: {},\n  watcherCount: 0,\n  watchers: {},\n};\n", "import { useMemo } from 'react';\n\nimport { isDate, isDayOrMoment } from '../../../i18n';\n\nimport type { ChannelStateContextValue } from '../../../context/ChannelStateContext';\n\nexport const useCreateChannelStateContext = (\n  value: Omit<ChannelStateContextValue, 'channelCapabilities'> & {\n    channelCapabilitiesArray: string[];\n    skipMessageDataMemoization?: boolean;\n  },\n) => {\n  const {\n    channel,\n    channelCapabilitiesArray = [],\n    channelConfig,\n    channelUnreadUiState,\n    error,\n    giphyVersion,\n    hasMore,\n    hasMoreNewer,\n    highlightedMessageId,\n    imageAttachmentSizeHandler,\n    loading,\n    loadingMore,\n    members,\n    messages = [],\n    mutes,\n    notifications,\n    pinnedMessages,\n    read = {},\n    shouldGenerateVideoThumbnail,\n    skipMessageDataMemoization,\n    suppressAutoscroll,\n    thread,\n    threadHasMore,\n    threadLoadingMore,\n    threadMessages = [],\n    videoAttachmentSizeHandler,\n    watcher_count,\n    watcherCount,\n    watchers,\n  } = value;\n\n  const channelId = channel.cid;\n  const lastRead = channel.initialized && channel.lastRead()?.getTime();\n  const membersLength = Object.keys(members || []).length;\n  const notificationsLength = notifications.length;\n  const readUsers = Object.values(read);\n  const readUsersLength = readUsers.length;\n  const readUsersLastReadDateStrings: string[] = [];\n  for (const { last_read } of readUsers) {\n    if (!lastRead) continue;\n    readUsersLastReadDateStrings.push(last_read?.toISOString());\n  }\n  const readUsersLastReads = readUsersLastReadDateStrings.join();\n  const threadMessagesLength = threadMessages?.length;\n\n  const channelCapabilities: Record<string, boolean> = {};\n\n  channelCapabilitiesArray.forEach((capability) => {\n    channelCapabilities[capability] = true;\n  });\n\n  // FIXME: this is crazy - I could not find out why the messages were not getting updated when only message properties that are not part\n  // of this serialization has been changed. A great example of memoization gone wrong.\n  const memoizedMessageData = skipMessageDataMemoization\n    ? messages\n    : messages\n        .map(\n          ({\n            deleted_at,\n            latest_reactions,\n            pinned,\n            reply_count,\n            status,\n            type,\n            updated_at,\n            user,\n          }) =>\n            `${type}${deleted_at}${\n              latest_reactions ? latest_reactions.map(({ type }) => type).join() : ''\n            }${pinned}${reply_count}${status}${\n              updated_at && (isDayOrMoment(updated_at) || isDate(updated_at))\n                ? updated_at.toISOString()\n                : updated_at || ''\n            }${user?.updated_at}`,\n        )\n        .join();\n\n  const memoizedThreadMessageData = threadMessages\n    .map(\n      ({ deleted_at, latest_reactions, pinned, status, updated_at, user }) =>\n        `${deleted_at}${\n          latest_reactions ? latest_reactions.map(({ type }) => type).join() : ''\n        }${pinned}${status}${\n          updated_at && (isDayOrMoment(updated_at) || isDate(updated_at))\n            ? updated_at.toISOString()\n            : updated_at || ''\n        }${user?.updated_at}`,\n    )\n    .join();\n\n  const channelStateContext: ChannelStateContextValue = useMemo(\n    () => ({\n      channel,\n      channelCapabilities,\n      channelConfig,\n      channelUnreadUiState,\n      error,\n      giphyVersion,\n      hasMore,\n      hasMoreNewer,\n      highlightedMessageId,\n      imageAttachmentSizeHandler,\n      loading,\n      loadingMore,\n      members,\n      messages,\n      mutes,\n      notifications,\n      pinnedMessages,\n      read,\n      shouldGenerateVideoThumbnail,\n      suppressAutoscroll,\n      thread,\n      threadHasMore,\n      threadLoadingMore,\n      threadMessages,\n      videoAttachmentSizeHandler,\n      watcher_count,\n      watcherCount,\n      watchers,\n    }),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      channel.data?.name, // otherwise ChannelHeader will not be updated\n      channelId,\n      channelUnreadUiState,\n      error,\n      hasMore,\n      hasMoreNewer,\n      highlightedMessageId,\n      lastRead,\n      loading,\n      loadingMore,\n      membersLength,\n      memoizedMessageData,\n      memoizedThreadMessageData,\n      notificationsLength,\n      readUsersLength,\n      readUsersLastReads,\n      shouldGenerateVideoThumbnail,\n      skipMessageDataMemoization,\n      suppressAutoscroll,\n      thread,\n      threadHasMore,\n      threadLoadingMore,\n      threadMessagesLength,\n      watcherCount,\n    ],\n  );\n\n  return channelStateContext;\n};\n", "import { useMemo } from 'react';\n\nimport type { TypingContextValue } from '../../../context/TypingContext';\n\nexport const useCreateTypingContext = (value: TypingContextValue) => {\n  const { typing } = value;\n\n  const typingValue = Object.keys(typing || {}).join();\n\n  const typingContext: TypingContextValue = useMemo(\n    () => ({\n      typing,\n    }),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [typingValue],\n  );\n\n  return typingContext;\n};\n", "import type {\n  LocalMessage,\n  MessageResponse,\n  StreamChat,\n  UpdateMessageOptions,\n} from 'stream-chat';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\ntype UpdateHandler = (\n  cid: string,\n  updatedMessage: LocalMessage | MessageResponse,\n  options?: UpdateMessageOptions,\n) => ReturnType<StreamChat['updateMessage']>;\n\nexport const useEditMessageHandler = (doUpdateMessageRequest?: UpdateHandler) => {\n  const { channel, client } = useChatContext('useEditMessageHandler');\n\n  return (\n    updatedMessage: LocalMessage | MessageResponse,\n    options?: UpdateMessageOptions,\n  ) => {\n    if (doUpdateMessageRequest && channel) {\n      return Promise.resolve(\n        doUpdateMessageRequest(channel.cid, updatedMessage, options),\n      );\n    }\n    return client.updateMessage(updatedMessage, undefined, options);\n  };\n};\n", "import { useEffect, useRef } from 'react';\n\nexport const useIsMounted = () => {\n  const isMounted = useRef(false);\n\n  useEffect(() => {\n    isMounted.current = true;\n    return () => {\n      isMounted.current = false;\n    };\n  }, []);\n\n  return isMounted;\n};\n", "import type React from 'react';\nimport { useCallback } from 'react';\nimport type { UserResponse } from 'stream-chat';\n\nexport type OnMentionAction = (\n  event: React.BaseSyntheticEvent,\n  user?: UserResponse,\n) => void;\n\nexport const useMentionsHandlers = (\n  onMentionsHover?: OnMentionAction,\n  onMentionsClick?: OnMentionAction,\n) =>\n  useCallback(\n    (event: React.BaseSyntheticEvent, mentioned_users: UserResponse[]) => {\n      if (\n        (!onMentionsHover && !onMentionsClick) ||\n        !(event.target instanceof HTMLElement)\n      ) {\n        return;\n      }\n\n      const target = event.target;\n      const textContent = target.innerHTML.replace('*', '');\n\n      if (textContent[0] === '@') {\n        const userName = textContent.replace('@', '');\n        const user = mentioned_users?.find(\n          ({ id, name }) => name === userName || id === userName,\n        );\n\n        if (\n          onMentionsHover &&\n          typeof onMentionsHover === 'function' &&\n          event.type === 'mouseover'\n        ) {\n          onMentionsHover(event, user);\n        }\n\n        if (\n          onMentionsClick &&\n          event.type === 'click' &&\n          typeof onMentionsClick === 'function'\n        ) {\n          onMentionsClick(event, user);\n        }\n      }\n    },\n    [onMentionsClick, onMentionsHover],\n  );\n", "import { useChatContext } from '../../../context/ChatContext';\nimport type { ChatContextValue } from '../../../context/ChatContext';\n\nexport const useImageFlagEmojisOnWindowsClass = () => {\n  const { useImageFlagEmojisOnWindows } = useChatContext('Channel');\n  return useImageFlagEmojisOnWindows && navigator.userAgent.match(/Win/)\n    ? 'str-chat--windows-flags'\n    : '';\n};\n\nexport const getChatContainerClass = (customClass?: string) =>\n  customClass ?? 'str-chat__container';\n\nexport const useChannelContainerClasses = ({\n  customClasses,\n}: Pick<ChatContextValue, 'customClasses'>) => {\n  const windowsEmojiClass = useImageFlagEmojisOnWindowsClass();\n  return {\n    channelClass: customClasses?.channel ?? 'str-chat__channel',\n    chatClass: customClasses?.chat ?? 'str-chat',\n    chatContainerClass: getChatContainerClass(customClasses?.chatContainer),\n    windowsEmojiClass,\n  };\n};\n", "import { nanoid } from 'nanoid';\nimport type { Dispatch, SetStateAction } from 'react';\nimport type { ChannelState, MessageResponse, StreamChat } from 'stream-chat';\nimport type { ChannelNotifications } from '../../context/ChannelStateContext';\n\nexport const makeAddNotifications =\n  (\n    setNotifications: Dispatch<SetStateAction<ChannelNotifications>>,\n    notificationTimeouts: NodeJS.Timeout[],\n  ) =>\n  (text: string, type: 'success' | 'error') => {\n    if (typeof text !== 'string' || (type !== 'success' && type !== 'error')) {\n      return;\n    }\n\n    const id = nanoid();\n\n    setNotifications((prevNotifications) => [...prevNotifications, { id, text, type }]);\n\n    const timeout = setTimeout(\n      () =>\n        setNotifications((prevNotifications) =>\n          prevNotifications.filter((notification) => notification.id !== id),\n        ),\n      5000,\n    );\n\n    notificationTimeouts.push(timeout);\n  };\n\n/**\n * Utility function for jumpToFirstUnreadMessage\n * @param targetId\n * @param msgSet\n */\nexport const findInMsgSetById = (\n  targetId: string,\n  msgSet: ReturnType<ChannelState['formatMessage']>[],\n) => {\n  for (let i = msgSet.length - 1; i >= 0; i--) {\n    const item = msgSet[i];\n    if (item.id === targetId) {\n      return {\n        index: i,\n        target: item,\n      };\n    }\n  }\n  return {\n    index: -1,\n  };\n};\n\n/**\n * Utility function for jumpToFirstUnreadMessage\n * @param targetDate\n * @param msgSet\n * @param exact\n */\nexport const findInMsgSetByDate = (\n  targetDate: Date,\n  msgSet: MessageResponse[] | ReturnType<ChannelState['formatMessage']>[],\n  exact = false,\n) => {\n  const targetTimestamp = targetDate.getTime();\n  let left = 0;\n  let middle = 0;\n  let right = msgSet.length - 1;\n  while (left <= right) {\n    middle = Math.floor((right + left) / 2);\n    const middleTimestamp = new Date(\n      msgSet[middle].created_at as string | Date,\n    ).getTime();\n    const middleLeftTimestamp =\n      msgSet[middle - 1]?.created_at &&\n      new Date(msgSet[middle - 1].created_at as string | Date).getTime();\n    const middleRightTimestamp =\n      msgSet[middle + 1]?.created_at &&\n      new Date(msgSet[middle + 1].created_at as string | Date).getTime();\n    if (\n      middleTimestamp === targetTimestamp ||\n      (middleLeftTimestamp &&\n        middleRightTimestamp &&\n        middleLeftTimestamp < targetTimestamp &&\n        targetTimestamp < middleRightTimestamp)\n    ) {\n      return { index: middle, target: msgSet[middle] };\n    }\n    if (middleTimestamp < targetTimestamp) left = middle + 1;\n    else right = middle - 1;\n  }\n\n  if (\n    !exact ||\n    new Date(msgSet[left].created_at as string | Date).getTime() === targetTimestamp\n  ) {\n    return { index: left, target: msgSet[left] };\n  }\n  return { index: -1 };\n};\n\nexport const generateMessageId = ({ client }: { client: StreamChat }) =>\n  `${client.userID}-${nanoid()}`;\n", "import type { Attachment } from 'stream-chat';\nimport * as linkify from 'linkifyjs';\n\nexport const getImageAttachmentConfiguration = (\n  attachment: Attachment,\n  element: HTMLElement,\n) => {\n  let newUrl = undefined;\n\n  const urlToTest = attachment.image_url || attachment.thumb_url || '';\n\n  if (linkify.test(urlToTest, 'url')) {\n    const url = new URL(urlToTest);\n    const resizeDimensions = getSizingRestrictions(url, element);\n\n    if (resizeDimensions) {\n      // Apply 2x for retina displays\n      resizeDimensions.height *= 2;\n      resizeDimensions.width *= 2;\n      addResizingParamsToUrl(resizeDimensions, url);\n    }\n    newUrl = url.href;\n  }\n\n  return {\n    url: newUrl || '',\n  };\n};\n\nexport const getVideoAttachmentConfiguration = (\n  attachment: Attachment,\n  element: HTMLElement,\n  shouldGenerateVideoThumbnail: boolean,\n) => {\n  let thumbUrl = undefined;\n  if (\n    attachment.thumb_url &&\n    shouldGenerateVideoThumbnail &&\n    linkify.test(attachment.thumb_url, 'url')\n  ) {\n    const url = new URL(attachment.thumb_url);\n    const resizeDimensions = getSizingRestrictions(url, element);\n\n    if (resizeDimensions) {\n      // Apply 2x for retina displays\n      resizeDimensions.height *= 2;\n      resizeDimensions.width *= 2;\n      addResizingParamsToUrl(resizeDimensions, url);\n    }\n    thumbUrl = url.href;\n  }\n\n  return {\n    thumbUrl,\n    url: attachment.asset_url || '',\n  };\n};\n\nconst getSizingRestrictions = (url: URL, htmlElement: HTMLElement) => {\n  const urlParams = url.searchParams;\n  const originalHeight = Number(urlParams.get('oh')) || 1;\n  const originalWidth = Number(urlParams.get('ow')) || 1;\n  const cssSizeRestriction = getCSSSizeRestrictions(htmlElement);\n  let resizeDimensions: { height: number; width: number } | undefined;\n\n  if (\n    (cssSizeRestriction.maxHeight || cssSizeRestriction.height) &&\n    cssSizeRestriction.maxWidth\n  ) {\n    resizeDimensions = getResizeDimensions(\n      originalHeight,\n      originalWidth,\n      /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */\n      cssSizeRestriction.maxHeight || cssSizeRestriction.height!,\n      cssSizeRestriction.maxWidth,\n    );\n  } else {\n    resizeDimensions = undefined;\n  }\n\n  return resizeDimensions;\n};\n\nconst getResizeDimensions = (\n  originalHeight: number,\n  originalWidth: number,\n  maxHeight: number,\n  maxWidth: number,\n) => ({\n  height: Math.round(Math.max(maxHeight, (maxWidth / originalWidth) * originalHeight)),\n  width: Math.round(Math.max(maxHeight, (maxWidth / originalHeight) * originalWidth)),\n});\n\nconst getCSSSizeRestrictions = (htmlElement: HTMLElement) => {\n  const computedStylesheet = getComputedStyle(htmlElement);\n  const height = getValueRepresentationOfCSSProperty(\n    computedStylesheet.getPropertyValue('height'),\n  );\n  const maxHeight = getValueRepresentationOfCSSProperty(\n    computedStylesheet.getPropertyValue('max-height'),\n  );\n  const maxWidth = getValueRepresentationOfCSSProperty(\n    computedStylesheet.getPropertyValue('max-width'),\n  );\n\n  if (!((height || maxHeight) && maxWidth)) {\n    console.warn(\n      `Invalid value set for height/max-height and/or max-width for HTML element, this can cause scrolling issues inside the message list, more info https://getstream.io/chat/docs/sdk/react/message-components/attachment/#image-and-video-sizing`,\n    );\n  }\n\n  return { height, maxHeight, maxWidth };\n};\n\nconst getValueRepresentationOfCSSProperty = (property: string) => {\n  if (!property.endsWith('px')) {\n    return undefined;\n  }\n  const number = parseFloat(property);\n  return isNaN(number) ? undefined : number;\n};\n\nconst addResizingParamsToUrl = (\n  resizeDimensions: { height: number; width: number },\n  url: URL,\n) => {\n  url.searchParams.set('h', resizeDimensions.height.toString());\n  url.searchParams.set('w', resizeDimensions.width.toString());\n};\n", "import type { InternalSearchControllerState } from 'stream-chat';\nimport { useChatContext } from '../../../context';\nimport { useStateStore } from '../../../store';\n\nconst searchControllerStateSelector = (nextValue: InternalSearchControllerState) => ({\n  focusedMessage: nextValue.focusedMessage,\n});\n\nexport const useSearchFocusedMessage = () => {\n  const { searchController } = useChatContext('Channel');\n  const { focusedMessage } = useStateStore(\n    searchController._internalState,\n    searchControllerStateSelector,\n  );\n\n  return focusedMessage;\n};\n", "import React from 'react';\n\nimport { MenuIcon as DefaultMenuIcon } from './icons';\nimport { Avatar as DefaultAvatar } from '../Avatar';\nimport { useChannelPreviewInfo } from '../ChannelPreview/hooks/useChannelPreviewInfo';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport { useChatContext } from '../../context/ChatContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport type { ChannelAvatarProps } from '../Avatar';\n\nexport type ChannelHeaderProps = {\n  /** UI component to display an avatar, defaults to [Avatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/Avatar.tsx) component and accepts the same props as: [ChannelAvatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/ChannelAvatar.tsx) */\n  Avatar?: React.ComponentType<ChannelAvatarProps>;\n  /** Manually set the image to render, defaults to the Channel image */\n  image?: string;\n  /** Show a little indicator that the Channel is live right now */\n  live?: boolean;\n  /** UI component to display menu icon, defaults to [MenuIcon](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelHeader/ChannelHeader.tsx)*/\n  MenuIcon?: React.ComponentType;\n  /** Set title manually */\n  title?: string;\n};\n\n/**\n * The ChannelHeader component renders some basic information about a Channel.\n */\nexport const ChannelHeader = (props: ChannelHeaderProps) => {\n  const {\n    Avatar = DefaultAvatar,\n    image: overrideImage,\n    live,\n    MenuIcon = DefaultMenuIcon,\n    title: overrideTitle,\n  } = props;\n\n  const { channel, watcher_count } = useChannelStateContext('ChannelHeader');\n  const { openMobileNav } = useChatContext('ChannelHeader');\n  const { t } = useTranslationContext('ChannelHeader');\n  const { displayImage, displayTitle, groupChannelDisplayInfo } = useChannelPreviewInfo({\n    channel,\n    overrideImage,\n    overrideTitle,\n  });\n\n  const { member_count, subtitle } = channel?.data || {};\n\n  return (\n    <div className='str-chat__channel-header'>\n      <button\n        aria-label={t('aria/Menu')}\n        className='str-chat__header-hamburger'\n        onClick={openMobileNav}\n      >\n        <MenuIcon />\n      </button>\n      <Avatar\n        className='str-chat__avatar--channel-header'\n        groupChannelDisplayInfo={groupChannelDisplayInfo}\n        image={displayImage}\n        name={displayTitle}\n      />\n      <div className='str-chat__channel-header-end'>\n        <p className='str-chat__channel-header-title'>\n          {displayTitle}{' '}\n          {live && (\n            <span className='str-chat__header-livestream-livelabel'>{t('live')}</span>\n          )}\n        </p>\n        {subtitle && <p className='str-chat__channel-header-subtitle'>{subtitle}</p>}\n        <p className='str-chat__channel-header-info'>\n          {!live && !!member_count && member_count > 0 && (\n            <>\n              {t('{{ memberCount }} members', {\n                memberCount: member_count,\n              })}\n              ,{' '}\n            </>\n          )}\n          {t('{{ watcherCount }} online', { watcherCount: watcher_count })}\n        </p>\n      </div>\n    </div>\n  );\n};\n", "import React from 'react';\n\nimport { useTranslationContext } from '../../context';\n\nexport const MenuIcon = ({ title }: { title?: string }) => {\n  const { t } = useTranslationContext('MenuIcon');\n\n  return (\n    <svg data-testid='menu-icon' viewBox='0 0 448 512' xmlns='http://www.w3.org/2000/svg'>\n      <title>{title ?? t('Menu')}</title>\n      <path\n        d='M0 88C0 74.75 10.75 64 24 64H424C437.3 64 448 74.75 448 88C448 101.3 437.3 112 424 112H24C10.75 112 0 101.3 0 88zM0 248C0 234.7 10.75 224 24 224H424C437.3 224 448 234.7 448 248C448 261.3 437.3 272 424 272H24C10.75 272 0 261.3 0 248zM424 432H24C10.75 432 0 421.3 0 408C0 394.7 10.75 384 24 384H424C437.3 384 448 394.7 448 408C448 421.3 437.3 432 424 432z'\n        fill='currentColor'\n      />\n    </svg>\n  );\n};\n", "import React, { useMemo } from 'react';\nimport {\n  ChannelSearchSource,\n  MessageSearchSource,\n  SearchController,\n  UserSearchSource,\n} from 'stream-chat';\nimport type { PropsWithChildren } from 'react';\nimport type { StreamChat } from 'stream-chat';\n\nimport { useChat } from './hooks/useChat';\nimport { useCreateChatContext } from './hooks/useCreateChatContext';\nimport { useChannelsQueryState } from './hooks/useChannelsQueryState';\nimport { ChatProvider } from '../../context/ChatContext';\nimport { TranslationProvider } from '../../context/TranslationContext';\nimport type { CustomClasses } from '../../context/ChatContext';\nimport { type MessageContextValue, ModalDialogManagerProvider } from '../../context';\nimport type { SupportedTranslations } from '../../i18n/types';\nimport type { Streami18n } from '../../i18n/Streami18n';\n\nexport type ChatProps = {\n  /** The StreamChat client object */\n  client: StreamChat;\n  /** Object containing custom CSS classnames to override the library's default container CSS */\n  customClasses?: CustomClasses;\n  /** Sets the default fallback language for UI component translation, defaults to 'en' for English */\n  defaultLanguage?: SupportedTranslations;\n  /** Instance of Stream i18n */\n  i18nInstance?: Streami18n;\n  /** Initial status of mobile navigation */\n  initialNavOpen?: boolean;\n  /** Instance of SearchController class that allows to control all the search operations. */\n  searchController?: SearchController;\n  /** Used for injecting className/s to the Channel and ChannelList components */\n  theme?: string;\n  /**\n   * Windows 10 does not support country flag emojis out of the box. It chooses to render these emojis as characters instead. Stream\n   * Chat can override this behavior by loading a custom web font that will render images instead (PNGs or SVGs depending on the platform).\n   * Set this prop to true if you want to use these custom emojis for Windows users.\n   *\n   * Note: requires importing `stream-chat-react/css/v2/emoji-replacement.css` style sheet\n   */\n  useImageFlagEmojisOnWindows?: boolean;\n} & Partial<Pick<MessageContextValue, 'isMessageAIGenerated'>>;\n\n/**\n * Wrapper component for a StreamChat application. Chat needs to be placed around any other chat components\n * as it provides the ChatContext.\n */\nexport const Chat = (props: PropsWithChildren<ChatProps>) => {\n  const {\n    children,\n    client,\n    customClasses,\n    defaultLanguage,\n    i18nInstance,\n    initialNavOpen = true,\n    isMessageAIGenerated,\n    searchController: customChannelSearchController,\n    theme = 'messaging light',\n    useImageFlagEmojisOnWindows = false,\n  } = props;\n\n  const {\n    channel,\n    closeMobileNav,\n    getAppSettings,\n    latestMessageDatesByChannels,\n    mutes,\n    navOpen,\n    openMobileNav,\n    setActiveChannel,\n    translators,\n  } = useChat({ client, defaultLanguage, i18nInstance, initialNavOpen });\n\n  const channelsQueryState = useChannelsQueryState();\n\n  const searchController = useMemo(\n    () =>\n      customChannelSearchController ??\n      new SearchController({\n        sources: [\n          new ChannelSearchSource(client),\n          new UserSearchSource(client),\n          new MessageSearchSource(client),\n        ],\n      }),\n    [client, customChannelSearchController],\n  );\n\n  const chatContextValue = useCreateChatContext({\n    channel,\n    channelsQueryState,\n    client,\n    closeMobileNav,\n    customClasses,\n    getAppSettings,\n    isMessageAIGenerated,\n    latestMessageDatesByChannels,\n    mutes,\n    navOpen,\n    openMobileNav,\n    searchController,\n    setActiveChannel,\n    theme,\n    useImageFlagEmojisOnWindows,\n  });\n\n  if (!translators.t) return null;\n\n  return (\n    <ChatProvider value={chatContextValue}>\n      <TranslationProvider value={translators}>\n        <ModalDialogManagerProvider>{children}</ModalDialogManagerProvider>\n      </TranslationProvider>\n    </ChatProvider>\n  );\n};\n", "import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { TranslationContextValue } from '../../../context/TranslationContext';\nimport type { SupportedTranslations } from '../../../i18n';\nimport {\n  defaultDateTimeParser,\n  defaultTranslatorFunction,\n  isLanguageSupported,\n  Streami18n,\n} from '../../../i18n';\n\nimport type {\n  AppSettingsAPIResponse,\n  Channel,\n  Event,\n  Mute,\n  OwnUserResponse,\n  StreamChat,\n} from 'stream-chat';\n\nexport type UseChatParams = {\n  client: StreamChat;\n  defaultLanguage?: SupportedTranslations;\n  i18nInstance?: Streami18n;\n  initialNavOpen?: boolean;\n};\n\nexport const useChat = ({\n  client,\n  defaultLanguage = 'en',\n  i18nInstance,\n  initialNavOpen,\n}: UseChatParams) => {\n  const [translators, setTranslators] = useState<TranslationContextValue>({\n    t: defaultTranslatorFunction,\n    tDateTimeParser: defaultDateTimeParser,\n    userLanguage: 'en',\n  });\n\n  const [channel, setChannel] = useState<Channel>();\n  const [mutes, setMutes] = useState<Array<Mute>>([]);\n  const [navOpen, setNavOpen] = useState(initialNavOpen);\n  const [latestMessageDatesByChannels, setLatestMessageDatesByChannels] = useState({});\n\n  const clientMutes = (client.user as OwnUserResponse)?.mutes ?? [];\n\n  const closeMobileNav = () => setNavOpen(false);\n  const openMobileNav = () => setTimeout(() => setNavOpen(true), 100);\n\n  const appSettings = useRef<Promise<AppSettingsAPIResponse> | null>(null);\n\n  const getAppSettings = () => {\n    if (appSettings.current) {\n      return appSettings.current;\n    }\n    appSettings.current = client.getAppSettings();\n    return appSettings.current;\n  };\n\n  useEffect(() => {\n    if (!client) return;\n\n    const version = process.env.STREAM_CHAT_REACT_VERSION;\n\n    const userAgent = client.getUserAgent();\n    if (!userAgent.includes('stream-chat-react')) {\n      // result looks like: 'stream-chat-react-2.3.2-stream-chat-javascript-client-browser-2.2.2'\n      // the upper-case text between double underscores is replaced with the actual semantic version of the library\n      client.setUserAgent(`stream-chat-react-${version}-${userAgent}`);\n    }\n\n    client.threads.registerSubscriptions();\n    client.polls.registerSubscriptions();\n    client.reminders.registerSubscriptions();\n    client.reminders.initTimers();\n\n    return () => {\n      client.threads.unregisterSubscriptions();\n      client.polls.unregisterSubscriptions();\n      client.reminders.unregisterSubscriptions();\n      client.reminders.clearTimers();\n    };\n  }, [client]);\n\n  useEffect(() => {\n    setMutes(clientMutes);\n\n    const handleEvent = (event: Event) => {\n      setMutes(event.me?.mutes || []);\n    };\n\n    client.on('notification.mutes_updated', handleEvent);\n    return () => client.off('notification.mutes_updated', handleEvent);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [clientMutes?.length]);\n\n  useEffect(() => {\n    let userLanguage = client.user?.language;\n\n    if (!userLanguage) {\n      const browserLanguage = window.navigator.language.slice(0, 2); // just get language code, not country-specific version\n      userLanguage = isLanguageSupported(browserLanguage)\n        ? browserLanguage\n        : defaultLanguage;\n    }\n\n    const streami18n = i18nInstance || new Streami18n({ language: userLanguage });\n\n    streami18n.registerSetLanguageCallback((t) =>\n      setTranslators((prevTranslator) => ({ ...prevTranslator, t })),\n    );\n\n    streami18n.getTranslators().then((translator) => {\n      setTranslators({\n        ...translator,\n        userLanguage: userLanguage || defaultLanguage,\n      });\n    });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [i18nInstance]);\n\n  const setActiveChannel = useCallback(\n    async (\n      activeChannel?: Channel,\n      watchers: { limit?: number; offset?: number } = {},\n      event?: React.BaseSyntheticEvent,\n    ) => {\n      if (event && event.preventDefault) event.preventDefault();\n\n      if (activeChannel && Object.keys(watchers).length) {\n        await activeChannel.query({ watch: true, watchers });\n      }\n\n      setChannel(activeChannel);\n      closeMobileNav();\n    },\n    [],\n  );\n\n  useEffect(() => {\n    setLatestMessageDatesByChannels({});\n  }, [client.user?.id]);\n\n  return {\n    channel,\n    closeMobileNav,\n    getAppSettings,\n    latestMessageDatesByChannels,\n    mutes,\n    navOpen,\n    openMobileNav,\n    setActiveChannel,\n    translators,\n  };\n};\n", "import { useMemo } from 'react';\n\nimport type { ChatContextValue } from '../../../context/ChatContext';\n\nexport const useCreateChatContext = (value: ChatContextValue) => {\n  const {\n    channel,\n    channelsQueryState,\n    client,\n    closeMobileNav,\n    customClasses,\n    getAppSettings,\n    isMessageAIGenerated,\n    latestMessageDatesByChannels,\n    mutes,\n    navOpen,\n    openMobileNav,\n    searchController,\n    setActiveChannel,\n    theme,\n    useImageFlagEmojisOnWindows,\n  } = value;\n\n  const channelCid = channel?.cid;\n  const channelsQueryError = channelsQueryState.error;\n  const channelsQueryInProgress = channelsQueryState.queryInProgress;\n  const clientValues = `${client.clientID}${Object.keys(client.activeChannels).length}${\n    Object.keys(client.listeners).length\n  }${client.mutedChannels.length}\n  ${client.user?.id}`;\n  const mutedUsersLength = mutes.length;\n\n  const chatContext: ChatContextValue = useMemo(\n    () => ({\n      channel,\n      channelsQueryState,\n      client,\n      closeMobileNav,\n      customClasses,\n      getAppSettings,\n      isMessageAIGenerated,\n      latestMessageDatesByChannels,\n      mutes,\n      navOpen,\n      openMobileNav,\n      searchController,\n      setActiveChannel,\n      theme,\n      useImageFlagEmojisOnWindows,\n    }),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      channelCid,\n      channelsQueryError,\n      channelsQueryInProgress,\n      clientValues,\n      getAppSettings,\n      searchController,\n      mutedUsersLength,\n      navOpen,\n      isMessageAIGenerated,\n    ],\n  );\n\n  return chatContext;\n};\n", "import type { Dispatch, SetStateAction } from 'react';\nimport { useState } from 'react';\nimport type { APIErrorResponse, ErrorFromResponse } from 'stream-chat';\n\ntype ChannelQueryState =\n  | 'uninitialized' // the initial state before the first channels query is triggered\n  | 'reload' // the initial channels query (loading the first page) is in progress\n  | 'load-more' // loading the next page of channels\n  | null; // at least one channels page has been loaded and there is no query in progress at the moment\n\nexport interface ChannelsQueryState {\n  error: ErrorFromResponse<APIErrorResponse> | null;\n  queryInProgress: ChannelQueryState;\n  setError: Dispatch<SetStateAction<ErrorFromResponse<APIErrorResponse> | null>>;\n  setQueryInProgress: Dispatch<SetStateAction<ChannelQueryState>>;\n}\n\nexport const useChannelsQueryState = (): ChannelsQueryState => {\n  const [error, setError] = useState<ErrorFromResponse<APIErrorResponse> | null>(null);\n  const [queryInProgress, setQueryInProgress] =\n    useState<ChannelQueryState>('uninitialized');\n\n  return {\n    error,\n    queryInProgress,\n    setError,\n    setQueryInProgress,\n  };\n};\n", "import { useEffect, useState } from 'react';\n\nimport { StreamChat } from 'stream-chat';\n\nimport type {\n  OwnUserResponse,\n  StreamChatOptions,\n  TokenOrProvider,\n  UserResponse,\n} from 'stream-chat';\n\n/**\n * React hook to create, connect and return `StreamChat` client.\n */\nexport const useCreateChatClient = ({\n  apiKey,\n  options,\n  tokenOrProvider,\n  userData,\n}: {\n  apiKey: string;\n  tokenOrProvider: TokenOrProvider;\n  userData: OwnUserResponse | UserResponse;\n  options?: StreamChatOptions;\n}) => {\n  const [chatClient, setChatClient] = useState<StreamChat | null>(null);\n  const [cachedUserData, setCachedUserData] = useState(userData);\n\n  if (userData.id !== cachedUserData.id) {\n    setCachedUserData(userData);\n  }\n\n  const [cachedOptions] = useState(options);\n\n  useEffect(() => {\n    const client = new StreamChat(apiKey, undefined, cachedOptions);\n    let didUserConnectInterrupt = false;\n\n    const connectionPromise = client\n      .connectUser(cachedUserData, tokenOrProvider)\n      .then(() => {\n        if (!didUserConnectInterrupt) setChatClient(client);\n      });\n\n    return () => {\n      didUserConnectInterrupt = true;\n      setChatClient(null);\n      connectionPromise\n        .then(() => client.disconnectUser())\n        .then(() => {\n          console.log(`Connection for user \"${cachedUserData.id}\" has been closed`);\n        });\n    };\n  }, [apiKey, cachedUserData, cachedOptions, tokenOrProvider]);\n\n  return chatClient;\n};\n", "import type { PropsWithChildren } from 'react';\nimport React from 'react';\nimport clsx from 'clsx';\n\nimport type { LocalMessage } from 'stream-chat';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\n\nexport type WindowProps = {\n  /** optional prop to force addition of class str-chat__main-panel---with-thread-opn to the Window root element */\n  thread?: LocalMessage;\n};\n\nconst UnMemoizedWindow = (props: PropsWithChildren<WindowProps>) => {\n  const { children, thread: propThread } = props;\n\n  const { thread: contextThread } = useChannelStateContext('Window');\n\n  return (\n    <div\n      className={clsx('str-chat__main-panel', {\n        'str-chat__main-panel--thread-open': contextThread || propThread,\n      })}\n    >\n      {children}\n    </div>\n  );\n};\n\n/**\n * A UI component for conditionally displaying a Thread or Channel\n */\nexport const Window = React.memo(UnMemoizedWindow) as typeof UnMemoizedWindow;\n"],
  "mappings": "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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAC,iBAAkB;;;ACAlB,mBAAoC;AAG7B,IAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AACZ;AAOO,IAAM,aAAa,CAAC,YAA4C;AACrE,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAkB,SAAS,IAAI;AAE7D,8BAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,UAAM,2BAA2B,QAAQ,GAAG,uBAAuB,CAAC,UAAiB;AACnF,YAAM,EAAE,IAAI,IAAI;AAChB,YAAM,QAAQ,MAAM;AACpB,UAAI,QAAQ,QAAQ,KAAK;AACvB,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF,CAAC;AAED,UAAM,2BAA2B,QAAQ,GAAG,sBAAsB,CAAC,UAAU;AAC3E,YAAM,EAAE,IAAI,IAAI;AAChB,UAAI,QAAQ,QAAQ,KAAK;AACvB,mBAAW,SAAS,IAAI;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,UAAM,2BAA2B,QAAQ,GAAG,qBAAqB,CAAC,UAAU;AAC1E,YAAM,EAAE,IAAI,IAAI;AAChB,UAAI,QAAQ,QAAQ,KAAK;AACvB,mBAAW,SAAS,IAAI;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,+BAAyB,YAAY;AACrC,+BAAyB,YAAY;AACrC,+BAAyB,YAAY;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO,EAAE,QAAQ;AACnB;;;ACtDA,IAAAC,gBAAkC;AAsE3B,IAAM,uBAAuB,cAAAC,QAAM,cAExC,MAAS;AAEJ,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AACF,MAGE,8BAAAA,QAAA,cAAC,qBAAqB,UAArB,EAA8B,SAC5B,QACH;AAGK,IAAM,0BAA0B,CAAC,kBAA2B;AACjE,QAAM,mBAAe,0BAAW,oBAAoB;AAEpD,MAAI,CAAC,cAAc;AACjB,YAAQ;AAAA,MACN,uMAAuM,aAAa;AAAA,IACtN;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;AAOO,IAAM,2BAA2B,CACtCC,eACG;AACH,QAAM,oCAAoC,CACxC,UACG;AACH,UAAM,uBAAuB,wBAAwB;AAErD,WAAO,8BAAAD,QAAA,cAACC,YAAA,EAAW,GAAI,OAAc,GAAG,sBAAsB;AAAA,EAChE;AAEA,oCAAkC,eAChCA,WAAU,eACVA,WAAU,QACV,aACA,QAAQ,QAAQ,EAAE;AAEpB,SAAO;AACT;;;AC1HA,IAAAC,gBAAiD;AAwB1C,IAAM,yBAAqB;AAAA,EAChC;AACF;AAKO,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AACF,MAGE,8BAAAC,QAAA,cAAC,mBAAmB,UAAnB,EAA4B,SAC1B,QACH;AAGK,IAAM,wBAAwB,CAAC,kBAA2B;AAC/D,QAAM,mBAAe,0BAAW,kBAAkB;AAElD,MAAI,CAAC,cAAc;AACjB,YAAQ;AAAA,MACN,4LAA4L,aAAa;AAAA,IAC3M;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;;;ACtDA,IAAAC,gBAAkC;AA4D3B,IAAM,sBAAsB,cAAAC,QAAM,cAEvC,MAAS;AAEJ,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AACF,MAGE,8BAAAA,QAAA,cAAC,oBAAoB,UAApB,EAA6B,SAC3B,QACH;AAGK,IAAM,yBAAyB,CAAC,kBAA2B;AAChE,QAAM,mBAAe,0BAAW,mBAAmB;AAEnD,MAAI,CAAC,cAAc;AACjB,YAAQ;AAAA,MACN,qMAAqM,aAAa;AAAA,IACpN;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;AAOO,IAAM,0BAA0B,CACrCC,eACG;AACH,QAAM,mCAAmC,CACvC,UACG;AACH,UAAM,sBAAsB,uBAAuB;AAEnD,WAAO,8BAAAD,QAAA,cAACC,YAAA,EAAW,GAAI,OAAc,GAAG,qBAAqB;AAAA,EAC/D;AAEA,mCAAiC,eAC/BA,WAAU,eACVA,WAAU,QACV,aACA,QAAQ,QAAQ,EAAE;AAEpB,SAAO;AACT;;;ACjHA,IAAAC,gBAAkC;;;ACE3B,IAAM,iBAAiB,CAC5BC,eACGA,WAAU,eAAeA,WAAU,QAAQ;;;AD8DzC,IAAM,cAAc,cAAAC,QAAM,cAA4C,MAAS;AAE/E,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AACF,MAGE,8BAAAA,QAAA,cAAC,YAAY,UAAZ,EAAqB,SACnB,QACH;AAGK,IAAM,iBAAiB,CAAC,kBAA2B;AACxD,QAAM,mBAAe,0BAAW,WAAW;AAE3C,MAAI,CAAC,cAAc;AACjB,YAAQ;AAAA,MACN,kLAAkL,aAAa;AAAA,IACjM;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;AAOO,IAAM,kBAAkB,CAC7BC,eACG;AACH,QAAM,2BAA2B,CAAC,UAA2C;AAC3E,UAAM,cAAc,eAAe;AAEnC,WAAO,8BAAAD,QAAA,cAACC,YAAA,EAAW,GAAI,OAAc,GAAG,aAAa;AAAA,EACvD;AACA,2BAAyB,cAAc,kBAAkB,eAAeA,UAAS,CAAC;AAClF,SAAO;AACT;;;AE3GA,IAAAC,gBAAkC;AAuP3B,IAAM,mBAAmB,cAAAC,QAAM,cAAqC,CAAC,CAAC;AAEtE,IAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AACF,MAGE,8BAAAA,QAAA,cAAC,iBAAiB,UAAjB,EAA0B,SACxB,QACH;AAGK,IAAM,sBAAsB,CAKjC,uBACG,0BAAW,gBAAgB;AAOzB,IAAM,uBAAuB,CAClCC,eACG;AACH,QAAM,gCAAgC,CAAC,UAAgD;AACrF,UAAM,mBAAmB,oBAAoB;AAE7C,WAAO,8BAAAD,QAAA,cAACC,YAAA,EAAW,GAAI,OAAc,GAAG,kBAAkB;AAAA,EAC5D;AAEA,gCAA8B,eAC5BA,WAAU,eACVA,WAAU,QACV,aACA,QAAQ,QAAQ,EAAE;AAEpB,SAAO;AACT;;;AClSA,IAAAC,iBAMO;AACP,IAAAC,sBAA2B;;;ACP3B,oBAAuB;AACvB,yBAA2B;AAuCpB,IAAM,gBAAN,MAAoB;AAAA,EAMzB,YAAY,EAAE,GAAG,IAA0B,CAAC,GAAG;AAJ/C,iBAAQ,IAAI,8BAA+B;AAAA,MACzC,aAAa,CAAC;AAAA,IAChB,CAAC;AAGC,SAAK,KAAK,UAAM,sBAAO;AAAA,EACzB;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,OAAO,OAAO,KAAK,MAAM,eAAe,EAAE,WAAW,EAAE;AAAA,MAC5D,CAAC,OAAO,WAAW;AACjB,YAAI,OAAO,OAAQ,QAAO,QAAQ;AAClC,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,IAAc;AAChB,WAAO,KAAK,MAAM,eAAe,EAAE,YAAY,EAAE;AAAA,EACnD;AAAA,EAEA,YAAY,EAAE,GAAG,GAA4B;AAC3C,QAAI,SAAS,KAAK,MAAM,eAAe,EAAE,YAAY,EAAE;AACvD,QAAI,CAAC,QAAQ;AACX,eAAS;AAAA,QACP,OAAO,MAAM;AACX,eAAK,MAAM,EAAE;AAAA,QACf;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,MAAM,MAAM;AACV,eAAK,KAAK,EAAE,GAAG,CAAC;AAAA,QAClB;AAAA,QACA,gBAAgB;AAAA,QAChB,QAAQ,MAAM;AACZ,eAAK,OAAO,EAAE;AAAA,QAChB;AAAA,QACA,QAAQ,CAAC,WAAW,UAAU;AAC5B,eAAK,OAAO,EAAE,GAAG,GAAG,QAAQ;AAAA,QAC9B;AAAA,MACF;AACA,WAAK,MAAM,KAAK,CAAC,aAAa;AAAA,QAC5B,GAAG;AAAA,QACH,GAAG,EAAE,aAAa,EAAE,GAAG,QAAQ,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE;AAAA,MAC7D,EAAE;AAAA,IACJ;AAEA,QAAI,OAAO,gBAAgB;AACzB,mBAAa,OAAO,cAAc;AAClC,WAAK,MAAM,KAAK,CAAC,aAAa;AAAA,QAC5B,GAAG;AAAA,QACH,GAAG;AAAA,UACD,aAAa;AAAA,YACX,GAAG,QAAQ;AAAA,YACX,CAAC,EAAE,GAAG;AAAA,cACJ,GAAG;AAAA,cACH,gBAAgB;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAAA,MACF,EAAE;AAAA,IACJ;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,QAAiC,WAAqB;AACzD,UAAM,SAAS,KAAK,YAAY,MAAM;AACtC,QAAI,OAAO,OAAQ;AACnB,QAAI,WAAW;AACb,WAAK,SAAS;AAAA,IAChB;AACA,SAAK,MAAM,KAAK,CAAC,aAAa;AAAA,MAC5B,GAAG;AAAA,MACH,aAAa,EAAE,GAAG,QAAQ,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,QAAQ,QAAQ,KAAK,EAAE;AAAA,IAClF,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,IAAc;AAClB,UAAM,SAAS,KAAK,MAAM,eAAe,EAAE,YAAY,EAAE;AACzD,QAAI,CAAC,QAAQ,OAAQ;AACrB,SAAK,MAAM,KAAK,CAAC,aAAa;AAAA,MAC5B,GAAG;AAAA,MACH,aAAa,EAAE,GAAG,QAAQ,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,QAAQ,QAAQ,MAAM,EAAE;AAAA,IACnF,EAAE;AAAA,EACJ;AAAA,EAEA,WAAW;AACT,WAAO,OAAO,KAAK,MAAM,eAAe,EAAE,WAAW,EAAE;AAAA,MAAQ,CAAC,WAC9D,OAAO,MAAM;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,QAAiC,WAAW,OAAO;AACxD,QAAI,KAAK,MAAM,eAAe,EAAE,YAAY,OAAO,EAAE,GAAG,QAAQ;AAC9D,WAAK,MAAM,OAAO,EAAE;AAAA,IACtB,OAAO;AACL,WAAK,KAAK,QAAQ,QAAQ;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,OAAO,IAAc;AACnB,UAAM,QAAQ,KAAK,MAAM,eAAe;AACxC,UAAM,SAAS,MAAM,YAAY,EAAE;AACnC,QAAI,CAAC,OAAQ;AAEb,QAAI,OAAO,gBAAgB;AACzB,mBAAa,OAAO,cAAc;AAAA,IACpC;AAEA,SAAK,MAAM,KAAK,CAAC,YAAY;AAC3B,YAAM,aAAa,EAAE,GAAG,QAAQ,YAAY;AAC5C,aAAO,WAAW,EAAE;AACpB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,IAAc;AAC3B,UAAM,SAAS,KAAK,MAAM,eAAe,EAAE,YAAY,EAAE;AAEzD,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,SAAK,MAAM,KAAK,CAAC,aAAa;AAAA,MAC5B,GAAG;AAAA,MACH,aAAa;AAAA,QACX,GAAG,QAAQ;AAAA,QACX,CAAC,EAAE,GAAG;AAAA,UACJ,GAAG;AAAA,UACH,gBAAgB,WAAW,MAAM;AAC/B,iBAAK,OAAO,EAAE;AAAA,UAChB,GAAG,EAAE;AAAA,QACP;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AACF;;;AC3LA,IAAAC,iBAAmC;;;ACDnC,IAAAC,gBAAuC;;;ACAvC,IAAAC,gBAAqC;AACrC,kBAAqC;AAKrC,IAAM,OAAO,MAAM;AAAC;AAUb,SAAS,cAGd,OAAkCC,WAAuB;AACzD,QAAM,0BAAsB;AAAA,IAC1B,CAAC,kBAA8B;AAC7B,YAAM,cAAc,OAAO,sBAAsBA,WAAU,aAAa;AACxE,aAAO,eAAe;AAAA,IACxB;AAAA,IACA,CAAC,OAAOA,SAAQ;AAAA,EAClB;AAEA,QAAM,sBAAkB,uBAAQ,MAAM;AACpC,QAAI;AAEJ,WAAO,MAAM;AACX,YAAM,eAAe,OAAO,eAAe;AAE3C,UAAI,CAAC,aAAc,QAAO;AAG1B,UAAI,eAAe,YAAY,CAAC,MAAM,cAAc;AAClD,eAAO,YAAY,CAAC;AAAA,MACtB;AAEA,YAAM,gBAAgBA,UAAS,YAAY;AAG3C,UAAI,aAAa;AACf,YAAI,6BAA6B;AAEjC,mBAAW,OAAO,YAAY,CAAC,GAAG;AAChC,cAAI,YAAY,CAAC,EAAE,GAAG,MAAM,cAAc,GAAG,EAAG;AAChD,uCAA6B;AAC7B;AAAA,QACF;AAEA,YAAI,2BAA4B,QAAO,YAAY,CAAC;AAAA,MACtD;AAEA,oBAAc,CAAC,cAAc,aAAa;AAC1C,aAAO,YAAY,CAAC;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,OAAOA,SAAQ,CAAC;AAEpB,QAAM,YAAQ,kCAAqB,qBAAqB,eAAe;AAEvE,SAAO;AACT;;;ADlDO,IAAM,YAAY,CAAC,EAAE,iBAAiB,GAAG,MAAuB;AACrE,QAAM,EAAE,cAAc,IAAI,iBAAiB,EAAE,gBAAgB,CAAC;AAE9D;AAAA,IACE,MAAM,MAAM;AAKV,oBAAc,eAAe,EAAE;AAAA,IACjC;AAAA,IACA,CAAC,eAAe,EAAE;AAAA,EACpB;AAEA,SAAO,cAAc,YAAY,EAAE,GAAG,CAAC;AACzC;AAEO,IAAM,4BAA4B,CAAC,EAAE,GAAG,MAAmC;AAChF,QAAM,EAAE,cAAc,IAAI,+BAA+B,KAAK,CAAC;AAC/D,QAAM,SAAS,UAAU,EAAE,iBAAiB,eAAe,IAAI,GAAG,CAAC;AAEnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,gBAAgB;AAEtB,IAAM,iBAAiB,MAC5B,UAAU,EAAE,iBAAiB,sBAAsB,IAAI,cAAc,CAAC;AAEjE,IAAM,kBAAkB,CAAC,IAAY,oBAA6B;AACvE,QAAM,EAAE,cAAc,IAAI,iBAAiB,EAAE,gBAAgB,CAAC;AAC9D,QAAM,2BAAuB;AAAA,IAC3B,CAAC,EAAE,YAAY,OAA2B,EAAE,QAAQ,CAAC,CAAC,YAAY,EAAE,GAAG,OAAO;AAAA,IAC9E,CAAC,EAAE;AAAA,EACL;AACA,SAAO,cAAc,cAAc,OAAO,oBAAoB,EAAE;AAClE;AAEO,IAAM,uBAAuB,MAClC,gBAAgB,eAAe,oBAAoB;AAErD,IAAM,4BAA4B,CAAC,eAAmC;AAAA,EACpE,mBAAmB,OAAO,OAAO,UAAU,WAAW,EAAE,OAAO,CAAC,OAAO,WAAW;AAChF,QAAI,OAAO,OAAQ,QAAO,QAAQ;AAClC,WAAO;AAAA,EACT,GAAG,CAAC;AACN;AAEO,IAAM,uBAAuB,CAAC;AAAA,EACnC;AACF,IAAkC,CAAC,MAAM;AACvC,QAAM,EAAE,cAAc,IAAI,iBAAiB,EAAE,gBAAgB,CAAC;AAC9D,SAAO,cAAc,cAAc,OAAO,yBAAyB,EAAE;AACvE;;;AErEA,IAAAC,gBAA0C;AAC1C,uBAA6B;AAOtB,IAAM,SAAS,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF,MAA0D;AACxD,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,wBAAyB,IAAI;AAE/E,qCAAgB,MAAM;AACpB,UAAM,cAAc,qBAAqB;AACzC,QAAI,CAAC,eAAe,CAAC,OAAQ;AAC7B,yBAAqB,WAAW;AAAA,EAClC,GAAG,CAAC,sBAAsB,MAAM,CAAC;AAEjC,MAAI,CAAC,kBAAmB,QAAO;AAE/B,aAAO,+BAAa,UAAU,iBAAiB;AACjD;;;AHnBO,IAAM,0BAA0B,MAAM;AAC3C,QAAM,EAAE,cAAc,IAAI,+BAA+B,KAAK,CAAC;AAC/D,QAAM,oBAAoB,qBAAqB,EAAE,iBAAiB,eAAe,GAAG,CAAC;AAiBrF,MAAI,CAAC,kBAAmB,QAAO;AAE/B,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,4BAA0B,eAAe;AAAA,MACzC,eAAY;AAAA,MACZ,SAAS,MAAM,eAAe,SAAS;AAAA,MAEvC,OACE;AAAA,QACE,qCAAqC,oBAAoB,IAAI,SAAS;AAAA,MACxE;AAAA;AAAA,EAEJ;AAEJ;AAOO,IAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,MAAiD;AAC/C,QAAM,EAAE,cAAc,IAAI,iBAAiB,EAAE,UAAU,gBAAgB,CAAC;AACxE,QAAM,eAAe,gBAAgB,UAAU,eAAe;AAE9D,QAAM,2BAAuB;AAAA,IAC3B,MAAM,SAAS,cAAc,iCAAiC,cAAc,EAAE,IAAI;AAAA,IAClF,CAAC,cAAc,EAAE;AAAA,EACnB;AAEA,SACE,+BAAAA,QAAA,cAAC,UAAO,sBAA4C,QAAQ,gBACzD,QACH;AAEJ;;;AFlDA,IAAM,yBAA0D,IAAI,+BAAW,CAAC,CAAC;AAEjF,IAAM,mBAAmB,CAAC,OACxB,uBAAuB,eAAe,EAAE,EAAE;AAE5C,IAAM,2BAA2B,CAAC,OAAe;AAC/C,MAAI,UAAU,iBAAiB,EAAE;AACjC,MAAI,CAAC,SAAS;AACZ,cAAU,IAAI,cAAc,EAAE,GAAG,CAAC;AAClC,2BAAuB,YAAY,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC;AAAA,EACtD;AACA,SAAO;AACT;AAEA,IAAM,sBAAsB,CAAC,OAAe;AAC1C,MAAI,CAAC,iBAAiB,EAAE,EAAG;AAC3B,yBAAuB,YAAY,EAAE,CAAC,EAAE,GAAG,OAAU,CAAC;AACxD;AAMA,IAAM,+BAA+B,eAAAC,QAAM,cAEzC,MAAS;AAQJ,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AACF,MAA0C;AACxC,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAA+B,MAAM;AAC7E,QAAI,GAAI,QAAO,iBAAiB,EAAE,KAAK;AACvC,WAAO,IAAI,cAAc;AAAA,EAC3B,CAAC;AAED,gCAAU,MAAM;AACd,QAAI,CAAC,GAAI;AACT,qBAAiB,yBAAyB,EAAE,CAAC;AAC7C,WAAO,MAAM;AACX,0BAAoB,EAAE;AACtB,uBAAiB,IAAI;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,EAAE,CAAC;AAGP,MAAI,CAAC,cAAe,QAAO;AAE3B,SACE,+BAAAA,QAAA,cAAC,6BAA6B,UAA7B,EAAsC,OAAO,EAAE,cAAc,KAC3D,UACD,+BAAAA,QAAA,cAAC,6BAAwB,CAC3B;AAEJ;AAOA,IAAM,sBAAsB,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAGM;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,iBAAiB;AACnB,QAAI,CAAC,UAAU;AACb,0BAAoB,SAAS,eAAe;AAC5C,2BAAqB,gBAAgB,eAAe;AAAA,IACtD,OAAO;AACL,UAAI,SAAS,eAAe,GAAG,IAAI,QAAQ,GAAG;AAC5C,4BAAoB,SAAS,eAAe;AAAA,MAC9C;AACA,UAAI,gBAAgB,eAAe,GAAG,IAAI,QAAQ,GAAG;AACnD,6BAAqB,cAAc,eAAe;AAAA,MACpD;AAAA,IACF;AAAA,EACF,WAAW,UAAU;AACnB,wBAAoB,OAAO,OAAO,QAAQ,EAAE;AAAA,MAC1C,CAAC,cAAc,YAAY,WAAW,IAAI,QAAQ;AAAA,IACpD;AACA,yBACE,iBACA,OAAO,OAAO,aAAa,EAAE;AAAA,MAC3B,CAAC,cAAc,YAAY,WAAW,IAAI,QAAQ;AAAA,IACpD;AAAA,EACJ;AAEA,SAAO,EAAE,mBAAmB,mBAAmB;AACjD;AAMO,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AACF,IAA4B,CAAC,MAAM;AACjC,QAAM,kCAA8B,2BAAW,4BAA4B;AAE3E,QAAM,CAAC,sBAAsB,uBAAuB,QAAI,yBAEtD,MAAM;AACN,UAAM,EAAE,kBAAkB,IAAI,oBAAoB;AAAA,MAChD;AAAA,MACA;AAAA,MACA,UAAU,uBAAuB,eAAe;AAAA,MAChD,eAAe;AAAA,IACjB,CAAC;AACD,WAAO,oBACH,EAAE,eAAe,kBAAkB,IACnC;AAAA,EACN,CAAC;AAED,gCAAU,MAAM;AACd,QAAI,CAAC,YAAY,CAAC,gBAAiB;AACnC,UAAM,cAAc,uBAAuB;AAAA,MACzC,CAAC,UAAU;AAAA,MACX,CAAC,UAAU,kBAAkB;AAC3B,cAAM,EAAE,mBAAmB,mBAAmB,IAAI,oBAAoB;AAAA,UACpE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,CAAC,sBAAsB,mBAAmB,OAAO,mBAAmB,IAAI;AAC1E,kCAAwB,CAAC,cAAc;AACrC,gBAAI,WAAW,cAAc,OAAO,mBAAmB,GAAI,QAAO;AAElE,mBAAO;AAAA,cACL,eACE,qBAAqB,6BAA6B;AAAA,YACtD;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,UAAU,iBAAiB,6BAA6B,aAAa,CAAC;AAE1E,MAAI,CAAC,sBAAsB,eAAe;AACxC,YAAQ;AAAA,MACN,+BAA+B,eAAe,gBAAgB,QAAQ;AAAA,IACxE;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,uBAAuB;AAE7B,IAAM,6BAA6B,CAAC,EAAE,SAAS,MACpD,+BAAAA,QAAA,cAAC,yBAAsB,IAAI,wBAAuB,QAAS;AAGtD,IAAM,wBAAwB,UACnC,wBAAQ,MAAM,iBAAiB,oBAAoB,GAAG,CAAC,CAAC;AAEnD,IAAM,iCAAiC,UAC5C,2BAAW,4BAA4B;;;AM/LzC,IAAAC,iBAAkC;AA4J3B,IAAM,iBAAiB,eAAAC,QAAM;AAAA,EAClC;AACF;AAEO,IAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AACF,MAGE,+BAAAA,QAAA,cAAC,eAAe,UAAf,EAAwB,SACtB,QACH;AAGK,IAAM,oBAAoB,CAE/B,mBACG;AACH,QAAM,mBAAe,2BAAW,cAAc;AAE9C,MAAI,CAAC,cAAc;AACjB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;AAOO,IAAM,qBAAqB,CAChCC,eACG;AACH,QAAM,8BAA8B,CAAC,UAA8C;AACjF,UAAM,iBAAiB,kBAAkB;AAEzC,WAAO,+BAAAD,QAAA,cAACC,YAAA,EAAW,GAAI,OAAc,GAAG,gBAAgB;AAAA,EAC1D;AAEA,8BAA4B,eAC1BA,WAAU,eACVA,WAAU,QACV,aACA,QAAQ,QAAQ,EAAE;AAEpB,SAAO;AACT;;;AC7MA,IAAAC,iBAAuE;AAcvE,IAAM,2BAAuB;AAAA,EAC3B;AACF;AAEO,SAAS,wBAAwB,eAAwB;AAC9D,QAAM,mBAAe,2BAAW,oBAAoB;AAEpD,MAAI,CAAC,cAAc;AACjB,YAAQ;AAAA,MACN,gIAAgI,aAAa;AAAA,IAC/I;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,EAAE,SAAS,GAA0B;AACzE,QAAM;AAAA,IACJ,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF,IAAI,kBAAkB,uBAAuB;AAE7C,MAAI,CAAC,iBAAiB,OAAO,GAAG;AAC9B,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,cAAc,IAAI,wBAAwB,uBAAuB;AAEzE,QAAMC,oBAAkC,4BAAY,MAAM;AACxD,kBAAc,OAAO;AAAA,EACvB,GAAG,CAAC,SAAS,aAAa,CAAC;AAE3B,QAAM,iBAAgC;AAAA,IACpC,CAAC,MAAM;AACL,sBAAgB,CAAC;AAAA,IACnB;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,kBAAc,4BAAY,MAAM;AACpC,kBAAc,OAAO;AAAA,EACvB,GAAG,CAAC,eAAe,OAAO,CAAC;AAE3B,QAAM,YAAQ;AAAA,IACZ,OAAO;AAAA,MACL,cAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAACA,eAAc,YAAY,aAAa,OAAO;AAAA,EACjD;AAEA,SACE,+BAAAC,QAAA,cAAC,qBAAqB,UAArB,EAA8B,SAC5B,QACH;AAEJ;;;AC9EA,IAAAC,iBAAiD;AAU1C,IAAM,0BAAsB;AAAA,EACjC;AACF;AAEO,IAAM,8BAA8B,CAAC;AAAA,EAC1C;AAAA,EACA;AACF,MAGE,+BAAAC,QAAA,cAAC,oBAAoB,UAApB,EAA6B,SAC3B,QACH;AAGK,IAAM,yBAAyB,CAEpC,kBACG;AACH,QAAM,mBAAe,2BAAW,mBAAmB;AAEnD,MAAI,CAAC,cAAc;AACjB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;;;ACpCA,IAAAC,iBAAiD;AAa1C,IAAM,yBAAqB;AAAA,EAChC;AACF;AAKO,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AACF,MAGE,+BAAAC,QAAA,cAAC,mBAAmB,UAAnB,EAA4B,SAC1B,QACH;AAGK,IAAM,wBAAwB,CAAC,kBAA2B;AAC/D,QAAM,mBAAe,2BAAW,kBAAkB;AAElD,MAAI,CAAC,cAAc;AACjB,YAAQ;AAAA,MACN,4LAA4L,aAAa;AAAA,IAC3M;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;;;AC3CA,IAAAC,iBAAkC;AAQ3B,IAAM,cAAc,eAAAC,QAAM,cAA4C,MAAS;AAE/E,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AACF,MAGE,OACE,+BAAAA,QAAA,cAAC,YAAY,UAAZ,EAAqB,OAAO,EAAE,KAAK,KACjC,QACH,IACE;AAEC,IAAM,iBAAiB,MAAM;AAClC,QAAM,mBAAe,2BAAW,WAAW;AAC3C,SAAO;AACT;;;ACzBA,IAAAC,iBAAkC;AAClC,IAAAC,gBAAkB;AAClB,sBAAqB;AACrB,6BAA4B;;;ACH5B,mBAAkB;AAeX,IAAM,sBACX;AACK,IAAM,2BACX;AAEK,IAAM,mBAAmB,CAC9B,WAC8B,OAAO,WAAW,YAAY,OAAO,WAAW;AAEzE,IAAM,gBAAgB,CAC3B,WACmC,CAAC,CAAE,QAAiC;AAElE,IAAM,SAAS,CAAC,WACrB,WAAW,QACX,OAAO,WAAW,YAClB,OAAQ,OAAgB,YAAY;AAE/B,SAAS,cAAc;AAAA,EAC5B,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AAC/C,MACE,CAAC,oBACA,OAAO,qBAAqB,YAAY,CAAC,KAAK,MAAM,gBAAgB,GACrE;AACA,YAAQ,KAAK,mBAAmB;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,eAAe,YAAY;AACpC,WAAO,WAAW,IAAI,KAAK,gBAAgB,CAAC;AAAA,EAC9C;AAEA,MAAI,KAAK,yBAAyB;AAChC,UAAM,UAAqC,CAAC;AAC5C,QAAI,OAAOA,cAAa,eAAeA,cAAa,KAAM,SAAQ,WAAWA;AAC7E,QAAI,OAAO,oBAAoB,eAAe,oBAAoB;AAChE,cAAQ,kBAAkB;AAC5B,QAAI,OAAO,WAAW,eAAe,WAAW,KAAM,SAAQ,SAAS;AAEvE,UAAM,sBAAsB,EAAE,yBAAyB;AAAA,MACrD,GAAG;AAAA,MACH,WAAW,IAAI,KAAK,gBAAgB;AAAA,IACtC,CAAC;AACD,UAAM,sBAAsB,4BAA4B;AACxD,QAAI,oBAAqB,QAAO;AAAA,EAClC;AAEA,MAAI,CAAC,iBAAiB;AACpB,YAAQ,KAAK,wBAAwB;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,gBAAgB,gBAAgB;AAEnD,MAAI,cAAc,UAAU,GAAG;AAK7B,WAAOA,aAAY,WAAW,WAC1B,WAAW,SAAS,QAAW,mBAAmB,MAAS,IAC3D,WAAW,OAAO,UAAU,MAAS;AAAA,EAC3C;AAEA,MAAI,OAAO,UAAU,GAAG;AACtB,WAAO,WAAW,aAAa;AAAA,EACjC;AAEA,MAAI,iBAAiB,UAAU,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,uBAA6C;AAAA,EACxD,mBACE,CAAC,eACD,CAAC,OAAO,GAAG,EAAE,QAAQ,WAAW,MAAgC;AAG9D,QAAI,UAAU,aAAAC,QAAM,QAAQ,WAAW,cAAc,GAAG;AACtD,aAAQ,WAAW,eAAe,SAAS,KAAK,EAAoB;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AACA,WAAO,WAAW,eAAe,SAAS,KAAK,EAAE,SAAS,CAAC,CAAC,UAAU;AAAA,EACxE;AAAA,EACF,oBACE,CAAC,eACD,CACE,OACA,GACA;AAAA,IACE;AAAA,IACA,GAAG;AAAA,EACL,MAGG;AACH,QAAI;AACJ,QAAI;AACF,UAAI,CAAC,QAAQ,UAAU;AACrB,gCAAwB,CAAC;AAAA,MAC3B,WAAW,OAAO,oBAAoB,UAAU;AAC9C,gCAAwB,KAAK,MAAM,eAAe;AAAA,MACpD,WAAW,OAAO,oBAAoB,UAAU;AAC9C,gCAAwB;AAAA,MAC1B;AAAA,IACF,SAAS,GAAG;AACV,cAAQ,MAAM,yBAAyB,CAAC;AAAA,IAC1C;AAEA,UAAM,SAAS,cAAc;AAAA,MAC3B,GAAG;AAAA,MACH,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,iBAAiB,WAAW;AAAA,IAC9B,CAAC;AACD,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,aAAO,KAAK,UAAU,KAAK;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AACJ;AAEO,IAAM,4BAA6B,CAAC,QAAgB;AAEpD,IAAM,wBAAwB,CAAC,cAAiC,aAAAA,SAAM,KAAK;AAE3E,IAAM,sBAAsB,CACjC,aACsC;AACtC,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,aAAa,KAAK,CAAC,gBAAgB,aAAa,WAAW;AACpE;;;AD9JA,cAAAC,QAAM,OAAO,gBAAAC,OAAQ;AACrB,cAAAD,QAAM,OAAO,uBAAAE,OAAe;AAQrB,IAAM,qBAAqB,eAAAC,QAAM,cAAuC;AAAA,EAC7E,GAAG;AAAA,EACH,iBAAiB;AAAA,EACjB,cAAc;AAChB,CAAC;AAEM,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AACF,MACE,+BAAAA,QAAA,cAAC,mBAAmB,UAAnB,EAA4B,SAAe,QAAS;AAGhD,IAAM,wBAAwB,CAAC,kBAA2B;AAC/D,QAAM,mBAAe,2BAAW,kBAAkB;AAElD,MAAI,CAAC,cAAc;AACjB,YAAQ;AAAA,MACN,gMAAgM,aAAa;AAAA,IAC/M;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;AAEO,IAAM,yBAAyB,CACpCC,eACG;AACH,QAAM,kCAAkC,CACtC,UACG;AACH,UAAM,qBAAqB,sBAAsB;AAEjD,WAAO,+BAAAD,QAAA,cAACC,YAAA,EAAW,GAAI,OAAc,GAAG,oBAAoB;AAAA,EAC9D;AAEA,kCAAgC,cAAc,yBAAyB;AAAA,IACrEA;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AEjEA,IAAAC,iBAAkC;AAU3B,IAAM,gBAAgB,eAAAC,QAAM;AAAA,EACjC;AACF;AAEO,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AACF,MAGE,+BAAAA,QAAA,cAAC,cAAc,UAAd,EAAuB,SACrB,QACH;AAGK,IAAM,mBAAmB,CAAC,kBAA2B;AAC1D,QAAM,mBAAe,2BAAW,aAAa;AAE7C,MAAI,CAAC,cAAc;AACjB,YAAQ;AAAA,MACN,yLAAyL,aAAa;AAAA,IACxM;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;AAOO,IAAM,oBAAoB,CAC/BC,eACG;AACH,QAAM,6BAA6B,CAAC,UAA6C;AAC/E,UAAM,gBAAgB,iBAAiB;AAEvC,WAAO,+BAAAD,QAAA,cAACC,YAAA,EAAW,GAAI,OAAc,GAAG,eAAe;AAAA,EACzD;AAEA,6BAA2B,eACzBA,WAAU,eACVA,WAAU,QACV,aACA,QAAQ,QAAQ,EAAE;AAEpB,SAAO;AACT;;;AC5DA,IAAAC,iBAAkC;AAM3B,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AACF,GAAqE;AACnE,QAAM,sBAAkB,2BAAW,gBAAgB;AACnD,QAAM,kBAAyC,EAAE,GAAG,iBAAiB,GAAG,UAAU;AAClF,SACE,+BAAAC,QAAA,cAAC,iBAAiB,UAAjB,EAA0B,OAAO,mBAC/B,QACH;AAEJ;;;AtBNO,IAAM,mBAAmB,CAAC;AAAA,EAC/B,SAAS;AACX,MAA6B;AAC3B,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,SAAS,mBAAmB,IAAI,uBAAuB,kBAAkB;AACjF,QAAM,UAAU,oBAAoB;AACpC,QAAM,EAAE,QAAQ,IAAI,WAAW,OAAO;AACtC,QAAM,gBAAgB;AAAA,IACpB,CAAC,SAAS,QAAQ,GAAG,EAAE,aAAa;AAAA,IACpC,CAAC,SAAS,UAAU,GAAG,EAAE,eAAe;AAAA,EAC1C;AAEA,SAAO,WAAW,gBAChB,+BAAAC,QAAA,cAAC,SAAI,WAAU,4CACb,+BAAAA,QAAA,cAAC,OAAE,WAAU,uCAAqC,cAAc,OAAO,CAAE,CAC3E,IACE;AACN;;;AuB5BA,IAAAC,kBAA+B;AAC/B,IAAAC,uBAQO;;;ACRP,IAAAC,kBAAyD;AACzD,IAAAC,uBAAwB;AACxB,IAAAC,gBAAiB;AACjB,cAAyB;AAEzB,IAAAC,uBAAyC;;;ACNzC,IAAAC,iBAA+B;AAkB/B,IAAM,8BAA8B,CAAC,UAAkC;AACrE,QAAM,EAAE,eAAe,SAAS,IAAI,MAAAC,MAAK,IAAI;AAC7C,QAAM,EAAE,EAAE,IAAI,sBAAsB,6BAA6B;AAEjE,QAAM,oBAAoB,CACxB,OACAC,OACA,UACG,gBAAgBA,OAAM,OAAO,KAAK;AAEvC,QAAM,sBAAkB;AAAA,IACtB,OAAO;AAAA,MACL,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,MAAM;AAAA,MACd,SAAS,EAAE,SAAS;AAAA,IACtB;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,SACE,+BAAAC,QAAA,cAAC,SAAI,WAAU,0CACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,+CACb,+BAAAA,QAAA,cAAC,cAAMF,KAAK,GACX,QAAQ,IAAI,CAAC,WACZ,+BAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,4FAA4F,OAAO,KAAK;AAAA,MACnH,eAAa,GAAG,OAAO,IAAI;AAAA,MAC3B,cAAY,OAAO;AAAA,MACnB,KAAK,GAAG,EAAE,IAAI,OAAO,KAAK;AAAA,MAC1B,SAAS,CAAC,UAAU,kBAAkB,OAAO,OAAO,MAAM,OAAO,KAAK;AAAA;AAAA,IAErE,OAAO,OAAQ,gBAAgB,OAAO,IAAI,KAAK,EAAE,OAAO,IAAI,IAAK;AAAA,EACpE,CACD,CACH,CACF;AAEJ;AAKO,IAAM,oBAAoB,eAAAA,QAAM;AAAA,EACrC;AACF;;;AC9DA,IAAAC,iBAAkB;;;ACAlB,IAAAC,iBAAkB;;;ACAlB,IAAAC,iBAAkB;AAGX,IAAM,eAAe,CAAC,EAAE,UAAU,MACvC,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AACF;AAGK,IAAM,mBAAmB,MAC9B,+BAAAA,QAAA,cAAC,SAAI,MAAK,QAAO,SAAQ,aAAY,OAAM,gCACzC,+BAAAA,QAAA,cAAC,UAAK,GAAE,2BAA0B,MAAK,WAAU,CACnD;AAGK,IAAM,YAAY,MACvB,+BAAAA,QAAA,cAAC,SAAI,MAAK,QAAO,SAAQ,aAAY,OAAM,gCACzC,+BAAAA,QAAA,cAAC,UAAK,GAAE,kCAAiC,MAAK,WAAU,CAC1D;AAGK,IAAM,kBAAkB,MAC7B,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,WAAU;AAAA,IACV,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,aAAY;AAAA;AAAA,EACd;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,ijBAAgjB;AAC1jB;AAGK,IAAM,mBAAmB,MAC9B,+BAAAA,QAAA,cAAC,SAAI,MAAK,gBAAe,SAAQ,aAAY,OAAM,gCACjD,+BAAAA,QAAA,cAAC,UAAK,GAAE,kRAAiR,CAC3R;;;ACjDF,IAAAC,iBAAkB;AAClB,0BAA4B;AAmB5B,IAAM,uBAAuB,CAAC,UAA8C;AAC1E,QAAM,EAAE,UAAU,WAAW,UAAU,MAAM,KAAK,OAAO,IAAI;AAC7D,QAAM,EAAE,EAAE,IAAI,sBAAsB,YAAY;AAChD,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,gBAAY,iCAAY,IAAI;AAClC,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,iBAAiB;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAEO,IAAM,aAAa,eAAAA,QAAM,KAAK,oBAAoB;;;AF/BlD,IAAM,iBAAiB,CAAC,EAAE,SAAS,MACxC,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,WAAU;AAAA,IACV,UAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAO;AAAA;AAAA,EAEP,+BAAAA,QAAA,cAAC,gBAAa,WAAU,8CAA6C;AACvE;;;AGjBF,IAAAC,iBAAkB;;;ACAX,SAAS,iBAAiB,OAAe,YAAY,GAAG;AAC7D,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,QAAM,WAAW,KAAK;AAAA,IACpB,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;AAAA,IAC3C,MAAM,SAAS;AAAA,EACjB;AACA,QAAM,WAAW,QAAQ,QAAQ;AACjC,QAAM,oBACJ,cAAc,IAAI,KAAK,MAAM,QAAQ,EAAE,SAAS,IAAI,SAAS,YAAY,SAAS;AACpF,SAAO,GAAG,iBAAiB,IAAI,MAAM,QAAQ,CAAC;AAChD;;;ADGO,IAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AACF,MAA8B;AAC5B,QAAM,iBAAiB,OAAO,aAAa,WAAW,WAAW,QAAQ,IAAI;AAE7E,MAAI,OAAO,mBAAmB,eAAe,CAAC,OAAO,SAAS,OAAO,cAAc,CAAC,GAAG;AACrF,WAAO;AAAA,EACT;AAEA,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEX,iBAAiB,gBAAgB,qBAAqB;AAAA,EACzD;AAEJ;;;AE/BA,kBAAiB;AACjB,IAAAC,iBAAkB;AAOX,IAAM,cAAc,CAAC,EAAE,WAAW,SAAS,SAAS,MACzD,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,YAAAC;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAe;AAAA,IACf,eAAY;AAAA,IACZ;AAAA,IACA,MAAK;AAAA,IACL,OACE;AAAA,MACE,wDAAwD,WAAW;AAAA,IACrE;AAAA;AAAA,EAGF,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,MAAM,GAAG,QAAQ,KAAK;AAAA;AAAA,EACjC;AACF;;;AC5BF,IAAAE,iBAAkB;AAIX,IAAM,qBAAqB,CAAC,EAAE,UAAU,QAAQ,MACrD,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,WAAU;AAAA,IACV,eAAY;AAAA,IACZ;AAAA,IACA,MAAK;AAAA;AAAA,EAEJ;AACH;;;ACZF,IAAAC,iBAAkB;AAQX,IAAM,aAAa,CAAC,EAAE,WAAW,QAAQ,MAC9C,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,WAAU;AAAA,IACV,eAAa,YAAY,gBAAgB;AAAA,IACzC;AAAA,IACA,MAAK;AAAA;AAAA,EAEJ,YAAY,+BAAAA,QAAA,cAAC,eAAU,IAAK,+BAAAA,QAAA,cAAC,sBAAiB;AACjD;;;AChBF,oBAAqB;AAErB,IAAAC,iBAOO;AACP,IAAAC,eAAiB;;;ACNV,IAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAyBO,IAAM,0BAA0B,CACrC,eAEA,MAAM,QAAS,WAAiC,MAAM;AAEjD,IAAM,kBAAkB,CAAC,eAA2B;AACzD,QAAM,WAAW,WAAW,YAAY;AACxC,SAAO,SAAS,YAAY,EAAE,SAAS,MAAM;AAC/C;AAEO,IAAM,SAAS,CAAC,KAAa,YAAoB;AAAA,EACtD,KAAK,MAAM,MAAM,OAAO;AAAA,EACxB,MAAM;AACR;AAEO,IAAM,kBAAkB,CAAC,iBAA0B;AACxD,MAAI,CAAC,gBAAgB,eAAe,EAAG,QAAO;AAE9C,QAAM,CAAC,OAAO,aAAa,IAAI,OAAO,cAAc,IAAI;AACxD,QAAM,CAAC,SAAS,OAAO,IAAI,OAAO,eAAe,EAAE;AACnD,QAAM,iBAAiB,KAAK,KAAK,OAAO;AAExC,QAAM,iBAAiB,MAAM,SAAS,EAAE,WAAW,IAAI,MAAM;AAC7D,QAAM,iBAAiB,QAAQ,SAAS,EAAE,WAAW,IAAI,MAAM;AAC/D,QAAM,iBAAiB,eAAe,SAAS,EAAE,WAAW,IAAI,MAAM;AACtE,QAAM,SAAS,GAAG,cAAc,GAAG,OAAO,IAAI,cAAc,GAAG,cAAc;AAE7E,SAAO,QAAQ,GAAG,cAAc,GAAG,KAAK,MAAM,SAAS;AACzD;;;AC5DO,IAAM,uBAAuB,CAAC,cAAwB,oBAC3D,aAAa,WAAW,kBACpB,eACA,aAAa,SAAS,kBACpB,WAAW,cAAc,eAAe,IACxC,SAAS,cAAc,eAAe;AAQvC,SAAS,WAAW,MAAgB,kBAAoC;AAC7E,MAAI,KAAK,UAAU,oBAAoB,qBAAqB,GAAG;AAC7D,WAAO;AAAA,EACT;AAEA,MAAI,qBAAqB,EAAG,QAAO,CAAC,KAAK,IAAI,CAAC;AAE9C,QAAM,SAAmB,CAAC;AAE1B,QAAM,cAAc,KAAK,SAAS,MAAM,mBAAmB;AAC3D,MAAI,yBAAyB;AAC7B,SAAO,KAAK,KAAK,sBAAsB,CAAC;AACxC,MAAI,cAAc,SAAS;AAE3B,WAAS,cAAc,GAAG,cAAc,mBAAmB,GAAG,eAAe;AAC3E,UAAM,yBAAyB,KAAK,sBAAsB;AAC1D,UAAM,iBAAiB,kBAAkB,MAAM,aAAa,UAAU;AAEtE,UAAM,0BAA0B,KAAK,OAAO,cAAc,KAAK,UAAU,IAAI;AAC7E,UAAM,uBAAuB,KAAK,MAAM,cAAc,UAAU,IAAI;AACpE,UAAM,wBAAwB,IAAI,uBAAuB;AAEzD,cAAU,eAAe;AAEzB,aACM,oBAAoB,yBACxB,oBAAoB,sBACpB,qBACA;AACA,YAAM,wBACJ,KAAK,IAAI,oBAAoB,uBAAuB,IAAI;AAC1D,YAAM,wBAAwB,wBAAwB;AACtD,YAAM,oBAAoB,KAAK,iBAAiB;AAEhD,qBAAe;AAAA,QACb;AAAA,UACE,KAAK,IAAI,yBAAyB,iBAAiB;AAAA,UACnD;AAAA,QACF;AAAA,QACA,aAAa,KAAK,IAAI,oBAAoB,cAAc,GAAG,qBAAqB;AAAA,QAChF;AAAA,UACE,KAAK,IAAI,yBAAyB,cAAc;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAEA,UAAI,eAAe,SAAS;AAC1B,kBAAU;AACV,uBAAe,KAAK,iBAAiB;AACrC,iCAAyB;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI,OAAO,iBAAiB,YAAa,QAAO,KAAK,YAAY;AAAA,EACnE;AAEA,SAAO,KAAK,KAAK,KAAK,SAAS,CAAC,CAAC;AAEjC,SAAO;AACT;AAEA,IAAM,oBAAoB,CAAC,GAAW,GAAW,MAAc;AAC7D,QAAM,KAAK,IAAI,IAAI,KAAK;AACxB,SAAO,KAAK,KAAK,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,EAAE;AAClD;AACA,IAAM,eAAe,CAAC,GAAW,MAAc,KAAK,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC;AACxF,IAAM,OAAO,CAAC,WACZ,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,OAAO;AACzD,IAAM,oBAAoB,CACxB,MACA,oBACA,eACG;AACH,QAAM,uBAAuB,KAAK,MAAM,qBAAqB,UAAU,IAAI;AAC3E,MAAI,2BAA2B,KAAK,OAAO,qBAAqB,KAAK,UAAU,IAAI;AACnF,6BACE,2BAA2B,KAAK,SAAS,2BAA2B,KAAK;AAE3E,SAAO,KAAK,KAAK,MAAM,sBAAsB,wBAAwB,CAAC;AACxE;AACO,IAAM,WAAW,CAAC,QAAkB,eAAuB;AAChE,MAAI,CAAC,OAAO,QAAQ;AAClB,YAAQ,KAAK,0CAA0C;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,YAAY;AAC9B,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,OAAO,OAAQ,QAAO;AAGzC,MAAI,CAAC,YAAY,SAAS,IAAI,OAAO,YAAY,OAAO,MAAM;AAC9D,QAAM,SAAmB,CAAC;AAE1B,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,QAAQ,aAAa,cAAc,IAAI;AAC7C,WAAO,KAAK,GAAG,MAAM,aAAa,KAAK,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;;;AF5FO,IAAM,kBAAkB,CAAC;AAAA,EAC9B,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,4BAA4B;AAAA,EAC5B,uBAAuB;AAAA,EACvB;AAAA,EACA;AACF,MAA4B;AAC1B,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAgC,IAAI;AACtF,QAAM,iBAAa,uBAAO,KAAK;AAC/B,QAAM,CAACC,OAAM,OAAO,QAAI,yBAAgC,IAAI;AAC5D,QAAM,CAAC,YAAY,aAAa,QAAI,yBAIjC;AACH,QAAM,oBAAgB,uBAAe,MAAS;AAE9C,QAAM,kBAAuD,CAAC,MAAM;AAClE,MAAE,eAAe;AACjB,QAAI,CAAC,kBAAmB;AACxB,eAAW,UAAU;AACrB,sBAAkB,MAAM,SAAS;AAAA,EACnC;AAEA,QAAM,aAAkD,CAAC,MAAM;AAC7D,QAAI,CAAC,WAAW,QAAS;AAGzB,SAAK,EAAE,GAAG,EAAE,CAAC;AAAA,EACf;AAEA,QAAM,qBAAiB,4BAAY,MAAM;AACvC,QAAI,CAAC,kBAAmB;AACxB,eAAW,UAAU;AACrB,sBAAkB,MAAM,eAAe,QAAQ;AAAA,EACjD,GAAG,CAAC,iBAAiB,CAAC;AAEtB,QAAM,oBAAgB;AAAA,IACpB,UACE,cAAAC,SAAS,CAAC,cAAsB;AAC9B,UAAI,cAAc,cAAc,QAAS;AACzC,oBAAc,UAAU;AACxB,YAAM,mBAAmB,KAAK;AAAA,QAC5B,aAAa,uBAAuB;AAAA,MACtC;AACA,YAAM,4BAA4B,mBAAmB;AACrD,YAAM,WAAW,4BAA4B,mBAAmB;AAChE,YAAM,8BACJ,6BAA6B,4BAA4B;AAC3D,YAAM,WAAW,YAAa,YAAY,WAAY;AAEtD,oBAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA,KAAK,YAAY,uBAAuB;AAAA,MAC1C,CAAC;AAAA,IACH,GAAG,CAAC;AAAA,IACN,CAAC,2BAA2B,sBAAsB,eAAe;AAAA,EACnE;AAEA,QAAM,4BAAwB;AAAA,IAC5B,MAAO,aAAa,qBAAqB,cAAc,WAAW,QAAQ,IAAI,CAAC;AAAA,IAC/E,CAAC,YAAY,YAAY;AAAA,EAC3B;AAEA,gCAAU,MAAM;AACd,aAAS,iBAAiB,aAAa,cAAc;AACrD,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,cAAc;AAAA,IAC1D;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,gCAAU,MAAM;AACd,QAAI,CAACD,SAAQ,OAAO,mBAAmB,YAAa;AACpD,UAAM,WAAW,IAAI,eAAe,CAAC,CAAC,KAAK,MAAM;AAC/C,oBAAc,MAAM,YAAY,KAAK;AAAA,IACvC,CAAC;AACD,aAAS,QAAQA,KAAI;AAErB,WAAO,MAAM;AACX,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,eAAeA,KAAI,CAAC;AAExB,sCAAgB,MAAM;AACpB,QAAI,CAACA,MAAM;AACX,UAAM,EAAE,OAAO,UAAU,IAAIA,MAAK,sBAAsB;AACxD,kBAAc,SAAS;AAAA,EACzB,GAAG,CAAC,eAAeA,KAAI,CAAC;AAExB,MAAI,CAAC,aAAa,UAAU,YAAY,aAAa,EAAG,QAAO;AAE/D,SACE,+BAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAS;AAAA,MACT,eAAe;AAAA,MACf,eAAe;AAAA,MACf,aAAa;AAAA,MACb,KAAK;AAAA,MACL,MAAK;AAAA,MACL,OACE;AAAA,QACE,uDAAuD,YAAY,MAAM;AAAA,MAC3E;AAAA;AAAA,IAGD,sBAAsB,IAAI,CAAC,WAAW,MACrC,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,aAAAC,SAAK,8CAA8C;AAAA,UAC5D,CAAC,oDAAoD,GACnD,WAAY,IAAI,sBAAsB,SAAU;AAAA,QACpD,CAAC;AAAA,QACD,eAAY;AAAA,QACZ,KAAK,aAAa,CAAC;AAAA,QACnB,OACE;AAAA,UACE,mDACE,YAAY,WAAW;AAAA,UACzB,uDAAuD,YACnD,YAAY,MAAM,MAClB;AAAA,QACN;AAAA;AAAA,IAEJ,CACD;AAAA,IACD,+BAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,KAAK;AAAA,QACL,OAAO,EAAE,MAAM,GAAG,WAAW,IAAI,IAAI,WAAW,MAAM,MAAM,QAAQ,IAAI;AAAA;AAAA,IAC1E;AAAA,EACF;AAEJ;;;AGnKA,IAAAE,sBAA2B;AAC3B,IAAAC,iBAAqB;AAyDrB,IAAM,yBAAyB,CAAC,GAAK,KAAK,CAAG;AAE7C,IAAM,aAAa,CAAC,iBAClB,EAAE,aAAa,aAAa,YAAY,MAAM,aAAa,QAAQ;AAE9D,IAAM,kCAAkC,CAAC;AAAA,EAC9C;AACF,IAAoC,CAAC,MAAM;AACzC,MAAI,CAAC,MAAO;AACZ,UAAQ,MAAM,kBAAkB,KAAK;AACvC;AAEO,IAAM,mBAAmB,CAAC,iBAC/B,gBAAgB,EAAE,aAAa,UAAU,aAAa;AAOjD,IAAM,cAAN,MAAkB;AAAA,EAcvB,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAuB;AArBvB,SAAQ,WAAW,oBAAI,IAA+B;AACtD,SAAQ,cAAyD;AACjE,SAAQ,4BAAiD;AAEzD,SAAQ,YAAY;AAGpB,SAAQ,qBAAqB;AAC7B,SAAQ,kBAA6D;AA4HrE,SAAQ,gCAAgC,MAAM;AAC5C,mBAAa,KAAK,WAAW;AAC7B,WAAK,cAAc,WAAW,MAAM;AAClC,YAAI,CAAC,KAAK,WAAY;AACtB,YAAI;AACF,eAAK,WAAW,MAAM;AACtB,eAAK,MAAM,YAAY,EAAE,WAAW,MAAM,CAAC;AAAA,QAC7C,SAAS,GAAG;AACV,eAAK,cAAc,EAAE,SAAS,kBAAkB,CAAC;AAAA,QACnD;AAAA,MACF,GAAG,GAAI;AAAA,IACT;AAEA,SAAQ,kCAAkC,MAAM;AAC9C,UAAI,CAAC,KAAK,WAAY;AACtB,mBAAa,KAAK,WAAW;AAC7B,WAAK,cAAc;AAAA,IACrB;AAEA,SAAQ,yBAAyB,MAAM;AACrC,YAAM,UAAU,KAAK;AACrB,UAAI,SAAS,WAAW,QAAQ,UAAU;AACxC,gBAAQ,QAAQ,oBAAoB,kBAAkB,QAAQ,QAAQ;AAAA,MACxE;AACA,WAAK,qBAAqB;AAAA,IAC5B;AAEA,SAAQ,uBAAuB,CAAC,eAAiC;AAC/D,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,SAAS,SAAS,EAAG;AAC1B,YAAM,QAAQ,MAAM;AAClB,cAAMC,YAAW,WAAW;AAC5B,cAAM,UACJ,OAAOA,cAAa,YAAY,CAAC,MAAMA,SAAQ,KAAK,SAASA,SAAQ,IACjE,KAAK,IAAI,OAAOA,SAAQ,IACxB;AACN,YAAI;AACF,cAAI,WAAW,gBAAgB,QAAS;AACxC,qBAAW,cAAc;AAEzB,eAAK,kBAAkB,OAAO;AAAA,QAChC,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,UAAI,WAAW,aAAa,GAAG;AAC7B,aAAK,uBAAuB;AAC5B,aAAK,qBAAqB;AAC1B,cAAM,WAAW,MAAM;AAErB,cAAI,KAAK,oBAAoB,aAAa,SAAU;AACpD,eAAK,qBAAqB;AAC1B,cAAI,KAAK,eAAe,YAAY;AAClC,iBAAK,qBAAqB;AAC1B;AAAA,UACF;AACA,gBAAM;AACN,eAAK,qBAAqB;AAAA,QAC5B;AACA,mBAAW,iBAAiB,kBAAkB,UAAU,EAAE,MAAM,KAAK,CAAC;AACtE,aAAK,qBAAqB,EAAE,SAAS,YAAY,SAAS;AAAA,MAC5D,OAAO;AACL,aAAK,qBAAqB;AAC1B,cAAM;AACN,aAAK,qBAAqB;AAAA,MAC5B;AAAA,IACF;AA+BA,SAAQ,iBAAiB,MAAwB;AAC/C,UAAI,KAAK,uBAAwB,QAAO,KAAK;AAE7C,WAAK,yBAAyB,IAAI,QAAQ,CAAC,YAAY;AACrD,YAAI,CAAC,KAAK,WAAY,QAAO,QAAQ,KAAK;AAC1C,cAAMC,WAAU,KAAK;AACrB,cAAM,eAAe,MAAM;AACzB,UAAAA,SAAQ,oBAAoB,kBAAkB,YAAY;AAC1D,kBAAQA,SAAQ,aAAa,CAAC;AAAA,QAChC;AACA,QAAAA,SAAQ,iBAAiB,kBAAkB,YAAY;AAAA,MACzD,CAAC;AAED,aAAO,KAAK;AAAA,IACd;AAEA,SAAQ,SAAS,CAAC,eAAwC;AACxD,UAAI,iBAAiB,KAAK,UAAU,GAAG;AAErC,aAAK,eAAe,EAAE,YAAY,MAAM,CAAC;AAAA,MAC3C;AACA,WAAK,uBAAuB;AAC5B,WAAK,qBAAqB;AAC1B,WAAK,yBAAyB;AAC9B,WAAK,MAAM,YAAY,EAAE,WAAW,CAAC;AAErC,UAAI,YAAY;AACd,aAAK,sBAAsB;AAAA,MAC7B;AAAA,IACF;AAEA,6BAAoB,CAAC,mBAA2B;AAC9C,WAAK,MAAM,YAAY;AAAA,QACrB,iBACE,KAAK,cAAc,iBACd,iBAAiB,KAAK,WAAW,WAAY,MAC9C;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH;AAWA,2BAAkB,CAAC,aAAqB;AACtC,UAAI,CAAC,SAAU,QAAO;AACtB,UAAI,KAAK,WAAY,QAAO,CAAC,CAAC,KAAK,WAAW,YAAY,QAAQ;AAClE,aAAO,CAAC,CAAC,IAAI,MAAM,EAAE,YAAY,QAAQ;AAAA,IAC3C;AAEA,gBAAO,OAAO,WAAwC;AACpD,UAAI,KAAK,UAAW;AACpB,YAAM,aAAa,KAAK,iBAAiB;AACzC,UAAI,iBAAiB,KAAK,UAAU,GAAG;AACrC,YAAI,KAAK,UAAW;AACpB,aAAK,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC1C;AAAA,MACF;AAEA,YAAM,EAAE,qBAAqB,cAAc,IAAI;AAAA,QAC7C,qBAAqB,KAAK;AAAA,QAC1B,eAAe,KAAK;AAAA,QACpB,GAAG;AAAA,MACL;AAEA,UAAI,CAAC,KAAK,eAAe;AACvB,aAAK,cAAc,EAAE,SAAS,eAAe,CAAC;AAC9C;AAAA,MACF;AAGA,WAAK,qBAAqB,UAAU;AAEpC,iBAAW,eAAe,uBAAuB,KAAK;AAEtD,WAAK,8BAA8B;AAEnC,UAAI;AACF,cAAM,WAAW,KAAK;AACtB,aAAK,MAAM,YAAY;AAAA,UACrB;AAAA,UACA,WAAW;AAAA,UACX;AAAA,QACF,CAAC;AACD,aAAK,MAAM,qBAAqB,IAAI;AAAA,MACtC,SAAS,GAAG;AACV,aAAK,cAAc,EAAE,OAAO,EAAW,CAAC;AACxC,aAAK,MAAM,YAAY,EAAE,WAAW,MAAM,CAAC;AAAA,MAC7C,UAAE;AACA,aAAK,gCAAgC;AAAA,MACvC;AAAA,IACF;AAEA,iBAAQ,MAAM;AACZ,UAAI,CAAC,iBAAiB,KAAK,UAAU,EAAG;AACxC,WAAK,gCAAgC;AAIrC,WAAK,WAAY,MAAM;AACvB,WAAK,MAAM,YAAY,EAAE,WAAW,MAAM,CAAC;AAAA,IAC7C;AAEA,gBAAO,MAAM;AACX,WAAK,MAAM;AACX,WAAK,kBAAkB,CAAC;AACxB,UAAI,KAAK,WAAY,MAAK,WAAW,cAAc;AAAA,IACrD;AAEA,sBAAa,YAAa,KAAK,YAAY,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK;AAE1E,gCAAuB,MAAM;AAC3B,UAAI,CAAC,KAAK,WAAY;AACtB,UAAI,2BAA2B,KAAK,MACjC,eAAe,EACf,cAAc,UAAU,CAAC,SAAS,SAAS,KAAK,mBAAmB;AACtE,UAAI,6BAA6B,IAAI;AACnC,mCAA2B;AAAA,MAC7B;AACA,YAAM,YACJ,6BAA6B,KAAK,cAAc,SAAS,IACrD,IACA,2BAA2B;AACjC,YAAM,sBAAsB,KAAK,cAAc,SAAS;AACxD,WAAK,MAAM,YAAY,EAAE,oBAAoB,CAAC;AAC9C,WAAK,WAAW,eAAe;AAAA,IACjC;AAEA,oBAAO,eAAAC,SAAiB,OAAO,EAAE,SAAS,cAAc,MAAM;AAC5D,UAAID,WAAU,KAAK;AACnB,UAAI,CAAC,KAAK,YAAY;AACpB,QAAAA,WAAU,KAAK,iBAAiB;AAChC,cAAM,UAAU,MAAM,KAAK,eAAe;AAC1C,YAAI,CAAC,QAAS;AAAA,MAChB;AACA,UAAI,CAAC,iBAAiB,CAACA,SAAS;AAChC,UAAI,CAAC,WAAWA,QAAO,GAAG;AACxB,aAAK,cAAc,EAAE,SAAS,qBAAqB,CAAC;AACpD;AAAA,MACF;AAEA,YAAM,EAAE,OAAO,EAAE,IAAI,cAAc,sBAAsB;AAEzD,YAAM,SAAS,UAAU,KAAK;AAC9B,UAAI,QAAQ,KAAK,QAAQ,EAAG;AAC5B,YAAM,cAAc,QAAQA,SAAQ;AACpC,WAAK,kBAAkB,WAAW;AAClC,MAAAA,SAAQ,cAAc;AAAA,IACxB,GAAG,EAAE;AAEL,yBAAgB,CAAC,WAA2C;AAC1D,sCAAgC,MAAM;AACtC,WAAK,QAAQ,QAAQ,CAAC,EAAE,SAAAE,SAAQ,MAAMA,WAAU,EAAE,QAAQ,MAAM,GAAG,OAAO,CAAC,CAAC;AAAA,IAC9E;AAMA;AAAA;AAAA;AAAA;AAAA,0BAAiB,MAAM;AACrB,WAAK,YAAY;AACjB,WAAK,uBAAuB;AAC5B,WAAK,uBAAuB;AAC5B,WAAK,qBAAqB;AAC1B,WAAK,eAAe,EAAE,YAAY,KAAK,CAAC;AACxC,WAAK,4BAA4B;AACjC,WAAK,4BAA4B;AACjC,WAAK,QAAQ,QAAQ,CAAC,EAAE,SAAS,MAAM,WAAW,EAAE,QAAQ,KAAK,CAAC,CAAC;AACnE,WAAK,MAAM,WAAW,KAAK,EAAE;AAAA,IAC/B;AAEA,kCAAyB,MAAM;AAC7B,mBAAa,KAAK,eAAe;AACjC,WAAK,kBAAkB;AAAA,IACzB;AAEA,2BAAkB,CAAC,KAAa,MAAM;AACpC,WAAK,uBAAuB;AAC5B,WAAK,kBAAkB,WAAW,MAAM;AACtC,YAAI,KAAK,SAAU;AACnB,aAAK,eAAe;AAAA,MACtB,GAAG,EAAE;AAAA,IACP;AAMA;AAAA;AAAA;AAAA;AAAA,oCAA2B,MAAM;AAC/B,UAAI,CAAC,KAAK,WAAY;AACtB,WAAK,eAAe,EAAE,YAAY,MAAM,CAAC;AACzC,WAAK,4BAA4B;AACjC,WAAK,4BAA4B;AAAA,IACnC;AAEA,iCAAwB,MAAM;AAC5B,WAAK,4BAA4B;AAEjC,YAAM,eAAe,KAAK;AAC1B,UAAI,CAAC,aAAc;AAEnB,YAAM,cAAc,MAAM;AACxB,aAAK,MAAM,YAAY;AAAA,UACrB,WAAW;AAAA,UACX,gBAAgB,cAAc,YAAY,KAAK,mBAAmB;AAAA,QACpE,CAAC;AAAA,MACH;AAEA,YAAM,cAAc,CAAC,MAAyC;AAO5D,cAAM,QAAQ,EAAE;AAChB,cAAM,QAAmC,EAAE,WAAW,MAAM;AAE5D,YAAI,CAAC,OAAO,OAAO,MAAM;AACvB,eAAK,MAAM,YAAY,KAAK;AAC5B;AAAA,QACF;AAEA,YAAI,MAAM,MAAM,SAAS,GAAG;AAC1B,gBAAM,gBAAgB;AACtB,eAAK,MAAM,YAAY,KAAK;AAAA,QAC9B;AAEA,cAAM,WAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,OAAO,OAAO,IAAI;AACpB,YAAI,CAAC,SAAU;AAEf,wCAAgC,EAAE,OAAO,IAAI,MAAM,WAAW,KAAK,MAAM,GAAG,GAAG,EAAE,CAAC;AAAA,MACpF;AAEA,YAAM,mBAAmB,MAAM;AAC7B,cAAM,IAAI,cAAc,eAAe;AAEvC,YAAI,KAAK,sBAAsB,MAAM,EAAG;AAExC,YAAI,CAAC,KAAK,aAAa,MAAM,KAAK,KAAK,iBAAiB,EAAG;AAC3D,aAAK,kBAAkB,CAAC;AAAA,MAC1B;AAEA,mBAAa,iBAAiB,SAAS,WAAW;AAClD,mBAAa,iBAAiB,SAAS,WAAW;AAClD,mBAAa,iBAAiB,cAAc,gBAAgB;AAE5D,WAAK,4BAA4B,MAAM;AACrC,qBAAa,MAAM;AACnB,qBAAa,oBAAoB,SAAS,WAAW;AACrD,qBAAa,oBAAoB,SAAS,WAAW;AACrD,qBAAa,oBAAoB,cAAc,gBAAgB;AAAA,MACjE;AAAA,IACF;AAzdE,SAAK,QAAQ;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,QAAQ;AACb,SAAK,WAAW,MAAM,WAAW,CAAC,CAAC;AAEnC,UAAM,gBAAgB,qBAAqB,SACvC,sBACA;AAGJ,UAAM,gBAAgB,WAAW,CAAC,CAAC,IAAI,MAAM,EAAE,YAAY,QAAQ,IAAI;AAEvE,SAAK,QAAQ,IAAI,+BAA6B;AAAA,MAC5C;AAAA,MACA,qBAAqB,cAAc,CAAC;AAAA,MACpC,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,eAAe;AAAA,MACf;AAAA,MACA,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,IAClB,CAAC;AAED,SAAK,QAAQ,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,EAC1D;AAAA,EAEA,IAAY,UAA+B;AACzC,WAAO,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC;AAAA,EAC1C;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAK,MAAM,eAAe,EAAE;AAAA,EACrC;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,MAAM,eAAe,EAAE;AAAA,EACrC;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK,MAAM,eAAe,EAAE;AAAA,EACrC;AAAA,EAEA,IAAI,sBAAsB;AACxB,WAAO,KAAK,MAAM,eAAe,EAAE;AAAA,EACrC;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAK,MAAM,eAAe,EAAE;AAAA,EACrC;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,KAAK;AACP,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,MAAM;AACR,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,iBAAiB;AACnB,WAAO,KAAK,MAAM,eAAe,EAAE;AAAA,EACrC;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,KAAK,MAAM,eAAe,EAAE;AAAA,EACrC;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,mBAAqC;AAC3C,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AACA,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,KAAK,KAAK,MAAM,eAAe;AAAA,QACnC,SAAS,KAAK;AAAA,QACd,KAAK,KAAK;AAAA,MACZ,CAAC;AACD,WAAK,OAAO,EAAE;AAAA,IAChB;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAsEA,cAAc,YAAmC;AAC/C,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,GAAG,WAAW;AAC5C,QAAI,WAAW,QAAQ,KAAK,OAAO,KAAK,YAAY;AAClD,WAAK,WAAW,MAAM,WAAW;AAAA,IACnC;AAAA,EACF;AAAA,EAEQ,eAAe,EAAE,WAAW,GAA4B;AAC9D,SAAK,uBAAuB;AAC5B,SAAK,qBAAqB;AAC1B,QAAI,YAAY;AACd,WAAK,KAAK;AAAA,IACZ,OAAO;AAEL,WAAK,MAAM,YAAY,EAAE,WAAW,MAAM,CAAC;AAC3C,UAAI,KAAK,YAAY;AACnB,YAAI;AACF,eAAK,WAAW,MAAM;AAAA,QACxB,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,YAAY;AACnB,WAAK,MAAM,eAAe,KAAK,EAAE;AACjC,WAAK,OAAO,IAAI;AAAA,IAClB;AAAA,EACF;AAAA,EA2CA,WAAW,QAAsE;AAC/E,SAAK,WAAW,OAAO,KAAK,OAAO,EAAE,OAAO,CAAC,KAAK,WAAW;AAC3D,UAAI,OAAO,IAAI;AACb,YAAI,IAAI,OAAO,IAAI,MAAM;AAAA,MAC3B;AACA,aAAO;AAAA,IACT,GAAG,oBAAI,IAA+B,CAAC;AAAA,EACzC;AA0NF;;;AClkBA,IAAAC,iBAA4C;AAC5C,IAAAA,iBAA0B;;;ACA1B,IAAAC,sBAA2B;AAMpB,IAAM,kBAAN,MAAsB;AAAA,EAU3B,YAAY,QAAgD;AAT5D,iBAA0C,IAAI,+BAAiC;AAAA,MAC7E,mBAAmB;AAAA,IACrB,CAAC;AACD,SAAQ,OAAO,oBAAI,IAAyB;AAC5C,SAAQ,SAAS,oBAAI,IAA8B;AACnD,SAAQ,cAAuC;AAC/C,SAAQ,gBAA+B;AAevC,oBAAW,CAAC,WAA6C;AACvD,YAAM,EAAE,eAAe,SAAS,GAAG,WAAW,IAAI;AAClD,UAAI,SAAS,KAAK,KAAK,IAAI,OAAO,EAAE;AACpC,UAAI,QAAQ;AACV,YAAI,CAAC,OAAO,UAAU;AACpB,iBAAO,cAAc,UAAU;AAC/B,iBAAO;AAAA,QACT;AACA,aAAK,WAAW,OAAO,EAAE;AAAA,MAC3B;AACA,eAAS,IAAI,YAAY;AAAA,QACvB;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH,MAAM;AAAA,MACR,CAAC;AACD,WAAK,KAAK,IAAI,OAAO,IAAI,MAAM;AAC/B,aAAO;AAAA,IACT;AAUA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAiB,CAAC,EAAE,SAAS,IAAI,MAAwC;AACvE,UAAI,CAAC,KAAK,yBAAyB;AAEjC,YAAI,CAAC,KAAK,aAAa;AACrB,eAAK,cAAc,IAAI,MAAM;AAAA,QAC/B;AAEA,YAAI,KAAK,iBAAiB,KAAK,kBAAkB,SAAS;AACxD,gBAAMC,YAAW,KAAK,KAAK,IAAI,KAAK,aAAa;AAEjD,UAAAA,WAAU,MAAM;AAChB,UAAAA,WAAU,yBAAyB;AAAA,QACrC;AACA,aAAK,gBAAgB;AACrB,YAAI,KAAK,YAAY,QAAQ,KAAK;AAEhC,eAAK,YAAY,MAAM;AAAA,QACzB;AACA,eAAO,KAAK;AAAA,MACd;AAGA,UAAI,QAAQ,KAAK,OAAO,IAAI,OAAO;AACnC,UAAI,CAAC,OAAO;AACV,gBAAQ,IAAI,MAAM;AAClB,aAAK,OAAO,IAAI,SAAS,KAAK;AAAA,MAChC;AACA,UAAI,MAAM,QAAQ,KAAK;AAErB,cAAM,MAAM;AAAA,MACd;AACA,aAAO;AAAA,IACT;AAUA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAiB,CAAC,YAAoB;AACpC,UAAI,CAAC,KAAK,yBAAyB;AACjC,YAAI,KAAK,kBAAkB,QAAS;AACpC,cAAMC,MAAK,KAAK;AAChB,YAAIA,KAAI;AACN,cAAI;AACF,YAAAA,IAAG,MAAM;AAAA,UACX,QAAQ;AAAA,UAER;AACA,UAAAA,IAAG,gBAAgB,KAAK;AACxB,UAAAA,IAAG,KAAK;AAAA,QACV;AAEA,aAAK,gBAAgB;AACrB;AAAA,MACF;AAEA,YAAM,KAAK,KAAK,OAAO,IAAI,OAAO;AAClC,UAAI,CAAC,GAAI;AACT,UAAI;AACF,WAAG,MAAM;AAAA,MACX,QAAQ;AAAA,MAER;AACA,SAAG,gBAAgB,KAAK;AACxB,SAAG,KAAK;AACR,WAAK,OAAO,OAAO,OAAO;AAAA,IAC5B;AAGA;AAAA,gCAAuB,CAAC,sBAA0C;AAChE,UAAI,KAAK,wBAAyB;AAClC,WAAK,MAAM,YAAY,EAAE,kBAAkB,CAAC;AAAA,IAC9C;AAaA;AAAA,kBAAS,CAAC,OAAe;AACvB,YAAM,SAAS,KAAK,KAAK,IAAI,EAAE;AAC/B,UAAI,CAAC,OAAQ;AACb,aAAO,eAAe;AAAA,IACxB;AAGA;AAAA,iBAAQ,MAAM;AACZ,WAAK,QAAQ,QAAQ,CAAC,WAAW;AAC/B,aAAK,OAAO,OAAO,EAAE;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,iCAAwB,MAAM;AAG5B,WAAK,QAAQ,QAAQ,CAAC,MAAM;AAC1B,YAAI,EAAE,YAAY;AAChB,YAAE,sBAAsB;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AArJE,SAAK,0BAA0B,CAAC,CAAC,QAAQ;AAAA,EAC3C;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,MAAM,KAAK,KAAK,KAAK,OAAO,CAAC;AAAA,EACtC;AAAA,EAEA,IAAI,oBAAoB;AACtB,WAAO,KAAK,MAAM,eAAe,EAAE;AAAA,EACrC;AAAA;AAAA,EA6GA,WAAW,IAAY;AACrB,QAAI,KAAK,KAAK,IAAI,EAAE,GAAG;AACrB,WAAK,KAAK,OAAO,EAAE;AAAA,IACrB;AACA,QAAI,KAAK,mBAAmB,OAAO,IAAI;AACrC,WAAK,qBAAqB,IAAI;AAAA,IAChC;AAAA,EACF;AAyBF;;;ACnKO,IAAM,wCAAwC,CAAC;AAAA,EACpD;AAAA,EACA;AACF,MAGyB;AACvB,QAAM,SAA8C;AAAA,IAClD,mBAAmB,IAAI,MAAM,EAAE,8BAA8B,CAAC;AAAA,IAC9D,gBAAgB,IAAI;AAAA,MAClB,EAAE,4DAA4D;AAAA,IAChE;AAAA,IACA,sBAAsB,IAAI,MAAM,EAAE,8BAA8B,CAAC;AAAA,EACnE;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS,CAAC,EAAE,SAAS,OAAO,EAAE,MAAM;AAClC,YAAM,SACH,WAAW,OAAO,OAAO,MAC1B,KACA,IAAI,MAAM,EAAE,iCAAiC,CAAC;AAEhD,cAAQ,cAAc,SAAS;AAAA,QAC7B,SAAS,MAAM;AAAA,QACf,SAAS;AAAA,UACP,eAAe;AAAA,UACf,MAAM;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AF1BA,IAAM,qBAAqB,eAAAC,QAAM,cAAwD;AAAA,EACvF,cAAc;AAChB,CAAC;AAEM,IAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AACF,MAA8B;AAC5B,QAAM,CAAC,YAAY,QAAI,yBAAS,MAAM,IAAI,gBAAgB,EAAE,wBAAwB,CAAC,CAAC;AAEtF;AAAA,IACE,MAAM,MAAM;AACV,mBAAa,MAAM;AAAA,IACrB;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,SACE,+BAAAA,QAAA,cAAC,mBAAmB,UAAnB,EAA4B,OAAO,EAAE,aAAa,KAChD,QACH;AAEJ;AAkBA,IAAM,oBAAoB,CAAC,EAAE,WAAW,IAAI,MAC1C,GAAG,aAAa,mBAAmB,IAAI,GAAG;AAErC,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AACF,MAA2B;AACzB,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,aAAa,QAAI,2BAAW,kBAAkB;AAEtD,QAAM,cACJ,OAAO,eACH,aAAa,SAAS;AAAA,IACpB;AAAA,IACA;AAAA,IACA,IAAI,kBAAkB,EAAE,WAAW,IAAI,CAAC;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,IACD;AAEN,gCAAU,MAAM;AACd,QAAI,CAAC,YAAa;AAKlB,UAAM,sBAAsB,sCAAsC,EAAE,QAAQ,EAAE,CAAC;AAC/E,gBAAY,WAAW,CAAC,mBAAmB;AAAA,MACzC,GAAG,eAAe,OAAO,CAAC,WAAW,OAAO,OAAO,oBAAoB,EAAE;AAAA,MACzE;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,QAAQ,CAAC,CAAC;AAE3B,SAAO;AACT;AAEA,IAAM,4BAA4B,CAAC,EAAE,kBAAkB,OAA6B;AAAA,EAClF;AACF;AAEO,IAAM,uBAAuB,MAAM;AACxC,QAAM,EAAE,aAAa,QAAI,2BAAW,kBAAkB;AACtD,QAAM,EAAE,kBAAkB,IACxB,cAAc,cAAc,OAAO,yBAAyB,KAAK,CAAC;AACpE,SAAO;AACT;;;AblGA,IAAM,oBAAoB,CAAC,EAAE,YAAY,MAA8B;AACrE,QAAM,aAAa;AACnB,QAAMC,iBAAgB;AAEtB,QAAM,EAAE,WAAW,SAAS,IAC1B,cAAc,aAAa,OAAO,wBAAwB,KAAK,CAAC;AAElE,SACE,+BAAAC,QAAA,cAAC,SAAI,WAAWD,gBAAe,eAAa,cAC1C,+BAAAC,QAAA,cAAC,SAAI,WAAU,8DACb,+BAAAA,QAAA,cAAC,cAAW,WAAW,CAAC,CAAC,WAAW,SAAS,YAAY,YAAY,CACvE,GACA,+BAAAA,QAAA,cAAC,SAAI,WAAU,qDACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,+DACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,sDACZ,YAAY,KACf,GACA,+BAAAA,QAAA,cAAC,kBAAe,UAAU,YAAY,KAAK,CAC7C,GACA,+BAAAA,QAAA,cAAC,SAAI,WAAU,gEACb,+BAAAA,QAAA,cAAC,qBAAkB,UAAU,YAAY,UAAU,GACnD,+BAAAA,QAAA,cAAC,eAAY,SAAS,YAAY,MAAM,UAAU,YAAY,GAAG,CACnE,CACF,CACF;AAEJ;AAOA,IAAM,2BAA2B,CAAC,WAA6B;AAAA,EAC7D,WAAW,MAAM;AAAA,EACjB,UAAU,MAAM;AAClB;AAEA,IAAM,kBAAkB,CAAC,UAAsB;AAC7C,QAAM;AAAA,IACJ,IAAI,EAAE,WAAW,WAAW,WAAW,MAAM;AAAA,EAC/C,IAAI;AAWJ,QAAM,EAAE,SAAS,WAAW,IAAI,kBAAkB,KAAK,CAAC;AAExD,QAAM,cAAc,eAAe;AAAA,IACjC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WACE,SAAS,MACT,GAAG,aAAc,QAAQ,aAAa,QAAQ,KAAM,EAAE,GAAG,QAAQ,EAAE;AAAA,IACrE,KAAK;AAAA,IACL;AAAA,IACA,cAAc,MAAM,GAAG;AAAA,EACzB,CAAC;AAED,SAAO,cAAc,+BAAAA,QAAA,cAAC,qBAAkB,aAA0B,IAAK;AACzE;AAKO,IAAMC,SAAQ,eAAAD,QAAM,KAAK,eAAe;;;AgBrF/C,IAAAE,kBAAkB;;;ACAlB,IAAAC,iBAAkB;;;ACClB,IAAAC,iBAAkB;AAClB,IAAAC,eAAiB;AAUjB,IAAM,eAAe;AAEd,IAAM,cAAc,CAAC;AAAA,EAC1B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,gBAAgB,SAAS;AAAA,IACzC,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AAAA,EACA,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AACF;AAGK,IAAM,eAAe,CAAC;AAAA,EAC3B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,iBAAiB,SAAS;AAAA,IAC1C,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,iDAAgD,MAAK,WAAU;AAAA,EACvE,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA,cAAC,UAAK,UAAS,WAAU,GAAE,qBAAoB,MAAK,WAAU,UAAS,WAAU;AAAA,EACjF,+BAAAA,QAAA,cAAC,UAAK,UAAS,WAAU,GAAE,qBAAoB,MAAK,WAAU,UAAS,WAAU;AAAA,EACjF,+BAAAA,QAAA,cAAC,UAAK,UAAS,WAAU,GAAE,qBAAoB,MAAK,WAAU,UAAS,WAAU;AACnF;AAGK,IAAM,kBAAkB,CAAC;AAAA,EAC9B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,qBAAqB,SAAS;AAAA,IAC9C,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA,cAAC,UAAK,UAAS,WAAU,GAAE,qBAAoB,MAAK,WAAU,UAAS,WAAU;AAAA,EACjF,+BAAAA,QAAA,cAAC,UAAK,UAAS,WAAU,GAAE,qBAAoB,MAAK,WAAU,UAAS,WAAU;AAAA,EACjF,+BAAAA,QAAA,cAAC,UAAK,UAAS,WAAU,GAAE,qBAAoB,MAAK,WAAU,UAAS,WAAU;AAAA,EACjF,+BAAAA,QAAA,cAAC,cACC,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA;AAAA,IAEH,+BAAAA,QAAA,cAAC,UAAK,WAAU,WAAU;AAAA,IAC1B,+BAAAA,QAAA,cAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,EACvC,CACF;AACF;AAGK,IAAM,qBAAqB,CAAC;AAAA,EACjC,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,uBAAuB,SAAS;AAAA,IAChD,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AAAA,EACA,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,iDAAgD,MAAK,WAAU;AAAA,EACvE,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AACF;AAGK,IAAM,wBAAwB,CAAC;AAAA,EACpC,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,2BAA2B,SAAS;AAAA,IACpD,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AAAA,EACA,+BAAAA,QAAA,cAAC,cACC,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA;AAAA,IAEH,+BAAAA,QAAA,cAAC,UAAK,WAAU,WAAU;AAAA,IAC1B,+BAAAA,QAAA,cAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,EACvC,CACF;AACF;AAGK,IAAM,gBAAgB,CAAC;AAAA,EAC5B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,kBAAkB,SAAS;AAAA,IAC3C,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AAAA,EACA,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,iDAAgD,MAAK,WAAU;AAAA,EACvE,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AACF;AAGK,IAAM,mBAAmB,CAAC;AAAA,EAC/B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,sBAAsB,SAAS;AAAA,IAC/C,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AAAA,EACA,+BAAAA,QAAA,cAAC,cACC,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA;AAAA,IAEH,+BAAAA,QAAA,cAAC,UAAK,WAAU,WAAU;AAAA,IAC1B,+BAAAA,QAAA,cAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,EACvC,CACF;AACF;AAGK,IAAM,kBAAkB,CAAC;AAAA,EAC9B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,oBAAoB,SAAS;AAAA,IAC7C,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AAAA,EACA,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,iDAAgD,MAAK,WAAU;AAAA,EACvE,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AACF;AAGK,IAAM,qBAAqB,CAAC;AAAA,EACjC,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,wBAAwB,SAAS;AAAA,IACjD,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AAAA,EACA,+BAAAA,QAAA,cAAC,cACC,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA;AAAA,IAEH,+BAAAA,QAAA,cAAC,UAAK,WAAU,WAAU;AAAA,IAC1B,+BAAAA,QAAA,cAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,EACvC,CACF;AACF;AAGK,IAAM,eAAe,CAAC;AAAA,EAC3B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,iBAAiB,SAAS;AAAA,IAC1C,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,iDAAgD,MAAK,WAAU;AAAA,EACvE,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AACF;AAGK,IAAM,kBAAkB,CAAC;AAAA,EAC9B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,qBAAqB,SAAS;AAAA,IAC9C,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AAAA,EACA,+BAAAA,QAAA,cAAC,cACC,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA;AAAA,IAEH,+BAAAA,QAAA,cAAC,UAAK,WAAU,WAAU;AAAA,IAC1B,+BAAAA,QAAA,cAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,EACvC,CACF;AACF;AAGK,IAAM,gBAAgB,CAAC;AAAA,EAC5B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,kBAAkB,SAAS;AAAA,IAC3C,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AAAA,EACA,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,iDAAgD,MAAK,WAAU;AAAA,EACvE,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AACF;AAGK,IAAM,mBAAmB,CAAC;AAAA,EAC/B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,sBAAsB,SAAS;AAAA,IAC/C,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AAAA,EACA,+BAAAA,QAAA,cAAC,cACC,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA;AAAA,IAEH,+BAAAA,QAAA,cAAC,UAAK,WAAU,WAAU;AAAA,IAC1B,+BAAAA,QAAA,cAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,EACvC,CACF;AACF;AAGK,IAAM,gBAAgB,CAAC;AAAA,EAC5B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,kBAAkB,SAAS;AAAA,IAC3C,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AAAA,EACA,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,iDAAgD,MAAK,WAAU;AAAA,EACvE,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AACF;AAGK,IAAM,mBAAmB,CAAC;AAAA,EAC/B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,sBAAsB,SAAS;AAAA,IAC/C,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,cACC,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA;AAAA,IAEH,+BAAAA,QAAA,cAAC,UAAK,WAAU,WAAU;AAAA,IAC1B,+BAAAA,QAAA,cAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,EACvC,CACF;AACF;AAGK,IAAM,mBAAmB,CAAC;AAAA,EAC/B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,sBAAsB,SAAS;AAAA,IAC/C,MAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAmD,MAAK,WAAU;AAAA,EAC1E,+BAAAA,QAAA,cAAC,UAAK,UAAS,WAAU,GAAE,qBAAoB,MAAK,WAAU,UAAS,WAAU;AAAA,EACjF,+BAAAA,QAAA,cAAC,UAAK,UAAS,WAAU,GAAE,qBAAoB,MAAK,WAAU,UAAS,WAAU;AAAA,EACjF,+BAAAA,QAAA,cAAC,UAAK,UAAS,WAAU,GAAE,qBAAoB,MAAK,WAAU,UAAS,WAAU;AAAA,EACjF,+BAAAA,QAAA,cAAC,cACC,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA;AAAA,IAEH,+BAAAA,QAAA,cAAC,UAAK,WAAU,SAAQ;AAAA,IACxB,+BAAAA,QAAA,cAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,EACvC,CACF;AACF;AAIK,IAAM,gBAAgB,CAAC;AAAA,EAC5B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,GAAG;AACL,MACE,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,kBAAkB,SAAS;AAAA,IAC3C,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAM;AAAA,IACL,GAAG;AAAA;AAAA,EAEJ,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AACF;;;AC/lBK,IAAM,gBAAgB;AAAA;AAAA;AAAA,EAG3B;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAGF;AAEO,IAAM,iBAAiB;AAAA;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAGF;AAEO,IAAM,sBAAsB;AAAA;AAAA;AAAA,EAGjC;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAGF;AAEO,IAAM,mBAAmB;AAAA;AAAA,EAE9B;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AACF;AAEO,IAAM,gBAAgB;AAAA;AAAA,EAE3B;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AACF;;;ACtHA,SAAS,0BAAiC;AAAA,EACxC,iBAAAE;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,cAAAC;AACF,GAAyD;AACvD,QAAM,oBAA8C;AAAA,IAClD,mBAAmBF;AAAA,EACrB;AAEA,aAAW,QAAQ,eAAe;AAChC,sBAAkB,IAAI,IAAIE;AAAA,EAC5B;AAEA,aAAW,QAAQ,gBAAgB;AACjC,sBAAkB,IAAI,IAAIH;AAAA,EAC5B;AAEA,aAAW,QAAQ,qBAAqB;AACtC,sBAAkB,IAAI,IAAIE;AAAA,EAC5B;AAEA,aAAW,QAAQ,kBAAkB;AACnC,sBAAkB,IAAI,IAAIJ;AAAA,EAC5B;AAEA,aAAW,QAAQ,eAAe;AAChC,sBAAkB,IAAI,IAAIC;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,6BAAoC;AAAA,EAC3C;AAAA,EACA,eAAAK;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AACF,GAA6D;AAC3D,SAAO;AAAA,IACL,UAAUF;AAAA,IACV,UAAUC;AAAA,IACV,SAAS;AAAA,IACT,UAAUC;AAAA,EACZ;AACF;AAYO,IAAM,UAAmB;AAAA,EAC9B,KAAK;AAAA,IACH,GAAG,0BAAqC;AAAA,MACtC,iBAA6B;AAAA,MAC7B,cAA0B;AAAA,MAC1B,eAA2B;AAAA,MAC3B;AAAA,MACA,oBAAgC;AAAA,MAChC,cAA0B;AAAA,IAC5B,CAAC;AAAA,IACD,GAAG,6BAAwC;AAAA,MACzC,aAAyB;AAAA,MACzB,eAA2B;AAAA,MAC3B;AAAA,MACA,eAA2B;AAAA,IAC7B,CAAC;AAAA,IACD,UAAsB;AAAA,EACxB;AAAA,EACA,UAAU;AAAA,IACR,GAAG,0BAAqC;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACD,GAAG,6BAAwC;AAAA,MACzC,aAAyB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACD,UAAsB;AAAA,EACxB;AACF;;;AH1HO,SAAS,eAAe,OAAiB,YAAY,UAAmB;AAC7E,QAAM,SAAS,QAAQ,IAAI,KAAK,QAAQ,UAAU;AAElD,MAAI,CAAC,SAAU,QAAO,OAAO;AAE7B,QAAM,OAAO,OAAO,QAAQ;AAC5B,MAAI,KAAM,QAAO;AAEjB,MAAI,SAAS,WAAW,QAAQ,EAAG,QAAO,OAAO,QAAQ;AACzD,MAAI,SAAS,WAAW,QAAQ,EAAG,QAAO,OAAO,QAAQ;AACzD,MAAI,SAAS,WAAW,QAAQ,EAAG,QAAO,OAAO,QAAQ;AACzD,MAAI,SAAS,WAAW,OAAO,EAAG,QAAO,OAAO,OAAO;AAEvD,SAAO,OAAO;AAChB;AAEO,IAAM,WAAW,CAAC,UAAyB;AAChD,QAAM;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,GAAG;AAAA,EACL,IAAI;AAEJ,QAAMC,QAAO,eAAe,MAAM,QAAQ;AAE1C,SAAO,+BAAAC,QAAA,cAACD,OAAA,EAAM,GAAG,MAAM,MAAM,MAAM,OAAO,WAAW;AACvD;;;AI5CA,IAAAE,gBAAiB;AACjB,IAAAC,iBAAuB;AAEvB,IAAAC,kBAAwD;;;ACDxD,IAAAC,iBAA4B;AAErB,IAAM,6BAA6B,CACxC,gBAAgB,OAChB,gBAEA;AAAA,EACE,CAAC,EAAE,cAAc,MAAqC;AACpD,UAAM,EAAE,MAAM,IAAI;AAElB,QAAI,CAAC,MAAO;AAEZ,QAAI;AACF,gBAAU,MAAM,KAAK,KAAK,CAAC;AAAA,IAC7B,SAAS,OAAO;AACd,cAAQ,MAAM,KAAK;AAAA,IACrB;AAEA,QAAI,cAAe,eAAc,QAAQ;AAAA,EAC3C;AAAA,EACA,CAAC,SAAS,aAAa;AACzB;AAcF,eAAsB,yBACpB,OACqB;AACrB,MAAI,CAAC,SAAS,CAAC,MAAM,QAAQ;AAC3B,WAAO,CAAC;AAAA,EACV;AAGA,QAAM,YAAY,aAAa,KAAK;AACpC,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AAGA,QAAM,eAAe,CAAC;AACtB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,aAAa;AAC7B,mBAAa;AAAA,QACX,IAAI,QAAc,CAAC,WAAW;AAC5B,eAAK,YAAY,OAAO,MAAM;AAC5B,kBAAM,gBAAgB,oBAAoB,CAAC,EAAE;AAAA,cAAI,CAAC,QAChD,eAAe,WAAW,GAAG;AAAA,YAC/B;AAEA,kBAAM,QAAQ,IAAI,aAAa;AAC/B,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,IAAI,YAAY;AAC9B,SAAO;AACT;AAEA,SAAS,aAAa,OAA2B;AAC/C,QAAM,YAAY,CAAC;AACnB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,QAAQ;AACxB,YAAM,OAAO,KAAK,UAAU;AAC5B,UAAI,MAAM;AACR,kBAAU,KAAK,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,eAAe,WAAuB,KAAa;AAChE,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,GAAG;AAAA,EACvB,SAAS,GAAG;AACV;AAAA,EACF;AACA,QAAM,cAAc,IAAI,QAAQ,IAAI,cAAc,KAAK;AACvD,QAAM,MAAM,MAAM,IAAI,YAAY;AAClC,QAAM,OAAO,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,YAAY,CAAC;AAClD,YAAU,KAAK,IAAI;AACrB;AAEA,IAAM,sBAAsB,CAAC,MAAc;AACzC,QAAM,YAAY,IAAI,UAAU,EAC7B,gBAAgB,GAAG,WAAW,EAC9B,qBAAqB,KAAK;AAC7B,SAAO,MAAM,KAAK,WAAW,CAAC,QAAQ,IAAI,GAAG,EAAE,OAAO,CAAC,QAAQ,GAAG;AACpE;AAKO,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,QAAM,mBAAmB,IAAI,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,SAAO,IAAI,KAAK,CAAC,gBAAgB,GAAG,UAAU,EAAE,MAAM,iBAAiB,KAAK,CAAC;AAC/E;AAEO,IAAM,2BAA2B,CAAC,aAAqB;AAC5D,QAAM,QAAQ,SAAS,MAAM,YAAY;AACzC,SAAO,SAAS,MAAM,CAAC;AACzB;AAEO,IAAM,mCAAmC,CAC9C,aAC6B;AAC7B,QAAM,QAAQ,SAAS,MAAM,qBAAqB;AAClD,SAAO,SAAU,MAAM,CAAC;AAC1B;AAEO,IAAM,wBAAwB,CAAC,SACpC,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,QAAM,aAAa,IAAI,WAAW;AAClC,aAAW,SAAS,MAAM;AACxB,YAAQ,WAAW,MAAqB;AAAA,EAC1C;AAEA,aAAW,UAAU,MAAM;AACzB,WAAO,WAAW,KAAK;AAAA,EACzB;AAEA,aAAW,kBAAkB,IAAI;AACnC,CAAC;;;ACjJH,IAAAC,kBAAgE;;;ACAhE,IAAAC,iBAA+B;AAC/B,IAAAC,iBAAuB;AAIhB,IAAM,uBAAuB,CAAC,EAAE,OAAO,GAAG,MAAyB;AACxE,QAAM,SAAK,wBAAQ,UAAM,uBAAO,GAAG,CAAC,CAAC;AAErC,SACE,+BAAAC,QAAA,cAAC,SAAI,WAAU,iCACb,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAM;AAAA;AAAA,IAEN,+BAAAA,QAAA,cAAC,cACC,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,GAAG,EAAE;AAAA,QACT,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA;AAAA,MAEH,+BAAAA,QAAA,cAAC,UAAK,QAAO,MAAK,WAAU,QAAO,aAAY,KAAI;AAAA,MACnD,+BAAAA,QAAA,cAAC,UAAK,eAAY,cAAa,QAAO,QAAO,aAAY,KAAI;AAAA,IAC/D,CACF;AAAA,IACA,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAM,QAAQ,EAAE;AAAA,QAChB,UAAS;AAAA;AAAA,IACX;AAAA,EACF,CACF;AAEJ;AAEO,IAAM,aAAa,MAAM;AAC9B,QAAM,EAAE,EAAE,IAAI,sBAAsB,YAAY;AAChD,SACE,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,MAAK;AAAA,MACL,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,OAAM;AAAA;AAAA,IAEN,+BAAAA,QAAA,cAAC,eAAO,EAAE,cAAc,CAAE;AAAA,IAC1B,+BAAAA,QAAA,cAAC,OAAE,UAAS,yBACV,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA;AAAA,IACP,CACF;AAAA,IACA,+BAAAA,QAAA,cAAC,cACC,+BAAAA,QAAA,cAAC,cAAS,IAAG,mBACX,+BAAAA,QAAA,cAAC,UAAK,MAAK,SAAQ,QAAO,MAAK,OAAM,MAAK,CAC5C,CACF;AAAA,EACF;AAEJ;AAEO,IAAM,YAAY,MACvB,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACN;AACH;AAGK,IAAM,YAAY,MACvB,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AACF;AAGK,IAAMC,gBAAe,MAC1B,+BAAAD,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACN;AACH;AAGK,IAAM,WAAW,MACtB,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AACF;AAGK,IAAM,WAAW,MAAM;AAC5B,QAAM,EAAE,EAAE,IAAI,sBAAsB,YAAY;AAChD,SACE,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,MAAK;AAAA,MACL,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,OAAM;AAAA;AAAA,IAEN,+BAAAA,QAAA,cAAC,eAAO,EAAE,MAAM,CAAE;AAAA,IAClB,+BAAAA,QAAA,cAAC,UAAK,GAAE,0EAAyE;AAAA,EACnF;AAEJ;AAEO,IAAM,UAAU,MACrB,+BAAAA,QAAA,cAAC,SAAI,MAAK,gBAAe,SAAQ,aAAY,OAAM,gCACjD,+BAAAA,QAAA,cAAC,UAAK,GAAE,oHAAmH,GAC3H,+BAAAA,QAAA,cAAC,UAAK,GAAE,uIAAsI,CAChJ;AAGK,IAAM,UAAU,MACrB,+BAAAA,QAAA,cAAC,SAAI,MAAK,gBAAe,SAAQ,aAAY,OAAM,gCACjD,+BAAAA,QAAA,cAAC,UAAK,GAAE,shBAAqhB,CAC/hB;AAGK,IAAME,aAAY,MACvB,+BAAAF,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA,cAAC,UAAK,GAAE,wFAAuF;AACjG;AAGK,IAAM,WAAW,MACtB,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA,cAAC,UAAK,GAAE,iNAAgN;AAC1N;AAGK,IAAM,gBAAgB,MAC3B,+BAAAA,QAAA,cAAC,SAAI,MAAK,gBAAe,SAAQ,aAAY,OAAM,gCACjD,+BAAAA,QAAA,cAAC,UAAK,GAAE,iUAAgU,CAC1U;;;AC1LF,IAAAG,kBAAmC;AACnC,IAAAC,uBAAqD;;;ACDrD,IAAAC,iBAAiD;AAS1C,IAAM,oBAAgB,8BAAkC,MAAS;AAEjE,IAAM,mBAAmB,UAAM,2BAAW,aAAa;AAEvD,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AACF,MACE,+BAAAC,QAAA,cAAC,cAAc,UAAd,EAAuB,OAAO,UAC7B,+BAAAA,QAAA,cAAC,WAAQ,SAAS,QAAQ,WAAU,QAAS,CAC/C;;;ACnBF,IAAAC,kBAAiC;AAEjC,IAAAC,yBAAyB;;;ACFzB,IAAAC,kBAAiD;;;ACAjD,IAAAC,kBAAmC;AACnC,IAAAC,gBAAiB;;;ACDjB,IAAAC,iBAA+B;AAcxB,SAAS,UAAU,OAAuB;AAC/C,QAAM,EAAE,UAAAC,WAAU,iBAAiB,aAAa,QAAQ,UAAU,IAAI;AAEtE,QAAM,EAAE,WAAW,IAAI,kBAAkB,kBAAkB;AAC3D,QAAM,EAAE,GAAG,gBAAgB,IAAI,sBAAsB,kBAAkB;AAEvE,QAAM,sBACJ,aAAa,OAAO,SAAS,IAAI,UAAU,YAAY,IAAI;AAE7D,QAAM,WAAO;AAAA,IACX,MACE,cAAc;AAAA,MACZ,UAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,MAClB;AAAA,MACA;AAAA,MACA,yBAAyB;AAAA,IAC3B,CAAC;AAAA,IACH;AAAA,MACEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA;AAAA,IAEN;AAAA,EACH;AAEJ;;;AC3DA,IAAAC,eAAiB;AACjB,IAAAC,iBAA2C;;;ACD3C,IAAAC,iBAAkB;AAIX,IAAM,OAAO;AAAA,EAClB,eAAe,CAAC,UACd,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,OAAM;AAAA,MACL,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEF,oBAAoB,CAAC,UACnB,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,OAAM;AAAA,MACL,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEF,QAAQ,CAAC,UACP,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,OAAM;AAAA,MACL,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEF,MAAM,CAAC,UACL,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,OAAM;AAAA,MACL,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA;AAAA,IACP;AAAA,EACF;AAEJ;;;AC1DA,IAAM,sCAGF,CAAC;AAmBE,IAAM,aAAa,OAAO;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwB;AACtB,MAAI,CAAC,WAAW,CAAC,MAAM;AACrB,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AAIA,QAAM,aAAa,WAAW,OAAO,QAAQ,MAAO,IAAI,EAAE,QAAQ,CAAC;AAGnE,QAAM,cAAc,YAAY,KAC5B,WAAW,MACX,WAAW,QAAQ,SACjB,uBAAuB,WAAW,MAAM,OAAO,IAC/C;AAEN,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,oCAAoC,WAAW;AAEpE,MAAI,cAAc;AAChB,UAAM;AAAA,EACR,OAAO;AACL,QAAI;AACF,0CAAoC,WAAW,IAAI,WAAW,MAAM,OAAO;AAC3E,YAAM,oCAAoC,WAAW;AAAA,IACvD,UAAE;AACA,aAAO,oCAAoC,WAAW;AAAA,IACxD;AAAA,EACF;AAEA,SAAO;AACT;AAGA,IAAM,yBAAyB,CAAC,aAAqB,YAAuB;AAC1E,MAAI,CAAC,QAAS;AACd,QAAM,aAAa,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;AAC/C,SAAO,GAAG,WAAW,aAAa,UAAU;AAC9C;;;AClFO,IAAM,eAAe,CAAC,KAAa,MAAc;AACtD,QAAMC,QAAO,IAAI,WAAW,CAAC;AAE7B,MAAI,OAAO,MAAMA,KAAI,EAAG,QAAO;AAE/B,MAAIA,QAAO,SAAUA,QAAO,MAAQ,QAAO,IAAI,OAAO,CAAC;AAEvD,MAAI,SAAUA,SAAQA,SAAQ,OAAQ;AACpC,QAAI,IAAI,UAAU,IAAI,GAAG;AACvB,YAAM;AAAA,IACR;AAEA,UAAM,OAAO,IAAI,WAAW,IAAI,CAAC;AAEjC,QAAI,QAAS,QAAQ,OAAO,OAAQ;AAClC,YAAM;AAAA,IACR;AAEA,WAAO,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC;AAAA,EACzC;AAEA,MAAI,MAAM,GAAG;AACX,UAAM;AAAA,EACR;AAEA,QAAM,OAAO,IAAI,WAAW,IAAI,CAAC;AAEjC,MAAI,QAAS,QAAQ,OAAO,OAAQ;AAClC,UAAM;AAAA,EACR;AAEA,SAAO;AACT;;;AHRO,IAAM,SAAS,CAAC,UAAuB;AAC5C,QAAM;AAAA,IACJ;AAAA,IACA,OAAAC;AAAA,IACA,MAAAC;AAAA,IACA,UAAU,MAAM;AAAA,IAChB,cAAc,MAAM;AAAA,EACtB,IAAI;AAEJ,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,KAAK;AAExC,gCAAU,MAAM;AACd,aAAS,KAAK;AAAA,EAChB,GAAG,CAACD,MAAK,CAAC;AAEV,QAAM,UAAUC,OAAM,SAAS,KAAK;AACpC,QAAM,WAAW,aAAa,SAAS,CAAC;AACxC,QAAM,YAAYD,UAAS,CAAC;AAE5B,SACE,+BAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,aAAAC,SAAK,oDAAoD,WAAW;AAAA,QAC7E,CAAC,oCAAoC,GAAG,SAAS,SAAS;AAAA,QAC1D,CAAC,8BAA8B,GAAG,CAAC,SAAS;AAAA,QAC5C,CAAC,8BAA8B,GAAG,SAAS,WAAW;AAAA,MACxD,CAAC;AAAA,MACD,eAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAK;AAAA,MACL,OAAOF;AAAA;AAAA,IAEN,YACC,+BAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,SAAS,MAAM,SAAS,IAAI;AAAA,QAC5B,KAAKF;AAAA;AAAA,IACP,IAEA,+BAAAE,QAAA,6BAAAA,QAAA,gBACG,CAAC,CAAC,SAAS,UACV,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,aAAAC,SAAK,2BAA2B;AAAA,QAC3C,eAAY;AAAA;AAAA,MAEX;AAAA,IACH,GAED,CAAC,SAAS,UAAU,+BAAAD,QAAA,cAAC,KAAK,MAAL,IAAU,CAClC;AAAA,EAEJ;AAEJ;;;AIhFA,IAAAE,iBAAkB;AAOX,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA0B;AACxB,MAAI,yBAAyB;AAC3B,WACE,+BAAAC,QAAA,cAAC,eAAY,yBAAmD,GAAG,aAAa;AAAA,EAEpF;AACA,SAAO,+BAAAA,QAAA,cAAC,UAAO,OAAOF,QAAO,MAAMC,OAAM,MAAa,GAAG,aAAa;AACxE;;;ACpBA,IAAAE,eAAiB;AACjB,IAAAC,iBAAkB;AAaX,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC;AAAA,MACT;AAAA,MACA,EAAE,sCAAsC,wBAAwB,WAAW,EAAE;AAAA,MAC7E;AAAA,IACF;AAAA,IACA,eAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,MAAK;AAAA;AAAA,EAEJ,wBAAwB,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,OAAAC,QAAO,MAAAC,MAAK,GAAG,MACzD,+BAAAH,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,aAAAC,SAAK;AAAA,QACd,4BAA4B,wBAAwB,WAAW,KAAK,MAAM;AAAA,MAC5E,CAAC;AAAA,MACD,OAAOC;AAAA,MACP,KAAK,GAAGC,KAAI,IAAID,MAAK,IAAI,CAAC;AAAA,MAC1B,MAAMC;AAAA;AAAA,EACR,CACD;AACH;;;ACzCF,IAAAC,eAAiB;AACjB,IAAAC,iBAAkB;AAGX,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,UAAAC;AACF,MAIE,+BAAAC,QAAA,cAAC,SAAI,WAAU,4CACZ,UACA,QAAQ,KACP,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC;AAAA,MACT;AAAA,MACAF,aAAY,iCAAiCA,SAAQ;AAAA,IACvD;AAAA;AAAA,EAEC;AACH,CAEJ;;;ACxBF,IAAAG,kBAAqB;AACrB,IAAAC,kBAAoD;;;ACDpD,IAAAC,iBAA8B;AAC9B,IAAAC,gBAAiB;;;ACDjB,IAAAC,iBAAkB;AAClB,IAAAC,gBAAiB;;;ACDjB,IAAAC,iBAAgE;AAChE,IAAAC,gBAAiB;;;ACDjB,IAAAC,iBAA0B;AAInB,IAAM,iCAAiC,CAAC,gBAA6B;AAC1E,QAAM,EAAE,OAAO,IAAI,eAAe,gCAAgC;AAElE,gCAAU,MAAM;AACd,UAAM,cAAc,MAAM;AACxB,UAAI,aAAa;AACf,oBAAY;AAAA,MACd;AAAA,IACF;AAEA,WAAO,GAAG,wBAAwB,WAAW;AAE7C,WAAO,MAAM;AACX,aAAO,IAAI,wBAAwB,WAAW;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,QAAQ,WAAW,CAAC;AAC1B;;;ACpBA,IAAAC,iBAA0B;AAEnB,IAAM,sBAAsB,CACjC,gBACA,SACA,mBACG;AACH,gCAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UACE,kBACA,eAAe,WACf,CAAC,eAAe,QAAQ,SAAS,MAAM,MAAc,KACrD,SACA;AACA,uBAAe;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,iBAAiB,SAAS,kBAAkB;AAErD,WAAO,MAAM;AACX,eAAS,oBAAoB,SAAS,kBAAkB;AAAA,IAC1D;AAAA,EACF,GAAG,CAAC,gBAAgB,gBAAgB,OAAO,CAAC;AAC9C;;;ACzBA,IAAAC,iBAAkE;AAClE,IAAAC,iBAAmB;AAgBnB,IAAM,kDAAkD;AACxD,IAAM,sDAAsD;AAgBrD,IAAM,uBAAuB,CAClC,QACA,SACA,MACA,SACA,sBAIA,6BAAqC,iDACrC,wBACG;AACH,QAAM;AAAA,IACJ,oBAAoB,EAAE,OAAO,UAAU,mBAAmB;AAAA,EAC5D,IAAI,eAAe,sBAAsB;AACzC,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAyB,CAAC,CAAC;AAC3D,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,IAAI;AACnD,QAAM,4BAAwB,uBAA2B,MAAS;AAElE,QAAM,2BACJ,6BAA6B,sDACzB,sDACC,8BAA8B;AAErC,QAAM,mBAAe,wBAAQ,MAAM,KAAK,UAAU,OAAO,GAAG,CAAC,OAAO,CAAC;AACrE,QAAM,iBAAa,wBAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,CAAC,IAAI,CAAC;AAG7D,QAAM,gBAAgB,OAAO,YAAY,gBAAgB;AACvD,aAAS,IAAI;AAEb,QAAI,cAAc,UAAU;AAC1B,kBAAY,CAAC,CAAC;AAAA,IAChB;AACA,uBAAmB,SAA6B;AAEhD,QAAI;AACF,UAAI,qBAAqB;AACvB,cAAM,oBAAoB;AAAA,UACxB,iBAAiB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,cAAM,SAAS,cAAc,WAAW,IAAI,SAAS;AAErD,cAAM,aAAa;AAAA,UACjB;AAAA,UACA,GAAG;AAAA,QACL;AAEA,cAAM,uBAAuB,MAAM,OAAO;AAAA,UACxC;AAAA,UACA,QAAQ,CAAC;AAAA,UACT;AAAA,QACF;AAEA,cAAM,cACJ,cAAc,WACV,2BACA,eAAAC,SAAO,CAAC,GAAG,UAAU,GAAG,oBAAoB,GAAG,KAAK;AAE1D,oBAAY,WAAW;AACvB,uBAAe,qBAAqB,WAAW,WAAW,SAAS,EAAE;AAGrE,YAAI,CAAC,UAAU,sBAAsB;AACnC,+BAAqB,aAAa,WAAW;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,SAASC,QAAO;AACd,cAAQ,KAAKA,MAAK;AAClB,eAASA,MAA4C;AAAA,IACvD;AAEA,uBAAmB,IAAI;AAAA,EACzB;AAEA,QAAM,sBAAkB,4BAAY,MAAM;AACxC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,kBAAkB,CAAC,sBAAsB;AAC/C,UAAM,iCAAiC,sBAAsB,UACzD,MAAM,sBAAsB,UAC5B;AAEJ,QACE,CAAC,mBACD,iCAAiC,4BACjC,CAAC,OACD;AACA;AAAA,IACF;AAEA,0BAAsB,UAAU;AAChC,kBAAc,QAAQ;AAAA,EACxB,GAAG,CAAC,OAAO,eAAe,wBAAwB,CAAC;AAEnD,QAAM,eAAe,MAAM,cAAc;AAEzC,gCAAU,MAAM;AACd,QAAI,OAAO,wBAAyB;AACpC,UAAM,EAAE,YAAY,IAAI,OAAO,GAAG,wBAAwB,eAAe;AAEzE,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,QAAQ,eAAe,CAAC;AAE5B,gCAAU,MAAM;AACd,kBAAc,QAAQ;AAAA,EAExB,GAAG,CAAC,cAAc,UAAU,CAAC;AAE7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC1JA,IAAAC,iBAAwD;;;ACAxD,IAAAC,iBAAmB;AAcZ,IAAM,gBAAgB,CAAC,EAAE,eAAe,UAAU,IAAI,MAA2B;AAEtF,QAAM,eAAe,SAAS,UAAU,CAACC,aAAYA,SAAQ,QAAQ,GAAG;AAExE,MAAI,CAAC,iBAAiB,gBAAgB,EAAG,QAAO;AAGhD,QAAM,UAAU,iBAAiB,SAAS,YAAY;AAEtD,aAAO,eAAAC,SAAO,CAAC,SAAS,GAAG,QAAQ,GAAG,KAAK;AAC7C;AAOO,SAAS,2BAA2B,EAAE,SAAS,GAA4B;AAChF,MAAI,yBAAwC;AAE5C,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,gBAAgB,OAAO,EAAG;AAE/B,QAAI,OAAO,2BAA2B,UAAU;AAC9C;AAAA,IACF,OAAO;AACL,+BAAyB;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AACT;AAaO,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAgC;AAE9B,QAAM,qBACJ,oCACA,SAAS,UAAU,CAAC,YAAY,QAAQ,QAAQ,cAAc,GAAG;AAEnE,QAAM,gCAAgC,sBAAsB;AAC5D,QAAM,+BAA+B,uBAAuB;AAK5D,QAAM,yBAAyB,6BAA6B,IAAI;AAChE,QAAM,wBAAwB,gBAAgB,aAAa;AAE3D,MAAI,gCAAiC,0BAA0B,uBAAwB;AACrF,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,CAAC,GAAG,QAAQ;AAGhC,MAAI,+BAA+B;AACjC,gBAAY,OAAO,oBAAoB,CAAC;AAAA,EAC1C;AAIA,MAAI,yBAAwC;AAC5C,MAAI,wBAAwB;AAC1B,6BAAyB,2BAA2B,EAAE,UAAU,YAAY,CAAC;AAAA,EAC/E;AAGA,cAAY;AAAA,IACV,OAAO,2BAA2B,WAAW,yBAAyB,IAAI;AAAA,IAC1E;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;AAOO,IAAM,+BAA+B,CAAC,SAAmC;AAC9E,QAAM,QAAQ,iBAAiB,EAAE,SAAS,GAAG,MAAM,WAAW,YAAY,CAAC;AAE3E,MAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,SAAO,KAAK,IAAI,KAAK,MAAM;AAC7B;AAEO,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,SAAiC;AAErC,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAS,KAAK,OAAO,KAAK;AAAA,EAC5B,OAAO;AACL,QAAIC,SAAQ;AACZ,eAAW,OAAO,MAAM;AACtB,UAAIA,WAAU,SAAS;AACrB,QAAAA;AACA;AAAA,MACF;AAEA,UAAI,QAAQ,WAAW;AACrB,eAAO;AAAA,MACT;AAEA,eAAS;AAET;AAAA,IACF;AAAA,EACF;AAEA,SAAO,SAAS,SAAS,KAAK;AAChC;AAKO,IAAM,iCAAiC,CAAC,YAAyC;AACtF,MAAI,CAAC,QAAS,QAAO;AAErB,SAAO,OAAO,QAAQ,aAAa;AACrC;AAKO,IAAM,kBAAkB,CAAC,YAAqB;AACnD,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,aAAa,QAAQ,MAAM;AAEjC,SAAO,OAAO,WAAW,cAAc;AACzC;AAKO,IAAM,oBAAoB,CAAC,YAAqB;AACrD,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,aAAa,QAAQ,MAAM;AAEjC,SAAO,OAAO,WAAW,gBAAgB;AAC3C;;;ADlHA,IAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACF,MAA2C;AACzC,MAAI,OAAO,kBAAkB,YAAY;AACvC,WAAO,cAAc,aAAa,KAAK;AAAA,EACzC;AAEA,cAAY,CAAC,aAAa;AACxB,UAAM,eAAe,SAAS,UAAU,CAAC,YAAY,QAAQ,QAAQ,MAAM,GAAG;AAE9E,QAAI,eAAe,EAAG,QAAO;AAE7B,aAAS,OAAO,cAAc,CAAC;AAE/B,WAAO,CAAC,GAAG,QAAQ;AAAA,EACrB,CAAC;AACH;AAEO,IAAM,8BAA8B,MAAM;AAC/C,QAAM,EAAE,OAAO,IAAI,eAAe;AAElC,QAAM,uBAAmB;AAAA,IACvB,CAAC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAkC;AAChC,UAAI,OAAO,kBAAkB,YAAY;AACvC,eAAO,cAAc,aAAa,KAAK;AAAA,MACzC;AAEA,YAAM,cAAc,MAAM;AAC1B,YAAM,YAAY,MAAM;AAExB,UAAI,CAAC,eAAe,CAAC,UAAW;AAEhC,kBAAY,CAAC,oBAAoB;AAC/B,cAAM,gBAAgB,OAAO,QAAQ,aAAa,SAAS;AAC3D,cAAM,qBAAqB,gBAAgB,QAAQ,aAAa;AAChE,cAAM,gCAAgC,sBAAsB;AAE5D,cAAM,wBAAwB,gBAAgB,aAAa;AAC3D,cAAM,0BAA0B,kBAAkB,aAAa;AAE/D,cAAM,2BAA2B,+BAA+B,OAAO;AACvE,cAAM,yBAAyB,6BAA6B,IAAI;AAEhE;AAAA;AAAA,UAEG,4BAA4B,2BAA2B,CAAC,QAAQ;AAAA,UAEhE,4BAA4B,CAAC,2BAA2B,QAAQ;AAAA,UAEhE,0BAA0B;AAAA,UAE3B;AAAA,UAEC,CAAC,iCAAiC,CAAC;AAAA,UACpC;AACA,iBAAO;AAAA,QACT;AAEA,eAAO,mBAAmB;AAAA,UACxB,UAAU;AAAA,UACV,eAAe;AAAA,UACf,kCAAkC;AAAA,UAClC;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,mCAA+B;AAAA,IACnC,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAA8C;AAC5C,UAAI,OAAO,kBAAkB,YAAY;AACvC,eAAO,cAAc,aAAa,KAAK;AAAA,MACzC;AAEA,UAAI,CAAC,MAAM,SAAS;AAClB;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,WAAW;AAAA,QAC/B;AAAA,QACA,IAAI,MAAM,QAAQ;AAAA,QAClB,MAAM,MAAM,QAAQ;AAAA,MACtB,CAAC;AAED,YAAM,2BAA2B,+BAA+B,OAAO;AACvE,UAAI,kBAAkB,OAAO,KAAK,4BAA4B,CAAC,QAAQ,UAAU;AAC/E;AAAA,MACF;AAEA,UAAI,CAAC,wCAAwC;AAC3C;AAAA,MACF;AAEA;AAAA,QAAY,CAAC,aACX,mBAAmB;AAAA,UACjB;AAAA,UACA,eAAe;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,uCAAmC;AAAA,IACvC,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAkD;AAChD,UAAI,OAAO,kBAAkB,YAAY;AACvC,eAAO,cAAc,aAAa,KAAK;AAAA,MACzC;AAEA,UAAI,CAAC,MAAM,WAAW,CAAC,wCAAwC;AAC7D;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,WAAW;AAAA,QAC/B;AAAA,QACA,IAAI,MAAM,QAAQ;AAAA,QAClB,SAAS,MAAM,QAAQ,SAAS;AAAA,UAC9B,CAAC,YAAY,EAAE,MAAM,QAAQ,MAAM;AACjC,kBAAM,SAAS,WAAW,MAAM;AAEhC,gBAAI,OAAQ,YAAW,KAAK,MAAM;AAElC,mBAAO;AAAA,UACT;AAAA,UACA,CAAC;AAAA,QACH;AAAA,QACA,MAAM,MAAM,QAAQ;AAAA,MACtB,CAAC;AAGD;AAAA,QAAY,CAAC,aACX,mBAAmB;AAAA,UACjB;AAAA,UACA,eAAe;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,2CAAuC;AAAA,IAC3C,CAAC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAsD;AACpD,UAAI,OAAO,kBAAkB,YAAY;AACvC,eAAO,cAAc,aAAa,KAAK;AAAA,MACzC;AAEA;AAAA,QAAY,CAAC,aACX,SAAS,OAAO,CAAC,YAAY,QAAQ,QAAQ,MAAM,SAAS,GAAG;AAAA,MACjE;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,0BAAsB;AAAA,IAC1B,CAAC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAqC;AACnC,UACE,CAAC,MAAM,QAAQ,QACf,MAAM,OAAO,KAAK,OAAO,OAAO,UAChC,CAAC,MAAM,cACP;AACA;AAAA,MACF;AAEA,YAAM,cAAc,MAAM;AAC1B,YAAM,YAAY,MAAM;AAExB,YAAM,yBAAyB,6BAA6B,IAAI;AAChE,YAAM,2BAA2B,+BAA+B,OAAO;AAGvE,UAAK,CAAC,0BAA0B,CAAC,4BAA6B,kBAAkB;AAC9E;AAAA,MACF;AAEA,YAAM,eAAe,iBAAiB,EAAE,SAAS,GAAG,MAAM,WAAW,YAAY,CAAC;AAElF,kBAAY,CAAC,oBAAoB;AAC/B,cAAM,gBAAgB,OAAO,QAAQ,aAAa,SAAS;AAE3D,cAAM,qBAAqB,gBAAgB,QAAQ,aAAa;AAChE,cAAM,gCAAgC,sBAAsB;AAE5D,cAAM,0BAA0B,kBAAkB,aAAa;AAC/D,cAAM,wBAAwB,gBAAgB,aAAa;AAE3D,cAAM,cAAc,CAAC,GAAG,eAAe;AAEvC,YAAI,+BAA+B;AACjC,sBAAY,OAAO,oBAAoB,CAAC;AAAA,QAC1C;AAGA,YACG,4BAA4B,2BAA2B,CAAC,QAAQ,YAChE,4BAA4B,CAAC,2BAA2B,QAAQ,UACjE;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,yBAAwC;AAK5C,YAAI,iBAAiB,KAAM,iBAAiB,MAAM,CAAC,uBAAwB;AACzE,mCAAyB,2BAA2B,EAAE,UAAU,YAAY,CAAC;AAAA,QAC/E;AAEA,cAAM,wBACJ,OAAO,2BAA2B,WAAW,yBAAyB,IAAI;AAE5E,oBAAY,OAAO,uBAAuB,GAAG,aAAa;AAE1D,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,2BAAuB;AAAA,IAC3B,CAAC,MAAsC,OAAO,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH;AAEA,QAAM,0BAAsB;AAAA,IAC1B,CAAC,MAAqC,OAAO,CAAC;AAAA,IAC9C,CAAC;AAAA,EACH;AAEA,QAAM,2BAAuB;AAAA,IAC3B,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAsC;AACpC,UAAI,OAAO,kBAAkB,YAAY;AACvC,eAAO,cAAc,aAAa,KAAK;AAAA,MACzC;AAEA,UAAI,CAAC,MAAM,cAAc,CAAC,MAAM,cAAc;AAC5C;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,WAAW;AAAA,QAC/B;AAAA,QACA,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,MACd,CAAC;AAED,YAAM,2BAA2B,+BAA+B,OAAO;AACvE,UAAI,kBAAkB,OAAO,KAAK,4BAA4B,CAAC,QAAQ,UAAU;AAC/E;AAAA,MACF;AAEA;AAAA,QAAY,CAAC,aACX,mBAAmB;AAAA,UACjB;AAAA,UACA,eAAe;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,6BAAyB;AAAA,IAC7B,CAAC,EAAE,eAAe,OAAO,YAAY,MAAwC;AAC3E,UAAI,OAAO,kBAAkB,YAAY;AACvC,eAAO,cAAc,aAAa,KAAK;AAAA,MACzC;AAGA,kBAAY,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;AAAA,IAIzC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,2BAAuB;AAAA,IAC3B,CAAC,EAAE,eAAe,OAAO,YAAY,MAAsC;AACzE,UAAI,OAAO,kBAAkB,YAAY;AACvC,eAAO,cAAc,aAAa,KAAK;AAAA,MACzC;AAEA,kBAAY,CAAC,aAAa;AACxB,cAAM,eAAe,SAAS;AAAA,UAC5B,CAAC,YAAY,QAAQ,QAAQ,MAAM,SAAS;AAAA,QAC9C;AAEA,YAAI,eAAe,MAAM,MAAM,SAAS;AACtC,gBAAM,cAAc;AACpB,sBAAY,YAAY,EAAE,OAAO;AAAA,YAC/B,GAAG,MAAM;AAAA,YACT,QAAQ,MAAM,SAAS,UAAU,YAAY,YAAY,EAAE,MAAM;AAAA,YACjE,kBACE,MAAM,SAAS,oBACf,YAAY,YAAY,EAAE,MAAM;AAAA,UACpC;AAEA,iBAAO,CAAC,GAAG,WAAW;AAAA,QACxB;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,IAKH;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,gCAA4B;AAAA,IAChC,CAAC,EAAE,OAAO,YAAY,MAA2C;AAC/D,kBAAY,CAAC,aAAa;AACxB,cAAM,cAAc,SAAS,IAAI,CAAC,YAAY;AAC5C,cAAI,CAAC,MAAM,MAAM,MAAM,CAAC,QAAQ,MAAM,QAAQ,MAAM,KAAK,EAAE,GAAG;AAC5D,mBAAO;AAAA,UACT;AAGA,gBAAM,aAAa;AACnB,qBAAW,MAAM,QAAQ,MAAM,KAAK,EAAE,EAAE,OAAO,MAAM;AAErD,iBAAO;AAAA,QACT,CAAC;AAED,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC;AAAA,EACH;AAEA,aAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AA4BO,IAAM,0BAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAkD;AAChD,QAAM,WAAW,4BAA4B;AAE7C,QAAM,uCAAmC,uBAA2B,MAAS;AAE7E,QAAM,sCAAkC,uBAA2B,MAAS;AAE5E,kCAAgC,UAAU,CAAC,UAAiB;AAC1D,mCAA+B,EAAE,UAAU,OAAO,YAAY,CAAC;AAAA,EACjE;AAEA,mCAAiC,UAAU,CAAC,UAAiB;AAC3D,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,iBAAS,iBAAiB;AAAA,UACxB;AAAA,UACA,eAAe;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD;AAAA,MACF,KAAK;AACH,iBAAS,6BAA6B;AAAA,UACpC;AAAA,UACA,eAAe;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD;AAAA,MACF,KAAK;AACH,iBAAS,iCAAiC;AAAA,UACxC;AAAA,UACA,eAAe;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD;AAAA,MACF,KAAK;AACH,iBAAS,qCAAqC;AAAA,UAC5C,eAAe;AAAA,UACf;AAAA,UACA;AAAA,QACF,CAAC;AACD;AAAA,MACF,KAAK;AACH,iBAAS,qBAAqB;AAAA,UAC5B,eAAe;AAAA,UACf;AAAA,UACA;AAAA,QACF,CAAC;AACD;AAAA,MACF,KAAK;AACH,iBAAS,oBAAoB;AAAA,UAC3B,eAAe;AAAA,UACf;AAAA,UACA;AAAA,QACF,CAAC;AACD;AAAA,MACF,KAAK;AACH,iBAAS,qBAAqB;AAAA,UAC5B,eAAe;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD;AAAA,MACF,KAAK;AACH,iBAAS,uBAAuB;AAAA,UAC9B,eAAe;AAAA,UACf;AAAA,UACA;AAAA,QACF,CAAC;AACD;AAAA,MACF,KAAK;AACH,iBAAS,qBAAqB;AAAA,UAC5B,eAAe;AAAA,UACf;AAAA,UACA;AAAA,QACF,CAAC;AACD;AAAA,MACF,KAAK;AACH,iBAAS,0BAA0B,EAAE,OAAO,YAAY,CAAC;AACzD;AAAA,MACF,KAAK;AACH,iBAAS,oBAAoB;AAAA,UAC3B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,gBAAY,4BAAY,CAAC,MAAa;AAC1C,qCAAiC,UAAU,CAAC;AAAA,EAC9C,GAAG,CAAC,CAAC;AAEL,QAAM,eAAW,wBAAQ,MAAM;AAC7B,QAAI,CAAC,6BAA8B,QAAO;AAC1C,WAAO,CAAC,MAAa;AACnB,sCAAgC,UAAU,CAAC;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,4BAA4B,CAAC;AAEjC,SAAO;AAAA,IACL,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AACF;AAEO,IAAM,sBAAsB,CAAC,YAAgC;AAClE,QAAM,EAAE,OAAO,IAAI,eAAe;AAElC,gCAAU,MAAM;AACd,UAAM,eAAe,OAAO,GAAG,OAAO,OAAO;AAE7C,WAAO,aAAa;AAAA,EACtB,GAAG,CAAC,QAAQ,OAAO,CAAC;AACtB;;;AEroBA,IAAAC,iBAAkB;;;ACAlB,IAAAC,iBAAkB;AAElB,IAAM,eAAe,MACnB,+BAAAC,QAAA,cAAC,SAAI,WAAU,uEACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,qCAAoC,GACnD,+BAAAA,QAAA,cAAC,SAAI,WAAU,2EACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,uCAAsC,GACrD,+BAAAA,QAAA,cAAC,SAAI,WAAU,qCAAoC,CACrD,CACF;AAGF,IAAM,4BAA4B,MAChC,+BAAAA,QAAA,cAAC,SAAI,WAAU,gCACb,+BAAAA,QAAA,cAAC,kBAAa,GACd,+BAAAA,QAAA,cAAC,kBAAa,GACd,+BAAAA,QAAA,cAAC,kBAAa,CAChB;AAMK,IAAM,kBAAkB,eAAAA,QAAM,KAAK,yBAAyB;;;ACvB5D,IAAM,gBAAgB,MAAM;;;ACAnC,IAAAC,iBAA0B;AAKnB,IAAM,gBAAN,cAA4B,yBAAqD;AAAA,EACtF,YAAY,OAA2B;AACrC,UAAM,KAAK;AACX,SAAK,QAAQ,EAAE,UAAU,MAAM;AAAA,EACjC;AAAA,EAEA,OAAO,2BAA2B;AAChC,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAAA,EAEA,kBAAkB,OAAgB,aAAsB;AACtD,YAAQ,MAAM,OAAO,WAAW;AAAA,EAClC;AAAA,EAEA,SAAS;AACP,QAAI,KAAK,MAAM,UAAU;AACvB,aAAO,KAAK,MAAM;AAAA,IACpB;AAEA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;;;AHCO,IAAM,uBAAuB,CAClC,UACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,uBAAAC,yBAAwB;AAAA,IACxB,kBAAAC,oBAAmB;AAAA,EACrB,IAAI;AACJ,QAAM,EAAE,EAAE,IAAI,sBAAsB,sBAAsB;AAE1D,MAAI,OAAO;AACT,WAAO,+BAAAC,QAAA,cAACF,wBAAA,EAAsB,OAAc;AAAA,EAC9C;AAEA,MAAI,SAAS;AACX,WAAO,+BAAAE,QAAA,cAACD,mBAAA,IAAiB;AAAA,EAC3B;AAEA,SACE,+BAAAC,QAAA,cAAC,SAAI,WAAU,6EACb,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,mBAAmB;AAAA,MACjC,WAAU;AAAA,MACV,MAAK;AAAA;AAAA,IAEJ;AAAA,EACH,CACF;AAEJ;;;AI1DA,IAAAC,eAAiB;AACjB,IAAAC,iBAAkB;;;ACAlB,IAAAC,iBAAyD;AACzD,IAAAC,iBAAqB;AACrB,IAAAA,iBAAmB;;;ACCZ,IAAM,YAAY,CAAC,WACvB,OAAmB,OAAO;;;AD8EtB,IAAM,mBAAmB,CAAC;AAAA,EAC/B,cAAc;AAAA,EACd,4BAA4B;AAAA,EAC5B,WAAW;AAAA,EACX,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,2BAA2B;AAAA,EAC3B,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACF,MAAuD;AACrD,QAAM,EAAE,QAAQ,iBAAiB,IAAI,eAAe,kBAAkB;AAEtE,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAS,KAAK;AAC1D,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAuC,CAAC,CAAC;AACvE,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAEhD,QAAM,mCAA+B,uBAAgB,KAAK;AAC1D,QAAM,+BAA2B,uBAAO,KAAK;AAE7C,QAAM,eAAW,uBAAgC,IAAI;AACrD,QAAM,mBAAe,uBAA8B,IAAI;AAEvD,QAAM,iBAAa,4BAAY,MAAM;AACnC,aAAS,EAAE;AACX,eAAW,CAAC,CAAC;AACb,iBAAa,KAAK;AAElB,6BAAyB,UAAU,6BAA6B;AAAA,EAClE,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAiB,4BAAY,MAAM;AACvC,sBAAkB,IAAI;AAAA,EACxB,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa,4BAAY,MAAM;AACnC,sBAAkB,KAAK;AACvB,aAAS,SAAS,KAAK;AACvB,eAAW;AACX,mBAAe;AAAA,EACjB,GAAG,CAAC,YAAY,YAAY,CAAC;AAE7B,gCAAU,MAAM;AACd,QAAI,SAAU;AAEd,UAAM,gBAAgB,CAAC,UAAsB;AAC3C,UAAI,EAAE,MAAM,kBAAkB,aAAc;AAC5C,YAAM,eAAe,aAAa,SAAS,SAAS,MAAM,MAAM;AAEhE,UAAI,aAAc;AAElB,UAAK,kBAAkB,CAAC,SAAU,2BAA2B;AAC3D,mBAAW;AAAA,MACb;AAAA,IACF;AAEA,aAAS,iBAAiB,SAAS,aAAa;AAChD,WAAO,MAAM,SAAS,oBAAoB,SAAS,aAAa;AAAA,EAClE,GAAG,CAAC,UAAU,gBAAgB,OAAO,YAAY,yBAAyB,CAAC;AAE3E,gCAAU,MAAM;AACd,QAAI,CAAC,SAAS,WAAW,SAAU;AAEnC,UAAM,gBAAgB,CAAC,UAAyB;AAC9C,UAAI,MAAM,QAAQ,SAAU,QAAO,WAAW;AAAA,IAChD;AACA,aAAS,QAAQ,iBAAiB,WAAW,aAAa;AAE1D,WAAO,MAAM;AAEX,eAAS,SAAS,oBAAoB,WAAW,aAAa;AAAA,IAChE;AAAA,EAEF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,mBAAe;AAAA,IACnB,OAAO,WAAkC;AACvC,UAAI,CAAC,OAAO,OAAQ;AACpB,UAAI,gBAAgB;AAClB,cAAM;AAAA,UACJ;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF;AACA,UAAI;AACJ,UAAI,UAAU,MAAM,GAAG;AACrB,yBAAiB,MAAM;AACvB,0BAAkB;AAAA,MACpB,OAAO;AACL,cAAM,aAAa,OAAO,QAAQ,aAAa;AAAA,UAC7C,SAAS,CAAC,OAAO,QAAQ,OAAO,EAAE;AAAA,QACpC,CAAC;AACD,cAAM,WAAW,MAAM;AAEvB,yBAAiB,UAAU;AAC3B,0BAAkB;AAAA,MACpB;AACA,oBAAc,CAAC,iBAAa,eAAAC,SAAO,CAAC,iBAAiB,GAAG,QAAQ,GAAG,KAAK,CAAC;AACzE,UAAI,2BAA2B;AAC7B,mBAAW;AAAA,MACb;AAAA,IACF;AAAA;AAAA,IAEA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAc;AAAA,IAClB,OAAOC,UAAiB;AACtB,UAAI,CAAC,qBAAqB,CAAC,eAAgB;AAC3C,UAAIC,WAAmC,CAAC;AACxC,YAAM,WAAkE,CAAC;AACzE,UAAI;AACF,YAAI,mBAAmB;AACrB,mBAAS;AAAA,YACP,OAAO;AAAA,cACL;AAAA,gBACE,SAAS,EAAE,KAAK,CAAC,OAAO,MAAgB,EAAE;AAAA,gBAC1C,MAAM,EAAE,eAAeD,MAAK;AAAA,gBAC5B,GAAG,mBAAmB,gBAAgB;AAAA,cACxC;AAAA,cACA,mBAAmB,gBAAgB,QAAQ,CAAC;AAAA,cAC5C,EAAE,OAAO,GAAG,GAAG,mBAAmB,gBAAgB,QAAQ;AAAA,YAC5D;AAAA,UACF;AAAA,QACF;AAEA,YAAI,gBAAgB;AAClB,mBAAS;AAAA,YACP,OAAO;AAAA,cACL;AAAA,gBACE,KAAK,CAAC,EAAE,IAAI,EAAE,eAAeA,MAAK,EAAE,GAAG,EAAE,MAAM,EAAE,eAAeA,MAAK,EAAE,CAAC;AAAA,gBACxE,GAAG,mBAAmB,aAAa;AAAA,cACrC;AAAA,cACA,EAAE,IAAI,GAAG,GAAG,mBAAmB,aAAa,KAAK;AAAA,cACjD,EAAE,OAAO,GAAG,GAAG,mBAAmB,aAAa,QAAQ;AAAA,YACzD;AAAA,UACF;AAAA,QACF;AAEA,YAAI,SAAS,QAAQ;AACnB,uCAA6B,UAAU;AAEvC,gBAAM,WAAW,MAAM,QAAQ,IAAI,QAAQ;AAE3C,cAAI,qBAAqB,gBAAgB;AACvC,kBAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI;AAC9B,YAAAC,WAAU,CAAC,GAAG,UAAU,GAAG,MAAM,OAAO,CAACC,OAAMA,GAAE,OAAO,OAAO,MAAM,EAAE,CAAC;AAAA,UAC1E,WAAW,mBAAmB;AAC5B,kBAAM,CAAC,QAAQ,IAAI;AACnB,YAAAD,WAAU,CAAC,GAAG,QAAQ;AAAA,UACxB,WAAW,gBAAgB;AACzB,kBAAM,CAAC,EAAE,MAAM,CAAC,IAAI;AACpB,YAAAA,WAAU,CAAC,GAAG,MAAM,OAAO,CAACC,OAAMA,GAAE,OAAO,OAAO,MAAM,EAAE,CAAC;AAAA,UAC7D;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,KAAK;AAAA,MACrB;AACA,mBAAa,KAAK;AAElB,UAAI,CAAC,yBAAyB,SAAS;AACrC,mBAAWD,QAAO;AAAA,MACpB,OAAO;AACL,iCAAyB,UAAU;AAAA,MACrC;AAEA,mCAA6B,UAAU;AAAA,IACzC;AAAA,IACA,CAAC,QAAQ,mBAAmB,gBAAgB,iBAAiB;AAAA,EAC/D;AAGA,QAAM,0BAAsB;AAAA,QAC1B,eAAAE,SAAS,aAAa,wBAAwB;AAAA,IAC9C,CAAC,aAAa,wBAAwB;AAAA,EACxC;AAEA,QAAM,eAAW;AAAA,IACf,CAAC,UAA+C;AAC9C,YAAM,eAAe;AACrB,UAAI,SAAU;AAEd,UAAI,gBAAgB;AAClB;AAAA,UACE;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF,WAAW,CAAC,qBAAqB,CAAC,gBAAgB;AAChD;AAAA,MACF,WAAW,MAAM,OAAO,OAAO;AAC7B,qBAAa,IAAI;AACjB,iBAAS,MAAM,OAAO,KAAK;AAC3B,4BAAoB,MAAM,OAAO,KAAK;AAAA,MACxC,WAAW,CAAC,MAAM,OAAO,OAAO;AAC9B,mBAAW;AACX,4BAAoB,OAAO;AAAA,MAC7B;AACA,yBAAmB,KAAK;AAAA,IAC1B;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AErUA,IAAAC,iBAAgE;AAChE,IAAAC,eAAiB;;;ACFjB,IAAAC,iBAAkB;AAGX,IAAM,WAAW,MACtB,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AACF;AAGK,IAAM,aAAa,MACxB,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AACF;AAGK,IAAM,QAAQ,MACnB,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AACF;AAGK,IAAM,aAAa,CAAC,EAAE,UAAU,MACrC,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AACF;;;ACjEF,IAAAC,iBAAkB;AAuBX,IAAM,cAAc,CAAC,UAA4B;AACtD,QAAM,EAAE,UAAU,UAAU,UAAU,aAAa,MAAM,IAAI;AAE7D,QAAM,EAAE,EAAE,IAAI,sBAAsB,aAAa;AAEjD,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ;AAAA,MACA,UAAU;AAAA,MACV,aAAa,eAAe,EAAE,QAAQ;AAAA,MACtC,KAAK;AAAA,MACL,MAAK;AAAA,MACL,OAAO;AAAA;AAAA,EACT;AAEJ;;;AFlBA,IAAM,kBAAkB,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,MACE,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,aAAAC,SAAK,uCAAuC,SAAS;AAAA,IAChE,eAAY;AAAA,IACZ;AAAA;AAAA,EAEC;AACH;AAkCK,IAAM,YAAY,CAAC,UAA0B;AAClD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA,UAAAC,YAAW;AAAA,IACX;AAAA,IACA,aAAAC,eAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,QAAM,iBAAa,uBAA8B,IAAI;AAErD,gCAAU,MAAM;AACd,QAAI,CAAC,WAAW,QAAS;AAEzB,UAAM,gBAAgB,CAAC,UAAyB;AAC9C,UAAI,cAAc,MAAM,QAAQ,UAAU;AACxC,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,gBAAgB,CAAC,MAAkB;AACvC,UACE,EAAE,EAAE,kBAAkB,gBACtB,CAAC,cACD,WAAW,SAAS,SAAS,EAAE,MAAM;AAErC;AACF,oBAAc,KAAK;AAAA,IACrB;AAEA,aAAS,iBAAiB,WAAW,aAAa;AAClD,aAAS,iBAAiB,SAAS,aAAa;AAChD,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,aAAa;AACrD,eAAS,oBAAoB,SAAS,aAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,gCAAU,MAAM;AACd,QAAI,CAAC,MAAM,SAAS,QAAS;AAC7B,UAAM,QAAQ,MAAM,SAAS;AAC7B,UAAM,cAAc,MAAM;AACxB,qBAAe;AAAA,IACjB;AAEA,UAAM,aAAa,CAAC,MAAa;AAC/B,QAAE,gBAAgB;AAAA,IACpB;AAEA,UAAM,iBAAiB,SAAS,WAAW;AAC3C,UAAM,iBAAiB,QAAQ,UAAU;AACzC,WAAO,MAAM;AACX,YAAM,oBAAoB,SAAS,WAAW;AAC9C,YAAM,oBAAoB,QAAQ,UAAU;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,gBAAgB,MAAM,QAAQ,CAAC;AAEnC,QAAM,uBAAmB,4BAAY,MAAM;AACzC,eAAW;AACX,eAAW,SAAS,SAAS,MAAM;AAAA,EACrC,GAAG,CAAC,YAAY,WAAW,QAAQ,CAAC;AAEpC,QAAM,mBAAe,4BAAY,MAAM,cAAc,KAAK,GAAG,CAAC,CAAC;AAE/D,SACE,+BAAAH,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,KAAK;AAAA;AAAA,IAEJ,iBACC,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS;AAAA;AAAA,MAET,+BAAAA,QAAA,cAAC,oBAAe;AAAA,IAClB,IACE,UACF,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS,MAAM,cAAc,CAAC,SAAS,CAAC,IAAI;AAAA;AAAA,MAE5C,+BAAAA,QAAA,cAACE,WAAA,IAAS;AAAA,IACZ,IACE;AAAA,IAEJ,+BAAAF,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,aAAAC;AAAA,UACT;AAAA,UACA,WAAW,SAAS;AAAA,QACtB;AAAA;AAAA,MAEA,+BAAAD,QAAA,cAAC,SAAI,WAAU,0CACb,+BAAAA,QAAA,cAAC,qBAAgB,CACnB;AAAA,MACA,+BAAAA,QAAA,cAACG,cAAA,EAAa,GAAG,YAAY;AAAA,MAC7B,+BAAAH,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,eAAY;AAAA,UACZ,UAAU,CAAC,WAAW;AAAA,UACtB,SAAS;AAAA;AAAA,QAET,+BAAAA,QAAA,cAAC,oBAAe;AAAA,MAClB;AAAA,IACF;AAAA,IACC,cAAc,WACb,+BAAAA,QAAA,cAAC,SAAI,KAAK,cACR,+BAAAA,QAAA,cAAC,WAAQ,OAAO,cAAc,CAChC;AAAA,EAEJ;AAEJ;;;AGzLA,IAAAI,iBAAwD;AACxD,IAAAC,eAAiB;AAUjB,IAAM,qBAAqB,MAAM;AAC/B,QAAM,EAAE,EAAE,IAAI,sBAAsB,eAAe;AACnD,SACE,+BAAAC,QAAA,cAAC,SAAI,aAAU,UAAS,WAAU,8CAChC,+BAAAA,QAAA,cAAC,gBAAW,GACX,EAAE,kBAAkB,CACvB;AAEJ;AAIA,IAAM,6BAA6B,CAAC,EAAE,QAAQ,MAAgC;AAC5E,QAAM,EAAE,EAAE,IAAI,sBAAsB,qBAAqB;AACzD,SACE,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEX,EAAE,sBAAsB;AAAA,MACvB,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AAEJ;AAQA,IAAM,2BAA2B,CAAC,UAAkC;AAClE,QAAM,EAAE,aAAa,SAAS,kBAAkB,aAAa,IAAI;AAEjE,SACE,+BAAAA,QAAA,6BAAAA,QAAA,gBACG,QAAQ,IAAI,CAAC,QAAQC,WACpB,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAOC;AAAA,MACP,KAAKA;AAAA,MACL;AAAA,MACA;AAAA;AAAA,EACF,CACD,CACH;AAEJ;AASA,IAAM,0BAA0B,CAAC,UAAiC;AAChE,QAAM,EAAE,aAAa,OAAAA,QAAO,QAAQ,aAAa,IAAI;AACrD,QAAM,UAAU,gBAAgBA;AAEhC,QAAM,gBAAY,aAAAC;AAAA,IAChB;AAAA,IACA,WAAW;AAAA,EACb;AAEA,MAAI,UAAU,MAAM,GAAG;AACrB,UAAM,UAAU;AAEhB,WACE,+BAAAF,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,UAAU,MAAM,aAAa,OAAO;AAAA;AAAA,IACtC;AAAA,EAEJ,OAAO;AACL,WACE,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,wBAAwB,OAAO,QAAQ,EAAE;AAAA,QACrD;AAAA,QACA,eAAY;AAAA,QACZ,SAAS,MAAM,aAAa,MAAM;AAAA,QAClC,MAAK;AAAA;AAAA,MAEL,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,OAAO;AAAA,UACd,MAAM,OAAO,QAAQ,OAAO;AAAA,UAC5B,MAAM;AAAA;AAAA,MACR;AAAA,MACA,+BAAAA,QAAA,cAAC,SAAI,WAAU,mDACZ,OAAO,QAAQ,OAAO,EACzB;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,IAAM,mBAAmB,CAAC;AAAA,EACxB;AAAA,EACA;AACF,MAAqD;AACnD,QAAM,EAAE,EAAE,IAAI,sBAAsB,kBAAkB;AAEtD,SACE,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,6BAA6B;AAAA,MAC3C,eAAW,aAAAE;AAAA,QACT;AAAA,QACA,eAAe,UAAU;AAAA,MAC3B;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAyBO,IAAM,gBAAgB,CAAC,UAA8B;AAC1D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,EAAE,IAAI,sBAAsB,eAAe;AACnD,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAiB;AAE3D,QAAM,oBAAgB;AAAA,IACpB,CAAC,UAAyB;AACxB,UAAI,MAAM,QAAQ,WAAW;AAC3B,yBAAiB,CAAC,gBAAgB;AAChC,cAAI,gBAAgB,OAAW,QAAO;AACtC,iBAAO,gBAAgB,IAAI,QAAQ,SAAS,IAAI,cAAc;AAAA,QAChE,CAAC;AAAA,MACH;AAEA,UAAI,MAAM,QAAQ,aAAa;AAC7B,yBAAiB,CAAC,gBAAgB;AAChC,cAAI,gBAAgB,OAAW,QAAO;AACtC,iBAAO,gBAAgB,QAAQ,SAAS,IAAI,IAAI,cAAc;AAAA,QAChE,CAAC;AAAA,MACH;AAEA,UAAI,MAAM,QAAQ,SAAS;AACzB,cAAM,eAAe;AACrB,yBAAiB,CAAC,gBAAgB;AAChC,cAAI,OAAO,gBAAgB,aAAa;AACtC,yBAAa,QAAQ,WAAW,CAAC;AACjC,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,SAAS,YAAY;AAAA,EACxB;AAEA,gCAAU,MAAM;AACd,aAAS,iBAAiB,WAAW,eAAe,KAAK;AACzD,WAAO,MAAM,SAAS,oBAAoB,WAAW,aAAa;AAAA,EACpE,GAAG,CAAC,aAAa,CAAC;AAElB,MAAI,WAAW;AACb,WACE,+BAAAF,QAAA,cAAC,oBAAiB,gBACf,gBACC,+BAAAA,QAAA,cAAC,mBAAc,IAEf,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA;AAAA,MAEX,EAAE,cAAc;AAAA,IACnB,CAEJ;AAAA,EAEJ;AAEA,MAAI,CAAC,QAAQ,QAAQ;AACnB,WACE,+BAAAA,QAAA,cAAC,oBAAiB,gBAChB,+BAAAA,QAAA,cAAC,iBAAY,CACf;AAAA,EAEJ;AAEA,SACE,+BAAAA,QAAA,cAAC,oBAAiB,gBAChB,+BAAAA,QAAA,cAAC,uBAAoB,SAAkB,GACvC,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,CACF;AAEJ;;;ANtNA,IAAM,0BAA0B,CAAC,UAA8B;AAC7D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAAG;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,WAAAC,aAAY;AAAA,IACZ;AAAA,IACA,aAAAC,eAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,iBAAiB,mBAAmB;AAExC,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,aAAAC;AAAA,QACT;AAAA,QACA,eACI,oCACA;AAAA,QACJ;AAAA,UACE,0CAA0C,QAAQ,SAAS;AAAA,QAC7D;AAAA,MACF;AAAA,MACA,eAAY;AAAA;AAAA,IAEZ,+BAAAD,QAAA;AAAA,MAACF;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,oBAAoB;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAUD;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAaE;AAAA,QACb;AAAA;AAAA,IACF;AAAA,IAEC,SACC,+BAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEJ;AAOO,IAAM,gBAAgB,eAAAA,QAAM;AAAA,EACjC;AACF;;;AOnHA,IAAAE,iBAAkB;;;ACAlB,IAAAC,iBAAkB;AAEX,IAAM,aAAa,MACxB,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AACF;;;ADLF,IAAM,gCAAgC,CAAC,UAAoC;AACzE,QAAM,EAAE,SAAS,IAAI;AAErB,QAAM,EAAE,EAAE,IAAI,sBAAsB,qBAAqB;AAEzD,MAAI,aAAa,SAAU,QAAO;AAElC,MAAI,aAAa,WAAW;AAC1B,UAAMC,QAAO,EAAE,gCAAgC;AAC/C,WACE,+BAAAC,QAAA,6BAAAA,QAAA,gBACE,+BAAAA,QAAA,cAAC,SAAI,WAAU,kCACb,+BAAAA,QAAA,cAAC,gBAAW,GACZ,+BAAAA,QAAA,cAAC,OAAE,MAAK,cAAYD,KAAK,CAC3B,CACF;AAAA,EAEJ;AAEA,MAAI,aAAa,WAAW;AAC1B,UAAMA,QAAO,EAAE,yBAAoB;AACnC,WACE,+BAAAC,QAAA,cAAC,SAAI,WAAU,6BACb,+BAAAA,QAAA,cAAC,gBAAW,GACZ,+BAAAA,QAAA,cAAC,OAAE,WAAU,gCAA+B,MAAK,cAC9CD,KACH,CACF;AAAA,EAEJ;AAEA,SAAO,+BAAAC,QAAA,cAAC,WAAE,gBAAc;AAC1B;AAEO,IAAM,sBAAsB,eAAAA,QAAM;AAAA,EACvC;AACF;;;AE7CA,IAAAC,iBAAiC;;;ACAjC,IAAAC,iBAAiC;;;ACDjC,IAAAC,iBAAkB;AAElB,IAAM,iBAAiB,MACrB,+BAAAC,QAAA,cAAC,SAAI,WAAU,uCACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,4CAA2C,GAC1D,+BAAAA,QAAA,cAAC,SAAI,WAAU,2CACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,4CAA2C,GAC1D,+BAAAA,QAAA,cAAC,SAAI,WAAU,gDACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,0CAAyC,GACxD,+BAAAA,QAAA,cAAC,SAAI,WAAU,0CAAyC,CAC1D,CACF,CACF;AAGF,IAAM,sBAAsB,MAC1B,+BAAAA,QAAA,cAAC,SAAI,WAAU,iDACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,2CAA0C,GACzD,+BAAAA,QAAA,cAAC,SAAI,WAAU,0CAAyC,CAC1D;AAGF,IAAM,uBAAuB,MAC3B,+BAAAA,QAAA,cAAC,SAAI,WAAU,sCACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,2CAA0C,GACzD,+BAAAA,QAAA,cAAC,SAAI,WAAU,0CACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,yCAAwC,GACvD,+BAAAA,QAAA,cAAC,SAAI,WAAU,yCAAwC,CACzD,CACF;AAGK,IAAM,iBAAiB,MAC5B,+BAAAA,QAAA,cAAC,SAAI,WAAU,+BACb,+BAAAA,QAAA,cAAC,0BAAqB,GACtB,+BAAAA,QAAA,cAAC,SAAI,WAAU,4CACZ,MAAM,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,MAC5B,+BAAAA,QAAA,cAAC,kBAAe,KAAK,mBAAmB,CAAC,IAAI,CAC9C,CACH,GACA,+BAAAA,QAAA,cAAC,yBAAoB,CACvB;;;ACzCF,IAAAC,iBAAkB;AAYlB,IAAM,kCAAkC,CAAC,EAAE,MAAM,MAAkC;AACjF,QAAM,EAAE,EAAE,IAAI,sBAAsB,uBAAuB;AAE3D,MAAI,CAAC,MAAO,QAAO;AAEnB,SAAO,+BAAAC,QAAA,cAAC,aAAK,EAAE,6BAA6B,EAAE,cAAc,MAAM,QAAQ,CAAC,CAAE;AAC/E;AAEO,IAAM,wBAAwB,eAAAA,QAAM;AAAA,EACzC;AAAA,EACA,CAAC,WAAW,cAAc,UAAU,OAAO,YAAY,UAAU,OAAO;AAC1E;;;ACvBA,IAAAC,iBAAkB;AAUlB,IAAM,6BAA6B,CAAC,UAAiC;AACnE,QAAM,EAAE,OAAAC,SAAQ,WAAW,OAAO,GAAG,IAAI;AAEzC,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,eAAY;AAAA,MACZ,OAAO,EAAE,QAAQ,MAAM,OAAO,KAAK;AAAA;AAAA,IAEnC,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,QACP,OAAM;AAAA;AAAA,MAEN,+BAAAA,QAAA,cAAC,cACC,+BAAAA,QAAA,cAAC,oBAAe,IAAG,KAAI,IAAG,OAAM,IAAG,OAAM,IAAG,MAAK,IAAG,UAClD,+BAAAA,QAAA,cAAC,UAAK,QAAO,MAAK,WAAU,QAAO,aAAY,KAAI,GACnD,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAY;AAAA,UACZ,QAAO;AAAA,UACP,WAAWD;AAAA,UACX,aAAY;AAAA,UACZ,OAAO,EAAE,WAAWA,OAAM;AAAA;AAAA,MAC5B,CACF,CACF;AAAA,MACA,+BAAAC,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA,UACL,UAAS;AAAA;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEJ;AAKO,IAAM,mBAAmB,eAAAA,QAAM;AAAA,EACpC;AAAA,EACA,CAAC,WAAW,cACV,UAAU,UAAU,UAAU,SAAS,UAAU,SAAS,UAAU;AACxE;;;ACtDO,IAAM,mCAAmC,CAC9C,OACA,cACG;AACH,QAAM,QAAQ,CAAC,SAAS;AACtB,UAAM,CAAC,CAAC,SAAS,QAAQ,GAAG,CAAC,SAAS,QAAQ,CAAC,IAAI;AAAA,MACjD,OAAO,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;AAAA,MACzB,OAAO,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;AAAA,IAC3B;AAEA,QACG,OAAO,aAAa,eAAe,OAAO,aAAa,eACvD,OAAO,aAAa,eAAe,OAAO,aAAa,aACxD;AACA,cAAQ;AAAA,QACN,wBAAwB,SAAS,yBAAyB,OAAO,eAAe,OAAO;AAAA,MACzF;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AJDA,IAAM,2BAA2B,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA8C;AAC5C,QAAM,EAAE,EAAE,IAAI,sBAAsB,0BAA0B;AAE9D,QAAM,0BAA0B,YAAY,EAAE,WAAW;AACzD,QAAM,UAAU,OAAO,cAAc,cAAc,YAAY;AAE/D,gCAAU,MAAM;AACd,qCAAiC,CAAC,CAAC,EAAE,WAAW,GAAG,EAAE,UAAU,CAAC,CAAC,GAAG,gBAAgB;AAAA,EAEtF,GAAG,CAAC,CAAC;AAEL,SACE,+BAAAC,QAAA,cAAC,SAAI,WAAU,gCACb,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,yBAAyB;AAAA,MACvC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,UAAU;AAAA,MACV;AAAA;AAAA,IAEC,UAAU,+BAAAA,QAAA,cAAC,sBAAiB,IAAK;AAAA,EACpC,CACF;AAEJ;AAEO,IAAM,iBAAiB,eAAAA,QAAM;AAAA,EAClC;AACF;;;ADpCO,IAAM,8BAA8B,CACzC,UACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAAC,kBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,eAAe,OAAO,cAAc,cAAc,YAAY;AAEpE,gCAAU,MAAM;AACd;AAAA,MACE,CAAC,CAAC,EAAE,WAAW,GAAG,EAAE,UAAU,CAAC,CAAC;AAAA,MAChC;AAAA,IACF;AAAA,EAEF,GAAG,CAAC,CAAC;AAEL,SACE,+BAAAC,QAAA,6BAAAA,QAAA,gBACG,CAAC,WAAW,UACZ,eAAe,+BAAAA,QAAA,cAACD,iBAAA,EAAe,WAAW,cAAc,SAAS,cAAc,GAC/E,WAAW,QACd;AAEJ;AAEO,IAAM,oBAAoB,eAAAC,QAAM;AAAA,EACrC;AACF;;;AnBFA,IAAM,kBAAkB,CAAC;AACzB,IAAM,kBAAkB,CAAC;AACzB,IAAM,eAAe,CAAC;AAEtB,IAAM,gCAAgC,CAAC,eAAsC;AAAA,EAC3E,gBAAgB,UAAU;AAC5B;AAqHA,IAAM,wBAAwB,CAAC,UAA4B;AACzD,QAAM;AAAA,IACJ;AAAA,IACA,yCAAyC;AAAA,IACzC,QAAAC,UAAS;AAAA,IACT;AAAA,IACA,eAAAC,iBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,qBAAAC,uBAAsB;AAAA,IACtB,UAAU,CAAC;AAAA,IACX,yBAAAC;AAAA,IACA,OAAO;AAAA,IACP,uBAAAC,yBAAwB;AAAA,IACxB,kBAAAC,oBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB,0BAA0B;AAAA,IAC1B,oBAAoB;AAAA,IACpB,OAAO;AAAA,IACP,WAAW,CAAC;AAAA,EACd,IAAI;AAEJ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,eAAe,aAAa;AAChC,QAAM,EAAE,OAAO,IAAI,oBAAoB;AACvC,QAAM,qBAAiB,uBAA8B,IAAI;AACzD,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,yBAAS,CAAC;AAC9D,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,KAAK;AAGtD,QAAM,EAAE,eAAe,IAAI;AAAA,IACzB,iBAAiB;AAAA,IACjB;AAAA,EACF;AAKA,QAAM,uBAAuB,OAC3BC,WACAC,iBACG;AACH,QAAI,CAACD,UAAS,QAAQ;AACpB;AAAA,IACF;AAEA,QAAI,qBAAqB;AAEvB,UAAI,4BAA4BA,UAAS;AAAA,QACvC,CAAC,SAAS,KAAK,OAAO;AAAA,MACxB;AAEA,UAAI,CAAC,2BAA2B;AAC9B,SAAC,yBAAyB,IAAI,MAAM,OAAO,cAAc;AAAA,UACvD,IAAI;AAAA,QACN,CAAC;AAAA,MACH;AAEA,UAAI,2BAA2B;AAC7B,yBAAiB,2BAA2B,QAAQ;AAEpD,cAAM,cAAc,mBAAmB;AAAA,UACrC,UAAAA;AAAA,UACA,eAAe;AAAA,UACf;AAAA,QACF,CAAC;AAED,QAAAC,aAAY,WAAW;AAAA,MACzB;AAEA;AAAA,IACF;AAEA,QAAI,yBAAyB;AAC3B,uBAAiBD,UAAS,CAAC,GAAG,QAAQ;AAAA,IACxC;AAAA,EACF;AAMA,QAAM,kBAAc,4BAAY,MAAM,sBAAsB,CAAC,UAAU,QAAQ,CAAC,GAAG,CAAC,CAAC;AAErF,QAAM,eAAW;AAAA,IACf,CAAC,UAA+C;AAC9C,sBAAgB,CAAC,CAAC,MAAM,OAAO,KAAK;AAEpC,oCAA8B,WAAW,KAAK;AAAA,IAChD;AAAA,IACA,CAAC,4BAA4B;AAAA,EAC/B;AAEA,QAAM,mBAAe,4BAAY,MAAM;AACrC,oBAAgB,KAAK;AACrB,kCAA8B,eAAe;AAAA,EAC/C,GAAG,CAAC,4BAA4B,CAAC;AAEjC,QAAM,EAAE,UAAU,aAAa,cAAc,YAAY,IAAI;AAAA,IAC3D;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,iBAAiB,wBACnB,sBAAsB,QAAQ,IAC9B;AAEJ,sBAAoB,gBAAgB,SAAS,cAAc;AAE3D,QAAM,EAAE,eAAe,eAAe,IAAI,wBAAwB;AAAA,IAChE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA,EAGF,CAAC;AAED,sBAAoB,iBAAiB,cAAc;AAGnD,iCAA+B,WAAW;AAE1C,gCAAU,MAAM;AACd,UAAM,cAAc,CAAC,UAAiB;AACpC,UAAI,MAAM,QAAQ,SAAS,KAAK;AAC9B,yBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,GAAG,mBAAmB,WAAW;AACxC,WAAO,GAAG,kBAAkB,WAAW;AAEvC,WAAO,MAAM;AACX,aAAO,IAAI,mBAAmB,WAAW;AACzC,aAAO,IAAI,kBAAkB,WAAW;AAAA,IAC1C;AAAA,EAEF,GAAG,CAAC,SAAS,GAAG,CAAC;AAEjB,QAAM,gBAAgB,CAAC,SAAkB;AACvC,UAAM,eAAe;AAAA,MACnB,eAAe;AAAA,MACf,QAAAN;AAAA,MACA,SAAS;AAAA;AAAA,MAET;AAAA,MACA,yBAAAG;AAAA,MACA,KAAK,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,+BAAAK,QAAA,cAAC,kBAAgB,GAAG,cAAc;AAAA,EAC3C;AAEA,QAAM,YAAY;AAClB,QAAM,gBAAY,cAAAC;AAAA,IAChB,eAAe,QAAQ;AAAA,IACvB;AAAA,IACA,eAAe,eAAe,GAAG,SAAS,IAAI,SAAS;AAAA,IACvD;AAAA,MACE,2BACE,+BAA+B,UAAU,UAAU,MAAM,KAAK;AAAA,MAChE,CAAC,GAAG,SAAS,QAAQ,GAAG;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,kBACH,CAAC,gBAAgB,CAAC,kBAAmB,8BAA8B;AACtE,SACE,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,UAAU,aAAa,cAAc,YAAY;AAAA;AAAA,IAE1D,+BAAAA,QAAA,cAAC,SAAI,WAAsB,KAAK,kBAC7B,sBACE,SACC,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,4BAA4B,8BAA8B;AAAA,QAC1D,UAAU,8BAA8B;AAAA,QACxC,uBACE,8BAA8B;AAAA,QAEhC,aAAa,8BAA8B;AAAA;AAAA,IAC7C,IAEA,+BAAAA,QAAA;AAAA,MAACP;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACN,IAEH,mBACC,+BAAAO,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,mBAAmB;AAAA,QAC1B,gBAAgB,qBAAqB,iBAAiB;AAAA,QACtD,SACE,CAAC,CAAC,mBAAmB,mBACrB,CAAC,UAAU,eAAe,EAAE,SAAS,mBAAmB,eAAe;AAAA,QAEzE,uBAAuBJ;AAAA,QACvB,kBAAkBC;AAAA,QAClB;AAAA;AAAA,MAEC,CAAC,gBAAgB,SAChB,+BAAAG,QAAA,cAACN,sBAAA,EAAoB,UAAS,WAAU,IAExC,+BAAAM,QAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,WAAW,mBAAmB,oBAAoB;AAAA,UAClD;AAAA;AAAA,QAEC,iBACG,eAAe,gBAAgB,aAAa,IAC5C,eAAe,IAAI,CAACE,aAAY,cAAcA,QAAO,CAAC;AAAA,MAC5D;AAAA,IAEJ,CAEJ;AAAA,EACF;AAEJ;AAKO,IAAM,cAAc,eAAAF,QAAM;AAAA,EAC/B;AACF;;;AyBxbA,IAAAG,iBAA0B;AAKnB,IAAM,4BAA4B,CACvC,aACA,kBAIG;AACH,QAAM,EAAE,OAAO,IAAI,eAAe,2BAA2B;AAE7D,gCAAU,MAAM;AACd,UAAM,cAAc,CAAC,UAAiB;AACpC,UAAI,iBAAiB,OAAO,kBAAkB,YAAY;AACxD,sBAAc,aAAa,KAAK;AAAA,MAClC,OAAO;AACL,oBAAY,CAAC,aAAa;AACxB,gBAAM,eAAe,SAAS,UAAU,CAAC,YAAY,QAAQ,QAAQ,MAAM,GAAG;AAE9E,cAAI,eAAe,EAAG,QAAO,CAAC,GAAG,QAAQ;AAGzC,mBAAS,OAAO,cAAc,CAAC;AAE/B,iBAAO,CAAC,GAAG,QAAQ;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,GAAG,mBAAmB,WAAW;AAExC,WAAO,MAAM;AACX,aAAO,IAAI,mBAAmB,WAAW;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,QAAQ,eAAe,WAAW,CAAC;AACzC;;;ACtCA,IAAAC,iBAA0B;AAKnB,IAAM,2BAA2B,CACtC,aACA,kBAIG;AACH,QAAM,EAAE,OAAO,IAAI,eAAe,0BAA0B;AAE5D,gCAAU,MAAM;AACd,UAAM,cAAc,CAAC,UAAiB;AACpC,UAAI,iBAAiB,OAAO,kBAAkB,YAAY;AACxD,sBAAc,aAAa,KAAK;AAAA,MAClC,OAAO;AACL,oBAAY,CAAC,aAAa;AACxB,gBAAM,eAAe,SAAS,UAAU,CAAC,YAAY,QAAQ,QAAQ,MAAM,GAAG;AAC9E,cAAI,eAAe,EAAG,QAAO,CAAC,GAAG,QAAQ;AAGzC,mBAAS,OAAO,cAAc,CAAC;AAE/B,iBAAO,CAAC,GAAG,QAAQ;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,GAAG,kBAAkB,WAAW;AAEvC,WAAO,MAAM;AACX,aAAO,IAAI,kBAAkB,WAAW;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,QAAQ,eAAe,WAAW,CAAC;AACzC;;;ACrCA,IAAAC,iBAA0B;AAMnB,IAAM,8BAA8B,CACzC,aACA,eAIA,gBACG;AACH,QAAM,EAAE,OAAO,IAAI,eAAe,6BAA6B;AAE/D,gCAAU,MAAM;AACd,UAAM,cAAc,CAAC,UAAiB;AACpC,kBAAY,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;AAEvC,UAAI,iBAAiB,OAAO,kBAAkB,YAAY;AACxD,sBAAc,aAAa,KAAK;AAAA,MAClC;AACA,UAAI,aAAa;AACf,oBAAY;AAAA,MACd;AAAA,IACF;AAEA,WAAO,GAAG,qBAAqB,WAAW;AAE1C,WAAO,MAAM;AACX,aAAO,IAAI,qBAAqB,WAAW;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,QAAQ,eAAe,aAAa,WAAW,CAAC;AACtD;;;AClCA,IAAAC,iBAA0B;AAMnB,IAAM,4BAA4B,CACvC,aACA,eAIA,gBACG;AACH,QAAM,EAAE,OAAO,IAAI,eAAe,2BAA2B;AAE7D,gCAAU,MAAM;AACd,UAAM,cAAc,CAAC,UAAiB;AACpC,kBAAY,CAAC,aAAa;AACxB,cAAM,eAAe,SAAS;AAAA,UAC5B,CAAC,YAAY,QAAQ,QAAQ,MAAM,SAAS;AAAA,QAC9C;AAEA,YAAI,eAAe,MAAM,MAAM,SAAS;AACtC,gBAAM,cAAc;AACpB,sBAAY,YAAY,EAAE,OAAO;AAAA,YAC/B,GAAG,MAAM;AAAA,YACT,QAAQ,MAAM,SAAS,UAAU,YAAY,YAAY,EAAE,MAAM;AAAA,YACjE,kBACE,MAAM,SAAS,oBACf,YAAY,YAAY,EAAE,MAAM;AAAA,UACpC;AAEA,iBAAO,CAAC,GAAG,WAAW;AAAA,QACxB;AAEA,eAAO;AAAA,MACT,CAAC;AACD,UAAI,aAAa;AACf,oBAAY;AAAA,MACd;AACA,UAAI,iBAAiB,OAAO,kBAAkB,YAAY;AACxD,sBAAc,aAAa,KAAK;AAAA,MAClC;AAAA,IACF;AAEA,WAAO,GAAG,mBAAmB,WAAW;AAExC,WAAO,MAAM;AACX,aAAO,IAAI,mBAAmB,WAAW;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,QAAQ,eAAe,aAAa,WAAW,CAAC;AACtD;;;ACpDA,IAAAC,iBAA0B;AAC1B,IAAAC,iBAAmB;AAQZ,IAAM,4BAA4B,CACvC,aACA,kBAIG;AACH,QAAM,EAAE,OAAO,IAAI,eAAe,2BAA2B;AAE7D,gCAAU,MAAM;AACd,UAAM,cAAc,OAAO,UAAiB;AAC1C,UAAI,iBAAiB,OAAO,kBAAkB,YAAY;AACxD,sBAAc,aAAa,KAAK;AAAA,MAClC,WAAW,MAAM,QAAQ,MAAM,gBAAgB,MAAM,YAAY;AAC/D,cAAM,UAAU,MAAM,WAAW;AAAA,UAC/B;AAAA,UACA,IAAI,MAAM;AAAA,UACV,MAAM,MAAM;AAAA,QACd,CAAC;AACD,oBAAY,CAAC,iBAAa,eAAAC,SAAO,CAAC,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;AAAA,MACjE;AAAA,IACF;AAEA,WAAO,GAAG,mBAAmB,WAAW;AAExC,WAAO,MAAM;AACX,aAAO,IAAI,mBAAmB,WAAW;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,QAAQ,eAAe,WAAW,CAAC;AACzC;;;ACtCA,IAAAC,iBAA0B;AAC1B,IAAAC,iBAAmB;AAQZ,IAAM,wBAAwB,CACnC,aACA,eAIA,mBAAmB,OACnB,yCAAyC,SACtC;AACH,QAAM,EAAE,OAAO,IAAI,eAAe,uBAAuB;AAEzD,gCAAU,MAAM;AACd,UAAM,cAAc,CAAC,UAAiB;AACpC,UAAI,iBAAiB,OAAO,kBAAkB,YAAY;AACxD,sBAAc,aAAa,KAAK;AAAA,MAClC,OAAO;AACL,oBAAY,CAAC,aAAa;AACxB,gBAAM,gBACJ,SAAS,OAAO,CAAC,YAAY,QAAQ,QAAQ,MAAM,GAAG,EAAE,SAAS;AAEnE,cACE,CAAC,iBACD,0CACA,MAAM,cACN;AACA,kBAAM,UAAU,OAAO,QAAQ,MAAM,cAAc,MAAM,UAAU;AACnE,uBAAO,eAAAC,SAAO,CAAC,SAAS,GAAG,QAAQ,GAAG,KAAK;AAAA,UAC7C;AAEA,cAAI,CAAC,iBAAkB,QAAO,cAAc,EAAE,UAAU,KAAK,MAAM,OAAO,GAAG,CAAC;AAE9E,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,GAAG,eAAe,WAAW;AAEpC,WAAO,MAAM;AACX,aAAO,IAAI,eAAe,WAAW;AAAA,IACvC;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;ACzDA,IAAAC,iBAA0B;AAC1B,IAAAC,iBAAmB;AAQZ,IAAM,wCAAwC,CACnD,aACA,eAIA,yCAAyC,SACtC;AACH,QAAM,EAAE,OAAO,IAAI,eAAe,uCAAuC;AAEzE,gCAAU,MAAM;AACd,UAAM,cAAc,OAAO,UAAiB;AAC1C,UAAI,iBAAiB,OAAO,kBAAkB,YAAY;AACxD,sBAAc,aAAa,KAAK;AAAA,MAClC,WAAW,0CAA0C,MAAM,SAAS,MAAM;AACxE,cAAM,UAAU,MAAM,WAAW;AAAA,UAC/B;AAAA,UACA,IAAI,MAAM,QAAQ;AAAA,UAClB,SAAS,MAAM,QAAQ,SAAS,OAAiB,CAAC,KAAK,EAAE,MAAM,QAAQ,MAAM;AAC3E,kBAAM,SAAS,WAAW,MAAM;AAChC,gBAAI,QAAQ;AACV,kBAAI,KAAK,MAAM;AAAA,YACjB;AACA,mBAAO;AAAA,UACT,GAAG,CAAC,CAAC;AAAA,UACL,MAAM,MAAM,QAAQ;AAAA,QACtB,CAAC;AACD,oBAAY,CAAC,iBAAa,eAAAC,SAAO,CAAC,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;AAAA,MACjE;AAAA,IACF;AAEA,WAAO,GAAG,iCAAiC,WAAW;AAEtD,WAAO,MAAM;AACX,aAAO,IAAI,iCAAiC,WAAW;AAAA,IACzD;AAAA,EACF,GAAG,CAAC,wCAAwC,QAAQ,eAAe,WAAW,CAAC;AACjF;;;AC9CA,IAAAC,iBAA0B;AAC1B,IAAAC,kBAAmB;AAQZ,IAAM,oCAAoC,CAC/C,aACA,eAIA,yCAAyC,SACtC;AACH,QAAM,EAAE,OAAO,IAAI,eAAe,mCAAmC;AAErE,gCAAU,MAAM;AACd,UAAM,cAAc,OAAO,UAAiB;AAC1C,UAAI,iBAAiB,OAAO,kBAAkB,YAAY;AACxD,sBAAc,aAAa,KAAK;AAAA,MAClC,WAAW,0CAA0C,MAAM,SAAS,MAAM;AACxE,cAAM,UAAU,MAAM,WAAW;AAAA,UAC/B;AAAA,UACA,IAAI,MAAM,QAAQ;AAAA,UAClB,MAAM,MAAM,QAAQ;AAAA,QACtB,CAAC;AACD,oBAAY,CAAC,iBAAa,gBAAAC,SAAO,CAAC,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;AAAA,MACjE;AAAA,IACF;AAEA,WAAO,GAAG,4BAA4B,WAAW;AAEjD,WAAO,MAAM;AACX,aAAO,IAAI,4BAA4B,WAAW;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,wCAAwC,QAAQ,eAAe,WAAW,CAAC;AACjF;;;ACvCA,IAAAC,iBAA0B;AAMnB,IAAM,4CAA4C,CACvD,aACA,kBAIG;AACH,QAAM,EAAE,OAAO,IAAI,eAAe,2CAA2C;AAE7E,gCAAU,MAAM;AACd,UAAM,cAAc,CAAC,UAAiB;AACpC,UAAI,iBAAiB,OAAO,kBAAkB,YAAY;AACxD,sBAAc,aAAa,KAAK;AAAA,MAClC,OAAO;AACL;AAAA,UAAY,CAAC,aACX,SAAS,OAAO,CAAC,YAAY,QAAQ,QAAQ,MAAM,SAAS,GAAG;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAEA,WAAO,GAAG,qCAAqC,WAAW;AAE1D,WAAO,MAAM;AACX,aAAO,IAAI,qCAAqC,WAAW;AAAA,IAC7D;AAAA,EACF,GAAG,CAAC,QAAQ,eAAe,WAAW,CAAC;AACzC;;;AChCA,IAAAC,iBAA0B;AAMnB,IAAM,iCAAiC,CAC5C,gBACG;AACH,QAAM,EAAE,OAAO,IAAI,eAAe,gCAAgC;AAElE,gCAAU,MAAM;AACd,UAAM,cAAc,CAAC,UAAiB;AACpC,kBAAY,CAAC,aAAa;AACxB,cAAM,cAAc,SAAS,IAAI,CAAC,YAAY;AAC5C,cAAI,CAAC,MAAM,MAAM,MAAM,CAAC,QAAQ,MAAM,QAAQ,MAAM,KAAK,EAAE,GAAG;AAC5D,mBAAO;AAAA,UACT;AAEA,gBAAM,aAAa;AACnB,qBAAW,MAAM,QAAQ,MAAM,KAAK,EAAE,EAAE,OAAO,MAAM;AAErD,iBAAO;AAAA,QACT,CAAC;AAED,eAAO,CAAC,GAAG,WAAW;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,WAAO,GAAG,yBAAyB,WAAW;AAE9C,WAAO,MAAM;AACX,aAAO,IAAI,yBAAyB,WAAW;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,QAAQ,WAAW,CAAC;AAC1B;;;ACnCA,IAAAC,iBAA4B;AAC5B,IAAAC,eAAqC;AAIrC,IAAMC,QAAO,MAAM;AAAC;AAYb,SAAS,wBAA2B;AAAA,EACzC;AAAA,EACA,UAAAC;AAAA,EACA,uBAAuB,CAAC,KAAK;AAC/B,GAIkB;AAChB,QAAM,gBAAY;AAAA,IAChB,CAAC,kBAAsC;AACrC,UAAI,CAAC,QAAS,QAAOD;AAErB,YAAM,gBAAgB,qBAAqB;AAAA,QAAI,CAAC,OAC9C,QAAQ,GAAG,IAAI,MAAM;AACnB,wBAAcC,UAAS,OAAO,CAAC;AAAA,QACjC,CAAC;AAAA,MACH;AAEA,aAAO,MAAM,cAAc,QAAQ,CAAC,iBAAiB,aAAa,YAAY,CAAC;AAAA,IACjF;AAAA,IACA,CAAC,SAASA,WAAU,oBAAoB;AAAA,EAC1C;AAEA,QAAM,kBAAc,4BAAY,MAAM;AACpC,QAAI,CAAC,QAAS,QAAO;AAErB,WAAOA,UAAS,OAAO;AAAA,EACzB,GAAG,CAAC,SAASA,SAAQ,CAAC;AAEtB,aAAO,mCAAqB,WAAW,WAAW;AACpD;;;AC7CA,IAAM,WAAW,CAAC,MAAe,EAAE,MAAM;AACzC,IAAM,OAAqB,CAAC,gBAAgB;AAMrC,SAAS,0BAA0B,SAAmB;AAC3D,SAAO,wBAAwB,EAAE,SAAS,UAAU,sBAAsB,KAAK,CAAC;AAClF;;;ACZA,IAAAC,iBAAkB;AAGX,IAAMC,QAAO;AAAA,EAClB,YAAY,CAAC,UACX,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,SAAQ;AAAA,MACR,OAAM;AAAA,MACL,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA,cAAC,UAAK,GAAE,+RAA8R;AAAA,EACxS;AAAA,EAEF,KAAK,CAAC,UACJ,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,SAAQ;AAAA,MACR,OAAM;AAAA,MACL,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA,cAAC,UAAK,GAAE,gWAA+V;AAAA,EACzW;AAEJ;;;AtCdO,SAAS,4BAA4B;AAAA,EAC1C;AACF,GAAqC;AACnC,QAAM,aAAa,0BAA0B,OAAO;AACpD,QAAM,EAAE,EAAE,IAAI,sBAAsB;AAEpC,SACE,+BAAAC,QAAA,cAAC,SAAI,WAAU,+CACb,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,WAAW,YAAY,EAAE,OAAO,IAAI,EAAE,KAAK;AAAA,MACvD,eAAW,cAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA,WAAW,aAAa;AAAA,MAC1B;AAAA,MACA,SAAS,CAAC,MAAM;AACd,UAAE,gBAAgB;AAClB,YAAI,WAAW,WAAW;AACxB,kBAAQ,MAAM;AAAA,QAChB,OAAO;AACL,kBAAQ,IAAI;AAAA,QACd;AAAA,MACF;AAAA,MACA,OAAO,WAAW,YAAY,EAAE,OAAO,IAAI,EAAE,KAAK;AAAA;AAAA,IAElD,+BAAAD,QAAA,cAACE,MAAK,KAAL,IAAS;AAAA,EACZ,GACA,+BAAAF,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,WAAW,cAAc,EAAE,WAAW,IAAI,EAAE,SAAS;AAAA,MACjE,eAAW,cAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA,WAAW,eAAe;AAAA,MAC5B;AAAA,MACA,SAAS,CAAC,MAAM;AACd,UAAE,gBAAgB;AAClB,YAAI,WAAW,aAAa;AAC1B,kBAAQ,UAAU;AAAA,QACpB,OAAO;AACL,kBAAQ,QAAQ;AAAA,QAClB;AAAA,MACF;AAAA,MACA,OAAO,WAAW,cAAc,EAAE,WAAW,IAAI,EAAE,SAAS;AAAA;AAAA,IAE5D,+BAAAD,QAAA,cAACE,MAAK,YAAL,IAAgB;AAAA,EACnB,CACF;AAEJ;;;ADpDA,IAAM,oCAAoC,CAAC,UAA0C;AACnF,QAAM;AAAA,IACJ;AAAA,IACA,QAAAC,UAAS;AAAA,IACT;AAAA,IACA,WAAW,kBAAkB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,6BAAAC,+BAA8B,4BAAmC,IACvE,oBAAoB;AAEtB,QAAM,2BAAuB,uBAAiC,IAAI;AAElE,QAAM,aACJ,gBAAgB,QAAQ,MAAM,SAAS,QAAQ,MAAM,SAAS,SAAS,CAAC,GAAG,MAAM;AAEnF,QAAM,kBAAkB,CAAC,MAA2C;AAClE,QAAI,uBAAuB;AACzB,4BAAsB,CAAC;AAAA,IACzB,WAAW,kBAAkB;AAC3B,uBAAiB,SAAS,QAAQ;AAAA,IACpC;AACA,QAAI,sBAAsB,SAAS;AACjC,2BAAqB,QAAQ,KAAK;AAAA,IACpC;AAAA,EACF;AAEA,SACE,+BAAAC,QAAA,cAAC,SAAI,WAAU,yCACb,+BAAAA,QAAA,cAACD,8BAAA,EAA4B,SAAkB,GAC/C,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,mBAAmB,gBAAgB,EAAE;AAAA,MACjD,iBAAe;AAAA,MACf,eAAW,cAAAC;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV,UAAU,UAAU,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,MACA,eAAY;AAAA,MACZ,SAAS;AAAA,MACT,KAAK;AAAA,MACL,MAAK;AAAA;AAAA,IAEL,+BAAAD,QAAA,cAAC,SAAI,WAAU,+CACb,+BAAAA,QAAA;AAAA,MAACF;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV;AAAA,QACA,OAAO;AAAA,QACP,MAAM;AAAA;AAAA,IACR,CACF;AAAA,IACA,+BAAAE,QAAA,cAAC,SAAI,WAAU,mCACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,6CACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,+CACb,+BAAAA,QAAA,cAAC,cAAM,YAAa,CACtB,GACC,CAAC,CAAC,UACD,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA;AAAA,MAEX;AAAA,IACH,CAEJ,GACA,+BAAAA,QAAA,cAAC,SAAI,WAAU,uDACZ,oBACH,CACF;AAAA,EACF,CACF;AAEJ;AAMO,IAAM,0BAA0B,eAAAA,QAAM;AAAA,EAC3C;AACF;;;AwCjGA,IAAAE,iBAAoC;AAM7B,IAAM,oBAAoB,CAAC,YAAqB;AACrD,QAAM,EAAE,OAAO,IAAI,eAAe,mBAAmB;AAErD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,QAAQ,WAAW,CAAC;AAEvD,gCAAU,MAAM;AACd,UAAM,cAAc,MAAM,SAAS,QAAQ,WAAW,CAAC;AAEvD,WAAO,GAAG,sCAAsC,WAAW;AAC3D,WAAO,MAAM,OAAO,IAAI,sCAAsC,WAAW;AAAA,EAE3E,GAAG,CAAC,KAAK,CAAC;AAEV,SAAO;AACT;;;ACpBA,IAAAC,kBAAoC;;;ACApC,IAAAC,kBAAkB;;;ACMX,SAAS,KAAK;AAAC;AAEf,SAAS,cAAc;AAAC;;;ACoDxB,SAAS,UAAU,QAAQ,SAAS;AACzC,QAAM,WAAW,WAAW,CAAC;AAG7B,QAAM,QAAQ,OAAO,OAAO,SAAS,CAAC,MAAM,KAAK,CAAC,GAAG,QAAQ,EAAE,IAAI;AAEnE,SAAO,MACJ;AAAA,KACE,SAAS,WAAW,MAAM,MACzB,OACC,SAAS,YAAY,QAAQ,KAAK;AAAA,EACvC,EACC,KAAK;AACV;;;AC/DA,IAAM,SAAS;AACf,IAAM,YAAY;AAGlB,IAAM,eAAe,CAAC;AA0Cf,SAAS,KAAKC,OAAM,SAAS;AAClC,QAAM,WAAW,WAAW;AAC5B,QAAMC,MAAK,SAAS,MAAM,YAAY;AACtC,SAAOA,IAAG,KAAKD,KAAI;AACrB;;;ACtDA,IAAM,KAAK;AAaJ,SAAS,WAAW,OAAO;AAChC,SAAO,OAAO,UAAU,WACpB,MAAM,SAAS,SACb,MAAM,MAAM,KAAK,IACjB,QACF,MAAM,KAAK;AACjB;AAMA,SAAS,MAAM,OAAO;AACpB,SAAO,MAAM,QAAQ,IAAI,EAAE,MAAM;AACnC;;;AC3BO,IAAM,SAAN,MAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlB,YAAY,UAAU,QAAQE,QAAO;AACnC,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,QAAIA,QAAO;AACT,WAAK,QAAQA;AAAA,IACf;AAAA,EACF;AACF;AAGA,OAAO,UAAU,WAAW,CAAC;AAE7B,OAAO,UAAU,SAAS,CAAC;AAE3B,OAAO,UAAU,QAAQ;;;ACflB,SAAS,MAAM,aAAaC,QAAO;AAExC,QAAM,WAAW,CAAC;AAElB,QAAM,SAAS,CAAC;AAChB,MAAIC,SAAQ;AAEZ,SAAO,EAAEA,SAAQ,YAAY,QAAQ;AACnC,WAAO,OAAO,UAAU,YAAYA,MAAK,EAAE,QAAQ;AACnD,WAAO,OAAO,QAAQ,YAAYA,MAAK,EAAE,MAAM;AAAA,EACjD;AAEA,SAAO,IAAI,OAAO,UAAU,QAAQD,MAAK;AAC3C;;;ACrBO,SAAS,UAAU,OAAO;AAC/B,SAAO,MAAM,YAAY;AAC3B;;;ACNO,IAAM,OAAN,MAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhB,YAAY,UAAU,WAAW;AAE/B,SAAK,WAAW;AAEhB,SAAK,YAAY;AAAA,EACnB;AACF;AAGA,KAAK,UAAU,QAAQ;AACvB,KAAK,UAAU,UAAU;AACzB,KAAK,UAAU,aAAa;AAC5B,KAAK,UAAU,oBAAoB;AACnC,KAAK,UAAU,SAAS;AACxB,KAAK,UAAU,iBAAiB;AAChC,KAAK,UAAU,iBAAiB;AAChC,KAAK,UAAU,wBAAwB;AACvC,KAAK,UAAU,kBAAkB;AACjC,KAAK,UAAU,UAAU;;;ACxBzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAI,SAAS;AAEN,IAAM,UAAU,UAAU;AAC1B,IAAM,aAAa,UAAU;AAC7B,IAAM,oBAAoB,UAAU;AACpC,IAAM,SAAS,UAAU;AACzB,IAAM,iBAAiB,UAAU;AACjC,IAAM,iBAAiB,UAAU;AACjC,IAAM,wBAAwB,UAAU;AAE/C,SAAS,YAAY;AACnB,SAAO,KAAK,EAAE;AAChB;;;ACPA,IAAM,SAAS,OAAO,KAAK,aAAK;AAEzB,IAAM,cAAN,cAA0B,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQpC,YAAY,UAAU,WAAW,MAAME,QAAO;AAC5C,QAAIC,SAAQ;AAEZ,UAAM,UAAU,SAAS;AAEzB,SAAK,MAAM,SAASD,MAAK;AAEzB,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,EAAEC,SAAQ,OAAO,QAAQ;AAC9B,cAAM,QAAQ,OAAOA,MAAK;AAC1B,aAAK,MAAM,OAAOA,MAAK,IAAI,OAAO,cAAM,KAAK,OAAO,cAAM,KAAK,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AACF;AAEA,YAAY,UAAU,UAAU;AAOhC,SAAS,KAAK,QAAQ,KAAK,OAAO;AAChC,MAAI,OAAO;AAET,WAAO,GAAG,IAAI;AAAA,EAChB;AACF;;;ACzBA,IAAM,MAAM,CAAC,EAAE;AAMR,SAAS,OAAOC,aAAY;AAEjC,QAAM,WAAW,CAAC;AAElB,QAAM,SAAS,CAAC;AAEhB,MAAI;AAEJ,OAAK,QAAQA,YAAW,YAAY;AAClC,QAAI,IAAI,KAAKA,YAAW,YAAY,IAAI,GAAG;AACzC,YAAM,QAAQA,YAAW,WAAW,IAAI;AACxC,YAAM,OAAO,IAAI;AAAA,QACf;AAAA,QACAA,YAAW,UAAUA,YAAW,cAAc,CAAC,GAAG,IAAI;AAAA,QACtD;AAAA,QACAA,YAAW;AAAA,MACb;AAEA,UACEA,YAAW,mBACXA,YAAW,gBAAgB,SAAS,IAAI,GACxC;AACA,aAAK,kBAAkB;AAAA,MACzB;AAEA,eAAS,IAAI,IAAI;AAEjB,aAAO,UAAU,IAAI,CAAC,IAAI;AAC1B,aAAO,UAAU,KAAK,SAAS,CAAC,IAAI;AAAA,IACtC;AAAA,EACF;AAEA,SAAO,IAAI,OAAO,UAAU,QAAQA,YAAW,KAAK;AACtD;;;ACvDO,IAAM,QAAQ,OAAO;AAAA,EAC1B,OAAO;AAAA,EACP,UAAU,GAAG,MAAM;AACjB,WAAO,WAAW,KAAK,MAAM,CAAC,EAAE,YAAY;AAAA,EAC9C;AAAA,EACA,YAAY;AAAA,IACV,cAAc;AAAA,IACd,cAAc;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AACF,CAAC;;;ACdM,IAAM,MAAM,OAAO;AAAA,EACxB,OAAO;AAAA,EACP,UAAU,GAAG,MAAM;AACjB,WAAO,SAAS,KAAK,MAAM,CAAC,EAAE,YAAY;AAAA,EAC5C;AAAA,EACA,YAAY,EAAC,SAAS,MAAM,SAAS,MAAM,UAAU,KAAI;AAC3D,CAAC;;;ACHM,SAAS,uBAAuB,YAAY,WAAW;AAC5D,SAAO,aAAa,aAAa,WAAW,SAAS,IAAI;AAC3D;;;ACAO,SAAS,yBAAyB,YAAY,UAAU;AAC7D,SAAO,uBAAuB,YAAY,SAAS,YAAY,CAAC;AAClE;;;ACNO,IAAM,QAAQ,OAAO;AAAA,EAC1B,OAAO;AAAA,EACP,YAAY,EAAC,YAAY,cAAa;AAAA,EACtC,WAAW;AAAA,EACX,YAAY,EAAC,OAAO,MAAM,YAAY,KAAI;AAC5C,CAAC;;;ACLM,IAAM,OAAO,OAAO;AAAA,EACzB,UAAU,GAAG,MAAM;AACjB,WAAO,SAAS,SAAS,OAAO,UAAU,KAAK,MAAM,CAAC,EAAE,YAAY;AAAA,EACtE;AAAA,EACA,YAAY;AAAA,IACV,sBAAsB;AAAA,IACtB,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,IACd,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,cAAc;AAAA,IACd,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,UAAU;AAAA,IACV,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,eAAe;AAAA,IACf,MAAM;AAAA,EACR;AACF,CAAC;;;AC/CM,IAAM,OAAO,OAAO;AAAA,EACzB,OAAO;AAAA,EACP,YAAY;AAAA,IACV,eAAe;AAAA,IACf,WAAW;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA,WAAW;AAAA,EACX,iBAAiB,CAAC,WAAW,YAAY,SAAS,UAAU;AAAA,EAC5D,YAAY;AAAA;AAAA,IAEV,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,gBAAgB;AAAA,IAChB,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,cAAc;AAAA,IACd,QAAQ,SAAS;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,KAAK;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,IACT,cAAc;AAAA,IACd,eAAe;AAAA,IACf,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,IAAI;AAAA,IACJ,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,KAAK;AAAA,IACL,UAAU;AAAA,IACV,KAAK;AAAA,IACL,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,IACd,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,2BAA2B;AAAA,IAC3B,UAAU;AAAA,IACV,WAAW;AAAA,IACX,UAAU;AAAA,IACV,cAAc;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,sBAAsB;AAAA,IACtB,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,IACT,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,KAAK;AAAA,IACL,UAAU;AAAA,IACV,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,0BAA0B;AAAA,IAC1B,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,MAAM;AAAA,IACN,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA;AAAA;AAAA,IAIN,OAAO;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,IACP,SAAS;AAAA;AAAA,IACT,MAAM;AAAA;AAAA,IACN,YAAY;AAAA;AAAA,IACZ,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,aAAa;AAAA;AAAA,IACb,cAAc;AAAA;AAAA,IACd,aAAa;AAAA;AAAA,IACb,aAAa;AAAA;AAAA,IACb,MAAM;AAAA;AAAA,IACN,SAAS;AAAA;AAAA,IACT,SAAS;AAAA;AAAA,IACT,OAAO;AAAA;AAAA,IACP,MAAM;AAAA;AAAA,IACN,UAAU;AAAA;AAAA,IACV,UAAU;AAAA;AAAA,IACV,OAAO;AAAA;AAAA,IACP,SAAS;AAAA;AAAA,IACT,SAAS;AAAA;AAAA,IACT,OAAO;AAAA;AAAA,IACP,MAAM;AAAA;AAAA,IACN,OAAO;AAAA;AAAA,IACP,aAAa;AAAA;AAAA,IACb,QAAQ;AAAA;AAAA,IACR,YAAY;AAAA;AAAA,IACZ,MAAM;AAAA;AAAA,IACN,UAAU;AAAA;AAAA,IACV,QAAQ;AAAA;AAAA,IACR,cAAc;AAAA;AAAA,IACd,aAAa;AAAA;AAAA,IACb,UAAU;AAAA;AAAA,IACV,QAAQ;AAAA;AAAA,IACR,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,QAAQ;AAAA;AAAA,IACR,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,KAAK;AAAA;AAAA,IACL,aAAa;AAAA;AAAA,IACb,OAAO;AAAA;AAAA,IACP,QAAQ;AAAA;AAAA,IACR,WAAW;AAAA;AAAA,IACX,SAAS;AAAA;AAAA,IACT,SAAS;AAAA;AAAA,IACT,MAAM;AAAA;AAAA,IACN,WAAW;AAAA;AAAA,IACX,WAAW;AAAA;AAAA,IACX,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,OAAO;AAAA;AAAA,IACP,QAAQ;AAAA;AAAA;AAAA,IAGR,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,uBAAuB;AAAA,IACvB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,cAAc;AAAA,EAChB;AACF,CAAC;;;ACrTM,IAAM,MAAM,OAAO;AAAA,EACxB,OAAO;AAAA,EACP,YAAY;AAAA,IACV,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,2BAA2B;AAAA,IAC3B,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,4BAA4B;AAAA,IAC5B,0BAA0B;AAAA,IAC1B,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,IACd,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,eAAe;AAAA,IACf,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,eAAe;AAAA,IACf,SAAS;AAAA,IACT,UAAU;AAAA,IACV,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,IACd,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,IACX,cAAc;AAAA,IACd,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,IACX,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,uBAAuB;AAAA,IACvB,wBAAwB;AAAA,IACxB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,IACV,cAAc;AAAA,IACd,eAAe;AAAA,IACf,cAAc;AAAA,IACd,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA;AAAA,IAET,eAAe;AAAA,IACf,eAAe;AAAA,EACjB;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,IACV,OAAO;AAAA,IACP,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,eAAe;AAAA,IACf,SAAS;AAAA,IACT,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,IACX,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,UAAU;AAAA,IACV,OAAO;AAAA,IACP,oBAAoB;AAAA,IACpB,2BAA2B;AAAA,IAC3B,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,UAAU;AAAA,IACV,eAAe;AAAA,IACf,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,KAAK;AAAA,IACL,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,2BAA2B;AAAA,IAC3B,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,4BAA4B;AAAA,IAC5B,0BAA0B;AAAA,IAC1B,UAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,IACd,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,WAAW;AAAA,IACX,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,WAAW;AAAA;AAAA,IACX,YAAY;AAAA;AAAA,IACZ,UAAU;AAAA;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,aAAa;AAAA,IACb,MAAM;AAAA,IACN,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,cAAc;AAAA,IACd,KAAK;AAAA,IACL,OAAO;AAAA,IACP,wBAAwB;AAAA,IACxB,uBAAuB;AAAA,IACvB,WAAW;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,eAAe;AAAA,IACf,SAAS;AAAA,IACT,UAAU;AAAA,IACV,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,IACd,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,IACX,cAAc;AAAA,IACd,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,IACX,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,UAAU;AAAA,IACV,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,uBAAuB;AAAA,IACvB,wBAAwB;AAAA,IACxB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,OAAO;AAAA,IACP,cAAc;AAAA,IACd,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO;AAAA,IACP,mBAAmB;AAAA,IACnB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,eAAe;AAAA,IACf,cAAc;AAAA,IACd,UAAU;AAAA,IACV,cAAc;AAAA,IACd,SAAS;AAAA,IACT,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,aAAa;AAAA,IACb,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,kBAAkB;AAAA,IAClB,SAAS;AAAA,IACT,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,kBAAkB;AAAA,IAClB,GAAG;AAAA,IACH,YAAY;AAAA,EACd;AACF,CAAC;;;AC9iBD,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,MAAM;AAOL,SAAS,KAAK,QAAQ,OAAO;AAClC,QAAM,SAAS,UAAU,KAAK;AAC9B,MAAI,OAAO;AACX,MAAI,OAAO;AAEX,MAAI,UAAU,OAAO,QAAQ;AAC3B,WAAO,OAAO,SAAS,OAAO,OAAO,MAAM,CAAC;AAAA,EAC9C;AAEA,MAAI,OAAO,SAAS,KAAK,OAAO,MAAM,GAAG,CAAC,MAAM,UAAU,MAAM,KAAK,KAAK,GAAG;AAE3E,QAAI,MAAM,OAAO,CAAC,MAAM,KAAK;AAE3B,YAAM,OAAO,MAAM,MAAM,CAAC,EAAE,QAAQ,MAAM,SAAS;AACnD,aAAO,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AAAA,IAC7D,OAAO;AAEL,YAAM,OAAO,MAAM,MAAM,CAAC;AAE1B,UAAI,CAAC,KAAK,KAAK,IAAI,GAAG;AACpB,YAAI,SAAS,KAAK,QAAQ,KAAK,KAAK;AAEpC,YAAI,OAAO,OAAO,CAAC,MAAM,KAAK;AAC5B,mBAAS,MAAM;AAAA,QACjB;AAEA,gBAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,KAAK,MAAM,KAAK;AAC7B;AAMA,SAAS,MAAM,IAAI;AACjB,SAAO,MAAM,GAAG,YAAY;AAC9B;AAMA,SAAS,UAAU,IAAI;AACrB,SAAO,GAAG,OAAO,CAAC,EAAE,YAAY;AAClC;;;AC1DO,IAAM,cAAc;AAAA,EACzB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AACd;;;ACXO,IAAMC,QAAO,MAAM,CAAC,KAAK,OAAO,OAAO,MAAM,IAAQ,GAAG,MAAM;AAC9D,IAAMC,OAAM,MAAM,CAAC,KAAK,OAAO,OAAO,MAAM,GAAO,GAAG,KAAK;;;ACI3D,SAASC,WAAU,QAAQ;AAChC,SAAO,OAAO,KAAK,GAAG,EAAE,KAAK;AAC/B;;;ACvBA,iBAA0B;AAG1B,IAAO,cAAQ,WAAAC,QAAc,WAAW,WAAAA;;;AC0BjC,IAAM,WAAW,MAAM,KAAK;AAU5B,IAAM,aAAa,MAAM,OAAO;AAUvC,SAAS,MAAM,MAAM;AACnB,SAAOC;AAQP,WAASA,OAAMC,OAAM;AACnB,UAAMD,SAASC,SAAQA,MAAK,YAAYA,MAAK,SAAS,IAAI,KAAM,CAAC;AAEjE,QACE,OAAOD,OAAM,SAAS,YACtBA,OAAM,OAAO,KACb,OAAOA,OAAM,WAAW,YACxBA,OAAM,SAAS,GACf;AACA,aAAO;AAAA,QACL,MAAMA,OAAM;AAAA,QACZ,QAAQA,OAAM;AAAA,QACd,QACE,OAAOA,OAAM,WAAW,YAAYA,OAAM,SAAS,KAC/CA,OAAM,SACN;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAUO,SAAS,SAASC,OAAM;AAC7B,QAAMC,SAAQ,WAAWD,KAAI;AAC7B,QAAM,MAAM,SAASA,KAAI;AAEzB,MAAIC,UAAS,KAAK;AAChB,WAAO,EAAC,OAAAA,QAAO,IAAG;AAAA,EACpB;AACF;;;AC1DO,SAAS,kBAAkB,OAAO;AAEvC,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAGA,MAAI,cAAc,SAAS,UAAU,OAAO;AAC1C,WAAOC,UAAS,MAAM,QAAQ;AAAA,EAChC;AAGA,MAAI,WAAW,SAAS,SAAS,OAAO;AACtC,WAAOA,UAAS,KAAK;AAAA,EACvB;AAGA,MAAI,UAAU,SAAS,YAAY,OAAO;AACxC,WAAOC,OAAM,KAAK;AAAA,EACpB;AAGA,SAAO;AACT;AAMA,SAASA,OAAMA,QAAO;AACpB,SAAO,MAAMA,UAASA,OAAM,IAAI,IAAI,MAAM,MAAMA,UAASA,OAAM,MAAM;AACvE;AAMA,SAASD,UAAS,KAAK;AACrB,SAAOC,OAAM,OAAO,IAAI,KAAK,IAAI,MAAMA,OAAM,OAAO,IAAI,GAAG;AAC7D;AAMA,SAAS,MAAM,OAAO;AACpB,SAAO,SAAS,OAAO,UAAU,WAAW,QAAQ;AACtD;;;ACvDO,IAAM,eAAN,cAA2B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwDtC,YAAY,eAAe,wBAAwB,QAAQ;AACzD,UAAM;AAEN,QAAI,OAAO,2BAA2B,UAAU;AAC9C,eAAS;AACT,+BAAyB;AAAA,IAC3B;AAGA,QAAI,SAAS;AAEb,QAAI,UAAU,CAAC;AACf,QAAI,cAAc;AAElB,QAAI,wBAAwB;AAE1B,UACE,UAAU,0BACV,YAAY,wBACZ;AACA,kBAAU,EAAC,OAAO,uBAAsB;AAAA,MAC1C,WAGE,WAAW,0BACX,SAAS,wBACT;AACA,kBAAU,EAAC,OAAO,uBAAsB;AAAA,MAC1C,WAES,UAAU,wBAAwB;AACzC,kBAAU;AAAA,UACR,WAAW,CAAC,sBAAsB;AAAA,UAClC,OAAO,uBAAuB;AAAA,QAChC;AAAA,MACF,OAEK;AACH,kBAAU,EAAC,GAAG,uBAAsB;AAAA,MACtC;AAAA,IACF;AAEA,QAAI,OAAO,kBAAkB,UAAU;AACrC,eAAS;AAAA,IACX,WAES,CAAC,QAAQ,SAAS,eAAe;AACxC,oBAAc;AACd,eAAS,cAAc;AACvB,cAAQ,QAAQ;AAAA,IAClB;AAEA,QAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,UAAU,OAAO,WAAW,UAAU;AACpE,YAAMC,SAAQ,OAAO,QAAQ,GAAG;AAEhC,UAAIA,WAAU,IAAI;AAChB,gBAAQ,SAAS;AAAA,MACnB,OAAO;AACL,gBAAQ,SAAS,OAAO,MAAM,GAAGA,MAAK;AACtC,gBAAQ,SAAS,OAAO,MAAMA,SAAQ,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,SAAS,QAAQ,aAAa,QAAQ,WAAW;AAC5D,YAAM,SAAS,QAAQ,UAAU,QAAQ,UAAU,SAAS,CAAC;AAE7D,UAAI,QAAQ;AACV,gBAAQ,QAAQ,OAAO;AAAA,MACzB;AAAA,IACF;AAEA,UAAMC,SACJ,QAAQ,SAAS,WAAW,QAAQ,QAChC,QAAQ,MAAM,QACd,QAAQ;AAQd,SAAK,YAAY,QAAQ,aAAa;AAOtC,SAAK,QAAQ,QAAQ,SAAS;AAO9B,SAAK,SAASA,SAAQA,OAAM,SAAS;AAWrC,SAAK,QAAQ;AAOb,SAAK;AAQL,SAAK,UAAU;AAOf,SAAK,OAAOA,SAAQA,OAAM,OAAO;AASjC,SAAK,OAAO,kBAAkB,QAAQ,KAAK,KAAK;AAOhD,SAAK,QAAQ,QAAQ,SAAS;AAO9B,SAAK,SAAS,KAAK;AAOnB,SAAK,SAAS,QAAQ,UAAU;AAOhC,SAAK,SAAS,QAAQ,UAAU;AAWhC,SAAK,QACH,eAAe,QAAQ,SAAS,OAAO,QAAQ,MAAM,UAAU,WAC3D,QAAQ,MAAM,QACd;AAYN,SAAK;AAOL,SAAK;AAOL,SAAK;AAUL,SAAK;AAAA,EAEP;AACF;AAEA,aAAa,UAAU,OAAO;AAC9B,aAAa,UAAU,OAAO;AAC9B,aAAa,UAAU,SAAS;AAChC,aAAa,UAAU,UAAU;AACjC,aAAa,UAAU,QAAQ;AAC/B,aAAa,UAAU,SAAS;AAChC,aAAa,UAAU,OAAO;AAC9B,aAAa,UAAU,YAAY;AACnC,aAAa,UAAU,QAAQ;AAC/B,aAAa,UAAU,QAAQ;AAC/B,aAAa,UAAU,QAAQ;AAC/B,aAAa,UAAU,SAAS;AAChC,aAAa,UAAU,SAAS;;;ACvShC,IAAMC,OAAM,CAAC,EAAE;AAGf,IAAM,WAAW,oBAAI,IAAI;AAEzB,IAAMC,OAAM;AACZ,IAAM,gBAAgB;AAatB,IAAM,gBAAgB,oBAAI,IAAI,CAAC,SAAS,SAAS,SAAS,SAAS,IAAI,CAAC;AAExE,IAAM,mBAAmB,oBAAI,IAAI,CAAC,MAAM,IAAI,CAAC;AAE7C,IAAM,OAAO;AAcN,SAAS,aAAa,MAAM,SAAS;AAC1C,MAAI,CAAC,WAAW,QAAQ,aAAa,QAAW;AAC9C,UAAM,IAAI,UAAU,gCAAgC;AAAA,EACtD;AAEA,QAAM,WAAW,QAAQ,YAAY;AAErC,MAAIC;AAEJ,MAAI,QAAQ,aAAa;AACvB,QAAI,OAAO,QAAQ,WAAW,YAAY;AACxC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,IAAAA,UAAS,kBAAkB,UAAU,QAAQ,MAAM;AAAA,EACrD,OAAO;AACL,QAAI,OAAO,QAAQ,QAAQ,YAAY;AACrC,YAAM,IAAI,UAAU,sCAAsC;AAAA,IAC5D;AAEA,QAAI,OAAO,QAAQ,SAAS,YAAY;AACtC,YAAM,IAAI,UAAU,uCAAuC;AAAA,IAC7D;AAEA,IAAAA,UAAS,iBAAiB,UAAU,QAAQ,KAAK,QAAQ,IAAI;AAAA,EAC/D;AAGA,QAAM,QAAQ;AAAA,IACZ,UAAU,QAAQ;AAAA,IAClB,WAAW,CAAC;AAAA,IACZ,YAAY,QAAQ,cAAc,CAAC;AAAA,IACnC,QAAAA;AAAA,IACA,0BAA0B,QAAQ,4BAA4B;AAAA,IAC9D,WAAW,QAAQ,kBAAkB,QAAQ,gBAAgB,IAAI;AAAA,IACjE;AAAA,IACA,oBAAoB,QAAQ,sBAAsB;AAAA,IAClD,UAAU,QAAQ,aAAa;AAAA,IAC/B,UAAU,QAAQ,YAAY;AAAA,IAC9B,QAAQ,QAAQ,UAAU,QAAQC,OAAMC;AAAA,IACxC,uBAAuB,QAAQ,yBAAyB;AAAA,IACxD,uBAAuB,QAAQ,0BAA0B;AAAA,EAC3D;AAEA,QAAM,SAAS,IAAI,OAAO,MAAM,MAAS;AAGzC,MAAI,UAAU,OAAO,WAAW,UAAU;AACxC,WAAO;AAAA,EACT;AAGA,SAAO,MAAM;AAAA,IACX;AAAA,IACA,MAAM;AAAA,IACN,EAAC,UAAU,UAAU,OAAS;AAAA,IAC9B;AAAA,EACF;AACF;AAcA,SAAS,IAAI,OAAOC,OAAM,KAAK;AAC7B,MAAIA,MAAK,SAAS,WAAW;AAC3B,WAAO,QAAQ,OAAOA,OAAM,GAAG;AAAA,EACjC;AAEA,MAAIA,MAAK,SAAS,uBAAuBA,MAAK,SAAS,qBAAqB;AAC1E,WAAO,cAAc,OAAOA,KAAI;AAAA,EAClC;AAEA,MAAIA,MAAK,SAAS,uBAAuBA,MAAK,SAAS,qBAAqB;AAC1E,WAAO,cAAc,OAAOA,OAAM,GAAG;AAAA,EACvC;AAEA,MAAIA,MAAK,SAAS,YAAY;AAC5B,WAAO,OAAO,OAAOA,KAAI;AAAA,EAC3B;AAEA,MAAIA,MAAK,SAAS,QAAQ;AACxB,WAAO,KAAK,OAAOA,OAAM,GAAG;AAAA,EAC9B;AAEA,MAAIA,MAAK,SAAS,QAAQ;AACxB,WAAO,KAAK,OAAOA,KAAI;AAAA,EACzB;AACF;AAcA,SAAS,QAAQ,OAAOA,OAAM,KAAK;AACjC,QAAM,eAAe,MAAM;AAC3B,MAAI,SAAS;AAEb,MAAIA,MAAK,QAAQ,YAAY,MAAM,SAAS,aAAa,UAAU,QAAQ;AACzE,aAASF;AACT,UAAM,SAAS;AAAA,EACjB;AAEA,QAAM,UAAU,KAAKE,KAAI;AAEzB,QAAM,OAAO,sBAAsB,OAAOA,MAAK,SAAS,KAAK;AAC7D,QAAM,QAAQ,mBAAmB,OAAOA,KAAI;AAC5C,MAAI,WAAW,eAAe,OAAOA,KAAI;AAEzC,MAAI,cAAc,IAAIA,MAAK,OAAO,GAAG;AACnC,eAAW,SAAS,OAAO,SAAU,OAAO;AAC1C,aAAO,OAAO,UAAU,WAAW,CAAC,WAAW,KAAK,IAAI;AAAA,IAC1D,CAAC;AAAA,EACH;AAEA,UAAQ,OAAO,OAAO,MAAMA,KAAI;AAChC,cAAY,OAAO,QAAQ;AAG3B,QAAM,UAAU,IAAI;AACpB,QAAM,SAAS;AAEf,SAAO,MAAM,OAAOA,OAAM,MAAM,OAAO,GAAG;AAC5C;AAYA,SAAS,cAAc,OAAOA,OAAM;AAClC,MAAIA,MAAK,QAAQA,MAAK,KAAK,UAAU,MAAM,WAAW;AACpD,UAAM,UAAUA,MAAK,KAAK;AAC1B,UAAM,aAAa,QAAQ,KAAK,CAAC;AACjC,OAAO,WAAW,SAAS,qBAAqB;AAGhD;AAAA;AAAA,MACE,MAAM,UAAU,mBAAmB,WAAW,UAAU;AAAA;AAAA,EAE5D;AAEA,cAAY,OAAOA,MAAK,QAAQ;AAClC;AAYA,SAAS,OAAO,OAAOA,OAAM;AAC3B,MAAIA,MAAK,QAAQA,MAAK,KAAK,UAAU,MAAM,WAAW;AAEpD;AAAA;AAAA,MACE,MAAM,UAAU,gBAAgBA,MAAK,KAAK,MAAM;AAAA;AAAA,EAEpD;AAEA,cAAY,OAAOA,MAAK,QAAQ;AAClC;AAcA,SAAS,cAAc,OAAOA,OAAM,KAAK;AACvC,QAAM,eAAe,MAAM;AAC3B,MAAI,SAAS;AAEb,MAAIA,MAAK,SAAS,SAAS,aAAa,UAAU,QAAQ;AACxD,aAASF;AACT,UAAM,SAAS;AAAA,EACjB;AAEA,QAAM,UAAU,KAAKE,KAAI;AAEzB,QAAM,OACJA,MAAK,SAAS,OACV,MAAM,WACN,sBAAsB,OAAOA,MAAK,MAAM,IAAI;AAClD,QAAM,QAAQ,sBAAsB,OAAOA,KAAI;AAC/C,QAAM,WAAW,eAAe,OAAOA,KAAI;AAE3C,UAAQ,OAAO,OAAO,MAAMA,KAAI;AAChC,cAAY,OAAO,QAAQ;AAG3B,QAAM,UAAU,IAAI;AACpB,QAAM,SAAS;AAEf,SAAO,MAAM,OAAOA,OAAM,MAAM,OAAO,GAAG;AAC5C;AAcA,SAAS,KAAK,OAAOA,OAAM,KAAK;AAE9B,QAAM,QAAQ,CAAC;AAEf,cAAY,OAAO,eAAe,OAAOA,KAAI,CAAC;AAE9C,SAAO,MAAM,OAAOA,OAAM,MAAM,UAAU,OAAO,GAAG;AACtD;AAYA,SAAS,KAAK,GAAGA,OAAM;AACrB,SAAOA,MAAK;AACd;AAgBA,SAAS,QAAQ,OAAO,OAAO,MAAMA,OAAM;AAEzC,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM,YAAY,MAAM,UAAU;AACzE,UAAM,OAAOA;AAAA,EACf;AACF;AAYA,SAAS,YAAY,OAAO,UAAU;AACpC,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,QAAQ,SAAS,SAAS,IAAI,WAAW,SAAS,CAAC;AAEzD,QAAI,OAAO;AACT,YAAM,WAAW;AAAA,IACnB;AAAA,EACF;AACF;AAYA,SAAS,iBAAiB,GAAGC,MAAKC,OAAM;AACtC,SAAOL;AAEP,WAASA,QAAOM,IAAG,MAAM,OAAO,KAAK;AAEnC,UAAM,mBAAmB,MAAM,QAAQ,MAAM,QAAQ;AACrD,UAAM,KAAK,mBAAmBD,QAAOD;AACrC,WAAO,MAAM,GAAG,MAAM,OAAO,GAAG,IAAI,GAAG,MAAM,KAAK;AAAA,EACpD;AACF;AAUA,SAAS,kBAAkB,UAAU,QAAQ;AAC3C,SAAOJ;AAEP,WAASA,QAAOG,OAAM,MAAM,OAAO,KAAK;AAEtC,UAAM,mBAAmB,MAAM,QAAQ,MAAM,QAAQ;AACrD,UAAMI,SAAQ,WAAWJ,KAAI;AAC7B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,cAAcI,SAAQA,OAAM,SAAS,IAAI;AAAA,QACzC,UAAU;AAAA,QACV,YAAYA,SAAQA,OAAM,OAAO;AAAA,MACnC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAYA,SAAS,mBAAmB,OAAOJ,OAAM;AAEvC,QAAM,QAAQ,CAAC;AAEf,MAAI;AAEJ,MAAI;AAEJ,OAAK,QAAQA,MAAK,YAAY;AAC5B,QAAI,SAAS,cAAcL,KAAI,KAAKK,MAAK,YAAY,IAAI,GAAG;AAC1D,YAAM,SAAS,eAAe,OAAO,MAAMA,MAAK,WAAW,IAAI,CAAC;AAEhE,UAAI,QAAQ;AACV,cAAM,CAAC,KAAK,KAAK,IAAI;AAErB,YACE,MAAM,yBACN,QAAQ,WACR,OAAO,UAAU,YACjB,iBAAiB,IAAIA,MAAK,OAAO,GACjC;AACA,uBAAa;AAAA,QACf,OAAO;AACL,gBAAM,GAAG,IAAI;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY;AAEd,UAAM;AAAA;AAAA,MAA8B,MAAM,UAAU,MAAM,QAAQ,CAAC;AAAA;AACnE,UAAM,MAAM,0BAA0B,QAAQ,eAAe,WAAW,IACtE;AAAA,EACJ;AAEA,SAAO;AACT;AAYA,SAAS,sBAAsB,OAAOA,OAAM;AAE1C,QAAM,QAAQ,CAAC;AAEf,aAAW,aAAaA,MAAK,YAAY;AACvC,QAAI,UAAU,SAAS,6BAA6B;AAClD,UAAI,UAAU,QAAQ,UAAU,KAAK,UAAU,MAAM,WAAW;AAC9D,cAAM,UAAU,UAAU,KAAK;AAC/B,cAAM,aAAa,QAAQ,KAAK,CAAC;AACjC,WAAO,WAAW,SAAS,qBAAqB;AAChD,cAAM,mBAAmB,WAAW;AACpC,WAAO,iBAAiB,SAAS,kBAAkB;AACnD,cAAM,WAAW,iBAAiB,WAAW,CAAC;AAC9C,WAAO,SAAS,SAAS,eAAe;AAExC,eAAO;AAAA,UACL;AAAA,UACA,MAAM,UAAU,mBAAmB,SAAS,QAAQ;AAAA,QACtD;AAAA,MACF,OAAO;AACL,oBAAY,OAAOA,MAAK,QAAQ;AAAA,MAClC;AAAA,IACF,OAAO;AAEL,YAAMK,QAAO,UAAU;AAEvB,UAAI;AAEJ,UAAI,UAAU,SAAS,OAAO,UAAU,UAAU,UAAU;AAC1D,YACE,UAAU,MAAM,QAChB,UAAU,MAAM,KAAK,UACrB,MAAM,WACN;AACA,gBAAM,UAAU,UAAU,MAAM,KAAK;AACrC,gBAAM,aAAa,QAAQ,KAAK,CAAC;AACjC,aAAO,WAAW,SAAS,qBAAqB;AAChD,kBAAQ,MAAM,UAAU,mBAAmB,WAAW,UAAU;AAAA,QAClE,OAAO;AACL,sBAAY,OAAOL,MAAK,QAAQ;AAAA,QAClC;AAAA,MACF,OAAO;AACL,gBAAQ,UAAU,UAAU,OAAO,OAAO,UAAU;AAAA,MACtD;AAGA,YAAMK,KAAI;AAAA,MAAuC;AAAA,IACnD;AAAA,EACF;AAEA,SAAO;AACT;AAYA,SAAS,eAAe,OAAOL,OAAM;AAEnC,QAAM,WAAW,CAAC;AAClB,MAAIM,SAAQ;AAIZ,QAAM,eAAe,MAAM,WAAW,oBAAI,IAAI,IAAI;AAElD,SAAO,EAAEA,SAAQN,MAAK,SAAS,QAAQ;AACrC,UAAM,QAAQA,MAAK,SAASM,MAAK;AAEjC,QAAI;AAEJ,QAAI,MAAM,UAAU;AAClB,YAAMD,QACJ,MAAM,SAAS,YACX,MAAM,UACN,MAAM,SAAS,uBACb,MAAM,SAAS,sBACf,MAAM,OACN;AAER,UAAIA,OAAM;AACR,cAAM,QAAQ,aAAa,IAAIA,KAAI,KAAK;AACxC,cAAMA,QAAO,MAAM;AACnB,qBAAa,IAAIA,OAAM,QAAQ,CAAC;AAAA,MAClC;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,OAAO,OAAO,GAAG;AACpC,QAAI,WAAW,OAAW,UAAS,KAAK,MAAM;AAAA,EAChD;AAEA,SAAO;AACT;AAcA,SAAS,eAAe,OAAO,MAAM,OAAO;AAC1C,QAAM,OAAO,KAAK,MAAM,QAAQ,IAAI;AAGpC,MACE,UAAU,QACV,UAAU,UACT,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK,GAChD;AACA;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AAGxB,YAAQ,KAAK,iBAAiB,UAAO,KAAK,IAAIE,WAAO,KAAK;AAAA,EAC5D;AAGA,MAAI,KAAK,aAAa,SAAS;AAC7B,QAAI,cACF,OAAO,UAAU,WAAW,QAAQ,WAAW,OAAO,OAAO,KAAK,CAAC;AAErE,QAAI,MAAM,0BAA0B,OAAO;AACzC,oBAAc,2BAA2B,WAAW;AAAA,IACtD;AAEA,WAAO,CAAC,SAAS,WAAW;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,MAAM,6BAA6B,WAAW,KAAK,QAC/C,YAAY,KAAK,QAAQ,KAAK,KAAK,WACnC,KAAK;AAAA,IACT;AAAA,EACF;AACF;AAcA,SAAS,WAAW,OAAO,OAAO;AAEhC,QAAM,SAAS,CAAC;AAEhB,MAAI;AACF,gBAAc,OAAO,QAAQ;AAAA,EAC/B,SAAS,OAAO;AACd,QAAI,CAAC,MAAM,oBAAoB;AAC7B,YAAM;AAAA;AAAA,QAA8B;AAAA;AACpC,YAAM,UAAU,IAAI,aAAa,kCAAkC;AAAA,QACjE,WAAW,MAAM;AAAA,QACjB;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AACD,cAAQ,OAAO,MAAM,YAAY;AACjC,cAAQ,MAAM,OAAO;AAErB,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AAaP,WAAS,SAASF,OAAMG,QAAO;AAC7B,QAAI,MAAMH;AAEV,QAAI,IAAI,MAAM,GAAG,CAAC,MAAM,MAAM;AAC5B,UAAI,IAAI,MAAM,GAAG,CAAC,MAAM,OAAQ,OAAM,QAAQ,IAAI,MAAM,CAAC;AACzD,YAAM,IAAI,QAAQ,eAAe,OAAO;AAAA,IAC1C;AAEA,WAAO,GAAG,IAAIG;AAAA,EAChB;AACF;AAcA,SAAS,sBAAsB,OAAOH,OAAM,iBAAiB;AAE3D,MAAI;AAEJ,MAAI,CAAC,iBAAiB;AACpB,aAAS,EAAC,MAAM,WAAW,OAAOA,MAAI;AAAA,EACxC,WAAWA,MAAK,SAAS,GAAG,GAAG;AAC7B,UAAM,cAAcA,MAAK,MAAM,GAAG;AAClC,QAAIC,SAAQ;AAEZ,QAAIN;AAEJ,WAAO,EAAEM,SAAQ,YAAY,QAAQ;AAEnC,YAAM,OAAO,KAAiB,YAAYA,MAAK,CAAC,IAC5C,EAAC,MAAM,cAAc,MAAM,YAAYA,MAAK,EAAC,IAC7C,EAAC,MAAM,WAAW,OAAO,YAAYA,MAAK,EAAC;AAC/C,MAAAN,QAAOA,QACH;AAAA,QACE,MAAM;AAAA,QACN,QAAQA;AAAA,QACR,UAAU;AAAA,QACV,UAAU,QAAQM,UAAS,KAAK,SAAS,SAAS;AAAA,QAClD,UAAU;AAAA,MACZ,IACA;AAAA,IACN;AAEA,OAAON,OAAM,iBAAiB;AAC9B,aAASA;AAAA,EACX,OAAO;AACL,aACE,KAAiBK,KAAI,KAAK,CAAC,SAAS,KAAKA,KAAI,IACzC,EAAC,MAAM,cAAc,MAAAA,MAAI,IACzB,EAAC,MAAM,WAAW,OAAOA,MAAI;AAAA,EACrC;AAIA,MAAI,OAAO,SAAS,WAAW;AAC7B,UAAMA;AAAA;AAAA,MAAmD,OAAO;AAAA;AAEhE,WAAOV,KAAI,KAAK,MAAM,YAAYU,KAAI,IAAI,MAAM,WAAWA,KAAI,IAAIA;AAAA,EACrE;AAGA,MAAI,MAAM,WAAW;AACnB,WAAO,MAAM,UAAU,mBAAmB,MAAM;AAAA,EAClD;AAEA,cAAY,KAAK;AACnB;AAOA,SAAS,YAAY,OAAO,OAAO;AACjC,QAAM,UAAU,IAAI;AAAA,IAClB;AAAA,IACA;AAAA,MACE,WAAW,MAAM;AAAA,MACjB;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,YAAY;AACjC,UAAQ,MAAM,OAAO;AAErB,QAAM;AACR;AAQA,SAAS,2BAA2B,WAAW;AAE7C,QAAM,YAAY,CAAC;AAEnB,MAAI;AAEJ,OAAK,QAAQ,WAAW;AACtB,QAAIV,KAAI,KAAK,WAAW,IAAI,GAAG;AAC7B,gBAAU,0BAA0B,IAAI,CAAC,IAAI,UAAU,IAAI;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO;AACT;AAQA,SAAS,0BAA0B,MAAM;AACvC,MAAI,KAAK,KAAK,QAAQC,MAAK,MAAM;AAEjC,MAAI,GAAG,MAAM,GAAG,CAAC,MAAM,MAAO,MAAK,MAAM;AACzC,SAAO;AACT;AAYA,SAAS,QAAQ,GAAG,IAAI;AACtB,SAAO,GAAG,YAAY;AACxB;AAUA,SAAS,OAAO,IAAI;AAClB,SAAO,MAAM,GAAG,YAAY;AAC9B;;;ACnzBO,IAAM,gBAAgB;AAAA,EAC3B,QAAQ,CAAC,MAAM;AAAA,EACf,MAAM,CAAC,cAAc,OAAO,OAAO,GAAG;AAAA,EACtC,MAAM,CAAC,QAAQ;AAAA,EACf,YAAY,CAAC,UAAU,OAAO;AAAA,EAC9B,MAAM,CAAC,KAAK,QAAQ,QAAQ,MAAM;AAAA,EAClC,MAAM,CAAC,UAAU;AAAA,EACjB,QAAQ;AAAA,EACR,UAAU,CAAC,MAAM;AAAA,EACjB,MAAM,CAAC,KAAK,MAAM;AAAA,EAClB,QAAQ,CAAC,OAAO;AAAA,EAChB,KAAK;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACkEA,yBAAkC;;;ACpFlC,IAAMa,gBAAe,CAAC;AAef,SAAS,SAAS,OAAO,SAAS;AACvC,QAAM,WAAW,WAAWA;AAC5B,QAAM,kBACJ,OAAO,SAAS,oBAAoB,YAChC,SAAS,kBACT;AACN,QAAM,cACJ,OAAO,SAAS,gBAAgB,YAAY,SAAS,cAAc;AAErE,SAAOC,KAAI,OAAO,iBAAiB,WAAW;AAChD;AAcA,SAASA,KAAI,OAAO,iBAAiB,aAAa;AAChD,MAAI,KAAK,KAAK,GAAG;AACf,QAAI,WAAW,OAAO;AACpB,aAAO,MAAM,SAAS,UAAU,CAAC,cAAc,KAAK,MAAM;AAAA,IAC5D;AAEA,QAAI,mBAAmB,SAAS,SAAS,MAAM,KAAK;AAClD,aAAO,MAAM;AAAA,IACf;AAEA,QAAI,cAAc,OAAO;AACvB,aAAO,IAAI,MAAM,UAAU,iBAAiB,WAAW;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,IAAI,OAAO,iBAAiB,WAAW;AAAA,EAChD;AAEA,SAAO;AACT;AAcA,SAAS,IAAI,QAAQ,iBAAiB,aAAa;AAEjD,QAAM,SAAS,CAAC;AAChB,MAAIC,SAAQ;AAEZ,SAAO,EAAEA,SAAQ,OAAO,QAAQ;AAC9B,WAAOA,MAAK,IAAID,KAAI,OAAOC,MAAK,GAAG,iBAAiB,WAAW;AAAA,EACjE;AAEA,SAAO,OAAO,KAAK,EAAE;AACvB;AAUA,SAAS,KAAK,OAAO;AACnB,SAAO,QAAQ,SAAS,OAAO,UAAU,QAAQ;AACnD;;;ACtGO,IAAM,oBAAoB;AAAA,EAC/B,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,eAAe;AAAA,EACf,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,sBAAsB;AAAA,EACtB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,KAAK;AAAA,EACL,KAAK;AAAA,EACL,WAAW;AAAA,EACX,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,iCAAiC;AAAA,EACjC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,eAAe;AAAA,EACf,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,0BAA0B;AAAA,EAC1B,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,KAAK;AAAA,EACL,KAAK;AAAA,EACL,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,cAAc;AAAA,EACd,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,aAAa;AAAA,EACb,WAAW;AAAA,EACX,KAAK;AAAA,EACL,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,KAAK;AAAA,EACL,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,cAAc;AAAA,EACd,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,eAAe;AAAA,EACf,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,WAAW;AAAA,EACX,eAAe;AAAA,EACf,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,KAAK;AAAA,EACL,KAAK;AAAA,EACL,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,cAAc;AAAA,EACd,aAAa;AAAA,EACb,MAAM;AAAA,EACN,KAAK;AAAA,EACL,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,OAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,UAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,UAAU;AAAA,EACV,KAAK;AAAA,EACL,KAAK;AAAA,EACL,UAAU;AAAA,EACV,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,WAAW;AAAA,EACX,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,WAAW;AAAA,EACX,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,aAAa;AAAA,EACb,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,OAAO;AAAA,EACP,KAAK;AAAA,EACL,SAAS;AAAA,EACT,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA,EACb,cAAc;AAAA,EACd,eAAe;AAAA,EACf,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,eAAe;AAAA,EACf,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,WAAW;AAAA,EACX,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,WAAW;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,cAAc;AAAA,EACd,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,eAAe;AAAA,EACf,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,eAAe;AAAA,EACf,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACR;;;ACjlEA,IAAMC,OAAM,CAAC,EAAE;AAaR,SAAS,8BAA8B,OAAO;AACnD,SAAOA,KAAI,KAAK,mBAAmB,KAAK,IAAI,kBAAkB,KAAK,IAAI;AACzE;;;ACKO,SAAS,OAAOC,OAAMC,QAAO,QAAQ,OAAO;AACjD,QAAM,MAAMD,MAAK;AACjB,MAAI,aAAa;AAEjB,MAAI;AAGJ,MAAIC,SAAQ,GAAG;AACb,IAAAA,SAAQ,CAACA,SAAQ,MAAM,IAAI,MAAMA;AAAA,EACnC,OAAO;AACL,IAAAA,SAAQA,SAAQ,MAAM,MAAMA;AAAA,EAC9B;AACA,WAAS,SAAS,IAAI,SAAS;AAG/B,MAAI,MAAM,SAAS,KAAO;AACxB,iBAAa,MAAM,KAAK,KAAK;AAC7B,eAAW,QAAQA,QAAO,MAAM;AAEhC,IAAAD,MAAK,OAAO,GAAG,UAAU;AAAA,EAC3B,OAAO;AAEL,QAAI,OAAQ,CAAAA,MAAK,OAAOC,QAAO,MAAM;AAGrC,WAAO,aAAa,MAAM,QAAQ;AAChC,mBAAa,MAAM,MAAM,YAAY,aAAa,GAAK;AACvD,iBAAW,QAAQA,QAAO,CAAC;AAE3B,MAAAD,MAAK,OAAO,GAAG,UAAU;AACzB,oBAAc;AACd,MAAAC,UAAS;AAAA,IACX;AAAA,EACF;AACF;AAkBO,SAAS,KAAKD,OAAM,OAAO;AAChC,MAAIA,MAAK,SAAS,GAAG;AACnB,WAAOA,OAAMA,MAAK,QAAQ,GAAG,KAAK;AAClC,WAAOA;AAAA,EACT;AACA,SAAO;AACT;;;ACrEA,IAAM,iBAAiB,CAAC,EAAE;AAUnB,SAAS,kBAAkB,YAAY;AAE5C,QAAME,OAAM,CAAC;AACb,MAAIC,SAAQ;AAEZ,SAAO,EAAEA,SAAQ,WAAW,QAAQ;AAClC,oBAAgBD,MAAK,WAAWC,MAAK,CAAC;AAAA,EACxC;AAEA,SAAOD;AACT;AAYA,SAAS,gBAAgBA,MAAKE,YAAW;AAEvC,MAAI;AAEJ,OAAK,QAAQA,YAAW;AACtB,UAAM,QAAQ,eAAe,KAAKF,MAAK,IAAI,IAAIA,KAAI,IAAI,IAAI;AAE3D,UAAM,OAAO,UAAUA,KAAI,IAAI,IAAI,CAAC;AAEpC,UAAM,QAAQE,WAAU,IAAI;AAE5B,QAAIC;AAEJ,QAAI,OAAO;AACT,WAAKA,SAAQ,OAAO;AAClB,YAAI,CAAC,eAAe,KAAK,MAAMA,KAAI,EAAG,MAAKA,KAAI,IAAI,CAAC;AACpD,cAAM,QAAQ,MAAMA,KAAI;AACxB;AAAA;AAAA,UAEE,KAAKA,KAAI;AAAA,UACT,MAAM,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC,KAAK,IAAI,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAaA,SAAS,WAAW,UAAUC,OAAM;AAClC,MAAIH,SAAQ;AAEZ,QAAM,SAAS,CAAC;AAEhB,SAAO,EAAEA,SAAQG,MAAK,QAAQ;AAE5B;AAAC,KAACA,MAAKH,MAAK,EAAE,QAAQ,UAAU,WAAW,QAAQ,KAAKG,MAAKH,MAAK,CAAC;AAAA,EACrE;AAEA,SAAO,UAAU,GAAG,GAAG,MAAM;AAC/B;;;AC9EO,SAAS,gCAAgC,OAAO,MAAM;AAC3D,QAAMI,QAAO,OAAO,SAAS,OAAO,IAAI;AACxC;AAAA;AAAA,IAEAA,QAAO,KAAKA,UAAS,MAAMA,QAAO,MAAMA,QAAO;AAAA,IAE/CA,QAAO,OAAOA,QAAO;AAAA,IAErBA,QAAO,SAAUA,QAAO;AAAA,IAExBA,QAAO,SAAUA,QAAO;AAAA,KACvBA,QAAO,WAAY,UAAWA,QAAO,WAAY;AAAA;AAAA,IAElDA,QAAO;AAAA,IAAW;AAChB,WAAO;AAAA,EACT;AACA,SAAO,OAAO,cAAcA,KAAI;AAClC;;;ACZO,SAAS,oBAAoB,OAAO;AACzC,SAAO,MAEN,QAAQ,eAAe,GAAG,EAE1B,QAAQ,UAAU,EAAE,EAOpB,YAAY,EAAE,YAAY;AAC7B;;;ACXO,IAAM,aAAa,WAAW,UAAU;AAcxC,IAAM,oBAAoB,WAAW,YAAY;AAuBjD,IAAM,aAAa,WAAW,qBAAqB;AAanD,SAAS,aAAaC,OAAM;AACjC;AAAA;AAAA;AAAA,IAGEA,UAAS,SAASA,QAAO,MAAMA,UAAS;AAAA;AAE5C;AAaO,IAAM,aAAa,WAAW,IAAI;AAoBlC,IAAM,gBAAgB,WAAW,YAAY;AAe7C,IAAM,mBAAmB,WAAW,gBAAgB;AAiBpD,SAAS,mBAAmBA,OAAM;AACvC,SAAOA,UAAS,QAAQA,QAAO;AACjC;AAWO,SAAS,0BAA0BA,OAAM;AAC9C,SAAOA,UAAS,SAASA,QAAO,KAAKA,UAAS;AAChD;AAiBO,SAAS,cAAcA,OAAM;AAClC,SAAOA,UAAS,MAAMA,UAAS,MAAMA,UAAS;AAChD;AAuBO,IAAM,qBAAqB,WAAW,cAAc;AAsBpD,IAAM,oBAAoB,WAAW,IAAI;AAUhD,SAAS,WAAW,OAAO;AACzB,SAAO;AAUP,WAAS,MAAMA,OAAM;AACnB,WAAOA,UAAS,QAAQA,QAAO,MAAM,MAAM,KAAK,OAAO,aAAaA,KAAI,CAAC;AAAA,EAC3E;AACF;;;AC7LO,SAAS,aAAa,OAAO;AAElC,QAAM,SAAS,CAAC;AAChB,MAAIC,SAAQ;AACZ,MAAIC,SAAQ;AACZ,MAAI,OAAO;AACX,SAAO,EAAED,SAAQ,MAAM,QAAQ;AAC7B,UAAME,QAAO,MAAM,WAAWF,MAAK;AAEnC,QAAIG,WAAU;AAGd,QAAID,UAAS,MAAM,kBAAkB,MAAM,WAAWF,SAAQ,CAAC,CAAC,KAAK,kBAAkB,MAAM,WAAWA,SAAQ,CAAC,CAAC,GAAG;AACnH,aAAO;AAAA,IACT,WAESE,QAAO,KAAK;AACnB,UAAI,CAAC,oBAAoB,KAAK,OAAO,aAAaA,KAAI,CAAC,GAAG;AACxD,QAAAC,WAAU,OAAO,aAAaD,KAAI;AAAA,MACpC;AAAA,IACF,WAESA,QAAO,SAAUA,QAAO,OAAQ;AACvC,YAAM,OAAO,MAAM,WAAWF,SAAQ,CAAC;AAGvC,UAAIE,QAAO,SAAU,OAAO,SAAU,OAAO,OAAQ;AACnD,QAAAC,WAAU,OAAO,aAAaD,OAAM,IAAI;AACxC,eAAO;AAAA,MACT,OAEK;AACH,QAAAC,WAAU;AAAA,MACZ;AAAA,IACF,OAEK;AACH,MAAAA,WAAU,OAAO,aAAaD,KAAI;AAAA,IACpC;AACA,QAAIC,UAAS;AACX,aAAO,KAAK,MAAM,MAAMF,QAAOD,MAAK,GAAG,mBAAmBG,QAAO,CAAC;AAClE,MAAAF,SAAQD,SAAQ,OAAO;AACvB,MAAAG,WAAU;AAAA,IACZ;AACA,QAAI,MAAM;AACR,MAAAH,UAAS;AACT,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,OAAO,KAAK,EAAE,IAAI,MAAM,MAAMC,MAAK;AAC5C;;;AClEO,SAAS,aAAa,SAASG,KAAI,MAAM,KAAK;AACnD,QAAM,QAAQ,MAAM,MAAM,IAAI,OAAO;AACrC,MAAI,OAAO;AACX,SAAOC;AAGP,WAASA,OAAMC,OAAM;AACnB,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,MAAM,IAAI;AAClB,aAAO,OAAOA,KAAI;AAAA,IACpB;AACA,WAAOF,IAAGE,KAAI;AAAA,EAChB;AAGA,WAAS,OAAOA,OAAM;AACpB,QAAI,cAAcA,KAAI,KAAK,SAAS,OAAO;AACzC,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,YAAQ,KAAK,IAAI;AACjB,WAAOF,IAAGE,KAAI;AAAA,EAChB;AACF;;;AClDO,IAAM,UAAU;AAAA,EACrB,UAAU;AACZ;AAQA,SAAS,kBAAkB,SAAS;AAClC,QAAM,eAAe,QAAQ,QAAQ,KAAK,OAAO,WAAW,gBAAgB,4BAA4B,gBAAgB;AAExH,MAAIC;AACJ,SAAO;AAGP,WAAS,2BAA2BC,OAAM;AACxC,QAAIA,UAAS,MAAM;AACjB,cAAQ,QAAQA,KAAI;AACpB;AAAA,IACF;AACA,YAAQ,MAAM,YAAY;AAC1B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,YAAY;AACzB,WAAO,aAAa,SAAS,cAAc,YAAY;AAAA,EACzD;AAGA,WAAS,iBAAiBA,OAAM;AAC9B,YAAQ,MAAM,WAAW;AACzB,WAAO,UAAUA,KAAI;AAAA,EACvB;AAGA,WAAS,UAAUA,OAAM;AACvB,UAAM,QAAQ,QAAQ,MAAM,aAAa;AAAA,MACvC,aAAa;AAAA,MACb,UAAAD;AAAA,IACF,CAAC;AACD,QAAIA,WAAU;AACZ,MAAAA,UAAS,OAAO;AAAA,IAClB;AACA,IAAAA,YAAW;AACX,WAAO,KAAKC,KAAI;AAAA,EAClB;AAGA,WAAS,KAAKA,OAAM;AAClB,QAAIA,UAAS,MAAM;AACjB,cAAQ,KAAK,WAAW;AACxB,cAAQ,KAAK,WAAW;AACxB,cAAQ,QAAQA,KAAI;AACpB;AAAA,IACF;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,WAAW;AACxB,aAAO;AAAA,IACT;AAGA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AACF;;;ACvDO,IAAMC,YAAW;AAAA,EACtB,UAAU;AACZ;AAGA,IAAM,qBAAqB;AAAA,EACzB,UAAU;AACZ;AAQA,SAAS,mBAAmB,SAAS;AACnC,QAAMC,QAAO;AAEb,QAAM,QAAQ,CAAC;AACf,MAAI,YAAY;AAEhB,MAAI;AAEJ,MAAI;AAEJ,MAAI;AACJ,SAAOC;AAGP,WAASA,OAAMC,OAAM;AAWnB,QAAI,YAAY,MAAM,QAAQ;AAC5B,YAAM,OAAO,MAAM,SAAS;AAC5B,MAAAF,MAAK,iBAAiB,KAAK,CAAC;AAC5B,aAAO,QAAQ,QAAQ,KAAK,CAAC,EAAE,cAAc,kBAAkB,kBAAkB,EAAEE,KAAI;AAAA,IACzF;AAGA,WAAO,mBAAmBA,KAAI;AAAA,EAChC;AAGA,WAAS,iBAAiBA,OAAM;AAC9B;AAKA,QAAIF,MAAK,eAAe,YAAY;AAClC,MAAAA,MAAK,eAAe,aAAa;AACjC,UAAI,WAAW;AACb,kBAAU;AAAA,MACZ;AAIA,YAAM,mBAAmBA,MAAK,OAAO;AACrC,UAAI,kBAAkB;AAEtB,UAAIG;AAGJ,aAAO,mBAAmB;AACxB,YAAIH,MAAK,OAAO,eAAe,EAAE,CAAC,MAAM,UAAUA,MAAK,OAAO,eAAe,EAAE,CAAC,EAAE,SAAS,aAAa;AACtG,UAAAG,SAAQH,MAAK,OAAO,eAAe,EAAE,CAAC,EAAE;AACxC;AAAA,QACF;AAAA,MACF;AACA,qBAAe,SAAS;AAGxB,UAAII,SAAQ;AACZ,aAAOA,SAAQJ,MAAK,OAAO,QAAQ;AACjC,QAAAA,MAAK,OAAOI,MAAK,EAAE,CAAC,EAAE,MAAM;AAAA,UAC1B,GAAGD;AAAA,QACL;AACA,QAAAC;AAAA,MACF;AAGA,aAAOJ,MAAK,QAAQ,kBAAkB,GAAG,GAAGA,MAAK,OAAO,MAAM,gBAAgB,CAAC;AAG/E,MAAAA,MAAK,OAAO,SAASI;AACrB,aAAO,mBAAmBF,KAAI;AAAA,IAChC;AACA,WAAOD,OAAMC,KAAI;AAAA,EACnB;AAGA,WAAS,mBAAmBA,OAAM;AAMhC,QAAI,cAAc,MAAM,QAAQ;AAI9B,UAAI,CAAC,WAAW;AACd,eAAO,kBAAkBA,KAAI;AAAA,MAC/B;AAKA,UAAI,UAAU,oBAAoB,UAAU,iBAAiB,UAAU;AACrE,eAAO,UAAUA,KAAI;AAAA,MACvB;AAOA,MAAAF,MAAK,YAAY,QAAQ,UAAU,oBAAoB,CAAC,UAAU,6BAA6B;AAAA,IACjG;AAGA,IAAAA,MAAK,iBAAiB,CAAC;AACvB,WAAO,QAAQ,MAAM,oBAAoB,sBAAsB,qBAAqB,EAAEE,KAAI;AAAA,EAC5F;AAGA,WAAS,qBAAqBA,OAAM;AAClC,QAAI,UAAW,WAAU;AACzB,mBAAe,SAAS;AACxB,WAAO,kBAAkBA,KAAI;AAAA,EAC/B;AAGA,WAAS,sBAAsBA,OAAM;AACnC,IAAAF,MAAK,OAAO,KAAKA,MAAK,IAAI,EAAE,IAAI,IAAI,cAAc,MAAM;AACxD,sBAAkBA,MAAK,IAAI,EAAE;AAC7B,WAAO,UAAUE,KAAI;AAAA,EACvB;AAGA,WAAS,kBAAkBA,OAAM;AAE/B,IAAAF,MAAK,iBAAiB,CAAC;AACvB,WAAO,QAAQ,QAAQ,oBAAoB,mBAAmB,SAAS,EAAEE,KAAI;AAAA,EAC/E;AAGA,WAAS,kBAAkBA,OAAM;AAC/B;AACA,UAAM,KAAK,CAACF,MAAK,kBAAkBA,MAAK,cAAc,CAAC;AAEvD,WAAO,kBAAkBE,KAAI;AAAA,EAC/B;AAGA,WAAS,UAAUA,OAAM;AACvB,QAAIA,UAAS,MAAM;AACjB,UAAI,UAAW,WAAU;AACzB,qBAAe,CAAC;AAChB,cAAQ,QAAQA,KAAI;AACpB;AAAA,IACF;AACA,gBAAY,aAAaF,MAAK,OAAO,KAAKA,MAAK,IAAI,CAAC;AACpD,YAAQ,MAAM,aAAa;AAAA,MACzB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,aAAaE,KAAI;AAAA,EAC1B;AAGA,WAAS,aAAaA,OAAM;AAC1B,QAAIA,UAAS,MAAM;AACjB,mBAAa,QAAQ,KAAK,WAAW,GAAG,IAAI;AAC5C,qBAAe,CAAC;AAChB,cAAQ,QAAQA,KAAI;AACpB;AAAA,IACF;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,cAAQ,QAAQA,KAAI;AACpB,mBAAa,QAAQ,KAAK,WAAW,CAAC;AAEtC,kBAAY;AACZ,MAAAF,MAAK,YAAY;AACjB,aAAOC;AAAA,IACT;AACA,YAAQ,QAAQC,KAAI;AACpB,WAAO;AAAA,EACT;AAUA,WAAS,aAAa,OAAO,WAAW;AACtC,UAAM,SAASF,MAAK,YAAY,KAAK;AACrC,QAAI,UAAW,QAAO,KAAK,IAAI;AAC/B,UAAM,WAAW;AACjB,QAAI,WAAY,YAAW,OAAO;AAClC,iBAAa;AACb,cAAU,WAAW,MAAM,KAAK;AAChC,cAAU,MAAM,MAAM;AAmCtB,QAAIA,MAAK,OAAO,KAAK,MAAM,MAAM,IAAI,GAAG;AACtC,UAAII,SAAQ,UAAU,OAAO;AAC7B,aAAOA,UAAS;AACd;AAAA;AAAA,UAEA,UAAU,OAAOA,MAAK,EAAE,CAAC,EAAE,MAAM,SAAS;AAAA,WAE1C,CAAC,UAAU,OAAOA,MAAK,EAAE,CAAC,EAAE;AAAA,UAE5B,UAAU,OAAOA,MAAK,EAAE,CAAC,EAAE,IAAI,SAAS;AAAA,UAAkB;AAGxD;AAAA,QACF;AAAA,MACF;AAIA,YAAM,mBAAmBJ,MAAK,OAAO;AACrC,UAAI,kBAAkB;AAEtB,UAAI;AAEJ,UAAIG;AAGJ,aAAO,mBAAmB;AACxB,YAAIH,MAAK,OAAO,eAAe,EAAE,CAAC,MAAM,UAAUA,MAAK,OAAO,eAAe,EAAE,CAAC,EAAE,SAAS,aAAa;AACtG,cAAI,MAAM;AACR,YAAAG,SAAQH,MAAK,OAAO,eAAe,EAAE,CAAC,EAAE;AACxC;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AACA,qBAAe,SAAS;AAGxB,MAAAI,SAAQ;AACR,aAAOA,SAAQJ,MAAK,OAAO,QAAQ;AACjC,QAAAA,MAAK,OAAOI,MAAK,EAAE,CAAC,EAAE,MAAM;AAAA,UAC1B,GAAGD;AAAA,QACL;AACA,QAAAC;AAAA,MACF;AAGA,aAAOJ,MAAK,QAAQ,kBAAkB,GAAG,GAAGA,MAAK,OAAO,MAAM,gBAAgB,CAAC;AAG/E,MAAAA,MAAK,OAAO,SAASI;AAAA,IACvB;AAAA,EACF;AAQA,WAAS,eAAe,MAAM;AAC5B,QAAIA,SAAQ,MAAM;AAGlB,WAAOA,WAAU,MAAM;AACrB,YAAM,QAAQ,MAAMA,MAAK;AACzB,MAAAJ,MAAK,iBAAiB,MAAM,CAAC;AAC7B,YAAM,CAAC,EAAE,KAAK,KAAKA,OAAM,OAAO;AAAA,IAClC;AACA,UAAM,SAAS;AAAA,EACjB;AACA,WAAS,YAAY;AACnB,cAAU,MAAM,CAAC,IAAI,CAAC;AACtB,iBAAa;AACb,gBAAY;AACZ,IAAAA,MAAK,eAAe,aAAa;AAAA,EACnC;AACF;AAQA,SAAS,kBAAkB,SAASK,KAAI,KAAK;AAG3C,SAAO,aAAa,SAAS,QAAQ,QAAQ,KAAK,OAAO,WAAW,UAAUA,KAAI,GAAG,GAAG,cAAc,KAAK,OAAO,WAAW,QAAQ,KAAK,SAAS,cAAc,IAAI,SAAY,CAAC;AACpL;;;ACtVO,SAAS,kBAAkBC,OAAM;AACtC,MAAIA,UAAS,QAAQ,0BAA0BA,KAAI,KAAK,kBAAkBA,KAAI,GAAG;AAC/E,WAAO;AAAA,EACT;AACA,MAAI,mBAAmBA,KAAI,GAAG;AAC5B,WAAO;AAAA,EACT;AACF;;;ACVO,SAAS,WAAWC,aAAY,QAAQ,SAAS;AAEtD,QAAM,SAAS,CAAC;AAChB,MAAIC,SAAQ;AAEZ,SAAO,EAAEA,SAAQD,YAAW,QAAQ;AAClC,UAAM,UAAUA,YAAWC,MAAK,EAAE;AAElC,QAAI,WAAW,CAAC,OAAO,SAAS,OAAO,GAAG;AACxC,eAAS,QAAQ,QAAQ,OAAO;AAChC,aAAO,KAAK,OAAO;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;;;ACbO,IAAM,YAAY;AAAA,EACvB,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,UAAU;AACZ;AAQA,SAAS,oBAAoB,QAAQ,SAAS;AAC5C,MAAIC,SAAQ;AAEZ,MAAI;AAEJ,MAAI;AAEJ,MAAIC;AAEJ,MAAI;AAEJ,MAAI;AAEJ,MAAI;AAEJ,MAAI;AAEJ,MAAI;AAMJ,SAAO,EAAED,SAAQ,OAAO,QAAQ;AAE9B,QAAI,OAAOA,MAAK,EAAE,CAAC,MAAM,WAAW,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,uBAAuB,OAAOA,MAAK,EAAE,CAAC,EAAE,QAAQ;AAC5G,aAAOA;AAGP,aAAO,QAAQ;AAEb,YAAI,OAAO,IAAI,EAAE,CAAC,MAAM,UAAU,OAAO,IAAI,EAAE,CAAC,EAAE,SAAS,uBAAuB,OAAO,IAAI,EAAE,CAAC,EAAE;AAAA,QAElG,QAAQ,eAAe,OAAO,IAAI,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,QAAQ,eAAe,OAAOA,MAAK,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG;AAKhH,eAAK,OAAO,IAAI,EAAE,CAAC,EAAE,UAAU,OAAOA,MAAK,EAAE,CAAC,EAAE,WAAW,OAAOA,MAAK,EAAE,CAAC,EAAE,IAAI,SAAS,OAAOA,MAAK,EAAE,CAAC,EAAE,MAAM,UAAU,KAAK,GAAG,OAAO,IAAI,EAAE,CAAC,EAAE,IAAI,SAAS,OAAO,IAAI,EAAE,CAAC,EAAE,MAAM,SAAS,OAAOA,MAAK,EAAE,CAAC,EAAE,IAAI,SAAS,OAAOA,MAAK,EAAE,CAAC,EAAE,MAAM,UAAU,IAAI;AAC/P;AAAA,UACF;AAGA,gBAAM,OAAO,IAAI,EAAE,CAAC,EAAE,IAAI,SAAS,OAAO,IAAI,EAAE,CAAC,EAAE,MAAM,SAAS,KAAK,OAAOA,MAAK,EAAE,CAAC,EAAE,IAAI,SAAS,OAAOA,MAAK,EAAE,CAAC,EAAE,MAAM,SAAS,IAAI,IAAI;AAC7I,gBAAME,SAAQ;AAAA,YACZ,GAAG,OAAO,IAAI,EAAE,CAAC,EAAE;AAAA,UACrB;AACA,gBAAM,MAAM;AAAA,YACV,GAAG,OAAOF,MAAK,EAAE,CAAC,EAAE;AAAA,UACtB;AACA,oBAAUE,QAAO,CAAC,GAAG;AACrB,oBAAU,KAAK,GAAG;AAClB,4BAAkB;AAAA,YAChB,MAAM,MAAM,IAAI,mBAAmB;AAAA,YACnC,OAAAA;AAAA,YACA,KAAK;AAAA,cACH,GAAG,OAAO,IAAI,EAAE,CAAC,EAAE;AAAA,YACrB;AAAA,UACF;AACA,4BAAkB;AAAA,YAChB,MAAM,MAAM,IAAI,mBAAmB;AAAA,YACnC,OAAO;AAAA,cACL,GAAG,OAAOF,MAAK,EAAE,CAAC,EAAE;AAAA,YACtB;AAAA,YACA;AAAA,UACF;AACA,UAAAC,QAAO;AAAA,YACL,MAAM,MAAM,IAAI,eAAe;AAAA,YAC/B,OAAO;AAAA,cACL,GAAG,OAAO,IAAI,EAAE,CAAC,EAAE;AAAA,YACrB;AAAA,YACA,KAAK;AAAA,cACH,GAAG,OAAOD,MAAK,EAAE,CAAC,EAAE;AAAA,YACtB;AAAA,UACF;AACA,kBAAQ;AAAA,YACN,MAAM,MAAM,IAAI,WAAW;AAAA,YAC3B,OAAO;AAAA,cACL,GAAG,gBAAgB;AAAA,YACrB;AAAA,YACA,KAAK;AAAA,cACH,GAAG,gBAAgB;AAAA,YACrB;AAAA,UACF;AACA,iBAAO,IAAI,EAAE,CAAC,EAAE,MAAM;AAAA,YACpB,GAAG,gBAAgB;AAAA,UACrB;AACA,iBAAOA,MAAK,EAAE,CAAC,EAAE,QAAQ;AAAA,YACvB,GAAG,gBAAgB;AAAA,UACrB;AACA,uBAAa,CAAC;AAGd,cAAI,OAAO,IAAI,EAAE,CAAC,EAAE,IAAI,SAAS,OAAO,IAAI,EAAE,CAAC,EAAE,MAAM,QAAQ;AAC7D,yBAAa,KAAK,YAAY,CAAC,CAAC,SAAS,OAAO,IAAI,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,QAAQ,OAAO,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,UACzG;AAGA,uBAAa,KAAK,YAAY,CAAC,CAAC,SAAS,OAAO,OAAO,GAAG,CAAC,SAAS,iBAAiB,OAAO,GAAG,CAAC,QAAQ,iBAAiB,OAAO,GAAG,CAAC,SAASC,OAAM,OAAO,CAAC,CAAC;AAK5J,uBAAa,KAAK,YAAY,WAAW,QAAQ,OAAO,WAAW,WAAW,MAAM,OAAO,MAAM,OAAO,GAAGD,MAAK,GAAG,OAAO,CAAC;AAG3H,uBAAa,KAAK,YAAY,CAAC,CAAC,QAAQC,OAAM,OAAO,GAAG,CAAC,SAAS,iBAAiB,OAAO,GAAG,CAAC,QAAQ,iBAAiB,OAAO,GAAG,CAAC,QAAQ,OAAO,OAAO,CAAC,CAAC;AAG1J,cAAI,OAAOD,MAAK,EAAE,CAAC,EAAE,IAAI,SAAS,OAAOA,MAAK,EAAE,CAAC,EAAE,MAAM,QAAQ;AAC/D,qBAAS;AACT,yBAAa,KAAK,YAAY,CAAC,CAAC,SAAS,OAAOA,MAAK,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,QAAQ,OAAOA,MAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,UAC3G,OAAO;AACL,qBAAS;AAAA,UACX;AACA,iBAAO,QAAQ,OAAO,GAAGA,SAAQ,OAAO,GAAG,UAAU;AACrD,UAAAA,SAAQ,OAAO,WAAW,SAAS,SAAS;AAC5C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,SAAQ;AACR,SAAO,EAAEA,SAAQ,OAAO,QAAQ;AAC9B,QAAI,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,qBAAqB;AACjD,aAAOA,MAAK,EAAE,CAAC,EAAE,OAAO;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,kBAAkB,SAASG,KAAI;AACtC,QAAMC,oBAAmB,KAAK,OAAO,WAAW,iBAAiB;AACjE,QAAMC,YAAW,KAAK;AACtB,QAAM,SAAS,kBAAkBA,SAAQ;AAGzC,MAAI;AACJ,SAAOH;AAYP,WAASA,OAAMI,OAAM;AACnB,aAASA;AACT,YAAQ,MAAM,mBAAmB;AACjC,WAAO,OAAOA,KAAI;AAAA,EACpB;AAYA,WAAS,OAAOA,OAAM;AACpB,QAAIA,UAAS,QAAQ;AACnB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,QAAQ,KAAK,mBAAmB;AAG9C,UAAM,QAAQ,kBAAkBA,KAAI;AAIpC,UAAM,OAAO,CAAC,SAAS,UAAU,KAAK,UAAUF,kBAAiB,SAASE,KAAI;AAC9E,UAAM,QAAQ,CAAC,UAAU,WAAW,KAAK,SAASF,kBAAiB,SAASC,SAAQ;AACpF,UAAM,QAAQ,QAAQ,WAAW,KAAK,OAAO,SAAS,UAAU,CAAC,MAAM;AACvE,UAAM,SAAS,QAAQ,WAAW,KAAK,QAAQ,UAAU,SAAS,CAAC,KAAK;AACxE,WAAOF,IAAGG,KAAI;AAAA,EAChB;AACF;AAeA,SAAS,UAAUC,QAAO,QAAQ;AAChC,EAAAA,OAAM,UAAU;AAChB,EAAAA,OAAM,UAAU;AAChB,EAAAA,OAAM,gBAAgB;AACxB;;;ACrOO,IAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,UAAU;AACZ;AAOA,SAAS,iBAAiB,SAASC,KAAI,KAAK;AAC1C,MAAI,OAAO;AACX,SAAOC;AAcP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,gBAAgB;AAC9B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,gBAAgB;AAC7B,YAAQ,MAAM,kBAAkB;AAChC,WAAO;AAAA,EACT;AAcA,WAAS,KAAKA,OAAM;AAClB,QAAI,WAAWA,KAAI,GAAG;AACpB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,IAAI;AACf,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,WAAO,WAAWA,KAAI;AAAA,EACxB;AAcA,WAAS,mBAAmBA,OAAM;AAEhC,QAAIA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAM,kBAAkBA,KAAI,GAAG;AAExE,aAAO;AACP,aAAO,yBAAyBA,KAAI;AAAA,IACtC;AACA,WAAO,WAAWA,KAAI;AAAA,EACxB;AAcA,WAAS,yBAAyBA,OAAM;AACtC,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AACP,aAAO;AAAA,IACT;AAGA,SAAKA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAM,kBAAkBA,KAAI,MAAM,SAAS,IAAI;AACzF,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO;AACP,WAAO,WAAWA,KAAI;AAAA,EACxB;AAYA,WAAS,UAAUA,OAAM;AACvB,QAAIA,UAAS,IAAI;AACf,cAAQ,KAAK,kBAAkB;AAC/B,cAAQ,MAAM,gBAAgB;AAC9B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,gBAAgB;AAC7B,cAAQ,KAAK,UAAU;AACvB,aAAOF;AAAA,IACT;AAGA,QAAIE,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAM,aAAaA,KAAI,GAAG;AACrE,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,WAAWA,OAAM;AACxB,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAI,WAAWA,KAAI,GAAG;AACpB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,iBAAiBA,OAAM;AAC9B,WAAO,kBAAkBA,KAAI,IAAI,WAAWA,KAAI,IAAI,IAAIA,KAAI;AAAA,EAC9D;AAYA,WAAS,WAAWA,OAAM;AACxB,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AACP,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,IAAI;AAEf,cAAQ,KAAK,kBAAkB,EAAE,OAAO;AACxC,cAAQ,MAAM,gBAAgB;AAC9B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,gBAAgB;AAC7B,cAAQ,KAAK,UAAU;AACvB,aAAOF;AAAA,IACT;AACA,WAAO,WAAWE,KAAI;AAAA,EACxB;AAcA,WAAS,WAAWA,OAAM;AAExB,SAAKA,UAAS,MAAM,kBAAkBA,KAAI,MAAM,SAAS,IAAI;AAC3D,YAAM,OAAOA,UAAS,KAAK,aAAa;AACxC,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AACF;;;AC5NO,IAAM,YAAY;AAAA,EACvB,SAAS;AAAA,EACT,UAAU;AACZ;AAOA,SAAS,kBAAkB,SAASC,KAAI,KAAK;AAC3C,SAAOC;AAgBP,WAASA,OAAMC,OAAM;AACnB,WAAO,cAAcA,KAAI,IAAI,aAAa,SAAS,OAAO,YAAY,EAAEA,KAAI,IAAI,MAAMA,KAAI;AAAA,EAC5F;AAgBA,WAAS,MAAMA,OAAM;AACnB,WAAOA,UAAS,QAAQ,mBAAmBA,KAAI,IAAIF,IAAGE,KAAI,IAAI,IAAIA,KAAI;AAAA,EACxE;AACF;;;AC/CO,IAAM,aAAa;AAAA,EACxB,cAAc;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,UAAU;AACZ;AAOA,SAAS,wBAAwB,SAASC,KAAI,KAAK;AACjD,QAAMC,QAAO;AACb,SAAOC;AAYP,WAASA,OAAMC,OAAM;AACnB,QAAIA,UAAS,IAAI;AACf,YAAM,QAAQF,MAAK;AACnB,UAAI,CAAC,MAAM,MAAM;AACf,gBAAQ,MAAM,cAAc;AAAA,UAC1B,YAAY;AAAA,QACd,CAAC;AACD,cAAM,OAAO;AAAA,MACf;AACA,cAAQ,MAAM,kBAAkB;AAChC,cAAQ,MAAM,kBAAkB;AAChC,cAAQ,QAAQE,KAAI;AACpB,cAAQ,KAAK,kBAAkB;AAC/B,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,MAAMA,OAAM;AACnB,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,MAAM,4BAA4B;AAC1C,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,4BAA4B;AACzC,cAAQ,KAAK,kBAAkB;AAC/B,aAAOH;AAAA,IACT;AACA,YAAQ,KAAK,kBAAkB;AAC/B,WAAOA,IAAGG,KAAI;AAAA,EAChB;AACF;AAeA,SAAS,+BAA+B,SAASH,KAAI,KAAK;AACxD,QAAMC,QAAO;AACb,SAAO;AAeP,WAAS,UAAUE,OAAM;AACvB,QAAI,cAAcA,KAAI,GAAG;AAGvB,aAAO,aAAa,SAAS,YAAY,cAAcF,MAAK,OAAO,WAAW,QAAQ,KAAK,SAAS,cAAc,IAAI,SAAY,CAAC,EAAEE,KAAI;AAAA,IAC3I;AACA,WAAO,WAAWA,KAAI;AAAA,EACxB;AAeA,WAAS,WAAWA,OAAM;AACxB,WAAO,QAAQ,QAAQ,YAAYH,KAAI,GAAG,EAAEG,KAAI;AAAA,EAClD;AACF;AAGA,SAAS,KAAK,SAAS;AACrB,UAAQ,KAAK,YAAY;AAC3B;;;ACnIO,IAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,UAAU;AACZ;AAOA,SAAS,wBAAwB,SAASC,KAAI,KAAK;AACjD,SAAOC;AAYP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,MAAM,cAAc;AAC5B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,cAAc;AAC3B,WAAO;AAAA,EACT;AAYA,WAAS,OAAOA,OAAM;AAEpB,QAAI,iBAAiBA,KAAI,GAAG;AAC1B,cAAQ,MAAM,sBAAsB;AACpC,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,sBAAsB;AACnC,cAAQ,KAAK,iBAAiB;AAC9B,aAAOF;AAAA,IACT;AACA,WAAO,IAAIE,KAAI;AAAA,EACjB;AACF;;;AClDO,IAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,UAAU;AACZ;AAOA,SAAS,2BAA2B,SAASC,KAAI,KAAK;AACpD,QAAMC,QAAO;AACb,MAAI,OAAO;AAEX,MAAI;AAEJ,MAAIC;AACJ,SAAOC;AAgBP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,oBAAoB;AAClC,YAAQ,MAAM,0BAA0B;AACxC,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,0BAA0B;AACvC,WAAO;AAAA,EACT;AAiBA,WAAS,KAAKA,OAAM;AAClB,QAAIA,UAAS,IAAI;AACf,cAAQ,MAAM,iCAAiC;AAC/C,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,iCAAiC;AAC9C,aAAO;AAAA,IACT;AACA,YAAQ,MAAM,yBAAyB;AACvC,UAAM;AACN,IAAAF,QAAO;AACP,WAAO,MAAME,KAAI;AAAA,EACnB;AAcA,WAAS,QAAQA,OAAM;AACrB,QAAIA,UAAS,MAAMA,UAAS,KAAK;AAC/B,cAAQ,MAAM,qCAAqC;AACnD,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,qCAAqC;AAClD,cAAQ,MAAM,yBAAyB;AACvC,YAAM;AACN,MAAAF,QAAO;AACP,aAAO;AAAA,IACT;AACA,YAAQ,MAAM,yBAAyB;AACvC,UAAM;AACN,IAAAA,QAAO;AACP,WAAO,MAAME,KAAI;AAAA,EACnB;AAmBA,WAAS,MAAMA,OAAM;AACnB,QAAIA,UAAS,MAAM,MAAM;AACvB,YAAM,QAAQ,QAAQ,KAAK,yBAAyB;AACpD,UAAIF,UAAS,qBAAqB,CAAC,8BAA8BD,MAAK,eAAe,KAAK,CAAC,GAAG;AAC5F,eAAO,IAAIG,KAAI;AAAA,MACjB;AAIA,cAAQ,MAAM,0BAA0B;AACxC,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,0BAA0B;AACvC,cAAQ,KAAK,oBAAoB;AACjC,aAAOJ;AAAA,IACT;AACA,QAAIE,MAAKE,KAAI,KAAK,SAAS,KAAK;AAC9B,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AACF;;;ACvIA,IAAM,sBAAsB;AAAA,EAC1B,SAAS;AAAA,EACT,UAAU;AACZ;AAGO,IAAM,aAAa;AAAA,EACxB,UAAU;AAAA,EACV,MAAM;AAAA,EACN,UAAU;AACZ;AAOA,SAAS,mBAAmB,SAASC,KAAI,KAAK;AAC5C,QAAMC,QAAO;AAEb,QAAM,aAAa;AAAA,IACjB,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACA,MAAI,gBAAgB;AACpB,MAAI,WAAW;AAEf,MAAI;AACJ,SAAOC;AAcP,WAASA,OAAMC,OAAM;AAEnB,WAAO,mBAAmBA,KAAI;AAAA,EAChC;AAcA,WAAS,mBAAmBA,OAAM;AAChC,UAAM,OAAOF,MAAK,OAAOA,MAAK,OAAO,SAAS,CAAC;AAC/C,oBAAgB,QAAQ,KAAK,CAAC,EAAE,SAAS,eAAe,KAAK,CAAC,EAAE,eAAe,KAAK,CAAC,GAAG,IAAI,EAAE,SAAS;AACvG,aAASE;AACT,YAAQ,MAAM,YAAY;AAC1B,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,MAAM,yBAAyB;AACvC,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAcA,WAAS,aAAaA,OAAM;AAC1B,QAAIA,UAAS,QAAQ;AACnB;AACA,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAI,WAAW,GAAG;AAChB,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,YAAQ,KAAK,yBAAyB;AACtC,WAAO,cAAcA,KAAI,IAAI,aAAa,SAAS,YAAY,YAAY,EAAEA,KAAI,IAAI,WAAWA,KAAI;AAAA,EACtG;AAcA,WAAS,WAAWA,OAAM;AACxB,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,cAAQ,KAAK,iBAAiB;AAC9B,aAAOF,MAAK,YAAYD,IAAGG,KAAI,IAAI,QAAQ,MAAM,qBAAqB,gBAAgB,KAAK,EAAEA,KAAI;AAAA,IACnG;AACA,YAAQ,MAAM,qBAAqB;AACnC,YAAQ,MAAM,eAAe;AAAA,MAC3B,aAAa;AAAA,IACf,CAAC;AACD,WAAO,KAAKA,KAAI;AAAA,EAClB;AAcA,WAAS,KAAKA,OAAM;AAClB,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,cAAQ,KAAK,aAAa;AAC1B,cAAQ,KAAK,qBAAqB;AAClC,aAAO,WAAWA,KAAI;AAAA,IACxB;AACA,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,KAAK,aAAa;AAC1B,cAAQ,KAAK,qBAAqB;AAClC,aAAO,aAAa,SAAS,YAAY,YAAY,EAAEA,KAAI;AAAA,IAC7D;AACA,QAAIA,UAAS,MAAMA,UAAS,QAAQ;AAClC,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAcA,WAAS,WAAWA,OAAM;AACxB,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,aAAO,WAAWA,KAAI;AAAA,IACxB;AACA,YAAQ,MAAM,qBAAqB;AACnC,YAAQ,MAAM,eAAe;AAAA,MAC3B,aAAa;AAAA,IACf,CAAC;AACD,WAAO,KAAKA,KAAI;AAAA,EAClB;AAcA,WAAS,KAAKA,OAAM;AAClB,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,cAAQ,KAAK,aAAa;AAC1B,cAAQ,KAAK,qBAAqB;AAClC,aAAO,WAAWA,KAAI;AAAA,IACxB;AACA,QAAIA,UAAS,MAAMA,UAAS,QAAQ;AAClC,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAeA,WAAS,eAAeA,OAAM;AAC5B,WAAO,QAAQ,QAAQ,YAAY,OAAO,aAAa,EAAEA,KAAI;AAAA,EAC/D;AAcA,WAAS,cAAcA,OAAM;AAC3B,YAAQ,MAAM,YAAY;AAC1B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,YAAY;AACzB,WAAO;AAAA,EACT;AAcA,WAAS,aAAaA,OAAM;AAC1B,WAAO,gBAAgB,KAAK,cAAcA,KAAI,IAAI,aAAa,SAAS,oBAAoB,cAAc,gBAAgB,CAAC,EAAEA,KAAI,IAAI,mBAAmBA,KAAI;AAAA,EAC9J;AAcA,WAAS,mBAAmBA,OAAM;AAChC,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,aAAO,QAAQ,MAAM,qBAAqB,gBAAgB,KAAK,EAAEA,KAAI;AAAA,IACvE;AACA,YAAQ,MAAM,eAAe;AAC7B,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAcA,WAAS,aAAaA,OAAM;AAC1B,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,cAAQ,KAAK,eAAe;AAC5B,aAAO,mBAAmBA,KAAI;AAAA,IAChC;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAcA,WAAS,MAAMA,OAAM;AACnB,YAAQ,KAAK,YAAY;AACzB,WAAOH,IAAGG,KAAI;AAAA,EAChB;AAOA,WAAS,mBAAmBC,UAASJ,KAAIK,MAAK;AAC5C,QAAI,OAAO;AACX,WAAO;AAOP,aAAS,YAAYF,OAAM;AACzB,MAAAC,SAAQ,MAAM,YAAY;AAC1B,MAAAA,SAAQ,QAAQD,KAAI;AACpB,MAAAC,SAAQ,KAAK,YAAY;AACzB,aAAOF;AAAA,IACT;AAcA,aAASA,OAAMC,OAAM;AAInB,MAAAC,SAAQ,MAAM,iBAAiB;AAC/B,aAAO,cAAcD,KAAI,IAAI,aAAaC,UAAS,qBAAqB,cAAcH,MAAK,OAAO,WAAW,QAAQ,KAAK,SAAS,cAAc,IAAI,SAAY,CAAC,EAAEE,KAAI,IAAI,oBAAoBA,KAAI;AAAA,IACtM;AAcA,aAAS,oBAAoBA,OAAM;AACjC,UAAIA,UAAS,QAAQ;AACnB,QAAAC,SAAQ,MAAM,yBAAyB;AACvC,eAAO,cAAcD,KAAI;AAAA,MAC3B;AACA,aAAOE,KAAIF,KAAI;AAAA,IACjB;AAcA,aAAS,cAAcA,OAAM;AAC3B,UAAIA,UAAS,QAAQ;AACnB;AACA,QAAAC,SAAQ,QAAQD,KAAI;AACpB,eAAO;AAAA,MACT;AACA,UAAI,QAAQ,UAAU;AACpB,QAAAC,SAAQ,KAAK,yBAAyB;AACtC,eAAO,cAAcD,KAAI,IAAI,aAAaC,UAAS,oBAAoB,YAAY,EAAED,KAAI,IAAI,mBAAmBA,KAAI;AAAA,MACtH;AACA,aAAOE,KAAIF,KAAI;AAAA,IACjB;AAcA,aAAS,mBAAmBA,OAAM;AAChC,UAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,QAAAC,SAAQ,KAAK,iBAAiB;AAC9B,eAAOJ,IAAGG,KAAI;AAAA,MAChB;AACA,aAAOE,KAAIF,KAAI;AAAA,IACjB;AAAA,EACF;AACF;AAOA,SAAS,4BAA4B,SAASH,KAAI,KAAK;AACrD,QAAMC,QAAO;AACb,SAAOC;AAOP,WAASA,OAAMC,OAAM;AACnB,QAAIA,UAAS,MAAM;AACjB,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,YAAQ,MAAM,YAAY;AAC1B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,YAAY;AACzB,WAAO;AAAA,EACT;AAOA,WAAS,UAAUA,OAAM;AACvB,WAAOF,MAAK,OAAO,KAAKA,MAAK,IAAI,EAAE,IAAI,IAAI,IAAIE,KAAI,IAAIH,IAAGG,KAAI;AAAA,EAChE;AACF;;;AC/bO,IAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,EACN,UAAU;AACZ;AAGA,IAAM,eAAe;AAAA,EACnB,SAAS;AAAA,EACT,UAAU;AACZ;AAOA,SAAS,qBAAqB,SAASG,KAAI,KAAK;AAC9C,QAAMC,QAAO;AACb,SAAOC;AAgBP,WAASA,OAAMC,OAAM;AAGnB,YAAQ,MAAM,cAAc;AAG5B,WAAO,aAAa,SAAS,aAAa,cAAc,IAAI,CAAC,EAAEA,KAAI;AAAA,EACrE;AAYA,WAAS,YAAYA,OAAM;AACzB,UAAM,OAAOF,MAAK,OAAOA,MAAK,OAAO,SAAS,CAAC;AAC/C,WAAO,QAAQ,KAAK,CAAC,EAAE,SAAS,gBAAgB,KAAK,CAAC,EAAE,eAAe,KAAK,CAAC,GAAG,IAAI,EAAE,UAAU,IAAI,QAAQE,KAAI,IAAI,IAAIA,KAAI;AAAA,EAC9H;AAYA,WAAS,QAAQA,OAAM;AACrB,QAAIA,UAAS,MAAM;AACjB,aAAO,MAAMA,KAAI;AAAA,IACnB;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,aAAO,QAAQ,QAAQ,cAAc,SAAS,KAAK,EAAEA,KAAI;AAAA,IAC3D;AACA,YAAQ,MAAM,eAAe;AAC7B,WAAO,OAAOA,KAAI;AAAA,EACpB;AAYA,WAAS,OAAOA,OAAM;AACpB,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,cAAQ,KAAK,eAAe;AAC5B,aAAO,QAAQA,KAAI;AAAA,IACrB;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAGA,WAAS,MAAMA,OAAM;AACnB,YAAQ,KAAK,cAAc;AAI3B,WAAOH,IAAGG,KAAI;AAAA,EAChB;AACF;AAOA,SAAS,qBAAqB,SAASH,KAAI,KAAK;AAC9C,QAAMC,QAAO;AACb,SAAOG;AAaP,WAASA,cAAaD,OAAM;AAG1B,QAAIF,MAAK,OAAO,KAAKA,MAAK,IAAI,EAAE,IAAI,GAAG;AACrC,aAAO,IAAIE,KAAI;AAAA,IACjB;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,cAAQ,MAAM,YAAY;AAC1B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,YAAY;AACzB,aAAOC;AAAA,IACT;AAQA,WAAO,aAAa,SAAS,aAAa,cAAc,IAAI,CAAC,EAAED,KAAI;AAAA,EACrE;AAYA,WAAS,YAAYA,OAAM;AACzB,UAAM,OAAOF,MAAK,OAAOA,MAAK,OAAO,SAAS,CAAC;AAC/C,WAAO,QAAQ,KAAK,CAAC,EAAE,SAAS,gBAAgB,KAAK,CAAC,EAAE,eAAe,KAAK,CAAC,GAAG,IAAI,EAAE,UAAU,IAAID,IAAGG,KAAI,IAAI,mBAAmBA,KAAI,IAAIC,cAAaD,KAAI,IAAI,IAAIA,KAAI;AAAA,EACzK;AACF;;;AClKO,IAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN;AAAA,EACA,SAAS;AAAA,EACT,UAAU;AACZ;AAIA,SAAS,gBAAgB,QAAQ;AAC/B,MAAI,gBAAgB,OAAO,SAAS;AACpC,MAAI,iBAAiB;AAErB,MAAIE;AAEJ,MAAI;AAGJ,OAAK,OAAO,cAAc,EAAE,CAAC,EAAE,SAAS,gBAAgB,OAAO,cAAc,EAAE,CAAC,EAAE,SAAS,aAAa,OAAO,aAAa,EAAE,CAAC,EAAE,SAAS,gBAAgB,OAAO,aAAa,EAAE,CAAC,EAAE,SAAS,UAAU;AACpM,IAAAA,SAAQ;AAGR,WAAO,EAAEA,SAAQ,eAAe;AAC9B,UAAI,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,gBAAgB;AAE5C,eAAO,cAAc,EAAE,CAAC,EAAE,OAAO;AACjC,eAAO,aAAa,EAAE,CAAC,EAAE,OAAO;AAChC,0BAAkB;AAClB,yBAAiB;AACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,SAAQ,iBAAiB;AACzB;AACA,SAAO,EAAEA,UAAS,eAAe;AAC/B,QAAI,UAAU,QAAW;AACvB,UAAIA,WAAU,iBAAiB,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,cAAc;AACrE,gBAAQA;AAAA,MACV;AAAA,IACF,WAAWA,WAAU,iBAAiB,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,cAAc;AAC5E,aAAO,KAAK,EAAE,CAAC,EAAE,OAAO;AACxB,UAAIA,WAAU,QAAQ,GAAG;AACvB,eAAO,KAAK,EAAE,CAAC,EAAE,MAAM,OAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE;AAC5C,eAAO,OAAO,QAAQ,GAAGA,SAAQ,QAAQ,CAAC;AAC1C,yBAAiBA,SAAQ,QAAQ;AACjC,QAAAA,SAAQ,QAAQ;AAAA,MAClB;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,SAASC,OAAM;AAEtB,SAAOA,UAAS,MAAM,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS;AACxE;AAOA,SAAS,iBAAiB,SAASC,KAAI,KAAK;AAC1C,QAAMC,QAAO;AACb,MAAI,WAAW;AAEf,MAAI;AAEJ,MAAI;AACJ,SAAOC;AAcP,WAASA,OAAMH,OAAM;AACnB,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,kBAAkB;AAChC,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAYA,WAAS,aAAaA,OAAM;AAC1B,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB;AACA,aAAO;AAAA,IACT;AACA,YAAQ,KAAK,kBAAkB;AAC/B,WAAO,QAAQA,KAAI;AAAA,EACrB;AAYA,WAAS,QAAQA,OAAM;AAErB,QAAIA,UAAS,MAAM;AACjB,aAAO,IAAIA,KAAI;AAAA,IACjB;AAKA,QAAIA,UAAS,IAAI;AACf,cAAQ,MAAM,OAAO;AACrB,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,OAAO;AACpB,aAAO;AAAA,IACT;AAGA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQ,MAAM,kBAAkB;AACxC,aAAO;AACP,aAAO,cAAcA,KAAI;AAAA,IAC3B;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,cAAQ,MAAM,YAAY;AAC1B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,YAAY;AACzB,aAAO;AAAA,IACT;AAGA,YAAQ,MAAM,cAAc;AAC5B,WAAO,KAAKA,KAAI;AAAA,EAClB;AAYA,WAAS,KAAKA,OAAM;AAClB,QAAIA,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAM,mBAAmBA,KAAI,GAAG;AAC3E,cAAQ,KAAK,cAAc;AAC3B,aAAO,QAAQA,KAAI;AAAA,IACrB;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,cAAcA,OAAM;AAE3B,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB;AACA,aAAO;AAAA,IACT;AAGA,QAAI,SAAS,UAAU;AACrB,cAAQ,KAAK,kBAAkB;AAC/B,cAAQ,KAAK,UAAU;AACvB,aAAOC,IAAGD,KAAI;AAAA,IAChB;AAGA,UAAM,OAAO;AACb,WAAO,KAAKA,KAAI;AAAA,EAClB;AACF;;;ACnMO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxB,YAAY,SAAS;AAEnB,SAAK,OAAO,UAAU,CAAC,GAAG,OAAO,IAAI,CAAC;AAEtC,SAAK,QAAQ,CAAC;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAII,QAAO;AACT,QAAIA,SAAQ,KAAKA,UAAS,KAAK,KAAK,SAAS,KAAK,MAAM,QAAQ;AAC9D,YAAM,IAAI,WAAW,0BAA0BA,SAAQ,oCAAoC,KAAK,KAAK,SAAS,KAAK,MAAM,UAAU,GAAG;AAAA,IACxI;AACA,QAAIA,SAAQ,KAAK,KAAK,OAAQ,QAAO,KAAK,KAAKA,MAAK;AACpD,WAAO,KAAK,MAAM,KAAK,MAAM,SAASA,SAAQ,KAAK,KAAK,SAAS,CAAC;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAS;AACX,WAAO,KAAK,KAAK,SAAS,KAAK,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ;AACN,SAAK,UAAU,CAAC;AAChB,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAMC,QAAO,KAAK;AAEhB,UAAM,OAAO,QAAQ,QAAQ,QAAQ,SAAY,OAAO,oBAAoB;AAC5E,QAAI,OAAO,KAAK,KAAK,QAAQ;AAC3B,aAAO,KAAK,KAAK,MAAMA,QAAO,IAAI;AAAA,IACpC;AACA,QAAIA,SAAQ,KAAK,KAAK,QAAQ;AAC5B,aAAO,KAAK,MAAM,MAAM,KAAK,MAAM,SAAS,OAAO,KAAK,KAAK,QAAQ,KAAK,MAAM,SAASA,SAAQ,KAAK,KAAK,MAAM,EAAE,QAAQ;AAAA,IAC7H;AACA,WAAO,KAAK,KAAK,MAAMA,MAAK,EAAE,OAAO,KAAK,MAAM,MAAM,KAAK,MAAM,SAAS,OAAO,KAAK,KAAK,MAAM,EAAE,QAAQ,CAAC;AAAA,EAC9G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAOA,QAAO,aAAa,OAAO;AAEhC,UAAM,QAAQ,eAAe;AAC7B,SAAK,UAAU,KAAK,MAAMA,MAAK,CAAC;AAChC,UAAM,UAAU,KAAK,MAAM,OAAO,KAAK,MAAM,SAAS,OAAO,OAAO,iBAAiB;AACrF,QAAI,MAAO,aAAY,KAAK,MAAM,KAAK;AACvC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM;AACJ,SAAK,UAAU,OAAO,iBAAiB;AACvC,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,KAAK,MAAM;AACT,SAAK,UAAU,OAAO,iBAAiB;AACvC,SAAK,KAAK,KAAK,IAAI;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAS,OAAO;AACd,SAAK,UAAU,OAAO,iBAAiB;AACvC,gBAAY,KAAK,MAAM,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAQ,MAAM;AACZ,SAAK,UAAU,CAAC;AAChB,SAAK,MAAM,KAAK,IAAI;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,YAAY,OAAO;AACjB,SAAK,UAAU,CAAC;AAChB,gBAAY,KAAK,OAAO,MAAM,QAAQ,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,UAAU,GAAG;AACX,QAAI,MAAM,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,UAAU,KAAK,MAAM,WAAW,KAAK,IAAI,KAAK,KAAK,KAAK,WAAW,EAAG;AAClH,QAAI,IAAI,KAAK,KAAK,QAAQ;AAExB,YAAM,UAAU,KAAK,KAAK,OAAO,GAAG,OAAO,iBAAiB;AAC5D,kBAAY,KAAK,OAAO,QAAQ,QAAQ,CAAC;AAAA,IAC3C,OAAO;AAEL,YAAM,UAAU,KAAK,MAAM,OAAO,KAAK,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG,OAAO,iBAAiB;AACpG,kBAAY,KAAK,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AACF;AAcA,SAAS,YAAYC,OAAM,OAAO;AAEhC,MAAI,aAAa;AACjB,MAAI,MAAM,SAAS,KAAO;AACxB,IAAAA,MAAK,KAAK,GAAG,KAAK;AAAA,EACpB,OAAO;AACL,WAAO,aAAa,MAAM,QAAQ;AAChC,MAAAA,MAAK,KAAK,GAAG,MAAM,MAAM,YAAY,aAAa,GAAK,CAAC;AACxD,oBAAc;AAAA,IAChB;AAAA,EACF;AACF;;;ACvOO,SAAS,YAAY,aAAa;AAEvC,QAAM,QAAQ,CAAC;AACf,MAAIC,SAAQ;AAEZ,MAAI;AAEJ,MAAI;AAEJ,MAAI;AAEJ,MAAI;AAEJ,MAAI;AAEJ,MAAI;AAEJ,MAAI;AACJ,QAAM,SAAS,IAAI,aAAa,WAAW;AAC3C,SAAO,EAAEA,SAAQ,OAAO,QAAQ;AAC9B,WAAOA,UAAS,OAAO;AACrB,MAAAA,SAAQ,MAAMA,MAAK;AAAA,IACrB;AACA,YAAQ,OAAO,IAAIA,MAAK;AAIxB,QAAIA,UAAS,MAAM,CAAC,EAAE,SAAS,eAAe,OAAO,IAAIA,SAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,kBAAkB;AAChG,kBAAY,MAAM,CAAC,EAAE,WAAW;AAChC,mBAAa;AACb,UAAI,aAAa,UAAU,UAAU,UAAU,UAAU,EAAE,CAAC,EAAE,SAAS,mBAAmB;AACxF,sBAAc;AAAA,MAChB;AACA,UAAI,aAAa,UAAU,UAAU,UAAU,UAAU,EAAE,CAAC,EAAE,SAAS,WAAW;AAChF,eAAO,EAAE,aAAa,UAAU,QAAQ;AACtC,cAAI,UAAU,UAAU,EAAE,CAAC,EAAE,SAAS,WAAW;AAC/C;AAAA,UACF;AACA,cAAI,UAAU,UAAU,EAAE,CAAC,EAAE,SAAS,aAAa;AACjD,sBAAU,UAAU,EAAE,CAAC,EAAE,8BAA8B;AACvD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,MAAM,CAAC,MAAM,SAAS;AACxB,UAAI,MAAM,CAAC,EAAE,aAAa;AACxB,eAAO,OAAO,OAAO,WAAW,QAAQA,MAAK,CAAC;AAC9C,QAAAA,SAAQ,MAAMA,MAAK;AACnB,eAAO;AAAA,MACT;AAAA,IACF,WAES,MAAM,CAAC,EAAE,YAAY;AAC5B,mBAAaA;AACb,kBAAY;AACZ,aAAO,cAAc;AACnB,qBAAa,OAAO,IAAI,UAAU;AAClC,YAAI,WAAW,CAAC,EAAE,SAAS,gBAAgB,WAAW,CAAC,EAAE,SAAS,mBAAmB;AACnF,cAAI,WAAW,CAAC,MAAM,SAAS;AAC7B,gBAAI,WAAW;AACb,qBAAO,IAAI,SAAS,EAAE,CAAC,EAAE,OAAO;AAAA,YAClC;AACA,uBAAW,CAAC,EAAE,OAAO;AACrB,wBAAY;AAAA,UACd;AAAA,QACF,WAAW,WAAW,CAAC,EAAE,SAAS,cAAc;AAAA,QAEhD,OAAO;AACL;AAAA,QACF;AAAA,MACF;AACA,UAAI,WAAW;AAEb,cAAM,CAAC,EAAE,MAAM;AAAA,UACb,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC,EAAE;AAAA,QAC9B;AAGA,qBAAa,OAAO,MAAM,WAAWA,MAAK;AAC1C,mBAAW,QAAQ,KAAK;AACxB,eAAO,OAAO,WAAWA,SAAQ,YAAY,GAAG,UAAU;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAGA,SAAO,aAAa,GAAG,OAAO,mBAAmB,OAAO,MAAM,CAAC,CAAC;AAChE,SAAO,CAAC;AACV;AAYA,SAAS,WAAW,QAAQ,YAAY;AACtC,QAAM,QAAQ,OAAO,IAAI,UAAU,EAAE,CAAC;AACtC,QAAM,UAAU,OAAO,IAAI,UAAU,EAAE,CAAC;AACxC,MAAI,gBAAgB,aAAa;AAEjC,QAAM,iBAAiB,CAAC;AACxB,QAAM,YAAY,MAAM,cAAc,QAAQ,OAAO,MAAM,WAAW,EAAE,MAAM,KAAK;AACnF,QAAM,cAAc,UAAU;AAE9B,QAAM,QAAQ,CAAC;AAEf,QAAM,OAAO,CAAC;AAEd,MAAI;AAEJ,MAAIC;AACJ,MAAID,SAAQ;AAEZ,MAAI,UAAU;AACd,MAAI,SAAS;AACb,MAAIE,SAAQ;AACZ,QAAM,SAAS,CAACA,MAAK;AAIrB,SAAO,SAAS;AAEd,WAAO,OAAO,IAAI,EAAE,aAAa,EAAE,CAAC,MAAM,SAAS;AAAA,IAEnD;AACA,mBAAe,KAAK,aAAa;AACjC,QAAI,CAAC,QAAQ,YAAY;AACvB,eAAS,QAAQ,YAAY,OAAO;AACpC,UAAI,CAAC,QAAQ,MAAM;AACjB,eAAO,KAAK,IAAI;AAAA,MAClB;AACA,UAAID,WAAU;AACZ,kBAAU,WAAW,QAAQ,KAAK;AAAA,MACpC;AACA,UAAI,QAAQ,6BAA6B;AACvC,kBAAU,qCAAqC;AAAA,MACjD;AACA,gBAAU,MAAM,MAAM;AACtB,UAAI,QAAQ,6BAA6B;AACvC,kBAAU,qCAAqC;AAAA,MACjD;AAAA,IACF;AAGA,IAAAA,YAAW;AACX,cAAU,QAAQ;AAAA,EACpB;AAIA,YAAU;AACV,SAAO,EAAED,SAAQ,YAAY,QAAQ;AACnC;AAAA;AAAA,MAEA,YAAYA,MAAK,EAAE,CAAC,MAAM,UAAU,YAAYA,SAAQ,CAAC,EAAE,CAAC,MAAM,WAAW,YAAYA,MAAK,EAAE,CAAC,EAAE,SAAS,YAAYA,SAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,YAAYA,MAAK,EAAE,CAAC,EAAE,MAAM,SAAS,YAAYA,MAAK,EAAE,CAAC,EAAE,IAAI;AAAA,MAAM;AACjN,MAAAE,SAAQF,SAAQ;AAChB,aAAO,KAAKE,MAAK;AAEjB,cAAQ,aAAa;AACrB,cAAQ,WAAW;AACnB,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AAGA,YAAU,SAAS,CAAC;AAKpB,MAAI,SAAS;AAEX,YAAQ,aAAa;AACrB,YAAQ,WAAW;AAAA,EACrB,OAAO;AACL,WAAO,IAAI;AAAA,EACb;AAIA,EAAAF,SAAQ,OAAO;AACf,SAAOA,UAAS;AACd,UAAM,QAAQ,YAAY,MAAM,OAAOA,MAAK,GAAG,OAAOA,SAAQ,CAAC,CAAC;AAChE,UAAME,SAAQ,eAAe,IAAI;AACjC,UAAM,KAAK,CAACA,QAAOA,SAAQ,MAAM,SAAS,CAAC,CAAC;AAC5C,WAAO,OAAOA,QAAO,GAAG,KAAK;AAAA,EAC/B;AACA,QAAM,QAAQ;AACd,EAAAF,SAAQ;AACR,SAAO,EAAEA,SAAQ,MAAM,QAAQ;AAC7B,SAAK,SAAS,MAAMA,MAAK,EAAE,CAAC,CAAC,IAAI,SAAS,MAAMA,MAAK,EAAE,CAAC;AACxD,cAAU,MAAMA,MAAK,EAAE,CAAC,IAAI,MAAMA,MAAK,EAAE,CAAC,IAAI;AAAA,EAChD;AACA,SAAO;AACT;;;AC3MO,IAAMG,WAAU;AAAA,EACrB,SAAS;AAAA,EACT,UAAU;AACZ;AAGA,IAAM,wBAAwB;AAAA,EAC5B,SAAS;AAAA,EACT,UAAU;AACZ;AAQA,SAAS,eAAe,QAAQ;AAC9B,cAAY,MAAM;AAClB,SAAO;AACT;AAOA,SAAS,gBAAgB,SAASC,KAAI;AAEpC,MAAIC;AACJ,SAAO;AAYP,WAAS,WAAWC,OAAM;AACxB,YAAQ,MAAM,SAAS;AACvB,IAAAD,YAAW,QAAQ,MAAM,gBAAgB;AAAA,MACvC,aAAa;AAAA,IACf,CAAC;AACD,WAAO,YAAYC,KAAI;AAAA,EACzB;AAYA,WAAS,YAAYA,OAAM;AACzB,QAAIA,UAAS,MAAM;AACjB,aAAO,WAAWA,KAAI;AAAA,IACxB;AAIA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,aAAO,QAAQ,MAAM,uBAAuB,iBAAiB,UAAU,EAAEA,KAAI;AAAA,IAC/E;AAGA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAOA,WAAS,WAAWA,OAAM;AACxB,YAAQ,KAAK,cAAc;AAC3B,YAAQ,KAAK,SAAS;AACtB,WAAOF,IAAGE,KAAI;AAAA,EAChB;AAOA,WAAS,gBAAgBA,OAAM;AAC7B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,cAAc;AAC3B,IAAAD,UAAS,OAAO,QAAQ,MAAM,gBAAgB;AAAA,MAC5C,aAAa;AAAA,MACb,UAAAA;AAAA,IACF,CAAC;AACD,IAAAA,YAAWA,UAAS;AACpB,WAAO;AAAA,EACT;AACF;AAOA,SAAS,qBAAqB,SAASD,KAAI,KAAK;AAC9C,QAAMG,QAAO;AACb,SAAO;AAOP,WAAS,eAAeD,OAAM;AAC5B,YAAQ,KAAK,cAAc;AAC3B,YAAQ,MAAM,YAAY;AAC1B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,YAAY;AACzB,WAAO,aAAa,SAAS,UAAU,YAAY;AAAA,EACrD;AAOA,WAAS,SAASA,OAAM;AACtB,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,aAAO,IAAIA,KAAI;AAAA,IACjB;AAIA,UAAM,OAAOC,MAAK,OAAOA,MAAK,OAAO,SAAS,CAAC;AAC/C,QAAI,CAACA,MAAK,OAAO,WAAW,QAAQ,KAAK,SAAS,cAAc,KAAK,QAAQ,KAAK,CAAC,EAAE,SAAS,gBAAgB,KAAK,CAAC,EAAE,eAAe,KAAK,CAAC,GAAG,IAAI,EAAE,UAAU,GAAG;AAC/J,aAAOH,IAAGE,KAAI;AAAA,IAChB;AACA,WAAO,QAAQ,UAAUC,MAAK,OAAO,WAAW,MAAM,KAAKH,GAAE,EAAEE,KAAI;AAAA,EACrE;AACF;;;ACxHO,SAAS,mBAAmB,SAASE,KAAI,KAAK,MAAM,aAAa,mBAAmB,SAAS,YAAY,KAAK;AACnH,QAAM,QAAQ,OAAO,OAAO;AAC5B,MAAI,UAAU;AACd,SAAOC;AAcP,WAASA,OAAMC,OAAM;AACnB,QAAIA,UAAS,IAAI;AACf,cAAQ,MAAM,IAAI;AAClB,cAAQ,MAAM,WAAW;AACzB,cAAQ,MAAM,iBAAiB;AAC/B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,iBAAiB;AAC9B,aAAO;AAAA,IACT;AAGA,QAAIA,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAM,aAAaA,KAAI,GAAG;AACrE,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,YAAQ,MAAM,IAAI;AAClB,YAAQ,MAAM,OAAO;AACrB,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,eAAe;AAAA,MAC3B,aAAa;AAAA,IACf,CAAC;AACD,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,eAAeA,OAAM;AAC5B,QAAIA,UAAS,IAAI;AACf,cAAQ,MAAM,iBAAiB;AAC/B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,iBAAiB;AAC9B,cAAQ,KAAK,WAAW;AACxB,cAAQ,KAAK,IAAI;AACjB,aAAOF;AAAA,IACT;AACA,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,eAAe;AAAA,MAC3B,aAAa;AAAA,IACf,CAAC;AACD,WAAO,SAASE,KAAI;AAAA,EACtB;AAYA,WAAS,SAASA,OAAM;AACtB,QAAIA,UAAS,IAAI;AACf,cAAQ,KAAK,aAAa;AAC1B,cAAQ,KAAK,UAAU;AACvB,aAAO,eAAeA,KAAI;AAAA,IAC5B;AACA,QAAIA,UAAS,QAAQA,UAAS,MAAM,mBAAmBA,KAAI,GAAG;AAC5D,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAOA,UAAS,KAAK,iBAAiB;AAAA,EACxC;AAYA,WAAS,eAAeA,OAAM;AAC5B,QAAIA,UAAS,MAAMA,UAAS,MAAMA,UAAS,IAAI;AAC7C,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,SAASA,KAAI;AAAA,EACtB;AAYA,WAAS,IAAIA,OAAM;AACjB,QAAI,CAAC,YAAYA,UAAS,QAAQA,UAAS,MAAM,0BAA0BA,KAAI,IAAI;AACjF,cAAQ,KAAK,aAAa;AAC1B,cAAQ,KAAK,UAAU;AACvB,cAAQ,KAAK,OAAO;AACpB,cAAQ,KAAK,IAAI;AACjB,aAAOF,IAAGE,KAAI;AAAA,IAChB;AACA,QAAI,UAAU,SAASA,UAAS,IAAI;AAClC,cAAQ,QAAQA,KAAI;AACpB;AACA,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB;AACA,aAAO;AAAA,IACT;AAKA,QAAIA,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAM,aAAaA,KAAI,GAAG;AACrE,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAOA,UAAS,KAAK,YAAY;AAAA,EACnC;AAYA,WAAS,UAAUA,OAAM;AACvB,QAAIA,UAAS,MAAMA,UAAS,MAAMA,UAAS,IAAI;AAC7C,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AACF;;;ACpKO,SAAS,aAAa,SAASC,KAAI,KAAK,MAAM,YAAY,YAAY;AAC3E,QAAMC,QAAO;AACb,MAAI,OAAO;AAEX,MAAI;AACJ,SAAOC;AAYP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,IAAI;AAClB,YAAQ,MAAM,UAAU;AACxB,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,UAAU;AACvB,YAAQ,MAAM,UAAU;AACxB,WAAO;AAAA,EACT;AAYA,WAAS,QAAQA,OAAM;AACrB,QAAI,OAAO,OAAOA,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAMlEA,UAAS,MAAM,CAAC,QAAQ,4BAA4BF,MAAK,OAAO,YAAY;AAC1E,aAAO,IAAIE,KAAI;AAAA,IACjB;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,KAAK,UAAU;AACvB,cAAQ,MAAM,UAAU;AACxB,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,UAAU;AACvB,cAAQ,KAAK,IAAI;AACjB,aAAOH;AAAA,IACT;AAGA,QAAI,mBAAmBG,KAAI,GAAG;AAC5B,cAAQ,MAAM,YAAY;AAC1B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,YAAY;AACzB,aAAO;AAAA,IACT;AACA,YAAQ,MAAM,eAAe;AAAA,MAC3B,aAAa;AAAA,IACf,CAAC;AACD,WAAO,YAAYA,KAAI;AAAA,EACzB;AAYA,WAAS,YAAYA,OAAM;AACzB,QAAIA,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAM,mBAAmBA,KAAI,KAAK,SAAS,KAAK;AAC3F,cAAQ,KAAK,aAAa;AAC1B,aAAO,QAAQA,KAAI;AAAA,IACrB;AACA,YAAQ,QAAQA,KAAI;AACpB,QAAI,CAAC,KAAM,QAAO,CAAC,cAAcA,KAAI;AACrC,WAAOA,UAAS,KAAK,cAAc;AAAA,EACrC;AAYA,WAAS,YAAYA,OAAM;AACzB,QAAIA,UAAS,MAAMA,UAAS,MAAMA,UAAS,IAAI;AAC7C,cAAQ,QAAQA,KAAI;AACpB;AACA,aAAO;AAAA,IACT;AACA,WAAO,YAAYA,KAAI;AAAA,EACzB;AACF;;;ACzGO,SAAS,aAAa,SAASC,KAAI,KAAK,MAAM,YAAY,YAAY;AAE3E,MAAI;AACJ,SAAOC;AAYP,WAASA,OAAMC,OAAM;AACnB,QAAIA,UAAS,MAAMA,UAAS,MAAMA,UAAS,IAAI;AAC7C,cAAQ,MAAM,IAAI;AAClB,cAAQ,MAAM,UAAU;AACxB,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,UAAU;AACvB,eAASA,UAAS,KAAK,KAAKA;AAC5B,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAcA,WAAS,MAAMA,OAAM;AACnB,QAAIA,UAAS,QAAQ;AACnB,cAAQ,MAAM,UAAU;AACxB,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,UAAU;AACvB,cAAQ,KAAK,IAAI;AACjB,aAAOF;AAAA,IACT;AACA,YAAQ,MAAM,UAAU;AACxB,WAAO,QAAQE,KAAI;AAAA,EACrB;AAYA,WAAS,QAAQA,OAAM;AACrB,QAAIA,UAAS,QAAQ;AACnB,cAAQ,KAAK,UAAU;AACvB,aAAO,MAAM,MAAM;AAAA,IACrB;AACA,QAAIA,UAAS,MAAM;AACjB,aAAO,IAAIA,KAAI;AAAA,IACjB;AAGA,QAAI,mBAAmBA,KAAI,GAAG;AAE5B,cAAQ,MAAM,YAAY;AAC1B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,YAAY;AACzB,aAAO,aAAa,SAAS,SAAS,YAAY;AAAA,IACpD;AACA,YAAQ,MAAM,eAAe;AAAA,MAC3B,aAAa;AAAA,IACf,CAAC;AACD,WAAO,OAAOA,KAAI;AAAA,EACpB;AAOA,WAAS,OAAOA,OAAM;AACpB,QAAIA,UAAS,UAAUA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAChE,cAAQ,KAAK,aAAa;AAC1B,aAAO,QAAQA,KAAI;AAAA,IACrB;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAOA,UAAS,KAAK,SAAS;AAAA,EAChC;AAYA,WAAS,OAAOA,OAAM;AACpB,QAAIA,UAAS,UAAUA,UAAS,IAAI;AAClC,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,OAAOA,KAAI;AAAA,EACpB;AACF;;;ACrIO,SAAS,kBAAkB,SAASC,KAAI;AAE7C,MAAI;AACJ,SAAOC;AAGP,WAASA,OAAMC,OAAM;AACnB,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,cAAQ,MAAM,YAAY;AAC1B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,YAAY;AACzB,aAAO;AACP,aAAOD;AAAA,IACT;AACA,QAAI,cAAcC,KAAI,GAAG;AACvB,aAAO,aAAa,SAASD,QAAO,OAAO,eAAe,YAAY,EAAEC,KAAI;AAAA,IAC9E;AACA,WAAOF,IAAGE,KAAI;AAAA,EAChB;AACF;;;AC1BO,IAAM,aAAa;AAAA,EACxB,MAAM;AAAA,EACN,UAAU;AACZ;AAGA,IAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,UAAU;AACZ;AAOA,SAAS,mBAAmB,SAASC,KAAI,KAAK;AAC5C,QAAMC,QAAO;AAEb,MAAI;AACJ,SAAOC;AAYP,WAASA,OAAMC,OAAM;AAInB,YAAQ,MAAM,YAAY;AAC1B,WAAO,OAAOA,KAAI;AAAA,EACpB;AAYA,WAAS,OAAOA,OAAM;AAGpB,WAAO,aAAa;AAAA,MAAKF;AAAA,MAAM;AAAA,MAAS;AAAA;AAAA,MAExC;AAAA,MAAK;AAAA,MAAmB;AAAA,MAAyB;AAAA,IAAuB,EAAEE,KAAI;AAAA,EAChF;AAYA,WAAS,WAAWA,OAAM;AACxB,iBAAa,oBAAoBF,MAAK,eAAeA,MAAK,OAAOA,MAAK,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AACzG,QAAIE,UAAS,IAAI;AACf,cAAQ,MAAM,kBAAkB;AAChC,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,kBAAkB;AAC/B,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,YAAYA,OAAM;AAEzB,WAAO,0BAA0BA,KAAI,IAAI,kBAAkB,SAAS,iBAAiB,EAAEA,KAAI,IAAI,kBAAkBA,KAAI;AAAA,EACvH;AAYA,WAAS,kBAAkBA,OAAM;AAC/B,WAAO;AAAA,MAAmB;AAAA,MAAS;AAAA;AAAA,MAEnC;AAAA,MAAK;AAAA,MAAyB;AAAA,MAAgC;AAAA,MAAsC;AAAA,MAA4B;AAAA,IAA6B,EAAEA,KAAI;AAAA,EACrK;AAYA,WAAS,iBAAiBA,OAAM;AAC9B,WAAO,QAAQ,QAAQ,aAAa,OAAO,KAAK,EAAEA,KAAI;AAAA,EACxD;AAcA,WAAS,MAAMA,OAAM;AACnB,WAAO,cAAcA,KAAI,IAAI,aAAa,SAAS,iBAAiB,YAAY,EAAEA,KAAI,IAAI,gBAAgBA,KAAI;AAAA,EAChH;AAcA,WAAS,gBAAgBA,OAAM;AAC7B,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,cAAQ,KAAK,YAAY;AAKzB,MAAAF,MAAK,OAAO,QAAQ,KAAK,UAAU;AAKnC,aAAOD,IAAGG,KAAI;AAAA,IAChB;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AACF;AAOA,SAAS,oBAAoB,SAASH,KAAI,KAAK;AAC7C,SAAOI;AAcP,WAASA,aAAYD,OAAM;AACzB,WAAO,0BAA0BA,KAAI,IAAI,kBAAkB,SAAS,YAAY,EAAEA,KAAI,IAAI,IAAIA,KAAI;AAAA,EACpG;AAaA,WAAS,aAAaA,OAAM;AAC1B,WAAO,aAAa,SAAS,YAAY,KAAK,mBAAmB,yBAAyB,uBAAuB,EAAEA,KAAI;AAAA,EACzH;AAYA,WAAS,WAAWA,OAAM;AACxB,WAAO,cAAcA,KAAI,IAAI,aAAa,SAAS,8BAA8B,YAAY,EAAEA,KAAI,IAAI,6BAA6BA,KAAI;AAAA,EAC1I;AAYA,WAAS,6BAA6BA,OAAM;AAC1C,WAAOA,UAAS,QAAQ,mBAAmBA,KAAI,IAAIH,IAAGG,KAAI,IAAI,IAAIA,KAAI;AAAA,EACxE;AACF;;;AClPO,IAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,UAAU;AACZ;AAOA,SAAS,wBAAwB,SAASE,KAAI,KAAK;AACjD,SAAOC;AAaP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAaA,WAAS,MAAMA,OAAM;AACnB,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,cAAQ,KAAK,iBAAiB;AAC9B,aAAOF,IAAGE,KAAI;AAAA,IAChB;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AACF;;;AC5CO,IAAM,aAAa;AAAA,EACxB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AACZ;AAGA,SAAS,kBAAkB,QAAQ,SAAS;AAC1C,MAAI,aAAa,OAAO,SAAS;AACjC,MAAI,eAAe;AAEnB,MAAIC;AAEJ,MAAIC;AAGJ,MAAI,OAAO,YAAY,EAAE,CAAC,EAAE,SAAS,cAAc;AACjD,oBAAgB;AAAA,EAClB;AAGA,MAAI,aAAa,IAAI,gBAAgB,OAAO,UAAU,EAAE,CAAC,EAAE,SAAS,cAAc;AAChF,kBAAc;AAAA,EAChB;AACA,MAAI,OAAO,UAAU,EAAE,CAAC,EAAE,SAAS,yBAAyB,iBAAiB,aAAa,KAAK,aAAa,IAAI,gBAAgB,OAAO,aAAa,CAAC,EAAE,CAAC,EAAE,SAAS,eAAe;AAChL,kBAAc,eAAe,MAAM,aAAa,IAAI;AAAA,EACtD;AACA,MAAI,aAAa,cAAc;AAC7B,IAAAD,WAAU;AAAA,MACR,MAAM;AAAA,MACN,OAAO,OAAO,YAAY,EAAE,CAAC,EAAE;AAAA,MAC/B,KAAK,OAAO,UAAU,EAAE,CAAC,EAAE;AAAA,IAC7B;AACA,IAAAC,QAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,OAAO,YAAY,EAAE,CAAC,EAAE;AAAA,MAC/B,KAAK,OAAO,UAAU,EAAE,CAAC,EAAE;AAAA,MAC3B,aAAa;AAAA,IACf;AACA,WAAO,QAAQ,cAAc,aAAa,eAAe,GAAG,CAAC,CAAC,SAASD,UAAS,OAAO,GAAG,CAAC,SAASC,OAAM,OAAO,GAAG,CAAC,QAAQA,OAAM,OAAO,GAAG,CAAC,QAAQD,UAAS,OAAO,CAAC,CAAC;AAAA,EAC1K;AACA,SAAO;AACT;AAOA,SAAS,mBAAmB,SAASE,KAAI,KAAK;AAC5C,MAAI,OAAO;AACX,SAAOC;AAYP,WAASA,OAAMC,OAAM;AAEnB,YAAQ,MAAM,YAAY;AAC1B,WAAO,OAAOA,KAAI;AAAA,EACpB;AAYA,WAAS,OAAOA,OAAM;AACpB,YAAQ,MAAM,oBAAoB;AAClC,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAYA,WAAS,aAAaA,OAAM;AAC1B,QAAIA,UAAS,MAAM,SAAS,GAAG;AAC7B,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AAGA,QAAIA,UAAS,QAAQ,0BAA0BA,KAAI,GAAG;AACpD,cAAQ,KAAK,oBAAoB;AACjC,aAAO,QAAQA,KAAI;AAAA,IACrB;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,QAAQA,OAAM;AACrB,QAAIA,UAAS,IAAI;AACf,cAAQ,MAAM,oBAAoB;AAClC,aAAO,gBAAgBA,KAAI;AAAA,IAC7B;AACA,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,cAAQ,KAAK,YAAY;AAIzB,aAAOF,IAAGE,KAAI;AAAA,IAChB;AACA,QAAI,cAAcA,KAAI,GAAG;AACvB,aAAO,aAAa,SAAS,SAAS,YAAY,EAAEA,KAAI;AAAA,IAC1D;AAIA,YAAQ,MAAM,gBAAgB;AAC9B,WAAO,KAAKA,KAAI;AAAA,EAClB;AAcA,WAAS,gBAAgBA,OAAM;AAC7B,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,YAAQ,KAAK,oBAAoB;AACjC,WAAO,QAAQA,KAAI;AAAA,EACrB;AAYA,WAAS,KAAKA,OAAM;AAClB,QAAIA,UAAS,QAAQA,UAAS,MAAM,0BAA0BA,KAAI,GAAG;AACnE,cAAQ,KAAK,gBAAgB;AAC7B,aAAO,QAAQA,KAAI;AAAA,IACrB;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AACF;;;ACnLO,IAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAcO,IAAM,eAAe,CAAC,OAAO,UAAU,SAAS,UAAU;;;AC5E1D,IAAM,WAAW;AAAA,EACtB,UAAU;AAAA,EACV,MAAM;AAAA,EACN,WAAW;AAAA,EACX,UAAU;AACZ;AAGA,IAAM,kBAAkB;AAAA,EACtB,SAAS;AAAA,EACT,UAAU;AACZ;AACA,IAAM,2BAA2B;AAAA,EAC/B,SAAS;AAAA,EACT,UAAU;AACZ;AAGA,SAAS,kBAAkB,QAAQ;AACjC,MAAIC,SAAQ,OAAO;AACnB,SAAOA,UAAS;AACd,QAAI,OAAOA,MAAK,EAAE,CAAC,MAAM,WAAW,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,YAAY;AACxE;AAAA,IACF;AAAA,EACF;AACA,MAAIA,SAAQ,KAAK,OAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,cAAc;AAE3D,WAAOA,MAAK,EAAE,CAAC,EAAE,QAAQ,OAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE;AAE9C,WAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,OAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE;AAElD,WAAO,OAAOA,SAAQ,GAAG,CAAC;AAAA,EAC5B;AACA,SAAO;AACT;AAOA,SAAS,iBAAiB,SAASC,KAAI,KAAK;AAC1C,QAAMC,QAAO;AAEb,MAAI;AAEJ,MAAI;AAEJ,MAAI;AAEJ,MAAIF;AAEJ,MAAI;AACJ,SAAOG;AAYP,WAASA,OAAMC,OAAM;AAEnB,WAAO,OAAOA,KAAI;AAAA,EACpB;AAYA,WAAS,OAAOA,OAAM;AACpB,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,cAAc;AAC5B,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAgBA,WAAS,KAAKA,OAAM;AAClB,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,mBAAa;AACb,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,eAAS;AAMT,aAAOF,MAAK,YAAYD,MAAK;AAAA,IAC/B;AAGA,QAAI,WAAWG,KAAI,GAAG;AAEpB,cAAQ,QAAQA,KAAI;AACpB,eAAS,OAAO,aAAaA,KAAI;AACjC,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAgBA,WAAS,gBAAgBA,OAAM;AAC7B,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,eAAS;AACT,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,eAAS;AACT,MAAAJ,SAAQ;AACR,aAAO;AAAA,IACT;AAGA,QAAI,WAAWI,KAAI,GAAG;AACpB,cAAQ,QAAQA,KAAI;AACpB,eAAS;AAGT,aAAOF,MAAK,YAAYD,MAAK;AAAA,IAC/B;AACA,WAAO,IAAIG,KAAI;AAAA,EACjB;AAYA,WAAS,kBAAkBA,OAAM;AAC/B,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AAGpB,aAAOF,MAAK,YAAYD,MAAK;AAAA,IAC/B;AACA,WAAO,IAAIG,KAAI;AAAA,EACjB;AAYA,WAAS,gBAAgBA,OAAM;AAC7B,UAAM,QAAQ;AACd,QAAIA,UAAS,MAAM,WAAWJ,QAAO,GAAG;AACtC,cAAQ,QAAQI,KAAI;AACpB,UAAIJ,WAAU,MAAM,QAAQ;AAG1B,eAAOE,MAAK,YAAYD,MAAK;AAAA,MAC/B;AACA,aAAO;AAAA,IACT;AACA,WAAO,IAAIG,KAAI;AAAA,EACjB;AAYA,WAAS,cAAcA,OAAM;AAC3B,QAAI,WAAWA,KAAI,GAAG;AAEpB,cAAQ,QAAQA,KAAI;AACpB,eAAS,OAAO,aAAaA,KAAI;AACjC,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAcA,WAAS,QAAQA,OAAM;AACrB,QAAIA,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAM,0BAA0BA,KAAI,GAAG;AAClF,YAAM,QAAQA,UAAS;AACvB,YAAMC,QAAO,OAAO,YAAY;AAChC,UAAI,CAAC,SAAS,CAAC,cAAc,aAAa,SAASA,KAAI,GAAG;AACxD,iBAAS;AAGT,eAAOH,MAAK,YAAYD,IAAGG,KAAI,IAAI,aAAaA,KAAI;AAAA,MACtD;AACA,UAAI,eAAe,SAAS,OAAO,YAAY,CAAC,GAAG;AACjD,iBAAS;AACT,YAAI,OAAO;AACT,kBAAQ,QAAQA,KAAI;AACpB,iBAAO;AAAA,QACT;AAIA,eAAOF,MAAK,YAAYD,IAAGG,KAAI,IAAI,aAAaA,KAAI;AAAA,MACtD;AACA,eAAS;AAET,aAAOF,MAAK,aAAa,CAACA,MAAK,OAAO,KAAKA,MAAK,IAAI,EAAE,IAAI,IAAI,IAAIE,KAAI,IAAI,aAAa,wBAAwBA,KAAI,IAAI,4BAA4BA,KAAI;AAAA,IACzJ;AAGA,QAAIA,UAAS,MAAM,kBAAkBA,KAAI,GAAG;AAC1C,cAAQ,QAAQA,KAAI;AACpB,gBAAU,OAAO,aAAaA,KAAI;AAClC,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,iBAAiBA,OAAM;AAC9B,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AAGpB,aAAOF,MAAK,YAAYD,MAAK;AAAA,IAC/B;AACA,WAAO,IAAIG,KAAI;AAAA,EACjB;AAYA,WAAS,wBAAwBA,OAAM;AACrC,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,YAAYA,KAAI;AAAA,EACzB;AAyBA,WAAS,4BAA4BA,OAAM;AACzC,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AAGA,QAAIA,UAAS,MAAMA,UAAS,MAAM,WAAWA,KAAI,GAAG;AAClD,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,YAAYA,KAAI;AAAA,EACzB;AAgBA,WAAS,sBAAsBA,OAAM;AAEnC,QAAIA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAM,kBAAkBA,KAAI,GAAG;AACvF,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,2BAA2BA,KAAI;AAAA,EACxC;AAeA,WAAS,2BAA2BA,OAAM;AACxC,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,4BAA4BA,KAAI;AAAA,EACzC;AAeA,WAAS,6BAA6BA,OAAM;AAC1C,QAAIA,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,IAAI;AAC7E,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAIA,UAAS,MAAMA,UAAS,IAAI;AAC9B,cAAQ,QAAQA,KAAI;AACpB,gBAAUA;AACV,aAAO;AAAA,IACT;AACA,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,+BAA+BA,KAAI;AAAA,EAC5C;AAcA,WAAS,6BAA6BA,OAAM;AAC1C,QAAIA,UAAS,SAAS;AACpB,cAAQ,QAAQA,KAAI;AACpB,gBAAU;AACV,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,+BAA+BA,OAAM;AAC5C,QAAIA,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAM,0BAA0BA,KAAI,GAAG;AAC7J,aAAO,2BAA2BA,KAAI;AAAA,IACxC;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAaA,WAAS,kCAAkCA,OAAM;AAC/C,QAAIA,UAAS,MAAMA,UAAS,MAAM,cAAcA,KAAI,GAAG;AACrD,aAAO,4BAA4BA,KAAI;AAAA,IACzC;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,YAAYA,OAAM;AACzB,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,cAAcA,OAAM;AAC3B,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAG7C,aAAO,aAAaA,KAAI;AAAA,IAC1B;AACA,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,aAAaA,OAAM;AAC1B,QAAIA,UAAS,MAAM,WAAW,GAAG;AAC/B,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,MAAM,WAAW,GAAG;AAC/B,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,MAAM,WAAW,GAAG;AAC/B,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,MAAM,WAAW,GAAG;AAC/B,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,MAAM,WAAW,GAAG;AAC/B,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAI,mBAAmBA,KAAI,MAAM,WAAW,KAAK,WAAW,IAAI;AAC9D,cAAQ,KAAK,cAAc;AAC3B,aAAO,QAAQ,MAAM,iBAAiB,mBAAmB,iBAAiB,EAAEA,KAAI;AAAA,IAClF;AACA,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,cAAQ,KAAK,cAAc;AAC3B,aAAO,kBAAkBA,KAAI;AAAA,IAC/B;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAaA,WAAS,kBAAkBA,OAAM;AAC/B,WAAO,QAAQ,MAAM,0BAA0B,0BAA0B,iBAAiB,EAAEA,KAAI;AAAA,EAClG;AAaA,WAAS,yBAAyBA,OAAM;AACtC,YAAQ,MAAM,YAAY;AAC1B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,YAAY;AACzB,WAAO;AAAA,EACT;AAaA,WAAS,mBAAmBA,OAAM;AAChC,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,aAAO,kBAAkBA,KAAI;AAAA,IAC/B;AACA,YAAQ,MAAM,cAAc;AAC5B,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAYA,WAAS,0BAA0BA,OAAM;AACvC,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAYA,WAAS,uBAAuBA,OAAM;AACpC,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,eAAS;AACT,aAAO;AAAA,IACT;AACA,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAYA,WAAS,sBAAsBA,OAAM;AACnC,QAAIA,UAAS,IAAI;AACf,YAAMC,QAAO,OAAO,YAAY;AAChC,UAAI,aAAa,SAASA,KAAI,GAAG;AAC/B,gBAAQ,QAAQD,KAAI;AACpB,eAAO;AAAA,MACT;AACA,aAAO,aAAaA,KAAI;AAAA,IAC1B;AACA,QAAI,WAAWA,KAAI,KAAK,OAAO,SAAS,GAAG;AAEzC,cAAQ,QAAQA,KAAI;AACpB,gBAAU,OAAO,aAAaA,KAAI;AAClC,aAAO;AAAA,IACT;AACA,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAYA,WAAS,wBAAwBA,OAAM;AACrC,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAoBA,WAAS,8BAA8BA,OAAM;AAC3C,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AAGA,QAAIA,UAAS,MAAM,WAAW,GAAG;AAC/B,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAYA,WAAS,kBAAkBA,OAAM;AAC/B,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,cAAQ,KAAK,cAAc;AAC3B,aAAO,kBAAkBA,KAAI;AAAA,IAC/B;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,kBAAkBA,OAAM;AAC/B,YAAQ,KAAK,UAAU;AAKvB,WAAOH,IAAGG,KAAI;AAAA,EAChB;AACF;AAOA,SAAS,iCAAiC,SAASH,KAAI,KAAK;AAC1D,QAAMC,QAAO;AACb,SAAOC;AAaP,WAASA,OAAMC,OAAM;AACnB,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,cAAQ,MAAM,YAAY;AAC1B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,YAAY;AACzB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAaA,WAAS,MAAMA,OAAM;AACnB,WAAOF,MAAK,OAAO,KAAKA,MAAK,IAAI,EAAE,IAAI,IAAI,IAAIE,KAAI,IAAIH,IAAGG,KAAI;AAAA,EAChE;AACF;AAOA,SAAS,wBAAwB,SAASH,KAAI,KAAK;AACjD,SAAOE;AAaP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,YAAY;AAC1B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,YAAY;AACzB,WAAO,QAAQ,QAAQ,WAAWH,KAAI,GAAG;AAAA,EAC3C;AACF;;;AC91BO,IAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,UAAU;AACZ;AAOA,SAAS,iBAAiB,SAASK,KAAI,KAAK;AAC1C,QAAMC,QAAO;AAEb,MAAI;AAEJ,MAAIC;AAEJ,MAAI;AACJ,SAAOC;AAYP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,cAAc;AAC5B,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAgBA,WAAS,KAAKA,OAAM;AAClB,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AAGA,QAAI,WAAWA,KAAI,GAAG;AACpB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAgBA,WAAS,gBAAgBA,OAAM;AAC7B,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,MAAAF,SAAQ;AACR,aAAO;AAAA,IACT;AACA,QAAI,WAAWE,KAAI,GAAG;AACpB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,kBAAkBA,OAAM;AAC/B,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,QAAQA,OAAM;AACrB,QAAIA,UAAS,MAAM;AACjB,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,oBAAc;AACd,aAAO,iBAAiBA,KAAI;AAAA,IAC9B;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,aAAaA,OAAM;AAC1B,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,QAAQA,KAAI;AAAA,EACrB;AAYA,WAAS,WAAWA,OAAM;AACxB,WAAOA,UAAS,KAAK,IAAIA,KAAI,IAAIA,UAAS,KAAK,aAAaA,KAAI,IAAI,QAAQA,KAAI;AAAA,EAClF;AAYA,WAAS,gBAAgBA,OAAM;AAC7B,UAAM,QAAQ;AACd,QAAIA,UAAS,MAAM,WAAWF,QAAO,GAAG;AACtC,cAAQ,QAAQE,KAAI;AACpB,aAAOF,WAAU,MAAM,SAAS,QAAQ;AAAA,IAC1C;AACA,WAAO,IAAIE,KAAI;AAAA,EACjB;AAYA,WAAS,MAAMA,OAAM;AACnB,QAAIA,UAAS,MAAM;AACjB,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,oBAAc;AACd,aAAO,iBAAiBA,KAAI;AAAA,IAC9B;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,WAAWA,OAAM;AACxB,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,MAAMA,KAAI;AAAA,EACnB;AAYA,WAAS,SAASA,OAAM;AACtB,QAAIA,UAAS,IAAI;AACf,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,MAAMA,KAAI;AAAA,EACnB;AAYA,WAAS,YAAYA,OAAM;AACzB,QAAIA,UAAS,QAAQA,UAAS,IAAI;AAChC,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,oBAAc;AACd,aAAO,iBAAiBA,KAAI;AAAA,IAC9B;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,YAAYA,OAAM;AACzB,QAAIA,UAAS,MAAM;AACjB,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,oBAAc;AACd,aAAO,iBAAiBA,KAAI;AAAA,IAC9B;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,iBAAiBA,OAAM;AAC9B,WAAOA,UAAS,KAAK,IAAIA,KAAI,IAAI,YAAYA,KAAI;AAAA,EACnD;AAYA,WAAS,cAAcA,OAAM;AAE3B,QAAI,WAAWA,KAAI,GAAG;AACpB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,SAASA,OAAM;AAEtB,QAAIA,UAAS,MAAM,kBAAkBA,KAAI,GAAG;AAC1C,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,gBAAgBA,KAAI;AAAA,EAC7B;AAYA,WAAS,gBAAgBA,OAAM;AAC7B,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,oBAAc;AACd,aAAO,iBAAiBA,KAAI;AAAA,IAC9B;AACA,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,QAAQA,OAAM;AAErB,QAAIA,UAAS,MAAM,kBAAkBA,KAAI,GAAG;AAC1C,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,MAAMA,UAAS,MAAM,0BAA0BA,KAAI,GAAG;AACjE,aAAO,eAAeA,KAAI;AAAA,IAC5B;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,eAAeA,OAAM;AAC5B,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AAGA,QAAIA,UAAS,MAAMA,UAAS,MAAM,WAAWA,KAAI,GAAG;AAClD,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,oBAAc;AACd,aAAO,iBAAiBA,KAAI;AAAA,IAC9B;AACA,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,qBAAqBA,OAAM;AAElC,QAAIA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAM,kBAAkBA,KAAI,GAAG;AACvF,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,0BAA0BA,KAAI;AAAA,EACvC;AAaA,WAAS,0BAA0BA,OAAM;AACvC,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,oBAAc;AACd,aAAO,iBAAiBA,KAAI;AAAA,IAC9B;AACA,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,eAAeA,KAAI;AAAA,EAC5B;AAaA,WAAS,4BAA4BA,OAAM;AACzC,QAAIA,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,IAAI;AAC7E,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAIA,UAAS,MAAMA,UAAS,IAAI;AAC9B,cAAQ,QAAQA,KAAI;AACpB,eAASA;AACT,aAAO;AAAA,IACT;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,oBAAc;AACd,aAAO,iBAAiBA,KAAI;AAAA,IAC9B;AACA,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,4BAA4BA,OAAM;AACzC,QAAIA,UAAS,QAAQ;AACnB,cAAQ,QAAQA,KAAI;AACpB,eAAS;AACT,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,MAAM;AACjB,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,oBAAc;AACd,aAAO,iBAAiBA,KAAI;AAAA,IAC9B;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,8BAA8BA,OAAM;AAC3C,QAAIA,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,IAAI;AAC5F,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAIA,UAAS,MAAMA,UAAS,MAAM,0BAA0BA,KAAI,GAAG;AACjE,aAAO,eAAeA,KAAI;AAAA,IAC5B;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAaA,WAAS,iCAAiCA,OAAM;AAC9C,QAAIA,UAAS,MAAMA,UAAS,MAAM,0BAA0BA,KAAI,GAAG;AACjE,aAAO,eAAeA,KAAI;AAAA,IAC5B;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,IAAIA,OAAM;AACjB,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,cAAc;AAC3B,cAAQ,KAAK,UAAU;AACvB,aAAOJ;AAAA,IACT;AACA,WAAO,IAAII,KAAI;AAAA,EACjB;AAgBA,WAAS,iBAAiBA,OAAM;AAC9B,YAAQ,KAAK,cAAc;AAC3B,YAAQ,MAAM,YAAY;AAC1B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,YAAY;AACzB,WAAO;AAAA,EACT;AAgBA,WAAS,gBAAgBA,OAAM;AAG7B,WAAO,cAAcA,KAAI,IAAI,aAAa,SAAS,uBAAuB,cAAcH,MAAK,OAAO,WAAW,QAAQ,KAAK,SAAS,cAAc,IAAI,SAAY,CAAC,EAAEG,KAAI,IAAI,sBAAsBA,KAAI;AAAA,EAC1M;AAgBA,WAAS,sBAAsBA,OAAM;AACnC,YAAQ,MAAM,cAAc;AAC5B,WAAO,YAAYA,KAAI;AAAA,EACzB;AACF;;;AChpBO,IAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AACZ;AAGA,IAAM,oBAAoB;AAAA,EACxB,UAAU;AACZ;AAEA,IAAM,yBAAyB;AAAA,EAC7B,UAAU;AACZ;AAEA,IAAM,8BAA8B;AAAA,EAClC,UAAU;AACZ;AAGA,SAAS,mBAAmB,QAAQ;AAClC,MAAIC,SAAQ;AAEZ,QAAM,YAAY,CAAC;AACnB,SAAO,EAAEA,SAAQ,OAAO,QAAQ;AAC9B,UAAM,QAAQ,OAAOA,MAAK,EAAE,CAAC;AAC7B,cAAU,KAAK,OAAOA,MAAK,CAAC;AAC5B,QAAI,MAAM,SAAS,gBAAgB,MAAM,SAAS,eAAe,MAAM,SAAS,YAAY;AAE1F,YAAM,SAAS,MAAM,SAAS,eAAe,IAAI;AACjD,YAAM,OAAO;AACb,MAAAA,UAAS;AAAA,IACX;AAAA,EACF;AAGA,MAAI,OAAO,WAAW,UAAU,QAAQ;AACtC,WAAO,QAAQ,GAAG,OAAO,QAAQ,SAAS;AAAA,EAC5C;AACA,SAAO;AACT;AAGA,SAAS,kBAAkB,QAAQ,SAAS;AAC1C,MAAIA,SAAQ,OAAO;AACnB,MAAI,SAAS;AAEb,MAAI;AAEJ,MAAI;AAEJ,MAAI;AAEJ,MAAI;AAGJ,SAAOA,UAAS;AACd,YAAQ,OAAOA,MAAK,EAAE,CAAC;AACvB,QAAI,MAAM;AAER,UAAI,MAAM,SAAS,UAAU,MAAM,SAAS,eAAe,MAAM,WAAW;AAC1E;AAAA,MACF;AAIA,UAAI,OAAOA,MAAK,EAAE,CAAC,MAAM,WAAW,MAAM,SAAS,aAAa;AAC9D,cAAM,YAAY;AAAA,MACpB;AAAA,IACF,WAAW,OAAO;AAChB,UAAI,OAAOA,MAAK,EAAE,CAAC,MAAM,YAAY,MAAM,SAAS,gBAAgB,MAAM,SAAS,gBAAgB,CAAC,MAAM,WAAW;AACnH,eAAOA;AACP,YAAI,MAAM,SAAS,aAAa;AAC9B,mBAAS;AACT;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,MAAM,SAAS,YAAY;AACpC,cAAQA;AAAA,IACV;AAAA,EACF;AACA,QAAM,QAAQ;AAAA,IACZ,MAAM,OAAO,IAAI,EAAE,CAAC,EAAE,SAAS,cAAc,SAAS;AAAA,IACtD,OAAO;AAAA,MACL,GAAG,OAAO,IAAI,EAAE,CAAC,EAAE;AAAA,IACrB;AAAA,IACA,KAAK;AAAA,MACH,GAAG,OAAO,OAAO,SAAS,CAAC,EAAE,CAAC,EAAE;AAAA,IAClC;AAAA,EACF;AACA,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,OAAO;AAAA,MACL,GAAG,OAAO,IAAI,EAAE,CAAC,EAAE;AAAA,IACrB;AAAA,IACA,KAAK;AAAA,MACH,GAAG,OAAO,KAAK,EAAE,CAAC,EAAE;AAAA,IACtB;AAAA,EACF;AACA,QAAMC,QAAO;AAAA,IACX,MAAM;AAAA,IACN,OAAO;AAAA,MACL,GAAG,OAAO,OAAO,SAAS,CAAC,EAAE,CAAC,EAAE;AAAA,IAClC;AAAA,IACA,KAAK;AAAA,MACH,GAAG,OAAO,QAAQ,CAAC,EAAE,CAAC,EAAE;AAAA,IAC1B;AAAA,EACF;AACA,UAAQ,CAAC,CAAC,SAAS,OAAO,OAAO,GAAG,CAAC,SAAS,OAAO,OAAO,CAAC;AAG7D,UAAQ,KAAK,OAAO,OAAO,MAAM,OAAO,GAAG,OAAO,SAAS,CAAC,CAAC;AAG7D,UAAQ,KAAK,OAAO,CAAC,CAAC,SAASA,OAAM,OAAO,CAAC,CAAC;AAK9C,UAAQ,KAAK,OAAO,WAAW,QAAQ,OAAO,WAAW,WAAW,MAAM,OAAO,MAAM,OAAO,SAAS,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC;AAG9H,UAAQ,KAAK,OAAO,CAAC,CAAC,QAAQA,OAAM,OAAO,GAAG,OAAO,QAAQ,CAAC,GAAG,OAAO,QAAQ,CAAC,GAAG,CAAC,QAAQ,OAAO,OAAO,CAAC,CAAC;AAG7G,UAAQ,KAAK,OAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAG3C,UAAQ,KAAK,OAAO,CAAC,CAAC,QAAQ,OAAO,OAAO,CAAC,CAAC;AAC9C,SAAO,QAAQ,MAAM,OAAO,QAAQ,KAAK;AACzC,SAAO;AACT;AAOA,SAAS,iBAAiB,SAASC,KAAI,KAAK;AAC1C,QAAMC,QAAO;AACb,MAAIH,SAAQG,MAAK,OAAO;AAExB,MAAI;AAEJ,MAAI;AAGJ,SAAOH,UAAS;AACd,SAAKG,MAAK,OAAOH,MAAK,EAAE,CAAC,EAAE,SAAS,gBAAgBG,MAAK,OAAOH,MAAK,EAAE,CAAC,EAAE,SAAS,gBAAgB,CAACG,MAAK,OAAOH,MAAK,EAAE,CAAC,EAAE,WAAW;AACnI,mBAAaG,MAAK,OAAOH,MAAK,EAAE,CAAC;AACjC;AAAA,IACF;AAAA,EACF;AACA,SAAOI;AAiBP,WAASA,OAAMC,OAAM;AAEnB,QAAI,CAAC,YAAY;AACf,aAAO,IAAIA,KAAI;AAAA,IACjB;AAWA,QAAI,WAAW,WAAW;AACxB,aAAO,YAAYA,KAAI;AAAA,IACzB;AACA,cAAUF,MAAK,OAAO,QAAQ,SAAS,oBAAoBA,MAAK,eAAe;AAAA,MAC7E,OAAO,WAAW;AAAA,MAClB,KAAKA,MAAK,IAAI;AAAA,IAChB,CAAC,CAAC,CAAC;AACH,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,aAAa;AAC3B,YAAQ,QAAQE,KAAI;AACpB,YAAQ,KAAK,aAAa;AAC1B,YAAQ,KAAK,UAAU;AACvB,WAAO;AAAA,EACT;AAkBA,WAAS,MAAMA,OAAM;AAKnB,QAAIA,UAAS,IAAI;AACf,aAAO,QAAQ,QAAQ,mBAAmB,YAAY,UAAU,aAAa,WAAW,EAAEA,KAAI;AAAA,IAChG;AAGA,QAAIA,UAAS,IAAI;AACf,aAAO,QAAQ,QAAQ,wBAAwB,YAAY,UAAU,mBAAmB,WAAW,EAAEA,KAAI;AAAA,IAC3G;AAGA,WAAO,UAAU,WAAWA,KAAI,IAAI,YAAYA,KAAI;AAAA,EACtD;AAgBA,WAAS,iBAAiBA,OAAM;AAC9B,WAAO,QAAQ,QAAQ,6BAA6B,YAAY,WAAW,EAAEA,KAAI;AAAA,EACnF;AAkBA,WAAS,WAAWA,OAAM;AAExB,WAAOH,IAAGG,KAAI;AAAA,EAChB;AAkBA,WAAS,YAAYA,OAAM;AACzB,eAAW,YAAY;AACvB,WAAO,IAAIA,KAAI;AAAA,EACjB;AACF;AAOA,SAAS,iBAAiB,SAASH,KAAI,KAAK;AAC1C,SAAO;AAYP,WAAS,cAAcG,OAAM;AAC3B,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,gBAAgB;AAC9B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,gBAAgB;AAC7B,WAAO;AAAA,EACT;AAYA,WAAS,eAAeA,OAAM;AAC5B,WAAO,0BAA0BA,KAAI,IAAI,kBAAkB,SAAS,YAAY,EAAEA,KAAI,IAAI,aAAaA,KAAI;AAAA,EAC7G;AAYA,WAAS,aAAaA,OAAM;AAC1B,QAAIA,UAAS,IAAI;AACf,aAAO,YAAYA,KAAI;AAAA,IACzB;AACA,WAAO,mBAAmB,SAAS,0BAA0B,4BAA4B,uBAAuB,8BAA8B,oCAAoC,0BAA0B,6BAA6B,EAAE,EAAEA,KAAI;AAAA,EACnP;AAYA,WAAS,yBAAyBA,OAAM;AACtC,WAAO,0BAA0BA,KAAI,IAAI,kBAAkB,SAAS,eAAe,EAAEA,KAAI,IAAI,YAAYA,KAAI;AAAA,EAC/G;AAYA,WAAS,2BAA2BA,OAAM;AACxC,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,gBAAgBA,OAAM;AAC7B,QAAIA,UAAS,MAAMA,UAAS,MAAMA,UAAS,IAAI;AAC7C,aAAO,aAAa,SAAS,oBAAoB,KAAK,iBAAiB,uBAAuB,qBAAqB,EAAEA,KAAI;AAAA,IAC3H;AACA,WAAO,YAAYA,KAAI;AAAA,EACzB;AAYA,WAAS,mBAAmBA,OAAM;AAChC,WAAO,0BAA0BA,KAAI,IAAI,kBAAkB,SAAS,WAAW,EAAEA,KAAI,IAAI,YAAYA,KAAI;AAAA,EAC3G;AAYA,WAAS,YAAYA,OAAM;AACzB,QAAIA,UAAS,IAAI;AACf,cAAQ,MAAM,gBAAgB;AAC9B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,gBAAgB;AAC7B,cAAQ,KAAK,UAAU;AACvB,aAAOH;AAAA,IACT;AACA,WAAO,IAAIG,KAAI;AAAA,EACjB;AACF;AAOA,SAAS,sBAAsB,SAASH,KAAI,KAAK;AAC/C,QAAMC,QAAO;AACb,SAAO;AAYP,WAAS,cAAcE,OAAM;AAC3B,WAAO,aAAa,KAAKF,OAAM,SAAS,oBAAoB,sBAAsB,aAAa,mBAAmB,iBAAiB,EAAEE,KAAI;AAAA,EAC3I;AAYA,WAAS,mBAAmBA,OAAM;AAChC,WAAOF,MAAK,OAAO,QAAQ,SAAS,oBAAoBA,MAAK,eAAeA,MAAK,OAAOA,MAAK,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,IAAID,IAAGG,KAAI,IAAI,IAAIA,KAAI;AAAA,EAC1J;AAYA,WAAS,qBAAqBA,OAAM;AAClC,WAAO,IAAIA,KAAI;AAAA,EACjB;AACF;AAOA,SAAS,2BAA2B,SAASH,KAAI,KAAK;AACpD,SAAO;AAcP,WAAS,wBAAwBG,OAAM;AAGrC,YAAQ,MAAM,WAAW;AACzB,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,iBAAiB;AAC9B,WAAO;AAAA,EACT;AAcA,WAAS,uBAAuBA,OAAM;AACpC,QAAIA,UAAS,IAAI;AACf,cAAQ,MAAM,iBAAiB;AAC/B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,iBAAiB;AAC9B,cAAQ,KAAK,WAAW;AACxB,aAAOH;AAAA,IACT;AACA,WAAO,IAAIG,KAAI;AAAA,EACjB;AACF;;;ACniBO,IAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,YAAY,SAAS;AAAA,EACrB,UAAU;AACZ;AAOA,SAAS,wBAAwB,SAASC,KAAI,KAAK;AACjD,QAAMC,QAAO;AACb,SAAOC;AAYP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,YAAY;AAC1B,YAAQ,MAAM,kBAAkB;AAChC,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,kBAAkB;AAC/B,WAAO;AAAA,EACT;AAYA,WAAS,KAAKA,OAAM;AAClB,QAAIA,UAAS,IAAI;AACf,cAAQ,MAAM,aAAa;AAC3B,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,aAAa;AAC1B,cAAQ,KAAK,YAAY;AACzB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AA6BA,WAAS,MAAMA,OAAM;AAMnB,WAAOA,UAAS,MAAM,4BAA4BF,MAAK,OAAO,aAAa,IAAIE,KAAI,IAAIH,IAAGG,KAAI;AAAA,EAChG;AACF;;;ACzFO,IAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,YAAY,SAAS;AAAA,EACrB,UAAU;AACZ;AAOA,SAAS,uBAAuB,SAASC,KAAI,KAAK;AAChD,QAAMC,QAAO;AACb,SAAOC;AAYP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,WAAW;AACzB,YAAQ,MAAM,aAAa;AAC3B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,aAAa;AAC1B,YAAQ,KAAK,WAAW;AACxB,WAAO;AAAA,EACT;AAGA,WAAS,MAAMA,OAAM;AAKnB,WAAOA,UAAS,MAAM,4BAA4BF,MAAK,OAAO,aAAa,IAAIE,KAAI,IAAIH,IAAGG,KAAI;AAAA,EAChG;AACF;;;AC1CO,IAAM,aAAa;AAAA,EACxB,MAAM;AAAA,EACN,UAAU;AACZ;AAOA,SAAS,mBAAmB,SAASC,KAAI;AACvC,SAAOC;AAGP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,YAAY;AAC1B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,YAAY;AACzB,WAAO,aAAa,SAASF,KAAI,YAAY;AAAA,EAC/C;AACF;;;ACnBO,IAAM,gBAAgB;AAAA,EAC3B,MAAM;AAAA,EACN,UAAU;AACZ;AAOA,SAAS,sBAAsB,SAASG,KAAI,KAAK;AAC/C,MAAI,OAAO;AAEX,MAAI;AACJ,SAAOC;AAYP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,eAAe;AAE7B,WAAO,OAAOA,KAAI;AAAA,EACpB;AAYA,WAAS,OAAOA,OAAM;AACpB,aAASA;AACT,WAAO,QAAQA,KAAI;AAAA,EACrB;AAYA,WAAS,QAAQA,OAAM;AACrB,QAAIA,UAAS,QAAQ;AACnB,cAAQ,MAAM,uBAAuB;AACrC,aAAO,SAASA,KAAI;AAAA,IACtB;AACA,QAAI,QAAQ,MAAMA,UAAS,QAAQ,mBAAmBA,KAAI,IAAI;AAC5D,cAAQ,KAAK,eAAe;AAC5B,aAAOF,IAAGE,KAAI;AAAA,IAChB;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,SAASA,OAAM;AACtB,QAAIA,UAAS,QAAQ;AACnB,cAAQ,QAAQA,KAAI;AACpB;AACA,aAAO;AAAA,IACT;AACA,YAAQ,KAAK,uBAAuB;AACpC,WAAO,cAAcA,KAAI,IAAI,aAAa,SAAS,SAAS,YAAY,EAAEA,KAAI,IAAI,QAAQA,KAAI;AAAA,EAChG;AACF;;;ACpFO,IAAM,OAAO;AAAA,EAClB,cAAc;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AACZ;AAGA,IAAM,oCAAoC;AAAA,EACxC,SAAS;AAAA,EACT,UAAU;AACZ;AAGA,IAAM,kBAAkB;AAAA,EACtB,SAAS;AAAA,EACT,UAAU;AACZ;AAUA,SAAS,kBAAkB,SAASC,KAAI,KAAK;AAC3C,QAAMC,QAAO;AACb,QAAM,OAAOA,MAAK,OAAOA,MAAK,OAAO,SAAS,CAAC;AAC/C,MAAI,cAAc,QAAQ,KAAK,CAAC,EAAE,SAAS,eAAe,KAAK,CAAC,EAAE,eAAe,KAAK,CAAC,GAAG,IAAI,EAAE,SAAS;AACzG,MAAI,OAAO;AACX,SAAOC;AAGP,WAASA,OAAMC,OAAM;AACnB,UAAM,OAAOF,MAAK,eAAe,SAASE,UAAS,MAAMA,UAAS,MAAMA,UAAS,KAAK,kBAAkB;AACxG,QAAI,SAAS,kBAAkB,CAACF,MAAK,eAAe,UAAUE,UAASF,MAAK,eAAe,SAAS,WAAWE,KAAI,GAAG;AACpH,UAAI,CAACF,MAAK,eAAe,MAAM;AAC7B,QAAAA,MAAK,eAAe,OAAO;AAC3B,gBAAQ,MAAM,MAAM;AAAA,UAClB,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AACA,UAAI,SAAS,iBAAiB;AAC5B,gBAAQ,MAAM,gBAAgB;AAC9B,eAAOE,UAAS,MAAMA,UAAS,KAAK,QAAQ,MAAM,eAAe,KAAK,QAAQ,EAAEA,KAAI,IAAI,SAASA,KAAI;AAAA,MACvG;AACA,UAAI,CAACF,MAAK,aAAaE,UAAS,IAAI;AAClC,gBAAQ,MAAM,gBAAgB;AAC9B,gBAAQ,MAAM,eAAe;AAC7B,eAAO,OAAOA,KAAI;AAAA,MACpB;AAAA,IACF;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAGA,WAAS,OAAOA,OAAM;AACpB,QAAI,WAAWA,KAAI,KAAK,EAAE,OAAO,IAAI;AACnC,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,SAAK,CAACF,MAAK,aAAa,OAAO,OAAOA,MAAK,eAAe,SAASE,UAASF,MAAK,eAAe,SAASE,UAAS,MAAMA,UAAS,KAAK;AACpI,cAAQ,KAAK,eAAe;AAC5B,aAAO,SAASA,KAAI;AAAA,IACtB;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAKA,WAAS,SAASA,OAAM;AACtB,YAAQ,MAAM,gBAAgB;AAC9B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,gBAAgB;AAC7B,IAAAF,MAAK,eAAe,SAASA,MAAK,eAAe,UAAUE;AAC3D,WAAO,QAAQ;AAAA,MAAM;AAAA;AAAA,MAErBF,MAAK,YAAY,MAAM;AAAA,MAAS,QAAQ,QAAQ,mCAAmC,aAAa,WAAW;AAAA,IAAC;AAAA,EAC9G;AAGA,WAAS,QAAQE,OAAM;AACrB,IAAAF,MAAK,eAAe,mBAAmB;AACvC;AACA,WAAO,YAAYE,KAAI;AAAA,EACzB;AAGA,WAAS,YAAYA,OAAM;AACzB,QAAI,cAAcA,KAAI,GAAG;AACvB,cAAQ,MAAM,0BAA0B;AACxC,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,0BAA0B;AACvC,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAGA,WAAS,YAAYA,OAAM;AACzB,IAAAF,MAAK,eAAe,OAAO,cAAcA,MAAK,eAAe,QAAQ,KAAK,gBAAgB,GAAG,IAAI,EAAE;AACnG,WAAOD,IAAGG,KAAI;AAAA,EAChB;AACF;AAOA,SAAS,yBAAyB,SAASH,KAAI,KAAK;AAClD,QAAMC,QAAO;AACb,EAAAA,MAAK,eAAe,aAAa;AACjC,SAAO,QAAQ,MAAM,WAAW,SAAS,QAAQ;AAGjD,WAAS,QAAQE,OAAM;AACrB,IAAAF,MAAK,eAAe,oBAAoBA,MAAK,eAAe,qBAAqBA,MAAK,eAAe;AAIrG,WAAO,aAAa,SAASD,KAAI,kBAAkBC,MAAK,eAAe,OAAO,CAAC,EAAEE,KAAI;AAAA,EACvF;AAGA,WAAS,SAASA,OAAM;AACtB,QAAIF,MAAK,eAAe,qBAAqB,CAAC,cAAcE,KAAI,GAAG;AACjE,MAAAF,MAAK,eAAe,oBAAoB;AACxC,MAAAA,MAAK,eAAe,mBAAmB;AACvC,aAAO,iBAAiBE,KAAI;AAAA,IAC9B;AACA,IAAAF,MAAK,eAAe,oBAAoB;AACxC,IAAAA,MAAK,eAAe,mBAAmB;AACvC,WAAO,QAAQ,QAAQ,iBAAiBD,KAAI,gBAAgB,EAAEG,KAAI;AAAA,EACpE;AAGA,WAAS,iBAAiBA,OAAM;AAE9B,IAAAF,MAAK,eAAe,aAAa;AAEjC,IAAAA,MAAK,YAAY;AAGjB,WAAO,aAAa,SAAS,QAAQ,QAAQ,MAAMD,KAAI,GAAG,GAAG,cAAcC,MAAK,OAAO,WAAW,QAAQ,KAAK,SAAS,cAAc,IAAI,SAAY,CAAC,EAAEE,KAAI;AAAA,EAC/J;AACF;AAOA,SAAS,eAAe,SAASH,KAAI,KAAK;AACxC,QAAMC,QAAO;AACb,SAAO,aAAa,SAAS,aAAa,kBAAkBA,MAAK,eAAe,OAAO,CAAC;AAGxF,WAAS,YAAYE,OAAM;AACzB,UAAM,OAAOF,MAAK,OAAOA,MAAK,OAAO,SAAS,CAAC;AAC/C,WAAO,QAAQ,KAAK,CAAC,EAAE,SAAS,oBAAoB,KAAK,CAAC,EAAE,eAAe,KAAK,CAAC,GAAG,IAAI,EAAE,WAAWA,MAAK,eAAe,OAAOD,IAAGG,KAAI,IAAI,IAAIA,KAAI;AAAA,EACrJ;AACF;AAOA,SAAS,gBAAgB,SAAS;AAChC,UAAQ,KAAK,KAAK,eAAe,IAAI;AACvC;AAOA,SAAS,iCAAiC,SAASH,KAAI,KAAK;AAC1D,QAAMC,QAAO;AAIb,SAAO,aAAa,SAAS,aAAa,4BAA4BA,MAAK,OAAO,WAAW,QAAQ,KAAK,SAAS,cAAc,IAAI,SAAY,IAAI,CAAC;AAGtJ,WAAS,YAAYE,OAAM;AACzB,UAAM,OAAOF,MAAK,OAAOA,MAAK,OAAO,SAAS,CAAC;AAC/C,WAAO,CAAC,cAAcE,KAAI,KAAK,QAAQ,KAAK,CAAC,EAAE,SAAS,6BAA6BH,IAAGG,KAAI,IAAI,IAAIA,KAAI;AAAA,EAC1G;AACF;;;ACtMO,IAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,WAAW;AAAA,EACX,UAAU;AACZ;AAGA,SAAS,yBAAyB,QAAQ,SAAS;AAEjD,MAAIC,SAAQ,OAAO;AAEnB,MAAIC;AAEJ,MAAIC;AAEJ,MAAIC;AAIJ,SAAOH,UAAS;AACd,QAAI,OAAOA,MAAK,EAAE,CAAC,MAAM,SAAS;AAChC,UAAI,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,WAAW;AACvC,QAAAC,WAAUD;AACV;AAAA,MACF;AACA,UAAI,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,aAAa;AACzC,QAAAE,QAAOF;AAAA,MACT;AAAA,IACF,OAEK;AACH,UAAI,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,WAAW;AAEvC,eAAO,OAAOA,QAAO,CAAC;AAAA,MACxB;AACA,UAAI,CAACG,eAAc,OAAOH,MAAK,EAAE,CAAC,EAAE,SAAS,cAAc;AACzD,QAAAG,cAAaH;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,QAAMI,WAAU;AAAA,IACd,MAAM;AAAA,IACN,OAAO;AAAA,MACL,GAAG,OAAOF,KAAI,EAAE,CAAC,EAAE;AAAA,IACrB;AAAA,IACA,KAAK;AAAA,MACH,GAAG,OAAO,OAAO,SAAS,CAAC,EAAE,CAAC,EAAE;AAAA,IAClC;AAAA,EACF;AAGA,SAAOA,KAAI,EAAE,CAAC,EAAE,OAAO;AAIvB,MAAIC,aAAY;AACd,WAAO,OAAOD,OAAM,GAAG,CAAC,SAASE,UAAS,OAAO,CAAC;AAClD,WAAO,OAAOD,cAAa,GAAG,GAAG,CAAC,QAAQ,OAAOF,QAAO,EAAE,CAAC,GAAG,OAAO,CAAC;AACtE,WAAOA,QAAO,EAAE,CAAC,EAAE,MAAM;AAAA,MACvB,GAAG,OAAOE,WAAU,EAAE,CAAC,EAAE;AAAA,IAC3B;AAAA,EACF,OAAO;AACL,WAAOF,QAAO,EAAE,CAAC,IAAIG;AAAA,EACvB;AAGA,SAAO,KAAK,CAAC,QAAQA,UAAS,OAAO,CAAC;AACtC,SAAO;AACT;AAOA,SAAS,wBAAwB,SAASC,KAAI,KAAK;AACjD,QAAMC,QAAO;AAEb,MAAI;AACJ,SAAOC;AAaP,WAASA,OAAMC,OAAM;AACnB,QAAIR,SAAQM,MAAK,OAAO;AAExB,QAAIG;AAEJ,WAAOT,UAAS;AAGd,UAAIM,MAAK,OAAON,MAAK,EAAE,CAAC,EAAE,SAAS,gBAAgBM,MAAK,OAAON,MAAK,EAAE,CAAC,EAAE,SAAS,gBAAgBM,MAAK,OAAON,MAAK,EAAE,CAAC,EAAE,SAAS,WAAW;AAC1I,QAAAS,aAAYH,MAAK,OAAON,MAAK,EAAE,CAAC,EAAE,SAAS;AAC3C;AAAA,MACF;AAAA,IACF;AAIA,QAAI,CAACM,MAAK,OAAO,KAAKA,MAAK,IAAI,EAAE,IAAI,MAAMA,MAAK,aAAaG,aAAY;AACvE,cAAQ,MAAM,mBAAmB;AACjC,eAASD;AACT,aAAO,OAAOA,KAAI;AAAA,IACpB;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAaA,WAAS,OAAOA,OAAM;AACpB,YAAQ,MAAM,2BAA2B;AACzC,WAAO,OAAOA,KAAI;AAAA,EACpB;AAaA,WAAS,OAAOA,OAAM;AACpB,QAAIA,UAAS,QAAQ;AACnB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,YAAQ,KAAK,2BAA2B;AACxC,WAAO,cAAcA,KAAI,IAAI,aAAa,SAAS,OAAO,YAAY,EAAEA,KAAI,IAAI,MAAMA,KAAI;AAAA,EAC5F;AAaA,WAAS,MAAMA,OAAM;AACnB,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,cAAQ,KAAK,mBAAmB;AAChC,aAAOH,IAAGG,KAAI;AAAA,IAChB;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AACF;;;AC3KO,IAAM,OAAO;AAAA,EAClB,UAAU;AACZ;AAQA,SAAS,eAAe,SAAS;AAC/B,QAAME,QAAO;AACb,QAAM,UAAU,QAAQ;AAAA;AAAA,IAExB;AAAA,IAAW;AAAA;AAAA,IAEX,QAAQ,QAAQ,KAAK,OAAO,WAAW,aAAa,gBAAgB,aAAa,SAAS,QAAQ,QAAQ,KAAK,OAAO,WAAW,MAAM,gBAAgB,QAAQ,QAAQC,UAAS,cAAc,CAAC,GAAG,YAAY,CAAC;AAAA,EAAC;AAChN,SAAO;AAGP,WAAS,cAAcC,OAAM;AAC3B,QAAIA,UAAS,MAAM;AACjB,cAAQ,QAAQA,KAAI;AACpB;AAAA,IACF;AACA,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,iBAAiB;AAC9B,IAAAF,MAAK,mBAAmB;AACxB,WAAO;AAAA,EACT;AAGA,WAAS,eAAeE,OAAM;AAC5B,QAAIA,UAAS,MAAM;AACjB,cAAQ,QAAQA,KAAI;AACpB;AAAA,IACF;AACA,YAAQ,MAAM,YAAY;AAC1B,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,YAAY;AACzB,IAAAF,MAAK,mBAAmB;AACxB,WAAO;AAAA,EACT;AACF;;;AC9CO,IAAM,WAAW;AAAA,EACtB,YAAY,eAAe;AAC7B;AACO,IAAM,SAAS,kBAAkB,QAAQ;AACzC,IAAMG,QAAO,kBAAkB,MAAM;AAQ5C,SAAS,kBAAkB,OAAO;AAChC,SAAO;AAAA,IACL,YAAY,eAAe,UAAU,SAAS,yBAAyB,MAAS;AAAA,IAChF,UAAU;AAAA,EACZ;AAOA,WAAS,eAAe,SAAS;AAC/B,UAAMC,QAAO;AACb,UAAMC,cAAa,KAAK,OAAO,WAAW,KAAK;AAC/C,UAAMF,QAAO,QAAQ,QAAQE,aAAYC,QAAO,OAAO;AACvD,WAAOA;AAGP,aAASA,OAAMC,OAAM;AACnB,aAAO,QAAQA,KAAI,IAAIJ,MAAKI,KAAI,IAAI,QAAQA,KAAI;AAAA,IAClD;AAGA,aAAS,QAAQA,OAAM;AACrB,UAAIA,UAAS,MAAM;AACjB,gBAAQ,QAAQA,KAAI;AACpB;AAAA,MACF;AACA,cAAQ,MAAM,MAAM;AACpB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AAGA,aAAS,KAAKA,OAAM;AAClB,UAAI,QAAQA,KAAI,GAAG;AACjB,gBAAQ,KAAK,MAAM;AACnB,eAAOJ,MAAKI,KAAI;AAAA,MAClB;AAGA,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AAQA,aAAS,QAAQA,OAAM;AACrB,UAAIA,UAAS,MAAM;AACjB,eAAO;AAAA,MACT;AACA,YAAMC,QAAOH,YAAWE,KAAI;AAC5B,UAAIE,SAAQ;AACZ,UAAID,OAAM;AAGR,eAAO,EAAEC,SAAQD,MAAK,QAAQ;AAC5B,gBAAM,OAAOA,MAAKC,MAAK;AACvB,cAAI,CAAC,KAAK,YAAY,KAAK,SAAS,KAAKL,OAAMA,MAAK,QAAQ,GAAG;AAC7D,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAQA,SAAS,eAAe,eAAe;AACrC,SAAO;AAGP,WAAS,eAAe,QAAQ,SAAS;AACvC,QAAIK,SAAQ;AAEZ,QAAI;AAIJ,WAAO,EAAEA,UAAS,OAAO,QAAQ;AAC/B,UAAI,UAAU,QAAW;AACvB,YAAI,OAAOA,MAAK,KAAK,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,QAAQ;AACrD,kBAAQA;AACR,UAAAA;AAAA,QACF;AAAA,MACF,WAAW,CAAC,OAAOA,MAAK,KAAK,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,QAAQ;AAE7D,YAAIA,WAAU,QAAQ,GAAG;AACvB,iBAAO,KAAK,EAAE,CAAC,EAAE,MAAM,OAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE;AAC5C,iBAAO,OAAO,QAAQ,GAAGA,SAAQ,QAAQ,CAAC;AAC1C,UAAAA,SAAQ,QAAQ;AAAA,QAClB;AACA,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO,gBAAgB,cAAc,QAAQ,OAAO,IAAI;AAAA,EAC1D;AACF;AAaA,SAAS,uBAAuB,QAAQ,SAAS;AAC/C,MAAI,aAAa;AAEjB,SAAO,EAAE,cAAc,OAAO,QAAQ;AACpC,SAAK,eAAe,OAAO,UAAU,OAAO,UAAU,EAAE,CAAC,EAAE,SAAS,iBAAiB,OAAO,aAAa,CAAC,EAAE,CAAC,EAAE,SAAS,QAAQ;AAC9H,YAAM,OAAO,OAAO,aAAa,CAAC,EAAE,CAAC;AACrC,YAAM,SAAS,QAAQ,YAAY,IAAI;AACvC,UAAIA,SAAQ,OAAO;AACnB,UAAI,cAAc;AAClB,UAAI,OAAO;AAEX,UAAI;AACJ,aAAOA,UAAS;AACd,cAAM,QAAQ,OAAOA,MAAK;AAC1B,YAAI,OAAO,UAAU,UAAU;AAC7B,wBAAc,MAAM;AACpB,iBAAO,MAAM,WAAW,cAAc,CAAC,MAAM,IAAI;AAC/C;AACA;AAAA,UACF;AACA,cAAI,YAAa;AACjB,wBAAc;AAAA,QAChB,WAES,UAAU,IAAI;AACrB,iBAAO;AACP;AAAA,QACF,WAAW,UAAU,IAAI;AAAA,QAEzB,OAAO;AAEL,UAAAA;AACA;AAAA,QACF;AAAA,MACF;AACA,UAAI,MAAM;AACR,cAAM,QAAQ;AAAA,UACZ,MAAM,eAAe,OAAO,UAAU,QAAQ,OAAO,IAAI,eAAe;AAAA,UACxE,OAAO;AAAA,YACL,cAAcA,SAAQ,cAAc,KAAK,MAAM,eAAe;AAAA,YAC9D,QAAQ,KAAK,MAAM,SAASA;AAAA,YAC5B,MAAM,KAAK,IAAI;AAAA,YACf,QAAQ,KAAK,IAAI,SAAS;AAAA,YAC1B,QAAQ,KAAK,IAAI,SAAS;AAAA,UAC5B;AAAA,UACA,KAAK;AAAA,YACH,GAAG,KAAK;AAAA,UACV;AAAA,QACF;AACA,aAAK,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,QACX;AACA,YAAI,KAAK,MAAM,WAAW,KAAK,IAAI,QAAQ;AACzC,iBAAO,OAAO,MAAM,KAAK;AAAA,QAC3B,OAAO;AACL,iBAAO,OAAO,YAAY,GAAG,CAAC,SAAS,OAAO,OAAO,GAAG,CAAC,QAAQ,OAAO,OAAO,CAAC;AAChF,wBAAc;AAAA,QAChB;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AC9MA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAAC;AAAA,EAAA,YAAAC;AAAA,EAAA;AAAA;AAAA,gBAAAC;AAAA,EAAA,YAAAC;AAAA;AAQO,IAAMC,YAAW;AAAA,EACtB,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AACR;AAGO,IAAM,iBAAiB;AAAA,EAC5B,CAAC,EAAE,GAAG;AACR;AAGO,IAAM,cAAc;AAAA,EACzB,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AACR;AAGO,IAAMC,QAAO;AAAA,EAClB,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG,CAAC,iBAAiB,aAAa;AAAA,EACrC,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,GAAG,GAAG;AACT;AAGO,IAAMC,UAAS;AAAA,EACpB,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AACR;AAGO,IAAMC,QAAO;AAAA,EAClB,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG,CAAC,UAAU,QAAQ;AAAA,EACzB,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG,CAAC,iBAAiB,eAAe;AAAA,EACvC,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AAAA,EACN,CAAC,EAAE,GAAG;AACR;AAGO,IAAM,aAAa;AAAA,EACxB,MAAM,CAAC,WAAW,QAAW;AAC/B;AAGO,IAAM,mBAAmB;AAAA,EAC9B,MAAM,CAAC,IAAI,EAAE;AACf;AAGO,IAAM,UAAU;AAAA,EACrB,MAAM,CAAC;AACT;;;ACxBO,SAAS,gBAAgB,QAAQ,YAAY,MAAM;AAExD,MAAIC,SAAQ;AAAA,IACV,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,MAAM,QAAQ,KAAK,QAAQ;AAAA,IAC3B,QAAQ,QAAQ,KAAK,UAAU;AAAA,IAC/B,QAAQ,QAAQ,KAAK,UAAU;AAAA,EACjC;AAEA,QAAM,cAAc,CAAC;AAErB,QAAM,uBAAuB,CAAC;AAE9B,MAAI,SAAS,CAAC;AAEd,MAAI,QAAQ,CAAC;AAEb,MAAI,WAAW;AAOf,QAAM,UAAU;AAAA,IACd,SAAS,iBAAiB,qBAAqB;AAAA,IAC/C,OAAO,iBAAiB,iBAAiB;AAAA,IACzC;AAAA,IACA;AAAA,IACA,MAAAC;AAAA,IACA,WAAW,iBAAiB,mBAAmB;AAAA,MAC7C,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAOA,QAAM,UAAU;AAAA,IACd,MAAM;AAAA,IACN,gBAAgB,CAAC;AAAA,IACjB;AAAA,IACA,QAAQ,CAAC;AAAA,IACT;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAOA,MAAI,QAAQ,WAAW,SAAS,KAAK,SAAS,OAAO;AAOrD,MAAI;AACJ,MAAI,WAAW,YAAY;AACzB,yBAAqB,KAAK,UAAU;AAAA,EACtC;AACA,SAAO;AAGP,WAAS,MAAM,OAAO;AACpB,aAAS,KAAK,QAAQ,KAAK;AAC3B,SAAK;AAGL,QAAI,OAAO,OAAO,SAAS,CAAC,MAAM,MAAM;AACtC,aAAO,CAAC;AAAA,IACV;AACA,cAAU,YAAY,CAAC;AAGvB,YAAQ,SAAS,WAAW,sBAAsB,QAAQ,QAAQ,OAAO;AACzE,WAAO,QAAQ;AAAA,EACjB;AAOA,WAAS,eAAe,OAAO,YAAY;AACzC,WAAO,gBAAgB,YAAY,KAAK,GAAG,UAAU;AAAA,EACvD;AAGA,WAAS,YAAY,OAAO;AAC1B,WAAO,YAAY,QAAQ,KAAK;AAAA,EAClC;AAGA,WAAS,MAAM;AAEb,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAID;AACJ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,WAAS,WAAW,OAAO;AACzB,gBAAY,MAAM,IAAI,IAAI,MAAM;AAChC,4BAAwB;AAAA,EAC1B;AAiBA,WAAS,OAAO;AAEd,QAAI;AACJ,WAAOA,OAAM,SAAS,OAAO,QAAQ;AACnC,YAAM,QAAQ,OAAOA,OAAM,MAAM;AAGjC,UAAI,OAAO,UAAU,UAAU;AAC7B,qBAAaA,OAAM;AACnB,YAAIA,OAAM,eAAe,GAAG;AAC1B,UAAAA,OAAM,eAAe;AAAA,QACvB;AACA,eAAOA,OAAM,WAAW,cAAcA,OAAM,eAAe,MAAM,QAAQ;AACvE,aAAG,MAAM,WAAWA,OAAM,YAAY,CAAC;AAAA,QACzC;AAAA,MACF,OAAO;AACL,WAAG,KAAK;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAUA,WAAS,GAAGE,OAAM;AAChB,eAAW;AACX,mBAAeA;AACf,YAAQ,MAAMA,KAAI;AAAA,EACpB;AAGA,WAAS,QAAQA,OAAM;AACrB,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,MAAAF,OAAM;AACN,MAAAA,OAAM,SAAS;AACf,MAAAA,OAAM,UAAUE,UAAS,KAAK,IAAI;AAClC,8BAAwB;AAAA,IAC1B,WAAWA,UAAS,IAAI;AACtB,MAAAF,OAAM;AACN,MAAAA,OAAM;AAAA,IACR;AAGA,QAAIA,OAAM,eAAe,GAAG;AAC1B,MAAAA,OAAM;AAAA,IACR,OAAO;AACL,MAAAA,OAAM;AAGN,UAAIA,OAAM;AAAA;AAAA;AAAA,MAIV,OAAOA,OAAM,MAAM,EAAE,QAAQ;AAC3B,QAAAA,OAAM,eAAe;AACrB,QAAAA,OAAM;AAAA,MACR;AAAA,IACF;AAGA,YAAQ,WAAWE;AAGnB,eAAW;AAAA,EACb;AAGA,WAAS,MAAM,MAAM,QAAQ;AAG3B,UAAM,QAAQ,UAAU,CAAC;AACzB,UAAM,OAAO;AACb,UAAM,QAAQ,IAAI;AAClB,YAAQ,OAAO,KAAK,CAAC,SAAS,OAAO,OAAO,CAAC;AAC7C,UAAM,KAAK,KAAK;AAChB,WAAO;AAAA,EACT;AAGA,WAASD,MAAK,MAAM;AAClB,UAAM,QAAQ,MAAM,IAAI;AACxB,UAAM,MAAM,IAAI;AAChB,YAAQ,OAAO,KAAK,CAAC,QAAQ,OAAO,OAAO,CAAC;AAC5C,WAAO;AAAA,EACT;AAOA,WAAS,sBAAsB,WAAW,MAAM;AAC9C,cAAU,WAAW,KAAK,IAAI;AAAA,EAChC;AAOA,WAAS,kBAAkB,GAAG,MAAM;AAClC,SAAK,QAAQ;AAAA,EACf;AAUA,WAAS,iBAAiB,UAAU,QAAQ;AAC1C,WAAO;AAeP,aAAS,KAAKE,aAAY,aAAa,YAAY;AAEjD,UAAI;AAEJ,UAAI;AAEJ,UAAI;AAEJ,UAAI;AACJ,aAAO,MAAM,QAAQA,WAAU;AAAA;AAAA,QAC/B,uBAAuBA,WAAU;AAAA,UAAI,cAAcA;AAAA;AAAA,QAEnD,uBAAuB;AAAA;AAAA,UAA0BA;AAAA,QAAW,CAAC;AAAA,UAAI,sBAAsBA,WAAU;AAUjG,eAAS,sBAAsBC,MAAK;AAClC,eAAOC;AAGP,iBAASA,OAAMH,OAAM;AACnB,gBAAM,OAAOA,UAAS,QAAQE,KAAIF,KAAI;AACtC,gBAAMI,OAAMJ,UAAS,QAAQE,KAAI;AACjC,gBAAMG,QAAO;AAAA;AAAA;AAAA,YAGb,GAAI,MAAM,QAAQ,IAAI,IAAI,OAAO,OAAO,CAAC,IAAI,IAAI,CAAC;AAAA,YAAI,GAAI,MAAM,QAAQD,IAAG,IAAIA,OAAMA,OAAM,CAACA,IAAG,IAAI,CAAC;AAAA,UAAE;AACtG,iBAAO,uBAAuBC,KAAI,EAAEL,KAAI;AAAA,QAC1C;AAAA,MACF;AAUA,eAAS,uBAAuBK,OAAM;AACpC,2BAAmBA;AACnB,yBAAiB;AACjB,YAAIA,MAAK,WAAW,GAAG;AACrB,iBAAO;AAAA,QACT;AACA,eAAO,gBAAgBA,MAAK,cAAc,CAAC;AAAA,MAC7C;AAUA,eAAS,gBAAgB,WAAW;AAClC,eAAOF;AAGP,iBAASA,OAAMH,OAAM;AAKnB,iBAAO,MAAM;AACb,6BAAmB;AACnB,cAAI,CAAC,UAAU,SAAS;AACtB,oBAAQ,mBAAmB;AAAA,UAC7B;AAIA,cAAI,UAAU,QAAQ,QAAQ,OAAO,WAAW,QAAQ,KAAK,SAAS,UAAU,IAAI,GAAG;AACrF,mBAAO,IAAIA,KAAI;AAAA,UACjB;AACA,iBAAO,UAAU,SAAS;AAAA;AAAA;AAAA;AAAA,YAI1B,SAAS,OAAO,OAAO,OAAO,OAAO,OAAO,GAAG,MAAM,IAAI;AAAA,YAAS;AAAA,YAASM;AAAA,YAAI;AAAA,UAAG,EAAEN,KAAI;AAAA,QAC1F;AAAA,MACF;AAGA,eAASM,IAAGN,OAAM;AAChB,mBAAW;AACX,iBAAS,kBAAkB,IAAI;AAC/B,eAAO;AAAA,MACT;AAGA,eAAS,IAAIA,OAAM;AACjB,mBAAW;AACX,aAAK,QAAQ;AACb,YAAI,EAAE,iBAAiB,iBAAiB,QAAQ;AAC9C,iBAAO,gBAAgB,iBAAiB,cAAc,CAAC;AAAA,QACzD;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAUA,WAAS,UAAU,WAAWO,OAAM;AAClC,QAAI,UAAU,cAAc,CAAC,qBAAqB,SAAS,SAAS,GAAG;AACrE,2BAAqB,KAAK,SAAS;AAAA,IACrC;AACA,QAAI,UAAU,SAAS;AACrB,aAAO,QAAQ,QAAQA,OAAM,QAAQ,OAAO,SAASA,OAAM,UAAU,QAAQ,QAAQ,OAAO,MAAMA,KAAI,GAAG,OAAO,CAAC;AAAA,IACnH;AACA,QAAI,UAAU,WAAW;AACvB,cAAQ,SAAS,UAAU,UAAU,QAAQ,QAAQ,OAAO;AAAA,IAC9D;AAAA,EACF;AAQA,WAAS,QAAQ;AACf,UAAM,aAAa,IAAI;AACvB,UAAM,gBAAgB,QAAQ;AAC9B,UAAM,wBAAwB,QAAQ;AACtC,UAAM,mBAAmB,QAAQ,OAAO;AACxC,UAAM,aAAa,MAAM,KAAK,KAAK;AACnC,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AAQA,aAAS,UAAU;AACjB,MAAAT,SAAQ;AACR,cAAQ,WAAW;AACnB,cAAQ,mBAAmB;AAC3B,cAAQ,OAAO,SAAS;AACxB,cAAQ;AACR,8BAAwB;AAAA,IAC1B;AAAA,EACF;AASA,WAAS,0BAA0B;AACjC,QAAIA,OAAM,QAAQ,eAAeA,OAAM,SAAS,GAAG;AACjD,MAAAA,OAAM,SAAS,YAAYA,OAAM,IAAI;AACrC,MAAAA,OAAM,UAAU,YAAYA,OAAM,IAAI,IAAI;AAAA,IAC5C;AAAA,EACF;AACF;AAYA,SAAS,YAAY,QAAQ,OAAO;AAClC,QAAM,aAAa,MAAM,MAAM;AAC/B,QAAM,mBAAmB,MAAM,MAAM;AACrC,QAAM,WAAW,MAAM,IAAI;AAC3B,QAAM,iBAAiB,MAAM,IAAI;AAEjC,MAAI;AACJ,MAAI,eAAe,UAAU;AAE3B,WAAO,CAAC,OAAO,UAAU,EAAE,MAAM,kBAAkB,cAAc,CAAC;AAAA,EACpE,OAAO;AACL,WAAO,OAAO,MAAM,YAAY,QAAQ;AACxC,QAAI,mBAAmB,IAAI;AACzB,YAAM,OAAO,KAAK,CAAC;AACnB,UAAI,OAAO,SAAS,UAAU;AAC5B,aAAK,CAAC,IAAI,KAAK,MAAM,gBAAgB;AAAA,MACvC,OAAO;AACL,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AACA,QAAI,iBAAiB,GAAG;AAEtB,WAAK,KAAK,OAAO,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AACT;AAYA,SAAS,gBAAgB,QAAQ,YAAY;AAC3C,MAAIU,SAAQ;AAEZ,QAAM,SAAS,CAAC;AAEhB,MAAI;AACJ,SAAO,EAAEA,SAAQ,OAAO,QAAQ;AAC9B,UAAM,QAAQ,OAAOA,MAAK;AAE1B,QAAI;AACJ,QAAI,OAAO,UAAU,UAAU;AAC7B,cAAQ;AAAA,IACV,MAAO,SAAQ,OAAO;AAAA,MACpB,KAAK,IACH;AACE,gBAAQ;AACR;AAAA,MACF;AAAA,MACF,KAAK,IACH;AACE,gBAAQ;AACR;AAAA,MACF;AAAA,MACF,KAAK,IACH;AACE,gBAAQ;AACR;AAAA,MACF;AAAA,MACF,KAAK,IACH;AACE,gBAAQ,aAAa,MAAM;AAC3B;AAAA,MACF;AAAA,MACF,KAAK,IACH;AACE,YAAI,CAAC,cAAc,MAAO;AAC1B,gBAAQ;AACR;AAAA,MACF;AAAA,MACF,SACE;AAEE,gBAAQ,OAAO,aAAa,KAAK;AAAA,MACnC;AAAA,IACJ;AACA,YAAQ,UAAU;AAClB,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,SAAO,OAAO,KAAK,EAAE;AACvB;;;ACzkBO,SAAS,MAAM,SAAS;AAC7B,QAAM,WAAW,WAAW,CAAC;AAC7B,QAAMC;AAAA;AAAA,IACN,kBAAkB,CAAC,oBAAmB,GAAI,SAAS,cAAc,CAAC,CAAE,CAAC;AAAA;AAGrE,QAAM,SAAS;AAAA,IACb,YAAAA;AAAA,IACA,SAASC,QAAO,OAAO;AAAA,IACvB,SAAS,CAAC;AAAA,IACV,UAAUA,QAAOC,SAAQ;AAAA,IACzB,MAAMD,QAAO,IAAI;AAAA,IACjB,MAAM,CAAC;AAAA,IACP,QAAQA,QAAO,MAAM;AAAA,IACrB,MAAMA,QAAOE,KAAI;AAAA,EACnB;AACA,SAAO;AAQP,WAASF,QAAO,SAAS;AACvB,WAAO;AAEP,aAAS,QAAQ,MAAM;AACrB,aAAO,gBAAgB,QAAQ,SAAS,IAAI;AAAA,IAC9C;AAAA,EACF;AACF;;;AC3CO,SAAS,YAAY,QAAQ;AAClC,SAAO,CAAC,YAAY,MAAM,GAAG;AAAA,EAE7B;AACA,SAAO;AACT;;;ACAA,IAAM,SAAS;AAMR,SAAS,aAAa;AAC3B,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAIG,SAAQ;AAEZ,MAAI;AACJ,SAAO;AAIP,WAAS,aAAa,OAAO,UAAU,KAAK;AAE1C,UAAM,SAAS,CAAC;AAEhB,QAAI;AAEJ,QAAI;AAEJ,QAAI;AAEJ,QAAI;AAEJ,QAAIC;AACJ,YAAQ,UAAU,OAAO,UAAU,WAAW,MAAM,SAAS,IAAI,IAAI,YAAY,YAAY,MAAS,EAAE,OAAO,KAAK;AACpH,oBAAgB;AAChB,aAAS;AACT,QAAID,QAAO;AAET,UAAI,MAAM,WAAW,CAAC,MAAM,OAAO;AACjC;AAAA,MACF;AACA,MAAAA,SAAQ;AAAA,IACV;AACA,WAAO,gBAAgB,MAAM,QAAQ;AACnC,aAAO,YAAY;AACnB,cAAQ,OAAO,KAAK,KAAK;AACzB,oBAAc,SAAS,MAAM,UAAU,SAAY,MAAM,QAAQ,MAAM;AACvE,MAAAC,QAAO,MAAM,WAAW,WAAW;AACnC,UAAI,CAAC,OAAO;AACV,iBAAS,MAAM,MAAM,aAAa;AAClC;AAAA,MACF;AACA,UAAIA,UAAS,MAAM,kBAAkB,eAAe,kBAAkB;AACpE,eAAO,KAAK,EAAE;AACd,2BAAmB;AAAA,MACrB,OAAO;AACL,YAAI,kBAAkB;AACpB,iBAAO,KAAK,EAAE;AACd,6BAAmB;AAAA,QACrB;AACA,YAAI,gBAAgB,aAAa;AAC/B,iBAAO,KAAK,MAAM,MAAM,eAAe,WAAW,CAAC;AACnD,oBAAU,cAAc;AAAA,QAC1B;AACA,gBAAQA,OAAM;AAAA,UACZ,KAAK,GACH;AACE,mBAAO,KAAK,KAAK;AACjB;AACA;AAAA,UACF;AAAA,UACF,KAAK,GACH;AACE,mBAAO,KAAK,KAAK,SAAS,CAAC,IAAI;AAC/B,mBAAO,KAAK,EAAE;AACd,mBAAO,WAAW,KAAM,QAAO,KAAK,EAAE;AACtC;AAAA,UACF;AAAA,UACF,KAAK,IACH;AACE,mBAAO,KAAK,EAAE;AACd,qBAAS;AACT;AAAA,UACF;AAAA,UACF,SACE;AACE,+BAAmB;AACnB,qBAAS;AAAA,UACX;AAAA,QACJ;AAAA,MACF;AACA,sBAAgB,cAAc;AAAA,IAChC;AACA,QAAI,KAAK;AACP,UAAI,iBAAkB,QAAO,KAAK,EAAE;AACpC,UAAI,OAAQ,QAAO,KAAK,MAAM;AAC9B,aAAO,KAAK,IAAI;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AACF;;;AChHA,IAAM,6BAA6B;AAc5B,SAAS,aAAa,OAAO;AAClC,SAAO,MAAM,QAAQ,4BAA4B,MAAM;AACzD;AAYA,SAAS,OAAO,IAAI,IAAI,IAAI;AAC1B,MAAI,IAAI;AAEN,WAAO;AAAA,EACT;AAGA,QAAM,OAAO,GAAG,WAAW,CAAC;AAC5B,MAAI,SAAS,IAAI;AACf,UAAMC,QAAO,GAAG,WAAW,CAAC;AAC5B,UAAM,MAAMA,UAAS,OAAOA,UAAS;AACrC,WAAO,gCAAgC,GAAG,MAAM,MAAM,IAAI,CAAC,GAAG,MAAM,KAAK,EAAE;AAAA,EAC7E;AACA,SAAO,8BAA8B,EAAE,KAAK;AAC9C;;;ACIA,IAAMC,OAAM,CAAC,EAAE;AAyBR,SAAS,aAAa,OAAO,UAAU,SAAS;AACrD,MAAI,OAAO,aAAa,UAAU;AAChC,cAAU;AACV,eAAW;AAAA,EACb;AACA,SAAO,SAAS,OAAO,EAAE,YAAY,MAAM,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,EAAE,OAAO,UAAU,IAAI,CAAC,CAAC,CAAC;AAC5G;AAOA,SAAS,SAAS,SAAS;AAEzB,QAAM,SAAS;AAAA,IACb,YAAY,CAAC;AAAA,IACb,gBAAgB,CAAC,YAAY,YAAY,WAAW,aAAa,QAAQ;AAAA,IACzE,OAAO;AAAA,MACL,UAAU,OAAOC,KAAI;AAAA,MACrB,kBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,YAAY,OAAOC,QAAO;AAAA,MAC1B,YAAY,OAAOC,WAAU;AAAA,MAC7B,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,YAAY,OAAO,QAAQ;AAAA,MAC3B,qBAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,cAAc,OAAO,UAAU,MAAM;AAAA,MACrC,UAAU,OAAOC,WAAU,MAAM;AAAA,MACjC,cAAc;AAAA,MACd,MAAM;AAAA,MACN,eAAe;AAAA,MACf,YAAY,OAAOC,WAAU;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,MACvB,UAAU,OAAOC,SAAQ;AAAA,MACzB,iBAAiB,OAAOC,UAAS;AAAA,MACjC,mBAAmB,OAAOA,UAAS;AAAA,MACnC,UAAU,OAAOC,OAAM,MAAM;AAAA,MAC7B,cAAc;AAAA,MACd,UAAU,OAAOA,OAAM,MAAM;AAAA,MAC7B,cAAc;AAAA,MACd,OAAO,OAAOC,MAAK;AAAA,MACnB,OAAO;AAAA,MACP,MAAM,OAAOR,KAAI;AAAA,MACjB,UAAU,OAAOS,SAAQ;AAAA,MACzB,eAAe;AAAA,MACf,aAAa,OAAOC,OAAM,kBAAkB;AAAA,MAC5C,eAAe,OAAOA,KAAI;AAAA,MAC1B,WAAW,OAAOC,UAAS;AAAA,MAC3B,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,2BAA2B;AAAA,MAC3B,qBAAqB;AAAA,MACrB,eAAe,OAAOV,QAAO;AAAA,MAC7B,QAAQ,OAAOW,OAAM;AAAA,MACrB,eAAe,OAAOC,cAAa;AAAA,IACrC;AAAA,IACA,MAAM;AAAA,MACJ,YAAY,OAAO;AAAA,MACnB,oBAAoB;AAAA,MACpB,UAAU,OAAO;AAAA,MACjB,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB,YAAY,OAAO;AAAA,MACnB,sBAAsB;AAAA,MACtB,qCAAqC;AAAA,MACrC,iCAAiC;AAAA,MACjC,yBAAyB;AAAA,MACzB,oBAAoB;AAAA,MACpB,YAAY,OAAO,gBAAgB;AAAA,MACnC,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,eAAe;AAAA,MACf,cAAc,OAAO,kBAAkB;AAAA,MACvC,UAAU,OAAO,cAAc;AAAA,MAC/B,cAAc;AAAA,MACd,MAAM;AAAA,MACN,YAAY,OAAO;AAAA,MACnB,6BAA6B;AAAA,MAC7B,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,MACvB,UAAU,OAAO;AAAA,MACjB,iBAAiB,OAAO,eAAe;AAAA,MACvC,mBAAmB,OAAO,eAAe;AAAA,MACzC,UAAU,OAAO,cAAc;AAAA,MAC/B,cAAc;AAAA,MACd,UAAU,OAAO,cAAc;AAAA,MAC/B,cAAc;AAAA,MACd,OAAO,OAAO,WAAW;AAAA,MACzB,OAAO;AAAA,MACP,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,MAAM,OAAO,UAAU;AAAA,MACvB,UAAU,OAAO;AAAA,MACjB,aAAa,OAAO;AAAA,MACpB,eAAe,OAAO;AAAA,MACtB,WAAW,OAAO;AAAA,MAClB,iBAAiB;AAAA,MACjB,2BAA2B;AAAA,MAC3B,qBAAqB;AAAA,MACrB,UAAU;AAAA,MACV,eAAe,OAAO,mBAAmB;AAAA,MACzC,2BAA2B;AAAA,MAC3B,mBAAmB;AAAA,MACnB,QAAQ,OAAO;AAAA,MACf,eAAe,OAAO;AAAA,IACxB;AAAA,EACF;AACA,YAAU,SAAS,WAAW,CAAC,GAAG,mBAAmB,CAAC,CAAC;AAGvD,QAAM,OAAO,CAAC;AACd,SAAO;AAUP,WAAS,QAAQ,QAAQ;AAEvB,QAAI,OAAO;AAAA,MACT,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,IACb;AAEA,UAAM,UAAU;AAAA,MACd,OAAO,CAAC,IAAI;AAAA,MACZ,YAAY,CAAC;AAAA,MACb;AAAA,MACA;AAAA,MACA,MAAAC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,YAAY,CAAC;AACnB,QAAIC,SAAQ;AACZ,WAAO,EAAEA,SAAQ,OAAO,QAAQ;AAG9B,UAAI,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,iBAAiB,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,iBAAiB;AACxF,YAAI,OAAOA,MAAK,EAAE,CAAC,MAAM,SAAS;AAChC,oBAAU,KAAKA,MAAK;AAAA,QACtB,OAAO;AACL,gBAAM,OAAO,UAAU,IAAI;AAC3B,UAAAA,SAAQ,YAAY,QAAQ,MAAMA,MAAK;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACA,IAAAA,SAAQ;AACR,WAAO,EAAEA,SAAQ,OAAO,QAAQ;AAC9B,YAAM,UAAU,OAAO,OAAOA,MAAK,EAAE,CAAC,CAAC;AACvC,UAAIhB,KAAI,KAAK,SAAS,OAAOgB,MAAK,EAAE,CAAC,EAAE,IAAI,GAAG;AAC5C,gBAAQ,OAAOA,MAAK,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,OAAO,OAAO;AAAA,UAChD,gBAAgB,OAAOA,MAAK,EAAE,CAAC,EAAE;AAAA,QACnC,GAAG,OAAO,GAAG,OAAOA,MAAK,EAAE,CAAC,CAAC;AAAA,MAC/B;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,YAAM,OAAO,QAAQ,WAAW,QAAQ,WAAW,SAAS,CAAC;AAC7D,YAAM,UAAU,KAAK,CAAC,KAAK;AAC3B,cAAQ,KAAK,SAAS,QAAW,KAAK,CAAC,CAAC;AAAA,IAC1C;AAGA,SAAK,WAAW;AAAA,MACd,OAAOC,OAAM,OAAO,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,QAAQ;AAAA,QACpD,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,KAAKA,OAAM,OAAO,SAAS,IAAI,OAAO,OAAO,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM;AAAA,QAChE,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,IAAAD,SAAQ;AACR,WAAO,EAAEA,SAAQ,OAAO,WAAW,QAAQ;AACzC,aAAO,OAAO,WAAWA,MAAK,EAAE,IAAI,KAAK;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AAQA,WAAS,YAAY,QAAQE,QAAO,QAAQ;AAC1C,QAAIF,SAAQE,SAAQ;AACpB,QAAI,mBAAmB;AACvB,QAAI,aAAa;AAEjB,QAAIR;AAEJ,QAAI;AAEJ,QAAI;AAEJ,QAAI;AACJ,WAAO,EAAEM,UAAS,QAAQ;AACxB,YAAM,QAAQ,OAAOA,MAAK;AAC1B,cAAQ,MAAM,CAAC,EAAE,MAAM;AAAA,QACrB,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,cACH;AACE,cAAI,MAAM,CAAC,MAAM,SAAS;AACxB;AAAA,UACF,OAAO;AACL;AAAA,UACF;AACA,qBAAW;AACX;AAAA,QACF;AAAA,QACF,KAAK,mBACH;AACE,cAAI,MAAM,CAAC,MAAM,SAAS;AACxB,gBAAIN,aAAY,CAAC,YAAY,CAAC,oBAAoB,CAAC,qBAAqB;AACtE,oCAAsBM;AAAA,YACxB;AACA,uBAAW;AAAA,UACb;AACA;AAAA,QACF;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,4BACH;AAGE;AAAA,QACF;AAAA,QACF,SACE;AACE,qBAAW;AAAA,QACb;AAAA,MACJ;AACA,UAAI,CAAC,oBAAoB,MAAM,CAAC,MAAM,WAAW,MAAM,CAAC,EAAE,SAAS,oBAAoB,qBAAqB,MAAM,MAAM,CAAC,MAAM,WAAW,MAAM,CAAC,EAAE,SAAS,mBAAmB,MAAM,CAAC,EAAE,SAAS,gBAAgB;AAC/M,YAAIN,WAAU;AACZ,cAAI,YAAYM;AAChB,sBAAY;AACZ,iBAAO,aAAa;AAClB,kBAAM,YAAY,OAAO,SAAS;AAClC,gBAAI,UAAU,CAAC,EAAE,SAAS,gBAAgB,UAAU,CAAC,EAAE,SAAS,mBAAmB;AACjF,kBAAI,UAAU,CAAC,MAAM,OAAQ;AAC7B,kBAAI,WAAW;AACb,uBAAO,SAAS,EAAE,CAAC,EAAE,OAAO;AAC5B,6BAAa;AAAA,cACf;AACA,wBAAU,CAAC,EAAE,OAAO;AACpB,0BAAY;AAAA,YACd,WAAW,UAAU,CAAC,EAAE,SAAS,gBAAgB,UAAU,CAAC,EAAE,SAAS,sBAAsB,UAAU,CAAC,EAAE,SAAS,gCAAgC,UAAU,CAAC,EAAE,SAAS,sBAAsB,UAAU,CAAC,EAAE,SAAS,kBAAkB;AAAA,YAEvO,OAAO;AACL;AAAA,YACF;AAAA,UACF;AACA,cAAI,wBAAwB,CAAC,aAAa,sBAAsB,YAAY;AAC1E,YAAAN,UAAS,UAAU;AAAA,UACrB;AAGA,UAAAA,UAAS,MAAM,OAAO,OAAO,CAAC,GAAG,YAAY,OAAO,SAAS,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,EAAE,GAAG;AACtF,iBAAO,OAAO,aAAaM,QAAO,GAAG,CAAC,QAAQN,WAAU,MAAM,CAAC,CAAC,CAAC;AACjE,UAAAM;AACA;AAAA,QACF;AAGA,YAAI,MAAM,CAAC,EAAE,SAAS,kBAAkB;AAEtC,gBAAM,OAAO;AAAA,YACX,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK;AAAA;AAAA,YAEvC,KAAK;AAAA,UACP;AACA,UAAAN,YAAW;AACX,iBAAO,OAAOM,QAAO,GAAG,CAAC,SAAS,MAAM,MAAM,CAAC,CAAC,CAAC;AACjD,UAAAA;AACA;AACA,gCAAsB;AACtB,qBAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AACA,WAAOE,MAAK,EAAE,CAAC,EAAE,UAAU;AAC3B,WAAO;AAAA,EACT;AAYA,WAAS,OAAOC,SAAQ,KAAK;AAC3B,WAAO;AAOP,aAAS,KAAK,OAAO;AACnB,YAAM,KAAK,MAAMA,QAAO,KAAK,GAAG,KAAK;AACrC,UAAI,IAAK,KAAI,KAAK,MAAM,KAAK;AAAA,IAC/B;AAAA,EACF;AAKA,WAAS,SAAS;AAChB,SAAK,MAAM,KAAK;AAAA,MACd,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,IACb,CAAC;AAAA,EACH;AAKA,WAAS,MAAMC,OAAM,OAAO,cAAc;AACxC,UAAM,SAAS,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAE/C,UAAM,WAAW,OAAO;AACxB,aAAS,KAAKA,KAAI;AAClB,SAAK,MAAM,KAAKA,KAAI;AACpB,SAAK,WAAW,KAAK,CAAC,OAAO,gBAAgB,MAAS,CAAC;AACvD,IAAAA,MAAK,WAAW;AAAA,MACd,OAAOH,OAAM,MAAM,KAAK;AAAA;AAAA,MAExB,KAAK;AAAA,IACP;AAAA,EACF;AAUA,WAAS,OAAO,KAAK;AACnB,WAAO;AAOP,aAAS,MAAM,OAAO;AACpB,UAAI,IAAK,KAAI,KAAK,MAAM,KAAK;AAC7B,MAAAF,MAAK,KAAK,MAAM,KAAK;AAAA,IACvB;AAAA,EACF;AAKA,WAASA,MAAK,OAAO,aAAa;AAChC,UAAMK,QAAO,KAAK,MAAM,IAAI;AAC5B,UAAM,OAAO,KAAK,WAAW,IAAI;AACjC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,mBAAmB,MAAM,OAAO,QAAQ,kBAAkB;AAAA,QACxE,OAAO,MAAM;AAAA,QACb,KAAK,MAAM;AAAA,MACb,CAAC,IAAI,uBAAkB;AAAA,IACzB,WAAW,KAAK,CAAC,EAAE,SAAS,MAAM,MAAM;AACtC,UAAI,aAAa;AACf,oBAAY,KAAK,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,MACvC,OAAO;AACL,cAAM,UAAU,KAAK,CAAC,KAAK;AAC3B,gBAAQ,KAAK,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,MACnC;AAAA,IACF;AACA,IAAAA,MAAK,SAAS,MAAMH,OAAM,MAAM,GAAG;AAAA,EACrC;AAKA,WAAS,SAAS;AAChB,WAAO,SAAS,KAAK,MAAM,IAAI,CAAC;AAAA,EAClC;AAUA,WAAS,qBAAqB;AAC5B,SAAK,KAAK,8BAA8B;AAAA,EAC1C;AAMA,WAAS,qBAAqB,OAAO;AACnC,QAAI,KAAK,KAAK,6BAA6B;AACzC,YAAM,WAAW,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AACjD,eAAS,QAAQ,OAAO,SAAS,KAAK,eAAe,KAAK,GAAG,EAAE;AAC/D,WAAK,KAAK,8BAA8B;AAAA,IAC1C;AAAA,EACF;AAMA,WAAS,4BAA4B;AACnC,UAAMI,QAAO,KAAK,OAAO;AACzB,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,OAAOC;AAAA,EACd;AAMA,WAAS,4BAA4B;AACnC,UAAMA,QAAO,KAAK,OAAO;AACzB,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,OAAOC;AAAA,EACd;AAMA,WAAS,wBAAwB;AAE/B,QAAI,KAAK,KAAK,eAAgB;AAC9B,SAAK,OAAO;AACZ,SAAK,KAAK,iBAAiB;AAAA,EAC7B;AAMA,WAAS,mBAAmB;AAC1B,UAAMA,QAAO,KAAK,OAAO;AACzB,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,QAAQC,MAAK,QAAQ,4BAA4B,EAAE;AACxD,SAAK,KAAK,iBAAiB;AAAA,EAC7B;AAMA,WAAS,qBAAqB;AAC5B,UAAMA,QAAO,KAAK,OAAO;AACzB,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,QAAQC,MAAK,QAAQ,gBAAgB,EAAE;AAAA,EAC9C;AAMA,WAAS,4BAA4B,OAAO;AAC1C,UAAM,QAAQ,KAAK,OAAO;AAC1B,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,QAAQ;AACb,IAAAA,MAAK,aAAa,oBAAoB,KAAK,eAAe,KAAK,CAAC,EAAE,YAAY;AAAA,EAChF;AAMA,WAAS,8BAA8B;AACrC,UAAMC,QAAO,KAAK,OAAO;AACzB,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,QAAQC;AAAA,EACf;AAMA,WAAS,oCAAoC;AAC3C,UAAMA,QAAO,KAAK,OAAO;AACzB,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,MAAMC;AAAA,EACb;AAMA,WAAS,yBAAyB,OAAO;AACvC,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,QAAI,CAACA,MAAK,OAAO;AACf,YAAM,QAAQ,KAAK,eAAe,KAAK,EAAE;AACzC,MAAAA,MAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAMA,WAAS,0BAA0B;AACjC,SAAK,KAAK,+BAA+B;AAAA,EAC3C;AAMA,WAAS,gCAAgC,OAAO;AAC9C,UAAMA,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,QAAQ,KAAK,eAAe,KAAK,EAAE,YAAY,CAAC,MAAM,KAAK,IAAI;AAAA,EACtE;AAMA,WAAS,sBAAsB;AAC7B,SAAK,KAAK,+BAA+B;AAAA,EAC3C;AAOA,WAAS,YAAY,OAAO;AAC1B,UAAMA,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAE7C,UAAM,WAAWA,MAAK;AACtB,QAAI,OAAO,SAAS,SAAS,SAAS,CAAC;AACvC,QAAI,CAAC,QAAQ,KAAK,SAAS,QAAQ;AAEjC,aAAOE,MAAK;AACZ,WAAK,WAAW;AAAA,QACd,OAAOL,OAAM,MAAM,KAAK;AAAA;AAAA,QAExB,KAAK;AAAA,MACP;AACA,eAAS,KAAK,IAAI;AAAA,IACpB;AACA,SAAK,MAAM,KAAK,IAAI;AAAA,EACtB;AAOA,WAAS,WAAW,OAAO;AACzB,UAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,SAAK,SAAS,KAAK,eAAe,KAAK;AACvC,SAAK,SAAS,MAAMA,OAAM,MAAM,GAAG;AAAA,EACrC;AAOA,WAAS,iBAAiB,OAAO;AAC/B,UAAM,UAAU,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAEhD,QAAI,KAAK,KAAK,aAAa;AACzB,YAAM,OAAO,QAAQ,SAAS,QAAQ,SAAS,SAAS,CAAC;AACzD,WAAK,SAAS,MAAMA,OAAM,MAAM,GAAG;AACnC,WAAK,KAAK,cAAc;AACxB;AAAA,IACF;AACA,QAAI,CAAC,KAAK,KAAK,gCAAgC,OAAO,eAAe,SAAS,QAAQ,IAAI,GAAG;AAC3F,kBAAY,KAAK,MAAM,KAAK;AAC5B,iBAAW,KAAK,MAAM,KAAK;AAAA,IAC7B;AAAA,EACF;AAOA,WAAS,kBAAkB;AACzB,SAAK,KAAK,cAAc;AAAA,EAC1B;AAOA,WAAS,iBAAiB;AACxB,UAAMI,QAAO,KAAK,OAAO;AACzB,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,QAAQC;AAAA,EACf;AAOA,WAAS,iBAAiB;AACxB,UAAMA,QAAO,KAAK,OAAO;AACzB,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,QAAQC;AAAA,EACf;AAOA,WAAS,iBAAiB;AACxB,UAAMA,QAAO,KAAK,OAAO;AACzB,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,QAAQC;AAAA,EACf;AAOA,WAAS,aAAa;AACpB,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAK7C,QAAI,KAAK,KAAK,aAAa;AAEzB,YAAM,gBAAgB,KAAK,KAAK,iBAAiB;AACjD,MAAAA,MAAK,QAAQ;AAEb,MAAAA,MAAK,gBAAgB;AAErB,aAAOA,MAAK;AACZ,aAAOA,MAAK;AAAA,IACd,OAAO;AAEL,aAAOA,MAAK;AAEZ,aAAOA,MAAK;AAAA,IACd;AACA,SAAK,KAAK,gBAAgB;AAAA,EAC5B;AAOA,WAAS,cAAc;AACrB,UAAMA,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAK7C,QAAI,KAAK,KAAK,aAAa;AAEzB,YAAM,gBAAgB,KAAK,KAAK,iBAAiB;AACjD,MAAAA,MAAK,QAAQ;AAEb,MAAAA,MAAK,gBAAgB;AAErB,aAAOA,MAAK;AACZ,aAAOA,MAAK;AAAA,IACd,OAAO;AAEL,aAAOA,MAAK;AAEZ,aAAOA,MAAK;AAAA,IACd;AACA,SAAK,KAAK,gBAAgB;AAAA,EAC5B;AAOA,WAAS,gBAAgB,OAAO;AAC9B,UAAMG,UAAS,KAAK,eAAe,KAAK;AACxC,UAAM,WAAW,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAGjD,aAAS,QAAQ,aAAaA,OAAM;AAEpC,aAAS,aAAa,oBAAoBA,OAAM,EAAE,YAAY;AAAA,EAChE;AAOA,WAAS,cAAc;AACrB,UAAM,WAAW,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AACjD,UAAM,QAAQ,KAAK,OAAO;AAC1B,UAAMH,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAE7C,SAAK,KAAK,cAAc;AACxB,QAAIA,MAAK,SAAS,QAAQ;AAExB,YAAM,WAAW,SAAS;AAC1B,MAAAA,MAAK,WAAW;AAAA,IAClB,OAAO;AACL,MAAAA,MAAK,MAAM;AAAA,IACb;AAAA,EACF;AAOA,WAAS,kCAAkC;AACzC,UAAMC,QAAO,KAAK,OAAO;AACzB,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,MAAMC;AAAA,EACb;AAOA,WAAS,4BAA4B;AACnC,UAAMA,QAAO,KAAK,OAAO;AACzB,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,QAAQC;AAAA,EACf;AAOA,WAAS,iBAAiB;AACxB,SAAK,KAAK,cAAc;AAAA,EAC1B;AAOA,WAAS,mBAAmB;AAC1B,SAAK,KAAK,gBAAgB;AAAA,EAC5B;AAOA,WAAS,sBAAsB,OAAO;AACpC,UAAM,QAAQ,KAAK,OAAO;AAC1B,UAAMD,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAG7C,IAAAA,MAAK,QAAQ;AAEb,IAAAA,MAAK,aAAa,oBAAoB,KAAK,eAAe,KAAK,CAAC,EAAE,YAAY;AAC9E,SAAK,KAAK,gBAAgB;AAAA,EAC5B;AAOA,WAAS,+BAA+B,OAAO;AAC7C,SAAK,KAAK,yBAAyB,MAAM;AAAA,EAC3C;AAMA,WAAS,8BAA8B,OAAO;AAC5C,UAAMC,QAAO,KAAK,eAAe,KAAK;AACtC,UAAM,OAAO,KAAK,KAAK;AAEvB,QAAI;AACJ,QAAI,MAAM;AACR,cAAQ,gCAAgCA,OAAM,SAAS,oCAAoC,KAAK,EAAE;AAClG,WAAK,KAAK,yBAAyB;AAAA,IACrC,OAAO;AACL,YAAM,SAAS,8BAA8BA,KAAI;AACjD,cAAQ;AAAA,IACV;AACA,UAAM,OAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,SAAK,SAAS;AAAA,EAChB;AAMA,WAAS,yBAAyB,OAAO;AACvC,UAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,SAAK,SAAS,MAAMJ,OAAM,MAAM,GAAG;AAAA,EACrC;AAMA,WAAS,uBAAuB,OAAO;AACrC,eAAW,KAAK,MAAM,KAAK;AAC3B,UAAMG,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,MAAM,KAAK,eAAe,KAAK;AAAA,EACtC;AAMA,WAAS,oBAAoB,OAAO;AAClC,eAAW,KAAK,MAAM,KAAK;AAC3B,UAAMA,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,IAAAA,MAAK,MAAM,YAAY,KAAK,eAAe,KAAK;AAAA,EAClD;AAOA,WAASjB,cAAa;AACpB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,WAAS,WAAW;AAClB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAGA,WAASC,YAAW;AAClB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAGA,WAASC,cAAa;AACpB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAGA,WAASC,YAAW;AAClB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,WAASJ,WAAU;AACjB,WAAO;AAAA,MACL,MAAM;AAAA;AAAA,MAEN,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,WAASK,aAAY;AACnB,WAAO;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AAGA,WAASC,QAAO;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAGA,WAASC,SAAQ;AACf,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AAGA,WAASR,QAAO;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAMA,WAASU,MAAK,OAAO;AACnB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,MAAM,SAAS;AAAA,MACxB,OAAO;AAAA,MACP,QAAQ,MAAM;AAAA,MACd,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAMA,WAASD,UAAS,OAAO;AACvB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,MAAM;AAAA,MACd,SAAS;AAAA,MACT,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,WAASE,aAAY;AACnB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,WAASC,UAAS;AAChB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAGA,WAASS,QAAO;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAGA,WAASR,iBAAgB;AACvB,WAAO;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAUA,SAASG,OAAM,GAAG;AAChB,SAAO;AAAA,IACL,MAAM,EAAE;AAAA,IACR,QAAQ,EAAE;AAAA,IACV,QAAQ,EAAE;AAAA,EACZ;AACF;AAOA,SAAS,UAAU,UAAU,YAAY;AACvC,MAAID,SAAQ;AACZ,SAAO,EAAEA,SAAQ,WAAW,QAAQ;AAClC,UAAM,QAAQ,WAAWA,MAAK;AAC9B,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,gBAAU,UAAU,KAAK;AAAA,IAC3B,OAAO;AACL,gBAAU,UAAU,KAAK;AAAA,IAC3B;AAAA,EACF;AACF;AAOA,SAAS,UAAU,UAAUQ,YAAW;AAEtC,MAAI;AACJ,OAAK,OAAOA,YAAW;AACrB,QAAIxB,KAAI,KAAKwB,YAAW,GAAG,GAAG;AAC5B,cAAQ,KAAK;AAAA,QACX,KAAK,kBACH;AACE,gBAAM,QAAQA,WAAU,GAAG;AAC3B,cAAI,OAAO;AACT,qBAAS,GAAG,EAAE,KAAK,GAAG,KAAK;AAAA,UAC7B;AACA;AAAA,QACF;AAAA,QACF,KAAK,cACH;AACE,gBAAM,QAAQA,WAAU,GAAG;AAC3B,cAAI,OAAO;AACT,qBAAS,GAAG,EAAE,KAAK,GAAG,KAAK;AAAA,UAC7B;AACA;AAAA,QACF;AAAA,QACF,KAAK;AAAA,QACL,KAAK,QACH;AACE,gBAAM,QAAQA,WAAU,GAAG;AAC3B,cAAI,OAAO;AACT,mBAAO,OAAO,SAAS,GAAG,GAAG,KAAK;AAAA,UACpC;AACA;AAAA,QACF;AAAA,MAEJ;AAAA,IACF;AAAA,EACF;AACF;AAGA,SAAS,eAAe,MAAM,OAAO;AACnC,MAAI,MAAM;AACR,UAAM,IAAI,MAAM,mBAAmB,KAAK,OAAO,QAAQ,kBAAkB;AAAA,MACvE,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,IACZ,CAAC,IAAI,4BAA4B,MAAM,OAAO,QAAQ,kBAAkB;AAAA,MACtE,OAAO,MAAM;AAAA,MACb,KAAK,MAAM;AAAA,IACb,CAAC,IAAI,WAAW;AAAA,EAClB,OAAO;AACL,UAAM,IAAI,MAAM,sCAAsC,MAAM,OAAO,QAAQ,kBAAkB;AAAA,MAC3F,OAAO,MAAM;AAAA,MACb,KAAK,MAAM;AAAA,IACb,CAAC,IAAI,iBAAiB;AAAA,EACxB;AACF;;;ACnoCe,SAAR,YAA6B,SAAS;AAG3C,QAAMC,QAAO;AAEb,EAAAA,MAAK,SAAS;AAKd,WAAS,OAAO,KAAK;AACnB,WAAO,aAAa,KAAK;AAAA,MACvB,GAAGA,MAAK,KAAK,UAAU;AAAA,MACvB,GAAG;AAAA;AAAA;AAAA;AAAA,MAIH,YAAYA,MAAK,KAAK,qBAAqB,KAAK,CAAC;AAAA,MACjD,iBAAiBA,MAAK,KAAK,wBAAwB,KAAK,CAAC;AAAA,IAC3D,CAAC;AAAA,EACH;AACF;;;ACvBO,SAAS,WAAW,OAAOC,OAAM;AAEtC,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,IACb,UAAU,MAAM,KAAK,MAAM,IAAIA,KAAI,GAAG,IAAI;AAAA,EAC5C;AACA,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACTO,SAAS,UAAU,OAAOC,OAAM;AAErC,QAAM,SAAS,EAAC,MAAM,WAAW,SAAS,MAAM,YAAY,CAAC,GAAG,UAAU,CAAC,EAAC;AAC5E,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,CAAC,MAAM,UAAUA,OAAM,MAAM,GAAG,EAAC,MAAM,QAAQ,OAAO,KAAI,CAAC;AACpE;;;ACLO,SAAS,KAAK,OAAOC,OAAM;AAChC,QAAM,QAAQA,MAAK,QAAQA,MAAK,QAAQ,OAAO;AAE/C,QAAM,aAAa,CAAC;AAEpB,MAAIA,MAAK,MAAM;AACb,eAAW,YAAY,CAAC,cAAcA,MAAK,IAAI;AAAA,EACjD;AAIA,MAAI,SAAS;AAAA,IACX,MAAM;AAAA,IACN,SAAS;AAAA,IACT;AAAA,IACA,UAAU,CAAC,EAAC,MAAM,QAAQ,MAAK,CAAC;AAAA,EAClC;AAEA,MAAIA,MAAK,MAAM;AACb,WAAO,OAAO,EAAC,MAAMA,MAAK,KAAI;AAAA,EAChC;AAEA,QAAM,MAAMA,OAAM,MAAM;AACxB,WAAS,MAAM,UAAUA,OAAM,MAAM;AAGrC,WAAS,EAAC,MAAM,WAAW,SAAS,OAAO,YAAY,CAAC,GAAG,UAAU,CAAC,MAAM,EAAC;AAC7E,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO;AACT;;;AC9BO,SAAS,cAAc,OAAOC,OAAM;AAEzC,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,IACb,UAAU,MAAM,IAAIA,KAAI;AAAA,EAC1B;AACA,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACVO,SAAS,SAAS,OAAOC,OAAM;AAEpC,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,IACb,UAAU,MAAM,IAAIA,KAAI;AAAA,EAC1B;AACA,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACXO,SAAS,kBAAkB,OAAOC,OAAM;AAC7C,QAAM,gBACJ,OAAO,MAAM,QAAQ,kBAAkB,WACnC,MAAM,QAAQ,gBACd;AACN,QAAM,KAAK,OAAOA,MAAK,UAAU,EAAE,YAAY;AAC/C,QAAM,SAAS,aAAa,GAAG,YAAY,CAAC;AAC5C,QAAMC,SAAQ,MAAM,cAAc,QAAQ,EAAE;AAE5C,MAAI;AAEJ,MAAI,eAAe,MAAM,eAAe,IAAI,EAAE;AAE9C,MAAI,iBAAiB,QAAW;AAC9B,mBAAe;AACf,UAAM,cAAc,KAAK,EAAE;AAC3B,cAAU,MAAM,cAAc;AAAA,EAChC,OAAO;AACL,cAAUA,SAAQ;AAAA,EACpB;AAEA,kBAAgB;AAChB,QAAM,eAAe,IAAI,IAAI,YAAY;AAGzC,QAAMC,QAAO;AAAA,IACX,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,MACV,MAAM,MAAM,gBAAgB,QAAQ;AAAA,MACpC,IACE,gBACA,WACA,UACC,eAAe,IAAI,MAAM,eAAe;AAAA,MAC3C,iBAAiB;AAAA,MACjB,iBAAiB,CAAC,gBAAgB;AAAA,IACpC;AAAA,IACA,UAAU,CAAC,EAAC,MAAM,QAAQ,OAAO,OAAO,OAAO,EAAC,CAAC;AAAA,EACnD;AACA,QAAM,MAAMF,OAAME,KAAI;AAGtB,QAAM,MAAM;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,IACb,UAAU,CAACA,KAAI;AAAA,EACjB;AACA,QAAM,MAAMF,OAAM,GAAG;AACrB,SAAO,MAAM,UAAUA,OAAM,GAAG;AAClC;;;AClDO,SAAS,QAAQ,OAAOG,OAAM;AAEnC,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS,MAAMA,MAAK;AAAA,IACpB,YAAY,CAAC;AAAA,IACb,UAAU,MAAM,IAAIA,KAAI;AAAA,EAC1B;AACA,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACRO,SAASC,MAAK,OAAOC,OAAM;AAChC,MAAI,MAAM,QAAQ,oBAAoB;AAEpC,UAAM,SAAS,EAAC,MAAM,OAAO,OAAOA,MAAK,MAAK;AAC9C,UAAM,MAAMA,OAAM,MAAM;AACxB,WAAO,MAAM,UAAUA,OAAM,MAAM;AAAA,EACrC;AAEA,SAAO;AACT;;;ACRO,SAAS,OAAO,OAAOC,OAAM;AAClC,QAAM,UAAUA,MAAK;AACrB,MAAI,SAAS;AAEb,MAAI,YAAY,aAAa;AAC3B,cAAU;AAAA,EACZ,WAAW,YAAY,QAAQ;AAC7B,cAAU,OAAOA,MAAK,SAASA,MAAK,cAAc;AAAA,EACpD;AAEA,MAAIA,MAAK,SAAS,kBAAkB;AAClC,WAAO,CAAC,EAAC,MAAM,QAAQ,OAAO,OAAOA,MAAK,MAAM,OAAM,CAAC;AAAA,EACzD;AAEA,QAAM,WAAW,MAAM,IAAIA,KAAI;AAC/B,QAAM,OAAO,SAAS,CAAC;AAEvB,MAAI,QAAQ,KAAK,SAAS,QAAQ;AAChC,SAAK,QAAQ,MAAM,KAAK;AAAA,EAC1B,OAAO;AACL,aAAS,QAAQ,EAAC,MAAM,QAAQ,OAAO,IAAG,CAAC;AAAA,EAC7C;AAEA,QAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AAEzC,MAAI,QAAQ,KAAK,SAAS,QAAQ;AAChC,SAAK,SAAS;AAAA,EAChB,OAAO;AACL,aAAS,KAAK,EAAC,MAAM,QAAQ,OAAO,OAAM,CAAC;AAAA,EAC7C;AAEA,SAAO;AACT;;;ACjCO,SAAS,eAAe,OAAOC,OAAM;AAC1C,QAAM,KAAK,OAAOA,MAAK,UAAU,EAAE,YAAY;AAC/C,QAAMC,cAAa,MAAM,eAAe,IAAI,EAAE;AAE9C,MAAI,CAACA,aAAY;AACf,WAAO,OAAO,OAAOD,KAAI;AAAA,EAC3B;AAGA,QAAM,aAAa,EAAC,KAAK,aAAaC,YAAW,OAAO,EAAE,GAAG,KAAKD,MAAK,IAAG;AAE1E,MAAIC,YAAW,UAAU,QAAQA,YAAW,UAAU,QAAW;AAC/D,eAAW,QAAQA,YAAW;AAAA,EAChC;AAGA,QAAM,SAAS,EAAC,MAAM,WAAW,SAAS,OAAO,YAAY,UAAU,CAAC,EAAC;AACzE,QAAM,MAAMD,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACrBO,SAAS,MAAM,OAAOE,OAAM;AAEjC,QAAM,aAAa,EAAC,KAAK,aAAaA,MAAK,GAAG,EAAC;AAE/C,MAAIA,MAAK,QAAQ,QAAQA,MAAK,QAAQ,QAAW;AAC/C,eAAW,MAAMA,MAAK;AAAA,EACxB;AAEA,MAAIA,MAAK,UAAU,QAAQA,MAAK,UAAU,QAAW;AACnD,eAAW,QAAQA,MAAK;AAAA,EAC1B;AAGA,QAAM,SAAS,EAAC,MAAM,WAAW,SAAS,OAAO,YAAY,UAAU,CAAC,EAAC;AACzE,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACfO,SAAS,WAAW,OAAOC,OAAM;AAEtC,QAAMC,QAAO,EAAC,MAAM,QAAQ,OAAOD,MAAK,MAAM,QAAQ,aAAa,GAAG,EAAC;AACvE,QAAM,MAAMA,OAAMC,KAAI;AAGtB,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,IACb,UAAU,CAACA,KAAI;AAAA,EACjB;AACA,QAAM,MAAMD,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACbO,SAAS,cAAc,OAAOE,OAAM;AACzC,QAAM,KAAK,OAAOA,MAAK,UAAU,EAAE,YAAY;AAC/C,QAAMC,cAAa,MAAM,eAAe,IAAI,EAAE;AAE9C,MAAI,CAACA,aAAY;AACf,WAAO,OAAO,OAAOD,KAAI;AAAA,EAC3B;AAGA,QAAM,aAAa,EAAC,MAAM,aAAaC,YAAW,OAAO,EAAE,EAAC;AAE5D,MAAIA,YAAW,UAAU,QAAQA,YAAW,UAAU,QAAW;AAC/D,eAAW,QAAQA,YAAW;AAAA,EAChC;AAGA,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT;AAAA,IACA,UAAU,MAAM,IAAID,KAAI;AAAA,EAC1B;AACA,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;AC1BO,SAAS,KAAK,OAAOE,OAAM;AAEhC,QAAM,aAAa,EAAC,MAAM,aAAaA,MAAK,GAAG,EAAC;AAEhD,MAAIA,MAAK,UAAU,QAAQA,MAAK,UAAU,QAAW;AACnD,eAAW,QAAQA,MAAK;AAAA,EAC1B;AAGA,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT;AAAA,IACA,UAAU,MAAM,IAAIA,KAAI;AAAA,EAC1B;AACA,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACZO,SAAS,SAAS,OAAOC,OAAM,QAAQ;AAC5C,QAAM,UAAU,MAAM,IAAIA,KAAI;AAC9B,QAAM,QAAQ,SAAS,UAAU,MAAM,IAAI,cAAcA,KAAI;AAE7D,QAAM,aAAa,CAAC;AAEpB,QAAM,WAAW,CAAC;AAElB,MAAI,OAAOA,MAAK,YAAY,WAAW;AACrC,UAAM,OAAO,QAAQ,CAAC;AAEtB,QAAIC;AAEJ,QAAI,QAAQ,KAAK,SAAS,aAAa,KAAK,YAAY,KAAK;AAC3D,MAAAA,aAAY;AAAA,IACd,OAAO;AACL,MAAAA,aAAY,EAAC,MAAM,WAAW,SAAS,KAAK,YAAY,CAAC,GAAG,UAAU,CAAC,EAAC;AACxE,cAAQ,QAAQA,UAAS;AAAA,IAC3B;AAEA,QAAIA,WAAU,SAAS,SAAS,GAAG;AACjC,MAAAA,WAAU,SAAS,QAAQ,EAAC,MAAM,QAAQ,OAAO,IAAG,CAAC;AAAA,IACvD;AAEA,IAAAA,WAAU,SAAS,QAAQ;AAAA,MACzB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,YAAY,EAAC,MAAM,YAAY,SAASD,MAAK,SAAS,UAAU,KAAI;AAAA,MACpE,UAAU,CAAC;AAAA,IACb,CAAC;AAID,eAAW,YAAY,CAAC,gBAAgB;AAAA,EAC1C;AAEA,MAAIE,SAAQ;AAEZ,SAAO,EAAEA,SAAQ,QAAQ,QAAQ;AAC/B,UAAM,QAAQ,QAAQA,MAAK;AAG3B,QACE,SACAA,WAAU,KACV,MAAM,SAAS,aACf,MAAM,YAAY,KAClB;AACA,eAAS,KAAK,EAAC,MAAM,QAAQ,OAAO,KAAI,CAAC;AAAA,IAC3C;AAEA,QAAI,MAAM,SAAS,aAAa,MAAM,YAAY,OAAO,CAAC,OAAO;AAC/D,eAAS,KAAK,GAAG,MAAM,QAAQ;AAAA,IACjC,OAAO;AACL,eAAS,KAAK,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ,QAAQ,SAAS,CAAC;AAGvC,MAAI,SAAS,SAAS,KAAK,SAAS,aAAa,KAAK,YAAY,MAAM;AACtE,aAAS,KAAK,EAAC,MAAM,QAAQ,OAAO,KAAI,CAAC;AAAA,EAC3C;AAGA,QAAM,SAAS,EAAC,MAAM,WAAW,SAAS,MAAM,YAAY,SAAQ;AACpE,QAAM,MAAMF,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;AAMA,SAAS,UAAUA,OAAM;AACvB,MAAI,QAAQ;AACZ,MAAIA,MAAK,SAAS,QAAQ;AACxB,YAAQA,MAAK,UAAU;AACvB,UAAM,WAAWA,MAAK;AACtB,QAAIE,SAAQ;AAEZ,WAAO,CAAC,SAAS,EAAEA,SAAQ,SAAS,QAAQ;AAC1C,cAAQ,cAAc,SAASA,MAAK,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,cAAcF,OAAM;AAC3B,QAAM,SAASA,MAAK;AAEpB,SAAO,WAAW,QAAQ,WAAW,SACjCA,MAAK,SAAS,SAAS,IACvB;AACN;;;ACxGO,SAASG,MAAK,OAAOC,OAAM;AAEhC,QAAM,aAAa,CAAC;AACpB,QAAM,UAAU,MAAM,IAAIA,KAAI;AAC9B,MAAIC,SAAQ;AAEZ,MAAI,OAAOD,MAAK,UAAU,YAAYA,MAAK,UAAU,GAAG;AACtD,eAAW,QAAQA,MAAK;AAAA,EAC1B;AAGA,SAAO,EAAEC,SAAQ,QAAQ,QAAQ;AAC/B,UAAM,QAAQ,QAAQA,MAAK;AAE3B,QACE,MAAM,SAAS,aACf,MAAM,YAAY,QAClB,MAAM,cACN,MAAM,QAAQ,MAAM,WAAW,SAAS,KACxC,MAAM,WAAW,UAAU,SAAS,gBAAgB,GACpD;AACA,iBAAW,YAAY,CAAC,oBAAoB;AAC5C;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAASD,MAAK,UAAU,OAAO;AAAA,IAC/B;AAAA,IACA,UAAU,MAAM,KAAK,SAAS,IAAI;AAAA,EACpC;AACA,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACpCO,SAAS,UAAU,OAAOE,OAAM;AAErC,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,IACb,UAAU,MAAM,IAAIA,KAAI;AAAA,EAC1B;AACA,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACTO,SAASC,MAAK,OAAOC,OAAM;AAEhC,QAAM,SAAS,EAAC,MAAM,QAAQ,UAAU,MAAM,KAAK,MAAM,IAAIA,KAAI,CAAC,EAAC;AACnE,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACNO,SAAS,OAAO,OAAOC,OAAM;AAElC,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,IACb,UAAU,MAAM,IAAIA,KAAI;AAAA,EAC1B;AACA,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACXO,SAAS,MAAM,OAAOC,OAAM;AACjC,QAAM,OAAO,MAAM,IAAIA,KAAI;AAC3B,QAAM,WAAW,KAAK,MAAM;AAE5B,QAAM,eAAe,CAAC;AAEtB,MAAI,UAAU;AAEZ,UAAM,OAAO;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,MACT,YAAY,CAAC;AAAA,MACb,UAAU,MAAM,KAAK,CAAC,QAAQ,GAAG,IAAI;AAAA,IACvC;AACA,UAAM,MAAMA,MAAK,SAAS,CAAC,GAAG,IAAI;AAClC,iBAAa,KAAK,IAAI;AAAA,EACxB;AAEA,MAAI,KAAK,SAAS,GAAG;AAEnB,UAAM,OAAO;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,MACT,YAAY,CAAC;AAAA,MACb,UAAU,MAAM,KAAK,MAAM,IAAI;AAAA,IACjC;AAEA,UAAMC,SAAQ,WAAWD,MAAK,SAAS,CAAC,CAAC;AACzC,UAAM,MAAM,SAASA,MAAK,SAASA,MAAK,SAAS,SAAS,CAAC,CAAC;AAC5D,QAAIC,UAAS,IAAK,MAAK,WAAW,EAAC,OAAAA,QAAO,IAAG;AAC7C,iBAAa,KAAK,IAAI;AAAA,EACxB;AAGA,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,IACb,UAAU,MAAM,KAAK,cAAc,IAAI;AAAA,EACzC;AACA,QAAM,MAAMD,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACpCO,SAAS,SAAS,OAAOE,OAAM,QAAQ;AAC5C,QAAM,WAAW,SAAS,OAAO,WAAW;AAE5C,QAAM,WAAW,WAAW,SAAS,QAAQA,KAAI,IAAI;AACrD,QAAM,UAAU,aAAa,IAAI,OAAO;AAExC,QAAM,QAAQ,UAAU,OAAO,SAAS,UAAU,OAAO,QAAQ;AACjE,QAAM,SAAS,QAAQ,MAAM,SAASA,MAAK,SAAS;AACpD,MAAI,YAAY;AAEhB,QAAM,QAAQ,CAAC;AAEf,SAAO,EAAE,YAAY,QAAQ;AAE3B,UAAM,OAAOA,MAAK,SAAS,SAAS;AAEpC,UAAM,aAAa,CAAC;AACpB,UAAM,aAAa,QAAQ,MAAM,SAAS,IAAI;AAE9C,QAAI,YAAY;AACd,iBAAW,QAAQ;AAAA,IACrB;AAGA,QAAIC,UAAS,EAAC,MAAM,WAAW,SAAS,YAAY,UAAU,CAAC,EAAC;AAEhE,QAAI,MAAM;AACR,MAAAA,QAAO,WAAW,MAAM,IAAI,IAAI;AAChC,YAAM,MAAM,MAAMA,OAAM;AACxB,MAAAA,UAAS,MAAM,UAAU,MAAMA,OAAM;AAAA,IACvC;AAEA,UAAM,KAAKA,OAAM;AAAA,EACnB;AAGA,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,IACb,UAAU,MAAM,KAAK,OAAO,IAAI;AAAA,EAClC;AACA,QAAM,MAAMD,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACjDO,SAAS,UAAU,OAAOE,OAAM;AAIrC,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA;AAAA,IACT,YAAY,CAAC;AAAA,IACb,UAAU,MAAM,IAAIA,KAAI;AAAA,EAC1B;AACA,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;AC/BA,IAAM,MAAM;AACZ,IAAM,QAAQ;AAWP,SAAS,UAAU,OAAO;AAC/B,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAMC,UAAS;AACf,MAAI,QAAQA,QAAO,KAAK,MAAM;AAC9B,MAAI,OAAO;AAEX,QAAM,QAAQ,CAAC;AAEf,SAAO,OAAO;AACZ,UAAM;AAAA,MACJ,SAAS,OAAO,MAAM,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,IAAI;AAAA,MACxD,MAAM,CAAC;AAAA,IACT;AAEA,WAAO,MAAM,QAAQ,MAAM,CAAC,EAAE;AAC9B,YAAQA,QAAO,KAAK,MAAM;AAAA,EAC5B;AAEA,QAAM,KAAK,SAAS,OAAO,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,CAAC;AAExD,SAAO,MAAM,KAAK,EAAE;AACtB;AAYA,SAAS,SAAS,OAAOC,QAAO,KAAK;AACnC,MAAI,aAAa;AACjB,MAAI,WAAW,MAAM;AAErB,MAAIA,QAAO;AACT,QAAIC,QAAO,MAAM,YAAY,UAAU;AAEvC,WAAOA,UAAS,OAAOA,UAAS,OAAO;AACrC;AACA,MAAAA,QAAO,MAAM,YAAY,UAAU;AAAA,IACrC;AAAA,EACF;AAEA,MAAI,KAAK;AACP,QAAIA,QAAO,MAAM,YAAY,WAAW,CAAC;AAEzC,WAAOA,UAAS,OAAOA,UAAS,OAAO;AACrC;AACA,MAAAA,QAAO,MAAM,YAAY,WAAW,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,SAAO,WAAW,aAAa,MAAM,MAAM,YAAY,QAAQ,IAAI;AACrE;;;ACjDO,SAASC,MAAK,OAAOC,OAAM;AAEhC,QAAM,SAAS,EAAC,MAAM,QAAQ,OAAO,UAAU,OAAOA,MAAK,KAAK,CAAC,EAAC;AAClE,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACLO,SAASC,eAAc,OAAOC,OAAM;AAEzC,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,IACb,UAAU,CAAC;AAAA,EACb;AACA,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;;;ACAO,IAAM,WAAW;AAAA,EACtB;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAAC;AAAA,EACA;AAAA;AAAA,EAEA,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAAC;AAAA,EACA,eAAAC;AAAA,EACA,MAAM;AAAA,EACN,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,oBAAoB;AACtB;AAGA,SAAS,SAAS;AAChB,SAAO;AACT;;;AC/DO,IAAM,OAAa;AACnB,IAAM,YAAa;AACnB,IAAM,QAAa;AACnB,IAAM,SAAa;AACnB,IAAM,OAAa;AACnB,IAAM,SAAa;AACnB,IAAM,MAAa;AACnB,IAAM,MAAa;AACnB,IAAM,QAAa;AACnB,IAAM,SAAa;;;ACF1B,IAAM,MAAM,OAAO,SAAS,WAAW,OAAO;AAE9C,IAAM,eAAe,CAAC,GAAG,MAAM;AAC7B,QAAM,KAAK,CAAC,KAAKC,WAAU;AACzB,MAAE,IAAIA,QAAO,GAAG;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,CAAAA,WAAS;AACtB,QAAI,EAAE,IAAIA,MAAK;AACb,aAAO,EAAE,IAAIA,MAAK;AAEpB,UAAM,CAAC,MAAM,KAAK,IAAI,EAAEA,MAAK;AAC7B,YAAQ,MAAM;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AACH,eAAO,GAAG,OAAOA,MAAK;AAAA,MACxB,KAAK,OAAO;AACV,cAAM,MAAM,GAAG,CAAC,GAAGA,MAAK;AACxB,mBAAWA,UAAS;AAClB,cAAI,KAAK,OAAOA,MAAK,CAAC;AACxB,eAAO;AAAA,MACT;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,SAAS,GAAG,CAAC,GAAGA,MAAK;AAC3B,mBAAW,CAAC,KAAKA,MAAK,KAAK;AACzB,iBAAO,OAAO,GAAG,CAAC,IAAI,OAAOA,MAAK;AACpC,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AACH,eAAO,GAAG,IAAI,KAAK,KAAK,GAAGA,MAAK;AAAA,MAClC,KAAK,QAAQ;AACX,cAAM,EAAC,QAAQ,MAAK,IAAI;AACxB,eAAO,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAGA,MAAK;AAAA,MAC5C;AAAA,MACA,KAAK,KAAK;AACR,cAAMC,OAAM,GAAG,oBAAI,OAAKD,MAAK;AAC7B,mBAAW,CAAC,KAAKA,MAAK,KAAK;AACzB,UAAAC,KAAI,IAAI,OAAO,GAAG,GAAG,OAAOD,MAAK,CAAC;AACpC,eAAOC;AAAA,MACT;AAAA,MACA,KAAK,KAAK;AACR,cAAM,MAAM,GAAG,oBAAI,OAAKD,MAAK;AAC7B,mBAAWA,UAAS;AAClB,cAAI,IAAI,OAAOA,MAAK,CAAC;AACvB,eAAO;AAAA,MACT;AAAA,MACA,KAAK,OAAO;AACV,cAAM,EAAC,MAAAE,OAAM,QAAO,IAAI;AACxB,eAAO,GAAG,IAAI,IAAIA,KAAI,EAAE,OAAO,GAAGF,MAAK;AAAA,MACzC;AAAA,MACA,KAAK;AACH,eAAO,GAAG,OAAO,KAAK,GAAGA,MAAK;AAAA,MAChC,KAAK;AACH,eAAO,GAAG,OAAO,OAAO,KAAK,CAAC,GAAGA,MAAK;AAAA,MACxC,KAAK;AACH,eAAO,GAAG,IAAI,WAAW,KAAK,EAAE,QAAQ,KAAK;AAAA,MAC/C,KAAK,YAAY;AACf,cAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK;AACvC,eAAO,GAAG,IAAI,SAAS,MAAM,GAAG,KAAK;AAAA,MACvC;AAAA,IACF;AACA,WAAO,GAAG,IAAI,IAAI,IAAI,EAAE,KAAK,GAAGA,MAAK;AAAA,EACvC;AAEA,SAAO;AACT;AAWO,IAAM,cAAc,gBAAc,aAAa,oBAAI,OAAK,UAAU,EAAE,CAAC;;;AC7E5E,IAAM,QAAQ;AAEd,IAAM,EAAC,UAAAG,UAAQ,IAAI,CAAC;AACpB,IAAM,EAAC,MAAAC,MAAI,IAAI;AAEf,IAAM,SAAS,WAAS;AACtB,QAAM,OAAO,OAAO;AACpB,MAAI,SAAS,YAAY,CAAC;AACxB,WAAO,CAAC,WAAW,IAAI;AAEzB,QAAM,WAAWD,UAAS,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE;AACjD,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,CAAC,OAAO,KAAK;AAAA,IACtB,KAAK;AACH,aAAO,CAAC,QAAQ,KAAK;AAAA,IACvB,KAAK;AACH,aAAO,CAAC,MAAM,KAAK;AAAA,IACrB,KAAK;AACH,aAAO,CAAC,QAAQ,KAAK;AAAA,IACvB,KAAK;AACH,aAAO,CAAC,KAAK,KAAK;AAAA,IACpB,KAAK;AACH,aAAO,CAAC,KAAK,KAAK;AAAA,IACpB,KAAK;AACH,aAAO,CAAC,OAAO,QAAQ;AAAA,EAC3B;AAEA,MAAI,SAAS,SAAS,OAAO;AAC3B,WAAO,CAAC,OAAO,QAAQ;AAEzB,MAAI,SAAS,SAAS,OAAO;AAC3B,WAAO,CAAC,OAAO,QAAQ;AAEzB,SAAO,CAAC,QAAQ,QAAQ;AAC1B;AAEA,IAAM,aAAa,CAAC,CAAC,MAAM,IAAI,MAC7B,SAAS,cACR,SAAS,cAAc,SAAS;AAGnC,IAAM,aAAa,CAAC,QAAQ,MAAM,GAAG,MAAM;AAEzC,QAAM,KAAK,CAAC,KAAK,UAAU;AACzB,UAAME,SAAQ,EAAE,KAAK,GAAG,IAAI;AAC5B,MAAE,IAAI,OAAOA,MAAK;AAClB,WAAOA;AAAA,EACT;AAEA,QAAM,OAAO,WAAS;AACpB,QAAI,EAAE,IAAI,KAAK;AACb,aAAO,EAAE,IAAI,KAAK;AAEpB,QAAI,CAAC,MAAM,IAAI,IAAI,OAAO,KAAK;AAC/B,YAAQ,MAAM;AAAA,MACZ,KAAK,WAAW;AACd,YAAI,QAAQ;AACZ,gBAAQ,MAAM;AAAA,UACZ,KAAK;AACH,mBAAO;AACP,oBAAQ,MAAM,SAAS;AACvB;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AACH,gBAAI;AACF,oBAAM,IAAI,UAAU,yBAAyB,IAAI;AACnD,oBAAQ;AACR;AAAA,UACF,KAAK;AACH,mBAAO,GAAG,CAAC,IAAI,GAAG,KAAK;AAAA,QAC3B;AACA,eAAO,GAAG,CAAC,MAAM,KAAK,GAAG,KAAK;AAAA,MAChC;AAAA,MACA,KAAK,OAAO;AACV,YAAI,MAAM;AACR,cAAI,SAAS;AACb,cAAI,SAAS,YAAY;AACvB,qBAAS,IAAI,WAAW,MAAM,MAAM;AAAA,UACtC,WACS,SAAS,eAAe;AAC/B,qBAAS,IAAI,WAAW,KAAK;AAAA,UAC/B;AACA,iBAAO,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK;AAAA,QACtC;AAEA,cAAM,MAAM,CAAC;AACb,cAAMA,SAAQ,GAAG,CAAC,MAAM,GAAG,GAAG,KAAK;AACnC,mBAAW,SAAS;AAClB,cAAI,KAAK,KAAK,KAAK,CAAC;AACtB,eAAOA;AAAA,MACT;AAAA,MACA,KAAK,QAAQ;AACX,YAAI,MAAM;AACR,kBAAQ,MAAM;AAAA,YACZ,KAAK;AACH,qBAAO,GAAG,CAAC,MAAM,MAAM,SAAS,CAAC,GAAG,KAAK;AAAA,YAC3C,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AACH,qBAAO,GAAG,CAAC,MAAM,MAAM,QAAQ,CAAC,GAAG,KAAK;AAAA,UAC5C;AAAA,QACF;AAEA,YAAI,QAAS,YAAY;AACvB,iBAAO,KAAK,MAAM,OAAO,CAAC;AAE5B,cAAM,UAAU,CAAC;AACjB,cAAMA,SAAQ,GAAG,CAAC,MAAM,OAAO,GAAG,KAAK;AACvC,mBAAW,OAAOD,MAAK,KAAK,GAAG;AAC7B,cAAI,UAAU,CAAC,WAAW,OAAO,MAAM,GAAG,CAAC,CAAC;AAC1C,oBAAQ,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC;AAAA,QAC9C;AACA,eAAOC;AAAA,MACT;AAAA,MACA,KAAK;AACH,eAAO,GAAG,CAAC,MAAM,MAAM,YAAY,CAAC,GAAG,KAAK;AAAA,MAC9C,KAAK,QAAQ;AACX,cAAM,EAAC,QAAQ,MAAK,IAAI;AACxB,eAAO,GAAG,CAAC,MAAM,EAAC,QAAQ,MAAK,CAAC,GAAG,KAAK;AAAA,MAC1C;AAAA,MACA,KAAK,KAAK;AACR,cAAM,UAAU,CAAC;AACjB,cAAMA,SAAQ,GAAG,CAAC,MAAM,OAAO,GAAG,KAAK;AACvC,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO;AAChC,cAAI,UAAU,EAAE,WAAW,OAAO,GAAG,CAAC,KAAK,WAAW,OAAO,KAAK,CAAC;AACjE,oBAAQ,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC;AAAA,QACzC;AACA,eAAOA;AAAA,MACT;AAAA,MACA,KAAK,KAAK;AACR,cAAM,UAAU,CAAC;AACjB,cAAMA,SAAQ,GAAG,CAAC,MAAM,OAAO,GAAG,KAAK;AACvC,mBAAW,SAAS,OAAO;AACzB,cAAI,UAAU,CAAC,WAAW,OAAO,KAAK,CAAC;AACrC,oBAAQ,KAAK,KAAK,KAAK,CAAC;AAAA,QAC5B;AACA,eAAOA;AAAA,MACT;AAAA,IACF;AAEA,UAAM,EAAC,QAAO,IAAI;AAClB,WAAO,GAAG,CAAC,MAAM,EAAC,MAAM,MAAM,QAAO,CAAC,GAAG,KAAK;AAAA,EAChD;AAEA,SAAO;AACT;AAcQ,IAAM,YAAY,CAAC,OAAO,EAAC,MAAM,MAAK,IAAI,CAAC,MAAM;AACvD,QAAM,IAAI,CAAC;AACX,SAAO,WAAW,EAAE,QAAQ,QAAQ,CAAC,CAAC,MAAM,oBAAI,OAAK,CAAC,EAAE,KAAK,GAAG;AAClE;;;AC3JA,IAAOC,eAAQ,OAAO,oBAAoB;AAAA;AAAA,EAExC,CAAC,KAAK,YACJ,YAAY,UAAU,WAAW,WAAW,WAC1C,YAAY,UAAU,KAAK,OAAO,CAAC,IAAI,gBAAgB,GAAG;AAAA,IAE9D,CAAC,KAAK,YAAY,YAAY,UAAU,KAAK,OAAO,CAAC;;;AC2DhD,SAAS,2BAA2B,GAAG,kBAAkB;AAE9D,QAAM,SAAS,CAAC,EAAC,MAAM,QAAQ,OAAO,SAAG,CAAC;AAE1C,MAAI,mBAAmB,GAAG;AACxB,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,YAAY,CAAC;AAAA,MACb,UAAU,CAAC,EAAC,MAAM,QAAQ,OAAO,OAAO,gBAAgB,EAAC,CAAC;AAAA,IAC5D,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAaO,SAAS,yBAAyB,gBAAgB,kBAAkB;AACzE,SACE,wBACC,iBAAiB,MACjB,mBAAmB,IAAI,MAAM,mBAAmB;AAErD;AAWO,SAAS,OAAO,OAAO;AAC5B,QAAM,gBACJ,OAAO,MAAM,QAAQ,kBAAkB,WACnC,MAAM,QAAQ,gBACd;AACN,QAAM,sBACJ,MAAM,QAAQ,uBAAuB;AACvC,QAAM,oBACJ,MAAM,QAAQ,qBAAqB;AACrC,QAAM,gBAAgB,MAAM,QAAQ,iBAAiB;AACrD,QAAM,uBAAuB,MAAM,QAAQ,wBAAwB;AACnE,QAAM,0BAA0B,MAAM,QAAQ,2BAA2B;AAAA,IACvE,WAAW,CAAC,SAAS;AAAA,EACvB;AAEA,QAAM,YAAY,CAAC;AACnB,MAAI,iBAAiB;AAErB,SAAO,EAAE,iBAAiB,MAAM,cAAc,QAAQ;AACpD,UAAMC,cAAa,MAAM,aAAa;AAAA,MACpC,MAAM,cAAc,cAAc;AAAA,IACpC;AAEA,QAAI,CAACA,aAAY;AACf;AAAA,IACF;AAEA,UAAMC,WAAU,MAAM,IAAID,WAAU;AACpC,UAAM,KAAK,OAAOA,YAAW,UAAU,EAAE,YAAY;AACrD,UAAM,SAAS,aAAa,GAAG,YAAY,CAAC;AAC5C,QAAI,mBAAmB;AAEvB,UAAM,iBAAiB,CAAC;AACxB,UAAM,SAAS,MAAM,eAAe,IAAI,EAAE;AAG1C,WAAO,WAAW,UAAa,EAAE,oBAAoB,QAAQ;AAC3D,UAAI,eAAe,SAAS,GAAG;AAC7B,uBAAe,KAAK,EAAC,MAAM,QAAQ,OAAO,IAAG,CAAC;AAAA,MAChD;AAEA,UAAI,WACF,OAAO,wBAAwB,WAC3B,sBACA,oBAAoB,gBAAgB,gBAAgB;AAE1D,UAAI,OAAO,aAAa,UAAU;AAChC,mBAAW,EAAC,MAAM,QAAQ,OAAO,SAAQ;AAAA,MAC3C;AAEA,qBAAe,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,UACV,MACE,MACA,gBACA,WACA,UACC,mBAAmB,IAAI,MAAM,mBAAmB;AAAA,UACnD,qBAAqB;AAAA,UACrB,WACE,OAAO,sBAAsB,WACzB,oBACA,kBAAkB,gBAAgB,gBAAgB;AAAA,UACxD,WAAW,CAAC,uBAAuB;AAAA,QACrC;AAAA,QACA,UAAU,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;AAAA,MAC1D,CAAC;AAAA,IACH;AAEA,UAAM,OAAOC,SAAQA,SAAQ,SAAS,CAAC;AAEvC,QAAI,QAAQ,KAAK,SAAS,aAAa,KAAK,YAAY,KAAK;AAC3D,YAAM,WAAW,KAAK,SAAS,KAAK,SAAS,SAAS,CAAC;AACvD,UAAI,YAAY,SAAS,SAAS,QAAQ;AACxC,iBAAS,SAAS;AAAA,MACpB,OAAO;AACL,aAAK,SAAS,KAAK,EAAC,MAAM,QAAQ,OAAO,IAAG,CAAC;AAAA,MAC/C;AAEA,WAAK,SAAS,KAAK,GAAG,cAAc;AAAA,IACtC,OAAO;AACL,MAAAA,SAAQ,KAAK,GAAG,cAAc;AAAA,IAChC;AAGA,UAAMC,YAAW;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,YAAY,EAAC,IAAI,gBAAgB,QAAQ,OAAM;AAAA,MAC/C,UAAU,MAAM,KAAKD,UAAS,IAAI;AAAA,IACpC;AAEA,UAAM,MAAMD,aAAYE,SAAQ;AAEhC,cAAU,KAAKA,SAAQ;AAAA,EACzB;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,EAAC,eAAe,MAAM,WAAW,CAAC,WAAW,EAAC;AAAA,IAC1D,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,UACV,GAAGC,aAAgB,uBAAuB;AAAA,UAC1C,IAAI;AAAA,QACN;AAAA,QACA,UAAU,CAAC,EAAC,MAAM,QAAQ,OAAO,cAAa,CAAC;AAAA,MACjD;AAAA,MACA,EAAC,MAAM,QAAQ,OAAO,KAAI;AAAA,MAC1B;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY,CAAC;AAAA,QACb,UAAU,MAAM,KAAK,WAAW,IAAI;AAAA,MACtC;AAAA,MACA,EAAC,MAAM,QAAQ,OAAO,KAAI;AAAA,IAC5B;AAAA,EACF;AACF;;;AChHO,IAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBT,SAAUC,OAAM;AACd,QAAIA,UAAS,QAAQA,UAAS,QAAW;AACvC,aAAOC;AAAA,IACT;AAEA,QAAI,OAAOD,UAAS,YAAY;AAC9B,aAAO,YAAYA,KAAI;AAAA,IACzB;AAEA,QAAI,OAAOA,UAAS,UAAU;AAC5B,aAAO,MAAM,QAAQA,KAAI,IAAI,WAAWA,KAAI,IAAI,aAAaA,KAAI;AAAA,IACnE;AAEA,QAAI,OAAOA,UAAS,UAAU;AAC5B,aAAO,YAAYA,KAAI;AAAA,IACzB;AAEA,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAAA;AAOJ,SAAS,WAAW,OAAO;AAEzB,QAAME,UAAS,CAAC;AAChB,MAAIC,SAAQ;AAEZ,SAAO,EAAEA,SAAQ,MAAM,QAAQ;AAC7B,IAAAD,QAAOC,MAAK,IAAI,QAAQ,MAAMA,MAAK,CAAC;AAAA,EACtC;AAEA,SAAO,YAAY,GAAG;AAMtB,WAAS,OAAO,YAAY;AAC1B,QAAIA,SAAQ;AAEZ,WAAO,EAAEA,SAAQD,QAAO,QAAQ;AAC9B,UAAIA,QAAOC,MAAK,EAAE,MAAM,MAAM,UAAU,EAAG,QAAO;AAAA,IACpD;AAEA,WAAO;AAAA,EACT;AACF;AAQA,SAAS,aAAa,OAAO;AAC3B,QAAM;AAAA;AAAA,IAAwD;AAAA;AAE9D,SAAO,YAAYC,IAAG;AAMtB,WAASA,KAAIC,OAAM;AACjB,UAAM;AAAA;AAAA;AAAA,MACoBA;AAAA;AAI1B,QAAI;AAEJ,SAAK,OAAO,OAAO;AACjB,UAAI,aAAa,GAAG,MAAM,cAAc,GAAG,EAAG,QAAO;AAAA,IACvD;AAEA,WAAO;AAAA,EACT;AACF;AAQA,SAAS,YAAY,OAAO;AAC1B,SAAO,YAAY,IAAI;AAKvB,WAAS,KAAKA,OAAM;AAClB,WAAOA,SAAQA,MAAK,SAAS;AAAA,EAC/B;AACF;AAQA,SAAS,YAAY,cAAc;AACjC,SAAO;AAMP,WAAS,MAAM,OAAOF,QAAO,QAAQ;AACnC,WAAO;AAAA,MACL,eAAe,KAAK,KAClB,aAAa;AAAA,QACX;AAAA,QACA;AAAA,QACA,OAAOA,WAAU,WAAWA,SAAQ;AAAA,QACpC,UAAU;AAAA,MACZ;AAAA,IACJ;AAAA,EACF;AACF;AAEA,SAASF,MAAK;AACZ,SAAO;AACT;AAMA,SAAS,eAAe,OAAO;AAC7B,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,UAAU;AAClE;;;AC9RO,SAAS,MAAM,GAAG;AACvB,SAAO,aAAe,IAAI;AAC5B;;;ACyNA,IAAMK,SAAQ,CAAC;AAKR,IAAM,WAAW;AAKjB,IAAM,OAAO;AAKb,IAAM,OAAO;AAiDb,SAAS,aAAa,MAAMC,OAAMC,UAAS,SAAS;AAEzD,MAAI;AAEJ,MAAI,OAAOD,UAAS,cAAc,OAAOC,aAAY,YAAY;AAC/D,cAAUA;AAEV,IAAAA,WAAUD;AAAA,EACZ,OAAO;AAEL,YAAQA;AAAA,EACV;AAEA,QAAME,MAAK,QAAQ,KAAK;AACxB,QAAM,OAAO,UAAU,KAAK;AAE5B,UAAQ,MAAM,QAAW,CAAC,CAAC,EAAE;AAO7B,WAAS,QAAQC,OAAMC,QAAO,SAAS;AACrC,UAAM;AAAA;AAAA,MACJD,SAAQ,OAAOA,UAAS,WAAWA,QAAO,CAAC;AAAA;AAG7C,QAAI,OAAO,MAAM,SAAS,UAAU;AAClC,YAAME;AAAA;AAAA,QAEJ,OAAO,MAAM,YAAY,WACrB,MAAM;AAAA;AAAA,UAER,OAAO,MAAM,SAAS,WACpB,MAAM,OACN;AAAA;AAAA;AAEN,aAAO,eAAeC,QAAO,QAAQ;AAAA,QACnC,OACE,WAAW,MAAMH,MAAK,QAAQE,QAAO,MAAMA,QAAO,MAAM,GAAG,IAAI;AAAA,MACnE,CAAC;AAAA,IACH;AAEA,WAAOC;AAEP,aAASA,SAAQ;AAEf,UAAI,SAASP;AAEb,UAAI;AAEJ,UAAI;AAEJ,UAAI;AAEJ,UAAI,CAACC,SAAQE,IAAGC,OAAMC,QAAO,QAAQ,QAAQ,SAAS,CAAC,KAAK,MAAS,GAAG;AAEtE,iBAAS,SAASH,SAAQE,OAAM,OAAO,CAAC;AAExC,YAAI,OAAO,CAAC,MAAM,MAAM;AACtB,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI,cAAcA,SAAQA,MAAK,UAAU;AACvC,cAAM;AAAA;AAAA,UAA2CA;AAAA;AAEjD,YAAI,aAAa,YAAY,OAAO,CAAC,MAAM,MAAM;AAC/C,oBAAU,UAAU,aAAa,SAAS,SAAS,MAAM;AACzD,yBAAe,QAAQ,OAAO,YAAY;AAE1C,iBAAO,SAAS,MAAM,SAAS,aAAa,SAAS,QAAQ;AAC3D,kBAAM,QAAQ,aAAa,SAAS,MAAM;AAE1C,wBAAY,QAAQ,OAAO,QAAQ,YAAY,EAAE;AAEjD,gBAAI,UAAU,CAAC,MAAM,MAAM;AACzB,qBAAO;AAAA,YACT;AAEA,qBACE,OAAO,UAAU,CAAC,MAAM,WAAW,UAAU,CAAC,IAAI,SAAS;AAAA,UAC/D;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAUA,SAAS,SAAS,OAAO;AACvB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,CAAC,UAAU,KAAK;AAAA,EACzB;AAEA,SAAO,UAAU,QAAQ,UAAU,SAAYJ,SAAQ,CAAC,KAAK;AAC/D;;;ACvHO,SAAS,MAAM,MAAM,eAAe,kBAAkB,cAAc;AAEzE,MAAI;AAEJ,MAAIQ;AAEJ,MAAIC;AAEJ,MACE,OAAO,kBAAkB,cACzB,OAAO,qBAAqB,YAC5B;AACA,IAAAD,QAAO;AACP,IAAAC,WAAU;AACV,cAAU;AAAA,EACZ,OAAO;AAEL,IAAAD,QAAO;AAEP,IAAAC,WAAU;AACV,cAAU;AAAA,EACZ;AAEA,eAAa,MAAMD,OAAM,UAAU,OAAO;AAM1C,WAAS,SAASE,OAAM,SAAS;AAC/B,UAAM,SAAS,QAAQ,QAAQ,SAAS,CAAC;AACzC,UAAMC,SAAQ,SAAS,OAAO,SAAS,QAAQD,KAAI,IAAI;AACvD,WAAOD,SAAQC,OAAMC,QAAO,MAAM;AAAA,EACpC;AACF;;;ACrIA,IAAMC,OAAM,CAAC,EAAE;AAGf,IAAMC,gBAAe,CAAC;AAYf,SAAS,YAAY,MAAM,SAAS;AACzC,QAAM,WAAW,WAAWA;AAE5B,QAAM,iBAAiB,oBAAI,IAAI;AAE/B,QAAM,eAAe,oBAAI,IAAI;AAE7B,QAAM,iBAAiB,oBAAI,IAAI;AAI/B,QAAMC,YAAW,EAAC,GAAG,UAAiB,GAAG,SAAS,SAAQ;AAG1D,QAAM,QAAQ;AAAA,IACZ,KAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,CAAC;AAAA,IAChB,UAAAD;AAAA,IACA,KAAAE;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AAEA,QAAM,MAAM,SAAUC,OAAM;AAC1B,QAAIA,MAAK,SAAS,gBAAgBA,MAAK,SAAS,sBAAsB;AACpE,YAAMC,OAAMD,MAAK,SAAS,eAAe,iBAAiB;AAC1D,YAAM,KAAK,OAAOA,MAAK,UAAU,EAAE,YAAY;AAI/C,UAAI,CAACC,KAAI,IAAI,EAAE,GAAG;AAEhB,QAAAA,KAAI,IAAI,IAAID,KAAI;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAYP,WAASD,KAAIC,OAAM,QAAQ;AACzB,UAAM,OAAOA,MAAK;AAClB,UAAME,UAAS,MAAM,SAAS,IAAI;AAElC,QAAIP,KAAI,KAAK,MAAM,UAAU,IAAI,KAAKO,SAAQ;AAC5C,aAAOA,QAAO,OAAOF,OAAM,MAAM;AAAA,IACnC;AAEA,QAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,YAAY,SAAS,IAAI,GAAG;AACzE,UAAI,cAAcA,OAAM;AACtB,cAAM,EAAC,UAAU,GAAG,QAAO,IAAIA;AAC/B,cAAM,SAASG,aAAgB,OAAO;AAEtC,eAAO,WAAW,MAAM,IAAIH,KAAI;AAEhC,eAAO;AAAA,MACT;AAGA,aAAOG,aAAgBH,KAAI;AAAA,IAC7B;AAEA,UAAM,UAAU,MAAM,QAAQ,kBAAkB;AAEhD,WAAO,QAAQ,OAAOA,OAAM,MAAM;AAAA,EACpC;AAUA,WAASF,KAAI,QAAQ;AAEnB,UAAM,SAAS,CAAC;AAEhB,QAAI,cAAc,QAAQ;AACxB,YAAM,QAAQ,OAAO;AACrB,UAAIM,SAAQ;AACZ,aAAO,EAAEA,SAAQ,MAAM,QAAQ;AAC7B,cAAM,SAAS,MAAM,IAAI,MAAMA,MAAK,GAAG,MAAM;AAG7C,YAAI,QAAQ;AACV,cAAIA,UAAS,MAAMA,SAAQ,CAAC,EAAE,SAAS,SAAS;AAC9C,gBAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,QAAQ;AACpD,qBAAO,QAAQ,uBAAuB,OAAO,KAAK;AAAA,YACpD;AAEA,gBAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,WAAW;AACvD,oBAAM,OAAO,OAAO,SAAS,CAAC;AAE9B,kBAAI,QAAQ,KAAK,SAAS,QAAQ;AAChC,qBAAK,QAAQ,uBAAuB,KAAK,KAAK;AAAA,cAChD;AAAA,YACF;AAAA,UACF;AAEA,cAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,mBAAO,KAAK,GAAG,MAAM;AAAA,UACvB,OAAO;AACL,mBAAO,KAAK,MAAM;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAYA,SAAS,MAAM,MAAM,IAAI;AACvB,MAAI,KAAK,SAAU,IAAG,WAAW,SAAS,IAAI;AAChD;AAcA,SAAS,UAAU,MAAM,IAAI;AAE3B,MAAI,SAAS;AAGb,MAAI,QAAQ,KAAK,MAAM;AACrB,UAAM,QAAQ,KAAK,KAAK;AACxB,UAAM,YAAY,KAAK,KAAK;AAC5B,UAAM,cAAc,KAAK,KAAK;AAE9B,QAAI,OAAO,UAAU,UAAU;AAG7B,UAAI,OAAO,SAAS,WAAW;AAC7B,eAAO,UAAU;AAAA,MACnB,OAKK;AAGH,cAAM,WAAW,cAAc,SAAS,OAAO,WAAW,CAAC,MAAM;AACjE,iBAAS,EAAC,MAAM,WAAW,SAAS,OAAO,YAAY,CAAC,GAAG,SAAQ;AAAA,MACrE;AAAA,IACF;AAEA,QAAI,OAAO,SAAS,aAAa,aAAa;AAC5C,aAAO,OAAO,OAAO,YAAYD,aAAgB,WAAW,CAAC;AAAA,IAC/D;AAEA,QACE,cAAc,UACd,OAAO,YACP,cAAc,QACd,cAAc,QACd;AACA,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAYA,SAAS,sBAAsB,OAAOH,OAAM;AAC1C,QAAM,OAAOA,MAAK,QAAQ,CAAC;AAE3B,QAAM,SACJ,WAAWA,SACX,EAAEL,KAAI,KAAK,MAAM,aAAa,KAAKA,KAAI,KAAK,MAAM,WAAW,KACzD,EAAC,MAAM,QAAQ,OAAOK,MAAK,MAAK,IAChC;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,IACb,UAAU,MAAM,IAAIA,KAAI;AAAA,EAC1B;AAEN,QAAM,MAAMA,OAAM,MAAM;AACxB,SAAO,MAAM,UAAUA,OAAM,MAAM;AACrC;AAcO,SAAS,KAAK,OAAO,OAAO;AAEjC,QAAM,SAAS,CAAC;AAChB,MAAII,SAAQ;AAEZ,MAAI,OAAO;AACT,WAAO,KAAK,EAAC,MAAM,QAAQ,OAAO,KAAI,CAAC;AAAA,EACzC;AAEA,SAAO,EAAEA,SAAQ,MAAM,QAAQ;AAC7B,QAAIA,OAAO,QAAO,KAAK,EAAC,MAAM,QAAQ,OAAO,KAAI,CAAC;AAClD,WAAO,KAAK,MAAMA,MAAK,CAAC;AAAA,EAC1B;AAEA,MAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,WAAO,KAAK,EAAC,MAAM,QAAQ,OAAO,KAAI,CAAC;AAAA,EACzC;AAEA,SAAO;AACT;AAUA,SAAS,uBAAuB,OAAO;AACrC,MAAIA,SAAQ;AACZ,MAAIC,QAAO,MAAM,WAAWD,MAAK;AAEjC,SAAOC,UAAS,KAAKA,UAAS,IAAI;AAChC,IAAAD;AACA,IAAAC,QAAO,MAAM,WAAWD,MAAK;AAAA,EAC/B;AAEA,SAAO,MAAM,MAAMA,MAAK;AAC1B;;;ACjYO,SAAS,OAAO,MAAM,SAAS;AACpC,QAAM,QAAQ,YAAY,MAAM,OAAO;AACvC,QAAME,QAAO,MAAM,IAAI,MAAM,MAAS;AACtC,QAAM,OAAO,OAAO,KAAK;AAEzB,QAAM,SAAS,MAAM,QAAQA,KAAI,IAC7B,EAAC,MAAM,QAAQ,UAAUA,MAAI,IAC7BA,SAAQ,EAAC,MAAM,QAAQ,UAAU,CAAC,EAAC;AAEvC,MAAI,MAAM;AAIR,OAAO,cAAc,MAAM;AAC3B,WAAO,SAAS,KAAK,EAAC,MAAM,QAAQ,OAAO,KAAI,GAAG,IAAI;AAAA,EACxD;AAEA,SAAO;AACT;;;AC8Be,SAAR,aAA8B,aAAa,SAAS;AACzD,MAAI,eAAe,SAAS,aAAa;AAIvC,WAAO,eAAgB,MAAM,MAAM;AAEjC,YAAM;AAAA;AAAA,QACJ,OAAO,MAAM,EAAC,MAAM,GAAG,QAAO,CAAC;AAAA;AAEjC,YAAM,YAAY,IAAI,UAAU,IAAI;AAAA,IACtC;AAAA,EACF;AAKA,SAAO,SAAU,MAAM,MAAM;AAM3B;AAAA;AAAA,MACE,OAAO,MAAM,EAAC,MAAM,GAAI,eAAe,QAAQ,CAAC;AAAA;AAAA,EAEpD;AACF;;;AC3JO,SAAS,KAAK,OAAO;AAC1B,MAAI,OAAO;AACT,UAAM;AAAA,EACR;AACF;;;ACkVA,oBAAmB;;;AC7VJ,SAAR,cAA+B,OAAO;AAC5C,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAChD,WAAO;AAAA,EACR;AAEA,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,UAAQ,cAAc,QAAQ,cAAc,OAAO,aAAa,OAAO,eAAe,SAAS,MAAM,SAAS,EAAE,OAAO,eAAe,UAAU,EAAE,OAAO,YAAY;AACtK;;;ACUO,SAAS,SAAS;AAEvB,QAAM,MAAM,CAAC;AAEb,QAAM,WAAW,EAAC,KAAK,IAAG;AAE1B,SAAO;AAGP,WAAS,OAAO,QAAQ;AACtB,QAAI,kBAAkB;AAEtB,UAAM,WAAW,OAAO,IAAI;AAE5B,QAAI,OAAO,aAAa,YAAY;AAClC,YAAM,IAAI,UAAU,6CAA6C,QAAQ;AAAA,IAC3E;AAEA,SAAK,MAAM,GAAG,MAAM;AAQpB,aAAS,KAAK,UAAU,QAAQ;AAC9B,YAAM,KAAK,IAAI,EAAE,eAAe;AAChC,UAAIC,SAAQ;AAEZ,UAAI,OAAO;AACT,iBAAS,KAAK;AACd;AAAA,MACF;AAGA,aAAO,EAAEA,SAAQ,OAAO,QAAQ;AAC9B,YAAI,OAAOA,MAAK,MAAM,QAAQ,OAAOA,MAAK,MAAM,QAAW;AACzD,iBAAOA,MAAK,IAAI,OAAOA,MAAK;AAAA,QAC9B;AAAA,MACF;AAGA,eAAS;AAGT,UAAI,IAAI;AACN,QAAAC,MAAK,IAAI,IAAI,EAAE,GAAG,MAAM;AAAA,MAC1B,OAAO;AACL,iBAAS,MAAM,GAAG,MAAM;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAGA,WAAS,IAAI,YAAY;AACvB,QAAI,OAAO,eAAe,YAAY;AACpC,YAAM,IAAI;AAAA,QACR,iDAAiD;AAAA,MACnD;AAAA,IACF;AAEA,QAAI,KAAK,UAAU;AACnB,WAAO;AAAA,EACT;AACF;AAUO,SAASA,MAAK,YAAY,UAAU;AAEzC,MAAI;AAEJ,SAAO;AAQP,WAAS,WAAW,YAAY;AAC9B,UAAM,oBAAoB,WAAW,SAAS,WAAW;AAEzD,QAAI;AAEJ,QAAI,mBAAmB;AACrB,iBAAW,KAAK,IAAI;AAAA,IACtB;AAEA,QAAI;AACF,eAAS,WAAW,MAAM,MAAM,UAAU;AAAA,IAC5C,SAAS,OAAO;AACd,YAAM;AAAA;AAAA,QAAkC;AAAA;AAMxC,UAAI,qBAAqB,QAAQ;AAC/B,cAAM;AAAA,MACR;AAEA,aAAO,KAAK,SAAS;AAAA,IACvB;AAEA,QAAI,CAAC,mBAAmB;AACtB,UAAI,kBAAkB,SAAS;AAC7B,eAAO,KAAK,MAAM,IAAI;AAAA,MACxB,WAAW,kBAAkB,OAAO;AAClC,aAAK,MAAM;AAAA,MACb,OAAO;AACL,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAMA,WAAS,KAAK,UAAU,QAAQ;AAC9B,QAAI,CAAC,QAAQ;AACX,eAAS;AACT,eAAS,OAAO,GAAG,MAAM;AAAA,IAC3B;AAAA,EACF;AAOA,WAAS,KAAK,OAAO;AACnB,SAAK,MAAM,KAAK;AAAA,EAClB;AACF;;;AC/JA,uBAAiC;;;ACAjC,0BAAiC;;;ACAjC,sBAAyC;;;ACmBlC,SAAS,MAAM,eAAe;AACnC,SAAO;AAAA,IACL,kBAAkB,QAChB,OAAO,kBAAkB,YACzB,UAAU,iBACV,cAAc,QACd,cAAc,iBACd,cAAc;AAAA,IAEd,cAAc,SAAS;AAAA,EAC3B;AACF;;;ACVA,IAAM;AAAA;AAAA,EAA8B;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAEO,IAAM,QAAN,MAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBjB,YAAY,OAAO;AAEjB,QAAI;AAEJ,QAAI,CAAC,OAAO;AACV,gBAAU,CAAC;AAAA,IACb,WAAW,MAAM,KAAK,GAAG;AACvB,gBAAU,EAAC,MAAM,MAAK;AAAA,IACxB,WAAW,OAAO,UAAU,YAAY,aAAa,KAAK,GAAG;AAC3D,gBAAU,EAAC,MAAK;AAAA,IAClB,OAAO;AACL,gBAAU;AAAA,IACZ;AAWA,SAAK,MAAM,SAAS,UAAU,KAAK,4BAAQ,IAAI;AAU/C,SAAK,OAAO,CAAC;AASb,SAAK,UAAU,CAAC;AAOhB,SAAK,WAAW,CAAC;AAOjB,SAAK;AAYL,SAAK;AAUL,SAAK;AASL,SAAK;AAIL,QAAIC,SAAQ;AAEZ,WAAO,EAAEA,SAAQ,MAAM,QAAQ;AAC7B,YAAMC,SAAQ,MAAMD,MAAK;AAIzB,UACEC,UAAS,WACT,QAAQA,MAAK,MAAM,UACnB,QAAQA,MAAK,MAAM,MACnB;AAEA,aAAKA,MAAK,IAAIA,WAAU,YAAY,CAAC,GAAG,QAAQA,MAAK,CAAC,IAAI,QAAQA,MAAK;AAAA,MACzE;AAAA,IACF;AAGA,QAAI;AAGJ,SAAK,SAAS,SAAS;AAErB,UAAI,CAAC,MAAM,SAAS,KAAK,GAAG;AAE1B,aAAK,KAAK,IAAI,QAAQ,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAW;AACb,WAAO,OAAO,KAAK,SAAS,WACxB,yBAAQ,SAAS,KAAK,IAAI,IAC1B;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,IAAI,SAAS,UAAU;AACrB,mBAAe,UAAU,UAAU;AACnC,eAAW,UAAU,UAAU;AAC/B,SAAK,OAAO,yBAAQ,KAAK,KAAK,WAAW,IAAI,QAAQ;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAU;AACZ,WAAO,OAAO,KAAK,SAAS,WACxB,yBAAQ,QAAQ,KAAK,IAAI,IACzB;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,IAAI,QAAQ,SAAS;AACnB,eAAW,KAAK,UAAU,SAAS;AACnC,SAAK,OAAO,yBAAQ,KAAK,WAAW,IAAI,KAAK,QAAQ;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAU;AACZ,WAAO,OAAO,KAAK,SAAS,WACxB,yBAAQ,QAAQ,KAAK,IAAI,IACzB;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,IAAI,QAAQ,SAAS;AACnB,eAAW,SAAS,SAAS;AAC7B,eAAW,KAAK,SAAS,SAAS;AAElC,QAAI,SAAS;AACX,UAAI,QAAQ,YAAY,CAAC,MAAM,IAAc;AAC3C,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AAEA,UAAI,QAAQ,SAAS,KAAK,CAAC,GAAG;AAC5B,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AAAA,IACF;AAEA,SAAK,OAAO,yBAAQ,KAAK,KAAK,SAAS,KAAK,QAAQ,WAAW,GAAG;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,OAAO;AACT,WAAO,KAAK,QAAQ,KAAK,QAAQ,SAAS,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,IAAI,KAAKC,OAAM;AACb,QAAI,MAAMA,KAAI,GAAG;AACf,MAAAA,YAAO,+BAAUA,KAAI;AAAA,IACvB;AAEA,mBAAeA,OAAM,MAAM;AAE3B,QAAI,KAAK,SAASA,OAAM;AACtB,WAAK,QAAQ,KAAKA,KAAI;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,OAAO;AACT,WAAO,OAAO,KAAK,SAAS,WACxB,yBAAQ,SAAS,KAAK,MAAM,KAAK,OAAO,IACxC;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,IAAI,KAAK,MAAM;AACb,mBAAe,MAAM,MAAM;AAC3B,eAAW,MAAM,MAAM;AACvB,SAAK,OAAO,yBAAQ,KAAK,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,GAAG;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+DA,KAAK,eAAe,wBAAwB,QAAQ;AAElD,UAAM,UAAU,KAAK,QAAQ,eAAe,wBAAwB,MAAM;AAE1E,YAAQ,QAAQ;AAEhB,UAAM;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4DA,KAAK,eAAe,wBAAwB,QAAQ;AAElD,UAAM,UAAU,KAAK,QAAQ,eAAe,wBAAwB,MAAM;AAE1E,YAAQ,QAAQ;AAEhB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4DA,QAAQ,eAAe,wBAAwB,QAAQ;AACrD,UAAM,UAAU,IAAI;AAAA;AAAA,MAElB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,KAAK,OAAO,MAAM,QAAQ;AACzC,cAAQ,OAAO,KAAK;AAAA,IACtB;AAEA,YAAQ,QAAQ;AAEhB,SAAK,SAAS,KAAK,OAAO;AAE1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,SAAS,UAAU;AACjB,QAAI,KAAK,UAAU,QAAW;AAC5B,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,KAAK,UAAU,UAAU;AAClC,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,UAAU,IAAI,YAAY,YAAY,MAAS;AACrD,WAAO,QAAQ,OAAO,KAAK,KAAK;AAAA,EAClC;AACF;AAYA,SAAS,WAAW,MAAMC,OAAM;AAC9B,MAAI,QAAQ,KAAK,SAAS,yBAAQ,GAAG,GAAG;AACtC,UAAM,IAAI;AAAA,MACR,MAAMA,QAAO,yCAAyC,yBAAQ,MAAM;AAAA,IACtE;AAAA,EACF;AACF;AAYA,SAAS,eAAe,MAAMA,OAAM;AAClC,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,MAAMA,QAAO,mBAAmB;AAAA,EAClD;AACF;AAYA,SAAS,WAAWD,OAAMC,OAAM;AAC9B,MAAI,CAACD,OAAM;AACT,UAAM,IAAI,MAAM,cAAcC,QAAO,iCAAiC;AAAA,EACxE;AACF;AAUA,SAAS,aAAa,OAAO;AAC3B,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,gBAAgB,SAChB,gBAAgB;AAAA,EACpB;AACF;;;ACloBO,IAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYP,SAAU,UAAU;AAClB,UAAMC,QAAO;AACb,UAAM,SAASA,MAAK;AACpB,UAAM;AAAA;AAAA;AAAA;AAAA,MAGJ,OAAO;AAAA;AAET,UAAM,QAAQ,MAAM,QAAQ;AAE5B,UAAM,QAAQ,WAAY;AACxB,aAAO,MAAM,MAAM,OAAO,SAAS;AAAA,IACrC;AAEA,WAAO,eAAe,OAAO,KAAK;AAclC,WAAO;AAAA,EACT;AAAA;;;ARiUN,IAAMC,OAAM,CAAC,EAAE;AAeR,IAAM,YAAN,MAAM,mBAAkB,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAI9C,cAAc;AAEZ,UAAM,MAAM;AAeZ,SAAK,WAAW;AAYhB,SAAK,SAAS;AAad,SAAK,YAAY,CAAC;AAalB,SAAK,WAAW;AAShB,SAAK,cAAc;AASnB,SAAK,SAAS;AASd,SAAK,YAAY,CAAC;AAUlB,SAAK,SAAS;AASd,SAAK,eAAe,OAAO;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO;AAEL,UAAM;AAAA;AAAA,MAEF,IAAI,WAAU;AAAA;AAElB,QAAIC,SAAQ;AAEZ,WAAO,EAAEA,SAAQ,KAAK,UAAU,QAAQ;AACtC,YAAM,WAAW,KAAK,UAAUA,MAAK;AACrC,kBAAY,IAAI,GAAG,QAAQ;AAAA,IAC7B;AAEA,gBAAY,SAAK,cAAAC,SAAO,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC;AAEjD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6DA,KAAK,KAAK,OAAO;AACf,QAAI,OAAO,QAAQ,UAAU;AAE3B,UAAI,UAAU,WAAW,GAAG;AAC1B,uBAAe,QAAQ,KAAK,MAAM;AAClC,aAAK,UAAU,GAAG,IAAI;AACtB,eAAO;AAAA,MACT;AAGA,aAAQF,KAAI,KAAK,KAAK,WAAW,GAAG,KAAK,KAAK,UAAU,GAAG,KAAM;AAAA,IACnE;AAGA,QAAI,KAAK;AACP,qBAAe,QAAQ,KAAK,MAAM;AAClC,WAAK,YAAY;AACjB,aAAO;AAAA,IACT;AAGA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,SAAS;AACP,QAAI,KAAK,QAAQ;AACf,aAAO;AAAA,IACT;AAKA,UAAMG;AAAA;AAAA;AAAA,MAAyD;AAAA;AAE/D,WAAO,EAAE,KAAK,cAAc,KAAK,UAAU,QAAQ;AACjD,YAAM,CAAC,UAAU,GAAG,OAAO,IAAI,KAAK,UAAU,KAAK,WAAW;AAE9D,UAAI,QAAQ,CAAC,MAAM,OAAO;AACxB;AAAA,MACF;AAEA,UAAI,QAAQ,CAAC,MAAM,MAAM;AACvB,gBAAQ,CAAC,IAAI;AAAA,MACf;AAEA,YAAM,cAAc,SAAS,KAAKA,OAAM,GAAG,OAAO;AAElD,UAAI,OAAO,gBAAgB,YAAY;AACrC,aAAK,aAAa,IAAI,WAAW;AAAA,MACnC;AAAA,IACF;AAEA,SAAK,SAAS;AACd,SAAK,cAAc,OAAO;AAE1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,MAAM;AACV,SAAK,OAAO;AACZ,UAAM,WAAW,MAAM,IAAI;AAC3B,UAAM,SAAS,KAAK,UAAU,KAAK;AACnC,iBAAa,SAAS,MAAM;AAC5B,WAAO,OAAO,OAAO,QAAQ,GAAG,QAAQ;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4CA,QAAQ,MAAM,MAAM;AAClB,UAAMA,QAAO;AAEb,SAAK,OAAO;AACZ,iBAAa,WAAW,KAAK,UAAU,KAAK,MAAM;AAClD,mBAAe,WAAW,KAAK,YAAY,KAAK,QAAQ;AAExD,WAAO,OAAO,SAAS,QAAW,IAAI,IAAI,IAAI,QAAQ,QAAQ;AAQ9D,aAAS,SAAS,SAAS,QAAQ;AACjC,YAAM,WAAW,MAAM,IAAI;AAG3B,YAAM;AAAA;AAAA;AAAA,QAEsBA,MAAK,MAAM,QAAQ;AAAA;AAG/C,MAAAA,MAAK,IAAI,WAAW,UAAU,SAAU,OAAO,MAAMC,OAAM;AACzD,YAAI,SAAS,CAAC,QAAQ,CAACA,OAAM;AAC3B,iBAAO,SAAS,KAAK;AAAA,QACvB;AAIA,cAAM;AAAA;AAAA;AAAA,UAEsB;AAAA;AAG5B,cAAM,gBAAgBD,MAAK,UAAU,aAAaC,KAAI;AAEtD,YAAI,gBAAgB,aAAa,GAAG;AAClC,UAAAA,MAAK,QAAQ;AAAA,QACf,OAAO;AACL,UAAAA,MAAK,SAAS;AAAA,QAChB;AAEA;AAAA,UAAS;AAAA;AAAA,UAAsDA;AAAA,QAAK;AAAA,MACtE,CAAC;AAOD,eAAS,SAAS,OAAOA,OAAM;AAC7B,YAAI,SAAS,CAACA,OAAM;AAClB,iBAAO,KAAK;AAAA,QACd,WAAW,SAAS;AAClB,kBAAQA,KAAI;AAAA,QACd,OAAO;AACL,aAAO,MAAM,uCAAuC;AACpD,eAAK,QAAWA,KAAI;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,YAAY,MAAM;AAEhB,QAAI,WAAW;AAEf,QAAI;AAEJ,SAAK,OAAO;AACZ,iBAAa,eAAe,KAAK,UAAU,KAAK,MAAM;AACtD,mBAAe,eAAe,KAAK,YAAY,KAAK,QAAQ;AAE5D,SAAK,QAAQ,MAAM,QAAQ;AAC3B,eAAW,eAAe,WAAW,QAAQ;AAC7C,OAAO,QAAQ,6CAA6C;AAE5D,WAAO;AAKP,aAAS,SAAS,OAAOA,OAAM;AAC7B,iBAAW;AACX,WAAK,KAAK;AACV,eAASA;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwCA,IAAI,MAAM,MAAM,MAAM;AACpB,eAAW,IAAI;AACf,SAAK,OAAO;AAEZ,UAAM,eAAe,KAAK;AAE1B,QAAI,CAAC,QAAQ,OAAO,SAAS,YAAY;AACvC,aAAO;AACP,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,SAAS,QAAW,IAAI,IAAI,IAAI,QAAQ,QAAQ;AAW9D,aAAS,SAAS,SAAS,QAAQ;AACjC;AAAA,QACE,OAAO,SAAS;AAAA,QAChB;AAAA,MACF;AACA,YAAM,WAAW,MAAM,IAAI;AAC3B,mBAAa,IAAI,MAAM,UAAU,QAAQ;AAQzC,eAAS,SAAS,OAAO,YAAYA,OAAM;AACzC,cAAM;AAAA;AAAA,UAEF,cAAc;AAAA;AAGlB,YAAI,OAAO;AACT,iBAAO,KAAK;AAAA,QACd,WAAW,SAAS;AAClB,kBAAQ,aAAa;AAAA,QACvB,OAAO;AACL,aAAO,MAAM,uCAAuC;AACpD,eAAK,QAAW,eAAeA,KAAI;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,QAAQ,MAAM,MAAM;AAElB,QAAI,WAAW;AAEf,QAAI;AAEJ,SAAK,IAAI,MAAM,MAAM,QAAQ;AAE7B,eAAW,WAAW,OAAO,QAAQ;AACrC,OAAO,QAAQ,6CAA6C;AAC5D,WAAO;AAKP,aAAS,SAAS,OAAOC,OAAM;AAC7B,WAAK,KAAK;AACV,eAASA;AACT,iBAAW;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BA,UAAU,MAAM,MAAM;AACpB,SAAK,OAAO;AACZ,UAAM,WAAW,MAAM,IAAI;AAC3B,UAAMC,YAAW,KAAK,YAAY,KAAK;AACvC,mBAAe,aAAaA,SAAQ;AACpC,eAAW,IAAI;AAEf,WAAOA,UAAS,MAAM,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2DA,IAAI,UAAU,YAAY;AACxB,UAAM,YAAY,KAAK;AACvB,UAAM,YAAY,KAAK;AAEvB,mBAAe,OAAO,KAAK,MAAM;AAEjC,QAAI,UAAU,QAAQ,UAAU,QAAW;AAAA,IAE3C,WAAW,OAAO,UAAU,YAAY;AACtC,gBAAU,OAAO,UAAU;AAAA,IAC7B,WAAW,OAAO,UAAU,UAAU;AACpC,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,gBAAQ,KAAK;AAAA,MACf,OAAO;AACL,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF,OAAO;AACL,YAAM,IAAI,UAAU,iCAAiC,QAAQ,GAAG;AAAA,IAClE;AAEA,WAAO;AAMP,aAAS,IAAIC,QAAO;AAClB,UAAI,OAAOA,WAAU,YAAY;AAC/B,kBAAUA,QAAO,CAAC,CAAC;AAAA,MACrB,WAAW,OAAOA,WAAU,UAAU;AACpC,YAAI,MAAM,QAAQA,MAAK,GAAG;AACxB,gBAAM,CAAC,QAAQ,GAAGC,WAAU;AAAA;AAAA,YACkBD;AAAA;AAC9C,oBAAU,QAAQC,WAAU;AAAA,QAC9B,OAAO;AACL,oBAAUD,MAAK;AAAA,QACjB;AAAA,MACF,OAAO;AACL,cAAM,IAAI,UAAU,iCAAiCA,SAAQ,GAAG;AAAA,MAClE;AAAA,IACF;AAMA,aAAS,UAAU,QAAQ;AACzB,UAAI,EAAE,aAAa,WAAW,EAAE,cAAc,SAAS;AACrD,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,OAAO,OAAO;AAEtB,UAAI,OAAO,UAAU;AACnB,kBAAU,eAAW,cAAAL,SAAO,MAAM,UAAU,UAAU,OAAO,QAAQ;AAAA,MACvE;AAAA,IACF;AAMA,aAAS,QAAQ,SAAS;AACxB,UAAID,SAAQ;AAEZ,UAAI,YAAY,QAAQ,YAAY,QAAW;AAAA,MAE/C,WAAW,MAAM,QAAQ,OAAO,GAAG;AACjC,eAAO,EAAEA,SAAQ,QAAQ,QAAQ;AAC/B,gBAAM,QAAQ,QAAQA,MAAK;AAC3B,cAAI,KAAK;AAAA,QACX;AAAA,MACF,OAAO;AACL,cAAM,IAAI,UAAU,sCAAsC,UAAU,GAAG;AAAA,MACzE;AAAA,IACF;AAOA,aAAS,UAAU,QAAQO,aAAY;AACrC,UAAIP,SAAQ;AACZ,UAAI,aAAa;AAEjB,aAAO,EAAEA,SAAQ,UAAU,QAAQ;AACjC,YAAI,UAAUA,MAAK,EAAE,CAAC,MAAM,QAAQ;AAClC,uBAAaA;AACb;AAAA,QACF;AAAA,MACF;AAEA,UAAI,eAAe,IAAI;AACrB,kBAAU,KAAK,CAAC,QAAQ,GAAGO,WAAU,CAAC;AAAA,MACxC,WAGSA,YAAW,SAAS,GAAG;AAC9B,YAAI,CAAC,SAAS,GAAG,IAAI,IAAIA;AACzB,cAAM,iBAAiB,UAAU,UAAU,EAAE,CAAC;AAC9C,YAAI,cAAW,cAAc,KAAK,cAAW,OAAO,GAAG;AACrD,wBAAU,cAAAN,SAAO,MAAM,gBAAgB,OAAO;AAAA,QAChD;AAEA,kBAAU,UAAU,IAAI,CAAC,QAAQ,SAAS,GAAG,IAAI;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AACF;AA8BO,IAAM,UAAU,IAAI,UAAU,EAAE,OAAO;AAS9C,SAAS,aAAaO,OAAM,OAAO;AACjC,MAAI,OAAO,UAAU,YAAY;AAC/B,UAAM,IAAI,UAAU,aAAaA,QAAO,oBAAoB;AAAA,EAC9D;AACF;AASA,SAAS,eAAeA,OAAM,OAAO;AACnC,MAAI,OAAO,UAAU,YAAY;AAC/B,UAAM,IAAI,UAAU,aAAaA,QAAO,sBAAsB;AAAA,EAChE;AACF;AASA,SAAS,eAAeA,OAAM,QAAQ;AACpC,MAAI,QAAQ;AACV,UAAM,IAAI;AAAA,MACR,kBACEA,QACA;AAAA,IACJ;AAAA,EACF;AACF;AAQA,SAAS,WAAWC,OAAM;AAGxB,MAAI,CAAC,cAAWA,KAAI,KAAK,OAAOA,MAAK,SAAS,UAAU;AACtD,UAAM,IAAI,UAAU,yBAAyBA,QAAO,GAAG;AAAA,EAEzD;AACF;AAUA,SAAS,WAAWD,OAAM,WAAW,UAAU;AAC7C,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,MAAMA,QAAO,4BAA4B,YAAY;AAAA,IACvD;AAAA,EACF;AACF;AAMA,SAAS,MAAM,OAAO;AACpB,SAAO,gBAAgB,KAAK,IAAI,QAAQ,IAAI,MAAM,KAAK;AACzD;AAMA,SAAS,gBAAgB,OAAO;AAC9B,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,aAAa,SACb,cAAc;AAAA,EAClB;AACF;AAMA,SAAS,gBAAgB,OAAO;AAC9B,SAAO,OAAO,UAAU,YAAYE,cAAa,KAAK;AACxD;AAUA,SAASA,cAAa,OAAO;AAC3B,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,gBAAgB,SAChB,gBAAgB;AAAA,EACpB;AACF;;;A7FnsCA,IAAM,YACJ;AAGF,IAAM,eAAe,CAAC;AAEtB,IAAM,2BAA2B,EAAC,oBAAoB,KAAI;AAC1D,IAAM,eAAe;AAIrB,IAAM,eAAe;AAAA,EACnB,EAAC,MAAM,cAAc,IAAI,uCAAsC;AAAA,EAC/D,EAAC,MAAM,sBAAsB,IAAI,uCAAsC;AAAA,EACvE;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,EAAC,MAAM,cAAc,IAAI,uCAAsC;AAAA,EAC/D,EAAC,MAAM,uBAAuB,IAAI,8BAA6B;AAAA,EAC/D;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,EACN;AAAA,EACA,EAAC,MAAM,cAAc,IAAI,oBAAmB;AAAA,EAC5C,EAAC,MAAM,WAAW,IAAI,mCAAmC,IAAI,gBAAe;AAAA,EAC5E,EAAC,MAAM,gBAAgB,IAAI,uBAAsB;AAAA,EACjD,EAAC,MAAM,aAAa,IAAI,kCAAkC,IAAI,aAAY;AAAA,EAC1E,EAAC,MAAM,UAAU,IAAI,6BAA6B,IAAI,WAAU;AAAA,EAChE,EAAC,MAAM,aAAa,IAAI,oBAAmB;AAAA,EAC3C,EAAC,MAAM,qBAAqB,IAAI,qBAAqB,IAAI,eAAc;AAAA,EACvE,EAAC,MAAM,oBAAoB,IAAI,qBAAqB,IAAI,eAAc;AACxE;AAUO,SAAS,SAAS,SAAS;AAChC,QAAM,kBAAkB,QAAQ;AAChC,QAAM,eAAe,QAAQ;AAC7B,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,YAAY,QAAQ;AAC1B,QAAM,aAAa,QAAQ;AAC3B,QAAM,qBAAqB,QAAQ;AACnC,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAMC,iBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,sBAAsB,QAAQ,sBAChC,EAAC,GAAG,QAAQ,qBAAqB,GAAG,yBAAwB,IAC5D;AACJ,QAAM,WAAW,QAAQ;AACzB,QAAM,mBAAmB,QAAQ;AACjC,QAAMC,gBAAe,QAAQ,gBAAgB;AAE7C,QAAM,YAAY,QAAQ,EACvB,IAAI,WAAW,EACf,IAAID,cAAa,EACjB,IAAI,cAAc,mBAAmB,EACrC,IAAI,aAAa;AAEpB,QAAM,OAAO,IAAI,MAAM;AAEvB,MAAI,OAAO,aAAa,UAAU;AAChC,SAAK,QAAQ;AAAA,EACf,OAAO;AACL;AAAA,MACE,uBACE,WACA;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,mBAAmB,oBAAoB;AACzC;AAAA,MACE;AAAA,IACF;AAAA,EACF;AAEA,aAAW,eAAe,cAAc;AACtC,QAAI,OAAO,OAAO,SAAS,YAAY,IAAI,GAAG;AAC5C;AAAA,QACE,iBACE,YAAY,OACZ,cACC,YAAY,KACT,UAAU,YAAY,KAAK,cAC3B,eACJ,YACA,YACA,MACA,YAAY,KACZ;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,UAAU,MAAM,IAAI;AAEtC,MAAI,WAAW,UAAU,QAAQ,WAAW,IAAI;AAGhD,MAAI,WAAW;AACb,eAAW;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,MACT,YAAY,EAAC,UAAS;AAAA;AAAA,MAEtB;AAAA;AAAA,QACE,SAAS,SAAS,SAAS,SAAS,WAAW,CAAC,QAAQ;AAAA;AAAA,IAE5D;AAAA,EACF;AAEA,QAAM,UAAUE,UAAS;AAEzB,SAAO,aAAa,UAAU;AAAA,IAC5B;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,IACA,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,EACZ,CAAC;AAGD,WAASA,WAAUC,OAAMC,QAAO,QAAQ;AACtC,QAAID,MAAK,SAAS,SAAS,UAAU,OAAOC,WAAU,UAAU;AAC9D,UAAI,UAAU;AACZ,eAAO,SAAS,OAAOA,QAAO,CAAC;AAAA,MACjC,OAAO;AACL,eAAO,SAASA,MAAK,IAAI,EAAC,MAAM,QAAQ,OAAOD,MAAK,MAAK;AAAA,MAC3D;AAEA,aAAOC;AAAA,IACT;AAEA,QAAID,MAAK,SAAS,WAAW;AAE3B,UAAI;AAEJ,WAAK,OAAO,eAAe;AACzB,YACE,OAAO,OAAO,eAAe,GAAG,KAChC,OAAO,OAAOA,MAAK,YAAY,GAAG,GAClC;AACA,gBAAM,QAAQA,MAAK,WAAW,GAAG;AACjC,gBAAME,QAAO,cAAc,GAAG;AAC9B,cAAIA,UAAS,QAAQA,MAAK,SAASF,MAAK,OAAO,GAAG;AAChD,YAAAA,MAAK,WAAW,GAAG,IAAIF,cAAa,OAAO,SAAS,EAAE,GAAG,KAAKE,KAAI;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAIA,MAAK,SAAS,WAAW;AAC3B,UAAI,SAAS,kBACT,CAAC,gBAAgB,SAASA,MAAK,OAAO,IACtC,qBACE,mBAAmB,SAASA,MAAK,OAAO,IACxC;AAEN,UAAI,CAAC,UAAU,gBAAgB,OAAOC,WAAU,UAAU;AACxD,iBAAS,CAAC,aAAaD,OAAMC,QAAO,MAAM;AAAA,MAC5C;AAEA,UAAI,UAAU,UAAU,OAAOA,WAAU,UAAU;AACjD,YAAI,oBAAoBD,MAAK,UAAU;AACrC,iBAAO,SAAS,OAAOC,QAAO,GAAG,GAAGD,MAAK,QAAQ;AAAA,QACnD,OAAO;AACL,iBAAO,SAAS,OAAOC,QAAO,CAAC;AAAA,QACjC;AAEA,eAAOA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAWO,SAAS,oBAAoB,OAAO;AAIzC,QAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,QAAM,eAAe,MAAM,QAAQ,GAAG;AACtC,QAAM,aAAa,MAAM,QAAQ,GAAG;AACpC,QAAM,QAAQ,MAAM,QAAQ,GAAG;AAE/B;AAAA;AAAA,IAEE,UAAU;AAAA,IAET,UAAU,MAAM,QAAQ,SACxB,iBAAiB,MAAM,QAAQ,gBAC/B,eAAe,MAAM,QAAQ;AAAA,IAE9B,aAAa,KAAK,MAAM,MAAM,GAAG,KAAK,CAAC;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AsG5UA,IAAAE,kBAA4C;;;ACA5C,IAAAC,iBAAoC;AA2B7B,IAAM,oBAAoB,CAC/B,aACyB;AACzB,QAAM,UAAM,uBAAO,QAAQ;AAC3B,MAAI,UAAU;AAEd,aAAO,4BAAkC,IAAI,SAAS,IAAI,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC;AAChF;;;ACnBO,IAAM,sBAAsB;AAAA;AAG5B,SAAS,iBAAiB,SAAiD;AAChF,QAAM,EAAE,eAAe,cAAc,IAAI,wBAAwB,kBAAkB;AACnF,QAAM,EAAE,QAAQ,IAAI,uBAAuB,kBAAkB;AAE7D,SAAO,kBAAkB,OAAO,YAAY,OAAO,UAAU;AAC3D,QAAI,MAAO,OAAM,eAAe;AAEhC,QAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,SAAS;AAC5D,cAAQ,KAAK,mBAAmB;AAChC;AAAA,IACF;AAEA,UAAM,YAAY,QAAQ;AAC1B,QAAI,WAAqB,CAAC;AAG1B,QAAI,OAAO,eAAe,UAAU;AAClC,eAAS,UAAU,IAAI;AAAA,IACzB,OAAO;AACL,iBAAW,EAAE,GAAG,WAAW;AAAA,IAC7B;AAEA,QAAI,WAAW;AACb,YAAM,OAAO,MAAM,QAAQ,WAAW,WAAW,QAAQ;AAEzD,UAAI,MAAM,SAAS;AACjB,sBAAc,KAAK,OAAO;AAAA,MAC5B,OAAO;AACL,sBAAc,OAAO;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AClDA,gCAAsB;AACtB,yBAAuB;AAwBhB,IAAM,wBAAwB,CACnC,MACA,SACG;AACH,MAAI,CAAC,QAAQ,OAAO,SAAS,WAAY,QAAO;AAIhD,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,WAAO,CAAC,IAAI;AAAA,EACd;AAEA,QAAM,cAAc,KAAK,GAAG,IAAI;AAEhC,MAAI,OAAO,gBAAgB,SAAU,QAAO;AAE5C,SAAO;AACT;AAKO,IAAM,cAAc,CAAC,SAAuB,UAAmB;AACpE,MAAI,CAAC,SAAS,CAAC,QAAS,QAAO;AAE/B,QAAM,YAAY,MAAM,OAAO,CAAC,OAAO,GAAG,OAAO,OAAO,QAAQ,MAAM,EAAE;AACxE,SAAO,CAAC,CAAC,UAAU;AACrB;AAEO,IAAM,2BAA2B;AAAA,EACtC,aAAa;AACf;AAEO,IAAM,kBAAkB;AAAA,EAC7B,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,cAAc;AAChB;AAOO,IAAM,wBAAwC;AAAA,EACnD,UAAU;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACF;AAcO,IAAM,oBAAoB,CAC/B,SACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACA,kBACwB;AACxB,QAAM,gCAAqD,CAAC;AAC5D,MAAI,iBAAsC,CAAC;AAE3C,MAAI,WAAW,OAAO,YAAY,WAAW;AAE3C,qBAAiB,OAAO,KAAK,eAAe;AAAA,EAC9C,WAAW,WAAW,QAAQ,SAAS,GAAG;AACxC,qBAAiB,CAAC,GAAG,OAAO;AAAA,EAC9B,OAAO;AACL,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,aAAa,eAAe,QAAQ,gBAAgB,MAAM,IAAI,IAAI;AACpE,kCAA8B,KAAK,gBAAgB,MAAM;AAAA,EAC3D;AAEA,MAAI,aAAa,eAAe,QAAQ,yBAAyB,WAAW,IAAI,IAAI;AAClF,kCAA8B,KAAK,yBAAyB,WAAW;AAAA,EACzE;AAEA,MAAI,WAAW,eAAe,QAAQ,gBAAgB,IAAI,IAAI,IAAI;AAChE,kCAA8B,KAAK,gBAAgB,IAAI;AAAA,EACzD;AAEA,MAAI,WAAW,eAAe,QAAQ,gBAAgB,IAAI,IAAI,IAAI;AAChE,kCAA8B,KAAK,gBAAgB,IAAI;AAAA,EACzD;AAEA,MAAI,iBAAiB,eAAe,QAAQ,gBAAgB,UAAU,IAAI,IAAI;AAC5E,kCAA8B,KAAK,gBAAgB,UAAU;AAAA,EAC/D;AAEA,MAAI,WAAW,eAAe,QAAQ,gBAAgB,IAAI,IAAI,IAAI;AAChE,kCAA8B,KAAK,gBAAgB,IAAI;AAAA,EACzD;AAEA,MAAI,UAAU,eAAe,QAAQ,gBAAgB,GAAG,IAAI,IAAI;AAC9D,kCAA8B,KAAK,gBAAgB,GAAG;AAAA,EACxD;AAEA,MAAI,YAAY,eAAe,QAAQ,gBAAgB,KAAK,IAAI,IAAI;AAClE,kCAA8B,KAAK,gBAAgB,KAAK;AAAA,EAC1D;AAEA,MAAI,YAAY,eAAe,QAAQ,gBAAgB,KAAK,IAAI,IAAI;AAClE,kCAA8B,KAAK,gBAAgB,KAAK;AAAA,EAC1D;AAEA,MACE,gBAAgB,wBAAwB,KACxC,eAAe,QAAQ,gBAAgB,QAAQ,IAAI,IACnD;AACA,kCAA8B,KAAK,gBAAgB,QAAQ;AAAA,EAC7D;AAEA,MAAI,YAAY,eAAe,QAAQ,gBAAgB,KAAK,IAAI,IAAI;AAClE,kCAA8B,KAAK,gBAAgB,KAAK;AAAA,EAC1D;AAEA,MACE,gBAAgB,wBAAwB,KACxC,eAAe,QAAQ,gBAAgB,YAAY,IAAI,IACvD;AACA,kCAA8B,KAAK,gBAAgB,YAAY;AAAA,EACjE;AAEA,SAAO;AACT;AAEO,IAAM,gCAAgC;AAAA,EAC3C,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAClB;AAKO,IAAM,wBAAwB,CACnC,SACA,aACG,2BAA2B,EAAE,UAAU,gBAAgB,QAAQ,CAAC;AAE9D,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA,0BAAAC;AAAA,EACA;AAAA,EACA;AACF,MAKM;AACJ,MACE,OAAOA,8BAA6B,eACpC,OAAO,yBAAyB;AAEhC,WAAO;AAET,MAAI,CAAC,eAAe,OAAQ,QAAO;AAEnC,MACE,YACA,eAAe,OAAO,CAAC,WAAW,CAAC,8BAA8B,SAAS,MAAM,CAAC,EAC9E,WAAW,GACd;AACA,WAAO;AAAA,EACT;AAEA,MACE,eAAe,WAAW,MACzB,eAAe,SAAS,gBAAgB,KAAK,KAC5C,eAAe,SAAS,gBAAgB,KAAK,IAC/C;AACA,WAAO;AAAA,EACT;AAEA,MACE,eAAe,WAAW,KAC1B,eAAe,SAAS,gBAAgB,KAAK,KAC7C,eAAe,SAAS,gBAAgB,KAAK,GAC7C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,aAA2B,aAAoC;AACvF,QAAM,uBAAuB,CAC3BC,cACAC,iBAEAD,aAAY,eAAeC,aAAY,cACvCD,aAAY,kBAAkB,WAAWC,aAAY,kBAAkB,UACvED,aAAY,eAAe,WAAWC,aAAY,eAAe,UACjED,aAAY,WAAWC,aAAY,UACnCD,aAAY,gBAAgBC,aAAY,eACxCD,aAAY,WAAWC,aAAY,UACnCD,aAAY,SAASC,aAAY,QACjCD,aAAY,SAASC,aAAY,QACjCD,aAAY,eAAeC,aAAY,cACvCD,aAAY,MAAM,eAAeC,aAAY,MAAM;AAErD,SACE,qBAAqB,aAAa,WAAW,KAC7C,QAAQ,YAAY,cAAc,MAAM,QAAQ,YAAY,cAAc,MACxE,CAAC,YAAY,kBAAkB,CAAC,YAAY,kBAC5C;AAAA,IACE,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAEN;AAEO,IAAM,uBAAuB,CAClC,WAIA,cAIG;AACH,QAAM,EAAE,SAAS,aAAa,SAAS,cAAc,IAAI;AACzD,QAAM,EAAE,SAAS,aAAa,SAAS,cAAc,IAAI;AAEzD,MAAI,kBAAkB,cAAe,QAAO;AAC5C,MAAI,UAAU,eAAe,UAAU,WAAY,QAAO;AAE1D,MAAI,UAAU,0BAA0B,UAAU,uBAAuB;AACvE,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,iCAAiC,UAAU,8BAA8B;AACrF,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,iBAAiB,aAAa,WAAW;AAClE,MAAI,CAAC,iBAAkB,QAAO;AAE9B,QAAM,qBACJ,0BAAAC,SAAU,UAAU,gBAAgB,UAAU,cAAc,SAC5D,0BAAAA,SAAU,UAAU,QAAQ,UAAU,MAAM,SAC5C,0BAAAA,SAAU,UAAU,aAAa,UAAU,WAAW,SACtD,0BAAAA,SAAU,UAAU,aAAa,UAAU,WAAW,SACtD,0BAAAA,SAAU,UAAU,aAAa,UAAU,WAAW;AAAA,MACtD,0BAAAA,SAAU,UAAU,OAAO,UAAU,KAAK,SAC1C,0BAAAA,SAAU,UAAU,gBAAgB,UAAU,cAAc;AAE9D,MAAI,CAAC,eAAgB,QAAO;AAE5B,SACE,UAAU,oBAAoB,UAAU;AAE5C;AAEO,IAAM,yBAAyB,CACpC,WAGA,cAGG;AACH,QAAM,EAAE,gBAAgB,oBAAoB,SAAS,YAAY,IAAI;AACrE,QAAM,EAAE,gBAAgB,oBAAoB,SAAS,YAAY,IAAI;AAErE,MAAI,UAAU,YAAY,UAAU,QAAS,QAAO;AACpD,MAAI,UAAU,gBAAgB,UAAU,YAAa,QAAO;AAC5D,MAAI,UAAU,eAAe,UAAU,WAAY,QAAO;AAC1D,MAAI,UAAU,OAAO,WAAW,UAAU,OAAO,OAAQ,QAAO;AAChE,MAAI,UAAU,QAAQ,WAAW,UAAU,QAAQ,OAAQ,QAAO;AAClE,MAAI,UAAU,aAAa,WAAW,UAAU,aAAa,OAAQ,QAAO;AAC5E,MAAI,UAAU,gBAAgB,UAAU,YAAa,QAAO;AAE5D,MAAI,UAAU,0BAA0B,UAAU,uBAAuB;AACvE,WAAO;AAAA,EACT;AAEA,OACG,YAAY,OAAO,sBAAsB,YAAY,OAAO,uBAC7D,uBAAuB,oBACvB;AACA,WAAO;AAAA,EACT;AAEA,SAAO,iBAAiB,aAAa,WAAW;AAClD;AAEO,IAAM,sBAAsB,CAAC,YAClC,OAAO,OAAO,SAAS,mBAAmB,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,MAAM,QAAQ,CAAC;AAEtE,IAAM,wBAAwB,CAAC,YACpC,CAAC,CAAC,SAAS,eAAe,CAAC,CAAC,QAAQ,YAAY;AAE3C,IAAM,YAAY,CAAC,YAA8B;AACtD,MAAI,CAAC,SAAS,aAAa;AACzB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,QAAQ,YAAY,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO;AACnE;AAEO,IAAM,yBAAyB,CAAC,YAA8B;AACnE,MAAI,CAAC,SAAS,aAAa;AACzB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,QAAQ,YAAY,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO;AACnE;AAWO,IAAM,oBAA2C,CAAC,SAAS,KAAK,QAAQ,KAAK;AAE7E,IAAM,uBAAuB,CAClC,OACA,GACA,QACA,0BACG;AACH,MAAI,SAAS;AAEb,MAAI,CAAC,GAAG;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,uBAAuB;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,MAChB,OAAO,CAAC,SAAS,QAAQ,QAAQ,QAAQ,KAAK,OAAO,OAAO,KAAK,EAAE,EACnE,IAAI,qBAAqB;AAE5B,QAAM,YAAY,WAAW,MAAM,GAAG,CAAC;AACvC,QAAM,aAAa,WAAW,SAAS,UAAU;AAEjD,MAAI,UAAU,WAAW,GAAG;AAC1B,aAAS,GAAG,UAAU,CAAC,CAAC;AAAA,EAC1B,WAAW,UAAU,WAAW,GAAG;AAGjC,aAAS,EAAE,wCAAwC;AAAA,MACjD,WAAW,UAAU,CAAC;AAAA,MACtB,YAAY,UAAU,CAAC;AAAA,IACzB,CAAC;AAAA,EACH,WAAW,UAAU,SAAS,GAAG;AAG/B,QAAI,eAAe,GAAG;AAEpB,YAAM,WAAW,UAAU,OAAO,UAAU,SAAS,GAAG,CAAC;AACzD,eAAS,EAAE,iDAAiD;AAAA,QAC1D,qBAAqB,UAAU,KAAK,IAAI;AAAA,QACxC;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,eAAS,EAAE,sDAAsD;AAAA,QAC/D,qBAAqB,UAAU,KAAK,IAAI;AAAA,QACxC,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,eAAe,CAACC,UAAkB;AAC7C,MAAI,CAACA,MAAM,QAAO;AAElB,QAAM,WAAWA,MAAK,YAAQ,mBAAAC,SAAW,GAAG,EAAE;AAC9C,QAAM,UAAU,SAAS,QAAQ,YAAY,EAAE;AAE/C,SAAO,CAAC;AACV;AAEO,IAAM,mBAAmB,CAC9B,YAEA,QAAQ,SAAS,YAChB,QAAQ,oBAAoB,WAAW,oCACtC,QAAQ,YAAY,WAAW;AAE5B,IAAM,mBAAmB,CAC9B,YAEA,QAAQ,SAAS,YAChB,QAAQ,oBAAoB,WAAW,oCACtC,QAAQ,YAAY,WAAW;AAE5B,IAAM,kBAAkB,CAAC,YAC9B,CAAC,CAAC,QAAQ;;;AC5eL,IAAM,mBAAmB,CAC9B,SACA,gBAA4C,CAAC,MACvB;AACtB,QAAM,EAAE,sBAAsB,OAAO,IAAI;AAEzC,QAAM,EAAE,eAAe,cAAc,IAAI,wBAAwB,kBAAkB;AACnF,QAAM,EAAE,OAAO,IAAI,eAAe,kBAAkB;AACpD,QAAM,EAAE,EAAE,IAAI,sBAAsB,kBAAkB;AAEtD,SAAO,OAAO,OAAO,YAAmC;AACtD,UAAM,eAAe;AACrB,QAAI,CAAC,SAAS,MAAM,CAAC,UAAU,CAAC,eAAe;AAC7C;AAAA,IACF;AAEA,QAAI;AACF,YAAM,iBAAiB,MAAM,cAAc,SAAS,OAAO;AAC3D,oBAAc,cAAc;AAAA,IAC9B,SAAS,GAAG;AACV,YAAM,eACJ,wBAAwB,sBAAsB,sBAAsB,CAAC,OAAO,CAAC;AAE/E,UAAI,OAAQ,QAAO,gBAAgB,EAAE,wBAAwB,GAAG,OAAO;AAAA,IACzE;AAAA,EACF;AACF;;;ACxCA,IAAAC,iBAAyB;AAUlB,IAAM,iBAAiB,CAC5B,qBAAqB,OACrB,kBACA,8BAC0B;AAC1B,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,kBAAkB;AAEzD,QAAM,UACJ,qBACC,CAAC,UAAU;AACV,QAAI,OAAO,gBAAgB;AACzB,YAAM,eAAe;AAAA,IACvB;AACA,eAAW,IAAI;AAAA,EACjB;AAEF,QAAM,YACJ,8BACC,CAAC,UAAU;AACV,QAAI,OAAO,gBAAgB;AACzB,YAAM,eAAe;AAAA,IACvB;AACA,eAAW,KAAK;AAAA,EAClB;AAEF,SAAO,EAAE,WAAW,SAAS,QAAQ;AACvC;;;AC5BO,IAAM,wCACX;AAQK,IAAM,iBAAiB,CAC5B,SACA,gBAA0C,CAAC,MACrB;AACtB,QAAM,EAAE,OAAO,IAAI,eAAe,gBAAgB;AAClD,QAAM,EAAE,EAAE,IAAI,sBAAsB,gBAAgB;AAEpD,SAAO,OAAO,UAAU;AACtB,UAAM,eAAe;AAErB,UAAM,EAAE,sBAAsB,wBAAwB,OAAO,IAAI;AAEjE,QAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,IAAI;AAC5C,cAAQ,KAAK,qCAAqC;AAClD;AAAA,IACF;AAEA,QAAI,OAAO,MAAM,QAAQ;AACvB,aAAO,OAAO,EAAE,mBAAmB,GAAG,OAAO;AAAA,IAC/C;AAEA,QAAI;AACF,YAAM,OAAO,YAAY,QAAQ,EAAE;AAEnC,YAAM,iBACJ,0BACA,sBAAsB,wBAAwB,CAAC,OAAO,CAAC;AAEzD,aAAO,kBAAkB,EAAE,uCAAuC,GAAG,SAAS;AAAA,IAChF,SAAS,GAAG;AACV,YAAM,eACJ,wBAAwB,sBAAsB,sBAAsB,CAAC,OAAO,CAAC;AAE/E,aAAO,gBAAgB,EAAE,mBAAmB,GAAG,OAAO;AAAA,IACxD;AAAA,EACF;AACF;;;ACpCA,SAAS,mBACP,IACA,SACmB;AACnB,SAAO,CAAC,UAAU;AAChB,QAAI,OAAO,OAAO,cAAc,CAAC,SAAS,iBAAiB,QAAQ;AACjE;AAAA,IACF;AACA,OAAG,OAAO,QAAQ,eAAe;AAAA,EACnC;AACF;AAEO,IAAM,qBAAqB,CAChC,SACA,yBAIG;AACH,QAAM;AAAA,IACJ,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB,IAAI,wBAAwB,oBAAoB;AAEhD,QAAM,kBACJ,sBAAsB,mBAAmB,2BAA2B,MAAM;AAE5E,QAAM,kBACJ,sBAAsB,mBAAmB,2BAA2B,MAAM;AAE5E,SAAO;AAAA,IACL,iBAAiB,mBAAmB,iBAAiB,OAAO;AAAA,IAC5D,iBAAiB,mBAAmB,iBAAiB,OAAO;AAAA,EAC9D;AACF;;;ACvCO,IAAM,uBAAuB,CAClC,SACA,gBAAgD,CAAC,MAC3B;AACtB,QAAM,EAAE,sBAAsB,wBAAwB,OAAO,IAAI;AAEjE,QAAM,EAAE,QAAQ,IAAI,uBAAuB,sBAAsB;AACjE,QAAM,EAAE,EAAE,IAAI,sBAAsB,sBAAsB;AAE1D,SAAO,OAAO,UAAU;AACtB,UAAM,eAAe;AACrB,QAAI,CAAC,SAAS,IAAI;AAChB,cAAQ,KAAK,wDAAwD;AACrE;AAAA,IACF;AAEA,QAAI;AACF,YAAM,QAAQ,WAAW,EAAE,YAAY,QAAQ,GAAG,CAAC;AACnD,UAAI,CAAC,OAAQ;AACb,YAAM,iBACJ,0BACA,sBAAsB,wBAAwB,CAAC,OAAO,CAAC;AACzD,UAAI,eAAgB,QAAO,gBAAgB,SAAS;AAAA,IACtD,SAAS,GAAG;AACV,UAAI,CAAC,OAAQ;AACb,YAAM,eACJ,wBAAwB,sBAAsB,sBAAsB,CAAC,OAAO,CAAC;AAC/E,UAAI,wBAAwB,CAAC,aAAc;AAC3C;AAAA,QACE,gBACE;AAAA,UACE;AAAA,QACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACvCO,IAAM,qCACX;AAQK,IAAM,iBAAiB,CAC5B,SACA,gBAAuC,CAAC,MAClB;AACtB,QAAM,EAAE,MAAM,IAAI,uBAAuB,gBAAgB;AACzD,QAAM,EAAE,OAAO,IAAI,eAAe,gBAAgB;AAClD,QAAM,EAAE,EAAE,IAAI,sBAAsB,gBAAgB;AAEpD,SAAO,OAAO,UAAU;AACtB,UAAM,eAAe;AAErB,UAAM,EAAE,sBAAsB,wBAAwB,OAAO,IAAI;AAEjE,QAAI,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,UAAU,CAAC,QAAQ;AAC9C,cAAQ,KAAK,kCAAkC;AAC/C;AAAA,IACF;AAEA,QAAI,CAAC,YAAY,SAAS,KAAK,GAAG;AAChC,UAAI;AACF,cAAM,OAAO,SAAS,QAAQ,KAAK,EAAE;AAErC,cAAM,iBACJ,0BACA,sBAAsB,wBAAwB,CAAC,QAAQ,IAAI,CAAC;AAE9D;AAAA,UACE,kBACE,EAAE,6BAA6B;AAAA,YAC7B,MAAM,QAAQ,KAAK,QAAQ,QAAQ,KAAK;AAAA,UAC1C,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AACV,cAAM,eACJ,wBACA,sBAAsB,sBAAsB,CAAC,QAAQ,IAAI,CAAC;AAE5D,eAAO,gBAAgB,EAAE,yBAAyB,GAAG,OAAO;AAAA,MAC9D;AAAA,IACF,OAAO;AACL,UAAI;AACF,cAAM,OAAO,WAAW,QAAQ,KAAK,EAAE;AAEvC,cAAM,kBAAkB,EAAE,+BAA+B;AAAA,UACvD,MAAM,QAAQ,KAAK,QAAQ,QAAQ,KAAK;AAAA,QAC1C,CAAC;AAED,cAAM,iBACH,0BACC,sBAAsB,wBAAwB,CAAC,QAAQ,IAAI,CAAC,KAC9D;AAEF,YAAI,OAAO,mBAAmB,UAAU;AACtC,iBAAO,gBAAgB,SAAS;AAAA,QAClC;AAAA,MACF,SAAS,GAAG;AACV,cAAM,eACH,wBACC,sBAAsB,sBAAsB,CAAC,QAAQ,IAAI,CAAC,KAC5D,EAAE,2BAA2B;AAE/B,YAAI,OAAO,iBAAiB,UAAU;AACpC,iBAAO,cAAc,OAAO;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AClFO,IAAM,uBAAuB,CAClC,SACA,qBACsB;AACtB,QAAM,EAAE,YAAY,kBAAkB,IACpC,wBAAwB,sBAAsB;AAEhD,QAAM,aAAa,oBAAoB;AAEvC,SAAO,CAAC,UAAU;AAChB,QAAI,CAAC,cAAc,CAAC,SAAS;AAC3B,cAAQ;AAAA,QACN;AAAA,MACF;AACA;AAAA,IACF;AAEA,eAAW,SAAS,KAAK;AAAA,EAC3B;AACF;;;ACkBO,IAAM,gBAAgB,CAC3B,SAEA,eAA+B,uBAC/B,gBAAyC,CAAC,MACvC;AACH,QAAM,EAAE,sBAAsB,OAAO,IAAI;AAEzC,QAAM,EAAE,cAAc,IAAI,wBAAwB,eAAe;AACjE,QAAM,EAAE,sBAAsB,CAAC,EAAE,IAAI,uBAAuB,eAAe;AAC3E,QAAM,EAAE,OAAO,IAAI,eAAe,eAAe;AACjD,QAAM,EAAE,EAAE,IAAI,sBAAsB,eAAe;AAEnD,QAAM,SAAS,CAAC,CAAC,oBAAoB,aAAa;AAElD,QAAM,YAA+B,OAAO,UAAU;AACpD,UAAM,eAAe;AAErB,QAAI,CAAC,QAAS;AAEd,QAAI,CAAC,QAAQ,QAAQ;AACnB,UAAI;AACF,cAAM,oBAAkC;AAAA,UACtC,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,WAAW,oBAAI,KAAK;AAAA,UACpB,WAAW,OAAO;AAAA,QACpB;AAEA,sBAAc,iBAAiB;AAE/B,cAAM,OAAO,WAAW,OAAO;AAAA,MACjC,SAAS,GAAG;AACV,cAAM,eACJ,wBAAwB,sBAAsB,sBAAsB,CAAC,OAAO,CAAC;AAE/E,YAAI,OAAQ,QAAO,gBAAgB,EAAE,uBAAuB,GAAG,OAAO;AACtE,sBAAc,OAAO;AAAA,MACvB;AAAA,IACF,OAAO;AACL,UAAI;AACF,cAAM,oBAAoB;AAAA,UACxB,GAAG;AAAA,UACH,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,WAAW;AAAA,QACb;AAEA,sBAAc,iBAAiB;AAE/B,cAAM,OAAO,aAAa,OAAO;AAAA,MACnC,SAAS,GAAG;AACV,cAAM,eACJ,wBAAwB,sBAAsB,sBAAsB,CAAC,OAAO,CAAC;AAE/E,YAAI,OAAQ,QAAO,gBAAgB,EAAE,4BAA4B,GAAG,OAAO;AAC3E,sBAAc,OAAO;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,UAAU;AAC7B;;;ACxGA,IAAAC,iBAA4B;AAC5B,IAAAC,kBAAqB;AASd,IAAM,yBAAyB;AAAA;AAG/B,IAAM,qBAAqB,CAAC,YAA2B;AAC5D,QAAM,SAAS,iBAAiB;AAChC,QAAM,EAAE,cAAc,IAAI,wBAAwB,oBAAoB;AACtE,QAAM,EAAE,SAAS,oBAAoB,IAAI,uBAAuB,oBAAoB;AACpF,QAAM,EAAE,OAAO,IAAI,eAAe,oBAAoB;AAEtD,QAAM,2BAAuB;AAAA,IAC3B,CAAC,KAAc,UAA4BC,aAAwC;AACjF,YAAM,oBAAoBA,UAAS,mBAAmB,CAAC;AACvD,YAAM,eAAe,SAAS;AAC9B,YAAM,cAAc,CAAC,CAAC,kBAAkB,YAAY;AAEpD,UAAI,KAAK;AACP,cAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,0BAAkB,YAAY,IAAI,cAC9B;AAAA,UACE,GAAG,kBAAkB,YAAY;AAAA,UACjC,OAAO,kBAAkB,YAAY,EAAE,QAAQ;AAAA,QACjD,IACA;AAAA,UACE,OAAO;AAAA,UACP,mBAAmB;AAAA,UACnB,kBAAkB;AAAA,UAClB,YAAY;AAAA,QACd;AAAA,MACN,OAAO;AACL,YAAI,eAAe,kBAAkB,YAAY,EAAE,QAAQ,GAAG;AAC5D,4BAAkB,YAAY,IAAI;AAAA,YAChC,GAAG,kBAAkB,YAAY;AAAA,YACjC,OAAO,kBAAkB,YAAY,EAAE,QAAQ;AAAA,UACjD;AAAA,QACF,OAAO;AACL,iBAAO,kBAAkB,YAAY;AAAA,QACvC;AAAA,MACF;AAEA,YAAM,eAA+C,MACjD,CAAC,UAAU,GAAIA,UAAS,oBAAoB,CAAC,CAAE,IAC/CA,SAAQ,kBAAkB;AAAA,QACxB,CAAC,SAAS,EAAE,KAAK,SAAS,SAAS,QAAQ,KAAK,YAAY,SAAS;AAAA,MACvE;AAEJ,YAAM,kBAAkB,MACpB,CAAC,UAAU,GAAIA,UAAS,iBAAiB,CAAC,CAAE,IAC5CA,UAAS,eAAe,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS,IAAI;AAExE,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,kBAAkB,gBAAgBA,SAAQ;AAAA,QAC1C,eAAe;AAAA,QACf,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA;AAAA,IAEA,CAAC,OAAO,MAAM,OAAO,MAAM;AAAA,EAC7B;AAEA,QAAM,wBAAwB,CAAC,UAAkB;AAAA,IAC/C,YAAY,SAAS;AAAA,IACrB,OAAO;AAAA,IACP;AAAA,IACA,MAAM,OAAO;AAAA,IACb,SAAS,OAAO,MAAM;AAAA,EACxB;AAEA,QAAM,qBAAiB,gBAAAC,SAAS,OAAO,IAAY,MAAc,QAAiB;AAChF,QAAI,CAAC,WAAW,CAAC,oBAAoB,eAAe,EAAG;AAEvD,UAAM,cAAc,sBAAsB,IAAI;AAC9C,UAAM,cAAc,qBAAqB,KAAK,aAAa,OAAO;AAElE,QAAI;AACF,oBAAc,WAAW;AACzB,cAAQ,mBAAmB,EAAE,SAAS,YAAY,CAAC;AAEnD,YAAM,kBAAkB,MACpB,MAAM,QAAQ,aAAa,IAAI,EAAE,KAAK,CAAa,IACnD,MAAM,QAAQ,eAAe,IAAI,IAAI;AAGzC,oBAAc,gBAAgB,OAAO;AAAA,IACvC,SAAS,OAAO;AAEd,oBAAc,OAAO;AACrB,cAAQ,mBAAmB,EAAE,QAAQ,CAAC;AAAA,IACxC;AAAA,EACF,GAAG,GAAI;AAEP,SAAO,OAAO,cAAsB,UAAqC;AACvE,QAAI,OAAO,gBAAgB;AACzB,YAAM,eAAe;AAAA,IACvB;AAEA,QAAI,CAAC,SAAS;AACZ,aAAO,QAAQ,KAAK,sBAAsB;AAAA,IAC5C;AAEA,QAAI,uBAAuB;AAE3B,QAAI,QAAQ,eAAe;AACzB,cAAQ,cAAc,QAAQ,CAAC,aAAa;AAG1C,YACE,SAAS,QACT,OAAO,WAAW,SAAS,KAAK,MAChC,SAAS,SAAS,cAClB;AACA,iCAAuB;AAAA,QACzB,WAAW,SAAS,QAAQ,OAAO,WAAW,SAAS,KAAK,IAAI;AAC9D,kBAAQ;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI;AACF,UAAI,sBAAsB;AACxB,cAAM,eAAe,QAAQ,IAAI,qBAAqB,MAAM,KAAK;AAAA,MACnE,OAAO;AACL,cAAM,eAAe,QAAQ,IAAI,cAAc,IAAI;AAAA,MACrD;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,IAAI,EAAE,MAAM,CAAC;AAAA,IACvB;AAAA,EACF;AACF;;;AC1IO,IAAM,kBAAkB,CAC7B,2BACqB;AACrB,QAAM,EAAE,kBAAkB,wBAAwB,IAChD,wBAAwB,iBAAiB;AAE3C,QAAM,mBAAmB,0BAA0B;AAEnD,SAAO,OAAO,YAAY;AACxB,QAAI,SAAS;AACX,YAAM,iBAAiB,OAAO;AAAA,IAChC;AAAA,EACF;AACF;;;ACTO,IAAM,iBAAiB,CAC5B,SACA,mBAOI;AAAA,EACJ,aAAa,CAAC,UAAU;AACtB,QAAI,OAAO,eAAe,uBAAuB,cAAc,CAAC,SAAS,MAAM;AAC7E;AAAA,IACF;AACA,kBAAc,mBAAmB,OAAO,QAAQ,IAAI;AAAA,EACtD;AAAA,EACA,aAAa,CAAC,UAAU;AACtB,QAAI,OAAO,eAAe,uBAAuB,cAAc,CAAC,SAAS,MAAM;AAC7E;AAAA,IACF;AAEA,kBAAc,mBAAmB,OAAO,QAAQ,IAAI;AAAA,EACtD;AACF;;;AC1BO,IAAM,cAAc,CACzB,SACA,mBACA,0BACG;AACH,QAAM,EAAE,SAAS,sBAAsB,CAAC,EAAE,IAAI,uBAAuB,aAAa;AAClF,QAAM,EAAE,OAAO,IAAI,eAAe,aAAa;AAM/C,QAAM,UACJ,OAAO,MAAM,SAAS,WAAW,QAAQ,MAAM,WAAW,SAAS;AAMrE,QAAM,UAAU,QAAQ,MAAM,WAAW,SAAS;AAMlD,QAAM,cACJ,OAAO,MAAM,SAAS,uBACtB,QAAQ,MAAM,WAAW,SAAS,uBAClC,QAAQ,MAAM,WAAW,SAAS,eAClC,QAAQ,MAAM,WAAW,iBAAiB,QAC1C,QAAQ,MAAM,WAAW,iBAAiB;AAE5C,QAAM,cAAc,OAAO,WAAW,QAAQ,MAAM;AAEpD,QAAM,UACJ,CAAC,QAAQ,SACP,CAAC,qBAAqB,oBAAoB,oBAAoB,KAC7D,eAAe,oBAAoB,oBAAoB;AAE5D,QAAM,YACJ,oBAAoB,oBAAoB,KACvC,eAAe,oBAAoB,oBAAoB;AAE1D,QAAM,UAAU,CAAC,eAAe,oBAAoB,cAAc;AAClE,QAAM,gBAAgB,oBAAoB,aAAa;AACvD,QAAM,UAAU,CAAC,eAAe,oBAAoB,cAAc;AAClE,QAAM,WAAW,CAAC,yBAAyB,oBAAoB,eAAe;AAC9E,QAAM,WAAW,oBAAoB,eAAe;AACpD,QAAM,WAAW,oBAAoB,YAAY;AAEjD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC3DO,IAAM,iCAAiC;AAOvC,SAAS,oBACd,SACA,gBAAoD,CAAC,GACrD;AACA,QAAM,EAAE,OAAO,IAAI,eAAe,oBAAoB;AACtD,QAAM,EAAE,EAAE,IAAI,sBAAsB,oBAAoB;AACxD,QAAM,EAAE,sBAAsB,OAAO,IAAI;AAEzC,SAAO,OAAO,cAA6B,SAAwB;AACjE,QAAI;AACF,aAAO,MAAM,sBAAsB,QAAQ,QAAQ,IAAI,cAAc,IAAI;AAAA,IAC3E,SAAS,GAAG;AACV,YAAM,eAAe,uBAAuB,OAAO;AACnD,eAAS,gBAAgB,EAAE,0BAA0B,GAAG,OAAO;AAC/D,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAe,sBACb,QACA,WACA,cACA,MACA;AACA,QAAM,YAAgC,CAAC;AACvC,QAAM,QAAQ;AACd,MAAI;AACJ,MAAI,UAAU;AAEd,SAAO,WAAW,UAAU,SAAS,gCAAgC;AACnE,UAAM,WAAW,MAAM,OAAO;AAAA,MAC5B;AAAA,MACA,eAAe,EAAE,MAAM,aAAa,IAAI,CAAC;AAAA,MACzC;AAAA,MACA,EAAE,OAAO,KAAK;AAAA,IAChB;AAEA,cAAU,KAAK,GAAG,SAAS,SAAS;AACpC,WAAO,SAAS;AAChB,cAAU,QAAQ,IAAI;AAAA,EACxB;AAEA,SAAO;AACT;;;AC5DA,IAAAC,iBAA4C;AAU5C,IAAM,0BAA0B;AAChC,IAAM,iCAAiC;AAUhC,IAAM,0BAA0B,CAAC;AAAA,EACtC,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,MAAAC;AACF,MAAoC;AAClC,QAAM,CAAC,qBAAqB,sBAAsB,QAAI,yBAAiBA,KAAI;AAC3E,QAAM,iBAAa,uBAAeA,MAAK,MAAM;AAE7C,gCAAU,MAAM;AACd,UAAM,aAAaA,MAAK;AAExB,UAAM,WAAW,YAAY,MAAM;AACjC,UAAI,CAACA,SAAQ,WAAW,WAAW,YAAY;AAC7C,sBAAc,QAAQ;AACtB;AAAA,MACF;AACA,YAAM,iBAAiB,WAAW,UAAU;AAC5C,YAAM,UAAUA,MAAK,UAAU,GAAG,cAAc;AAChD,iBAAW,WAAW,QAAQ,SAAS,WAAW;AAClD,6BAAuB,OAAO;AAAA,IAChC,GAAG,yBAAyB;AAE5B,WAAO,MAAM;AACX,oBAAc,QAAQ;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,2BAA2B,sBAAsBA,KAAI,CAAC;AAE1D,QAAM,gBAAgB,kBAAkB,MAAM;AAC5C,eAAW,UAAUA,MAAK;AAC1B,2BAAuBA,KAAI;AAAA,EAC7B,CAAC;AAED,SAAO,EAAE,eAAe,oBAAoB;AAC9C;;;ACtDA,IAAAC,iBAA4B;AAKrB,IAAM,qBAAqB,CAAC,cAAsB;AACvD,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,uBAAmB;AAAA,IACvB,CAAC,WAAiC;AAAA,MAChC,UAAU,MAAM,UAAU,IAAI,SAAS;AAAA,IACzC;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AACA,QAAM,EAAE,SAAS,IAAI,cAAc,OAAO,UAAU,OAAO,gBAAgB;AAC3E,SAAO;AACT;;;ACfA,IAAAC,iBAAkB;AAWX,IAAM,iBAAiB,CAAC,UAA+B;AAC5D,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,EAAE,EAAE,IAAI,sBAAsB,gBAAgB;AAEpD,QAAM,EAAE,YAAY,IAAI,YAAY,OAAO;AAE3C,QAAM,iBAAiB,cACnB,kGACA;AAEJ,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,cAAc,+BAA+B,QAAQ,IAAI;AAAA,MACvE,eAAa;AAAA,MACb,KAAK,QAAQ;AAAA;AAAA,IAEb,+BAAAA,QAAA,cAAC,SAAI,WAAU,sCACZ,EAAE,6BAA6B,CAClC;AAAA,EACF;AAEJ;;;ACjCA,IAAAC,iBAAkB;AAelB,IAAM,6BAA6B,CAAC,UAAiC;AACnE,QAAM,EAAE,SAAS,aAAa,GAAG,eAAe,IAAI;AACpD,QAAM,EAAE,SAAS,eAAe,IAAI,kBAAkB,kBAAkB;AACxE,QAAM,EAAE,WAAAC,aAAY,UAAiB,IAAI,oBAAoB,kBAAkB;AAC/E,QAAM,UAAU,eAAe;AAC/B,SAAO,+BAAAC,QAAA,cAACD,YAAA,EAAU,WAAW,QAAQ,YAAa,GAAG,gBAAgB;AACvE;AAEO,IAAM,mBAAmB,eAAAC,QAAM;AAAA,EACpC;AACF;;;ACzBA,IAAAC,iBAAuD;AACvD,IAAAC,gBAAiB;AAKV,IAAM,gBAAY,2BAA6C,SAASC,WAC7E,EAAE,GAAG,MAAM,GACX,KACA;AACA,QAAM,EAAE,WAAW,gBAAgB,SAAS,aAAa,IAAI;AAC7D,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,KAAK;AAExC;AAAA,IACE,MAAM,MAAM;AACV,eAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,MAAM,GAAG;AAAA,EACZ;AAEA,SACE,+BAAAC,QAAA,6BAAAA,QAAA,gBACE,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACX,GAAG;AAAA,MACJ,eAAW,cAAAC,SAAK,gBAAgB,wBAAwB;AAAA,QACtD,qCAAqC;AAAA,MACvC,CAAC;AAAA,MACD,SAAS,CAAC,MAAM;AACd,iBAAS,IAAI;AACb,uBAAe,CAAC;AAAA,MAClB;AAAA,MACA;AAAA;AAAA,EACF,GACC,SAAS,+BAAAD,QAAA,cAAC,kBAAe,UAAU,MAAM,KAAK,CACjD;AAEJ,CAAC;;;ACpCD,IAAAE,iBAAgC;AAChC,IAAAC,uBAA4B;AAC5B,IAAAC,gBAAiB;;;ACHjB,IAAAC,gBAAiB;AAEjB,IAAAC,iBAA4B;AAC5B,IAAAA,iBAAyC;AACzC,IAAAC,gBAA2B;;;ACJ3B,IAAAC,iBAAkB;AAEX,IAAM,iBAAiB,MAC5B,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,+BAAAA,QAAA,cAAC,UAAK,MAAK,WAAU,QAAO,MAAK,IAAG,MAAK,OAAM,MAAK;AAAA,EACpD,+BAAAA,QAAA,cAAC,YAAO,IAAG,MAAK,IAAG,MAAK,MAAK,WAAU,GAAE,MAAK;AAAA,EAC9C,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA;AAAA,EACX;AACF;;;ACnBF,IAAAC,gBAAiB;AACjB,IAAAC,iBAAyE;;;ACDzE,IAAAC,gBAAiB;AAEjB,IAAAC,iBAA2C;AAC3C,mBAA2B;;;ACH3B,IAAAC,iBASO;AAGP,IAAM,oBAAoB,OAAO,WAAW,eAAe,oBAAoB;AAI/E,SAAS,kBAAkB,GAAwB;AACjD,MAAI,CAAC,OAAO,CAAC,EAAE,WAAW,MAAM,EAAG,QAAO;AAC1C,QAAM,YACJ,MAAM,eAAe,UAAU,MAAM,aAAa,QAAQ;AAC5D,aAAO,8BAAc,EAAE,UAAU,CAAC;AACpC;AAOA,SAAS,WAAW,KAAiB;AACnC,MAAI,OAAO,KAAM,QAAO;AACxB,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAM,CAAC,WAAW,QAAQ,IAAI;AAC9B,eAAO,eAAAC,QAAS,EAAE,WAAW,SAAS,CAAC;AAAA,EACzC;AACA,MAAI,OAAO,QAAQ,SAAU,YAAO,eAAAA,QAAS,GAAG;AAChD,aAAO,eAAAA,QAAS,GAAG;AACrB;AAwBO,SAAS,mBAAmB;AAAA,EACjC,YAAY;AAAA,EACZ,aAAa;AAAA,EACb;AAAA,EACA,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT;AAAA,EACA,YAAY;AACd,GAAqB;AACnB,QAAM,SAAS,kBAAkB,SAAS;AAC1C,QAAM,mBAAmB,WAAW,MAAM;AAC1C,QAAM,kBAAkB,UAAU,WAAW,MAAM,KAAK,UAAU,WAAW,OAAO;AAEpF,QAAM,aAAa;AAAA;AAAA,IAEjB,GAAI,mBAAmB,CAAC,gBAAgB,IAAI,CAAC;AAAA;AAAA;AAAA,IAI7C,GAAI,SAAS,CAAC,MAAM,IAAI,aAAa,CAAC,kBAAkB,KAAC,eAAAC,MAAO,CAAC,IAAI,CAAC;AAAA;AAAA,IAGtE,GAAI,aAAa,KAAC,eAAAC,OAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC;AAAA;AAAA;AAAA,IAI9C,GAAI,oBAAoB,KAAC,eAAAC,MAAO,EAAE,OAAO,MAAM;AAAA,IAAC,EAAE,CAAC,CAAC,IAAI,CAAC;AAAA,EAC3D;AAGA,QAAM,gBAA2B,OAAO,SAAS,EAAE,WAAW,MAAM,IAChE,WACC;AAEL,aAAO,4BAAY;AAAA,IACjB;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,sBAAsB,SAClB,SACA,CAAC,WAAW,UAAU,eACpB,2BAAW,WAAW,UAAU,QAAQ;AAAA,MACtC,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,GAAG;AAAA,IACL,CAAC;AAAA,EACT,CAAC;AACH;;;AD7FO,SAAS,gBAAuC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAmB,IAAI;AACjE,QAAM,EAAE,MAAM,UAAU,QAAQ,GAAG,EAAE,IAAI,mBAAmB;AAAA,IAC1D;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AAED,gCAAU,MAAM;AACd,SAAK,aAAa,gBAAgB;AAAA,EACpC,GAAG,CAAC,kBAAkB,IAAI,CAAC;AAE3B,gCAAU,MAAM;AACd,SAAK,YAAY,aAAa;AAAA,EAChC,GAAG,CAAC,eAAe,IAAI,CAAC;AAExB,gCAAU,MAAM;AACd,QAAI,QAAQ,eAAe;AAIzB,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,MAAM,WAAW,eAAe,MAAM,CAAC;AAE3C,MAAI,iBAAiB,CAAC,MAAM;AAC1B,qBAAiB,IAAI;AAAA,EACvB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,MACN,MAAM,KAAK;AAAA,MACX,UAAU;AAAA,MACV,KAAK,KAAK;AAAA,IACZ;AAAA,EACF;AACF;AASO,IAAM,eAAe,CAAC;AAAA,EAC3B,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAyB;AACvB,QAAM,SAAS,UAAU,EAAE,iBAAiB,GAAG,CAAC;AAChD,QAAM,OAAO,gBAAgB,IAAI,eAAe;AAChD,QAAM,EAAE,kBAAkB,OAAO,IAAI,gBAAgC;AAAA,IACnE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,gCAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,eAAe,CAAC,UAAyB;AAC7C,UAAI,MAAM,QAAQ,SAAU;AAC5B,cAAQ,MAAM;AAAA,IAChB;AAEA,aAAS,iBAAiB,SAAS,YAAY;AAE/C,WAAO,MAAM;AACX,eAAS,oBAAoB,SAAS,YAAY;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,QAAQ,IAAI,CAAC;AAGjB,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SACE,+BAAAC,QAAA,cAAC,qBAAkB,UAAU,IAAI,mBAC/B,+BAAAA,QAAA,cAAC,2BAAW,WAAW,OAAO,SAAS,WAAW,cAAY,QAC5D,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,eAAW,cAAAC,SAAK,6BAA6B,SAAS;AAAA,MACtD,eAAY;AAAA,MACZ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,UAAU,OAAO,aAAa,cAAc,WAAW;AAAA;AAAA,IAEtD;AAAA,EACH,CACF,CACF;AAEJ;;;AD/GO,IAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAyB;AACvB,QAAM,gBAAY,uBAAiC,IAAI;AACvD,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAgC,IAAI;AAClF,QAAM,sBAAkB,uBAAO,KAAK;AACpC,QAAM,yBAAqB,uBAA8B,IAAI;AAC7D,QAAM,eAAW,wBAAQ,MAAM,WAAW,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AACnF,QAAM,EAAE,QAAQ,cAAc,IAAI,0BAA0B,EAAE,IAAI,SAAS,CAAC;AAC5E,QAAM,eAAe,gBAAgB,UAAU,eAAe,EAAE;AAChE,QAAM,EAAE,kBAAkB,OAAO,IAAI,gBAAgC;AAAA,IACnE,MAAM;AAAA,IACN;AAAA,IACA,kBAAkB,UAAU;AAAA,EAC9B,CAAC;AAED,QAAM,wBAAoB,4BAAY,MAAM;AAC1C,QAAI,mBAAmB,QAAS,cAAa,mBAAmB,OAAO;AACvE,uBAAmB,UAAU,WAAW,MAAM;AAC5C,UAAI,gBAAgB,QAAS;AAC7B,aAAO,MAAM;AAAA,IACf,GAAG,GAAG;AAAA,EACR,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,kBAAc;AAAA,IAClB,CAAC,UAAiB;AAChB,YAAM,eAAe,UAAU;AAC/B,UAAI,CAAC,gBAAgB,CAAC,aAAc;AACpC,YAAM,gBAAgB;AACtB,wBAAkB;AAClB,mBAAa,MAAM;AAAA,IACrB;AAAA,IACA,CAAC,mBAAmB,cAAc,SAAS;AAAA,EAC7C;AAEA,QAAM,0BAA0B,MAAM;AACpC,QAAI,aAAc;AAClB,WAAO,KAAK;AACZ,oBAAgB,UAAU;AAAA,EAC5B;AAEA,gCAAU,MAAM;AACd,UAAM,eAAe,UAAU;AAC/B,QAAI,CAAC,gBAAgB,CAAC,aAAc;AACpC,UAAM,eAAe,CAAC,UAAyB;AAC7C,UAAI,MAAM,QAAQ,SAAU;AAC5B,kBAAY,KAAK;AACjB,sBAAgB,UAAU;AAAA,IAC5B;AAEA,aAAS,iBAAiB,SAAS,cAAc,EAAE,SAAS,KAAK,CAAC;AAElE,WAAO,MAAM;AACX,eAAS,oBAAoB,SAAS,cAAc,EAAE,SAAS,KAAK,CAAC;AAAA,IACvE;AAAA,EACF,GAAG,CAAC,cAAc,WAAW,CAAC;AAE9B,SACE,+BAAAC,QAAA,6BAAAA,QAAA,gBACE,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAc;AAAA,MACd,eAAW,cAAAC,SAAK,WAAW,iCAAiC;AAAA,QAC1D,+CAA+C;AAAA,MACjD,CAAC;AAAA,MACD,QAAQ,MAAM;AACZ,wBAAgB,UAAU;AAC1B,0BAAkB;AAAA,MACpB;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,cAAM,gBAAgB;AACtB,eAAO,OAAO;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,MACT,cAAc;AAAA,MACd,cAAc,MAAM;AAClB,wBAAgB,UAAU;AAC1B,0BAAkB;AAAA,MACpB;AAAA,MACA,KAAK;AAAA,MACL,MAAK;AAAA,MACJ,GAAG;AAAA;AAAA,IAEH;AAAA,EACH,GACC,gBACC,+BAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ,CAAC,UAAU;AACjB,cAAM,sBACJ,MAAM,yBAAyB,QAC/B,iBAAiB,SAAS,MAAM,aAAa;AAC/C,YAAI,oBAAqB;AACzB,wBAAgB,UAAU;AAC1B,0BAAkB;AAAA,MACpB;AAAA,MACA,SAAS,MAAM;AACb,wBAAgB,UAAU;AAAA,MAC5B;AAAA,MACA,cAAc,MAAM;AAClB,wBAAgB,UAAU;AAAA,MAC5B;AAAA,MACA,cAAc,MAAM;AAClB,wBAAgB,UAAU;AAC1B,0BAAkB;AAAA,MACpB;AAAA,MACA,KAAK,CAACE,aAAY;AAChB,yBAAiBA,QAAO;AACxB,2BAAmBA,QAAO;AAAA,MAC5B;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,MACT,GAAG;AAAA;AAAA,IAEJ,+BAAAF,QAAA,cAAC,aAAQ;AAAA,EACX,CAEJ;AAEJ;;;AFtHO,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqC;AACnC,QAAM,EAAE,EAAE,IAAI,sBAAsB,OAAO;AAE3C,QAAM,SAAS,eAAe;AAC9B,QAAM,SAAS,qBAAqB;AACpC,QAAM,eAAW,uBAA8B,IAAI;AACnD,QAAM,qBAAiB,uBAAiC,IAAI;AAE5D,QAAM,iBAAa;AAAA,IACjB,CAAC,QAA0B,UAA2B;AACpD,YAAM,QAAQ,iBAAiB,QAAQ,KAAK;AAC5C,UAAI,UAAU,OAAO;AACnB,kBAAU,KAAK;AACf,eAAO,MAAM;AAAA,MACf;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,SAAS,cAAc;AAAA,EAClC;AAEA,QAAM,cAAc,CAAC,UAAgE;AACnF,UAAM,SAAS,MAAM;AACrB,QAAI,CAAC,SAAS,WAAW,CAAC,eAAe,QAAS;AAClD,QAAI,SAAS,SAAS,SAAS,MAAM,EAAG;AAExC,QAAI,eAAe,QAAQ,SAAS,MAAM,GAAG;AAC3C,iBAAW,UAAU,KAAK;AAAA,IAC5B,WAAW,CAAC,SAAS,QAAQ,SAAS,MAAM,GAAG;AAC7C,iBAAW,WAAW,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,gCAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AAEb,UAAM,gBAAgB,CAAC,UAAyB;AAC9C,UAAI,MAAM,QAAQ,SAAU,YAAW,UAAU,KAAK;AAAA,IACxD;AAEA,aAAS,iBAAiB,WAAW,aAAa;AAClD,WAAO,MAAM,SAAS,oBAAoB,WAAW,aAAa;AAAA,EACpE,GAAG,CAAC,QAAQ,UAAU,CAAC;AAEvB,gCAAU,MAAM;AACd,QAAI,QAAQ,CAAC,OAAO,QAAQ;AAC1B,aAAO,KAAK;AAAA,IACd;AAAA,EACF,GAAG,CAAC,QAAQ,IAAI,CAAC;AAEjB,MAAI,CAAC,QAAQ,CAAC,OAAQ,QAAO;AAE7B,SACE,+BAAAG,QAAA,cAAC,qBAAkB,UAAU,eAAe,iBAAiB,wBAC3D,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS;AAAA;AAAA,IAET,+BAAAD,QAAA,cAAC,4BAAW,WAAS,MAAC,SAAO,QAC3B,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAK;AAAA,QACL,OAAO,EAAE,OAAO;AAAA,QAChB,MAAK;AAAA;AAAA,MAEL,+BAAAA,QAAA,cAAC,oBAAe;AAAA,IAClB,GACA,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAK;AAAA;AAAA,MAEJ;AAAA,IACH,CACF;AAAA,EACF,CACF;AAEJ;;;AKrGA,IAAAE,gBAAiB;AACjB,IAAAC,iBAAoD;AACpD,IAAAA,iBAAyC;AACzC,IAAAC,gBAA2B;AAwBpB,IAAM,QAAQ,CAAC;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqC;AACnC,QAAM,EAAE,EAAE,IAAI,sBAAsB,OAAO;AAE3C,QAAM,eAAW,uBAA8B,IAAI;AACnD,QAAM,qBAAiB,uBAAiC,IAAI;AAE5D,QAAM,iBAAa;AAAA,IACjB,CAAC,QAA0B,UAA2B;AACpD,YAAM,QAAQ,iBAAiB,QAAQ,KAAK;AAC5C,UAAI,UAAU,OAAO;AACnB,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAAA,IACA,CAAC,SAAS,cAAc;AAAA,EAC1B;AAEA,QAAM,cAAc,CAAC,UAAgE;AACnF,UAAM,SAAS,MAAM;AACrB,QAAI,CAAC,SAAS,WAAW,CAAC,eAAe,QAAS;AAElD,QAAI,eAAe,QAAQ,SAAS,MAAM,GAAG;AAC3C,iBAAW,UAAU,KAAK;AAAA,IAC5B,WAAW,CAAC,SAAS,QAAQ,SAAS,MAAM,GAAG;AAC7C,iBAAW,WAAW,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,gCAAU,MAAM;AACd,QAAI,CAAC,KAAM;AAEX,UAAM,gBAAgB,CAAC,UAAyB;AAC9C,UAAI,MAAM,QAAQ,SAAU,YAAW,UAAU,KAAK;AAAA,IACxD;AAEA,aAAS,iBAAiB,WAAW,aAAa;AAClD,WAAO,MAAM,SAAS,oBAAoB,WAAW,aAAa;AAAA,EACpE,GAAG,CAAC,YAAY,IAAI,CAAC;AAErB,MAAI,CAAC,KAAM,QAAO;AAElB,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,yCAAyC,SAAS;AAAA,MAClE,SAAS;AAAA;AAAA,IAET,+BAAAD,QAAA,cAAC,4BAAW,WAAS,MAAC,SAAO,QAC3B,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAK;AAAA,QACL,OAAO,EAAE,OAAO;AAAA;AAAA,MAEhB,+BAAAA,QAAA,cAAC,oBAAe;AAAA,IAClB,GACA,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAK;AAAA;AAAA,MAEJ;AAAA,IACH,CACF;AAAA,EACF;AAEJ;;;AC/FA,IAAAE,iBAA+B;AAE/B,iCAAyB;AAazB,IAAM,UAAqD,CAAC,MAAM;AAGhE,EAAC,EAAE,OAA4B,MAAM;AACvC;AAEA,IAAM,aAAa,CAAC,EAAE,UAAU,YAAY,MAC1C,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,KAAK;AAAA,IACL,WAAU;AAAA,IACV;AAAA,IACA,KAAK;AAAA;AACP;AAGK,IAAM,eAAe,CAAC,UAA6B;AACxD,QAAM,EAAE,QAAQ,OAAAC,OAAM,IAAI;AAC1B,QAAM,EAAE,EAAE,IAAI,sBAAsB,cAAc;AAElD,QAAM,qBAAiB;AAAA,IACrB,MACE,OAAO,IAAI,CAACC,WAAU;AACpB,YAAM,WAAWA,OAAM,aAAaA,OAAM,aAAa;AACvD,aAAO;AAAA,QACL,UAAU;AAAA,QACV,aAAa,EAAE,uBAAuB;AAAA,QACtC,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,IACH,CAAC,QAAQ,CAAC;AAAA,EACZ;AAEA;AAAA;AAAA,IAEE,+BAAAF,QAAA;AAAA,MAAC,2BAAAG;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,YAAYF;AAAA;AAAA,IACd;AAAA;AAEJ;;;APjCA,IAAM,oBAAoB,CAAC,UAAwB;AACjD,QAAM,EAAE,QAAQ,UAAU,IAAI;AAE9B,QAAM,CAACG,QAAO,QAAQ,QAAI,yBAAS,CAAC;AACpC,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAEhD,QAAM;AAAA,IACJ,WAAAC,aAAY;AAAA,IACZ,OAAAC,SAAQ;AAAA,IACR,cAAAC,gBAAe;AAAA,EACjB,IAAI,oBAAoB,SAAS;AACjC,QAAM,EAAE,EAAE,IAAI,sBAAsB,SAAS;AAE7C,QAAM,qBAAqB,EAAE,uBAAuB;AAEpD,QAAM,gCAAgC;AACtC,QAAM,0BAA0B,gCAAgC;AAEhE,QAAM,cAAc,CAAC,kBAA0B;AAC7C,QAAI,WAAW;AACb,mBAAa,KAAK;AAAA,IACpB,OAAO;AACL,eAAS,aAAa;AACtB,mBAAa,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,MAAM,GAAG,6BAA6B,EAAE;AAAA,IAAI,CAACC,QAAO,MAC9E,MAAM,2BAA2B,OAAO,SAAS,gCAC/C,+BAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,KAAK,iBAAiB,CAAC;AAAA,QACvB,SAAS,MAAM,YAAY,CAAC;AAAA,QAC5B,OAAO;AAAA,UACL,iBAAiB,OACf,OAAO,uBAAuB,EAAE,cAChC,OAAO,uBAAuB,EAAE,aAChC,OAAO,uBAAuB,EAAE,SAClC;AAAA,UACA,GAAGD,OAAM;AAAA,QACX;AAAA,QACC,GAAI,WAAW,WAAW;AAAA,UACzB,KAAK,CAAC,MAAM;AACV,sBAAU,QAAQ,CAAC,IAAI;AAAA,UACzB;AAAA,QACF;AAAA;AAAA,MAEA,+BAAAC,QAAA,cAAC,WACE,EAAE,yBAAyB;AAAA,QAC1B,YAAY,OAAO,SAAS;AAAA,MAC9B,CAAC,CACH;AAAA,IACF,IAEA,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,KAAK,iBAAiB,CAAC;AAAA,QACvB,SAAS,MAAM,YAAY,CAAC;AAAA;AAAA,MAE5B,+BAAAA,QAAA;AAAA,QAACJ;AAAA,QAAA;AAAA,UACC,KAAMG,QAAsB,YAAY;AAAA,UACxC,SAAK,kCAAYA,OAAM,cAAcA,OAAM,aAAaA,OAAM,SAAS;AAAA,UACvE,OAAOA,OAAM;AAAA,UACb,OAAQA,QAAsB,YAAY;AAAA,UACzC,GAAI,WAAW,WAAW;AAAA,YACzB,KAAK,CAAC,MAAM;AACV,wBAAU,QAAQ,CAAC,IAAI;AAAA,YACzB;AAAA,UACF;AAAA;AAAA,MACF;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,gBAAY,cAAAE,SAAK,qBAAqB;AAAA,IAC1C,6BAA6B,OAAO,SAAS;AAAA,IAC7C,8BAA8B,OAAO,SAAS;AAAA,EAChD,CAAC;AAED,SACE,+BAAAD,QAAA,cAAC,SAAI,aACF,cACD,+BAAAA,QAAA;AAAA,IAACH;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS,MAAM,aAAa,CAACK,eAAc,CAACA,UAAS;AAAA,MACrD,MAAM;AAAA;AAAA,IAEN,+BAAAF,QAAA,cAACF,eAAA,EAAa,QAAgB,OAAOH,QAAO;AAAA,EAC9C,CACF;AAEJ;AAKO,IAAM,UAAU,eAAAK,QAAM,KAAK,iBAAiB;;;AQ1HnD,IAAAG,iBAA4B;AAC5B,IAAAA,iBAAgC;AAChC,IAAAC,uBAA4B;AA8BrB,IAAM,iBAAiB,CAAC,UAAsB;AACnD,QAAM;AAAA,IACJ,aAAa,CAAC;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,KAAK;AACpD,QAAM;AAAA,IACJ,WAAAC,aAAY;AAAA,IACZ,OAAAC,SAAQ;AAAA,IACR,cAAAC,gBAAe;AAAA,EACjB,IAAI,oBAAoB,gBAAgB;AAExC,QAAM,eAAW,kCAAY,cAAc,aAAa,SAAS;AACjE,QAAM,iBAAa,4BAAY,MAAM;AACnC,mBAAe,KAAK;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAY,4BAAY,MAAM;AAClC,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,SACE,+BAAAC,QAAA,6BAAAA,QAAA,gBACE,+BAAAA,QAAA;AAAA,IAACH;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAS;AAAA,MACT,KAAK;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,MACN,GAAG;AAAA,MACH,GAAI,YAAY,EAAE,KAAK,SAAS;AAAA;AAAA,EACnC,GACA,+BAAAG,QAAA,cAACF,QAAA,EAAM,WAAU,yBAAwB,SAAS,YAAY,MAAM,eAClE,+BAAAE,QAAA,cAACD,eAAA,EAAa,QAAQ,CAAC,KAAK,GAAG,OAAO,GAAG,CAC3C,CACF;AAEJ;;;AC/EA,IAAAE,gBAAiB;AAEjB,IAAAC,kBAA2C;;;ACF3C,IAAAC,gBAAiB;AAEjB,IAAAC,kBAAkB;;;ACFlB,IAAAC,kBAAkB;AAUX,IAAM,2BAA2B,CAAC,UAAyC;AAChF,QAAM,EAAE,sBAAsB,QAAQ,IAAI;AAE1C,MAAI,CAAC,qBAAsB,QAAO;AAElC,QAAM,qBAAqB,OAAO,KAAK,oBAAoB;AAE3D,SACE,gCAAAC,QAAA,8BAAAA,QAAA,gBACG,mBAAmB,IAAI,CAAC,iBAAiB;AACxC,UAAM,gBAAgB,qBAAqB,YAAY;AAEvD,WACE,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAc;AAAA,QACd,WAAU;AAAA,QACV,KAAK;AAAA,QACL,SAAS,CAAC,UAAU,cAAc,SAAS,KAAK;AAAA,QAChD,MAAK;AAAA;AAAA,MAEJ;AAAA,IACH;AAAA,EAEJ,CAAC,CACH;AAEJ;;;ACpCA,IAAAC,kBAAkB;AAKX,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AACF,MAAsD;AACpD,QAAM,EAAE,EAAE,IAAI,sBAAsB;AAEpC,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAc;AAAA,MACd;AAAA,MACA,WAAW,SAAS,eAAe;AAAA,MACnC,SAAS;AAAA;AAAA,IAER,EAAE,WAAW;AAAA,EAChB;AAEJ;AAEO,IAAM,kBAAkB,MAAM;AACnC,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,QAAQ,IAAI,kBAAkB;AACtC,SACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,wBAAwB;AAAA,MACtC,WAAU;AAAA,MACV,MAAK;AAAA;AAAA,IAEJ,OAAO,UAAU,mBAAmB,IAAI,CAAC,aACxC,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAK,2BAA2B,QAAQ;AAAA,QACxC,SAAS,MAAM;AACb,iBAAO,UAAU,eAAe;AAAA,YAC9B,WAAW,QAAQ;AAAA,YACnB,WAAW,IAAI,MAAK,oBAAI,KAAK,GAAE,QAAQ,IAAI,QAAQ,EAAE,YAAY;AAAA,UACnE,CAAC;AAAA,QACH;AAAA;AAAA,MAEC,EAAE,sBAAsB,EAAE,cAAc,SAAS,CAAC;AAAA,IACrD,CACD;AAAA,EAEH;AAEJ;;;AFhBA,IAAM,8BAA8B,CAAC,UAAkC;AACrE,QAAM;AAAA,IACJ;AAAA,IACA,mBAAAC;AAAA,IACA,cAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,0BAAAC,4BAA2B,yBAAgC,IACjE,oBAAoB,mBAAmB;AACzC,QAAM,EAAE,sBAAsB,SAAS,WAAW,IAChD,kBAAkB,mBAAmB;AACvC,QAAM,EAAE,EAAE,IAAI,sBAAsB,mBAAmB;AACvD,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,WAAW,mBAAmB,QAAQ,EAAE;AAE9C,QAAM,iBAAiBH,mBAAkB;AAEzC,QAAM,cAAc,MAAM;AACxB,oBAAgB,iBAAiB,OAAO;AAExC,UAAM,WAAW,QAAQ,YACrB,SAAS,iBAAiB,iDAAiD,IAC3E,SAAS,uBAAuB,8BAA8B;AAClE,UAAM,WAAW,SAAS,KAAK,CAAC;AAEhC,QAAI,oBAAoB,qBAAqB;AAC3C,eAAS,MAAM;AAAA,IACjB;AAAA,EACF;AAEA,QAAMI,qBAAgB,cAAAC,SAAK,iCAAiC,WAAW;AAAA,IACrE,uCAAuC;AAAA,EACzC,CAAC;AAED,QAAM,kBACJ;AAEF,SACE,gCAAAC,QAAA,cAAC,SAAK,GAAG,cAAc,WAAWF,gBAAe,eAAY,yBAC3D,gCAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,sBAAsB;AAAA,MACpC,WAAU;AAAA,MACV,MAAK;AAAA;AAAA,IAEL,gCAAAA,QAAA;AAAA,MAACH;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IACC,eAAe,QAAQ,gBAAgB,KAAK,IAAI,MAC/C,gCAAAG,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,QACT,MAAK;AAAA;AAAA,MAEJ,EAAE,OAAO;AAAA,IACZ;AAAA,IAED,eAAe,QAAQ,gBAAgB,GAAG,IAAI,MAAM,CAAC,QAAQ,aAC5D,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,QACT,MAAK;AAAA;AAAA,MAEJ,CAAC,QAAQ,SAAS,EAAE,KAAK,IAAI,EAAE,OAAO;AAAA,IACzC;AAAA,IAED,eAAe,QAAQ,gBAAgB,UAAU,IAAI,MACpD,CAAC,cACD,CAAC,CAAC,QAAQ,MACR,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,QACT,MAAK;AAAA;AAAA,MAEJ,EAAE,gBAAgB;AAAA,IACrB;AAAA,IAEH,eAAe,QAAQ,gBAAgB,IAAI,IAAI,MAC9C,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,QACT,MAAK;AAAA;AAAA,MAEJ,EAAE,MAAM;AAAA,IACX;AAAA,IAED,eAAe,QAAQ,gBAAgB,IAAI,IAAI,MAC9C,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,QACT,MAAK;AAAA;AAAA,MAEJJ,aAAY,IAAI,EAAE,QAAQ,IAAI,EAAE,MAAM;AAAA,IACzC;AAAA,IAED,eAAe,QAAQ,gBAAgB,IAAI,IAAI,MAC9C,gCAAAI,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,QACT,MAAK;AAAA;AAAA,MAEJ,EAAE,cAAc;AAAA,IACnB;AAAA,IAED,eAAe,QAAQ,gBAAgB,MAAM,IAAI,MAChD,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAc;AAAA,QACd,WAAW;AAAA,QACX,SAASL;AAAA,QACT,MAAK;AAAA;AAAA,MAEJ,EAAE,QAAQ;AAAA,IACb;AAAA,IAED,eAAe,QAAQ,yBAAyB,WAAW,IAAI,MAC9D,CAAC,QAAQ,kBACP,gCAAAK,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS,CAAC,MAAML,cAAa,GAAG,EAAE,aAAa,KAAK,CAAC;AAAA,QACrD,MAAK;AAAA;AAAA,MAEJ,EAAE,eAAe;AAAA,IACpB;AAAA,IAEH,eAAe,QAAQ,gBAAgB,QAAQ,IAAI,MAClD,gCAAAK,QAAA,cAAC,wBAAqB,WAAW,iBAAiB,QAAQ,MAAM;AAAA,IAEjE,eAAe,QAAQ,gBAAgB,YAAY,IAAI,MACtD,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS,MACP,WACI,OAAO,UAAU,eAAe,SAAS,EAAE,IAC3C,OAAO,UAAU,eAAe,EAAE,WAAW,QAAQ,GAAG,CAAC;AAAA,QAE/D,MAAK;AAAA;AAAA,MAEJ,WAAW,EAAE,iBAAiB,IAAI,EAAE,gBAAgB;AAAA,IACvD;AAAA,EAEJ,CACF;AAEJ;AAKO,IAAM,oBAAoB,gBAAAA,QAAM;AAAA,EACrC;AACF;;;AG1MA,IAAAC,kBAAkB;AAMX,IAAM,cAAc,CAAC,EAAE,YAAY,GAAG,MAC3C,gCAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,UAAS;AAAA;AAAA,EACX;AACF;AAGK,IAAM,eAAe,CAAC,EAAE,YAAY,GAAG,MAC5C,gCAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,gCAAAA,QAAA,cAAC,OAAE,UAAS,WAAU,UAAS,aAC7B,gCAAAA,QAAA,cAAC,UAAK,GAAE,sJAAqJ,GAC7J,gCAAAA,QAAA,cAAC,UAAK,GAAE,mQAAkQ,CAC5Q;AACF;AAGK,IAAM,aAAa,CAAC,EAAE,YAAY,GAAG,MAC1C,gCAAAA,QAAA,cAAC,SAAI,WAAsB,QAAO,MAAK,OAAM,MAAK,OAAM,gCACtD,gCAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,GAAE;AAAA,IACF,UAAS;AAAA;AACX,CACF;AAGK,IAAM,UAAU,MACrB,gCAAAA,QAAA,cAAC,SAAI,QAAO,MAAK,SAAQ,aAAY,OAAM,MAAK,OAAM,gCACpD,gCAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,GAAE;AAAA,IACF,UAAS;AAAA;AACX,CACF;AAGK,IAAM,eAAe,CAAC,EAAE,SAAS,EAAE,MAAyB;AACjE,MAAI,CAAC,WAAW,CAAC,EAAG,QAAO;AAE3B,SACE,gCAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,YAAY,UAAU,SAAS,OAAO,KAClD,gCAAAA,QAAA,cAAC,aAAQ,GACT,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA;AAAA,IAEC,QAAQ,YACL,GAAG,EAAE,WAAW,CAAC,IAAI,QAAQ,WAAW,QAAQ,QAAQ,WAAW,EAAE,KACrE,EAAE,gBAAgB;AAAA,EACxB,CACF;AAEJ;AAEO,IAAM,kBAAkB,MAC7B,gCAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,OAAM;AAAA;AAAA,EAEN,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,UAAS;AAAA;AAAA,EACX;AACF;AAGK,IAAM,uBAAuB,MAClC,gCAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,OAAM;AAAA;AAAA,EAEN,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MAEF,UAAS;AAAA;AAAA,EACX;AACF;AAGK,IAAM,mBAAmB,MAC9B,gCAAAA,QAAA,cAAC,SAAI,WAAU,kCACb,gCAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,MACL,IAAG;AAAA;AAAA,EACL;AAAA,EACA,gCAAAA,QAAA,cAAC,UAAK,GAAE,yCAAwC,MAAK,SAAQ;AAC/D,CACF;;;AJrFK,IAAM,iBAAiB,CAAC,UAA+B;AAC5D,QAAM;AAAA,IACJ,aAAAC,eAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,MAAM,IAAI,eAAe,gBAAgB;AAEjD,QAAM;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF,IAAI,kBAAkB,gBAAgB;AAEtC,QAAM,EAAE,0BAAAC,0BAAyB,IAAI,oBAAoB,gBAAgB;AAEzE,QAAM,EAAE,EAAE,IAAI,sBAAsB,gBAAgB;AAEpD,QAAMC,qBAAoB,yBAAyB;AACnD,QAAMC,gBAAe,oBAAoB;AACzC,QAAM,aAAa,kBAAkB;AACrC,QAAM,mBAAmB,wBAAwB;AACjD,QAAM,aAAa,kBAAkB;AACrC,QAAM,YAAY,iBAAiB;AACnC,QAAM,UAAU,eAAe;AAC/B,QAAM,SAAS,OAAO,KAAK,IAAI,YAAY;AAE3C,QAAM,cAAU,6BAAY,MAAM,YAAY,SAAS,KAAK,GAAG,CAAC,SAAS,KAAK,CAAC;AAE/E,QAAM,oBAAoB,aAAa,aAAa;AACpD,QAAM,WAAW,kBAAkB,iBAAiB,KAAK,QAAQ,EAAE;AACnE,QAAM,EAAE,QAAQ,cAAc,IAAI,0BAA0B,EAAE,IAAI,SAAS,CAAC;AAC5E,QAAM,eAAe,gBAAgB,UAAU,eAAe,EAAE;AAEhE,QAAM,iBAAiBD,mBAAkB;AAEzC,QAAM,uBAAuB,2BAA2B;AAAA,IACtD;AAAA,IACA,0BAAAD;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACF,CAAC;AAED,QAAM,0BAAsB,wBAAiC,IAAI;AAEjE,MAAI,CAAC,qBAAsB,QAAO;AAElC,SACE,gCAAAG,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,YAAY,QAAQ;AAAA;AAAA,IAEpB,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAiB,eAAe;AAAA,QAChC,IAAI;AAAA,QACJ,WAAW,SAAS,YAAY;AAAA,QAChC,kBAAkB,oBAAoB;AAAA,QACtC,UAAU;AAAA,QACV,WAAS;AAAA;AAAA,MAET,gCAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,mBAAmBF;AAAA,UACnB,cAAcC;AAAA,UACd,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa;AAAA,UACb,MAAM;AAAA,UACN,MAAM;AAAA;AAAA,MACR;AAAA,IACF;AAAA,IACA,gCAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAe;AAAA,QACf,iBAAc;AAAA,QACd,cAAY,EAAE,gCAAgC;AAAA,QAC9C,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,KAAK;AAAA;AAAA,MAEL,gCAAAA,QAAA,cAACJ,cAAA,EAAY,WAAU,iCAAgC;AAAA,IACzD;AAAA,EACF;AAEJ;AAQO,IAAM,wBAAwB,CACnC,UACG;AACH,QAAM,EAAE,UAAU,oBAAoB,QAAQ,WAAW,IAAI;AAE7D,QAAM,0BAAsB,cAAAK;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB,WAAW,sBAAsB;AAAA,IACjC,eAAe;AAAA,IACf,SAAS;AAAA,EACX;AAEA,MAAI,OAAQ,QAAO,gCAAAD,QAAA,cAAC,UAAM,GAAG,gBAAe,QAAS;AAErD,SAAO,gCAAAA,QAAA,cAAC,SAAK,GAAG,gBAAe,QAAS;AAC1C;;;AK1KO,SAAS,aAAaE,OAAc;AACzC,SAAOA,MAAK,QAAQ,2BAA2B,MAAM;AACvD;AAEO,IAAM,aAAa;AAEnB,IAAM,oBAAoB,CAAC,YAAoB;AACpD,QAAM,YAAY;AAClB,QAAM,UAAU,QAAQ,MAAM,SAAS;AACvC,SAAO,WAAW,CAAC;AACrB;AAEO,IAAM,qBAAqB,CAAC,YAAoB;AACrD,QAAM,eAAe;AACrB,QAAM,UAAU,QAAQ,MAAM,YAAY;AAC1C,QAAM,cAAc;AAEpB,QAAM,QAAQ,UACV,QAAQ,IAAI,CAAC,UAAU;AACrB,UAAM,IAAI,YAAY,KAAK,KAAK;AAChC,WAAO,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,EACzB,CAAC,IACD,CAAC;AAEL,SAAO,MAAM,KAAK;AACpB;;;AC+GO,IAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeT,SAAUC,OAAM;AACd,QAAIA,UAAS,QAAQA,UAAS,QAAW;AACvC,aAAOC;AAAA,IACT;AAEA,QAAI,OAAOD,UAAS,UAAU;AAC5B,aAAO,eAAeA,KAAI;AAAA,IAC5B;AAGA,QAAI,OAAOA,UAAS,UAAU;AAC5B,aAAOE,YAAWF,KAAI;AAAA,IACxB;AAEA,QAAI,OAAOA,UAAS,YAAY;AAC9B,aAAOG,aAAYH,KAAI;AAAA,IACzB;AAEA,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAAA;AASJ,SAASE,YAAW,OAAO;AAEzB,QAAME,UAAS,CAAC;AAChB,MAAIC,SAAQ;AAEZ,SAAO,EAAEA,SAAQ,MAAM,QAAQ;AAC7B,IAAAD,QAAOC,MAAK,IAAI,eAAe,MAAMA,MAAK,CAAC;AAAA,EAC7C;AAEA,SAAOF,aAAY,GAAG;AAMtB,WAAS,OAAO,YAAY;AAC1B,QAAIE,SAAQ;AAEZ,WAAO,EAAEA,SAAQD,QAAO,QAAQ;AAC9B,UAAIA,QAAOC,MAAK,EAAE,MAAM,MAAM,UAAU,EAAG,QAAO;AAAA,IACpD;AAEA,WAAO;AAAA,EACT;AACF;AAQA,SAAS,eAAe,OAAO;AAC7B,SAAOF,aAAY,OAAO;AAM1B,WAAS,QAAQF,UAAS;AACxB,WAAOA,SAAQ,YAAY;AAAA,EAC7B;AACF;AAQA,SAASE,aAAY,cAAc;AACjC,SAAO;AAMP,WAAS,MAAM,OAAOE,QAAO,QAAQ;AACnC,WAAO;AAAA,MACL,mBAAmB,KAAK,KACtB,aAAa;AAAA,QACX;AAAA,QACA;AAAA,QACA,OAAOA,WAAU,WAAWA,SAAQ;AAAA,QACpC,UAAU;AAAA,MACZ;AAAA,IACJ;AAAA,EACF;AACF;AAQA,SAASJ,SAAQA,UAAS;AACxB,SAAO;AAAA,IACLA,YACE,OAAOA,aAAY,YACnB,UAAUA,YACVA,SAAQ,SAAS,aACjB,aAAaA,YACb,OAAOA,SAAQ,YAAY;AAAA,EAC/B;AACF;AAMA,SAAS,mBAAmB,OAAO;AACjC,SACE,UAAU,QACV,OAAO,UAAU,YACjB,UAAU,SACV,aAAa;AAEjB;;;ACrRe,SAAR,mBAAoCK,SAAQ;AAClD,MAAI,OAAOA,YAAW,UAAU;AAC/B,UAAM,IAAI,UAAU,mBAAmB;AAAA,EACxC;AAIA,SAAOA,QACL,QAAQ,uBAAuB,MAAM,EACrC,QAAQ,MAAM,OAAO;AACxB;;;ACwDA,IAAMC,gBAAe,CAAC;AASf,IAAM,gBAAgB,CAAC,QAAQ,UAAU,SAAS,OAAO,OAAO;AAkBhE,SAAS,eAAe,MAAMC,OAAM,SAAS;AAClD,QAAM,WAAW,WAAWD;AAC5B,QAAM,UAAU,eAAe,SAAS,UAAU,aAAa;AAC/D,QAAM,QAAQ,QAAQC,KAAI;AAC1B,MAAI,YAAY;AAEhB,SAAO,EAAE,YAAY,MAAM,QAAQ;AACjC,iBAAa,MAAM,QAAQC,QAAO;AAAA,EACpC;AAGA,WAASA,SAAQC,OAAM,SAAS;AAC9B,QAAIC,SAAQ;AAEZ,QAAI;AAEJ,WAAO,EAAEA,SAAQ,QAAQ,QAAQ;AAC/B,YAAM,SAAS,QAAQA,MAAK;AAE5B,YAAM,WAAW,cAAc,YAAY,WAAW;AAEtD,UACE;AAAA,QACE;AAAA,QACA,WAAW,SAAS,QAAQ,MAAM,IAAI;AAAA,QACtC;AAAA,MACF,GACA;AACA;AAAA,MACF;AAEA,oBAAc;AAAA,IAChB;AAEA,QAAI,aAAa;AACf,aAAO,QAAQD,OAAM,OAAO;AAAA,IAC9B;AAAA,EACF;AAYA,WAAS,QAAQA,OAAM,SAAS;AAC9B,UAAM,SAAS,QAAQ,QAAQ,SAAS,CAAC;AACzC,UAAME,QAAO,MAAM,SAAS,EAAE,CAAC;AAC/B,UAAMC,WAAU,MAAM,SAAS,EAAE,CAAC;AAClC,QAAIC,SAAQ;AAEZ,UAAM,WAAW,OAAO;AACxB,UAAMH,SAAQ,SAAS,QAAQD,KAAI;AACnC,QAAI,SAAS;AAEb,QAAI,QAAQ,CAAC;AAEb,IAAAE,MAAK,YAAY;AAEjB,QAAI,QAAQA,MAAK,KAAKF,MAAK,KAAK;AAEhC,WAAO,OAAO;AACZ,YAAMK,YAAW,MAAM;AAEvB,YAAM,cAAc;AAAA,QAClB,OAAO,MAAM;AAAA,QACb,OAAO,MAAM;AAAA,QACb,OAAO,CAAC,GAAG,SAASL,KAAI;AAAA,MAC1B;AACA,UAAI,QAAQG,SAAQ,GAAG,OAAO,WAAW;AAEzC,UAAI,OAAO,UAAU,UAAU;AAC7B,gBAAQ,MAAM,SAAS,IAAI,EAAC,MAAM,QAAQ,MAAK,IAAI;AAAA,MACrD;AAGA,UAAI,UAAU,OAAO;AAInB,QAAAD,MAAK,YAAYG,YAAW;AAAA,MAC9B,OAAO;AACL,YAAID,WAAUC,WAAU;AACtB,gBAAM,KAAK,EAAC,MAAM,QAAQ,OAAOL,MAAK,MAAM,MAAMI,QAAOC,SAAQ,EAAC,CAAC;AAAA,QACrE;AAEA,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,gBAAM,KAAK,GAAG,KAAK;AAAA,QACrB,WAAW,OAAO;AAChB,gBAAM,KAAK,KAAK;AAAA,QAClB;AAEA,QAAAD,SAAQC,YAAW,MAAM,CAAC,EAAE;AAC5B,iBAAS;AAAA,MACX;AAEA,UAAI,CAACH,MAAK,QAAQ;AAChB;AAAA,MACF;AAEA,cAAQA,MAAK,KAAKF,MAAK,KAAK;AAAA,IAC9B;AAEA,QAAI,QAAQ;AACV,UAAII,SAAQJ,MAAK,MAAM,QAAQ;AAC7B,cAAM,KAAK,EAAC,MAAM,QAAQ,OAAOA,MAAK,MAAM,MAAMI,MAAK,EAAC,CAAC;AAAA,MAC3D;AAEA,aAAO,SAAS,OAAOH,QAAO,GAAG,GAAG,KAAK;AAAA,IAC3C,OAAO;AACL,cAAQ,CAACD,KAAI;AAAA,IACf;AAEA,WAAOC,SAAQ,MAAM;AAAA,EACvB;AACF;AAUA,SAAS,QAAQ,aAAa;AAE5B,QAAM,SAAS,CAAC;AAEhB,MAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,UAAM,IAAI,UAAU,mDAAmD;AAAA,EACzE;AAIA,QAAMH,QACJ,CAAC,YAAY,CAAC,KAAK,MAAM,QAAQ,YAAY,CAAC,CAAC,IAC3C,cACA,CAAC,WAAW;AAElB,MAAIG,SAAQ;AAEZ,SAAO,EAAEA,SAAQH,MAAK,QAAQ;AAC5B,UAAM,QAAQA,MAAKG,MAAK;AACxB,WAAO,KAAK,CAAC,aAAa,MAAM,CAAC,CAAC,GAAG,WAAW,MAAM,CAAC,CAAC,CAAC,CAAC;AAAA,EAC5D;AAEA,SAAO;AACT;AAUA,SAAS,aAAaC,OAAM;AAC1B,SAAO,OAAOA,UAAS,WAAW,IAAI,OAAO,mBAAOA,KAAI,GAAG,GAAG,IAAIA;AACpE;AAUA,SAAS,WAAWC,UAAS;AAC3B,SAAO,OAAOA,aAAY,aACtBA,WACA,WAAY;AACV,WAAOA;AAAA,EACT;AACN;;;ACtNO,SAAS,EAAE,MAAM,OAAO,OAAO;AAEpC,QAAMG,QAAO,EAAC,MAAM,OAAO,IAAI,EAAC;AAEhC,OACG,UAAU,UAAa,UAAU,UACjC,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,IACjD;AACA,YAAQ;AAAA,EACV,OAAO;AACL,WAAO,OAAOA,OAAM,KAAK;AAAA,EAC3B;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AAExB,IAAAA,MAAK,WAAW;AAAA,EAClB,WAAW,UAAU,UAAa,UAAU,MAAM;AAEhD,IAAAA,MAAK,QAAQ,OAAO,KAAK;AAAA,EAC3B;AAEA,SAAOA;AACT;;;AC9EA,IAAAC,sBAAuB;AAIhB,IAAM,sBAAsB,MAAM;AACvC,QAAMC,WAA2B,CAAC,UAChC,EAAE,WAAW,EAAE,YAAY,CAAC,GAAG,SAAS,QAAQ,GAAG,CAAC,EAAE,QAAQ,KAAK,CAAC,CAAC;AAEvE,QAAMC,aAAY,CAACC,UAAgB,eAAeA,OAAM,KAAC,oBAAAC,SAAW,GAAGH,QAAO,CAAC;AAE/E,SAAOC;AACT;;;ACJO,IAAM,yBAAyB,CAAC,oBAAoC,MAAM;AAC/E,QAAM,sBAAsB,gBACzB,IAAI,CAAC,SAAS,KAAK,QAAQ,KAAK,EAAE,EAClC,OAAO,OAAO,EACd,IAAI,YAAY;AAEnB,QAAM,sBAAsB,IAAI;AAAA,IAC9B,oBAAoB,IAAI,CAAC,aAAa,IAAI,QAAQ,EAAE,EAAE,KAAK,GAAG;AAAA,IAC9D;AAAA,EACF;AAEA,QAAMG,WAA2B,CAAC,UAAU;AAC1C,UAAM,eAAe,MAAM,QAAQ,KAAK,EAAE;AAC1C,UAAM,OAAO,gBAAgB;AAAA,MAC3B,CAAC,EAAE,IAAI,MAAAC,MAAK,MAAMA,UAAS,gBAAgB,OAAO;AAAA,IACpD;AACA,WAAO,EAAE,WAAW,EAAE,eAAe,MAAM,YAAY,CAAC,GAAG,SAAS,UAAU,GAAG;AAAA,MAC/E,EAAE,QAAQ,KAAK;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,QAAMC,aAAY,CAAC,SAAgB;AACjC,QAAI,CAAC,oBAAoB,OAAQ;AAQjC,UAAM,MAAM,CAACC,OAAMC,QAAO,WAAW;AACnC,UAAI,OAAOA,WAAU,YAAa;AAClC,UAAI,CAAC,OAAQ;AAEb,YAAM,YAAY,OAAO,SAAS,GAAGA,SAAQ,CAAC;AAC9C,YAAM,gBAAgB,WAAW,YAAY;AAE7C,UACED,MAAK,SAAS;AAAA;AAAA;AAAA;AAAA,MAKd,cAAc,KAAKA,MAAK,KAAK,KAC7B,eAAe,WAAW,SAAS,GACnC;AACA,cAAM,eAAeA,MAAK,MAAM,QAAQ,MAAM,EAAE;AAChD,cAAM,WAAW,cAAc,QAAQ,WAAW,EAAE;AACpD,eAAO,SAASC,MAAK,IAAI,EAAE,QAAQ,YAAY;AAC/C,eAAO,SAASA,SAAQ,CAAC,IAAI,EAAE,QAAQ,IAAI,QAAQ,EAAE;AAAA,MACvD;AAAA,IACF,CAAC;AAED,mBAAe,MAAM,CAAC,qBAAqBJ,QAAO,CAAC;AAAA,EACrD;AAEA,SAAOE;AACT;;;AC9DA,IAAM,UAAmB,CAACG,UAAS;AACjC,MAAIA,MAAK,SAAS,OAAQ;AAE1B,EAAAA,MAAK,OAAO;AACd;AACA,IAAM,YAAY,CAAC,SAAgB;AACjC,QAAM,MAAM,OAAO;AACrB;AAEO,IAAM,mBAAmB,MAAM;;;ACAtC,IAAMC,QAAO,CAAC,WAAyB,EAAE,MAAM,QAAQ,MAAM;AAStD,SAAS,YAAY,EAAE,mBAAmB,MAAM,IAA8B,CAAC,GAAG;AACvF,SAAO,CAAC,SAAe;AACrB,UAAMC,WAAsB,CAACC,OAAMC,QAAO,WAAW;AACnD,UAAI,UAAU,QAAQA,UAAS,KAAM;AAErC,YAAM,QAAQD,MAAK,gBAAgB,KAAKA,MAAK;AAC7C,YAAME,QAAa;AAAA,QACjB,UAAU,CAACJ,MAAK,KAAK,CAAC;AAAA,QACtB,OAAOE,MAAK,SAASA,MAAK,OAAOA,MAAK;AAAA,QACtC,MAAM;AAAA,QACN,KAAKA,MAAK;AAAA,MACZ;AAEA,aAAO,SAAS,OAAOC,QAAO,GAAGC,KAAI;AACrC,aAAO,CAAC,MAAMD,SAAQ,CAAC;AAAA,IACzB;AAEA,UAAM,MAAM,SAASF,QAAO;AAAA,EAC9B;AACF;;;ACpCA,SAAS,qBACPI,OACmD;AACnD,QAAM,QAAQA;AACd,SAAO,MAAM,QAAQ,MAAM,QAAQ;AACrC;AAGA,SAAS,SAAwB;AAC/B,SAAO,EAAE,MAAM,EAAE,OAAO,KAAK,GAAG,MAAM,gBAAgB;AACxD;AASO,IAAM,uBAAyC,MAAM,CAAC,SAAS;AACpE;AAAA,IACE;AAAA;AAAA,IACA;AAAA;AAAA,IACA,CAAC,WAAW;AACV,YAAM,WAAW,OAAO;AACxB,UAAI,SAAS,SAAS,EAAG;AAEzB,YAAM,MAAqB,CAAC;AAE5B,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,cAAM,OAAO,SAAS,CAAC;AACvB,YAAI,KAAK,IAAI;AAEb,YAAI,MAAM,SAAS,SAAS,EAAG;AAE/B,cAAM,OAAO,SAAS,IAAI,CAAC;AAE3B,cAAM,cACJ,KAAK,YAAY,KAAK,SAAS,MAAM,KAAK,SAAS,IAAI,OAAO;AAChE,cAAM,gBACJ,KAAK,YAAY,KAAK,SAAS,QAAQ,KAAK,SAAS,MAAM,OAAO;AAEpE,YAAI,OAAO,gBAAgB,YAAY,OAAO,kBAAkB,UAAU;AACxE;AAAA,QACF;AAIA,cAAM,kBAAkB,KAAK,IAAI,GAAG,gBAAgB,cAAc,CAAC;AACnE,YAAI,kBAAkB,GAAG;AACvB,mBAAS,IAAI,GAAG,IAAI,iBAAiB,KAAK;AACxC,gBAAI,KAAK,OAAO,CAAC;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAEA,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACF;;;AC/CA,IAAM,YAAY;AAClB,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,qBAAiC,MAAM;AAClD,QAAMC,WAAmB,CAACC,OAAMC,QAAO,WAAW;AAEhD,QAAI,kBAAkB,IAAID,MAAK,IAAI,EAAG,QAAO;AAG7C,QAAIA,MAAK,SAAS,UAAU,UAAU,QAAQ,OAAOC,WAAU,SAAU;AAEzE,UAAM,QAASD,MAAc;AAG7B,cAAU,YAAY;AAEtB,QAAI;AACJ,QAAI,OAAO;AACX,UAAM,MAAyB,CAAC;AAEhC,WAAQ,QAAQ,UAAU,KAAK,KAAK,GAAI;AACtC,YAAM,CAAC,MAAM,KAAK,IAAI;AACtB,YAAME,SAAQ,MAAM;AAEpB,UAAIA,SAAQ,KAAM,KAAI,KAAK,EAAE,MAAM,QAAQ,OAAO,MAAM,MAAM,MAAMA,MAAK,EAAE,CAAC;AAG5E,UAAI,KAAK;AAAA,QACP,UAAU,CAAC,EAAE,MAAM,QAAQ,OAAO,MAAM,CAAC;AAAA,QACzC,MAAM,EAAE,OAAO,MAAM;AAAA,QACrB,MAAM;AAAA,MACR,CAAC;AAED,aAAOA,SAAQ,KAAK;AAAA,IACtB;AAEA,QAAI,IAAI,WAAW,EAAG;AACtB,QAAI,OAAO,MAAM,OAAQ,KAAI,KAAK,EAAE,MAAM,QAAQ,OAAO,MAAM,MAAM,IAAI,EAAE,CAAC;AAE5E,IAAC,OAAkB,SAAS,OAAOD,QAAO,GAAG,GAAG,GAAG;AAGnD,WAAO,CAAC,MAAMA,SAAQ,IAAI,MAAM;AAAA,EAClC;AAEA,SAAO,CAAC,SAAS,MAAM,MAAMF,QAAO;AACtC;;;ACpEO,IAAM,uBAAyC,MAAM,CAAC,MAAM,SAAS;AAC1E,QAAM,SAAS,OAAO,KAAK,SAAS,EAAE;AAEtC,QAAMI,QAAa,EAAE,MAAM,QAAQ,OAAO,OAAO;AACjD,QAAMC,aAAuB,EAAE,UAAU,CAACD,KAAI,GAAG,MAAM,YAAY;AAEnE,OAAK,WAAW,CAACC,UAAS;AAC5B;;;ACfA,IAAAC,kBAAkB;AAElB,uBAAqB;;;ACQd,SAAS,OAAO,OAAO,WAAW;AACvC,QAAM,SAAS,OAAO,KAAK;AAE3B,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM,IAAI,UAAU,oBAAoB;AAAA,EAC1C;AAEA,MAAI,QAAQ;AACZ,MAAIC,SAAQ,OAAO,QAAQ,SAAS;AAEpC,SAAOA,WAAU,IAAI;AACnB;AACA,IAAAA,SAAQ,OAAO,QAAQ,WAAWA,SAAQ,UAAU,MAAM;AAAA,EAC5D;AAEA,SAAO;AACT;;;AC1Be,SAARC,oBAAoCC,SAAQ;AAClD,MAAI,OAAOA,YAAW,UAAU;AAC/B,UAAM,IAAI,UAAU,mBAAmB;AAAA,EACxC;AAIA,SAAOA,QACL,QAAQ,uBAAuB,MAAM,EACrC,QAAQ,MAAM,OAAO;AACxB;;;ACmEO,SAASC,gBAAe,MAAMC,OAAM,SAAS;AAClD,QAAM,WAAW,WAAW,CAAC;AAC7B,QAAM,UAAU,QAAQ,SAAS,UAAU,CAAC,CAAC;AAC7C,QAAM,QAAQC,SAAQD,KAAI;AAC1B,MAAI,YAAY;AAEhB,SAAO,EAAE,YAAY,MAAM,QAAQ;AACjC,iBAAa,MAAM,QAAQE,QAAO;AAAA,EACpC;AAGA,WAASA,SAAQC,OAAM,SAAS;AAC9B,QAAIC,SAAQ;AAEZ,QAAI;AAEJ,WAAO,EAAEA,SAAQ,QAAQ,QAAQ;AAC/B,YAAM,SAAS,QAAQA,MAAK;AAE5B,YAAM,WAAW,cAAc,YAAY,WAAW;AAEtD,UACE;AAAA,QACE;AAAA,QACA,WAAW,SAAS,QAAQ,MAAM,IAAI;AAAA,QACtC;AAAA,MACF,GACA;AACA;AAAA,MACF;AAEA,oBAAc;AAAA,IAChB;AAEA,QAAI,aAAa;AACf,aAAO,QAAQD,OAAM,OAAO;AAAA,IAC9B;AAAA,EACF;AAYA,WAAS,QAAQA,OAAM,SAAS;AAC9B,UAAM,SAAS,QAAQ,QAAQ,SAAS,CAAC;AACzC,UAAME,QAAO,MAAM,SAAS,EAAE,CAAC;AAC/B,UAAMC,WAAU,MAAM,SAAS,EAAE,CAAC;AAClC,QAAIC,SAAQ;AAEZ,UAAM,WAAW,OAAO;AACxB,UAAMH,SAAQ,SAAS,QAAQD,KAAI;AACnC,QAAI,SAAS;AAEb,QAAI,QAAQ,CAAC;AAEb,IAAAE,MAAK,YAAY;AAEjB,QAAI,QAAQA,MAAK,KAAKF,MAAK,KAAK;AAEhC,WAAO,OAAO;AACZ,YAAMK,YAAW,MAAM;AAEvB,YAAM,cAAc;AAAA,QAClB,OAAO,MAAM;AAAA,QACb,OAAO,MAAM;AAAA,QACb,OAAO,CAAC,GAAG,SAASL,KAAI;AAAA,MAC1B;AACA,UAAI,QAAQG,SAAQ,GAAG,OAAO,WAAW;AAEzC,UAAI,OAAO,UAAU,UAAU;AAC7B,gBAAQ,MAAM,SAAS,IAAI,EAAC,MAAM,QAAQ,MAAK,IAAI;AAAA,MACrD;AAGA,UAAI,UAAU,OAAO;AAInB,QAAAD,MAAK,YAAYG,YAAW;AAAA,MAC9B,OAAO;AACL,YAAID,WAAUC,WAAU;AACtB,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,OAAOL,MAAK,MAAM,MAAMI,QAAOC,SAAQ;AAAA,UACzC,CAAC;AAAA,QACH;AAEA,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,gBAAM,KAAK,GAAG,KAAK;AAAA,QACrB,WAAW,OAAO;AAChB,gBAAM,KAAK,KAAK;AAAA,QAClB;AAEA,QAAAD,SAAQC,YAAW,MAAM,CAAC,EAAE;AAC5B,iBAAS;AAAA,MACX;AAEA,UAAI,CAACH,MAAK,QAAQ;AAChB;AAAA,MACF;AAEA,cAAQA,MAAK,KAAKF,MAAK,KAAK;AAAA,IAC9B;AAEA,QAAI,QAAQ;AACV,UAAII,SAAQJ,MAAK,MAAM,QAAQ;AAC7B,cAAM,KAAK,EAAC,MAAM,QAAQ,OAAOA,MAAK,MAAM,MAAMI,MAAK,EAAC,CAAC;AAAA,MAC3D;AAEA,aAAO,SAAS,OAAOH,QAAO,GAAG,GAAG,KAAK;AAAA,IAC3C,OAAO;AACL,cAAQ,CAACD,KAAI;AAAA,IACf;AAEA,WAAOC,SAAQ,MAAM;AAAA,EACvB;AACF;AAUA,SAASH,SAAQ,aAAa;AAE5B,QAAM,SAAS,CAAC;AAEhB,MAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,UAAM,IAAI,UAAU,mDAAmD;AAAA,EACzE;AAIA,QAAMD,QACJ,CAAC,YAAY,CAAC,KAAK,MAAM,QAAQ,YAAY,CAAC,CAAC,IAC3C,cACA,CAAC,WAAW;AAElB,MAAII,SAAQ;AAEZ,SAAO,EAAEA,SAAQJ,MAAK,QAAQ;AAC5B,UAAM,QAAQA,MAAKI,MAAK;AACxB,WAAO,KAAK,CAACK,cAAa,MAAM,CAAC,CAAC,GAAGC,YAAW,MAAM,CAAC,CAAC,CAAC,CAAC;AAAA,EAC5D;AAEA,SAAO;AACT;AAUA,SAASD,cAAaJ,OAAM;AAC1B,SAAO,OAAOA,UAAS,WAAW,IAAI,OAAOM,oBAAON,KAAI,GAAG,GAAG,IAAIA;AACpE;AAUA,SAASK,YAAWJ,UAAS;AAC3B,SAAO,OAAOA,aAAY,aACtBA,WACA,WAAY;AACV,WAAOA;AAAA,EACT;AACN;;;ACvPA,IAAM,cAAc;AAEpB,IAAM,iBAAiB,CAAC,YAAY,QAAQ,SAAS,OAAO;AASrD,SAAS,iCAAiC;AAC/C,SAAO;AAAA,IACL,YAAY,CAAC,4BAA4B;AAAA,IACzC,OAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,MACtB,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,IACtB;AAAA,IACA,MAAM;AAAA,MACJ,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,MACtB,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,IACtB;AAAA,EACF;AACF;AASO,SAAS,+BAA+B;AAC7C,SAAO;AAAA,IACL,QAAQ;AAAA,MACN;AAAA,QACE,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,OAAO;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,OAAO;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,OAAO;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,qBAAqB,OAAO;AACnC,OAAK,MAAM,EAAC,MAAM,QAAQ,OAAO,MAAM,KAAK,IAAI,UAAU,CAAC,EAAC,GAAG,KAAK;AACtE;AAMA,SAAS,0BAA0B,OAAO;AACxC,OAAK,OAAO,MAAM,iBAAiB,KAAK,MAAM,KAAK;AACrD;AAMA,SAAS,wBAAwB,OAAO;AACtC,OAAK,OAAO,KAAK,iBAAiB,KAAK,MAAM,KAAK;AACpD;AAMA,SAAS,uBAAuB,OAAO;AACrC,OAAK,OAAO,KAAK,KAAK,KAAK,MAAM,KAAK;AACtC,QAAMM,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,KAAOA,MAAK,SAAS,MAAM;AAC3B,EAAAA,MAAK,MAAM,YAAY,KAAK,eAAe,KAAK;AAClD;AAMA,SAAS,yBAAyB,OAAO;AACvC,OAAK,OAAO,KAAK,cAAc,KAAK,MAAM,KAAK;AACjD;AAMA,SAAS,oBAAoB,OAAO;AAClC,OAAK,KAAK,KAAK;AACjB;AAGA,SAAS,6BAA6B,MAAM;AAC1C,EAAAC;AAAA,IACE;AAAA,IACA;AAAA,MACE,CAAC,mDAAmD,OAAO;AAAA,MAC3D,CAAC,2DAA2D,SAAS;AAAA,IACvE;AAAA,IACA,EAAC,QAAQ,CAAC,QAAQ,eAAe,EAAC;AAAA,EACpC;AACF;AAYA,SAAS,QAAQ,GAAG,UAAUC,SAAQC,OAAM,OAAO;AACjD,MAAI,SAAS;AAGb,MAAI,CAACC,UAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAGA,MAAI,MAAM,KAAK,QAAQ,GAAG;AACxB,IAAAF,UAAS,WAAWA;AACpB,eAAW;AACX,aAAS;AAAA,EACX;AAEA,MAAI,CAAC,gBAAgBA,OAAM,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,SAASA,UAASC,KAAI;AAEpC,MAAI,CAAC,MAAM,CAAC,EAAG,QAAO;AAGtB,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK,SAAS,WAAW,MAAM,CAAC;AAAA,IAChC,UAAU,CAAC,EAAC,MAAM,QAAQ,OAAO,WAAW,MAAM,CAAC,EAAC,CAAC;AAAA,EACvD;AAEA,MAAI,MAAM,CAAC,GAAG;AACZ,WAAO,CAAC,QAAQ,EAAC,MAAM,QAAQ,OAAO,MAAM,CAAC,EAAC,CAAC;AAAA,EACjD;AAEA,SAAO;AACT;AAUA,SAAS,UAAU,GAAG,OAAO,OAAO,OAAO;AACzC;AAAA;AAAA,IAEE,CAACC,UAAS,OAAO,IAAI;AAAA,IAErB,UAAU,KAAK,KAAK;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK,YAAY,QAAQ,MAAM;AAAA,IAC/B,UAAU,CAAC,EAAC,MAAM,QAAQ,OAAO,QAAQ,MAAM,MAAK,CAAC;AAAA,EACvD;AACF;AAMA,SAAS,gBAAgBF,SAAQ;AAC/B,QAAM,QAAQA,QAAO,MAAM,GAAG;AAE9B,MACE,MAAM,SAAS,KACd,MAAM,MAAM,SAAS,CAAC,MACpB,IAAI,KAAK,MAAM,MAAM,SAAS,CAAC,CAAC,KAC/B,CAAC,aAAa,KAAK,MAAM,MAAM,SAAS,CAAC,CAAC,MAC7C,MAAM,MAAM,SAAS,CAAC,MACpB,IAAI,KAAK,MAAM,MAAM,SAAS,CAAC,CAAC,KAC/B,CAAC,aAAa,KAAK,MAAM,MAAM,SAAS,CAAC,CAAC,IAC9C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAMA,SAAS,SAAS,KAAK;AACrB,QAAM,YAAY,sBAAsB,KAAK,GAAG;AAEhD,MAAI,CAAC,WAAW;AACd,WAAO,CAAC,KAAK,MAAS;AAAA,EACxB;AAEA,QAAM,IAAI,MAAM,GAAG,UAAU,KAAK;AAElC,MAAIG,SAAQ,UAAU,CAAC;AACvB,MAAI,oBAAoBA,OAAM,QAAQ,GAAG;AACzC,QAAM,gBAAgB,OAAO,KAAK,GAAG;AACrC,MAAI,gBAAgB,OAAO,KAAK,GAAG;AAEnC,SAAO,sBAAsB,MAAM,gBAAgB,eAAe;AAChE,WAAOA,OAAM,MAAM,GAAG,oBAAoB,CAAC;AAC3C,IAAAA,SAAQA,OAAM,MAAM,oBAAoB,CAAC;AACzC,wBAAoBA,OAAM,QAAQ,GAAG;AACrC;AAAA,EACF;AAEA,SAAO,CAAC,KAAKA,MAAK;AACpB;AAOA,SAASD,UAAS,OAAO,OAAO;AAC9B,QAAME,QAAO,MAAM,MAAM,WAAW,MAAM,QAAQ,CAAC;AAEnD,UACG,MAAM,UAAU,KACf,kBAAkBA,KAAI,KACtB,mBAAmBA,KAAI;AAAA,GAExB,CAAC,SAASA,UAAS;AAExB;;;ACrQAC,mBAAkB,OAAO;AAMzB,SAAS,0BAA0B;AACjC,OAAK,OAAO;AACd;AAMA,SAAS,kBAAkB,OAAO;AAChC,OAAK,MAAM,EAAC,MAAM,qBAAqB,YAAY,IAAI,OAAO,GAAE,GAAG,KAAK;AAC1E;AAMA,SAAS,qCAAqC;AAC5C,OAAK,OAAO;AACd;AAMA,SAAS,wBAAwB,OAAO;AACtC,OAAK;AAAA,IACH,EAAC,MAAM,sBAAsB,YAAY,IAAI,OAAO,IAAI,UAAU,CAAC,EAAC;AAAA,IACpE;AAAA,EACF;AACF;AAMA,SAAS,uBAAuB,OAAO;AACrC,QAAM,QAAQ,KAAK,OAAO;AAC1B,QAAMC,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,KAAOA,MAAK,SAAS,mBAAmB;AACxC,EAAAA,MAAK,aAAa;AAAA,IAChB,KAAK,eAAe,KAAK;AAAA,EAC3B,EAAE,YAAY;AACd,EAAAA,MAAK,QAAQ;AACf;AAMA,SAAS,iBAAiB,OAAO;AAC/B,OAAK,KAAK,KAAK;AACjB;AAMA,SAAS,kCAAkC,OAAO;AAChD,QAAM,QAAQ,KAAK,OAAO;AAC1B,QAAMA,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,KAAOA,MAAK,SAAS,oBAAoB;AACzC,EAAAA,MAAK,aAAa;AAAA,IAChB,KAAK,eAAe,KAAK;AAAA,EAC3B,EAAE,YAAY;AACd,EAAAA,MAAK,QAAQ;AACf;AAMA,SAAS,uBAAuB,OAAO;AACrC,OAAK,KAAK,KAAK;AACjB;AAGA,SAAS,wBAAwB;AAC/B,SAAO;AACT;AAMA,SAASD,mBAAkBC,OAAM,GAAG,OAAO,MAAM;AAC/C,QAAM,UAAU,MAAM,cAAc,IAAI;AACxC,MAAI,QAAQ,QAAQ,KAAK,IAAI;AAC7B,QAAMC,QAAO,MAAM,MAAM,mBAAmB;AAC5C,QAAM,UAAU,MAAM,MAAM,WAAW;AACvC,WAAS,QAAQ;AAAA,IACf,MAAM,KAAK,MAAM,cAAcD,KAAI,GAAG,EAAC,OAAO,KAAK,QAAQ,MAAK,CAAC;AAAA,EACnE;AACA,UAAQ;AACR,EAAAC,MAAK;AACL,WAAS,QAAQ,KAAK,GAAG;AACzB,SAAO;AACT;AASO,SAAS,0BAA0B;AACxC,SAAO;AAAA,IACL,OAAO;AAAA,MACL,uBAAuB;AAAA,MACvB,iBAAiB;AAAA,MACjB,kCAAkC;AAAA,MAClC,uBAAuB;AAAA,IACzB;AAAA,IACA,MAAM;AAAA,MACJ,uBAAuB;AAAA,MACvB,iBAAiB;AAAA,MACjB,kCAAkC;AAAA,MAClC,uBAAuB;AAAA,IACzB;AAAA,EACF;AACF;AAWO,SAAS,sBAAsB,SAAS;AAE7C,MAAI,iBAAiB;AAErB,MAAI,WAAW,QAAQ,gBAAgB;AACrC,qBAAiB;AAAA,EACnB;AAEA,SAAO;AAAA,IACL,UAAU,EAAC,oBAAoB,mBAAAF,mBAAiB;AAAA;AAAA,IAEhD,QAAQ,CAAC,EAAC,WAAW,KAAK,aAAa,CAAC,SAAS,YAAY,WAAW,EAAC,CAAC;AAAA,EAC5E;AAMA,WAAS,mBAAmBC,OAAM,GAAG,OAAO,MAAM;AAChD,UAAM,UAAU,MAAM,cAAc,IAAI;AACxC,QAAI,QAAQ,QAAQ,KAAK,IAAI;AAC7B,UAAMC,QAAO,MAAM,MAAM,oBAAoB;AAC7C,UAAM,UAAU,MAAM,MAAM,OAAO;AACnC,aAAS,QAAQ;AAAA,MACf,MAAM,KAAK,MAAM,cAAcD,KAAI,GAAG,EAAC,QAAQ,OAAO,OAAO,IAAG,CAAC;AAAA,IACnE;AACA,YAAQ;AAER,aAAS,QAAQ,KAAK,IAAI;AAE1B,QAAIA,MAAK,YAAYA,MAAK,SAAS,SAAS,GAAG;AAC7C,cAAQ,MAAM,CAAC;AAEf,eAAS,QAAQ;AAAA,SACd,iBAAiB,OAAO,OACvB,MAAM;AAAA,UACJ,MAAM,cAAcA,OAAM,QAAQ,QAAQ,CAAC;AAAA,UAC3C,iBAAiB,SAAS;AAAA,QAC5B;AAAA,MACJ;AAAA,IACF;AAEA,IAAAC,MAAK;AAEL,WAAO;AAAA,EACT;AACF;AAGA,SAAS,eAAe,MAAMC,QAAO,OAAO;AAC1C,SAAOA,WAAU,IAAI,OAAO,OAAO,MAAMA,QAAO,KAAK;AACvD;AAGA,SAAS,OAAO,MAAMA,QAAO,OAAO;AAClC,UAAQ,QAAQ,KAAK,UAAU;AACjC;;;AC7LA,IAAM,iCAAiC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,aAAa,OAAO;AASb,SAAS,+BAA+B;AAC7C,SAAO;AAAA,IACL,gBAAgB,CAAC,QAAQ;AAAA,IACzB,OAAO,EAAC,eAAe,mBAAkB;AAAA,IACzC,MAAM,EAAC,eAAe,kBAAiB;AAAA,EACzC;AACF;AASO,SAAS,6BAA6B;AAC3C,SAAO;AAAA,IACL,QAAQ;AAAA,MACN;AAAA,QACE,WAAW;AAAA,QACX,aAAa;AAAA,QACb,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,UAAU,EAAC,QAAQ,aAAY;AAAA,EACjC;AACF;AAMA,SAAS,mBAAmB,OAAO;AACjC,OAAK,MAAM,EAAC,MAAM,UAAU,UAAU,CAAC,EAAC,GAAG,KAAK;AAClD;AAMA,SAAS,kBAAkB,OAAO;AAChC,OAAK,KAAK,KAAK;AACjB;AAMA,SAAS,aAAaC,OAAM,GAAG,OAAO,MAAM;AAC1C,QAAM,UAAU,MAAM,cAAc,IAAI;AACxC,QAAMC,QAAO,MAAM,MAAM,eAAe;AACxC,MAAI,QAAQ,QAAQ,KAAK,IAAI;AAC7B,WAAS,MAAM,kBAAkBD,OAAM;AAAA,IACrC,GAAG,QAAQ,QAAQ;AAAA,IACnB,QAAQ;AAAA,IACR,OAAO;AAAA,EACT,CAAC;AACD,WAAS,QAAQ,KAAK,IAAI;AAC1B,EAAAC,MAAK;AACL,SAAO;AACT;AAGA,SAAS,aAAa;AACpB,SAAO;AACT;;;ACiDO,SAAS,cAAcC,QAAO,UAAU,CAAC,GAAG;AACjD,QAAM,SAAS,QAAQ,SAAS,CAAC,GAAG,OAAO;AAC3C,QAAM,eAAe,QAAQ,gBAAgB;AAE7C,QAAM,aAAa,CAAC;AAEpB,QAAM,aAAa,CAAC;AAEpB,QAAM,aAAa,CAAC;AAEpB,QAAM,sBAAsB,CAAC;AAC7B,MAAI,kBAAkB;AACtB,MAAI,WAAW;AAIf,SAAO,EAAE,WAAWA,OAAM,QAAQ;AAEhC,UAAMC,OAAM,CAAC;AAEb,UAAMC,SAAQ,CAAC;AACf,QAAIC,eAAc;AAElB,QAAIH,OAAM,QAAQ,EAAE,SAAS,iBAAiB;AAC5C,wBAAkBA,OAAM,QAAQ,EAAE;AAAA,IACpC;AAEA,WAAO,EAAEG,eAAcH,OAAM,QAAQ,EAAE,QAAQ;AAC7C,YAAM,OAAOI,WAAUJ,OAAM,QAAQ,EAAEG,YAAW,CAAC;AAEnD,UAAI,QAAQ,oBAAoB,OAAO;AACrC,cAAM,OAAO,aAAa,IAAI;AAC9B,QAAAD,OAAMC,YAAW,IAAI;AAErB,YACE,oBAAoBA,YAAW,MAAM,UACrC,OAAO,oBAAoBA,YAAW,GACtC;AACA,8BAAoBA,YAAW,IAAI;AAAA,QACrC;AAAA,MACF;AAEA,MAAAF,KAAI,KAAK,IAAI;AAAA,IACf;AAEA,eAAW,QAAQ,IAAIA;AACvB,eAAW,QAAQ,IAAIC;AAAA,EACzB;AAGA,MAAI,cAAc;AAElB,MAAI,OAAO,UAAU,YAAY,YAAY,OAAO;AAClD,WAAO,EAAE,cAAc,iBAAiB;AACtC,iBAAW,WAAW,IAAI,YAAY,MAAM,WAAW,CAAC;AAAA,IAC1D;AAAA,EACF,OAAO;AACL,UAAMG,QAAO,YAAY,KAAK;AAE9B,WAAO,EAAE,cAAc,iBAAiB;AACtC,iBAAW,WAAW,IAAIA;AAAA,IAC5B;AAAA,EACF;AAGA,gBAAc;AAEd,QAAM,MAAM,CAAC;AAEb,QAAM,QAAQ,CAAC;AAEf,SAAO,EAAE,cAAc,iBAAiB;AACtC,UAAMA,QAAO,WAAW,WAAW;AACnC,QAAI,SAAS;AACb,QAAI,QAAQ;AAEZ,QAAIA,UAAS,IAAc;AACzB,eAAS;AACT,cAAQ;AAAA,IACV,WAAWA,UAAS,KAAe;AACjC,eAAS;AAAA,IACX,WAAWA,UAAS,KAAe;AACjC,cAAQ;AAAA,IACV;AAGA,QAAI,OACF,QAAQ,oBAAoB,QACxB,IACA,KAAK;AAAA,MACH;AAAA,MACA,oBAAoB,WAAW,IAAI,OAAO,SAAS,MAAM;AAAA,IAC3D;AAEN,UAAM,OAAO,SAAS,IAAI,OAAO,IAAI,IAAI;AAEzC,QAAI,QAAQ,oBAAoB,OAAO;AACrC,aAAO,OAAO,SAAS,OAAO,MAAM;AAEpC,UAAI,OAAO,oBAAoB,WAAW,GAAG;AAC3C,4BAAoB,WAAW,IAAI;AAAA,MACrC;AAEA,YAAM,WAAW,IAAI;AAAA,IACvB;AAEA,QAAI,WAAW,IAAI;AAAA,EACrB;AAGA,aAAW,OAAO,GAAG,GAAG,GAAG;AAC3B,aAAW,OAAO,GAAG,GAAG,KAAK;AAE7B,aAAW;AAEX,QAAM,QAAQ,CAAC;AAEf,SAAO,EAAE,WAAW,WAAW,QAAQ;AACrC,UAAMJ,OAAM,WAAW,QAAQ;AAC/B,UAAMC,SAAQ,WAAW,QAAQ;AACjC,kBAAc;AAEd,UAAM,OAAO,CAAC;AAEd,WAAO,EAAE,cAAc,iBAAiB;AACtC,YAAM,OAAOD,KAAI,WAAW,KAAK;AACjC,UAAI,SAAS;AACb,UAAI,QAAQ;AAEZ,UAAI,QAAQ,oBAAoB,OAAO;AACrC,cAAM,OACJ,oBAAoB,WAAW,KAAKC,OAAM,WAAW,KAAK;AAC5D,cAAMG,QAAO,WAAW,WAAW;AAEnC,YAAIA,UAAS,KAAe;AAC1B,mBAAS,IAAI,OAAO,IAAI;AAAA,QAC1B,WAAWA,UAAS,IAAc;AAChC,cAAI,OAAO,GAAG;AACZ,qBAAS,IAAI,OAAO,OAAO,IAAI,GAAG;AAClC,oBAAQ,IAAI,OAAO,OAAO,IAAI,GAAG;AAAA,UACnC,OAAO;AACL,qBAAS,IAAI,OAAO,OAAO,CAAC;AAC5B,oBAAQ;AAAA,UACV;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,OAAO,IAAI;AAAA,QACzB;AAAA,MACF;AAEA,UAAI,QAAQ,mBAAmB,SAAS,CAAC,aAAa;AACpD,aAAK,KAAK,GAAG;AAAA,MACf;AAEA,UACE,QAAQ,YAAY;AAAA;AAAA,MAGpB,EAAE,QAAQ,oBAAoB,SAAS,SAAS,QAC/C,QAAQ,mBAAmB,SAAS,cACrC;AACA,aAAK,KAAK,GAAG;AAAA,MACf;AAEA,UAAI,QAAQ,oBAAoB,OAAO;AACrC,aAAK,KAAK,MAAM;AAAA,MAClB;AAEA,WAAK,KAAK,IAAI;AAEd,UAAI,QAAQ,oBAAoB,OAAO;AACrC,aAAK,KAAK,KAAK;AAAA,MACjB;AAEA,UAAI,QAAQ,YAAY,OAAO;AAC7B,aAAK,KAAK,GAAG;AAAA,MACf;AAEA,UACE,QAAQ,iBAAiB,SACzB,gBAAgB,kBAAkB,GAClC;AACA,aAAK,KAAK,GAAG;AAAA,MACf;AAAA,IACF;AAEA,UAAM;AAAA,MACJ,QAAQ,iBAAiB,QACrB,KAAK,KAAK,EAAE,EAAE,QAAQ,OAAO,EAAE,IAC/B,KAAK,KAAK,EAAE;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAMA,SAASD,WAAU,OAAO;AACxB,SAAO,UAAU,QAAQ,UAAU,SAAY,KAAK,OAAO,KAAK;AAClE;AAMA,SAAS,oBAAoB,OAAO;AAClC,SAAO,MAAM;AACf;AAMA,SAAS,YAAY,OAAO;AAC1B,QAAMC,QAAO,OAAO,UAAU,WAAW,MAAM,YAAY,CAAC,IAAI;AAEhE,SAAOA,UAAS,MAAgBA,UAAS,KACrC,KACAA,UAAS,MAAgBA,UAAS,MAClC,MACAA,UAAS,MAAgBA,UAAS,MAClC,MACA;AACN;;;AC/WO,SAASC,YAAWC,OAAM,GAAG,OAAO,MAAM;AAC/C,QAAMC,QAAO,MAAM,MAAM,YAAY;AACrC,QAAM,UAAU,MAAM,cAAc,IAAI;AACxC,UAAQ,KAAK,IAAI;AACjB,UAAQ,MAAM,CAAC;AACf,QAAM,QAAQ,MAAM;AAAA,IAClB,MAAM,cAAcD,OAAM,QAAQ,QAAQ,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,EAAAC,MAAK;AACL,SAAO;AACT;AAGA,SAAS,IAAI,MAAM,GAAG,OAAO;AAC3B,SAAO,OAAO,QAAQ,KAAK,OAAO;AACpC;;;ACnBO,SAAS,eAAe,OAAO,SAAS;AAC7C,SACE,YAAY,OAAO,QAAQ,aAAa,IAAI,KAC5C,CAAC,YAAY,OAAO,QAAQ,gBAAgB,KAAK;AAErD;AAQA,SAAS,YAAY,OAAOC,OAAM,MAAM;AACtC,MAAI,OAAOA,UAAS,UAAU;AAC5B,IAAAA,QAAO,CAACA,KAAI;AAAA,EACd;AAEA,MAAI,CAACA,SAAQA,MAAK,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,MAAIC,SAAQ;AAEZ,SAAO,EAAEA,SAAQD,MAAK,QAAQ;AAC5B,QAAI,MAAM,SAASA,MAAKC,MAAK,CAAC,GAAG;AAC/B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;AC1BO,SAASC,WAAU,GAAG,IAAI,OAAO,MAAM;AAC5C,MAAIC,SAAQ;AAEZ,SAAO,EAAEA,SAAQ,MAAM,OAAO,QAAQ;AAGpC,QACE,MAAM,OAAOA,MAAK,EAAE,cAAc,QAClC,eAAe,MAAM,OAAO,MAAM,OAAOA,MAAK,CAAC,GAC/C;AACA,aAAO,QAAQ,KAAK,KAAK,MAAM,IAAI,KAAK;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO;AACT;;;ACnBO,SAAS,cAAc,OAAO,WAAW;AAC9C,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAIC,SAAQ,OAAO,QAAQ,SAAS;AACpC,MAAI,WAAWA;AACf,MAAI,QAAQ;AACZ,MAAI,MAAM;AAEV,MAAI,OAAO,cAAc,YAAY,UAAU,WAAW,GAAG;AAC3D,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACtC;AAEA,SAAOA,WAAU,IAAI;AACnB,QAAIA,WAAU,UAAU;AACtB,UAAI,EAAE,QAAQ,KAAK;AACjB,cAAM;AAAA,MACR;AAAA,IACF,OAAO;AACL,cAAQ;AAAA,IACV;AAEA,eAAWA,SAAQ;AACnB,IAAAA,SAAQ,OAAO,QAAQ,WAAW,QAAQ;AAAA,EAC5C;AAEA,SAAO;AACT;;;ACzBO,SAAS,qBAAqBC,OAAM,OAAO;AAChD,SAAO;AAAA,IACL,MAAM,QAAQ,WAAW,SACvBA,MAAK;AAAA,IAEL,CAACA,MAAK;AAAA,IAEN,WAAW,KAAKA,MAAK,KAAK;AAAA,IAE1B,CAAC,0CAA0C,KAAKA,MAAK,KAAK;AAAA,EAC9D;AACF;;;ACbO,SAAS,WAAW,OAAO;AAChC,QAAM,SAAS,MAAM,QAAQ,SAAS;AAEtC,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,UAAM,IAAI;AAAA,MACR,iCACE,SACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;ACJO,SAASC,MAAKC,OAAM,GAAG,OAAO,MAAM;AACzC,QAAM,SAAS,WAAW,KAAK;AAC/B,QAAM,MAAMA,MAAK,SAAS;AAC1B,QAAM,SAAS,WAAW,MAAM,gBAAgB;AAEhD,MAAI,qBAAqBA,OAAM,KAAK,GAAG;AACrC,UAAMC,QAAO,MAAM,MAAM,cAAc;AACvC,UAAMC,SAAQ,MAAM,YAAY,KAAKC,IAAG;AACxC,IAAAF,MAAK;AACL,WAAOC;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,cAAc,IAAI;AACxC,QAAM,WAAW,OAAO,OAAO,KAAK,IAAI,cAAc,KAAK,MAAM,IAAI,GAAG,CAAC,CAAC;AAC1E,QAAMD,QAAO,MAAM,MAAM,YAAY;AACrC,MAAI,QAAQ,QAAQ,KAAK,QAAQ;AAEjC,MAAID,MAAK,MAAM;AACb,UAAM,UAAU,MAAM,MAAM,iBAAiB,MAAM,EAAE;AACrD,aAAS,QAAQ;AAAA,MACf,MAAM,KAAKA,MAAK,MAAM;AAAA,QACpB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ,CAAC,GAAG;AAAA,QACZ,GAAG,QAAQ,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH;AACA,YAAQ;AAAA,EACV;AAEA,MAAIA,MAAK,QAAQA,MAAK,MAAM;AAC1B,UAAM,UAAU,MAAM,MAAM,iBAAiB,MAAM,EAAE;AACrD,aAAS,QAAQ,KAAK,GAAG;AACzB,aAAS,QAAQ;AAAA,MACf,MAAM,KAAKA,MAAK,MAAM;AAAA,QACpB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ,CAAC,GAAG;AAAA,QACZ,GAAG,QAAQ,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH;AACA,YAAQ;AAAA,EACV;AAEA,WAAS,QAAQ,KAAK,IAAI;AAE1B,MAAI,KAAK;AACP,aAAS,QAAQ,KAAK,MAAM,IAAI;AAAA,EAClC;AAEA,WAAS,QAAQ,KAAK,QAAQ;AAC9B,EAAAC,MAAK;AACL,SAAO;AACT;AAGA,SAASE,KAAI,MAAM,GAAG,OAAO;AAC3B,UAAQ,QAAQ,KAAK,UAAU;AACjC;;;AClEO,SAAS,WAAW,OAAO;AAChC,QAAM,SAAS,MAAM,QAAQ,SAAS;AAEtC,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,UAAM,IAAI;AAAA,MACR,kCACE,SACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;ACNO,SAASC,YAAWC,OAAM,GAAG,OAAO,MAAM;AAC/C,QAAM,QAAQ,WAAW,KAAK;AAC9B,QAAM,SAAS,UAAU,MAAM,UAAU;AACzC,QAAMC,QAAO,MAAM,MAAM,YAAY;AACrC,MAAI,UAAU,MAAM,MAAM,OAAO;AACjC,QAAM,UAAU,MAAM,cAAc,IAAI;AACxC,MAAI,QAAQ,QAAQ,KAAK,GAAG;AAC5B,WAAS,QAAQ;AAAA,IACf,MAAM,KAAK,MAAM,cAAcD,KAAI,GAAG;AAAA,MACpC,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,GAAG,QAAQ,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AACA,WAAS,QAAQ,KAAK,KAAK;AAE3B,UAAQ;AAER;AAAA;AAAA,IAEE,CAACA,MAAK;AAAA,IAEN,eAAe,KAAKA,MAAK,GAAG;AAAA,IAC5B;AACA,cAAU,MAAM,MAAM,oBAAoB;AAC1C,aAAS,QAAQ,KAAK,GAAG;AACzB,aAAS,QAAQ;AAAA,MACf,MAAM,KAAKA,MAAK,KAAK,EAAC,QAAQ,OAAO,OAAO,KAAK,GAAG,QAAQ,QAAQ,EAAC,CAAC;AAAA,IACxE;AACA,aAAS,QAAQ,KAAK,GAAG;AAAA,EAC3B,OAAO;AAEL,cAAU,MAAM,MAAM,gBAAgB;AACtC,aAAS,QAAQ;AAAA,MACf,MAAM,KAAKA,MAAK,KAAK;AAAA,QACnB,QAAQ;AAAA,QACR,OAAOA,MAAK,QAAQ,MAAM;AAAA,QAC1B,GAAG,QAAQ,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,UAAQ;AAER,MAAIA,MAAK,OAAO;AACd,cAAU,MAAM,MAAM,QAAQ,MAAM,EAAE;AACtC,aAAS,QAAQ,KAAK,MAAM,KAAK;AACjC,aAAS,QAAQ;AAAA,MACf,MAAM,KAAKA,MAAK,OAAO;AAAA,QACrB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,GAAG,QAAQ,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH;AACA,aAAS,QAAQ,KAAK,KAAK;AAC3B,YAAQ;AAAA,EACV;AAEA,EAAAC,MAAK;AAEL,SAAO;AACT;;;ACnEO,SAAS,cAAc,OAAO;AACnC,QAAM,SAAS,MAAM,QAAQ,YAAY;AAEzC,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,UAAM,IAAI;AAAA,MACR,qCACE,SACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;ACZO,SAAS,yBAAyBC,OAAM;AAC7C,SAAO,QAAQA,MAAK,SAAS,EAAE,EAAE,YAAY,IAAI;AACnD;;;AC8BO,SAAS,WAAW,SAAS,QAAQ,QAAQ;AAClD,QAAM,cAAc,kBAAkB,OAAO;AAC7C,QAAM,aAAa,kBAAkB,MAAM;AAG3C,MAAI,gBAAgB,QAAW;AAC7B,WAAO,eAAe;AAAA;AAAA;AAAA;AAAA,MAIlB,WAAW,MACT,EAAC,QAAQ,MAAM,SAAS,KAAI,IAC5B,EAAC,QAAQ,OAAO,SAAS,MAAK;AAAA,QAChC,eAAe;AAAA;AAAA,MAEb,EAAC,QAAQ,MAAM,SAAS,KAAI;AAAA;AAAA;AAAA,MAE5B,EAAC,QAAQ,OAAO,SAAS,KAAI;AAAA;AAAA,EACrC;AAGA,MAAI,gBAAgB,GAAG;AACrB,WAAO,eAAe;AAAA;AAAA,MAElB,EAAC,QAAQ,OAAO,SAAS,MAAK;AAAA,QAC9B,eAAe;AAAA;AAAA,MAEb,EAAC,QAAQ,MAAM,SAAS,KAAI;AAAA;AAAA;AAAA,MAE5B,EAAC,QAAQ,OAAO,SAAS,MAAK;AAAA;AAAA,EACtC;AAGA,SAAO,eAAe;AAAA;AAAA,IAElB,EAAC,QAAQ,OAAO,SAAS,MAAK;AAAA,MAC9B,eAAe;AAAA;AAAA,IAEb,EAAC,QAAQ,MAAM,SAAS,MAAK;AAAA;AAAA;AAAA,IAE7B,EAAC,QAAQ,OAAO,SAAS,MAAK;AAAA;AACtC;;;ACxEAC,UAAS,OAAO;AAST,SAASA,UAASC,OAAM,GAAG,OAAO,MAAM;AAC7C,QAAM,SAAS,cAAc,KAAK;AAClC,QAAMC,QAAO,MAAM,MAAM,UAAU;AACnC,QAAM,UAAU,MAAM,cAAc,IAAI;AACxC,QAAM,SAAS,QAAQ,KAAK,MAAM;AAElC,MAAI,UAAU,QAAQ;AAAA,IACpB,MAAM,kBAAkBD,OAAM;AAAA,MAC5B,OAAO;AAAA,MACP;AAAA,MACA,GAAG,QAAQ,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AACA,QAAM,cAAc,QAAQ,WAAW,CAAC;AACxC,QAAM,OAAO;AAAA,IACX,KAAK,OAAO,WAAW,KAAK,OAAO,SAAS,CAAC;AAAA,IAC7C;AAAA,IACA;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ;AACf,cAAU,yBAAyB,WAAW,IAAI,QAAQ,MAAM,CAAC;AAAA,EACnE;AAEA,QAAM,cAAc,QAAQ,WAAW,QAAQ,SAAS,CAAC;AACzD,QAAM,QAAQ,WAAW,KAAK,MAAM,WAAW,CAAC,GAAG,aAAa,MAAM;AAEtE,MAAI,MAAM,QAAQ;AAChB,cAAU,QAAQ,MAAM,GAAG,EAAE,IAAI,yBAAyB,WAAW;AAAA,EACvE;AAEA,QAAM,QAAQ,QAAQ,KAAK,MAAM;AAEjC,EAAAC,MAAK;AAEL,QAAM,iCAAiC;AAAA,IACrC,OAAO,MAAM;AAAA,IACb,QAAQ,KAAK;AAAA,EACf;AACA,SAAO,SAAS,UAAU;AAC5B;AAQA,SAAS,aAAa,GAAG,IAAI,OAAO;AAClC,SAAO,MAAM,QAAQ,YAAY;AACnC;;;ACvDO,SAAS,sBAAsBC,OAAM,OAAO;AACjD,MAAI,mBAAmB;AAIvB,QAAMA,OAAM,SAAUA,OAAM;AAC1B,QACG,WAAWA,SAAQ,WAAW,KAAKA,MAAK,KAAK,KAC9CA,MAAK,SAAS,SACd;AACA,yBAAmB;AACnB,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SAAO;AAAA,KACJ,CAACA,MAAK,SAASA,MAAK,QAAQ,MAC3B,SAASA,KAAI,MACZ,MAAM,QAAQ,UAAU;AAAA,EAC7B;AACF;;;AClBO,SAASC,SAAQC,OAAM,GAAG,OAAO,MAAM;AAC5C,QAAM,OAAO,KAAK,IAAI,KAAK,IAAI,GAAGA,MAAK,SAAS,CAAC,GAAG,CAAC;AACrD,QAAM,UAAU,MAAM,cAAc,IAAI;AAExC,MAAI,sBAAsBA,OAAM,KAAK,GAAG;AACtC,UAAMC,QAAO,MAAM,MAAM,eAAe;AACxC,UAAMC,WAAU,MAAM,MAAM,UAAU;AACtC,UAAMC,SAAQ,MAAM,kBAAkBH,OAAM;AAAA,MAC1C,GAAG,QAAQ,QAAQ;AAAA,MACnB,QAAQ;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AACD,IAAAE,SAAQ;AACR,IAAAD,MAAK;AAEL,WACEE,SACA,QACC,SAAS,IAAI,MAAM,KAAK;AAAA;AAAA,MAEvBA,OAAM;AAAA;AAAA,OAGH,KAAK,IAAIA,OAAM,YAAY,IAAI,GAAGA,OAAM,YAAY,IAAI,CAAC,IAAI;AAAA,IAClE;AAAA,EAEJ;AAEA,QAAM,WAAW,IAAI,OAAO,IAAI;AAChC,QAAMF,QAAO,MAAM,MAAM,YAAY;AACrC,QAAM,UAAU,MAAM,MAAM,UAAU;AAMtC,UAAQ,KAAK,WAAW,GAAG;AAE3B,MAAI,QAAQ,MAAM,kBAAkBD,OAAM;AAAA,IACxC,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,GAAG,QAAQ,QAAQ;AAAA,EACrB,CAAC;AAED,MAAI,SAAS,KAAK,KAAK,GAAG;AAExB,YAAQ,yBAAyB,MAAM,WAAW,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC;AAAA,EACvE;AAEA,UAAQ,QAAQ,WAAW,MAAM,QAAQ;AAEzC,MAAI,MAAM,QAAQ,UAAU;AAC1B,aAAS,MAAM;AAAA,EACjB;AAEA,UAAQ;AACR,EAAAC,MAAK;AAEL,SAAO;AACT;;;ACtEAG,MAAK,OAAO;AAML,SAASA,MAAKC,OAAM;AACzB,SAAOA,MAAK,SAAS;AACvB;AAKA,SAAS,WAAW;AAClB,SAAO;AACT;;;ACZAC,OAAM,OAAO;AASN,SAASA,OAAMC,OAAM,GAAG,OAAO,MAAM;AAC1C,QAAM,QAAQ,WAAW,KAAK;AAC9B,QAAM,SAAS,UAAU,MAAM,UAAU;AACzC,QAAMC,QAAO,MAAM,MAAM,OAAO;AAChC,MAAI,UAAU,MAAM,MAAM,OAAO;AACjC,QAAM,UAAU,MAAM,cAAc,IAAI;AACxC,MAAI,QAAQ,QAAQ,KAAK,IAAI;AAC7B,WAAS,QAAQ;AAAA,IACf,MAAM,KAAKD,MAAK,KAAK,EAAC,QAAQ,OAAO,OAAO,KAAK,GAAG,QAAQ,QAAQ,EAAC,CAAC;AAAA,EACxE;AACA,WAAS,QAAQ,KAAK,IAAI;AAE1B,UAAQ;AAER;AAAA;AAAA,IAEG,CAACA,MAAK,OAAOA,MAAK;AAAA,IAEnB,eAAe,KAAKA,MAAK,GAAG;AAAA,IAC5B;AACA,cAAU,MAAM,MAAM,oBAAoB;AAC1C,aAAS,QAAQ,KAAK,GAAG;AACzB,aAAS,QAAQ;AAAA,MACf,MAAM,KAAKA,MAAK,KAAK,EAAC,QAAQ,OAAO,OAAO,KAAK,GAAG,QAAQ,QAAQ,EAAC,CAAC;AAAA,IACxE;AACA,aAAS,QAAQ,KAAK,GAAG;AAAA,EAC3B,OAAO;AAEL,cAAU,MAAM,MAAM,gBAAgB;AACtC,aAAS,QAAQ;AAAA,MACf,MAAM,KAAKA,MAAK,KAAK;AAAA,QACnB,QAAQ;AAAA,QACR,OAAOA,MAAK,QAAQ,MAAM;AAAA,QAC1B,GAAG,QAAQ,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,UAAQ;AAER,MAAIA,MAAK,OAAO;AACd,cAAU,MAAM,MAAM,QAAQ,MAAM,EAAE;AACtC,aAAS,QAAQ,KAAK,MAAM,KAAK;AACjC,aAAS,QAAQ;AAAA,MACf,MAAM,KAAKA,MAAK,OAAO;AAAA,QACrB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,GAAG,QAAQ,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH;AACA,aAAS,QAAQ,KAAK,KAAK;AAC3B,YAAQ;AAAA,EACV;AAEA,WAAS,QAAQ,KAAK,GAAG;AACzB,EAAAC,MAAK;AAEL,SAAO;AACT;AAKA,SAAS,YAAY;AACnB,SAAO;AACT;;;AC5EAC,gBAAe,OAAO;AASf,SAASA,gBAAeC,OAAM,GAAG,OAAO,MAAM;AACnD,QAAM,OAAOA,MAAK;AAClB,QAAMC,QAAO,MAAM,MAAM,gBAAgB;AACzC,MAAI,UAAU,MAAM,MAAM,OAAO;AACjC,QAAM,UAAU,MAAM,cAAc,IAAI;AACxC,MAAI,QAAQ,QAAQ,KAAK,IAAI;AAC7B,QAAM,MAAM,MAAM,KAAKD,MAAK,KAAK;AAAA,IAC/B,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,GAAG,QAAQ,QAAQ;AAAA,EACrB,CAAC;AACD,WAAS,QAAQ,KAAK,MAAM,IAAI;AAEhC,UAAQ;AAER,QAAM,QAAQ,MAAM;AACpB,QAAM,QAAQ,CAAC;AACf,YAAU,MAAM,MAAM,WAAW;AAKjC,QAAM,YAAY,MAAM,KAAK,MAAM,cAAcA,KAAI,GAAG;AAAA,IACtD,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,GAAG,QAAQ,QAAQ;AAAA,EACrB,CAAC;AACD,UAAQ;AACR,QAAM,QAAQ;AACd,EAAAC,MAAK;AAEL,MAAI,SAAS,UAAU,CAAC,OAAO,QAAQ,WAAW;AAChD,aAAS,QAAQ,KAAK,YAAY,GAAG;AAAA,EACvC,WAAW,SAAS,YAAY;AAE9B,YAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,EAC3B,OAAO;AACL,aAAS,QAAQ,KAAK,GAAG;AAAA,EAC3B;AAEA,SAAO;AACT;AAKA,SAAS,qBAAqB;AAC5B,SAAO;AACT;;;ACzDAC,YAAW,OAAO;AAQX,SAASA,YAAWC,OAAM,GAAG,OAAO;AACzC,MAAI,QAAQA,MAAK,SAAS;AAC1B,MAAI,WAAW;AACf,MAAIC,SAAQ;AAKZ,SAAO,IAAI,OAAO,aAAa,WAAW,UAAU,EAAE,KAAK,KAAK,GAAG;AACjE,gBAAY;AAAA,EACd;AAIA,MACE,WAAW,KAAK,KAAK,MACnB,WAAW,KAAK,KAAK,KAAK,WAAW,KAAK,KAAK,KAAM,QAAQ,KAAK,KAAK,IACzE;AACA,YAAQ,MAAM,QAAQ;AAAA,EACxB;AASA,SAAO,EAAEA,SAAQ,MAAM,OAAO,QAAQ;AACpC,UAAM,UAAU,MAAM,OAAOA,MAAK;AAClC,UAAM,aAAa,MAAM,eAAe,OAAO;AAE/C,QAAI;AAKJ,QAAI,CAAC,QAAQ,QAAS;AAEtB,WAAQ,QAAQ,WAAW,KAAK,KAAK,GAAI;AACvC,UAAIC,YAAW,MAAM;AAGrB,UACE,MAAM,WAAWA,SAAQ,MAAM,MAC/B,MAAM,WAAWA,YAAW,CAAC,MAAM,IACnC;AACA,QAAAA;AAAA,MACF;AAEA,cAAQ,MAAM,MAAM,GAAGA,SAAQ,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ,CAAC;AAAA,IACtE;AAAA,EACF;AAEA,SAAO,WAAW,QAAQ;AAC5B;AAKA,SAAS,iBAAiB;AACxB,SAAO;AACT;;;AC/DO,SAAS,qBAAqBC,OAAM,OAAO;AAChD,QAAM,MAAM,SAASA,KAAI;AAEzB,SAAO;AAAA,IACL,CAAC,MAAM,QAAQ;AAAA,IAEbA,MAAK;AAAA,IAEL,CAACA,MAAK;AAAA,IAENA,MAAK,YACLA,MAAK,SAAS,WAAW,KACzBA,MAAK,SAAS,CAAC,EAAE,SAAS;AAAA,KAEzB,QAAQA,MAAK,OAAO,YAAY,QAAQA,MAAK;AAAA,IAE9C,oBAAoB,KAAKA,MAAK,GAAG;AAAA;AAAA,IAGjC,CAAC,iBAAiB,KAAKA,MAAK,GAAG;AAAA,EACnC;AACF;;;ACxBAC,MAAK,OAAO;AASL,SAASA,MAAKC,OAAM,GAAG,OAAO,MAAM;AACzC,QAAM,QAAQ,WAAW,KAAK;AAC9B,QAAM,SAAS,UAAU,MAAM,UAAU;AACzC,QAAM,UAAU,MAAM,cAAc,IAAI;AAExC,MAAIC;AAEJ,MAAI;AAEJ,MAAI,qBAAqBD,OAAM,KAAK,GAAG;AAErC,UAAM,QAAQ,MAAM;AACpB,UAAM,QAAQ,CAAC;AACf,IAAAC,QAAO,MAAM,MAAM,UAAU;AAC7B,QAAIC,SAAQ,QAAQ,KAAK,GAAG;AAC5B,IAAAA,UAAS,QAAQ;AAAA,MACf,MAAM,kBAAkBF,OAAM;AAAA,QAC5B,QAAQE;AAAA,QACR,OAAO;AAAA,QACP,GAAG,QAAQ,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH;AACA,IAAAA,UAAS,QAAQ,KAAK,GAAG;AACzB,IAAAD,MAAK;AACL,UAAM,QAAQ;AACd,WAAOC;AAAA,EACT;AAEA,EAAAD,QAAO,MAAM,MAAM,MAAM;AACzB,YAAU,MAAM,MAAM,OAAO;AAC7B,MAAI,QAAQ,QAAQ,KAAK,GAAG;AAC5B,WAAS,QAAQ;AAAA,IACf,MAAM,kBAAkBD,OAAM;AAAA,MAC5B,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,GAAG,QAAQ,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AACA,WAAS,QAAQ,KAAK,IAAI;AAC1B,UAAQ;AAER;AAAA;AAAA,IAEG,CAACA,MAAK,OAAOA,MAAK;AAAA,IAEnB,eAAe,KAAKA,MAAK,GAAG;AAAA,IAC5B;AACA,cAAU,MAAM,MAAM,oBAAoB;AAC1C,aAAS,QAAQ,KAAK,GAAG;AACzB,aAAS,QAAQ;AAAA,MACf,MAAM,KAAKA,MAAK,KAAK,EAAC,QAAQ,OAAO,OAAO,KAAK,GAAG,QAAQ,QAAQ,EAAC,CAAC;AAAA,IACxE;AACA,aAAS,QAAQ,KAAK,GAAG;AAAA,EAC3B,OAAO;AAEL,cAAU,MAAM,MAAM,gBAAgB;AACtC,aAAS,QAAQ;AAAA,MACf,MAAM,KAAKA,MAAK,KAAK;AAAA,QACnB,QAAQ;AAAA,QACR,OAAOA,MAAK,QAAQ,MAAM;AAAA,QAC1B,GAAG,QAAQ,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,UAAQ;AAER,MAAIA,MAAK,OAAO;AACd,cAAU,MAAM,MAAM,QAAQ,MAAM,EAAE;AACtC,aAAS,QAAQ,KAAK,MAAM,KAAK;AACjC,aAAS,QAAQ;AAAA,MACf,MAAM,KAAKA,MAAK,OAAO;AAAA,QACrB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,GAAG,QAAQ,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH;AACA,aAAS,QAAQ,KAAK,KAAK;AAC3B,YAAQ;AAAA,EACV;AAEA,WAAS,QAAQ,KAAK,GAAG;AAEzB,EAAAC,MAAK;AACL,SAAO;AACT;AAQA,SAAS,SAASD,OAAM,GAAG,OAAO;AAChC,SAAO,qBAAqBA,OAAM,KAAK,IAAI,MAAM;AACnD;;;AC5GAG,eAAc,OAAO;AASd,SAASA,eAAcC,OAAM,GAAG,OAAO,MAAM;AAClD,QAAM,OAAOA,MAAK;AAClB,QAAMC,QAAO,MAAM,MAAM,eAAe;AACxC,MAAI,UAAU,MAAM,MAAM,OAAO;AACjC,QAAM,UAAU,MAAM,cAAc,IAAI;AACxC,MAAI,QAAQ,QAAQ,KAAK,GAAG;AAC5B,QAAMC,QAAO,MAAM,kBAAkBF,OAAM;AAAA,IACzC,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,GAAG,QAAQ,QAAQ;AAAA,EACrB,CAAC;AACD,WAAS,QAAQ,KAAKE,QAAO,IAAI;AAEjC,UAAQ;AAER,QAAM,QAAQ,MAAM;AACpB,QAAM,QAAQ,CAAC;AACf,YAAU,MAAM,MAAM,WAAW;AAKjC,QAAM,YAAY,MAAM,KAAK,MAAM,cAAcF,KAAI,GAAG;AAAA,IACtD,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,GAAG,QAAQ,QAAQ;AAAA,EACrB,CAAC;AACD,UAAQ;AACR,QAAM,QAAQ;AACd,EAAAC,MAAK;AAEL,MAAI,SAAS,UAAU,CAACC,SAAQA,UAAS,WAAW;AAClD,aAAS,QAAQ,KAAK,YAAY,GAAG;AAAA,EACvC,WAAW,SAAS,YAAY;AAE9B,YAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,EAC3B,OAAO;AACL,aAAS,QAAQ,KAAK,GAAG;AAAA,EAC3B;AAEA,SAAO;AACT;AAKA,SAAS,oBAAoB;AAC3B,SAAO;AACT;;;ACtDO,SAAS,YAAY,OAAO;AACjC,QAAM,SAAS,MAAM,QAAQ,UAAU;AAEvC,MAAI,WAAW,OAAO,WAAW,OAAO,WAAW,KAAK;AACtD,UAAM,IAAI;AAAA,MACR,kCACE,SACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;ACVO,SAAS,iBAAiB,OAAO;AACtC,QAAM,SAAS,YAAY,KAAK;AAChC,QAAM,cAAc,MAAM,QAAQ;AAElC,MAAI,CAAC,aAAa;AAChB,WAAO,WAAW,MAAM,MAAM;AAAA,EAChC;AAEA,MAAI,gBAAgB,OAAO,gBAAgB,OAAO,gBAAgB,KAAK;AACrE,UAAM,IAAI;AAAA,MACR,kCACE,cACA;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,gBAAgB,QAAQ;AAC1B,UAAM,IAAI;AAAA,MACR,yBACE,SACA,4BACA,cACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;AC7BO,SAAS,mBAAmB,OAAO;AACxC,QAAM,SAAS,MAAM,QAAQ,iBAAiB;AAE9C,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,UAAM,IAAI;AAAA,MACR,kCACE,SACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;ACZO,SAAS,UAAU,OAAO;AAC/B,QAAM,SAAS,MAAM,QAAQ,QAAQ;AAErC,MAAI,WAAW,OAAO,WAAW,OAAO,WAAW,KAAK;AACtD,UAAM,IAAI;AAAA,MACR,kCACE,SACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;ACHO,SAASC,MAAKC,OAAM,QAAQ,OAAO,MAAM;AAC9C,QAAMC,QAAO,MAAM,MAAM,MAAM;AAC/B,QAAM,gBAAgB,MAAM;AAE5B,MAAI,SAASD,MAAK,UAAU,mBAAmB,KAAK,IAAI,YAAY,KAAK;AAEzE,QAAM,cAAcA,MAAK,UACrB,WAAW,MACT,MACA,MACF,iBAAiB,KAAK;AAC1B,MAAI,qBACF,UAAU,MAAM,iBAAiB,WAAW,MAAM,iBAAiB;AAErE,MAAI,CAACA,MAAK,SAAS;AACjB,UAAM,gBAAgBA,MAAK,WAAWA,MAAK,SAAS,CAAC,IAAI;AAUzD;AAAA;AAAA,OAEG,WAAW,OAAO,WAAW;AAAA,MAE9B,kBACC,CAAC,cAAc,YAAY,CAAC,cAAc,SAAS,CAAC;AAAA,MAErD,MAAM,MAAM,MAAM,MAAM,SAAS,CAAC,MAAM,UACxC,MAAM,MAAM,MAAM,MAAM,SAAS,CAAC,MAAM,cACxC,MAAM,MAAM,MAAM,MAAM,SAAS,CAAC,MAAM,UACxC,MAAM,MAAM,MAAM,MAAM,SAAS,CAAC,MAAM;AAAA,MAExC,MAAM,WAAW,MAAM,WAAW,SAAS,CAAC,MAAM,KAClD,MAAM,WAAW,MAAM,WAAW,SAAS,CAAC,MAAM,KAClD,MAAM,WAAW,MAAM,WAAW,SAAS,CAAC,MAAM;AAAA,MAClD;AACA,2BAAqB;AAAA,IACvB;AAUA,QAAI,UAAU,KAAK,MAAM,UAAU,eAAe;AAChD,UAAIE,SAAQ;AAEZ,aAAO,EAAEA,SAAQF,MAAK,SAAS,QAAQ;AACrC,cAAM,OAAOA,MAAK,SAASE,MAAK;AAEhC,YACE,QACA,KAAK,SAAS,cACd,KAAK,YACL,KAAK,SAAS,CAAC,KACf,KAAK,SAAS,CAAC,EAAE,SAAS,iBAC1B;AACA,+BAAqB;AACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,oBAAoB;AACtB,aAAS;AAAA,EACX;AAEA,QAAM,gBAAgB;AACtB,QAAM,QAAQ,MAAM,cAAcF,OAAM,IAAI;AAC5C,QAAM,iBAAiB;AACvB,QAAM,gBAAgB;AACtB,EAAAC,MAAK;AACL,SAAO;AACT;;;AC3FO,SAAS,oBAAoB,OAAO;AACzC,QAAM,QAAQ,MAAM,QAAQ,kBAAkB;AAE9C,MAAI,UAAU,SAAS,UAAU,SAAS,UAAU,SAAS;AAC3D,UAAM,IAAI;AAAA,MACR,kCACE,QACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;ACLO,SAASE,UAASC,OAAM,QAAQ,OAAO,MAAM;AAClD,QAAM,iBAAiB,oBAAoB,KAAK;AAChD,MAAI,SAAS,MAAM,iBAAiB,YAAY,KAAK;AAGrD,MAAI,UAAU,OAAO,SAAS,UAAU,OAAO,SAAS;AACtD,cACG,OAAO,OAAO,UAAU,YAAY,OAAO,QAAQ,KAChD,OAAO,QACP,MACH,MAAM,QAAQ,wBAAwB,QACnC,IACA,OAAO,SAAS,QAAQA,KAAI,KAChC;AAAA,EACJ;AAEA,MAAI,OAAO,OAAO,SAAS;AAE3B,MACE,mBAAmB,SAClB,mBAAmB,YAChB,UAAU,OAAO,SAAS,UAAU,OAAO,UAAWA,MAAK,SAC/D;AACA,WAAO,KAAK,KAAK,OAAO,CAAC,IAAI;AAAA,EAC/B;AAEA,QAAM,UAAU,MAAM,cAAc,IAAI;AACxC,UAAQ,KAAK,SAAS,IAAI,OAAO,OAAO,OAAO,MAAM,CAAC;AACtD,UAAQ,MAAM,IAAI;AAClB,QAAMC,QAAO,MAAM,MAAM,UAAU;AACnC,QAAM,QAAQ,MAAM;AAAA,IAClB,MAAM,cAAcD,OAAM,QAAQ,QAAQ,CAAC;AAAA,IAC3CE;AAAA,EACF;AACA,EAAAD,MAAK;AAEL,SAAO;AAGP,WAASC,KAAI,MAAMC,QAAO,OAAO;AAC/B,QAAIA,QAAO;AACT,cAAQ,QAAQ,KAAK,IAAI,OAAO,IAAI,KAAK;AAAA,IAC3C;AAEA,YAAQ,QAAQ,SAAS,SAAS,IAAI,OAAO,OAAO,OAAO,MAAM,KAAK;AAAA,EACxE;AACF;;;ACjDO,SAASC,WAAUC,OAAM,GAAG,OAAO,MAAM;AAC9C,QAAMC,QAAO,MAAM,MAAM,WAAW;AACpC,QAAM,UAAU,MAAM,MAAM,UAAU;AACtC,QAAM,QAAQ,MAAM,kBAAkBD,OAAM,IAAI;AAChD,UAAQ;AACR,EAAAC,MAAK;AACL,SAAO;AACT;;;ACDO,IAAM;AAAA;AAAA,EAGT,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,EACF,CAAC;AAAA;;;AC7BE,SAASC,MAAKC,OAAM,GAAG,OAAO,MAAM;AAEzC,QAAM,cAAcA,MAAK,SAAS,KAAK,SAAU,GAAG;AAClD,WAAO,SAAS,CAAC;AAAA,EACnB,CAAC;AAED,QAAM,YAAY,cAAc,MAAM,oBAAoB,MAAM;AAChE,SAAO,UAAU,KAAK,OAAOA,OAAM,IAAI;AACzC;;;ACdO,SAAS,YAAY,OAAO;AACjC,QAAM,SAAS,MAAM,QAAQ,UAAU;AAEvC,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,UAAM,IAAI;AAAA,MACR,mCACE,SACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;ACXAC,QAAO,OAAO;AASP,SAASA,QAAOC,OAAM,GAAG,OAAO,MAAM;AAC3C,QAAM,SAAS,YAAY,KAAK;AAChC,QAAMC,QAAO,MAAM,MAAM,QAAQ;AACjC,QAAM,UAAU,MAAM,cAAc,IAAI;AACxC,QAAM,SAAS,QAAQ,KAAK,SAAS,MAAM;AAE3C,MAAI,UAAU,QAAQ;AAAA,IACpB,MAAM,kBAAkBD,OAAM;AAAA,MAC5B,OAAO;AAAA,MACP;AAAA,MACA,GAAG,QAAQ,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AACA,QAAM,cAAc,QAAQ,WAAW,CAAC;AACxC,QAAM,OAAO;AAAA,IACX,KAAK,OAAO,WAAW,KAAK,OAAO,SAAS,CAAC;AAAA,IAC7C;AAAA,IACA;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ;AACf,cAAU,yBAAyB,WAAW,IAAI,QAAQ,MAAM,CAAC;AAAA,EACnE;AAEA,QAAM,cAAc,QAAQ,WAAW,QAAQ,SAAS,CAAC;AACzD,QAAM,QAAQ,WAAW,KAAK,MAAM,WAAW,CAAC,GAAG,aAAa,MAAM;AAEtE,MAAI,MAAM,QAAQ;AAChB,cAAU,QAAQ,MAAM,GAAG,EAAE,IAAI,yBAAyB,WAAW;AAAA,EACvE;AAEA,QAAM,QAAQ,QAAQ,KAAK,SAAS,MAAM;AAE1C,EAAAC,MAAK;AAEL,QAAM,iCAAiC;AAAA,IACrC,OAAO,MAAM;AAAA,IACb,QAAQ,KAAK;AAAA,EACf;AACA,SAAO,SAAS,UAAU;AAC5B;AAQA,SAAS,WAAW,GAAG,IAAI,OAAO;AAChC,SAAO,MAAM,QAAQ,UAAU;AACjC;;;ACxDO,SAASC,MAAKC,OAAM,GAAG,OAAO,MAAM;AACzC,SAAO,MAAM,KAAKA,MAAK,OAAO,IAAI;AACpC;;;ACNO,SAAS,oBAAoB,OAAO;AACzC,QAAM,aAAa,MAAM,QAAQ,kBAAkB;AAEnD,MAAI,aAAa,GAAG;AAClB,UAAM,IAAI;AAAA,MACR,6CACE,aACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;ACNO,SAASC,eAAc,GAAG,IAAI,OAAO;AAC1C,QAAM,SACJ,UAAU,KAAK,KAAK,MAAM,QAAQ,aAAa,MAAM,KACrD,OAAO,oBAAoB,KAAK,CAAC;AAEnC,SAAO,MAAM,QAAQ,aAAa,MAAM,MAAM,GAAG,EAAE,IAAI;AACzD;;;ACGO,IAAM,SAAS;AAAA,EACpB,YAAAC;AAAA,EACA,OAAOC;AAAA,EACP,MAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAH;AAAA,EACA,SAAAI;AAAA,EACA,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,MAAAC;AAAA,EACA,eAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,eAAAC;AACF;;;ACFO,SAAS,uBAAuB;AACrC,SAAO;AAAA,IACL,OAAO;AAAA,MACL,OAAO;AAAA,MACP,WAAW;AAAA,MACX,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAWC;AAAA,MACX,aAAaA;AAAA,MACb,UAAUA;AAAA,IACZ;AAAA,EACF;AACF;AAMA,SAAS,WAAW,OAAO;AACzB,QAAM,QAAQ,MAAM;AACpB,KAAO,OAAO,4BAA4B;AAC1C,OAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,OAAO,MAAM,IAAI,SAAU,GAAG;AAC5B,eAAO,MAAM,SAAS,OAAO;AAAA,MAC/B,CAAC;AAAA,MACD,UAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACA,OAAK,KAAK,UAAU;AACtB;AAMA,SAAS,UAAU,OAAO;AACxB,OAAK,KAAK,KAAK;AACf,OAAK,KAAK,UAAU;AACtB;AAMA,SAAS,SAAS,OAAO;AACvB,OAAK,MAAM,EAAC,MAAM,YAAY,UAAU,CAAC,EAAC,GAAG,KAAK;AACpD;AAMA,SAASA,MAAK,OAAO;AACnB,OAAK,KAAK,KAAK;AACjB;AAMA,SAAS,UAAU,OAAO;AACxB,OAAK,MAAM,EAAC,MAAM,aAAa,UAAU,CAAC,EAAC,GAAG,KAAK;AACrD;AAQA,SAAS,aAAa,OAAO;AAC3B,MAAI,QAAQ,KAAK,OAAO;AAExB,MAAI,KAAK,KAAK,SAAS;AACrB,YAAQ,MAAM,QAAQ,cAAc,OAAO;AAAA,EAC7C;AAEA,QAAMC,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,KAAOA,MAAK,SAAS,YAAY;AACjC,EAAAA,MAAK,QAAQ;AACb,OAAK,KAAK,KAAK;AACjB;AAOA,SAAS,QAAQ,IAAI,IAAI;AAEvB,SAAO,OAAO,MAAM,KAAK;AAC3B;AAWO,SAAS,mBAAmB,SAAS;AAC1C,QAAM,WAAW,WAAW,CAAC;AAC7B,QAAM,UAAU,SAAS;AACzB,QAAM,kBAAkB,SAAS;AACjC,QAAM,eAAe,SAAS;AAC9B,QAAM,SAAS,UAAU,MAAM;AAE/B,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,EAAC,WAAW,MAAM,aAAa,YAAW;AAAA,MAC1C,EAAC,WAAW,MAAM,aAAa,YAAW;AAAA;AAAA;AAAA,MAG1C,EAAC,SAAS,MAAM,WAAW,KAAK,OAAO,SAAS;AAAA;AAAA,MAEhD,EAAC,WAAW,KAAK,aAAa,YAAW;AAAA;AAAA;AAAA,MAGzC,EAAC,SAAS,MAAM,WAAW,KAAK,OAAO,IAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAM1C,EAAC,SAAS,MAAM,WAAW,KAAK,OAAO,QAAO;AAAA,IAChD;AAAA,IACA,UAAU;AAAA,MACR,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,WAAW;AAAA,MACX,UAAU;AAAA,IACZ;AAAA,EACF;AAMA,WAAS,YAAYA,OAAM,GAAG,OAAO,MAAM;AACzC,WAAO,cAAc,kBAAkBA,OAAM,OAAO,IAAI,GAAGA,MAAK,KAAK;AAAA,EACvE;AAUA,WAAS,eAAeA,OAAM,GAAG,OAAO,MAAM;AAC5C,UAAM,MAAM,qBAAqBA,OAAM,OAAO,IAAI;AAClD,UAAM,QAAQ,cAAc,CAAC,GAAG,CAAC;AAEjC,WAAO,MAAM,MAAM,GAAG,MAAM,QAAQ,IAAI,CAAC;AAAA,EAC3C;AAMA,WAAS,gBAAgBA,OAAM,GAAG,OAAO,MAAM;AAC7C,UAAMD,QAAO,MAAM,MAAM,WAAW;AACpC,UAAM,UAAU,MAAM,MAAM,UAAU;AACtC,UAAM,QAAQ,MAAM,kBAAkBC,OAAM;AAAA,MAC1C,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AACD,YAAQ;AACR,IAAAD,MAAK;AACL,WAAO;AAAA,EACT;AAMA,WAAS,cAAc,QAAQ,OAAO;AACpC,WAAO,cAAc,QAAQ;AAAA,MAC3B;AAAA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA,IACF,CAAC;AAAA,EACH;AAOA,WAAS,kBAAkBC,OAAM,OAAO,MAAM;AAC5C,UAAM,WAAWA,MAAK;AACtB,QAAIC,SAAQ;AAEZ,UAAM,SAAS,CAAC;AAChB,UAAM,UAAU,MAAM,MAAM,OAAO;AAEnC,WAAO,EAAEA,SAAQ,SAAS,QAAQ;AAChC,aAAOA,MAAK,IAAI,qBAAqB,SAASA,MAAK,GAAG,OAAO,IAAI;AAAA,IACnE;AAEA,YAAQ;AAER,WAAO;AAAA,EACT;AAOA,WAAS,qBAAqBD,OAAM,OAAO,MAAM;AAC/C,UAAM,WAAWA,MAAK;AACtB,QAAIC,SAAQ;AAEZ,UAAM,SAAS,CAAC;AAChB,UAAM,UAAU,MAAM,MAAM,UAAU;AAEtC,WAAO,EAAEA,SAAQ,SAAS,QAAQ;AAIhC,aAAOA,MAAK,IAAI,gBAAgB,SAASA,MAAK,GAAGD,OAAM,OAAO,IAAI;AAAA,IACpE;AAEA,YAAQ;AAER,WAAO;AAAA,EACT;AAMA,WAAS,oBAAoBA,OAAM,QAAQ,OAAO;AAChD,QAAI,QAAQ,OAAgB,WAAWA,OAAM,QAAQ,KAAK;AAE1D,QAAI,MAAM,MAAM,SAAS,WAAW,GAAG;AACrC,cAAQ,MAAM,QAAQ,OAAO,MAAM;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;ACvRO,SAAS,8BAA8B;AAC5C,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,2BAA2B;AAAA,MAC3B,6BAA6B;AAAA,MAC7B,WAAW;AAAA,IACb;AAAA,EACF;AACF;AASO,SAAS,4BAA4B;AAC1C,SAAO;AAAA,IACL,QAAQ,CAAC,EAAC,SAAS,MAAM,WAAW,KAAK,OAAO,QAAO,CAAC;AAAA,IACxD,UAAU,EAAC,UAAU,yBAAwB;AAAA,EAC/C;AACF;AAMA,SAAS,UAAU,OAAO;AAExB,QAAME,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,KAAOA,MAAK,SAAS,UAAU;AAC/B,EAAAA,MAAK,UAAU,MAAM,SAAS;AAChC;AAMA,SAAS,8BAA8B,OAAO;AAC5C,QAAM,SAAS,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAE/C,MACE,UACA,OAAO,SAAS,cAChB,OAAO,OAAO,YAAY,WAC1B;AACA,UAAMA,QAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,OAAOA,MAAK,SAAS,WAAW;AAChC,UAAM,OAAOA,MAAK,SAAS,CAAC;AAE5B,QAAI,QAAQ,KAAK,SAAS,QAAQ;AAChC,YAAM,WAAW,OAAO;AACxB,UAAIC,SAAQ;AAEZ,UAAI;AAEJ,aAAO,EAAEA,SAAQ,SAAS,QAAQ;AAChC,cAAM,UAAU,SAASA,MAAK;AAC9B,YAAI,QAAQ,SAAS,aAAa;AAChC,4BAAkB;AAClB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,oBAAoBD,OAAM;AAE5B,aAAK,QAAQ,KAAK,MAAM,MAAM,CAAC;AAE/B,YAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,UAAAA,MAAK,SAAS,MAAM;AAAA,QACtB,WACEA,MAAK,YACL,KAAK,YACL,OAAO,KAAK,SAAS,MAAM,WAAW,UACtC;AACA,eAAK,SAAS,MAAM;AACpB,eAAK,SAAS,MAAM;AACpB,UAAAA,MAAK,SAAS,QAAQ,OAAO,OAAO,CAAC,GAAG,KAAK,SAAS,KAAK;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,OAAK,KAAK,KAAK;AACjB;AAMA,SAAS,yBAAyBA,OAAM,QAAQ,OAAO,MAAM;AAC3D,QAAM,OAAOA,MAAK,SAAS,CAAC;AAC5B,QAAM,YACJ,OAAOA,MAAK,YAAY,aAAa,QAAQ,KAAK,SAAS;AAC7D,QAAM,WAAW,OAAOA,MAAK,UAAU,MAAM,OAAO;AACpD,QAAM,UAAU,MAAM,cAAc,IAAI;AAExC,MAAI,WAAW;AACb,YAAQ,KAAK,QAAQ;AAAA,EACvB;AAEA,MAAI,QAAQ,OAAgB,SAASA,OAAM,QAAQ,OAAO;AAAA,IACxD,GAAG;AAAA,IACH,GAAG,QAAQ,QAAQ;AAAA,EACrB,CAAC;AAED,MAAI,WAAW;AACb,YAAQ,MAAM,QAAQ,mCAAmC,KAAK;AAAA,EAChE;AAEA,SAAO;AAMP,WAAS,MAAM,IAAI;AACjB,WAAO,KAAK;AAAA,EACd;AACF;;;AC5GO,SAAS,kBAAkB;AAChC,SAAO;AAAA,IACL,+BAA+B;AAAA,IAC/B,wBAAwB;AAAA,IACxB,6BAA6B;AAAA,IAC7B,qBAAqB;AAAA,IACrB,4BAA4B;AAAA,EAC9B;AACF;AAYO,SAAS,cAAc,SAAS;AACrC,SAAO;AAAA,IACL,YAAY;AAAA,MACV,6BAA6B;AAAA,MAC7B,sBAAsB,OAAO;AAAA,MAC7B,2BAA2B;AAAA,MAC3B,mBAAmB,OAAO;AAAA,MAC1B,0BAA0B;AAAA,IAC5B;AAAA,EACF;AACF;;;ACzDA,IAAM,YAAY;AAAA,EAChB,UAAU;AAAA,EACV,SAAS;AACX;AACA,IAAM,SAAS;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AACX;AACA,IAAM,OAAO;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AACX;AACA,IAAM,QAAQ;AAAA,EACZ,UAAU;AAAA,EACV,SAAS;AACX;AACA,IAAM,sBAAsB;AAAA,EAC1B,UAAU;AAAA,EACV,SAAS;AACX;AACA,IAAM,cAAc;AAAA,EAClB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AACZ;AACA,IAAM,mBAAmB;AAAA,EACvB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AACZ;AACA,IAAM,gBAAgB;AAAA,EACpB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AACZ;AAGA,IAAME,QAAO,CAAC;AAUP,SAAS,qBAAqB;AACnC,SAAO;AAAA,IACL,MAAAA;AAAA,EACF;AACF;AAGA,IAAIC,QAAO;AAGX,OAAOA,QAAO,KAAK;AACjB,EAAAD,MAAKC,KAAI,IAAI;AACb,EAAAA;AACA,MAAIA,UAAS,GAAI,CAAAA,QAAO;AAAA,WAAYA,UAAS,GAAI,CAAAA,QAAO;AAC1D;AACAD,MAAK,EAAE,IAAI;AACXA,MAAK,EAAE,IAAI;AACXA,MAAK,EAAE,IAAI;AACXA,MAAK,EAAE,IAAI;AACXA,MAAK,EAAE,IAAI,CAAC,eAAe,gBAAgB;AAC3CA,MAAK,GAAG,IAAI,CAAC,eAAe,gBAAgB;AAC5CA,MAAK,EAAE,IAAI,CAAC,eAAe,WAAW;AACtCA,MAAK,GAAG,IAAI,CAAC,eAAe,WAAW;AAmBvC,SAAS,sBAAsB,SAASE,KAAI,KAAK;AAC/C,QAAMC,QAAO;AAEb,MAAI;AAEJ,MAAI;AACJ,SAAOC;AAYP,WAASA,OAAMH,OAAM;AACnB,QAAI,CAAC,SAASA,KAAI,KAAK,CAAC,cAAc,KAAKE,OAAMA,MAAK,QAAQ,KAAK,mBAAmBA,MAAK,MAAM,GAAG;AAClG,aAAO,IAAIF,KAAI;AAAA,IACjB;AACA,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,MAAM,sBAAsB;AACpC,WAAO,MAAMA,KAAI;AAAA,EACnB;AAYA,WAAS,MAAMA,OAAM;AACnB,QAAI,SAASA,KAAI,GAAG;AAClB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAgBA,WAAS,YAAYA,OAAM;AAEzB,QAAIA,UAAS,IAAI;AACf,aAAO,QAAQ,MAAM,qBAAqB,kBAAkB,cAAc,EAAEA,KAAI;AAAA,IAClF;AAGA,QAAIA,UAAS,MAAMA,UAAS,MAAM,kBAAkBA,KAAI,GAAG;AACzD,aAAO;AACP,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AAQA,WAAO,iBAAiBA,KAAI;AAAA,EAC9B;AAYA,WAAS,eAAeA,OAAM;AAC5B,YAAQ,QAAQA,KAAI;AACpB,UAAM;AACN,WAAO;AAAA,EACT;AAYA,WAAS,iBAAiBA,OAAM;AAG9B,QAAI,QAAQ,OAAO,WAAWE,MAAK,QAAQ,GAAG;AAC5C,cAAQ,KAAK,sBAAsB;AACnC,cAAQ,KAAK,iBAAiB;AAC9B,aAAOD,IAAGD,KAAI;AAAA,IAChB;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AACF;AAaA,SAAS,oBAAoB,SAASC,KAAI,KAAK;AAC7C,QAAMC,QAAO;AACb,SAAO;AAYP,WAAS,SAASF,OAAM;AACtB,QAAIA,UAAS,MAAMA,UAAS,OAAO,CAAC,YAAY,KAAKE,OAAMA,MAAK,QAAQ,KAAK,mBAAmBA,MAAK,MAAM,GAAG;AAC5G,aAAO,IAAIF,KAAI;AAAA,IACjB;AACA,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,MAAM,oBAAoB;AAGlC,WAAO,QAAQ,MAAM,WAAW,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,EAAEA,KAAI;AAAA,EAC1G;AAYA,WAAS,SAASA,OAAM;AACtB,YAAQ,KAAK,oBAAoB;AACjC,YAAQ,KAAK,iBAAiB;AAC9B,WAAOC,IAAGD,KAAI;AAAA,EAChB;AACF;AAaA,SAAS,yBAAyB,SAASC,KAAI,KAAK;AAClD,QAAMC,QAAO;AACb,MAAI,SAAS;AACb,MAAI,OAAO;AACX,SAAO;AAYP,WAAS,cAAcF,OAAM;AAC3B,SAAKA,UAAS,MAAMA,UAAS,QAAQ,iBAAiB,KAAKE,OAAMA,MAAK,QAAQ,KAAK,CAAC,mBAAmBA,MAAK,MAAM,GAAG;AACnH,cAAQ,MAAM,iBAAiB;AAC/B,cAAQ,MAAM,qBAAqB;AACnC,gBAAU,OAAO,cAAcF,KAAI;AACnC,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,qBAAqBA,OAAM;AAElC,QAAI,WAAWA,KAAI,KAAK,OAAO,SAAS,GAAG;AAEzC,gBAAU,OAAO,cAAcA,KAAI;AACnC,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,IAAI;AACf,YAAM,WAAW,OAAO,YAAY;AACpC,UAAI,aAAa,UAAU,aAAa,SAAS;AAC/C,gBAAQ,QAAQA,KAAI;AACpB,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,sBAAsBA,OAAM;AACnC,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AACA,aAAO;AACP,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,cAAcA,OAAM;AAG3B,WAAOA,UAAS,QAAQ,aAAaA,KAAI,KAAK,0BAA0BA,KAAI,KAAK,kBAAkBA,KAAI,KAAK,mBAAmBA,KAAI,IAAI,IAAIA,KAAI,IAAI,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM,aAAa,GAAG,GAAG,EAAEA,KAAI;AAAA,EAC5N;AAYA,WAAS,cAAcA,OAAM;AAC3B,YAAQ,KAAK,qBAAqB;AAClC,YAAQ,KAAK,iBAAiB;AAC9B,WAAOC,IAAGD,KAAI;AAAA,EAChB;AACF;AAaA,SAAS,kBAAkB,SAASC,KAAI,KAAK;AAC3C,MAAI,OAAO;AACX,SAAO;AAYP,WAAS,gBAAgBD,OAAM;AAC7B,SAAKA,UAAS,MAAMA,UAAS,QAAQ,OAAO,GAAG;AAC7C;AACA,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,MAAM,SAAS,GAAG;AAC7B,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,eAAeA,OAAM;AAE5B,WAAOA,UAAS,OAAO,IAAIA,KAAI,IAAIC,IAAGD,KAAI;AAAA,EAC5C;AACF;AAaA,SAAS,eAAe,SAASC,KAAI,KAAK;AAExC,MAAI;AAEJ,MAAI;AAEJ,MAAI;AACJ,SAAO;AAYP,WAAS,aAAaD,OAAM;AAI1B,QAAIA,UAAS,MAAMA,UAAS,IAAI;AAC9B,aAAO,QAAQ,MAAM,OAAO,aAAa,mBAAmB,EAAEA,KAAI;AAAA,IACpE;AAQA,QAAIA,UAAS,QAAQ,0BAA0BA,KAAI,KAAK,kBAAkBA,KAAI,KAAKA,UAAS,MAAM,mBAAmBA,KAAI,GAAG;AAC1H,aAAO,YAAYA,KAAI;AAAA,IACzB;AACA,WAAO;AACP,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,oBAAoBA,OAAM;AAEjC,QAAIA,UAAS,IAAI;AACf,gCAA0B;AAAA,IAC5B,OAGK;AACH,oCAA8B;AAC9B,gCAA0B;AAAA,IAC5B;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAWA,WAAS,YAAYA,OAAM;AAGzB,QAAI,+BAA+B,2BAA2B,CAAC,MAAM;AACnE,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,WAAOC,IAAGD,KAAI;AAAA,EAChB;AACF;AAaA,SAAS,aAAa,SAASC,KAAI;AACjC,MAAI,WAAW;AACf,MAAI,YAAY;AAChB,SAAO;AAYP,WAAS,WAAWD,OAAM;AACxB,QAAIA,UAAS,IAAI;AACf;AACA,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AAKA,QAAIA,UAAS,MAAM,YAAY,UAAU;AACvC,aAAO,kBAAkBA,KAAI;AAAA,IAC/B;AAKA,QAAIA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,KAAK;AAClO,aAAO,QAAQ,MAAM,OAAOC,KAAI,iBAAiB,EAAED,KAAI;AAAA,IACzD;AACA,QAAIA,UAAS,QAAQ,0BAA0BA,KAAI,KAAK,kBAAkBA,KAAI,GAAG;AAC/E,aAAOC,IAAGD,KAAI;AAAA,IAChB;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,kBAAkBA,OAAM;AAE/B,QAAIA,UAAS,IAAI;AACf;AAAA,IACF;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AACF;AAiBA,SAAS,cAAc,SAASC,KAAI,KAAK;AACvC,SAAOG;AAYP,WAASA,OAAMJ,OAAM;AAEnB,QAAIA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,KAAK;AACrL,cAAQ,QAAQA,KAAI;AACpB,aAAOI;AAAA,IACT;AAKA,QAAIJ,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AAKA,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA;AAAA;AAAA,MAEAA,UAAS;AAAA,MAETA,UAAS,QAAQ,0BAA0BA,KAAI,KAAK,kBAAkBA,KAAI;AAAA,MAAG;AAC3E,aAAOC,IAAGD,KAAI;AAAA,IAChB;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAeA,WAAS,kBAAkBA,OAAM;AAG/B,QAAIA,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAM,0BAA0BA,KAAI,KAAK,kBAAkBA,KAAI,GAAG;AAC7G,aAAOC,IAAGD,KAAI;AAAA,IAChB;AACA,WAAOI,OAAMJ,KAAI;AAAA,EACnB;AAYA,WAAS,6BAA6BA,OAAM;AAE1C,WAAO,WAAWA,KAAI,IAAI,8BAA8BA,KAAI,IAAI,IAAIA,KAAI;AAAA,EAC1E;AAYA,WAAS,8BAA8BA,OAAM;AAE3C,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAOI;AAAA,IACT;AACA,QAAI,WAAWJ,KAAI,GAAG;AACpB,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AAGA,WAAO,IAAIA,KAAI;AAAA,EACjB;AACF;AAiBA,SAAS,4BAA4B,SAASC,KAAI,KAAK;AACrD,SAAOE;AAYP,WAASA,OAAMH,OAAM;AAEnB,YAAQ,QAAQA,KAAI;AACpB,WAAO;AAAA,EACT;AAYA,WAAS,MAAMA,OAAM;AAEnB,WAAO,kBAAkBA,KAAI,IAAI,IAAIA,KAAI,IAAIC,IAAGD,KAAI;AAAA,EACtD;AACF;AAQA,SAAS,YAAYA,OAAM;AACzB,SAAOA,UAAS,QAAQA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,OAAO,0BAA0BA,KAAI;AACnJ;AAQA,SAAS,iBAAiBA,OAAM;AAC9B,SAAO,CAAC,WAAWA,KAAI;AACzB;AAMA,SAAS,cAAcA,OAAM;AAK3B,SAAO,EAAEA,UAAS,MAAM,SAASA,KAAI;AACvC;AAMA,SAAS,SAASA,OAAM;AACtB,SAAOA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAMA,UAAS,MAAM,kBAAkBA,KAAI;AAC3F;AAMA,SAAS,mBAAmB,QAAQ;AAClC,MAAIK,SAAQ,OAAO;AACnB,MAAI,SAAS;AACb,SAAOA,UAAS;AACd,UAAM,QAAQ,OAAOA,MAAK,EAAE,CAAC;AAC7B,SAAK,MAAM,SAAS,eAAe,MAAM,SAAS,iBAAiB,CAAC,MAAM,WAAW;AACnF,eAAS;AACT;AAAA,IACF;AAIA,QAAI,MAAM,+BAA+B;AACvC,eAAS;AACT;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,SAAS,KAAK,CAAC,QAAQ;AAGhC,WAAO,OAAO,SAAS,CAAC,EAAE,CAAC,EAAE,gCAAgC;AAAA,EAC/D;AACA,SAAO;AACT;;;AC70BA,IAAM,SAAS;AAAA,EACb,UAAUC;AAAA,EACV,SAAS;AACX;AAeO,SAAS,cAAc;AAE5B,SAAO;AAAA,IACL,UAAU;AAAA,MACR,CAAC,EAAE,GAAG;AAAA,QACJ,MAAM;AAAA,QACN,UAAU;AAAA,QACV,cAAc;AAAA,UACZ,UAAU;AAAA,QACZ;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,CAAC,EAAE,GAAG;AAAA,QACJ,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,MACA,CAAC,EAAE,GAAG;AAAA,QACJ,MAAM;AAAA,QACN,KAAK;AAAA,QACL,UAAU;AAAA,QACV,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAOA,SAAS,iCAAiC,SAASC,KAAI,KAAK;AAC1D,QAAMC,QAAO;AACb,MAAIC,SAAQD,MAAK,OAAO;AACxB,QAAM,UAAUA,MAAK,OAAO,iBAAiBA,MAAK,OAAO,eAAe,CAAC;AAEzE,MAAI;AAGJ,SAAOC,UAAS;AACd,UAAM,QAAQD,MAAK,OAAOC,MAAK,EAAE,CAAC;AAClC,QAAI,MAAM,SAAS,cAAc;AAC/B,mBAAa;AACb;AAAA,IACF;AAGA,QAAI,MAAM,SAAS,qBAAqB,MAAM,SAAS,eAAe,MAAM,SAAS,WAAW,MAAM,SAAS,WAAW,MAAM,SAAS,QAAQ;AAC/I;AAAA,IACF;AAAA,EACF;AACA,SAAOC;AAKP,WAASA,OAAMC,OAAM;AACnB,QAAI,CAAC,cAAc,CAAC,WAAW,WAAW;AACxC,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,UAAM,KAAK,oBAAoBH,MAAK,eAAe;AAAA,MACjD,OAAO,WAAW;AAAA,MAClB,KAAKA,MAAK,IAAI;AAAA,IAChB,CAAC,CAAC;AACF,QAAI,GAAG,YAAY,CAAC,MAAM,MAAM,CAAC,QAAQ,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG;AAC9D,aAAO,IAAIG,KAAI;AAAA,IACjB;AACA,YAAQ,MAAM,4BAA4B;AAC1C,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,4BAA4B;AACzC,WAAOJ,IAAGI,KAAI;AAAA,EAChB;AACF;AAIA,SAAS,kCAAkC,QAAQ,SAAS;AAC1D,MAAIF,SAAQ,OAAO;AAEnB,MAAI;AAGJ,SAAOA,UAAS;AACd,QAAI,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,gBAAgB,OAAOA,MAAK,EAAE,CAAC,MAAM,SAAS;AAC1E,mBAAa,OAAOA,MAAK,EAAE,CAAC;AAC5B;AAAA,IACF;AAAA,EACF;AAEA,SAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE,OAAO;AAC5B,SAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE,OAAO;AAI5B,QAAM,OAAO;AAAA,IACX,MAAM;AAAA,IACN,OAAO,OAAO,OAAO,CAAC,GAAG,OAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE,KAAK;AAAA,IACnD,KAAK,OAAO,OAAO,CAAC,GAAG,OAAO,OAAO,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG;AAAA,EACzD;AAGA,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,OAAO,OAAO,OAAO,CAAC,GAAG,OAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE,GAAG;AAAA,IACjD,KAAK,OAAO,OAAO,CAAC,GAAG,OAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE,GAAG;AAAA,EACjD;AAEA,SAAO,IAAI;AACX,SAAO,IAAI;AACX,SAAO,IAAI;AAEX,QAAMG,UAAS;AAAA,IACb,MAAM;AAAA,IACN,OAAO,OAAO,OAAO,CAAC,GAAG,OAAO,GAAG;AAAA,IACnC,KAAK,OAAO,OAAO,CAAC,GAAG,OAAO,OAAO,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK;AAAA,EAC3D;AAEA,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO,OAAO,OAAO,CAAC,GAAGA,QAAO,KAAK;AAAA,IACrC,KAAK,OAAO,OAAO,CAAC,GAAGA,QAAO,GAAG;AAAA,EACnC;AAGA,QAAM,cAAc;AAAA;AAAA,IAEpB,OAAOH,SAAQ,CAAC;AAAA,IAAG,OAAOA,SAAQ,CAAC;AAAA,IAAG,CAAC,SAAS,MAAM,OAAO;AAAA;AAAA,IAE7D,OAAOA,SAAQ,CAAC;AAAA,IAAG,OAAOA,SAAQ,CAAC;AAAA;AAAA,IAEnC,CAAC,SAAS,QAAQ,OAAO;AAAA,IAAG,CAAC,QAAQ,QAAQ,OAAO;AAAA;AAAA,IAEpD,CAAC,SAASG,SAAQ,OAAO;AAAA,IAAG,CAAC,SAAS,OAAO,OAAO;AAAA,IAAG,CAAC,QAAQ,OAAO,OAAO;AAAA,IAAG,CAAC,QAAQA,SAAQ,OAAO;AAAA;AAAA,IAEzG,OAAO,OAAO,SAAS,CAAC;AAAA,IAAG,OAAO,OAAO,SAAS,CAAC;AAAA,IAAG,CAAC,QAAQ,MAAM,OAAO;AAAA,EAAC;AAC7E,SAAO,OAAOH,QAAO,OAAO,SAASA,SAAQ,GAAG,GAAG,WAAW;AAC9D,SAAO;AACT;AAMA,SAAS,wBAAwB,SAASF,KAAI,KAAK;AACjD,QAAMC,QAAO;AACb,QAAM,UAAUA,MAAK,OAAO,iBAAiBA,MAAK,OAAO,eAAe,CAAC;AACzE,MAAI,OAAO;AAEX,MAAI;AAOJ,SAAOE;AAYP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,MAAM,4BAA4B;AAC1C,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,4BAA4B;AACzC,WAAO;AAAA,EACT;AAYA,WAAS,UAAUA,OAAM;AACvB,QAAIA,UAAS,GAAI,QAAO,IAAIA,KAAI;AAChC,YAAQ,MAAM,uBAAuB;AACrC,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,uBAAuB;AACpC,YAAQ,MAAM,uBAAuB;AACrC,YAAQ,MAAM,aAAa,EAAE,cAAc;AAC3C,WAAO;AAAA,EACT;AAYA,WAAS,SAASA,OAAM;AACtB;AAAA;AAAA,MAEA,OAAO;AAAA,MAEPA,UAAS,MAAM,CAAC;AAAA;AAAA,MAGhBA,UAAS,QAAQA,UAAS,MAAM,0BAA0BA,KAAI;AAAA,MAAG;AAC/D,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,KAAK,aAAa;AAC1B,YAAM,QAAQ,QAAQ,KAAK,uBAAuB;AAClD,UAAI,CAAC,QAAQ,SAAS,oBAAoBH,MAAK,eAAe,KAAK,CAAC,CAAC,GAAG;AACtE,eAAO,IAAIG,KAAI;AAAA,MACjB;AACA,cAAQ,MAAM,4BAA4B;AAC1C,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,4BAA4B;AACzC,cAAQ,KAAK,iBAAiB;AAC9B,aAAOJ;AAAA,IACT;AACA,QAAI,CAAC,0BAA0BI,KAAI,GAAG;AACpC,aAAO;AAAA,IACT;AACA;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAOA,UAAS,KAAK,aAAa;AAAA,EACpC;AAYA,WAAS,WAAWA,OAAM;AACxB,QAAIA,UAAS,MAAMA,UAAS,MAAMA,UAAS,IAAI;AAC7C,cAAQ,QAAQA,KAAI;AACpB;AACA,aAAO;AAAA,IACT;AACA,WAAO,SAASA,KAAI;AAAA,EACtB;AACF;AAMA,SAAS,wBAAwB,SAASJ,KAAI,KAAK;AACjD,QAAMC,QAAO;AACb,QAAM,UAAUA,MAAK,OAAO,iBAAiBA,MAAK,OAAO,eAAe,CAAC;AAEzE,MAAI;AACJ,MAAI,OAAO;AAEX,MAAI;AACJ,SAAOE;AAYP,WAASA,OAAMC,OAAM;AACnB,YAAQ,MAAM,uBAAuB,EAAE,aAAa;AACpD,YAAQ,MAAM,4BAA4B;AAC1C,YAAQ,MAAM,kCAAkC;AAChD,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,kCAAkC;AAC/C,WAAO;AAAA,EACT;AAYA,WAAS,cAAcA,OAAM;AAC3B,QAAIA,UAAS,IAAI;AACf,cAAQ,MAAM,6BAA6B;AAC3C,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,6BAA6B;AAC1C,cAAQ,MAAM,kCAAkC;AAChD,cAAQ,MAAM,aAAa,EAAE,cAAc;AAC3C,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAeA,WAAS,YAAYA,OAAM;AACzB;AAAA;AAAA,MAEA,OAAO;AAAA,MAEPA,UAAS,MAAM,CAAC;AAAA;AAAA,MAGhBA,UAAS,QAAQA,UAAS,MAAM,0BAA0BA,KAAI;AAAA,MAAG;AAC/D,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAIA,UAAS,IAAI;AACf,cAAQ,KAAK,aAAa;AAC1B,YAAM,QAAQ,QAAQ,KAAK,kCAAkC;AAC7D,mBAAa,oBAAoBH,MAAK,eAAe,KAAK,CAAC;AAC3D,cAAQ,MAAM,kCAAkC;AAChD,cAAQ,QAAQG,KAAI;AACpB,cAAQ,KAAK,kCAAkC;AAC/C,cAAQ,KAAK,4BAA4B;AACzC,aAAO;AAAA,IACT;AACA,QAAI,CAAC,0BAA0BA,KAAI,GAAG;AACpC,aAAO;AAAA,IACT;AACA;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAOA,UAAS,KAAK,cAAc;AAAA,EACrC;AAeA,WAAS,YAAYA,OAAM;AACzB,QAAIA,UAAS,MAAMA,UAAS,MAAMA,UAAS,IAAI;AAC7C,cAAQ,QAAQA,KAAI;AACpB;AACA,aAAO;AAAA,IACT;AACA,WAAO,YAAYA,KAAI;AAAA,EACzB;AAYA,WAAS,WAAWA,OAAM;AACxB,QAAIA,UAAS,IAAI;AACf,cAAQ,MAAM,kBAAkB;AAChC,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,kBAAkB;AAC/B,UAAI,CAAC,QAAQ,SAAS,UAAU,GAAG;AACjC,gBAAQ,KAAK,UAAU;AAAA,MACzB;AAKA,aAAO,aAAa,SAAS,iBAAiB,iCAAiC;AAAA,IACjF;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,gBAAgBA,OAAM;AAE7B,WAAOJ,IAAGI,KAAI;AAAA,EAChB;AACF;AAMA,SAAS,+BAA+B,SAASJ,KAAI,KAAK;AAUxD,SAAO,QAAQ,MAAM,WAAWA,KAAI,QAAQ,QAAQ,QAAQA,KAAI,GAAG,CAAC;AACtE;AAGA,SAAS,yBAAyB,SAAS;AACzC,UAAQ,KAAK,uBAAuB;AACtC;AAMA,SAASD,gBAAe,SAASC,KAAI,KAAK;AACxC,QAAMC,QAAO;AACb,SAAO,aAAa,SAAS,aAAa,+BAA+B,IAAI,CAAC;AAK9E,WAAS,YAAYG,OAAM;AACzB,UAAM,OAAOH,MAAK,OAAOA,MAAK,OAAO,SAAS,CAAC;AAC/C,WAAO,QAAQ,KAAK,CAAC,EAAE,SAAS,iCAAiC,KAAK,CAAC,EAAE,eAAe,KAAK,CAAC,GAAG,IAAI,EAAE,WAAW,IAAID,IAAGI,KAAI,IAAI,IAAIA,KAAI;AAAA,EAC3I;AACF;;;ACndO,SAAS,iBAAiB,SAAS;AACxC,QAAM,WAAW,WAAW,CAAC;AAC7B,MAAI,SAAS,SAAS;AACtB,QAAM,YAAY;AAAA,IAChB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AACA,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,aAAS;AAAA,EACX;AACA,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,CAAC,GAAG,GAAG;AAAA,IACT;AAAA,IACA,YAAY;AAAA,MACV,MAAM,CAAC,SAAS;AAAA,IAClB;AAAA,IACA,kBAAkB;AAAA,MAChB,MAAM,CAAC,GAAG;AAAA,IACZ;AAAA,EACF;AAOA,WAAS,wBAAwB,QAAQ,SAAS;AAChD,QAAIE,SAAQ;AAGZ,WAAO,EAAEA,SAAQ,OAAO,QAAQ;AAE9B,UAAI,OAAOA,MAAK,EAAE,CAAC,MAAM,WAAW,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,oCAAoC,OAAOA,MAAK,EAAE,CAAC,EAAE,QAAQ;AACzH,YAAI,OAAOA;AAGX,eAAO,QAAQ;AAEb,cAAI,OAAO,IAAI,EAAE,CAAC,MAAM,UAAU,OAAO,IAAI,EAAE,CAAC,EAAE,SAAS,oCAAoC,OAAO,IAAI,EAAE,CAAC,EAAE;AAAA,UAE/G,OAAOA,MAAK,EAAE,CAAC,EAAE,IAAI,SAAS,OAAOA,MAAK,EAAE,CAAC,EAAE,MAAM,WAAW,OAAO,IAAI,EAAE,CAAC,EAAE,IAAI,SAAS,OAAO,IAAI,EAAE,CAAC,EAAE,MAAM,QAAQ;AACzH,mBAAOA,MAAK,EAAE,CAAC,EAAE,OAAO;AACxB,mBAAO,IAAI,EAAE,CAAC,EAAE,OAAO;AAGvB,kBAAMC,iBAAgB;AAAA,cACpB,MAAM;AAAA,cACN,OAAO,OAAO,OAAO,CAAC,GAAG,OAAO,IAAI,EAAE,CAAC,EAAE,KAAK;AAAA,cAC9C,KAAK,OAAO,OAAO,CAAC,GAAG,OAAOD,MAAK,EAAE,CAAC,EAAE,GAAG;AAAA,YAC7C;AAGA,kBAAME,QAAO;AAAA,cACX,MAAM;AAAA,cACN,OAAO,OAAO,OAAO,CAAC,GAAG,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG;AAAA,cAC5C,KAAK,OAAO,OAAO,CAAC,GAAG,OAAOF,MAAK,EAAE,CAAC,EAAE,KAAK;AAAA,YAC/C;AAIA,kBAAM,aAAa,CAAC,CAAC,SAASC,gBAAe,OAAO,GAAG,CAAC,SAAS,OAAO,IAAI,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,QAAQ,OAAO,IAAI,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,SAASC,OAAM,OAAO,CAAC;AACxJ,kBAAMC,cAAa,QAAQ,OAAO,WAAW,WAAW;AACxD,gBAAIA,aAAY;AAEd,qBAAO,YAAY,WAAW,QAAQ,GAAG,WAAWA,aAAY,OAAO,MAAM,OAAO,GAAGH,MAAK,GAAG,OAAO,CAAC;AAAA,YACzG;AAGA,mBAAO,YAAY,WAAW,QAAQ,GAAG,CAAC,CAAC,QAAQE,OAAM,OAAO,GAAG,CAAC,SAAS,OAAOF,MAAK,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,QAAQ,OAAOA,MAAK,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,QAAQC,gBAAe,OAAO,CAAC,CAAC;AAC/K,mBAAO,QAAQ,OAAO,GAAGD,SAAQ,OAAO,GAAG,UAAU;AACrD,YAAAA,SAAQ,OAAO,WAAW,SAAS;AACnC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAAA,SAAQ;AACR,WAAO,EAAEA,SAAQ,OAAO,QAAQ;AAC9B,UAAI,OAAOA,MAAK,EAAE,CAAC,EAAE,SAAS,kCAAkC;AAC9D,eAAOA,MAAK,EAAE,CAAC,EAAE,OAAO;AAAA,MAC1B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAMA,WAAS,sBAAsB,SAASI,KAAI,KAAK;AAC/C,UAAMC,YAAW,KAAK;AACtB,UAAM,SAAS,KAAK;AACpB,QAAI,OAAO;AACX,WAAOC;AAGP,aAASA,OAAMC,OAAM;AACnB,UAAIF,cAAa,OAAO,OAAO,OAAO,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,mBAAmB;AAC/E,eAAO,IAAIE,KAAI;AAAA,MACjB;AACA,cAAQ,MAAM,gCAAgC;AAC9C,aAAO,KAAKA,KAAI;AAAA,IAClB;AAGA,aAAS,KAAKA,OAAM;AAClB,YAAM,SAAS,kBAAkBF,SAAQ;AACzC,UAAIE,UAAS,KAAK;AAEhB,YAAI,OAAO,EAAG,QAAO,IAAIA,KAAI;AAC7B,gBAAQ,QAAQA,KAAI;AACpB;AACA,eAAO;AAAA,MACT;AACA,UAAI,OAAO,KAAK,CAAC,OAAQ,QAAO,IAAIA,KAAI;AACxC,YAAM,QAAQ,QAAQ,KAAK,gCAAgC;AAC3D,YAAM,QAAQ,kBAAkBA,KAAI;AACpC,YAAM,QAAQ,CAAC,SAAS,UAAU,KAAK,QAAQ,MAAM;AACrD,YAAM,SAAS,CAAC,UAAU,WAAW,KAAK,QAAQ,KAAK;AACvD,aAAOH,IAAGG,KAAI;AAAA,IAChB;AAAA,EACF;AACF;;;ACpHO,IAAM,UAAN,MAAc;AAAA;AAAA;AAAA;AAAA,EAInB,cAAc;AAMZ,SAAK,MAAM,CAAC;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAIC,QAAO,QAAQ,KAAK;AACtB,sBAAkB,MAAMA,QAAO,QAAQ,GAAG;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,QAAQ,QAAQ;AACd,SAAK,IAAI,KAAK,SAAU,GAAG,GAAG;AAC5B,aAAO,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,IACnB,CAAC;AAGD,QAAI,KAAK,IAAI,WAAW,GAAG;AACzB;AAAA,IACF;AAoBA,QAAIA,SAAQ,KAAK,IAAI;AAErB,UAAM,OAAO,CAAC;AACd,WAAOA,SAAQ,GAAG;AAChB,MAAAA,UAAS;AACT,WAAK,KAAK,OAAO,MAAM,KAAK,IAAIA,MAAK,EAAE,CAAC,IAAI,KAAK,IAAIA,MAAK,EAAE,CAAC,CAAC,GAAG,KAAK,IAAIA,MAAK,EAAE,CAAC,CAAC;AAGnF,aAAO,SAAS,KAAK,IAAIA,MAAK,EAAE,CAAC;AAAA,IACnC;AACA,SAAK,KAAK,OAAO,MAAM,CAAC;AACxB,WAAO,SAAS;AAChB,QAAI,QAAQ,KAAK,IAAI;AACrB,WAAO,OAAO;AACZ,iBAAWC,YAAW,OAAO;AAC3B,eAAO,KAAKA,QAAO;AAAA,MACrB;AACA,cAAQ,KAAK,IAAI;AAAA,IACnB;AAGA,SAAK,IAAI,SAAS;AAAA,EACpB;AACF;AAWA,SAAS,kBAAkB,SAAS,IAAI,QAAQ,KAAK;AACnD,MAAID,SAAQ;AAGZ,MAAI,WAAW,KAAK,IAAI,WAAW,GAAG;AACpC;AAAA,EACF;AACA,SAAOA,SAAQ,QAAQ,IAAI,QAAQ;AACjC,QAAI,QAAQ,IAAIA,MAAK,EAAE,CAAC,MAAM,IAAI;AAChC,cAAQ,IAAIA,MAAK,EAAE,CAAC,KAAK;AAOzB,cAAQ,IAAIA,MAAK,EAAE,CAAC,EAAE,KAAK,GAAG,GAAG;AAGjC;AAAA,IACF;AACA,IAAAA,UAAS;AAAA,EACX;AACA,UAAQ,IAAI,KAAK,CAAC,IAAI,QAAQ,GAAG,CAAC;AACpC;;;ACzIO,SAAS,cAAc,QAAQE,QAAO;AAC3C,MAAI,iBAAiB;AAErB,QAAM,QAAQ,CAAC;AACf,SAAOA,SAAQ,OAAO,QAAQ;AAC5B,UAAM,QAAQ,OAAOA,MAAK;AAC1B,QAAI,gBAAgB;AAClB,UAAI,MAAM,CAAC,MAAM,SAAS;AAGxB,YAAI,MAAM,CAAC,EAAE,SAAS,gBAAgB;AACpC,gBAAM,KAAK,OAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,yBAAyB,SAAS,MAAM;AAAA,QACnF;AAAA,MACF,WAIS,MAAM,CAAC,EAAE,SAAS,gBAAgB;AACzC,YAAI,OAAOA,SAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,wBAAwB;AACxD,gBAAM,aAAa,MAAM,SAAS;AAClC,gBAAM,UAAU,IAAI,MAAM,UAAU,MAAM,SAAS,WAAW;AAAA,QAChE;AAAA,MACF,WAES,MAAM,CAAC,EAAE,SAAS,qBAAqB;AAC9C;AAAA,MACF;AAAA,IACF,WAAW,MAAM,CAAC,MAAM,WAAW,MAAM,CAAC,EAAE,SAAS,qBAAqB;AACxE,uBAAiB;AAAA,IACnB;AACA,IAAAA,UAAS;AAAA,EACX;AACA,SAAO;AACT;;;AC3BO,SAAS,WAAW;AACzB,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,cAAc,SAASC,KAAI,KAAK;AACvC,QAAMC,QAAO;AACb,MAAI,OAAO;AACX,MAAI,QAAQ;AAEZ,MAAI;AACJ,SAAOC;AAkBP,WAASA,OAAMC,OAAM;AACnB,QAAIC,SAAQH,MAAK,OAAO,SAAS;AACjC,WAAOG,SAAQ,IAAI;AACjB,YAAM,OAAOH,MAAK,OAAOG,MAAK,EAAE,CAAC,EAAE;AACnC,UAAI,SAAS;AAAA,MAEb,SAAS,aAAc,CAAAA;AAAA,UAAa;AAAA,IACtC;AACA,UAAM,OAAOA,SAAQ,KAAKH,MAAK,OAAOG,MAAK,EAAE,CAAC,EAAE,OAAO;AACvD,UAAM,OAAO,SAAS,eAAe,SAAS,aAAa,eAAe;AAG1E,QAAI,SAAS,gBAAgBH,MAAK,OAAO,KAAKA,MAAK,IAAI,EAAE,IAAI,GAAG;AAC9D,aAAO,IAAIE,KAAI;AAAA,IACjB;AACA,WAAO,KAAKA,KAAI;AAAA,EAClB;AAcA,WAAS,cAAcA,OAAM;AAC3B,YAAQ,MAAM,WAAW;AACzB,YAAQ,MAAM,UAAU;AACxB,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAcA,WAAS,aAAaA,OAAM;AAC1B,QAAIA,UAAS,KAAK;AAChB,aAAO,aAAaA,KAAI;AAAA,IAC1B;AAYA,WAAO;AAEP,aAAS;AACT,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAgBA,WAAS,aAAaA,OAAM;AAC1B,QAAIA,UAAS,MAAM;AAEjB,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAI,mBAAmBA,KAAI,GAAG;AAE5B,UAAI,QAAQ,GAAG;AACb,gBAAQ;AAGR,QAAAF,MAAK,YAAY;AACjB,gBAAQ,KAAK,UAAU;AACvB,gBAAQ,MAAM,YAAY;AAC1B,gBAAQ,QAAQE,KAAI;AACpB,gBAAQ,KAAK,YAAY;AACzB,eAAO;AAAA,MACT;AAGA,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,QAAI,cAAcA,KAAI,GAAG;AAIvB,aAAO,aAAa,SAAS,cAAc,YAAY,EAAEA,KAAI;AAAA,IAC/D;AACA,aAAS;AACT,QAAI,MAAM;AACR,aAAO;AAEP,cAAQ;AAAA,IACV;AACA,QAAIA,UAAS,KAAK;AAChB,cAAQ,MAAM,kBAAkB;AAChC,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,kBAAkB;AAE/B,aAAO;AACP,aAAO;AAAA,IACT;AAGA,YAAQ,MAAM,MAAM;AACpB,WAAO,YAAYA,KAAI;AAAA,EACzB;AAcA,WAAS,YAAYA,OAAM;AACzB,QAAIA,UAAS,QAAQA,UAAS,OAAO,0BAA0BA,KAAI,GAAG;AACpE,cAAQ,KAAK,MAAM;AACnB,aAAO,aAAaA,KAAI;AAAA,IAC1B;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAOA,UAAS,KAAK,gBAAgB;AAAA,EACvC;AAcA,WAAS,cAAcA,OAAM;AAC3B,QAAIA,UAAS,MAAMA,UAAS,KAAK;AAC/B,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,YAAYA,KAAI;AAAA,EACzB;AAcA,WAAS,mBAAmBA,OAAM;AAEhC,IAAAF,MAAK,YAAY;AAGjB,QAAIA,MAAK,OAAO,KAAKA,MAAK,IAAI,EAAE,IAAI,GAAG;AACrC,aAAO,IAAIE,KAAI;AAAA,IACjB;AACA,YAAQ,MAAM,mBAAmB;AAEjC,WAAO;AACP,QAAI,cAAcA,KAAI,GAAG;AACvB,aAAO,aAAa,SAAS,qBAAqB,cAAcF,MAAK,OAAO,WAAW,QAAQ,KAAK,SAAS,cAAc,IAAI,SAAY,CAAC,EAAEE,KAAI;AAAA,IACpJ;AACA,WAAO,oBAAoBA,KAAI;AAAA,EACjC;AAgBA,WAAS,oBAAoBA,OAAM;AACjC,QAAIA,UAAS,MAAMA,UAAS,IAAI;AAC9B,aAAO,yBAAyBA,KAAI;AAAA,IACtC;AACA,QAAIA,UAAS,KAAK;AAChB,aAAO;AAEP,cAAQ,MAAM,kBAAkB;AAChC,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,kBAAkB;AAC/B,aAAO;AAAA,IACT;AAGA,WAAO,iBAAiBA,KAAI;AAAA,EAC9B;AAaA,WAAS,wBAAwBA,OAAM;AACrC,QAAI,cAAcA,KAAI,GAAG;AACvB,aAAO,aAAa,SAAS,0BAA0B,YAAY,EAAEA,KAAI;AAAA,IAC3E;AACA,WAAO,yBAAyBA,KAAI;AAAA,EACtC;AAaA,WAAS,yBAAyBA,OAAM;AAEtC,QAAIA,UAAS,IAAI;AACf,eAAS;AACT,aAAO;AACP,cAAQ,MAAM,sBAAsB;AACpC,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,sBAAsB;AACnC,aAAO;AAAA,IACT;AAGA,QAAIA,UAAS,IAAI;AACf,eAAS;AAET,aAAO,gCAAgCA,KAAI;AAAA,IAC7C;AACA,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,aAAO,uBAAuBA,KAAI;AAAA,IACpC;AACA,WAAO,iBAAiBA,KAAI;AAAA,EAC9B;AAaA,WAAS,gCAAgCA,OAAM;AAC7C,QAAIA,UAAS,IAAI;AACf,cAAQ,MAAM,sBAAsB;AACpC,aAAO,oBAAoBA,KAAI;AAAA,IACjC;AAGA,WAAO,iBAAiBA,KAAI;AAAA,EAC9B;AAaA,WAAS,oBAAoBA,OAAM;AACjC,QAAIA,UAAS,IAAI;AACf,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AAGA,QAAIA,UAAS,IAAI;AACf,aAAO;AACP,cAAQ,KAAK,sBAAsB;AACnC,cAAQ,MAAM,sBAAsB;AACpC,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,sBAAsB;AACnC,aAAO;AAAA,IACT;AACA,YAAQ,KAAK,sBAAsB;AACnC,WAAO,iCAAiCA,KAAI;AAAA,EAC9C;AAaA,WAAS,iCAAiCA,OAAM;AAC9C,QAAI,cAAcA,KAAI,GAAG;AACvB,aAAO,aAAa,SAAS,wBAAwB,YAAY,EAAEA,KAAI;AAAA,IACzE;AACA,WAAO,uBAAuBA,KAAI;AAAA,EACpC;AAaA,WAAS,uBAAuBA,OAAM;AACpC,QAAIA,UAAS,KAAK;AAChB,aAAO,oBAAoBA,KAAI;AAAA,IACjC;AACA,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAK7C,UAAI,CAAC,QAAQ,SAAS,OAAO;AAC3B,eAAO,iBAAiBA,KAAI;AAAA,MAC9B;AAGA,cAAQ,KAAK,mBAAmB;AAChC,cAAQ,KAAK,WAAW;AAGxB,aAAOH,IAAGG,KAAI;AAAA,IAChB;AACA,WAAO,iBAAiBA,KAAI;AAAA,EAC9B;AAaA,WAAS,iBAAiBA,OAAM;AAE9B,WAAO,IAAIA,KAAI;AAAA,EACjB;AAcA,WAAS,aAAaA,OAAM;AAI1B,YAAQ,MAAM,UAAU;AACxB,WAAO,aAAaA,KAAI;AAAA,EAC1B;AAgBA,WAAS,aAAaA,OAAM;AAC1B,QAAIA,UAAS,KAAK;AAChB,cAAQ,MAAM,kBAAkB;AAChC,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,kBAAkB;AAC/B,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,QAAQ,mBAAmBA,KAAI,GAAG;AAC7C,cAAQ,KAAK,UAAU;AACvB,aAAOH,IAAGG,KAAI;AAAA,IAChB;AACA,QAAI,cAAcA,KAAI,GAAG;AACvB,aAAO,aAAa,SAAS,cAAc,YAAY,EAAEA,KAAI;AAAA,IAC/D;AAGA,YAAQ,MAAM,MAAM;AACpB,WAAO,YAAYA,KAAI;AAAA,EACzB;AAcA,WAAS,YAAYA,OAAM;AACzB,QAAIA,UAAS,QAAQA,UAAS,OAAO,0BAA0BA,KAAI,GAAG;AACpE,cAAQ,KAAK,MAAM;AACnB,aAAO,aAAaA,KAAI;AAAA,IAC1B;AACA,YAAQ,QAAQA,KAAI;AACpB,WAAOA,UAAS,KAAK,gBAAgB;AAAA,EACvC;AAcA,WAAS,cAAcA,OAAM;AAC3B,QAAIA,UAAS,MAAMA,UAAS,KAAK;AAC/B,cAAQ,QAAQA,KAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,YAAYA,KAAI;AAAA,EACzB;AACF;AAIA,SAAS,aAAa,QAAQ,SAAS;AACrC,MAAIC,SAAQ;AACZ,MAAI,0BAA0B;AAE9B,MAAI,UAAU;AAEd,MAAI,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC;AAE1B,MAAI,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AACtB,MAAI,gCAAgC;AACpC,MAAI,eAAe;AAEnB,MAAI;AAEJ,MAAI;AAEJ,MAAI;AACJ,QAAMC,OAAM,IAAI,QAAQ;AACxB,SAAO,EAAED,SAAQ,OAAO,QAAQ;AAC9B,UAAM,QAAQ,OAAOA,MAAK;AAC1B,UAAM,QAAQ,MAAM,CAAC;AACrB,QAAI,MAAM,CAAC,MAAM,SAAS;AAExB,UAAI,MAAM,SAAS,aAAa;AAC9B,wCAAgC;AAGhC,YAAI,iBAAiB,GAAG;AACtB,wBAAcC,MAAK,SAAS,cAAc,cAAc,WAAW;AACnE,wBAAc;AACd,yBAAe;AAAA,QACjB;AAGA,uBAAe;AAAA,UACb,MAAM;AAAA,UACN,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK;AAAA;AAAA,UAEpC,KAAK,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG;AAAA,QAClC;AACA,QAAAA,KAAI,IAAID,QAAO,GAAG,CAAC,CAAC,SAAS,cAAc,OAAO,CAAC,CAAC;AAAA,MACtD,WAAW,MAAM,SAAS,cAAc,MAAM,SAAS,qBAAqB;AAC1E,kCAA0B;AAC1B,sBAAc;AACd,mBAAW,CAAC,GAAG,GAAG,GAAG,CAAC;AACtB,eAAO,CAAC,GAAGA,SAAQ,GAAG,GAAG,CAAC;AAG1B,YAAI,+BAA+B;AACjC,0CAAgC;AAChC,wBAAc;AAAA,YACZ,MAAM;AAAA,YACN,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK;AAAA;AAAA,YAEpC,KAAK,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG;AAAA,UAClC;AACA,UAAAC,KAAI,IAAID,QAAO,GAAG,CAAC,CAAC,SAAS,aAAa,OAAO,CAAC,CAAC;AAAA,QACrD;AACA,kBAAU,MAAM,SAAS,sBAAsB,IAAI,cAAc,IAAI;AAAA,MACvE,WAES,YAAY,MAAM,SAAS,UAAU,MAAM,SAAS,0BAA0B,MAAM,SAAS,yBAAyB;AAC7H,kCAA0B;AAG1B,YAAI,KAAK,CAAC,MAAM,GAAG;AACjB,cAAI,SAAS,CAAC,MAAM,GAAG;AACrB,iBAAK,CAAC,IAAI,KAAK,CAAC;AAChB,0BAAc,UAAUC,MAAK,SAAS,UAAU,SAAS,QAAW,WAAW;AAC/E,uBAAW,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,UACxB;AACA,eAAK,CAAC,IAAID;AAAA,QACZ;AAAA,MACF,WAAW,MAAM,SAAS,oBAAoB;AAC5C,YAAI,yBAAyB;AAC3B,oCAA0B;AAAA,QAC5B,OAAO;AACL,cAAI,SAAS,CAAC,MAAM,GAAG;AACrB,iBAAK,CAAC,IAAI,KAAK,CAAC;AAChB,0BAAc,UAAUC,MAAK,SAAS,UAAU,SAAS,QAAW,WAAW;AAAA,UACjF;AACA,qBAAW;AACX,iBAAO,CAAC,SAAS,CAAC,GAAGD,QAAO,GAAG,CAAC;AAAA,QAClC;AAAA,MACF;AAAA,IACF,WAES,MAAM,SAAS,aAAa;AACnC,sCAAgC;AAChC,qBAAeA;AAAA,IACjB,WAAW,MAAM,SAAS,cAAc,MAAM,SAAS,qBAAqB;AAC1E,qBAAeA;AACf,UAAI,SAAS,CAAC,MAAM,GAAG;AACrB,aAAK,CAAC,IAAI,KAAK,CAAC;AAChB,sBAAc,UAAUC,MAAK,SAAS,UAAU,SAASD,QAAO,WAAW;AAAA,MAC7E,WAAW,KAAK,CAAC,MAAM,GAAG;AACxB,sBAAc,UAAUC,MAAK,SAAS,MAAM,SAASD,QAAO,WAAW;AAAA,MACzE;AACA,gBAAU;AAAA,IACZ,WAAW,YAAY,MAAM,SAAS,UAAU,MAAM,SAAS,0BAA0B,MAAM,SAAS,yBAAyB;AAC/H,WAAK,CAAC,IAAIA;AAAA,IACZ;AAAA,EACF;AACA,MAAI,iBAAiB,GAAG;AACtB,kBAAcC,MAAK,SAAS,cAAc,cAAc,WAAW;AAAA,EACrE;AACA,EAAAA,KAAI,QAAQ,QAAQ,MAAM;AAK1B,EAAAD,SAAQ;AACR,SAAO,EAAEA,SAAQ,QAAQ,OAAO,QAAQ;AACtC,UAAM,QAAQ,QAAQ,OAAOA,MAAK;AAClC,QAAI,MAAM,CAAC,MAAM,WAAW,MAAM,CAAC,EAAE,SAAS,SAAS;AACrD,YAAM,CAAC,EAAE,SAAS,cAAc,QAAQ,QAAQA,MAAK;AAAA,IACvD;AAAA,EACF;AACA,SAAO;AACT;AAcA,SAAS,UAAUC,MAAK,SAAS,OAAO,SAAS,QAAQ,cAAc;AAGrE,QAAM,YAAY,YAAY,IAAI,gBAAgB,YAAY,IAAI,mBAAmB;AAGrF,QAAM,YAAY;AASlB,MAAI,MAAM,CAAC,MAAM,GAAG;AAClB,iBAAa,MAAM,OAAO,OAAO,CAAC,GAAG,SAAS,QAAQ,QAAQ,MAAM,CAAC,CAAC,CAAC;AACvE,IAAAA,KAAI,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,cAAc,OAAO,CAAC,CAAC;AAAA,EACxD;AASA,QAAM,MAAM,SAAS,QAAQ,QAAQ,MAAM,CAAC,CAAC;AAC7C,iBAAe;AAAA,IACb,MAAM;AAAA,IACN,OAAO,OAAO,OAAO,CAAC,GAAG,GAAG;AAAA;AAAA,IAE5B,KAAK,OAAO,OAAO,CAAC,GAAG,GAAG;AAAA,EAC5B;AACA,EAAAA,KAAI,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,cAAc,OAAO,CAAC,CAAC;AAWvD,MAAI,MAAM,CAAC,MAAM,GAAG;AAClB,UAAM,eAAe,SAAS,QAAQ,QAAQ,MAAM,CAAC,CAAC;AACtD,UAAM,aAAa,SAAS,QAAQ,QAAQ,MAAM,CAAC,CAAC;AAEpD,UAAM,aAAa;AAAA,MACjB,MAAM;AAAA,MACN,OAAO,OAAO,OAAO,CAAC,GAAG,YAAY;AAAA,MACrC,KAAK,OAAO,OAAO,CAAC,GAAG,UAAU;AAAA,IACnC;AACA,IAAAA,KAAI,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,YAAY,OAAO,CAAC,CAAC;AACrD,QAAI,YAAY,GAAG;AAEjB,YAAMH,SAAQ,QAAQ,OAAO,MAAM,CAAC,CAAC;AACrC,YAAM,MAAM,QAAQ,OAAO,MAAM,CAAC,CAAC;AACnC,MAAAA,OAAM,CAAC,EAAE,MAAM,OAAO,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG;AAC3C,MAAAA,OAAM,CAAC,EAAE,OAAO;AAChB,MAAAA,OAAM,CAAC,EAAE,cAAc;AAGvB,UAAI,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG;AAC3B,cAAM,IAAI,MAAM,CAAC,IAAI;AACrB,cAAM,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI;AAChC,QAAAG,KAAI,IAAI,GAAG,GAAG,CAAC,CAAC;AAAA,MAClB;AAAA,IACF;AACA,IAAAA,KAAI,IAAI,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,QAAQ,YAAY,OAAO,CAAC,CAAC;AAAA,EAC1D;AASA,MAAI,WAAW,QAAW;AACxB,iBAAa,MAAM,OAAO,OAAO,CAAC,GAAG,SAAS,QAAQ,QAAQ,MAAM,CAAC;AACrE,IAAAA,KAAI,IAAI,QAAQ,GAAG,CAAC,CAAC,QAAQ,cAAc,OAAO,CAAC,CAAC;AACpD,mBAAe;AAAA,EACjB;AACA,SAAO;AACT;AAYA,SAAS,cAAcA,MAAK,SAASD,QAAOE,QAAO,WAAW;AAE5D,QAAM,QAAQ,CAAC;AACf,QAAM,UAAU,SAAS,QAAQ,QAAQF,MAAK;AAC9C,MAAI,WAAW;AACb,cAAU,MAAM,OAAO,OAAO,CAAC,GAAG,OAAO;AACzC,UAAM,KAAK,CAAC,QAAQ,WAAW,OAAO,CAAC;AAAA,EACzC;AACA,EAAAE,OAAM,MAAM,OAAO,OAAO,CAAC,GAAG,OAAO;AACrC,QAAM,KAAK,CAAC,QAAQA,QAAO,OAAO,CAAC;AACnC,EAAAD,KAAI,IAAID,SAAQ,GAAG,GAAG,KAAK;AAC7B;AAOA,SAAS,SAAS,QAAQA,QAAO;AAC/B,QAAM,QAAQ,OAAOA,MAAK;AAC1B,QAAM,OAAO,MAAM,CAAC,MAAM,UAAU,UAAU;AAC9C,SAAO,MAAM,CAAC,EAAE,IAAI;AACtB;;;AC5yBA,IAAM,gBAAgB;AAAA,EACpB,MAAM;AAAA,EACN,UAAU;AACZ;AAUO,SAAS,kBAAkB;AAChC,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,CAAC,EAAE,GAAG;AAAA,IACR;AAAA,EACF;AACF;AAMA,SAAS,sBAAsB,SAASG,KAAI,KAAK;AAC/C,QAAMC,QAAO;AACb,SAAO;AAYP,WAAS,KAAKC,OAAM;AAClB;AAAA;AAAA,MAEAD,MAAK,aAAa;AAAA;AAAA,MAGlB,CAACA,MAAK;AAAA,MAAoC;AACxC,aAAO,IAAIC,KAAI;AAAA,IACjB;AACA,YAAQ,MAAM,eAAe;AAC7B,YAAQ,MAAM,qBAAqB;AACnC,YAAQ,QAAQA,KAAI;AACpB,YAAQ,KAAK,qBAAqB;AAClC,WAAO;AAAA,EACT;AAYA,WAAS,OAAOA,OAAM;AAIpB,QAAI,0BAA0BA,KAAI,GAAG;AACnC,cAAQ,MAAM,6BAA6B;AAC3C,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,6BAA6B;AAC1C,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,MAAMA,UAAS,KAAK;AAC/B,cAAQ,MAAM,2BAA2B;AACzC,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,2BAA2B;AACxC,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAYA,WAAS,MAAMA,OAAM;AACnB,QAAIA,UAAS,IAAI;AACf,cAAQ,MAAM,qBAAqB;AACnC,cAAQ,QAAQA,KAAI;AACpB,cAAQ,KAAK,qBAAqB;AAClC,cAAQ,KAAK,eAAe;AAC5B,aAAO;AAAA,IACT;AACA,WAAO,IAAIA,KAAI;AAAA,EACjB;AAKA,WAAS,MAAMA,OAAM;AAEnB,QAAI,mBAAmBA,KAAI,GAAG;AAC5B,aAAOF,IAAGE,KAAI;AAAA,IAChB;AAIA,QAAI,cAAcA,KAAI,GAAG;AACvB,aAAO,QAAQ,MAAM;AAAA,QACnB,UAAU;AAAA,MACZ,GAAGF,KAAI,GAAG,EAAEE,KAAI;AAAA,IAClB;AAGA,WAAO,IAAIA,KAAI;AAAA,EACjB;AACF;AAMA,SAAS,kBAAkB,SAASF,KAAI,KAAK;AAC3C,SAAO,aAAa,SAAS,OAAO,YAAY;AAYhD,WAAS,MAAME,OAAM;AAKnB,WAAOA,UAAS,OAAO,IAAIA,KAAI,IAAIF,IAAGE,KAAI;AAAA,EAC5C;AACF;;;ACvHO,SAAS,IAAI,SAAS;AAC3B,SAAO,kBAAkB;AAAA,IACvB,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ,iBAAiB,OAAO;AAAA,IACxB,SAAS;AAAA,IACT,gBAAgB;AAAA,EAClB,CAAC;AACH;;;AClCA,IAAMC,gBAAe,CAAC;AAWP,SAAR,UAA2B,SAAS;AAGzC,QAAMC;AAAA;AAAA,IAAuC;AAAA;AAC7C,QAAM,WAAW,WAAWD;AAC5B,QAAM,OAAOC,MAAK,KAAK;AAEvB,QAAM,sBACJ,KAAK,wBAAwB,KAAK,sBAAsB,CAAC;AAC3D,QAAM,yBACJ,KAAK,2BAA2B,KAAK,yBAAyB,CAAC;AACjE,QAAM,uBACJ,KAAK,yBAAyB,KAAK,uBAAuB,CAAC;AAE7D,sBAAoB,KAAK,IAAI,QAAQ,CAAC;AACtC,yBAAuB,KAAK,gBAAgB,CAAC;AAC7C,uBAAqB,KAAK,cAAc,QAAQ,CAAC;AACnD;;;ACxCA,IAAAC,gBAAiB;AAEjB,IAAAC,kBAAkB;AAEX,IAAM,SAAS,CAAC,EAAE,UAAU,KAAK,MAA2B;AACjE,QAAM,UAAU,MAAM,WAAW,SAAS;AAC1C,QAAMC,SAAQ,MAAM,WAAW,MAAM;AAErC,MAAI,CAAC,QAAS,CAAC,WAAW,CAACA,OAAQ,QAAO,gCAAAC,QAAA,8BAAAA,QAAA,gBAAG,QAAS;AAEtD,SACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,EAAE,8BAA8BF,OAAM,CAAC;AAAA,MACvD;AAAA,MACA,KAAI;AAAA,MACJ,QAAO;AAAA;AAAA,IAEN;AAAA,EACH;AAEJ;;;ACpBA,IAAAG,kBAAkB;AAGX,IAAM,QAAQ,CAAC,EAAE,SAAS,MAC/B,gCAAAC,QAAA,cAAC,UAAK,WAAU,qBAAoB,eAAY,uBAC7C,QACH;;;ACLF,IAAAC,kBAAkB;AAUX,IAAM,UAAU,CAAC,EAAE,UAAU,MAAM,EAAE,cAAc,EAAE,MAC1D,gCAAAC,QAAA,cAAC,UAAK,WAAU,6BAA4B,gBAAc,cAAc,MACrE,QACH;;;A5DWK,IAAM,yBAET;AAAA,EACF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,oBAAoB,KAAa;AACxC,MAAI;AACF,WAAO,mBAAmB,GAAG,EAAE,QAAQ,YAAY,EAAE;AAAA,EACvD,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,KAAa;AACjC,MAAI;AACF,WAAO,UAAU,mBAAmB,GAAG,CAAC;AAAA,EAC1C,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF;AAEA,IAAM,eAAe,CAAC,QACpB,IAAI,WAAW,QAAQ,IAAI,MAAM,oBAAoB,GAAG;AAE1D,IAAM,oBAAkD,CAAC,YACvD;AAEK,IAAM,oBAAkE;AAAA,EAC7E,GAAG;AAAA,EACH,OAAO;AAAA,EACP,SAAS;AACX;AAeO,IAAM,aAAa,CACxBC,OACA,gBACA;AAAA,EACE,kBAAkB;AAAA,EAClB;AAAA,EACA,mBAAmB;AAAA,EACnB,mBAAmB;AACrB,IAAuB,CAAC,MACrB;AAGH,MAAI,CAACA,MAAM,QAAO;AAClB,MAAIA,MAAK,KAAK,EAAE,WAAW,EAAG,QAAO,gCAAAC,QAAA,8BAAAA,QAAA,gBAAGD,KAAK;AAE7C,MAAI,UAAUA;AACd,QAAM,gBAAgB,mBAAmB,OAAO;AAChD,QAAM,aAAa,kBAAkB,OAAO;AAK5C,QAAM,QAAQ,CAAC,OAAG,uBAAK,SAAS,OAAO,GAAG,OAAG,uBAAK,SAAS,KAAK,CAAC;AACjE,WAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AAC1C,UAAM,EAAE,KAAK,MAAM,OAAAE,QAAO,MAAM,MAAM,IAAI,MAAM,CAAC;AACjD,UAAM,gBAAgB,WAAW,KAAK,CAAC,UAAU,OAAO,SAAS,KAAK,CAAC;AAGvE,UAAM,kBACJ,iBACA,cAAc,OAAO,CAACF,UAAS;AAC7B,YAAM,eAAe,MAAM,QAAQ,YAAY,EAAE;AACjD,YAAM,eAAeA,OAAM,QAAQ,YAAY,EAAE;AAEjD,UAAI,CAAC,gBAAgB,CAAC,aAAc,QAAO;AAE3C,aAAO,aAAa,SAAS,YAAY,KAAK,aAAa,SAAS,YAAY;AAAA,IAClF,CAAC;AAEH,QAAI,gBAAgB,SAAS,KAAK,cAAe;AAEjD,QAAI;AAKF,UAAI,SAAS,WAAW,gBAAgB;AACtC,cAAM,uBAAuB,eAAe,KAAK,CAACG,OAAMA,GAAE,SAAS,KAAK;AACxE,YAAI,sBAAsB;AAExB,gBAAM,YAAY,QAAQ,OAAOD,SAAQ,CAAC,MAAM;AAGhD,oBACE,QAAQ,MAAM,GAAGA,MAAK,KACrB,YAAY,QAAQ,IAAI,KAAK,KAAK,aAAa,IAAI,CAAC,OACrD,QAAQ,MAAM,GAAG;AAAA,QACrB;AAAA,MACF,OAAO;AACL,cAAM,cAAc,SAAS,UAAU,QAAQ,oBAAoB,IAAI;AAEvE,kBACE,QAAQ,MAAM,GAAGA,MAAK,IACtB,IAAI,WAAW,KAAK,aAAa,IAAI,CAAC,MACtC,QAAQ,MAAM,GAAG;AAAA,MACrB;AAAA,IACF,SAAS,GAAG;AAAA,IAEZ;AAAA,EACF;AAEA,QAAME,iBAA+B;AAAA,IACnC;AAAA,IACA;AAAA,IACA,CAAC,WAAW,EAAE,aAAa,MAAM,CAAC;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AACA,QAAM,gBAA+B,CAAC,mBAAmB;AAEzD,MAAI,gBAAgB,QAAQ;AAC1B,kBAAc,KAAK,uBAAuB,cAAc,CAAC;AAAA,EAC3D;AAEA,SACE,gCAAAH,QAAA,cAAC,iBAAc,UAAU,gCAAAA,QAAA,8BAAAA,QAAA,gBAAGD,KAAK,KAC/B,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAiB;AAAA,MACjB,YAAY;AAAA,QACV,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,MACA,eAAe,iBAAiB,aAAa;AAAA,MAC7C,eAAe,iBAAiBG,cAAa;AAAA,MAC7C,UAAQ;AAAA,MACR,kBAAgB;AAAA,MAChB;AAAA;AAAA,IAEC;AAAA,EACH,CACF;AAEJ;;;AhDzLA,IAAM,cAAc,CAACC,SAAgB,SAAkB;AACrD,QAAM,MAAMA,UAAS;AACrB,SAAO,OAAO,GAAG,IAAI,OAAO,QAAQ,KAAK,KAAK,OAAO,QAAQ,KAAK;AACpE;AAEA,IAAM,aAAa,CAAC,WAAmB;AACrC,QAAM,OAAO,OAAO,MAAM,EAAE,EAAE,OAAO,CAAC,KAAK,MAAM;AAC/C,WAAO,OAAO,KAAK,MAAM,EAAE,WAAW,CAAC;AACvC,WAAO,MAAM;AAAA,EACf,GAAG,CAAC;AACJ,SAAO,KAAK,IAAI,IAAI,IAAI,MAAM,KAAK,KAAK,KAAK,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC;AACxE;AAEA,IAAM,eAAe,CAAC,OAAe,WACnC,YAAY,WAAW,MAAM,GAAG,MAAM,SAAS,MAAM,CAAC;AAOxD,IAAM,+BAA+B,CAAC,UAAmC;AACvE,QAAM,EAAE,eAAe,mBAAmB,SAAS,YAAY,IAAI;AAEnE,QAAM,EAAE,MAAM,IAAI,eAAe,oBAAoB;AAErD,QAAM,EAAE,eAAe,sBAAsB,SAAS,eAAe,IACnE,kBAAkB,oBAAoB;AAExC,QAAM,EAAE,gBAAAC,kBAAiB,eAAsB,IAC7C,oBAAoB,oBAAoB;AAE1C,QAAM,EAAE,aAAa,IAAI,sBAAsB,oBAAoB;AAEnE,QAAM,gBACJ,sBAAsB,SAAY,oBAAoB;AACxD,QAAM,UAAU,eAAe;AAE/B,QAAMC,gBAAe,iBAAiB,OAAO;AAC7C,QAAM,OAAO,YAAY,OAAO;AAEhC,QAAM,sBACJ,SAAS,OAAO,GAAG,YAAY,OAAyC,KACxE,SAAS;AAEX,QAAM,mBAAe;AAAA,IACnB,MAAM,WAAW,qBAAqB,QAAQ,eAAe;AAAA,IAC7D,CAAC,QAAQ,iBAAiB,mBAAmB;AAAA,EAC/C;AAEA,QAAM,SAAS,QAAQ,MAAM,MAAM;AACnC,QAAM,gBAAY,yBAAQ,MAAM,aAAa,OAAO,MAAM,GAAG,CAAC,QAAQ,KAAK,CAAC;AAE5E,QAAM,4BAAwB;AAAA,IAC5B,MAAM,kBAAkB,CAAC,QAAQ,GAAG,EAAE,WAAW,KAAK,UAAU,CAAC;AAAA,IACjE,CAAC,IAAI;AAAA,EACP;AAEA,QAAM,SAAS,SAAS,aAAa,OAAO,CAAC,EAAE,KAAK,MAAM,SAAS,OAAO;AAE1E,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,sCACT,KAAK,cAAc,2CAA2C,EAChE,IAAI,gBAAgB,8CAA8C,EAAE;AAAA,MACpE,KAAK,QAAQ;AAAA;AAAA,IAEZ,QAAQ,QACP,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,QAAQ,KAAK;AAAA,QACpB,MAAM,QAAQ,KAAK,QAAQ,QAAQ,KAAK;AAAA,QACxC,MAAM,QAAQ;AAAA;AAAA,IAChB;AAAA,IAEF,gCAAAA,QAAA,cAAC,SAAI,WAAU,wCACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,qCACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,qCAAoC,OAAO,EAAE,OAAO,UAAU,KAC3E,gCAAAA,QAAA,cAAC,gBAAQ,QAAQ,MAAM,QAAQ,SAAU,CAC3C,CACF,GACC,QAAQ,cAAc,QAAQ,SAAS,YACtC,gCAAAA,QAAA,cAACF,iBAAA,EAAe,SAAkB,IAElC,gCAAAE,QAAA,8BAAAA,QAAA,gBACG,UAAU,gCAAAA,QAAA,cAAC,WAAQ,QAAgB,GACpC,gCAAAA,QAAA,cAAC,SAAI,WAAU,mCAAkC,eAAY,cAC1D,cACD,gCAAAA,QAAA,cAAC,SAAI,WAAU,qCACb,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,oBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,cAAcD;AAAA,QACd;AAAA,QACA,MAAM,MAAM,KAAK;AAAA;AAAA,IACnB,GACA,gCAAAC,QAAA,cAAC,UAAK,WAAU,qCACd,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,aAAY;AAAA,QACZ;AAAA;AAAA,IACF,CACF,CACF,CACF,CACF,CAEJ;AAAA,EACF;AAEJ;AAQO,IAAM,qBAAqB,gBAAAA,QAAM;AAAA,EACtC;AACF;;;A6GzIA,IAAAC,kBAA4C;;;ACA5C,IAAAC,kBAAyC;AACzC,IAAAC,gBAAiB;;;ACAjB,IAAAC,kBAAkB;AAYX,SAAS,mBAAmB;AAAA,EACjC,qBAAAC;AAAA,EACA,GAAG;AACL,GAA4B;AAC1B,QAAM,EAAE,OAAAC,SAAQ,MAAa,IAAI,oBAAoB;AACrD,SACE,gCAAAC,QAAA,cAACD,QAAA,EAAM,WAAU,kCAAkC,GAAG,cACpD,gCAAAC,QAAA,cAAC,6BACC,gCAAAA,QAAA,cAACF,sBAAA,EAAoB,SAAS,WAAW,SAAS,CACpD,CACF;AAEJ;;;ACzBA,IAAAG,kBAAkB;AASX,SAAS,oBAAoB,EAAE,UAAU,QAAQ,GAA6B;AACnF,QAAM,EAAE,cAAAC,eAAc,YAAY,YAAY,IAC5C,wBAAwB,qBAAqB;AAC/C,QAAM,EAAE,EAAE,IAAI,sBAAsB,qBAAqB;AAEzD,WAAS,cACPC,SACsC;AACtC,WAAO,CAAC,MAAM;AACZ,MAAAA,QAAO,CAAC;AACR,gBAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,mCAAkC,eAAY,2BAC3D,gCAAAA,QAAA,cAAC,SAAI,WAAU,4CACZ,YAAY,EAAE,kDAAkD,CACnE,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,sCACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAS,cAAc,UAAU;AAAA,MACjC,MAAK;AAAA;AAAA,IAEJ,EAAE,cAAc;AAAA,EACnB,GACA,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAS,cAAc,WAAW;AAAA;AAAA,IAEjC,EAAE,aAAa;AAAA,EAClB,GACA,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAS,cAAcF,aAAY;AAAA;AAAA,IAElC,EAAE,QAAQ;AAAA,EACb,CACF,CACF;AAEJ;;;ACtDA,IAAAG,kBAAkB;AAClB,IAAAC,gBAAiB;AAMV,IAAM,iBAAiB,MAAM;AAClC,QAAM,EAAE,QAAQ,IAAI,kBAAkB;AACtC,QAAM,EAAE,EAAE,IAAI,sBAAsB,gBAAgB;AAEpD,QAAM,EAAE,YAAY,IAAI,YAAY,OAAO;AAE3C,QAAM,qBAAiB,cAAAC;AAAA,IACrB;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,MACE,sDAAsD;AAAA,MACtD,4BAA4B,CAAC;AAAA,IAC/B;AAAA,EACF;AAEA,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,eAAY;AAAA,MACZ,KAAK,QAAQ;AAAA;AAAA,IAEb,gCAAAA,QAAA,cAAC,SAAI,WAAU,sCACZ,EAAE,4CAA4C,CACjD;AAAA,EACF;AAEJ;;;ACjCA,IAAAC,gBAAiB;AACjB,IAAAC,kBAAkB;;;ACAlB,IAAAC,kBAA8B;;;ACD9B,IAAAC,kBAAgE;AAChE,IAAAC,gBAAiB;;;ACCjB,IAAAC,kBAAkB;;;ACFlB,IAAAC,kBAAkB;;;ACAlB,IAAAC,kBAA2C;;;ACEpC,IAAM,eAAe,CAC1B,QAC+B;AAC/B,MAAI,KAAK;AACP,WAAQ,IAA4B,YAAY;AAAA,EAClD;AACA,SAAO;AACT;AAEO,IAAM,qBAAqB,CAAC,WACjC,IAAI,QAA0B,CAAC,SAAS,WAAW;AACjD,QAAMC,SAAQ,IAAI,MAAM;AAExB,EAAAA,OAAM;AAAA,IACJ;AAAA,IACA,MAAM;AACJ,cAAQ,CAACA,OAAM,OAAOA,OAAM,MAAM,CAAC;AAAA,IACrC;AAAA,IACA,EAAE,MAAM,KAAK;AAAA,EACf;AAEA,EAAAA,OAAM,iBAAiB,SAAS,MAAM,OAAO,4BAA4B,MAAM,EAAE,GAAG;AAAA,IAClF,MAAM;AAAA,EACR,CAAC;AAED,EAAAA,OAAM,MAAM;AACd,CAAC;;;ADbI,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwB;AACtB,QAAM,CAAC,CAAC,aAAa,YAAY,GAAG,mBAAmB,QAAI,0BAAS,CAAC,GAAG,CAAC,CAAC;AAE1E,iCAAU,MAAM;AACd,uBAAmB,SAAS,EAAE,KAAK,mBAAmB,EAAE,MAAM,QAAQ,KAAK;AAAA,EAC7E,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,CAAC,GAAG,CAAC,IAAIA;AAEf,MAAI,CAAC,gBAAgB,CAAC,YAAa,QAAO,gCAAAC,QAAA,8BAAAA,QAAA,gBAAG,QAAS;AAEtD,SACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,OACE;AAAA,QACE,GAAG;AAAA,QACH,yCACE;AAAA,QACF,2CACE;AAAA,QACF,2CACE;AAAA,QACF,kCAAkC,GAAG,eAAe,IAAI;AAAA,QACxD,iCAAiC,GAAG,cAAc,OAAO;AAAA,QACzD,GAAI,OAAO,SAAS,MAAM,IACtB,EAAE,mCAAmC,GAAG,MAAM,KAAK,IACnD,CAAC;AAAA,QACL,GAAI,OAAO,SAAS,KAAK,IACrB,EAAE,kCAAkC,GAAG,KAAK,KAAK,IACjD,CAAC;AAAA,QACL,iBAAiB,QAAQ,SAAS;AAAA,QAClC,oBAAoB,GAAG,KAAK,OAAO,UAAU,GAAG,KAAK,KAAK,OAAO,OAAO,GAAG;AAAA,QAC3E,gBAAgB,GAAG,UAAU,GAAG,KAAK,OAAO,GAAG;AAAA,QAC/C,QACE;AAAA,QACF,OACE;AAAA,MACJ;AAAA;AAAA,EAEJ;AAEJ;;;AD3DA,IAAM,6BAA6B;AAAA,EACjC,OAAO,CAAC,GAAG,CAAC;AAAA,EACZ,MAAM,CAAC,GAAG,CAAC;AAAA,EACX,MAAM,CAAC,GAAG,CAAC;AAAA,EACX,MAAM,CAAC,GAAG,CAAC;AAAA,EACX,KAAK,CAAC,GAAG,CAAC;AAAA,EACV,KAAK,CAAC,GAAG,CAAC;AACZ;AAIA,IAAM,oBAAoB;AAEnB,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AACF,MAAgF;AAC9E,QAAMC,YAAW,2BAA2B,IAAI;AAChD,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT;AAAA,MACA,UAAUD;AAAA,MACV,MAAM;AAAA,MACN,WAAW;AAAA,MACX,OACE;AAAA,QACE,mCAAmC;AAAA,MACrC;AAAA;AAAA,EAEJ;AAEJ;;;AD3BO,IAAM,yBAA0C;AAAA,EACrD;AAAA,IACE,MAAM;AAAA,IACN,WAAW,MAAM,gCAAAE,QAAA,cAAC,eAAY,UAAS,aAAK,MAAK,QAAO;AAAA,IACxD,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,WAAW,MAAM,gCAAAA,QAAA,cAAC,eAAY,UAAS,aAAK,MAAK,QAAO;AAAA,IACxD,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,WAAW,MAAM,gCAAAA,QAAA,cAAC,eAAY,UAAS,gBAAK,MAAK,QAAO;AAAA,IACxD,MAAM;AAAA,EACR;AAAA,EACA,EAAE,MAAM,OAAO,WAAW,MAAM,gCAAAA,QAAA,cAAC,eAAY,UAAS,aAAK,MAAK,OAAM,GAAI,MAAM,MAAM;AAAA,EACtF;AAAA,IACE,MAAM;AAAA,IACN,WAAW,MAAM,gCAAAA,QAAA,cAAC,eAAY,UAAS,aAAK,MAAK,OAAM;AAAA,IACvD,MAAM;AAAA,EACR;AACF;;;ADYA,IAAM,6BAA6B,CAAC,UAAiC;AACnE,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,UAAU;AAAA,EACZ,IAAI;AAEJ,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,iBAAiB,yBAAyB;AAAA,EAC5C,IAAI,oBAAoB,kBAAkB;AAC1C,QAAM;AAAA,IACJ;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,EACF,IAAI,kBAAkB,kBAAkB;AACxC,QAAM,WAAW,sBAAsB,QAAQ,EAAE;AACjD,QAAM,SAAS,UAAU,EAAE,IAAI,SAAS,CAAC;AACzC,QAAM,kBAAkB,uBAAuB;AAE/C,QAAMC,UAAS,cAAc,iBAAiB;AAC9C,QAAM,iBAAiB,sBAAsB;AAC7C,QAAM,kBAAkB,uBAAuB,SAAS,oBAAoB,CAAC;AAC7E,QAAM,eAAe,oBAAoB,SAAS,iBAAiB,CAAC;AACpE,QAAM,iBAAiB,sBAAsB,SAAS,mBAAmB,CAAC;AAE1E,QAAM,CAAC,qBAAqB,sBAAsB,QAAI,0BAAwB,IAAI;AAClF,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAGtC,IAAI;AAEd,QAAM,cAAU,wBAA8B,IAAI;AAClD,QAAM,gBAAY,wBAA8B,IAAI;AACpD,QAAM,iBAAa,wBAA8B,IAAI;AAErD,QAAM,kBAAc;AAAA,IAClB,CAAC,OAAyC,iBAAyB;AACjE,gBAAU,UAAU,MAAM;AAC1B,6BAAuB,YAAY;AAAA,IACrC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,kBAAc,6BAAY,MAAM;AACpC,2BAAuB,IAAI;AAC3B,wBAAoB,IAAI;AAAA,EAC1B,GAAG,CAAC,CAAC;AAEL,iCAAU,MAAM;AACd,QAAI,CAAC,uBAAuB,CAAC,QAAQ,QAAS;AAC9C,UAAM,UAAU,WAAW,SAAS,sBAAsB;AAC1D,UAAM,SAAS,UAAU,SAAS,sBAAsB;AAExD,UAAM,YAAY,aAAa,OAAO,IAClC,QAAQ,SAAS,sBAAsB,IACvC;AAEJ,QAAI,CAAC,WAAW,CAAC,UAAU,CAAC,UAAW;AAEvC,UAAM,kBACJ,QAAQ,UAAU,UAAU,SAAS,QAAQ,IAAI,UAAU,IACvD,IACA,OAAO,OAAO,OAAO,QAAQ,IAAI,UAAU,OAAO,QAAQ,QAAQ;AAExE,UAAM,gBAAgB,OAAO,IAAI,QAAQ,IAAI,OAAO,QAAQ,IAAI;AAEhE,wBAAoB;AAAA,MAClB,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAAA,EACH,GAAG,CAAC,qBAAqB,OAAO,CAAC;AAEjC,QAAM,0BAA0B,CAAC,SAC/B,gBACG,IAAI,CAAC,aAAa;AACjB,QAAI,SAAS,SAAS,MAAM;AAC1B,aAAO,SAAS,MAAM,QAAQ,SAAS,MAAM;AAAA,IAC/C;AACA,WAAO;AAAA,EACT,CAAC,EACA,OAAO,OAAO;AAEnB,QAAM,2BAA2B,CAAC,iBAChC,aAAa,KAAK,CAAC,aAAa,SAAS,SAAS,YAAY;AAEhE,QAAM,+BAA+B,CAAC,SACpC,gBAAgB,KAAK,CAAC,aAAa,SAAS,SAAS,QAAQ,CAAC,CAAC,SAAS,IAAI,GAAG,QAC/E;AAEF,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC;AAAA,QACT;AAAA,QACA;AAAA,UACE,wCAAwC;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,eAAY;AAAA,MACZ,KAAK;AAAA;AAAA,IAEJ,CAAC,CAAC,uBAAuB,gBACxB,gCAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAK;AAAA,QACL,OAAO;AAAA,UACL,MAAM,kBAAkB;AAAA,UACxB,YAAY,mBAAmB,YAAY;AAAA,QAC7C;AAAA;AAAA,MAEA,gCAAAA,QAAA,cAAC,SAAI,WAAU,SAAQ,OAAO,EAAE,MAAM,kBAAkB,MAAM,GAAG;AAAA,MAChE,wBAAwB,mBAAmB,GAAG,IAAI,CAAC,MAAM,GAAG,UAC3D,gCAAAA,QAAA,cAAC,UAAK,WAAU,wBAAuB,KAAK,OAAO,CAAC,IAAI,IAAI,MACzD,GAAG,IAAI,GAAG,IAAI,MAAM,SAAS,IAAI,OAAO,EAAE,EAC7C,CACD;AAAA,IACH;AAAA,IAEF,gCAAAA,QAAA,cAAC,QAAG,WAAU,0EACX,gBAAgB,IAAI,CAAC,EAAE,WAAAE,YAAW,MAAM,cAAc,MAAM,aAAa,MAAM;AAC9E,YAAM,aAAa,6BAA6B,YAAY;AAC5D,YAAM,QAAQ,eAAe,YAAY,GAAG,SAAS;AACrD,aACE,gCAAAF,QAAA,cAAC,QAAG,KAAK,gBACP,gCAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,cAAY,oBAAoB,gBAAgB,YAAY;AAAA,UAC5D,eAAW,cAAAC;AAAA,YACT;AAAA,YACA;AAAA,cACE,+CACE,yBAAyB,YAAY;AAAA,YACzC;AAAA,UACF;AAAA,UACA,eAAY;AAAA,UACZ,aAAW;AAAA,UACX,SAAS,CAAC,UAAU;AAClB,2BAAe,cAAc,KAAK;AAClC,gBAAI,8BAA8B;AAChC,qBAAO,MAAM;AAAA,YACf;AAAA,UACF;AAAA;AAAA,QAEC,CAAC,CAAC,SAAS,gBACV,gCAAAD,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS;AAAA,YACT,cAAc,CAAC,MAAM,YAAY,GAAG,YAAY;AAAA,YAChD,cAAc;AAAA;AAAA,UAEb,aACC,gCAAAA,QAAA;AAAA,YAACD;AAAA,YAAA;AAAA,cACC,OAAO,WAAW;AAAA,cAClB,MAAM,WAAW;AAAA,cACjB,MAAM;AAAA,cACN,MAAM;AAAA;AAAA,UACR,IAEA,gCAAAC,QAAA,cAAC,SAAI,WAAU,yBAAwB;AAAA,QAE3C;AAAA,QAEF,gCAAAA,QAAA,cAAC,UAAK,WAAU,sCACd,gCAAAA,QAAA,cAACE,YAAA,IAAU,CACb;AAAA,QACC,QAAQ,KAAK,KAAK,gBACjB,gCAAAF,QAAA,cAAC,UAAK,WAAU,kDACb,SAAS,EACZ;AAAA,MAEJ,CACF;AAAA,IAEJ,CAAC,CACH;AAAA,EACF;AAEJ;AAKO,IAAM,mBAAmB,gBAAAA,QAAM;AAAA,EACpC;AACF;;;ADrNO,IAAM,6BAA6B,CAAC;AAAA,EACzC,cAAAG;AACF,MAAuC;AACrC,QAAM,EAAE,EAAE,IAAI,sBAAsB,4BAA4B;AAChE,QAAM,EAAE,aAAa,SAAS,WAAW,IAAI,kBAAkB,gBAAgB;AAC/E,QAAM,EAAE,kBAAAC,oBAAmB,iBAAwB,IACjD,oBAAoB,gBAAgB;AACtC,QAAM,gBAAY,wBAA6B,IAAI;AACnD,QAAM,oBAAoB,aAAa,aAAa;AACpD,QAAM,WAAW,oBAAoB,iBAAiB,KAAK,QAAQ,EAAE;AACrE,QAAM,EAAE,QAAQ,cAAc,IAAI,0BAA0B,EAAE,IAAI,SAAS,CAAC;AAC5E,QAAM,eAAe,gBAAgB,UAAU,eAAe,EAAE;AAEhE,SACE,gCAAAC,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAiB,eAAe;AAAA,MAChC,IAAI;AAAA,MACJ,WAAW,YAAY,IAAI,YAAY;AAAA,MACvC,kBAAkB,UAAU;AAAA,MAC5B,WAAS;AAAA;AAAA,IAET,gCAAAA,QAAA,cAACD,mBAAA,IAAiB;AAAA,EACpB,GACA,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe;AAAA,MACf,cAAY,EAAE,6BAA6B;AAAA,MAC3C,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAS,MAAM,QAAQ,OAAO;AAAA,MAC9B,KAAK;AAAA;AAAA,IAEL,gCAAAA,QAAA,cAACF,eAAA,EAAa,WAAU,iCAAgC;AAAA,EAC1D,CACF;AAEJ;;;ADxBA,IAAM,2BAA2B,CAAC,UAA+B;AAC/D,QAAM;AAAA,IACJ,aAAAG,eAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,cAAAC,gBAAe;AAAA,IACf,QAAQ;AAAA,IACR,YAAAC,cAAa;AAAA,EACf,IAAI;AAEJ,QAAM;AAAA,IACJ,mBAAAC;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,kBAAkB,gBAAgB;AAEtC,QAAM,EAAE,EAAE,IAAI,sBAAsB,gBAAgB;AAMpD,QAAM,oBAAoB,aAAa,aAAa;AAEpD,QAAM,6BAA6B;AAAA,IACjC,kBAAkB,iBAAiB,KAAK,QAAQ,EAAE;AAAA,EACpD;AACA,QAAM,+BAA+B;AAAA,IACnC,oBAAoB,iBAAiB,KAAK,QAAQ,EAAE;AAAA,EACtD;AACA,QAAM,mBAAmB,wBAAwB;AAEjD,QAAM,iBAAiBA,mBAAkB;AAEzC,QAAM,sBAAsB,eAAe,QAAQ,gBAAgB,KAAK,IAAI;AAC5E,QAAM,oBACJ,eAAe,QAAQ,gBAAgB,KAAK,IAAI,MAAM,kBAAkB,CAAC;AAE3E,MACE,CAAC,QAAQ,QACT,QAAQ,SAAS,WACjB,QAAQ,SAAS,YACjB,QAAQ,SAAS,eACjB,QAAQ,WAAW,YACnB,QAAQ,WAAW,aACnB,gBACA;AACA,WAAO;AAAA,EACT;AAEA,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,qBAAqB,KAAK,uCAAuC;AAAA,QAC/E,qCACE,8BAA8B;AAAA,MAClC,CAAC;AAAA,MACD,eAAY;AAAA;AAAA,IAEZ,gCAAAD,QAAA,cAAC,kBAAe,aAAaJ,cAAa;AAAA,IACzC,qBACC,gCAAAI,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,EAAE,kBAAkB;AAAA,QAChC,WAAW,qBAAqB,KAAK,uCAAuC,KAAK;AAAA,QACjF,eAAY;AAAA,QACZ,SAAS;AAAA;AAAA,MAET,gCAAAA,QAAA,cAACF,aAAA,EAAW,WAAU,iCAAgC;AAAA,IACxD;AAAA,IAED,uBAAuB,gCAAAE,QAAA,cAAC,8BAA2B,cAAcH,eAAc;AAAA,EAClF;AAEJ;AAEO,IAAM,iBAAiB,gBAAAG,QAAM;AAAA,EAClC;AACF;;;AO9GA,IAAAE,kBAAkB;AAelB,IAAM,sCAAsC,CAAC,UAA0C;AACrF,QAAM,EAAE,aAAa,aAAa,SAAS,cAAc,EAAE,IAAI;AAC/D,QAAM,EAAE,oBAAoB,IAAI,uBAAuB;AAEvD,QAAM,EAAE,EAAE,IAAI,sBAAsB,2BAA2B;AAE/D,MAAI,CAAC,YAAa,QAAO;AAEzB,MAAI,iBAAiB,EAAE,cAAc,EAAE,OAAO,YAAY,CAAC;AAE3D,MAAI,eAAe,cAAc,GAAG;AAClC,qBAAiB,GAAG,WAAW,IAAI,WAAW;AAAA,EAChD,WAAW,aAAa;AACtB,qBAAiB,KAAK,WAAW;AAAA,EACnC;AAEA,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,oDACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,UAAU,CAAC,oBAAoB,YAAY;AAAA,MAC3C;AAAA;AAAA,IAEC;AAAA,EACH,CACF;AAEJ;AAEO,IAAM,4BAA4B,gBAAAA,QAAM;AAAA,EAC7C;AACF;;;AChDA,IAAAC,kBAAgC;AAChC,IAAAC,gBAAiB;;;ACAjB,IAAAC,kBAA2C;AAIpC,IAAM,UAAU,CAAC,EAAE,UAAU,GAAG,KAAK,MAC1C,gCAAAC,QAAA,cAAC,SAAI,WAAU,qBAAqB,GAAG,QACpC,QACH;AAcK,IAAM,gBAAgB,CAAwB;AAAA,EACnD;AAAA,EACA,SAAS,CAAC,GAAG,EAAE;AAAA,EACf,YAAY;AAAA,EACZ;AAAA,EACA,UAAU;AACZ,MAA6B;AAC3B,QAAM,CAAC,eAAe,gBAAgB,QAAI,0BAAgC,IAAI;AAC9E,QAAM;AAAA,IACJ,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,mBAAmB;AAAA,IACrB;AAAA,IACA;AAAA,EACF,CAAC;AAED,iCAAU,MAAM;AACd,SAAK,aAAa,gBAAgB;AAAA,EACpC,GAAG,CAAC,kBAAkB,IAAI,CAAC;AAE3B,iCAAU,MAAM;AACd,SAAK,YAAY,aAAa;AAAA,EAChC,GAAG,CAAC,eAAe,IAAI,CAAC;AAExB,MAAI,CAAC,QAAS,QAAO;AAErB,SACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,kBAAgB;AAAA,MAChB,KAAK;AAAA,MACL,OAAO,EAAE,MAAM,KAAK,GAAG,UAAU,UAAU,KAAK,KAAK,EAAE;AAAA;AAAA,IAEtD;AAAA,EACH;AAEJ;;;AC5DA,IAAAC,kBAAsC;AAE/B,IAAM,wBAAwB,CAAwB;AAAA,EAC3D;AAAA,EACA;AACF,IAAkF,CAAC,MAAM;AACvF,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,0BAAS,KAAK;AAE1D,QAAM,kBAA0C;AAAA,IAC9C,CAAC,MAAM;AACL,wBAAkB,IAAI;AACtB,qBAAe,CAAC;AAAA,IAClB;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,kBAA0C;AAAA,IAC9C,CAAC,MAAM;AACL,wBAAkB,KAAK;AACvB,qBAAe,CAAC;AAAA,IAClB;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,SAAO,EAAE,aAAa,aAAa,eAAe;AACpD;;;AFSA,IAAM,0BAA0B,CAAC,UAA8B;AAC7D,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,wBAAwB;AAAA,EAC1B,IAAI;AAEJ,QAAM,EAAE,aAAa,aAAa,eAAe,IAC/C,sBAAuC;AAEzC,QAAM,EAAE,OAAO,IAAI,eAAe,eAAe;AACjD,QAAM,EAAE,QAAQ,cAAc,IAAI,oBAAoB,eAAe;AACrE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,kBAAkB,eAAe;AACrC,QAAM,EAAE,EAAE,IAAI,sBAAsB,eAAe;AACnD,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAAiC,IAAI;AAErF,QAAMC,UAAS,cAAc,iBAAiB;AAE9C,MAAI,CAAC,YAAY,KAAK,QAAQ,SAAS,QAAS,QAAO;AAEvD,QAAM,eAAe,QAAQ,WAAW,KAAK,OAAO,CAAC,EAAE,OAAO,OAAO,MAAM;AAC3E,QAAM,oBACJ,aAAa,WAAW,KAAK,YAAY,CAAC,EAAE,OAAO,OAAO,MAAM;AAClE,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,OAAO,CAAC,EAAE,QAAQ,UAAU,CAAC,gBAAgB,CAAC;AACpD,QAAM,YAAY,CAAC,EAAE,aAAa,UAAU,CAAC,qBAAqB,CAAC,QAAQ,CAAC;AAC5E,QAAM,QACH,qBAAqB,gBAAgB,OAAO,QAAQ,OACrD,QAAQ,WAAW,cACnB,CAAC,aACD,CAAC,QACD,CAAC;AAEH,QAAM,wBAAwB,OAC1B,OAAO,OAAO,CAAC,SAAS,KAAK,OAAO,OAAO,MAAM,EAAE,IACnD,CAAC;AACL,QAAM,CAAC,YAAY,IAAI;AAEvB,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC;AAAA,QACT,qBAAqB,WAAW;AAAA,QAChC;AAAA,UACE,sCAAsC;AAAA,UACtC,oCAAoC;AAAA,UACpC,oCAAoC;AAAA,UACpC,iCAAiC;AAAA,QACnC;AAAA,MACF;AAAA,MACA,mBAAa,cAAAA,SAAK;AAAA,QAChB,4BAA4B;AAAA,QAC5B,0BAA0B;AAAA,QAC1B,0BAA0B;AAAA,QAC1B,uBAAuB;AAAA,MACzB,CAAC;AAAA,MACD,cAAc;AAAA,MACd,cAAc;AAAA,MACd,KAAK;AAAA;AAAA,IAEJ,YACE,uBACC,gCAAAD,QAAA,cAAC,0BAAqB,IAEtB,gCAAAA,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,CAAC,GAAG,CAAC;AAAA,QACb;AAAA,QACA,SAAS;AAAA;AAAA,MAER,EAAE,YAAY;AAAA,IACjB,GACA,gCAAAA,QAAA,cAAC,sBAAiB,CACpB;AAAA,IAGH,SACE,oBACC,gCAAAA,QAAA,cAAC,uBAAkB,IAEnB,gCAAAA,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,CAAC,GAAG,CAAC;AAAA,QACb;AAAA,QACA,SAAS;AAAA;AAAA,MAER,EAAE,MAAM;AAAA,IACX,GACA,gCAAAA,QAAA,cAAC,qBAAgB,CACnB;AAAA,IAGH,cACE,yBACC,gCAAAA,QAAA,cAAC,4BAAuB,IAExB,gCAAAA,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,CAAC,GAAG,CAAC;AAAA,QACb;AAAA,QACA,SAAS;AAAA;AAAA,MAER,EAAE,WAAW;AAAA,IAChB,GACA,gCAAAA,QAAA,cAAC,0BAAqB,CACxB;AAAA,IAGH,SACE,oBACC,gCAAAA,QAAA,cAAC,uBAAkB,IAEnB,gCAAAA,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,CAAC,GAAG,CAAC;AAAA,QACb;AAAA,QACA,SAAS;AAAA;AAAA,MAER,qBAAqB,QAAQ,GAAG,QAAQ,qBAAqB;AAAA,IAChE,GAEA,gCAAAA,QAAA;AAAA,MAACD;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,aAAa;AAAA,QACpB,MAAM,aAAa,QAAQ,aAAa;AAAA,QACxC,MAAM;AAAA;AAAA,IACR,GAEC,sBAAsB,SAAS,KAC9B,gCAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,qBAAqB,WAAW;AAAA,QAC3C,eAAY;AAAA;AAAA,MAEX,sBAAsB;AAAA,IACzB,CAEJ;AAAA,EAEN;AAEJ;AAEO,IAAM,gBAAgB,gBAAAA,QAAM;AAAA,EACjC;AACF;;;AG9LA,IAAAE,gBAAiB;AACjB,IAAAC,kBAA+B;;;ACD/B,IAAAC,kBAA+B;AAC/B,IAAAC,gBAAiB;;;ACDjB,IAAAC,kBAAkB;;;ACAlB,IAAAC,gBAAiB;AACjB,IAAAC,kBAAkB;;;ACDlB,IAAAC,kBAA+B;AAY/B,IAAM,oBAAoB,CAAC,eAAwD;AAAA,EACjF,qBAAqB,UAAU;AAAA,EAC/B,WAAW,UAAU;AAAA,EACrB,mBAAmB,UAAU;AAAA,EAC7B,MAAM,UAAU;AAAA,EAChB,SAAS,UAAU;AACrB;AAEO,IAAM,aAAa,MAAM;AAC9B,QAAM,EAAE,EAAE,IAAI,sBAAsB,YAAY;AAEhD,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,qBAAqB,WAAW,mBAAmB,MAAAC,OAAM,QAAQ,IACvE,cAAc,KAAK,OAAO,iBAAiB;AAE7C,QAAM,4BAAwB,yBAAQ,MAAM;AAC1C,QAAI,UAAW,QAAO,EAAE,YAAY;AACpC,QAAI,uBAAuB,QAAQ,WAAW,EAAG,QAAO,EAAE,YAAY;AACtE,QAAI;AACF,aAAO,EAAE,0BAA0B;AAAA,QACjC,OAAO,oBAAoB,QAAQ,SAAS,QAAQ,SAAS;AAAA,MAC/D,CAAC;AACH,QAAI,QAAQ,SAAS,EAAG,QAAO,EAAE,oBAAoB;AACrD,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,qBAAqB,mBAAmB,QAAQ,QAAQ,CAAC,CAAC;AAEzE,MAAI,CAACA,MAAM;AAEX,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,2BACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,0BAAwBD,KAAK,GAC5C,gCAAAC,QAAA,cAAC,SAAI,WAAU,6BAA2B,qBAAsB,CAClE;AAEJ;;;AC9CA,IAAAC,kBAAkB;;;ACClB,IAAAC,kBAA6C;AAC7C,IAAAC,gBAAiB;;;ACFjB,IAAAC,gBAAiB;AAEjB,IAAAC,kBAAkB;AAKX,IAAM,aAAa,CAAC,EAAE,WAAW,MAAAC,OAAM,GAAG,MAAM,MACrD,gCAAAC,QAAA,cAAC,SAAK,GAAG,OAAO,eAAW,cAAAC,SAAK,8BAA8B,SAAS,KACpEF,KACH;;;ADsBK,IAAM,aAAa,CAIxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA6B;AAC3B,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,CAAC,aAAa,cAAc,QAAI,0BAAiC,CAAC,CAAC;AACzE,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAAY,MAAM;AAC1C,QAAI,MAAkB,CAAC;AACvB,eAAW,CAAC,IAAI,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,YAAM,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,OAAO,MAAM,MAAM;AAAA,IAC3C;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,mBAAe;AAAA,IAGnB,CAAC,UAAU;AACT,YAAM,UAAU,MAAM,OAAO;AAC7B,YAAM,cAAc,OAAO,OAAO;AAClC,UAAI,CAAC,YAAa;AAElB,YAAM,QAAQ,YAAY,YAAY,MAAM,OAAO,KAAK;AACxD,UAAI,OAAO;AACT,uBAAe,CAAC,UAAU,EAAE,CAAC,OAAO,GAAG,OAAO,GAAG,KAAK,EAAE;AAAA,MAC1D,OAAO;AACL,uBAAe,CAAC,SAAS;AACvB,iBAAO,KAAK,OAAO;AACnB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AACA,eAAS,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,OAAO,MAAM,EAAE;AAE/D,UAAI,CAAC,YAAY,MAAM,SAAU;AAEjC,UAAI,YAAY,YAAY,SAAS;AACnC,QAAC,YAAY,MAAM;AAAA,UACjB;AAAA,QACF;AAAA,MACF,WAAW,YAAY,YAAY,YAAY;AAC7C,QAAC,YAAY,MAAM;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,eAAe,YAAY;AAC/B,QAAI,CAAC,OAAO,KAAK,KAAK,EAAE,OAAQ;AAChC,UAAM,SAAiC,CAAC;AACxC,eAAW,CAAC,IAAI,UAAU,KAAK,OAAO,QAAQ,KAAK,GAAG;AACpD,YAAM,iBAAiB,OAAO,EAAE,EAAE,YAAY,UAAU;AACxD,UAAI,gBAAgB;AAClB,eAAO,EAAE,IAAI;AAAA,MACf;AAAA,IACF;AACA,QAAI,OAAO,KAAK,MAAM,EAAE,QAAQ;AAC9B,qBAAe,MAAM;AACrB;AAAA,IACF;AACA,UAAM,SAAS,KAAK;AACpB,UAAM;AAAA,EACR;AAEA,SACE,gCAAAG,QAAA,cAAC,SAAI,eAAW,cAAAC,SAAK,2CAA2C,SAAS,KACvE,gCAAAD,QAAA,cAAC,SAAI,WAAU,4BACZ,SAAS,gCAAAA,QAAA,cAAC,SAAI,WAAU,6BAA2B,KAAM,GAC1D,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAa;AAAA,MACb,UAAU,CAAC,MAAM;AACf,UAAE,eAAe;AACjB,qBAAa;AAAA,MACf;AAAA;AAAA,IAEC,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,WAAW,MAC3C,gCAAAA,QAAA,cAAC,SAAI,WAAU,2BAA0B,KAAK,gBAAgB,EAAE,MAC7D,YAAY,SACX,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,cAAAC;AAAA,UACT,oDAAoD,EAAE;AAAA,QACxD;AAAA,QACA,SAAS;AAAA;AAAA,MAER,YAAY;AAAA,IACf,GAED,gBAAAD,QAAM,cAAc,YAAY,SAAS;AAAA,MACxC;AAAA,MACA,GAAG,YAAY;AAAA,MACf,UAAU;AAAA,MACV,OAAO,MAAM,EAAE;AAAA,IACjB,CAAC,GACD,gCAAAA,QAAA,cAAC,cAAW,MAAM,YAAY,EAAE,GAAG,SAAS,CAC9C,CACD;AAAA,IACD,gCAAAA,QAAA,cAAC,SAAI,WAAU,gCACb,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAK;AAAA;AAAA,MAEJ,EAAE,QAAQ;AAAA,IACb,GACA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,UACE,OAAO,KAAK,WAAW,EAAE,SAAS,KAAK,4BAA4B,KAAK;AAAA,QAE1E,MAAK;AAAA;AAAA,MAEJ,EAAE,MAAM;AAAA,IACX,CACF;AAAA,EACF,CACF,CACF;AAEJ;;;ADxJA,IAAME,qBAAoB,CAAC,eAAwD;AAAA,EACjF,WAAW,UAAU;AACvB;AAOO,IAAM,iBAAiB,CAAC,EAAE,OAAO,UAAU,MAA2B;AAC3E,QAAM,EAAE,EAAE,IAAI,sBAAsB,gBAAgB;AAEpD,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,UAAU,IAAI,cAAc,KAAK,OAAOA,kBAAiB;AAEjE,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,UACP,SAAS;AAAA,UACT,OAAO;AAAA,YACL,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,UAAU;AAAA,YACV,MAAM;AAAA,YACN,OAAO,WAAW,eAAe;AAAA,UACnC;AAAA,UACA,WAAW,CAAC,UAAU;AACpB,kBAAM,cAAc,OAAO,UAAU,cAAc,MAAM,SAAS,IAAI;AACtE,kBAAM,eAAe,aAAa,KAAK;AACvC,gBAAI,CAAC,cAAc;AACjB,qBAAO,IAAI,MAAM,EAAE,mDAAmD,CAAC;AAAA,YACzE;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAU,OAAO,UAAU;AACzB,cAAM,KAAK,UAAU,MAAM,SAAS,SAAS;AAAA,MAC/C;AAAA,MACA,2BAA2B,CAAC,UAC1B,CAAC,MAAM,WAAW,MAAM,YAAY,WAAW;AAAA,MAEjD,OAAO,YAAY,EAAE,qBAAqB,IAAI,EAAE,eAAe;AAAA;AAAA,EACjE;AAEJ;;;AGtDA,IAAAC,kBAAkB;AAClB,IAAAC,gBAAiB;AASV,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE,gCAAAC,QAAA,cAAC,SAAI,eAAW,cAAAC,SAAK,6CAA6C,SAAS,KACzE,gCAAAD,QAAA,cAAC,SAAI,WAAU,4BACZ,SAAS,gCAAAA,QAAA,cAAC,SAAI,WAAU,6BAA2B,KAAM,GAC1D,gCAAAA,QAAA,cAAC,SAAI,WAAU,8BAA4B,MAAO,CACpD,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,gCACZ,QAAQ,IAAI,CAAC,EAAE,WAAAE,YAAW,GAAG,MAAM,GAAG,MACrC,gCAAAF,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,cAAAC,SAAK,qCAAqCC,UAAS;AAAA,IAC9D,KAAK,mCAAmC,CAAC;AAAA,IACxC,GAAG;AAAA;AACN,CACD,CACH,CACF;;;AC9BF,IAAAC,kBAAkB;AAOX,IAAM,gBAAgB,CAAC,EAAE,MAAM,MAA0B;AAC9D,QAAM,EAAE,EAAE,IAAI,sBAAsB,uBAAuB;AAC3D,QAAM,EAAE,KAAK,IAAI,eAAe;AAEhC,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,QACP;AAAA,UACE,UAAU,EAAE,QAAQ;AAAA,UACpB,WAAW;AAAA,UACX,SAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,UAAU,EAAE,KAAK;AAAA,UACjB,WACE;AAAA,UACF,SAAS,KAAK;AAAA,QAChB;AAAA,MACF;AAAA,MACA,WAAU;AAAA,MACV,QAAQ,EAAE,mDAAmD;AAAA,MAC7D,OAAO,EAAE,UAAU;AAAA;AAAA,EACrB;AAEJ;;;AChCA,IAAAC,gBAAiB;AACjB,IAAAC,kBAA6C;;;ACA7C,IAAAC,kBAAkB;AAYX,IAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0C;AACxC,QAAM,EAAE,OAAAC,SAAQ,MAAa,IAAI,oBAAoB;AACrD,SACE,gCAAAC,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA,cAAC,YAAO,WAAU,yBAAwB,SAAS,aAChD,UACH,GACA,gCAAAA,QAAA,cAACD,QAAA,EAAM,WAAW,gBAAgB,SAAS,YAAY,MAAM,eAC1D,QACH,CACF;AAEJ;;;AChCA,IAAAE,kBAAkB;AAOlB,IAAMC,qBAAoB,CAAC,eAAwD;AAAA,EACjF,SAAS,UAAU;AACrB;AAOO,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AACF,MAAkC;AAChC,QAAM,EAAE,OAAO,IAAI,eAAe,uBAAuB;AACzD,QAAM,EAAE,EAAE,IAAI,sBAAsB,uBAAuB;AAC3D,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,QAAQ,IAAI,cAAc,KAAK,OAAOA,kBAAiB;AAE/D,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,YAAY;AAAA,UACV,SAAS;AAAA,UACT,OAAO;AAAA,YACL,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,UAAU;AAAA,YACV,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UACA,WAAW,CAAC,UAAU;AACpB,kBAAM,cAAc,OAAO,UAAU,cAAc,MAAM,SAAS,IAAI;AACtE,kBAAM,eAAe,aAAa,KAAK;AACvC,gBAAI,CAAC,cAAc;AACjB,qBAAO,IAAI,MAAM,EAAE,mDAAmD,CAAC;AAAA,YACzE;AACA,kBAAM,iBAAiB,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,YAAY;AAC5E,gBAAI,gBAAgB;AAClB,qBAAO,IAAI,MAAM,EAAE,uBAAuB,CAAC;AAAA,YAC7C;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAU,OAAO,UAAU;AACzB,cAAM,EAAE,YAAY,IAAI,MAAM,OAAO,iBAAiB,KAAK,IAAI;AAAA,UAC7D,MAAM,MAAM;AAAA,QACd,CAAC;AACD,aAAK,SAAS,YAAY,IAAI,SAAS;AAAA,MACzC;AAAA,MACA,2BAA2B,CAAC,UAAU,CAAC,MAAM;AAAA,MAC7C,OAAO,EAAE,mBAAmB;AAAA;AAAA,EAC9B;AAEJ;;;AC/DA,IAAAC,kBAAkB;;;ACAlB,IAAAC,kBAAkB;AAClB,IAAAC,gBAAiB;AASV,IAAM,cAAc,CAAC,EAAE,WAAW,OAAO,QAAQ,MAAM,MAC5D,gCAAAC,QAAA,cAAC,SAAI,eAAW,cAAAC,SAAK,0BAA0B,SAAS,KACrD,UACC,gCAAAD,QAAA,cAAC,YAAO,WAAU,0CAAyC,SAAS,QAAQ,GAE9E,gCAAAA,QAAA,cAAC,SAAI,WAAU,mCAAiC,KAAM,GACrD,SAAS,gCAAAA,QAAA,cAAC,YAAO,WAAU,wCAAuC,SAAS,OAAO,CACrF;;;ACjBF,IAAAE,kBAAgC;AAQhC,IAAM,oBAAoB,CAAC,EAAE,UAAU,MAA6B;AAClE,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,aAAa,aAAa,eAAe,IAC/C,sBAAuC;AACzC,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAAiC,IAAI;AACrF,QAAM,gBAAgB,IAAI,KAAK,SAAS;AACxC,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAc;AAAA,MACd,cAAc;AAAA,MACd,KAAK;AAAA;AAAA,IAEJ,EAAE,sBAAsB,EAAE,WAAW,cAAc,CAAC;AAAA,IACrD,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,CAAC,GAAG,CAAC;AAAA,QACb,WAAU;AAAA,QACV;AAAA,QACA,SAAS;AAAA;AAAA,MAER,EAAE,6BAA6B,EAAE,WAAW,cAAc,CAAC;AAAA,IAC9D;AAAA,EACF;AAEJ;AAMA,IAAM,iBAAiB,CAAC,EAAE,KAAK,MAAqB;AAClD,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,aAAa,aAAa,eAAe,IAC/C,sBAAuC;AACzC,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAAiC,IAAI;AACrF,QAAM,cACJ,OAAO,MAAM,MAAM,OAAO,KAAK,OAAO,KAAK,MAAM,KAC7C,EAAE,KAAK,IACP,KAAK,MAAM,QAAQ,EAAE,WAAW;AAEtC,SACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAc;AAAA,MACd,cAAc;AAAA,MACd,KAAK;AAAA;AAAA,IAEJ,KAAK,QACJ,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,KAAK,KAAK;AAAA,QACjB,KAAK,aAAa,KAAK,EAAE,WAAW,KAAK,KAAK,EAAE;AAAA,QAChD,MAAM,KAAK,KAAK;AAAA;AAAA,IAClB;AAAA,IAEF,gCAAAA,QAAA,cAAC,SAAI,WAAU,uCAAqC,WAAY;AAAA,IAChE,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,CAAC,GAAG,CAAC;AAAA,QACb,WAAU;AAAA,QACV;AAAA,QACA,SAAS;AAAA;AAAA,MAER;AAAA,IACH;AAAA,EACF;AAEJ;AAEO,IAAM,WAAW,CAAC,EAAE,KAAK,MAC9B,gCAAAA,QAAA,cAAC,SAAI,WAAU,yBACb,gCAAAA,QAAA,cAAC,kBAAe,MAAY,GAC5B,gCAAAA,QAAA,cAAC,qBAAkB,WAAW,KAAK,YAAY,CACjD;AAOK,IAAM,kBAAkB,CAAC,EAAE,MAAM,MACtC,gCAAAA,QAAA,cAAC,SAAI,WAAU,iCACZ,MAAM,IAAI,CAAC,SACV,gCAAAA,QAAA,cAAC,YAAS,KAAK,aAAa,KAAK,EAAE,IAAI,MAAY,CACpD,CACH;;;AC7FF,IAAAC,kBAA4B;;;ACA5B,IAAAC,kBAAoC;AACpC,IAAAC,sBAA6B;AAMtB,SAAS,2BACd,iBACA,sBACA,UACA;AACA,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,CAAC,iBAAiB,kBAAkB,QAAI;AAAA,IAC5C,sBAAsB,eAAe,EAAE,SAAS,CAAC;AAAA,EACnD;AAEA;AAAA,IACE,MACE,sBAAsB;AAAA,MACpB,CAAC,UAAU,CAAC,MAAM,eAAe;AAAA,MACjC,CAAC,CAAC,eAAe,MACf,mBAAmB,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,eAAe,CAAC;AAAA,IAC9D;AAAA,IACF,CAAC,oBAAoB;AAAA,EACvB;AAEA,iCAAU,MAAM;AACd,UAAM,kBAAkB,CAAC,UAAiB;AACxC,UAAI,CAAC,MAAM,UAAW;AACtB,YAAM,eAAW,kCAAa,MAAM,SAAS;AAC7C,UACG,oBAAoB,YAAY,CAAC,YACjC,oBAAoB,WAClB,YAAY,MAAM,UAAU,cAAc;AAE7C;AAEF,UAAI,MAAM,SAAS,qBAAqB;AACtC;AAAA,UAAmB,CAAC,SAClB,MAAM,YACF,KAAK,OAAO,CAAC,SAAS,KAAK,OAAQ,MAAM,UAAgB,EAAE,IAC3D;AAAA,QACN;AAAA,MACF;AACA,UAAI,MAAM,SAAS,qBAAqB;AACtC;AAAA,UAAmB,CAAC,SAClB,MAAM,YACF,KAAK,OAAO,CAAC,SAAS,KAAK,OAAQ,MAAM,UAAgB,EAAE,IAC3D;AAAA,QACN;AAAA,MACF;AACA,UAAI,CAAC,oBAAoB,mBAAmB,EAAE,SAAS,MAAM,IAAI,GAAG;AAClE;AAAA,UAAmB,CAAC,SAClB,MAAM,YAAY,CAAC,MAAM,WAAgB,GAAG,IAAI,IAAI;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,yBAAyB,OAAO,GAAG,oBAAoB,eAAe;AAC5E,UAAM,0BAA0B,OAAO,GAAG,qBAAqB,eAAe;AAC9E,UAAM,0BAA0B,OAAO,GAAG,qBAAqB,eAAe;AAE9E,WAAO,MAAM;AACX,6BAAuB,YAAY;AACnC,8BAAwB,YAAY;AACpC,8BAAwB,YAAY;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,QAAQ,UAAU,eAAe,CAAC;AAEtC,SAAO;AACT;;;ACvEA,IAAAC,kBAAmB;AACnB,IAAAC,kBAAgD;AAChD,IAAAC,sBAA2B;AAepB,IAAM,qBAAqB,CAChC,cACA,kBACG;AACH,QAAM,2BAAuB;AAAA,IAC3B,MACE,IAAI,+BAAoC;AAAA,MACtC,aAAa;AAAA,MACb,OAAO,CAAC;AAAA,MACR,iBAAiB,CAAC;AAAA,MAClB,SAAS;AAAA,IACX,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,QAAM,eAAW,6BAAY,YAAY;AACvC,UAAM,EAAE,SAAS,MAAM,YAAY,IAAI,qBAAqB,eAAe;AAC3E,QAAI,gBAAgB,QAAQ,QAAS;AAErC,yBAAqB,YAAY,EAAE,SAAS,KAAK,CAAC;AAElD,QAAI;AACF,YAAM,EAAE,OAAO,KAAK,IAAI,MAAM,aAAa,WAAW;AACtD,2BAAqB,KAAK,CAAC,UAAU;AAAA,QACnC,GAAG;AAAA,QACH,aAAa,CAAC,CAAC;AAAA,QACf,WAAO,gBAAAC,SAAO,KAAK,MAAM,OAAO,KAAK,GAAG,IAAI;AAAA,QAC5C,iBAAiB;AAAA,QACjB,MAAM,QAAQ;AAAA,MAChB,EAAE;AAAA,IACJ,SAAS,OAAO;AACd,2BAAqB,YAAY,EAAE,MAAsB,CAAC;AAAA,IAC5D;AACA,yBAAqB,YAAY,EAAE,SAAS,MAAM,CAAC;AAAA,EACrD,GAAG,CAAC,sBAAsB,YAAY,CAAC;AAEvC,iCAAU,MAAM;AACd,UAAM,EAAE,MAAM,IAAI,qBAAqB,eAAe;AACtD,QAAI,CAAC,iBAAiB,MAAM,OAAQ;AACpC,aAAS;AAAA,EACX,GAAG,CAAC,sBAAsB,eAAe,QAAQ,CAAC;AAElD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;AFnDA,IAAM,0BAA0B,CAC9B,UAC0C;AAAA,EAC1C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAMO,IAAM,0BAA0B,CAAC;AAAA,EACtC;AACF,IAAmC,CAAC,MAAM;AACxC,QAAM,EAAE,KAAK,IAAI,eAAe;AAEhC,QAAM,mBAAe;AAAA,IACnB,OAAO,SAAS;AACd,YAAM,EAAE,MAAM,SAAS,MAAM,IAAI,MAAM,KAAK,aAAa;AAAA,QACvD,QAAQ,kBAAkB;AAAA,QAC1B,SAAS,CAAC,OACN,kBAAkB,UAClB,EAAE,GAAG,kBAAkB,SAAS,KAAK;AAAA,QACzC,MAAM,EAAE,YAAY,IAAI,GAAG,kBAAkB,KAAK;AAAA,MACpD,CAAC;AACD,aAAO,EAAE,OAAO,OAAO,MAAM,QAAQ;AAAA,IACvC;AAAA,IACA,CAAC,kBAAkB,IAAI;AAAA,EACzB;AAEA,QAAM,EAAE,sBAAsB,SAAS,IAAI,mBAAmB,cAAc,IAAI;AAChF,QAAM,UAAU,2BAAuC,UAAU,oBAAoB;AACrF,QAAM,CAAC,OAAO,aAAa,OAAO,IAAI;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AGzDA,IAAAC,kBAA4B;AAY5B,IAAMC,2BAA0B,CAC9B,UAC0C;AAAA,EAC1C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAMO,IAAM,+BAA+B,CAAC;AAAA,EAC3C;AACF,MAA0C;AACxC,QAAM,EAAE,KAAK,IAAI,eAAe;AAEhC,QAAM,mBAAe;AAAA,IACnB,OAAO,SAAS;AACd,YAAM,EAAE,MAAM,SAAS,OAAAC,OAAM,IAAI,MAAM,KAAK,iBAAiB;AAAA,QAC3D,QAAQ,iBAAiB;AAAA,QACzB,SAAS,CAAC,OACN,kBAAkB,UAClB,EAAE,GAAG,kBAAkB,SAAS,KAAK;AAAA,QACzC,MAAM,EAAE,YAAY,IAAI,GAAG,kBAAkB,KAAK;AAAA,MACpD,CAAC;AACD,aAAO,EAAE,OAAOA,QAAO,MAAM,QAAQ;AAAA,IACvC;AAAA,IACA,CAAC,kBAAkB,IAAI;AAAA,EACzB;AAEA,QAAM,EAAE,sBAAsB,SAAS,IAAI,mBAAmB,cAAc,IAAI;AAChF,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,iBAAiB,OAAO;AAAA,EAC1B;AACA,QAAM,CAAC,OAAO,aAAa,OAAO,IAAI;AAAA,IACpC;AAAA,IACAD;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC7DA,IAAAE,gBAAiB;AACjB,IAAAC,kBAAqB;AAErB,IAAAC,kBAAkD;;;ACH3C,IAAM,iCAAiC;AACvC,IAAM,4BAA4B;AAClC,IAAM,2BAA2B;AACjC,IAAM,qCAAqC;AAC3C,IAAM,6BAA6B;;;ADM1C,IAAM,qBAAqB,CAAC,UAAiB;AAC3C,MAAI,iBAAiB,cAAc,MAAM,WAAW,GAAG;AACrD,UAAM,eAAe;AAAA,EACvB;AACF;AAgBO,IAAM,0BAA0B,CACrC,UACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,cAAU,wBAA8B,IAAI;AAClD,QAAM,eAAW,wBAA8B,IAAI;AAEnD,QAAM,qBAAiB;AAAA,IACrB,UACE,gBAAAC,SAAS,MAAM;AACb,YAAMC,QAAO,QAAQ;AACrB,YAAM,QAAQ,SAAS;AACvB,UAAI,CAACA,SAAQA,MAAK,iBAAiB,QAAQ,CAAC,OAAO;AACjD;AAAA,MACF;AAEA,YAAM,qBACJ,MAAM,eAAeA,MAAK,YAAYA,MAAK;AAC7C,YAAM,kBAAkBA,MAAK;AAE7B,UAAI,gBAAgB;AAClB,uBAAe,oBAAoB,iBAAiB,SAAS;AAAA,MAC/D;AAEA,UAAI,kBAAkB,OAAO,SAAS,GAAG;AACvC,gCAAwB;AAAA,MAC1B;AAEA,UAAI,qBAAqB,OAAO,SAAS,GAAG;AAC1C,mCAA2B;AAAA,MAC7B;AAAA,IACF,GAAG,kBAAkB;AAAA,IACvB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,iCAAU,MAAM;AACd,UAAM,gBAAgB,QAAQ;AAC9B,QAAI,CAAC,cAAe;AAEpB,kBAAc,iBAAiB,UAAU,gBAAgB,UAAU;AAEnE,WAAO,MAAM;AACX,oBAAc,oBAAoB,UAAU,gBAAgB,UAAU;AAAA,IACxE;AAAA,EACF,GAAG,CAAC,gBAAgB,UAAU,CAAC;AAE/B,iCAAU,MAAM;AACd,UAAMA,QAAO,QAAQ;AACrB,QAAI,CAACA,SAAQ,OAAO,mBAAmB,eAAe,CAAC,eAAgB;AACvE,UAAM,WAAW,IAAI,eAAe,cAAc;AAClD,aAAS,QAAQA,KAAe;AAEhC,WAAO,MAAM;AACX,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,iCAAU,MAAM;AACd,UAAMA,QAAO,QAAQ;AACrB,QAAIA,OAAM;AACR,MAAAA,MAAK,iBAAiB,SAAS,oBAAoB,EAAE,SAAS,MAAM,CAAC;AAAA,IACvE;AACA,WAAO,MAAM;AACX,UAAIA,OAAM;AACR,QAAAA,MAAK,oBAAoB,SAAS,oBAAoB,UAAU;AAAA,MAClE;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,eAAW,cAAAC,SAAK,uCAAuC,SAAS;AAAA,MAChE,KAAK;AAAA;AAAA,IAEL,gCAAAD,QAAA,cAAC,SAAI,WAAU,gDAA+C,KAAK,YAChE,QACH;AAAA,EACF;AAEJ;;;APhHA,IAAME,qBAAoB,CAAC,eAAwD;AAAA,EACjF,WAAW,UAAU;AAAA,EACrB,WAAW,UAAU;AACvB;AAOO,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AACF,MAA2B;AACzB,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,WAAW,UAAU,IAAI,cAAc,KAAK,OAAOA,kBAAiB;AAE5E,QAAM,EAAE,SAAS,OAAO,aAAa,SAAS,SAAS,IAAI,wBAAwB;AAEnF,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,uCACb,gCAAAA,QAAA,cAAC,eAAY,OAAc,OAAO,EAAE,eAAe,GAAG,GACtD,gCAAAA,QAAA,cAAC,SAAI,WAAU,6CACb,gCAAAA,QAAA,cAAC,2BAAwB,0BAA0B,UAAU,WAAW,MACtE,gCAAAA,QAAA,cAAC,SAAI,WAAU,gCACZ,QAAQ,IAAI,CAAC,WACZ,gCAAAA,QAAA,cAAC,SAAI,WAAU,yBAAwB,KAAK,WAAW,OAAO,EAAE,MAC7D,OAAO,eACN,gCAAAA,QAAA,cAAC,OAAE,WAAU,iCAA+B,OAAO,WAAY,GAEjE,gCAAAA,QAAA,cAAC,YAAS,KAAK,aAAa,OAAO,EAAE,IAAI,MAAM,QAAQ,CACzD,CACD,CACH,GACC,eACC,gCAAAA,QAAA,cAAC,SAAI,WAAU,6CACZ,WAAW,gCAAAA,QAAA,cAAC,sBAAiB,CAChC,CAEJ,GACC,OAAO,WAAW,gCAAAA,QAAA,cAAC,aAAK,OAAO,OAAQ,CAC1C,GACC,QAAQ,SAAS,KAAK,CAAC,aACtB,gCAAAA,QAAA,cAAC,YAAO,WAAU,yBAAwB,SAAS,0BAChD,YAAY,EAAE,qBAAqB,IAAI,EAAE,eAAe,CAC3D,CAEJ;AAEJ;;;ASjEA,IAAAC,kBAAkB;;;ACAlB,IAAAC,gBAAiB;AACjB,IAAAC,kBAAkB;;;ACDlB,IAAAC,gBAAiB;AACjB,IAAAC,kBAAqB;AACrB,IAAAC,kBAA+B;AAC/B,IAAAC,sBAA6B;AAgBtB,IAAM,YAAY,CAAC,EAAE,QAAQ,UAAU,MAC5C,gCAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,cAAAC,SAAK,wBAAwB,SAAS;AAAA,IACjD,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,OACE;AAAA,MACE,sCAAsC,SAAS;AAAA,IACjD;AAAA;AAEJ;AAKK,IAAM,YAAY,CAAC,EAAE,QAAQ,MAClC,gCAAAD,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,cAAAC,SAAK,uBAAuB,EAAE,gCAAgC,QAAQ,CAAC;AAAA;AACpF;AAWF,IAAMC,qBAAoB,CAAC,eAAwD;AAAA,EACjF,WAAW,UAAU;AAAA,EACrB,wBAAwB,UAAU;AAAA,EAClC,mBAAmB,UAAU;AAAA,EAC7B,oBAAoB,UAAU;AAAA,EAC9B,uBAAuB,UAAU;AAAA,EACjC,mBAAmB,UAAU;AAC/B;AAQO,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,MAA+B;AAC7B,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,sBAAsB,CAAC,EAAE,IAAI,uBAAuB,sBAAsB;AAClF,QAAM,EAAE,QAAQ,IAAI,kBAAkB;AAEtC,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc,KAAK,OAAOA,kBAAiB;AAC/C,QAAM,cAAc,oBAAoB,gBAAgB,KAAK,CAAC;AAC9D,QAAM,qBAAqB,kBAAkB,CAAC,IAC1C,sBAAsB,kBAAkB,CAAC,CAAC,IAC1C;AAEJ,QAAM,iBAAa;AAAA,IACjB,UACE,gBAAAC,SAAS,MAAM;AACb,UAAI,CAAC,YAAa;AAClB,YAAM,wBAAwB,CAAC,CAAC,mBAAmB,OAAO,EAAE;AAC5D,aAAO,wBACH,KAAK,WAAW,mBAAmB,OAAO,EAAE,EAAE,IAAI,QAAQ,EAAE,IAC5D,KAAK,SAAS,OAAO,IAAI,QAAQ,EAAE;AAAA,IACzC,GAAG,GAAG;AAAA,IACR,CAAC,aAAa,QAAQ,IAAI,OAAO,IAAI,oBAAoB,IAAI;AAAA,EAC/D;AAEA,SACE,gCAAAH,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,yBAAyB;AAAA,QACvC,kCAAkC;AAAA,MACpC,CAAC;AAAA,MACD,KAAK,oBAAoB,OAAO,EAAE;AAAA,MAClC,SAAS;AAAA;AAAA,IAER,eAAe,gCAAAD,QAAA,cAAC,aAAU,SAAS,CAAC,CAAC,mBAAmB,OAAO,EAAE,GAAG;AAAA,IACrE,gCAAAA,QAAA,cAAC,SAAI,WAAU,gCACb,gCAAAA,QAAA,cAAC,OAAE,WAAU,gCAA8B,OAAO,IAAK,GACtD,sBAAsB,sBAAsB,YAC3C,gCAAAA,QAAA,cAAC,SAAI,WAAU,kCACZ,yBAAyB,OAAO,EAAE,KAChC,uBAAuB,OAAO,EAAE,EAC9B,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,QAAQ,KAAC,kCAAa,IAAI,CAAC,EACnD,MAAM,GAAG,kBAAkB,EAC3B,IAAI,CAAC,EAAE,KAAK,MACX,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,MAAM;AAAA,QACb,KAAK,eAAe,OAAO,EAAE,WAAW,MAAM,EAAE;AAAA,QAChD,MAAM,MAAM;AAAA;AAAA,IACd,CACD,CACP,GAEF,gCAAAA,QAAA,cAAC,SAAI,WAAU,sCACZ,mBACG,EAAE,mBAAmB;AAAA,MACnB,OAAO,sBAAsB,OAAO,EAAE,KAAK;AAAA,IAC7C,CAAC,IACA,sBAAsB,OAAO,EAAE,KAAK,CAC3C,CACF;AAAA,IACA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SACG,uBACE,sBAAsB,OAAO,EAAE,KAAK,KAAK,sBAAsB;AAAA,QAEpE,eAAW,cAAAC,SAAK,oCAAoC;AAAA,UAClD,4CACE,aACA,kBAAkB,WAAW,KAC7B,kBAAkB,CAAC,MAAM,OAAO;AAAA,QACpC,CAAC;AAAA;AAAA,IACH;AAAA,EACF;AAEJ;;;ADzIA,IAAMG,qBAAoB,CAAC,eAAwD;AAAA,EACjF,SAAS,UAAU;AACrB;AAMO,IAAM,iBAAiB,CAAC,EAAE,oBAAoB,MAA2B;AAC9E,QAAM,EAAE,oBAAAC,sBAAqB,mBAA0B,IAAI,oBAAoB;AAC/E,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,QAAQ,IAAI,cAAc,KAAK,OAAOD,kBAAiB;AAE/D,SACE,gCAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,8BAA8B;AAAA,QAC5C,oCAAoC,OAAO,wBAAwB;AAAA,MACrE,CAAC;AAAA;AAAA,IAEA,QAAQ,MAAM,GAAG,uBAAuB,QAAQ,MAAM,EAAE,IAAI,CAAC,WAC5D,gCAAAD,QAAA;AAAA,MAACD;AAAA,MAAA;AAAA,QACC,oBAAoB;AAAA,QACpB,KAAK,eAAe,OAAO,EAAE;AAAA,QAC7B;AAAA;AAAA,IACF,CACD;AAAA,EACH;AAEJ;;;AD5BA,IAAMG,qBAAoB,CAAC,eAAwD;AAAA,EACjF,MAAM,UAAU;AAClB;AAMO,IAAM,sBAAsB,CAAC,EAAE,MAAM,MAAmC;AAC7E,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,MAAAC,MAAK,IAAI,cAAc,KAAK,OAAOD,kBAAiB;AAE5D,SACE,gCAAAE,QAAA,cAAC,SAAI,WAAW,uCACd,gCAAAA,QAAA,cAAC,eAAY,OAAc,OAAO,EAAE,cAAc,GAAG,GACrD,gCAAAA,QAAA,cAAC,SAAI,WAAU,6CACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,8CAA4CD,KAAK,GAChE,gCAAAC,QAAA,cAAC,oBAAe,CAClB,CACF;AAEJ;;;AG/BA,IAAAC,gBAAiB;AACjB,IAAAC,kBAA6C;;;ACD7C,IAAAC,kBAA+B;;;ACA/B,IAAAC,kBAAkB;AASlB,IAAMC,qBAAoB,CAAC,eAAwD;AAAA,EACjF,mBAAmB,UAAU;AAAA,EAC7B,uBAAuB,UAAU;AACnC;AAMO,IAAM,8BAA8B,CAAC;AAAA,EAC1C;AACF,MAAwC;AACtC,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,mBAAmB,sBAAsB,IAAI;AAAA,IACnD,KAAK;AAAA,IACLA;AAAA,EACF;AAEA,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,+CACZ,kBAAkB,WAAW,KAAK,kBAAkB,CAAC,MAAM,YAC1D,gCAAAA,QAAA,cAAC,SAAI,WAAU,6CAA4C,GAE7D,gCAAAA,QAAA,cAAC,UAAK,WAAU,6CACb,EAAE,mBAAmB,EAAE,OAAO,sBAAsB,QAAQ,KAAK,EAAE,CAAC,CACvE,CACF;AAEJ;AAMO,IAAM,4BAA4B,CAAC,EAAE,OAAO,MACjD,gCAAAA,QAAA,cAAC,SAAI,WAAU,mCACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,wCAAsC,OAAO,IAAK,GACjE,gCAAAA,QAAA,cAAC,+BAA4B,UAAU,OAAO,IAAI,CACpD;;;ADpCK,IAAM,sBAAsB,CAAC,EAAE,OAAO,MAAmC;AAC9E,QAAM,uBAAmB;AAAA,IACvB,OAAO,EAAE,QAAQ,EAAE,WAAW,OAAO,GAAG,EAAE;AAAA,IAC1C,CAAC,OAAO,EAAE;AAAA,EACZ;AACA,QAAM,EAAE,OAAO,aAAa,SAAS,UAAU,MAAM,IAAI,6BAA6B;AAAA,IACpF;AAAA,EACF,CAAC;AAED,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,iEACb,gCAAAA,QAAA,cAAC,6BAA0B,QAAgB,GAC3C,gCAAAA,QAAA,cAAC,2BAAwB,0BAA0B,UAAU,WAAW,MACtE,gCAAAA,QAAA,cAAC,mBAAgB,OAAc,GAC9B,eACC,gCAAAA,QAAA,cAAC,SAAI,WAAU,6CACZ,WAAW,gCAAAA,QAAA,cAAC,sBAAiB,CAChC,CAEJ,GACC,SAAS,MAAM,OAClB;AAEJ;;;AEnCA,IAAAC,kBAAkB;AAelB,IAAMC,qBAAoB,CAAC,eAAwD;AAAA,EACjF,wBAAwB,UAAU;AACpC;AAQO,IAAM,4BAA4B,CAAC;AAAA,EACxC,oBAAoB;AAAA,EACpB;AAAA,EACA;AACF,MAAgC;AAC9B,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,sBAAsB,CAAC,EAAE,IAAI;AAAA,IACnC;AAAA,EACF;AACA,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,uBAAuB,IAAI,cAAc,KAAK,OAAOA,kBAAiB;AAE9E,QAAM,QAAQ,0BAA0B,uBAAuB,OAAO,EAAE;AAExE,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,2BACb,gCAAAA,QAAA,cAAC,6BAA0B,QAAgB,GAC1C,SAAS,gCAAAA,QAAA,cAAC,mBAAgB,OAAO,MAAM,MAAM,GAAG,iBAAiB,GAAG,GACpE,oBAAoB,kBAAkB,KACrC,gBACA,OAAO,SAAS,qBACd,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS;AAAA;AAAA,IAER,EAAE,UAAU;AAAA,EACf,CAEN;AAEJ;;;AHzCA,IAAMC,sBAAoB,CAAC,eAAwD;AAAA,EACjF,MAAM,UAAU;AAAA,EAChB,SAAS,CAAC,GAAG,UAAU,OAAO;AAAA,EAC9B,uBAAuB,UAAU;AACnC;AAMO,IAAM,cAAc,CAAC,EAAE,MAAM,MAAwB;AAC1D,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,MAAAC,OAAM,SAAS,sBAAsB,IAAI;AAAA,IAC/C,KAAK;AAAA,IACLD;AAAA,EACF;AACA,QAAM,CAAC,cAAc,eAAe,QAAI,0BAAqB;AAE7D,QAAM,aAAS,6BAAY,MAAM,gBAAgB,MAAS,GAAG,CAAC,CAAC;AAE/D,SACE,gCAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,iCAAiC;AAAA,QAC/C,gDAAgD;AAAA,MAClD,CAAC;AAAA;AAAA,IAEA,eACC,gCAAAD,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA,cAAC,eAAY,OAAc,QAAgB,OAAO,aAAa,MAAM,GACrE,gCAAAA,QAAA,cAAC,SAAI,WAAU,yCACb,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,sBAAsB,aAAa,EAAE;AAAA,QAC1C,QAAQ;AAAA;AAAA,IACV,CACF,CACF,IAEA,gCAAAA,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA,cAAC,eAAY,OAAc,OAAO,EAAE,cAAc,GAAG,GACrD,gCAAAA,QAAA,cAAC,SAAI,WAAU,yCACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,0CAAwCD,KAAK,GAC5D,gCAAAC,QAAA,cAAC,SAAI,WAAU,gDACZ,QACE;AAAA,MAAK,CAAC,MAAM,aACV,sBAAsB,QAAQ,EAAE,KAAK,OACrC,sBAAsB,KAAK,EAAE,KAAK,KAC/B,IACA;AAAA,IACN,EACC,IAAI,CAAC,WACJ,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,eAAe,OAAO,EAAE;AAAA,QAC7B;AAAA,QACA,cAAc,MAAM,gBAAgB,MAAM;AAAA;AAAA,IAC5C,CACD,CACL,CACF,CACF;AAAA,EAEJ;AAEJ;;;AI7EO,IAAM,mBAAmB;AAEzB,IAAM,wBAAwB;;;AnByBrC,IAAM,qBAAqB;AAmB3B,IAAME,sBAAoB,CAAC,eAAwD;AAAA,EACjF,eAAe,UAAU;AAAA,EACzB,8BAA8B,UAAU;AAAA,EACxC,eAAe,UAAU;AAAA,EACzB,eAAe,UAAU;AAAA,EACzB,WAAW,UAAU;AAAA,EACrB,SAAS,UAAU;AAAA,EACnB,WAAW,UAAU;AACvB;AAWO,IAAM,cAAc,CAAC;AAAA,EAC1B,gBAAAC,kBAAiB;AAAA,EACjB,eAAAC,iBAAgB;AAAA,EAChB,gBAAAC,kBAAiB;AAAA,EACjB,qBAAAC,uBAAsB;AAAA,EACtB,aAAAC,eAAc;AAAA,EACd,uBAAAC,yBAAwB;AAC1B,MAAwB;AACtB,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,EAAE,IAAI,sBAAsB,aAAa;AACjD,QAAM,EAAE,sBAAsB,CAAC,EAAE,IAAI,uBAAuB,aAAa;AACzE,QAAM,EAAE,QAAQ,IAAI,kBAAkB,aAAa;AACnD,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc,KAAK,OAAON,mBAAiB;AAC/C,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAgC;AAElE,QAAM,cAAc,oBAAoB,gBAAgB,KAAK,CAAC;AAC9D,QAAM,iBAAa,6BAAY,MAAM,aAAa,MAAS,GAAG,CAAC,CAAC;AAChE,QAAM,0BAAsB,6BAAY,MAAM,aAAa,aAAa,GAAG,CAAC,CAAC;AAE7E,SACE,gCAAAO,QAAA,cAAC,SAAI,WAAU,4BACZ,QAAQ,SAAS,yBAChB,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,YAAY,EAAE,+BAA+B;AAAA,QAC3C,OAAO,QAAQ;AAAA,MACjB,CAAC;AAAA,MACD;AAAA,MACA,gBAAgB;AAAA,MAChB,aAAa,cAAc;AAAA,MAC3B,WAAW,MAAM,aAAa,kBAAkB;AAAA;AAAA,IAEhD,gCAAAA,QAAA,cAACH,sBAAA,EAAoB,OAAO,YAAY;AAAA,EAC1C,GAGD,eACC,gCACA,QAAQ,SAAS,oBACf,gCAAAG,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,YAAY,EAAE,mBAAmB;AAAA,MACjC;AAAA,MACA,oBAAgB,cAAAC;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,MACA,aAAa,cAAc;AAAA,MAC3B,WAAW,MAAM,aAAa,gBAAgB;AAAA;AAAA,IAE9C,gCAAAD,QAAA,cAACD,wBAAA,EAAsB,OAAO,YAAY,WAAW,QAAQ,IAAI;AAAA,EACnE,GAGH,CAAC,aAAa,iBACb,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,YAAY,YAAY,EAAE,qBAAqB,IAAI,EAAE,eAAe;AAAA,MACpE;AAAA,MACA,oBAAgB,cAAAC,SAAK,oBAAoB,iCAAiC;AAAA,MAC1E,aAAa,cAAc;AAAA,MAC3B,WAAW,MAAM,aAAa,aAAa;AAAA;AAAA,IAE3C,gCAAAD,QAAA,cAACN,iBAAA,EAAe,OAAO,YAAY,WAAW,QAAQ,IAAI;AAAA,EAC5D,GAGD,gBAAgB,KAAK,oBAAoB,kBAAkB,KAC1D,gCAAAM,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,YAAY,EAAE,2BAA2B,EAAE,OAAO,cAAc,CAAC;AAAA,MACjE;AAAA,MACA,oBAAgB,cAAAC,SAAK,oBAAoB,kCAAkC;AAAA,MAC3E,aAAa,cAAc;AAAA,MAC3B,WAAW,MAAM,aAAa,eAAe;AAAA;AAAA,IAE7C,gCAAAD,QAAA;AAAA,MAACJ;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,QACP,wBAAwB;AAAA;AAAA,IAC1B;AAAA,EACF,GAGF,gCAAAI,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,YAAY,EAAE,cAAc;AAAA,MAC5B;AAAA,MACA,oBAAgB,cAAAC,SAAK,oBAAoB,8BAA8B;AAAA,MACvE,aAAa,cAAc;AAAA,MAC3B,WAAW,MAAM,aAAa,cAAc;AAAA;AAAA,IAE5C,gCAAAD,QAAA,cAACF,cAAA,EAAY,OAAO,YAAY;AAAA,EAClC,GAEC,CAAC,aAAa,kBAAkB,OAAO,MAAM,MAC5C,gCAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,YAAY,EAAE,UAAU;AAAA,MACxB;AAAA,MACA,oBAAgB,cAAAC,SAAK,oBAAoB,0BAA0B;AAAA,MACnE,aAAa,cAAc;AAAA,MAC3B,WAAW,MAAM,aAAa,UAAU;AAAA;AAAA,IAExC,gCAAAD,QAAA,cAACL,gBAAA,EAAc,OAAO,YAAY;AAAA,EACpC,CAEJ;AAEJ;;;APrKA,IAAM,+BAA+B,CACnC,eAC6C,EAAE,WAAW,UAAU,UAAU;AACzE,IAAM,cAAc,MAAM;AAC/B,QAAM,EAAE,aAAAO,eAAc,aAAoB,YAAAC,cAAa,WAAkB,IACvE,oBAAoB;AACtB,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,UAAU,IAAI,cAAc,KAAK,OAAO,4BAA4B;AAE5E,SACE,gCAAAC,QAAA,cAAC,SAAI,eAAW,cAAAC,SAAK,kBAAkB,EAAE,0BAA0B,UAAU,CAAC,KAC5E,gCAAAD,QAAA,cAACD,aAAA,IAAW,GACZ,gCAAAC,QAAA,cAAC,kBAAe,qBAAqB,uBAAuB,GAC5D,gCAAAA,QAAA,cAACF,cAAA,IAAY,CACf;AAEJ;;;A2B3BA,IAAAI,gBAAiB;AACjB,IAAAC,kBAAkB;AASlB,IAAM,8BAA8B,CAClC,eAC4C;AAAA,EAC5C,WAAW,UAAU;AAAA,EACrB,MAAM,UAAU;AAClB;AAEO,IAAM,aAAa,MAAM;AAC9B,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,WAAW,MAAAC,MAAK,IAAI,cAAc,KAAK,OAAO,2BAA2B;AAEjF,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,iCAAiC;AAAA,QAC/C,yCAAyC;AAAA,MAC3C,CAAC;AAAA;AAAA,IAED,gCAAAD,QAAA,cAAC,SAAI,WAAU,yCAAsC,WAAE;AAAA,IACvD,gCAAAA,QAAA,cAAC,SAAI,WAAU,yCAAuCD,KAAK;AAAA,EAC7D;AAEJ;;;A5BzBO,IAAM,OAAO,CAAC,EAAE,UAAU,KAAK,MAA+C;AACnF,QAAM,EAAE,aAAAG,eAAc,aAAoB,YAAAC,cAAa,WAAkB,IACvE,oBAAoB;AACtB,SAAO,OACL,gCAAAC,QAAA,cAAC,gBAAa,QAAa,WAAW,gCAAAA,QAAA,cAACD,aAAA,IAAW,IAAK,gCAAAC,QAAA,cAACF,cAAA,IAAY,CAAG,IACrE;AACN;;;A6BZA,IAAAG,kBAAmC;AAEnC,IAAAC,sBAAiC;;;ACFjC,IAAAC,gBAAiB;AACjB,IAAAC,kBAA+B;;;ACD/B,IAAAC,gBAAiB;AAOjB,IAAAC,kBAA8B;AAIvB,IAAM,cAAc,CAAC,EAAE,UAAU,GAAG,MAAM,MAAwB;AACvE,QAAM,eAAW,wBAA4B,IAAI;AACjD,QAAM,cAAoD,CAAC,UAAU;AACnE,QAAI,CAAC,CAAC,KAAK,OAAO,EAAE,SAAS,MAAM,GAAG,KAAK,CAAC,SAAS,QAAS;AAC9D,UAAM,eAAe;AACrB,aAAS,QAAQ,MAAM;AAAA,EACzB;AAEA,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,sDAAsD;AAAA,QACpE,gEAAgE,MAAM;AAAA,MACxE,CAAC;AAAA;AAAA,IAED,gCAAAD,QAAA,cAAC,eACC,gCAAAA,QAAA,cAAC,SAAI,WAAU,gEACZ,QACH,GACA,gCAAAA,QAAA,cAAC,WAAM,MAAK,YAAY,GAAG,OAAO,KAAK,UAAU,GACjD,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,cAAAC,SAAK,wCAAwC;AAAA,UACtD,4CAA4C,MAAM;AAAA,QACpD,CAAC;AAAA,QACD,SAAS;AAAA,QACT,UAAU;AAAA;AAAA,MAEV,gCAAAD,QAAA,cAAC,SAAI,WAAU,+CAA8C;AAAA,IAC/D,CACF;AAAA,EACF;AAEJ;AAMO,IAAM,oBAAoB,CAAC,EAAE,WAAW,GAAG,MAAM,MACtD,gCAAAA,QAAA,cAAC,eAAa,GAAG,SACf,gCAAAA,QAAA,cAAC,SAAI,WAAU,8DACZ,SACH,CACF;;;AD5CF,IAAM,4BAA4B,CAAC,WAA8B;AAAA,EAC/D,qBAAqB,MAAM,KAAK;AAAA,EAChC,OAAO,MAAM,OAAO;AAAA,EACpB,mBAAmB,MAAM,KAAK;AAChC;AAEO,IAAM,uBAAuB,MAAM;AACxC,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,aAAa,IAAI,mBAAmB;AAC5C,QAAM,EAAE,qBAAqB,OAAO,kBAAkB,IAAI;AAAA,IACxD,aAAa;AAAA,IACb;AAAA,EACF;AAEA,QAAM,4BAAwB;AAAA,IAC5B,OAAO;AAAA,MACL,kCAAkC,EAAE,gCAAgC;AAAA,MACpE,8BAA8B,EAAE,4BAA4B;AAAA,IAC9D;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,SACE,gCAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,oCAAoC;AAAA,QAClD,8CAA8C,CAAC;AAAA,MACjD,CAAC;AAAA;AAAA,IAED,gCAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,CAAC;AAAA,QACV,IAAG;AAAA,QACH,WAAW,EAAE,kBAAkB;AAAA,QAC/B,UAAU,CAAC,MAAM;AACf,uBAAa,aAAa,EAAE,qBAAqB,CAAC,EAAE,OAAO,QAAQ,CAAC;AAAA,QACtE;AAAA;AAAA,IACF;AAAA,IACC,CAAC,uBACA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,cAAAC,SAAK,+BAA+B;AAAA,UAC7C,0CAA0C;AAAA,QAC5C,CAAC;AAAA;AAAA,MAED,gCAAAD,QAAA,cAAC,SAAI,eAAW,cAAAC,SAAK,oCAAoC,KACvD,gCAAAD,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,eAAa;AAAA,UACb,MAAM,UAAU,sBAAsB,KAAK,KAAK,EAAE,OAAO;AAAA;AAAA,MAC3D,GACA,gCAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,QAAQ,MAAM;AACZ,yBAAa,gBAAgB,mBAAmB;AAAA,UAClD;AAAA,UACA,UAAU,CAAC,MAAM;AACf,kBAAM,wBAAwB,CAAC,EAAE,OAAO,SAAS,QAC7C;AAAA,cACE,mBAAmB,EAAE,0BAA0B;AAAA,YACjD,IACA;AACJ,yBAAa;AAAA,cACX;AAAA,gBACE,mBAAmB,CAAC,wBAChB,EAAE,OAAO,QACT,aAAa;AAAA,cACnB;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,UACA,aAAa,EAAE,wCAAwC;AAAA,UACvD,MAAK;AAAA,UACL,OAAO;AAAA;AAAA,MACT,CACF;AAAA,IACF;AAAA,EAEJ;AAEJ;;;AEtFA,IAAAE,kBAA+B;AAC/B,IAAAC,gBAAiB;AAOjB,IAAMC,6BAA4B,CAAC,WAA8B;AAAA,EAC/D,OAAO,MAAM,OAAO;AAAA,EACpB,MAAM,MAAM,KAAK;AACnB;AAEO,IAAM,YAAY,MAAM;AAC7B,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,aAAa,IAAI,mBAAmB;AAC5C,QAAM,EAAE,OAAO,MAAAC,MAAK,IAAI,cAAc,aAAa,OAAOD,0BAAyB;AACnF,QAAM,4BAAwB;AAAA,IAC5B,OAAO;AAAA,MACL,wBAAwB,EAAE,sBAAsB;AAAA,IAClD;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,SACE,gCAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC;AAAA,QACT;AAAA,QACA;AAAA,UACE,0CAA0C;AAAA,QAC5C;AAAA,MACF;AAAA;AAAA,IAEA,gCAAAD,QAAA,cAAC,WAAM,WAAU,+BAA8B,SAAQ,UACpD,EAAE,UAAU,CACf;AAAA,IACA,gCAAAA,QAAA,cAAC,SAAI,eAAW,cAAAC,SAAK,oCAAoC,KACvD,gCAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAa;AAAA,QACb,MAAM,UAAU,sBAAsB,KAAK,KAAK,EAAE,OAAO;AAAA;AAAA,IAC3D,GACA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,QAAQ,MAAM;AACZ,uBAAa,gBAAgB,MAAM;AAAA,QACrC;AAAA,QACA,UAAU,CAAC,MAAM;AACf,uBAAa,aAAa,EAAE,MAAM,EAAE,OAAO,MAAM,CAAC;AAAA,QACpD;AAAA,QACA,aAAa,EAAE,gBAAgB;AAAA,QAC/B,MAAK;AAAA,QACL,OAAOD;AAAA;AAAA,IACT,CACF;AAAA,EACF;AAEJ;;;ACzDA,IAAAG,gBAAiB;AACjB,IAAAC,kBAA4C;;;ACA5C,IAAAC,kBAA2C;AAC3C,IAAAC,gBAAiB;AAQV,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAiC;AAC/B,QAAM,CAACC,QAAO,QAAQ,QAAI,0BAAmB,CAAC,CAAC;AAC/C,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,0BAAwB,IAAI;AACxE,QAAM,CAAC,eAAe,gBAAgB,QAAI,0BAAwB,IAAI;AACtE,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAgC,IAAI;AAEtE,QAAM,gBACJ,mBAAmB,QAAQ,kBAAkB,OACzC,SACA,kBAAkB,gBAChB,SACA;AAER,QAAM,gBAAgB,gBAAAC,QAAM,SAAS,QAAQ,QAAQ;AAErD,iCAAU,MAAM;AACd,aAAS,gBAAAA,QAAM,SAAS,IAAI,UAAU,CAAC,GAAGC,WAAUA,MAAK,KAAK,CAAC,CAAC;AAAA,EAClE,GAAG,CAAC,QAAQ,CAAC;AAEb,iCAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAEhB,UAAM,kBAAkB,CAAC,MAAiB;AACxC,YAAM,SAAS,EAAE;AACjB,YAAM,gBAAgB,OAAO,QAAQ,0CAA0C;AAC/E,UAAI,EAAE,cAAc;AAClB,UAAE,aAAa,gBAAgB;AAAA,MACjC;AAEA,UAAI,yBAAyB,aAAa;AACxC,cAAMA,SAAQ,MAAM,KAAK,cAAc,eAAe,YAAY,CAAC,CAAC,EAAE;AAAA,UACpE;AAAA,QACF;AACA,0BAAkBA,MAAK;AACvB,UAAE,cAAc,QAAQ,cAAcA,OAAM,SAAS,CAAC;AACtD,sBAAc,MAAM,UAAU;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,iBAAiB,CAAC,MAAiB;AACvC,QAAE,eAAe;AACjB,YAAM,SAAS,EAAE;AACjB,YAAM,gBAAgB,OAAO,QAAQ,0CAA0C;AAC/E,UAAI,yBAAyB,aAAa;AACxC,cAAMA,SAAQ,MAAM,KAAK,cAAc,eAAe,YAAY,CAAC,CAAC,EAAE;AAAA,UACpE;AAAA,QACF;AACA,yBAAiBA,MAAK;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM;AAC5B,uBAAiB,IAAI;AAAA,IACvB;AAEA,UAAM,aAAa,CAAC,MAAiB;AACnC,QAAE,eAAe;AACjB,YAAM,eAAe,SAAS,EAAE,cAAc,QAAQ,YAAY,KAAK,MAAM,EAAE;AAC/E,YAAM,SAAS,EAAE;AACjB,YAAM,gBAAgB,OAAO,QAAQ,0CAA0C;AAC/E,UAAI,yBAAyB,aAAa;AACxC,cAAM,YAAY,MAAM,KAAK,cAAc,eAAe,YAAY,CAAC,CAAC,EAAE;AAAA,UACxE;AAAA,QACF;AACA,YAAI,iBAAiB,MAAM,iBAAiB,WAAW;AACrD,mBAAS,CAAC,cAAc;AACtB,kBAAM,WAAW,CAAC,GAAG,SAAS;AAC9B,kBAAM,CAAC,OAAO,IAAI,SAAS,OAAO,cAAc,CAAC;AACjD,qBAAS,OAAO,WAAW,GAAG,OAAO;AACrC,4BAAgB,QAAQ;AACxB,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AACA,wBAAkB,IAAI;AACtB,uBAAiB,IAAI;AAAA,IACvB;AAEA,UAAM,gBAAgB,CAAC,MAAiB;AACtC,YAAM,SAAS,EAAE;AACjB,UAAI,kBAAkB,aAAa;AACjC,eAAO,MAAM,UAAU;AAAA,MACzB;AACA,wBAAkB,IAAI;AACtB,uBAAiB,IAAI;AAAA,IACvB;AAEA,cAAU,iBAAiB,aAAa,eAAe;AACvD,cAAU,iBAAiB,YAAY,cAAc;AACrD,cAAU,iBAAiB,aAAa,eAAe;AACvD,cAAU,iBAAiB,QAAQ,UAAU;AAC7C,cAAU,iBAAiB,WAAW,aAAa;AAEnD,WAAO,MAAM;AACX,gBAAU,oBAAoB,aAAa,eAAe;AAC1D,gBAAU,oBAAoB,YAAY,cAAc;AACxD,gBAAU,oBAAoB,aAAa,eAAe;AAC1D,gBAAU,oBAAoB,QAAQ,UAAU;AAChD,gBAAU,oBAAoB,WAAW,aAAa;AAAA,IACxD;AAAA,EACF,GAAG,CAAC,WAAW,aAAa,CAAC;AAE7B,SACE,gCAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAE,SAAK,qCAAqC,SAAS;AAAA,MAC9D,KAAK;AAAA;AAAA,IAEJH,OAAM,IAAI,CAAC,eAAe,iBAAiB;AAC1C,YAAM,QAAQ,cAAc,aAAa;AACzC,aACE,gCAAAC,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,cAAAE,SAAK,2CAA2C;AAAA,YACzD,qEACE,kBAAkB,QAAQ,kBAAkB;AAAA,YAC9C,kEACE,kBAAkB,UAAU,kBAAkB;AAAA,UAClD,CAAC;AAAA,UACD;AAAA,UACA,KACE,gBAAAF,QAAM,eAAe,KAAK,IAAI,MAAM,MAAM,kBAAkB,aAAa;AAAA;AAAA,QAG1E;AAAA,MACH;AAAA,IAEJ,CAAC;AAAA,EACH;AAEJ;;;ADtIA,IAAMG,6BAA4B,CAAC,WAA8B;AAAA,EAC/D,QAAQ,MAAM,OAAO;AAAA,EACrB,SAAS,MAAM,KAAK;AACtB;AAEO,IAAM,iBAAiB,MAAM;AAClC,QAAM,EAAE,aAAa,IAAI,mBAAmB;AAC5C,QAAM,EAAE,QAAQ,QAAQ,IAAI;AAAA,IAC1B,aAAa;AAAA,IACbA;AAAA,EACF;AACA,QAAM,EAAE,EAAE,IAAI,sBAAsB,gBAAgB;AAEpD,QAAM,4BAAwB;AAAA,IAC5B,OAAO;AAAA,MACL,yBAAyB,EAAE,uBAAuB;AAAA,MAClD,mBAAmB,EAAE,iBAAiB;AAAA,IACxC;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,aAAuB;AACtB,YAAM,cAAc,aAAa;AACjC,mBAAa,aAAa,EAAE,SAAS,SAAS,IAAI,CAACC,WAAU,YAAYA,MAAK,CAAC,EAAE,CAAC;AAAA,IACpF;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,YAAY,QAAQ,SAAS;AAEnC,SACE,gCAAAC,QAAA,cAAC,cAAS,WAAU,0DAClB,gCAAAA,QAAA,cAAC,YAAO,WAAU,iCAA+B,EAAE,SAAS,CAAE,GAC9D,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV;AAAA,MACA;AAAA;AAAA,IAEC,QAAQ,IAAI,CAAC,QAAQ,MAAM;AAC1B,YAAM,QAAQ,SAAS,OAAO,EAAE;AAChC,aACE,gCAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,cAAAC,SAAK,+BAA+B;AAAA,YAC7C,0CAA0C;AAAA,YAC1C,0CAA0C;AAAA,UAC5C,CAAC;AAAA,UACD,KAAK,mBAAmB,CAAC;AAAA;AAAA,QAEzB,gCAAAD,QAAA,cAAC,SAAI,WAAU,wCACb,gCAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,eAAa;AAAA,YACb,MAAM,UAAU,sBAAsB,KAAK,KAAK,EAAE,OAAO;AAAA;AAAA,QAC3D,GACA,gCAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,OAAO;AAAA,YACX,QAAQ,MAAM;AACZ,2BAAa,gBAAgB,SAAS;AAAA,YACxC;AAAA,YACA,UAAU,CAAC,MAAM;AACf,2BAAa,aAAa;AAAA,gBACxB,SAAS,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,MAAM;AAAA,cAC5C,CAAC;AAAA,YACH;AAAA,YACA,SAAS,CAAC,UAAU;AAClB,oBAAM,2BAA2B,MAAM,QAAQ,SAAS;AACxD,kBAAI,MAAM,QAAQ,WAAW,CAAC,0BAA0B;AACtD,sBAAM,cAAc,QAAQ,IAAI,CAAC,EAAE;AACnC,yBAAS,eAAe,WAAW,GAAG,MAAM;AAAA,cAC9C;AAAA,YACF;AAAA,YACA,aAAa,EAAE,eAAe;AAAA,YAC9B,MAAK;AAAA,YACL,OAAO,OAAO;AAAA;AAAA,QAChB,CACF;AAAA,QACC,aAAa,gCAAAA,QAAA,cAAC,SAAI,WAAU,yBAAwB;AAAA,MACvD;AAAA,IAEJ,CAAC;AAAA,EACH,CACF;AAEJ;;;AE7FA,IAAAE,kBAAkB;AAQX,IAAM,6BAA6B,CAAC;AAAA,EACzC;AACF,MAAuC;AACrC,QAAM,EAAE,EAAE,IAAI,sBAAsB,4BAA4B;AAChE,QAAM,EAAE,cAAc,oBAAoB,IAAI,uBAAuB;AACrE,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,gBAAgB,iBAAiB;AAEvC,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,gCACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS,MAAM;AACb,wBAAgB,aAAa,UAAU;AACvC,cAAM;AAAA,MACR;AAAA,MACA,MAAK;AAAA;AAAA,IAEJ,EAAE,QAAQ;AAAA,EACb,GACA,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,UAAU,CAAC;AAAA,MACX,SAAS,MAAM;AACb,wBACG,WAAW,EACX,KAAK,MAAM,oBAAoB,CAAC,EAChC,KAAK,MAAM;AACV,0BAAgB,aAAa,UAAU;AACvC,gBAAM;AAAA,QACR,CAAC,EACA,MAAM,QAAQ,KAAK;AAAA,MACxB;AAAA,MACA,MAAK;AAAA;AAAA,IAEJ,EAAE,QAAQ;AAAA,EACb,CACF;AAEJ;;;AN9BA,IAAMC,6BAA4B,CAAC,WAA8B;AAAA,EAC/D,eAAe,MAAM,KAAK;AAAA,EAC1B,8BAA8B,MAAM,KAAK;AAAA,EACzC,mBAAmB,MAAM,KAAK;AAChC;AAEO,IAAM,qBAAqB,CAAC,EAAE,MAAM,MAA+B;AACxE,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,aAAa,IAAI,mBAAmB;AAC5C,QAAM,EAAE,eAAe,8BAA8B,kBAAkB,IACrE,cAAc,aAAa,OAAOA,0BAAyB;AAE7D,QAAM,cAAU,6BAAY,MAAM;AAChC,iBAAa,UAAU;AACvB,UAAM;AAAA,EACR,GAAG,CAAC,cAAc,KAAK,CAAC;AAExB,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEZ,gCAAAA,QAAA,cAAC,eAAY,OAAO,SAAS,OAAO,EAAE,aAAa,GAAG;AAAA,IACtD,gCAAAA,QAAA,cAAC,SAAI,WAAU,4BACb,gCAAAA,QAAA,cAAC,UAAK,cAAa,SACjB,gCAAAA,QAAA,cAAC,eAAU,GACX,gCAAAA,QAAA,cAAC,oBAAe,GAChB,gCAAAA,QAAA,cAAC,0BAAqB,GACtB,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,sBAAsB;AAAA,QAC/B,IAAG;AAAA,QACH,WAAW,EAAE,gBAAgB;AAAA,QAC7B,UAAU,CAAC,MACT,aAAa,aAAa;AAAA,UACxB,mBAAmB,EAAE,OAAO,UACxB,qCAAiB,YACjB,qCAAiB;AAAA,QACvB,CAAC;AAAA;AAAA,IAEL,GACA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,IAAG;AAAA,QACH,WAAW,EAAE,yBAAyB;AAAA,QACtC,UAAU,CAAC,MACT,aAAa,aAAa;AAAA,UACxB,8BAA8B,EAAE,OAAO;AAAA,QACzC,CAAC;AAAA;AAAA,IAEL,GACA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,IAAG;AAAA,QACH,WAAW,EAAE,gBAAgB;AAAA,QAC7B,UAAU,CAAC,MACT,aAAa,aAAa,EAAE,eAAe,EAAE,OAAO,QAAQ,CAAC;AAAA;AAAA,IAEjE,CACF,CACF;AAAA,IACA,gCAAAA,QAAA,cAAC,8BAA2B,OAAc;AAAA,EAC5C;AAEJ;;;A9B9DO,IAAM,gBAAgB,CAAC,EAAE,YAAY,gBAAgB,MAA0B;AACpF,QAAM,EAAE,YAAAC,cAAa,YAAmB,QAAQ,cAAc,IAC5D,oBAAoB,eAAe;AACrC,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd,IAAI,kBAAkB,eAAe;AACrC,QAAM,EAAE,GAAG,aAAa,IAAI,sBAAsB,eAAe;AACjE,QAAM,EAAE,cAAc,IAAI,wBAAwB,eAAe;AACjE,QAAM,gBAAgB,iBAAiB,OAAO;AAE9C,QAAMC,cAAa,mBAAmB,qBAAqB;AAE3D,QAAMC,UAAS,iBAAiB;AAEhC,QAAM,EAAE,eAAe,IAAI;AAE3B,QAAM,OAAO,gBAAgB,WAAW,OAAO,MAAM,UAAU,eAAe,OAAO;AACrF,QAAM,uBACJ,gBAAgB,cAAc,gBAAgB,SAAS;AAEzD,QAAM,oBAAoB,uBACtB,EAAE,6BAA6B,IAC/B,gBAAgB,OAAO,GAAG,YAAY,OAAyC,KAC/E,gBAAgB;AAEpB,QAAM,0BACJ,gBAAgB,aAAa,UAAU,CAAC,uBACpC,eAAe,YAAY,CAAC,IAC5B;AAEN,QAAM,mBAAe;AAAA,IACnB,MAAMD,YAAW,mBAAmB,gBAAgB,eAAe;AAAA,IACnE,CAAC,mBAAmB,gBAAgB,iBAAiBA,WAAU;AAAA,EACjE;AAEA,MAAI,CAAC,eAAgB,QAAO;AAC5B,MAAI,CAAC,eAAe,QAAQ,CAAC,qBAAqB,CAAC,wBAAyB,QAAO;AAEnF,SACE,gCAAAE,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,oCAAoC,EAAE,MAAM,YAAY,EAAE,CAAC;AAAA,MAC3E,eAAY;AAAA,MACZ,gBAAgB,CAAC,MAAM;AACrB,UAAE,gBAAgB;AAClB,UAAE,eAAe;AACjB,sBAAc,eAAe,EAAE;AAAA,MACjC;AAAA;AAAA,IAEC,eAAe,QACd,gCAAAD,QAAA;AAAA,MAACD;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,eAAe,KAAK;AAAA,QAC3B,MAAM,eAAe,KAAK,QAAQ,eAAe,KAAK;AAAA,QACtD,MAAM,eAAe;AAAA;AAAA,IACvB;AAAA,IAEF,gCAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA;AAAA,MAEX,OACC,gCAAAA,QAAA,cAAC,QAAK,UAAQ,MAAC,MAAY,IAE3B,gCAAAA,QAAA,8BAAAA,QAAA,gBACG,2BACC,gCAAAA,QAAA,cAACH,aAAA,EAAW,aAAa,CAAC,uBAAuB,GAAG,UAAQ,MAAC,GAE/D,gCAAAG,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,eAAY;AAAA;AAAA,QAEX;AAAA,MACH,CACF;AAAA,IAEJ;AAAA,EACF,GACC,QAAQ,aAAa,SACpB,gCAAAA,QAAA,cAACH,aAAA,EAAW,eAA8B,aAAa,QAAQ,aAAa,IAC1E,IACN;AAEJ;;;AqCxGA,IAAAK,kBAAkB;AAYX,SAAS,iBAAiB,EAAE,SAAS,MAAM,GAA0B;AAC1E,QAAM,EAAE,EAAE,IAAI,sBAAsB,aAAa;AAEjD,MAAI,QAAQ,SAAS,WAAW,CAAC,iBAAiB,OAAO,GAAG;AAC1D,WACE,gCAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,aAAa,KAAK;AAAA;AAAA,MAE5B,EAAE,mBAAgB;AAAA,IACrB;AAAA,EAEJ;AAEA,MAAI,QAAQ,WAAW,UAAU;AAC/B,WACE,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,aAAa,KAAK;AAAA;AAAA,MAE5B,QAAQ,OAAO,WAAW,MACvB,EAAE,wCAAqC,IACvC,EAAE,kCAA+B;AAAA,IACvC;AAAA,EAEJ;AAEA,SAAO;AACT;;;AtCVA,IAAM,iCAAiC,CAAC,UAA4B;AAClE,QAAM;AAAA,IACJ;AAAA,IACA,qBAAqB;AAAA,IACrB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV,IAAI;AAEJ,QAAM,EAAE,eAAAC,iBAAgB,cAAqB,IAAI,oBAAoB,aAAa;AAElF,QAAM;AAAA,IACJ,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,EACF,IAAI,kBAAkB,aAAa;AAEnC,QAAMC,cAAa,mBAAmB,qBAAqB;AAE3D,QAAM,EAAE,aAAa,IAAI,sBAAsB,aAAa;AAC5D,QAAM,UAAU,eAAe;AAC/B,QAAM,gBAAgB,sBAAsB,OAAO;AAEnD,QAAM,sBACJ,QAAQ,OAAO,GAAG,YAAY,OAAyC,KACvE,QAAQ;AAEV,QAAM,kBAAc;AAAA,IAClB,MAAMA,YAAW,qBAAqB,QAAQ,eAAe;AAAA;AAAA,IAE7D,CAAC,QAAQ,iBAAiB,mBAAmB;AAAA,EAC/C;AAEA,QAAM,eAAe,sBAAsB;AAC3C,QAAM,aACJ,oBACA,kDAAkD,KAAK;AAEzD,MAAI,CAAC,uBAAuB,CAAC,QAAQ,eAAgB,QAAO;AAE5D,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAW,cAAc,UAAU,KACtC,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,YAAY;AAAA,QAC1B,CAAC,qBAAqB,KAAK,6BAA6B,GAAG;AAAA,QAC3D,CAAC,sBAAsB,KAAK,uBAAuB,GACjD,aAAa,QAAQ,IAAI,KAAK,CAAC,QAAQ;AAAA,MAC3C,CAAC;AAAA,MACD,eAAY;AAAA,MACZ,SAAS;AAAA,MACT,aAAa;AAAA;AAAA,IAEZ,QAAQ,kBAAkB,gCAAAD,QAAA,cAACF,gBAAA,IAAc;AAAA,IAC1C,gCAAAE,QAAA,cAAC,oBAAiB,SAAkB,OAAc;AAAA,IACjD,cAAc,QAAQ,OACrB,gCAAAA,QAAA,cAAC,SAAI,yBAAyB,EAAE,QAAQ,QAAQ,KAAK,GAAG,IAExD,gCAAAA,QAAA,cAAC,aAAK,WAAY;AAAA,EAEtB,CACF;AAEJ;AAEO,IAAM,cAAc,gBAAAA,QAAM;AAAA,EAC/B;AACF;;;AuChGA,IAAAE,kBAAiC;AAgB1B,IAAM,sBAAsB,CAAC,UAAoC;AACtE,QAAM;AAAA,IACJ,SAAS;AAAA,IACT;AAAA,IACA,YAAAC;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,EAAE,SAAS,mBAAmB,IAAI,kBAAkB,qBAAqB;AAC/E,QAAM,EAAE,QAAQ,IAAI,uBAAuB;AAC3C,QAAM,UAAU,oBAAoB;AACpC,QAAM,EAAE,MAAAC,QAAO,GAAG,IAAI;AACtB,QAAM,EAAE,eAAe,oBAAoB,IAAI,wBAAwB;AAAA,IACrE;AAAA,IACA;AAAA,IACA,MAAAA;AAAA,EACF,CAAC;AAED,iCAAU,MAAM;AACd,aAAS,GAAG,qBAAqB,MAAM;AACrC,oBAAc;AAAA,IAChB,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,aAAa,CAAC;AAE3B,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,EAAE,GAAG,SAAS,MAAM,oBAAoB;AAAA,MACjD,YAAYF;AAAA;AAAA,EACd;AAEJ;;;AC7CA,IAAAG,kBAA2C;;;ACC3C,IAAAC,kBAAkB;AAClB,IAAAC,gBAAiB;AASjB,IAAM,+BAA+B,CACnC,UACG;AACH,QAAM,EAAE,QAAQ,UAAU,WAAW,KAAK,IAAI;AAE9C,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,eAAW,cAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,CAAC,gBAAgB,IAAI,EAAE,GAAG,KAAK;AAAA,QACjC;AAAA,MACF;AAAA,MACA,eAAY;AAAA;AAAA,IAEX;AAAA,EACH;AAEJ;AAEO,IAAM,qBAAqB,gBAAAD,QAAM;AAAA,EACtC;AACF;;;AD9BA,IAAM,6BAA6B,MAAM;AACvC,QAAM,EAAE,OAAO,IAAI,eAAe,kBAAkB;AACpD,QAAM,EAAE,EAAE,IAAI,sBAAsB,kBAAkB;AAEtD,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAAS,IAAI;AAEzC,iCAAU,MAAM;AACd,UAAM,oBAAoB,CAAC,EAAE,QAAQ,eAAe,MAAM,MAAa;AACrE,UAAI,WAAW,cAAc;AAC3B,kBAAU,YAAY;AAAA,MACxB;AAAA,IACF;AAEA,WAAO,GAAG,sBAAsB,iBAAiB;AACjD,WAAO,MAAM,OAAO,IAAI,sBAAsB,iBAAiB;AAAA,EACjE,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,SACE,gCAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ,CAAC;AAAA,MACT,WAAU;AAAA,MACV,MAAK;AAAA;AAAA,IAEJ,EAAE,yCAAyC;AAAA,EAC9C;AAEJ;AAEO,IAAM,mBAAmB,gBAAAA,QAAM,KAAK,0BAA0B;;;AEnCrE,IAAAC,kBAAkB;AASX,IAAM,sBAAsB,CAAC,UAAoC;AACtE,QAAM,EAAE,QAAQ,IAAI;AAEpB,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,2BACb,gCAAAA,QAAA,cAAC,WAAQ,SAAkB,CAC7B;AAEJ;;;ACjBA,IAAAC,gBAAiB;AACjB,IAAAC,kBAAkB;;;ACDlB,IAAAC,kBAAwB;;;ACAxB,IAAAC,iBAAuB;;;ACAhB,IAAM,sBAAsB;AAAA,EACjC,MAAM;AAAA,EACN,OAAO;AACT;;;ACHA;AAAA,EACE,sDAAsD;AAAA,EACtD,iDAAiD;AAAA,EACjD,wCAAwC;AAAA,EACxC,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,4CAA4C;AAAA,EAC5C,sCAAsC;AAAA,EACtC,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,2BAAoB;AAAA,EACpB,kDAA2C;AAAA,EAC3C,mDAA4C;AAAA,EAC5C,4BAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,0CAA0C;AAAA,EAC1C,yDAAyD;AAAA,EACzD,WAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,kBAAkB;AAAA,EAClB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,4CAA4C;AAAA,EAC5C,aAAa;AAAA,EACb,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,QAAU;AAAA,EACV,gCAAgC;AAAA,EAChC,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,2CAA2C;AAAA,EAC3C,QAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAa;AAAA,EACb,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,4CAA4C;AAAA,EAC5C,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,KAAO;AAAA,EACP,YAAY;AAAA,EACZ,kCAAkC;AAAA,EAClC,OAAS;AAAA,EACT,qBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4DAA4D;AAAA,EAC5D,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,yGAAyG;AAAA,EACzG,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,MAAQ;AAAA,EACR,qEAAqE;AAAA,EACrE,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,MAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa;AAAA,EACb,UAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,0CAA0C;AAAA,EAC1C,MAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,0CAAuC;AAAA,EACvC,oCAAiC;AAAA,EACjC,yCAAyC;AAAA,EACzC,kBAAkB;AAAA,EAClB,8CAA8C;AAAA,EAC9C,qCAAqC;AAAA,EACrC,gDAAgD;AAAA,EAChD,oBAAoB;AAAA,EACpB,MAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,KAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,2BAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qDAAqD;AAAA,EACrD,kBAAkB;AAAA,EAClB,IAAM;AAAA,EACN,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,KAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,OAAS;AAAA,EACT,0DAA0D;AAAA,EAC1D,8DAA8D;AAAA,EAC9D,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAkB;AAAA,EAClB,kBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAU;AAAA,EACV,8DAA8D;AAAA,EAC9D,8DAA8D;AAAA,EAC9D,2DAA2D;AAAA,EAC3D,2CAA2C;AAAA,EAC3C,gBAAgB;AAAA,EAChB,wBAA0B;AAAA,EAC1B,0BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,qCAAqC;AAAA,EACrC,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,gCAAgC;AAAA,EAChC,MAAQ;AAAA,EACR,eAAe;AAAA,EACf,+BAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,SAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,0CAA0C;AAAA,EAC1C,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,QAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uCAAuC;AAAA,EACvC,qDAAqD;AAAA,EACrD,oDAAoD;AAAA,EACpD,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,2BAA2B;AAAA,EAC3B,+DAA+D;AAAA,EAC/D,mEAAmE;AAAA,EACnE,wCAAwC;AAAA,EACxC,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,WAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,OAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,iCAAmC;AAAA,EACnC,mCAAqC;AAAA,EACrC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4CAA8C;AAAA,EAC9C,yBAAyB;AAAA,EACzB,+BAA+B;AAAA,EAC/B,iCAAiC;AAAA,EACjC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,4CAA4C;AAAA,EAC5C,KAAO;AAAA,EACP,kCAAkC;AAAA,EAClC,8CAA8C;AAChD;;;ACrQA;AAAA,EACE,sDAAsD;AAAA,EACtD,iDAAiD;AAAA,EACjD,wCAAwC;AAAA,EACxC,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,4CAA4C;AAAA,EAC5C,sCAAsC;AAAA,EACtC,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,2BAAoB;AAAA,EACpB,kDAA2C;AAAA,EAC3C,mDAA4C;AAAA,EAC5C,4BAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,0CAA0C;AAAA,EAC1C,yDAAyD;AAAA,EACzD,WAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,kBAAkB;AAAA,EAClB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,4CAA4C;AAAA,EAC5C,aAAa;AAAA,EACb,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,QAAU;AAAA,EACV,gCAAgC;AAAA,EAChC,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,2CAA2C;AAAA,EAC3C,QAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAa;AAAA,EACb,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,4CAA4C;AAAA,EAC5C,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,KAAO;AAAA,EACP,YAAY;AAAA,EACZ,kCAAkC;AAAA,EAClC,OAAS;AAAA,EACT,qBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4DAA4D;AAAA,EAC5D,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,yGAAyG;AAAA,EACzG,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,MAAQ;AAAA,EACR,qEAAqE;AAAA,EACrE,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,MAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa;AAAA,EACb,UAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,0CAA0C;AAAA,EAC1C,MAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,0CAAuC;AAAA,EACvC,oCAAiC;AAAA,EACjC,yCAAyC;AAAA,EACzC,kBAAkB;AAAA,EAClB,8CAA8C;AAAA,EAC9C,qCAAqC;AAAA,EACrC,gDAAgD;AAAA,EAChD,oBAAoB;AAAA,EACpB,MAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,KAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,2BAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qDAAqD;AAAA,EACrD,kBAAkB;AAAA,EAClB,IAAM;AAAA,EACN,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,KAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,OAAS;AAAA,EACT,0DAA0D;AAAA,EAC1D,8DAA8D;AAAA,EAC9D,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAkB;AAAA,EAClB,kBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAU;AAAA,EACV,8DAA8D;AAAA,EAC9D,8DAA8D;AAAA,EAC9D,2DAA2D;AAAA,EAC3D,2CAA2C;AAAA,EAC3C,gBAAgB;AAAA,EAChB,wBAA0B;AAAA,EAC1B,0BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,qCAAqC;AAAA,EACrC,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,gCAAgC;AAAA,EAChC,MAAQ;AAAA,EACR,eAAe;AAAA,EACf,+BAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,SAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,0CAA0C;AAAA,EAC1C,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,QAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uCAAuC;AAAA,EACvC,qDAAqD;AAAA,EACrD,oDAAoD;AAAA,EACpD,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,2BAA2B;AAAA,EAC3B,+DAA+D;AAAA,EAC/D,mEAAmE;AAAA,EACnE,wCAAwC;AAAA,EACxC,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,WAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,OAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,iCAAmC;AAAA,EACnC,mCAAqC;AAAA,EACrC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4CAA8C;AAAA,EAC9C,yBAAyB;AAAA,EACzB,+BAA+B;AAAA,EAC/B,iCAAiC;AAAA,EACjC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,4CAA4C;AAAA,EAC5C,KAAO;AAAA,EACP,kCAAkC;AAAA,EAClC,8CAA8C;AAChD;;;ACrQA;AAAA,EACE,sDAAsD;AAAA,EACtD,iDAAiD;AAAA,EACjD,wCAAwC;AAAA,EACxC,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,4CAA4C;AAAA,EAC5C,sCAAsC;AAAA,EACtC,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,2BAAoB;AAAA,EACpB,kDAA2C;AAAA,EAC3C,mDAA4C;AAAA,EAC5C,4BAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,0CAA0C;AAAA,EAC1C,yDAAyD;AAAA,EACzD,WAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,kBAAkB;AAAA,EAClB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,4CAA4C;AAAA,EAC5C,aAAa;AAAA,EACb,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,QAAU;AAAA,EACV,gCAAgC;AAAA,EAChC,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,2CAA2C;AAAA,EAC3C,QAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAa;AAAA,EACb,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,4CAA4C;AAAA,EAC5C,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,KAAO;AAAA,EACP,YAAY;AAAA,EACZ,kCAAkC;AAAA,EAClC,OAAS;AAAA,EACT,qBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4DAA4D;AAAA,EAC5D,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,yGAAyG;AAAA,EACzG,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,MAAQ;AAAA,EACR,qEAAqE;AAAA,EACrE,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,MAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa;AAAA,EACb,UAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,0CAA0C;AAAA,EAC1C,MAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,0CAAuC;AAAA,EACvC,oCAAiC;AAAA,EACjC,yCAAyC;AAAA,EACzC,kBAAkB;AAAA,EAClB,8CAA8C;AAAA,EAC9C,qCAAqC;AAAA,EACrC,gDAAgD;AAAA,EAChD,oBAAoB;AAAA,EACpB,MAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,KAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,2BAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qDAAqD;AAAA,EACrD,kBAAkB;AAAA,EAClB,IAAM;AAAA,EACN,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,KAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,OAAS;AAAA,EACT,0DAA0D;AAAA,EAC1D,8DAA8D;AAAA,EAC9D,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAkB;AAAA,EAClB,iBAAmB;AAAA,EACnB,kBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAU;AAAA,EACV,8DAA8D;AAAA,EAC9D,8DAA8D;AAAA,EAC9D,2DAA2D;AAAA,EAC3D,2CAA2C;AAAA,EAC3C,gBAAgB;AAAA,EAChB,wBAA0B;AAAA,EAC1B,yBAA2B;AAAA,EAC3B,0BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,oCAAoC;AAAA,EACpC,qCAAqC;AAAA,EACrC,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,gCAAgC;AAAA,EAChC,MAAQ;AAAA,EACR,eAAe;AAAA,EACf,+BAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,SAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,0CAA0C;AAAA,EAC1C,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,QAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uCAAuC;AAAA,EACvC,qDAAqD;AAAA,EACrD,oDAAoD;AAAA,EACpD,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,2BAA2B;AAAA,EAC3B,+DAA+D;AAAA,EAC/D,mEAAmE;AAAA,EACnE,wCAAwC;AAAA,EACxC,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,WAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,OAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,iCAAmC;AAAA,EACnC,kCAAoC;AAAA,EACpC,mCAAqC;AAAA,EACrC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4CAA8C;AAAA,EAC9C,yBAAyB;AAAA,EACzB,+BAA+B;AAAA,EAC/B,gCAAgC;AAAA,EAChC,iCAAiC;AAAA,EACjC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,4CAA4C;AAAA,EAC5C,KAAO;AAAA,EACP,kCAAkC;AAAA,EAClC,8CAA8C;AAChD;;;AC7QA;AAAA,EACE,sDAAsD;AAAA,EACtD,iDAAiD;AAAA,EACjD,wCAAwC;AAAA,EACxC,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,4CAA4C;AAAA,EAC5C,sCAAsC;AAAA,EACtC,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,2BAAoB;AAAA,EACpB,kDAA2C;AAAA,EAC3C,mDAA4C;AAAA,EAC5C,4BAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,0CAA0C;AAAA,EAC1C,yDAAyD;AAAA,EACzD,WAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,kBAAkB;AAAA,EAClB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,4CAA4C;AAAA,EAC5C,aAAa;AAAA,EACb,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,QAAU;AAAA,EACV,gCAAgC;AAAA,EAChC,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,2CAA2C;AAAA,EAC3C,QAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAa;AAAA,EACb,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,4CAA4C;AAAA,EAC5C,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,KAAO;AAAA,EACP,YAAY;AAAA,EACZ,kCAAkC;AAAA,EAClC,OAAS;AAAA,EACT,qBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4DAA4D;AAAA,EAC5D,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,yGAAyG;AAAA,EACzG,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,MAAQ;AAAA,EACR,qEAAqE;AAAA,EACrE,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,MAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa;AAAA,EACb,UAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,0CAA0C;AAAA,EAC1C,MAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,0CAAuC;AAAA,EACvC,oCAAiC;AAAA,EACjC,yCAAyC;AAAA,EACzC,kBAAkB;AAAA,EAClB,8CAA8C;AAAA,EAC9C,qCAAqC;AAAA,EACrC,gDAAgD;AAAA,EAChD,oBAAoB;AAAA,EACpB,MAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,KAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,2BAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qDAAqD;AAAA,EACrD,kBAAkB;AAAA,EAClB,IAAM;AAAA,EACN,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,KAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,OAAS;AAAA,EACT,0DAA0D;AAAA,EAC1D,8DAA8D;AAAA,EAC9D,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAkB;AAAA,EAClB,iBAAmB;AAAA,EACnB,kBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAU;AAAA,EACV,8DAA8D;AAAA,EAC9D,8DAA8D;AAAA,EAC9D,2DAA2D;AAAA,EAC3D,2CAA2C;AAAA,EAC3C,gBAAgB;AAAA,EAChB,wBAA0B;AAAA,EAC1B,yBAA2B;AAAA,EAC3B,0BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,oCAAoC;AAAA,EACpC,qCAAqC;AAAA,EACrC,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,gCAAgC;AAAA,EAChC,MAAQ;AAAA,EACR,eAAe;AAAA,EACf,+BAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,SAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,0CAA0C;AAAA,EAC1C,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,QAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uCAAuC;AAAA,EACvC,qDAAqD;AAAA,EACrD,oDAAoD;AAAA,EACpD,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,2BAA2B;AAAA,EAC3B,+DAA+D;AAAA,EAC/D,mEAAmE;AAAA,EACnE,wCAAwC;AAAA,EACxC,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,WAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,OAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,iCAAmC;AAAA,EACnC,kCAAoC;AAAA,EACpC,mCAAqC;AAAA,EACrC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4CAA8C;AAAA,EAC9C,yBAAyB;AAAA,EACzB,+BAA+B;AAAA,EAC/B,gCAAgC;AAAA,EAChC,iCAAiC;AAAA,EACjC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,4CAA4C;AAAA,EAC5C,KAAO;AAAA,EACP,kCAAkC;AAAA,EAClC,8CAA8C;AAChD;;;AC7QA;AAAA,EACE,sDAAsD;AAAA,EACtD,iDAAiD;AAAA,EACjD,wCAAwC;AAAA,EACxC,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,4CAA4C;AAAA,EAC5C,sCAAsC;AAAA,EACtC,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,2BAAoB;AAAA,EACpB,kDAA2C;AAAA,EAC3C,mDAA4C;AAAA,EAC5C,4BAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,0CAA0C;AAAA,EAC1C,yDAAyD;AAAA,EACzD,WAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,kBAAkB;AAAA,EAClB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,4CAA4C;AAAA,EAC5C,aAAa;AAAA,EACb,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,QAAU;AAAA,EACV,gCAAgC;AAAA,EAChC,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,2CAA2C;AAAA,EAC3C,QAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAa;AAAA,EACb,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,4CAA4C;AAAA,EAC5C,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,KAAO;AAAA,EACP,YAAY;AAAA,EACZ,kCAAkC;AAAA,EAClC,OAAS;AAAA,EACT,qBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4DAA4D;AAAA,EAC5D,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,gCAAgC;AAAA,EAChC,yGAAyG;AAAA,EACzG,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,MAAQ;AAAA,EACR,qEAAqE;AAAA,EACrE,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,MAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa;AAAA,EACb,UAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,0CAA0C;AAAA,EAC1C,MAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,0CAAuC;AAAA,EACvC,oCAAiC;AAAA,EACjC,yCAAyC;AAAA,EACzC,kBAAkB;AAAA,EAClB,8CAA8C;AAAA,EAC9C,qCAAqC;AAAA,EACrC,gDAAgD;AAAA,EAChD,oBAAoB;AAAA,EACpB,MAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,KAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,2BAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qDAAqD;AAAA,EACrD,kBAAkB;AAAA,EAClB,IAAM;AAAA,EACN,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,KAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,OAAS;AAAA,EACT,0DAA0D;AAAA,EAC1D,8DAA8D;AAAA,EAC9D,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAkB;AAAA,EAClB,kBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAU;AAAA,EACV,8DAA8D;AAAA,EAC9D,8DAA8D;AAAA,EAC9D,2DAA2D;AAAA,EAC3D,2CAA2C;AAAA,EAC3C,gBAAgB;AAAA,EAChB,wBAA0B;AAAA,EAC1B,0BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,qCAAqC;AAAA,EACrC,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,gCAAgC;AAAA,EAChC,MAAQ;AAAA,EACR,eAAe;AAAA,EACf,+BAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,SAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,0CAA0C;AAAA,EAC1C,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,QAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uCAAuC;AAAA,EACvC,qDAAqD;AAAA,EACrD,oDAAoD;AAAA,EACpD,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,2BAA2B;AAAA,EAC3B,+DAA+D;AAAA,EAC/D,mEAAmE;AAAA,EACnE,wCAAwC;AAAA,EACxC,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,WAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,OAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,iCAAmC;AAAA,EACnC,mCAAqC;AAAA,EACrC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4CAA8C;AAAA,EAC9C,yBAAyB;AAAA,EACzB,+BAA+B;AAAA,EAC/B,iCAAiC;AAAA,EACjC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,4CAA4C;AAAA,EAC5C,KAAO;AAAA,EACP,kCAAkC;AAAA,EAClC,8CAA8C;AAChD;;;ACtQA;AAAA,EACE,sDAAsD;AAAA,EACtD,iDAAiD;AAAA,EACjD,wCAAwC;AAAA,EACxC,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,4CAA4C;AAAA,EAC5C,sCAAsC;AAAA,EACtC,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,2BAAoB;AAAA,EACpB,kDAA2C;AAAA,EAC3C,mDAA4C;AAAA,EAC5C,4BAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,0CAA0C;AAAA,EAC1C,yDAAyD;AAAA,EACzD,WAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,kBAAkB;AAAA,EAClB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,4CAA4C;AAAA,EAC5C,aAAa;AAAA,EACb,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,QAAU;AAAA,EACV,gCAAgC;AAAA,EAChC,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,2CAA2C;AAAA,EAC3C,QAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAa;AAAA,EACb,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,4CAA4C;AAAA,EAC5C,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,KAAO;AAAA,EACP,YAAY;AAAA,EACZ,kCAAkC;AAAA,EAClC,OAAS;AAAA,EACT,qBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4DAA4D;AAAA,EAC5D,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,yGAAyG;AAAA,EACzG,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,MAAQ;AAAA,EACR,qEAAqE;AAAA,EACrE,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,MAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa;AAAA,EACb,UAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,0CAA0C;AAAA,EAC1C,MAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,0CAAuC;AAAA,EACvC,oCAAiC;AAAA,EACjC,yCAAyC;AAAA,EACzC,kBAAkB;AAAA,EAClB,8CAA8C;AAAA,EAC9C,qCAAqC;AAAA,EACrC,gDAAgD;AAAA,EAChD,oBAAoB;AAAA,EACpB,MAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,KAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,2BAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qDAAqD;AAAA,EACrD,kBAAkB;AAAA,EAClB,IAAM;AAAA,EACN,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,KAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,OAAS;AAAA,EACT,0DAA0D;AAAA,EAC1D,8DAA8D;AAAA,EAC9D,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAkB;AAAA,EAClB,iBAAmB;AAAA,EACnB,kBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAU;AAAA,EACV,8DAA8D;AAAA,EAC9D,8DAA8D;AAAA,EAC9D,2DAA2D;AAAA,EAC3D,2CAA2C;AAAA,EAC3C,gBAAgB;AAAA,EAChB,wBAA0B;AAAA,EAC1B,yBAA2B;AAAA,EAC3B,0BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,oCAAoC;AAAA,EACpC,qCAAqC;AAAA,EACrC,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,gCAAgC;AAAA,EAChC,MAAQ;AAAA,EACR,eAAe;AAAA,EACf,+BAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,SAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,0CAA0C;AAAA,EAC1C,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,QAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uCAAuC;AAAA,EACvC,qDAAqD;AAAA,EACrD,oDAAoD;AAAA,EACpD,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,2BAA2B;AAAA,EAC3B,+DAA+D;AAAA,EAC/D,mEAAmE;AAAA,EACnE,wCAAwC;AAAA,EACxC,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,WAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,OAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,iCAAmC;AAAA,EACnC,kCAAoC;AAAA,EACpC,mCAAqC;AAAA,EACrC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4CAA8C;AAAA,EAC9C,yBAAyB;AAAA,EACzB,+BAA+B;AAAA,EAC/B,gCAAgC;AAAA,EAChC,iCAAiC;AAAA,EACjC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,4CAA4C;AAAA,EAC5C,KAAO;AAAA,EACP,kCAAkC;AAAA,EAClC,8CAA8C;AAChD;;;AC7QA;AAAA,EACE,sDAAsD;AAAA,EACtD,iDAAiD;AAAA,EACjD,wCAAwC;AAAA,EACxC,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,4CAA4C;AAAA,EAC5C,sCAAsC;AAAA,EACtC,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,2BAAoB;AAAA,EACpB,kDAA2C;AAAA,EAC3C,mDAA4C;AAAA,EAC5C,4BAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,0CAA0C;AAAA,EAC1C,yDAAyD;AAAA,EACzD,WAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,kBAAkB;AAAA,EAClB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,4CAA4C;AAAA,EAC5C,aAAa;AAAA,EACb,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,QAAU;AAAA,EACV,gCAAgC;AAAA,EAChC,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,2CAA2C;AAAA,EAC3C,QAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAa;AAAA,EACb,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,4CAA4C;AAAA,EAC5C,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,KAAO;AAAA,EACP,YAAY;AAAA,EACZ,kCAAkC;AAAA,EAClC,OAAS;AAAA,EACT,qBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4DAA4D;AAAA,EAC5D,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,yGAAyG;AAAA,EACzG,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,MAAQ;AAAA,EACR,qEAAqE;AAAA,EACrE,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,MAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa;AAAA,EACb,UAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,0CAA0C;AAAA,EAC1C,MAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,0CAAuC;AAAA,EACvC,oCAAiC;AAAA,EACjC,yCAAyC;AAAA,EACzC,kBAAkB;AAAA,EAClB,8CAA8C;AAAA,EAC9C,qCAAqC;AAAA,EACrC,gDAAgD;AAAA,EAChD,oBAAoB;AAAA,EACpB,MAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,KAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,2BAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qDAAqD;AAAA,EACrD,kBAAkB;AAAA,EAClB,IAAM;AAAA,EACN,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,KAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,OAAS;AAAA,EACT,0DAA0D;AAAA,EAC1D,8DAA8D;AAAA,EAC9D,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAkB;AAAA,EAClB,kBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAU;AAAA,EACV,8DAA8D;AAAA,EAC9D,8DAA8D;AAAA,EAC9D,2DAA2D;AAAA,EAC3D,2CAA2C;AAAA,EAC3C,gBAAgB;AAAA,EAChB,wBAA0B;AAAA,EAC1B,0BAA4B;AAAA,EAC5B,qCAAqC;AAAA,EACrC,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,gCAAgC;AAAA,EAChC,MAAQ;AAAA,EACR,eAAe;AAAA,EACf,+BAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,SAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,0CAA0C;AAAA,EAC1C,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,QAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uCAAuC;AAAA,EACvC,qDAAqD;AAAA,EACrD,oDAAoD;AAAA,EACpD,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,2BAA2B;AAAA,EAC3B,+DAA+D;AAAA,EAC/D,mEAAmE;AAAA,EACnE,wCAAwC;AAAA,EACxC,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,WAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,OAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,mCAAqC;AAAA,EACrC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4CAA8C;AAAA,EAC9C,yBAAyB;AAAA,EACzB,iCAAiC;AAAA,EACjC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,4CAA4C;AAAA,EAC5C,KAAO;AAAA,EACP,kCAAkC;AAAA,EAClC,8CAA8C;AAChD;;;AC/PA;AAAA,EACE,sDAAsD;AAAA,EACtD,iDAAiD;AAAA,EACjD,wCAAwC;AAAA,EACxC,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,4CAA4C;AAAA,EAC5C,sCAAsC;AAAA,EACtC,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,2BAAoB;AAAA,EACpB,kDAA2C;AAAA,EAC3C,mDAA4C;AAAA,EAC5C,4BAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,0CAA0C;AAAA,EAC1C,yDAAyD;AAAA,EACzD,WAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,kBAAkB;AAAA,EAClB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,4CAA4C;AAAA,EAC5C,aAAa;AAAA,EACb,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,QAAU;AAAA,EACV,gCAAgC;AAAA,EAChC,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,2CAA2C;AAAA,EAC3C,QAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAa;AAAA,EACb,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,4CAA4C;AAAA,EAC5C,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,KAAO;AAAA,EACP,YAAY;AAAA,EACZ,kCAAkC;AAAA,EAClC,OAAS;AAAA,EACT,qBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4DAA4D;AAAA,EAC5D,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,yGAAyG;AAAA,EACzG,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,MAAQ;AAAA,EACR,qEAAqE;AAAA,EACrE,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,MAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa;AAAA,EACb,UAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,0CAA0C;AAAA,EAC1C,MAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,0CAAuC;AAAA,EACvC,oCAAiC;AAAA,EACjC,yCAAyC;AAAA,EACzC,kBAAkB;AAAA,EAClB,8CAA8C;AAAA,EAC9C,qCAAqC;AAAA,EACrC,gDAAgD;AAAA,EAChD,oBAAoB;AAAA,EACpB,MAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,KAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,2BAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qDAAqD;AAAA,EACrD,kBAAkB;AAAA,EAClB,IAAM;AAAA,EACN,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,KAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,OAAS;AAAA,EACT,0DAA0D;AAAA,EAC1D,8DAA8D;AAAA,EAC9D,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAkB;AAAA,EAClB,kBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAU;AAAA,EACV,8DAA8D;AAAA,EAC9D,8DAA8D;AAAA,EAC9D,2DAA2D;AAAA,EAC3D,2CAA2C;AAAA,EAC3C,gBAAgB;AAAA,EAChB,wBAA0B;AAAA,EAC1B,0BAA4B;AAAA,EAC5B,qCAAqC;AAAA,EACrC,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,gCAAgC;AAAA,EAChC,MAAQ;AAAA,EACR,eAAe;AAAA,EACf,+BAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,SAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,0CAA0C;AAAA,EAC1C,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,QAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uCAAuC;AAAA,EACvC,qDAAqD;AAAA,EACrD,oDAAoD;AAAA,EACpD,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,2BAA2B;AAAA,EAC3B,+DAA+D;AAAA,EAC/D,mEAAmE;AAAA,EACnE,wCAAwC;AAAA,EACxC,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,WAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,OAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,mCAAqC;AAAA,EACrC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4CAA8C;AAAA,EAC9C,yBAAyB;AAAA,EACzB,iCAAiC;AAAA,EACjC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,4CAA4C;AAAA,EAC5C,KAAO;AAAA,EACP,kCAAkC;AAAA,EAClC,8CAA8C;AAChD;;;AC/PA;AAAA,EACE,sDAAsD;AAAA,EACtD,iDAAiD;AAAA,EACjD,wCAAwC;AAAA,EACxC,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,4CAA4C;AAAA,EAC5C,sCAAsC;AAAA,EACtC,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,2BAAoB;AAAA,EACpB,kDAA2C;AAAA,EAC3C,mDAA4C;AAAA,EAC5C,4BAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,0CAA0C;AAAA,EAC1C,yDAAyD;AAAA,EACzD,WAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,kBAAkB;AAAA,EAClB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,4CAA4C;AAAA,EAC5C,aAAa;AAAA,EACb,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,QAAU;AAAA,EACV,gCAAgC;AAAA,EAChC,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,2CAA2C;AAAA,EAC3C,QAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAa;AAAA,EACb,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,4CAA4C;AAAA,EAC5C,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,KAAO;AAAA,EACP,YAAY;AAAA,EACZ,kCAAkC;AAAA,EAClC,OAAS;AAAA,EACT,qBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4DAA4D;AAAA,EAC5D,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,yGAAyG;AAAA,EACzG,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,MAAQ;AAAA,EACR,qEAAqE;AAAA,EACrE,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,MAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa;AAAA,EACb,UAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,0CAA0C;AAAA,EAC1C,MAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,0CAAuC;AAAA,EACvC,oCAAiC;AAAA,EACjC,yCAAyC;AAAA,EACzC,kBAAkB;AAAA,EAClB,8CAA8C;AAAA,EAC9C,qCAAqC;AAAA,EACrC,gDAAgD;AAAA,EAChD,oBAAoB;AAAA,EACpB,MAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,KAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,2BAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qDAAqD;AAAA,EACrD,kBAAkB;AAAA,EAClB,IAAM;AAAA,EACN,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,KAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,OAAS;AAAA,EACT,0DAA0D;AAAA,EAC1D,8DAA8D;AAAA,EAC9D,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAkB;AAAA,EAClB,kBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAU;AAAA,EACV,8DAA8D;AAAA,EAC9D,8DAA8D;AAAA,EAC9D,2DAA2D;AAAA,EAC3D,2CAA2C;AAAA,EAC3C,gBAAgB;AAAA,EAChB,wBAA0B;AAAA,EAC1B,0BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,qCAAqC;AAAA,EACrC,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,gCAAgC;AAAA,EAChC,MAAQ;AAAA,EACR,eAAe;AAAA,EACf,+BAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,SAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,0CAA0C;AAAA,EAC1C,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,QAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uCAAuC;AAAA,EACvC,qDAAqD;AAAA,EACrD,oDAAoD;AAAA,EACpD,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,2BAA2B;AAAA,EAC3B,+DAA+D;AAAA,EAC/D,mEAAmE;AAAA,EACnE,wCAAwC;AAAA,EACxC,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,WAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,OAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,iCAAmC;AAAA,EACnC,mCAAqC;AAAA,EACrC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4CAA8C;AAAA,EAC9C,yBAAyB;AAAA,EACzB,+BAA+B;AAAA,EAC/B,iCAAiC;AAAA,EACjC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,4CAA4C;AAAA,EAC5C,KAAO;AAAA,EACP,kCAAkC;AAAA,EAClC,8CAA8C;AAChD;;;ACrQA;AAAA,EACE,sDAAsD;AAAA,EACtD,iDAAiD;AAAA,EACjD,wCAAwC;AAAA,EACxC,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,4CAA4C;AAAA,EAC5C,sCAAsC;AAAA,EACtC,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,2BAAoB;AAAA,EACpB,kDAA2C;AAAA,EAC3C,mDAA4C;AAAA,EAC5C,4BAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,0CAA0C;AAAA,EAC1C,yDAAyD;AAAA,EACzD,WAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,kBAAkB;AAAA,EAClB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,4CAA4C;AAAA,EAC5C,aAAa;AAAA,EACb,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,QAAU;AAAA,EACV,gCAAgC;AAAA,EAChC,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,2CAA2C;AAAA,EAC3C,QAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAa;AAAA,EACb,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,4CAA4C;AAAA,EAC5C,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,KAAO;AAAA,EACP,YAAY;AAAA,EACZ,kCAAkC;AAAA,EAClC,OAAS;AAAA,EACT,qBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4DAA4D;AAAA,EAC5D,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,yGAAyG;AAAA,EACzG,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,MAAQ;AAAA,EACR,qEAAqE;AAAA,EACrE,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,MAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa;AAAA,EACb,UAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,0CAA0C;AAAA,EAC1C,MAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,0CAAuC;AAAA,EACvC,oCAAiC;AAAA,EACjC,yCAAyC;AAAA,EACzC,kBAAkB;AAAA,EAClB,8CAA8C;AAAA,EAC9C,qCAAqC;AAAA,EACrC,gDAAgD;AAAA,EAChD,oBAAoB;AAAA,EACpB,MAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,KAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,2BAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qDAAqD;AAAA,EACrD,kBAAkB;AAAA,EAClB,IAAM;AAAA,EACN,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,KAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,OAAS;AAAA,EACT,0DAA0D;AAAA,EAC1D,8DAA8D;AAAA,EAC9D,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAkB;AAAA,EAClB,iBAAmB;AAAA,EACnB,kBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAU;AAAA,EACV,8DAA8D;AAAA,EAC9D,8DAA8D;AAAA,EAC9D,2DAA2D;AAAA,EAC3D,2CAA2C;AAAA,EAC3C,gBAAgB;AAAA,EAChB,wBAA0B;AAAA,EAC1B,yBAA2B;AAAA,EAC3B,0BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,oCAAoC;AAAA,EACpC,qCAAqC;AAAA,EACrC,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,gCAAgC;AAAA,EAChC,MAAQ;AAAA,EACR,eAAe;AAAA,EACf,+BAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,SAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,0CAA0C;AAAA,EAC1C,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,QAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uCAAuC;AAAA,EACvC,qDAAqD;AAAA,EACrD,oDAAoD;AAAA,EACpD,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,2BAA2B;AAAA,EAC3B,+DAA+D;AAAA,EAC/D,mEAAmE;AAAA,EACnE,wCAAwC;AAAA,EACxC,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,WAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,OAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,iCAAmC;AAAA,EACnC,kCAAoC;AAAA,EACpC,mCAAqC;AAAA,EACrC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4CAA8C;AAAA,EAC9C,yBAAyB;AAAA,EACzB,+BAA+B;AAAA,EAC/B,gCAAgC;AAAA,EAChC,iCAAiC;AAAA,EACjC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,4CAA4C;AAAA,EAC5C,KAAO;AAAA,EACP,kCAAkC;AAAA,EAClC,8CAA8C;AAChD;;;AC7QA;AAAA,EACE,sDAAsD;AAAA,EACtD,iDAAiD;AAAA,EACjD,wCAAwC;AAAA,EACxC,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,4CAA4C;AAAA,EAC5C,sCAAsC;AAAA,EACtC,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,2BAAoB;AAAA,EACpB,kDAA2C;AAAA,EAC3C,mDAA4C;AAAA,EAC5C,4BAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,0CAA0C;AAAA,EAC1C,yDAAyD;AAAA,EACzD,WAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,kBAAkB;AAAA,EAClB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,4CAA4C;AAAA,EAC5C,aAAa;AAAA,EACb,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,QAAU;AAAA,EACV,gCAAgC;AAAA,EAChC,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,2CAA2C;AAAA,EAC3C,QAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAa;AAAA,EACb,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,4CAA4C;AAAA,EAC5C,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,KAAO;AAAA,EACP,YAAY;AAAA,EACZ,kCAAkC;AAAA,EAClC,OAAS;AAAA,EACT,qBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4DAA4D;AAAA,EAC5D,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,yGAAyG;AAAA,EACzG,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,MAAQ;AAAA,EACR,qEAAqE;AAAA,EACrE,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,MAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa;AAAA,EACb,UAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,0CAA0C;AAAA,EAC1C,MAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,0CAAuC;AAAA,EACvC,oCAAiC;AAAA,EACjC,yCAAyC;AAAA,EACzC,kBAAkB;AAAA,EAClB,8CAA8C;AAAA,EAC9C,qCAAqC;AAAA,EACrC,gDAAgD;AAAA,EAChD,oBAAoB;AAAA,EACpB,MAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,KAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,2BAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qDAAqD;AAAA,EACrD,kBAAkB;AAAA,EAClB,IAAM;AAAA,EACN,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,KAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,OAAS;AAAA,EACT,0DAA0D;AAAA,EAC1D,8DAA8D;AAAA,EAC9D,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAkB;AAAA,EAClB,gBAAkB;AAAA,EAClB,iBAAmB;AAAA,EACnB,kBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAU;AAAA,EACV,8DAA8D;AAAA,EAC9D,8DAA8D;AAAA,EAC9D,2DAA2D;AAAA,EAC3D,2CAA2C;AAAA,EAC3C,gBAAgB;AAAA,EAChB,wBAA0B;AAAA,EAC1B,wBAA0B;AAAA,EAC1B,yBAA2B;AAAA,EAC3B,0BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,mCAAmC;AAAA,EACnC,oCAAoC;AAAA,EACpC,qCAAqC;AAAA,EACrC,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,gCAAgC;AAAA,EAChC,MAAQ;AAAA,EACR,eAAe;AAAA,EACf,+BAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,SAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,0CAA0C;AAAA,EAC1C,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,QAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uCAAuC;AAAA,EACvC,qDAAqD;AAAA,EACrD,oDAAoD;AAAA,EACpD,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,2BAA2B;AAAA,EAC3B,+DAA+D;AAAA,EAC/D,mEAAmE;AAAA,EACnE,wCAAwC;AAAA,EACxC,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,WAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,OAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,iCAAmC;AAAA,EACnC,iCAAmC;AAAA,EACnC,kCAAoC;AAAA,EACpC,mCAAqC;AAAA,EACrC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4CAA8C;AAAA,EAC9C,yBAAyB;AAAA,EACzB,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,gCAAgC;AAAA,EAChC,iCAAiC;AAAA,EACjC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,4CAA4C;AAAA,EAC5C,KAAO;AAAA,EACP,kCAAkC;AAAA,EAClC,8CAA8C;AAChD;;;ACrRA;AAAA,EACE,sDAAsD;AAAA,EACtD,iDAAiD;AAAA,EACjD,wCAAwC;AAAA,EACxC,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,4CAA4C;AAAA,EAC5C,sCAAsC;AAAA,EACtC,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,2BAAoB;AAAA,EACpB,kDAA2C;AAAA,EAC3C,mDAA4C;AAAA,EAC5C,4BAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,0CAA0C;AAAA,EAC1C,yDAAyD;AAAA,EACzD,WAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iCAAiC;AAAA,EACjC,kBAAkB;AAAA,EAClB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,4CAA4C;AAAA,EAC5C,aAAa;AAAA,EACb,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,QAAU;AAAA,EACV,gCAAgC;AAAA,EAChC,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,2CAA2C;AAAA,EAC3C,QAAU;AAAA,EACV,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAa;AAAA,EACb,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,4CAA4C;AAAA,EAC5C,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,KAAO;AAAA,EACP,YAAY;AAAA,EACZ,kCAAkC;AAAA,EAClC,OAAS;AAAA,EACT,qBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4DAA4D;AAAA,EAC5D,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,yGAAyG;AAAA,EACzG,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,+CAA+C;AAAA,EAC/C,8CAA8C;AAAA,EAC9C,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,MAAQ;AAAA,EACR,qEAAqE;AAAA,EACrE,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,MAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa;AAAA,EACb,UAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,0CAA0C;AAAA,EAC1C,MAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,0CAAuC;AAAA,EACvC,oCAAiC;AAAA,EACjC,yCAAyC;AAAA,EACzC,kBAAkB;AAAA,EAClB,8CAA8C;AAAA,EAC9C,qCAAqC;AAAA,EACrC,gDAAgD;AAAA,EAChD,oBAAoB;AAAA,EACpB,MAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,KAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,2BAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qDAAqD;AAAA,EACrD,kBAAkB;AAAA,EAClB,IAAM;AAAA,EACN,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,KAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,OAAS;AAAA,EACT,0DAA0D;AAAA,EAC1D,8DAA8D;AAAA,EAC9D,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAkB;AAAA,EAClB,kBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAU;AAAA,EACV,8DAA8D;AAAA,EAC9D,8DAA8D;AAAA,EAC9D,2DAA2D;AAAA,EAC3D,2CAA2C;AAAA,EAC3C,gBAAgB;AAAA,EAChB,wBAA0B;AAAA,EAC1B,0BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,qCAAqC;AAAA,EACrC,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,gCAAgC;AAAA,EAChC,MAAQ;AAAA,EACR,eAAe;AAAA,EACf,+BAA+B;AAAA,EAC/B,cAAc;AAAA,EACd,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,SAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,0CAA0C;AAAA,EAC1C,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,QAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uCAAuC;AAAA,EACvC,qDAAqD;AAAA,EACrD,oDAAoD;AAAA,EACpD,+BAA+B;AAAA,EAC/B,QAAU;AAAA,EACV,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,2BAA2B;AAAA,EAC3B,+DAA+D;AAAA,EAC/D,mEAAmE;AAAA,EACnE,wCAAwC;AAAA,EACxC,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,WAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,OAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,iCAAmC;AAAA,EACnC,mCAAqC;AAAA,EACrC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4CAA8C;AAAA,EAC9C,yBAAyB;AAAA,EACzB,+BAA+B;AAAA,EAC/B,iCAAiC;AAAA,EACjC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,4CAA4C;AAAA,EAC5C,KAAO;AAAA,EACP,kCAAkC;AAAA,EAClC,8CAA8C;AAChD;;;ACrQA,qBAAiB;AACjB,IAAAC,gBAAkB;AAClB,IAAAC,mBAAqB;AACrB,0BAAyB;AACzB,IAAAC,0BAA4B;AAC5B,wBAAuB;AACvB,0BAAyB;AACzB,sBAAqB;AACrB,iBAAgB;AAChB,sBAAqB;;;ACMd,IAAe,mBAAf,MAEL;AAAA,EAIA,YAAsB,SAAqC;AAArC;AAHtB,SAAU,cAA0C,oBAAI,IAAI;AAc5D,yBAAgB,CAACC,OAAc,eAA8B;AAC3D,WAAK,YAAY,IAAIA,OAAM,UAAU;AAAA,IACvC;AAEA,4BAAmB,CAACA,UAAiB;AACnC,WAAK,YAAY,OAAOA,KAAI;AAAA,IAC9B;AAhBE,SAAK,UAAU,QAAQ;AACvB,QAAI,QAAQ,aAAa;AACvB,aAAO,QAAQ,QAAQ,WAAW,EAAE,QAAQ,CAAC,CAACA,OAAM,UAAU,MAAM;AAClE,aAAK,cAAcA,OAAM,UAAU;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AAWF;AAEA,IAAM,qBAAiC,CAAC,EAAE,MAAM,MAAM;AAM/C,IAAM,qBAAN,MAAyB;AAAA,EAS9B,YAAoB,SAAe;AAAf;AARpB,SAAQ,SAAS,oBAAI,IAA8B;AAGnD;AAAA;AAAA,SAAQ,gCAGJ,CAAC;AAIL,yBAAgB,CAACA,OAAiB,UAAuC;AACvE,UAAI,QAAQ,KAAK,OAAO,IAAIA,KAAI;AAEhC,UAAI,CAAC,OAAO;AACV,gBAAQ,IAAI,MAAM,EAAE,SAAS,KAAK,QAAQ,CAAC;AAC3C,aAAK,OAAO,IAAIA,OAAM,KAAK;AAC3B,aAAK,QAAQ,IAAI;AAAA,UACf,MAAAA;AAAA,UACA,SAAS,CAAC,OAAe,KAAa,YAAqC;AACzE,kBAAMC,SAAQ,KAAK,OAAO,IAAID,KAAI;AAClC,gBAAI,CAACC,OAAO,QAAO;AACnB,mBAAOA,OAAM,UAAU,OAAO,KAAK,OAAO;AAAA,UAC5C;AAAA,UACA,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAEA,YAAM,kCAAkC,KAAK,8BAA8BD,KAAI;AAC/E,UAAI,iCAAiC;AACnC,eAAO,QAAQ,+BAA+B,EAAE;AAAA,UAC9C,CAAC,CAAC,gBAAgB,UAAU,MAAM;AAChC,kBAAM,cAAc,gBAAgB,UAAU;AAAA,UAChD;AAAA,QACF;AACA,eAAO,KAAK,8BAA8BA,KAAI;AAAA,MAChD;AACA,aAAO;AAAA,IACT;AAEA,wBAAe,CAAC,cAAyB;AACvC,YAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,UAAI,CAAC,MAAO;AACZ,WAAK,QAAQ,IAAI;AAAA,QACf,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AACD,WAAK,OAAO,OAAO,SAAS;AAAA,IAC9B;AAEA,oBAAW,CAAC,cAAyB,KAAK,OAAO,IAAI,SAAS;AAAA,EA1C1B;AAAA,EA4CpC,oBACE,WACA,aACA;AACA,UAAM,QAAQ,KAAK,SAAS,SAAS;AACrC,QAAI,CAAC,OAAO;AACV,UAAI,CAAC,KAAK,8BAA8B,SAAS;AAC/C,aAAK,8BAA8B,SAAS,IAAI,CAAC;AAEnD,aAAO,QAAQ,WAAW,EAAE,QAAQ,CAAC,CAAC,gBAAgB,UAAU,MAAM;AACpE,aAAK,8BAA8B,SAAS,EAAE,cAAc,IAAI;AAAA,MAClE,CAAC;AACD;AAAA,IACF;AACA,WAAO,QAAQ,WAAW,EAAE,QAAQ,CAAC,CAACA,OAAM,UAAU,MAAM;AAC1D,YAAM,cAAcA,OAAM,UAAU;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EAEA,kBAAkB,WAAsB,aAA+B;AACrE,UAAM,QAAQ,KAAK,SAAS,SAAS;AACrC,QAAI,KAAK,8BAA8B,SAAS,GAAG;AACjD,kBAAY,QAAQ,CAAC,mBAAmB;AACtC,eAAO,KAAK,8BAA8B,SAAS,EAAE,cAAc;AAAA,MACrE,CAAC;AAAA,IACH;AACA,QAAI,CAAC,MAAO;AACZ,gBAAY,QAAQ,CAACA,UAAS;AAC5B,YAAM,iBAAiBA,KAAI;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;;;AChIO,IAAM,gDAET,CAAC,EAAE,SAAS,EAAE,MAAM;AACtB,QAAM,EAAE,aAAa,IAAI;AACzB,MAAI,CAAC,aAAc,QAAO;AAC1B,MAAI,OAAO,aAAa,UAAU,WAAW,UAAU;AACrD,UAAME,UAAS,EAAE,eAAe;AAChC,WAAO,EAAE,+CAA+C,EAAE,QAAAA,QAAO,CAAC;AAAA,EACpE;AACA,MAAI,aAAa,UAAU,WAAW,cAAc;AAClD,UAAMA,UAAS,EAAE,YAAY;AAC7B,WAAO,EAAE,+CAA+C,EAAE,QAAAA,QAAO,CAAC;AAAA,EACpE;AACA,QAAM,SAAS,EAAE,uBAAuB;AACxC,SAAO,EAAE,+CAA+C,EAAE,OAAO,CAAC;AACpE;AAEO,IAAM,+CAET,CAAC,EAAE,SAAS,EAAE,MAAM;AACtB,QAAM,EAAE,aAAa,IAAI;AACzB,MAAI,CAAC,aAAc,QAAO;AAC1B,QAAM,EAAE,QAAQ,eAAe,IAAI,aAAa,YAAY,CAAC;AAC7D,MAAI,OAAO,mBAAmB,UAAU;AACtC,UAAMA,UAAS,EAAE,eAAe;AAChC,WAAO,EAAE,8CAA8C,EAAE,QAAAA,QAAO,CAAC;AAAA,EACnE;AACA,MAAI,SAAS,eAAe,YAAY;AACxC,MAAI,WAAW,iBAAiB;AAC9B,aAAS,EAAE,eAAe;AAC1B,WAAO,EAAE,8CAA8C,EAAE,OAAO,CAAC;AAAA,EACnE;AAEA,SAAO,EAAE,8CAA8C,EAAE,OAAO,CAAC;AACnE;AAEO,IAAM,0CAET,CAAC,EAAE,SAAS,EAAE,aAAa,GAAG,EAAE,MAAM;AACxC,MAAI,CAAC,cAAc,QAAS,QAAO;AACnC,SAAO,EAAE,0CAA0C;AACrD;;;ACzCO,IAAM,2CAET,CAAC,EAAE,SAAS,EAAE,aAAa,GAAG,EAAE,MAAM;AACxC,MACE,OAAO,cAAc,UAAU,WAAW,YAC1C,aAAa,SAAS,OAAO,QAC7B;AACA,WAAO,EAAE,+CAA+C;AAAA,MACtD,QAAQ,aAAa,SAAS,OAAO,YAAY;AAAA,IACnD,CAAC;AAAA,EACH;AACA,SAAO,EAAE,2BAA2B;AACtC;;;ACZO,IAAM,wBAAmE,CAAC,EAAE,EAAE,MACnF,EAAE,wDAAwD;;;ACDrD,IAAM,4BAAuE,CAAC;AAAA,EACnF;AAAA,EACA;AACF,MAAM,QAAQ,cAAc,WAAW,EAAE,iCAAiC;;;ACOnE,IAAM,iCAGT;AAAA,EACF,gCAAgC;AAAA,EAChC,0BAA0B;AAAA,EAC1B,gCAAgC;AAAA,EAChC,wCAAwC;AAAA,EACxC,4CAA4C;AAAA,EAC5C,kCAAkC;AACpC;AAEO,IAAM,+BAAN,cAA2C,iBAAgD;AAAA,EAChG,YAAY,EAAE,SAAS,YAAY,GAA4B;AAC7D,UAAM,EAAE,SAAS,aAAa,+BAA+B,CAAC;AAQhE,qBAAY,CAAC,OAAe,KAAa,YAA6C;AACpF,YAAM,EAAE,aAAa,IAAI;AACzB,UAAI,CAAC,aAAc,QAAO;AAC1B,YAAM,aAAa,aAAa,QAAQ,KAAK,YAAY,IAAI,aAAa,IAAI;AAC9E,UAAI,CAAC,WAAY,QAAO;AACxB,aAAO,WAAW,EAAE,KAAK,SAAS,GAAG,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK;AAAA,IACnE;AAbE,QAAI,aAAa;AACf,aAAO,QAAQ,WAAW,EAAE,QAAQ,CAAC,CAACC,OAAM,UAAU,MAAM;AAC1D,aAAK,cAAcA,OAAM,UAAU;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AASF;;;ANNA,IAAAC,aAAO;AACP,IAAAC,aAAO;AACP,IAAAC,aAAO;AACP,IAAAC,aAAO;AACP,IAAAC,aAAO;AACP,IAAAC,aAAO;AACP,IAAAC,aAAO;AACP,IAAAC,aAAO;AACP,IAAAC,aAAO;AACP,IAAAC,aAAO;AACP,IAAAC,aAAO;AAIP,IAAAC,aAAO;AAEP,IAAM,YAAY;AAClB,IAAM,aAAa;AAWnB,cAAAC,QAAM,OAAO,oBAAAC,OAAY;AACzB,cAAAD,QAAM,OAAO,WAAAE,OAAG;AAChB,cAAAF,QAAM,OAAO,gBAAAG,OAAQ;AAErB,cAAAH,QAAM,aAAa,MAAM;AAAA,EACvB,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF,CAAC;AAED,cAAAA,QAAM,aAAa,MAAM;AAAA,EACvB,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF,CAAC;AAED,cAAAA,QAAM,aAAa,MAAM;AAAA,EACvB,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF,CAAC;AAED,cAAAA,QAAM,aAAa,MAAM;AAAA,EACvB,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA,EAGA,SAAS,MAAc;AACrB,QAAI,OAAO,GAAG;AACZ,aAAO;AAAA,IACT,WAAW,OAAO,IAAI;AACpB,aAAO;AAAA,IACT,WAAW,OAAO,IAAI;AACpB,aAAO;AAAA,IACT,WAAW,OAAO,IAAI;AACpB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,aAAa,MAAc,UAAkB;AAC3C,QAAI,SAAS,IAAI;AACf,aAAO;AAAA,IACT;AACA,QAAI,aAAa,sBAAO;AACtB,aAAO,OAAO,IAAI,OAAO,OAAO;AAAA,IAClC,WAAW,aAAa,4BAAQ;AAC9B,aAAO;AAAA,IACT,WAAW,aAAa,kCAAS;AAC/B,aAAO,QAAQ,KAAK,OAAO,OAAO;AAAA,IACpC,WAAW,aAAa,sBAAO;AAC7B,aAAO,OAAO;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAAA,EACA,eAAe;AACjB,CAAC;AAED,cAAAA,QAAM,aAAa,MAAM;AAAA,EACvB,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF,CAAC;AAED,cAAAA,QAAM,aAAa,MAAM;AAAA,EACvB,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF,CAAC;AAED,cAAAA,QAAM,aAAa,MAAM;AAAA,EACvB,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF,CAAC;AAED,cAAAA,QAAM,aAAa,MAAM;AAAA,EACvB,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF,CAAC;AAED,cAAAA,QAAM,aAAa,MAAM;AAAA,EACvB,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF,CAAC;AAED,cAAAA,QAAM,aAAa,MAAM;AAAA,EACvB,UAAU;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF,CAAC;AAED,cAAAA,QAAM,aAAa,MAAM;AAAA,EACvB,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF,CAAC;AAED,IAAM,YAAY;AAAA,EAChB,SAAS,CAAC;AAAA,EACV,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,cAAc,CAAC;AAAA,EACf,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAIA,IAAM,UAAU,CAAC,mBACd,eAAgC,WAAW;AAK9C,IAAM,aAAa,CAAC,mBACjB,eAAkC,OAAO;AAwK5C,IAAM,2BAA2B;AAAA,EAC/B,gBAAgB,cAAAA;AAAA,EAChB,8BAA8B;AAAA,EAC9B,OAAO;AAAA,EACP,6BAA6B;AAAA,EAC7B,UAAU;AAAA,EACV,QAAQ,CAAC,YAAqB,QAAQ,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUlD,0BAA0B;AAAA,IACxB,cAAc;AAAA,EAChB;AACF;AAEO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuFtB,YAAY,UAA6B,CAAC,GAAG;AAtF7C,wBAAe,eAAAI,QAAK,eAAe;AAEnC,SAAQ,2BAAwE,CAAC;AACjF,iBAAQ;AACR,+BAA8C,MAAM;AACpD,uBAAc;AAEd,aAAe;AAGf,wBAII;AAAA,MACF,IAAI,EAAE,CAAC,SAAS,GAAG,WAAe;AAAA,MAClC,IAAI,EAAE,CAAC,SAAS,GAAG,WAAe;AAAA,MAClC,IAAI,EAAE,CAAC,SAAS,GAAG,WAAe;AAAA,MAClC,IAAI,EAAE,CAAC,SAAS,GAAG,WAAe;AAAA,MAClC,IAAI,EAAE,CAAC,SAAS,GAAG,WAAe;AAAA,MAClC,IAAI,EAAE,CAAC,SAAS,GAAG,WAAe;AAAA,MAClC,IAAI,EAAE,CAAC,SAAS,GAAG,WAAe;AAAA,MAClC,IAAI,EAAE,CAAC,SAAS,GAAG,WAAe;AAAA,MAClC,IAAI,EAAE,CAAC,SAAS,GAAG,WAAe;AAAA,MAClC,IAAI,EAAE,CAAC,SAAS,GAAG,WAAe;AAAA,MAClC,IAAI,EAAE,CAAC,SAAS,GAAG,WAAe;AAAA,MAClC,IAAI,EAAE,CAAC,SAAS,GAAG,WAAe;AAAA,IACpC;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAoD,CAAC;AASrD,sBAAsD;AA0LtD,wBAAe,CAAC,aAAmC;AACjD,UAAI,KAAK,uBAAwB,QAAO;AAExC,aAAO,OAAO,KAAK,cAAAJ,QAAM,EAAE,EAAE,QAAQ,QAAQ,IAAI;AAAA,IACnD;AAEA,mCAA0B,MAAM;AAC9B,YAAM,qBAAqB,OAAO,KAAK,KAAK,YAAY;AACxD,UAAI,mBAAmB,QAAQ,KAAK,eAAe,MAAM,IAAI;AAC3D,aAAK;AAAA,UACH,gBAAgB,KAAK,eAAe,0FAC2B,KAAK,eAAe,2DACnC,KAAK,sBAAsB,CAAC;AAAA,QAC9E;AAEA,aAAK,kBAAkB;AAAA,MACzB;AAAA,IACF;AAGA;AAAA,0BAAiB,MAAM,KAAK;AAG5B;AAAA,iCAAwB,MAAM,OAAO,KAAK,KAAK,YAAY;AAG3D;AAAA,2BAAkB,MAAM,KAAK;AAzK3B,UAAM,eAAe;AAAA,MACnB,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEA,SAAK,SAAS,aAAa;AAC3B,SAAK,kBAAkB,aAAa;AACpC,SAAK,iBAAiB,aAAa;AACnC,SAAK,WAAW,aAAa;AAC7B,SAAK,aAAa,EAAE,GAAG,sBAAsB,GAAG,SAAS,WAAW;AACpE,SAAK,qBAAqB,IAAI,mBAAmB,KAAK,YAAY;AAClE,SAAK,2BAA2B;AAAA,MAC9B,GAAG,yBAAyB;AAAA,MAC5B,GAAG,QAAQ;AAAA,IACb;AAEA,QAAI;AACF,UAAI,KAAK,kBAAkB,QAAQ,KAAK,cAAc,GAAG;AACvD,aAAK,eAAe,OAAO,wBAAAK,OAAe;AAC1C,aAAK,eAAe,OAAO,iBAAAC,OAAQ;AACnC,aAAK,eAAe,OAAO,kBAAAC,OAAU;AACrC,aAAK,eAAe,OAAO,oBAAAC,OAAY;AACvC,aAAK,eAAe,OAAO,gBAAAC,OAAQ;AAAA,MACrC;AAAA,IACF,SAAS,OAAO;AACd,YAAM;AAAA,QACJ,8GAA8G,KAAK;AAAA,MACrH;AAAA,IACF;AAEA,SAAK,yBAAyB,CAAC,CAAC,QAAQ;AACxC,UAAM,0BAA0B,aAAa;AAE7C,QAAI,yBAAyB;AAC3B,WAAK,aAAa,KAAK,eAAe,IAAI;AAAA,QACxC,CAAC,SAAS,GACR,KAAK,aAAa,KAAK,eAAe,KACtC,KAAK,aAAa,KAAK,eAAe,EAAE,SAAS,IAC7C;AAAA,UACE,GAAG,KAAK,aAAa,KAAK,eAAe,EAAE,SAAS;AAAA,UACpD,GAAG;AAAA,QACL,IACA;AAAA,MACR;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,aAAa,KAAK,eAAe,GAAG;AAC5C,WAAK,aAAa,KAAK,eAAe,IAAI;AAAA,QACxC,CAAC,SAAS,GAAG,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,SAAK,gBAAgB;AAAA,MACnB,OAAO,aAAa;AAAA,MACpB,aAAa;AAAA,MACb,eAAe,EAAE,aAAa,OAAO,iBAAiB,IAAI;AAAA,MAC1D,cAAc;AAAA,MACd,KAAK,KAAK;AAAA,MACV,aAAa;AAAA,IACf;AAEA,UAAM,cAAc,OAAO,KAAK,KAAK,wBAAwB;AAE7D,QAAI,YAAY,SAAS,GAAG;AAC1B,WAAK,cAAc,cAAc;AAAA,IACnC;AAEA,QAAI,aAAa,wBAAwB;AACvC,WAAK,cAAc,yBAAyB,aAAa;AAAA,IAC3D;AAEA,SAAK,wBAAwB;AAE7B,UAAM,+BAA+B,aAAa;AAElD,QAAI,8BAA8B;AAChC,WAAK,kBAAkB,KAAK,iBAAiB;AAAA,QAC3C,GAAG;AAAA,MACL,CAAC;AAAA,IACH,WAAW,CAAC,KAAK,aAAa,KAAK,eAAe,GAAG;AACnD,WAAK;AAAA,QACH,mDAAmD,KAAK,eAAe,0FACP,KAAK,eAAe;AAAA,MAEtF;AAAA,IACF;AAEA,SAAK,kBAAkB,CAAC,cAAc;AACpC,YAAM,WACJ,aAAa,+BACb,CAAC,KAAK,aAAa,KAAK,eAAe,IACnC,aACA,KAAK;AAEX,UAAI,QAAQ,KAAK,cAAc,GAAG;AAChC,eAAO,WAAW,KAAK,cAAc,IACjC,KAAK,eAAe,SAAS,EAAE,GAAG,KAAK,QAAQ,EAAE,OAAO,QAAQ,IAChE,KAAK,eAAe,SAAS,EAAE,OAAO,QAAQ;AAAA,MACpD;AAEA,UAAI,WAAW,KAAK,cAAc,KAAK,KAAK,UAAU;AACpD,eAAO,KAAK,eAAe,SAAS,EAAE,GAAG,KAAK,QAAQ,EAAE,OAAO,QAAQ;AAAA,MACzE;AACA,aAAO,KAAK,eAAe,SAAS,EAAE,OAAO,QAAQ;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO;AACX,SAAK,wBAAwB;AAE7B,QAAI;AACF,WAAK,IAAI,MAAM,KAAK,aAAa,KAAK;AAAA,QACpC,GAAG,KAAK;AAAA,QACR,KAAK,KAAK;AAAA,QACV,WAAW,KAAK;AAAA,MAClB,CAAC;AACD,WAAK,cAAc;AACnB,UAAI,KAAK,YAAY;AACnB,eAAO,QAAQ,KAAK,UAAU,EAAE,QAAQ,CAAC,CAACC,OAAM,gBAAgB,MAAM;AACpE,cAAI,CAAC,iBAAkB;AACvB,eAAK,aAAa,SAAS,WAAW,IAAIA,OAAM,iBAAiB,IAAI,CAAC;AAAA,QACxE,CAAC;AAAA,MACH;AAEA,aAAO,QAAQ,KAAK,wBAAwB,EAAE;AAAA,QAC5C,CAAC,CAAC,OAAOC,iBAAgB,MAAM;AAC7B,eAAK,mBAAmB,cAAc,OAAOA,iBAAgB;AAAA,QAC/D;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,WAAK,OAAO,mCAAmC,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,IACxE;AAEA,WAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,iBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAiCA,MAAM,iBAAiB;AACrB,QAAI,CAAC,KAAK,aAAa;AACrB,UAAI,KAAK,aAAa,KAAK,eAAe,GAAG;AAC3C,aAAK;AAAA,UACH,KAAK;AAAA,UACL,KAAK,aAAa,KAAK,eAAe;AAAA,QACxC;AAAA,MACF;AAEA,aAAO,MAAM,KAAK,KAAK;AAAA,IACzB,OAAO;AACL,aAAO;AAAA,QACL,GAAG,KAAK;AAAA,QACR,iBAAiB,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,oBACE,UACA,aACA,mBACA;AACA,QAAI,CAAC,aAAa;AAChB,WAAK;AAAA,QACH;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,aAAa,QAAQ,GAAG;AAChC,WAAK,aAAa,QAAQ,IAAI,EAAE,CAAC,SAAS,GAAG,YAAY;AAAA,IAC3D,OAAO;AACL,WAAK,aAAa,QAAQ,EAAE,SAAS,IAAI;AAAA,IAC3C;AAEA,QAAI,mBAAmB;AACrB,WAAK,aAAa,QAAQ,IAAI,EAAE,GAAG,kBAAkB;AAAA,IACvD,WAAW,CAAC,KAAK,aAAa,QAAQ,GAAG;AACvC,WAAK;AAAA,QACH,iGACuB,QAAQ,sFACgC,QAAQ;AAAA,MAEzE;AAAA,IACF;AAEA,QAAI,KAAK,aAAa;AACpB,WAAK,aAAa,aAAa,UAAU,WAAW,WAAW;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,kBAAkB,KAA2B,QAA0B;AACrE,QAAI,KAAK,aAAa,GAAG,GAAG;AAC1B,oBAAAX,QAAM,aAAa,KAAK,EAAE,GAAG,OAAO,CAAC;AAAA,IACvC,OAAO;AAEL,oBAAAA,QAAM,OAAO,EAAE,MAAM,KAAK,GAAG,WAAW,GAAG,OAAO,GAAG,QAAW,IAAI;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,UAAgC;AAChD,SAAK,kBAAkB;AAEvB,QAAI,CAAC,KAAK,YAAa;AAEvB,QAAI;AACF,YAAM,IAAI,MAAM,KAAK,aAAa,eAAe,QAAQ;AACzD,UAAI,KAAK,aAAa,QAAQ,GAAG;AAC/B,aAAK;AAAA,UACH,KAAK;AAAA,UACL,KAAK,aAAa,KAAK,eAAe;AAAA,QACxC;AAAA,MACF;AAEA,WAAK,oBAAoB,CAAC;AAC1B,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,OAAO,2BAA2B,KAAK,UAAU,KAAK,CAAC,EAAE;AAC9D,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEA,4BAA4B,UAAkC;AAC5D,SAAK,sBAAsB;AAAA,EAC7B;AACF;;;AdjtBO,IAAM,kBAAkB,CAAC,WAAkC;AAChE,QAAM,EAAE,UAAU,wBAAwB,wBAAwB,GAAG,QAAQ,IAAI;AACjF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI,SAAS;AACb,MAAI,0BAA0B;AAC9B,MAAI;AACJ,QAAM,cAAiC,CAAC;AAExC,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,GAAG;AAC3C,UAAM,UAAU,SAAS,CAAC;AAE1B,QAAI,uBAAuB,QAAQ,SAAS,WAAW;AACrD;AAAA,IACF;AAEA,QACE,0BACA,QAAQ,SAAS,eACjB,QAAQ,YAAY,SACpB;AACA,gCAA0B;AAC1B,6BAAuB,OAAO;AAC9B;AAAA,IACF;AAEA,UAAM,UAA6B,CAAC;AACpC,UAAM,cACH,QAAQ,cACP,OAAO,QAAQ,UAAU,KACzB,QAAQ,WAAW,aAAa,KAClC;AACF,UAAM,kBAAkB,SAAS,IAAI,CAAC;AACtC,QAAI,kBAAkB;AAEtB,QACE,uBACA,iBAAiB,cACjB,OAAO,gBAAgB,UAAU,GACjC;AACA,wBAAkB,gBAAgB,WAAW,aAAa;AAAA,IAC5D;AAEA,QAAI,CAAC,UAAU,CAAC,yBAAyB;AACvC,eACG,YAAY,QAAQ,cAAc,IAAI,KAAK,QAAQ,IAAI,QAAQ,cAChE;AAGF,UAAI,uBAAuB,UAAU,QAAQ,MAAM,OAAO,QAAQ;AAChE,gBAAQ,KAAK;AAAA,UACX,YAAY,oBAAoB;AAAA,UAChC,MAAM,QAAQ;AAAA,UACd,IAAI,kBAAkB,QAAQ,UAAU;AAAA,UACxC;AAAA,QACF,CAAyB;AAAA,MAC3B;AAAA,IACF;AAEA,QACE,wBACC,MAAM;AAAA,IACL,gBAAgB;AAAA;AAAA,IAEf,uBACC,iBAAiB,SAAS,aAC1B,sBAAsB,gBAC1B,CAAC,uBAAuB,QAAQ,QAAQ,SAAS,CAAC,CAAC,GACnD;AACA,0BAAoB;AAEpB,cAAQ;AAAA,QACN;AAAA,UACE,YAAY,oBAAoB;AAAA,UAChC,MAAM,QAAQ;AAAA,UACd,IAAI,kBAAkB,QAAQ,UAAU;AAAA,QAC1C;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,cAAQ,KAAK,OAAO;AAAA,IACtB;AAEA,gBAAY;AAAA,MACV,GAAI,yBAAyB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,mBAAmB;AAAA,MACrB,CAAC,KAAK;AAAA,IACR;AAAA,EACF;AAGA,MAAI,0BAA0B,CAAC,yBAAyB;AACtD,2BAAuB,MAAS;AAAA,EAClC;AAEA,SAAO;AACT;AAEO,IAAM,mBAAmB,OAAqB;AAAA,EACnD,YAAY,oBAAoB;AAAA,EAChC,QAAI,uBAAO;AACb;AAEO,IAAM,oBAAoB,CAAC,SAAyB;AACzD,MAAI;AACJ,MAAI;AACF,eAAW,CAAC,WAAO,uBAAO,IAAI,gBAAgB,OAAO,KAAK,YAAY,IAAI;AAAA,EAC5E,SAAS,GAAG;AACV,mBAAW,uBAAO;AAAA,EACpB;AACA,SAAO,GAAG,oBAAoB,IAAI,IAAI,QAAQ;AAChD;AAGO,IAAM,kBAAkB,CAAC,aAAgC;AAC9D,WAAS,IAAI,SAAS,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG;AAC/C,QAAK,SAAS,CAAC,EAAmB,WAAW,YAAY;AACvD,aAAO,SAAS,CAAC,EAAE;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,cAAc,CAAC,UAA6B,mBAA4B;AACnF,QAAM,cAAc;AACpB,QAAM,QAAQ,iBAAiB;AAG/B,MAAI,CAAC,gBAAgB;AACnB,gBAAY,QAAQ,KAAK;AACzB,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,YAAY,QAAQ;AACvB,gBAAY,QAAQ,KAAK;AACzB,WAAO;AAAA,EACT;AAGA,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,GAAG;AAC3C,UAAM,cAAc,OAAQ,SAAS,CAAC,EAAmB,UAAU,IAC9D,SAAS,CAAC,EAAmB,WAAW,QAAQ,IACjD;AAEJ,UAAM,kBAAkB,OAAQ,SAAS,IAAI,CAAC,EAAmB,UAAU,IACtE,SAAS,IAAI,CAAC,EAAmB,WAAW,QAAQ,IACrD;AAGJ,QAAI,eAAe,cAAc,gBAAgB;AAE/C,UAAI,mBAAmB,kBAAkB,gBAAgB;AACvD,YAAI,SAAS,IAAI,CAAC,KAAK,uBAAuB,SAAS,IAAI,CAAC,CAAC,EAAG;AAChE,YAAI,CAAC,iBAAiB;AACpB,sBAAY,KAAK,KAAK;AACtB,iBAAO;AAAA,QACT;AAAA,MACF,OAAO;AACL,oBAAY,OAAO,IAAI,GAAG,GAAG,KAAK;AAClC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAIO,IAAM,iBAAiB,CAC5B,SACA,iBACA,aACA,eACA,kCACe;AACf,MAAI,uBAAuB,OAAO,KAAK,eAAe,OAAO,EAAG,QAAO;AAEvE,MAAI,iBAAiB,QAAQ,aAAa,WAAW,EAAG,QAAO;AAE/D,QAAM,eACJ,CAAC,mBACD,eAAe,eAAe,KAC9B,uBAAuB,eAAe,KACtC,gBAAgB,SAAS,YACzB,gBAAgB,SAAS,WACzB,gBAAgB,aAAa,WAAW,KACxC,QAAQ,MAAM,OAAO,gBAAgB,MAAM,MAC3C,gBAAgB,cACf,QAAQ,mBAAmB,OAAO,KAAK,QAAQ,eAAe,EAAE,SAAS,KAC1E,gBAAgB,eAAe,KAC9B,kCAAkC,UACjC,gBAAgB,cAChB,QAAQ,cACR,IAAI,KAAK,QAAQ,UAAU,EAAE,QAAQ,IACnC,IAAI,KAAK,gBAAgB,UAAU,EAAE,QAAQ,IAC7C;AAEN,QAAM,kBACJ,CAAC,eACD,eAAe,WAAW,KAC1B,uBAAuB,WAAW,KAClC,YAAY,SAAS,YACrB,YAAY,SAAS,WACrB,YAAY,aAAa,WAAW,KACpC,QAAQ,MAAM,OAAO,YAAY,MAAM,MACvC,YAAY,cACX,YAAY,mBACX,OAAO,KAAK,YAAY,eAAe,EAAE,SAAS,KACpD,gBAAgB,OAAO,KACtB,kCAAkC,UACjC,YAAY,cACZ,QAAQ,cACR,IAAI,KAAK,YAAY,UAAU,EAAE,QAAQ,IACvC,IAAI,KAAK,QAAQ,UAAU,EAAE,QAAQ,IACrC;AAEN,MAAI,CAAC,gBAAgB,CAAC,iBAAiB;AACrC,QAAI,QAAQ,cAAc,QAAQ,SAAS,QAAS,QAAO;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB;AACnB,QAAI,gBAAgB,QAAQ,cAAc,QAAQ,SAAS,QAAS,QAAO;AAC3E,WAAO;AAAA,EACT;AAEA,MAAI,aAAc,QAAO;AAEzB,SAAO;AACT;AAOO,IAAM,0BAA0B,CAAC,uBAA+B,UACrE,yBAAyB;AAGpB,IAAM,qBAAqB,CAAC,uBAA+B,UAChE,wBAAwB;AAEnB,SAAS,eAAe,SAA2C;AACxE,SAAQ,QAAyB,eAAe,oBAAoB;AACtE;AAEO,SAAS,uBACd,SACiC;AACjC,SACE,YAAY,QACZ,OAAO,YAAY,YAClB,QAAiC,eAAe,oBAAoB,QACrE,OAAQ,QAAiC,IAAI;AAEjD;AAEO,SAAS,eAAe,SAA2C;AACxE,SAAO,CAAC,uBAAuB,OAAO,KAAK,CAAC,eAAe,OAAO;AACpE;AAEO,IAAM,0BAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AACvB,MAQM;AAEJ,MAAI,QAAQ,UAAW,QAAO;AAE9B,QAAM,qBAAqB,QAAQ,cAAc,IAAI,KAAK,QAAQ,UAAU,EAAE,QAAQ;AACtF,QAAM,oBAAoB,cAAc,QAAQ;AAEhD,QAAM,kBACJ,CAAC,CAAC,sBAAsB,CAAC,CAAC,qBAAqB,qBAAqB;AAEtE,QAAM,4BACJ,CAAC,CAAC,qBAAqB,sBAAsB,iBAAiB;AAEhE,SACE,yBAAyB,QAAQ,MAChC,CAAC,CAAC,sBACD,oBACC,kBAAkB;AAEzB;;;ADlXO,IAAM,sBAAsB,CAAC,SAiB9B;AACJ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,OAAO,IAAI,eAAe,qBAAqB;AACvD,QAAM,EAAE,gBAAgB,IAAI,oBAAoB,qBAAqB;AAErE,QAAM,eAAW,yBAAQ,MAAM,QAAQ,WAAW,GAAG,CAAC,OAAO,CAAC;AAE9D,QAAM,sBAAsB,CAAC;AAE7B,MAAI,oBACF,CAAC,uBAAuB,CAAC,uBAAuB,0BAC5C,WACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,UAAU;AAAA,EAC3B,CAAC;AAEP,MAAI,iBAAiB;AACnB,wBAAoB,YAAY,mBAAmB,cAAc;AAAA,EACnE;AAEA,QAAM,gBAAgB,eAAe;AACrC,QAAM,yBAAqB;AAAA,IACzB,MACE,kBAAkB,OAAmC,CAAC,KAAK,SAAS,MAAM;AACxE,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA,kBAAkB,IAAI,CAAC;AAAA,QACvB,kBAAkB,IAAI,CAAC;AAAA,QACvB;AAAA,QACA;AAAA,MACF;AACA,UAAI,MAAO,KAAI,QAAQ,EAAE,IAAI;AAC7B,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA;AAAA,IAEP,CAAC,+BAA+B,mBAAmB,aAAa;AAAA,EAClE;AAEA,SAAO,EAAE,oBAAoB,UAAU,kBAAkB;AAC3D;;;AsBnFA,IAAAY,kBAAwB;;;ACDxB,IAAAC,kBAAwB;AAUjB,IAAM,kBAAkB,CAAC,UAAiC;AAC/D,QAAM,EAAE,SAAS,gBAAgB,UAAU,kBAAkB,IAAI;AAEjE,aAAO,yBAAQ,MAAM;AACnB,QAAI,mBAAmB;AACrB,aAAO,SAAS;AAAA,QACd,CAAC,KAAK,QAAQ;AACZ,cAAI,IAAI,EAAE,IAAI,QAAQ,uBAAuB,kBAAkB;AAAA,YAC7D,OAAO,IAAI;AAAA,YACX,aAAa,IAAI,WAAW,QAAQ;AAAA,UACtC,CAAC;AACD,iBAAO;AAAA,QACT;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,CAAC,eAAgB,QAAO,CAAC;AAC7B,WAAO;AAAA,MACL,CAAC,eAAe,EAAE,GAAG,QAAQ,uBAAuB,kBAAkB;AAAA,QACpE,OAAO,eAAe;AAAA,QACtB,aAAa,eAAe,WAAW,QAAQ;AAAA,MACjD,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,SAAS,gBAAgB,UAAU,iBAAiB,CAAC;AAC3D;;;ACnCA,IAAAC,kBAAiD;AAU1C,IAAM,uBAAuB,CAClC,UACmC;AACnC,QAAM,EAAE,SAAS,gBAAgB,UAAU,kBAAkB,IAAI;AAEjE,QAAM,sBAAkB;AAAA,IACtB,MACE,SAAS;AAAA,MACP,CAAC,KAAK,QAAQ;AACZ,YAAI,IAAI,EAAE,IAAI,QAAQ,uBAAuB,oBAAoB;AAAA,UAC/D,OAAO,IAAI;AAAA,UACX,aAAa,IAAI,WAAW,QAAQ;AAAA,QACtC,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAAA,IACF,CAAC,SAAS,QAAQ;AAAA,EACpB;AAEA,QAAM,0BAAsB,6BAAY,MAAM;AAC5C,QAAI,CAAC,eAAgB,QAAO,CAAC;AAC7B,WAAO;AAAA,MACL,CAAC,eAAe,EAAE,GAAG,QAAQ,uBAAuB,oBAAoB;AAAA,QACtE,OAAO,eAAe;AAAA,QACtB,aAAa,eAAe,WAAW,QAAQ;AAAA,MACjD,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,SAAS,cAAc,CAAC;AAE5B,QAAM,CAAC,aAAa,cAAc,QAAI;AAAA,IACpC,oBAAoB,kBAAkB;AAAA,EACxC;AAEA,iCAAU,MAAM;AACd,QAAI,CAAC,kBAAmB;AACxB,mBAAe,eAAe;AAC9B,WAAO,QAAQ,GAAG,qBAAqB,MAAM,eAAe,eAAe,CAAC,EACzE;AAAA,EACL,GAAG,CAAC,SAAS,iBAAiB,iBAAiB,CAAC;AAEhD,iCAAU,MAAM;AACd,QAAI,kBAAmB;AAAA,QAClB,gBAAe,mBAAmB;AACvC,WAAO,QAAQ,GAAG,qBAAqB,MAAM,eAAe,mBAAmB,CAAC,EAC7E;AAAA,EACL,GAAG,CAAC,SAAS,qBAAqB,iBAAiB,CAAC;AAEpD,SAAO;AACT;;;AF/BO,IAAM,yBAAyB,CAAC,UAAuC;AAC5E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,cAAc,IAAI,eAAe,wBAAwB;AACjE,QAAM,EAAE,QAAQ,IAAI,uBAAuB;AAC3C,QAAM,aAAa,oBAAoB,wBAAwB;AAG/D,QAAM,WAAW,gBAAgB;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,+BAA+B,qBAAqB;AAAA,IACxD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,4BAAwB;AAAA,IAC5B,MAAM,gBAAgB,gBAAgB;AAAA,IACtC,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,eAA8B;AAAA,IAClC,MACE,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,oBAAoB,EAAE,GAAG,sBAAsB,mBAAmB,WAAW;AAAA,IAC/E,CAAC;AAAA;AAAA,IAEH;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AG/FA,IAAAC,kBAAwC;AAqBjC,SAAS,4BAA4B,QAA2C;AACrF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,OAAO,IAAI,eAAe,6BAA6B;AAE/D,QAAM,eAAW,wBAA0B;AAAA,IACzC,cAAc;AAAA,IACd,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,eAAW,wBAAuB,MAAS;AACjD,QAAM,gBAAY,wBAAO,CAAC;AAE1B,uCAAgB,MAAM;AACpB,UAAM,eAAe,SAAS;AAC9B,UAAM,eAAe,SAAS;AAC9B,UAAM,cAAc,OAAO;AAC3B,UAAM,iBAAiB,YAAY,YAAY,SAAS,CAAC,KAAK,CAAC;AAC/D,UAAM,kBAAkB,eAAe,aAAa,SAAS,CAAC;AAC9D,UAAM,cAAc,wBAAwB;AAE5C,UAAM,cACJ,aAAa,eAAe,aAAa,eAAe,UAAU,UAClE;AAEF,QAAI,OAAO,iBAAiB,aAAa;AACvC,UAAI,aAAa,SAAS,YAAY,QAAQ;AAE5C,YAAI,iBAAiB,OAAO,eAAe,IAAI;AAC7C,cAAI,UAAU,UAAU,yBAAyB;AAC/C,kBAAM,kBAAkB,YAAY,eAAe,aAAa;AAChE,uBAAW,eAAe;AAAA,UAC5B;AAAA,QACF,OAEK;AACH,gBAAM,+BAA+B,eAAe,MAAM,OAAO,OAAO;AAExE,cAAI,gCAAgC,aAAa;AAC/C,2BAAe;AAAA,UACjB,OAAO;AACL,4BAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF,OAEK;AACH,cAAM,kBACJ,iBAAiB,kBAAkB,WACnC,eAAe,kBAAkB;AACnC,cAAM,gBAAgB,iBAAiB,gBAAgB,eAAe;AAEtE,aAAK,mBAAmB,kBAAkB,aAAa;AACrD,yBAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,aAAS,UAAU;AACnB,aAAS,UAAU;AAAA,EAErB,GAAG,CAAC,UAAU,UAAU,OAAO,QAAQ,CAAC;AAExC,SAAO,CAAC,mBAA2B;AACjC,cAAU,UAAU;AAAA,EACtB;AACF;;;AC5FA,IAAAC,kBAA+D;AAcxD,IAAM,yBAAyB,CAAC,WAAyC;AAC9E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,sBAAsB;AAAA,IACtB;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,0BAAS,KAAK;AAC1D,QAAM,CAAC,aAAa,cAAc,QAAI,0BAAkB;AAExD,QAAM,CAAC,+BAA+B,gCAAgC,QACpE,0BAAS,IAAI;AACf,QAAM,oBAAgB,wBAAO,KAAK;AAClC,QAAM,iBAAa,wBAAO,KAAK;AAE/B,QAAM,qBAAiB,6BAAY,MAAM;AACvC,QAAI,CAAC,aAAa,YAAY,gBAAgB,oBAAoB;AAChE;AAAA,IACF;AAEA,gBAAY,SAAS;AAAA,MACnB,KAAK,YAAY;AAAA,IACnB,CAAC;AACD,sBAAkB,KAAK;AAAA,EACzB,GAAG,CAAC,aAAa,cAAc,kBAAkB,CAAC;AAElD,uCAAgB,MAAM;AACpB,QAAI,aAAa;AACf,qBAAe,YAAY,sBAAsB,CAAC;AAClD,qBAAe;AAAA,IACjB;AAAA,EAEF,GAAG,CAAC,aAAa,YAAY,CAAC;AAE9B,QAAM,kBAAkB,4BAA4B;AAAA,IAClD;AAAA,IACA;AAAA,IACA,YAAY,CAAC,aAAa;AACxB,mBAAa,SAAS,EAAE,KAAK,SAAS,CAAC;AAAA,IACzC;AAAA,IAEA,yBAAyB,OAAO;AAAA,MAC9B,cAAc,aAAa,gBAAgB;AAAA,MAC3C,cAAc,aAAa,gBAAgB;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,MAAM,kBAAkB,IAAI;AAAA,EAC/C,CAAC;AAED,QAAM,eAAW;AAAA,IACf,CAAC,UAAyC;AACxC,YAAMC,WAAU,MAAM;AACtB,YAAM,YAAYA,SAAQ;AAE1B,sBAAgB,SAAS;AAEzB,YAAM,eAAeA,SAAQ;AAC7B,YAAM,eAAeA,SAAQ;AAE7B,YAAM,oBAAoB,cAAc;AACxC,oBAAc,UACZ,gBAAgB,YAAY,gBAAgB;AAC9C,iBAAW,UAAU,YAAY;AAEjC,UAAI,cAAc,SAAS;AACzB,0BAAkB,KAAK;AAAA,MACzB;AACA,UAAI,qBAAqB,CAAC,cAAc,SAAS;AAC/C,yCAAiC,KAAK;AAAA,MACxC,WAAW,CAAC,qBAAqB,cAAc,SAAS;AACtD,yCAAiC,IAAI;AAAA,MACvC;AAAA,IACF;AAAA,IACA,CAAC,iBAAiB,YAAY,eAAe,mBAAmB;AAAA,EAClE;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACrGA,IAAAC,kBAA4C;;;ACD5C,IAAAC,kBAAkB;AAGX,IAAM,gCACX;AAEK,IAAM,uBAAuB,CAAC,EAAE,SAAS,MAC9C,gCAAAC,QAAA,cAAC,SAAI,WAAW,iCAAgC,QAAS;;;ACP3D,IAAAC,kBAAkB;AAGX,IAAM,iCAAiC;AAavC,IAAM,0BAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AACF,MAAoC;AAClC,QAAM,EAAE,EAAE,IAAI,sBAAsB,yBAAyB;AAC7D,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,eAAY;AAAA;AAAA,IAEX,eAAe,YACZ,EAAE,+BAA+B,EAAE,OAAO,YAAY,CAAC,IACvD,EAAE,iBAAiB;AAAA,EACzB;AAEJ;;;AF1BA,IAAM,0CAA0C,CAACC,aAAqB;AACpE,QAAM,EAAE,QAAQ,aAAa,IAAIA,SAAQ,sBAAsB;AAC/D,SAAO,eAAe;AACxB;AAEA,IAAM,0CAA0C,CAC9CA,UACA,cACG;AACH,QAAM,EAAE,KAAK,UAAU,IAAIA,SAAQ,sBAAsB;AACzD,QAAM,EAAE,KAAK,gBAAgB,IAAI,UAAU,sBAAsB;AACjE,SAAO,YAAY;AACrB;AAQO,IAAM,gCAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AACF,MAA2C;AACzC,QAAM,EAAE,SAAS,IAAI,uBAAuB,4BAA4B;AACxE,QAAM,CAAC,MAAM,OAAO,QAAI,0BAAS,KAAK;AACtC,QAAM,+BAA2B,wBAAO,KAAK;AAC7C,QAAM,kCAAkC,OAAO,yBAAyB;AAExE,iCAAU,MAAM;AACd,QAAI,EAAE,eAAe,kCAAkC;AACrD,cAAQ,KAAK;AACb;AAAA,IACF;AAEA,UAAM,CAAC,YAAY,IAAI,SAAS,uBAAuB,6BAA6B;AACpF,QAAI,CAAC,aAAc;AAEnB,UAAM,CAAC,cAAc,IAAI,SAAS;AAAA,MAChC;AAAA,IACF;AACA,QAAI,CAAC,gBAAgB;AACnB,cAAQ,IAAI;AACZ;AAAA,IACF;AAEA,UAAM,yBACJ,wCAAwC,cAAc;AACxD,UAAM,yBAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AAEA;AAAA,MACE,aACI,0BAA0B,yBAC1B;AAAA,IACN;AAEA,UAAM,WAAW,IAAI;AAAA,MACnB,CAAC,aAAa;AACZ,YAAI,CAAC,SAAS,OAAQ;AACtB,cAAM,EAAE,oBAAoB,eAAe,IAAI,SAAS,CAAC;AACzD,YAAI,gBAAgB;AAClB,kBAAQ,KAAK;AACb;AAAA,QACF;AACA,cAAM,+BAA+B,mBAAmB,SAAS;AACjE,gBAAQ,cAAc,4BAA4B;AAClD,iCAAyB,UAAU;AAAA,MACrC;AAAA,MACA,EAAE,MAAM,aAAa;AAAA,IACvB;AACA,aAAS,QAAQ,cAAc;AAE/B,WAAO,MAAM;AACX,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,iCAAU,MAAM;AAOd,QACE,eACA,iCACA,yBAAyB,SACzB;AACA,cAAQ,IAAI;AACZ,+BAAyB,UAAU;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,+BAA+B,WAAW,CAAC;AAE/C,SAAO,EAAE,MAAM,QAAQ,gCAAgC;AACzD;;;AG9GA,IAAAC,kBAA0B;AAQ1B,IAAM,qBAAqB,CAAC,SAAkB,WAAmB;AAC/D,QAAM,2BAA2B,QAAQ,MAAM,eAAe,MAAM,EAAE,EAAE,CAAC,GAAG;AAC5E,QAAM,0BAA0B,QAAQ,MAAM,KAAK,MAAM,GAAG;AAC5D,SAAO,6BAA6B;AACtC;AAiBO,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,MAAyB;AACvB,QAAM,EAAE,OAAO,IAAI,eAAe,aAAa;AAC/C,QAAM,EAAE,UAAU,wBAAwB,IAAI,wBAAwB,aAAa;AACnF,QAAM,EAAE,QAAQ,IAAI,uBAAuB,aAAa;AAExD,iCAAU,MAAM;AACd,QAAI,CAAC,QAAQ,UAAU,GAAG,YAAa;AACvC,UAAM,iBAAiB,MACrB,CAAC,SAAS,UACV,CAAC,mBACD,CAAC,uBACD,iCACA,OAAO,MAAM,MACb,CAAC,mBAAmB,SAAS,OAAO,KAAK,EAAE;AAE7C,UAAM,qBAAqB,MAAM;AAC/B,UAAI,eAAe,EAAG,UAAS;AAAA,IACjC;AAEA,UAAM,mBAAmB,CAAC,UAAiB;AACzC,YAAM,qBACJ,CAAC,MAAM,SAAS,aAAa,MAAM,SAAS;AAE9C,UAAI,CAAC,iCAAiC,mBAAmB,SAAS,QAAQ;AACxE,gCAAwB,CAAC,SAAS;AAChC,gBAAM,sBAAsB,MAAM,mBAAmB;AACrD,gBAAM,sBAAsB;AAAA,YAC1B,QAAQ,MAAM;AAAA,YACd,MAAM;AAAA,UACR;AACA,iBAAO;AAAA,YACL,GAAI,QAAQ,CAAC;AAAA,YACb,WACE,MAAM,cACL,wBAAwB,KAAK,qBAAqB,aAC/C,IAAI,KAAK,oBAAoB,UAAU,IACvC,oBAAI,KAAK,CAAC;AAAA;AAAA,YAChB,iBAAiB,sBAAsB;AAAA,UACzC;AAAA,QACF,CAAC;AAAA,MACH,WAAW,sBAAsB,eAAe,GAAG;AACjD,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,YAAQ,GAAG,eAAe,gBAAgB;AAC1C,aAAS,iBAAiB,oBAAoB,kBAAkB;AAEhE,QAAI,eAAe,GAAG;AACpB,eAAS;AAAA,IACX;AAEA,WAAO,MAAM;AACX,cAAQ,IAAI,eAAe,gBAAgB;AAC3C,eAAS,oBAAoB,oBAAoB,kBAAkB;AAAA,IACrE;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,uBAAuB,UAA0B,YAA8B;AACtF,MAAI,CAAC,WAAY;AACjB,MAAI;AACJ,WAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,CAAC,KAAK,GAAI;AACd,QAAI,IAAI,OAAO,WAAW,IAAI;AAC5B,4BAAsB;AACtB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AC/GA,IAAAC,kBAAkB;AAelB,IAAM,gCAAgC,CAAC,UAAoC;AACzE,QAAM,EAAE,UAAU,SAAS,mBAAmB,KAAK,IAAI;AAEvD,MAAI,CAAC,iBAAkB,QAAO;AAE9B,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,MACX,eAAY;AAAA,MACZ;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAEO,IAAM,sBAAsB,gBAAAA,QAAM;AAAA,EACvC;AACF;;;ACnCA,IAAAC,kBAAkB;;;ACIlB,IAAMC,YAAW,CAAC,WAAqC;AAAA,EACrD,eAAe,MAAM;AACvB;AAEO,IAAM,mBAAmB,MAAsB;AACpD,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,SAAS,cAAc,OAAO,cAAc,OAAOA,SAAQ;AACjE,SAAO,OAAO;AAChB;;;ADFA,IAAM,sBAAsB,MAAM;AAChC,QAAM,sBAAsB,iBAAiB;AAC7C,QAAM,EAAE,EAAE,IAAI,sBAAsB;AAEpC,SACE,gCAAAC,QAAA,8BAAAA,QAAA,gBACG,oBAAoB,IAAI,CAAC,iBACxB,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR,KAAK,aAAa;AAAA,MAClB,MAAM,aAAa;AAAA;AAAA,IAElB,EAAE,wCAAwC,EAAE,aAAa,CAAC;AAAA,EAC7D,CACD,CACH;AAEJ;AAaO,IAAM,2BAA2B,CAAC,UAAyC;AAChF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,EAAE,IAAI,sBAAsB,0BAA0B;AAE9D,SACE,gCAAAD,QAAA,cAAC,SAAI,WAAU,kCACZ,cAAc,IAAI,CAAC,iBAClB,gCAAAA,QAAA,cAAC,sBAAmB,QAAQ,MAAM,KAAK,aAAa,IAAI,MAAM,aAAa,QACxE,aAAa,IAChB,CACD,GACD,gCAAAA,QAAA,cAAC,yBAAoB,GACrB,gCAAAA,QAAA,cAAC,sBAAiB,GAClB,gCAAAA,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,SAAS;AAAA,MACT,kBAAkB,kBAAkB;AAAA,MACpC;AAAA,MACA;AAAA;AAAA,IAEC,0BAA0B,EAAE,iBAAiB,IAAI,EAAE,eAAe;AAAA,EACrE,CACF;AAEJ;;;AE1EA,IAAAC,kBAAkB;;;ACAlB,IAAAC,kBAAkB;AAwBX,IAAM,YAAY,CAAC,EAAE,WAAW,OAAAC,OAAM,MAC3C,gCAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA;AAAA,EAEN,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAMD,UAAS;AAAA;AAAA,EACjB;AACF;AAGK,IAAME,aAAY,MACvB,gCAAAD,QAAA,cAAC,SAAI,MAAK,gBAAe,SAAQ,aAAY,OAAM,gCACjD,gCAAAA,QAAA,cAAC,UAAK,GAAE,qgBAAogB,CAC9gB;;;ADzBK,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,MAAuC;AACrC,QAAM,EAAE,0BAA0B,SAAS,IAAI;AAAA,IAC7C;AAAA,EACF;AACA,QAAM,EAAE,EAAE,IAAI,sBAAsB,4BAA4B;AAEhE,SACE,gCAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEZ,gCAAAA,QAAA,cAAC,YAAO,SAAS,MAAM,yBAAyB,iBAAiB,KAC9D,eAAe,YACZ,EAAE,oBAAoB,EAAE,OAAO,eAAe,EAAE,CAAC,IACjD,EAAE,iBAAiB,CACzB;AAAA,IACA,gCAAAA,QAAA,cAAC,YAAO,SAAS,MAAM,SAAS,KAC9B,gCAAAA,QAAA,cAACC,YAAA,IAAU,CACb;AAAA,EACF;AAEJ;;;AE3CA,IAAAC,kBAAmD;AASnD,IAAMC,sBAAqB,CAAC,UAAiB;AAC3C,MAAI,iBAAiB,cAAc,MAAM,WAAW,GAAG;AACrD,UAAM,eAAe;AAAA,EACvB;AACF;AA4CO,IAAM,iBAAiB,CAAC,UAAkD;AAC/E,QAAM;AAAA,IACJ;AAAA,IACA,SAASC,aAAY;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,iBAAiB,gBAAgB;AACvC,QAAM,qBAAqB,oBAAoB;AAC/C,QAAM,kBAAkB,eAAe;AACvC,QAAM,sBAAsB,mBAAmB;AAE/C,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,0BAA6B,IAAI;AAC/E,QAAM,qBAAiB,wBAA2B,MAAS;AAC3D,QAAM,4BAAwB,wBAA2B,MAAS;AAElE,QAAM,wBAAoB,wBAAmB,MAAS;AACtD,oBAAkB,UAAU,MAAM;AAChC,UAAMC,WAAU;AAEhB,QAAI,CAACA,YAAWA,SAAQ,iBAAiB,MAAM;AAC7C;AAAA,IACF;AAGA,UAAM,gBAAgBA,SAAQ;AAE9B,UAAM,SACJA,SAAQ,eAAe,cAAc,YAAY,cAAc;AACjE,UAAM,gBAAgB,cAAc;AAEpC,QAAI,gBAAgB;AAClB,qBAAe,QAAQ,eAAe,SAAS;AAAA,IACjD;AAEA,QAAI,UAAW;AAEf,QACE,eAAe,YAAY,UAC3B,sBAAsB,YAAY;AAElC;AACF,mBAAe,UAAU;AACzB,0BAAsB,UAAU;AAGhC,QACE,gBAAgB,OAAO,SAAS,KAChC,OAAO,uBAAuB,cAC9B,qBACA;AACA,yBAAmB;AAAA,IACrB;AAEA,QACE,SAAS,OAAO,SAAS,KACzB,OAAO,mBAAmB,cAC1B,iBACA;AACA,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,iCAAU,MAAM;AACd;AAAA,MACE;AAAA,QACE,CAAC,EAAE,aAAa,GAAG,EAAE,YAAY,CAAC;AAAA,QAClC,CAAC,EAAE,cAAc,GAAG,EAAE,aAAa,CAAC;AAAA,QACpC,CAAC,EAAE,QAAQ,GAAG,EAAE,gBAAgB,CAAC;AAAA,QACjC,CAAC,EAAE,SAAS,GAAG,EAAE,iBAAiB,CAAC;AAAA,MACrC;AAAA,MACA;AAAA,IACF;AAAA,EAEF,GAAG,CAAC,CAAC;AAEL,iCAAU,MAAM;AACd,UAAM,gBAAgB,iBAAiB;AAEvC,QAAI,CAAC,cAAe;AAEpB,UAAM,iBAAiB,MAAM,kBAAkB,UAAU;AAEzD,kBAAc,iBAAiB,UAAU,gBAAgB,UAAU;AACnE,kBAAc,iBAAiB,UAAU,gBAAgB,UAAU;AACnE,mBAAe;AAEf,WAAO,MAAM;AACX,oBAAc,oBAAoB,UAAU,gBAAgB,UAAU;AACtE,oBAAc,oBAAoB,UAAU,gBAAgB,UAAU;AAAA,IACxE;AAAA,EACF,GAAG,CAAC,aAAa,iBAAiB,UAAU,CAAC;AAE7C,iCAAU,MAAM;AACd,UAAM,gBAAgB,iBAAiB;AAEvC,QAAI,CAAC,cAAe;AAEpB,kBAAc,iBAAiB,SAASF,qBAAoB,EAAE,SAAS,MAAM,CAAC;AAE9E,WAAO,MAAM;AACX,oBAAc,oBAAoB,SAASA,qBAAoB,UAAU;AAAA,IAC3E;AAAA,EACF,GAAG,CAAC,iBAAiB,UAAU,CAAC;AAEhC,SACE,gCAAAG,QAAA,cAACF,YAAA,EAAW,GAAG,cAAc,KAAK,sBAC/B,MACA,QACA,QACH;AAEJ;;;ACzLA,IAAAG,kBAAkB;AAClB,IAAAC,gBAAiB;AAYjB,IAAM,qBAAqB,CAAC,UAAoB;AAC9C,QAAM,EAAE,EAAE,IAAI,sBAAsB;AAEpC,MAAI,CAAC,MAAM,OAAQ,QAAO;AAE1B,QAAM,CAACC,OAAM,GAAG,IAAI,IAAI;AAExB,MAAI,MAAM,WAAW;AACnB,WAAO,EAAE,2BAA2B;AAAA,MAClC,MAAMA;AAAA,IACR,CAAC;AAEH,QAAM,mBAAmB;AAEzB,MAAI,MAAM,SAAS;AACjB,WAAO,EAAE,sCAAsC;AAAA,MAC7C,OAAO,MAAM,MAAM,GAAG,gBAAgB,EAAE,KAAK,IAAI,EAAE,KAAK;AAAA,IAC1D,CAAC;AAEH,SAAO,EAAE,4CAA4C;AAAA,IACnD,MAAMA;AAAA,IACN,OAAO,KAAK,KAAK,IAAI,EAAE,KAAK;AAAA,EAC9B,CAAC;AACH;AAKA,IAAM,4BAA4B,CAAC,UAAgC;AACjE,QAAM,EAAE,WAAW,IAAI;AAEvB,QAAM,EAAE,eAAe,OAAO,IAAI,uBAAuB,iBAAiB;AAC1E,QAAM,EAAE,OAAO,IAAI,eAAe,iBAAiB;AACnD,QAAM,EAAE,SAAS,CAAC,EAAE,IAAI,iBAAiB,iBAAiB;AAE1D,QAAM,kBAAkB,CAAC,aACrB,OAAO,OAAO,MAAM,EAAE;AAAA,IACpB,CAAC,EAAE,WAAW,KAAK,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,CAAC;AAAA,EAC5D,IACA,CAAC;AAEL,QAAM,iBAAiB,aACnB,OAAO,OAAO,MAAM,EAAE;AAAA,IACpB,CAAC,EAAE,WAAW,KAAK,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,cAAc,QAAQ;AAAA,EACjF,IACA,CAAC;AAEL,QAAM,kBAAkB,aAAa,iBAAiB,iBACnD,IAAI,CAAC,EAAE,KAAK,MAAM,MAAM,QAAQ,MAAM,EAAE,EACxC,OAAO,OAAO;AAEjB,QAAM,oBAAoB,mBAAmB,cAAc;AAE3D,QAAM,iBACH,cAAc,eAAe,UAAY,CAAC,cAAc,gBAAgB;AAE3E,MAAI,eAAe,kBAAkB,OAAO;AAC1C,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,eAAgB,QAAO;AAC5B,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,8BAA8B;AAAA,QAC5C,sCAAsC;AAAA,MACxC,CAAC;AAAA,MACD,eAAY;AAAA;AAAA,IAEZ,gCAAAD,QAAA,cAAC,SAAI,WAAU,sCACb,gCAAAA,QAAA,cAAC,UAAK,WAAU,mCAAkC,GAClD,gCAAAA,QAAA,cAAC,UAAK,WAAU,mCAAkC,GAClD,gCAAAA,QAAA,cAAC,UAAK,WAAU,mCAAkC,CACpD;AAAA,IACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,qCAAoC,eAAY,kBAC5D,iBACH;AAAA,EACF;AAEJ;AAEO,IAAM,kBAAkB,gBAAAA,QAAM;AAAA,EACnC;AACF;;;AC9FA,IAAAE,kBAAgC;;;ACDhC,IAAAC,kBAAkB;AAkBlB,IAAM,0BAA0B,CAAC,UAA8B;AAC7D,QAAM;AAAA,IACJ,UAAAC;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,UAAAC,YAAW;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,EAAE,GAAG,gBAAgB,IAAI,sBAAsB,eAAe;AAEpE,QAAM,gBAAgB,cAAc;AAAA,IAClC,UAAAD;AAAA,IACA,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,yBAAyB;AAAA,EAC3B,CAAC;AAED,SACE,gCAAAE,QAAA,cAAC,SAAI,WAAU,4BAA2B,eAAY,qBAClDD,cAAa,WAAWA,cAAa,aACrC,gCAAAC,QAAA,cAAC,QAAG,WAAU,iCAAgC,GAEhD,gCAAAA,QAAA,cAAC,SAAI,WAAU,mCACZ,SAAS,GAAG,EAAE,KAAK,CAAC,MAAM,aAAa,KAAK,aAC/C,IACED,cAAa,UAAUA,cAAa,aACpC,gCAAAC,QAAA,cAAC,QAAG,WAAU,iCAAgC,CAElD;AAEJ;AAKO,IAAM,gBAAgB,gBAAAA,QAAM;AAAA,EACjC;AACF;;;AC5DA,IAAAC,kBAAkB;AAuBlB,IAAM,2BAA2B,CAAC,UAA+B;AAC/D,QAAM;AAAA,IACJ,QAAAC,UAAS;AAAA,IACT,UAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,EACf,IAAI;AAEJ,QAAM,EAAE,GAAG,gBAAgB,IAAI,sBAAsB,gBAAgB;AACrE,QAAM,EAAE,aAAa,IAAI,OAAO,KAAK,IAAI;AACzC,QAAM,iBAAiB,EAAE,kBAAkB,WAAW,SAAS,GAAG,gBAAgB;AAElF,MAAI,SAAS;AACX,WACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,6BAA4B,eAAY,oBACrD,gCAAAA,QAAA,cAAC,SAAI,WAAU,qCACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,mCAAkC,GAChD,aACC,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,yBAAyB,EAAE,QAAQ,QAAQ,QAAQ,GAAG;AAAA,QACtD,0BAAsB;AAAA;AAAA,IACxB,IAEA,gCAAAA,QAAA,cAAC,WAAG,QAAQ,IAAK,GAEnB,gCAAAA,QAAA,cAAC,SAAI,WAAU,mCAAkC,CACnD,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,qCACb,gCAAAA,QAAA,cAAC,gBACE,cAAc;AAAA,MACb,GAAG;AAAA,MACH,UAAAD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,yBAAyB;AAAA,IAC3B,CAAC,CACH,CACF,CACF;AAGJ,MAAI,OAAO,SAAS,oBAAoB,OAAO,SAAS,gBAAgB;AACtE,UAAME,QAAO,MAAM,MAAM,QAAQ,MAAM,MAAM;AAC7C,UAAM,WAAW,GAAGA,KAAI,IACtB,MAAM,SAAS,iBAAiB,wBAAwB,2BAC1D;AAEA,WACE,gCAAAD,QAAA,cAAC,SAAI,WAAU,8CACb,gCAAAA,QAAA,cAACF,SAAA,EAAO,OAAO,MAAM,MAAM,OAAO,MAAMG,OAAM,MAAM,MAAM,MAAM,GAChE,gCAAAD,QAAA,cAAC,SAAI,WAAU,uDACb,gCAAAA,QAAA,cAAC,QAAG,WAAU,wDACX,QACH,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,oDACZ,cAAc,EAAE,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CACpD,CACF,CACF;AAAA,EAEJ;AAEA,SAAO;AACT;AAEO,IAAM,iBAAiB,gBAAAA,QAAM;AAAA,EAClC;AACF;;;AF1CO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AACtB,GAA0B;AACxB,QAAM;AAAA,IACJ,eAAAE,iBAAgB;AAAA,IAChB;AAAA,IACA,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,yBAAAC,2BAA0B;AAAA,EAC5B,IAAI;AAEJ,QAAM,mBAAmB,CAAC;AAC1B,MAAI;AACJ,MAAI,kBAAkB;AACtB,WAASC,SAAQ,GAAGA,SAAQ,SAAS,QAAQA,UAAS;AACpD,UAAM,UAAU,SAASA,MAAK;AAC9B,QAAI,uBAAuB,OAAO,GAAG;AACnC,uBAAiB;AAAA,QACf,gCAAAC,QAAA,cAAC,mBAAgB,cAAYD,QAAO,KAAK,GAAG,QAAQ,KAAK,YAAY,CAAC,QACpE,gCAAAC,QAAA;AAAA,UAACH;AAAA,UAAA;AAAA,YACC,MAAM,QAAQ;AAAA,YACd,YAAY,aAAa;AAAA,YACzB,QAAQ,QAAQ;AAAA;AAAA,QAClB,CACF;AAAA,MACF;AAAA,IACF,WAAW,eAAe,OAAO,GAAG;AAClC,UAAI,iBAAiB;AACnB,yBAAiB;AAAA,UACf,gCAAAG,QAAA,cAAC,mBAAgB,cAAYD,QAAO,KAAI,WACtC,gCAAAC,QAAA,cAAC,qBAAgB,CACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,QAAQ,SAAS,UAAU;AACpC,uBAAiB;AAAA,QACf,gCAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,cAAYD;AAAA,YACZ,mBAAiB,QAAQ;AAAA,YACzB,KAAK,QAAQ,MAAM,QAAQ,WAAW,YAAY;AAAA;AAAA,UAElD,gCAAAC,QAAA,cAAC,iBAAc,SAAkB,YAAY,aAAa,YAAY;AAAA,QACxE;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,CAAC,cAAc;AACjB,uBAAe;AAAA,MACjB;AACA,YAAM,cAA0B,mBAAmB,QAAQ,EAAE,KAAK;AAClE,YAAM,eACJ,eAAe,WAAW,8BAA8B,WAAW;AAErE,YAAM,uBAAuB,wBAAwB;AAAA,QACnD,sBAAsB,sBAAsB;AAAA,QAC5C,gBAAgB,CAAC,CAAC,cAAc,MAAM,aAAa,OAAO,QAAQ;AAAA,QAClE,cAAc,sBAAsB;AAAA,QACpC,mBAAmB,sBAAsB;AAAA,QACzC;AAAA,QACA;AAAA,QACA,oBAAoB,sBAAsB;AAAA,MAC5C,CAAC;AAED,uBAAiB;AAAA,QACf,gCAAAA,QAAA,cAAC,4BAAS,KAAK,QAAQ,MAAM,QAAQ,WAAW,YAAY,KACzD,wBAAwBF,4BACvB,gCAAAE,QAAA,cAAC,mBAAgB,WAAU,8DACzB,gCAAAA,QAAA;AAAA,UAACF;AAAA,UAAA;AAAA,YACC,aAAa,sBAAsB;AAAA;AAAA,QACrC,CACF,GAEF,gCAAAE,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,YACX,cAAYD;AAAA,YACZ,mBAAiB,QAAQ;AAAA,YACzB,eAAa;AAAA;AAAA,UAEb,gCAAAC,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,aAAa,6BAA6B,QAAQ,EAAE,KAAK,CAAC;AAAA,cAC1D,aAAa,CAAC,WAAW;AAAA,cACzB;AAAA,cACA;AAAA,cACA;AAAA,cACA,QAAQ,SAAS,QAAQ,EAAE,KAAK,CAAC;AAAA,cAChC,GAAG;AAAA;AAAA,UACN;AAAA,QACF,CACF;AAAA,MACF;AACA,wBAAkB;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;;;AGzJA,IAAAC,iBAAuB;AACvB,IAAAC,kBAAwB;AAMjB,IAAM,cAAc,CAAC,QAAiB;AAE3C,QAAM,SAAK,yBAAQ,UAAM,uBAAO,GAAG,CAAC,GAAG,CAAC;AAExC,SAAO;AACT;;;ACZA,IAAAC,kBAAwB;;;ACCjB,IAAM,cAAc,CACzB,OACA,YACkB;AAClB,WAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAC7C,QAAI,QAAQ,MAAM,CAAC,CAAC,GAAG;AACrB,aAAO,MAAM,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;;;ADPO,IAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AACF,UAIE;AAAA,EACE,MACE,YAAY,YAAY,UAAU,CAAC,SAAS,IAAI,QAAQ,IAAI,KAAK,QAAQ,SAAS;AAAA,EACpF,CAAC,UAAU,SAAS;AACtB;;;A3CmCF,IAAM,yBAAyB,CAAC,UAAuC;AACrE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,uBAAuB;AAAA,IACvB;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA,sBAAsB;AAAA,IACtB,0BAA0B;AAAA,IAC1B;AAAA,IACA,6BAA6B;AAAA,MAC3B,WAAW,0BAA0B;AAAA,MACrC,GAAG;AAAA,IACL,IAAI,CAAC;AAAA,IACL,sBAAsB,MAAM,QAAQ,QAAQ;AAAA,IAC5C,UAAU;AAAA,IACV,eAAe;AAAA;AAAA,IACf;AAAA,IACA,iBAAiB,OAAO,KAAK,eAAe;AAAA,IAC5C,eAAe;AAAA,IACf,WAAW,CAAC;AAAA,IACZ,gBAAgB;AAAA,IAChB;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,EACf,IAAI;AAEJ,QAAM,CAAC,aAAa,cAAc,IAAI,gBAAAC,QAAM,SAAgC,IAAI;AAEhF,QAAM,EAAE,cAAc,IAAI,eAAe,aAAa;AAEtD,QAAM;AAAA,IACJ,qBAAAC,uBAAsB;AAAA,IACtB,kBAAAC,oBAAmB;AAAA,IACnB,sBAAAC,wBAAuB;AAAA,IACvB,0BAAAC,4BAA2B;AAAA,IAC3B,qBAAqB;AAAA,IACrB,qBAAAC,uBAAsB;AAAA,IACtB,iBAAAC,mBAAkB;AAAA,IAClB,4BAAAC,8BAA6B;AAAA,EAC/B,IAAI,oBAAoB,aAAa;AAErC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,uBAAuB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA,qBAAqB,MAAM;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,QAAM,EAAE,MAAM,+BAA+B,IAAI,8BAA8B;AAAA,IAC7E;AAAA,IACA,YAAY,CAAC,CAAC;AAAA,IACd,aAAa,sBAAsB;AAAA,EACrC,CAAC;AAED,cAAY;AAAA,IACV;AAAA,IACA,qBAAqB;AAAA,IACrB,iBAAiB,CAAC,CAAC,sBAAsB;AAAA,EAC3C,CAAC;AAED,QAAM,EAAE,oBAAoB,UAAU,iBAAiB,IAAI,oBAAoB;AAAA,IAC7E;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB,kBAAkB;AAAA,IACvC;AAAA,IACA,WAAW,QAAQ,UAAU,EAAE,MAAM;AAAA,EACvC,CAAC;AAED,QAAM,WAAW,uBAAuB;AAAA,IACtC;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,MACpB,6BAA6B,MAAM;AAAA,MACnC,8BAA8B,MAAM;AAAA,MACpC,sBAAsB,MAAM;AAAA,MAC5B,uBAAuB,MAAM;AAAA,MAC7B,YAAY,MAAM;AAAA,MAClB,mCAAmC,MAAM;AAAA,MACzC,iCAAiC,MAAM;AAAA,MACvC,mCAAmC,MAAM;AAAA,MACzC,uCAAuC,MAAM;AAAA,MAC7C,yCACE,MAAM;AAAA,MACR,8BAA8B,MAAM;AAAA,MACpC,gCAAgC,MAAM;AAAA,MACtC,gCAAgC,MAAM;AAAA,MACtC,SAAS,MAAM;AAAA,MACf;AAAA,MACA,iBAAiB;AAAA,MACjB,mBAAmB,MAAM;AAAA,MACzB,iBAAiB,MAAM;AAAA,MACvB,iBAAiB,MAAM;AAAA,MACvB,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,MACnB,YAAY,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA,YAAY,MAAM;AAAA,MAClB,kBAAkB,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,mBAAmB,eAAe,eAAe;AAEvD,QAAM,WAAW,gBAAAP,QAAM,YAAY,MAAM;AACvC,QAAI,kBAAkB;AACpB,uBAAiB,YAAY;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,kBAAkB,YAAY,CAAC;AAEnC,QAAM,gBAAgB,gBAAAA,QAAM,YAAY,MAAM;AAC5C,QAAI,uBAAuB;AACzB,4BAAsB,YAAY;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,uBAAuB,YAAY,CAAC;AAExC,QAAM,iCAAiC,gBAAAA,QAAM,YAAY,YAAY;AACnE,QAAI,cAAc;AAChB,YAAM,oBAAoB;AAAA,IAC5B,OAAO;AACL,qBAAe;AAAA,IACjB;AAAA,EAEF,GAAG,CAAC,gBAAgB,YAAY,CAAC;AAEjC,kBAAAA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,sBAAsB;AACxB,YAAMQ,WAAU,aAAa;AAAA,QAC3B,qBAAqB,oBAAoB;AAAA,MAC3C;AACA,MAAAA,UAAS,eAAe,EAAE,OAAO,SAAS,CAAC;AAAA,IAC7C;AAAA,EAEF,GAAG,CAAC,oBAAoB,CAAC;AAEzB,QAAM,KAAK,YAAY;AAEvB,QAAM,0BAA0B,SAAS,WAAW,KAAK,CAAC;AAC1D,QAAM,kBAAkB,aACpB,sCAAsC,EAAE,KACxC,+BAA+B,EAAE;AAErC,SACE,gCAAAR,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA,mBAAmB;AAAA,QACnB;AAAA,MACF;AAAA;AAAA,IAEA,gCAAAA,QAAA,cAACG,uBAAA,MACC,gCAAAH,QAAA,cAAC,yBAAsB,IAAI,mBACxB,CAAC,cAAc,kCACd,gCAAAA,QAAA;AAAA,MAACO;AAAA,MAAA;AAAA,QACC,aAAa,sBAAsB;AAAA;AAAA,IACrC,GAEF,gCAAAP,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,cAAAS,SAAK,kBAAkB,eAAe,UAAU;AAAA,QAC3D;AAAA,QACA,KAAK;AAAA,QACL,UAAU;AAAA;AAAA,MAET,0BACC,gCAAAT,QAAA,cAACC,sBAAA,EAAoB,UAAU,aAAa,WAAW,WAAW,IAElE,gCAAAD,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,eAAY;AAAA,UACZ,aAAa,MAAM;AAAA,UACnB,iBAAiB,MAAM;AAAA,UACvB,MAAM,MAAM;AAAA,UACZ,WAAW,MAAM;AAAA,UACjB,QACE,gCAAAA,QAAA,cAAC,SAAI,WAAU,2BAA0B,KAAI,uBAC1C,MAAM,eAAe,gCAAAA,QAAA,cAACE,mBAAA,EAAiB,MAAM,IAAI,CACpD;AAAA,UAEF,cAAc;AAAA,UACd,kBAAkB;AAAA,UAClB,WAAW;AAAA,UACV,GAAG;AAAA;AAAA,QAEJ,gCAAAF,QAAA,cAAC,sBAAmB,WAAU,kBAC3B,QACH;AAAA,QACA,gCAAAA,QAAA,cAACM,kBAAA,EAAgB,YAAwB;AAAA,QAEzC,gCAAAN,QAAA,cAAC,SAAI,KAAI,UAAS;AAAA,MACpB;AAAA,IAEJ,CACF,CACF;AAAA,IACA,gCAAAA,QAAA;AAAA,MAACI;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,yBAAyB;AAAA,QACzB,qBAAqBC;AAAA,QACrB;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,QACA,aAAa,aAAa,SAAY,sBAAsB;AAAA;AAAA,IAC9D;AAAA,EACF;AAEJ;AA0GO,IAAM,cAAc,CAAC,UAA4B;AACtD,QAAM,EAAE,qBAAqB,UAAU,cAAc,IACnD,wBAAwB,aAAa;AAEvC,QAAM;AAAA,IACJ,SAAS;AAAA;AAAA,IACT,OAAO;AAAA;AAAA,IACP,UAAU;AAAA;AAAA,IACV,GAAG;AAAA,EACL,IAAI,uBAAuB,aAAa;AAExC,SACE,gCAAAL,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MACH,GAAG;AAAA;AAAA,EACN;AAEJ;;;A6CraA,IAAAU,kBAA2C;AAC3C,IAAAC,gBAAiB;AASjB,IAAM,iCAAiC,CACrC,UAIG;AACH,QAAM,EAAE,+BAA+B,SAAS,WAAW,IAAI;AAE/D,QAAM,EAAE,SAAS,eAAe,OAAO,IAAI,eAAe;AAC1D,QAAM,EAAE,OAAO,IAAI,uBAAuB;AAC1C,QAAM,CAAC,aAAa,cAAc,QAAI,0BAAS,eAAe,YAAY,KAAK,CAAC;AAChF,QAAM,CAAC,YAAY,aAAa,QAAI,0BAAS,QAAQ,eAAe,CAAC;AACrE,QAAM,gBAAgB,aAAa,oBAAoB;AAEvD,iCAAU,MAAM;AACd,UAAM,cAAc,CAAC,UAAiB;AACpC,YAAM,6BAA6B,MAAM,QAAQ,eAAe;AAChE,YAAM,mBAAmB,MAAM,MAAM,OAAO,OAAO,MAAM;AAEzD,YAAM,eAAe,CAAC,CAAC;AACvB,YAAM,oBAAoB,CAAC,CAAC,MAAM,SAAS;AAC3C,YAAM,wCACJ,gBAAgB,CAAC,cAAc;AAEjC,UACE,iCACA,8BACA,oBACA,uCACA;AACA;AAAA,MACF;AAEA,UAAI,MAAM,SAAS,eAAe;AAEhC,uBAAe,CAAC,SAAS,OAAO,CAAC;AAAA,MACnC,WAAW,MAAM,SAAS,OAAO,QAAQ,IAAI;AAC3C,cAAM,gBAAgB,MAAM,SAAS,eAAe;AACpD,uBAAe,MAAM,gBAAgB,UAAU;AAAA,MACjD;AAAA,IACF;AACA,WAAO,GAAG,eAAe,WAAW;AAEpC,WAAO,MAAM;AACX,aAAO,IAAI,eAAe,WAAW;AAAA,IACvC;AAAA,EAEF,GAAG,CAAC,eAAe,+BAA+B,eAAe,YAAY,MAAM,CAAC;AAEpF,iCAAU,MAAM;AACd,QAAI,+BAA+B;AACjC,qBAAe,CAAC;AAChB,oBAAc,QAAQ,eAAe,CAAC;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,+BAA+B,MAAM,CAAC;AAE1C,MAAI,8BAA+B,QAAO;AAE1C,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,sCACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA;AAAA;AAAA;AAAA,MAIX,eAAY;AAAA,MACZ;AAAA;AAAA,IAEA,gCAAAA,QAAA,cAAC,eAAU;AAAA,IACV,cAAc,KACb,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,cAAAC;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA,eAAa;AAAA;AAAA,MAEZ;AAAA,IACH;AAAA,EAEJ,CACF;AAEJ;AAEO,IAAM,uBAAuB,gBAAAD,QAAM;AAAA,EACxC;AACF;;;ACjGA,IAAAE,kBAA+D;AAQ/D,4BAAyB;;;ACTzB,IAAAC,kBAA4C;AAIrC,SAAS,0BACd,UACA,eACA,cACA;AACA,QAAM,CAAC,yBAAyB,0BAA0B,QAAI,0BAAS,KAAK;AAC5E,QAAM,CAAC,+BAA+B,gCAAgC,QACpE,0BAAS,IAAI;AAIf,QAAM,eAAW,wBAAO,KAAK;AAE7B,QAAM,oBAAgB,wBAAO,EAAE;AAC/B,QAAM,eAAW,wBAAO,KAAK;AAE7B,iCAAU,MAAM;AACd,QAAI,cAAc;AAChB,iCAA2B,IAAI;AAC/B;AAAA,IACF;AAEA,QAAI,CAAC,UAAU,OAAQ;AAEvB,UAAM,cAAc,SAAS,SAAS,SAAS,CAAC;AAChD,UAAM,gBAAgB,cAAc;AACpC,kBAAc,UAAU,YAAY,MAAM;AAG1C,QAAI,YAAY,OAAO,cAAe;AAGtC,QAAI,SAAS,QAAS;AAGtB,QAAK,YAA6B,MAAM,OAAO,iBAAiB,SAAS,SAAS;AAEhF,iCAA2B,IAAI;AAAA,IACjC;AACA,aAAS,UAAU;AAAA,EACrB,GAAG,CAAC,eAAe,UAAU,YAAY,CAAC;AAE1C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACrDA,IAAAC,kBAAgC;AAIhC,IAAM,iCAAiC;AAAA,EACrC,QAAQ;AAAA,EACR,SAAS;AACX;AAEO,SAAS,0BACd,UACA,kBACA;AACA,QAAM,wBAAwB,mBAAmB,IAAI;AACrD,QAAM,oCAAgC,wBAAwB,MAAS;AACvE,QAAM,4CAAwC,wBAAwB,MAAS;AAC/E,QAAM,gCAA4B,wBAAO,CAAC;AAE1C,QAAM,wBAAoB,yBAAQ,MAAM;AACtC,QAAI,CAAC,YAAY,CAAC,SAAS,QAAQ;AACjC,gCAA0B,UAAU;AACpC,aAAO;AAAA,IACT;AAEA,UAAM,sBAAsB,WAAW,qBAAqB;AAE5D,UAAM,gBACJ,qBAAqB,OAAO,sCAAsC,SAAS;AAa7E,UAAM,4BAA4B,eAAe,mBAAmB,IAChE,oBAAoB,SACpB;AACJ,UAAM,6CAA6C,CAAC,EAClD,6BACA,+BAA+B,yBAAyB;AAG1D,QAAI,iBAAiB,4CAA4C;AAC/D,aAAO,0BAA0B;AAAA,IACnC;AAEA,QAAI,CAAC,8BAA8B,SAAS;AAC1C,oCAA8B,UAAU;AAAA,IAC1C;AACA,0CAAsC,UAAU;AAGhD,aACM,wBAAwB,0BAA0B,SACtD,wBAAwB,SAAS,QACjC,yBAAyB,GACzB;AACA,YAAM,kCACJ,SAAS,qBAAqB,EAAE,OAAO,8BAA8B,SAAS;AAEhF,UAAI,iCAAiC;AACnC,kCAA0B,UAAU,wBAAwB;AAC5D,eAAO,0BAA0B;AAAA,MACnC;AAAA,IACF;AAGA,kCAA8B,UAAU;AACxC,8BAA0B,UAAU;AACpC,WAAO;AAAA,EAIT,GAAG,CAAC,uBAAuB,UAAU,UAAU,MAAM,CAAC;AAEtD,SAAO;AACT;;;AClFA,IAAAC,kBAAkC;AAI3B,SAAS,6BACd,UACA,eACA;AACA,QAAM,4BAAwB,wBAAO,EAAE;AACvC,QAAM,6BAAyB,wBAAO,KAAK;AAE3C,WAAS,0BAA0B;AACjC,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,YAAM,cAAc,SAAS,SAAS,SAAS,CAAC;AAEhD,UACG,YAA6B,MAAM,OAAO,iBAC3C,sBAAsB,YAAY,YAAY,IAC9C;AACA,8BAAsB,UAAU,YAAY;AAC5C,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,iCAAU,MAAM;AACd,QAAI,YAAY,SAAS,UAAU,CAAC,uBAAuB,SAAS;AAClE,6BAAuB,UAAU;AACjC,8BAAwB;AAAA,IAC1B;AAAA,EAEF,GAAG,CAAC,UAAU,UAAU,MAAM,CAAC;AAE/B,SAAO;AACT;;;ACnCA,IAAAC,kBAAoC;AAM7B,IAAM,kBAAkB,CAAC,yBAAkC;AAChE,QAAM,CAAC,qBAAqB,sBAAsB,QAAI,0BAAuB;AAE7E,QAAM,EAAE,OAAO,IAAI,eAAe,iBAAiB;AAEnD,iCAAU,MAAM;AACd,QAAI,CAAC,qBAAsB;AAC3B,UAAM,cAA4B,CAAC,UAAU;AAC3C,YAAM,EAAE,SAAS,KAAK,IAAI;AAE1B,UAAI,SAAS,YAAY,WAAW,MAAM,OAAO,OAAO,QAAQ;AAC9D,+BAAuB,MAAS;AAAA,MAClC;AAAA,IACF;AAEA,WAAO,GAAG,eAAe,WAAW;AACpC,WAAO,MAAM,OAAO,IAAI,eAAe,WAAW;AAAA,EACpD,GAAG,CAAC,QAAQ,oBAAoB,CAAC;AAEjC,SAAO;AAAA,IACL;AAAA,IACA,wBAAwB,uBAAuB,yBAAyB;AAAA,EAC1E;AACF;;;AC7BA,IAAAC,kBAA4C;AAOrC,IAAM,mBAAmB,CAAC,EAAE,SAAS,MAA8B;AAIxE,QAAM,CAAC,eAAe,gBAAgB,QAAI,0BAAS,CAAC,oBAAI,KAAK,CAAC;AAC9D,QAAM,qBAAiB,wBAA2B,MAAS;AAE3D,iCAAU,MAAM;AACd,UAAM,gBAAgB,UAAU;AAAA,MAC9B,CAAC,YAAY,QAAQ,OAAO,eAAe;AAAA,IAC7C;AACA,QAAI,CAAC,eAAe;AAClB,uBAAiB,CAAC,oBAAI,KAAK,CAAC;AAAA,IAC9B;AACA,mBAAe,UAAU,WAAW,CAAC,GAAG;AAAA,EAC1C,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;AC3BA,IAAAC,kBAA4C;AAUrC,IAAM,gCAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AACF,MAA2C;AACzC,QAAM,CAAC,iCAAiC,kCAAkC,QACxE,0BAAS,KAAK;AAEhB,QAAM,iCAA6B,wBAA2B,MAAS;AAEvE,6BAA2B,UAAU,CAAC,UAAiB;AACrD,QACE,CAAC,gCACD,CAAC,mCACD,MAAM,WAAW,QACjB;AACA;AAAA,IACF;AAEA,eAAW,gBAAgB,GAAG;AAAA,EAChC;AAEA,iCAAU,MAAM;AACd,uCAAmC,IAAI;AAAA,EACzC,GAAG,CAAC,QAAQ,CAAC;AAEb,iCAAU,MAAM;AACd,UAAM,cAAc,CAAC,UAAiB;AACpC,iCAA2B,UAAU,KAAK;AAAA,IAC5C;AAEA,UAAM,aAAa,MAAM;AACvB,yCAAmC,KAAK;AAAA,IAC1C;AAEA,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,iBAAiB,SAAS,WAAW;AAC5C,aAAO,iBAAiB,QAAQ,UAAU;AAAA,IAC5C;AAEA,WAAO,MAAM;AACX,aAAO,oBAAoB,SAAS,WAAW;AAC/C,aAAO,oBAAoB,QAAQ,UAAU;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,CAAC;AACP;;;ACvDA,IAAAC,kBAAiD;AAsB1C,IAAM,2CAA2C,CAAC;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AACF,MAA2C;AACzC,QAAM,CAAC,MAAM,OAAO,QAAI,0BAAS,KAAK;AAEtC,QAAM,2CAAuC;AAAA,IAC3C,CAAC,qBAAwC;AACvC,UAAI,CAAC,YAAa;AAClB,YAAM,uBAAuB,iBAAiB,CAAC;AAC/C,YAAM,sBAAsB,iBAAiB,MAAM,EAAE,EAAE,CAAC;AACxD,UAAI,EAAE,wBAAwB,qBAAsB;AAEpD,YAAM,2BAA2B,IAAI;AAAA,QAClC,qBAAsC,cAAc;AAAA,MACvD,EAAE,QAAQ;AACV,YAAM,0BAA0B,IAAI;AAAA,QACjC,oBAAqC,cAAc;AAAA,MACtD,EAAE,QAAQ;AACV,YAAM,eAAe,IAAI,KAAK,YAAY,CAAC,EAAE,QAAQ;AAErD,YAAM,yBACJ,CAAC,CAAC,gBAAgB,2BAA2B;AAC/C,YAAM,yBACJ,CAAC,CAAC,gBAAgB,0BAA0B;AAE9C;AAAA,QACE,aACI,0BAA0B,yBAC1B;AAAA,MACN;AAAA,IACF;AAAA,IACA,CAAC,UAAU,YAAY,WAAW;AAAA,EACpC;AAEA,iCAAU,MAAM;AACd,QAAI,CAAC,YAAa,SAAQ,KAAK;AAAA,EACjC,GAAG,CAAC,WAAW,CAAC;AAEhB,SAAO,EAAE,MAAM,qCAAqC;AACtD;;;AC/DA,IAAAC,gBAAiB;AACjB,IAAAC,kBAAqB;AACrB,IAAAC,kBAAkB;AAelB,IAAM,iBAAiB,MAAM;AAEtB,SAAS,mBAAmB,eAAuB,mBAA2B;AACnF,SAAO,gBAAgB,oBAAoB;AAC7C;AAEO,SAAS,wBAAwB,mBAA2B;AACjE,SAAO,iBAAiB;AAC1B;AAEO,IAAM,2BAA2B,CACtC,sBACA,0BAEA,gBAAAC,SAAS,CAAC,UAAmC;AAC3C,QAAM,mBAAmB,MACtB,IAAI,CAAC,SAAS;AACb,QAAI,CAAC,KAAK,cAAe,QAAO;AAChC,WAAO,kBAAkB,mBAAmB,KAAK,eAAe,cAAc,CAAC;AAAA,EACjF,CAAC,EACA,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG;AACxB,uBAAqB;AAAA,IAAQ,CAAC,WAC5B,OAAO,gBAAqC;AAAA,EAC9C;AACF,GAAG,GAAG;AAOD,IAAM,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,MAAgD;AACvF,MAAI,CAAC,QAAS,QAAO,gCAAAC,QAAA,8BAAAA,QAAA,cAAE;AAEvB,QAAM,UACJ,QAAQ,kBACN,mBAAmB,MAAM,iBAAiB,GAAG,QAAQ,iBAAiB,CACxE;AACF,QAAM,cAA0B,QAAQ,mBAAmB,QAAQ,EAAE;AAErE,SACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WACE,SAAS,eAAe,sBACxB,cAAAC,SAAK,uDAAuD;AAAA,QAC1D,CAAC,iBAAiB,WAAW,EAAE,GAAG;AAAA,MACpC,CAAC;AAAA;AAAA,EAEL;AAEJ;AACO,IAAM,SAAS,CAAC,EAAE,QAAQ,MAAoC;AACnE,QAAM,EAAE,kBAAAC,oBAAmB,iBAAwB,IAAI;AAAA,IACrD;AAAA,EACF;AAEA,SACE,gCAAAF,QAAA,8BAAAA,QAAA,gBACG,SAAS,MACT,SAAS,eAAeE,qBACvB,gCAAAF,QAAA,cAAC,SAAI,WAAU,qCACb,gCAAAA,QAAA,cAACE,mBAAA,EAAiB,MAAM,IAAI,CAC9B,CAEJ;AAEJ;AACO,IAAM,mBAAmB,CAAC,EAAE,QAAQ,MAAoC;AAC7E,QAAM,EAAE,qBAAAC,uBAAsB,oBAA2B,IAAI;AAAA,IAC3D;AAAA,EACF;AAEA,MACE,OAAO,SAAS,sBAAsB,eACtC,QAAQ,kBAAkB,SAAS;AAEnC,WAAO;AAET,SACE,gCAAAH,QAAA,8BAAAA,QAAA,gBACGG,wBACC,gCAAAH,QAAA,cAACG,sBAAA,EAAoB,UAAU,SAAS,aAAa,WAAW,WAAW,CAE/E;AAEJ;AAEO,IAAM,kBAAkB,CAC7B,eACA,OACA,oBACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB;AAAA,IACA,YAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB,yBAAAC;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,qBAAqB,mBAAmB,eAAe,iBAAiB;AAE9E,MAAI,uBAAuB;AACzB,WAAO,sBAAsB,aAAa,kBAAkB;AAAA,EAC9D;AAEA,QAAM,UAAU,YAAY,kBAAkB;AAE9C,MAAI,CAAC,WAAW,eAAe,OAAO,EAAG,QAAO,gCAAAN,QAAA,cAAC,SAAI,OAAO,EAAE,QAAQ,MAAM,GAAG;AAE/E,MAAI,uBAAuB,OAAO,GAAG;AACnC,WAAOI,iBACL,gCAAAJ,QAAA,cAACI,gBAAA,EAAc,MAAM,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,IACzD;AAAA,EACN;AAEA,MAAI,QAAQ,SAAS,UAAU;AAC7B,WAAO,gBAAgB,gCAAAJ,QAAA,cAAC,iBAAc,SAAkB,IAAK;AAAA,EAC/D;AAEA,QAAM,mBAAmB,YAAY,qBAAqB,CAAC;AAG3D,QAAM,mBAAmB,YAAY,qBAAqB,CAAC;AAG3D,QAAM,gBACJ,qBACA,qBAAqB,KACrB,QAAQ,MAAM,OAAO,kBAAkB,MAAM;AAG/C,QAAM,eACJ,sBACC,QAAQ,MAAM,OAAO,kBAAkB,MAAM,MAC3C,oBAAoB,gBAAgB,gBAAgB;AAEzD,QAAM,aACJ,sBACC,QAAQ,MAAM,OAAO,kBAAkB,MAAM,MAAM,gBAAgB,OAAO;AAE7E,QAAM,uBAAuB,wBAAwB;AAAA,IACnD;AAAA,IACA,gBAAgB,uBAAuB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,qBAAqB,YAAY,qBAAqB,CAAC,IAAI;AAAA,IAC5E;AAAA,EACF,CAAC;AAED,SACE,gCAAAA,QAAA,8BAAAA,QAAA,gBACG,wBACC,gCAAAA,QAAA,cAAC,SAAI,WAAU,iDACb,gCAAAA,QAAA,cAACM,0BAAA,EAAwB,aAAa,oBAAoB,CAC5D,GAEF,gCAAAN,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,oBAAoB,YAAY,SAAS;AAAA,MACzC;AAAA,MACA;AAAA,MACA,aAAa,6BAA6B,QAAQ,EAAE,KAAK,CAAC;AAAA,MAC1D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,CAAC,mBAAmB,QAAQ,EAAE,KAAK,EAAE;AAAA,MAClD;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,wBAAwB,QAAQ,EAAE,KAAK,CAAC;AAAA,MAChD,YAAYK;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,CACF;AAEJ;;;ACpOA,IAAAE,kBAAiD;AAQ1C,IAAM,oCAAgC,+BAE3C,MAAS;AAKJ,IAAM,wCAAwC,CAAC;AAAA,EACpD;AAAA,EACA;AACF,MAGE,gCAAAC,QAAA;AAAA,EAAC,8BAA8B;AAAA,EAA9B;AAAA,IACC;AAAA;AAAA,EAEC;AACH;;;ATuHF,SAAS,mCAAmC,GAAe;AACzD,MACE,EAAE,YAAY,mEACd,EAAE,YAAY,sCACd;AACA,MAAE,yBAAyB;AAAA,EAC7B;AACF;AAEA,SAAS,wCAAwC;AAC/C,iCAAU,MAAM;AACd,WAAO,iBAAiB,SAAS,kCAAkC;AACnE,WAAO,MAAM;AACX,aAAO,oBAAoB,SAAS,kCAAkC;AAAA,IACxE;AAAA,EACF,GAAG,CAAC,CAAC;AACP;AAEA,SAAS,mBAAmBC,UAAsB;AAChD,SAAOA,SAAQ,sBAAsB,EAAE;AACzC;AAEA,SAAS,iBAAiB,UAA6B,IAAY;AACjE,SAAO,SAAS,UAAU,CAAC,YAAY,QAAQ,OAAO,EAAE;AAC1D;AAEA,SAAS,iCACP,UACA,sBACA;AACA,MAAI,sBAAsB;AACxB,UAAMC,SAAQ,iBAAiB,UAAU,oBAAoB;AAC7D,QAAIA,WAAU,IAAI;AAChB,aAAO,EAAE,OAAO,UAAU,OAAAA,OAAM;AAAA,IAClC;AAAA,EACF;AACA,SAAO,SAAS,SAAS;AAC3B;AAEA,IAAM,oCAAoC,CACxC,UACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA,0BAA0B,CAAC;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,IACtB,0BAA0B;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA,WAAW;AAAA,IACX;AAAA,IACA,YAAAC;AAAA,IACA,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,IACA,+BAA+B;AAAA,IAC/B,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA,8BAA8B;AAAA,IAC9B;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,YAAY,6BAA6B,GAAG,wBAAwB,IAC1E;AAIF,wCAAsC;AAEtC,QAAM;AAAA,IACJ,eAAAC,iBAAgB;AAAA,IAChB,qBAAAC,uBAAsB;AAAA,IACtB,sBAAAC,wBAAuB;AAAA,IACvB,0BAAAC,4BAA2B;AAAA,IAC3B,qBAAAC,uBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,iBAAAC;AAAA,IACA,4BAAAC,8BAA6B;AAAA,IAC7B,yBAAAC,2BAA0B;AAAA,IAC1B,gBAAgB,gCAAgC;AAAA,EAClD,IAAI,oBAAoB,wBAAwB;AAChD,QAAM,qBAAqB,+BAA+B;AAE1D,QAAM,EAAE,QAAQ,cAAc,IAAI,eAAe,wBAAwB;AAEzE,QAAM,eAAW,wBAAuB,IAAI;AAE5C,QAAM,eAAW,yBAAQ,MAAM,QAAQ,WAAW,GAAG,CAAC,OAAO,CAAC;AAE9D,QAAM,EAAE,MAAM,gCAAgC,qCAAqC,IACjF,yCAAyC;AAAA,IACvC,UAAU,sBAAsB;AAAA,IAChC,YAAY,CAAC,CAAC;AAAA,IACd,aAAa,sBAAsB,mBAAmB;AAAA,EACxD,CAAC;AAEH,QAAM,EAAE,qBAAqB,uBAAuB,IAClD,gBAAgB,oBAAoB;AAEtC,QAAM,wBAAoB,yBAAQ,MAAM;AACtC,QAAI,OAAO,aAAa,aAAa;AACnC,aAAO,CAAC;AAAA,IACV;AAEA,QACE,wBACA,CAAC,uBACD,2BACA,CAAC,sBACD;AACA,aAAO;AAAA,IACT;AAEA,WAAO,gBAAgB;AAAA,MACrB,qBAAqB,CAAC;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,OAAO,UAAU;AAAA,IAC3B,CAAC;AAAA,EAEH,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AAED,QAAM,iBAAiB,kBAAkB,EAAE,UAAU,WAAW,OAAO,MAAM,GAAG,CAAC;AAGjF,QAAM,0BAA0B,gBAAgB;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,UAAU,YAAY,CAAC;AAAA,IACvB;AAAA,EACF,CAAC;AAED,QAAM,+BAA+B,qBAAqB;AAAA,IACxD;AAAA,IACA;AAAA,IACA,UAAU,YAAY,CAAC;AAAA,IACvB;AAAA,EACF,CAAC;AAED,QAAM,4BAAwB;AAAA,IAC5B,MAAM,gBAAgB,iBAAiB;AAAA,IACvC,CAAC,iBAAiB;AAAA,EACpB;AAEA,QAAM,gBAAgB,eAAe;AACrC,QAAM,yBAAqB;AAAA,IACzB,MACE,kBAAkB,OAAmC,CAAC,KAAK,SAAS,MAAM;AACxE,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA,kBAAkB,IAAI,CAAC;AAAA,QACvB,kBAAkB,IAAI,CAAC;AAAA,QACvB,CAAC;AAAA,QACD;AAAA,MACF;AACA,UAAI,SAAS,QAAQ,GAAI,KAAI,QAAQ,EAAE,IAAI;AAC3C,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA;AAAA;AAAA,IAGP;AAAA,MACE;AAAA,MACA,kBAAkB;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,0BAA0B,mBAAmB,OAAO,QAAQ,YAAY;AAE5E,cAAY;AAAA,IACV;AAAA,IACA,qBAAqB,CAAC,CAAC;AAAA,IACvB,iBAAiB,CAAC,CAAC,sBAAsB;AAAA,EAC3C,CAAC;AAED,QAAM,qBAAiB,6BAAY,YAAY;AAC7C,QAAI,cAAc;AAChB,YAAM,oBAAoB;AAC1B;AAAA,IACF;AAEA,QAAI,SAAS,SAAS;AACpB,eAAS,QAAQ,cAAc,kBAAkB,SAAS,CAAC;AAAA,IAC7D;AAEA,+BAA2B,KAAK;AAAA,EAElC,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,EACF,CAAC;AAED,gCAA8B;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,EAAE,cAAc,IAAI,iBAAiB,EAAE,SAAS,CAAC;AAEvD,QAAM,4BAA4B;AAAA,IAChC;AAAA,IACA,OAAO;AAAA,EACT;AAEA,QAAM,0BAAsB;AAAA,IAC1B,MACE,yBAAyB,CAAC,oCAAoC,GAAG,iBAAiB;AAAA,IACpF,CAAC,mBAAmB,oCAAoC;AAAA,EAC1D;AACA,QAAM,eAAe,CAAC,eAAwB;AAC5C,QAAI,gBAAgB,oBAAoB;AACtC,aAAO;AAAA,IACT;AAEA,QAAI,0BAA0B,GAAG;AAC/B,aAAO,aAAa,8BAA8B;AAAA,IACpD;AAEA,WAAO,aAAa,8BAA8B;AAAA,EACpD;AAEA,QAAMC,sBAAiB;AAAA,IACrB,CAACV,QAAO,GAAG,EAAE,mBAAAW,oBAAmB,mBAAAC,mBAAkB,MAChDA,mBAAkB,mBAAmBZ,QAAOW,kBAAiB,CAAC,EAAE;AAAA,IAClE,CAAC;AAAA,EACH;AAEA,QAAM,sBAAsB,CAAC,eAAwB;AACnD,aAAS,UAAU;AACnB,qCAAiC,UAAU;AAE3C,QAAI,YAAY;AACd,sBAAgB,YAAY;AAC5B,mCAA6B,KAAK;AAAA,IACpC;AAAA,EACF;AACA,QAAM,mBAAmB,CAAC,YAAqB;AAC7C,QAAI,SAAS;AACX,iBAAW,YAAY;AAAA,IACzB;AAAA,EACF;AAEA,iCAAU,MAAM;AACd,QAAI;AACJ,QAAI,sBAAsB;AACxB,YAAMX,SAAQ,iBAAiB,mBAAmB,oBAAoB;AACtE,UAAIA,WAAU,IAAI;AAChB,wBAAgB,WAAW,MAAM;AAC/B,mBAAS,SAAS,cAAc,EAAE,OAAO,UAAU,OAAAA,OAAM,CAAC;AAAA,QAC5D,GAAG,CAAC;AAAA,MACN;AAAA,IACF;AACA,WAAO,MAAM;AACX,mBAAa,aAAa;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,sBAAsB,iBAAiB,CAAC;AAE5C,QAAM,KAAK,YAAY;AAEvB,MAAI,CAAC,kBAAmB,QAAO;AAE/B,QAAM,kBAAkB,aACpB,kDAAkD,EAAE,KACpD,2CAA2C,EAAE;AAEjD,SACE,gCAAAa,QAAA,cAAC,yCAAsC,OAAO,EAAE,eAAe,KAC7D,gCAAAA,QAAA,cAACT,uBAAA,MACC,gCAAAS,QAAA,cAAC,yBAAsB,IAAI,mBACxB,CAAC,cAAc,kCACd,gCAAAA,QAAA;AAAA,IAACL;AAAA,IAAA;AAAA,MACC,aAAa,sBAAsB;AAAA;AAAA,EACrC,GAEF,gCAAAK,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,eAAe,0BAA0B;AAAA;AAAA,IAEpD,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,mBAAmB;AAAA,QACnB;AAAA,QACA,gBAAgB;AAAA,QAChB,WAAU;AAAA,QACV,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA,GAAG;AAAA,QACL;AAAA,QACA,gBAAgBH;AAAA,QAChB,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAAR;AAAA,UACA,sBAAsB,sBAAsB;AAAA,UAC5C;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc,sBAAsB;AAAA,UACpC,mBAAmB,sBAAsB;AAAA,UACzC;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAAD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,oBAAoB,sBAAsB;AAAA,UAC1C,yBAAAQ;AAAA,UACA,aAAa;AAAA,QACf;AAAA,QACA,gBAAgB,wBAAwB,iBAAiB;AAAA,QACzD;AAAA,QACA,oBAAoB,EAAE,QAAQ,KAAK,KAAK,EAAE;AAAA,QAC1C,yBAAyB;AAAA,UACvB;AAAA,UACA;AAAA,QACF;AAAA,QACA,aAAa;AAAA,QACb,UAAU;AAAA,QACV,eAAe;AAAA,QACf,KAAK;AAAA,QACL;AAAA,QACA,KAAK;AAAA,QACL,OAAO,EAAE,WAAW,SAAS;AAAA,QAC7B,YAAY,kBAAkB;AAAA,QAC7B,GAAG;AAAA,QACH,GAAI,wBAAwB,EAAE,YAAY,sBAAsB,IAAI,CAAC;AAAA,QACrE,GAAI,oBAAoB,EAAE,kBAAkB,IAAI,CAAC;AAAA;AAAA,IACpD;AAAA,EACF,CACF,GACCF,oBAAmB,gCAAAM,QAAA,cAACN,kBAAA,IAAgB,CACvC,GACA,gCAAAM,QAAA;AAAA,IAACR;AAAA,IAAA;AAAA,MACC,gBAAgB;AAAA,MAChB;AAAA,MACA,yBAAyB;AAAA,MACzB,qBAAqBC;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,aAAa,SAAY,sBAAsB;AAAA;AAAA,EAC9D,GACC,uBAAuB,gCAAAO,QAAA,cAACV,sBAAA,EAAoB,SAAS,qBAAqB,CAC7E;AAEJ;AAgHO,SAAS,uBAAuB,OAAoC;AACzE,QAAM,EAAE,qBAAqB,UAAU,cAAc,IAAI;AAAA,IACvD;AAAA,EACF;AACA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,uBAAuB,wBAAwB;AAEnD,QAAM,WAAW,MAAM,YAAY;AAEnC,SACE,gCAAAU,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,sBAAsB,MAAM,wBAAwB;AAAA,MACpD,SAAS,CAAC,CAAC;AAAA,MACX,cAAc,CAAC,CAAC;AAAA,MAChB;AAAA,MACA;AAAA,MACA,aAAa,CAAC,CAAC;AAAA,MACf,kBAAkB,CAAC,CAAC;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;AUxsBA,IAAAC,kBAAyC;AAEzC,IAAAC,sBAA8B;AASvB,IAAM,+CAA+C,MAAM;AAChE,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,QAAQ,IAAI,uBAAuB;AAC3C,QAAM,EAAE,WAAW,IAAI,wBAAwB;AAC/C,QAAM,EAAE,QAAQ,IAAI,kBAAkB;AACtC,QAAM,uBAAmB,wBAAwC,MAAS;AAE1E,QAAM,oBAAoB,MACxB,QACG,UAAU,EACV,OAAO,EAAE,KAAK,QAAQ,IAAI,GAAG,EAAE,IAAI,QAAQ,UAAU,CAAC,EACtD,KAAK,CAAC,EAAE,QAAQ,MAAM;AACrB,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,qBAAiB,cAAU,mCAAc,QAAQ,CAAC,EAAE,OAAO;AAAA,EAC7D,CAAC,EACA,MAAM,CAAC,UAAiB;AACvB,WAAO,cAAc,SAAS;AAAA,MAC5B,SAAS,EAAE,2BAA2B;AAAA,MACtC,SAAS;AAAA,QACP,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,QACN,SAAS,EAAE,aAAa,QAAQ;AAAA,QAChC,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAEL,iCAAU,MAAM;AACd,QACE,iBAAiB,WACjB,iBAAiB,YAAY,QAC7B,CAAC,QAAQ;AAET;AACF,UAAM,eAAe,QAAQ,MAAM,YAAY,QAAQ,SAAS;AAChE,QAAI,cAAc;AAChB,uBAAiB,UAAU;AAC3B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,OAAO,CAAC;AAErB,MAAI,CAAC,QAAQ,UAAW,QAAO;AAE/B,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,sDACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAS,YAAY;AACnB,YAAI,CAAC,iBAAiB,SAAS;AAG7B,gBAAM,kBAAkB;AACxB,cAAI,iBAAiB,SAAS;AAC5B,uBAAW,iBAAiB,OAAO;AAAA,UACrC,OAAO;AAEL,6BAAiB,UAAU;AAAA,UAC7B;AACA;AAAA,QACF;AACA,mBAAW,iBAAiB,OAAO;AAAA,MACrC;AAAA,MACA,MAAK;AAAA;AAAA,IAEJ,EAAE,cAAc;AAAA,EACnB,CACF;AAEJ;;;ACrFA,IAAAC,kBAAkB;AASlB,IAAM,wBAAwB,CAAC,WAA0B;AAAA,EACvD,YAAY,MAAM;AACpB;AAEO,IAAM,uBAAuB,CAAC,EAAE,SAAS,MAAiC;AAC/E,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,WAAW,IAAI,cAAc,UAAU,OAAO,qBAAqB,KAAK,CAAC;AAEjF,QAAM,wBAAwB,UAAU,MAAM;AAC9C,QAAM,uBACJ,UAAU,YAAY,wBAClB,UAAU,SAAS,QAAQ,IAAI,wBAC/B;AAEN,QAAM,0BACJ,CAAC,CAAC,yBAAwB,oBAAI,KAAK,GAAE,QAAQ,IAAI;AAEnD,SACE,gCAAAC,QAAA,cAAC,OAAE,WAAU,gCACX,gCAAAA,QAAA,cAAC,cAAM,EAAE,iBAAiB,CAAE,GAC3B,UAAU,YAAY,eAAe,QACpC,gCAAAA,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA,cAAC,cAAK,KAAG,GACT,gCAAAA,QAAA,cAAC,cACE,0BACG,EAAE,4BAA4B;AAAA,IAC5B,UAAU,EAAE,kCAAkC;AAAA,MAC5C,WAAW,SAAS;AAAA,IACtB,CAAC;AAAA,EACH,CAAC,IACD,EAAE,sBAAsB;AAAA,IACtB,UAAU,EAAE,6BAA6B;AAAA,MACvC,cAAc;AAAA,IAChB,CAAC;AAAA,EACH,CAAC,CACP,CACF,CAEJ;AAEJ;;;ACjDA,IAAAC,kBAAgC;AAChC,IAAAC,gBAAiB;;;ACDjB,IAAAC,kBAA+B;AAC/B,IAAAC,gBAAiB;;;ACDjB,IAAAC,kBAAoC;AAc7B,SAAS,kBAAkB,SAAgC;AAChE,QAAM,EAAE,sBAAsB,4BAA4B,IACxD,kBAAkB,mBAAmB;AACvC,QAAM,CAAC,WAAW,YAAY,QAAI,0BAA6B,CAAC,CAAC;AACjE,QAAM;AAAA,IACJ,sBAAsB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAS,WAAW;AACtD,QAAM,uBAAuB,4BAA4B;AAEzD,iCAAU,MAAM;AACd,QAAI,CAAC,aAAa;AAChB;AAAA,IACF;AAEA,QAAI,SAAS;AAEb,KAAC,YAAY;AACX,UAAI;AACF,qBAAa,IAAI;AACjB,cAAMC,aAAY,MAAM,qBAAqB,cAAc,IAAI;AAE/D,YAAI,CAAC,QAAQ;AACX,uBAAaA,UAAS;AAAA,QACxB;AAAA,MACF,SAAS,GAAG;AACV,YAAI,CAAC,QAAQ;AACX,uBAAa,CAAC,CAAC;AAAA,QACjB;AAAA,MACF,UAAE;AACA,YAAI,CAAC,QAAQ;AACX,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF;AAAA,IACF,GAAG;AAEH,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,sBAAsB,cAAc,aAAa,IAAI,CAAC;AAE1D,SAAO,EAAE,WAAW,UAAU;AAChC;;;ADnCA,IAAM,6BAA6B,EAAE,YAAY,GAAG;AAE7C,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB,GAAG;AACL,GAA4B;AAC1B,QAAM,EAAE,OAAAC,SAAQ,MAAa,IAAI,oBAAoB;AACrD,QAAM,mBAAmB,UAAU;AAAA,IACjC,CAAC,EAAE,aAAa,MAAM,iBAAiB;AAAA,EACzC;AACA,QAAM,yBAAyB,kBAAkB,kBAAkB;AACnE,QAAM;AAAA,IACJ,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,EACvB,IAAI,kBAAkB,oBAAoB;AAC1C,QAAM,4BAA4B,2BAA2B;AAC7D,QAAM,sBACJ,2BAA2B,8BAA8B;AAC3D,QAAM,EAAE,WAAW,qBAAqB,WAAW,gBAAgB,IACjE,kBAAkB;AAAA,IAChB;AAAA,IACA,cAAc;AAAA,IACd,aAAa,WAAW;AAAA,IACxB,MAAM;AAAA,EACR,CAAC;AAEH,QAAM,wCAAoC;AAAA,IACxC,MACE,4BACI,CAAC,GAAG,eAAe,EAAE,KAAK,yBAAyB,IACnD;AAAA,IACN,CAAC,2BAA2B,eAAe;AAAA,EAC7C;AAEA,SACE,gCAAAC,QAAA;AAAA,IAACD;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,eAAW,cAAAE,SAAK,6CAA6C,WAAW,SAAS;AAAA;AAAA,IAEjF,gCAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA;AAAA,MAEZ,gCAAAA,QAAA,cAAC,SAAI,WAAU,wDACZ,UAAU;AAAA,QACT,CAAC,EAAE,gBAAgB,eAAe,aAAa,MAC7C,kBACE,gCAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,cAAAC,SAAK,qDAAqD;AAAA,cACnE,+DACE,yBAAyB;AAAA,YAC7B,CAAC;AAAA,YACD,eAAa,6BAA6B,YAAY;AAAA,YACtD,KAAK;AAAA,YACL,SAAS,MACP,+BAA+B,YAA4B;AAAA;AAAA,UAG7D,gCAAAD,QAAA,cAAC,UAAK,WAAU,sFACd,gCAAAA,QAAA,cAAC,oBAAe,CAClB;AAAA,UAAO;AAAA,UAEP,gCAAAA,QAAA,cAAC,UAAK,WAAU,sCACb,aACH;AAAA,QACF;AAAA,MAEN,CACF;AAAA,MACC,0BACC,gCAAAA,QAAA,cAAC,SAAI,WAAU,2HACb,gCAAAA,QAAA,cAAC,4BAAuB,CAC1B;AAAA,MAEF,gCAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,eAAY;AAAA;AAAA,QAEX,sBACC,gCAAAA,QAAA,cAAC,sBAAiB,IAElB,kCAAkC,IAAI,CAAC,EAAE,KAAK,MAC5C,gCAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,KAAK,MAAM;AAAA;AAAA,UAEX,gCAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA,cACZ,OAAO,MAAM;AAAA,cACb,MAAM,MAAM,QAAQ,MAAM;AAAA;AAAA,UAC5B;AAAA,UACA,gCAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA;AAAA,YAEX,MAAM,QAAQ,MAAM;AAAA,UACvB;AAAA,QACF,CACD;AAAA,MAEL;AAAA,IACF;AAAA,EACF;AAEJ;;;AEtIA,IAAAE,kBAAqC;AAoB9B,IAAM,uBAA4C,CAAC,GAAG,MAAM;AACjE,MAAI,EAAE,mBAAmB,EAAE,iBAAiB;AAC1C,WAAO,CAAC,EAAE,kBAAkB,CAAC,EAAE;AAAA,EACjC;AAEA,SAAO,EAAE,aAAa,cAAc,EAAE,cAAc,IAAI;AAC1D;AAEO,IAAM,sBAAsB,CAAC,WAAsC;AACxE,QAAM;AAAA,IACJ,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,eAAe;AAAA,EACjB,IAAI;AACJ,QAAM,EAAE,SAAS,eAAe,qBAAqB,IACnD,kBAAkB,qBAAqB;AACzC,QAAM,EAAE,iBAAiB,yBAAyB,uBAAuB,IACvE,oBAAoB,qBAAqB;AAE3C,QAAM,kBAAkB,uBAAuB;AAC/C,QAAM,gBAAgB,qBAAqB,wBAAwB;AACnE,QAAM,kBAAkB,iBAAiB,QAAQ;AACjD,QAAM,eAAe,oBAAoB,SAAS;AAClD,QAAM,iBAAiB,sBAAsB,SAAS;AAEtD,QAAM,oBAAgB;AAAA,IACpB,CAAC,iBACC,cAAc,KAAK,CAAC,aAAa,SAAS,SAAS,YAAY,KAAK;AAAA,IACtE,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,6BAAyB;AAAA,IAC7B,CAAC,iBACC,gBAAgB,KAAK,CAAC,EAAE,KAAK,MAAM,SAAS,YAAY,GAAG,aAAa;AAAA,IAC1E,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,0BAAsB;AAAA,IAC1B,CAAC,iBACC,gBAAgB,KAAK,CAAC,mBAAmB,eAAe,SAAS,YAAY;AAAA,IAC/E,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,gCAA4B;AAAA,IAChC,CAAC,iBACC,iBAAiB,QAAQ,CAAC,aAAa;AACrC,UAAI,gBAAgB,iBAAiB,SAAS,MAAM;AAClD,cAAM,WAAW,SAAS,MAAM,QAAQ,SAAS,MAAM;AACvD,eAAO,WAAW,CAAC,QAAQ,IAAI,CAAC;AAAA,MAClC;AACA,aAAO,CAAC;AAAA,IACV,CAAC,KAAK,CAAC;AAAA,IACT,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,wBAAuC,yBAAQ,MAAM;AACzD,QAAI,CAAC,gBAAgB;AACnB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,oBAAoB,OAAO,QAAQ,cAAc,EAAE;AAAA,MACvD,CAAC,CAAC,cAAc,EAAE,OAAO,mBAAmB,iBAAiB,CAAC,MAAM;AAClE,YAAI,UAAU,KAAK,CAAC,oBAAoB,YAAY,GAAG;AACrD,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,yBAAyB,0BAA0B,YAAY;AAErE,eAAO;AAAA,UACL;AAAA,YACE,gBAAgB,uBAAuB,YAAY;AAAA,YACnD,iBAAiB,oBAAoB,IAAI,KAAK,iBAAiB,IAAI;AAAA,YACnE,eAAe,cAAc,YAAY;AAAA,YACzC,gBAAgB,mBAAmB,IAAI,KAAK,gBAAgB,IAAI;AAAA,YAChE;AAAA,YACA,eAAe;AAAA,YACf;AAAA,YACA,0BAA0B,QAAQ,uBAAuB;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,kBAAkB,KAAK,aAAa;AAAA,EAC7C,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,eAAe,kBAAkB,SAAS;AAEhD,QAAM,yBAAqB;AAAA,IACzB,MACE,kBAAkB,OAAO,CAAC,OAAO,EAAE,cAAc,MAAM,QAAQ,eAAe,CAAC;AAAA,IACjF,CAAC,iBAAiB;AAAA,EACpB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AHhFA,IAAM,0BAA0B,CAAC,UAA8B;AAC7D,QAAM;AAAA,IACJ;AAAA;AAAA,IAEA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,EAAE,mBAAmB,cAAc,mBAAmB,IAC1D,oBAAoB,IAAI;AAC1B,QAAM,CAAC,sBAAsB,uBAAuB,QAAI;AAAA,IACtD;AAAA,EACF;AACA,QAAM,EAAE,EAAE,IAAI,sBAAsB,eAAe;AACnD,QAAM,EAAE,oBAAAC,sBAAqB,mBAA0B,IAAI,oBAAoB;AAE/E,QAAM,4BAA4B,CAAC,iBAAyB;AAC1D,QAAI,qBAAqB,gCAAgC;AACvD;AAAA,IACF;AAEA,4BAAwB,YAA4B;AAAA,EACtD;AAEA,MAAI,CAAC,aAAc,QAAO;AAE1B,SACE,gCAAAC,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,oBAAoB;AAAA,MAClC,eAAW,cAAAC,SAAK,iEAAiE;AAAA;AAAA,QAE/E,oCAAoC;AAAA,MACtC,CAAC;AAAA,MACD,eAAY;AAAA,MACZ,MAAK;AAAA;AAAA,IAEL,gCAAAD,QAAA,cAAC,QAAG,WAAU,iCACX,kBAAkB;AAAA,MACjB,CAAC,EAAE,gBAAgB,eAAe,eAAe,aAAa,MAC5D,kBACE,gCAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,cAAAC,SAAK,8BAA8B;AAAA,YAC5C,kCAAkC;AAAA,UACpC,CAAC;AAAA,UACD,KAAK;AAAA;AAAA,QAEL,gCAAAD,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,cAAc,YAAY;AAAA,YACtC,eAAa,yBAAyB,YAAY;AAAA,YAClD,SAAS,MAAM,0BAA0B,YAAY;AAAA,YACrD,MAAK;AAAA;AAAA,UAEL,gCAAAA,QAAA,cAAC,UAAK,WAAU,sCACd,gCAAAA,QAAA,cAAC,oBAAe,CAClB;AAAA,UAAO;AAAA,UAEP,gCAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,kBAAe;AAAA;AAAA,YAEd;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IAEN,GACA,gCAAAA,QAAA,cAAC,YACC,gCAAAA,QAAA,cAAC,UAAK,WAAU,sCAAoC,kBAAmB,CACzE,CACF;AAAA,EACF,GACC,yBAAyB,QACxB,gCAAAA,QAAA;AAAA,IAACD;AAAA,IAAA;AAAA,MACC;AAAA,MACA,SAAS,MAAM,wBAAwB,IAAI;AAAA,MAC3C,8BACE;AAAA,MAEF,MAAM,yBAAyB;AAAA,MAC/B,WAAW;AAAA,MACX;AAAA,MACA;AAAA;AAAA,EACF,CAEJ;AAEJ;AAKO,IAAM,gBAAgB,gBAAAC,QAAM;AAAA,EACjC;AACF;;;AI9IA,IAAAE,kBAAgC;AAChC,IAAAC,gBAAiB;AAiBjB,IAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA2C;AACzC,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAAiC,IAAI;AACrF,QAAM,EAAE,aAAa,aAAa,eAAe,IAAI,sBAAsB;AAAA,IACzE;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE,gCAAAC,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA,cAAC,iBAAc,kBAAoC,SAAS,kBACzD,KACH,GACA,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAc;AAAA,MACd,cAAc;AAAA,MACd,KAAK;AAAA;AAAA,IAEJ;AAAA,EACH,CACF;AAEJ;AAoBA,IAAM,gCAAgC,CAAC,UAAoC;AACzE,QAAM,EAAE,gBAAgB,oBAAoB,GAAG,KAAK,IAAI;AAExD,QAAM,EAAE,gBAAgB,sBAAsB,IAC5C,kBAAkB,qBAAqB;AAEzC,QAAM,EAAE,mBAAmB,cAAc,mBAAmB,IAC1D,oBAAoB,IAAI;AAE1B,QAAM,iBAAiB,sBAAsB;AAE7C,MAAI,CAAC,aAAc,QAAO;AAE1B,SACE,gCAAAA,QAAA,cAAC,SAAI,WAAU,2CACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEX,kBAAkB;AAAA,MACjB,CAAC,EAAE,gBAAgB,eAAe,wBAAwB,aAAa,MAAM;AAC3E,cAAM,iBAAiB,uBAAuB,KAAK,IAAI;AAEvD,eACE,kBACE,gCAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,cAAAC,SAAK,wCAAwC;AAAA,cACtD,kCAAkC;AAAA,YACpC,CAAC;AAAA,YACD,KAAK;AAAA,YACL,SAAS,CAAC,UAAU,eAAe,cAAc,KAAK;AAAA,YACtD,SAAS,CAAC,UAAU,eAAe,cAAc,KAAK;AAAA;AAAA,UAEtD,gCAAAD,QAAA,cAAC,eAAY,OAAO,kBAClB,gCAAAA,QAAA,cAAC,oBAAe,CAClB;AAAA,QACF;AAAA,MAGN;AAAA,IACF;AAAA,IAEE,gCAAAA,QAAA,cAAC,QAAG,WAAU,uDACX,kBACH;AAAA,EAEJ,CACF;AAEJ;AAEO,IAAM,sBAAsB,gBAAAA,QAAM;AAAA,EACvC;AACF;;;ACtHA,IAAAE,kBAAkB;AAElB,IAAAC,gBAAiB;AAeV,SAAS,uBAAuB;AAAA,EACrC,SAAS;AAAA,EACT;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,QAAM,EAAE,EAAE,IAAI,sBAAsB,wBAAwB;AAC5D,QAAM,EAAE,SAAS,eAAe,IAAI,kBAAkB,wBAAwB;AAC9E,QAAM,EAAE,WAAAC,aAAY,UAAiB,IAAI,oBAAoB,wBAAwB;AACrF,QAAM,UAAU,eAAe;AAE/B,MAAI,CAAC,gBAAgB,OAAO,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC;AAAA,QACT;AAAA,QACA,OACI,6CACA;AAAA,MACN;AAAA,MACA,eAAY;AAAA;AAAA,IAEX,EAAE,QAAQ;AAAA,IAAG;AAAA,IACd,gCAAAD,QAAA,cAACD,YAAA,EAAU,WAAW,QAAQ,yBAA0B,GAAG,gBAAgB;AAAA,EAC7E;AAEJ;;;AzHFA,IAAM,2BAA2B,CAAC,UAAyC;AACzE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAAG;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,EAAE,OAAO,IAAI,eAAe,eAAe;AACjD,QAAM,EAAE,EAAE,IAAI,sBAAsB,eAAe;AACnD,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,0BAAS,KAAK;AAClE,QAAM,CAAC,uBAAuB,sBAAsB,QAAI,0BAAS,KAAK;AACtE,QAAM,WAAW,mBAAmB,QAAQ,EAAE;AAE9C,QAAM;AAAA,IACJ,YAAAC,cAAa;AAAA,IACb,QAAAC,UAAS;AAAA,IACT,kBAAAC,oBAAmB;AAAA,IACnB,gBAAAC,kBAAiB;AAAA;AAAA;AAAA,IAGjB,gBAAAC,kBAAiBD;AAAA,IACjB,gBAAAE,kBAAiB;AAAA,IACjB,qBAAAC,uBAAsB;AAAA,IACtB,gBAAAC,kBAAiB;AAAA,IACjB,8CAAAC,gDAA+C;AAAA,IAC/C,2BAAAC,6BAA4B;AAAA,IAC5B,eAAAC,iBAAgB;AAAA,IAChB,kBAAAC,oBAAmB;AAAA,IACnB,eAAAC,iBAAgB;AAAA,IAChB,sBAAAC,wBAAuB;AAAA,IACvB,qBAAAC,uBAAsB;AAAA,IACtB,cAAAC;AAAA,EACF,IAAI,oBAAoB,eAAe;AACvC,QAAM,gBAAgB,sBAAsB,OAAO;AACnD,QAAM,eAAe,oBAAoB,OAAO;AAChD,QAAM,oBAAgB;AAAA,IACpB,MAAM,uBAAuB,OAAO;AAAA,IACpC,CAAC,sBAAsB,OAAO;AAAA,EAChC;AACA,QAAM,uBAAmB;AAAA,IACvB,MACE,CAAC,QAAQ,mBAAmB,CAAC,QAAQ,cACjC,CAAC,IACD,CAAC,QAAQ,kBACP,QAAQ,cACR,CAAC,QAAQ,iBAAiB,GAAI,QAAQ,eAAe,CAAC,CAAE;AAAA,IAChE,CAAC,OAAO;AAAA,EACV;AAEA,MAAI,uBAAuB,OAAO,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,cAAc,QAAQ,SAAS,WAAW;AACpD,WAAO,gCAAAC,QAAA,cAACT,iBAAA,EAAe,SAAkB;AAAA,EAC3C;AAEA,MAAI,iBAAiB,OAAO,GAAG;AAC7B,WAAO,gCAAAS,QAAA,cAACX,iBAAA,IAAe;AAAA,EACzB;AAEA,QAAM,eAAe,CAAC,iBAAiB;AACvC,QAAM,uBAAuB,CAAC,cAAc,CAAC,CAAC,QAAQ;AACtD,QAAM,uBACJ,CAAC,cAAc,QAAQ,mBAAmB,QAAQ;AACpD,QAAM,aAAa,QAAQ,WAAW,YAAY,QAAQ,OAAO,WAAW;AAC5E,QAAM,YAAY,iBAAiB,OAAO;AAC1C,QAAM,WAAW,gBAAgB,OAAO,KAAK,CAAC;AAE9C,MAAI,cAAwC;AAE5C,MAAI,YAAY;AACd,kBAAc,MAAM,YAAY,OAAO;AAAA,EACzC,WAAW,WAAW;AACpB,kBAAc,MAAM,sBAAsB,IAAI;AAAA,EAChD,WAAW,UAAU;AACnB,kBAAc,MAAM,uBAAuB,CAAC,SAAS,CAAC,IAAI;AAAA,EAC5D;AAEA,QAAMY,qBAAgB,cAAAC;AAAA,IACpB;AAAA,IACA,sBAAsB,QAAQ,IAAI;AAAA,IAClC,sBAAsB,QAAQ,MAAM;AAAA,IACpC,YAAY,IACR,uDACA;AAAA,IACJ,QAAQ,OAAO,gCAAgC;AAAA,IAC/C;AAAA,MACE,qCAAqC;AAAA,MACrC,kCAAkC;AAAA,MAClC,4CAA4C,QAAQ;AAAA,MACpD,qCAAqC;AAAA,MACrC,yCACE,SAAS,WAAW,YAAY,SAAS,OAAO,WAAW;AAAA,MAC7D,sCAAsC,wBAAwB;AAAA,MAC9D,2CAA2C;AAAA,MAC3C,6CAA6C;AAAA,MAC7C,6CAA6C;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ,WAAW,OAAO,MAAM,UAAU,QAAQ,OAAO;AAEtE,SACE,gCAAAF,QAAA,8BAAAA,QAAA,gBACG,WACC,gCAAAA,QAAA,cAACd,mBAAA,EAAiB,6BAA0D,GAE7E,sBACC,gCAAAc,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,qBAAqBV;AAAA,MACrB,SAAS,MAAM,sBAAsB,KAAK;AAAA,MAC1C,MAAM;AAAA;AAAA,EACR,GAGA,gCAAAU,QAAA,cAAC,SAAI,WAAWC,gBAAe,KAAK,QAAQ,MACzCF,iBAAgB,gCAAAC,QAAA,cAACD,eAAA,IAAa,GAC9B,CAAC,CAAC,YAAY,gCAAAC,QAAA,cAACH,uBAAA,EAAqB,UAAoB,GACxD,QAAQ,QACP,gCAAAG,QAAA;AAAA,IAACf;AAAA,IAAA;AAAA,MACC,OAAO,QAAQ,KAAK;AAAA,MACpB,MAAM,QAAQ,KAAK,QAAQ,QAAQ,KAAK;AAAA,MACxC,SAAS;AAAA,MACT,aAAa;AAAA,MACb,MAAM,QAAQ;AAAA;AAAA,EAChB,GAEF,gCAAAe,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAE,SAAK,2BAA2B;AAAA,QACzC,0CAA0C,cAAc;AAAA,MAC1D,CAAC;AAAA,MACD,eAAY;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA;AAAA,IAET,gCAAAF,QAAA,cAACZ,iBAAA,IAAe;AAAA,IAChB,gCAAAY,QAAA,cAAC,SAAI,WAAU,sCACZ,gBAAgB,gCAAAA,QAAA,cAACJ,gBAAA,EAAc,SAAO,MAAC,CAC1C;AAAA,IACA,gCAAAI,QAAA,cAAC,SAAI,WAAU,8BACZ,QAAQ,gCAAAA,QAAA,cAAC,QAAK,MAAY,GAC1B,kBAAkB,UAAU,CAAC,QAAQ,iBACpC,gCAAAA,QAAA,cAAChB,aAAA,EAAW,eAAe,cAAc,aAAa,kBAAkB,IACtE,MACH,gBACC,gCAAAgB,QAAA,cAACF,sBAAA,EAAoB,SAAkB,YAAYf,aAAY,IAE/D,gCAAAiB,QAAA,cAAC,eAAY,SAAkB,YAAYjB,aAAY,GAEzD,gCAAAiB,QAAA,cAAC,sBAAiB,CACpB;AAAA,EACF,GACC,wBACC,gCAAAA,QAAA;AAAA,IAACP;AAAA,IAAA;AAAA,MACC,SAAS;AAAA,MACT,aAAa,QAAQ;AAAA;AAAA,EACvB,GAED,wBAAwB,gCAAAO,QAAA,cAACR,+CAAA,IAA6C,GACtE,gBACC,gCAAAQ,QAAA,cAAC,SAAI,WAAU,gCACb,gCAAAA,QAAA,cAACN,gBAAA,IAAc,GACd,CAAC,YAAY,KAAK,CAAC,CAAC,QAAQ,QAC3B,gCAAAM,QAAA,cAAC,UAAK,WAAU,mCACb,QAAQ,KAAK,QAAQ,QAAQ,KAAK,EACrC,GAEF,gCAAAA,QAAA,cAACL,mBAAA,EAAiB,aAAY,sCAAqC,GAClE,YACC,gCAAAK,QAAA,cAAC,UAAK,WAAU,oCAAkC,EAAE,QAAQ,CAAE,GAE/D,YACC,gCAAAA,QAAA,cAAC,0BAAuB,UAAQ,MAAC,MAAM,uBAAuB,CAElE,CAEJ,CAEJ;AAEJ;AAEA,IAAM,wBAAwB,gBAAAA,QAAM;AAAA,EAClC;AAAA,EACA;AACF;AAKO,IAAM,gBAAgB,CAAC,UAAmC;AAC/D,QAAM,iBAAiB,kBAAkB,eAAe;AAExD,SAAO,gCAAAA,QAAA,cAAC,yBAAuB,GAAG,gBAAiB,GAAG,OAAO;AAC/D;;;AD3LA,IAAM,qBAAqB,CAAC,UAAmC;AAC7D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,iBAAiB,OAAO,KAAK,eAAe;AAAA,IAC5C,aAAa;AAAA,IACb,aAAa;AAAA,IACb;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,QAAQ,qBAAqB,IAAI,eAAe,SAAS;AACjE,QAAM,EAAE,eAAe,KAAK,IAAI,uBAAuB,SAAS;AAChE,QAAM,EAAE,SAAS,eAAe,IAAI,oBAAoB,SAAS;AAEjE,QAAM,iBAAiB,QAAQ,SAAS,aAAa,QAAQ,WAAW;AACxE,QAAM,qBAAqB,eAAe,kBAAkB;AAE5D,QAAM,EAAE,WAAW,SAAS,QAAQ,IAAI,eAAe;AAEvD,QAAM,EAAE,aAAa,YAAY,IAAI,eAAe,SAAS;AAAA,IAC3D,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB,CAAC;AAED,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,sBAAkB;AAAA,IACtB,MACE,CAAC,EACC,CAAC,eACD,OAAO,MAAM,MACb,SACC,CAAC,KAAK,OAAO,KAAK,EAAE,KAClB,SAAS,cACR,IAAI,KAAK,QAAQ,UAAU,EAAE,QAAQ,IACnC,KAAK,OAAO,KAAK,EAAE,EAAE,UAAU,QAAQ;AAAA,IAEjD,CAAC,QAAQ,aAAa,QAAQ,YAAY,IAAI;AAAA,EAChD;AAEA,QAAM,4BAAwB;AAAA,IAC5B,MACE;AAAA,MACE;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IAEF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM;AAAA,IACJ,QAAQ;AAAA;AAAA,IACR,gBAAgB;AAAA;AAAA,IAChB,mBAAmB;AAAA;AAAA,IACnB,aAAa;AAAA;AAAA,IACb,aAAa;AAAA;AAAA,IACb,WAAW;AAAA;AAAA,IACX,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,sBAA2C;AAAA,IAC/C,GAAG;AAAA,IACH;AAAA,IACA,mBAAmB;AAAA,IACnB;AAAA,IACA,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ;AAAA,IACA,aAAa,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,EACnB;AAEA,SACE,gCAAAG,QAAA,cAAC,mBAAgB,OAAO,uBACtB,gCAAAA,QAAA,cAAC,sBAAmB,eAA8B,CAEpD;AAEJ;AAEA,IAAM,kBAAkB,gBAAAA,QAAM;AAAA,EAC5B;AAAA,EACA;AACF;AAMO,IAAM,UAAU,CAAC,UAAwB;AAC9C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,gBAAgB,IAAI,wBAAwB,SAAS;AAC7D,QAAM,EAAE,sBAAsB,MAAM,IAAI,uBAAuB,SAAS;AAExE,QAAM,eAAe,iBAAiB,OAAO;AAC7C,QAAM,mBAAmB,qBAAqB,SAAS,cAAc;AACrE,QAAM,iBAAiB,mBAAmB,OAAO;AACjD,QAAM,cAAc,gBAAgB,oBAAoB;AACxD,QAAM,YAAY,YAAY,SAAS,mBAAmB,qBAAqB;AAE/E,QAAM,uBAAuB,oBAAoB,SAAS;AAAA,IACxD,sBAAsB;AAAA,IACtB,QAAQ;AAAA,EACV,CAAC;AAED,QAAMC,gBAAe,iBAAiB,SAAS;AAAA,IAC7C,sBAAsB;AAAA,IACtB,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,aAAa,eAAe,SAAS;AAAA,IACzC,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,mBAAmB,qBAAqB,SAAS;AAAA,IACrD,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,aAAa,eAAe,SAAS;AAAA,IACzC,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,EAAE,iBAAiB,gBAAgB,IAAI,mBAAmB,SAAS;AAAA,IACvE,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB,CAAC;AAED,QAAM,EAAE,QAAQ,UAAU,IAAI,cAAc,SAAS,gBAAgB;AAAA,IACnE,sBAAsB;AAAA,IACtB,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,cAAc,yBAAyB,QAAQ;AAErD,SACE,gCAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,6BAA6B,MAAM;AAAA,MACnC,oBAAoB,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,sBAAsB,MAAM;AAAA,MAC5B,aAAa,MAAM;AAAA,MACnB,uBAAuB,MAAM;AAAA,MAC7B,YAAY,MAAM;AAAA,MAClB,cAAc,MAAM;AAAA,MACpB,YAAY,MAAM;AAAA,MAClB,eAAe,MAAM;AAAA,MACrB,aAAa,MAAM;AAAA,MACnB;AAAA,MACA,cAAcC;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,MAAM;AAAA,MACtB,gBAAgB,MAAM;AAAA,MACtB,gBAAgB,MAAM;AAAA,MACtB;AAAA,MACA,SAAS,MAAM;AAAA,MACf,gBAAgB,MAAM;AAAA,MACtB,iBAAiB,MAAM;AAAA,MACvB;AAAA,MACA,wBAAwB;AAAA,MACxB,wBAAwB;AAAA,MACxB,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,MACnB,gBAAgB,MAAM;AAAA,MACtB;AAAA,MACA,QAAQ,MAAM;AAAA,MACd,YAAY,MAAM;AAAA,MAClB,mBAAmB,MAAM;AAAA,MACzB;AAAA,MACA;AAAA,MACA,YAAY,MAAM;AAAA,MAClB,YAAY,MAAM;AAAA,MAClB;AAAA;AAAA,EACF;AAEJ;;;AjP9SA,IAAM,gBAA+B;AAAA,EACnC;AAAA,EACA,CAAC,WAAW,EAAE,aAAa,MAAM,CAAC;AAAA,EAClC;AAAA,EACA;AACF;AAEO,IAAM,oBAAoB,CAACC,UAChC,gCAAAC,QAAA,cAAC,YAAc,eAA8B,UAAQ,QAClDD,KACH;AAGF,IAAM,oBAAoB,CAAC,wBAAoD;AAC7E,MAAI;AACJ,aAAW,eAAe,OAAO,OAAO,mBAAmB,GAAG;AAC5D,gBAAY,QAAQ,CAAC,SAAS;AAC5B,UAAI,cAAc,IAAI,KAAK,WAAW,UAAU,KAAK,IAAI,KAAK,KAAK,UAAU;AAC3E;AACF,mBAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,IAAM,0BAA0B,CACrC,SACA,GACA,eAAwD,MACxD,yBACc;AACd,QAAM,gBACJ,QAAQ,MAAM,eAAe,QAAQ,MAAM,eAAe,SAAS,CAAC;AAEtE,QAAM,sBACJ,eAAe,OAAO,GAAG,YAAY,OAAyC,KAC9E,eAAe;AACjB,QAAM,OAAO,eAAe;AAE5B,MAAI,CAAC,eAAe;AAClB,WAAO,EAAE,gBAAgB;AAAA,EAC3B;AAEA,MAAI,cAAc,YAAY;AAC5B,WAAO,EAAE,iBAAiB;AAAA,EAC5B;AAEA,MAAI,MAAM;AACR,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,YACJ,KAAK,YAAY,OAAO,QAAQ,UAAU,EAAE,SACxC,EAAE,KAAK,IACN,KAAK,YAAY,QAAQ,EAAE,MAAM;AACxC,aAAO,EAAE,kDAA2C;AAAA,QAClD;AAAA,QACA,UAAU,KAAK;AAAA,MACjB,CAAC;AAAA,IACH,OAAO;AACL,YAAM,aAAa;AAAA,QACjB,KAAK;AAAA,MACP;AACA,YAAM,SACJ,cAAc,KAAK,QAAQ,KAAK,CAAC,QAAQ,IAAI,OAAO,WAAW,SAAS;AAE1E,UAAI,UAAU,YAAY;AACxB,eAAO,EAAE,mDAA4C;AAAA,UACnD,gBAAgB,OAAO;AAAA,UACvB,SACE,YAAY,MAAM,OAAO,QAAQ,UAAU,EAAE,SACzC,EAAE,KAAK,IACN,WAAW,MAAM,QAAQ,EAAE,MAAM;AAAA,QAC1C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,qBAAqB;AACvB,WAAO,uBAAuB,aAAa,IACvC,sBACA,kBAAkB,mBAAmB;AAAA,EAC3C;AAEA,MAAI,cAAc,SAAS;AACzB,WAAO,IAAI,cAAc,OAAO;AAAA,EAClC;AAEA,MAAI,cAAc,aAAa,QAAQ;AACrC,WAAO,EAAE,yBAAkB;AAAA,EAC7B;AAEA,MAAI,cAAc,iBAAiB;AACjC,WAAO,EAAE,0BAAmB;AAAA,EAC9B;AAEA,SAAO,EAAE,kBAAkB;AAC7B;AAIO,IAAM,6BAA6B,CACxC,YACwC;AACxC,QAAM,UAAU,OAAO,OAAO,QAAQ,MAAM,OAAO;AACnD,MAAI,QAAQ,UAAU,EAAG;AAEzB,QAAM,OAAgC,CAAC;AACvC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,EAAE,KAAK,IAAI,QAAQ,CAAC;AAC1B,QAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,MAAO;AACjC,SAAK,KAAK,EAAE,OAAO,KAAK,OAAO,MAAM,KAAK,KAAK,CAAC;AAChD,QAAI,KAAK,WAAW,EAAG;AAAA,EACzB;AACA,SAAO;AACT;AAEA,IAAM,wBAAwB,CAC5B,MACA,SACA,gBACG;AACH,MAAI,QAAQ,OAAO,IAAI,EAAG,QAAO,QAAQ,KAAK,IAAI;AAClD,QAAM,UAAU,OAAO,OAAO,QAAQ,MAAM,OAAO;AACnD,MAAI,QAAQ,WAAW,EAAG;AAC1B,QAAM,cAAc,QAAQ,KAAK,CAAC,WAAW,OAAO,MAAM,OAAO,aAAa,EAAE;AAChF,SAAO,aAAa,OAAO,IAAI;AACjC;AAEO,IAAM,kBAAkB,CAAC,SAAkB,gBAChD,sBAAsB,QAAQ,SAAS,WAAW;AAE7C,IAAM,kBAAkB,CAAC,SAAkB,gBAChD,sBAAsB,SAAS,SAAS,WAAW;;;ADjI9C,IAAM,wBAAwB,CAAC,UAAoC;AACxE,QAAM,EAAE,SAAS,eAAe,cAAc,IAAI;AAElD,QAAM,EAAE,OAAO,IAAI,eAAe,uBAAuB;AACzD,QAAM,CAAC,cAAc,eAAe,QAAI;AAAA,IACtC,MAAM,iBAAiB,gBAAgB,SAAS,OAAO,IAAI;AAAA,EAC7D;AACA,QAAM,CAAC,cAAc,eAAe,QAAI;AAAA,IACtC,MAAM,iBAAiB,gBAAgB,SAAS,OAAO,IAAI;AAAA,EAC7D;AAEA,QAAM,CAAC,yBAAyB,0BAA0B,QAAI,0BAE5D,MAAM,2BAA2B,OAAO,CAAC;AAE3C,iCAAU,MAAM;AACd,QAAI,iBAAiB,cAAe;AAEpC,UAAM,aAAa,MAAM;AACvB,UAAI,CAAC,cAAe,iBAAgB,gBAAgB,SAAS,OAAO,IAAI,CAAC;AACzE,UAAI,CAAC,eAAe;AAClB,wBAAgB,gBAAgB,SAAS,OAAO,IAAI,CAAC;AACrD,mCAA2B,2BAA2B,OAAO,CAAC;AAAA,MAChE;AAAA,IACF;AAEA,eAAW;AAEX,WAAO,GAAG,gBAAgB,UAAU;AACpC,WAAO,MAAM;AACX,aAAO,IAAI,gBAAgB,UAAU;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,MAAM,QAAQ,eAAe,aAAa,CAAC;AAEhE,SAAO;AAAA,IACL,cAAc,iBAAiB;AAAA,IAC/B,cAAc,iBAAiB;AAAA,IAC/B;AAAA,EACF;AACF;;;A6WrDA,IAAAE,kBAAiD;AAK1C,IAAK,wBAAL,kBAAKC,2BAAL;AACL,EAAAA,uBAAA,UAAO;AACP,EAAAA,uBAAA,eAAY;AACZ,EAAAA,uBAAA,UAAO;AAHG,SAAAA;AAAA,GAAA;AAYL,IAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EACA;AACF,MAAiD;AAC/C,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,CAAC,uBAAuB,wBAAwB,QAAI,0BAExD;AAEF,QAAM,mBAAe;AAAA,IACnB,CAAC,YACC,OAAO,QAAQ,WAAW,QAAQ,MAAM,OAAO,OAAO,KAAK;AAAA,IAC7D,CAAC,MAAM;AAAA,EACT;AAEA,iCAAU,MAAM;AAEd,QAAI,CAAC,aAAa;AAChB,+BAAyB,MAAS;AAAA,IACpC;AAEA,UAAM,mBAAmB,aAAa,WAAW;AACjD,QAAI,CAAC,aAAa,cAAc,CAAC,iBAAkB;AAEnD,UAAM,SAAS;AAAA,MACb,OAAO,YAAY;AAAA,MACnB,aAAa,YAAY,WAAW,QAAQ;AAAA,IAC9C;AACA,UAAM,oBAAoB,QAAQ,uBAAuB,kBAAkB,MAAM;AACjF,UAAM,sBACJ,QAAQ,uBAAuB,oBAAoB,MAAM;AAC3D;AAAA,MACE,kBAAkB,SAAS,KACxB,kBAAkB,WAAW,KAAK,kBAAkB,CAAC,EAAE,OAAO,OAAO,MAAM,KAC1E,oBACA,oBAAoB,SAAS,KAC1B,oBAAoB,WAAW,KAC9B,oBAAoB,CAAC,EAAE,OAAO,OAAO,MAAM,KAC7C,8BACA;AAAA,IACR;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,cAAc,WAAW,CAAC;AAE/C,iCAAU,MAAM;AACd,UAAM,mBAAmB,CAAC,UAAiB;AAEzC,UAAI,CAAC,aAAa,MAAM,OAAO,GAAG;AAChC,eAAO,yBAAyB,MAAS;AAAA,MAC3C;AACA,aAAO,yBAAyB,iBAA0B;AAAA,IAC5D;AAEA,YAAQ,GAAG,eAAe,gBAAgB;AAE1C,WAAO,MAAM;AACX,cAAQ,IAAI,eAAe,gBAAgB;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,SAAS,YAAY,CAAC;AAE1B,iCAAU,MAAM;AACd,QAAI,CAAC,aAAa,WAAW,EAAG;AAChC,UAAM,yBAAyB,CAAC,UAAiB;AAC/C,UACE,MAAM,MAAM,OAAO,OAAO,MAAM,MAChC,eACA,YAAY,OAAO,MAAM;AAEzB,iCAAyB,2BAA+B;AAAA,IAC5D;AAEA,UAAM,iBAAiB,CAAC,UAAiB;AACvC,UAAI,MAAM,MAAM,OAAO,OAAO,MAAM;AAClC,iCAAyB,iBAA0B;AAAA,IACvD;AAEA,YAAQ,GAAG,qBAAqB,sBAAsB;AACtD,YAAQ,GAAG,gBAAgB,cAAc;AAEzC,WAAO,MAAM;AACX,cAAQ,IAAI,qBAAqB,sBAAsB;AACvD,cAAQ,IAAI,gBAAgB,cAAc;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,cAAc,WAAW,CAAC;AAE/C,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;AvZpCO,IAAM,iBAAiB,CAAC,UAA+B;AAC5D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,yBAAAC,2BAA0B;AAAA,IAC1B,UAAU;AAAA,EACZ,IAAI;AACJ,QAAM;AAAA,IACJ,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,eAAe,gBAAgB;AACnC,QAAM,EAAE,GAAG,aAAa,IAAI,sBAAsB,gBAAgB;AAClE,QAAM,EAAE,cAAc,cAAc,wBAAwB,IAAI,sBAAsB;AAAA,IACpF;AAAA,EACF,CAAC;AAED,QAAM,CAAC,aAAa,cAAc,QAAI;AAAA,IACpC,QAAQ,MAAM,SAAS,QAAQ,MAAM,SAAS,SAAS,CAAC;AAAA,EAC1D;AACA,QAAM,CAAC,sBAAsB,uBAAuB,QAAI;AAAA,IAAoB,MAC1EA,yBAAwB,SAAS,GAAG,cAAc,oBAAoB;AAAA,EACxE;AAEA,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAAS,CAAC;AACtC,QAAM,EAAE,sBAAsB,IAAI,yBAAyB;AAAA,IACzD;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,WACJ,OAAO,WAAW,cAAc,eAAe,QAAQ,QAAQ,MAAM;AACvE,QAAM,EAAE,MAAM,IAAI,kBAAkB,OAAO;AAE3C,iCAAU,MAAM;AACd,UAAM,cAAc,CAAC,UAAiB;AACpC,UAAI,CAAC,MAAM,IAAK,QAAO,UAAU,CAAC;AAClC,UAAI,QAAQ,QAAQ,MAAM,IAAK,WAAU,CAAC;AAAA,IAC5C;AAEA,WAAO,GAAG,0BAA0B,WAAW;AAC/C,WAAO,MAAM,OAAO,IAAI,0BAA0B,WAAW;AAAA,EAC/D,GAAG,CAAC,SAAS,MAAM,CAAC;AAEpB,iCAAU,MAAM;AACd,UAAM,cAAc,CAAC,UAAiB;AACpC,UAAI,QAAQ,QAAQ,MAAM,IAAK;AAC/B,UAAI,MAAM,MAAM,OAAO,OAAO,MAAM,GAAI;AACxC,gBAAU,QAAQ,YAAY,CAAC;AAAA,IACjC;AACA,YAAQ,GAAG,4BAA4B,WAAW;AAClD,WAAO,MAAM;AACX,cAAQ,IAAI,4BAA4B,WAAW;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,SAAS,MAAM,CAAC;AAEpB,QAAM,yBAAqB;AAAA,IACzB,UACE,gBAAAC,SAAS,MAAM;AACb,UAAI,OAAO;AACT,kBAAU,CAAC;AAAA,MACb,OAAO;AACL,kBAAU,QAAQ,YAAY,CAAC;AAAA,MACjC;AAAA,IACF,GAAG,GAAG;AAAA,IACR,CAAC,SAAS,KAAK;AAAA,EACjB;AAEA,iCAAU,MAAM;AACd,uBAAmB;AACnB;AAAA,MACED,yBAAwB,SAAS,GAAG,cAAc,oBAAoB;AAAA,IACxE;AAEA,UAAM,cAAc,CAAC,UAAiB;AACpC,YAAM,kCACJ,MAAM,SAAS,2BAA2B,MAAM,OAAO,MAAM,QAAQ,QAAQ;AAE/E,UAAI,gCAAiC;AAErC;AAAA,QACE,QAAQ,MAAM,eAAe,QAAQ,MAAM,eAAe,SAAS,CAAC;AAAA,MACtE;AACA;AAAA,QACEA,yBAAwB,SAAS,GAAG,cAAc,oBAAoB;AAAA,MACxE;AACA,yBAAmB;AAAA,IACrB;AAEA,YAAQ,GAAG,eAAe,WAAW;AACrC,YAAQ,GAAG,mBAAmB,WAAW;AACzC,YAAQ,GAAG,mBAAmB,WAAW;AACzC,WAAO,GAAG,yBAAyB,WAAW;AAC9C,YAAQ,GAAG,qBAAqB,WAAW;AAC3C,YAAQ,GAAG,qBAAqB,WAAW;AAE3C,WAAO,MAAM;AACX,cAAQ,IAAI,eAAe,WAAW;AACtC,cAAQ,IAAI,mBAAmB,WAAW;AAC1C,cAAQ,IAAI,mBAAmB,WAAW;AAC1C,aAAO,IAAI,yBAAyB,WAAW;AAC/C,cAAQ,IAAI,qBAAqB,WAAW;AAC5C,cAAQ,IAAI,qBAAqB,WAAW;AAAA,IAC9C;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,CAAC,QAAS,QAAO;AAErB,SACE,gCAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;AwZ1MA,IAAAC,kBAA+E;AAU/E,IAAAC,gBAAiB;AASjB,IAAM,sBAAkB,+BAAoC;AAAA,EAC1D,gBAAgB;AAAA,EAChB,mBAAmB,MAAM;AAC3B,CAAC;AAEM,IAAM,WAAW,CAAC,EAAE,SAAS,MAAyB;AAC3D,QAAM,CAAC,gBAAgB,iBAAiB,QACtC,0BAAiD,UAAU;AAE7D,QAAM,EAAE,MAAM,IAAI,eAAe;AAEjC,QAAM,YAAQ,yBAAQ,OAAO,EAAE,gBAAgB,kBAAkB,IAAI,CAAC,cAAc,CAAC;AAErF,SACE,gCAAAC,QAAA,cAAC,gBAAgB,UAAhB,EAAyB,SACxB,gCAAAA,QAAA,cAAC,SAAI,eAAW,cAAAC,SAAK,YAAY,OAAO,qBAAqB,KAAI,QAAS,CAC5E;AAEJ;AAEA,IAAM,eAAe,CAAC,EAAE,SAAS,MAAyB;AACxD,QAAM,EAAE,eAAe,QAAI,4BAAW,eAAe;AAErD,MAAI,mBAAmB,WAAY,QAAO;AAE1C,SAAO,gCAAAD,QAAA,cAAC,SAAI,WAAU,mCAAiC,QAAS;AAClE;AAOA,IAAM,yBAAqB,+BAAuC;AAAA,EAChE,cAAc;AAAA,EACd,iBAAiB,MAAM;AACzB,CAAC;AAEM,IAAM,wBAAwB,UAAM,4BAAW,kBAAkB;AAExE,IAAM,cAAc,CAAC,EAAE,SAAS,MAAyB;AACvD,QAAM,EAAE,eAAe,QAAI,4BAAW,eAAe;AACrD,QAAM,CAAC,cAAc,eAAe,QAClC,0BAAkD,MAAS;AAE7D,QAAM,YAAQ,yBAAQ,OAAO,EAAE,cAAc,gBAAgB,IAAI,CAAC,YAAY,CAAC;AAE/E,MAAI,mBAAmB,UAAW,QAAO;AAEzC,SACE,gCAAAA,QAAA,cAAC,mBAAmB,UAAnB,EAA4B,SAC3B,gCAAAA,QAAA,cAAC,SAAI,WAAU,kCAAgC,QAAS,CAC1D;AAEJ;AAGO,IAAM,kBAAkB,CAAC,EAAE,aAAa,MAAiC;AAC9E,iCAAU,MAAM;AACd,QAAI,CAAC,aAAc;AAEnB,UAAM,yBAAyB,MAAM;AACnC,UAAI,SAAS,oBAAoB,aAAa,SAAS,SAAS,GAAG;AACjE,qBAAa,SAAS;AAAA,MACxB;AACA,UAAI,SAAS,oBAAoB,YAAY,CAAC,SAAS,SAAS,GAAG;AACjE,qBAAa,WAAW;AAAA,MAC1B;AAAA,IACF;AAEA,2BAAuB;AAEvB,WAAO,iBAAiB,SAAS,sBAAsB;AACvD,WAAO,iBAAiB,QAAQ,sBAAsB;AACtD,WAAO,MAAM;AACX,mBAAa,WAAW;AACxB,aAAO,iBAAiB,QAAQ,sBAAsB;AACtD,aAAO,oBAAoB,SAAS,sBAAsB;AAAA,IAC5D;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AACnB;AAoBA,IAAM,gBAAgB,CAAC,EAAE,SAAS,MAAyB;AACzD,QAAM,EAAE,aAAa,IAAI,sBAAsB;AAE/C,kBAAgB,EAAE,aAAa,CAAC;AAEhC,SAAO,gCAAAA,QAAA,cAAC,kBAAe,QAAQ,gBAAe,QAAS;AACzD;AAEA,IAAME,YAAW,CAAC,EAAE,kBAAkB,OAA2B;AAAA,EAC/D;AACF;AAEA,IAAM,mBAAmB,MAAM;AAC7B,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,kBAAkB,IAAI,cAAc,OAAO,QAAQ,OAAOA,SAAQ;AAE1E,QAAM,EAAE,gBAAgB,kBAAkB,QAAI,4BAAW,eAAe;AAExE,SACE,gCAAAF,QAAA,cAAC,SAAI,WAAU,mCACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe,mBAAmB;AAAA,MAClC,WAAU;AAAA,MACV,eAAe,MAAM,kBAAkB,UAAU;AAAA,MACjD,MAAK;AAAA;AAAA,IAEL,gCAAAA,QAAA,cAAC,KAAK,oBAAL,IAAwB;AAAA,IACzB,gCAAAA,QAAA,cAAC,SAAI,WAAU,+CAA4C,UAAQ;AAAA,EACrE,GACA,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe,mBAAmB;AAAA,MAClC,WAAU;AAAA,MACV,eAAe,MAAM,kBAAkB,SAAS;AAAA,MAChD,MAAK;AAAA;AAAA,IAEL,gCAAAA,QAAA,cAAC,oBAAiB,OAAO,mBAAmB,UAAS,eACnD,gCAAAA,QAAA,cAAC,KAAK,eAAL,IAAmB,CACtB;AAAA,IACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,+CAA4C,SAAO;AAAA,EACpE,CACF;AAEJ;AAEA,SAAS,WAAW;AACpB,SAAS,UAAU;AACnB,SAAS,gBAAgB;AACzB,SAAS,WAAW;;;Aja9Ib,IAAM,wBAAwB;AAAA,EACnC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,gBAAgB;AAClB;AAGA,IAAM,sBAAsB,CAAC;AAAA,EAC3B;AAAA,EACA;AACF,MAGM;AACJ,QAAM,aAAa,SAAS,aAAa,GAAG,CAAC;AAE7C,MAAI,iBAAiB;AAErB,MAAI,YAAY;AACd,sBACE,sBACG,WAAW,QAA+C,MAC7D,KAAK,sBAAsB;AAAA,EAC/B;AAEA,QAAM,8BAA8B,SAAS,MAAM,OAAO;AAE1D,MAAI,SAAS,cAAc,QAAQ;AACjC,eAAO,cAAAG,SAAK,+BAA+B,QAAQ,yBAAyB;AAE9E,MAAI,SAAS,cAAc,CAAC,QAAQ;AAClC,eAAO,cAAAA,SAAK,+BAA+B,QAAQ,iCAAiC;AAEtF,MAAI,YAAY,SAAS;AACvB,eAAO,cAAAA,SAAK,gBAAgB,+BAA+B,QAAQ,eAAe;AAEpF,aAAO,cAAAA;AAAA,IACL;AAAA,IACA,+BAA+B;AAAA,IAC/B,SAAS,QAAQ,YAAY,YAAY;AAAA,EAC3C;AACF;AAEO,IAAM,mBAAmB,CAAC,UAAiC;AAChE,QAAM,EAAE,OAAO,IAAI,eAAe;AAElC,QAAM,SAAS,yBAAyB;AAExC,QAAMC,gBAAW;AAAA,IACf,CAAC,eAA4B;AAAA,MAC3B,SAAS,UAAU;AAAA,MACnB,WAAW,UAAU;AAAA,MACrB,aAAa,UAAU,QAAQ,GAAG,EAAE;AAAA,MACpC,uBACG,OAAO,UAAU,UAAU,KAAK,OAAO,MAAM,GAAG,sBAAuB;AAAA,MAC1E,eAAe,UAAU;AAAA,IAC3B;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,EAAE,SAAS,WAAW,aAAa,uBAAuB,cAAc,IAC5E,cAAc,OAAO,OAAOA,SAAQ;AAEtC,QAAM,EAAE,cAAc,oBAAoB,IAAI,sBAAsB,EAAE,QAAQ,CAAC;AAE/E,QAAM,EAAE,cAAc,gBAAgB,IAAI,sBAAsB;AAEhE,QAAM,cAAc,YAAY,OAAO,aAAa;AAEpD,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe,iBAAiB;AAAA,MAChC,WAAU;AAAA,MACV,kBAAgB,OAAO;AAAA,MACvB,SAAS,MAAM,gBAAgB,MAAM;AAAA,MACrC,MAAK;AAAA,MACJ,GAAG;AAAA;AAAA,IAEJ,gCAAAA,QAAA,cAAC,SAAI,WAAU,yCACb,gCAAAA,QAAA,cAAC,KAAK,eAAL,IAAmB,GACpB,gCAAAA,QAAA,cAAC,SAAI,WAAU,8CACZ,mBACH,CACF;AAAA,IACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,gDACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,qDAC0B,gBAC1B,oBAAoB,EAAE,SAAS,cAAc,CAAC,CAC7D,GACC,CAAC,aAAa,gCAAAA,QAAA,cAAC,oBAAiB,OAAO,uBAAuB,CACjE;AAAA,IACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,8CACb,gCAAAA,QAAA,cAAC,UAAQ,GAAG,aAAa,GACzB,gCAAAA,QAAA,cAAC,SAAI,WAAU,sDACZ,CAAC,aACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,yDACZ,aAAa,MAAM,QAAQ,aAAa,MAAM,MAAM,gBACvD,GAEF,gCAAAA,QAAA,cAAC,SAAI,WAAU,iEACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,mDACZ,YACG,4BACA,oBAAoB;AAAA,MAClB,eAAe,OAAO,MAAM;AAAA,MAC5B,SAAS;AAAA,IACX,CAAC,CACP,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,wDACb,gCAAAA,QAAA,cAAC,aAAU,WAAW,aAAa,aAAa,YAAY,CAC9D,CACF,CACF,CACF;AAAA,EACF;AAEJ;;;ADhIA,IAAM,4BAAwB,+BAAkC,MAAS;AAElE,IAAM,2BAA2B,UAAM,4BAAW,qBAAqB;AAEvE,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AACF,MAA2B;AACzB,QAAM,EAAE,kBAAAC,oBAAmB,iBAAwB,IAAI,oBAAoB;AAE3E,SACE,gCAAAC,QAAA,cAAC,sBAAsB,UAAtB,EAA+B,OAAO,UACrC,gCAAAA,QAAA,cAACD,mBAAA,EAAkB,GAAG,uBAAuB,CAC/C;AAEJ;AA2BA;AAmBA;;;Ama3EA,IAAAE,kBAAkB;AAGX,IAAM,6BAA6B,MACxC,gCAAAC,QAAA,cAAC,SAAI,WAAU,6CACb,gCAAAA,QAAA,cAAC,KAAK,eAAL,IAAmB,GACG,wBAEzB;;;ACRF,IAAAC,kBAAkB;AAQlB,IAAMC,YAAW,CAAC,eAAmC;AAAA,EACnD,iBAAiB,UAAU;AAC7B;AAEO,IAAM,gCAAgC,MAAM;AACjD,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,gBAAgB,IAAI,cAAc,OAAO,QAAQ,OAAOA,SAAQ;AAExE,MAAI,CAAC,gBAAgB,OAAQ,QAAO;AAEpC,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,qCAEZ,gBAAgB,QAAO,mBACxB,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS,MAAM,OAAO,QAAQ,OAAO;AAAA;AAAA,IAErC,gCAAAA,QAAA,cAAC,KAAK,QAAL,IAAY;AAAA,EACf,CACF;AAEJ;;;AC9BA,IAAAC,kBAAkB;AAQlB,IAAMC,YAAW,CAAC,eAAmC;AAAA,EACnD,eAAe,UAAU,WAAW;AACtC;AAEO,IAAM,6BAA6B,MAAM;AAC9C,QAAM,EAAE,kBAAAC,oBAAmB,iBAAwB,IAAI,oBAAoB;AAC3E,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,cAAc,IAAI,cAAc,OAAO,QAAQ,OAAOD,SAAQ;AAEtE,MAAI,CAAC,cAAe,QAAO;AAE3B,SACE,gCAAAE,QAAA,cAAC,SAAI,WAAU,6CACb,gCAAAA,QAAA,cAACD,mBAAA,IAAiB,CACpB;AAEJ;;;AtaXA,IAAME,YAAW,CAAC,eAAmC,EAAE,SAAS,UAAU,QAAQ;AAElF,IAAM,iBAAkD,CAAC,GAAG,SAAS,KAAK;AAMnE,IAAM,gBAAgB,MAAM;AACjC,QAAM,EAAE,OAAO,IAAI,eAAe;AAElC,iCAAU,MAAM;AACd,UAAM,yBAAyB,MAAM;AACnC,UAAI,SAAS,oBAAoB,WAAW;AAC1C,eAAO,QAAQ,SAAS;AAAA,MAC1B;AACA,UAAI,SAAS,oBAAoB,UAAU;AACzC,eAAO,QAAQ,WAAW;AAAA,MAC5B;AAAA,IACF;AAEA,2BAAuB;AAEvB,aAAS,iBAAiB,oBAAoB,sBAAsB;AACpE,WAAO,MAAM;AACX,aAAO,QAAQ,WAAW;AAC1B,eAAS,oBAAoB,oBAAoB,sBAAsB;AAAA,IACzE;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AACb;AAEO,IAAM,aAAa,CAAC,EAAE,cAAc,MAAuB;AAChE,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM;AAAA,IACJ,4BAAAC,8BAA6B;AAAA,IAC7B,gBAAAC,kBAAiB;AAAA,IACjB,4BAAAC,8BAA6B;AAAA,IAC7B,+BAAAC,iCAAgC;AAAA,EAClC,IAAI,oBAAoB;AACxB,QAAM,EAAE,QAAQ,IAAI,cAAc,OAAO,QAAQ,OAAOJ,SAAQ;AAEhE,gBAAc;AAEd,SACE,gCAAAK,QAAA,cAAC,SAAI,WAAU,qCAEb,gCAAAA,QAAA,cAACD,gCAAA,IAA8B,GAC/B,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,qBAAqB,CAAC,aAAa,YAAY,OAAO,QAAQ,aAAa;AAAA,MAC3E,WAAU;AAAA,MACV,YAAY;AAAA,QACV,kBAAkBJ;AAAA,QAClB,QAAQE;AAAA,MACV;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,aAAa,CAAC,GAAG,WAAW,gCAAAE,QAAA,cAACH,iBAAA,EAAe,QAAgB;AAAA,MAG3D,GAAG;AAAA;AAAA,EACN,CACF;AAEJ;;;Aua5EA,IAAAI,kBAAiC;AACjC,IAAAC,gBAAiB;;;ACDjB,IAAAC,kBAAkC;AAG3B,IAAM,sBAAsB,gBAAAC,QAAM,cAEtC,EAAE,cAAc,OAAU,CAAC;AAEvB,IAAM,yBAAyB,UAAM,4BAAW,mBAAmB;;;ACP1E,IAAAC,kBAAkB;;;ACAlB,IAAAC,kBAAkB;AAIX,IAAMC,aAAY,CAAC,EAAE,MAAM,MAA0B;AAC1D,QAAM,EAAE,EAAE,IAAI,sBAAsB,WAAW;AAE/C,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,MAAK;AAAA,MACL,SAAQ;AAAA,MACR,OAAM;AAAA;AAAA,IAEN,gCAAAA,QAAA,cAAC,eAAO,SAAS,EAAE,OAAO,CAAE;AAAA,IAC5B,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA;AAAA,IACP;AAAA,EACF;AAEJ;;;ADHO,IAAM,eAAe,CAC1B,UAEG;AACH,QAAM,EAAE,aAAa,eAAe,cAAc,IAAI;AAEtD,QAAM,EAAE,EAAE,IAAI,sBAAsB,cAAc;AAClD,QAAM,EAAE,QAAQ,IAAI,uBAAuB,EAAE;AAC7C,QAAM,EAAE,aAAa,IAAI,sBAAsB;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,6BACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,qCACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,mCAAiC,EAAE,QAAQ,CAAE,GAC5D,gCAAAA,QAAA,cAAC,SAAI,WAAU,sCAAoC,YAAa,CAClE,GACA,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,mBAAmB;AAAA,MACjC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAS;AAAA;AAAA,IAET,gCAAAA,QAAA,cAACC,YAAA,IAAU;AAAA,EACb,CACF;AAEJ;;;AEhDA,IAAAC,kBAAkB;;;ACAlB,IAAAC,kBAAkB;AAKX,IAAM,cAAc,MAAM;AAC/B,QAAM,EAAE,OAAO,IAAI,uBAAuB,aAAa;AACvD,QAAM,EAAE,EAAE,IAAI,sBAAsB,aAAa;AAEjD,MAAI,CAAC,QAAQ,YAAa,QAAO;AAEjC,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,4BACZ,EAAE,cAAc,EAAE,OAAO,OAAO,YAAY,CAAC,CAChD;AAEJ;;;ADRO,IAAM,aAAa,CAAC,UAAwB;AACjD,QAAM,EAAE,aAAAC,eAAc,YAAmB,IAAI,oBAAoB,YAAY;AAC7E,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,iCACb,gCAAAA,QAAA,cAAC,WAAQ,gBAAc,MAAC,YAAU,MAAE,GAAG,OAAO,GAC9C,gCAAAA,QAAA,cAACD,cAAA,IAAY,CACf;AAEJ;;;AJmCO,IAAM,SAAS,CAAC,UAAuB;AAC5C,QAAM,EAAE,SAAS,eAAe,OAAO,IAAI,uBAAuB,QAAQ;AAC1E,QAAM,iBAAiB,iBAAiB;AAExC,MAAI,CAAC,UAAU,CAAC,eAAgB,QAAO;AACvC,MAAI,eAAe,YAAY,MAAO,QAAO;AAG7C;AAAA;AAAA,IAEE,gCAAAE,QAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,KAAK,WAAW,UAAU,iBAAiB,EAAE,IAAI,SAAS,GAAG;AAAA;AAAA,IAC/D;AAAA;AAEJ;AAEA,IAAMC,YAAW,CAAC,eAA4B;AAAA,EAC5C,eAAe,UAAU,WAAW;AAAA,EACpC,eAAe,UAAU,WAAW;AAAA,EACpC,eAAe,UAAU;AAAA,EACzB,SAAS,UAAU;AACrB;AAEA,IAAM,cAAc,CAAC,UAAyC;AAC5D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,sBAAsB;AAAA,IACtB,OAAO;AAAA,IACP,SAAS;AAAA,IACT,iBAAiB,OAAO,KAAK,eAAe;AAAA,IAC5C;AAAA,EACF,IAAI;AAEJ,QAAM,iBAAiB,iBAAiB;AAExC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,CAAC;AAAA,IAClB;AAAA,EACF,IAAI,uBAAuB,QAAQ;AACnC,QAAM,EAAE,aAAa,eAAe,IAAI,wBAAwB,QAAQ;AACxE,QAAM,EAAE,cAAc,IAAI,eAAe,QAAQ;AACjD,QAAM;AAAA,IACJ,SAAS;AAAA,IACT,YAAAC,cAAa;AAAA,IACb,cAAAC,gBAAe;AAAA,IACf,aAAa;AAAA,IACb;AAAA,EACF,IAAI,oBAAoB,QAAQ;AAEhC,QAAM,EAAE,eAAe,eAAe,eAAe,QAAQ,IAC3D,cAAc,gBAAgB,OAAOF,SAAQ,KAAK,CAAC;AAErD,QAAM,cACJ,aAAa,6BAA6B,SAAS,gBAAgB;AAErE,QAAM,gBAAgB,eAAe,4BAA4B;AACjE,QAAM,kBAAkB,eAAe,iBAAiB,iBAAiB;AACzE,QAAM,qBAAqB,iBAAiB;AAE5C,QAAM,oBAAoB,cAAc,yBAAyB;AAEjE,iCAAU,MAAM;AACd,QAAI,eAAgB;AAEpB,SAAK,QAAQ,eAAe,KAAK,GAAG;AAElC,qBAAe;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,QAAQ,gBAAgB,cAAc,CAAC;AAE3C,QAAM,cASF,iBACA;AAAA,IACE,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,UAAU,eAAe;AAAA,IACzB,eAAe,eAAe;AAAA,IAC9B,UAAU;AAAA,EACZ,IACA;AAAA,IACE,SAAS;AAAA,IACT,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAEJ,QAAM,kBAAkB,UAAU;AAElC,MAAI,CAAC,gBAAiB,QAAO;AAE7B,QAAM,cACJ,eAAe,cACf,cAAAG,SAAK,+CAA+C;AAAA,IAClD,iCAAiC;AAAA,EACnC,CAAC;AAEH,QAAM,OACJ,gCAAAJ,QAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,KAAK,gBAAgB;AAAA,MACrB,SAAS;AAAA,MACT,SAAS;AAAA,MACR,GAAG;AAAA;AAAA,EACN;AAGF;AAAA;AAAA,IAEE,gCAAAF,QAAA;AAAA,MAAC,oBAAoB;AAAA,MAApB;AAAA,QACC,OAAO;AAAA,UACL,cAAc,UAAU;AAAA,QAC1B;AAAA;AAAA,MAEA,gCAAAA,QAAA,cAAC,SAAI,WAAW,eACd,gCAAAA,QAAA,cAACG,eAAA,EAAa,aAA0B,QAAQ,iBAAiB,GACjE,gCAAAH,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,sBAAsB,CAAC;AAAA,UACvB;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,oBAAoB;AAAA,UACpB,YAAU;AAAA,UACT,GAAG;AAAA,UACH,GAAI,cACD,wCACA;AAAA;AAAA,MACN,GACA,gCAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,OAAO;AAAA,UACP,eAAa;AAAA,UACb,QAAQ,UAAU;AAAA,UACjB,GAAG;AAAA;AAAA,MACN,CACF;AAAA,IACF;AAAA;AAEJ;;;AzajMA,IAAM,aAAa,IAAI,yCAA6C,EAAE;AAE/D,IAAM,qBAAqB,MAAM;AACtC,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,QAAQ,IAAI,uBAAuB;AAC3C,QAAM,EAAE,SAAS,SAAS,cAAc,IAAI,kBAAkB;AAE9D,QAAM,EAAE,cAAc,cAAc,IAAI,uBAAuB;AAC/D,QAAM,iBAAiB,iBAAiB;AAExC,QAAM,0BAAsB,yBAAQ,MAAM;AACxC,QAAI,CAAC,cAAe,QAAO;AAE3B,WAAO;AAAA,EAET,GAAG,CAAC,eAAe,EAAE,CAAC;AAEtB,QAAM,0BAAsB,yBAAQ,MAAM;AACxC,QAAI,CAAC,cAAe,QAAO;AAE3B,WAAO;AAAA,EAET,GAAG,CAAC,eAAe,EAAE,CAAC;AAKtB,QAAM,sBAAkB,yBAAQ,MAAM;AACpC,QAAI,WAAW,qBAAqB;AAClC,YAAM,MAAM,qCAAgB,aAAa,mBAAmB;AAE5D,YAAM,iBAAiB,WAAW,IAAI,GAAG;AACzC,UAAI,gBAAgB;AAClB,uBAAe,gBAAgB;AAC/B,eAAO;AAAA,MACT;AAEA,aAAO,IAAI,qCAAgB;AAAA,QACzB;AAAA,QACA,aAAa;AAAA,QACb,oBAAoB;AAAA,MACtB,CAAC;AAAA,IACH,WAAW,gBAAgB;AACzB,aAAO,eAAe;AAAA,IACxB,WAAW,qBAAqB;AAC9B,YAAM,qBAAqB;AAAA,QACzB,GAAG;AAAA,QACH,gBAAgB,oBAAoB;AAAA,MACtC;AAEA,YAAM,MAAM,qCAAgB,aAAa,kBAAkB;AAE3D,YAAM,iBAAiB,WAAW,IAAI,GAAG;AACzC,UAAI,eAAgB,QAAO;AAE3B,aAAO,IAAI,qCAAgB;AAAA,QACzB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MACG,CAAC,iBAAiB,SAAS,EAAuC;AAAA,IACjE,gBAAgB;AAAA,EAClB,KACA,CAAC,WAAW,KAAK,gBAAgB,GAAG,GACpC;AACA,eAAW,IAAI,gBAAgB,KAAK,eAAe;AAAA,EACrD;AAEA,iCAAU,MAAM;AACd,UAAM,cAAc,gBAAgB,sBAAsB;AAC1D,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,SAAO;AACT;;;A+a9FA,IAAM,gBAAgB,CAAC,WAAmC;AAAA,EACxD,aAAa,MAAM;AACrB;AAEO,IAAM,4BAA4B,MAAM;AAC7C,QAAM,EAAE,kBAAkB,IAAI,mBAAmB;AACjD,QAAM,EAAE,YAAY,IAAI,cAAc,kBAAkB,OAAO,aAAa;AAC5E,SAAO;AAAA,IACL;AAAA,IACA,sBAAsB,kBAAkB;AAAA,IACxC,qBAAqB,kBAAkB;AAAA,IACvC,oBAAoB,kBAAkB;AAAA,IACtC,iBAAiB,kBAAkB;AAAA,IACnC,qBAAqB,kBAAkB;AAAA,IACvC,wBAAwB,kBAAkB;AAAA,IAC1C,wBAAwB,kBAAkB;AAAA,EAC5C;AACF;;;ACrBO,IAAM,uBAAuB;;;ACCpC,IAAAK,kBAAkB;AAClB,IAAAC,gBAAiB;AAIV,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACE,gCAAAC,QAAA,cAAC,YAAO,eAAW,cAAAC,SAAK,iCAAiC,SAAS,GAAI,GAAG,SACvE,gCAAAD,QAAA,cAAC,SAAI,WAAU,sCAAqC,GACpD,gCAAAA,QAAA,cAAC,SAAI,WAAU,wCAAsC,QAAS,CAChE;;;ACdF,IAAAE,kBAMO;;;ACLP,IAAAC,kBAAuB;AACvB,IAAAA,kBAA0B;AAC1B,IAAAA,kBAAgC;AAShC,IAAM,kBAAkB,gBAAAC,QAAM,cAAoC;AAAA,EAChE,OAAO,MAAM;AACf,CAAC;AAID,IAAM,0BAA0B,CAAC;AAAA,EAC/B;AAAA,EACA,GAAG;AACL,MACE,gCAAAA,QAAA,cAAC,gBAAgB,UAAhB,EAAyB,OAAO,SAAQ,QAAS;AAG7C,IAAM,qBAAqB,MAAM,gBAAAA,QAAM,WAAW,eAAe;AAQjE,IAAM,WAAW,CAAC,UAAyB;AAChD,QAAM,mBAAmB;AAEzB,SACE,gCAAAA,QAAA,cAAC,SAAI,WAAW,wBACd,gCAAAA,QAAA,cAAC,yBAAsB,IAAI,oBACzB,gCAAAA,QAAA,cAAC,iBAAe,GAAG,OAAO,UAAU,kBAAkB,CACxD,CACF;AAEJ;AAEA,IAAM,gBAAgB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAA4C;AAC1C,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,CAAC,YAAY,aAAa,QAAI,0BAAmC,IAAI;AAC3E,QAAM,CAAC,eAAe,gBAAgB,QAAI,0BAAiB,EAAE;AAC7D,QAAM,kBAAc,wBAA8B,IAAI;AACtD,QAAM,SAAS,UAAU,EAAE,IAAI,SAAS,CAAC;AACzC,QAAM,uBAAuB,gBAAgB,QAAQ;AAErD,iCAAU,MAAM;AACd,QAAI,CAAC,cAAc,OAAO,mBAAmB,YAAa;AAC1D,QAAI;AACJ,UAAM,WAAW,IAAI,eAAe,CAAC,CAAC,MAAM,MAAM;AAChD,UAAI,QAAS,cAAa,OAAO;AACjC,gBAAU,WAAW,MAAM;AACzB,cAAM,QAAQ,OAAO,OAAO,sBAAsB,EAAE,QAAQ;AAC5D,YAAI,CAAC,YAAY,SAAS;AACxB,2BAAiB,KAAK;AACtB;AAAA,QACF;AACA,oBAAY,QAAQ,MAAM,QAAQ;AAAA,MACpC,GAAG,GAAG;AAAA,IACR,CAAC;AACD,aAAS,QAAQ,UAAU;AAE3B,WAAO,MAAM;AACX,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,SACE,gCAAAA,QAAA,cAAC,2BAAwB,OAAO,OAAO,SACrC,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe;AAAA,MACf,iBAAc;AAAA,MACd,cAAY,EAAE,gBAAgB;AAAA,MAC9B,WAAU;AAAA,MACV,eAAY;AAAA,MACX,GAAG;AAAA,MACJ,SAAS,MAAM,QAAQ,OAAO;AAAA,MAC9B,KAAK;AAAA;AAAA,EACP,GACA,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,IAAI;AAAA,MACJ;AAAA,MACA,kBAAkB;AAAA,MAClB,UAAU;AAAA,MACV,WAAS;AAAA;AAAA,IAET,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAK;AAAA,QACL,OAAO,EAAE,OAAO,cAAc;AAAA;AAAA,MAE7B;AAAA,IACH;AAAA,EACF,CACF;AAEJ;;;AD/FA,IAAM,mCAAmC,KAAK;AAE9C,IAAM,mCAAmC;AAAA,EACvC,KAAK,KAAK;AAAA;AAAA,EACV,KAAK,KAAK;AAAA;AAAA,EACV,IAAI,KAAK,KAAK;AAAA;AAChB;AAeA,IAAM,wBAAwB,MAAM;AAE7B,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA,iBAAiB;AAAA,EACjB,iBAAiB;AACnB,MAAgC;AAC9B,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAmB,CAAC,CAAC;AACvD,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAA6B,MAAS;AACtF,QAAM,CAAC,qBAAqB,sBAAsB,QAChD,0BAAqC,IAAI;AAC3C,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,0BAAkB,KAAK;AACrE,QAAM,CAAC,0BAA0B,2BAA2B,QAAI,0BAE9D,MAAS;AAEX,QAAM,0BAAsB;AAAA,IAC1B,MAAM,eAAe,OAAO,CAAC,MAAM,KAAK,gCAAgC;AAAA,IACxE,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,8BAA0B;AAAA,IAC9B,OAAO;AAAA,MACL,WAAW,MACT,gCAAAC,QAAA,cAAC,aACE,EAAE,2BAA2B;AAAA,QAC5B,cAAc,oBAAoB,UAAU,CAAC;AAAA,MAC/C,CAAC,CACH,GACC;AAAA;AAAA,IACL;AAAA,IACA,CAAC,WAAW,kBAAkB,CAAC;AAAA,EACjC;AAEA,QAAM,kBAAc;AAAA,IAClB,MACE,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,gBAAU,YAAY;AAAA,QACpB,CAACC,cAAa;AACZ,kBAAQA,SAAQ;AAAA,QAClB;AAAA,QACA,CAAC,kBAAkB;AACjB,kBAAQ,KAAK,aAAa;AAC1B,iBAAO,aAAa;AAAA,QACtB;AAAA,QACA,EAAE,SAAS,IAAK;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,QAAM,4BAAwB,6BAAY,MAAM;AAC9C,uBAAmB,IAAI;AACvB,UAAM,QAAQ,UAAU,YAAY;AAAA,MAClC,CAACA,cAAa;AACZ,+BAAuBA,SAAQ;AAC/B,2BAAmB,KAAK;AACxB,oCAA4B,MAAS;AAAA,MACvC;AAAA,MACA,CAAC,UAAU;AACT,+BAAuB,IAAI;AAC3B,2BAAmB,KAAK;AACxB,oCAA4B,KAAK;AAAA,MACnC;AAAA,MACA,EAAE,SAAS,IAAK;AAAA,IAClB;AAEA,WAAO,MAAM;AACX,gBAAU,YAAY,WAAW,KAAK;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,iCAAU,MAAM,sBAAsB,GAAG,CAAC,qBAAqB,CAAC;AAEhE,SACE,gCAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEZ,gCAAAA,QAAA,cAAC,eAAY,OAAc,OAAO,EAAE,gBAAgB,GAAG;AAAA,IACvD,gCAAAA,QAAA,cAAC,SAAI,WAAU,4BACb,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU,qBAAqB,OAAO;AAAA,QACtC;AAAA,QACA,WAAW,qBAAqB,OAAO;AAAA,QACvC,yBAAyB;AAAA;AAAA,IAC3B,GACC,oBAAoB,SAAS,KAC5B,gCAAAA,QAAA,cAAC,SAAI,WAAU,wCACb,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,UAAU,SAAS;AAAA,QAC5B,eAAY;AAAA,QACZ,UAAU,CAAC;AAAA,QACX,WAAW,EAAE,yBAAyB;AAAA,QACtC,UAAU,CAAC,MAAM;AACf,YAAE,gBAAgB;AAClB,cAAI,UAAU,SAAS,GAAG;AACxB,yBAAa,CAAC,CAAC;AACf,gCAAoB,MAAS;AAAA,UAC/B,OAAO;AACL,yBAAa,mBAAmB;AAChC,gCAAoB,oBAAoB,CAAC,CAAC;AAAA,UAC5C;AAAA,QACF;AAAA;AAAA,IACF,GACC,UAAU,SAAS,KAClB,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAiB;AAAA,QACjB,WAAU;AAAA;AAAA,MAEV,gCAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,gBAAgB;AAAA;AAAA,MAClB;AAAA,IACF,CAEJ,CAEJ;AAAA,IACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,gCACb,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS,MAAM;AACb,0BAAgB,iBAAiB,UAAU;AAC3C,gBAAM;AAAA,QACR;AAAA;AAAA,MAEC,EAAE,QAAQ;AAAA,IACb,GACA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAU,CAAC;AAAA,QACX,SAAS,YAAY;AACnB,cAAI,SAAS,uBAAuB;AAAA,YAClC,UAAU,oBAAoB,OAAO;AAAA,YACrC,WAAW,oBAAoB,OAAO;AAAA,UACxC;AACA,cAAI,CAAC,QAAQ;AACX,sBAAU,MAAM,YAAY,GAAG;AAAA,UACjC;AACA,0BAAgB,iBAAiB,QAAQ;AAAA,YACvC,GAAG;AAAA,YACH,YAAY;AAAA,UACd,CAAC;AACD,gBAAM;AAAA,QACR;AAAA,QACA,MAAK;AAAA;AAAA,MAEJ,EAAE,QAAQ;AAAA,IACb,GACA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAU,CAAC;AAAA,QACX,SAAS,YAAY;AACnB,cAAI,SAAS,uBAAuB;AAAA,YAClC,UAAU,oBAAoB,OAAO;AAAA,YACrC,WAAW,oBAAoB,OAAO;AAAA,UACxC;AACA,cAAI,CAAC,QAAQ;AACX,gBAAI;AACF,wBAAU,MAAM,YAAY,GAAG;AAAA,YACjC,SAAS,GAAG;AACV,qBAAO,cAAc,SAAS;AAAA,gBAC5B,SAAS,EAAE,6BAA6B;AAAA,gBACxC,SAAS;AAAA,kBACP,eAAe,aAAa,QAAQ,IAAI;AAAA,kBACxC,MAAM;AAAA,gBACR;AAAA,gBACA,QAAQ,EAAE,SAAS,sBAAsB;AAAA,cAC3C,CAAC;AACD;AAAA,YACF;AAAA,UACF;AAEA,0BAAgB,iBAAiB,QAAQ;AAAA,YACvC,GAAG;AAAA,YACH,YAAY;AAAA,UACd,CAAC;AACD,cAAI;AACF,kBAAM,gBAAgB,aAAa;AAAA,UACrC,SAAS,KAAK;AACZ,mBAAO,cAAc,SAAS;AAAA,cAC5B,SAAS,EAAE,0BAA0B;AAAA,cACrC,SAAS;AAAA,gBACP,eAAe,eAAe,QAAQ,MAAM;AAAA,gBAC5C,MAAM;AAAA,cACR;AAAA,cACA,QAAQ,EAAE,SAAS,sBAAsB;AAAA,YAC3C,CAAC;AACD;AAAA,UACF;AACA,gBAAM;AAAA,QACR;AAAA,QACA,MAAK;AAAA;AAAA,MAEJ,EAAE,OAAO;AAAA,IACZ,CACF;AAAA,EACF;AAEJ;AAMA,IAAM,wBAAwB,CAAC;AAAA,EAC7B;AAAA,EACA;AACF,MAAkC;AAChC,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,MAAM,IAAI,mBAAmB;AACrC,SAAO,UAAU,IAAI,CAACE,cACpB,gCAAAF,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,KAAK,YAAYE,SAAQ;AAAA,MACzB,SAAS,MAAM;AACb,uBAAeA,SAAQ;AACvB,cAAM;AAAA,MACR;AAAA,MACA,MAAK;AAAA;AAAA,IAEJ,EAAE,2BAA2B,EAAE,cAAcA,UAAS,CAAC;AAAA,EAC1D,CACD;AACH;;;AEvQA,IAAAC,kBAAiD;AAMjD,IAAM,gCAA4B,+BAA8C;AAAA,EAC9E,WAAW;AACb,CAAC;AAEM,IAAM,oCAAoC,CAAC;AAAA,EAChD;AAAA,EACA;AACF,MACE,gCAAAC,QAAA,cAAC,0BAA0B,UAA1B,EAAmC,SACjC,QACH;AAGK,IAAM,+BAA+B,UAAM,4BAAW,yBAAyB;;;AtbCtF,IAAAC,gBAAiB;;;AubbjB,IAAM,iCAAiC,CAAC,WAAmC;AAAA,EACzE,aAAa,MAAM;AACrB;AACA,IAAMC,6BAA4B,CAAC,WAA8B;AAAA,EAC/D,MAAM,MAAM;AACd;AACA,IAAM,gCAAgC,CAAC,WAAkC;AAAA,EACvE,UAAU,MAAM;AAClB;AAEO,IAAM,2BAA2B,MAAM;AAC5C,QAAM,EAAE,mBAAmB,kBAAkB,aAAa,IAAI,mBAAmB;AACjF,QAAM,EAAE,YAAY,IAAI;AAAA,IACtB,kBAAkB;AAAA,IAClB;AAAA,EACF;AACA,QAAM,EAAE,KAAK,IAAI,cAAc,aAAa,OAAOA,0BAAyB;AAC5E,QAAM,EAAE,SAAS,IAAI;AAAA,IACnB,iBAAiB;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AClCA,IAAAC,kBAAoC;AAE7B,IAAM,mBAAmB,MAAM;AACpC,QAAM,EAAE,aAAa,IAAI,mBAAmB;AAC5C,QAAM,CAAC,eAAe,gBAAgB,QAAI,0BAAS,aAAa,aAAa;AAC7E;AAAA,IACE,MACE,aAAa,MAAM,UAAU,MAAM;AACjC,uBAAiB,aAAa,aAAa;AAAA,IAC7C,CAAC;AAAA,IACH,CAAC,YAAY;AAAA,EACf;AACA,SAAO;AACT;;;ACbA,IAAAC,kBAA6C;AAWtC,IAAM,mBAAmB,MAA0B;AACxD,QAAM,EAAE,QAAQ,6BAA6B,IAAI,eAAe,kBAAkB;AAClF,QAAM,EAAE,SAAS,WAAW,CAAC,EAAE,IAAI,uBAAuB,kBAAkB;AAC5E,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,0BAAiB;AAEnE,QAAM,EAAE,UAAU,mBAAmB,GAAG,iBAAiB,IAAK,QAAQ,QACpE,CAAC;AAEH,QAAM,eAAe,kBAAkB,SAAS,gBAAgB;AAEhE,QAAM,2BAAuB;AAAA,IAC3B,MACE,6BAA6B,QAAQ,GAAG,KACxC,CAAC,GAAG,QAAQ,EACT;AAAA,MACC,CAAC,GAAG,MAAO,EAAE,YAAqB,QAAQ,IAAK,EAAE,YAAqB,QAAQ;AAAA,IAChF,EACC,KAAK,CAAC,MAAM,EAAE,MAAM,OAAO,OAAO,MAAM,EAAE,GAAG;AAAA,IAClD,CAAC,UAAU,OAAO,MAAM,IAAI,8BAA8B,QAAQ,GAAG;AAAA,EACvE;AAEA,iCAAU,MAAM;AACd,UAAM,0BAA0B;AAAA;AAAA,MAE5B,KAAK,IAAI,KAAI,oBAAI,KAAK,GAAE,QAAQ,IAAI,qBAAqB,QAAQ,KAAK,GAAI;AAAA,QAC1E;AAEJ,UAAM,YACJ,CAAC,gBACD,OAAO,4BAA4B,eACnC,mBAAmB,0BACf,KAAK,MAAM,mBAAmB,uBAAuB,IACrD;AAEN,yBAAqB,SAAS;AAE9B,QAAI,CAAC,UAAW;AAEhB,UAAM,UAAU,WAAW,MAAM;AAC/B,2BAAqB,CAAC;AAAA,IACxB,GAAG,YAAY,GAAI;AAEnB,WAAO,MAAM;AACX,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,kBAAkB,sBAAsB,YAAY,CAAC;AAEzD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AChEA,IAAAC,kBAAkC;AAG3B,IAAM,iBAAiB,CAAC,UAA6B;AAC1D,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,kBAAc,wBAA4B,MAAS;AAEzD,iCAAU,MAAM;AACd,QAAI,SAAS,YAAY,SAAS;AAChC,kBAAY,QAAQ,MAAM;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;AChBA,IAAAC,kBAA4B;AAC5B,IAAAC,uBAAgC;AAOhC,IAAM,oBAAoB,CAAC,oBAAqC;AAC9D,QAAM,oBAAoB,gBAAgB,aAAa,MAAM,eAAe;AAC5E,QAAM,yBAAyB,gBAAgB,kBAAkB,MAAM,eAAe;AACtF,QAAM,2BACJ,gBAAgB,oBAAoB,MAAM,eAAe;AAC3D,QAAM,oBAAoB,gBAAgB,aAAa,MAAM,eAAe;AAC5E,QAAM,yBAAyB,gBAAgB,kBAAkB,MAAM,eAAe;AACtF,QAAM,QAAQ,gBAAgB,MAAM,eAAe;AAEnD,SAAO,MAAM;AACX,oBAAgB,MAAM,KAAK,KAAK;AAChC,oBAAgB,aAAa,MAAM,KAAK,iBAAiB;AACzD,oBAAgB,kBAAkB,MAAM,KAAK,sBAAsB;AACnE,oBAAgB,oBAAoB,MAAM,KAAK,wBAAwB;AACvE,oBAAgB,aAAa,MAAM,KAAK,iBAAiB;AACzD,oBAAgB,kBAAkB,MAAM,KAAK,sBAAsB;AAAA,EACrE;AACF;AAEO,IAAM,mBAAmB,CAAC,UAA6B;AAC5D,QAAM,EAAE,mBAAmB,sBAAsB,IAAI;AAErD,QAAM,EAAE,iBAAiB,aAAa,YAAY,IAChD,wBAAwB,kBAAkB;AAC5C,QAAM,EAAE,EAAE,IAAI,sBAAsB,kBAAkB;AACtD,QAAM,kBAAkB,mBAAmB;AAE3C,QAAM,mBAAe;AAAA,IACnB,OAAO,UAAqC;AAC1C,aAAO,eAAe;AACtB,YAAM,cAAc,MAAM,gBAAgB,QAAQ;AAClD,UAAI,CAAC,eAAe,CAAC,YAAY,QAAS;AAE1C,YAAM,EAAE,cAAc,SAAS,YAAY,IAAI;AAE/C,UAAI,gBAAgB,iBAAiB,aAAa,SAAS,SAAS;AAClE,YAAI;AACF,gBAAM,YAAY,cAAc,WAAW;AAC3C,8BAAoB;AAAA,QACtB,SAAS,KAAK;AACZ,0BAAgB,EAAE,6BAA6B,GAAG,OAAO;AAAA,QAC3D;AAAA,MACF,OAAO;AACL,cAAM,+BAA+B,kBAAkB,eAAe;AACtE,YAAI;AAGF,gBAAM,kBAAkB,CAAC,CAAC,QAAQ;AAClC,cAAI,iBAAiB;AACnB,4BAAgB,MAAM,YAAY;AAAA,cAChC,IAAI,qCAAgB,WAAW;AAAA,cAC/B,QAAQ;AAAA,YACV,CAAC;AAAA,UACH,OAAO;AACL,4BAAgB,MAAM;AAAA,UACxB;AAEA,cAAI,uBAAuB;AACzB,kBAAM,sBAAsB;AAAA,cAC1B,KAAK,gBAAgB,QAAQ;AAAA,cAC7B;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH,OAAO;AACL,kBAAM,YAAY,EAAE,cAAc,SAAS,SAAS,YAAY,CAAC;AAAA,UACnE;AACA,cAAI,gBAAgB,OAAO,KAAK;AAC9B,kBAAM,gBAAgB,QAAQ,WAAW;AAAA,QAC7C,SAAS,KAAK;AACZ,uCAA6B;AAC7B,0BAAgB,EAAE,6BAA6B,GAAG,OAAO;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,aAAa;AACxB;;;AC/FA,IAAAC,kBAA4B;AAIrB,IAAM,kBAAkB,MAAM;AACnC,QAAM,EAAE,mBAAmB,aAAa,IAAI,mBAAmB;AAC/D,QAAM,cAAU;AAAA,IACd,CAAC,mBAA8D;AAC7D,OAAC,OAAO,UAAU;AAChB,cAAM,EAAE,MAAM,IAAI,MAAM;AACxB,cAAM,eAAe;AAIrB,YAAI,mBAAgD;AACpD,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,gBAAM,OAAO,MAAM,CAAC;AACpB,cAAI,KAAK,SAAS,YAAY,KAAK,SAAS,cAAc;AACxD,+BAAmB,IAAI,QAAQ,CAAC,YAAY;AAC1C,mBAAK,YAAY,CAACC,YAAW;AAC3B,wBAAQA,OAAM;AAAA,cAChB,CAAC;AAAA,YACH,CAAC;AACD;AAAA,UACF;AAAA,QACF;AAEA,cAAM,YAAY,MAAM,yBAAyB,MAAM,KAAK,KAAK,CAAC;AAElE,YAAI,kBAAkB;AACpB,gBAAM,aAAa,MAAM;AACzB,uBAAa,WAAW,EAAE,MAAM,WAAW,CAAC;AAAA,QAC9C,OAAO;AACL,4BAAkB,YAAY,SAAS;AAAA,QACzC;AAAA,MACF,GAAG,cAAc;AAAA,IACnB;AAAA,IACA,CAAC,mBAAmB,YAAY;AAAA,EAClC;AAEA,SAAO,EAAE,QAAQ;AACnB;;;ACzCA,IAAAC,kBAA0D;;;ACMnD,IAAM,eAAN,MAA+C;AAAA,EAIpD,YAAY,aAA0B;AAHtC,kBAAS;AAIP,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,cAAc;AACZ,SAAK,SAAS;AACd,SAAK,eAAe;AAAA,EACtB;AACF;;;ACVO,SAAS,eAAkB,gBAAgD;AAChF,SAAO,OAAO,mBAAmB,aAAa,EAAE,MAAM,eAAe,IAAI;AAC3E;;;ACIO,IAAM,aAAN,MAA+C;AAAA,EAIpD,YAAY,UAAwB;AAHpC,SAAU,UAAU;AAIlB,QAAI,SAAU,MAAK,YAAY;AAAA,EACjC;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU,gBAAiD;AACzD,UAAM,WAAW,eAAkB,cAAc;AACjD,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,YAAY,QAAQ;AAAA,IAC3B;AACA,WAAO,IAAI,aAAa,MAAM;AAC5B,WAAK,UAAU;AAAA,IACjB,CAAC;AAAA,EACH;AACF;;;AC7BO,IAAM,UAAN,cAAyB,WAA0C;AAAA,EAKxE,cAAc;AACZ,UAAM;AALR,SAAQ,aAAuC,oBAAI,IAAI;AACvD,SAAQ,mBAAmB;AAAA,EAK3B;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,EAC5C;AAAA,EAEA,KAAK,OAAU;AACb,QAAI,KAAK,OAAQ;AACjB,UAAM,YAAY,KAAK;AACvB,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,gBAAU,CAAC,EAAE,KAAK,KAAK;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,KAAY;AAChB,QAAI,KAAK,OAAQ;AACjB,SAAK,cAAc;AACnB,UAAM,EAAE,UAAU,IAAI;AACtB,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,gBAAU,CAAC,EAAE,QAAQ,GAAG;AAAA,IAC1B;AACA,SAAK,WAAW,MAAM;AAAA,EACxB;AAAA,EAEA,WAAW;AACT,QAAI,KAAK,OAAQ;AACjB,SAAK,UAAU;AACf,UAAM,EAAE,UAAU,IAAI;AACtB,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,gBAAU,CAAC,EAAE,WAAW;AAAA,IAC1B;AACA,SAAK,WAAW,MAAM;AAAA,EACxB;AAAA,EAEA,UAAU,gBAAiD;AACzD,UAAM,WAAW,eAAkB,cAAc;AACjD,QAAI,KAAK,eAAe,KAAK,QAAQ;AACnC,YAAM,eAAe,IAAI,aAAa;AACtC,mBAAa,SAAS;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,KAAK;AACxB,SAAK,WAAW,IAAI,YAAY,QAAQ;AACxC,WAAO,IAAI,aAAa,MAAM;AAC5B,WAAK,WAAW,OAAO,UAAU;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEA,cAAoB;AAClB,SAAK,UAAU;AACf,SAAK,WAAW,MAAM;AAAA,EACxB;AACF;;;AC7DO,IAAM,kBAAN,cAAiC,QAAW;AAAA,EACjD,YAAoB,QAAW;AAC7B,UAAM;AADY;AAAA,EAEpB;AAAA,EAEA,IAAI,QAAW;AACb,UAAM,EAAE,QAAQ,YAAY,IAAI;AAChC,QAAI,aAAa;AACf,YAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,gBAAiD;AACzD,UAAM,WAAW,eAAkB,cAAc;AACjD,UAAM,eAAe,MAAM,UAAU,cAAc;AACnD,QAAI,CAAC,aAAa,OAAQ,UAAS,KAAK,KAAK,MAAM;AACnD,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,OAAgB;AACnB,UAAM,KAAM,KAAK,SAAS,KAAM;AAAA,EAClC;AACF;;;ACtBO,IAAK,sBAAL,kBAAKC,yBAAL;AACL,EAAAA,qBAAA,SAAM;AACN,EAAAA,qBAAA,SAAM;AAFI,SAAAA;AAAA,GAAA;AAKZ,IAAM,sBAAsE;AAAA,EAC1E,OAAO;AAAA,EACP,OAAO;AACT;AAMO,IAAM,oBAAN,MAAwB;AAAA,EAQ7B,YAAY,EAAE,UAAU,GAA6B;AANrD,iBAAQ,IAAI,gBAA6C,MAAS;AAClE,kBAAS,IAAI,gBAA8C,MAAS;AACpE,iBAAQ,IAAI,QAA2B;AAEvC,SAAQ,sBAAsC,CAAC;AAG7C,SAAK,OAAO,oBAAoB,SAAS;AAAA,EAC3C;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,oBAAoB,KAAK,CAAC,iBAAiB,CAAC,aAAa,MAAM;AAAA,EAC7E;AAAA,EAEA,MAAM,QAAQ;AACZ,QAAI,CAAC,KAAK,OAAO,OAAO;AACtB,YAAM,KAAK,MAAM;AACjB,UAAI,CAAC,KAAK,OAAO,MAAO;AAAA,IAC1B;AAEA,UAAM,SAAS,KAAK,OAAO;AAC3B,UAAM,yBAAyB,CAAC,MAAa;AAC3C,YAAM,EAAE,MAAM,IAAK,EAA+C;AAClE,WAAK,MAAM,KAAK,KAAK;AAAA,IACvB;AACA,WAAO,iBAAiB,UAAU,sBAAsB;AAExD,SAAK,oBAAoB;AAAA,MACvB,IAAI,aAAa,MAAM;AACrB,eAAO,oBAAoB,UAAU,sBAAsB;AAAA,MAC7D,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,UAAU;AACR,SAAK,oBAAoB,QAAQ,CAAC,iBAAiB,aAAa,YAAY,CAAC;AAAA,EAC/E;AAAA,EAEA,MAAM,QAAQ;AACZ,QAAI,CAAC,KAAK,MAAM;AACd,WAAK,MAAM,KAAK,IAAI,MAAM,oCAAoC,CAAC;AAC/D;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,mBAAmB,MAAM,UAAU,YAAY,MAAM;AAAA,QACzD,MAAM,KAAK;AAAA,MACb,CAAC;AACD,wBAAkB,iBAAiB;AACnC,WAAK,OAAO,KAAK,gBAAgB;AAAA,IACnC,SAAS,GAAG;AAGV,wBAAkB;AAAA,IACpB;AACA,SAAK,MAAM,KAAK,eAAe;AAAA,EACjC;AACF;;;AChFA,+BAA4B;AAC5B,IAAAC,iBAAuB;;;ACDvB,IAAAC,kBAAsB;AAOtB,IAAM,wBAAwB,CAAC,QAAiB,WAAoB,UAAU;AAEvE,IAAM,qBAAqB,CAAmB,QAAiB,eACpE,gBAAAC,SAA4B,QAAQ,QAAQ,qBAAqB;;;ACNnE,IAAM,0BAA0B;AAEhC,IAAM,WAAW,CAAC,MAAc,KAAK,QAAQ,MAAM,8BAA8B,CAAC;AAElF,IAAM,iBAAiB,CAAC,WACtB,KAAK,KAAK,OAAO,OAAO,CAAC,KAAK,QAAQ,MAAM,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,MAAM;AA+B3E,IAAM,oCAA6D;AAAA,EACxE,gBAAgB;AAAA,IACd,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AAAA,EACA,aAAa;AAAA,EACb,qBAAqB;AACvB;AAaO,IAAM,oBAAN,MAAwB;AAAA,EAc7B,YAAY,EAAE,QAAQ,OAAO,GAA6B;AAJ1D,sBAAa,IAAI,gBAA0B,CAAC,CAAC;AAC7C,iBAAQ,IAAI,gBAAoD,MAAS;AACzE,iBAAQ,IAAI,QAA2B;AAyBvC,iBAAQ,MAAM;AACZ,UAAI,KAAK,MAAM,UAAU,sBAA+B;AACxD,UAAI,CAAC,KAAK,QAAQ;AAChB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,UAAI,KAAK,MAAM,UAAU,4BAAkC,MAAK,KAAK;AAErE,UAAI,CAAC,KAAK,cAAc;AACtB,YAAI,CAAC,KAAK,OAAQ;AAClB,aAAK,KAAK;AAAA,MACZ;AAEA,WAAK,MAAM,KAAK,2BAAgC;AAEhD,WAAK,4BAA4B,YAAY,MAAM;AACjD,YAAI,EAAE,KAAK,gBAAgB,KAAK,MAAM,UAAU;AAC9C;AACF,cAAM,gBAAgB,IAAI,WAAW,KAAK,aAAa,iBAAiB;AACxE,YAAI;AACF,eAAK,aAAa,qBAAqB,aAAa;AAAA,QACtD,SAAS,GAAG;AACV,mBAAS,CAAU;AACnB,eAAK,MAAM,KAAK,CAAU;AAC1B;AAAA,QACF;AACA,cAAM,2BACJ,eAAe,aAAa,IAAI;AAClC,aAAK,WAAW,KAAK,CAAC,GAAG,KAAK,WAAW,OAAO,wBAAwB,CAAC;AAAA,MAC3E,GAAG,KAAK,OAAO,mBAAmB;AAAA,IACpC;AAtDE,SAAK,SAAS,mBAAmB,EAAE,GAAG,OAAO,GAAG,iCAAiC;AACjF,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,OAAO;AACL,SAAK,eAAe,IAAI,aAAa;AACrC,SAAK,eAAe,KAAK,aAAa,eAAe;AACrD,UAAM,EAAE,eAAe,IAAI,KAAK;AAChC,SAAK,aAAa,UAAU,eAAe;AAC3C,SAAK,aAAa,cAAc,eAAe;AAC/C,SAAK,aAAa,cAAc,eAAe;AAE/C,SAAK,aAAa,KAAK,aAAa,wBAAwB,KAAK,MAAM;AACvE,SAAK,WAAW,QAAQ,KAAK,YAAY;AAAA,EAC3C;AAAA,EAEA,OAAO;AACL,kBAAc,KAAK,yBAAyB;AAC5C,SAAK,4BAA4B;AACjC,SAAK,MAAM,KAAK,uBAA8B;AAAA,EAChD;AAAA,EAoCA,QAAQ;AACN,QAAI,KAAK,MAAM,UAAU,wBAAgC,MAAK,KAAK;AACnE,SAAK,MAAM,KAAK,qBAA6B;AAC7C,SAAK,WAAW,KAAK,CAAC,CAAC;AACvB,SAAK,YAAY,WAAW;AAC5B,SAAK,cAAc,WAAW;AAC9B,QAAI,KAAK,cAAc,UAAU,SAAU,MAAK,cAAc,MAAM;AAAA,EACtE;AACF;;;ACrIO,IAAM,gBAAgB,OAAO,SAAe;AACjD,QAAM,WAAW,IAAI,aAAa;AAElC,QAAM,cAAc,MAAM,sBAAsB,IAAI;AACpD,QAAM,cAAc,MAAM,SAAS,gBAAgB,WAAW;AAC9D,MAAI,SAAS,UAAU,SAAU,OAAM,SAAS,MAAM;AACtD,SAAO;AACT;AAUO,IAAM,cAAc,OAAO,aAA0B,eAAuB;AACjF,QAAM,kBAAkB,IAAI;AAAA,IAC1B,YAAY;AAAA,IACZ,YAAY,WAAW;AAAA,IACvB;AAAA,EACF;AACA,QAAM,SAAS,gBAAgB,mBAAmB;AAClD,SAAO,SAAS;AAChB,SAAO,QAAQ,gBAAgB,WAAW;AAC1C,SAAO,MAAM;AAEb,SAAO,MAAM,gBAAgB,eAAe;AAC9C;;;AClCA,IAAM,0BAA0B;AAChC,IAAM,mBAAmB;AACzB,IAAM,sBAAsB;AAE5B,IAAM,SAAS;AAAA,EACb,cAAc,EAAE,QAAQ,IAAI,OAAO,EAAE;AAAA;AAAA,EACrC,iBAAiB,EAAE,QAAQ,IAAI,OAAO,mBAAmB,EAAE;AAAA;AAAA,EAC3D,aAAa,EAAE,QAAQ,GAAG;AAAA,EAC1B,WAAW,EAAE,QAAQ,GAAG;AAAA,EACxB,eAAe,EAAE,QAAQ,GAAG;AAAA;AAAA,EAC5B,UAAU,EAAE,QAAQ,GAAG,OAAO,WAAW;AAAA;AAAA,EACzC,YAAY,EAAE,QAAQ,EAAE;AAAA,EACxB,aAAa,EAAE,QAAQ,GAAG,OAAO,WAAW;AAAA;AAAA,EAC5C,aAAa,EAAE,QAAQ,GAAG;AAAA,EAC1B,cAAc,EAAE,QAAQ,IAAI,OAAO,WAAW;AAAA;AAAA,EAC9C,gBAAgB,EAAE,QAAQ,IAAI,OAAO,GAAG;AAAA;AAAA,EACxC,cAAc,EAAE,QAAQ,IAAI,OAAO,WAAW;AAAA;AAAA,EAC9C,gBAAgB,EAAE,QAAQ,GAAG;AAAA;AAC/B;AAEA,IAAM,iBAAiB,CAAC,UACrB,MAAM,WAAW,CAAC,KAAK,KACvB,MAAM,WAAW,CAAC,KAAK,KACvB,MAAM,WAAW,CAAC,KAAK,IACxB,MAAM,WAAW,CAAC;AAEpB,IAAM,mBAAmB;AAAA,EACvB,MAAM,eAAe,MAAM;AAAA,EAC3B,KAAK,eAAe,MAAM;AAAA,EAC1B,MAAM,eAAe,MAAM;AAAA,EAC3B,MAAM,eAAe,MAAM;AAC7B;AASA,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,MAA6B;AAC3B,QAAM,WAAW,aAAa,eAAe;AAC7C,QAAM,aAAa,eAAe;AAElC,QAAM,WAAW,IAAI,SAAS,WAAW;AAKzC,QAAM,gBAAgB,KAAK;AAAA,IACzB,SAAS,aAAa;AAAA,IACtB,sBAAsB;AAAA,EACxB;AAEA,WAAS,UAAU,OAAO,SAAS,QAAQ,OAAO,SAAS,KAAK;AAChE,WAAS,UAAU,OAAO,WAAW,QAAQ,YAAY,aAAa,GAAG,IAAI;AAC7E,WAAS,UAAU,OAAO,YAAY,QAAQ,OAAO,YAAY,KAAK;AAEtE,WAAS,UAAU,OAAO,aAAa,QAAQ,OAAO,aAAa,KAAK;AACxE,WAAS,UAAU,OAAO,eAAe,QAAQ,OAAO,eAAe,OAAO,IAAI;AAClF,WAAS,UAAU,OAAO,aAAa,QAAQ,OAAO,aAAa,OAAO,IAAI;AAC9E,WAAS,UAAU,OAAO,cAAc,QAAQ,cAAc,IAAI;AAClE,WAAS,UAAU,OAAO,YAAY,QAAQ,YAAY,IAAI;AAC9D,WAAS,UAAU,OAAO,UAAU,QAAQ,UAAU,IAAI;AAC1D,WAAS,UAAU,OAAO,YAAY,QAAQ,YAAY,IAAI;AAC9D,WAAS,UAAU,OAAO,gBAAgB,QAAQ,OAAO,gBAAgB,OAAO,IAAI;AAEpF,WAAS,UAAU,OAAO,aAAa,QAAQ,OAAO,aAAa,KAAK;AACxE,WAAS,UAAU,OAAO,eAAe,QAAQ,eAAe,IAAI;AACtE;AAyBA,IAAM,qBAAqB,CAAC,gBAC1B,MAAM;AAAA,EAAK,EAAE,QAAQ,YAAY,iBAAiB;AAAA,EAAG,CAAC,GAAG,MACvD,YAAY,eAAe,CAAC;AAC9B;AAaF,IAAM,oBAAoB,CAAC,EAAE,aAAa,cAAc,MAA4B;AAClF,QAAM,WAAW,IAAI,SAAS,WAAW;AACzC,QAAM,eAAe,cAAc;AAEnC,gBAAc,QAAQ,CAAC,aAAa,iBAAiB;AACnD,QAAI,cAAc,0BAA0B,eAAe;AAE3D,gBAAY,QAAQ,CAAC,iBAAiB;AACpC,eAAS;AAAA,QACP;AAAA,QACA,eAAe,IACX,KAAK,IAAI,IAAI,YAAY,IAAI,QAC7B,KAAK,IAAI,GAAG,YAAY,IAAI;AAAA,QAChC;AAAA,MACF;AACA,qBAAe,eAAe;AAAA,IAChC,CAAC;AAAA,EACH,CAAC;AACH;AAEO,IAAM,cAAc,OAAO,MAAY,eAAuB;AACnE,QAAM,cAAc,MAAM,YAAY,MAAM,cAAc,IAAI,GAAG,UAAU;AAC3E,QAAM,kBAAkB,YAAY,WAAW;AAC/C,QAAM,gBACJ,kBAAkB,YAAY,mBAAmB,mBACjD;AAEF,QAAM,cAAc,IAAI,YAAY,aAAa;AACjD,iBAAe,EAAE,aAAa,cAAc,YAAY,kBAAkB,WAAW,CAAC;AACtF,oBAAkB,EAAE,aAAa,eAAe,mBAAmB,WAAW,EAAE,CAAC;AACjF,SAAO,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,MAAM,YAAY,CAAC;AACtD;;;ACrIO,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA,UAAU;AAAA,EACV;AACF,MACE;AAAA,EACE,oBAAoB;AAAA,IAClB,YAAY,CAAC,IAAI;AAAA,IACjB,UAAU,oBAAmB,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI;AAAA,MACvD,KAAK;AAAA,IACP,CAAC;AAAA,IACD,UAAU,KAAK;AAAA,EACjB,CAAC;AAAA,EACD;AACF;;;ALLK,IAAM,gCAAgC;AAAA,EAC3C,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;AAEO,IAAM,kCAAoD;AAAA,EAC/D,YAAY;AACd;AAEA,IAAM,uBAAuB,CAAC,WAAyB;AACrD,MAAI,CAAC,QAAQ,OAAQ;AACrB,SAAO,UAAU,EAAE,QAAQ,CAAC,UAAU;AACpC,UAAM,KAAK;AACX,WAAO,YAAY,KAAK;AAAA,EAC1B,CAAC;AACH;AAEA,IAAMC,YAAW,CAAC,MAAc,KAAK,QAAQ,MAAM,0BAA0B,CAAC;AAqBvE,IAAK,sBAAL,kBAAKC,yBAAL;AACL,EAAAA,qBAAA,YAAS;AACT,EAAAA,qBAAA,eAAY;AACZ,EAAAA,qBAAA,aAAU;AAHA,SAAAA;AAAA,GAAA;AAUL,IAAM,0BAAN,MAA8B;AAAA,EAyBnC,YAAY,EAAE,QAAQ,wBAAwB,EAAE,IAA0B,CAAC,GAAG;AAf9E,kCAAmC,CAAC;AACpC,wBAAuB,CAAC;AAMxB,0BAAiB,IAAI,gBAAiD,MAAS;AAC/E,qBAAY,IAAI,gBAA2D,MAAS;AACpF,iBAAQ,IAAI,QAA2B;AACvC,wBAAe,IAAI,QAAiE;AA4CpF,kCAAyB,CAAC,aAAqB;AAC7C,UAAI,KAAK,8BAA8B;AACrC,eAAO,KAAK,6BAA6B,QAAQ;AAAA,MACnD;AACA,aAAO,GAAG,KAAK,SAAS,eAAc,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI;AAAA,QAChE;AAAA,MACF,CAAC;AAAA,IACH;AAEA,8BAAqB,YAAY;AAC/B,UAAI,KAAK,aAAc,KAAI,gBAAgB,KAAK,YAAY;AAE5D,UAAI,CAAC,KAAK,aAAa,OAAQ;AAC/B,YAAM,EAAE,SAAS,IAAI,KAAK;AAC1B,UAAI,OAAO,IAAI,KAAK,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AACzD,UAAI,SAAS,MAAM,YAAY,GAAG;AAEhC,eAAO,UAAM,yBAAAC,SAAgB,MAAM,KAAK,YAAY;AAAA,UAClD,QAAQ,MAAM;AAAA;AAAA,QAChB,CAAC;AAAA,MACH;AACA,UAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,eAAO,MAAM,UAAU;AAAA,UACrB;AAAA,UACA,GAAG,KAAK;AAAA,QACV,CAAC;AAAA,MACH;AAEA,UAAI,CAAC,KAAM;AAEX,WAAK,eAAe,IAAI,gBAAgB,IAAI;AAC5C,YAAM,OAAO,oBAAoB;AAAA,QAC/B,YAAY,CAAC,IAAI;AAAA,QACjB,UAAU,KAAK,uBAAuB,KAAK,IAAI;AAAA,QAC/C,UAAU,KAAK;AAAA,MACjB,CAAC;AAED,aAAO;AAAA,QACL,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK,aAAa;AAAA,QAC5B,WAAW,KAAK;AAAA,QAChB,eAAe;AAAA,UACb;AAAA,UACA,QAAI,uBAAO;AAAA,QACb;AAAA,QACA,WAAW,KAAK;AAAA,QAChB,OAAO,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,eAAe;AAAA,UACb,KAAK,mBAAmB,WAAW,SAAS,CAAC;AAAA,UAC7C,KAAK,wBAAwB;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAEA,4BAAmB,CAAC,MAAa;AAC/B,YAAM,EAAE,MAAM,IAAI;AAClB,MAAAC,UAAS,KAAK;AACd,WAAK,MAAM,KAAK,KAAK;AACrB,WAAK,aAAa,KAAK;AAAA,QACrB,MAAM,KAAK,EAAE,wCAAwC;AAAA,QACrD,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,oCAA2B,OAAO,MAAiB;AACjD,UAAI,CAAC,EAAE,KAAK,KAAM;AAClB,UAAI,KAAK,cAAc,QAAS;AAChC,UAAI;AACF,aAAK,aAAa,KAAK,EAAE,IAAI;AAC7B,cAAM,YAAY,MAAM,KAAK,mBAAmB;AAChD,YAAI,CAAC,UAAW;AAChB,aAAK,uBAAuB,SAAS;AACrC,aAAK,UAAU,KAAK,SAAS;AAAA,MAC/B,SAASC,IAAG;AACV,QAAAD,UAASC,EAAU;AACnB,aAAK,MAAM,KAAKA,EAAU;AAC1B,aAAK,aAAa,KAAK;AAAA,UACrB,MAAM,KAAK,EAAE,uDAAuD;AAAA,UACpE,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAEA,+BAAsB,MAAM;AAC1B,WAAK,eAAe,CAAC;AACrB,WAAK,UAAU,KAAK,MAAS;AAC7B,WAAK,eAAe,KAAK,MAAS;AAClC,WAAK,yBAAyB,CAAC;AAC/B,WAAK,YAAY;AAAA,IACnB;AAEA,mBAAU,MAAM;AACd,WAAK,oBAAoB;AACzB,UAAI,KAAK,aAAc,KAAI,gBAAgB,KAAK,YAAY;AAC5D,WAAK,mBAAmB,MAAM;AAC9B,UAAI,KAAK,eAAe;AACtB,6BAAqB,KAAK,cAAc,MAAM;AAC9C,aAAK,cAAc;AAAA,UACjB;AAAA,UACA,KAAK;AAAA,QACP;AACA,aAAK,cAAc,oBAAoB,SAAS,KAAK,gBAAgB;AAAA,MACvE;AAAA,IACF;AAEA,iBAAQ,YAAY;AAClB,UACE,CAAC,6BAA+B,qBAA0B,EAAE;AAAA,QAC1D,KAAK,eAAe;AAAA,MACtB,GACA;AACA,cAAM,QAAQ,IAAI,MAAM,uDAAuD;AAC/E,QAAAD,UAAS,KAAK;AACd,aAAK,MAAM,KAAK,KAAK;AACrB;AAAA,MACF;AAGA,UAAI,CAAC,UAAU,cAAc;AAC3B,cAAM,QAAQ,IAAI,MAAM,kCAAkC;AAC1D,QAAAA,UAAS,KAAK;AACd,aAAK,MAAM,KAAK,KAAK;AACrB,aAAK,aAAa,KAAK,EAAE,MAAM,KAAK,EAAE,0BAA0B,GAAG,MAAM,QAAQ,CAAC;AAClF;AAAA,MACF;AAEA,UAAI,KAAK,cAAc,SAAS;AAC9B,cAAM,QAAQ,IAAI;AAAA,UAChB,yDAAyD,KAAK,oBAAoB,QAAQ;AAAA,QAC5F;AACA,QAAAA,UAAS,KAAK;AACd,aAAK,MAAM,KAAK,KAAK;AACrB,aAAK,aAAa,KAAK,EAAE,MAAM,KAAK,EAAE,0BAA0B,GAAG,MAAM,QAAQ,CAAC;AAClF;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,WAAW,MAAM,OAAO;AAChC,cAAM,KAAK,WAAW,MAAM;AAAA,MAC9B;AAEA,UAAI,KAAK,WAAW,MAAM,UAAU,UAAU;AAC5C,QAAAA,UAAS,IAAI,MAAM,mBAAmB,CAAC;AACvC;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,UAAU,aAAa,aAAa,EAAE,OAAO,KAAK,CAAC;AACxE,aAAK,gBAAgB,IAAI,cAAc,QAAQ,KAAK,mBAAmB;AAEvE,aAAK,cAAc,iBAAiB,iBAAiB,KAAK,wBAAwB;AAClF,aAAK,cAAc,iBAAiB,SAAS,KAAK,gBAAgB;AAElE,aAAK,aAAY,oBAAI,KAAK,GAAE,QAAQ;AACpC,aAAK,cAAc,MAAM;AAEzB,YAAI,KAAK,cAAc,WAAW,QAAQ;AACxC,eAAK,oBAAoB,IAAI,kBAAkB;AAAA,YAC7C,QAAQ,KAAK;AAAA,YACb;AAAA,UACF,CAAC;AACD,eAAK,kBAAkB,MAAM;AAAA,QAC/B;AAEA,aAAK,eAAe,KAAK,2BAA6B;AAAA,MACxD,SAAS,OAAO;AACd,QAAAA,UAAS,KAAc;AACvB,aAAK,OAAO;AACZ,aAAK,MAAM,KAAK,KAAc;AAC9B,aAAK,aAAa,KAAK,EAAE,MAAM,KAAK,EAAE,0BAA0B,GAAG,MAAM,QAAQ,CAAC;AAAA,MACpF;AAAA,IACF;AAEA,iBAAQ,MAAM;AACZ,UAAI,KAAK,eAAe,UAAU,4BAA+B;AACjE,UAAI,KAAK,WAAW;AAClB,aAAK,uBAAuB,MAAK,oBAAI,KAAK,GAAE,QAAQ,IAAI,KAAK,SAAS;AACtE,aAAK,YAAY;AAAA,MACnB;AACA,WAAK,eAAe,MAAM;AAC1B,WAAK,mBAAmB,KAAK;AAC7B,WAAK,eAAe,KAAK,qBAA0B;AAAA,IACrD;AAEA,kBAAS,MAAM;AACb,UAAI,KAAK,eAAe,UAAU,sBAA4B;AAC9D,WAAK,aAAY,oBAAI,KAAK,GAAE,QAAQ;AACpC,WAAK,eAAe,OAAO;AAC3B,WAAK,mBAAmB,MAAM;AAC9B,WAAK,eAAe,KAAK,2BAA6B;AAAA,IACxD;AAEA,gBAAO,MAAM;AACX,YAAM,YAAY,KAAK,UAAU;AACjC,UAAI,UAAW,QAAO,QAAQ,QAAQ,SAAS;AAE/C,UACE,CAAC,CAAC,uBAA4B,2BAA6B,EAAE;AAAA,QAC1D,KAAK,eAAe,SAAS;AAAA,MAChC;AAEA,eAAO,QAAQ,QAAQ,MAAS;AAElC,UAAI,KAAK,WAAW;AAClB,aAAK,uBAAuB,MAAK,oBAAI,KAAK,GAAE,QAAQ,IAAI,KAAK,SAAS;AACtE,aAAK,YAAY;AAAA,MACnB;AACA,YAAM,SAAS,IAAI,QAAuC,CAAC,QAAQ;AACjE,aAAK,uBAAuB;AAAA,MAC9B,CAAC;AACD,WAAK,eAAe,KAAK;AACzB,WAAK,mBAAmB,KAAK;AAC7B,WAAK,eAAe,KAAK,uBAA2B;AACpD,aAAO;AAAA,IACT;AAEA,kBAAS,MAAM;AACb,WAAK,KAAK;AACV,WAAK,QAAQ;AAAA,IACf;AAjQE,SAAK,IAAI,KAAK;AAEd,SAAK,0BAA0B;AAAA,MAC7B,EAAE,GAAG,QAAQ,wBAAwB;AAAA,MACrC;AAAA,IACF;AAEA,SAAK,sBAAsB;AAAA,MACzB,EAAE,GAAG,QAAQ,oBAAoB;AAAA,MACjC;AAAA,QACE,UAAU,cAAc,gBAAgB,YAAY,IAChD,8BAA8B,MAAM,SACpC,8BAA8B,MAAM;AAAA,MAC1C;AAAA,IACF;AAEA,SAAK,mBAAmB;AAAA,MACtB,EAAE,GAAG,QAAQ,iBAAiB;AAAA,MAC9B;AAAA,IACF;AAEA,UAAM,YAAY,iCAAiC,KAAK,oBAAoB,QAAQ;AACpF,QAAI,CAAC,WAAW;AACd,YAAM,IAAI;AAAA,QACR,8EAA8E,KAAK,oBAAoB,QAAQ;AAAA,MACjH;AAAA,IACF;AACA,SAAK,YAAY;AAEjB,SAAK,aAAa,IAAI,kBAAkB,EAAE,UAAU,CAAC;AAErD,SAAK,+BAA+B;AAAA,EACtC;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,uBAAuB,OAAO,CAAC,KAAK,QAAQ,MAAM,KAAK,CAAC;AAAA,EACtE;AA8NF;;;AP3UO,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAmD;AACjD,QAAM,EAAE,EAAE,IAAI,sBAAsB,kBAAkB;AACtD,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAwC;AAC1E,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,0BAA8B;AAC1E,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,0BAA0B;AACxE,QAAM,CAAC,sBAAsB,iBAAiB,QAAI,0BAAS,KAAK;AAEhE,QAAM,eAAW;AAAA,IACf,MACE,UACI,IAAI,wBAAwB;AAAA,MAC1B,QAAQ,mBAAmB,CAAC;AAAA,MAC5B;AAAA,MACA;AAAA,IACF,CAAC,IACD;AAAA,IACN,CAAC,iBAAiB,SAAS,wBAAwB,CAAC;AAAA,EACtD;AAEA,QAAM,wBAAoB,6BAAY,YAAY;AAChD,QAAI,CAAC,SAAU;AACf,UAAME,aAAY,MAAM,SAAS,KAAK;AACtC,QAAI,CAACA,WAAW;AAChB,UAAM,gBAAgB,kBAAkB,iBAAiBA,UAAS;AAClE,QAAI,CAAC,+BAA+B;AAElC,wBAAkB,IAAI;AAAA,IACxB;AACA,aAAS,QAAQ;AAAA,EACnB,GAAG,CAAC,+BAA+B,iBAAiB,QAAQ,CAAC;AAE7D,iCAAU,MAAM;AACd,QAAI,CAAC,qBAAsB;AAC3B,iBAAa;AACb,sBAAkB,KAAK;AAAA,EACzB,GAAG,CAAC,cAAc,oBAAoB,CAAC;AAEvC,iCAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,aAAS,WAAW,MAAM;AAC1B,UAAM,wBAAwB,SAAS,UAAU,UAAU,YAAY;AACvE,UAAM,6BACJ,SAAS,eAAe,UAAU,iBAAiB;AACrD,UAAM,8BACJ,SAAS,WAAW,MAAM,UAAU,kBAAkB;AAExD,WAAO,MAAM;AACX,eAAS,OAAO;AAChB,eAAS,WAAW,QAAQ;AAC5B,4BAAsB,YAAY;AAClC,iCAA2B,YAAY;AACvC,kCAA4B,YAAY;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AahFO,IAAM,0BAA0B,CACrC,UAC0B;AAC1B,QAAM,EAAE,+BAA+B,sBAAsB,sBAAsB,IACjF;AAEF,QAAM,EAAE,YAAY,IAAI,eAAe,KAAK;AAE5C,QAAM,EAAE,aAAa,IAAI,iBAAiB,KAAK;AAE/C,QAAM,sBAAsB,iBAAiB;AAAA,IAC3C;AAAA,IACA,SAAS,CAAC,CAAC;AAAA,IACX;AAAA,IACA,iBAAiB;AAAA,EACnB,CAAC;AAED,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AAEpC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACpCA,IAAM,iCAAiC,CAAC,UAA6B;AAE9D,IAAM,oCAAoC,MAAM;AACrD,QAAM,kBAAkB,mBAAmB;AAC3C,gBAAc,gBAAgB,mBAAmB,8BAA8B;AAC/E,SAAO,gBAAgB;AACzB;;;A3ccO,IAAM,2BAA2B,MAAM;AAC5C,QAAM;AAAA,IACJ;AAAA,IACA,iBAAiB;AAAA,EACnB,IAAI,oBAAoB;AACxB,QAAM,EAAE,oBAAoB,IAAI,uBAAuB;AACvD,QAAM,eAAW,wBAAgC,IAAI;AACrD,QAAM,CAAC,cAAc,eAAe,QAAI,0BAAkC,IAAI;AAC9E,QAAM,KAAK,YAAY;AAEvB,iCAAU,MAAM;AACd,QAAI,CAAC,aAAc;AACnB,UAAM,cAAc,CAAC,UAAyB;AAC5C,UAAI,CAAC,CAAC,KAAK,OAAO,EAAE,SAAS,MAAM,GAAG,KAAK,CAAC,SAAS,QAAS;AAC9D,YAAM,eAAe;AACrB,eAAS,QAAQ,MAAM;AAAA,IACzB;AACA,iBAAa,iBAAiB,SAAS,WAAW;AAClD,WAAO,MAAM;AACX,mBAAa,oBAAoB,SAAS,WAAW;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,MAAI,CAAC,oBAAoB,aAAa,EAAG,QAAO;AAEhD,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,kCAAiC,eAAY,wBAC1D,gCAAAA,QAAA,cAAC,mBAAgB,IAAQ,KAAK,UAAU,GACxC,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS;AAAA,MACT,KAAK;AAAA,MACL,UAAU;AAAA;AAAA,IAET,6CACC,gCAAAA,QAAA,cAAC,gDAA2C,IAE5C,gCAAAA,QAAA,cAAC,oBAAe;AAAA,EAEpB,CACF;AAEJ;AAEA,IAAM,uCAAuC,MAAM;AACjD,QAAM,EAAE,4CAA4C,eAAe,IACjE,oBAAoB,0BAA0B;AAChD,MAAI,4CAA4C;AAC9C,WAAO,gCAAAA,QAAA,cAAC,gDAA2C;AAAA,EACrD;AACA,MAAI,gBAAgB;AAClB,WAAO,gCAAAA,QAAA,cAAC,oBAAe;AAAA,EACzB;AACA,SAAO,gCAAAA,QAAA,cAAC,SAAI,WAAU,oDAAmD;AAC3E;AAiBO,IAAM,sCAAsC;AAAA,EACjD,KAAK,EAAE,UAAU,GAAkC;AACjD,UAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,UAAM,EAAE,UAAU,IAAI,6BAA6B;AACnD,UAAM,EAAE,gBAAgB,IAAI,0BAA0B;AAEtD,WACE,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAU,CAAC;AAAA,QACX,SAAS,MAAM;AACb,cAAI,UAAW,WAAU,MAAM;AAC/B,oBAAU;AAAA,QACZ;AAAA;AAAA,MAEC,EAAE,MAAM;AAAA,IACX;AAAA,EAEJ;AAAA,EACA,SAAS,EAAE,WAAW,mBAAmB,GAAkC;AACzE,UAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,WACE,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS,MAAM;AACb,6BAAmB,aAAa;AAChC,oBAAU;AAAA,QACZ;AAAA;AAAA,MAEC,EAAE,UAAU;AAAA,IACf;AAAA,EAEJ;AAAA,EACA,KAAK,EAAE,WAAW,mBAAmB,GAAkC;AACrE,UAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,WACE,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS,MAAM;AACb,6BAAmB,YAAY;AAC/B,oBAAU;AAAA,QACZ;AAAA;AAAA,MAEC,EAAE,MAAM;AAAA,IACX;AAAA,EAEJ;AACF;AAEO,IAAM,qCAAiE;AAAA,EAC5E,EAAE,cAAc,oCAAoC,MAAM,MAAM,aAAa;AAAA,EAC7E;AAAA,IACE,cAAc,oCAAoC;AAAA,IAClD,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,cAAc,oCAAoC;AAAA,IAClD,MAAM;AAAA,EACR;AACF;AAOA,IAAM,uCAAuC,CAAC,aAAyC;AACrF,QAAM;AAAA,IACJ,oBAAAC,sBAAqB;AAAA,IACrB,qBAAAC,uBAAsB;AAAA,EACxB,IAAI,oBAAoB;AACxB,QAAM,EAAE,oBAAoB,IAAI,uBAAuB;AACvD,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,gBAAgB,gBAAgB,QAAQ,UAAU;AAExD,SAAO,SACJ,OAAO,CAAC,WAAW;AAClB,QAAI,OAAO,SAAS;AAClB,aAAO,oBAAoB,aAAa,KAAK,eAAe;AAE9D,QAAI,OAAO,SAAS;AAClB,aACE,oBAAoB,WAAW,KAC/B,CAAC,gBAAgB,YACjB,eAAe;AAGnB,QAAI,OAAO,SAAS,eAAe;AACjC,aAAO,eAAe,oBAAoB,CAAC,gBAAgB;AAAA,IAC7D;AACA,WAAO;AAAA,EACT,CAAC,EACA,IAAI,CAAC,WAAW;AACf,QAAI,OAAO,SAAS,gBAAgB,CAAC,OAAO,cAAc;AACxD,aAAO,EAAE,GAAG,QAAQ,cAAcD,oBAAmB;AAAA,IACvD;AACA,QAAI,OAAO,SAAS,iBAAiB,CAAC,OAAO,cAAc;AACzD,aAAO,EAAE,GAAG,QAAQ,cAAcC,qBAAoB;AAAA,IACxD;AACA,WAAO;AAAA,EACT,CAAC;AACL;AAEO,IAAM,qBAAqB,CAAC;AAAA,EACjC,8BAA8B;AAAA,EAC9B;AACF,MAA+B;AAC7B,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,OAAAC,SAAQ,MAAa,IAAI,oBAAoB;AACrD,QAAM,EAAE,oBAAoB,IAAI,uBAAuB;AACvD,QAAM,kBAAkB,mBAAmB;AAE3C,QAAM,UAAU,qCAAqC,2BAA2B;AAEhF,QAAM,eAAe,0BAA0B,gBAAgB,WAAW,YAAY,EAAE;AACxF,QAAM,EAAE,QAAQ,YAAY,cAAc,IAAI,0BAA0B;AAAA,IACtE,IAAI;AAAA,EACN,CAAC;AACD,QAAM,mBAAmB,gBAAgB,cAAc,eAAe,EAAE;AAExE,QAAM,CAAC,oBAAoB,2BAA2B,QACpD,0BAAmC;AACrC,QAAM,gBAAY;AAAA,IAChB,CAAC,eAAiD;AAChD,YAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AACxD,UAAI,CAAC,QAAQ,aAAc;AAC3B,kCAA4B,MAAM;AAAA,IACpC;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,iBAAa,6BAAY,MAAM,4BAA4B,MAAS,GAAG,CAAC,CAAC;AAE/E,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAkC,IAAI;AACxE,QAAM,oBAAgB,wBAA0B,IAAI;AAEpD,QAAM,kCAA8B;AAAA,IAClC,MAAM,SAAS,eAAe,oBAAoB;AAAA,IAClD,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,MAAI,QAAQ,WAAW,KAAK,QAAQ,CAAC,EAAE,SAAS;AAC9C,WAAO,gCAAAH,QAAA,cAAC,8BAAyB;AAEnC,QAAM,eAAe,oBAAoB;AACzC,QAAM,cAAc,CAAC,CAAC;AACtB,SACE,gCAAAA,QAAA,cAAC,qCAAkC,OAAO,EAAE,UAAU,KACpD,gCAAAA,QAAA,cAAC,SAAI,WAAU,mCACZ,oBAAoB,aAAa,KAAK,gCAAAA,QAAA,cAAC,mBAAgB,KAAK,cAAc,GAC3E,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe;AAAA,MACf,iBAAc;AAAA,MACd,cAAY,EAAE,+BAA+B;AAAA,MAC7C,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAS,MAAM,YAAY,OAAO;AAAA,MAClC,KAAK;AAAA;AAAA,IAEL,gCAAAA,QAAA,cAAC,0CAAqC;AAAA,EACxC,GACA,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAiB,eAAe;AAAA,MAChC,IAAI;AAAA,MACJ,WAAU;AAAA,MACV,kBAAkB,cAAc;AAAA,MAChC,UAAU;AAAA,MACV,WAAS;AAAA;AAAA,IAET,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA;AAAA,MAEX,QAAQ,IAAI,CAAC,EAAE,cAAc,KAAK,MACjC,gCAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,WAAW;AAAA,UACtB,KAAK,4BAA4B,IAAI;AAAA,UACrC,oBAAoB;AAAA;AAAA,MACtB,CACD;AAAA,IACH;AAAA,EACF,GACA,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,sBAAsB,6BAA6B;AAAA,MACnD,QAAQ;AAAA;AAAA,IAER,gCAAAA,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,eAAW,cAAAC,SAAK;AAAA,UACd,+BAA+B,oBAAoB,SAAS;AAAA,UAC5D,kCACE,oBAAoB,SAAS;AAAA,QACjC,CAAC;AAAA,QACD,SAAS;AAAA,QACT,MAAM;AAAA;AAAA,MAEL,gBAAgB,gCAAAJ,QAAA,cAAC,gBAAa,OAAO,YAAY;AAAA,IACpD;AAAA,EACF,CACF,CACF;AAEJ;;;A4czSA,IAAAK,kBAAkB;AAClB,IAAAC,uBAQO;;;ACVP,IAAAC,kBAAkB;AAClB,IAAAC,uBAAwC;AAgBjC,IAAM,+BAA+B,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACF,MAAyC;AACvC,QAAM,EAAE,EAAE,IAAI,sBAAsB,8BAA8B;AAClE,QAAM,QAAQ,WAAW,SAAS,EAAE,wBAAwB;AAC5D,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEZ,gCAAAA,QAAA,cAAC,SAAI,WAAU,4CACb,gCAAAA,QAAA,cAAC,YAAS,UAAU,OAAO,UAAU,WAAW,WAAW,CAC7D;AAAA,IAEA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,EAAE,wBAAwB;AAAA,QACtC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,UAAU,WAAW,eAAe,gBAAgB;AAAA,QACpD,SAAS,MACP,WAAW,eAAe,MAC1B,kBAAkB,CAAC,WAAW,eAAe,EAAE,CAAC;AAAA,QAElD,MAAK;AAAA;AAAA,MAEL,gCAAAA,QAAA,cAAC,eAAU;AAAA,IACb;AAAA,QAEC,8CAAwB,UAAU,KACjC,CAAC,WAAW,QAAQ,EAAE,SAAS,WAAW,eAAe,WAAW,KACpE,CAAC,CAAC,eACA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,SAAS,MAAM,YAAY,UAAU;AAAA;AAAA,MAErC,gCAAAA,QAAA,cAAC,eAAU;AAAA,IACb;AAAA,IAGJ,gCAAAA,QAAA,cAAC,SAAI,WAAU,2CACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,sCAAqC,SACjD,KACH,GACC,WAAW,eAAe,gBAAgB,cACzC,CAAC,CAAC,WAAW,aACX,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAQ;AAAA,QACR,MAAM,WAAW;AAAA,QACjB,KAAI;AAAA,QACJ,QAAO;AAAA;AAAA,MAEP,gCAAAA,QAAA,cAACC,eAAA,IAAa;AAAA,IAChB,GAEH,WAAW,eAAe,gBAAgB,eACzC,gCAAAD,QAAA,cAAC,wBAAqB,MAAM,IAAI,CAEpC;AAAA,EACF;AAEJ;;;ACjFA,IAAAE,kBAAiC;;;ACAjC,IAAAC,kBAAkB;AAUX,IAAM,wCAAwC,CAAC;AAAA,EACpD;AAAA,EACA;AACF,MAAkD;AAChD,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,yBAAyB;AAAA,IAC7B,MAAM;AAAA,MACJ,QAAQ,EAAE,6DAA6D;AAAA,MACvE,YAAY,EAAE,iEAAiE;AAAA,IACjF;AAAA,IACA,SAAS;AAAA,MACP,QAAQ,EAAE,wBAAwB;AAAA,MAClC,YAAY,EAAE,4BAA4B;AAAA,IAC5C;AAAA,EACF;AAEA,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,wDACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,iEACZ,uBAAuB,QAAQ,cAAc,CAChD,GACA,gCAAAA,QAAA,cAAC,OAAE,WAAU,iEACV,uBAAuB,KAAK,cAAc,CAC7C,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,kFACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS;AAAA;AAAA,IAER,EAAE,IAAI;AAAA,EACT,CACF,CACF;AAEJ;;;AC5CA,IAAAC,kBAA+B;;;ACA/B,IAAAC,kBAAiC;;;ACAjC,IAAAC,gBAAiB;AAEjB,IAAAC,kBAAkB;AAMX,IAAM,iBAAiB,CAAC,EAAE,gBAAgB,MAC/C,gCAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,cAAAC,SAAK,6BAA6B;AAAA,MAC3C,oCAAoC,mBAAmB;AAAA,IACzD,CAAC;AAAA;AAAA,EAEA,gBAAgB,eAAe;AAClC;;;ADRF,IAAMC,4BAA2B,CAAC,WAA6B;AAAA,EAC7D,WAAW,MAAM;AAAA,EACjB,UAAU,MAAM;AAAA,EAChB,gBAAgB,MAAM;AACxB;AASO,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAiC;AAC/B,QAAM,cAAc,eAAe;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,EAAE,WAAW,UAAU,eAAe,IAC1C,cAAc,aAAa,OAAOA,yBAAwB,KAAK,CAAC;AAElE,QAAM,oBAAoB,kBAAkB;AAE5C,iCAAU,MAAM;AACd,iBAAa,uBAAuB;AACpC,WAAO,MAAM;AACX,mBAAa,gBAAgB;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,MAAI,CAAC,YAAa;AAElB,SACE,gCAAAC,QAAA,cAAC,gBAAAA,QAAM,UAAN,MACC,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAS,YAAY;AAAA;AAAA,IAEpB,YAAY,gCAAAA,QAAA,cAACC,YAAA,IAAU,IAAK,gCAAAD,QAAA,cAAC,cAAS;AAAA,EACzC,GACA,gCAAAA,QAAA,cAAC,kBAAe,iBAAiB,mBAAmB,GACpD,gCAAAA,QAAA,cAAC,SAAI,WAAU,kDACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,YAAY;AAAA,MAClB,cAAc,gBAAgB,CAAC;AAAA;AAAA,EACjC,CACF,CACF;AAEJ;;;AElEA,IAAAE,kBAA2C;;;ACA3C,IAAAC,kBAAyD;AAOlD,IAAM,iBAAiB,CAAC,EAAE,aAAa,IAA0B,CAAC,MAAM;AAC7E,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,0BAAiB,CAAC;AAC9D,QAAM,qBAAiB,wBAAuC,MAAS;AAEvE,QAAM,mBAAe,6BAAY,MAAM;AACrC,QAAI,eAAe,QAAS;AAC5B,mBAAe,UAAU,YAAY,MAAM;AACzC,wBAAkB,CAAC,SAAS,OAAO,CAAC;AAAA,IACtC,GAAG,GAAI;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAc,6BAAY,MAAM;AACpC,kBAAc,eAAe,OAAO;AACpC,mBAAe,UAAU;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,iCAAU,MAAM;AACd,QAAI,CAAC,aAAc;AACnB,iBAAa;AACb,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,cAAc,cAAc,WAAW,CAAC;AAE5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AD3BA,IAAM,yBAAyB,CAAC,EAAE,qBAAqB,IAAI,MAAqB;AAC9E,QAAM;AAAA,IACJ,qBAAqB,EAAE,SAAS;AAAA,EAClC,IAAI,uBAAuB;AAE3B,QAAM,CAAC,YAAY,aAAa,QAAI,0BAAmB,CAAC,CAAC;AAEzD,iCAAU,MAAM;AACd,QAAI,CAAC,UAAU,kBAAmB;AAClC,UAAM,yBACJ,SAAS,kBAAkB,WAAW,UAAU,aAAa;AAC/D,WAAO,MAAM;AACX,6BAAuB,YAAY;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,MAAI,CAAC,SAAU,QAAO;AAEtB,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,sCACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,4CACZ,WAAW,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,MACrD,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,KAAK,aAAa,CAAC;AAAA,MACnB,OACE;AAAA,QACE,uDAAuD,YACnD,YAAY,MAAM,MAClB;AAAA,MACN;AAAA;AAAA,EAEJ,CACD,CACH,CACF;AAEJ;AACO,IAAM,2BAA2B,MAAM;AAC5C,QAAM,EAAE,gBAAgB,cAAc,YAAY,IAAI,eAAe;AACrE,QAAM;AAAA,IACJ,qBAAqB,EAAE,SAAS;AAAA,EAClC,IAAI,uBAAuB;AAE3B,iCAAU,MAAM;AACd,QAAI,CAAC,UAAU,cAAe;AAC9B,UAAM,EAAE,cAAc,IAAI;AAE1B,QAAI,cAAc,UAAU,aAAa;AACvC,mBAAa;AAAA,IACf;AAEA,kBAAc,iBAAiB,SAAS,YAAY;AACpD,kBAAc,iBAAiB,UAAU,YAAY;AACrD,kBAAc,iBAAiB,QAAQ,WAAW;AAClD,kBAAc,iBAAiB,SAAS,WAAW;AAEnD,WAAO,MAAM;AACX,oBAAc,oBAAoB,SAAS,YAAY;AACvD,oBAAc,oBAAoB,UAAU,YAAY;AACxD,oBAAc,oBAAoB,QAAQ,WAAW;AACrD,oBAAc,oBAAoB,SAAS,WAAW;AAAA,IACxD;AAAA,EACF,GAAG,CAAC,UAAU,cAAc,WAAW,CAAC;AAExC,SACE,gCAAAA,QAAA,cAAC,gBAAAA,QAAM,UAAN,MACC,gCAAAA,QAAA,cAAC,kBAAe,iBAAiB,gBAAgB,GACjD,gCAAAA,QAAA,cAAC,4BAAuB,CAC1B;AAEJ;;;AHlEO,IAAM,gBAAgB,MAAM;AACjC,QAAM,sBAAsB,uBAAuB;AACnD,QAAM;AAAA,IACJ,qBAAqB,EAAE,mBAAmB,UAAU,WAAW,eAAe;AAAA,EAChF,IAAI;AAEJ,QAAM,kBAAkB,WAAW,eAAe,gBAAgB;AAElE,QAAM,YAAQ;AAAA,IACZ,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAEA,MAAI,CAAC,SAAU,QAAO;AAEtB,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,wCACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,4BAA2B,eAAa,oBACrD,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS,SAAS;AAAA;AAAA,IAElB,gCAAAA,QAAA,cAAC,aAAQ;AAAA,EACX,GAEC,MAAM,WAAW,WAAW,YAC3B,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAiB,UAAU,YAAY;AAAA,MACvC,UAAU,UAAU;AAAA,MACpB,KAAK,UAAU;AAAA,MACf,cAAc,UAAU;AAAA;AAAA,EAC1B,IACE,MAAM,UAAU,MAAM,YACxB,gCAAAA,QAAA,cAAC,8BAAyB,IACxB,MAEH,MAAM,UACL,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS,SAAS;AAAA;AAAA,IAElB,gCAAAA,QAAA,cAAC,aAAQ;AAAA,EACX,GAED,MAAM,aACL,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAa;AAAA,MACb,SAAS,SAAS;AAAA;AAAA,IAElB,gCAAAA,QAAA,cAACC,YAAA,IAAU;AAAA,EACb,GAED,MAAM,UACL,gCAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA;AAAA,IAER,kBAAkB,gCAAAA,QAAA,cAAC,0BAAqB,IAAK,gCAAAA,QAAA,cAAC,cAAS;AAAA,EAC1D,IAEA,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAS,SAAS;AAAA;AAAA,IAElB,gCAAAA,QAAA,cAAC,mBAAc;AAAA,EACjB,CAEJ,CACF;AAEJ;;;AK9FA,IAAAE,kBAAkB;AAKX,IAAM,4BAA4B,CAAC,UACxC,gCAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,cAAW;AAAA,IACX,WAAU;AAAA,IACV,eAAY;AAAA,IACX,GAAG;AAAA;AAAA,EAEJ,gCAAAA,QAAA,cAAC,aAAQ;AACX;;;APFF,IAAMC,4BAA2B,CAAC,WAA6B;AAAA,EAC7D,WAAW,MAAM;AAAA,EACjB,gBAAgB,MAAM;AACxB;AAKO,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,MAAkC;AAChC,QAAM,EAAE,EAAE,IAAI,sBAAsB;AAEpC,QAAM,cAAc,eAAe;AAAA,IACjC,UAAU,WAAW;AAAA,IACrB,KAAK,WAAW;AAAA,EAClB,CAAC;AAED,QAAM,EAAE,WAAW,eAAe,IAChC,cAAc,aAAa,OAAOA,yBAAwB,KAAK,CAAC;AAElE,iCAAU,MAAM;AACd,iBAAa,uBAAuB;AACpC,WAAO,MAAM;AACX,mBAAa,gBAAgB;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,MAAI,CAAC,YAAa,QAAO;AAEzB,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEZ,gCAAAA,QAAA,cAAC,cAAW,WAAW,CAAC,CAAC,WAAW,SAAS,YAAY,YAAY;AAAA,IAErE,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,EAAE,wBAAwB;AAAA,QACtC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,UAAU,WAAW,eAAe,gBAAgB;AAAA,QACpD,SAAS,MACP,WAAW,eAAe,MAAM,kBAAkB,CAAC,WAAW,cAAc,EAAE,CAAC;AAAA,QAEjF,MAAK;AAAA;AAAA,MAEL,gCAAAA,QAAA,cAAC,eAAU;AAAA,IACb;AAAA,IAEC,CAAC,WAAW,QAAQ,EAAE,SAAS,WAAW,eAAe,WAAW,KACnE,CAAC,CAAC,eACA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,EAAE,mBAAmB;AAAA,QACjC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,SAAS,MAAM,YAAY,UAAU;AAAA;AAAA,MAErC,gCAAAA,QAAA,cAAC,eAAU;AAAA,IACb;AAAA,IAGJ,gCAAAA,QAAA,cAAC,SAAI,WAAU,2CACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,0CAAyC,OAAO,WAAW,SACvE,WAAW,KACd,GACC,OAAO,WAAW,aAAa,eAC9B,gCAAAA,QAAA,cAAC,kBAAe,iBAAiB,kBAAkB,WAAW,UAAU,GAEzE,WAAW,eAAe,gBAAgB,eACzC,gCAAAA,QAAA,cAAC,wBAAqB,MAAM,IAAI,CAEpC;AAAA,IACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,4CACb,gCAAAA,QAAA,cAAC,YAAS,UAAU,WAAW,OAAO,UAAU,WAAW,WAAW,CACxE;AAAA,EACF;AAEJ;;;AQ3FA,IAAAC,kBAAkB;AAmBlB,IAAM,wBAAwB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,MAAkC;AAChC,QAAM,EAAE,EAAE,IAAI,sBAAsB,aAAa;AACjD,QAAM,cAAc,WAAW,eAAe;AAE9C,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEZ,gCAAAA,QAAA,cAAC,SAAI,WAAU,4CACb,gCAAAA,QAAA,cAAC,YAAS,UAAU,WAAW,OAAO,UAAU,WAAW,WAAW,CACxE;AAAA,IAEA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,EAAE,wBAAwB;AAAA,QACtC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,UAAU,gBAAgB;AAAA,QAC1B,SAAS,MACP,WAAW,eAAe,MAC1B,kBAAkB,CAAC,WAAW,eAAe,EAAE,CAAC;AAAA,QAElD,MAAK;AAAA;AAAA,MAEL,gCAAAA,QAAA,cAAC,eAAU;AAAA,IACb;AAAA,IAEC,CAAC,WAAW,QAAQ,EAAE,SAAS,WAAW,KAAK,CAAC,CAAC,eAChD,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,EAAE,mBAAmB;AAAA,QACjC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,SAAS,MAAM;AACb,sBAAY,UAAU;AAAA,QACxB;AAAA;AAAA,MAEA,gCAAAA,QAAA,cAAC,eAAU;AAAA,IACb;AAAA,IAGF,gCAAAA,QAAA,cAAC,SAAI,WAAU,2CACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,0CAAyC,OAAO,WAAW,SACvE,WAAW,KACd,IAEE,OAAO,gBAAgB,eAAe,gBAAgB,eACtD,CAAC,CAAC,WAAW,aACX,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,EAAE,0BAA0B;AAAA,QACxC,WAAU;AAAA,QACV,UAAQ;AAAA,QACR,MAAM,WAAW;AAAA,QACjB,KAAI;AAAA,QACJ,QAAO;AAAA,QACP,OAAO,EAAE,kCAAkC,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA;AAAA,MAErE,gCAAAA,QAAA,cAACC,eAAA,IAAa;AAAA,IAChB,GAEH,gBAAgB,eAAe,gCAAAD,QAAA,cAAC,wBAAqB,MAAM,IAAI,CAClE;AAAA,EACF;AAEJ;AACA,IAAO,gCAAQ;;;ACvFf,IAAAE,gBAAiB;AACjB,IAAAC,kBAA6C;AAUtC,IAAM,yBAAyB,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,MAAmC;AACjC,QAAM,EAAE,EAAE,IAAI,sBAAsB,kBAAkB;AACtD,QAAM,EAAE,WAAAC,aAAY,UAAiB,IAAI,oBAAoB,cAAc;AAC3E,QAAM,CAAC,cAAc,eAAe,QAAI,0BAAS,KAAK;AAEtD,QAAM,EAAE,IAAI,YAAY,IAAI,WAAW,iBAAiB,CAAC;AAEzD,QAAM,sBAAkB,6BAAY,MAAM,gBAAgB,IAAI,GAAG,CAAC,CAAC;AACnE,QAAM,WAAW,WAAW,aAAa,WAAW,cAAc;AAElE,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,sCAAsC;AAAA,QACpD,6CAA6C;AAAA,MAC/C,CAAC;AAAA,MACD,eAAY;AAAA;AAAA,IAEZ,gCAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,EAAE,wBAAwB;AAAA,QACtC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,UAAU,gBAAgB;AAAA,QAC1B,SAAS,MAAM,MAAM,kBAAkB,CAAC,EAAE,CAAC;AAAA,QAC3C,MAAK;AAAA;AAAA,MAEL,gCAAAA,QAAA,cAAC,eAAU;AAAA,IACb;AAAA,IAEC,CAAC,WAAW,QAAQ,EAAE,SAAS,WAAW,KACzC,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,EAAE,mBAAmB;AAAA,QACjC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,SAAS,MAAM,YAAY,UAAU;AAAA;AAAA,MAErC,gCAAAA,QAAA,cAAC,eAAU;AAAA,IACb;AAAA,IAGD,gBAAgB,eACf,gCAAAA,QAAA,cAAC,SAAI,WAAU,gDACb,gCAAAA,QAAA,cAAC,wBAAqB,MAAM,IAAI,CAClC;AAAA,IAGD,YACC,gCAAAA,QAAA;AAAA,MAACD;AAAA,MAAA;AAAA,QACC,KAAK,WAAW;AAAA,QAChB,WAAU;AAAA,QACV,SAAS;AAAA,QACT,KAAK;AAAA,QACL,OAAO,WAAW;AAAA;AAAA,IACpB;AAAA,EAEJ;AAEJ;;;ACpEA,IAAAG,kBAAkB;AAQlB,IAAM,0BAA0B,MAC9B,gCAAAC,QAAA,cAAC,SAAI,WAAU,sCACb,gCAAAA,QAAA,cAAC,qBAAgB,CACnB;AASK,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA,eAAe;AAAA,EACf;AACF,MAA+B;AAC7B,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,SACE,gCAAAA,QAAA,cAAC,SAAI,WAAU,8BAA6B,eAAY,sBACtD,gCAAAA,QAAA,cAAC,gBAAa,UAAoB,GACjC,UACC,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,iCAAiC;AAAA,MAC/C,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAS;AAAA,MACT,MAAK;AAAA;AAAA,IAEL,gCAAAA,QAAA,cAAC,eAAU;AAAA,EACb,GAGF,gCAAAA,QAAA,cAAC,SAAI,WAAU,2CACX,SAAiC,aACjC,gCAAAA,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,sBAAsB;AAAA;AAAA,IAE9B,EAAE,eAAe;AAAA,EACpB,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,2CACZ,EAAE,yBAAyB;AAAA,IAC1B,UAAU,EAAE,2BAA2B;AAAA,MACrC,cAAe,SAAiC;AAAA,IAClD,CAAC;AAAA,EACH,CAAC,CACH,CACF,IAEA,gCAAAA,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,kBAAkB;AAAA;AAAA,IAE1B,EAAE,kBAAkB;AAAA,EACvB,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,2CACZ,SAAS,UAAS,MAAG,SAAS,SACjC,CACF,CAEJ,CACF;AAEJ;;;AZ1CO,IAAM,wBAAwB,CAAC;AAAA,EACpC,yBAAyB;AAAA,EACzB,uBAAAC,yBAAwB;AAAA,EACxB,oBAAAC,sBAAqB;AAAA,EACrB,wBAAAC,0BAAyB;AAAA,EACzB,8BAAAC,gCAA+B;AAAA,EAC/B,yBAAyB;AAAA,EACzB,uBAAAC,yBAAwB;AAC1B,MAAkC;AAChC,QAAM,kBAAkB,mBAAmB;AAG3C,QAAM,EAAE,aAAa,SAAS,IAAI,yBAAyB;AAE3D,MAAI,CAAC,YAAY,UAAU,CAAC,SAAU,QAAO;AAE7C,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,uCACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEX,YACC,gCAAAA,QAAA;AAAA,MAACJ;AAAA,MAAA;AAAA,QACC;AAAA,QAGA,QACE,gBAAgB,gBACZ,SACA,gBAAgB,iBAAiB;AAAA;AAAA,IAEzC;AAAA,IAED,YAAY,IAAI,CAAC,eAAe;AAC/B,cAAI,uCAAiB,UAAU,EAAG,QAAO;AACzC,cAAI,sDAAgC,UAAU,GAAG;AAC/C,eACE,gCAAAI,QAAA;AAAA,UAACD;AAAA,UAAA;AAAA,YACC;AAAA,YACA,aAAa,gBAAgB,kBAAkB;AAAA,YAC/C,KAAK,WAAW,cAAc,MAAM,WAAW;AAAA,YAC/C,mBAAmB,gBAAgB,kBAAkB;AAAA;AAAA,QACvD;AAAA,MAEJ,eAAW,6CAAuB,UAAU,GAAG;AAC7C,eACE,gCAAAC,QAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,aAAa,gBAAgB,kBAAkB;AAAA,YAC/C,KAAK,WAAW,cAAc,MAAM,WAAW;AAAA,YAC/C,mBAAmB,gBAAgB,kBAAkB;AAAA;AAAA,QACvD;AAAA,MAEJ,eAAW,6CAAuB,UAAU,GAAG;AAC7C,eACE,gCAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,aAAa,gBAAgB,kBAAkB;AAAA,YAC/C,KAAK,WAAW,cAAc,MAAM,WAAW;AAAA,YAC/C,mBAAmB,gBAAgB,kBAAkB;AAAA;AAAA,QACvD;AAAA,MAEJ,eAAW,6CAAuB,UAAU,GAAG;AAC7C,eACE,gCAAAA,QAAA;AAAA,UAACH;AAAA,UAAA;AAAA,YACC;AAAA,YACA,aAAa,gBAAgB,kBAAkB;AAAA,YAC/C,KAAK,WAAW,cAAc,MAAM,WAAW;AAAA,YAC/C,mBAAmB,gBAAgB,kBAAkB;AAAA;AAAA,QACvD;AAAA,MAEJ,eAAW,4CAAsB,UAAU,GAAG;AAC5C,eACE,gCAAAG,QAAA;AAAA,UAACL;AAAA,UAAA;AAAA,YACC;AAAA,YACA,aAAa,gBAAgB,kBAAkB;AAAA,YAC/C,KAAK,WAAW,cAAc,MAAM,WAAW;AAAA,YAC/C,mBAAmB,gBAAgB,kBAAkB;AAAA;AAAA,QACvD;AAAA,MAEJ,eAAW,wCAAkB,UAAU,GAAG;AACxC,eACE,gCAAAK,QAAA;AAAA,UAACF;AAAA,UAAA;AAAA,YACC;AAAA,YACA,aAAa,gBAAgB,kBAAkB;AAAA,YAC/C,KAAK,WAAW,cAAc;AAAA,YAC9B,mBAAmB,gBAAgB,kBAAkB;AAAA;AAAA,QACvD;AAAA,MAEJ;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,CACF;AAEJ;;;AanIA,IAAAG,kBAAkB;;;ACAlB,IAAAC,kBAAoC;AAE7B,IAAM,WAAW,CAAC,EAAE,UAAU,MAA6B;AAChE,QAAM,CAAC,aAAa,cAAc,QAAI,0BAA6B;AAEnE,iCAAU,MAAM;AACd,QAAI;AACJ,QAAI,OAAO,gBAAgB,YAAY,cAAc,GAAG;AACtD,yBAAmB,WAAW,MAAM;AAClC,uBAAe,cAAc,CAAC;AAAA,MAChC,GAAG,GAAI;AAAA,IACT;AACA,WAAO,MAAM;AACX,mBAAa,gBAAgB;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,iCAAU,MAAM;AACd,mBAAe,aAAa,CAAC;AAAA,EAC/B,GAAG,CAAC,SAAS,CAAC;AAEd,SAAO;AACT;;;ADfO,IAAM,gBAAgB,CAAC,EAAE,iBAAiB,MAA0B;AACzE,QAAM,cAAc,SAAS,EAAE,WAAW,iBAAiB,CAAC;AAE5D,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,oCAAmC,eAAY,oBAC3D,WACH;AAEJ;;;AEfA,IAAAC,kBAA8C;;;ACC9C,IAAAC,kBAAiC;;;ACDjC,IAAAC,kBAA6C;;;ACA7C,IAAAC,kBAAkB;AASX,IAAM,aAAa,CAAC,EAAE,aAAa,GAAG,KAAK,MAAuB;AACvE,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,kBAAkB,kCAAkC;AAC1D,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,WAAW;AAAA,MACzB,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,UAAU,CAAC;AAAA,MACX,SAAS;AAAA,MACT,MAAK;AAAA,MACJ,GAAG;AAAA;AAAA,IAEJ,gCAAAA,QAAA,cAAC,cAAS;AAAA,EACZ;AAEJ;;;ACzBA,IAAAC,kBAAkB;AAKX,IAAM,yBAAyB,CAAC;AAAA,EACrC;AAAA,EACA,GAAG;AACL,MAAmC;AACjC,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,yBAAyB;AAAA,MACvC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACnBA,IAAAC,kBAA+B;AAiB/B,IAAM,oCAAoC,CAAC,WAAiC;AAAA,EAC1E,eAAe,MAAM;AACvB;AAEO,IAAM,6BAA6B,MAAM;AAC9C,QAAM,EAAE,EAAE,IAAI,sBAAsB,sBAAsB;AAC1D,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,EAAE,cAAc,IAAI;AAAA,IACxB,gBAAgB;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,CAAC,cAAe,QAAO;AAE3B,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,6CACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,+CACZ,EAAE,kBAAkB,CACvB,GACA,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,mBAAmB;AAAA,MACjC,WAAU;AAAA,MACV,SAAS,MAAM,gBAAgB,iBAAiB,IAAI;AAAA;AAAA,IAEpD,gCAAAA,QAAA,cAAC,eAAU;AAAA,EACb,CACF;AAEJ;AAMO,IAAM,uBAAuB,CAAC;AAAA,EACnC,YAAAC,cAAa;AACf,MAAiC;AAC/B,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,YAAAC,cAAa,YAAmB,QAAAC,UAAS,OAAc,IAC7D,oBAAoB,sBAAsB;AAC5C,QAAM,EAAE,aAAa,IAAI,sBAAsB,sBAAsB;AACrE,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,EAAE,cAAc,IAAI;AAAA,IACxB,gBAAgB;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,wBAAoB;AAAA,IACxB,MACE,eAAe,OAAO,GAAG,YAAY,OAAyC,KAC9E,eAAe;AAAA,IACjB,CAAC,eAAe,MAAM,eAAe,MAAM,YAAY;AAAA,EACzD;AAEA,QAAM,mBAAe;AAAA,IACnB,MAAMF,YAAW,mBAAmB,eAAe,eAAe;AAAA,IAClE,CAAC,eAAe,mBAAmBA,WAAU;AAAA,EAC/C;AAEA,QAAM,+BAA2B;AAAA,IAC/B,MACE,eAAe,aAAa,SAAS,cAAc,YAAY,MAAM,GAAG,CAAC,IAAI,CAAC;AAAA,IAChF,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,OAAO,eAAe,WAAW,OAAO,MAAM,UAAU,cAAc,OAAO;AAEnF,MAAI,CAAC,qBAAqB,CAAC,yBAAyB,UAAU,CAAC,KAAM,QAAO;AAE5E,SACE,gCAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEX,eAAe,QACd,gCAAAA,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,cAAc,KAAK;AAAA,QAC1B,MAAM,cAAc,KAAK,QAAQ,cAAc,KAAK;AAAA,QACpD,MAAM,cAAc;AAAA;AAAA,IACtB;AAAA,IAEF,gCAAAH,QAAA,cAAC,SAAI,WAAU,qCACZ,OACC,gCAAAA,QAAA,cAAC,QAAK,UAAQ,MAAC,MAAY,IAE3B,gCAAAA,QAAA,8BAAAA,QAAA,gBACG,CAAC,CAAC,yBAAyB,UAC1B,gCAAAA,QAAA,cAACE,aAAA,EAAW,aAAa,0BAA0B,UAAQ,MAAC,GAE9D,gCAAAF,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA;AAAA,MAEX;AAAA,IACH,CACF,CAEJ;AAAA,EACF;AAEJ;;;ACtHA,IAAAI,gBAAiB;AACjB,IAAAC,kBAAgC;AAMhC,IAAAC,uBAAoC;AAOpC,IAAM,mCAAmC,CAAC,WAAqC;AAAA,EAC7E,cAAc,MAAM,KAAK,MAAM,SAAS,OAAO,CAAC,EAAE;AAAA,IAChD,CAAC,YACC,yCAAoB,gBAAgB,OAAO,KAC3C,yCAAoB,iBAAiB,OAAO;AAAA,EAChD;AACF;AAEA,IAAM,+BAA+B,CAAC,WAAiC;AAAA,EACrE,eAAe,MAAM;AACvB;AAEO,IAAM,kBAAkB,MAAM;AACnC,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,EAAE,oBAAoB,IAAI;AAChC,QAAM,EAAE,cAAc,IAAI;AAAA,IACxB,gBAAgB;AAAA,IAChB;AAAA,EACF;AACA,QAAM,EAAE,aAAa,IAAI;AAAA,IACvB,oBAAoB;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,mBAAmB,aAAa,SAAS,KAAK,CAAC;AAErD,MAAI,CAAC,iBAAkB,QAAO;AAE9B,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,iCACZ,aAAa,IAAI,CAAC,gBACjB,gCAAAA,QAAA,cAAC,mBAAgB,KAAK,YAAY,eAAe,aAA0B,CAC5E,CACH;AAEJ;AAMO,IAAM,kBAAkB,CAAC,EAAE,YAAY,MAAwB;AACpE,QAAM,EAAE,oBAAoB,IAAI,mBAAmB;AACnD,QAAM,EAAE,aAAa,aAAa,eAAe,IAC/C,sBAAsC;AACxC,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAAgC,IAAI;AAEpF,MACE,CAAC,yCAAoB,gBAAgB,WAAW,KAChD,CAAC,yCAAoB,iBAAiB,WAAW;AAEjD,WAAO;AAET,SACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,+BAA+B;AAAA,QAC7C,wCACE,yCAAoB,iBAAiB,WAAW;AAAA,MACpD,CAAC;AAAA,MACD,eAAY;AAAA;AAAA,IAEZ,gCAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,CAAC,GAAG,CAAC;AAAA,QACb;AAAA,QACA,SAAS;AAAA;AAAA,MAER,YAAY;AAAA,IACf;AAAA,IACA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,cAAc;AAAA,QACd,cAAc;AAAA,QACd,KAAK;AAAA;AAAA,MAEL,gCAAAA,QAAA,cAAC,cAAS;AAAA,IACZ;AAAA,IACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,0CACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,gDACZ,YAAY,KACf,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,sDACZ,YAAY,IACf,CACF;AAAA,IACA,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,SAAS,MAAM,oBAAoB,eAAe,YAAY,aAAa;AAAA,QAC3E,MAAK;AAAA;AAAA,MAEL,gCAAAA,QAAA,cAAC,eAAU;AAAA,IACb;AAAA,EACF;AAEJ;;;AC3GA,IAAAE,kBAAkB;AAKlB,IAAMC,iBAAgB,CAAC,WAAiC;AAAA,EACtD,oBAAoB,MAAM;AAC5B;AAEO,IAAM,wBAAwB,MAAM;AACzC,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,EAAE,mBAAmB,IAAI,cAAc,gBAAgB,OAAOA,cAAa;AAEjF,MAAI,gBAAgB,iBAAiB,CAAC,gBAAgB,SAAU,QAAO;AAEvE,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,mDACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,+CACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,SAAS,gBAAgB;AAAA,MACzB,MAAK;AAAA,MACL,OAAO,mBAAmB,SAAS;AAAA;AAAA,EACrC,GACA,gCAAAA,QAAA,cAAC,WAAM,SAAQ,8BACZ,OAAO,KAAK,gBAAgB,QAAQ,MAAM,OAAO,EAAE,WAAW,IAC3D,EAAE,+BAA+B,IACjC,EAAE,sBAAsB,CAC9B,CACF,CACF;AAEJ;;;ACjCA,IAAAC,kBAAwB;AACxB,IAAAA,kBAAkB;AAQX,IAAM,cAAc,CAAC,UAA+C;AACzE,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,4BAAwB;AAAA,IAC5B,OAAO;AAAA,MACL,KAAK,EAAE,kBAAkB;AAAA,MACzB,OAAO,EAAE,oBAAoB;AAAA,MAC7B,MAAM,EAAE,mBAAmB;AAAA,MAC3B,OAAO,EAAE,oBAAoB;AAAA,MAC7B,QAAQ,EAAE,qBAAqB;AAAA,IACjC;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,QAAM,mCAA+B;AAAA,IACnC,OAAO;AAAA,MACL,KAAK,EAAE,yBAAyB;AAAA,MAChC,OAAO,EAAE,2BAA2B;AAAA,MACpC,MAAM,EAAE,0BAA0B;AAAA,MAClC,OAAO,EAAE,2BAA2B;AAAA,MACpC,QAAQ,EAAE,4BAA4B;AAAA,IACxC;AAAA,IACA,CAAC,CAAC;AAAA,EACJ;AAEA,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,6BACb,gCAAAA,QAAA,cAAC,UAAK,WAAU,oCACd,gCAAAA,QAAA,cAAC,gBAAQ,OAAO,IAAK,GAAU,KAC9B,OAAO,SAAS,sBAAsB,OAAO,QAAQ,EAAE,KAAK,EAAE,OAAO,IAAI,EAC5E,GACA,gCAAAA,QAAA,cAAC,UAAG,GACJ,gCAAAA,QAAA,cAAC,UAAK,WAAU,yCACb,OAAO,gBACL,6BAA6B,OAAO,QAAQ,EAAE,KAAK,EAAE,OAAO,WAAW,EAC5E,CACF;AAEJ;;;AChDA,IAAAC,kBAAkB;AAeX,IAAM,eAAe,CAAC,UAA6B;AACxD,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,YAAY,OAAO,KAAK,MAAM,EAAE;AACtC,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,EAAE,OAAO,MAAM,IAAI,OAAO,wBAAyB,CAAC;AAE1D,QAAM,aAAa,MACjB,OAAO;AAAA,IAAI,CAAC,MAAM,MAChB,KAAK,YAAY,MAAM,QACrB,gCAAAC,QAAA,cAAC,UAAK,WAAU,mCAAkC,KAAK,QAAQ,CAAC,MAC7D,IACH,IAEA,gCAAAA,QAAA,cAAC,UAAK,WAAU,8BAA6B,KAAK,QAAQ,CAAC,MACxD,IACH;AAAA,EAEJ,KAAK;AAEP,SACE,gCAAAA,QAAA,cAAC,SAAI,WAAU,0BACb,gCAAAA,QAAA,cAAC,UAAK,WAAU,kCAAgC,OAAO,MAAO,GAC9D,gCAAAA,QAAA,cAAC,UAAK,WAAU,gCAA8B,WAAW,CAAE,CAC7D;AAEJ;;;ACzCA,IAAAC,gBAAiB;AACjB,IAAAC,kBAA2C;;;ACD3C,IAAAC,gBAAiB;AAEjB,IAAAC,kBAA4D;AA0BrD,IAAM,qBAAqB,gBAAAC,QAAM,WAGtC,SAASC,oBACT,EAAE,WAAW,WAAWC,YAAW,SAAS,MAAM,aAAa,GAC/D,UACA;AACA,QAAM,EAAE,aAAa,IAAI,mBAAmB;AAC5C,QAAM,EAAE,YAAY,IAAI,uBAAuB;AAC/C,QAAM,mBAAe,wBAAsB,IAAI;AAE/C,QAAM,mBAAe,6BAAY,MAAM;AACrC,iBAAa,aAAa,IAAI;AAC9B,gBAAY,SAAS,MAAM;AAAA,EAC7B,GAAG,CAAC,MAAM,aAAa,YAAY,CAAC;AAEpC,uCAAgB,MAAM;AACpB,QAAI,CAAC,QAAS;AACd,iBAAa,SAAS,eAAe,EAAE,UAAU,WAAW,OAAO,UAAU,CAAC;AAAA,EAChF,GAAG,CAAC,SAAS,YAAY,CAAC;AAE1B,SACE,gCAAAF,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAG,SAAK,kCAAkC,WAAW;AAAA,QAC3D,uCAAuC;AAAA,MACzC,CAAC;AAAA,MACD;AAAA,MACA,KAAK;AAAA;AAAA,IAEL,gCAAAH,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAW,CAAC,UAAU;AACpB,cAAI,MAAM,QAAQ,SAAS;AACzB,yBAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,KAAK;AAAA;AAAA,MAEL,gCAAAA,QAAA,cAACE,YAAA,EAAU,QAAQ,MAAM,SAAkB;AAAA,IAC7C;AAAA,EACF;AAEJ,CAAC;;;ACtED,IAAAE,kBAAkB;AAClB,IAAAC,gBAAiB;AA0BV,IAAM,WAAW,CAAC,EAAE,QAAAC,UAAS,QAAe,OAAO,MAAqB;AAC7E,QAAM,YAAY,CAAC,CAAC,OAAO,KAAK,MAAM,EAAE;AACxC,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,EAAE,OAAO,MAAM,IAAI,OAAO;AAEhC,QAAM,aAAa,MACjB,MAAM,IAAI,CAAC,MAAM,MAAM;AACrB,UAAM,UAAU,KAAK,YAAY,MAAM;AACvC,UAAM,2BAA2B,KAAK,QAAQ,cAAc,MAAQ;AACpE,WACE,gCAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,cAAAC,SAAK;AAAA,UACd,mCAAmC;AAAA,UACnC,8BAA8B,CAAC;AAAA,QACjC,CAAC;AAAA,QACD,KAAK,QAAQ,CAAC;AAAA;AAAA,MAEb;AAAA,IACH;AAAA,EAEJ,CAAC;AAEH,SACE,gCAAAD,QAAA,cAAC,SAAI,WAAU,yBACb,gCAAAA,QAAA;AAAA,IAACD;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,OAAO;AAAA,MACd,MAAM,OAAO,QAAQ,OAAO;AAAA;AAAA,EAC9B,GACA,gCAAAC,QAAA,cAAC,UAAK,WAAU,6BAA4B,eAAa,oBACtD,WAAW,CACd,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,4BAAyB,GAAC,CAC3C;AAEJ;;;AF7BA,IAAM,4BAA4B,CAAC,WAA8B;AAAA,EAC/D,aAAa,MAAM;AACrB;AAEA,IAAM,4BAA4B,CAChC,eACyC;AAAA,EACzC,OAAO,UAAU,SAAS,CAAC;AAC7B;AAEO,IAAM,oBAGT;AAAA,EACF,KAAK,CAAC,UACJ,gCAAAE,QAAA,cAAC,eAAY,QAAQ,MAAM,QAAsC;AAAA,EAEnE,KAAK,CAAC,UACJ,gCAAAA,QAAA,cAAC,gBAAa,QAAQ,MAAM,QAAuC;AAAA,EAErE,KAAK,CAAC,UACJ,gCAAAA,QAAA,cAAC,YAAS,QAAQ,MAAM,QAAmC;AAE/D;AAEO,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA,sBAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,2BAA2B;AAC7B,MAA2B;AACzB,QAAM,EAAE,6BAA6B,mBAA0B,IAC7D,oBAAoB;AACtB,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,EAAE,aAAa,IAAI;AACzB,QAAM,EAAE,YAAY,IAAI,cAAc,aAAa,OAAO,yBAAyB;AACnF,QAAM,EAAE,MAAM,IACZ,cAAc,aAAa,aAAa,OAAO,yBAAyB,KAAK,CAAC;AAChF,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAgC,IAAI;AAEtE,QAAM,YAAY,aAAa,UAC3B,yBAAyB,aAAa,OAAO,IAC7C;AAEJ,iCAAU,MAAM;AACd,QAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,UAAW;AACxD,UAAM,cAAc,CAAC,UAAsB;AACzC,UAAI,UAAU,SAAS,MAAM,MAAc,EAAG;AAC9C,mBAAa,iBAAiB;AAAA,IAChC;AACA,aAAS,iBAAiB,SAAS,WAAW;AAC9C,WAAO,MAAM;AACX,eAAS,oBAAoB,SAAS,WAAW;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,qBAAqB,aAAa,WAAW,YAAY,CAAC;AAE9D,MAAI,CAAC,eAAe,CAAC,OAAO,UAAU,CAAC,UAAW,QAAO;AAEzD,SACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,uCAAuC,kBAAkB;AAAA,MACzE,KAAK;AAAA;AAAA,IAEL,gCAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,0BAA0B,YAAY,aAAa;AAAA,QACnD,WAAW;AAAA;AAAA,MAEX,gCAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,cAAAC;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA;AAAA,QAEC,MAAM,IAAI,CAAC,MAAM,MAChB,gCAAAD,QAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,SAAS,qBAAqB;AAAA,YAC9B;AAAA,YACA,KAAK,KAAK,GAAG,SAAS;AAAA,YACtB,cAAc,MAAM,sBAAsB,CAAC;AAAA;AAAA,QAC7C,CACD;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEJ;;;AG1HA,IAAAE,gBAAiB;AAOjB,IAAAC,kBAAiF;AACjF,qCAAqB;AAiBrB,IAAMC,6BAA4B,CAAC,WAA8B;AAAA,EAC/D,WAAW,MAAM;AAAA,EACjB,aAAa,MAAM;AAAA,EACnB,MAAM,MAAM;AACd;AAEA,IAAMC,6BAA4B,CAAC,WAA8B;AAAA,EAC/D,gBAAgB,MAAM;AAAA,EACtB,OAAO,MAAM;AACf;AAEA,IAAM,sBAAsB,CAAC,WAAkC;AAAA,EAC7D,SAAS,MAAM,KAAK;AACtB;AAEA,IAAMC,gCAA+B,CAAC,WAAiC;AAAA,EACrE,eAAe,MAAM;AACvB;AAEA,IAAMC,kCAAiC,CAAC,WAAmC;AAAA,EACzE,aAAa,MAAM;AACrB;AAQA,IAAM,sBAAsB,CAAC,UAC3B,MAAM,QAAQ,WAAW,CAAC,MAAM,YAAY,CAAC,MAAM,YAAY;AAc1D,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd,GAAG;AACL,MAA6B;AAC3B,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,EAAE,6BAA6B,eAAsB,IAAI,oBAAoB;AACnF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,IACA,cAAc;AAAA,IACd;AAAA,EACF,IAAI,uBAAuB;AAC3B,QAAM,UAAU,eAAe,kBAAkB;AACjD,QAAM,UAAU,eAAe;AAC/B,QAAM,cAAc,mBAAmB,yBAAyB;AAChE,QAAM,eAAe,oBAAoB,uBAAuB;AAEhE,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,EAAE,aAAa,IAAI;AACzB,QAAM,EAAE,WAAW,aAAa,MAAAC,MAAK,IAAI;AAAA,IACvC,aAAa;AAAA,IACbJ;AAAA,EACF;AAEA,QAAM,EAAE,QAAQ,IAAI,cAAc,gBAAgB,aAAa,mBAAmB;AAClF,QAAM,EAAE,cAAc,IAAI;AAAA,IACxB,gBAAgB;AAAA,IAChBE;AAAA,EACF;AACA,QAAM,EAAE,YAAY,IAAI;AAAA,IACtB,gBAAgB,kBAAkB;AAAA,IAClCC;AAAA,EACF;AAEA,QAAM,EAAE,eAAe,IACrB,cAAc,aAAa,aAAa,OAAOF,0BAAyB,KAAK,CAAC;AAEhF,QAAM,mBAAe,wBAAuB,IAAI;AAChD,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAAS,CAAC;AAE1D,QAAM,CAAC,aAAa,cAAc,QAAI,0BAAS,KAAK;AAEpD,QAAM,oBAAyD;AAAA,IAC7D,CAAC,MAAM;AACL,UAAI,UAAU;AACZ,iBAAS,CAAC;AACV;AAAA,MACF;AACA,UAAI,CAAC,YAAY,QAAS;AAC1B,mBAAa,aAAa;AAAA,QACxB,WAAW;AAAA,UACT,KAAK,YAAY,QAAQ;AAAA,UACzB,OAAO,YAAY,QAAQ;AAAA,QAC7B;AAAA,QACA,MAAM,EAAE,OAAO;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,IACA,CAAC,UAAU,cAAc,WAAW;AAAA,EACtC;AAEA,QAAM,uBAAmB,6BAAY,MAAM;AACzC,mBAAe,KAAK;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,yBAAqB,6BAAY,MAAM;AAC3C,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAiB;AAAA,IACrB,CAAC,UAAoD;AACnD,UAAI,WAAW;AACb,kBAAU,KAAK;AACf;AAAA,MACF;AAEA,UACE,aAAa,eACb,aAAa,YAAY,aAAa,OAAO,QAC7C;AACA,YAAI,MAAM,QAAQ,SAAU,QAAO,aAAa,iBAAiB;AACjE,cAAM,cAAc,aAAa,YAAY,aAAa;AAC1D,YAAI,MAAM,QAAQ,SAAS;AACzB,gBAAM,eAAe;AACrB,uBAAa,aAAa,YAAY,gBAAgB,CAAC;AAAA,QACzD;AACA,YAAI,MAAM,QAAQ,WAAW;AAC3B,gBAAM,eAAe;AACrB,8BAAoB,CAAC,SAAS;AAC5B,gBAAI,YAAY,OAAO;AACvB,gBAAI,aAAa,aAAa,SAAS;AACrC,0BAAY;AAAA,YACd,WAAW,YAAY,GAAG;AACxB,0BAAY,YAAY,SAAS;AAAA,YACnC;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA,YAAI,MAAM,QAAQ,aAAa;AAC7B,gBAAM,eAAe;AACrB,8BAAoB,CAAC,SAAS;AAC5B,gBAAI,YAAY,OAAO;AACvB,gBAAI,aAAa,aAAa,SAAS;AACrC,0BAAY;AAAA,YACd,WAAW,aAAa,YAAY,QAAQ;AAC1C,0BAAY;AAAA,YACd;AAEA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF,WACE,aAAa,KAAK,KAClB,YAAY,WACZ,gBAAgB,iBAChB;AACA,YAAI,MAAM,QAAQ,SAAS;AAEzB,gBAAM,eAAe;AAAA,QACvB;AACA,qBAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAqD;AAAA,IACzD,CAAC,UAAU;AACT,UAAI,UAAU;AACZ,iBAAS,KAAK;AAAA,MAChB,OAAO;AACL,qBAAa,iBAAiB;AAAA,MAChC;AAAA,IACF;AAAA,IACA,CAAC,UAAU,YAAY;AAAA,EACzB;AAEA,QAAM,mBAAe;AAAA,IACnB,CAAC,MAA2C;AAC1C,iBAAW,CAAC;AACZ,mBAAa,aAAa;AAAA,QACxB,KAAM,EAAE,OAA+B;AAAA,QACvC,OAAQ,EAAE,OAA+B;AAAA,MAC3C,CAAC;AAAA,IACH;AAAA,IACA,CAAC,UAAU,YAAY;AAAA,EACzB;AAEA,iCAAU,MAAM;AACd,QAAI,aAAa,aAAa;AAC5B,0BAAoB,CAAC;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,aAAa,WAAW,CAAC;AAE7B,iCAAU,MAAM;AACd,UAAM,oBAAoB,YAAY,SAAS,QAAQ,QAAQ;AAC/D,QAAI,CAAC,YAAY,WAAW,qBAAqB,CAAC,MAAO;AACzD,gBAAY,QAAQ,MAAM;AAAA,EAC5B,GAAG,CAAC,aAAa,OAAO,eAAe,WAAW,CAAC;AAEnD,uCAAgB,MAAM;AAKpB,UAAM,WAAW,YAAY;AAC7B,QAAI,CAAC,YAAY,YAAa;AAS9B,QAAI,SAAS,UAAUG,OAAM;AAC3B,eAAS,QAAQA;AAAA,IACnB;AAEA,UAAM,SAAS,SAAS,MAAM;AAC9B,UAAMC,SAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,OAAO,MAAM,CAAC;AAC3D,UAAM,MAAM,KAAK,IAAIA,QAAO,KAAK,IAAI,UAAU,KAAK,MAAM,CAAC;AAE3D,QAAI,SAAS,mBAAmBA,UAAS,SAAS,iBAAiB,IAAK;AAExE,aAAS,kBAAkBA,QAAO,KAAK,SAAS;AAAA,EAClD,GAAG,CAACD,OAAM,UAAU,OAAO,UAAU,KAAK,aAAa,WAAW,CAAC;AAEnE,SACE,gCAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,CAAC,cAAc,GAAG;AAAA,QACpB;AAAA,MACF;AAAA,MACA,KAAK;AAAA;AAAA,IAEL,gCAAAD,QAAA;AAAA,MAAC,+BAAAE;AAAA,MAAA;AAAA,QACE,GAAG,EAAE,GAAG,yBAAyB,GAAG,kBAAkB;AAAA,QACvD,cAAY,oBAAoB,EAAE,cAAc,IAAI;AAAA,QACpD,eAAW,cAAAD;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,eAAY;AAAA,QACZ,UAAU,CAAC,WAAW,CAAC,CAAC;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV,aAAa,eAAe,EAAE,mBAAmB;AAAA,QACjD,KAAK,CAAC,QAAQ;AACZ,sBAAY,UAAU;AAAA,QACxB;AAAA;AAAA,IACF;AAAA,IAEC,CAAC,eACA,gCAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,qBAAqB;AAAA,QACrB;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEJ;;;ACzUA,IAAAG,kBAA2E;AAC3E,4BAA4B;AAC5B,IAAAC,gBAAiB;AAOjB,IAAM,2BAA2B,gBAAAC,QAAM,cAEpC;AAAA,EACD,iBAAiB;AACnB,CAAC;AAEM,IAAM,8BAA8B,UAAM,4BAAW,wBAAwB;AAQ7E,IAAM,0BAA0B,MAAM;AAC3C,QAAM,EAAE,gBAAgB,IAAI,4BAA4B;AAExD,QAAM,kBAAkB,mBAAmB;AAE3C,iCAAU,MAAM;AACd,UAAM,cAAc,kBAAkB,gBAAgB,kBAAkB,WAAW;AAEnF,WAAO;AAAA,EACT,GAAG,CAAC,iBAAiB,eAAe,CAAC;AACvC;AAEA,IAAM,uCAAuC,CAAC,WAAkC;AAAA,EAC9E,eAAe,MAAM,YAAY;AAAA,EACjC,iBAAiB,MAAM,YAAY,6BAA6B;AAClE;AAkBO,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA,WAAWC,aAAY;AAAA,EACvB;AACF,MASO;AACL,QAAM,sBAAkB,wBAAiC,oBAAI,IAAI,CAAC;AAClE,QAAM,EAAE,EAAE,IAAI,sBAAsB;AAEpC,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,2BAA2B,4BAA4B;AAC7D,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,EAAE,gBAAgB,IAAI,0BAA0B;AACtD,QAAM,EAAE,eAAe,gBAAgB,IAAI;AAAA,IACzC,gBAAgB;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,8BAA8B,OAAO,KAAK,mBAAmB,EAAE,SAAS;AAE9E,QAAM,aAAS;AAAA,IACb,MACE,cAAc,OAAsC,CAAC,cAAc,cAAc;AAC/E,4DAA4B,CAAC;AAC7B,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,IACP,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,sBAAkB,6BAAY,CAAC,OAAgC;AACnE,oBAAgB,QAAQ,IAAI,EAAE;AAE9B,WAAO,MAAM;AACX,sBAAgB,QAAQ,OAAO,EAAE;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa,6BAAY,CAAC,UAAkB;AAChD,oBAAgB,QAAQ,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;AAAA,EACnD,GAAG,CAAC,CAAC;AAEL,QAAM,EAAE,cAAc,cAAc,aAAa,QAAI,mCAAY;AAAA,IAC/D;AAAA;AAAA;AAAA,IAGA,UAAU,8BACN,CAAC,oBAAoB,oBAAoB,qBAAqB,KAAK,IACnE;AAAA,IACJ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQ,8BACJ,gBAAgB,kBAAkB,cAClC;AAAA,EACN,CAAC;AAID,MAAI,yBAAyB,oBAAoB,MAAM;AACrD,WAAO,gCAAAD,QAAA,cAACC,YAAA,EAAU,aAAuB,QAAS;AAAA,EACpD;AAEA,SACE,gCAAAD,QAAA;AAAA,IAAC,yBAAyB;AAAA,IAAzB;AAAA,MACC,OAAO;AAAA,QACL;AAAA,MACF;AAAA;AAAA,IAEA,gCAAAA,QAAA,cAACC,YAAA,EAAW,GAAG,aAAa,EAAE,WAAW,MAAM,CAAC,KAE7C,gBACC,gCAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,cAAAE,SAAK,gCAAgC;AAAA,UAC9C,8CAA8C;AAAA,QAChD,CAAC;AAAA;AAAA,MAEA,CAAC,gBAAgB,gCAAAF,QAAA,cAAC,WAAG,EAAE,sBAAsB,CAAE;AAAA,MAC/C,gBAAgB,gCAAAA,QAAA,cAAC,WAAG,EAAE,wCAAwC,CAAE;AAAA,IACnE,GAED,QACH;AAAA,EACF;AAEJ;;;AZpHO,IAAM,mBAAmB,MAAM;AACpC,QAAM,EAAE,QAAQ,IAAI,kBAAkB;AACtC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,uBAAuB,kBAAkB;AAE7C,QAAM;AAAA,IACJ,uBAAAG,yBAAwB;AAAA,IACxB,oBAAAC,sBAAqB,UAAU,2BAA2B;AAAA,IAC1D,eAAAC,iBAAgB;AAAA,IAChB,eAAAC,iBAAgB;AAAA,IAChB;AAAA,IACA,iBAAAC,mBAAkB;AAAA,IAClB,sBAAAC,wBAAuB;AAAA,IACvB,uCAAAC,yCAAwC;AAAA,IACxC,YAAAC,cAAa;AAAA,IACb,uBAAAC,yBAAwB;AAAA,IACxB,2BAAAC,6BAA4B;AAAA,IAC5B,wBAAwB;AAAA,IACxB,kBAAAC,oBAAmB;AAAA,EACrB,IAAI,oBAAoB;AACxB,QAAM,EAAE,QAAQ,IAAI,eAAe,kBAAkB;AACrD,QAAM,EAAE,QAAQ,IAAI,WAAW,OAAO;AAEtC,QAAM,qBAAiB,6BAAY,MAAM,SAAS,eAAe,GAAG,CAAC,OAAO,CAAC;AAE7E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF,QAAI,0BAAS,KAAK;AAClB,QAAM,wCAAoC,6BAAY,MAAM;AAC1D,iDAA6C,KAAK;AAAA,EACpD,GAAG,CAAC,CAAC;AAEL,QAAM,EAAE,YAAY,IAAI,0BAA0B;AAElD,MAAI,oBAAoB,eAAgB,QAAO,gCAAAC,QAAA,cAACT,gBAAA,IAAc;AAE9D,QAAM,mBAAmB,CAAC,EAAE,oBAAoB,YAAY,UAAU;AACtE,QAAM,cAAc,CAAC,CAAC,oBAAoB;AAQ1C,QAAMU,0BACJ,mCAAmC,SAC/B,yBACA;AACN,QAAM,gCACJ,CAAC,SAAS,UAAU,SAAS,UAAU,EAAE,SAAS,OAAO,KACzD,CAAC,CAACA;AAEJ,SACE,gCAAAD,QAAA,cAAC,yBAAsB,WAAU,2BAA0B,WAAU,SAClE,oBACC,oBAAoB,oBAAoB,YACxC,6CACE,gCAAAA,QAAA;AAAA,IAACL;AAAA,IAAA;AAAA,MACC,SAAS;AAAA,MACT;AAAA;AAAA,EACF,GAEJ,gCAAAK,QAAA,cAACP,kBAAA,IAAgB,GACjB,gCAAAO,QAAA,cAAC,gCAA2B,GAE5B,gCAAAA,QAAA,cAAC,SAAI,WAAU,mCACb,gCAAAA,QAAA,cAACV,qBAAA,IAAmB,GACpB,gCAAAU,QAAA,cAAC,SAAI,WAAU,0CACb,gCAAAA,QAAA,cAACN,uBAAA,IAAqB,GACtB,gCAAAM,QAAA,cAACX,wBAAA,IAAsB,GACvB,gCAAAW,QAAA,cAAC,SAAI,WAAU,kDACb,gCAAAA,QAAA,cAACD,mBAAA,IAAiB,GACjB,eAAe,gCAAAC,QAAA,cAAC,iBAAY,CAC/B,CACF,GACC,gCACC,gCAAAA,QAAA,cAACC,yBAAA,EAAuB,SAAS,gBAAgB,IAEjD,CAAC,kBACC,gCAAAD,QAAA,8BAAAA,QAAA,gBACG,oBACC,gCAAAA,QAAA;AAAA,IAACR;AAAA,IAAA;AAAA,MACC,kBAAkB;AAAA,MAClB;AAAA;AAAA,EACF,IAEA,gCAAAQ,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA,cAACJ,aAAA,EAAW,aAAa,cAAc,GACtC,oBACC,gCAAAI,QAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,UACE,eACC,CAAC,iCACA,YAAY;AAAA,QACV,CAAC,MAAM,EAAE;AAAA,MACX;AAAA,MAEJ,SAAS,MAAM;AACb,4BAAoB,UAAU,MAAM;AACpC,qDAA6C,IAAI;AAAA,MACnD;AAAA;AAAA,EACF,CAEJ,CAEJ,CAGN,GACA,gCAAAE,QAAA,cAACH,wBAAA,IAAsB,CACzB;AAEJ;;;AazJA,IAAAK,kBAAwB;AAIjB,IAAM,+BAA+B,CAAC,UAAoC;AAC/E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,WAAW,QAAQ;AAEzB,QAAM,0BAAgD;AAAA,IACpD,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,IAEA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AdwBA,IAAM,uBAAuB,CAAC,UAAgD;AAC5E,QAAM,qBAAqB,iBAAiB;AAC5C,QAAM,oBAAoB,wBAAwB,KAAK;AACvD,QAAM,EAAE,iBAAiB,IAAI,oBAAoB,cAAc;AAE/D,QAAM,2BAA2B,6BAA6B;AAAA,IAC5D,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,kBAAkB,MAAM,oBAAoB;AAAA,EAC9C,CAAC;AAED,QAAM,kBAAkB,mBAAmB;AAE3C;AAAA,IACE,MAAM,MAAM;AACV,sBAAgB,YAAY;AAAA,IAC9B;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,iCAAU,MAAM;AACd,UAAM,WAAW,gBAAgB;AACjC,QACE,CAAC,YACD,CAAC,gBAAgB,WACjB,CAAC,gBAAgB,sBACjB,CAAC,gBAAgB,OAAO,OAAO;AAE/B;AAEF,oBAAgB,QACb,SAAS,EAAE,WAAW,SAAS,CAAC,EAChC,KAAK,CAAC,EAAE,MAAM,MAAM;AACnB,UAAI,OAAO;AACT,wBAAgB,UAAU,EAAE,aAAa,MAAM,CAAC;AAAA,MAClD;AAAA,IACF,CAAC,EACA,MAAM,QAAQ,KAAK;AAAA,EACxB,GAAG,CAAC,eAAe,CAAC;AAEpB,0BAAwB;AAExB,SACE,gCAAAC,QAAA,cAAC,+BAA4B,OAAO,4BACjC,MAAM,QACT;AAEJ;AAEA,IAAM,yBAAyB,CAAC,UAA6B;AAC3D,QAAM,EAAE,OAAO,UAAU,IAAI;AAE7B,QAAM,EAAE,OAAO,aAAa,IAAI,oBAAoB,cAAc;AAClE,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,KAAK,YAAY;AAEvB,QAAM,QAAQ,aAAa,gBAAgB;AAC3C,QAAM,kBAAkB,gBAAgB,WACpC,uCAAuC,EAAE,KACzC,gCAAgC,EAAE;AAEtC,SACE,gCAAAA,QAAA,cAAC,yBAAsB,IAAI,mBACzB,gCAAAA,QAAA,cAAC,wBAAsB,GAAG,SACxB,gCAAAA,QAAA,cAAC,WAAM,CACT,CACF;AAEJ;AAKO,IAAM,eAAe,gBAAAA,QAAM;AAAA,EAChC;AACF;;;AD1JA,IAAM,4BAA4B,MAAM;AACtC,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,kBAAkB,kCAAkC;AAC1D,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,UAAU,CAAC;AAAA,MACX,MAAK;AAAA;AAAA,IAEJ,EAAE,MAAM;AAAA,EACX;AAEJ;AAEO,IAAM,kBAAkB,MAAM;AACnC,QAAM,EAAE,EAAE,IAAI,sBAAsB,iBAAiB;AACrD,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,EAAE,mBAAmB,aAAa,IAAI,uBAAuB,iBAAiB;AAEpF,QAAM,aAAS,6BAAY,MAAM;AAC/B,wBAAoB;AACpB,oBAAgB,QAAQ;AAAA,EAC1B,GAAG,CAAC,mBAAmB,eAAe,CAAC;AAEvC,iCAAU,MAAM;AACd,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,SAAU,QAAO;AAAA,IACrC;AAEA,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM,SAAS,oBAAoB,WAAW,SAAS;AAAA,EAChE,GAAG,CAAC,MAAM,CAAC;AAEX,SACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAa;AAAA,MACb,WAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,gCAAAA,QAAA,cAAC,sBAAiB;AAAA,IAClB,gCAAAA,QAAA,cAAC,SAAI,WAAU,yCACb,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,SAAS;AAAA,QACT,MAAK;AAAA;AAAA,MAEJ,EAAE,QAAQ;AAAA,IACb,GACA,gCAAAA,QAAA,cAAC,+BAA0B,CAC7B;AAAA,EACF;AAEJ;AAOO,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AACF,MAA6B;AAC3B,QAAM,EAAE,mBAAmB,iBAAiB,OAAAC,SAAQ,MAAa,IAC/D,oBAAoB;AACtB,QAAM,EAAE,kBAAkB,IAAI,kBAAkB;AAChD,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,uBAAmB,6BAAY,MAAM;AACzC,sBAAkB;AAClB,oBAAgB,QAAQ;AAAA,EAC1B,GAAG,CAAC,mBAAmB,eAAe,CAAC;AAEvC,SACE,gCAAAD,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA;AAAA,IAEN,gCAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAK;AAAA,QACL,gBAAc;AAAA,QACd,OAAO;AAAA,QACN,GAAG;AAAA;AAAA,IACN;AAAA,EACF;AAEJ;;;A7dzFA,IAAME,wCAAuC,CAAC,WAAkC;AAAA,EAC9E,eAAe,MAAM,YAAY;AAAA,EACjC,4BAA4B,MAAM,YAAY;AAChD;AAcO,IAAM,mBAAe,4BAAW,SAASC,cAC9C,EAAE,cAAc,gBAAgB,MAAM,GAAG,KAAK,GAC9C,KACA;AACA,QAAM,oBAAoB,2BAA2B,eAAe,YAAY;AAEhF,SAAO,gCAAAC,QAAA,cAAC,WAAM,UAAU,mBAAmB,KAAU,MAAK,QAAQ,GAAG,MAAM;AAC7E,CAAC;AAIM,IAAM,YAAY;AAElB,IAAM,sBAAkB,4BAAW,SAASC,iBACjD;AAAA,EACE;AAAA,EACA,cAAc;AAAA,EACd,GAAG;AACL,GACA,KACA;AACA,QAAM,EAAE,EAAE,IAAI,sBAAsB,iBAAiB;AACrD,QAAM,EAAE,mBAAmB,YAAY,IAAI,uBAAuB;AAClE,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,EAAE,kBAAkB,IAAI;AAC9B,QAAM,EAAE,gBAAgB,IAAI,0BAA0B;AACtD,QAAM,EAAE,eAAe,2BAA2B,IAAI;AAAA,IACpD,gBAAgB;AAAA,IAChBH;AAAA,EACF;AACA,QAAM,SAAK,yBAAQ,UAAM,uBAAO,GAAG,CAAC,CAAC;AAErC,QAAM,mBAAe;AAAA,IACnB,CAAC,UAAuB;AACtB,wBAAkB,YAAY,KAAK;AACnC,kBAAY,SAAS,MAAM;AAC3B,2BAAqB,KAAK;AAAA,IAC5B;AAAA,IACA,CAAC,oBAAoB,mBAAmB,WAAW;AAAA,EACrD;AAEA,SACE,gCAAAE,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ,eAAe,KAAK,GAAG;AAAA,MAC/B,cAAY,EAAE,kBAAkB;AAAA,MAChC,eAAY;AAAA,MACZ,UAAU,CAAC,mBAAmB,CAAC,CAAC;AAAA,MAChC;AAAA,MACA,UAAU,6BAA6B;AAAA,MACtC,GAAG;AAAA,MACJ,eAAW,cAAAE,SAAK,wBAAwB,SAAS;AAAA,MACjD;AAAA,MACA;AAAA;AAAA,EACF;AAEJ,CAAC;;;ALrED,IAAM,gBAAgB;AAEtB,IAAMC,4BAA2B,CAAC,WAA6B;AAAA,EAC7D,eAAe,MAAM;AAAA,EACrB,WAAW,MAAM;AAAA,EACjB,cAAc,MAAM;AAAA,EACpB,UAAU,MAAM;AAAA,EAChB,gBAAgB,MAAM;AACxB;AAOA,IAAM,yBAAyB,CAAC,EAAE,YAAY,MAAmC;AAC/E,QAAM,EAAE,eAAe,WAAW,cAAc,UAAU,eAAe,IACvE,cAAc,aAAa,OAAOA,yBAAwB,KAAK,CAAC;AAElE,QAAM,oBAAoB,kBAAkB,YAAY;AAExD,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAW,eAAe,eAAY,4BACzC,gCAAAA,QAAA,cAAC,cAAW,WAAW,CAAC,CAAC,WAAW,SAAS,YAAY,YAAY,GACrE,gCAAAA,QAAA,cAAC,SAAI,WAAU,oEACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,OAAO,YAAY;AAAA;AAAA,IAElB,YAAY;AAAA,EACf,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,uEACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,iEACZ,YAAY,kBACX,gBAAgB,iBAAiB,IAEjC,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,YAAY;AAAA,MACtB,uBAAuB;AAAA;AAAA,EACzB,CAEJ,GACA,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,YAAY;AAAA,MAClB,cAAc,YAAY,gBAAgB,CAAC;AAAA;AAAA,EAC7C,CACF,CACF,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,yEACZ,YACC,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,CAAC;AAAA,MACX,SAAS,YAAY;AAAA;AAAA,IAEpB,cAAc,QAAQ,CAAC;AAAA,IAAE;AAAA,EAC5B,IAEA,gCAAAA,QAAA,cAAC,YAAS,KAAK,MAAM,UAAU,YAAY,UAAU,MAAM,IAAI,CAEnE,CACF;AAEJ;AAOO,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AACF,MAAiC;AAC/B,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM;AAAA,IACJ;AAAA,IACA,UAAAC,YAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,QAAQ,EAAE,eAAe;AAAA,IACzB;AAAA,EACF,IAAI;AAWJ,QAAM,EAAE,SAAS,WAAW,IAAI,kBAAkB,KAAK,CAAC;AAExD,QAAM,cAAc,eAAe;AAAA,IACjC,iBAAiBA,aAAY;AAAA,IAC7B,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA,WACE,SAAS,MACT,GAAG,aAAc,QAAQ,aAAa,QAAQ,KAAM,EAAE,GAAG,QAAQ,EAAE;AAAA,IACrE,KAAK;AAAA,IACL;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AAED,SAAO,cAAc,gCAAAD,QAAA,cAAC,0BAAuB,aAA0B,IAAK;AAC9E;AAIO,IAAM,uBAAuB,CAAC,EAAE,WAAW,MAAiC;AACjF,QAAM,EAAE,EAAE,IAAI,sBAAsB;AACpC,QAAM,QAAQ,WAAW,SAAS,EAAE,eAAe;AACnD,SACE,gCAAAA,QAAA,cAAC,SAAI,WAAW,eAAe,eAAY,mCACzC,gCAAAA,QAAA,cAAC,SAAI,WAAU,oEACZ,SACC,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ;AAAA;AAAA,IAEC;AAAA,EACH,GAEF,gCAAAA,QAAA,cAAC,SAAI,WAAU,uEACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,iEACZ,WAAW,WACV,gBAAgB,WAAW,QAAQ,IAEnC,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,WAAW;AAAA,MACrB,uBAAuB;AAAA;AAAA,EACzB,CAEJ,CACF,CACF,GACA,gCAAAA,QAAA,cAAC,YAAS,KAAK,MAAM,UAAU,WAAW,WAAW,MAAM,IAAI,CACjE;AAEJ;AASO,IAAM,iBAAiB,CAAC,EAAE,YAAY,SAAS,MACpD,WACE,gCAAAA,QAAA,cAAC,wBAAqB,YAAwB,IAE9C,gCAAAA,QAAA,cAAC,wBAAqB,YAAwB;;;Akf9KlD,IAAAE,kBAAkB;AAClB,IAAAC,gBAAiB;AACjB,0BAAwB;AAgBxB,IAAM,iBAAiB,CAAC,QAAwB;AAC9C,MAAI,QAAQ,UAAa,QAAQ,MAAM;AACrC,UAAM,CAAC,UAAU,IAAI,IAAI,QAAQ,gCAAgC,EAAE,EAAE,MAAM,GAAG;AAE9E,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,qBAAqB,CAAC,EAAE,KAAK,MAAoC;AACrE,QAAM,EAAE,EAAE,IAAI,sBAAsB,MAAM;AAE1C,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,qCAAqC;AAAA,QACnD,CAAC,sCAAsC,IAAI,EAAE,GAAG;AAAA,MAClD,CAAC;AAAA;AAAA,IAED,gCAAAD,QAAA,cAAC,SAAI,WAAU,gDACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,6CACZ,EAAE,qCAAqC,CAC1C,CACF;AAAA,EACF;AAEJ;AAEA,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AACF,MACE,gCAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,WAAU;AAAA,IACV,eAAY;AAAA;AAAA,EAEZ,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAM;AAAA,MACN,KAAI;AAAA,MACJ,QAAO;AAAA;AAAA,IAEN,eAAe,eAAe,GAAG;AAAA,EACpC;AACF;AAWF,IAAM,aAAa,CAAC,UAA2B;AAC7C,QAAM,EAAE,WAAW,YAAY,OAAAE,QAAO,WAAW,WAAW,OAAO,KAAK,IAAI;AAE5E,MAAI,SAAS;AACb,MAAI,aAAa,SAAS,SAAS;AACjC,aACE,gCAAAF,QAAA;AAAA,MAAC,oBAAAG;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAQ;AAAA,QACR,QAAO;AAAA,QACP,KAAK;AAAA,QACL,OAAM;AAAA;AAAA,IACR;AAAA,EAEJ,WAAWD,QAAO;AAChB,aACE,gCAAAF,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU,SAASE;AAAA,QACnB;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SAAO,SACL,gCAAAF,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAa;AAAA;AAAA,IAEZ;AAAA,EACH,IACE;AACN;AAIA,IAAM,cAAc,CAAC,UAA4B;AAC/C,QAAM,EAAE,aAAa,eAAe,MAAAI,OAAM,OAAO,YAAY,KAAK,IAAI;AACtE,QAAM,MAAM,cAAc;AAE1B,SACE,gCAAAJ,QAAA,cAAC,SAAI,WAAU,gDACZ,SAAS,UACR,gCAAAA,QAAA,cAAC,aAAU,IAAI,OAAO,IAEtB,gCAAAA,QAAA,cAAC,SAAI,WAAU,6CACZ,OAAO,gCAAAA,QAAA,cAAC,cAAW,aAA0B,KAAU,GACvD,SACC,gCAAAA,QAAA,cAAC,SAAI,WAAU,8CAA4C,KAAM,GAElEI,SAAQ,gCAAAJ,QAAA,cAAC,SAAI,WAAU,6CAA2CI,KAAK,CAC1E,CAEJ;AAEJ;AAEA,IAAMC,4BAA2B,CAAC,WAA6B;AAAA,EAC7D,WAAW,MAAM;AAAA,EACjB,UAAU,MAAM;AAClB;AAEA,IAAM,cAAc,CAAC,EAAE,UAAU,IAAI,MAA0C;AAU7E,QAAM,EAAE,SAAS,WAAW,IAAI,kBAAkB,KAAK,CAAC;AAExD,QAAM,cAAc,eAAe;AAAA,IACjC;AAAA,IACA,WACE,SAAS,MACT,GAAG,aAAc,QAAQ,aAAa,QAAQ,KAAM,EAAE,GAAG,QAAQ,EAAE;AAAA,IACrE;AAAA,EACF,CAAC;AAED,QAAM,EAAE,WAAW,SAAS,IAC1B,cAAc,aAAa,OAAOA,yBAAwB,KAAK,CAAC;AAElE,MAAI,CAAC,YAAa;AAElB,SACE,gCAAAL,QAAA,cAAC,SAAI,WAAU,+DACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,8DACb,gCAAAA,QAAA,cAAC,cAAW,WAAW,CAAC,CAAC,WAAW,SAAS,YAAY,YAAY,CACvE,GACA,gCAAAA,QAAA,cAAC,eAAY,SAAS,YAAY,MAAM,UAAU,YAAY,GAAG,CACnE;AAEJ;AAEO,IAAM,YAAY,CAAC;AAAA,EACxB,IAAI,EAAE,WAAW,aAAa,WAAW,eAAe,MAAAI,OAAM,OAAO,WAAW;AAClF,MAAkB;AAChB,QAAM,MAAM,cAAc;AAC1B,QAAM,aAAa;AACnB,QAAME,iBAAgB;AACtB,SACE,gCAAAN,QAAA,cAAC,SAAI,WAAWM,gBAAe,eAAa,cACzC,aAAa,gCAAAN,QAAA,cAAC,eAAY,UAAU,WAAW,KAAK,WAAW,GAChE,gCAAAA,QAAA,cAAC,SAAI,WAAU,2DACZ,OAAO,gCAAAA,QAAA,cAAC,cAAW,aAA0B,KAAU,GACvD,SACC,gCAAAA,QAAA,cAAC,SAAI,WAAU,sDAAoD,KAAM,GAE1EI,SACC,gCAAAJ,QAAA,cAAC,SAAI,WAAU,4DACZI,KACH,CAEJ,CACF;AAEJ;AAIA,IAAM,iBAAiB,CAAC,UAAqB;AAC3C,QAAM,EAAE,WAAW,OAAO,WAAW,WAAW,OAAO,YAAY,KAAK,IAAI;AAC5E,QAAM,EAAE,cAAc,iBAAiB,IAAI,uBAAuB,YAAY;AAE9E,MAAIF,SAAQ,aAAa;AACzB,QAAM,aAAkD,CAAC;AAEzD,MAAI,SAAS,WAAW,OAAO,UAAU,aAAa;AACpD,UAAM,eACJ,MAAM,gBAA0D;AAClE,IAAAA,SAAQ,aAAa;AACrB,eAAW,SAAS,aAAa;AACjC,eAAW,QAAQ,aAAa;AAAA,EAClC;AAEA,MAAI,CAAC,SAAS,CAAC,cAAc,CAAC,aAAa,CAACA,QAAO;AACjD,WAAO,gCAAAF,QAAA,cAAC,wBAAmB;AAAA,EAC7B;AAEA,SACE,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,wEAAwE,IAAI;AAAA;AAAA,IAEvF,gCAAAA,QAAA,cAAC,cAAY,GAAG,OAAO,YAAwB,OAAOE,QAAO;AAAA,IAC7D,gCAAAF,QAAA,cAAC,eAAa,GAAG,OAAO;AAAA,EAC1B;AAEJ;AAKO,IAAM,OAAO,gBAAAA,QAAM,KAAK,cAAc;;;ACpO7C,IAAAO,kBAAkB;AAUlB,IAAM,2BAA2B,CAAC,EAAE,WAAW,MAC7C,gCAAAC,QAAA,cAAC,SAAI,WAAU,2CAA0C,eAAY,qBACnE,gCAAAA,QAAA,cAAC,YAAS,WAAU,uBAAsB,UAAU,WAAW,WAAW,GAC1E,gCAAAA,QAAA,cAAC,SAAI,WAAU,kDACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,uDACb,gCAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,WAAU;AAAA,IACV,eAAY;AAAA;AAAA,EAEX,WAAW;AACd,GACA,gCAAAA,QAAA,cAAC,kBAAe,UAAU,WAAW,WAAW,CAClD,GACA,gCAAAA,QAAA,cAAC,qBAAkB,UAAU,WAAW,WAAW,CACrD,CACF;AAGK,IAAM,iBAAiB,gBAAAA,QAAM;AAAA,EAClC;AACF;;;AC7BA,IAAAC,kBAA0B;AAC1B,IAAAA,kBAAiC;AACjC,IAAAA,kBAAkB;AAaX,IAAM,cAAc,CAAC;AAAA,EAC1B,sCAAsC;AAAA,EACtC;AAAA,EACA;AACF,MAAwB;AACtB,QAAM,EAAE,SAAS,OAAO,IAAI,eAAe;AAC3C,QAAM,EAAE,EAAE,IAAI,sBAAsB;AAEpC,QAAM,CAAC,gBAAgB,iBAAiB,QAAI;AAAA,IAC1C,CAAC,CAAC,SAAS,UAAU,IAAI,KAAK,SAAS,MAAM,EAAE,QAAQ,KAAI,oBAAI,KAAK,GAAE,QAAQ;AAAA,EAChF;AACA,QAAM,iBAAa,wBAAkD,MAAS;AAE9E,QAAM,eAAe,SAAS,YAAY,OAAO;AACjD,QAAM,iBAAiB,CAAC,CAAC,SAAS;AAElC,iCAAU,MAAM;AACd,QAAI,CAAC,SAAS,OAAQ;AACtB,iBAAa,WAAW,OAAO;AAC/B,eAAW,UAAU;AAAA,MACnB,MAAM,kBAAkB,IAAI;AAAA,MAC5B,IAAI,KAAK,SAAS,MAAM,EAAE,QAAQ,IAAI,KAAK,IAAI;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,SAAS,MAAM,CAAC;AAEpB,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEZ,gCAAAA,QAAA,cAAC,SAAI,WAAU,gEACZ,iBACC,gCAAAA,QAAA,cAAC,kBAAe,UAAU,SAAS,UAAU,WAAW,SAAS,WAAW,IAE5E,gCAAAA,QAAA,cAAC,uCAAoC,UAAoB,CAE7D;AAAA,IACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,sDACZ,iBACC,iBACE,EAAE,wBAAwB,IACxB,eACF,gCAAAA,QAAA,cAAC,SAAI,WAAU,8DACb,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS,MAAM,SAAS,wBAAwB,QAAQ;AAAA,QACxD,MAAK;AAAA;AAAA,MAEJ,EAAE,cAAc;AAAA,IACnB,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,oEACZ,EAAE,8BAA8B;AAAA,MAC/B,WAAW,EAAE,0BAA0B,EAAE,WAAW,SAAS,OAAO,CAAC;AAAA,IACvE,CAAC,CACH,CACF,IAEA,gCAAAA,QAAA,cAAC,SAAI,WAAU,8DACb,gCAAAA,QAAA,cAAC,SAAI,WAAU,qEACZ,EAAE,eAAe,CACpB,GACA,gCAAAA,QAAA,cAAC,SAAI,WAAU,oEACZ,EAAE,8BAA8B;AAAA,MAC/B,WAAW,EAAE,0BAA0B,EAAE,WAAW,SAAS,OAAO,CAAC;AAAA,IACvE,CAAC,CACH,CACF,IAGF,EAAE,kBAAkB,CAExB;AAAA,EACF;AAEJ;AAMA,IAAM,6CAA6C,CAAC;AAAA,EAClD;AACF,MACE,gCAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,WAAU;AAAA,IACV,eAAY;AAAA;AAAA,EAEZ,gCAAAA,QAAA,cAAC,qBAAgB;AAAA,EACjB,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAM,6BAA6B,CAAC,SAAS,UAAU,SAAS,SAAS,EAAE,KAAK,CAAC;AAAA,MACjF,KAAI;AAAA,MACJ,QAAO;AAAA;AAAA,IAEP,gCAAAA,QAAA,cAAC,sBAAiB;AAAA,EACpB;AACF;;;AChHF,IAAAC,kBAAkB;AAUX,IAAM,wBAAwB,CAAC,EAAE,WAAW,MAAkC;AACnF,QAAM,EAAE,EAAE,IAAI,sBAAsB,uBAAuB;AAC3D,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA;AAAA,IAEZ,gCAAAA,QAAA,cAAC,YAAS,WAAU,uBAAsB;AAAA,IAC1C,gCAAAA,QAAA,cAAC,SAAI,WAAU,wDACb,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA;AAAA,MAEX,WAAW,SAAS,EAAE,wBAAwB;AAAA,IACjD,CACF;AAAA,EACF;AAEJ;;;AvgBMO,IAAM,4BAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF,MAAmD;AACjD,QAAM,QAAQ,wBAAwB,UAAU;AAChD,MAAI,QAAQ;AAEZ,MAAI,CAAC,SAAS,KAAC,+CAAyB,UAAU,GAAG;AACnD,YACE,kBAAkB,UAAU,CAAC,YAAY,aAAa,CAAC,YAAY,YAC/D,aACA,YAAY,SAAS,SACnB,YACA;AAAA,EACV;AAEA,QAAM,iBAAa,cAAAC;AAAA,IACjB;AAAA,IACA;AAAA,MACE,CAAC,iCAAiC,aAAa,EAAE,GAAG;AAAA,MACpD,CAAC,iCAAkC,YAA2B,IAAI,EAAE,GAClE,YACC;AAAA,MACH,CAAC,iCAAiC,aAAa,KAAK,KAAK,EAAE,GACzD,iBAAiB;AAAA,MACnB,2CAA2C,gBAAgB,UAAU;AAAA,MACrE,6CAA6C,UAAU;AAAA,IACzD;AAAA,EACF;AAEA,SAAO,gCAAAC,QAAA,cAAC,SAAI,WAAW,cAAa,QAAS;AAC/C;AAEO,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA,mBAAAC,qBAAoB;AACtB,MAA6B;AAC3B,MAAI,CAAC,WAAW,SAAS,OAAQ,QAAO;AAExC,SACE,gCAAAD,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,SAAS,WAAW;AAAA,MACpB,IAAK,WAA+B,eAAe,MAAM;AAAA,MACzD,MAAM,WAAW,QAAQ;AAAA;AAAA,EAC3B;AAEJ;AAEA,SAAS,0BAA0B,KAAa;AAC9C,QAAM,UAAU;AAAA,IACd,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,EACtB;AAEA,MAAY,aAAK,KAAK,KAAK,GAAG;AAC5B,UAAM,YAAY,IAAI,IAAI,GAAG,EAAE;AAC/B,UAAM,KAAK,OAAO,UAAU,IAAI,IAAI,CAAC;AACrC,UAAM,KAAK,OAAO,UAAU,IAAI,IAAI,CAAC;AACrC,UAAM,iBAAiB,KAAK,IAAI,KAAK;AACrC,UAAM,gBAAgB,KAAK,IAAI,KAAK;AACpC,YAAQ,kBAAkB,IAAI;AAC9B,YAAQ,mBAAmB,IAAI;AAAA,EACjC;AAEA,SAAO;AACT;AAEO,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA,SAAAC,WAAU;AACZ,MAA0B;AACxB,QAAM,oBAAgB,wBAAsB,CAAC,CAAC;AAC9C,QAAM,EAAE,2BAA2B,IAAI,uBAAuB;AAC9D,QAAM,CAAC,0BAA0B,2BAA2B,QAAI,0BAE9D,CAAC,CAAC;AAEJ,uCAAgB,MAAM;AACpB,QAAI,CAAC,cAAc,WAAW,CAAC,2BAA4B;AAC3D,UAAM,oBAAoD,CAAC;AAC3D,UAAM,uBAAuB,cAAc,QAAQ,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACpE,QAAI,qBAAqB,SAAS,cAAc,QAAQ,QAAQ;AAC9D,oBAAc,UAAU;AAAA,IAC1B;AACA,kBAAc,QAAQ,QAAQ,CAACC,UAAS,MAAM;AAC5C,UAAI,CAACA,SAAS;AACd,YAAM,SAAS,2BAA2B,WAAW,OAAO,CAAC,GAAGA,QAAO;AACvE,wBAAkB,KAAK,MAAM;AAAA,IAC/B,CAAC;AACD,gCAA4B,iBAAiB;AAAA,EAC/C,GAAG,CAAC,4BAA4B,UAAU,CAAC;AAE3C,QAAM,SAAS,WAAW,OAAO,IAAI,CAACC,QAAO,OAAO;AAAA,IAClD,GAAGA;AAAA,IACH,YAAY,yBAAyB,CAAC,GAAG,OAAO;AAAA,IAChD,OAAO;AAAA,MACL,WAAW,OAAO,CAAC,GAAG,aAAa,WAAW,OAAO,CAAC,GAAG,aAAa;AAAA,IACxE;AAAA,EACF,EAAE;AAEF,SACE,gCAAAJ,QAAA,cAAC,6BAA0B,YAAwB,eAAc,aAC/D,gCAAAA,QAAA,cAACE,UAAA,EAAQ,QAAQ,UAAU,CAAC,GAAG,WAAW,eAAe,KAAI,WAAU,CACzE;AAEJ;AAEO,IAAM,iBAAiB,CAAC,UAAiC;AAC9D,QAAM,EAAE,YAAY,OAAAG,SAAQ,eAAa,IAAI;AAC7C,QAAM,gBAAgB;AACtB,QAAM,mBAAe,wBAAyB,IAAI;AAClD,QAAM,EAAE,2BAA2B,IAAI,uBAAuB;AAC9D,QAAM,CAAC,yBAAyB,0BAA0B,QAAI,0BAE5D,MAAS;AAEX,uCAAgB,MAAM;AACpB,QAAI,aAAa,WAAW,4BAA4B;AACtD,YAAM,SAAS,2BAA2B,YAAY,aAAa,OAAO;AAC1E,iCAA2B,MAAM;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,cAAc,4BAA4B,UAAU,CAAC;AAEzD,QAAM,cAAc;AAAA,IAClB,GAAG;AAAA,IACH,YAAY,yBAAyB,OAAO;AAAA,IAC5C,OAAO,0BAA0B,WAAW,aAAa,WAAW,aAAa,EAAE;AAAA,EACrF;AAEA,MAAI,WAAW,WAAW,WAAW,QAAQ,QAAQ;AACnD,WACE,gCAAAL,QAAA,cAAC,6BAA0B,YAAwB,iBACjD,gCAAAA,QAAA,cAAC,SAAI,WAAU,0BACb,gCAAAA,QAAA,cAACK,QAAA,EAAO,GAAG,aAAa,UAAU,cAAc,GAChD,gCAAAL,QAAA,cAAC,8BAA4B,GAAG,OAAO,CACzC,CACF;AAAA,EAEJ;AAEA,SACE,gCAAAA,QAAA,cAAC,6BAA0B,YAAwB,iBACjD,gCAAAA,QAAA,cAACK,QAAA,EAAO,GAAG,aAAa,UAAU,cAAc,CAClD;AAEJ;AAEO,IAAM,gBAAgB,CAAC,UAAiC;AAC7D,QAAM,EAAE,YAAY,MAAAC,QAAO,KAAY,IAAI;AAC3C,QAAM,gBAAgB;AAEtB,MAAI,WAAW,WAAW,WAAW,QAAQ,QAAQ;AACnD,WACE,gCAAAN,QAAA,cAAC,6BAA0B,YAAwB,iBACjD,gCAAAA,QAAA,cAAC,SAAI,WAAU,0BACb,gCAAAA,QAAA,cAACM,OAAA,EAAM,GAAG,YAAY,GACtB,gCAAAN,QAAA,cAAC,8BAA4B,GAAG,OAAO,CACzC,CACF;AAAA,EAEJ;AAEA,SACE,gCAAAA,QAAA,cAAC,6BAA0B,YAAwB,iBACjD,gCAAAA,QAAA,cAACM,OAAA,EAAM,GAAG,YAAY,CACxB;AAEJ;AAEO,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA,MAAAC,QAAO;AACT,MAA6B;AAC3B,MAAI,CAAC,WAAW,UAAW,QAAO;AAElC,SACE,gCAAAP,QAAA,cAAC,6BAA0B,YAAwB,eAAc,UAC/D,gCAAAA,QAAA,cAACO,OAAA,EAAK,YAAwB,CAChC;AAEJ;AACO,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA,OAAAC,SAAQA;AACV,MACE,gCAAAR,QAAA,cAAC,6BAA0B,YAAwB,eAAc,WAC/D,gCAAAA,QAAA,cAAC,SAAI,WAAU,0BACb,gCAAAA,QAAA,cAACQ,QAAA,EAAM,IAAI,YAAY,CACzB,CACF;AAGK,IAAM,0BAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,gBAAAC,kBAAiB;AACnB,MACE,gCAAAT,QAAA,cAAC,6BAA0B,YAAwB,eAAc,oBAC/D,gCAAAA,QAAA,cAAC,SAAI,WAAU,0BACb,gCAAAA,QAAA,cAACS,iBAAA,EAAe,YAAwB,UAAoB,CAC9D,CACF;AAGK,IAAM,iBAAiB,CAAC,UAAiC;AAC9D,QAAM,EAAE,YAAY,QAAQ,qBAAAC,QAAY,IAAI;AAC5C,QAAM,gBAAgB;AACtB,QAAM,EAAE,8BAA8B,2BAA2B,IAC/D,uBAAuB;AACzB,QAAM,mBAAe,wBAAuB,IAAI;AAChD,QAAM,CAAC,yBAAyB,0BAA0B,QACxD,0BAAuC;AAEzC,uCAAgB,MAAM;AACpB,QAAI,aAAa,WAAW,4BAA4B;AACtD,YAAM,SAAS;AAAA,QACb;AAAA,QACA,aAAa;AAAA,QACb;AAAA,MACF;AACA,iCAA2B,MAAM;AAAA,IACnC;AAAA,EAEF,GAAG,CAAC,cAAc,4BAA4B,UAAU,CAAC;AAEzD,QAAMC,WACJ,gCAAAX,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,KAAK;AAAA,MACL,OAAO,0BAA0B,WAAW,aAAa,EAAE;AAAA;AAAA,IAE3D,gCAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,yBAAyB,SAAS,EAAE,EAAE;AAAA,QAC9E,UAAQ;AAAA,QACR,QAAO;AAAA,QACP,KAAK,yBAAyB;AAAA,QAC9B,OAAM;AAAA;AAAA,IACR;AAAA,EACF;AAGF,SAAO,WAAW,SAAS,SACzB,gCAAAA,QAAA,cAAC,6BAA0B,YAAwB,iBACjD,gCAAAA,QAAA,cAAC,SAAI,WAAU,0BACZW,UACD,gCAAAX,QAAA,cAAC,8BAA4B,GAAG,OAAO,CACzC,CACF,IAEA,gCAAAA,QAAA,cAAC,6BAA0B,YAAwB,iBAChDW,QACH;AAEJ;AAEO,IAAM,uBAAuB,CAAC;AAAA,EACnC,aAAAC,eAAc;AAAA,EACd;AACF,MACE,gCAAAZ,QAAA,cAAC,6BAA0B,YAAY,UAAU,eAAc,iBAC7D,gCAAAA,QAAA,cAACY,cAAA,EAAY,UAAoB,CACnC;AAGK,IAAM,iCAAiC,CAAC;AAAA,EAC7C;AAAA,EACA,uBAAAC,yBAAwB;AAC1B,MACE,gCAAAb,QAAA,8BAAAA,QAAA,gBACE,gCAAAA,QAAA,cAACa,wBAAA,EAAsB,YAAwB,CACjD;;;ADjRF,IAAM,gBAAgB;AAAA,EACpB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA,EACb,gBAAgB;AAClB;AAEO,IAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAiCO,IAAM,aAAa,CAAC,UAA2B;AACpD,QAAM,EAAE,YAAY,IAAI;AAExB,QAAM,yBAAqB;AAAA,IACzB,MAAM,yBAAyB,KAAK;AAAA;AAAA,IAEpC,CAAC,WAAW;AAAA,EACd;AAEA,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,+BACZ,wBAAwB;AAAA,IACvB,CAAC,KAAK,cAAc,CAAC,GAAG,KAAK,GAAG,mBAAmB,SAAS,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH,CACF;AAEJ;AAEA,IAAM,2BAA2B,CAAC;AAAA,EAChC;AAAA,EACA,GAAG;AACL,MAAkD;AAChD,QAAM,iBAAqC,YAAY;AAAA,IAAO,CAAC,mBAC7D,wCAAkB,UAAU;AAAA,EAC9B;AAEA,QAAM,aAAa,YAChB,OAAO,CAAC,eAAe,KAAC,wCAAkB,UAAU,CAAC,EACrD;AAAA,IACC,CAAC,SAAS,eAAe;AACvB,cAAI,+CAAyB,UAAU,GAAG;AACxC,gBAAQ,YAAY;AAAA,UAClB,gCAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACE,GAAG;AAAA,cACJ,KAAI;AAAA,cACJ,UAAU;AAAA;AAAA,UACZ;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,iBAAiB,kBAAkB,UAAU;AAEnD,cAAM,YAAY,cAAc,cAAc;AAC9C,gBAAQ,cAAc,EAAE;AAAA,UACtB,gCAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,GAAG,cAAc,IAAI,QAAQ,cAAc,EAAE,MAAM;AAAA,cACvD,GAAG;AAAA,cACJ;AAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO,CAAC;AAAA,MACR,MAAM,CAAC;AAAA,MACP,MAAM,CAAC;AAAA,MACP,OAAO,CAAC;AAAA,MACR,aAAa,CAAC;AAAA;AAAA;AAAA,MAGd,OAAO,CAAC;AAAA;AAAA,MAER,SAAS,CAAC;AAAA,MACV,aAAa,CAAC;AAAA,MACd,gBAAgB,CAAC;AAAA,IACnB;AAAA,EACF;AAEF,MAAI,eAAe,SAAS,GAAG;AAC7B,eAAW,SAAS,IAAI;AAAA,MACtB,gCAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAI;AAAA,UACH,GAAG;AAAA,UACJ,YAAY;AAAA,YACV,QAAQ;AAAA,YACR,MAAM;AAAA,UACR;AAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,eAAe,WAAW,GAAG;AACtC,eAAW,OAAO,IAAI;AAAA,MACpB,gCAAAA,QAAA,cAAC,kBAAe,KAAI,mBAAmB,GAAG,MAAM,YAAY,eAAe,CAAC,GAAG;AAAA,IACjF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,oBAAoB,CACxB,eAC+B;AAC/B,UAAI,uCAAiB,UAAU,GAAG;AAChC,WAAO;AAAA,EACT,eAAW,wCAAkB,YAAY,uBAAuB,GAAG;AACjE,WAAO;AAAA,EACT,eAAW,wCAAkB,UAAU,GAAG;AACxC,WAAO;AAAA,EACT,eAAW,iDAA2B,UAAU,GAAG;AACjD,WAAO;AAAA,EACT,eAAW,uCAAiB,YAAY,uBAAuB,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AygBnMA,IAAAC,kBAAqB;AACrB,IAAAC,kBAAkE;AAGlE,IAAMC,cAAa,CAAC,iBAClB,EAAE,aAAa,aAAa,YAAY,MAAM,aAAa,QAAQ;AAE9D,IAAMC,oBAAmB,CAAC,iBAC/B,gBAAgB,EAAE,aAAa,UAAU,aAAa;AAExD,IAAMC,YAAW,CAAC,MAAa,QAAQ,MAAM,kBAAkB,CAAC;AAEhE,IAAMC,0BAAyB,CAAC,GAAK,KAAK,CAAG;AActC,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA,gBAAgBA;AAClB,IAA2B,CAAC,MAAM;AAChC,QAAM,EAAE,gBAAgB,IAAI,wBAAwB,oBAAoB;AACxE,QAAM,EAAE,EAAE,IAAI,sBAAsB,oBAAoB;AACxD,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAS,KAAK;AAChD,QAAM,CAAC,eAAe,gBAAgB,QAAI,0BAAgB;AAC1D,QAAM,CAAC,eAAe,gBAAgB,QAAI,0BAAS,IAAI;AACvD,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,0BAAS,CAAC;AACtD,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,0BAAiB,CAAC;AACpE,QAAM,kBAAc,wBAAsC,MAAS;AACnE,QAAM,eAAW,wBAAgC,IAAI;AAErD,QAAM,oBAAgB;AAAA,IACpB,CAAC,MAAa;AACZ,MAAAD,UAAS,CAAU;AACnB,uBAAiB,CAAC;AAClB,sBAAgB,EAAE,SAAS,OAAO;AAAA,IACpC;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,iBAAa,6BAAY,YAAY;AACzC,QAAI,CAAC,SAAS,QAAS;AACvB,iBAAa,YAAY,OAAO;AAChC,gBAAY,UAAU;AACtB,QAAI,YAAY,CAAC,SAAS,QAAQ,YAAY,QAAQ,GAAG;AACvD;AAAA,QACE,IAAI,MAAM,EAAE,4DAA4D,CAAC;AAAA,MAC3E;AACA,uBAAiB,KAAK;AACtB;AAAA,IACF;AACA,QAAID,kBAAiB,SAAS,OAAO,GAAG;AACtC,eAAS,QAAQ,MAAM;AACvB,mBAAa,KAAK;AAAA,IACpB,OAAO;AACL,kBAAY,UAAU,WAAW,MAAM;AACrC,YAAI,CAAC,SAAS,QAAS;AACvB,YAAI;AACF,mBAAS,QAAQ,MAAM;AACvB,uBAAa,KAAK;AAAA,QACpB,SAAS,GAAG;AACV,wBAAc,IAAI,MAAM,EAAE,8BAA8B,CAAC,CAAC;AAAA,QAC5D;AAAA,MACF,GAAG,GAAI;AAEP,UAAI;AACF,cAAM,SAAS,QAAQ,KAAK;AAC5B,qBAAa,IAAI;AAAA,MACnB,SAAS,GAAG;AACV,sBAAc,CAAU;AACxB,qBAAa,KAAK;AAAA,MACpB,UAAE;AACA,qBAAa,YAAY,OAAO;AAChC,oBAAY,UAAU;AAAA,MACxB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,eAAe,CAAC,CAAC;AAE/B,QAAM,uBAAuB,MAAM;AACjC,yBAAqB,CAAC,SAAS;AAC7B,UAAI,CAAC,SAAS,QAAS,QAAO;AAC9B,YAAM,YAAY,SAAS,cAAc,SAAS,IAAI,IAAI,OAAO;AACjE,eAAS,QAAQ,eAAe,cAAc,SAAS;AACvD,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,WAAO;AAAA,IACX,UACE,gBAAAG,SAAS,CAAC,EAAE,SAAS,cAAc,MAAM;AACvC,UAAI,EAAE,iBAAiB,SAAS,SAAU;AAC1C,UAAI,CAACJ,YAAW,SAAS,OAAO,GAAG;AACjC,sBAAc,IAAI,MAAM,EAAE,8BAA8B,CAAC,CAAC;AAC1D;AAAA,MACF;AAEA,YAAM,EAAE,OAAO,EAAE,IAAI,cAAc,sBAAsB;AAEzD,YAAM,SAAS,UAAU,KAAK;AAC9B,UAAI,QAAQ,KAAK,QAAQ,EAAG;AAC5B,YAAM,cAAc,QAAQ,SAAS,QAAQ;AAC7C,wBAAkB,WAAW;AAC7B,eAAS,QAAQ,cAAc;AAAA,IACjC,GAAG,EAAE;AAAA,IACP,CAAC,eAAe,CAAC;AAAA,EACnB;AAEA,iCAAU,MAAM;AACd,QAAI,CAAC,SAAS,QAAS;AACvB,UAAM,eAAe,SAAS;AAE9B,UAAM,cAAc,MAAM;AACxB,wBAAkB,cAAc,YAAY,mBAAmB,CAAC;AAChE,mBAAa,KAAK;AAAA,IACpB;AACA,iBAAa,iBAAiB,SAAS,WAAW;AAElD,UAAM,cAAc,MAAM;AACxB,sBAAgB,EAAE,iCAAiC,GAAG,OAAO;AAC7D,mBAAa,KAAK;AAAA,IACpB;AACA,iBAAa,iBAAiB,SAAS,WAAW;AAElD,UAAM,mBAAmB,MAAM;AAC7B,wBAAkB,cAAc,WAAW;AAAA,IAC7C;AACA,iBAAa,iBAAiB,cAAc,gBAAgB;AAE5D,WAAO,MAAM;AACX,mBAAa,MAAM;AACnB,mBAAa,oBAAoB,SAAS,WAAW;AACrD,mBAAa,oBAAoB,SAAS,WAAW;AACrD,mBAAa,oBAAoB,cAAc,gBAAgB;AAAA,IACjE;AAAA,EACF,GAAG,CAAC,iBAAiB,iBAAiB,CAAC,CAAC;AAExC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,cAAc,iBAAiB;AAAA,IAC7C,UACE,SAAS,WAAW,iBACf,iBAAiB,SAAS,QAAQ,WAAY,MAC/C;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACjKA,IAAAK,uBAAoC;AACpC,IAAAC,kBAAmC;AAGnC,IAAM,WAAW,MAAM,QAAQ,KAAK,UAAU,SAAS;AAIhD,IAAM,WAAW,MAAM;AAC5B,MAAI,OAAO,cAAc,YAAa,QAAO;AAC7C,SAAO,iCAAiC,KAAK,UAAU,aAAa,EAAE;AACxE;AAKO,IAAM,YAAY,MAAM;AAC7B,MAAI,OAAO,cAAc,YAAa,QAAO;AAC7C,SAAO,UAAU,WAAW,SAAS,SAAS;AAChD;AAKO,IAAM,WAAW,MAAM;AAC5B,MAAI,OAAO,cAAc,YAAa,QAAO;AAC7C,SAAO,UAAU,WAAW,SAAS,QAAQ;AAC/C;AAEA,IAAM,UAAU,MAAM;AACpB,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,SAAS,EAAG,QAAO;AACvB,SAAO;AACT;AAEO,IAAM,gCAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AACF,MAGM;AACJ,QAAM,cAAU,yBAAQ,MAAM;AAC5B,QAAI,CAAC,OAAQ,QAAO;AAEpB,WAAO,IAAI,yCAAoB;AAAA,MAC7B;AAAA,MACA,aACE,gBACC,MAAM,OAAO,SAAS,IAAI,WAAW,SAAS,IAAI,QAAQ,CAAC,IAAI,OAAO,MAAM;AAAA,MAC/E;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,aAAa,aAAa,CAAC;AAEvC,iCAAU,MAAM;AACd,QAAI,CAAC,QAAS;AAEd,YAAQ,KAAK;AAEb,WAAO,MAAM;AACX,cAAQ,wBAAwB;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO;AACT;;;AClEA,IAAAC,kBAQO;AACP,IAAAC,gBAAiB;AACjB,IAAAC,kBAAqB;AACrB,IAAAA,kBAAqB;AAoBrB,IAAAC,uBAAgD;;;ACuDzC,IAAM,qBACX,MAAM,CAAC,OAAqB,WAAsC;AAChE,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,eAAe;AAClB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,mBAAmB;AAAA,QACnB,gBAAgB,CAAC;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,KAAK,2BAA2B;AAC9B,YAAM,EAAE,SAAS,SAAS,IAAI;AAC9B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,CAAC,GAAG,QAAQ,MAAM,QAAQ;AAAA,QACpC,gBAAgB,CAAC,GAAG,QAAQ,MAAM,cAAc;AAAA;AAAA,QAEhD,oBAAoB;AAAA,QACpB,gBAAgB,WACZ,EAAE,GAAG,QAAQ,MAAM,QAAQ,EAAE,QAAQ,KAAK,CAAC,IAC3C,MAAM;AAAA,MACZ;AAAA,IACF;AAAA,IAEA,KAAK,+BAA+B;AAClC,YAAM,EAAE,QAAQ,IAAI;AACpB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,EAAE,GAAG,QAAQ,MAAM,QAAQ;AAAA,QACpC,UAAU,CAAC,GAAG,QAAQ,MAAM,QAAQ;AAAA,QACpC,gBAAgB,CAAC,GAAG,QAAQ,MAAM,cAAc;AAAA,QAChD,MAAM,EAAE,GAAG,QAAQ,MAAM,KAAK;AAAA,QAC9B,cAAc,QAAQ,MAAM;AAAA,QAC5B,UAAU,EAAE,GAAG,QAAQ,MAAM,SAAS;AAAA,MACxC;AAAA,IACF;AAAA,IAEA,KAAK,wBAAwB;AAC3B,YAAM,EAAE,SAAS,QAAQ,IAAI;AAC7B,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,SAAS;AAAA,QACT,SAAS,EAAE,GAAG,QAAQ,MAAM,QAAQ;AAAA,QACpC,UAAU,CAAC,GAAG,QAAQ,MAAM,QAAQ;AAAA,QACpC,gBAAgB,CAAC,GAAG,QAAQ,MAAM,cAAc;AAAA,QAChD,MAAM,EAAE,GAAG,QAAQ,MAAM,KAAK;AAAA,QAC9B,cAAc,QAAQ,MAAM;AAAA,QAC5B,UAAU,EAAE,GAAG,QAAQ,MAAM,SAAS;AAAA,MACxC;AAAA,IACF;AAAA,IAEA,KAAK,uBAAuB;AAC1B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,cAAc;AAAA,QACd,sBAAsB;AAAA,QACtB,SAAS;AAAA,QACT,oBAAoB;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,KAAK,yBAAyB;AAC5B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,cAAc,OAAO,QAAQ,MAAM,kBAAkB;AAAA,QACrD,sBAAsB,OAAO;AAAA,QAC7B,UAAU,OAAO,QAAQ,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,IAEA,KAAK,2BAA2B;AAC9B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,IAEA,KAAK,oBAAoB;AACvB,YAAM,EAAE,SAAS,SAAS,IAAI;AAC9B,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,aAAa;AAAA,QACb;AAAA,QACA,oBAAoB;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,KAAK,yBAAyB;AAC5B,YAAM,EAAE,cAAc,SAAS,IAAI;AACnC,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,kBAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,0BAA0B;AAC7B,YAAM,EAAE,eAAe,eAAe,IAAI;AAC1C,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,mBAAmB;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,cAAc;AACjB,YAAM,EAAE,SAAS,QAAQ,IAAI;AAC7B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,gBAAgB,QAAQ,KACpB,EAAE,GAAG,QAAQ,MAAM,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,IAC7C,CAAC;AAAA,QACL,0BAA0B;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,KAAK,YAAY;AACf,YAAM,EAAE,MAAM,IAAI;AAClB,aAAO,EAAE,GAAG,OAAO,MAAM;AAAA,IAC3B;AAAA,IAEA,KAAK,kBAAkB;AACrB,YAAM,EAAE,YAAY,IAAI;AAExB,aAAO,EAAE,GAAG,OAAO,aAAa,oBAAoB,YAAY;AAAA,IAClE;AAAA,IAEA,KAAK,uBAAuB;AAC1B,YAAM,EAAE,iBAAiB,IAAI;AAC7B,aAAO,EAAE,GAAG,OAAO,iBAAiB;AAAA,IACtC;AAAA,IAEA,KAAK,aAAa;AAChB,YAAM,EAAE,QAAQ,IAAI;AACpB,aAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ;AAAA,IACrC;AAAA,IAEA,KAAK,aAAa;AAChB,YAAM,EAAE,QAAQ,IAAI;AACpB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ,EAAE,GAAG,QAAQ,MAAM,OAAO;AAAA,MACpC;AAAA,IACF;AAAA,IAEA,KAAK,sBAAsB;AACzB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,mBAAmB;AAAA,QACnB,0BAA0B;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,KAAK,uBAAuB;AAC1B,YAAM,EAAE,SAAS,QAAQ,IAAI;AAC7B,UAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QACE,SAAS,OAAO,MAAM,OAAO,KACzB,QAAQ,MAAM,cAAc,OAAO,IACnC,MAAM;AAAA,QACZ,gBAAgB,MAAM,QAAQ,KAC1B,EAAE,GAAG,QAAQ,MAAM,QAAQ,EAAE,MAAM,OAAO,EAAE,KAAK,CAAC,IAClD,CAAC;AAAA,MACP;AAAA,IACF;AAAA,IAEA;AACE,aAAO;AAAA,EACX;AACF;AAEK,IAAM,eAAe;AAAA,EAC1B,OAAO;AAAA,EACP,SAAS;AAAA,EACT,cAAc;AAAA,EACd,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS,CAAC;AAAA,EACV,UAAU,CAAC;AAAA,EACX,gBAAgB,CAAC;AAAA,EACjB,MAAM,CAAC;AAAA,EACP,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,gBAAgB,CAAC;AAAA,EACjB,0BAA0B;AAAA,EAC1B,QAAQ,CAAC;AAAA,EACT,cAAc;AAAA,EACd,UAAU,CAAC;AACb;;;AC/RA,IAAAC,kBAAwB;AAMjB,IAAM,+BAA+B,CAC1C,UAIG;AACH,QAAM;AAAA,IACJ;AAAA,IACA,2BAA2B,CAAC;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,CAAC;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,CAAC;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,YAAY,QAAQ;AAC1B,QAAM,WAAW,QAAQ,eAAe,QAAQ,SAAS,GAAG,QAAQ;AACpE,QAAM,gBAAgB,OAAO,KAAK,WAAW,CAAC,CAAC,EAAE;AACjD,QAAM,sBAAsB,cAAc;AAC1C,QAAM,YAAY,OAAO,OAAO,IAAI;AACpC,QAAM,kBAAkB,UAAU;AAClC,QAAM,+BAAyC,CAAC;AAChD,aAAW,EAAE,UAAU,KAAK,WAAW;AACrC,QAAI,CAAC,SAAU;AACf,iCAA6B,KAAK,WAAW,YAAY,CAAC;AAAA,EAC5D;AACA,QAAM,qBAAqB,6BAA6B,KAAK;AAC7D,QAAM,uBAAuB,gBAAgB;AAE7C,QAAM,sBAA+C,CAAC;AAEtD,2BAAyB,QAAQ,CAAC,eAAe;AAC/C,wBAAoB,UAAU,IAAI;AAAA,EACpC,CAAC;AAID,QAAM,sBAAsB,6BACxB,WACA,SACG;AAAA,IACC,CAAC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MACE,GAAG,IAAI,GAAG,UAAU,GAClB,mBAAmB,iBAAiB,IAAI,CAAC,EAAE,MAAAC,MAAK,MAAMA,KAAI,EAAE,KAAK,IAAI,EACvE,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAC9B,eAAe,cAAc,UAAU,KAAK,OAAO,UAAU,KACzD,WAAW,YAAY,IACvB,cAAc,EACpB,GAAG,MAAM,UAAU;AAAA,EACvB,EACC,KAAK;AAEZ,QAAM,4BAA4B,eAC/B;AAAA,IACC,CAAC,EAAE,YAAY,kBAAkB,QAAQ,QAAQ,YAAY,KAAK,MAChE,GAAG,UAAU,GACX,mBAAmB,iBAAiB,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,EAAE,KAAK,IAAI,EACvE,GAAG,MAAM,GAAG,MAAM,GAChB,eAAe,cAAc,UAAU,KAAK,OAAO,UAAU,KACzD,WAAW,YAAY,IACvB,cAAc,EACpB,GAAG,MAAM,UAAU;AAAA,EACvB,EACC,KAAK;AAER,QAAM,0BAAgD;AAAA,IACpD,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,IAEA;AAAA,MACE,QAAQ,MAAM;AAAA;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACpKA,IAAAC,kBAAwB;AAIjB,IAAM,yBAAyB,CAAC,UAA8B;AACnE,QAAM,EAAE,OAAO,IAAI;AAEnB,QAAM,cAAc,OAAO,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK;AAEnD,QAAM,oBAAoC;AAAA,IACxC,OAAO;AAAA,MACL;AAAA,IACF;AAAA;AAAA,IAEA,CAAC,WAAW;AAAA,EACd;AAEA,SAAO;AACT;;;ACHO,IAAM,wBAAwB,CAAC,2BAA2C;AAC/E,QAAM,EAAE,SAAS,OAAO,IAAI,eAAe,uBAAuB;AAElE,SAAO,CACL,gBACA,YACG;AACH,QAAI,0BAA0B,SAAS;AACrC,aAAO,QAAQ;AAAA,QACb,uBAAuB,QAAQ,KAAK,gBAAgB,OAAO;AAAA,MAC7D;AAAA,IACF;AACA,WAAO,OAAO,cAAc,gBAAgB,QAAW,OAAO;AAAA,EAChE;AACF;;;AC7BA,IAAAC,kBAAkC;AAE3B,IAAM,eAAe,MAAM;AAChC,QAAM,gBAAY,wBAAO,KAAK;AAE9B,iCAAU,MAAM;AACd,cAAU,UAAU;AACpB,WAAO,MAAM;AACX,gBAAU,UAAU;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AACT;;;ACZA,IAAAC,kBAA4B;AAQrB,IAAM,sBAAsB,CACjC,iBACA,wBAEA;AAAA,EACE,CAAC,OAAiC,oBAAoC;AACpE,QACG,CAAC,mBAAmB,CAAC,mBACtB,EAAE,MAAM,kBAAkB,cAC1B;AACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM;AACrB,UAAM,cAAc,OAAO,UAAU,QAAQ,KAAK,EAAE;AAEpD,QAAI,YAAY,CAAC,MAAM,KAAK;AAC1B,YAAM,WAAW,YAAY,QAAQ,KAAK,EAAE;AAC5C,YAAM,OAAO,iBAAiB;AAAA,QAC5B,CAAC,EAAE,IAAI,MAAAC,MAAK,MAAMA,UAAS,YAAY,OAAO;AAAA,MAChD;AAEA,UACE,mBACA,OAAO,oBAAoB,cAC3B,MAAM,SAAS,aACf;AACA,wBAAgB,OAAO,IAAI;AAAA,MAC7B;AAEA,UACE,mBACA,MAAM,SAAS,WACf,OAAO,oBAAoB,YAC3B;AACA,wBAAgB,OAAO,IAAI;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EACA,CAAC,iBAAiB,eAAe;AACnC;;;AC9CK,IAAM,mCAAmC,MAAM;AACpD,QAAM,EAAE,4BAA4B,IAAI,eAAe,SAAS;AAChE,SAAO,+BAA+B,UAAU,UAAU,MAAM,KAAK,IACjE,4BACA;AACN;AAEO,IAAM,wBAAwB,CAAC,gBACpC,eAAe;AAEV,IAAM,6BAA6B,CAAC;AAAA,EACzC;AACF,MAA+C;AAC7C,QAAM,oBAAoB,iCAAiC;AAC3D,SAAO;AAAA,IACL,cAAc,eAAe,WAAW;AAAA,IACxC,WAAW,eAAe,QAAQ;AAAA,IAClC,oBAAoB,sBAAsB,eAAe,aAAa;AAAA,IACtE;AAAA,EACF;AACF;;;ACvBA,IAAAC,iBAAuB;AAKhB,IAAM,uBACX,CACE,kBACA,yBAEF,CAACC,OAAc,SAA8B;AAC3C,MAAI,OAAOA,UAAS,YAAa,SAAS,aAAa,SAAS,SAAU;AACxE;AAAA,EACF;AAEA,QAAM,SAAK,uBAAO;AAElB,mBAAiB,CAAC,sBAAsB,CAAC,GAAG,mBAAmB,EAAE,IAAI,MAAAA,OAAM,KAAK,CAAC,CAAC;AAElF,QAAM,UAAU;AAAA,IACd,MACE;AAAA,MAAiB,CAAC,sBAChB,kBAAkB,OAAO,CAAC,iBAAiB,aAAa,OAAO,EAAE;AAAA,IACnE;AAAA,IACF;AAAA,EACF;AAEA,uBAAqB,KAAK,OAAO;AACnC;AAOK,IAAM,mBAAmB,CAC9B,UACA,WACG;AACH,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,UAAM,OAAO,OAAO,CAAC;AACrB,QAAI,KAAK,OAAO,UAAU;AACxB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO;AAAA,EACT;AACF;AAQO,IAAM,qBAAqB,CAChC,YACA,QACA,QAAQ,UACL;AACH,QAAM,kBAAkB,WAAW,QAAQ;AAC3C,MAAI,OAAO;AACX,MAAI,SAAS;AACb,MAAI,QAAQ,OAAO,SAAS;AAC5B,SAAO,QAAQ,OAAO;AACpB,aAAS,KAAK,OAAO,QAAQ,QAAQ,CAAC;AACtC,UAAM,kBAAkB,IAAI;AAAA,MAC1B,OAAO,MAAM,EAAE;AAAA,IACjB,EAAE,QAAQ;AACV,UAAM,sBACJ,OAAO,SAAS,CAAC,GAAG,cACpB,IAAI,KAAK,OAAO,SAAS,CAAC,EAAE,UAA2B,EAAE,QAAQ;AACnE,UAAM,uBACJ,OAAO,SAAS,CAAC,GAAG,cACpB,IAAI,KAAK,OAAO,SAAS,CAAC,EAAE,UAA2B,EAAE,QAAQ;AACnE,QACE,oBAAoB,mBACnB,uBACC,wBACA,sBAAsB,mBACtB,kBAAkB,sBACpB;AACA,aAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,MAAM,EAAE;AAAA,IACjD;AACA,QAAI,kBAAkB,gBAAiB,QAAO,SAAS;AAAA,QAClD,SAAQ,SAAS;AAAA,EACxB;AAEA,MACE,CAAC,SACD,IAAI,KAAK,OAAO,IAAI,EAAE,UAA2B,EAAE,QAAQ,MAAM,iBACjE;AACA,WAAO,EAAE,OAAO,MAAM,QAAQ,OAAO,IAAI,EAAE;AAAA,EAC7C;AACA,SAAO,EAAE,OAAO,GAAG;AACrB;;;AClGA,IAAAC,WAAyB;AAElB,IAAM,kCAAkC,CAC7C,YACAC,aACG;AACH,MAAI,SAAS;AAEb,QAAM,YAAY,WAAW,aAAa,WAAW,aAAa;AAElE,MAAY,cAAK,WAAW,KAAK,GAAG;AAClC,UAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,UAAM,mBAAmB,sBAAsB,KAAKA,QAAO;AAE3D,QAAI,kBAAkB;AAEpB,uBAAiB,UAAU;AAC3B,uBAAiB,SAAS;AAC1B,6BAAuB,kBAAkB,GAAG;AAAA,IAC9C;AACA,aAAS,IAAI;AAAA,EACf;AAEA,SAAO;AAAA,IACL,KAAK,UAAU;AAAA,EACjB;AACF;AAEO,IAAM,kCAAkC,CAC7C,YACAA,UACA,iCACG;AACH,MAAI,WAAW;AACf,MACE,WAAW,aACX,gCACQ,cAAK,WAAW,WAAW,KAAK,GACxC;AACA,UAAM,MAAM,IAAI,IAAI,WAAW,SAAS;AACxC,UAAM,mBAAmB,sBAAsB,KAAKA,QAAO;AAE3D,QAAI,kBAAkB;AAEpB,uBAAiB,UAAU;AAC3B,uBAAiB,SAAS;AAC1B,6BAAuB,kBAAkB,GAAG;AAAA,IAC9C;AACA,eAAW,IAAI;AAAA,EACjB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,KAAK,WAAW,aAAa;AAAA,EAC/B;AACF;AAEA,IAAM,wBAAwB,CAAC,KAAU,gBAA6B;AACpE,QAAM,YAAY,IAAI;AACtB,QAAM,iBAAiB,OAAO,UAAU,IAAI,IAAI,CAAC,KAAK;AACtD,QAAM,gBAAgB,OAAO,UAAU,IAAI,IAAI,CAAC,KAAK;AACrD,QAAM,qBAAqB,uBAAuB,WAAW;AAC7D,MAAI;AAEJ,OACG,mBAAmB,aAAa,mBAAmB,WACpD,mBAAmB,UACnB;AACA,uBAAmB;AAAA,MACjB;AAAA,MACA;AAAA;AAAA,MAEA,mBAAmB,aAAa,mBAAmB;AAAA,MACnD,mBAAmB;AAAA,IACrB;AAAA,EACF,OAAO;AACL,uBAAmB;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,IAAM,sBAAsB,CAC1B,gBACA,eACA,WACA,cACI;AAAA,EACJ,QAAQ,KAAK,MAAM,KAAK,IAAI,WAAY,WAAW,gBAAiB,cAAc,CAAC;AAAA,EACnF,OAAO,KAAK,MAAM,KAAK,IAAI,WAAY,WAAW,iBAAkB,aAAa,CAAC;AACpF;AAEA,IAAM,yBAAyB,CAAC,gBAA6B;AAC3D,QAAM,qBAAqB,iBAAiB,WAAW;AACvD,QAAM,SAAS;AAAA,IACb,mBAAmB,iBAAiB,QAAQ;AAAA,EAC9C;AACA,QAAM,YAAY;AAAA,IAChB,mBAAmB,iBAAiB,YAAY;AAAA,EAClD;AACA,QAAM,WAAW;AAAA,IACf,mBAAmB,iBAAiB,WAAW;AAAA,EACjD;AAEA,MAAI,GAAG,UAAU,cAAc,WAAW;AACxC,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,WAAW,SAAS;AACvC;AAEA,IAAM,sCAAsC,CAAC,aAAqB;AAChE,MAAI,CAAC,SAAS,SAAS,IAAI,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,QAAMC,UAAS,WAAW,QAAQ;AAClC,SAAO,MAAMA,OAAM,IAAI,SAAYA;AACrC;AAEA,IAAM,yBAAyB,CAC7B,kBACA,QACG;AACH,MAAI,aAAa,IAAI,KAAK,iBAAiB,OAAO,SAAS,CAAC;AAC5D,MAAI,aAAa,IAAI,KAAK,iBAAiB,MAAM,SAAS,CAAC;AAC7D;;;AC5HA,IAAMC,iCAAgC,CAAC,eAA8C;AAAA,EACnF,gBAAgB,UAAU;AAC5B;AAEO,IAAM,0BAA0B,MAAM;AAC3C,QAAM,EAAE,iBAAiB,IAAI,eAAe,SAAS;AACrD,QAAM,EAAE,eAAe,IAAI;AAAA,IACzB,iBAAiB;AAAA,IACjBA;AAAA,EACF;AAEA,SAAO;AACT;;;AVqNA,IAAM,mBAAmB,CAAC;AAAA,EACxB;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACL,MAAgD;AAC9C,QAAM,EAAE,eAAe,MAAM,IAAI,eAAe,SAAS;AACzD,QAAM,EAAE,cAAc,UAAU,IAAI,2BAA2B;AAAA,IAC7D;AAAA,EACF,CAAC;AACD,QAAM,gBAAY,cAAAC,SAAK,WAAW,OAAO,cAAc,mBAAmB;AAC1E,SACE,gCAAAC,QAAA,cAAC,SAAI,IAAI,sBAAuB,GAAG,OAAO,aACvC,QACH;AAEJ;AAEA,IAAM,oBAAoB,CAAC,UAA2C;AACpE,QAAM;AAAA,IACJ,SAAS;AAAA,IACT,kBAAAC,oBAAmB;AAAA,IACnB,uBAAAC;AAAA,IACA,kBAAAC,oBAAmB;AAAA,EACrB,IAAI;AAEJ,QAAM,EAAE,SAAS,gBAAgB,mBAAmB,IAAI,eAAe,SAAS;AAEhF,QAAM,UAAU,gBAAgB;AAEhC,MAAI,mBAAmB,oBAAoB,YAAYA,mBAAkB;AACvE,WACE,gCAAAH,QAAA,cAAC,wBACC,gCAAAA,QAAA,cAACG,mBAAA,IAAiB,CACpB;AAAA,EAEJ;AAEA,MAAI,mBAAmB,SAASD,wBAAuB;AACrD,WACE,gCAAAF,QAAA,cAAC,wBACC,gCAAAA,QAAA,cAACE,wBAAA,EAAsB,OAAO,mBAAmB,OAAO,CAC1D;AAAA,EAEJ;AAEA,MAAI,CAAC,SAAS,KAAK;AACjB,WAAO,gCAAAF,QAAA,cAAC,wBAAkBC,iBAAiB;AAAA,EAC7C;AAEA,SAAO,gCAAAD,QAAA,cAAC,gBAAc,GAAG,OAAO,SAAkB,KAAK,QAAQ,KAAK;AACtE;AAEA,IAAM,eAAe,CACnB,UAMG;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB,uBAAAE,yBAAwB;AAAA,IACxB,kBAAAC,oBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,QAAQ,eAAe,8BAA8B,OAAO,iBAAiB,IACnF,eAAe,SAAS;AAC1B,QAAM,EAAE,EAAE,IAAI,sBAAsB,SAAS;AAC7C,QAAM,qBAAqB,sBAAsB,eAAe,aAAa;AAC7E,QAAM,oBAAoB,iCAAiC;AAC3D,QAAM,SAAS,iBAAiB;AAEhC,QAAM,CAAC,eAAe,gBAAgB,QAAI,0BAAS,QAAQ,UAAU,CAAC;AACtE,QAAM,CAAC,eAAe,gBAAgB,QAAI,0BAA+B,CAAC,CAAC;AAC3E,QAAM,2BAAuB,wBAA8B,CAAC,CAAC;AAE7D,QAAM,CAAC,sBAAsB,wBAAwB,QACnD,0BAA+B;AAEjC,QAAM,qBAAiB,yBAAQ,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE7D,QAAM,CAAC,OAAO,QAAQ,QAAI;AAAA,IACxB;AAAA;AAAA;AAAA,IAGA;AAAA,MACE,GAAG;AAAA,MACH,SAAS,QAAQ,MAAM,kBAAkB;AAAA,MACzC,SAAS,CAAC,QAAQ;AAAA,MAClB,UAAU,QAAQ,MAAM;AAAA,IAC1B;AAAA,EACF;AACA,QAAM,0BAA0B,wBAAwB;AACxD,QAAM,YAAY,aAAa;AAE/B,QAAM,oBAAgB,wBAAO,EAAE;AAC/B,QAAM,eAAW,wBAAyB,MAAS;AACnD,QAAM,aAAS,wBAAO,IAAI;AAE1B,QAAM,uCAAmC;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,2BAA2B,QAAQ,MAAM;AAE/C,QAAM,oCAAgC,gBAAAC;AAAA,IACpC,MAAM,SAAS,EAAE,SAAS,MAAM,8BAA8B,CAAC;AAAA,IAC/D;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,8BAA0B;AAAA,IAC9B,UACE,gBAAAA,SAAS,0BAA0B,KAAK;AAAA,MACtC,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,QAAM,eAAW;AAAA,IACf,UACE,gBAAAA;AAAA,MACE,OAAO,YAAqC;AAC1C,cAAM,EAAE,6BAA6B,KAAK,IAAI,WAAW,CAAC;AAC1D,YAAI,QAAQ,gBAAgB,CAAC,eAAe,aAAa;AACvD;AAAA,QACF;AAEA,iBAAS,UAAU,oBAAI,KAAK;AAE5B,YAAI;AACF,cAAI,mBAAmB;AACrB;AAAA,cACE;AAAA,cACA,6BAA6B,0BAA0B;AAAA,YACzD;AAAA,UACF,OAAO;AACL,kBAAM,mBAAmB,MAAM,QAAQ,SAAS;AAGhD,gBAAI,8BAA8B,kBAAkB,OAAO;AACzD,uCAAyB;AAAA,gBACvB,WAAW,SAAS;AAAA,gBACpB,sBAAsB,iBAAiB,MAAM;AAAA,gBAC7C,iBAAiB;AAAA,cACnB,CAAC;AAAA,YACH;AAAA,UACF;AAEA,cAAI,qBAAqB;AACvB,gCAAoB,GAAG,cAAc,OAAO;AAAA,UAC9C,WAAW,cAAc,SAAS;AAChC,qBAAS,QAAQ,cAAc;AAAA,UACjC;AAAA,QACF,SAAS,GAAG;AACV,kBAAQ,MAAM,EAAE,gCAAgC,CAAC;AAAA,QACnD;AAAA,MACF;AAAA,MACA;AAAA,MACA,EAAE,SAAS,MAAM,UAAU,MAAM;AAAA,IACnC;AAAA,IACF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,UAAiB;AAC1C,QAAI,MAAM,SAAS;AACjB,eAAS;AAAA,QACP;AAAA,QACA,SAAS,MAAM;AAAA,QACf,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAIA,QAAI,MAAM,SAAS,2BAA2B,MAAM,OAAO,MAAM,QAAQ,QAAQ;AAC/E;AAEF,QAAI,MAAM,SAAS,yBAAyB,MAAM,SAAS;AACzD;AAEF,QAAI,MAAM,SAAS,kBAAkB,MAAM,SAAS,eAAe;AACjE,aAAO,SAAS,EAAE,SAAS,MAAM,YAAY,CAAC;AAAA,IAChD;AAEA,QAAI,MAAM,SAAS,wBAAwB,OAAO,MAAM,WAAW,WAAW;AAC5E,aAAO,UAAU,MAAM;AAAA,IACzB;AAEA,QAAI,MAAM,SAAS,eAAe;AAChC,YAAM,qBACJ,CAAC,MAAM,SAAS,aAAa,MAAM,SAAS;AAE9C,UAAI,oBAAoB;AACtB,YACE,SAAS,UACT,eAAe,eACf,CAAC,QAAQ,WAAW,EAAE,OACtB;AACA,gBAAM,SAAS,QAAQ,YAAY,SAAS,OAAO;AAEnD,cAAI,qBAAqB;AACvB,gCAAoB,QAAQ,cAAc,OAAO;AAAA,UACnD,OAAO;AACL,qBAAS,QAAQ,IAAI,MAAM,KAAK,cAAc,OAAO;AAAA,UACvD;AAAA,QACF;AAAA,MACF;AAEA,UACE,MAAM,SAAS,MAAM,OAAO,OAAO,UACnC,OAAO,SAAS,cAChB,OAAO,SAAS,KAChB;AACA,cAAM,cAAc,IAAI,KAAK,MAAM,QAAQ,UAAU;AACrD,cAAM,MAAM,MAAM,QAAQ;AAE1B,YACE,CAAC,6BAA6B,GAAG,KACjC,6BAA6B,GAAG,EAAE,QAAQ,IAAI,YAAY,QAAQ,GAClE;AACA,uCAA6B,GAAG,IAAI;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,gBAAgB;AACjC,YAAM,WAAW,QAAQ,OAAO,WAAW,CAAC,GAAG;AAM/C,YAAM,QAAQ,MAAM;AAAA,QAClB,UAAU,EAAE,OAAO,UAAU,OAAO,+BAA+B;AAAA,QACnE,UAAU,EAAE,OAAO,+BAA+B;AAAA,MACpD,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,SAAS;AACjB,+BAAyB,CAAC,SAAS;AACjC,YAAI,EAAE,MAAM,gBAAgB,MAAM,MAAO,QAAO;AAChD,eAAO;AAAA,UACL,yBAAyB,MAAM;AAAA,UAC/B,WAAW,IAAI,KAAK,MAAM,YAAY;AAAA,UACtC,sBAAsB,MAAM;AAAA,UAC5B,iBAAiB,MAAM,mBAAmB;AAAA,QAC5C;AAAA,MACF,CAAC;AAEH,QAAI,MAAM,SAAS,uBAAuB,MAAM,QAAQ,QAAQ,KAAK;AACnE,+BAAyB,MAAS;AAAA,IACpC;AAEA,kCAA8B;AAAA,EAChC;AAGA,uCAAgB,MAAM;AACpB,QAAI,UAAU;AACd,QAAI,OAAO;AAEX,KAAC,YAAY;AACX,UAAI,CAAC,QAAQ,eAAe,mBAAmB;AAC7C,YAAI;AAIF,gBAAM,UAAoB,CAAC;AAC3B,cAAI,CAAC,QAAQ,MAAM,QAAQ,MAAM,SAAS;AACxC,uBAAW,UAAU,QAAQ,KAAK,SAAS;AACzC,kBAAI;AACJ,kBAAI,OAAO,WAAW,UAAU;AAC9B,yBAAS;AAAA,cACX,WAAW,OAAO,WAAW,UAAU;AACrC,sBAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,yBAAS,WAAW,MAAM;AAAA,cAC5B;AACA,kBAAI,QAAQ;AACV,wBAAQ,KAAK,MAAM;AAAA,cACrB;AAAA,YACF;AAAA,UACF;AACA,gBAAM,WAAW,EAAE,SAAS,QAAQ,SAAS,SAAS,oBAAoB,CAAC;AAC3E,gBAAM,SAAS,QAAQ,UAAU;AACjC,2BAAiB,MAAM;AAAA,QACzB,SAAS,GAAG;AACV,mBAAS,EAAE,OAAO,GAAY,MAAM,WAAW,CAAC;AAChD,oBAAU;AAAA,QACZ;AAAA,MACF;AAEA,aAAO;AACP,oBAAc,UAAU,SAAS;AAEjC,UAAI,CAAC,SAAS;AACZ,iBAAS;AAAA,UACP;AAAA,UACA,SAAS,QAAQ,MAAM,kBAAkB;AAAA,UACzC,MAAM;AAAA,QACR,CAAC;AAED,YAAI,OAAO,MAAM,MAAM,QAAQ,MAAM,KAAK,OAAO,KAAK,EAAE,GAAG;AAEzD,gBAAM,EAAE,MAAM,GAAG,aAAa,IAAI,QAAQ,MAAM,KAAK,OAAO,KAAK,EAAE;AACnE,mCAAyB,YAAY;AAAA,QACvC;AAQA,YAAI,QAAQ,YAAY,IAAI,KAAK;AAC/B,mBAAS,EAAE,4BAA4B,MAAM,CAAC;AAEhD,eAAO,GAAG,sBAAsB,WAAW;AAC3C,eAAO,GAAG,wBAAwB,WAAW;AAC7C,eAAO,GAAG,gBAAgB,WAAW;AACrC,eAAO,GAAG,gBAAgB,WAAW;AACrC,eAAO,GAAG,yBAAyB,WAAW;AAC9C,gBAAQ,GAAG,WAAW;AAAA,MACxB;AAAA,IACF,GAAG;AACH,UAAM,0BAA0B,qBAAqB;AAErD,WAAO,MAAM;AACX,UAAI,WAAW,CAAC,KAAM;AACtB,eAAS,IAAI,WAAW;AACxB,aAAO,IAAI,sBAAsB,WAAW;AAC5C,aAAO,IAAI,wBAAwB,WAAW;AAC9C,aAAO,IAAI,gBAAgB,WAAW;AACtC,8BAAwB,QAAQ,YAAY;AAAA,IAC9C;AAAA,EAEF,GAAG;AAAA,IACD,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,EACF,CAAC;AAED,iCAAU,MAAM;AACd,QAAI,CAAC,MAAM,OAAQ;AAEnB,UAAM,UAAU,MAAM,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,QAAQ,EAAE;AAErE,QAAI,QAAS,UAAS,EAAE,SAAS,MAAM,YAAY,CAAC;AAAA,EACtD,GAAG,CAAC,MAAM,UAAU,MAAM,MAAM,CAAC;AAEjC,QAAM,qCAAiC;AAAA,IACrC,CAAC;AAAA,MACC;AAAA,MACA;AAAA,IACF,MAGM;AACJ,eAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AACD,UAAI,iCAAiC,SAAS;AAC5C,qBAAa,iCAAiC,OAAO;AAAA,MACvD;AACA,uCAAiC,UAAU,WAAW,MAAM;AAC1D,YAAI,iBAAiB,eAAe,eAAe,EAAE,gBAAgB;AACnE,2BAAiB,eAAe,YAAY,EAAE,gBAAgB,OAAU,CAAC;AAAA,QAC3E;AACA,yCAAiC,UAAU;AAC3C,iBAAS,EAAE,MAAM,0BAA0B,CAAC;AAAA,MAC9C,GAAG,qBAAqB,0BAA0B;AAAA,IACpD;AAAA,IACA,CAAC,SAAS,gBAAgB;AAAA,EAC5B;AAEA,iCAAU,MAAM;AACd,QAAI,CAAC,yBAAyB,GAAI;AAClC,mCAA+B,EAAE,sBAAsB,wBAAwB,GAAG,CAAC;AAAA,EACrF,GAAG,CAAC,yBAAyB,8BAA8B,CAAC;AAK5D,QAAM,sBAAkB;AAAA,IACtB,MAAM,qBAAqB,kBAAkB,qBAAqB,OAAO;AAAA,IACzE,CAAC;AAAA,EACH;AAGA,QAAM,uBAAmB;AAAA,QACvB,gBAAAC;AAAA,MACE,CAAC,SAAkB,aAAuC;AACxD,YAAI,CAAC,UAAU,QAAS;AACxB,iBAAS,EAAE,SAAS,UAAU,MAAM,mBAAmB,CAAC;AAAA,MAC1D;AAAA,MACA;AAAA,MACA,EAAE,SAAS,MAAM,UAAU,KAAK;AAAA,IAClC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,OAAO,QAAQ,mCAAmC;AACjE,QACE,CAAC,OAAO,WACR,CAAC,OAAO,UAAU,UAClB,CAAC,QAAQ,MAAM,kBAAkB;AAEjC,aAAO;AAGT,UAAM,gBAAgB,OAAO,WAAW,CAAC;AAEzC,QACE,MAAM,eACN,MAAM,oBACN,eAAe,WAAW,YAC1B;AACA,aAAO;AAAA,IACT;AAEA,aAAS,EAAE,aAAa,MAAM,MAAM,iBAAiB,CAAC;AAEtD,UAAM,WAAW,eAAe;AAChC,UAAM,UAAU;AAChB,QAAI;AAEJ,QAAI;AACF,sBAAgB,MAAM,QAAQ,MAAM;AAAA,QAClC,UAAU,EAAE,OAAO,UAAU,OAAO,QAAQ;AAAA,QAC5C,UAAU,EAAE,OAAO,QAAQ;AAAA,MAC7B,CAAC;AAAA,IACH,SAAS,GAAG;AACV,cAAQ,KAAK,gDAAgD,CAAC;AAC9D,eAAS,EAAE,aAAa,OAAO,MAAM,iBAAiB,CAAC;AACvD,aAAO;AAAA,IACT;AAEA,qBAAiB,QAAQ,MAAM,kBAAkB,SAAS,QAAQ,MAAM,QAAQ;AAEhF,WAAO,cAAc,SAAS;AAAA,EAChC;AAEA,QAAM,gBAAgB,OAAO,QAAQ,mCAAmC;AACtE,QACE,CAAC,OAAO,WACR,CAAC,OAAO,UAAU,UAClB,CAAC,QAAQ,MAAM,kBAAkB;AAEjC,aAAO;AAET,UAAM,gBAAgB,OAAO,WAAW,OAAO,UAAU,SAAS,CAAC;AACnE,QAAI,MAAM,eAAe,MAAM,iBAAkB,QAAO;AAExD,aAAS,EAAE,kBAAkB,MAAM,MAAM,sBAAsB,CAAC;AAEhE,UAAM,WAAW,eAAe;AAChC,UAAM,UAAU;AAChB,QAAI;AAEJ,QAAI;AACF,sBAAgB,MAAM,QAAQ,MAAM;AAAA,QAClC,UAAU,EAAE,OAAO,UAAU,OAAO,QAAQ;AAAA,QAC5C,UAAU,EAAE,OAAO,QAAQ;AAAA,MAC7B,CAAC;AAAA,IACH,SAAS,GAAG;AACV,cAAQ,KAAK,gDAAgD,CAAC;AAC9D,eAAS,EAAE,kBAAkB,OAAO,MAAM,sBAAsB,CAAC;AACjE,aAAO;AAAA,IACT;AAEA,aAAS;AAAA,MACP,cAAc,QAAQ,MAAM,kBAAkB;AAAA,MAC9C,UAAU,QAAQ,MAAM;AAAA,MACxB,MAAM;AAAA,IACR,CAAC;AACD,WAAO,cAAc,SAAS;AAAA,EAChC;AAEA,QAAM,oBAA4D;AAAA,IAChE,OACE,WACA,eAAe,2BACf,oBAAoB,+BACjB;AACH,eAAS,EAAE,aAAa,MAAM,MAAM,iBAAiB,CAAC;AACtD,YAAM,QAAQ,MAAM,qBAAqB,WAAW,QAAW,YAAY;AAE3E,uBAAiB,QAAQ,MAAM,kBAAkB,SAAS,QAAQ,MAAM,QAAQ;AAChF,qCAA+B;AAAA,QAC7B;AAAA,QACA,sBAAsB;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,IACA,CAAC,SAAS,gCAAgC,gBAAgB;AAAA,EAC5D;AAEA,QAAM,0BACJ,6BAAY,YAAY;AACtB,UAAM,QAAQ,MAAM,qBAAqB,QAAQ;AACjD,qBAAiB,QAAQ,MAAM,kBAAkB,SAAS,QAAQ,MAAM,QAAQ;AAChF,aAAS;AAAA,MACP,MAAM;AAAA,IACR,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,gBAAgB,CAAC;AAEhC,QAAM,+BACJ;AAAA,IACE,OACE,oBAAoB,2BACpB,oBAAoB,+BACjB;AACH,UAAI,CAAC,sBAAsB,gBAAiB;AAC5C,UAAI,oBAAoB,sBAAsB;AAC9C,UAAI,uBAAuB,sBAAsB;AACjD,UAAI,wBAAwB;AAE5B,UAAI,sBAAsB;AACxB,cAAM,SAAS,iBAAiB,sBAAsB,QAAQ,MAAM,QAAQ;AAC5E,gCAAwB,OAAO,UAAU;AAAA,MAC3C,WAAW,mBAAmB;AAC5B,cAAM,SAAS,iBAAiB,mBAAmB,QAAQ,MAAM,QAAQ;AACzE,gCAAwB,CAAC,CAAC,OAAO;AACjC,+BACE,OAAO,QAAQ,KAAK,QAAQ,MAAM,SAAS,OAAO,QAAQ,CAAC,GAAG,KAAK;AAAA,MACvE,OAAO;AACL,cAAM,oBAAoB,qBAAqB,UAAU,QAAQ;AACjE,cAAM,EAAE,OAAO,sBAAsB,QAAQ,gBAAgB,IAC3D;AAAA,UACE,qBAAqB;AAAA,UACrB,QAAQ,MAAM;AAAA,UACd;AAAA,QACF;AAEF,YAAI,iBAAiB;AACnB,iCAAuB,QAAQ,MAAM,SAAS,uBAAuB,CAAC,GAAG;AACzE,kCAAwB,CAAC,CAAC;AAC1B,8BAAoB,gBAAgB;AAAA,QACtC,OAAO;AACL,mBAAS,EAAE,aAAa,MAAM,MAAM,iBAAiB,CAAC;AACtD,cAAI;AACJ,cAAI;AACF,wBACE,MAAM,QAAQ;AAAA,cACZ;AAAA,gBACE,UAAU;AAAA,kBACR,mBAAmB,qBAAqB,UAAU,YAAY;AAAA,kBAC9D,OAAO;AAAA,gBACT;AAAA,cACF;AAAA,cACA;AAAA,YACF,GACA;AAAA,UACJ,SAAS,GAAG;AACV,4BAAgB,EAAE,4CAA4C,GAAG,OAAO;AACxE;AAAA,cACE,QAAQ,MAAM,kBAAkB;AAAA,cAChC,QAAQ,MAAM;AAAA,YAChB;AACA;AAAA,UACF;AAEA,gBAAM,+BAA+B,SAAS,KAAK,CAAC,QAAQ,IAAI,UAAU;AAC1E,cAAI,CAAC,8BAA8B;AACjC,4BAAgB,EAAE,4CAA4C,GAAG,OAAO;AACxE;AAAA,cACE,QAAQ,MAAM,kBAAkB;AAAA,cAChC,QAAQ,MAAM;AAAA,YAChB;AACA;AAAA,UACF;AACA,gBAAM,wBAAwB,IAAI;AAAA,YAChC,6BAA6B;AAAA,UAC/B,EAAE,QAAQ;AACV,cAAI,oBAAoB,uBAAuB;AAE7C,mCAAuB,6BAA6B;AAAA,UACtD,OAAO;AACL,kBAAM,SAAS,mBAAmB,qBAAqB,WAAW,QAAQ;AAC1E,gCAAoB,OAAO,QAAQ;AAAA,UACrC;AACA;AAAA,YACE,QAAQ,MAAM,kBAAkB;AAAA,YAChC,QAAQ,MAAM;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,wBAAwB,CAAC,mBAAmB;AAC/C,wBAAgB,EAAE,4CAA4C,GAAG,OAAO;AACxE;AAAA,MACF;AAEA,UAAI,CAAC,uBAAuB;AAC1B,iBAAS,EAAE,aAAa,MAAM,MAAM,iBAAiB,CAAC;AACtD,YAAI;AACF,gBAAM,WAAY,wBAAwB;AAC1C,gBAAM,QAAQ,MAAM;AAAA,YAClB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAKA,gBAAM,gBAAgB,QAAQ,MAAM,SAAS;AAAA,YAC3C,CAAC,YAAY,QAAQ,OAAO;AAAA,UAC9B;AACA;AAAA,YACE,QAAQ,MAAM,kBAAkB;AAAA,YAChC,QAAQ,MAAM;AAAA,UAChB;AACA,iCACE,wBAAwB,QAAQ,MAAM,SAAS,gBAAgB,CAAC,GAAG;AAAA,QACvE,SAAS,GAAG;AACV,0BAAgB,EAAE,4CAA4C,GAAG,OAAO;AACxE;AAAA,YACE,QAAQ,MAAM,kBAAkB;AAAA,YAChC,QAAQ,MAAM;AAAA,UAChB;AACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,sBAAsB;AACzB,wBAAgB,EAAE,4CAA4C,GAAG,OAAO;AACxE;AAAA,MACF;AACA,UAAI,CAAC,qBAAqB;AACxB,iCAAyB;AAAA,UACvB,GAAG;AAAA,UACH,yBAAyB;AAAA,UACzB,sBAAsB;AAAA,QACxB,CAAC;AACH,qCAA+B;AAAA,QAC7B;AAAA,QACA,sBAAsB;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEF,QAAM,oBAAgB;AAAA,IACpB,OACE,SACA,YAC6B;AAC7B,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,+CAA+C;AAAA,MACjE;AACA,UAAI;AACJ,UAAI,wBAAwB;AAC1B,yBAAiB,MAAM,uBAAuB,SAAS,OAAO;AAAA,MAChE,OAAO;AACL,cAAM,SAAS,MAAM,OAAO,cAAc,QAAQ,IAAI,OAAO;AAC7D,yBAAiB,OAAO;AAAA,MAC1B;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,QAAQ,sBAAsB;AAAA,EACjC;AAEA,QAAM,gBAAgB,CAAC,mBAAmD;AAExE,YAAQ,MAAM,iBAAiB,gBAAgB,IAAI;AAEnD,aAAS;AAAA,MACP;AAAA,MACA,UAAU,MAAM,UAAU,eAAe;AAAA,MACzC,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,OAAO;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAIM;AACJ,QAAI;AACF,UAAI;AAEJ,UAAI,sBAAsB;AACxB,0BAAkB,MAAM,qBAAqB,SAAS,SAAS,OAAO;AAAA,MACxE,OAAO;AACL,0BAAkB,MAAM,QAAQ,YAAY,SAAS,OAAO;AAAA,MAC9D;AAEA,UAAI,kBAA4C;AAChD,eAAS,IAAI,QAAQ,MAAM,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3D,cAAM,MAAM,QAAQ,MAAM,SAAS,CAAC;AACpC,YAAI,IAAI,MAAM,IAAI,OAAO,QAAQ,IAAI;AACnC,4BAAkB;AAClB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,oBAAoB,IAAI;AAAA,QAC5B,iBAAiB,SAAS,cAAc;AAAA,MAC1C,EAAE,QAAQ;AACV,YAAM,2BAA2B,iBAAiB,YAAY,QAAQ,KAAK;AAC3E,YAAM,sBAAsB,oBAAoB;AAKhD,UACE,iBAAiB,YAChB,uBAAuB,iBAAiB,WAAW,YACpD;AACA,sBAAc;AAAA,UACZ,GAAG,gBAAgB;AAAA,UACnB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AAEd,YAAM,cAAc,KAAK,UAAU,KAAK;AACxC,YAAM,cACJ,cAAc,KAAK,MAAM,WAAW,IAAI,CAAC;AAU3C,UACE,YAAY,SAAS,KACrB,iBAAiB,SACjB,MAAM,QAAQ,SAAS,gBAAgB,GACvC;AACA,sBAAc;AAAA,UACZ,GAAG;AAAA,UACH,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AACL,sBAAc;AAAA,UACZ,GAAG;AAAA,UACH,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAED,gBAAQ,mBAAmB;AAAA,UACzB,SAAS;AAAA,YACP,GAAG;AAAA,YACH,OAAO;AAAA,YACP,QAAQ;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,OAAO;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAIM;AACJ,YAAQ,MAAM,oBAAoB;AAElC,YAAQ,mBAAmB;AAAA,MACzB,SAAS;AAAA,IACX,CAAC;AAED,kBAAc,YAAY;AAE1B,UAAM,cAAc,EAAE,cAAc,SAAS,QAAQ,CAAC;AAAA,EACxD;AAEA,QAAM,mBAAmB,OAAO,iBAA+B;AAC7D,kBAAc;AAAA,MACZ,GAAG;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,aAAS,sDAAgC,YAAY;AAAA,IACvD,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,CAAC,YAA0B;AAC/C,YAAQ,MAAM,cAAc,OAAO;AAEnC,aAAS;AAAA,MACP;AAAA,MACA,UAAU,MAAM,UAAU,QAAQ;AAAA,MAClC,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAIA,QAAM,aAAa,CAAC,SAAuB,UAAqC;AAC9E,WAAO,eAAe;AACtB,aAAS,EAAE,SAAS,SAAS,MAAM,aAAa,CAAC;AAAA,EACnD;AAEA,QAAM,cAAc,CAAC,UAAqC;AACxD,WAAO,eAAe;AACtB,aAAS,EAAE,MAAM,cAAc,CAAC;AAAA,EAClC;AAGA,QAAM,6BAAyB;AAAA,QAC7B,gBAAAA;AAAA,MACE,CACE,eACA,mBACG;AACH,iBAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,EAAE,SAAS,MAAM,UAAU,KAAK;AAAA,IAClC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,OAAO,QAAgB,6BAA6B;AAEzE,QAAI,MAAM,qBAAqB,CAAC,MAAM,UAAU,CAAC,MAAM,cAAe;AAEtE,aAAS,EAAE,MAAM,qBAAqB,CAAC;AACvC,UAAM,WAAW,MAAM,OAAO;AAE9B,QAAI,CAAC,UAAU;AACb,aAAO,SAAS,EAAE,MAAM,cAAc,CAAC;AAAA,IACzC;AAEA,UAAM,cAAc,QAAQ,MAAM,QAAQ,QAAQ,KAAK,CAAC;AACxD,UAAM,kBAAkB,YAAY,CAAC,GAAG;AAExC,QAAI;AACF,YAAM,gBAAgB,MAAM,QAAQ,WAAW,UAAU;AAAA,QACvD,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AAED,YAAM,wBAAwB;AAAA,QAC5B,cAAc,SAAS;AAAA,QACvB;AAAA,MACF;AACA,YAAM,oBAAoB,QAAQ,MAAM,QAAQ,QAAQ,KAAK,CAAC;AAG9D,6BAAuB,uBAAuB,iBAAiB;AAAA,IACjE,SAAS,GAAG;AACV,6BAAuB,OAAO,WAAW;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,yBAAyB,oBAAoB,iBAAiB,eAAe;AAEnF,QAAM,cAAc,sBAAsB,sBAAsB;AAEhE,QAAM,EAAE,QAAQ,GAAG,UAAU,IAAI;AAEjC,QAAM,2BAA2B,6BAA6B;AAAA,IAC5D,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,MAAM,gBAAgB;AAAA,IACpC,4BACE,MAAM,8BAA8B;AAAA,IACtC;AAAA,IACA;AAAA,IACA,8BAA8B,MAAM,gCAAgC;AAAA,IACpE,4BACE,MAAM,8BAA8B;AAAA,IACtC,eAAe,MAAM;AAAA,EACvB,CAAC;AAED,QAAM,gCAAuD;AAAA,IAC3D,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,IAEA;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,4BAAwD;AAAA,IAC5D,OAAO;AAAA,MACL,YAAY,MAAM;AAAA,MAClB,uBAAuB,MAAM;AAAA,MAC7B,oBAAoB,MAAM;AAAA,MAC1B,4CACE,MAAM;AAAA,MACR,eAAe,MAAM;AAAA,MACrB,4BAA4B,MAAM;AAAA,MAClC,4BAA4B,MAAM;AAAA,MAClC,QAAQ,MAAM;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,eAAe,MAAM;AAAA,MACrB,0BAA0B,MAAM;AAAA,MAChC,eAAe,MAAM;AAAA,MACrB,kBAAkB,MAAM;AAAA,MACxB,kBAAkB,MAAM;AAAA,MACxB,aAAa,MAAM;AAAA,MACnB,kBAAkB,MAAM;AAAA,MACxB,qBAAqB,MAAM;AAAA,MAC3B,gBAAgB,MAAM;AAAA,MACtB,qBAAqB,MAAM;AAAA,MAC3B,iBAAiB,MAAM;AAAA,MACvB,OAAO,MAAM;AAAA,MACb,iBAAiB,MAAM;AAAA,MACvB,kBAAkB,MAAM;AAAA,MACxB,SAAS,MAAM;AAAA,MACf,gBAAgB,MAAM;AAAA,MACtB,gBAAgB,MAAM;AAAA,MACtB,qBAAqB,MAAM;AAAA,MAC3B,gBAAgB,MAAM;AAAA,MACtB,8CACE,MAAM;AAAA,MACR,0BAA0B,MAAM;AAAA,MAChC,qBAAqB,MAAM;AAAA,MAC3B,gBAAgB,MAAM;AAAA,MACtB,2BAA2B,MAAM;AAAA,MACjC,eAAe,MAAM;AAAA,MACrB,eAAe,MAAM;AAAA,MACrB,kBAAkB,MAAM;AAAA,MACxB,OAAO,MAAM;AAAA,MACb,cAAc,MAAM;AAAA,MACpB,cAAc,MAAM;AAAA,MACpB,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,MACnB,oBAAoB,MAAM;AAAA,MAC1B,YAAY,MAAM;AAAA,MAClB,oBAAoB,MAAM;AAAA,MAC1B,eAAe,MAAM;AAAA,MACrB,sBAAsB,MAAM;AAAA,MAC5B,YAAY,MAAM;AAAA,MAClB,iBAAiB,MAAM;AAAA,MACvB,kBAAkB,MAAM;AAAA,MACxB,eAAe,MAAM;AAAA,MACrB,oBAAoB,MAAM;AAAA,MAC1B,sBAAsB,MAAM;AAAA,MAC5B,YAAY,MAAM;AAAA,MAClB,uBAAuB,MAAM;AAAA,MAC7B,qBAAqB,MAAM;AAAA,MAC3B,2BAA2B,MAAM;AAAA,MACjC,wBAAwB,MAAM;AAAA,MAC9B,qBAAqB,MAAM;AAAA,MAC3B,kBAAkB,MAAM;AAAA,MACxB,YAAY,MAAM;AAAA,MAClB,cAAc,MAAM;AAAA,MACpB,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB,iBAAiB,MAAM;AAAA,MACvB,4BAA4B,MAAM;AAAA,MAClC,yBAAyB,MAAM;AAAA,MAC/B,gBAAgB,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,qBAAqB,uBAAuB;AAAA,IAChD;AAAA,EACF,CAAC;AAED,MAAI,MAAM,OAAO;AACf,WACE,gCAAAL,QAAA,cAAC,wBACC,gCAAAA,QAAA,cAACE,wBAAA,EAAsB,OAAO,MAAM,OAAO,CAC7C;AAAA,EAEJ;AAEA,MAAI,MAAM,SAAS;AACjB,WACE,gCAAAF,QAAA,cAAC,wBACC,gCAAAA,QAAA,cAACG,mBAAA,IAAiB,CACpB;AAAA,EAEJ;AAEA,MAAI,CAAC,QAAQ,OAAO;AAClB,WACE,gCAAAH,QAAA,cAAC,wBACC,gCAAAA,QAAA,cAAC,aAAK,EAAE,iBAAiB,CAAE,CAC7B;AAAA,EAEJ;AAEA,SACE,gCAAAA,QAAA,cAAC,oBAAiB,WAAW,qBAC3B,gCAAAA,QAAA,cAAC,wBAAqB,OAAO,4BAC3B,gCAAAA,QAAA,cAAC,yBAAsB,OAAO,6BAC5B,gCAAAA,QAAA,cAAC,kBAAe,WAAW,yBACzB,gCAAAA,QAAA,cAAC,kBAAe,OAAO,sBACrB,gCAAAA,QAAA,cAAC,qBAAkB,yBAAyB,gCAC1C,gCAAAA,QAAA,cAAC,SAAI,eAAW,cAAAD,SAAK,kBAAkB,KAAI,QAAS,CACtD,CACF,CACF,CACF,CACF,CACF;AAEJ;AAUO,IAAM,UAAU,gBAAAC,QAAM,KAAK,iBAAiB;;;AW72CnD,IAAAM,kBAAkB;;;ACAlB,IAAAC,kBAAkB;AAIX,IAAMC,YAAW,CAAC,EAAE,MAAM,MAA0B;AACzD,QAAM,EAAE,EAAE,IAAI,sBAAsB,UAAU;AAE9C,SACE,gCAAAC,QAAA,cAAC,SAAI,eAAY,aAAY,SAAQ,eAAc,OAAM,gCACvD,gCAAAA,QAAA,cAAC,eAAO,SAAS,EAAE,MAAM,CAAE,GAC3B,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP,CACF;AAEJ;;;ADUO,IAAM,gBAAgB,CAAC,UAA8B;AAC1D,QAAM;AAAA,IACJ,QAAAC,UAAS;AAAA,IACT,OAAO;AAAA,IACP;AAAA,IACA,UAAAC,YAAWA;AAAA,IACX,OAAO;AAAA,EACT,IAAI;AAEJ,QAAM,EAAE,SAAS,cAAc,IAAI,uBAAuB,eAAe;AACzE,QAAM,EAAE,cAAc,IAAI,eAAe,eAAe;AACxD,QAAM,EAAE,EAAE,IAAI,sBAAsB,eAAe;AACnD,QAAM,EAAE,cAAc,cAAc,wBAAwB,IAAI,sBAAsB;AAAA,IACpF;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,EAAE,cAAc,SAAS,IAAI,SAAS,QAAQ,CAAC;AAErD,SACE,gCAAAC,QAAA,cAAC,SAAI,WAAU,8BACb,gCAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,WAAW;AAAA,MACzB,WAAU;AAAA,MACV,SAAS;AAAA;AAAA,IAET,gCAAAA,QAAA,cAACD,WAAA,IAAS;AAAA,EACZ,GACA,gCAAAC,QAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV;AAAA,MACA,OAAO;AAAA,MACP,MAAM;AAAA;AAAA,EACR,GACA,gCAAAE,QAAA,cAAC,SAAI,WAAU,kCACb,gCAAAA,QAAA,cAAC,OAAE,WAAU,oCACV,cAAc,KACd,QACC,gCAAAA,QAAA,cAAC,UAAK,WAAU,2CAAyC,EAAE,MAAM,CAAE,CAEvE,GACC,YAAY,gCAAAA,QAAA,cAAC,OAAE,WAAU,uCAAqC,QAAS,GACxE,gCAAAA,QAAA,cAAC,OAAE,WAAU,mCACV,CAAC,QAAQ,CAAC,CAAC,gBAAgB,eAAe,KACzC,gCAAAA,QAAA,8BAAAA,QAAA,gBACG,EAAE,6BAA6B;AAAA,IAC9B,aAAa;AAAA,EACf,CAAC,GAAE,KACD,GACJ,GAED,EAAE,6BAA6B,EAAE,cAAc,cAAc,CAAC,CACjE,CACF,CACF;AAEJ;;;AEnFA,IAAAC,kBAA+B;AAC/B,IAAAC,uBAKO;;;ACNP,IAAAC,kBAAyD;AA2BlD,IAAM,UAAU,CAAC;AAAA,EACtB;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AACF,MAAqB;AACnB,QAAM,CAAC,aAAa,cAAc,QAAI,0BAAkC;AAAA,IACtE,GAAG;AAAA,IACH,iBAAiB;AAAA,IACjB,cAAc;AAAA,EAChB,CAAC;AAED,QAAM,CAAC,SAAS,UAAU,QAAI,0BAAkB;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAAsB,CAAC,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,QAAI,0BAAS,cAAc;AACrD,QAAM,CAAC,8BAA8B,+BAA+B,QAAI,0BAAS,CAAC,CAAC;AAEnF,QAAM,cAAe,OAAO,MAA0B,SAAS,CAAC;AAEhE,QAAM,iBAAiB,MAAM,WAAW,KAAK;AAC7C,QAAM,gBAAgB,MAAM,WAAW,MAAM,WAAW,IAAI,GAAG,GAAG;AAElE,QAAM,kBAAc,wBAA+C,IAAI;AAEvE,QAAM,iBAAiB,MAAM;AAC3B,QAAI,YAAY,SAAS;AACvB,aAAO,YAAY;AAAA,IACrB;AACA,gBAAY,UAAU,OAAO,eAAe;AAC5C,WAAO,YAAY;AAAA,EACrB;AAEA,iCAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AAEb,UAAM,UAAU;AAEhB,UAAM,YAAY,OAAO,aAAa;AACtC,QAAI,CAAC,UAAU,SAAS,mBAAmB,GAAG;AAG5C,aAAO,aAAa,qBAAqB,OAAO,IAAI,SAAS,EAAE;AAAA,IACjE;AAEA,WAAO,QAAQ,sBAAsB;AACrC,WAAO,MAAM,sBAAsB;AACnC,WAAO,UAAU,sBAAsB;AACvC,WAAO,UAAU,WAAW;AAE5B,WAAO,MAAM;AACX,aAAO,QAAQ,wBAAwB;AACvC,aAAO,MAAM,wBAAwB;AACrC,aAAO,UAAU,wBAAwB;AACzC,aAAO,UAAU,YAAY;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,iCAAU,MAAM;AACd,aAAS,WAAW;AAEpB,UAAM,cAAc,CAAC,UAAiB;AACpC,eAAS,MAAM,IAAI,SAAS,CAAC,CAAC;AAAA,IAChC;AAEA,WAAO,GAAG,8BAA8B,WAAW;AACnD,WAAO,MAAM,OAAO,IAAI,8BAA8B,WAAW;AAAA,EAEnE,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,iCAAU,MAAM;AACd,QAAI,eAAe,OAAO,MAAM;AAEhC,QAAI,CAAC,cAAc;AACjB,YAAM,kBAAkB,OAAO,UAAU,SAAS,MAAM,GAAG,CAAC;AAC5D,qBAAe,oBAAoB,eAAe,IAC9C,kBACA;AAAA,IACN;AAEA,UAAM,aAAa,gBAAgB,IAAI,WAAW,EAAE,UAAU,aAAa,CAAC;AAE5E,eAAW;AAAA,MAA4B,CAAC,MACtC,eAAe,CAAC,oBAAoB,EAAE,GAAG,gBAAgB,EAAE,EAAE;AAAA,IAC/D;AAEA,eAAW,eAAe,EAAE,KAAK,CAAC,eAAe;AAC/C,qBAAe;AAAA,QACb,GAAG;AAAA,QACH,cAAc,gBAAgB;AAAA,MAChC,CAAC;AAAA,IACH,CAAC;AAAA,EAEH,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,uBAAmB;AAAA,IACvB,OACE,eACA,WAAgD,CAAC,GACjD,UACG;AACH,UAAI,SAAS,MAAM,eAAgB,OAAM,eAAe;AAExD,UAAI,iBAAiB,OAAO,KAAK,QAAQ,EAAE,QAAQ;AACjD,cAAM,cAAc,MAAM,EAAE,OAAO,MAAM,SAAS,CAAC;AAAA,MACrD;AAEA,iBAAW,aAAa;AACxB,qBAAe;AAAA,IACjB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,iCAAU,MAAM;AACd,oCAAgC,CAAC,CAAC;AAAA,EACpC,GAAG,CAAC,OAAO,MAAM,EAAE,CAAC;AAEpB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC1JA,IAAAC,kBAAwB;AAIjB,IAAM,uBAAuB,CAAC,UAA4B;AAC/D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,aAAa,SAAS;AAC5B,QAAM,qBAAqB,mBAAmB;AAC9C,QAAM,0BAA0B,mBAAmB;AACnD,QAAM,eAAe,GAAG,OAAO,QAAQ,GAAG,OAAO,KAAK,OAAO,cAAc,EAAE,MAAM,GACjF,OAAO,KAAK,OAAO,SAAS,EAAE,MAChC,GAAG,OAAO,cAAc,MAAM;AAAA,IAC5B,OAAO,MAAM,EAAE;AACjB,QAAM,mBAAmB,MAAM;AAE/B,QAAM,kBAAgC;AAAA,IACpC,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,IAEA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AChEA,IAAAC,kBAAyB;AAgBlB,IAAM,wBAAwB,MAA0B;AAC7D,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAAqD,IAAI;AACnF,QAAM,CAAC,iBAAiB,kBAAkB,QACxC,0BAA4B,eAAe;AAE7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AHqBO,IAAM,OAAO,CAAC,UAAwC;AAC3D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA,kBAAkB;AAAA,IAClB,QAAQ;AAAA,IACR,8BAA8B;AAAA,EAChC,IAAI;AAEJ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,QAAQ,EAAE,QAAQ,iBAAiB,cAAc,eAAe,CAAC;AAErE,QAAM,qBAAqB,sBAAsB;AAEjD,QAAM,uBAAmB;AAAA,IACvB,MACE,iCACA,IAAI,sCAAiB;AAAA,MACnB,SAAS;AAAA,QACP,IAAI,yCAAoB,MAAM;AAAA,QAC9B,IAAI,sCAAiB,MAAM;AAAA,QAC3B,IAAI,yCAAoB,MAAM;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,IACH,CAAC,QAAQ,6BAA6B;AAAA,EACxC;AAEA,QAAM,mBAAmB,qBAAqB;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,CAAC,YAAY,EAAG,QAAO;AAE3B,SACE,gCAAAC,QAAA,cAAC,gBAAa,OAAO,oBACnB,gCAAAA,QAAA,cAAC,uBAAoB,OAAO,eAC1B,gCAAAA,QAAA,cAAC,kCAA4B,QAAS,CACxC,CACF;AAEJ;;;AIrHA,IAAAC,kBAAoC;AAEpC,IAAAC,uBAA2B;AAYpB,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAKM;AACJ,QAAM,CAAC,YAAY,aAAa,QAAI,0BAA4B,IAAI;AACpE,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,0BAAS,QAAQ;AAE7D,MAAI,SAAS,OAAO,eAAe,IAAI;AACrC,sBAAkB,QAAQ;AAAA,EAC5B;AAEA,QAAM,CAAC,aAAa,QAAI,0BAAS,OAAO;AAExC,iCAAU,MAAM;AACd,UAAM,SAAS,IAAI,gCAAW,QAAQ,QAAW,aAAa;AAC9D,QAAI,0BAA0B;AAE9B,UAAM,oBAAoB,OACvB,YAAY,gBAAgB,eAAe,EAC3C,KAAK,MAAM;AACV,UAAI,CAAC,wBAAyB,eAAc,MAAM;AAAA,IACpD,CAAC;AAEH,WAAO,MAAM;AACX,gCAA0B;AAC1B,oBAAc,IAAI;AAClB,wBACG,KAAK,MAAM,OAAO,eAAe,CAAC,EAClC,KAAK,MAAM;AACV,gBAAQ,IAAI,wBAAwB,eAAe,EAAE,mBAAmB;AAAA,MAC1E,CAAC;AAAA,IACL;AAAA,EACF,GAAG,CAAC,QAAQ,gBAAgB,eAAe,eAAe,CAAC;AAE3D,SAAO;AACT;;;ACvDA,IAAAC,kBAAkB;AAClB,IAAAC,gBAAiB;AAUjB,IAAM,mBAAmB,CAAC,UAA0C;AAClE,QAAM,EAAE,UAAU,QAAQ,WAAW,IAAI;AAEzC,QAAM,EAAE,QAAQ,cAAc,IAAI,uBAAuB,QAAQ;AAEjE,SACE,gCAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAK,wBAAwB;AAAA,QACtC,qCAAqC,iBAAiB;AAAA,MACxD,CAAC;AAAA;AAAA,IAEA;AAAA,EACH;AAEJ;AAKO,IAAM,SAAS,gBAAAD,QAAM,KAAK,gBAAgB;",
  "names": ["exports", "module", "position", "start", "node", "whitespace", "re", "exports", "StyleToObject", "exports", "module", "isArray", "isPlainObject", "setProperty", "getProperty", "name", "extend", "Audio", "DownloadIcon", "PauseIcon", "import_react", "import_react", "React", "Component", "import_react", "React", "import_react", "React", "Component", "import_react", "Component", "React", "Component", "import_react", "React", "Component", "import_react", "import_stream_chat", "import_react", "import_react", "import_react", "selector", "import_react", "React", "React", "import_react", "React", "Component", "import_react", "handleDelete", "React", "import_react", "React", "import_react", "React", "import_react", "React", "import_react", "import_dayjs", "calendar", "Dayjs", "Dayjs", "calendar", "localizedFormat", "React", "Component", "import_react", "React", "Component", "import_react", "React", "React", "import_react", "import_stream_chat", "import_react", "import_react_player", "import_clsx", "import_stream_chat", "import_react", "text", "name", "React", "import_react", "import_react", "import_react", "React", "import_react", "React", "React", "import_react", "React", "import_react", "React", "clsx", "import_react", "React", "import_react", "React", "import_react", "import_clsx", "root", "throttle", "React", "clsx", "import_stream_chat", "import_lodash", "duration", "element", "throttle", "onError", "import_react", "import_stream_chat", "previous", "el", "React", "rootClassName", "React", "Audio", "import_react", "import_react", "import_react", "import_clsx", "React", "clsx", "FileArchiveIcon", "FileCodeIcon", "FileExcelIcon", "FilePdfIcon", "FilePowerPointIcon", "FileWordIcon", "FileAudioIcon", "FileImageIcon", "FileVideoIcon", "Icon", "React", "import_clsx", "import_nanoid", "import_react", "import_react", "import_react", "import_react", "import_nanoid", "React", "DownloadIcon", "PauseIcon", "import_react", "import_stream_chat", "import_react", "React", "import_react", "import_react_virtuoso", "import_react", "import_react", "import_clsx", "import_react", "calendar", "React", "import_clsx", "import_react", "import_react", "React", "code", "image", "name", "React", "clsx", "import_react", "image", "name", "React", "import_clsx", "import_react", "React", "clsx", "image", "name", "import_clsx", "import_react", "position", "React", "clsx", "import_lodash", "import_react", "import_react", "import_clsx", "import_react", "import_clsx", "import_react", "import_clsx", "import_react", "import_react", "import_react", "import_lodash", "uniqBy", "error", "import_react", "import_lodash", "channel", "uniqBy", "index", "import_react", "import_react", "React", "import_react", "LoadingErrorIndicator", "LoadingIndicator", "React", "import_clsx", "import_react", "import_react", "import_lodash", "uniqBy", "text", "results", "u", "debounce", "import_react", "import_clsx", "import_react", "React", "import_react", "React", "React", "clsx", "MenuIcon", "SearchInput", "import_react", "import_clsx", "React", "index", "clsx", "MenuIcon", "SearchBar", "SearchInput", "React", "clsx", "import_react", "import_react", "React", "text", "React", "import_react", "import_react", "import_react", "React", "import_react", "React", "import_react", "color", "React", "React", "LoadMoreButton", "React", "Avatar", "ChannelSearch", "EmptyStateIndicator", "getLatestMessagePreview", "LoadingErrorIndicator", "LoadingIndicator", "channels", "setChannels", "React", "clsx", "channel", "import_react", "import_react", "import_react", "import_react", "import_react", "import_lodash", "uniqBy", "import_react", "import_lodash", "uniqBy", "import_react", "import_lodash", "uniqBy", "import_react", "import_lodash", "uniqBy", "import_react", "import_react", "import_react", "import_shim", "noop", "selector", "import_react", "Icon", "React", "React", "clsx", "Icon", "Avatar", "ChannelPreviewActionButtons", "React", "clsx", "import_react", "import_react", "import_react", "name", "re", "space", "space", "index", "space", "index", "definition", "html", "svg", "stringify", "StyleToObject", "point", "node", "start", "position", "point", "index", "start", "own", "cap", "create", "svg", "html", "node", "jsx", "jsxs", "_", "point", "name", "index", "stringify", "value", "emptyOptions", "one", "index", "own", "list", "start", "all", "index", "extension", "code", "list", "code", "code", "index", "start", "code", "replace", "ok", "start", "code", "previous", "code", "document", "self", "start", "code", "point", "index", "ok", "code", "constructs", "index", "index", "text", "start", "ok", "attentionMarkers", "previous", "code", "point", "ok", "start", "code", "ok", "start", "code", "ok", "self", "start", "code", "ok", "start", "code", "ok", "self", "test", "start", "code", "ok", "self", "start", "code", "effects", "nok", "ok", "self", "start", "code", "furtherStart", "index", "code", "ok", "self", "start", "index", "start", "list", "index", "previous", "start", "content", "ok", "previous", "code", "self", "ok", "start", "code", "ok", "self", "start", "code", "ok", "start", "code", "ok", "start", "code", "ok", "self", "start", "code", "titleBefore", "ok", "start", "code", "content", "text", "ok", "start", "code", "index", "ok", "self", "start", "code", "name", "ok", "self", "index", "start", "code", "index", "text", "ok", "self", "start", "code", "ok", "self", "start", "code", "ok", "self", "start", "code", "ok", "start", "code", "ok", "start", "code", "ok", "self", "start", "code", "index", "content", "text", "definition", "heading", "ok", "self", "start", "code", "paragraph", "self", "content", "code", "text", "self", "constructs", "start", "code", "list", "index", "document", "flow", "string", "text", "document", "flow", "string", "text", "point", "exit", "code", "constructs", "map", "start", "all", "list", "ok", "from", "index", "constructs", "create", "document", "text", "start", "code", "head", "own", "link", "heading", "blockQuote", "codeText", "definition", "emphasis", "hardBreak", "html", "image", "listItem", "list", "paragraph", "strong", "thematicBreak", "exit", "index", "point", "start", "create", "node", "data", "text", "string", "extension", "self", "node", "node", "node", "node", "node", "node", "index", "link", "node", "html", "node", "node", "node", "definition", "node", "node", "text", "node", "definition", "node", "node", "paragraph", "index", "list", "node", "index", "node", "root", "node", "node", "node", "start", "node", "result", "node", "search", "start", "code", "text", "node", "thematicBreak", "node", "html", "list", "root", "text", "thematicBreak", "index", "map", "name", "toString", "keys", "index", "esm_default", "definition", "content", "listItem", "esm_default", "test", "ok", "checks", "index", "all", "node", "empty", "test", "visitor", "is", "node", "index", "name", "visit", "test", "visitor", "node", "index", "own", "emptyOptions", "handlers", "all", "one", "node", "map", "handle", "esm_default", "index", "code", "node", "index", "wrap", "index", "field", "path", "name", "self", "own", "index", "extend", "self", "file", "tree", "compiler", "value", "parameters", "name", "node", "isUint8Array", "remarkPlugins", "urlTransform", "transform", "node", "index", "test", "import_react", "import_react", "CustomMessageActionsList", "prevMessage", "nextMessage", "deepequal", "text", "emojiRegex", "import_react", "import_react", "import_lodash", "message", "throttle", "import_react", "text", "import_react", "import_react", "React", "import_react", "Timestamp", "React", "import_react", "import_clsx", "BaseImage", "React", "clsx", "import_react", "import_sanitize_url", "import_clsx", "import_clsx", "import_react", "import_focus", "import_react", "React", "import_clsx", "import_react", "import_clsx", "import_react", "import_react", "offsetMw", "flipMw", "shiftMw", "sizeMw", "React", "clsx", "React", "clsx", "element", "React", "clsx", "import_clsx", "import_react", "import_focus", "React", "clsx", "import_react", "React", "index", "image", "ImageGallery", "index", "BaseImage", "Modal", "ModalGallery", "image", "React", "clsx", "modalOpen", "import_react", "import_sanitize_url", "BaseImage", "Modal", "ModalGallery", "React", "import_clsx", "import_react", "import_clsx", "import_react", "import_react", "React", "import_react", "React", "getMessageActions", "handleDelete", "isUserMuted", "CustomMessageActionsList", "rootClassName", "clsx", "React", "import_react", "React", "ActionsIcon", "CustomMessageActionsList", "getMessageActions", "handleDelete", "React", "clsx", "text", "test", "element", "anyFactory", "castFactory", "checks", "index", "string", "emptyOptions", "list", "visitor", "node", "index", "find", "replace", "start", "position", "node", "import_emoji_regex", "replace", "transform", "node", "emojiRegex", "replace", "name", "transform", "node", "index", "node", "text", "visitor", "node", "index", "link", "node", "visitor", "node", "index", "start", "text", "paragraph", "import_react", "index", "escapeStringRegexp", "string", "findAndReplace", "list", "toPairs", "visitor", "node", "index", "find", "replace", "start", "position", "toExpression", "toFunction", "escapeStringRegexp", "node", "findAndReplace", "domain", "path", "previous", "trail", "code", "footnoteReference", "node", "exit", "index", "node", "exit", "table", "row", "sizes", "columnIndex", "serialize", "code", "blockquote", "node", "exit", "list", "index", "hardBreak", "index", "index", "node", "code", "node", "exit", "value", "map", "definition", "node", "exit", "code", "emphasis", "node", "exit", "node", "heading", "node", "exit", "subexit", "value", "html", "node", "image", "node", "exit", "imageReference", "node", "exit", "inlineCode", "node", "index", "position", "node", "link", "node", "exit", "value", "linkReference", "node", "exit", "text", "list", "node", "exit", "index", "listItem", "node", "exit", "map", "index", "paragraph", "node", "exit", "root", "node", "strong", "node", "exit", "text", "node", "thematicBreak", "blockquote", "hardBreak", "code", "definition", "emphasis", "heading", "html", "image", "imageReference", "inlineCode", "link", "linkReference", "list", "listItem", "paragraph", "root", "strong", "text", "thematicBreak", "exit", "node", "index", "node", "index", "text", "code", "ok", "self", "start", "trail", "index", "tokenizeIndent", "ok", "self", "index", "start", "code", "string", "index", "strikethrough", "text", "insideSpan", "ok", "previous", "start", "code", "index", "element", "index", "ok", "self", "start", "code", "index", "map", "table", "ok", "self", "code", "emptyOptions", "self", "import_clsx", "import_react", "isUrl", "React", "clsx", "import_react", "React", "import_react", "React", "text", "React", "start", "u", "remarkPlugins", "number", "MessageDeleted", "handleDelete", "React", "import_react", "import_react", "import_clsx", "import_react", "MessageBouncePrompt", "Modal", "React", "import_react", "handleDelete", "handle", "React", "import_react", "import_clsx", "clsx", "React", "import_clsx", "import_react", "import_react", "import_react", "import_clsx", "import_react", "import_react", "import_react", "image", "position", "React", "position", "React", "React", "Avatar", "React", "clsx", "Component", "ReactionIcon", "ReactionSelector", "React", "ActionsIcon", "ReactionIcon", "ThreadIcon", "getMessageActions", "React", "clsx", "import_react", "React", "import_react", "import_clsx", "import_react", "React", "import_react", "Avatar", "React", "clsx", "import_clsx", "import_react", "import_react", "import_clsx", "import_react", "import_clsx", "import_react", "import_react", "name", "React", "import_react", "import_react", "import_clsx", "import_clsx", "import_react", "text", "React", "clsx", "React", "clsx", "pollStateSelector", "React", "import_react", "import_clsx", "React", "clsx", "className", "import_react", "React", "import_clsx", "import_react", "import_react", "Modal", "React", "import_react", "pollStateSelector", "React", "import_react", "import_react", "import_clsx", "React", "clsx", "import_react", "React", "import_react", "import_react", "import_stream_chat", "import_lodash", "import_react", "import_stream_chat", "uniqBy", "import_react", "paginationStateSelector", "votes", "import_clsx", "import_lodash", "import_react", "debounce", "root", "React", "clsx", "pollStateSelector", "React", "import_react", "import_clsx", "import_react", "import_clsx", "import_lodash", "import_react", "import_stream_chat", "React", "clsx", "pollStateSelector", "debounce", "pollStateSelector", "PollOptionSelector", "React", "clsx", "pollStateSelector", "name", "React", "import_clsx", "import_react", "import_react", "import_react", "pollStateSelector", "React", "React", "import_react", "pollStateSelector", "React", "pollStateSelector", "name", "React", "clsx", "pollStateSelector", "AddCommentForm", "EndPollDialog", "PollAnswerList", "PollOptionsFullList", "PollResults", "SuggestPollOptionForm", "React", "clsx", "PollActions", "PollHeader", "React", "clsx", "import_clsx", "import_react", "name", "React", "clsx", "PollContent", "QuotedPoll", "React", "import_react", "import_stream_chat", "import_clsx", "import_react", "import_clsx", "import_react", "React", "clsx", "React", "clsx", "import_react", "import_clsx", "pollComposerStateSelector", "name", "React", "clsx", "import_clsx", "import_react", "import_react", "import_clsx", "order", "React", "index", "clsx", "pollComposerStateSelector", "index", "React", "clsx", "import_react", "React", "pollComposerStateSelector", "React", "Attachment", "renderText", "Avatar", "React", "clsx", "import_react", "React", "QuotedMessage", "renderText", "React", "clsx", "import_react", "renderText", "text", "React", "import_react", "import_react", "import_clsx", "React", "clsx", "React", "import_react", "React", "import_clsx", "import_react", "import_react", "import_nanoid", "import_dayjs", "import_calendar", "import_localizedFormat", "name", "topic", "reason", "name", "import_de", "import_es", "import_fr", "import_hi", "import_it", "import_ja", "import_ko", "import_nl", "import_pt", "import_ru", "import_tr", "import_en", "Dayjs", "updateLocale", "utc", "timezone", "i18n", "LocalizedFormat", "calendar", "localeData", "relativeTime", "duration", "name", "TranslationTopic", "import_react", "import_react", "import_react", "import_react", "import_react", "element", "import_react", "import_react", "React", "import_react", "React", "element", "import_react", "import_react", "React", "import_react", "selector", "React", "MessageNotification", "import_react", "import_react", "color", "React", "CloseIcon", "React", "CloseIcon", "import_react", "mousewheelListener", "Component", "element", "React", "import_react", "import_clsx", "name", "React", "clsx", "import_react", "import_react", "calendar", "position", "React", "import_react", "Avatar", "calendar", "React", "name", "DateSeparator", "UnreadMessagesSeparator", "index", "React", "import_nanoid", "import_react", "import_react", "React", "EmptyStateIndicator", "LoadingIndicator", "MessageListMainPanel", "MessageListNotifications", "MessageNotification", "TypingIndicator", "UnreadMessagesNotification", "element", "clsx", "import_react", "import_clsx", "React", "clsx", "import_react", "import_react", "import_react", "import_react", "import_react", "import_react", "import_react", "import_react", "import_clsx", "import_lodash", "import_react", "throttle", "React", "clsx", "LoadingIndicator", "EmptyStateIndicator", "DateSeparator", "renderText", "UnreadMessagesSeparator", "import_react", "React", "element", "index", "renderText", "DateSeparator", "GiphyPreviewMessage", "MessageListMainPanel", "MessageListNotifications", "MessageNotification", "TypingIndicator", "UnreadMessagesNotification", "UnreadMessagesSeparator", "computeItemKey", "numItemsPrepended", "processedMessages", "React", "import_react", "import_stream_chat", "React", "import_react", "React", "import_react", "import_clsx", "import_react", "import_clsx", "import_react", "reactions", "Modal", "React", "clsx", "import_react", "ReactionsListModal", "React", "clsx", "import_react", "import_clsx", "React", "clsx", "import_react", "import_clsx", "Timestamp", "React", "clsx", "renderText", "Attachment", "Avatar", "EditMessageModal", "MessageOptions", "MessageActions", "MessageBlocked", "MessageBouncePrompt", "MessageDeleted", "MessageIsThreadReplyInChannelButtonIndicator", "MessageRepliesCountButton", "MessageStatus", "MessageTimestamp", "ReactionsList", "ReminderNotification", "StreamedMessageText", "PinIndicator", "React", "rootClassName", "clsx", "React", "handleDelete", "text", "React", "import_react", "MessageDeliveryStatus", "getLatestMessagePreview", "throttle", "React", "import_react", "import_clsx", "React", "clsx", "selector", "clsx", "selector", "React", "ThreadListItemUI", "React", "import_react", "React", "import_react", "selector", "React", "import_react", "selector", "LoadingIndicator", "React", "selector", "ThreadListEmptyPlaceholder", "ThreadListItem", "ThreadListLoadingIndicator", "ThreadListUnseenThreadsBanner", "React", "import_react", "import_clsx", "import_react", "React", "import_react", "import_react", "CloseIcon", "React", "React", "CloseIcon", "import_react", "import_react", "React", "ThreadStart", "React", "React", "selector", "ThreadHead", "ThreadHeader", "clsx", "import_react", "import_clsx", "React", "clsx", "import_react", "import_react", "React", "React", "position", "duration", "import_react", "React", "import_clsx", "pollComposerStateSelector", "import_react", "import_react", "import_react", "import_react", "import_stream_chat", "import_react", "string", "import_react", "RecordingPermission", "import_nanoid", "import_lodash", "mergeWith", "logError", "MediaRecordingState", "fixWebmDuration", "logError", "e", "recording", "React", "PollCreationDialog", "ShareLocationDialog", "Modal", "clsx", "import_react", "import_stream_chat", "import_react", "import_stream_chat", "React", "DownloadIcon", "import_react", "import_react", "React", "import_react", "import_react", "import_clsx", "import_react", "React", "clsx", "audioPlayerStateSelector", "React", "PauseIcon", "import_react", "import_react", "React", "React", "PauseIcon", "import_react", "React", "audioPlayerStateSelector", "React", "import_react", "React", "DownloadIcon", "import_clsx", "import_react", "BaseImage", "React", "clsx", "import_react", "React", "FileAttachmentPreview", "GeolocationPreview", "ImageAttachmentPreview", "UnsupportedAttachmentPreview", "VoiceRecordingPreview", "React", "import_react", "import_react", "React", "import_react", "import_react", "import_react", "import_react", "React", "import_react", "React", "import_react", "React", "renderText", "Attachment", "Avatar", "import_clsx", "import_react", "import_stream_chat", "React", "clsx", "import_react", "stateSelector", "React", "import_react", "React", "import_react", "React", "import_clsx", "import_react", "import_clsx", "import_react", "React", "SuggestionListItem", "Component", "clsx", "import_react", "import_clsx", "Avatar", "React", "clsx", "React", "clsx", "import_clsx", "import_react", "textComposerStateSelector", "searchSourceStateSelector", "messageComposerStateSelector", "attachmentManagerStateSelector", "text", "start", "React", "clsx", "Textarea", "import_react", "import_clsx", "React", "Component", "clsx", "AttachmentPreviewList", "AttachmentSelector", "AudioRecorder", "CooldownTimer", "LinkPreviewList", "QuotedMessagePreview", "RecordingPermissionDeniedNotification", "SendButton", "SendToChannelCheckbox", "StartRecordingAudioButton", "TextareaComposer", "React", "StopAIGenerationButton", "import_react", "React", "React", "Modal", "attachmentManagerConfigStateSelector", "UploadButton", "React", "UploadFileInput", "clsx", "audioPlayerStateSelector", "React", "duration", "import_react", "import_clsx", "React", "clsx", "image", "ReactPlayer", "text", "audioPlayerStateSelector", "rootClassName", "import_react", "React", "import_react", "React", "import_react", "React", "clsx", "React", "AttachmentActions", "Gallery", "element", "image", "Image", "Card", "File", "Audio", "VoiceRecording", "ReactPlayer", "content", "Geolocation", "UnsupportedAttachment", "React", "import_lodash", "import_react", "isSeekable", "elementIsPlaying", "logError", "DEFAULT_PLAYBACK_RATES", "throttle", "import_stream_chat", "import_react", "import_react", "import_clsx", "import_lodash", "import_stream_chat", "import_react", "type", "import_react", "import_react", "import_react", "name", "import_nanoid", "text", "linkify", "element", "number", "searchControllerStateSelector", "clsx", "React", "EmptyPlaceholder", "LoadingErrorIndicator", "LoadingIndicator", "throttle", "debounce", "import_react", "import_react", "MenuIcon", "React", "Avatar", "MenuIcon", "React", "import_react", "import_stream_chat", "import_react", "import_react", "import_react", "React", "import_react", "import_stream_chat", "import_react", "import_clsx", "React", "clsx"]
}
