{"version":3,"mappings":"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","names":["_extends","n","t","reservedModifierKeywords","mappedKeys","mapKey","key","isHotkeyModifier","parseKeysHookInput","keys","splitKey","parseHotkey","hotkey","combinationKey","description","k","modifiers","singleCharKeys","e","pushToCurrentlyPressedKeys","removeFromCurrentlyPressedKeys","currentlyPressedKeys","isReadonlyArray","value","isHotkeyPressed","hotkeyArray","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","event","enabledOnTags","target","composed","targetTagName","isCustomElement","tag","_targetTagName","element","isScopeActive","activeScopes","scopes","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","alt","meta","mod","shift","ctrl","pressedKeyUppercase","code","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","deepEqual","x","y","isEqual","HotkeysContext","useHotkeysContext","useDeepEqualMemo","ref","useRef","stopPropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","_useState","useState","setRef","hasTriggeredRef","_options","_keys","_deps","memoisedCB","useCallback","cbRef","memoisedOptions","_useHotkeysContext","enabledScopes","proxy","listener","isKeyUp","_e$target","rootNode","_hotkey$keys","handleKeyDown","handleKeyUp","domNode","root","factory","module","this","global","Toastify","version","divElement","property","avatarElement","closeElement","width","self","getAxisOffsetAValue","xOffset","yOffset","rootElement","elementToInsert","toastElement","topLeftOffsetSize","topRightOffsetSize","offsetSize","allToasts","classUsed","i","containsClass","height","offset","axis","elem","yourClass","window","_showToast","showToast","props","text","onClick","delay","rest","toast","className","destination","gravity","position","setTimeout","useInterval","fn","deps","immediate","savedCallback","current","id","setInterval","tick","clearInterval","isMenuOpen","state","batchedUpdates","unstable_batchedUpdates","getTransition","transition","name","safeCall","arg","internalKey","getName","component","mergeProps","source","targetProp","sourceProp","parsePadding","paddingStr","padding","top","right","getScrollAncestor","node","overflow","overflowX","overflowY","commonProps","isDisabled","isHovering","indexOfNode","nodeList","useBEM","block","useMemo","blockElement","classString","expandedClassName","menuContainerClass","menuClass","menuArrowClass","menuItemClass","menuDividerClass","menuHeaderClass","menuGroupClass","subMenuClass","HoverItemContext","MenuListItemContext","MenuListContext","EventHandlersContext","RadioGroupContext","SettingsContext","Keys","HoverActionTypes","CloseReason","FocusPositions","MenuStateMap","positionAbsolute","roleNone","roleMenuitem","noScrollFocus","MenuContainer","containerRef","containerProps","children","isOpen","theming","onClose","itemTransition","jsx","createSubmenuCtx","timer","count","closeDelay","pending","settled","useItems","menuRef","hoverItem","setHoverItem","mutableState","updateItems","item","isMounted","items","index","dispatch","actionType","nextIndex","hoverIndex","sortItems","orderedNodes","a","b","newItem","prevItem","getNativeDimension","transformed","untransformed","getNormalizedClientRect","rect","getPositionHelpers","menuScroll","boundingBoxPadding","menuRect","containerRect","boundingRect","getLeftOverflow","getRightOverflow","getTopOverflow","getBottomOverflow","leftOverflow","rightOverflow","topOverflow","bottomOverflow","placeArrowVertical","arrowRef","menuY","anchorRect","placeLeftorRight","placeLeftorRightY","placeLeftX","placeRightX","confineHorizontally","confineVertically","arrow","direction","computedDirection","placeArrowHorizontal","menuX","placeToporBottom","placeToporBottomX","placeTopY","placeBottomY","positionMenu","align","gap","positionHelpers","isHorizontal","horizontalOffset","verticalOffset","arrowElt","useIsomorphicLayoutEffect","instance","useCombinedRef","refA","refB","offScreen","MenuList","ariaLabel","menuClassName","menuStyle","arrowProps","anchorPoint","anchorRef","externalRef","parentScrollingRef","setDownOverflow","repositionFlag","captureFocus","endTransition","menuItemFocus","_1","restProps","menuPosition","setMenuPosition","arrowPosition","setArrowPosition","overflowData","setOverflowData","expandedDirection","setExpandedDirection","submenuCtx","reposSubmenu","forceReposSubmenu","useReducer","c","boundingBoxRef","rootMenuRef","rootAnchorRef","scrollNodesRef","reposition","viewScroll","submenuCloseDelay","parentSubmenuCtx","reposFlag","prevOpen","openTransition","closeTransition","scrollNodes","onKeyDown","onAnimationEnd","onPointerMove","onPointerLeave","handlePosition","noOverflowCheck","_a","arrowX","arrowY","menuHeight","overflowAmt","anchorScroll","scroll","handleScroll","scrollObservers","o","hasOverflow","parentScroll","targetList","resizeObserver","entries","flushSync","resizeObserverOptions","anchor","alwaysUpdate","setItemFocus","menuElt","itemContext","maxHeight","listContext","overflowStyle","arrowModifiers","_arrowClassName","menu","ControlledMenu","forwardRef","initialMounted","unmountOnClose","transitionTimeout","submenuOpenDelay","portal","onItemClick","settings","eventHandlers","isCheckorRadio","keepOpen","menuList","createPortal","PRE_ENTER","ENTERING","ENTERED","PRE_EXIT","EXITING","EXITED","UNMOUNTED","STATUS","getState","status","startOrEnd","unmounted","getEndStatus","unmountOnExit","getTimeout","timeout","nextTick","transitState","updateState","setState","latestState","timeoutId","onChange","useTransitionState","enter","exit","preEnter","preExit","initialEntered","mountOnEnter","enterTimeout","exitTimeout","toggle","toEnter","enterStage","useMenuState","initialOpen","onMenuChange","toggleMenu","isEnter","isResolved","useMenuStateAndFocus","menuProps","setMenuItemFocus","openMenu","useClick","onToggle","skipOpen","isLegacyReact","Menu","_","menuButton","instanceRef","stateProps","buttonRef","anchorProps","handleClose","button","buttonProps","renderButton","cloneElement","useImperativeHandle","jsxs","Fragment","withHovering","WrappedComponent","Component","memo","WithHovering","itemRef","useItemEffect","SubMenu","disabled","label","openTrigger","_2","itemProps","parentMenuRef","parentDir","parentOverflow","isParentOpen","isPortal","_openMenu","timerId","stopTimer","args","setHover","delayOpen","onKeyDownOfRoot","handled","externalItemRef","itemClassName","restItemProps","mergedItemProps","getMenuList","container","useItemState","focusRef","unsetHover","onBlur","keepHover","MenuItem","href","type","checked","restStateProps","radioGroup","isRadio","isCheckBox","isAnchor","isChecked","handleClick","mergedProps","menuItemProps","FocusableItem","renderChildren","MenuDivider","MenuHeader","MenuGroup","style","takeOverflow","setOverflowStyle","l","d","A","z","U","u","X","Y","R","j","G","J","w","v","p","M","C","L","P","s","I","T","f","h","r","m","B","D","q","g","defaultLocale","mem","Intl","DateTimeFormat","resolvedOptions","locale","_DateTimeFormat","opts","dateYear","hideTime","formatOpts","forceOpts","regionlessLocale","replace","loc","localeMatch","currentYear","Date","getFullYear","year","undefined","month","day","hour","minute","niceDateTime","date","dtfOpts","i18n","format","openCompose","url","URL","parse","location","screenWidth","screenHeight","screen","left","Math","max","min","winUID","uid","random","newWin","open","__COMPOSE__","alert","_i18n","isSafari","test","navigator","userAgent","openOSK","fauxEl","document","createElement","opacity","body","appendChild","focus","removeChild","documentElement","getComputedStyle","defaultBoundingBoxPadding","safeAreaInsets","getSafeAreaInsets","safeAreaInsetTop","getPropertyValue","safeAreaInsetRight","safeAreaInsetBottom","safeAreaInsetLeft","parseInt","requestAnimationFrame","safeBoundingBoxPadding","paddings","map","join","CSS","supports","addEventListener","passive","TOAST_DURATION","showCompose","states","composerState","minimized","duration","div","getHTMLText","html","preProcess","innerHTML","querySelectorAll","forEach","br","replaceWith","el","remove","append","innerText","trim","statusPeek","spoilerText","content","poll","mediaAttachments","length","multiple","title","image","gifv","video","audio","unknown","ICONS","__vitePreload","heart","bookmark","check-circle","x-circle","transfer","rocket","rtl","arrow-up","arrow-down","earth","lock","unlock","eye-close","eye-open","message","comment","comment2","home","notification","follow","follow-add","pencil","quill","at","attachment","upload","gear","more","more2","external","popout","popin","rotate","plus","chevron-down","reply","flip","thread","group","bot","list","search","hashtag","info","shortcut","user","following","pin","unpin","bus","link","history","share","sparkles","sparkles2","translate","play","trash","mute","unmute","unblock","flag","time","refresh","emoji2","filter","filters","chart","react","layout4","layout5","announce","round","arrow-up-circle","arrow-down-circle","clipboard","account-edit","account-warning","keyboard","cloud","media","speak","building","history2","copy","quote","heart-break","user-x","minimize","celebrate","schedule","camera","SIZES","xl","xxl","ICONDATA","SVGICon","moize","_jsx","viewBox","dangerouslySetInnerHTML","__html","transform","isShallowEqual","maxSize","Object","matchesArg","cacheKeyArg","keyArg","icon","Icon","size","class","iconSize","iconBlock","warn","Array","iconData","setIconData","currentIcon","iconB","Link","routerLocation","useLocation","hash","to","includes","parsedHash","origin","searchParams","searchParamsStr","from","encodeURIComponent","pathname","isActive","decodeURIComponent","currentTarget","parentNode","closest","prevLocation","MenuLink","closeMenu","detail","isValidDate","isNaN","getTime","resolvedLocale","DTF","lang","RTF","RelativeTimeFormat","rtfFromNow","rtf","seconds","now","absSeconds","abs","floor","twitterFromNow","values","0","RelativeTime","datetime","renderCount","rerender","dateStr","dt","str","dateStyle","toISOString","toLocaleString","raf","rafRerender","scheduleRerender","clearTimeout","cancelAnimationFrame","SubMenu2","pointerType","useCloseWatcher","console","watcher","CloseWatcher","useCloseWatcher$1","$modalContainer","getElementById","getBackdropThemeColor","Modal","modalRef","focusElement","querySelector","supportsCloseWatcher","escRef","keydown","keyup","$deckContainers","page","tabIndex","$deckContainer","setAttribute","removeAttribute","$meta","metaColor","store","local","get","backdropColor","colorScheme","log","Modal2","_b","xxxl","alphaCache","canvas","OffscreenCanvas","ctx","getContext","willReadFrequently","imageSmoothingEnabled","MISSING_IMAGE_PATH_REGEX","Avatar","squircle","avatarRef","isMissing","src","loading","decoding","fetchPriority","crossOrigin","onError","onLoad","dataset","loaded","drawImage","allPixels","getImageData","hasAlpha","data","pixel","classList","add","clearRect","IS_RTL","observer","MutationObserver","mutations","mutation","dir","isRTL","observe","useWindowSize","setSize","handleResize","innerWidth","innerHeight","removeEventListener","Menu2","_instanceRef","rtlAlign","MenuConfirm","subMenu","confirm","confirmLabel","menuItemClassName","menuFooter","menuExtras","_jsxs","CustomEmoji","staticUrl","srcset","shortcodesRegexp","shortcodes","RegExp","EmojiText","emojis","indexOf","regex","shortcode","elements","split","word","emoji","find","nameCollator","sensitivity","Collator","ACCT_REGEX","SHORTCODES_REGEX","SPACES_REGEX","NON_ALPHA_NUMERIC_REGEX","NameText","account","showAvatar","showAcct","short","useLingui","acct","avatar","avatarStatic","displayName","username","acct1","acct2","match","api","trimmedUsername","toLowerCase","trimmedDisplayName","shortenedDisplayName","shortenedAlphaNumericDisplayName","hideUsername","compare","which","internalURL","showAccount","_Fragment","codeMappings","zh_HANT","IntlDN","DisplayNames","_localeCode2Text","fallback","of","anotherText","localeCode2Text","locales","languages","localeTargetLanguages","translationTargetLanguages","getTranslateTargetLanguage","fromSettings","contentTranslationTargetLanguage","BYTES_UNITS","prettyBytes","bytes","unitIndex","log2","number","unit","unitDisplay","maximumFractionDigits","containPixelfed","notContainPixelfed","containPleroma","containAkkoma","platformFeatures","supportsCache","feature","domain","getCurrentInstance","softwareName","getCurrentNodeInfo","software","range","features","doesSoftwareMatch","satisfies","includePrerelease","loose","maxInt","base","tMin","tMax","skew","damp","initialBias","initialN","delimiter","regexPunycode","regexNonASCII","regexSeparators","errors","baseMinusTMin","stringFromCharCode","error","array","result","mapDomain","parts","labels","encoded","ucs2decode","string","output","counter","extra","ucs2encode","codePoints","basicToDigit","codePoint","digitToBasic","digit","adapt","delta","numPoints","firstTime","decode","input","inputLength","bias","basic","oldi","baseMinusT","out","encode","currentValue","basicLength","handledCPCount","handledCPCountPlusOne","qMinusT","toUnicode","toASCII","punycode","emojifyText","fauxDiv","whitelistLinkClasses","HTML_CHARS_REGEX","escapeHTML","LINK_REGEX","HTTP_LINK_REGEX","MENTION_REGEX","HASHTAG_REGEX","CODE_BLOCK_REGEX","CODE_BLOCK_START_REGEX","CODE_BLOCK_END_REGEX","INLINE_CODE_REGEX","TWITTER_DOMAIN_REGEX","TWITTER_MENTION_REGEX","TWITTER_MENTION_CAPTURE_REGEX","CODE_INLINE_CAPTURE_REGEX","createDOM","isDocumentFragment","tpl","_enhanceContent","returnDOM","postEnhanceDOM","enhancedContent","dom","hasLink","hasCodeBlock","noTargetBlankLinks","links","textContent","shortenLink","usernames","hasChildren","some","push","slice","textNodes","extractTextNodes","nodeValue","childNodes","blocks","pre","codeBlocks","nextParagraphs","currentBlock","nextElementSibling","next","tagName","codeText","replaceAll","rejectFilter","prevIndex","hashtagStuffedParagraphs","hashtagCount","nodeType","Node","TEXT_NODE","linkText","startsWith","imgs","img","getAttribute","naturalWidth","naturalHeight","setProperty","span","replaceChild","queueMicrotask","enhanceContent","defaultRejectFilter","defaultRejectFilterMap","fromEntries","nodeName","URL_PREFIX_REGEX","URL_DISPLAY_LENGTH","prefix","displayURL","suffix","cutoff","rejectFilterMap","assign","reduce","acc","cur","walk","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","nextNode","handleContentLinks","mentions","previewMode","statusURL","prevText","previousSibling","textBeforeLinkIsAt","endsWith","textStartsWithAt","contains","targetText","mention","textBeforeLinkIsHash","hashURL","i18nDuration","shortenNumber","num","notation","roundingMode","AccountBlock","skeleton","avatarSize","useAvatarStatic","internal","showActivity","showStats","accountInstance","hideDisplayName","relationship","excludeRelationshipAttrs","_useLingui","statusesCount","lastStatusAt","fields","note","followersCount","createdAt","locked","verifiedField","verifiedAt","excludedRelationship","hasRelationship","followedBy","requested","_t","_Trans","components","RetryOperation","timeouts","retry_operation","err","currentTime","timeoutOps","counts","mainError","mainErrorCount","require$$0","exports","attempt","obj","methods","method","original","op","retry","objectToString","isError","errorMessages","isNetworkError","AbortError","decorateErrorWithCounts","attemptNumber","retriesLeft","pRetry","resolve","reject","operation","abortHandler","cleanUp","finalError","supportsBrowserTranslator","ai","langDetector","canDetect","languageDetector","capabilities","create","monitor","detectedSourceLanguage","originalSource","results","canTranslate","translatorCapabilities","translator","sourceLanguage","targetLanguage","__defProp","__defNormalProp","__publicField","observerMap","RootIds","rootId","unsupportedValue","getRootId","optionsToId","createObserver","thresholds","entry","inView","threshold","fallbackInView","bounds","callbacks","isPlainChildren","InView","React.Component","prevProps","rootMargin","trackVisibility","as","triggerOnce","skip","initialInView","React.createElement","useInView","React2.useState","React2.useRef","React2.useEffect","unobserve","entryTarget","previousEntryTarget","TOP","shazamIDs","LazyShazam","hasID","visible","setVisible","visibleStart","setVisibleStart","getBoundingClientRect","bottom","hidden","PHANPY_LINGVA_INSTANCES","import","LINGVA_INSTANCES","throttle","pThrottle","limit","interval","currentLingvaInstance","_lingvaTranslate","fetchCall","res","fetch","ok","provider","translation","detectedSource","retries","onFailedAttempt","TRANSLATED_MAX_AGE","lingvaTranslate","pmem","forceTranslate","onTranslate","mini","autoDetected","uiState","setUIState","targetLang","setTranslatedContent","pronunciationContent","detailsRef","translatedContent","sourceLangText","targetLangText","apiSourceLang","browserTranslate","throttledLingvaTranslate","detectedLangText","setDetectedLang","pronunciation","query","setPronunciationContent","detectedLang","sourceLanguages","common","showCommon","native","abrupt","TranslationBlock$1","TranslationBlock","promisifyRequest","request","createStore","dbName","storeName","dbp","txMode","db","defaultGetStoreFunc","defaultGetStore","customStore","set","getMany","del","delMany","clear","eachCursor","cursor","initDB","val","drafts","catchup","fetchRelationships","accounts","relationshipsMap","masto","currentAccount","getCurrentAccountID","uniqueAccountIds","v1","relationships","LiteYTEmbed","shadowDom","nonce","oldVal","newVal","eleNoScript","isIntersectionObserver","autoplay","wantsNoCookie","embedTarget","iframeHTML","webpUrl","posterUrlWebp","posterUrlJpeg","kind","linkElem","context","digitLookup","decode83","start","end","pow","PI","PI2","sRGBToLinear","linearTosRGB","signSqr","fastCos","cos","getBlurHashAverageColor","blurHash","decodeBlurHash","punch","sizeFlag","numX","numY","basis","basisY","colorIndex","pixelIndex","maximumValue","colors","averageColor","cosinesY","cosinesX","bytesPerRow","pixels","addIndentation_1","splittedHtml","char","level","opened","indented","elTag","newIndented","removeEmptyLines","nonFormattedString","toLines","markup","splittedMarkup","mergedLines","currentElement","line","addIndentation","mergeAttributesWithElements","require$$1","splitted","Poll","readOnly","votePoll","expired","expiresAt","ownVotes","voted","votersCount","votesCount","expiresAtDate","pollVotesCount","roundPrecision","showResults","setShowResults","optionsHaveVoteCounts","every","option","optionVotesCount","ratio","percentage","isLeading","onSubmit","form","formData","FormData","choices","1","FilterContext","_isFiltered","filtered","filterContext","appliedFilters","hasContext","filterAction","action","filterTitles","titles","titlesStr","isFiltered","filteredItem","currentAccountID","filterState","filteredItems","htmlContentLength","supportsTTS","speechSynthesis","speaking","cancel","utterance","SpeechSynthesisUtterance","F","useResolvedElement","subscriber","refOrElement","lastReportRef","refOrElementRef","cbElementRef","evaluateSubscription","cbElement","extractSize","boxProp","sizeType","useResizeObserver","onResize","onResizeRef","resizeObserverRef","didUnmount","previous","refCallback","reportedWidth","reportedHeight","newWidth","newHeight","newSize","useTruncated","useThrottledCallback","scrollHeight","truncated","_height","computedHeight","box","visibilityIconsMap","public","unlisted","private","direct","styleRoot","styleChild","styles","isSsr","isTouch","make3dTransformValue","scale","getOffsetBounds","containerDimension","childDimension","centerContained","diff","classnames","other","sqrt","isMac","isDragInteraction","isZoomInteraction","isZoomGesture","wheelEvent","cancelEvent","getDistance","calculateScale","startTouches","endTouches","startDistance","endDistance","isCloseTo","expected","swing","getPointByPageCoordinates","touch","getPageCoordinatesByTouches","touches","sum","getVectorAvg","vectors","clamp","shouldInterceptWheel","getElementSize","offsetWidth","offsetHeight","calculateVelocity","startPoint","endPoint","comparePoints","p1","p2","noup","zeroPoint","PinchZoom","_super","__extends","_this","__assign","createRef","clickEvent","touchEndEvent","touchStartEvent","touchMoveEvent","pageX","pageY","deltaY","deltaMode","scaleDelta","likeTouchEvent","center","dScale","inertiaFriction","inertia","renderFrame","prevOffset","currentCoordinates","prevPoint","newScale","touchCenter","needZoomOut","zoomFactor","startZoomFactor","updateProgress","progress","elWidth","elHeight","minOffsetX","maxOffsetX","_c","minOffsetY","maxOffsetY","__x","__y","animated","startOffset","containerCenter","diffZoomFactor","diffOffset","updateFrame","originalZoomFactor","lastCenter","sanitizedOffset","targetOffset","scaleFactor","offsetLeft","offsetTop","_document","_html","_body","scrollTop","scrollLeft","posTop","posLeft","frameFn","startTime","timeFn","frameTime","xZoomFactor","yZoomFactor","eventName","_i","newInteraction","interaction","fingers","mouseEvent","isEnd","isStart","child","Children","React","any","object","func","bool","formatDuration","hours","minutes","toString","padStart","dataAltLabel","AltBadge","showMediaAlt","MEDIA_CAPTION_LIMIT","MEDIA_CAPTION_LIMIT_LONGER","isMediaCaptionLong","caption","Media","showOriginal","autoAnimate","showCaption","allowLongerCaption","altIndex","checkAspectRatio","blurhash","previewRemoteUrl","previewUrl","remoteUrl","small","mediaURL","remoteMediaURL","hasDimensions","orientation","rgbAverageColor","videoRef","focalPosition","toFixed","mediaRef","onUpdate","removeProperty","touchAction","pinchZoomEnabled","setPinchZoomEnabled","quickPinchZoomProps","draggableUnZoomed","tapZoomFactor","doubleTapToggleZoom","mediaLoadError","setMediaLoadError","Parent","remoteMediaURLObj","getURLObj","isVideoMaybe","isAudioMaybe","isImage","parentRef","imageSmallerThanParent","setImageSmallerThanParent","smaller","maxAspectHeight","averageColorStyle","mediaStyles","aspectRatio","longDesc","showInlineDesc","Figure","hasNaturalAspectRatio","setHasNaturalAspectRatio","display","mode","backgroundImage","backgroundSize","QuickPinchZoom","objectPosition","$media","clientWidth","clientHeight","minDimension","hasSmallDimension","displayNaturalHeight","hasDuration","shortDuration","isGIF","loopable","formattedDuration","hoverAnimate","autoGIFAnimate","showProgress","gifHTML","videoHTML","pause","onMouseEnter","onMouseLeave","onFocus","poster","preload","playsinline","loop","muted","onTimeUpdate","disablePictureInPicture","onLoadedMetadata","controls","autoPlay","oldProps","newProps","oldMedia","newMedia","SHOW_COMMENT_COUNT_LIMIT","INLINE_TRANSLATE_LIMIT","fetchAccount","$select","memFetchAccount","visibilityText","isIOS","ontouchstart","REACTIONS_LIMIT","getPollText","getPostText","forgivingQSA","selectors","selector","isTranslateble","getHTMLTextForDetectLang","emojisRegex","HTTP_REGEX","PostContent","post","language","divRef","replaceChildren","cloneNode","SIZE_CLASS","detectLang","langs","detect","groupCollapsed","detectedLanguage","langs2","lang2","detectAll","readMoreText","DIFFERENT_LANG_CHECK","checkDifferentLanguage","contentTranslationHideLanguages","different","statusID","contentTextWeight","enableCommentHint","withinContext","enableTranslate","onMediaClick","quoted","onStatusLinkClick","allowContextMenu","showFollowedTags","showActionsBar","showReplyParent","mediaFirst","authenticated","propInstance","currentInstance","statusKey","sameInstance","snapStates","sKey","accountEmojis","repliesCount","reblogged","reblogsCount","favourited","favouritesCount","bookmarked","sensitive","visibility","editedAt","card","inReplyToId","inReplyToAccountId","reblog","uri","pinned","_pinned","emojiReactions","languageAutoDetected","_language","detected","setLanguageAutoDetected","hasMediaAttachments","isSelf","accountId","filterInfo","debugHover","FilteredStatus","createdAtDate","inReplyToAccountRef","accountURL","editedAtDate","inReplyToAccount","account2","setInReplyToAccount","catch","readingExpandMedia","mentionSelf","readingExpandSpoilers","showSpoiler","showSpoilerMedia","Status","FollowedTagsParent","StatusParent","setForceTranslate","_forceTranslate","contentTranslation","contentTranslationAutoInline","isSizeLarge","inlineTranslate","spoilerContentRef","contentRef","contentLength","statusRef","unauthInteractionErrorMessage","canBoost","textWeight","createdDateText","editedDateText","mediaNoDesc","statusMonthsAgo","confirmBoostStatus","newStatus","statuses","saveStatus","favouriteStatus","done","bookmarkStatus","differentLanguage","setDifferentLanguage","reblogIterator","fetchBoostedLikedByAccounts","firstLoad","reblogResults","favouriteResults","Promise","_types","actionsRef","replyStatus","draftStatus","favouriteStatusNotify","bookmarkStatusNotify","fetchAccounts","postText","setShowEdited","nicePostURL","isPublic","setShowEmbed","isPinnable","editStatus","cachedStatus","getStatus","isContextMenuOpen","showContextMenu","_deleted","bindLongPressContext","useLongPress","clientX","setContextMenuProps","contextMenuRef","clientY","hotkeysEnabled","rRef","fRef","setIsContextMenuOpen","bRef","activeStatus","spoilerButton","spoilerMediaButton","xRef","displayedMediaAttachments","showMultipleMediaCaptions","attachments","captionChildren","indices","isThread","statusThreadNumber","showCommentHint","StatusCompact","showCommentCount","nodeRef","containsQuestion","dRef","selection","anchorNode","contextMenuProps","StatusMenuItems","StatusButton","spoilers","MediaFirstContainer","newPoll","polls","pollResponse","spoilersMedia","MultipleMediaFigure","mediaContainerRef","selfReferential","selfAuthor","emojiReaction","me","url2","isShortCode","showEdited","EditedAtModal","fetchStatusHistory","moreThanOne","carouselRef","postID","currentIndex","setCurrentIndex","behavior","getDomain","isCardPost","Byline","authors","author","Card","providerName","providerUrl","authorName","authorUrl","embedUrl","isLandscape","imageDescription","publishedAt","hasText","cardStatusURL","unfurlMastodonLink","hasIframeHTML","blurhashImage","setBlurhashImage","unfurledLinks","imageData","blurhashPixels","blob","putImageData","convertToBlob","isPost","videoID","_t2","setEditHistory","editHistory2","editHistory","Loader","generateHTMLCode","quotes","arr","findIndex","contentHTML","sourceMediaURL","previewMediaURL","sourceMediaURLObj","mediaHTML","isAudio","prettify","htmlCode","EmbedModal","_t3","download","buttonTitle","setButtonTitle","iconAlt","urlObj","otherProps","restPath","path","host","statusReply","filterTitleStr","srKey","statusPeekText","_t4","isReblog","isFollowedTags","bindLongPressPeek","setShowPeek","captureEvent","ssKey","statusPeekRef","actualStatusID","uniqueQuotes","q2","QuoteStatuses","restOldProps","restNewProps","shallowEqual","IDX","HEX","len","isArray","getTag","INFINITY","baseToString","isString","isNumber","isBoolean","isObjectLike","isObject","isDefined","isBlank","INCORRECT_INDEX_TYPE","LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY","PATTERN_LENGTH_TOO_LARGE","MISSING_KEY_PROPERTY","INVALID_KEY_WEIGHT_VALUE","hasOwn","KeyStore","totalWeight","createKey","keyId","weight","getFn","createKeyPath","createKeyId","deepGet","MatchOptions","BasicOptions","FuzzyOptions","AdvancedOptions","Config","SPACE","norm","mantissa","cache","numTokens","FuseIndex","fieldNormWeight","docs","records","idx","doc","docIndex","record","keyIndex","subRecords","stack","nestedArrIndex","subRecord","createIndex","myIndex","parseIndex","computeScore$1","pattern","currentLocation","expectedLocation","distance","ignoreLocation","accuracy","proximity","convertMaskToIndices","matchmask","minMatchCharLength","MAX_BITS","patternAlphabet","findAllMatches","includeMatches","patternLen","textLen","currentThreshold","bestLocation","computeMatches","matchMask","score","lastBitArr","finalScore","binMax","mask","binMin","binMid","finish","bitArr","charMatch","createPatternAlphabet","stripDiacritics","BitapSearch","isCaseSensitive","ignoreDiacritics","addChunk","startIndex","remainder","allIndices","totalScore","hasMatches","alphabet","isMatch","BaseMatch","getMatch","exp","matches","ExactMatch","InverseExactMatch","PrefixExactMatch","InversePrefixExactMatch","SuffixExactMatch","InverseSuffixExactMatch","FuzzyMatch","IncludeMatch","searchers","searchersLen","SPACE_RE","OR_TOKEN","parseQuery","queryItem","found","searcher","token","MultiMatchSet","ExtendedSearch","numMatches","qLen","pLen","registeredSearchers","register","createSearcher","searcherClass","LogicalOperator","KeyType","isExpression","isPath","isLeaf","convertToExplicit","auto","isQueryPath","computeScore","ignoreFieldNorm","transformMatches","transformScore","includeScore","transformers","transformer","Fuse","predicate","shouldSort","sortFn","expression","evaluate","resultMap","expResults","MIN_SCHEDULED_AT","MAX_SCHEDULED_AT","ScheduledAtField","scheduledAt","setScheduledAt","minStr","setMinStr","timezoneOffset","updateMinStr","updateMaxStr","setMaxStr","intervalId","defaultValue","maxStr","required","getLocalTimezoneName","formatToParts","part"],"ignoreList":[0,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,64,71,72,73,74,75,77,80,83,84,85,86,87,93,94,97,98,99,100,104,105],"sources":["../../node_modules/react-hotkeys-hook/dist/react-hotkeys-hook.esm.js","../../node_modules/toastify-js/src/toastify.js","../../src/utils/show-toast.js","../../src/utils/useInterval.js","../../node_modules/@szhsin/react-menu/dist/es/utils/utils.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useBEM.js","../../node_modules/@szhsin/react-menu/dist/es/utils/constants.js","../../node_modules/@szhsin/react-menu/dist/es/components/MenuContainer.js","../../node_modules/@szhsin/react-menu/dist/es/utils/submenuCtx.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useItems.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/getNormalizedClientRect.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/getPositionHelpers.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/placeArrowVertical.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/placeLeftorRight.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/placeArrowHorizontal.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/placeToporBottom.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/positionMenu.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useIsomorphicLayoutEffect.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useCombinedRef.js","../../node_modules/@szhsin/react-menu/dist/es/components/MenuList.js","../../node_modules/@szhsin/react-menu/dist/es/components/ControlledMenu.js","../../node_modules/react-transition-state/dist/es/hooks/utils.js","../../node_modules/react-transition-state/dist/es/hooks/useTransitionState.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useMenuState.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useMenuStateAndFocus.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useClick.js","../../node_modules/@szhsin/react-menu/dist/es/components/Menu.js","../../node_modules/@szhsin/react-menu/dist/es/utils/withHovering.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useItemEffect.js","../../node_modules/@szhsin/react-menu/dist/es/components/SubMenu.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useItemState.js","../../node_modules/@szhsin/react-menu/dist/es/components/MenuItem.js","../../node_modules/@szhsin/react-menu/dist/es/components/FocusableItem.js","../../node_modules/@szhsin/react-menu/dist/es/components/MenuDivider.js","../../node_modules/@szhsin/react-menu/dist/es/components/MenuHeader.js","../../node_modules/@szhsin/react-menu/dist/es/components/MenuGroup.js","../../node_modules/use-long-press/index.mjs","../../src/utils/nice-date-time.js","../../src/utils/open-compose.js","../../src/utils/open-osk.js","../../src/utils/safe-bounding-box-padding.js","../../src/utils/show-compose.js","../../src/utils/getHTMLText.js","../../src/utils/status-peek.js","../../src/components/ICONS.jsx","../../src/components/icon.jsx","../../src/components/link.jsx","../../src/components/menu-link.jsx","../../src/components/relative-time.jsx","../../src/components/submenu2.jsx","../../src/utils/useCloseWatcher.js","../../src/components/modal.jsx","../../src/components/avatar.jsx","../../src/utils/is-rtl.js","../../src/utils/useWindowSize.js","../../src/components/menu2.jsx","../../src/components/menu-confirm.jsx","../../src/components/custom-emoji.jsx","../../src/components/emoji-text.jsx","../../src/components/name-text.jsx","../../src/utils/localeCode2Text.js","../../src/utils/get-translate-target-language.js","../../src/utils/pretty-bytes.js","../../src/utils/supports.js","../../node_modules/punycode/punycode.es6.js","../../src/utils/emojify-text.js","../../src/utils/enhance-content.js","../../src/utils/handle-content-links.js","../../src/utils/i18n-duration.js","../../src/utils/shorten-number.js","../../src/components/account-block.jsx","../../node_modules/retry/lib/retry_operation.js","../../node_modules/retry/lib/retry.js","../../node_modules/retry/index.js","../../node_modules/is-network-error/index.js","../../node_modules/p-retry/index.js","../../src/utils/browser-translator.js","../../node_modules/react-intersection-observer/dist/index.mjs","../../src/components/lazy-shazam.jsx","../../src/components/translation-block.jsx","../../node_modules/idb-keyval/dist/index.js","../../src/utils/db.js","../../src/utils/relationships.js","../../node_modules/@justinribeiro/lite-youtube/lite-youtube.js","../../node_modules/fast-blurhash/index.js","../../node_modules/html-prettify/src/utils/addIndentation.js","../../node_modules/html-prettify/src/utils/toLines.js","../../node_modules/html-prettify/src/index.js","../../src/components/poll.jsx","../../src/utils/filter-context.js","../../src/utils/filters.js","../../src/utils/html-content-length.js","../../src/utils/speech.js","../../node_modules/use-debounce/dist/index.module.js","../../node_modules/use-resize-observer/dist/bundle.esm.js","../../src/utils/useTruncated.js","../../src/utils/visibility-icons-map.js","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/styles.css.js","../../node_modules/react-quick-pinch-zoom/esm/utils.js","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/getOffsetBounds.js","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/component.js","../../src/utils/format-duration.js","../../src/components/media.jsx","../../src/components/status.jsx","../../node_modules/uid/single/index.mjs","../../node_modules/fuse.js/dist/fuse.mjs","../../src/components/ScheduledAtField.jsx"],"sourcesContent":["import { useContext, createContext, useState, useCallback, useRef, useLayoutEffect, useEffect } from 'react';\nimport { jsx } from 'react/jsx-runtime';\n\nfunction _extends() {\n  return _extends = Object.assign ? Object.assign.bind() : function (n) {\n    for (var e = 1; e < arguments.length; e++) {\n      var t = arguments[e];\n      for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n    }\n    return n;\n  }, _extends.apply(null, arguments);\n}\n\nvar reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl'];\nvar mappedKeys = {\n  esc: 'escape',\n  \"return\": 'enter',\n  '.': 'period',\n  ',': 'comma',\n  '-': 'slash',\n  ' ': 'space',\n  '`': 'backquote',\n  '#': 'backslash',\n  '+': 'bracketright',\n  ShiftLeft: 'shift',\n  ShiftRight: 'shift',\n  AltLeft: 'alt',\n  AltRight: 'alt',\n  MetaLeft: 'meta',\n  MetaRight: 'meta',\n  OSLeft: 'meta',\n  OSRight: 'meta',\n  ControlLeft: 'ctrl',\n  ControlRight: 'ctrl'\n};\nfunction mapKey(key) {\n  return (key && mappedKeys[key] || key || '').trim().toLowerCase().replace(/key|digit|numpad|arrow/, '');\n}\nfunction isHotkeyModifier(key) {\n  return reservedModifierKeywords.includes(key);\n}\nfunction parseKeysHookInput(keys, splitKey) {\n  if (splitKey === void 0) {\n    splitKey = ',';\n  }\n  return keys.split(splitKey);\n}\nfunction parseHotkey(hotkey, combinationKey, description) {\n  if (combinationKey === void 0) {\n    combinationKey = '+';\n  }\n  var keys = hotkey.toLocaleLowerCase().split(combinationKey).map(function (k) {\n    return mapKey(k);\n  });\n  var modifiers = {\n    alt: keys.includes('alt'),\n    ctrl: keys.includes('ctrl') || keys.includes('control'),\n    shift: keys.includes('shift'),\n    meta: keys.includes('meta'),\n    mod: keys.includes('mod')\n  };\n  var singleCharKeys = keys.filter(function (k) {\n    return !reservedModifierKeywords.includes(k);\n  });\n  return _extends({}, modifiers, {\n    keys: singleCharKeys,\n    description: description,\n    hotkey: hotkey\n  });\n}\n\n(function () {\n  if (typeof document !== 'undefined') {\n    document.addEventListener('keydown', function (e) {\n      if (e.key === undefined) {\n        // Synthetic event (e.g., Chrome autofill).  Ignore.\n        return;\n      }\n      pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)]);\n    });\n    document.addEventListener('keyup', function (e) {\n      if (e.key === undefined) {\n        // Synthetic event (e.g., Chrome autofill).  Ignore.\n        return;\n      }\n      removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)]);\n    });\n  }\n  if (typeof window !== 'undefined') {\n    window.addEventListener('blur', function () {\n      currentlyPressedKeys.clear();\n    });\n  }\n})();\nvar currentlyPressedKeys = /*#__PURE__*/new Set();\n// https://github.com/microsoft/TypeScript/issues/17002\nfunction isReadonlyArray(value) {\n  return Array.isArray(value);\n}\nfunction isHotkeyPressed(key, splitKey) {\n  if (splitKey === void 0) {\n    splitKey = ',';\n  }\n  var hotkeyArray = isReadonlyArray(key) ? key : key.split(splitKey);\n  return hotkeyArray.every(function (hotkey) {\n    return currentlyPressedKeys.has(hotkey.trim().toLowerCase());\n  });\n}\nfunction pushToCurrentlyPressedKeys(key) {\n  var hotkeyArray = Array.isArray(key) ? key : [key];\n  /*\r\n  Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\r\n  https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\r\n  Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\r\n   */\n  if (currentlyPressedKeys.has('meta')) {\n    currentlyPressedKeys.forEach(function (key) {\n      return !isHotkeyModifier(key) && currentlyPressedKeys[\"delete\"](key.toLowerCase());\n    });\n  }\n  hotkeyArray.forEach(function (hotkey) {\n    return currentlyPressedKeys.add(hotkey.toLowerCase());\n  });\n}\nfunction removeFromCurrentlyPressedKeys(key) {\n  var hotkeyArray = Array.isArray(key) ? key : [key];\n  /*\r\n  Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\r\n  https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\r\n  Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\r\n   */\n  if (key === 'meta') {\n    currentlyPressedKeys.clear();\n  } else {\n    hotkeyArray.forEach(function (hotkey) {\n      return currentlyPressedKeys[\"delete\"](hotkey.toLowerCase());\n    });\n  }\n}\n\nfunction maybePreventDefault(e, hotkey, preventDefault) {\n  if (typeof preventDefault === 'function' && preventDefault(e, hotkey) || preventDefault === true) {\n    e.preventDefault();\n  }\n}\nfunction isHotkeyEnabled(e, hotkey, enabled) {\n  if (typeof enabled === 'function') {\n    return enabled(e, hotkey);\n  }\n  return enabled === true || enabled === undefined;\n}\nfunction isKeyboardEventTriggeredByInput(ev) {\n  return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select']);\n}\nfunction isHotkeyEnabledOnTag(event, enabledOnTags) {\n  if (enabledOnTags === void 0) {\n    enabledOnTags = false;\n  }\n  var target = event.target,\n    composed = event.composed;\n  var targetTagName = null;\n  if (isCustomElement(target) && composed) {\n    targetTagName = event.composedPath()[0] && event.composedPath()[0].tagName;\n  } else {\n    targetTagName = target && target.tagName;\n  }\n  if (isReadonlyArray(enabledOnTags)) {\n    return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(function (tag) {\n      var _targetTagName;\n      return tag.toLowerCase() === ((_targetTagName = targetTagName) == null ? void 0 : _targetTagName.toLowerCase());\n    }));\n  }\n  return Boolean(targetTagName && enabledOnTags && enabledOnTags);\n}\nfunction isCustomElement(element) {\n  // We just do a basic check w/o any complex RegEx or validation against the list of legacy names containing a hyphen,\n  // as none of them is likely to be an event target, and it won't hurt anyway if we miss.\n  // see: https://html.spec.whatwg.org/multipage/custom-elements.html#prod-potentialcustomelementname\n  return !!element.tagName && !element.tagName.startsWith(\"-\") && element.tagName.includes(\"-\");\n}\nfunction isScopeActive(activeScopes, scopes) {\n  if (activeScopes.length === 0 && scopes) {\n    console.warn('A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>');\n    return true;\n  }\n  if (!scopes) {\n    return true;\n  }\n  return activeScopes.some(function (scope) {\n    return scopes.includes(scope);\n  }) || activeScopes.includes('*');\n}\nvar isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, hotkey, ignoreModifiers) {\n  if (ignoreModifiers === void 0) {\n    ignoreModifiers = false;\n  }\n  var alt = hotkey.alt,\n    meta = hotkey.meta,\n    mod = hotkey.mod,\n    shift = hotkey.shift,\n    ctrl = hotkey.ctrl,\n    keys = hotkey.keys;\n  var pressedKeyUppercase = e.key,\n    code = e.code,\n    ctrlKey = e.ctrlKey,\n    metaKey = e.metaKey,\n    shiftKey = e.shiftKey,\n    altKey = e.altKey;\n  var keyCode = mapKey(code);\n  var pressedKey = pressedKeyUppercase.toLowerCase();\n  if (!(keys != null && keys.includes(keyCode)) && !(keys != null && keys.includes(pressedKey)) && !['ctrl', 'control', 'unknown', 'meta', 'alt', 'shift', 'os'].includes(keyCode)) {\n    return false;\n  }\n  if (!ignoreModifiers) {\n    // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n    if (alt === !altKey && pressedKey !== 'alt') {\n      return false;\n    }\n    if (shift === !shiftKey && pressedKey !== 'shift') {\n      return false;\n    }\n    // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n    if (mod) {\n      if (!metaKey && !ctrlKey) {\n        return false;\n      }\n    } else {\n      if (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n        return false;\n      }\n      if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n        return false;\n      }\n    }\n  }\n  // All modifiers are correct, now check the key\n  // If the key is set, we check for the key\n  if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n    return true;\n  } else if (keys) {\n    // Check if all keys are present in pressedDownKeys set\n    return isHotkeyPressed(keys);\n  } else if (!keys) {\n    // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n    return true;\n  }\n  // There is nothing that matches.\n  return false;\n};\n\nvar BoundHotkeysProxyProvider = /*#__PURE__*/createContext(undefined);\nvar useBoundHotkeysProxy = function useBoundHotkeysProxy() {\n  return useContext(BoundHotkeysProxyProvider);\n};\nfunction BoundHotkeysProxyProviderProvider(_ref) {\n  var addHotkey = _ref.addHotkey,\n    removeHotkey = _ref.removeHotkey,\n    children = _ref.children;\n  return /*#__PURE__*/jsx(BoundHotkeysProxyProvider.Provider, {\n    value: {\n      addHotkey: addHotkey,\n      removeHotkey: removeHotkey\n    },\n    children: children\n  });\n}\n\nfunction deepEqual(x, y) {\n  //@ts-ignore\n  return x && y && typeof x === 'object' && typeof y === 'object' ? Object.keys(x).length === Object.keys(y).length &&\n  //@ts-ignore\n  Object.keys(x).reduce(function (isEqual, key) {\n    return isEqual && deepEqual(x[key], y[key]);\n  }, true) : x === y;\n}\n\nvar HotkeysContext = /*#__PURE__*/createContext({\n  hotkeys: [],\n  enabledScopes: [],\n  toggleScope: function toggleScope() {},\n  enableScope: function enableScope() {},\n  disableScope: function disableScope() {}\n});\nvar useHotkeysContext = function useHotkeysContext() {\n  return useContext(HotkeysContext);\n};\nvar HotkeysProvider = function HotkeysProvider(_ref) {\n  var _ref$initiallyActiveS = _ref.initiallyActiveScopes,\n    initiallyActiveScopes = _ref$initiallyActiveS === void 0 ? ['*'] : _ref$initiallyActiveS,\n    children = _ref.children;\n  var _useState = useState((initiallyActiveScopes == null ? void 0 : initiallyActiveScopes.length) > 0 ? initiallyActiveScopes : ['*']),\n    internalActiveScopes = _useState[0],\n    setInternalActiveScopes = _useState[1];\n  var _useState2 = useState([]),\n    boundHotkeys = _useState2[0],\n    setBoundHotkeys = _useState2[1];\n  var enableScope = useCallback(function (scope) {\n    setInternalActiveScopes(function (prev) {\n      if (prev.includes('*')) {\n        return [scope];\n      }\n      return Array.from(new Set([].concat(prev, [scope])));\n    });\n  }, []);\n  var disableScope = useCallback(function (scope) {\n    setInternalActiveScopes(function (prev) {\n      if (prev.filter(function (s) {\n        return s !== scope;\n      }).length === 0) {\n        return ['*'];\n      } else {\n        return prev.filter(function (s) {\n          return s !== scope;\n        });\n      }\n    });\n  }, []);\n  var toggleScope = useCallback(function (scope) {\n    setInternalActiveScopes(function (prev) {\n      if (prev.includes(scope)) {\n        if (prev.filter(function (s) {\n          return s !== scope;\n        }).length === 0) {\n          return ['*'];\n        } else {\n          return prev.filter(function (s) {\n            return s !== scope;\n          });\n        }\n      } else {\n        if (prev.includes('*')) {\n          return [scope];\n        }\n        return Array.from(new Set([].concat(prev, [scope])));\n      }\n    });\n  }, []);\n  var addBoundHotkey = useCallback(function (hotkey) {\n    setBoundHotkeys(function (prev) {\n      return [].concat(prev, [hotkey]);\n    });\n  }, []);\n  var removeBoundHotkey = useCallback(function (hotkey) {\n    setBoundHotkeys(function (prev) {\n      return prev.filter(function (h) {\n        return !deepEqual(h, hotkey);\n      });\n    });\n  }, []);\n  return /*#__PURE__*/jsx(HotkeysContext.Provider, {\n    value: {\n      enabledScopes: internalActiveScopes,\n      hotkeys: boundHotkeys,\n      enableScope: enableScope,\n      disableScope: disableScope,\n      toggleScope: toggleScope\n    },\n    children: /*#__PURE__*/jsx(BoundHotkeysProxyProviderProvider, {\n      addHotkey: addBoundHotkey,\n      removeHotkey: removeBoundHotkey,\n      children: children\n    })\n  });\n};\n\nfunction useDeepEqualMemo(value) {\n  var ref = useRef(undefined);\n  if (!deepEqual(ref.current, value)) {\n    ref.current = value;\n  }\n  return ref.current;\n}\n\nvar stopPropagation = function stopPropagation(e) {\n  e.stopPropagation();\n  e.preventDefault();\n  e.stopImmediatePropagation();\n};\nvar useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\nfunction useHotkeys(keys, callback, options, dependencies) {\n  var _useState = useState(null),\n    ref = _useState[0],\n    setRef = _useState[1];\n  var hasTriggeredRef = useRef(false);\n  var _options = !(options instanceof Array) ? options : !(dependencies instanceof Array) ? dependencies : undefined;\n  var _keys = isReadonlyArray(keys) ? keys.join(_options == null ? void 0 : _options.splitKey) : keys;\n  var _deps = options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined;\n  var memoisedCB = useCallback(callback, _deps != null ? _deps : []);\n  var cbRef = useRef(memoisedCB);\n  if (_deps) {\n    cbRef.current = memoisedCB;\n  } else {\n    cbRef.current = callback;\n  }\n  var memoisedOptions = useDeepEqualMemo(_options);\n  var _useHotkeysContext = useHotkeysContext(),\n    enabledScopes = _useHotkeysContext.enabledScopes;\n  var proxy = useBoundHotkeysProxy();\n  useSafeLayoutEffect(function () {\n    if ((memoisedOptions == null ? void 0 : memoisedOptions.enabled) === false || !isScopeActive(enabledScopes, memoisedOptions == null ? void 0 : memoisedOptions.scopes)) {\n      return;\n    }\n    var listener = function listener(e, isKeyUp) {\n      var _e$target;\n      if (isKeyUp === void 0) {\n        isKeyUp = false;\n      }\n      if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions == null ? void 0 : memoisedOptions.enableOnFormTags)) {\n        return;\n      }\n      // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n      // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n      if (ref !== null) {\n        var rootNode = ref.getRootNode();\n        if ((rootNode instanceof Document || rootNode instanceof ShadowRoot) && rootNode.activeElement !== ref && !ref.contains(rootNode.activeElement)) {\n          stopPropagation(e);\n          return;\n        }\n      }\n      if ((_e$target = e.target) != null && _e$target.isContentEditable && !(memoisedOptions != null && memoisedOptions.enableOnContentEditable)) {\n        return;\n      }\n      parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {\n        var _hotkey$keys;\n        var hotkey = parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey);\n        if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.ignoreModifiers) || (_hotkey$keys = hotkey.keys) != null && _hotkey$keys.includes('*')) {\n          if (memoisedOptions != null && memoisedOptions.ignoreEventWhen != null && memoisedOptions.ignoreEventWhen(e)) {\n            return;\n          }\n          if (isKeyUp && hasTriggeredRef.current) {\n            return;\n          }\n          maybePreventDefault(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.preventDefault);\n          if (!isHotkeyEnabled(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.enabled)) {\n            stopPropagation(e);\n            return;\n          }\n          // Execute the user callback for that hotkey\n          cbRef.current(e, hotkey);\n          if (!isKeyUp) {\n            hasTriggeredRef.current = true;\n          }\n        }\n      });\n    };\n    var handleKeyDown = function handleKeyDown(event) {\n      if (event.key === undefined) {\n        // Synthetic event (e.g., Chrome autofill).  Ignore.\n        return;\n      }\n      pushToCurrentlyPressedKeys(mapKey(event.code));\n      if ((memoisedOptions == null ? void 0 : memoisedOptions.keydown) === undefined && (memoisedOptions == null ? void 0 : memoisedOptions.keyup) !== true || memoisedOptions != null && memoisedOptions.keydown) {\n        listener(event);\n      }\n    };\n    var handleKeyUp = function handleKeyUp(event) {\n      if (event.key === undefined) {\n        // Synthetic event (e.g., Chrome autofill).  Ignore.\n        return;\n      }\n      removeFromCurrentlyPressedKeys(mapKey(event.code));\n      hasTriggeredRef.current = false;\n      if (memoisedOptions != null && memoisedOptions.keyup) {\n        listener(event, true);\n      }\n    };\n    var domNode = ref || (_options == null ? void 0 : _options.document) || document;\n    // @ts-ignore\n    domNode.addEventListener('keyup', handleKeyUp);\n    // @ts-ignore\n    domNode.addEventListener('keydown', handleKeyDown);\n    if (proxy) {\n      parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {\n        return proxy.addHotkey(parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey, memoisedOptions == null ? void 0 : memoisedOptions.description));\n      });\n    }\n    return function () {\n      // @ts-ignore\n      domNode.removeEventListener('keyup', handleKeyUp);\n      // @ts-ignore\n      domNode.removeEventListener('keydown', handleKeyDown);\n      if (proxy) {\n        parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {\n          return proxy.removeHotkey(parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey, memoisedOptions == null ? void 0 : memoisedOptions.description));\n        });\n      }\n    };\n  }, [ref, _keys, memoisedOptions, enabledScopes]);\n  return setRef;\n}\n\nfunction useRecordHotkeys() {\n  var _useState = useState(new Set()),\n    keys = _useState[0],\n    setKeys = _useState[1];\n  var _useState2 = useState(false),\n    isRecording = _useState2[0],\n    setIsRecording = _useState2[1];\n  var handler = useCallback(function (event) {\n    if (event.key === undefined) {\n      // Synthetic event (e.g., Chrome autofill).  Ignore.\n      return;\n    }\n    event.preventDefault();\n    event.stopPropagation();\n    setKeys(function (prev) {\n      var newKeys = new Set(prev);\n      newKeys.add(mapKey(event.code));\n      return newKeys;\n    });\n  }, []);\n  var stop = useCallback(function () {\n    if (typeof document !== 'undefined') {\n      document.removeEventListener('keydown', handler);\n      setIsRecording(false);\n    }\n  }, [handler]);\n  var start = useCallback(function () {\n    setKeys(new Set());\n    if (typeof document !== 'undefined') {\n      stop();\n      document.addEventListener('keydown', handler);\n      setIsRecording(true);\n    }\n  }, [handler, stop]);\n  var resetKeys = useCallback(function () {\n    setKeys(new Set());\n  }, []);\n  return [keys, {\n    start: start,\n    stop: stop,\n    resetKeys: resetKeys,\n    isRecording: isRecording\n  }];\n}\n\nexport { HotkeysProvider, isHotkeyPressed, useHotkeys, useHotkeysContext, useRecordHotkeys };\n//# sourceMappingURL=react-hotkeys-hook.esm.js.map\n","/*!\n * Toastify js 1.12.0\n * https://github.com/apvarun/toastify-js\n * @license MIT licensed\n *\n * Copyright (C) 2018 Varun A P\n */\n(function(root, factory) {\n  if (typeof module === \"object\" && module.exports) {\n    module.exports = factory();\n  } else {\n    root.Toastify = factory();\n  }\n})(this, function(global) {\n  // Object initialization\n  var Toastify = function(options) {\n      // Returning a new init object\n      return new Toastify.lib.init(options);\n    },\n    // Library version\n    version = \"1.12.0\";\n\n  // Set the default global options\n  Toastify.defaults = {\n    oldestFirst: true,\n    text: \"Toastify is awesome!\",\n    node: undefined,\n    duration: 3000,\n    selector: undefined,\n    callback: function () {\n    },\n    destination: undefined,\n    newWindow: false,\n    close: false,\n    gravity: \"toastify-top\",\n    positionLeft: false,\n    position: '',\n    backgroundColor: '',\n    avatar: \"\",\n    className: \"\",\n    stopOnFocus: true,\n    onClick: function () {\n    },\n    offset: {x: 0, y: 0},\n    escapeMarkup: true,\n    ariaLive: 'polite',\n    style: {background: ''}\n  };\n\n  // Defining the prototype of the object\n  Toastify.lib = Toastify.prototype = {\n    toastify: version,\n\n    constructor: Toastify,\n\n    // Initializing the object with required parameters\n    init: function(options) {\n      // Verifying and validating the input object\n      if (!options) {\n        options = {};\n      }\n\n      // Creating the options object\n      this.options = {};\n\n      this.toastElement = null;\n\n      // Validating the options\n      this.options.text = options.text || Toastify.defaults.text; // Display message\n      this.options.node = options.node || Toastify.defaults.node;  // Display content as node\n      this.options.duration = options.duration === 0 ? 0 : options.duration || Toastify.defaults.duration; // Display duration\n      this.options.selector = options.selector || Toastify.defaults.selector; // Parent selector\n      this.options.callback = options.callback || Toastify.defaults.callback; // Callback after display\n      this.options.destination = options.destination || Toastify.defaults.destination; // On-click destination\n      this.options.newWindow = options.newWindow || Toastify.defaults.newWindow; // Open destination in new window\n      this.options.close = options.close || Toastify.defaults.close; // Show toast close icon\n      this.options.gravity = options.gravity === \"bottom\" ? \"toastify-bottom\" : Toastify.defaults.gravity; // toast position - top or bottom\n      this.options.positionLeft = options.positionLeft || Toastify.defaults.positionLeft; // toast position - left or right\n      this.options.position = options.position || Toastify.defaults.position; // toast position - left or right\n      this.options.backgroundColor = options.backgroundColor || Toastify.defaults.backgroundColor; // toast background color\n      this.options.avatar = options.avatar || Toastify.defaults.avatar; // img element src - url or a path\n      this.options.className = options.className || Toastify.defaults.className; // additional class names for the toast\n      this.options.stopOnFocus = options.stopOnFocus === undefined ? Toastify.defaults.stopOnFocus : options.stopOnFocus; // stop timeout on focus\n      this.options.onClick = options.onClick || Toastify.defaults.onClick; // Callback after click\n      this.options.offset = options.offset || Toastify.defaults.offset; // toast offset\n      this.options.escapeMarkup = options.escapeMarkup !== undefined ? options.escapeMarkup : Toastify.defaults.escapeMarkup;\n      this.options.ariaLive = options.ariaLive || Toastify.defaults.ariaLive;\n      this.options.style = options.style || Toastify.defaults.style;\n      if(options.backgroundColor) {\n        this.options.style.background = options.backgroundColor;\n      }\n\n      // Returning the current object for chaining functions\n      return this;\n    },\n\n    // Building the DOM element\n    buildToast: function() {\n      // Validating if the options are defined\n      if (!this.options) {\n        throw \"Toastify is not initialized\";\n      }\n\n      // Creating the DOM object\n      var divElement = document.createElement(\"div\");\n      divElement.className = \"toastify on \" + this.options.className;\n\n      // Positioning toast to left or right or center\n      if (!!this.options.position) {\n        divElement.className += \" toastify-\" + this.options.position;\n      } else {\n        // To be depreciated in further versions\n        if (this.options.positionLeft === true) {\n          divElement.className += \" toastify-left\";\n          console.warn('Property `positionLeft` will be depreciated in further versions. Please use `position` instead.')\n        } else {\n          // Default position\n          divElement.className += \" toastify-right\";\n        }\n      }\n\n      // Assigning gravity of element\n      divElement.className += \" \" + this.options.gravity;\n\n      if (this.options.backgroundColor) {\n        // This is being deprecated in favor of using the style HTML DOM property\n        console.warn('DEPRECATION NOTICE: \"backgroundColor\" is being deprecated. Please use the \"style.background\" property.');\n      }\n\n      // Loop through our style object and apply styles to divElement\n      for (var property in this.options.style) {\n        divElement.style[property] = this.options.style[property];\n      }\n\n      // Announce the toast to screen readers\n      if (this.options.ariaLive) {\n        divElement.setAttribute('aria-live', this.options.ariaLive)\n      }\n\n      // Adding the toast message/node\n      if (this.options.node && this.options.node.nodeType === Node.ELEMENT_NODE) {\n        // If we have a valid node, we insert it\n        divElement.appendChild(this.options.node)\n      } else {\n        if (this.options.escapeMarkup) {\n          divElement.innerText = this.options.text;\n        } else {\n          divElement.innerHTML = this.options.text;\n        }\n\n        if (this.options.avatar !== \"\") {\n          var avatarElement = document.createElement(\"img\");\n          avatarElement.src = this.options.avatar;\n\n          avatarElement.className = \"toastify-avatar\";\n\n          if (this.options.position == \"left\" || this.options.positionLeft === true) {\n            // Adding close icon on the left of content\n            divElement.appendChild(avatarElement);\n          } else {\n            // Adding close icon on the right of content\n            divElement.insertAdjacentElement(\"afterbegin\", avatarElement);\n          }\n        }\n      }\n\n      // Adding a close icon to the toast\n      if (this.options.close === true) {\n        // Create a span for close element\n        var closeElement = document.createElement(\"button\");\n        closeElement.type = \"button\";\n        closeElement.setAttribute(\"aria-label\", \"Close\");\n        closeElement.className = \"toast-close\";\n        closeElement.innerHTML = \"&#10006;\";\n\n        // Triggering the removal of toast from DOM on close click\n        closeElement.addEventListener(\n          \"click\",\n          function(event) {\n            event.stopPropagation();\n            this.removeElement(this.toastElement);\n            window.clearTimeout(this.toastElement.timeOutValue);\n          }.bind(this)\n        );\n\n        //Calculating screen width\n        var width = window.innerWidth > 0 ? window.innerWidth : screen.width;\n\n        // Adding the close icon to the toast element\n        // Display on the right if screen width is less than or equal to 360px\n        if ((this.options.position == \"left\" || this.options.positionLeft === true) && width > 360) {\n          // Adding close icon on the left of content\n          divElement.insertAdjacentElement(\"afterbegin\", closeElement);\n        } else {\n          // Adding close icon on the right of content\n          divElement.appendChild(closeElement);\n        }\n      }\n\n      // Clear timeout while toast is focused\n      if (this.options.stopOnFocus && this.options.duration > 0) {\n        var self = this;\n        // stop countdown\n        divElement.addEventListener(\n          \"mouseover\",\n          function(event) {\n            window.clearTimeout(divElement.timeOutValue);\n          }\n        )\n        // add back the timeout\n        divElement.addEventListener(\n          \"mouseleave\",\n          function() {\n            divElement.timeOutValue = window.setTimeout(\n              function() {\n                // Remove the toast from DOM\n                self.removeElement(divElement);\n              },\n              self.options.duration\n            )\n          }\n        )\n      }\n\n      // Adding an on-click destination path\n      if (typeof this.options.destination !== \"undefined\") {\n        divElement.addEventListener(\n          \"click\",\n          function(event) {\n            event.stopPropagation();\n            if (this.options.newWindow === true) {\n              window.open(this.options.destination, \"_blank\");\n            } else {\n              window.location = this.options.destination;\n            }\n          }.bind(this)\n        );\n      }\n\n      if (typeof this.options.onClick === \"function\" && typeof this.options.destination === \"undefined\") {\n        divElement.addEventListener(\n          \"click\",\n          function(event) {\n            event.stopPropagation();\n            this.options.onClick();\n          }.bind(this)\n        );\n      }\n\n      // Adding offset\n      if(typeof this.options.offset === \"object\") {\n\n        var x = getAxisOffsetAValue(\"x\", this.options);\n        var y = getAxisOffsetAValue(\"y\", this.options);\n\n        var xOffset = this.options.position == \"left\" ? x : \"-\" + x;\n        var yOffset = this.options.gravity == \"toastify-top\" ? y : \"-\" + y;\n\n        divElement.style.transform = \"translate(\" + xOffset + \",\" + yOffset + \")\";\n\n      }\n\n      // Returning the generated element\n      return divElement;\n    },\n\n    // Displaying the toast\n    showToast: function() {\n      // Creating the DOM object for the toast\n      this.toastElement = this.buildToast();\n\n      // Getting the root element to with the toast needs to be added\n      var rootElement;\n      if (typeof this.options.selector === \"string\") {\n        rootElement = document.getElementById(this.options.selector);\n      } else if (this.options.selector instanceof HTMLElement || (typeof ShadowRoot !== 'undefined' && this.options.selector instanceof ShadowRoot)) {\n        rootElement = this.options.selector;\n      } else {\n        rootElement = document.body;\n      }\n\n      // Validating if root element is present in DOM\n      if (!rootElement) {\n        throw \"Root element is not defined\";\n      }\n\n      // Adding the DOM element\n      var elementToInsert = Toastify.defaults.oldestFirst ? rootElement.firstChild : rootElement.lastChild;\n      rootElement.insertBefore(this.toastElement, elementToInsert);\n\n      // Repositioning the toasts in case multiple toasts are present\n      Toastify.reposition();\n\n      if (this.options.duration > 0) {\n        this.toastElement.timeOutValue = window.setTimeout(\n          function() {\n            // Remove the toast from DOM\n            this.removeElement(this.toastElement);\n          }.bind(this),\n          this.options.duration\n        ); // Binding `this` for function invocation\n      }\n\n      // Supporting function chaining\n      return this;\n    },\n\n    hideToast: function() {\n      if (this.toastElement.timeOutValue) {\n        clearTimeout(this.toastElement.timeOutValue);\n      }\n      this.removeElement(this.toastElement);\n    },\n\n    // Removing the element from the DOM\n    removeElement: function(toastElement) {\n      // Hiding the element\n      // toastElement.classList.remove(\"on\");\n      toastElement.className = toastElement.className.replace(\" on\", \"\");\n\n      // Removing the element from DOM after transition end\n      window.setTimeout(\n        function() {\n          // remove options node if any\n          if (this.options.node && this.options.node.parentNode) {\n            this.options.node.parentNode.removeChild(this.options.node);\n          }\n\n          // Remove the element from the DOM, only when the parent node was not removed before.\n          if (toastElement.parentNode) {\n            toastElement.parentNode.removeChild(toastElement);\n          }\n\n          // Calling the callback function\n          this.options.callback.call(toastElement);\n\n          // Repositioning the toasts again\n          Toastify.reposition();\n        }.bind(this),\n        400\n      ); // Binding `this` for function invocation\n    },\n  };\n\n  // Positioning the toasts on the DOM\n  Toastify.reposition = function() {\n\n    // Top margins with gravity\n    var topLeftOffsetSize = {\n      top: 15,\n      bottom: 15,\n    };\n    var topRightOffsetSize = {\n      top: 15,\n      bottom: 15,\n    };\n    var offsetSize = {\n      top: 15,\n      bottom: 15,\n    };\n\n    // Get all toast messages on the DOM\n    var allToasts = document.getElementsByClassName(\"toastify\");\n\n    var classUsed;\n\n    // Modifying the position of each toast element\n    for (var i = 0; i < allToasts.length; i++) {\n      // Getting the applied gravity\n      if (containsClass(allToasts[i], \"toastify-top\") === true) {\n        classUsed = \"toastify-top\";\n      } else {\n        classUsed = \"toastify-bottom\";\n      }\n\n      var height = allToasts[i].offsetHeight;\n      classUsed = classUsed.substr(9, classUsed.length-1)\n      // Spacing between toasts\n      var offset = 15;\n\n      var width = window.innerWidth > 0 ? window.innerWidth : screen.width;\n\n      // Show toast in center if screen with less than or equal to 360px\n      if (width <= 360) {\n        // Setting the position\n        allToasts[i].style[classUsed] = offsetSize[classUsed] + \"px\";\n\n        offsetSize[classUsed] += height + offset;\n      } else {\n        if (containsClass(allToasts[i], \"toastify-left\") === true) {\n          // Setting the position\n          allToasts[i].style[classUsed] = topLeftOffsetSize[classUsed] + \"px\";\n\n          topLeftOffsetSize[classUsed] += height + offset;\n        } else {\n          // Setting the position\n          allToasts[i].style[classUsed] = topRightOffsetSize[classUsed] + \"px\";\n\n          topRightOffsetSize[classUsed] += height + offset;\n        }\n      }\n    }\n\n    // Supporting function chaining\n    return this;\n  };\n\n  // Helper function to get offset.\n  function getAxisOffsetAValue(axis, options) {\n\n    if(options.offset[axis]) {\n      if(isNaN(options.offset[axis])) {\n        return options.offset[axis];\n      }\n      else {\n        return options.offset[axis] + 'px';\n      }\n    }\n\n    return '0px';\n\n  }\n\n  function containsClass(elem, yourClass) {\n    if (!elem || typeof yourClass !== \"string\") {\n      return false;\n    } else if (\n      elem.className &&\n      elem.className\n        .trim()\n        .split(/\\s+/gi)\n        .indexOf(yourClass) > -1\n    ) {\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  // Setting up the prototype for the init object\n  Toastify.lib.init.prototype = Toastify.lib;\n\n  // Returning the Toastify function to be assigned to the window object/module\n  return Toastify;\n});\n","import Toastify from 'toastify-js';\n\nwindow._showToast = showToast;\n\nfunction showToast(props) {\n  if (typeof props === 'string') {\n    props = { text: props };\n  }\n  const { onClick, delay, ...rest } = props;\n  const toast = Toastify({\n    className: `${onClick || props.destination ? 'shiny-pill' : ''}`,\n    gravity: 'bottom',\n    position: 'center',\n    ...rest,\n    onClick: () => {\n      onClick?.(toast); // Pass in the object itself!\n    },\n  });\n  if (delay) {\n    setTimeout(() => {\n      toast.showToast();\n    }, delay);\n  } else {\n    toast.showToast();\n  }\n  return toast;\n}\n\nexport default showToast;\n","import { useEffect, useRef } from 'preact/hooks';\n\nfunction useInterval(fn, delay, deps, immediate) {\n  const savedCallback = useRef(fn);\n  useEffect(() => {\n    savedCallback.current = fn;\n  }, [fn, deps]);\n\n  useEffect(() => {\n    if (!immediate || delay === null || delay === false) return;\n    savedCallback.current();\n  }, [immediate]);\n\n  useEffect(() => {\n    if (delay === null || delay === false) return;\n    const tick = () => savedCallback.current();\n    const id = setInterval(tick, delay);\n    return () => clearInterval(id);\n  }, [delay]);\n}\n\nexport default useInterval;\n","import { unstable_batchedUpdates } from 'react-dom';\n\nconst isMenuOpen = state => !!state && state[0] === 'o';\nconst batchedUpdates = unstable_batchedUpdates;\nconst getTransition = (transition, name) => transition === true || !!(transition && transition[name]);\nconst safeCall = (fn, arg) => typeof fn === 'function' ? fn(arg) : fn;\nconst internalKey = '_szhsinMenu';\nconst getName = component => component[internalKey];\nconst defineName = (name, component) => Object.defineProperty(component, internalKey, {\n  value: name\n});\nconst mergeProps = (target, source) => {\n  source && Object.keys(source).forEach(key => {\n    const targetProp = target[key];\n    const sourceProp = source[key];\n    if (typeof sourceProp === 'function' && targetProp) {\n      target[key] = (...arg) => {\n        sourceProp(...arg);\n        targetProp(...arg);\n      };\n    } else {\n      target[key] = sourceProp;\n    }\n  });\n  return target;\n};\nconst parsePadding = paddingStr => {\n  if (typeof paddingStr !== 'string') return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0\n  };\n  const padding = paddingStr.trim().split(/\\s+/, 4).map(parseFloat);\n  const top = !isNaN(padding[0]) ? padding[0] : 0;\n  const right = !isNaN(padding[1]) ? padding[1] : top;\n  return {\n    top,\n    right,\n    bottom: !isNaN(padding[2]) ? padding[2] : top,\n    left: !isNaN(padding[3]) ? padding[3] : right\n  };\n};\nconst getScrollAncestor = node => {\n  while (node) {\n    node = node.parentNode;\n    if (!node || node === document.body || !node.parentNode) return;\n    const {\n      overflow,\n      overflowX,\n      overflowY\n    } = getComputedStyle(node);\n    if (/auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX)) return node;\n  }\n};\nfunction commonProps(isDisabled, isHovering) {\n  return {\n    'aria-disabled': isDisabled || undefined,\n    tabIndex: isHovering ? 0 : -1\n  };\n}\nfunction indexOfNode(nodeList, node) {\n  for (let i = 0; i < nodeList.length; i++) {\n    if (nodeList[i] === node) return i;\n  }\n  return -1;\n}\n\nexport { batchedUpdates, commonProps, defineName, getName, getScrollAncestor, getTransition, indexOfNode, isMenuOpen, mergeProps, parsePadding, safeCall };\n","import { useMemo } from 'react';\n\nconst useBEM = ({\n  block,\n  element,\n  modifiers,\n  className\n}) => useMemo(() => {\n  const blockElement = element ? `${block}__${element}` : block;\n  let classString = blockElement;\n  modifiers && Object.keys(modifiers).forEach(name => {\n    const value = modifiers[name];\n    if (value) classString += ` ${blockElement}--${value === true ? name : `${name}-${value}`}`;\n  });\n  let expandedClassName = typeof className === 'function' ? className(modifiers) : className;\n  if (typeof expandedClassName === 'string') {\n    expandedClassName = expandedClassName.trim();\n    if (expandedClassName) classString += ` ${expandedClassName}`;\n  }\n  return classString;\n}, [block, element, modifiers, className]);\n\nexport { useBEM };\n","import { createContext } from 'react';\n\nconst menuContainerClass = 'szh-menu-container';\nconst menuClass = 'szh-menu';\nconst menuButtonClass = 'szh-menu-button';\nconst menuArrowClass = 'arrow';\nconst menuItemClass = 'item';\nconst menuDividerClass = 'divider';\nconst menuHeaderClass = 'header';\nconst menuGroupClass = 'group';\nconst subMenuClass = 'submenu';\nconst radioGroupClass = 'radio-group';\nconst HoverItemContext = /*#__PURE__*/createContext();\nconst MenuListItemContext = /*#__PURE__*/createContext({});\nconst MenuListContext = /*#__PURE__*/createContext({});\nconst EventHandlersContext = /*#__PURE__*/createContext({});\nconst RadioGroupContext = /*#__PURE__*/createContext({});\nconst SettingsContext = /*#__PURE__*/createContext({});\nconst Keys = /*#__PURE__*/Object.freeze({\n  ENTER: 'Enter',\n  ESC: 'Escape',\n  SPACE: ' ',\n  HOME: 'Home',\n  END: 'End',\n  LEFT: 'ArrowLeft',\n  RIGHT: 'ArrowRight',\n  UP: 'ArrowUp',\n  DOWN: 'ArrowDown'\n});\nconst HoverActionTypes = /*#__PURE__*/Object.freeze({\n  RESET: 0,\n  SET: 1,\n  UNSET: 2,\n  INCREASE: 3,\n  DECREASE: 4,\n  FIRST: 5,\n  LAST: 6,\n  SET_INDEX: 7\n});\nconst CloseReason = /*#__PURE__*/Object.freeze({\n  CLICK: 'click',\n  CANCEL: 'cancel',\n  BLUR: 'blur',\n  SCROLL: 'scroll'\n});\nconst FocusPositions = /*#__PURE__*/Object.freeze({\n  FIRST: 'first',\n  LAST: 'last'\n});\nconst MenuStateMap = /*#__PURE__*/Object.freeze({\n  entering: 'opening',\n  entered: 'open',\n  exiting: 'closing',\n  exited: 'closed'\n});\nconst positionAbsolute = 'absolute';\nconst roleNone = 'none';\nconst roleMenuitem = 'menuitem';\nconst noScrollFocus = {\n  preventScroll: true\n};\n\nexport { CloseReason, EventHandlersContext, FocusPositions, HoverActionTypes, HoverItemContext, Keys, MenuListContext, MenuListItemContext, MenuStateMap, RadioGroupContext, SettingsContext, menuArrowClass, menuButtonClass, menuClass, menuContainerClass, menuDividerClass, menuGroupClass, menuHeaderClass, menuItemClass, noScrollFocus, positionAbsolute, radioGroupClass, roleMenuitem, roleNone, subMenuClass };\n","import { useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { mergeProps, getTransition, safeCall } from '../utils/utils.js';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { menuContainerClass, Keys, CloseReason } from '../utils/constants.js';\n\nconst MenuContainer = ({\n  className,\n  containerRef,\n  containerProps,\n  children,\n  isOpen,\n  theming,\n  transition,\n  onClose\n}) => {\n  const itemTransition = getTransition(transition, 'item');\n  const onKeyDown = ({\n    key\n  }) => {\n    switch (key) {\n      case Keys.ESC:\n        safeCall(onClose, {\n          key,\n          reason: CloseReason.CANCEL\n        });\n        break;\n    }\n  };\n  const onBlur = e => {\n    if (isOpen && !e.currentTarget.contains(e.relatedTarget)) {\n      safeCall(onClose, {\n        reason: CloseReason.BLUR\n      });\n    }\n  };\n  return /*#__PURE__*/jsx(\"div\", {\n    ...mergeProps({\n      onKeyDown,\n      onBlur\n    }, containerProps),\n    className: useBEM({\n      block: menuContainerClass,\n      modifiers: useMemo(() => ({\n        theme: theming,\n        itemTransition\n      }), [theming, itemTransition]),\n      className\n    }),\n    style: {\n      position: 'absolute',\n      ...containerProps?.style\n    },\n    ref: containerRef,\n    children: children\n  });\n};\n\nexport { MenuContainer };\n","const createSubmenuCtx = () => {\n  let timer,\n    count = 0;\n  return {\n    toggle: isOpen => {\n      isOpen ? count++ : count--;\n      count = Math.max(count, 0);\n    },\n    on: (closeDelay, pending, settled) => {\n      if (count) {\n        if (!timer) timer = setTimeout(() => {\n          timer = 0;\n          pending();\n        }, closeDelay);\n      } else {\n        settled?.();\n      }\n    },\n    off: () => {\n      if (timer) {\n        clearTimeout(timer);\n        timer = 0;\n      }\n    }\n  };\n};\n\nexport { createSubmenuCtx };\n","import { useState, useRef, useCallback } from 'react';\nimport { noScrollFocus, HoverActionTypes } from '../utils/constants.js';\nimport { indexOfNode } from '../utils/utils.js';\n\nconst useItems = menuRef => {\n  const [hoverItem, setHoverItem] = useState();\n  const stateRef = useRef({\n    items: [],\n    hoverIndex: -1,\n    sorted: false\n  });\n  const mutableState = stateRef.current;\n  const updateItems = useCallback((item, isMounted) => {\n    const {\n      items\n    } = mutableState;\n    if (!item) {\n      mutableState.items = [];\n    } else if (isMounted) {\n      items.push(item);\n    } else {\n      const index = items.indexOf(item);\n      if (index > -1) {\n        items.splice(index, 1);\n        if (item.contains(document.activeElement)) {\n          menuRef.current.focus(noScrollFocus);\n          setHoverItem();\n        }\n      }\n    }\n    mutableState.hoverIndex = -1;\n    mutableState.sorted = false;\n  }, [mutableState, menuRef]);\n  const dispatch = useCallback((actionType, item, nextIndex) => {\n    const {\n      items,\n      hoverIndex\n    } = mutableState;\n    const sortItems = () => {\n      if (mutableState.sorted) return;\n      const orderedNodes = menuRef.current.querySelectorAll('.szh-menu__item');\n      items.sort((a, b) => indexOfNode(orderedNodes, a) - indexOfNode(orderedNodes, b));\n      mutableState.sorted = true;\n    };\n    let index = -1,\n      newItem = undefined;\n    switch (actionType) {\n      case HoverActionTypes.RESET:\n        break;\n      case HoverActionTypes.SET:\n        newItem = item;\n        break;\n      case HoverActionTypes.UNSET:\n        newItem = prevItem => prevItem === item ? undefined : prevItem;\n        break;\n      case HoverActionTypes.FIRST:\n        sortItems();\n        index = 0;\n        newItem = items[index];\n        break;\n      case HoverActionTypes.LAST:\n        sortItems();\n        index = items.length - 1;\n        newItem = items[index];\n        break;\n      case HoverActionTypes.SET_INDEX:\n        sortItems();\n        index = nextIndex;\n        newItem = items[index];\n        break;\n      case HoverActionTypes.INCREASE:\n        sortItems();\n        index = hoverIndex;\n        if (index < 0) index = items.indexOf(item);\n        index++;\n        if (index >= items.length) index = 0;\n        newItem = items[index];\n        break;\n      case HoverActionTypes.DECREASE:\n        sortItems();\n        index = hoverIndex;\n        if (index < 0) index = items.indexOf(item);\n        index--;\n        if (index < 0) index = items.length - 1;\n        newItem = items[index];\n        break;\n      default:\n        if (process.env.NODE_ENV !== 'production') throw new Error(`[React-Menu] Unknown hover action type: ${actionType}`);\n    }\n    if (!newItem) index = -1;\n    setHoverItem(newItem);\n    mutableState.hoverIndex = index;\n  }, [menuRef, mutableState]);\n  return {\n    hoverItem,\n    dispatch,\n    updateItems\n  };\n};\n\nexport { useItems };\n","const getNativeDimension = (transformed, untransformed) => Math.round(transformed) === untransformed ? transformed : untransformed;\nconst getNormalizedClientRect = element => {\n  const rect = element.getBoundingClientRect();\n  rect.width = getNativeDimension(rect.width, element.offsetWidth);\n  rect.height = getNativeDimension(rect.height, element.offsetHeight);\n  return rect;\n};\n\nexport { getNormalizedClientRect };\n","import { getNormalizedClientRect } from './getNormalizedClientRect.js';\nimport { parsePadding } from '../utils/utils.js';\n\nconst getPositionHelpers = (containerRef, menuRef, menuScroll, boundingBoxPadding) => {\n  const menuRect = getNormalizedClientRect(menuRef.current);\n  const containerRect = containerRef.current.getBoundingClientRect();\n  const boundingRect = menuScroll === window ? {\n    left: 0,\n    top: 0,\n    right: document.documentElement.clientWidth,\n    bottom: window.innerHeight\n  } : menuScroll.getBoundingClientRect();\n  const padding = parsePadding(boundingBoxPadding);\n  const getLeftOverflow = x => x + containerRect.left - boundingRect.left - padding.left;\n  const getRightOverflow = x => x + containerRect.left + menuRect.width - boundingRect.right + padding.right;\n  const getTopOverflow = y => y + containerRect.top - boundingRect.top - padding.top;\n  const getBottomOverflow = y => y + containerRect.top + menuRect.height - boundingRect.bottom + padding.bottom;\n  const confineHorizontally = x => {\n    let leftOverflow = getLeftOverflow(x);\n    if (leftOverflow < 0) {\n      x -= leftOverflow;\n    } else {\n      const rightOverflow = getRightOverflow(x);\n      if (rightOverflow > 0) {\n        x -= rightOverflow;\n        leftOverflow = getLeftOverflow(x);\n        if (leftOverflow < 0) x -= leftOverflow;\n      }\n    }\n    return x;\n  };\n  const confineVertically = y => {\n    let topOverflow = getTopOverflow(y);\n    if (topOverflow < 0) {\n      y -= topOverflow;\n    } else {\n      const bottomOverflow = getBottomOverflow(y);\n      if (bottomOverflow > 0) {\n        y -= bottomOverflow;\n        topOverflow = getTopOverflow(y);\n        if (topOverflow < 0) y -= topOverflow;\n      }\n    }\n    return y;\n  };\n  return {\n    menuRect,\n    containerRect,\n    getLeftOverflow,\n    getRightOverflow,\n    getTopOverflow,\n    getBottomOverflow,\n    confineHorizontally,\n    confineVertically\n  };\n};\n\nexport { getPositionHelpers };\n","const placeArrowVertical = ({\n  arrowRef,\n  menuY,\n  anchorRect,\n  containerRect,\n  menuRect\n}) => {\n  let y = anchorRect.top - containerRect.top - menuY + anchorRect.height / 2;\n  const offset = arrowRef.current.offsetHeight * 1.25;\n  y = Math.max(offset, y);\n  y = Math.min(y, menuRect.height - offset);\n  return y;\n};\n\nexport { placeArrowVertical };\n","import { placeArrowVertical } from './placeArrowVertical.js';\n\nconst placeLeftorRight = ({\n  anchorRect,\n  containerRect,\n  menuRect,\n  placeLeftorRightY,\n  placeLeftX,\n  placeRightX,\n  getLeftOverflow,\n  getRightOverflow,\n  confineHorizontally,\n  confineVertically,\n  arrowRef,\n  arrow,\n  direction,\n  position\n}) => {\n  let computedDirection = direction;\n  let y = placeLeftorRightY;\n  if (position !== 'initial') {\n    y = confineVertically(y);\n    if (position === 'anchor') {\n      y = Math.min(y, anchorRect.bottom - containerRect.top);\n      y = Math.max(y, anchorRect.top - containerRect.top - menuRect.height);\n    }\n  }\n  let x, leftOverflow, rightOverflow;\n  if (computedDirection === 'left') {\n    x = placeLeftX;\n    if (position !== 'initial') {\n      leftOverflow = getLeftOverflow(x);\n      if (leftOverflow < 0) {\n        rightOverflow = getRightOverflow(placeRightX);\n        if (rightOverflow <= 0 || -leftOverflow > rightOverflow) {\n          x = placeRightX;\n          computedDirection = 'right';\n        }\n      }\n    }\n  } else {\n    x = placeRightX;\n    if (position !== 'initial') {\n      rightOverflow = getRightOverflow(x);\n      if (rightOverflow > 0) {\n        leftOverflow = getLeftOverflow(placeLeftX);\n        if (leftOverflow >= 0 || -leftOverflow < rightOverflow) {\n          x = placeLeftX;\n          computedDirection = 'left';\n        }\n      }\n    }\n  }\n  if (position === 'auto') x = confineHorizontally(x);\n  const arrowY = arrow ? placeArrowVertical({\n    menuY: y,\n    arrowRef,\n    anchorRect,\n    containerRect,\n    menuRect\n  }) : undefined;\n  return {\n    arrowY,\n    x,\n    y,\n    computedDirection\n  };\n};\n\nexport { placeLeftorRight };\n","const placeArrowHorizontal = ({\n  arrowRef,\n  menuX,\n  anchorRect,\n  containerRect,\n  menuRect\n}) => {\n  let x = anchorRect.left - containerRect.left - menuX + anchorRect.width / 2;\n  const offset = arrowRef.current.offsetWidth * 1.25;\n  x = Math.max(offset, x);\n  x = Math.min(x, menuRect.width - offset);\n  return x;\n};\n\nexport { placeArrowHorizontal };\n","import { placeArrowHorizontal } from './placeArrowHorizontal.js';\n\nconst placeToporBottom = ({\n  anchorRect,\n  containerRect,\n  menuRect,\n  placeToporBottomX,\n  placeTopY,\n  placeBottomY,\n  getTopOverflow,\n  getBottomOverflow,\n  confineHorizontally,\n  confineVertically,\n  arrowRef,\n  arrow,\n  direction,\n  position\n}) => {\n  let computedDirection = direction === 'top' ? 'top' : 'bottom';\n  let x = placeToporBottomX;\n  if (position !== 'initial') {\n    x = confineHorizontally(x);\n    if (position === 'anchor') {\n      x = Math.min(x, anchorRect.right - containerRect.left);\n      x = Math.max(x, anchorRect.left - containerRect.left - menuRect.width);\n    }\n  }\n  let y, topOverflow, bottomOverflow;\n  if (computedDirection === 'top') {\n    y = placeTopY;\n    if (position !== 'initial') {\n      topOverflow = getTopOverflow(y);\n      if (topOverflow < 0) {\n        bottomOverflow = getBottomOverflow(placeBottomY);\n        if (bottomOverflow <= 0 || -topOverflow > bottomOverflow) {\n          y = placeBottomY;\n          computedDirection = 'bottom';\n        }\n      }\n    }\n  } else {\n    y = placeBottomY;\n    if (position !== 'initial') {\n      bottomOverflow = getBottomOverflow(y);\n      if (bottomOverflow > 0) {\n        topOverflow = getTopOverflow(placeTopY);\n        if (topOverflow >= 0 || -topOverflow < bottomOverflow) {\n          y = placeTopY;\n          computedDirection = 'top';\n        }\n      }\n    }\n  }\n  if (position === 'auto') y = confineVertically(y);\n  const arrowX = arrow ? placeArrowHorizontal({\n    menuX: x,\n    arrowRef,\n    anchorRect,\n    containerRect,\n    menuRect\n  }) : undefined;\n  return {\n    arrowX,\n    x,\n    y,\n    computedDirection\n  };\n};\n\nexport { placeToporBottom };\n","import { placeLeftorRight } from './placeLeftorRight.js';\nimport { placeToporBottom } from './placeToporBottom.js';\n\nconst positionMenu = ({\n  arrow,\n  align,\n  direction,\n  gap,\n  shift,\n  position,\n  anchorRect,\n  arrowRef,\n  positionHelpers\n}) => {\n  const {\n    menuRect,\n    containerRect\n  } = positionHelpers;\n  const isHorizontal = direction === 'left' || direction === 'right';\n  let horizontalOffset = isHorizontal ? gap : shift;\n  let verticalOffset = isHorizontal ? shift : gap;\n  if (arrow) {\n    const arrowElt = arrowRef.current;\n    if (isHorizontal) {\n      horizontalOffset += arrowElt.offsetWidth;\n    } else {\n      verticalOffset += arrowElt.offsetHeight;\n    }\n  }\n  const placeLeftX = anchorRect.left - containerRect.left - menuRect.width - horizontalOffset;\n  const placeRightX = anchorRect.right - containerRect.left + horizontalOffset;\n  const placeTopY = anchorRect.top - containerRect.top - menuRect.height - verticalOffset;\n  const placeBottomY = anchorRect.bottom - containerRect.top + verticalOffset;\n  let placeToporBottomX, placeLeftorRightY;\n  if (align === 'end') {\n    placeToporBottomX = anchorRect.right - containerRect.left - menuRect.width;\n    placeLeftorRightY = anchorRect.bottom - containerRect.top - menuRect.height;\n  } else if (align === 'center') {\n    placeToporBottomX = anchorRect.left - containerRect.left - (menuRect.width - anchorRect.width) / 2;\n    placeLeftorRightY = anchorRect.top - containerRect.top - (menuRect.height - anchorRect.height) / 2;\n  } else {\n    placeToporBottomX = anchorRect.left - containerRect.left;\n    placeLeftorRightY = anchorRect.top - containerRect.top;\n  }\n  placeToporBottomX += horizontalOffset;\n  placeLeftorRightY += verticalOffset;\n  const options = {\n    ...positionHelpers,\n    anchorRect,\n    placeLeftX,\n    placeRightX,\n    placeLeftorRightY,\n    placeTopY,\n    placeBottomY,\n    placeToporBottomX,\n    arrowRef,\n    arrow,\n    direction,\n    position\n  };\n  switch (direction) {\n    case 'left':\n    case 'right':\n      return placeLeftorRight(options);\n    case 'top':\n    case 'bottom':\n    default:\n      return placeToporBottom(options);\n  }\n};\n\nexport { positionMenu };\n","import { useLayoutEffect, useEffect } from 'react';\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport { useIsomorphicLayoutEffect as useLayoutEffect };\n","import { useMemo } from 'react';\n\nfunction setRef(ref, instance) {\n  typeof ref === 'function' ? ref(instance) : ref.current = instance;\n}\nconst useCombinedRef = (refA, refB) => useMemo(() => {\n  if (!refA) return refB;\n  if (!refB) return refA;\n  return instance => {\n    setRef(refA, instance);\n    setRef(refB, instance);\n  };\n}, [refA, refB]);\n\nexport { useCombinedRef };\n","import { useState, useReducer, useContext, useRef, useCallback, useEffect, useMemo } from 'react';\nimport { flushSync } from 'react-dom';\nimport { MenuContainer } from './MenuContainer.js';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { createSubmenuCtx } from '../utils/submenuCtx.js';\nimport { SettingsContext, MenuListContext, HoverActionTypes, noScrollFocus, menuClass, menuArrowClass, positionAbsolute, MenuListItemContext, HoverItemContext, Keys, CloseReason, FocusPositions } from '../utils/constants.js';\nimport { useItems } from '../hooks/useItems.js';\nimport { getScrollAncestor, commonProps, mergeProps, safeCall, isMenuOpen, getTransition, batchedUpdates } from '../utils/utils.js';\nimport { getPositionHelpers } from '../positionUtils/getPositionHelpers.js';\nimport { positionMenu } from '../positionUtils/positionMenu.js';\nimport { useLayoutEffect as useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect.js';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { useCombinedRef } from '../hooks/useCombinedRef.js';\n\nconst offScreen = -9999;\nconst MenuList = ({\n  ariaLabel,\n  menuClassName,\n  menuStyle,\n  arrow,\n  arrowProps = {},\n  anchorPoint,\n  anchorRef,\n  containerRef,\n  containerProps,\n  externalRef,\n  parentScrollingRef,\n  align = 'start',\n  direction = 'bottom',\n  position = 'auto',\n  overflow = 'visible',\n  setDownOverflow,\n  repositionFlag,\n  captureFocus = true,\n  state,\n  endTransition,\n  isDisabled,\n  menuItemFocus,\n  gap = 0,\n  shift = 0,\n  children,\n  onClose,\n  focusProps: _1,\n  ...restProps\n}) => {\n  const [menuPosition, setMenuPosition] = useState({\n    x: offScreen,\n    y: offScreen\n  });\n  const [arrowPosition, setArrowPosition] = useState({});\n  const [overflowData, setOverflowData] = useState();\n  const [expandedDirection, setExpandedDirection] = useState(direction);\n  const [submenuCtx] = useState(createSubmenuCtx);\n  const [reposSubmenu, forceReposSubmenu] = useReducer(c => c + 1, 1);\n  const {\n    transition,\n    boundingBoxRef,\n    boundingBoxPadding,\n    rootMenuRef,\n    rootAnchorRef,\n    scrollNodesRef,\n    reposition,\n    viewScroll,\n    submenuCloseDelay\n  } = useContext(SettingsContext);\n  const {\n    submenuCtx: parentSubmenuCtx,\n    reposSubmenu: reposFlag = repositionFlag\n  } = useContext(MenuListContext);\n  const menuRef = useRef();\n  const arrowRef = useRef();\n  const prevOpen = useRef(false);\n  const {\n    hoverItem,\n    dispatch,\n    updateItems\n  } = useItems(menuRef);\n  const isOpen = isMenuOpen(state);\n  const openTransition = getTransition(transition, 'open');\n  const closeTransition = getTransition(transition, 'close');\n  const scrollNodes = scrollNodesRef.current;\n  const onKeyDown = e => {\n    switch (e.key) {\n      case Keys.HOME:\n        dispatch(HoverActionTypes.FIRST);\n        break;\n      case Keys.END:\n        dispatch(HoverActionTypes.LAST);\n        break;\n      case Keys.UP:\n        dispatch(HoverActionTypes.DECREASE, hoverItem);\n        break;\n      case Keys.DOWN:\n        dispatch(HoverActionTypes.INCREASE, hoverItem);\n        break;\n      case Keys.SPACE:\n        if (e.target && e.target.className.indexOf(menuClass) !== -1) {\n          e.preventDefault();\n        }\n        return;\n      default:\n        return;\n    }\n    e.preventDefault();\n    e.stopPropagation();\n  };\n  const onAnimationEnd = () => {\n    if (state === 'closing') {\n      setOverflowData();\n    }\n    safeCall(endTransition);\n  };\n  const onPointerMove = e => {\n    e.stopPropagation();\n    submenuCtx.on(submenuCloseDelay, () => {\n      dispatch(HoverActionTypes.RESET);\n      menuRef.current.focus(noScrollFocus);\n    });\n  };\n  const onPointerLeave = e => {\n    if (e.target === e.currentTarget) submenuCtx.off();\n  };\n  const handlePosition = useCallback(noOverflowCheck => {\n    const anchorRect = anchorRef ? anchorRef.current?.getBoundingClientRect() : anchorPoint ? {\n      left: anchorPoint.x,\n      right: anchorPoint.x,\n      top: anchorPoint.y,\n      bottom: anchorPoint.y,\n      width: 0,\n      height: 0\n    } : null;\n    if (!anchorRect) {\n      if (process.env.NODE_ENV !== 'production') {\n        console.warn('[React-Menu] Menu might not be positioned properly as one of the anchorRef or anchorPoint prop should be provided. If `anchorRef` is provided, the anchor must be mounted before menu is open.');\n      }\n      return;\n    }\n    if (!scrollNodes.menu) {\n      scrollNodes.menu = (boundingBoxRef ? boundingBoxRef.current : getScrollAncestor(rootMenuRef.current)) || window;\n    }\n    const positionHelpers = getPositionHelpers(containerRef, menuRef, scrollNodes.menu, boundingBoxPadding);\n    let {\n      arrowX,\n      arrowY,\n      x,\n      y,\n      computedDirection\n    } = positionMenu({\n      arrow,\n      align,\n      direction,\n      gap,\n      shift,\n      position,\n      anchorRect,\n      arrowRef,\n      positionHelpers\n    });\n    const {\n      menuRect\n    } = positionHelpers;\n    const menuHeight = menuRect.height;\n    if (!noOverflowCheck && overflow !== 'visible') {\n      const {\n        getTopOverflow,\n        getBottomOverflow\n      } = positionHelpers;\n      let height, overflowAmt;\n      const bottomOverflow = getBottomOverflow(y);\n      if (bottomOverflow > 0) {\n        height = menuHeight - bottomOverflow;\n        overflowAmt = bottomOverflow;\n      } else {\n        const topOverflow = getTopOverflow(y);\n        if (topOverflow < 0) {\n          height = menuHeight + topOverflow;\n          overflowAmt = 0 - topOverflow;\n          if (height >= 0) y -= topOverflow;\n        }\n      }\n      if (height >= 0) {\n        setOverflowData({\n          height,\n          overflowAmt\n        });\n      }\n    }\n    if (arrow) setArrowPosition({\n      x: arrowX,\n      y: arrowY\n    });\n    setMenuPosition({\n      x,\n      y\n    });\n    setExpandedDirection(computedDirection);\n  }, [arrow, align, boundingBoxPadding, direction, gap, shift, position, overflow, anchorPoint, anchorRef, containerRef, boundingBoxRef, rootMenuRef, scrollNodes]);\n  useIsomorphicLayoutEffect(() => {\n    if (isOpen) {\n      handlePosition();\n      if (prevOpen.current) forceReposSubmenu();\n    }\n    prevOpen.current = isOpen;\n  }, [isOpen, handlePosition, reposFlag]);\n  useIsomorphicLayoutEffect(() => {\n    if (overflowData && !setDownOverflow) menuRef.current.scrollTop = 0;\n  }, [overflowData, setDownOverflow]);\n  useIsomorphicLayoutEffect(() => updateItems, [updateItems]);\n  useEffect(() => {\n    let {\n      menu: menuScroll\n    } = scrollNodes;\n    if (!isOpen || !menuScroll) return;\n    menuScroll = menuScroll.addEventListener ? menuScroll : window;\n    if (!scrollNodes.anchors) {\n      scrollNodes.anchors = [];\n      let anchorScroll = getScrollAncestor(rootAnchorRef && rootAnchorRef.current);\n      while (anchorScroll && anchorScroll !== menuScroll) {\n        scrollNodes.anchors.push(anchorScroll);\n        anchorScroll = getScrollAncestor(anchorScroll);\n      }\n    }\n    let scroll = viewScroll;\n    if (scrollNodes.anchors.length && scroll === 'initial') scroll = 'auto';\n    if (scroll === 'initial') return;\n    const handleScroll = () => {\n      if (scroll === 'auto') {\n        batchedUpdates(() => handlePosition(true));\n      } else {\n        safeCall(onClose, {\n          reason: CloseReason.SCROLL\n        });\n      }\n    };\n    const scrollObservers = scrollNodes.anchors.concat(viewScroll !== 'initial' ? menuScroll : []);\n    scrollObservers.forEach(o => o.addEventListener('scroll', handleScroll));\n    return () => scrollObservers.forEach(o => o.removeEventListener('scroll', handleScroll));\n  }, [rootAnchorRef, scrollNodes, isOpen, onClose, viewScroll, handlePosition]);\n  const hasOverflow = !!overflowData && overflowData.overflowAmt > 0;\n  useEffect(() => {\n    if (hasOverflow || !isOpen || !parentScrollingRef) return;\n    const handleScroll = () => batchedUpdates(handlePosition);\n    const parentScroll = parentScrollingRef.current;\n    parentScroll.addEventListener('scroll', handleScroll);\n    return () => parentScroll.removeEventListener('scroll', handleScroll);\n  }, [isOpen, hasOverflow, parentScrollingRef, handlePosition]);\n  useEffect(() => {\n    if (!isOpen || typeof ResizeObserver !== 'function' || reposition === 'initial') return;\n    const targetList = [];\n    const resizeObserver = new ResizeObserver(entries => entries.forEach(({\n      target\n    }) => {\n      if (targetList.indexOf(target) < 0) {\n        targetList.push(target);\n      } else {\n        flushSync(() => {\n          handlePosition();\n          forceReposSubmenu();\n        });\n      }\n    }));\n    const resizeObserverOptions = {\n      box: 'border-box'\n    };\n    resizeObserver.observe(menuRef.current, resizeObserverOptions);\n    const anchor = anchorRef?.current;\n    anchor && resizeObserver.observe(anchor, resizeObserverOptions);\n    return () => resizeObserver.disconnect();\n  }, [isOpen, reposition, anchorRef, handlePosition]);\n  useEffect(() => {\n    if (!isOpen) {\n      dispatch(HoverActionTypes.RESET);\n      if (!closeTransition) setOverflowData();\n      return;\n    }\n    const {\n      position,\n      alwaysUpdate\n    } = menuItemFocus || {};\n    const setItemFocus = () => {\n      if (position === FocusPositions.FIRST) {\n        dispatch(HoverActionTypes.FIRST);\n      } else if (position === FocusPositions.LAST) {\n        dispatch(HoverActionTypes.LAST);\n      } else if (position >= -1) {\n        dispatch(HoverActionTypes.SET_INDEX, undefined, position);\n      }\n    };\n    if (alwaysUpdate) {\n      setItemFocus();\n    } else if (captureFocus) {\n      const id = setTimeout(() => {\n        const menuElt = menuRef.current;\n        if (menuElt && !menuElt.contains(document.activeElement)) {\n          menuElt.focus(noScrollFocus);\n          setItemFocus();\n        }\n      }, openTransition ? 170 : 100);\n      return () => clearTimeout(id);\n    }\n  }, [isOpen, openTransition, closeTransition, captureFocus, menuItemFocus, dispatch]);\n  const itemContext = useMemo(() => ({\n    isParentOpen: isOpen,\n    submenuCtx,\n    dispatch,\n    updateItems\n  }), [isOpen, submenuCtx, dispatch, updateItems]);\n  let maxHeight, overflowAmt;\n  if (overflowData) {\n    setDownOverflow ? overflowAmt = overflowData.overflowAmt : maxHeight = overflowData.height;\n  }\n  const listContext = useMemo(() => ({\n    reposSubmenu,\n    submenuCtx,\n    overflow,\n    overflowAmt,\n    parentMenuRef: menuRef,\n    parentDir: expandedDirection\n  }), [reposSubmenu, submenuCtx, overflow, overflowAmt, expandedDirection]);\n  const overflowStyle = maxHeight >= 0 ? {\n    maxHeight,\n    overflow\n  } : undefined;\n  const modifiers = useMemo(() => ({\n    state,\n    align,\n    dir: expandedDirection\n  }), [state, align, expandedDirection]);\n  const arrowModifiers = useMemo(() => ({\n    dir: expandedDirection\n  }), [expandedDirection]);\n  const _arrowClassName = useBEM({\n    block: menuClass,\n    element: menuArrowClass,\n    modifiers: arrowModifiers,\n    className: arrowProps.className\n  });\n  const menu = /*#__PURE__*/jsxs(\"ul\", {\n    role: \"menu\",\n    \"aria-label\": ariaLabel,\n    ...commonProps(isDisabled),\n    ...mergeProps({\n      onPointerEnter: parentSubmenuCtx?.off,\n      onPointerMove,\n      onPointerLeave,\n      onKeyDown,\n      onAnimationEnd\n    }, restProps),\n    ref: useCombinedRef(externalRef, menuRef),\n    className: useBEM({\n      block: menuClass,\n      modifiers,\n      className: menuClassName\n    }),\n    style: {\n      ...menuStyle,\n      ...overflowStyle,\n      margin: 0,\n      display: state === 'closed' ? 'none' : undefined,\n      position: positionAbsolute,\n      left: menuPosition.x,\n      top: menuPosition.y\n    },\n    children: [arrow && /*#__PURE__*/jsx(\"li\", {\n      \"aria-hidden\": true,\n      ...arrowProps,\n      className: _arrowClassName,\n      style: {\n        display: 'block',\n        position: positionAbsolute,\n        left: arrowPosition.x,\n        top: arrowPosition.y,\n        ...arrowProps.style\n      },\n      ref: arrowRef\n    }), /*#__PURE__*/jsx(MenuListContext.Provider, {\n      value: listContext,\n      children: /*#__PURE__*/jsx(MenuListItemContext.Provider, {\n        value: itemContext,\n        children: /*#__PURE__*/jsx(HoverItemContext.Provider, {\n          value: hoverItem,\n          children: safeCall(children, modifiers)\n        })\n      })\n    })]\n  });\n  return containerProps ? /*#__PURE__*/jsx(MenuContainer, {\n    ...containerProps,\n    isOpen: isOpen,\n    children: menu\n  }) : menu;\n};\n\nexport { MenuList };\n","import { forwardRef, useRef, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MenuList } from './MenuList.js';\nimport { jsx } from 'react/jsx-runtime';\nimport { Keys, CloseReason, SettingsContext, EventHandlersContext } from '../utils/constants.js';\nimport { safeCall } from '../utils/utils.js';\n\nconst ControlledMenu = /*#__PURE__*/forwardRef(function ControlledMenu({\n  'aria-label': ariaLabel,\n  className,\n  containerProps,\n  initialMounted,\n  unmountOnClose,\n  transition,\n  transitionTimeout,\n  boundingBoxRef,\n  boundingBoxPadding,\n  reposition = 'auto',\n  submenuOpenDelay = 300,\n  submenuCloseDelay = 150,\n  viewScroll = 'initial',\n  portal,\n  theming,\n  onItemClick,\n  ...restProps\n}, externalRef) {\n  const containerRef = useRef(null);\n  const scrollNodesRef = useRef({});\n  const {\n    anchorRef,\n    state,\n    onClose\n  } = restProps;\n  const settings = useMemo(() => ({\n    initialMounted,\n    unmountOnClose,\n    transition,\n    transitionTimeout,\n    boundingBoxRef,\n    boundingBoxPadding,\n    rootMenuRef: containerRef,\n    rootAnchorRef: anchorRef,\n    scrollNodesRef,\n    reposition,\n    viewScroll,\n    submenuOpenDelay,\n    submenuCloseDelay\n  }), [initialMounted, unmountOnClose, transition, transitionTimeout, anchorRef, boundingBoxRef, boundingBoxPadding, reposition, viewScroll, submenuOpenDelay, submenuCloseDelay]);\n  const eventHandlers = useMemo(() => ({\n    handleClick(event, isCheckorRadio) {\n      if (!event.stopPropagation) safeCall(onItemClick, event);\n      let keepOpen = event.keepOpen;\n      if (keepOpen === undefined) {\n        keepOpen = isCheckorRadio && event.key === Keys.SPACE;\n      }\n      if (!keepOpen) {\n        safeCall(onClose, {\n          value: event.value,\n          key: event.key,\n          reason: CloseReason.CLICK\n        });\n      }\n    },\n    handleClose(key) {\n      safeCall(onClose, {\n        key,\n        reason: CloseReason.CLICK\n      });\n    }\n  }), [onItemClick, onClose]);\n  if (!state) return null;\n  const menuList = /*#__PURE__*/jsx(SettingsContext.Provider, {\n    value: settings,\n    children: /*#__PURE__*/jsx(EventHandlersContext.Provider, {\n      value: eventHandlers,\n      children: /*#__PURE__*/jsx(MenuList, {\n        ...restProps,\n        ariaLabel: ariaLabel || 'Menu',\n        externalRef: externalRef,\n        containerRef: containerRef,\n        containerProps: {\n          className,\n          containerRef,\n          containerProps,\n          theming,\n          transition,\n          onClose\n        }\n      })\n    })\n  });\n  if (portal === true && typeof document !== 'undefined') {\n    return /*#__PURE__*/createPortal(menuList, document.body);\n  } else if (portal) {\n    return portal.target ? /*#__PURE__*/createPortal(menuList, portal.target) : portal.stablePosition ? null : menuList;\n  }\n  return menuList;\n});\n\nexport { ControlledMenu };\n","const PRE_ENTER = 0;\nconst ENTERING = 1;\nconst ENTERED = 2;\nconst PRE_EXIT = 3;\nconst EXITING = 4;\nconst EXITED = 5;\nconst UNMOUNTED = 6;\nconst STATUS = ['preEnter', 'entering', 'entered', 'preExit', 'exiting', 'exited', 'unmounted'];\nconst getState = status => ({\n  _s: status,\n  status: STATUS[status],\n  isEnter: status < PRE_EXIT,\n  isMounted: status !== UNMOUNTED,\n  isResolved: status === ENTERED || status > EXITING\n});\nconst startOrEnd = unmounted => unmounted ? UNMOUNTED : EXITED;\nconst getEndStatus = (status, unmountOnExit) => {\n  switch (status) {\n    case ENTERING:\n    case PRE_ENTER:\n      return ENTERED;\n    case EXITING:\n    case PRE_EXIT:\n      return startOrEnd(unmountOnExit);\n  }\n};\nconst getTimeout = timeout => typeof timeout === 'object' ? [timeout.enter, timeout.exit] : [timeout, timeout];\nconst nextTick = (transitState, status) => setTimeout(() => {\n  // Reading document.body.offsetTop can force browser to repaint before transition to the next state\n  isNaN(document.body.offsetTop) || transitState(status + 1);\n}, 0);\n\nexport { ENTERED, ENTERING, EXITED, EXITING, PRE_ENTER, PRE_EXIT, STATUS, UNMOUNTED, getEndStatus, getState, getTimeout, nextTick, startOrEnd };\n","import { useState, useRef, useCallback, useEffect } from 'react';\nimport { getState, ENTERED, startOrEnd, getTimeout, getEndStatus, PRE_EXIT, nextTick, PRE_ENTER, EXITING, ENTERING } from './utils.js';\n\nconst updateState = (status, setState, latestState, timeoutId, onChange) => {\n  clearTimeout(timeoutId.current);\n  const state = getState(status);\n  setState(state);\n  latestState.current = state;\n  onChange && onChange({\n    current: state\n  });\n};\nconst useTransitionState = ({\n  enter = true,\n  exit = true,\n  preEnter,\n  preExit,\n  timeout,\n  initialEntered,\n  mountOnEnter,\n  unmountOnExit,\n  onStateChange: onChange\n} = {}) => {\n  const [state, setState] = useState(() => getState(initialEntered ? ENTERED : startOrEnd(mountOnEnter)));\n  const latestState = useRef(state);\n  const timeoutId = useRef();\n  const [enterTimeout, exitTimeout] = getTimeout(timeout);\n  const endTransition = useCallback(() => {\n    const status = getEndStatus(latestState.current._s, unmountOnExit);\n    status && updateState(status, setState, latestState, timeoutId, onChange);\n  }, [onChange, unmountOnExit]);\n  const toggle = useCallback(toEnter => {\n    const transitState = status => {\n      updateState(status, setState, latestState, timeoutId, onChange);\n      switch (status) {\n        case ENTERING:\n          if (enterTimeout >= 0) timeoutId.current = setTimeout(endTransition, enterTimeout);\n          break;\n        case EXITING:\n          if (exitTimeout >= 0) timeoutId.current = setTimeout(endTransition, exitTimeout);\n          break;\n        case PRE_ENTER:\n        case PRE_EXIT:\n          timeoutId.current = nextTick(transitState, status);\n          break;\n      }\n    };\n    const enterStage = latestState.current.isEnter;\n    if (typeof toEnter !== 'boolean') toEnter = !enterStage;\n    if (toEnter) {\n      !enterStage && transitState(enter ? preEnter ? PRE_ENTER : ENTERING : ENTERED);\n    } else {\n      enterStage && transitState(exit ? preExit ? PRE_EXIT : EXITING : startOrEnd(unmountOnExit));\n    }\n  }, [endTransition, onChange, enter, exit, preEnter, preExit, enterTimeout, exitTimeout, unmountOnExit]);\n  useEffect(() => () => clearTimeout(timeoutId.current), []);\n  return [state, toggle, endTransition];\n};\n\nexport { useTransitionState };\n","import { useCallback } from 'react';\nimport { useTransitionState } from 'react-transition-state';\nimport { MenuStateMap } from '../utils/constants.js';\nimport { getTransition } from '../utils/utils.js';\n\nconst useMenuState = ({\n  initialOpen,\n  initialMounted,\n  unmountOnClose,\n  transition,\n  transitionTimeout = 500,\n  onMenuChange\n} = {}) => {\n  const enter = getTransition(transition, 'open');\n  const exit = getTransition(transition, 'close');\n  const [{\n    status\n  }, toggleMenu, endTransition] = useTransitionState({\n    initialEntered: initialOpen,\n    mountOnEnter: !initialMounted,\n    unmountOnExit: unmountOnClose,\n    timeout: transitionTimeout,\n    enter,\n    exit,\n    onStateChange: useCallback(({\n      current: {\n        isEnter,\n        isResolved\n      }\n    }) => {\n      if (!onMenuChange || isEnter && enter && isResolved || !isEnter && exit && isResolved) {\n        return;\n      }\n      onMenuChange({\n        open: isEnter\n      });\n    }, [onMenuChange, enter, exit])\n  });\n  return [{\n    state: MenuStateMap[status],\n    endTransition\n  }, toggleMenu];\n};\n\nexport { useMenuState };\n","import { useState } from 'react';\nimport { useMenuState } from './useMenuState.js';\n\nconst useMenuStateAndFocus = options => {\n  const [menuProps, toggleMenu] = useMenuState(options);\n  const [menuItemFocus, setMenuItemFocus] = useState();\n  const openMenu = (position, alwaysUpdate) => {\n    setMenuItemFocus({\n      position,\n      alwaysUpdate\n    });\n    toggleMenu(true);\n  };\n  return [{\n    menuItemFocus,\n    ...menuProps\n  }, toggleMenu, openMenu];\n};\n\nexport { useMenuStateAndFocus };\n","import { useState } from 'react';\n\nconst useClick = (state, onToggle) => {\n  if (process.env.NODE_ENV !== 'production' && typeof onToggle !== 'function') {\n    throw new Error('[React-Menu] useClick/useHover requires a function in the second parameter.');\n  }\n  const [skipOpen] = useState({});\n  return {\n    onMouseDown: () => {\n      skipOpen.v = state && state !== 'closed';\n    },\n    onClick: e => skipOpen.v ? skipOpen.v = false : onToggle(true, e)\n  };\n};\n\nexport { useClick };\n","import { forwardRef, useRef, useCallback, useImperativeHandle, Fragment, cloneElement, version } from 'react';\nimport { ControlledMenu } from './ControlledMenu.js';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { useMenuStateAndFocus } from '../hooks/useMenuStateAndFocus.js';\nimport { useClick } from '../hooks/useClick.js';\nimport { useCombinedRef } from '../hooks/useCombinedRef.js';\nimport { safeCall, mergeProps, getName, isMenuOpen } from '../utils/utils.js';\nimport { FocusPositions, Keys } from '../utils/constants.js';\n\nconst isLegacyReact = parseInt(version) < 19;\nconst Menu = /*#__PURE__*/forwardRef(function Menu({\n  'aria-label': ariaLabel,\n  captureFocus: _,\n  initialOpen: _1,\n  menuButton,\n  instanceRef,\n  onMenuChange,\n  ...restProps\n}, externalRef) {\n  const [stateProps, toggleMenu, openMenu] = useMenuStateAndFocus({\n    ...restProps,\n    onMenuChange\n  });\n  const {\n    state\n  } = stateProps;\n  const isOpen = isMenuOpen(state);\n  const buttonRef = useRef(null);\n  const anchorProps = useClick(state, (_, e) => openMenu(!e.detail ? FocusPositions.FIRST : undefined));\n  const handleClose = useCallback(e => {\n    toggleMenu(false);\n    if (e.key) buttonRef.current.focus();\n  }, [toggleMenu]);\n  const onKeyDown = e => {\n    switch (e.key) {\n      case Keys.UP:\n        openMenu(FocusPositions.LAST);\n        break;\n      case Keys.DOWN:\n        openMenu(FocusPositions.FIRST);\n        break;\n      default:\n        return;\n    }\n    e.preventDefault();\n  };\n  const button = safeCall(menuButton, {\n    open: isOpen\n  });\n  if (!button || !button.type) throw new Error('Menu requires a menuButton prop.');\n  const buttonProps = {\n    ...mergeProps({\n      onKeyDown,\n      ...anchorProps\n    }, button.props),\n    ref: useCombinedRef(isLegacyReact ? button.ref : button.props.ref, buttonRef)\n  };\n  if (getName(button.type) === 'MenuButton') {\n    buttonProps.isOpen = isOpen;\n  }\n  const renderButton = /*#__PURE__*/cloneElement(button, buttonProps);\n  useImperativeHandle(instanceRef, () => ({\n    openMenu,\n    closeMenu: () => toggleMenu(false)\n  }));\n  return /*#__PURE__*/jsxs(Fragment, {\n    children: [renderButton, /*#__PURE__*/jsx(ControlledMenu, {\n      ...restProps,\n      ...stateProps,\n      \"aria-label\": ariaLabel || (typeof button.props.children === 'string' ? button.props.children : 'Menu'),\n      anchorRef: buttonRef,\n      ref: externalRef,\n      onClose: handleClose\n    })]\n  });\n});\n\nexport { Menu };\n","import { forwardRef, useRef, useContext, memo } from 'react';\nimport { HoverItemContext } from './constants.js';\nimport { jsx } from 'react/jsx-runtime';\n\nconst withHovering = (name, WrappedComponent) => {\n  const Component = /*#__PURE__*/memo(WrappedComponent);\n  const WithHovering = /*#__PURE__*/forwardRef((props, ref) => {\n    const itemRef = useRef(null);\n    return /*#__PURE__*/jsx(Component, {\n      ...props,\n      itemRef: itemRef,\n      externalRef: ref,\n      isHovering: useContext(HoverItemContext) === itemRef.current\n    });\n  });\n  WithHovering.displayName = `WithHovering(${name})`;\n  return WithHovering;\n};\n\nexport { withHovering };\n","import { useLayoutEffect as useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect.js';\n\nconst useItemEffect = (isDisabled, itemRef, updateItems) => {\n  useIsomorphicLayoutEffect(() => {\n    if (process.env.NODE_ENV !== 'production' && !updateItems) {\n      throw new Error(`[React-Menu] This menu item or submenu should be rendered under a menu: ${itemRef.current.outerHTML}`);\n    }\n    if (isDisabled) return;\n    const item = itemRef.current;\n    updateItems(item, true);\n    return () => {\n      updateItems(item);\n    };\n  }, [isDisabled, itemRef, updateItems]);\n};\n\nexport { useItemEffect };\n","import { useContext, useRef, useState, useEffect, useImperativeHandle, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MenuList } from './MenuList.js';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { withHovering } from '../utils/withHovering.js';\nimport { useMenuStateAndFocus } from '../hooks/useMenuStateAndFocus.js';\nimport { useItemEffect } from '../hooks/useItemEffect.js';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { SettingsContext, MenuListContext, MenuListItemContext, menuClass, subMenuClass, roleNone, roleMenuitem, menuItemClass, HoverActionTypes, Keys, FocusPositions } from '../utils/constants.js';\nimport { useCombinedRef } from '../hooks/useCombinedRef.js';\nimport { mergeProps, commonProps, safeCall, isMenuOpen, batchedUpdates } from '../utils/utils.js';\n\nconst SubMenu = /*#__PURE__*/withHovering('SubMenu', function SubMenu({\n  'aria-label': ariaLabel,\n  className,\n  disabled,\n  direction,\n  label,\n  openTrigger,\n  onMenuChange,\n  isHovering,\n  instanceRef,\n  itemRef,\n  captureFocus: _1,\n  repositionFlag: _2,\n  itemProps = {},\n  ...restProps\n}) {\n  const settings = useContext(SettingsContext);\n  const {\n    rootMenuRef,\n    submenuOpenDelay,\n    submenuCloseDelay\n  } = settings;\n  const {\n    parentMenuRef,\n    parentDir,\n    overflow: parentOverflow\n  } = useContext(MenuListContext);\n  const {\n    isParentOpen,\n    submenuCtx,\n    dispatch,\n    updateItems\n  } = useContext(MenuListItemContext);\n  const isPortal = parentOverflow !== 'visible';\n  const [stateProps, toggleMenu, _openMenu] = useMenuStateAndFocus({\n    ...settings,\n    onMenuChange\n  });\n  const {\n    state\n  } = stateProps;\n  const isDisabled = !!disabled;\n  const isOpen = isMenuOpen(state);\n  const containerRef = useRef(null);\n  const [timerId] = useState({\n    v: 0\n  });\n  const stopTimer = () => {\n    submenuCtx.off();\n    if (timerId.v) {\n      clearTimeout(timerId.v);\n      timerId.v = 0;\n    }\n  };\n  const openMenu = (...args) => {\n    stopTimer();\n    setHover();\n    !isDisabled && _openMenu(...args);\n  };\n  const setHover = () => !isHovering && !isDisabled && dispatch(HoverActionTypes.SET, itemRef.current);\n  const delayOpen = delay => {\n    setHover();\n    if (!openTrigger) timerId.v = setTimeout(() => batchedUpdates(openMenu), Math.max(delay, 0));\n  };\n  const onPointerMove = e => {\n    if (isDisabled) return;\n    e.stopPropagation();\n    if (timerId.v || isOpen) return;\n    submenuCtx.on(submenuCloseDelay, () => delayOpen(submenuOpenDelay - submenuCloseDelay), () => delayOpen(submenuOpenDelay));\n  };\n  const onPointerLeave = () => {\n    stopTimer();\n    if (!isOpen) dispatch(HoverActionTypes.UNSET, itemRef.current);\n  };\n  const onKeyDown = e => {\n    if (!isHovering) return;\n    switch (e.key) {\n      case Keys.ENTER:\n        e.preventDefault();\n      case Keys.SPACE:\n      case Keys.RIGHT:\n        openTrigger !== 'none' && openMenu(FocusPositions.FIRST);\n    }\n  };\n  const onKeyDownOfRoot = e => {\n    let handled = false;\n    switch (e.key) {\n      case Keys.LEFT:\n        if (isOpen) {\n          itemRef.current.focus();\n          toggleMenu(false);\n          handled = true;\n        }\n        break;\n      case Keys.RIGHT:\n        if (!isOpen) handled = true;\n        break;\n    }\n    if (handled) {\n      e.preventDefault();\n      e.stopPropagation();\n    }\n  };\n  useItemEffect(isDisabled, itemRef, updateItems);\n  useEffect(() => submenuCtx.toggle(isOpen), [submenuCtx, isOpen]);\n  useEffect(() => () => clearTimeout(timerId.v), [timerId]);\n  useEffect(() => {\n    if (isHovering && isParentOpen) {\n      itemRef.current.focus();\n    } else {\n      toggleMenu(false);\n    }\n  }, [isHovering, isParentOpen, toggleMenu, itemRef]);\n  useImperativeHandle(instanceRef, () => ({\n    openMenu: (...args) => {\n      isParentOpen && openMenu(...args);\n    },\n    closeMenu: () => {\n      if (isOpen) {\n        itemRef.current.focus();\n        toggleMenu(false);\n      }\n    }\n  }));\n  const modifiers = useMemo(() => ({\n    open: isOpen,\n    hover: isHovering,\n    disabled: isDisabled,\n    submenu: true\n  }), [isOpen, isHovering, isDisabled]);\n  const {\n    ref: externalItemRef,\n    className: itemClassName,\n    ...restItemProps\n  } = itemProps;\n  const mergedItemProps = mergeProps({\n    onPointerEnter: submenuCtx.off,\n    onPointerMove,\n    onPointerLeave,\n    onKeyDown,\n    onClick: () => openTrigger !== 'none' && openMenu()\n  }, restItemProps);\n  const getMenuList = () => {\n    const menuList = /*#__PURE__*/jsx(MenuList, {\n      ...restProps,\n      ...stateProps,\n      ariaLabel: ariaLabel || (typeof label === 'string' ? label : 'Submenu'),\n      anchorRef: itemRef,\n      containerRef: isPortal ? rootMenuRef : containerRef,\n      direction: direction || (parentDir === 'right' || parentDir === 'left' ? parentDir : 'right'),\n      parentScrollingRef: isPortal && parentMenuRef,\n      isDisabled: isDisabled\n    });\n    const container = rootMenuRef.current;\n    return isPortal && container ? /*#__PURE__*/createPortal(menuList, container) : menuList;\n  };\n  return /*#__PURE__*/jsxs(\"li\", {\n    className: useBEM({\n      block: menuClass,\n      element: subMenuClass,\n      className\n    }),\n    style: {\n      position: 'relative'\n    },\n    role: roleNone,\n    ref: containerRef,\n    onKeyDown: onKeyDownOfRoot,\n    children: [/*#__PURE__*/jsx(\"div\", {\n      role: roleMenuitem,\n      \"aria-haspopup\": true,\n      \"aria-expanded\": isOpen,\n      ...commonProps(isDisabled, isHovering),\n      ...mergedItemProps,\n      ref: useCombinedRef(externalItemRef, itemRef),\n      className: useBEM({\n        block: menuClass,\n        element: menuItemClass,\n        modifiers,\n        className: itemClassName\n      }),\n      children: useMemo(() => safeCall(label, modifiers), [label, modifiers])\n    }), state && getMenuList()]\n  });\n});\n\nexport { SubMenu };\n","import { useContext, useEffect } from 'react';\nimport { useItemEffect } from './useItemEffect.js';\nimport { SettingsContext, MenuListItemContext, HoverActionTypes } from '../utils/constants.js';\n\nconst useItemState = (itemRef, focusRef, isHovering, isDisabled) => {\n  const {\n    submenuCloseDelay\n  } = useContext(SettingsContext);\n  const {\n    isParentOpen,\n    submenuCtx,\n    dispatch,\n    updateItems\n  } = useContext(MenuListItemContext);\n  const setHover = () => {\n    !isHovering && !isDisabled && dispatch(HoverActionTypes.SET, itemRef.current);\n  };\n  const unsetHover = () => {\n    !isDisabled && dispatch(HoverActionTypes.UNSET, itemRef.current);\n  };\n  const onBlur = e => {\n    if (isHovering && !e.currentTarget.contains(e.relatedTarget)) unsetHover();\n  };\n  const onPointerMove = e => {\n    if (!isDisabled) {\n      e.stopPropagation();\n      submenuCtx.on(submenuCloseDelay, setHover, setHover);\n    }\n  };\n  const onPointerLeave = (_, keepHover) => {\n    submenuCtx.off();\n    !keepHover && unsetHover();\n  };\n  useItemEffect(isDisabled, itemRef, updateItems);\n  useEffect(() => {\n    if (isHovering && isParentOpen) {\n      focusRef.current && focusRef.current.focus();\n    }\n  }, [focusRef, isHovering, isParentOpen]);\n  return {\n    setHover,\n    onBlur,\n    onPointerMove,\n    onPointerLeave\n  };\n};\n\nexport { useItemState };\n","import { useContext, useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useItemState } from '../hooks/useItemState.js';\nimport { EventHandlersContext, RadioGroupContext, roleMenuitem, menuClass, menuItemClass, roleNone, Keys } from '../utils/constants.js';\nimport { useCombinedRef } from '../hooks/useCombinedRef.js';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { withHovering } from '../utils/withHovering.js';\nimport { mergeProps, commonProps, safeCall } from '../utils/utils.js';\n\nconst MenuItem = /*#__PURE__*/withHovering('MenuItem', function MenuItem({\n  className,\n  value,\n  href,\n  type,\n  checked,\n  disabled,\n  children,\n  onClick,\n  isHovering,\n  itemRef,\n  externalRef,\n  ...restProps\n}) {\n  const isDisabled = !!disabled;\n  const {\n    setHover,\n    ...restStateProps\n  } = useItemState(itemRef, itemRef, isHovering, isDisabled);\n  const eventHandlers = useContext(EventHandlersContext);\n  const radioGroup = useContext(RadioGroupContext);\n  const isRadio = type === 'radio';\n  const isCheckBox = type === 'checkbox';\n  const isAnchor = !!href && !isDisabled && !isRadio && !isCheckBox;\n  const isChecked = isRadio ? radioGroup.value === value : isCheckBox ? !!checked : false;\n  const handleClick = e => {\n    if (isDisabled) {\n      e.stopPropagation();\n      e.preventDefault();\n      return;\n    }\n    const event = {\n      value,\n      syntheticEvent: e\n    };\n    if (e.key !== undefined) event.key = e.key;\n    if (isCheckBox) event.checked = !isChecked;\n    if (isRadio) event.name = radioGroup.name;\n    safeCall(onClick, event);\n    if (isRadio) safeCall(radioGroup.onRadioChange, event);\n    eventHandlers.handleClick(event, isCheckBox || isRadio);\n  };\n  const handleKeyDown = e => {\n    if (!isHovering) return;\n    switch (e.key) {\n      case Keys.ENTER:\n        e.preventDefault();\n      case Keys.SPACE:\n        isAnchor ? itemRef.current.click() : handleClick(e);\n    }\n  };\n  const modifiers = useMemo(() => ({\n    type,\n    disabled: isDisabled,\n    hover: isHovering,\n    checked: isChecked,\n    anchor: isAnchor\n  }), [type, isDisabled, isHovering, isChecked, isAnchor]);\n  const mergedProps = mergeProps({\n    ...restStateProps,\n    onPointerDown: setHover,\n    onKeyDown: handleKeyDown,\n    onClick: handleClick\n  }, restProps);\n  const menuItemProps = {\n    role: isRadio ? 'menuitemradio' : isCheckBox ? 'menuitemcheckbox' : roleMenuitem,\n    'aria-checked': isRadio || isCheckBox ? isChecked : undefined,\n    ...commonProps(isDisabled, isHovering),\n    ...mergedProps,\n    ref: useCombinedRef(externalRef, itemRef),\n    className: useBEM({\n      block: menuClass,\n      element: menuItemClass,\n      modifiers,\n      className\n    }),\n    children: useMemo(() => safeCall(children, modifiers), [children, modifiers])\n  };\n  return isAnchor ? /*#__PURE__*/jsx(\"li\", {\n    role: roleNone,\n    children: /*#__PURE__*/jsx(\"a\", {\n      href: href,\n      ...menuItemProps\n    })\n  }) : /*#__PURE__*/jsx(\"li\", {\n    ...menuItemProps\n  });\n});\n\nexport { MenuItem };\n","import { useRef, useContext, useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useItemState } from '../hooks/useItemState.js';\nimport { useCombinedRef } from '../hooks/useCombinedRef.js';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { withHovering } from '../utils/withHovering.js';\nimport { EventHandlersContext, roleMenuitem, menuClass, menuItemClass } from '../utils/constants.js';\nimport { safeCall, mergeProps, commonProps } from '../utils/utils.js';\n\nconst FocusableItem = /*#__PURE__*/withHovering('FocusableItem', function FocusableItem({\n  className,\n  disabled,\n  children,\n  isHovering,\n  itemRef,\n  externalRef,\n  ...restProps\n}) {\n  const isDisabled = !!disabled;\n  const ref = useRef(null);\n  const {\n    setHover,\n    onPointerLeave,\n    ...restStateProps\n  } = useItemState(itemRef, ref, isHovering, isDisabled);\n  const {\n    handleClose\n  } = useContext(EventHandlersContext);\n  const modifiers = useMemo(() => ({\n    disabled: isDisabled,\n    hover: isHovering,\n    focusable: true\n  }), [isDisabled, isHovering]);\n  const renderChildren = useMemo(() => safeCall(children, {\n    ...modifiers,\n    ref,\n    closeMenu: handleClose\n  }), [children, modifiers, handleClose]);\n  const mergedProps = mergeProps({\n    ...restStateProps,\n    onPointerLeave: e => onPointerLeave(e, true),\n    onFocus: setHover\n  }, restProps);\n  return /*#__PURE__*/jsx(\"li\", {\n    role: roleMenuitem,\n    ...commonProps(isDisabled),\n    ...mergedProps,\n    ref: useCombinedRef(externalRef, itemRef),\n    className: useBEM({\n      block: menuClass,\n      element: menuItemClass,\n      modifiers,\n      className\n    }),\n    children: renderChildren\n  });\n});\n\nexport { FocusableItem };\n","import { memo, forwardRef } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { menuClass, menuDividerClass } from '../utils/constants.js';\n\nconst MenuDivider = /*#__PURE__*/memo(/*#__PURE__*/forwardRef(function MenuDivider({\n  className,\n  ...restProps\n}, externalRef) {\n  return /*#__PURE__*/jsx(\"li\", {\n    role: \"separator\",\n    ...restProps,\n    ref: externalRef,\n    className: useBEM({\n      block: menuClass,\n      element: menuDividerClass,\n      className\n    })\n  });\n}));\n\nexport { MenuDivider };\n","import { memo, forwardRef } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { roleNone, menuClass, menuHeaderClass } from '../utils/constants.js';\n\nconst MenuHeader = /*#__PURE__*/memo(/*#__PURE__*/forwardRef(function MenuHeader({\n  className,\n  ...restProps\n}, externalRef) {\n  return /*#__PURE__*/jsx(\"li\", {\n    role: roleNone,\n    ...restProps,\n    ref: externalRef,\n    className: useBEM({\n      block: menuClass,\n      element: menuHeaderClass,\n      className\n    })\n  });\n}));\n\nexport { MenuHeader };\n","import { forwardRef, useRef, useState, useContext } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useLayoutEffect as useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect.js';\nimport { getNormalizedClientRect } from '../positionUtils/getNormalizedClientRect.js';\nimport { useCombinedRef } from '../hooks/useCombinedRef.js';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { MenuListContext, menuClass, menuGroupClass } from '../utils/constants.js';\n\nconst MenuGroup = /*#__PURE__*/forwardRef(function MenuGroup({\n  className,\n  style,\n  takeOverflow,\n  ...restProps\n}, externalRef) {\n  const ref = useRef(null);\n  const [overflowStyle, setOverflowStyle] = useState();\n  const {\n    overflow,\n    overflowAmt\n  } = useContext(MenuListContext);\n  useIsomorphicLayoutEffect(() => {\n    let maxHeight;\n    if (takeOverflow && overflowAmt >= 0) {\n      maxHeight = getNormalizedClientRect(ref.current).height - overflowAmt;\n      if (maxHeight < 0) maxHeight = 0;\n    }\n    setOverflowStyle(maxHeight >= 0 ? {\n      maxHeight,\n      overflow\n    } : undefined);\n  }, [takeOverflow, overflow, overflowAmt]);\n  useIsomorphicLayoutEffect(() => {\n    if (overflowStyle) ref.current.scrollTop = 0;\n  }, [overflowStyle]);\n  return /*#__PURE__*/jsx(\"div\", {\n    ...restProps,\n    ref: useCombinedRef(externalRef, ref),\n    className: useBEM({\n      block: menuClass,\n      element: menuGroupClass,\n      className\n    }),\n    style: {\n      ...style,\n      ...overflowStyle\n    }\n  });\n});\n\nexport { MenuGroup };\n","import { useRef as s, useCallback as h, useEffect as g } from \"react\";\nvar l = /* @__PURE__ */ ((e) => (e.Mouse = \"mouse\", e.Touch = \"touch\", e.Pointer = \"pointer\", e))(l || {}), d = /* @__PURE__ */ ((e) => (e.CancelledByMovement = \"cancelled-by-movement\", e.CancelledByRelease = \"cancelled-by-release\", e.CancelledOutsideElement = \"cancelled-outside-element\", e))(d || {});\nconst A = () => typeof window == \"object\" ? window?.PointerEvent ?? null : null, z = () => typeof window == \"object\" ? window?.TouchEvent ?? null : null;\nfunction U(e) {\n  const { nativeEvent: t } = e, u = z();\n  return u && t instanceof u || \"touches\" in e;\n}\nfunction X(e) {\n  const t = A();\n  return e.nativeEvent instanceof MouseEvent && !(t && e.nativeEvent instanceof t);\n}\nfunction Y(e) {\n  const { nativeEvent: t } = e;\n  if (!t)\n    return !1;\n  const u = A();\n  return u && t instanceof u || \"pointerId\" in t;\n}\nfunction R(e) {\n  return X(e) || U(e) || Y(e);\n}\nfunction j(e) {\n  return U(e) ? {\n    x: e.touches[0].pageX,\n    y: e.touches[0].pageY\n  } : X(e) || Y(e) ? {\n    x: e.pageX,\n    y: e.pageY\n  } : null;\n}\nfunction G(e) {\n  return {\n    target: e.target,\n    currentTarget: e.currentTarget,\n    nativeEvent: e,\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    persist: () => {\n    }\n  };\n}\nfunction J(e, {\n  threshold: t = 400,\n  captureEvent: u = !1,\n  detect: y = l.Pointer,\n  cancelOnMovement: w = !1,\n  cancelOutsideElement: v = !0,\n  filterEvents: p,\n  onStart: M,\n  onMove: C,\n  onFinish: L,\n  onCancel: b\n} = {}) {\n  const P = s(!1), c = s(!1), I = s(), a = s(), T = s(e), f = s(null), E = h(\n    (n) => (r) => {\n      c.current || R(r) && (p !== void 0 && !p(r) || (u && r.persist(), M?.(r, { context: n }), f.current = j(r), c.current = !0, I.current = r.currentTarget, a.current = setTimeout(() => {\n        T.current && (T.current(r, { context: n }), P.current = !0);\n      }, t)));\n    },\n    [u, p, M, t]\n  ), i = h(\n    (n) => (r, o) => {\n      R(r) && c.current && (f.current = null, u && r.persist(), P.current ? L?.(r, { context: n }) : c.current && b?.(r, { context: n, reason: o ?? d.CancelledByRelease }), P.current = !1, c.current = !1, a.current !== void 0 && clearTimeout(a.current));\n    },\n    [u, L, b]\n  ), m = h(\n    (n) => (r) => {\n      if (C?.(r, { context: n }), w !== !1 && f.current) {\n        const o = j(r);\n        if (o) {\n          const B = w === !0 ? 25 : w, D = {\n            x: Math.abs(o.x - f.current.x),\n            y: Math.abs(o.y - f.current.y)\n          };\n          (D.x > B || D.y > B) && i(n)(r, d.CancelledByMovement);\n        }\n      }\n    },\n    [i, w, C]\n  ), q = h(\n    (n) => {\n      if (e === null)\n        return {};\n      switch (y) {\n        case l.Mouse: {\n          const r = {\n            onMouseDown: E(n),\n            onMouseMove: m(n),\n            onMouseUp: i(n)\n          };\n          return v && (r.onMouseLeave = (o) => {\n            i(n)(o, d.CancelledOutsideElement);\n          }), r;\n        }\n        case l.Touch:\n          return {\n            onTouchStart: E(n),\n            onTouchMove: m(n),\n            onTouchEnd: i(n)\n          };\n        case l.Pointer: {\n          const r = {\n            onPointerDown: E(n),\n            onPointerMove: m(n),\n            onPointerUp: i(n)\n          };\n          return v && (r.onPointerLeave = (o) => i(n)(o, d.CancelledOutsideElement)), r;\n        }\n      }\n    },\n    [e, i, v, y, m, E]\n  );\n  return g(() => {\n    if (!window)\n      return;\n    function n(r) {\n      const o = G(r);\n      i()(o);\n    }\n    return window.addEventListener(\"mouseup\", n), window.addEventListener(\"touchend\", n), window.addEventListener(\"pointerup\", n), () => {\n      window.removeEventListener(\"mouseup\", n), window.removeEventListener(\"touchend\", n), window.removeEventListener(\"pointerup\", n);\n    };\n  }, [i]), g(\n    () => () => {\n      a.current !== void 0 && clearTimeout(a.current);\n    },\n    []\n  ), g(() => {\n    T.current = e;\n  }, [e]), q;\n}\nexport {\n  d as LongPressCallbackReason,\n  l as LongPressEventType,\n  J as useLongPress\n};\n","import { i18n } from '@lingui/core';\n\nimport localeMatch from './locale-match';\nimport mem from './mem';\n\nconst defaultLocale = mem(\n  () => new Intl.DateTimeFormat().resolvedOptions().locale,\n);\n\nconst _DateTimeFormat = (opts) => {\n  const { locale, dateYear, hideTime, formatOpts, forceOpts } = opts || {};\n  const regionlessLocale = locale.replace(/-[a-z]+$/i, '');\n  const loc = localeMatch([regionlessLocale], [defaultLocale], locale);\n  const currentYear = new Date().getFullYear();\n  const options = forceOpts || {\n    // Show year if not current year\n    year: dateYear === currentYear ? undefined : 'numeric',\n    month: 'short',\n    day: 'numeric',\n    // Hide time if requested\n    hour: hideTime ? undefined : 'numeric',\n    minute: hideTime ? undefined : 'numeric',\n    ...formatOpts,\n  };\n  try {\n    return Intl.DateTimeFormat(loc, options);\n  } catch (e) {}\n  try {\n    return Intl.DateTimeFormat(locale, options);\n  } catch (e) {}\n  return Intl.DateTimeFormat(undefined, options);\n};\nconst DateTimeFormat = mem(_DateTimeFormat);\n\nfunction niceDateTime(date, dtfOpts) {\n  if (!(date instanceof Date)) {\n    date = new Date(date);\n  }\n  const DTF = DateTimeFormat({\n    dateYear: date.getFullYear(),\n    locale: i18n.locale,\n    ...dtfOpts,\n  });\n  const dateText = DTF.format(date);\n  return dateText;\n}\n\nexport default niceDateTime;\n","import { t } from '@lingui/core/macro';\n\nexport default function openCompose(opts) {\n  const url = URL.parse('/compose/', window.location);\n  const { width: screenWidth, height: screenHeight } = window.screen;\n  const left = Math.max(0, (screenWidth - 600) / 2);\n  const top = Math.max(0, (screenHeight - 450) / 2);\n  const width = Math.min(screenWidth, 600);\n  const height = Math.min(screenHeight, 450);\n  const winUID = opts?.uid || Math.random();\n  const newWin = window.open(\n    url,\n    'compose' + winUID,\n    `width=${width},height=${height},left=${left},top=${top}`,\n  );\n\n  if (newWin) {\n    // if (masto) {\n    //   newWin.masto = masto;\n    // }\n\n    newWin.__COMPOSE__ = opts;\n  } else {\n    alert(t`Looks like your browser is blocking popups.`);\n  }\n\n  return newWin;\n}\n","const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755\n\nexport default function openOSK() {\n  if (isSafari) {\n    const fauxEl = document.createElement('input');\n    fauxEl.style.position = 'absolute';\n    fauxEl.style.top = '0';\n    fauxEl.style.left = '0';\n    fauxEl.style.opacity = '0';\n    document.body.appendChild(fauxEl);\n    fauxEl.focus();\n    setTimeout(() => {\n      document.body.removeChild(fauxEl);\n    }, 500);\n  }\n}\n","const root = document.documentElement;\nconst style = getComputedStyle(root);\nconst defaultBoundingBoxPadding = 8;\n\nlet safeAreaInsets = [0, 0, 0, 0];\nfunction getSafeAreaInsets() {\n  // Get safe area inset variables from root\n  const safeAreaInsetTop = style.getPropertyValue('--sai-top');\n  const safeAreaInsetRight = style.getPropertyValue('--sai-right');\n  const safeAreaInsetBottom = style.getPropertyValue('--sai-bottom');\n  const safeAreaInsetLeft = style.getPropertyValue('--sai-left');\n  safeAreaInsets = [\n    // top, right, bottom, left (clockwise)\n    Math.max(0, parseInt(safeAreaInsetTop, 10)),\n    Math.max(0, parseInt(safeAreaInsetRight, 10)),\n    Math.max(0, parseInt(safeAreaInsetBottom, 10)),\n    Math.max(0, parseInt(safeAreaInsetLeft, 10)),\n  ];\n}\nrequestAnimationFrame(getSafeAreaInsets);\n\nfunction safeBoundingBoxPadding(paddings = []) {\n  const str = safeAreaInsets\n    .map((v, i) => (v || defaultBoundingBoxPadding) + (paddings[i] || 0))\n    .join(' ');\n  // console.log(str);\n  return str;\n}\n\n// Update safe area insets when orientation or resize\nif (CSS.supports('top: env(safe-area-inset-top)')) {\n  window.addEventListener('resize', getSafeAreaInsets, { passive: true });\n}\n\nexport default safeBoundingBoxPadding;\n","import { t } from '@lingui/core/macro';\n\nimport openOSK from './open-osk';\nimport showToast from './show-toast';\nimport states from './states';\n\nconst TOAST_DURATION = 5_000; // 5 seconds\n\nexport default function showCompose(opts) {\n  if (!opts) opts = true;\n\n  if (states.showCompose) {\n    if (states.composerState.minimized) {\n      showToast({\n        duration: TOAST_DURATION,\n        text: t`A draft post is currently minimized. Post or discard it before creating a new one.`,\n      });\n    } else {\n      showToast({\n        duration: TOAST_DURATION,\n        text: t`A post is currently open. Post or discard it before creating a new one.`,\n      });\n    }\n    return;\n  }\n\n  openOSK();\n  states.showCompose = opts;\n}\n","import mem from './mem';\n\nconst div = document.createElement('div');\nfunction getHTMLText(html, opts) {\n  if (!html) return '';\n  const { preProcess } = opts || {};\n\n  div.innerHTML = html\n    .replace(/<\\/p>/g, '</p>\\n\\n')\n    .replace(/<\\/li>/g, '</li>\\n');\n  div.querySelectorAll('br').forEach((br) => {\n    br.replaceWith('\\n');\n  });\n\n  preProcess?.(div);\n\n  // MASTODON-SPECIFIC classes\n  // Remove .invisible\n  div.querySelectorAll('.invisible').forEach((el) => {\n    el.remove();\n  });\n  // Add … at end of .ellipsis\n  div.querySelectorAll('.ellipsis').forEach((el) => {\n    el.append('...');\n  });\n\n  return div.innerText.replace(/[\\r\\n]{3,}/g, '\\n\\n').trim();\n}\n\nexport default mem(getHTMLText);\n","import getHTMLText from './getHTMLText';\n\nfunction statusPeek(status) {\n  const { spoilerText, content, poll, mediaAttachments } = status;\n  let text = '';\n  if (spoilerText?.trim()) {\n    text += spoilerText;\n  } else {\n    text += getHTMLText(content);\n  }\n  text = text.trim();\n  if (poll?.options?.length) {\n    text += `\\n\\n📊:\\n${poll.options\n      .map((o) => `${poll.multiple ? '▪️' : '•'} ${o.title}`)\n      .join('\\n')}`;\n  }\n  if (mediaAttachments?.length) {\n    text +=\n      ' ' +\n      mediaAttachments\n        .map(\n          (m) =>\n            ({\n              image: '🖼️',\n              gifv: '🎞️',\n              video: '📹',\n              audio: '🎵',\n              unknown: '',\n            })[m.type] || '',\n        )\n        .join('');\n  }\n  return text;\n}\n\nexport default statusPeek;\n","export const ICONS = {\n  x: () => import('@iconify-icons/mingcute/close-line'),\n  heart: () => import('@iconify-icons/mingcute/heart-line'),\n  bookmark: () => import('@iconify-icons/mingcute/bookmark-line'),\n  'check-circle': () => import('@iconify-icons/mingcute/check-circle-line'),\n  'x-circle': () => import('@iconify-icons/mingcute/close-circle-line'),\n  transfer: () => import('@iconify-icons/mingcute/transfer-4-line'),\n  rocket: () => import('@iconify-icons/mingcute/rocket-line'),\n  'arrow-left': {\n    module: () => import('@iconify-icons/mingcute/arrow-left-line'),\n    rtl: true,\n  },\n  'arrow-right': {\n    module: () => import('@iconify-icons/mingcute/arrow-right-line'),\n    rtl: true,\n  },\n  'arrow-up': () => import('@iconify-icons/mingcute/arrow-up-line'),\n  'arrow-down': () => import('@iconify-icons/mingcute/arrow-down-line'),\n  earth: () => import('@iconify-icons/mingcute/earth-line'),\n  lock: () => import('@iconify-icons/mingcute/lock-line'),\n  unlock: () => import('@iconify-icons/mingcute/unlock-line'),\n  'eye-close': () => import('@iconify-icons/mingcute/eye-close-line'),\n  'eye-open': () => import('@iconify-icons/mingcute/eye-2-line'),\n  message: () => import('@iconify-icons/mingcute/mail-line'),\n  comment: {\n    module: () => import('@iconify-icons/mingcute/chat-3-line'),\n    rtl: true,\n  },\n  comment2: {\n    module: () => import('@iconify-icons/mingcute/comment-2-line'),\n    rtl: true,\n  },\n  home: () => import('@iconify-icons/mingcute/home-3-line'),\n  notification: () => import('@iconify-icons/mingcute/notification-line'),\n  follow: () => import('@iconify-icons/mingcute/user-follow-line'),\n  'follow-add': () => import('@iconify-icons/mingcute/user-add-line'),\n  poll: [() => import('@iconify-icons/mingcute/chart-bar-line'), '90deg'],\n  pencil: () => import('@iconify-icons/mingcute/pencil-line'),\n  quill: () => import('@iconify-icons/mingcute/quill-pen-line'),\n  at: () => import('@iconify-icons/mingcute/at-line'),\n  attachment: () => import('@iconify-icons/mingcute/attachment-line'),\n  upload: () => import('@iconify-icons/mingcute/upload-3-line'),\n  gear: () => import('@iconify-icons/mingcute/settings-3-line'),\n  more: () => import('@iconify-icons/mingcute/more-3-line'),\n  more2: () => import('@iconify-icons/mingcute/more-1-fill'),\n  external: {\n    module: () => import('@iconify-icons/mingcute/external-link-line'),\n    rtl: true,\n  },\n  popout: {\n    module: () => import('@iconify-icons/mingcute/external-link-line'),\n    rtl: true,\n  },\n  popin: {\n    module: () => import('@iconify-icons/mingcute/external-link-line'),\n    rotate: '180deg',\n    rtl: true,\n  },\n  plus: () => import('@iconify-icons/mingcute/add-circle-line'),\n  'chevron-left': {\n    module: () => import('@iconify-icons/mingcute/left-line'),\n    rtl: true,\n  },\n  'chevron-right': {\n    module: () => import('@iconify-icons/mingcute/right-line'),\n    rtl: true,\n  },\n  'chevron-down': () => import('@iconify-icons/mingcute/down-line'),\n  reply: {\n    module: () => import('@iconify-icons/mingcute/share-forward-line'),\n    rotate: '180deg',\n    flip: 'horizontal',\n    rtl: true,\n  },\n  thread: () => import('@iconify-icons/mingcute/route-line'),\n  group: {\n    module: () => import('@iconify-icons/mingcute/group-line'),\n    rtl: true,\n  },\n  bot: () => import('@iconify-icons/mingcute/android-2-line'),\n  menu: () => import('@iconify-icons/mingcute/rows-4-line'),\n  list: {\n    module: () => import('@iconify-icons/mingcute/list-check-line'),\n    rtl: true,\n  },\n  search: () => import('@iconify-icons/mingcute/search-2-line'),\n  hashtag: () => import('@iconify-icons/mingcute/hashtag-line'),\n  info: () => import('@iconify-icons/mingcute/information-line'),\n  shortcut: () => import('@iconify-icons/mingcute/lightning-line'),\n  user: () => import('@iconify-icons/mingcute/user-4-line'),\n  following: () => import('@iconify-icons/mingcute/walk-line'),\n  pin: () => import('@iconify-icons/mingcute/pin-line'),\n  unpin: [() => import('@iconify-icons/mingcute/pin-line'), '180deg'],\n  bus: () => import('@iconify-icons/mingcute/bus-2-line'),\n  link: () => import('@iconify-icons/mingcute/link-2-line'),\n  history: () => import('@iconify-icons/mingcute/history-line'),\n  share: () => import('@iconify-icons/mingcute/share-2-line'),\n  sparkles: () => import('@iconify-icons/mingcute/sparkles-line'),\n  sparkles2: () => import('@iconify-icons/mingcute/sparkles-2-line'),\n  exit: {\n    module: () => import('@iconify-icons/mingcute/exit-line'),\n    rtl: true,\n  },\n  translate: () => import('@iconify-icons/mingcute/translate-line'),\n  play: () => import('@iconify-icons/mingcute/play-fill'),\n  trash: () => import('@iconify-icons/mingcute/delete-2-line'),\n  mute: {\n    module: () => import('@iconify-icons/mingcute/volume-mute-line'),\n    rtl: true,\n  },\n  unmute: {\n    module: () => import('@iconify-icons/mingcute/volume-line'),\n    rtl: true,\n  },\n  block: () => import('@iconify-icons/mingcute/forbid-circle-line'),\n  unblock: [\n    () => import('@iconify-icons/mingcute/forbid-circle-line'),\n    '180deg',\n  ],\n  flag: () => import('@iconify-icons/mingcute/flag-1-line'),\n  time: () => import('@iconify-icons/mingcute/time-line'),\n  refresh: () => import('@iconify-icons/mingcute/refresh-2-line'),\n  emoji2: () => import('@iconify-icons/mingcute/emoji-2-line'),\n  filter: () => import('@iconify-icons/mingcute/filter-2-line'),\n  filters: () => import('@iconify-icons/mingcute/filter-line'),\n  chart: () => import('@iconify-icons/mingcute/chart-line-line'),\n  react: () => import('@iconify-icons/mingcute/react-line'),\n  layout4: {\n    module: () => import('@iconify-icons/mingcute/layout-4-line'),\n    rtl: true,\n  },\n  layout5: () => import('@iconify-icons/mingcute/layout-5-line'),\n  announce: {\n    module: () => import('@iconify-icons/mingcute/announcement-line'),\n    rtl: true,\n  },\n  alert: () => import('@iconify-icons/mingcute/alert-line'),\n  round: () => import('@iconify-icons/mingcute/round-fill'),\n  'arrow-up-circle': () =>\n    import('@iconify-icons/mingcute/arrow-up-circle-line'),\n  'arrow-down-circle': () =>\n    import('@iconify-icons/mingcute/arrow-down-circle-line'),\n  clipboard: {\n    module: () => import('@iconify-icons/mingcute/clipboard-line'),\n    rtl: true,\n  },\n  'account-edit': () => import('@iconify-icons/mingcute/user-edit-line'),\n  'account-warning': () => import('@iconify-icons/mingcute/user-warning-line'),\n  keyboard: () => import('@iconify-icons/mingcute/keyboard-line'),\n  cloud: () => import('@iconify-icons/mingcute/cloud-line'),\n  month: {\n    module: () => import('@iconify-icons/mingcute/calendar-month-line'),\n    rtl: true,\n  },\n  media: () => import('@iconify-icons/mingcute/photo-album-line'),\n  speak: () => import('@iconify-icons/mingcute/radar-line'),\n  building: () => import('@iconify-icons/mingcute/building-5-line'),\n  history2: {\n    module: () => import('@iconify-icons/mingcute/history-2-line'),\n    rtl: true,\n  },\n  document: () => import('@iconify-icons/mingcute/document-line'),\n  'arrows-right': {\n    module: () => import('@iconify-icons/mingcute/arrows-right-line'),\n    rtl: true,\n  },\n  code: () => import('@iconify-icons/mingcute/code-line'),\n  copy: () => import('@iconify-icons/mingcute/copy-2-line'),\n  quote: {\n    module: () => import('@iconify-icons/mingcute/quote-left-line'),\n    rtl: true,\n  },\n  settings: () => import('@iconify-icons/mingcute/settings-6-line'),\n  'heart-break': () => import('@iconify-icons/mingcute/heart-crack-line'),\n  'user-x': () => import('@iconify-icons/mingcute/user-x-line'),\n  minimize: () => import('@iconify-icons/mingcute/arrows-down-line'),\n  celebrate: () => import('@iconify-icons/mingcute/celebrate-line'),\n  schedule: () => import('@iconify-icons/mingcute/calendar-time-add-line'),\n  month: () => import('@iconify-icons/mingcute/calendar-month-line'),\n  day: () => import('@iconify-icons/mingcute/calendar-day-line'),\n  camera: () => import('@iconify-icons/mingcute/camera-line'),\n};\n","import moize from 'moize';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { ICONS } from './ICONS';\n\nconst SIZES = {\n  s: 12,\n  m: 16,\n  l: 20,\n  xl: 24,\n  xxl: 32,\n};\n\nconst ICONDATA = {};\n\n// Memoize the dangerouslySetInnerHTML of the SVGs\nconst SVGICon = moize(\n  function ({ width, height, body, rotate, flip }) {\n    return (\n      <svg\n        viewBox={`0 0 ${width} ${height}`}\n        dangerouslySetInnerHTML={{ __html: body }}\n        style={{\n          transform: `${rotate ? `rotate(${rotate})` : ''} ${\n            flip ? `scaleX(-1)` : ''\n          }`,\n        }}\n      />\n    );\n  },\n  {\n    isShallowEqual: true,\n    maxSize: Object.keys(ICONS).length,\n    matchesArg: (cacheKeyArg, keyArg) =>\n      cacheKeyArg.icon === keyArg.icon && cacheKeyArg.body === keyArg.body,\n  },\n);\n\nfunction Icon({\n  icon,\n  size = 'm',\n  alt,\n  title,\n  class: className = '',\n  style = {},\n}) {\n  if (!icon) return null;\n\n  const iconSize = SIZES[size];\n  let iconBlock = ICONS[icon];\n  if (!iconBlock) {\n    console.warn(`Icon ${icon} not found`);\n    return null;\n  }\n\n  let rotate,\n    flip,\n    rtl = false;\n  if (Array.isArray(iconBlock)) {\n    [iconBlock, rotate, flip] = iconBlock;\n  } else if (typeof iconBlock === 'object') {\n    ({ rotate, flip, rtl } = iconBlock);\n    iconBlock = iconBlock.module;\n  }\n\n  const [iconData, setIconData] = useState(ICONDATA[icon]);\n  const currentIcon = useRef(icon);\n  useEffect(() => {\n    if (iconData && currentIcon.current === icon) return;\n    (async () => {\n      const iconB = await iconBlock();\n      setIconData(iconB.default);\n      ICONDATA[icon] = iconB.default;\n    })();\n    currentIcon.current = icon;\n  }, [icon]);\n\n  return (\n    <span\n      class={`icon ${className} ${rtl ? 'rtl-flip' : ''}`}\n      title={title || alt}\n      style={{\n        width: `${iconSize}px`,\n        height: `${iconSize}px`,\n        ...style,\n      }}\n      data-icon={icon}\n    >\n      {iconData && (\n        // <svg\n        //   width={iconSize}\n        //   height={iconSize}\n        //   viewBox={`0 0 ${iconData.width} ${iconData.height}`}\n        //   dangerouslySetInnerHTML={{ __html: iconData.body }}\n        //   style={{\n        //     transform: `${rotate ? `rotate(${rotate})` : ''} ${\n        //       flip ? `scaleX(-1)` : ''\n        //     }`,\n        //   }}\n        // />\n        <SVGICon\n          icon={icon}\n          width={iconData.width}\n          height={iconData.height}\n          body={iconData.body}\n          rotate={rotate}\n          flip={flip}\n        />\n      )}\n    </span>\n  );\n}\n\nexport default Icon;\n","import { forwardRef } from 'preact/compat';\nimport { useLocation } from 'react-router-dom';\n\nimport states from '../utils/states';\n\n/* NOTES\n   =====\n   Initially this uses <NavLink> from react-router-dom, but it doesn't work:\n   1. It interferes with nested <a> inside <a> and it's difficult to preventDefault/stopPropagation from the nested <a>\n   2. isActive doesn't work properly with the weird routes that's set up in this app, due to the faux \"location\" to make the modals work and prevent unmounting\n   3. Not using <Link state/> because it modifies history.state that *persists* across page reloads. I don't need that, so using valtio's states instead.\n*/\n\nconst Link = forwardRef((props, ref) => {\n  let routerLocation;\n  try {\n    routerLocation = useLocation();\n  } catch (e) {}\n  let hash = (location.hash || '').replace(/^#/, '').trim();\n  if (hash === '') hash = '/';\n  const { to, ...restProps } = props;\n\n  // Handle encodeURIComponent of searchParams values\n  if (!!hash && hash !== '/' && hash.includes('?')) {\n    const parsedHash = URL.parse(hash, location.origin); // Fake base URL\n    if (parsedHash?.searchParams?.size) {\n      const searchParamsStr = Array.from(parsedHash.searchParams.entries())\n        .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)\n        .join('&');\n      hash = parsedHash.pathname + '?' + searchParamsStr;\n    }\n  }\n\n  const isActive = hash === to || decodeURIComponent(hash) === to;\n  return (\n    <a\n      ref={ref}\n      href={`#${to}`}\n      {...restProps}\n      class={`${props.class || ''} ${isActive ? 'is-active' : ''}`}\n      onClick={(e) => {\n        if (e.currentTarget?.parentNode?.closest('a')) {\n          // If this <a> is nested inside another <a>\n          e.stopPropagation();\n        }\n        if (routerLocation) states.prevLocation = routerLocation;\n        props.onClick?.(e);\n      }}\n    />\n  );\n});\n\nexport default Link;\n","import { FocusableItem } from '@szhsin/react-menu';\n\nimport Link from './link';\n\nfunction MenuLink(props) {\n  const { className, disabled, ...restProps } = props;\n  return (\n    <FocusableItem className={className} disabled={disabled}>\n      {({ ref, closeMenu }) => (\n        <Link\n          {...restProps}\n          ref={ref}\n          onClick={({ detail }) =>\n            closeMenu(detail === 0 ? 'Enter' : undefined)\n          }\n        />\n      )}\n    </FocusableItem>\n  );\n}\n\nexport default MenuLink;\n","import { i18n } from '@lingui/core';\nimport { t } from '@lingui/core/macro';\nimport { useEffect, useMemo, useReducer } from 'preact/hooks';\n\nimport localeMatch from '../utils/locale-match';\nimport mem from '../utils/mem';\n\nfunction isValidDate(value) {\n  if (value instanceof Date) {\n    return !isNaN(value.getTime());\n  } else {\n    const date = new Date(value);\n    return !isNaN(date.getTime());\n  }\n}\n\nconst resolvedLocale = mem(\n  () => new Intl.DateTimeFormat().resolvedOptions().locale,\n);\nconst DTF = mem((locale, opts = {}) => {\n  const regionlessLocale = locale.replace(/-[a-z]+$/i, '');\n  const lang = localeMatch([regionlessLocale], [resolvedLocale()], locale);\n  try {\n    return new Intl.DateTimeFormat(lang, opts);\n  } catch (e) {}\n  try {\n    return new Intl.DateTimeFormat(locale, opts);\n  } catch (e) {}\n  return new Intl.DateTimeFormat(undefined, opts);\n});\nconst RTF = mem((locale) => new Intl.RelativeTimeFormat(locale || undefined));\n\nconst minute = 60;\nconst hour = 60 * minute;\nconst day = 24 * hour;\n\nconst rtfFromNow = (date) => {\n  // date = Date object\n  const rtf = RTF(i18n.locale);\n  const seconds = (date.getTime() - Date.now()) / 1000;\n  const absSeconds = Math.abs(seconds);\n  if (absSeconds < minute) {\n    return rtf.format(Math.floor(seconds), 'second');\n  } else if (absSeconds < hour) {\n    return rtf.format(Math.floor(seconds / minute), 'minute');\n  } else if (absSeconds < day) {\n    return rtf.format(Math.floor(seconds / hour), 'hour');\n  } else if (absSeconds < 30 * day) {\n    return rtf.format(Math.floor(seconds / day), 'day');\n  } else {\n    return rtf.format(Math.floor(seconds / day / 30), 'month');\n  }\n};\n\nconst twitterFromNow = (date) => {\n  // date = Date object\n  const seconds = (Date.now() - date.getTime()) / 1000;\n  if (seconds < minute) {\n    return t({\n      comment: 'Relative time in seconds, as short as possible',\n      message: `${seconds < 1 ? 1 : Math.floor(seconds)}s`,\n    });\n  } else if (seconds < hour) {\n    return t({\n      comment: 'Relative time in minutes, as short as possible',\n      message: `${Math.floor(seconds / minute)}m`,\n    });\n  } else {\n    return t({\n      comment: 'Relative time in hours, as short as possible',\n      message: `${Math.floor(seconds / hour)}h`,\n    });\n  }\n};\n\nexport default function RelativeTime({ datetime, format }) {\n  if (!datetime) return null;\n  const [renderCount, rerender] = useReducer((x) => x + 1, 0);\n  const date = useMemo(() => new Date(datetime), [datetime]);\n  const [dateStr, dt, title] = useMemo(() => {\n    if (!isValidDate(date))\n      return ['' + (typeof datetime === 'string' ? datetime : ''), '', ''];\n    let str;\n    if (format === 'micro') {\n      // If date <= 1 day ago or day is within this year\n      const now = new Date();\n      const dayDiff = (now.getTime() - date.getTime()) / 1000 / day;\n      if (dayDiff <= 1) {\n        str = twitterFromNow(date);\n      } else {\n        const sameYear = now.getFullYear() === date.getFullYear();\n        if (sameYear) {\n          str = DTF(i18n.locale, {\n            year: undefined,\n            month: 'short',\n            day: 'numeric',\n          }).format(date);\n        } else {\n          str = DTF(i18n.locale, {\n            dateStyle: 'short',\n          }).format(date);\n        }\n      }\n    }\n    if (!str) str = rtfFromNow(date);\n    return [str, date.toISOString(), date.toLocaleString()];\n  }, [date, format, renderCount]);\n\n  useEffect(() => {\n    if (!isValidDate(date)) return;\n    let timeout;\n    let raf;\n    function rafRerender() {\n      raf = requestAnimationFrame(() => {\n        rerender();\n        scheduleRerender();\n      });\n    }\n    function scheduleRerender() {\n      // If less than 1 minute, rerender every 10s\n      // If less than 1 hour rerender every 1m\n      // Else, don't need to rerender\n      const seconds = (Date.now() - date.getTime()) / 1000;\n      if (seconds < minute) {\n        timeout = setTimeout(rafRerender, 10_000);\n      } else if (seconds < hour) {\n        timeout = setTimeout(rafRerender, 60_000);\n      }\n    }\n    scheduleRerender();\n    return () => {\n      clearTimeout(timeout);\n      cancelAnimationFrame(raf);\n    };\n  }, []);\n\n  return (\n    <time datetime={dt} title={title}>\n      {dateStr}\n    </time>\n  );\n}\n","import { SubMenu } from '@szhsin/react-menu';\nimport { useRef } from 'preact/hooks';\n\nexport default function SubMenu2(props) {\n  const menuRef = useRef();\n  return (\n    <SubMenu\n      {...props}\n      instanceRef={menuRef}\n      // Test fix for bug; submenus not opening on Android\n      itemProps={{\n        onPointerMove: (e) => {\n          if (e.pointerType === 'touch') {\n            menuRef.current?.openMenu?.();\n          }\n        },\n        onPointerLeave: (e) => {\n          if (e.pointerType === 'touch') {\n            menuRef.current?.openMenu?.();\n          }\n        },\n        ...props.itemProps,\n      }}\n    />\n  );\n}\n","import { useEffect } from 'preact/hooks';\n\n// NOTE: The order of initialized close watchers is important\n// Last one will intercept first if there are multiple/nested close watchers\n// So if this hook reruns, the previous close watcher will be destroyed, the new one will be created and the order will change\nfunction useCloseWatcher(fn, deps = []) {\n  if (!fn || typeof fn !== 'function') return;\n  useEffect(() => {\n    console.log('useCloseWatcher');\n    const watcher = new CloseWatcher();\n    watcher.addEventListener('close', fn);\n    return () => {\n      watcher.destroy();\n    };\n  }, deps);\n}\n\nexport default window.CloseWatcher ? useCloseWatcher : () => {};\n","import './modal.css';\n\nimport { createPortal } from 'preact/compat';\nimport { useEffect, useLayoutEffect, useRef } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport store from '../utils/store';\nimport useCloseWatcher from '../utils/useCloseWatcher';\n\nconst $modalContainer = document.getElementById('modal-container');\n\nfunction getBackdropThemeColor() {\n  return getComputedStyle(document.documentElement).getPropertyValue(\n    '--backdrop-theme-color',\n  );\n}\n\nfunction Modal({ children, onClose, onClick, class: className, minimized }) {\n  if (!children) return null;\n\n  const modalRef = useRef();\n  useEffect(() => {\n    let timer = setTimeout(() => {\n      const focusElement = modalRef.current?.querySelector('[tabindex=\"-1\"]');\n      if (focusElement) {\n        focusElement.focus();\n      }\n    }, 100);\n    return () => clearTimeout(timer);\n  }, []);\n\n  const supportsCloseWatcher = window.CloseWatcher;\n  const escRef = useHotkeys(\n    'esc',\n    () => {\n      setTimeout(() => {\n        onClose?.();\n      }, 0);\n    },\n    {\n      enabled: !supportsCloseWatcher && !!onClose,\n      // Using keyup and setTimeout above\n      // This will run \"later\" to prevent clash with esc handlers from other components\n      keydown: false,\n      keyup: true,\n    },\n    [onClose],\n  );\n  useCloseWatcher(onClose, [onClose]);\n\n  useEffect(() => {\n    const $deckContainers = document.querySelectorAll('.deck-container');\n    if (minimized) {\n      // Similar to focusDeck in focus-deck.jsx\n      // Focus last deck\n      const page = $deckContainers[$deckContainers.length - 1]; // last one\n      if (page && page.tabIndex === -1) {\n        page.focus();\n      }\n    } else {\n      if (children) {\n        $deckContainers.forEach(($deckContainer) => {\n          $deckContainer.setAttribute('inert', '');\n        });\n      } else {\n        $deckContainers.forEach(($deckContainer) => {\n          $deckContainer.removeAttribute('inert');\n        });\n      }\n    }\n    return () => {\n      $deckContainers.forEach(($deckContainer) => {\n        $deckContainer.removeAttribute('inert');\n      });\n    };\n  }, [children, minimized]);\n\n  const $meta = useRef();\n  const metaColor = useRef();\n  useLayoutEffect(() => {\n    if (children && !minimized) {\n      const theme = store.local.get('theme');\n      if (theme) {\n        const backdropColor = getBackdropThemeColor();\n        console.log({ backdropColor });\n        $meta.current = document.querySelector(\n          `meta[name=\"theme-color\"][data-theme-setting=\"manual\"]`,\n        );\n        if ($meta.current) {\n          metaColor.current = $meta.current.content;\n          $meta.current.content = backdropColor;\n        }\n      } else {\n        const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')\n          .matches\n          ? 'dark'\n          : 'light';\n        const backdropColor = getBackdropThemeColor();\n        console.log({ backdropColor });\n        $meta.current = document.querySelector(\n          `meta[name=\"theme-color\"][media*=\"${colorScheme}\"]`,\n        );\n        if ($meta.current) {\n          metaColor.current = $meta.current.content;\n          $meta.current.content = backdropColor;\n        }\n      }\n    } else {\n      // Reset meta color\n      if ($meta.current && metaColor.current) {\n        $meta.current.content = metaColor.current;\n      }\n    }\n    return () => {\n      // Reset meta color\n      if ($meta.current && metaColor.current) {\n        $meta.current.content = metaColor.current;\n      }\n    };\n  }, [children, minimized]);\n\n  const Modal = (\n    <div\n      ref={(node) => {\n        modalRef.current = node;\n        escRef(node?.querySelector?.('[tabindex=\"-1\"]') || node);\n      }}\n      className={className}\n      onClick={(e) => {\n        onClick?.(e);\n        if (e.target === e.currentTarget) {\n          onClose?.(e);\n        }\n      }}\n      tabIndex={minimized ? 0 : '-1'}\n      inert={minimized}\n      onFocus={(e) => {\n        try {\n          if (e.target === e.currentTarget) {\n            const focusElement =\n              modalRef.current?.querySelector('[tabindex=\"-1\"]');\n            const isFocusable =\n              !!focusElement &&\n              getComputedStyle(focusElement)?.pointerEvents !== 'none';\n            if (focusElement && isFocusable) {\n              focusElement.focus();\n            }\n          }\n        } catch (err) {\n          console.error(err);\n        }\n      }}\n    >\n      {children}\n    </div>\n  );\n\n  return createPortal(Modal, $modalContainer);\n\n  // return createPortal(children, $modalContainer);\n}\n\nexport default Modal;\n","import './avatar.css';\n\nimport { useRef } from 'preact/hooks';\n\nimport mem from '../utils/mem';\n\nconst SIZES = {\n  s: 16,\n  m: 20,\n  l: 24,\n  xl: 32,\n  xxl: 50,\n  xxxl: 64,\n};\n\nconst alphaCache = {};\n\nconst canvas = window.OffscreenCanvas\n  ? new OffscreenCanvas(1, 1)\n  : document.createElement('canvas');\nconst ctx = canvas.getContext('2d', {\n  willReadFrequently: true,\n});\nctx.imageSmoothingEnabled = false;\n\nconst MISSING_IMAGE_PATH_REGEX = /missing\\.png$/;\n\nfunction Avatar({ url, size, alt = '', squircle, ...props }) {\n  size = SIZES[size] || size || SIZES.m;\n  const avatarRef = useRef();\n  const isMissing = MISSING_IMAGE_PATH_REGEX.test(url);\n  return (\n    <span\n      ref={avatarRef}\n      class={`avatar ${squircle ? 'squircle' : ''} ${\n        alphaCache[url] ? 'has-alpha' : ''\n      }`}\n      style={{\n        width: size,\n        height: size,\n      }}\n      title={alt}\n      {...props}\n    >\n      {!!url && (\n        <img\n          src={url}\n          width={size}\n          height={size}\n          alt={alt}\n          loading=\"lazy\"\n          decoding=\"async\"\n          fetchPriority=\"low\"\n          crossOrigin={\n            alphaCache[url] === undefined && !isMissing\n              ? 'anonymous'\n              : undefined\n          }\n          onError={(e) => {\n            if (e.target.crossOrigin) {\n              e.target.crossOrigin = null;\n              e.target.src = url;\n            }\n          }}\n          onLoad={(e) => {\n            if (avatarRef.current) avatarRef.current.dataset.loaded = true;\n            if (alphaCache[url] !== undefined) return;\n            if (isMissing) return;\n            setTimeout(() => {\n              try {\n                // Check if image has alpha channel\n                const { width, height } = e.target;\n                if (canvas.width !== width) canvas.width = width;\n                if (canvas.height !== height) canvas.height = height;\n                ctx.drawImage(e.target, 0, 0);\n                const allPixels = ctx.getImageData(0, 0, width, height);\n                // At least 10% of pixels have alpha <= 128\n                const hasAlpha =\n                  allPixels.data.filter(\n                    (pixel, i) => i % 4 === 3 && pixel <= 128,\n                  ).length /\n                    (allPixels.data.length / 4) >\n                  0.1;\n                if (hasAlpha) {\n                  // console.log('hasAlpha', hasAlpha, allPixels.data);\n                  avatarRef.current.classList.add('has-alpha');\n                }\n                alphaCache[url] = hasAlpha;\n                ctx.clearRect(0, 0, width, height);\n              } catch (e) {\n                // Silent fail\n                alphaCache[url] = false;\n              }\n            }, 1);\n          }}\n        />\n      )}\n    </span>\n  );\n}\n\nexport default mem(Avatar);\n","let IS_RTL = false;\n\n// Use MutationObserver to detect RTL\nconst observer = new MutationObserver((mutations) => {\n  mutations.forEach((mutation) => {\n    if (mutation.type === 'attributes') {\n      const { dir } = mutation.target;\n      if (dir === 'rtl') {\n        IS_RTL = true;\n      } else {\n        IS_RTL = false;\n      }\n      console.log({ IS_RTL });\n      // Fire custom event 'dirchange' on document\n      // document.dispatchEvent(new Event('dirchange'));\n    }\n  });\n});\nobserver.observe(document.documentElement, {\n  attributes: true,\n  attributeFilter: ['dir'],\n});\n\nexport default function isRTL() {\n  return IS_RTL;\n  // return document.documentElement.dir === 'rtl';\n}\n","import { useLayoutEffect, useState } from 'preact/hooks';\n\nexport default function useWindowSize() {\n  const [size, setSize] = useState({\n    width: null,\n    height: null,\n  });\n\n  useLayoutEffect(() => {\n    const handleResize = () => {\n      setSize({\n        width: window.innerWidth,\n        height: window.innerHeight,\n      });\n    };\n\n    handleResize();\n    window.addEventListener('resize', handleResize, {\n      passive: true,\n    });\n\n    return () => {\n      window.removeEventListener('resize', handleResize);\n    };\n  }, []);\n\n  return size;\n}\n","import { Menu } from '@szhsin/react-menu';\nimport { useRef } from 'preact/hooks';\n\nimport isRTL from '../utils/is-rtl';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport useWindowSize from '../utils/useWindowSize';\n\n// It's like Menu but with sensible defaults, bug fixes and improvements.\nfunction Menu2(props) {\n  const { containerProps, instanceRef: _instanceRef, align } = props;\n  const size = useWindowSize();\n  const instanceRef = _instanceRef?.current ? _instanceRef : useRef();\n\n  // Values: start, end, center\n  // Note: don't mess with 'center'\n  const rtlAlign = isRTL()\n    ? align === 'end'\n      ? 'start'\n      : align === 'start'\n        ? 'end'\n        : align\n    : align;\n\n  return (\n    <Menu\n      boundingBoxPadding={safeBoundingBoxPadding()}\n      repositionFlag={`${size.width}x${size.height}`}\n      unmountOnClose\n      {...props}\n      align={rtlAlign}\n      instanceRef={instanceRef}\n      containerProps={{\n        onClick: (e) => {\n          if (e.target === e.currentTarget) {\n            instanceRef.current?.closeMenu?.();\n          }\n          containerProps?.onClick?.(e);\n        },\n        ...containerProps,\n      }}\n    />\n  );\n}\n\nexport default Menu2;\n","import { MenuItem } from '@szhsin/react-menu';\nimport { cloneElement } from 'preact';\n\nimport Menu2 from './menu2';\nimport SubMenu2 from './submenu2';\n\nfunction MenuConfirm({\n  subMenu = false,\n  confirm = true,\n  confirmLabel,\n  menuItemClassName,\n  menuFooter,\n  menuExtras,\n  ...props\n}) {\n  const { children, onClick, ...restProps } = props;\n  if (!confirm) {\n    if (subMenu) return <MenuItem {...props} />;\n    if (onClick) {\n      return cloneElement(children, {\n        onClick,\n      });\n    }\n    return children;\n  }\n  const Parent = subMenu ? SubMenu2 : Menu2;\n  return (\n    <Parent\n      openTrigger=\"clickOnly\"\n      direction=\"bottom\"\n      overflow=\"auto\"\n      gap={-8}\n      shift={8}\n      menuClassName=\"menu-emphasized\"\n      {...restProps}\n      menuButton={subMenu ? undefined : children}\n      label={subMenu ? children : undefined}\n    >\n      <MenuItem className={menuItemClassName} onClick={onClick}>\n        {confirmLabel}\n      </MenuItem>\n      {menuExtras}\n      {menuFooter}\n    </Parent>\n  );\n}\n\nexport default MenuConfirm;\n","export default function CustomEmoji({ staticUrl, alt, url }) {\n  return (\n    <picture>\n      {staticUrl && (\n        <source srcset={staticUrl} media=\"(prefers-reduced-motion: reduce)\" />\n      )}\n      <img\n        key={alt || url}\n        src={url}\n        alt={alt}\n        class=\"shortcode-emoji emoji\"\n        width=\"16\"\n        height=\"16\"\n        loading=\"lazy\"\n        decoding=\"async\"\n        fetchPriority=\"low\"\n      />\n    </picture>\n  );\n}\n","import { memo } from 'preact/compat';\n\nimport mem from '../utils/mem';\n\nimport CustomEmoji from './custom-emoji';\n\nconst shortcodesRegexp = mem((shortcodes) => {\n  return new RegExp(`:(${shortcodes.join('|')}):`, 'g');\n});\n\nfunction EmojiText({ text, emojis }) {\n  if (!text) return '';\n  if (!emojis?.length) return text;\n  if (text.indexOf(':') === -1) return text;\n  // const regex = new RegExp(\n  //   `:(${emojis.map((e) => e.shortcode).join('|')}):`,\n  //   'g',\n  // );\n  const regex = shortcodesRegexp(emojis.map((e) => e.shortcode));\n  const elements = text.split(regex).map((word, i) => {\n    const emoji = emojis.find((e) => e.shortcode === word);\n    if (emoji) {\n      const { url, staticUrl } = emoji;\n      return (\n        <CustomEmoji\n          staticUrl={staticUrl}\n          alt={word}\n          url={url}\n          key={word + '-' + i} // Handle >= 2 same shortcodes\n        />\n      );\n    }\n    return word;\n  });\n  return elements;\n}\n\nexport default mem(EmojiText);\n\n// export default memo(\n//   EmojiText,\n//   (oldProps, newProps) =>\n//     oldProps.text === newProps.text &&\n//     oldProps.emojis?.length === newProps.emojis?.length,\n// );\n","import './name-text.css';\n\nimport { useLingui } from '@lingui/react';\nimport { memo } from 'preact/compat';\n\nimport { api } from '../utils/api';\nimport mem from '../utils/mem';\nimport states from '../utils/states';\n\nimport Avatar from './avatar';\nimport EmojiText from './emoji-text';\n\nconst nameCollator = mem((locale) => {\n  const options = {\n    sensitivity: 'base',\n  };\n  try {\n    return new Intl.Collator(locale || undefined, options);\n  } catch (e) {\n    return new Intl.Collator(undefined, options);\n  }\n});\n\nconst ACCT_REGEX = /([^@]+)(@.+)/i;\nconst SHORTCODES_REGEX = /(\\:(\\w|\\+|\\-)+\\:)(?=|[\\!\\.\\?]|$)/g;\nconst SPACES_REGEX = /\\s+/g;\nconst NON_ALPHA_NUMERIC_REGEX = /[^a-z0-9@\\.]/gi;\n\nfunction NameText({\n  account,\n  instance,\n  showAvatar,\n  showAcct,\n  short,\n  external,\n  onClick,\n}) {\n  const { i18n } = useLingui();\n  if (!account) return null;\n  const {\n    acct,\n    avatar,\n    avatarStatic,\n    id,\n    url,\n    displayName,\n    emojis,\n    bot,\n    username,\n  } = account;\n  const [_, acct1, acct2] = acct.match(ACCT_REGEX) || [, acct];\n\n  if (!instance) instance = api().instance;\n\n  const trimmedUsername = username.toLowerCase().trim();\n  const trimmedDisplayName = (displayName || '').toLowerCase().trim();\n  const shortenedDisplayName = trimmedDisplayName\n    .replace(SHORTCODES_REGEX, '') // Remove shortcodes, regex from https://regex101.com/r/iE9uV0/1\n    .replace(SPACES_REGEX, ''); // E.g. \"My name\" === \"myname\"\n  const shortenedAlphaNumericDisplayName = shortenedDisplayName.replace(\n    NON_ALPHA_NUMERIC_REGEX,\n    '',\n  ); // Remove non-alphanumeric characters\n\n  const hideUsername =\n    (!short &&\n      (trimmedUsername === trimmedDisplayName ||\n        trimmedUsername === shortenedDisplayName ||\n        trimmedUsername === shortenedAlphaNumericDisplayName ||\n        nameCollator(i18n.locale).compare(\n          trimmedUsername,\n          shortenedDisplayName,\n        ) === 0)) ||\n    shortenedAlphaNumericDisplayName === acct.toLowerCase();\n\n  return (\n    <a\n      class={`name-text ${showAcct ? 'show-acct' : ''} ${short ? 'short' : ''}`}\n      href={url}\n      target={external ? '_blank' : null}\n      title={\n        displayName\n          ? `${displayName} (${acct2 ? '' : '@'}${acct})`\n          : `${acct2 ? '' : '@'}${acct}`\n      }\n      onClick={(e) => {\n        if (external) return;\n        if (e.shiftKey) return; // Save link? 🤷‍♂️\n        e.preventDefault();\n        e.stopPropagation();\n        if (onClick) return onClick(e);\n        if (e.metaKey || e.ctrlKey || e.shiftKey || e.which === 2) {\n          const internalURL = `#/${instance}/a/${id}`;\n          window.open(internalURL, '_blank');\n          return;\n        }\n        states.showAccount = {\n          account,\n          instance,\n        };\n      }}\n    >\n      {showAvatar && (\n        <>\n          <Avatar url={avatarStatic || avatar} squircle={bot} />{' '}\n        </>\n      )}\n      {displayName && !short ? (\n        <>\n          <b dir=\"auto\">\n            <EmojiText text={displayName} emojis={emojis} />\n          </b>\n          {!showAcct && !hideUsername && (\n            <>\n              {' '}\n              <i class=\"bidi-isolate\">@{username}</i>\n            </>\n          )}\n        </>\n      ) : short ? (\n        <i>{username}</i>\n      ) : (\n        <b>{username}</b>\n      )}\n      {showAcct && (\n        <>\n          <br />\n          <i class=\"bidi-isolate\">\n            {acct2 ? '' : '@'}\n            {acct1}\n            {!!acct2 && <span class=\"ib\">{acct2}</span>}\n          </i>\n        </>\n      )}\n    </a>\n  );\n}\n\nexport default mem(NameText);\n\n// export default memo(NameText, (oldProps, newProps) => {\n//   // Only care about account.id, the other props usually don't change\n//   const { account } = oldProps;\n//   const { account: newAccount } = newProps;\n//   return account?.acct === newAccount?.acct;\n// });\n","import { i18n } from '@lingui/core';\n\nimport mem from './mem';\n\n// Some codes are not supported by Intl.DisplayNames\n// These are mapped to other codes as fallback\nconst codeMappings = {\n  'zh-YUE': 'YUE',\n  zh_HANT: 'zh-Hant',\n};\n\nconst IntlDN = mem(\n  (locale) =>\n    new Intl.DisplayNames(locale || undefined, {\n      type: 'language',\n    }),\n);\n\nfunction _localeCode2Text(code) {\n  let locale;\n  let fallback;\n  if (typeof code === 'object') {\n    ({ code, locale, fallback } = code);\n  }\n  try {\n    const text = IntlDN(locale || i18n.locale).of(code);\n    if (text !== code) return text;\n    if (!fallback) {\n      const anotherText = IntlDN(code).of(code);\n      if (anotherText !== code) return anotherText;\n    }\n    return fallback || '';\n  } catch (e) {\n    if (codeMappings[code]) {\n      try {\n        const text = IntlDN(codeMappings[locale] || locale || i18n.locale).of(\n          codeMappings[code],\n        );\n        if (text !== codeMappings[code]) return text;\n        return fallback || '';\n      } catch (e2) {\n        console.warn(code, e2);\n      }\n    }\n    return fallback || '';\n  }\n}\n\nexport default mem(_localeCode2Text);\n","import translationTargetLanguages from '../data/lingva-target-languages';\n\nimport localeMatch from './locale-match';\nimport mem from './mem';\nimport states from './states';\n\nconst locales = mem(() => [\n  new Intl.DateTimeFormat().resolvedOptions().locale,\n  ...navigator.languages,\n]);\n\nconst localeTargetLanguages = () =>\n  localeMatch(\n    locales(),\n    translationTargetLanguages.map((l) => l.code.replace('_', '-')), // The underscore will fail Intl.Locale inside `match`\n    'en',\n  );\n\nfunction getTranslateTargetLanguage(fromSettings = false) {\n  if (fromSettings) {\n    const { contentTranslationTargetLanguage } = states.settings;\n    if (contentTranslationTargetLanguage) {\n      return contentTranslationTargetLanguage;\n    }\n  }\n  return localeTargetLanguages();\n}\n\nexport default getTranslateTargetLanguage;\n","import { i18n } from '@lingui/core';\n\n// https://tc39.es/ecma402/#table-sanctioned-single-unit-identifiers\nconst BYTES_UNITS = [\n  'byte',\n  'kilobyte',\n  'megabyte',\n  'gigabyte',\n  'terabyte',\n  'petabyte',\n];\nexport default function prettyBytes(bytes) {\n  const unitIndex = Math.min(\n    Math.floor(Math.log2(bytes) / 10),\n    BYTES_UNITS.length - 1,\n  );\n  const value = bytes / 1024 ** unitIndex;\n  return i18n.number(value, {\n    style: 'unit',\n    unit: BYTES_UNITS[unitIndex],\n    unitDisplay: 'narrow',\n    maximumFractionDigits: 0,\n  });\n}\n","import { satisfies } from 'compare-versions';\n\nimport features from '../data/features.json';\n\nimport { getCurrentInstance, getCurrentNodeInfo } from './store-utils';\n\n// Non-semver(?) UA string detection\nconst containPixelfed = /pixelfed/i;\nconst notContainPixelfed = /^(?!.*pixelfed).*$/i;\nconst containPleroma = /pleroma/i;\nconst containAkkoma = /akkoma/i;\nconst containGTS = /gotosocial/i;\nconst platformFeatures = {\n  '@mastodon/lists': notContainPixelfed,\n  '@mastodon/filters': notContainPixelfed,\n  '@mastodon/mentions': notContainPixelfed,\n  '@mastodon/trending-hashtags': notContainPixelfed,\n  '@mastodon/trending-links': notContainPixelfed,\n  '@mastodon/post-bookmark': notContainPixelfed,\n  '@mastodon/post-edit': notContainPixelfed,\n  '@mastodon/profile-edit': notContainPixelfed,\n  '@mastodon/profile-private-note': notContainPixelfed,\n  '@pixelfed/trending': containPixelfed,\n  '@pixelfed/home-include-reblogs': containPixelfed,\n  '@pixelfed/global-feed': containPixelfed,\n  '@pleroma/local-visibility-post': containPleroma,\n  '@akkoma/local-visibility-post': containAkkoma,\n};\n\nconst supportsCache = {};\n\nfunction supports(feature) {\n  try {\n    let { version, domain } = getCurrentInstance();\n    let softwareName = getCurrentNodeInfo()?.software?.name || 'mastodon';\n\n    if (softwareName === 'hometown') {\n      // Hometown is a Mastodon fork and inherits its features\n      softwareName = 'mastodon';\n    }\n\n    const key = `${domain}-${feature}`;\n    if (supportsCache[key]) return supportsCache[key];\n\n    if (platformFeatures[feature]) {\n      return (supportsCache[key] = platformFeatures[feature].test(version));\n    }\n\n    const range = features[feature];\n    if (!range) return false;\n\n    // '@mastodon/blah' => 'mastodon'\n    const featureSoftware = feature.match(/^@([a-z]+)\\//)[1];\n\n    const doesSoftwareMatch = featureSoftware === softwareName.toLowerCase();\n    return (supportsCache[key] =\n      doesSoftwareMatch &&\n      satisfies(version, range, {\n        includePrerelease: true,\n        loose: true,\n      }));\n  } catch (e) {\n    return false;\n  }\n}\n\nexport default supports;\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7F]/; // Note: U+007F DEL is excluded too.\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, callback) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = callback(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {String} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(domain, callback) {\n\tconst parts = domain.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tdomain = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tdomain = domain.replace(regexSeparators, '\\x2E');\n\tconst labels = domain.split('.');\n\tconst encoded = map(labels, callback).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = codePoints => String.fromCodePoint(...codePoints);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint >= 0x30 && codePoint < 0x3A) {\n\t\treturn 26 + (codePoint - 0x30);\n\t}\n\tif (codePoint >= 0x41 && codePoint < 0x5B) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint >= 0x61 && codePoint < 0x7B) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t//  0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tconst oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\t\t\tif (digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tconst inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tconst basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue === n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.3.1',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode };\nexport default punycode;\n","function emojifyText(text, emojis = []) {\n  if (!text) return '';\n  if (!emojis.length) return text;\n  if (text.indexOf(':') === -1) return text;\n  // Replace shortcodes in text with emoji\n  // emojis = [{ shortcode: 'smile', url: 'https://example.com/emoji.png' }]\n  emojis.forEach((emoji) => {\n    const { shortcode, staticUrl, url } = emoji;\n    text = text.replace(\n      new RegExp(`:${shortcode}:`, 'g'),\n      `<picture><source srcset=\"${staticUrl}\" media=\"(prefers-reduced-motion: reduce)\"></source><img class=\"shortcode-emoji emoji\" src=\"${url}\" alt=\":${shortcode}:\" width=\"16\" height=\"16\" loading=\"lazy\" decoding=\"async\" fetchPriority=\"low\" /></picture>`,\n    );\n  });\n  // console.log(text, emojis);\n  return text;\n}\n\nexport default emojifyText;\n","import emojifyText from './emojify-text';\nimport mem from './mem';\n\nconst fauxDiv = document.createElement('div');\nconst whitelistLinkClasses = ['u-url', 'mention', 'hashtag'];\n\nconst HTML_CHARS_REGEX = /[&<>]/g;\nfunction escapeHTML(html) {\n  return html.replace(\n    HTML_CHARS_REGEX,\n    (c) =>\n      ({\n        '&': '&amp;',\n        '<': '&lt;',\n        '>': '&gt;',\n      })[c],\n  );\n}\n\nconst LINK_REGEX = /<a/i;\nconst HTTP_LINK_REGEX = /^https?:\\/\\//i;\nconst MENTION_REGEX = /^@[^@]+(@[^@]+)?$/;\nconst HASHTAG_REGEX = /^#[^#]+$/;\nconst CODE_BLOCK_REGEX = /^```[^]+```$/;\nconst CODE_BLOCK_START_REGEX = /^```/;\nconst CODE_BLOCK_END_REGEX = /```$/;\nconst INLINE_CODE_REGEX = /`[^`]+`/;\nconst TWITTER_DOMAIN_REGEX = /(twitter|x)\\.com/i;\nconst TWITTER_MENTION_REGEX = /@[a-zA-Z0-9_]+@(twitter|x)\\.com/;\nconst TWITTER_MENTION_CAPTURE_REGEX = /(@([a-zA-Z0-9_]+)@(twitter|x)\\.com)/g;\nconst CODE_INLINE_CAPTURE_REGEX = /(`[^]+?`)/g;\n\nfunction createDOM(html, isDocumentFragment) {\n  if (isDocumentFragment) {\n    const tpl = document.createElement('template');\n    tpl.innerHTML = html;\n    return tpl.content;\n  } else {\n    const tpl = document.createElement('div');\n    tpl.innerHTML = html;\n    return tpl;\n  }\n}\n\nfunction _enhanceContent(content, opts = {}) {\n  const { emojis, returnDOM, postEnhanceDOM = () => {} } = opts;\n  let enhancedContent = content;\n  // const dom = document.createElement('div');\n  // dom.innerHTML = enhancedContent;\n  const dom = createDOM(enhancedContent, returnDOM);\n  const hasLink = LINK_REGEX.test(enhancedContent);\n  const hasCodeBlock = enhancedContent.includes('```');\n\n  if (hasLink) {\n    // Add target=\"_blank\" to all links with no target=\"_blank\"\n    // E.g. `note` in `account`\n    const noTargetBlankLinks = dom.querySelectorAll('a:not([target=\"_blank\"])');\n    for (const link of noTargetBlankLinks) {\n      link.setAttribute('target', '_blank');\n    }\n\n    // Remove all classes except `u-url`, `mention`, `hashtag`\n    const links = dom.querySelectorAll('a[class]');\n    for (const link of links) {\n      for (const c of link.classList) {\n        if (!whitelistLinkClasses.includes(c)) {\n          link.classList.remove(c);\n        }\n      }\n    }\n  }\n\n  // Add 'has-url-text' to all links that contains a url\n  if (hasLink) {\n    const links = dom.querySelectorAll('a[href]');\n    for (const link of links) {\n      if (HTTP_LINK_REGEX.test(link.textContent.trim())) {\n        link.classList.add('has-url-text');\n        shortenLink(link);\n      }\n    }\n  }\n\n  // Spanify un-spanned mentions\n  if (hasLink) {\n    const links = dom.querySelectorAll('a[href]');\n    const usernames = [];\n    for (const link of links) {\n      const text = link.innerText.trim();\n      const hasChildren = link.querySelector('*');\n      // If text looks like @username@domain, then it's a mention\n      if (MENTION_REGEX.test(text)) {\n        // Only show @username\n        const [_, username, domain] = text.split('@');\n        if (!hasChildren) {\n          if (\n            !usernames.some(([u]) => u === username) ||\n            usernames.some(([u, d]) => u === username && d === domain)\n          ) {\n            link.innerHTML = `@<span>${username}</span>`;\n            usernames.push([username, domain]);\n          } else {\n            link.innerHTML = `@<span>${username}@${domain}</span>`;\n          }\n        }\n        link.classList.add('mention');\n      }\n      // If text looks like #hashtag, then it's a hashtag\n      if (HASHTAG_REGEX.test(text)) {\n        if (!hasChildren) link.innerHTML = `#<span>${text.slice(1)}</span>`;\n        link.classList.add('mention', 'hashtag');\n      }\n    }\n  }\n\n  // EMOJIS\n  // ======\n  // Convert :shortcode: to <img />\n  let textNodes;\n  if (enhancedContent.includes(':') && emojis?.length) {\n    textNodes = extractTextNodes(dom);\n    for (const node of textNodes) {\n      let html = escapeHTML(node.nodeValue);\n      html = emojifyText(html, emojis);\n      fauxDiv.innerHTML = html;\n      node.replaceWith(...fauxDiv.childNodes);\n    }\n  }\n\n  // CODE BLOCKS\n  // ===========\n  // Convert ```code``` to <pre><code>code</code></pre>\n  if (hasCodeBlock) {\n    const blocks = [...dom.querySelectorAll('p')].filter((p) =>\n      CODE_BLOCK_REGEX.test(p.innerText.trim()),\n    );\n    for (const block of blocks) {\n      const pre = document.createElement('pre');\n      // Replace <br /> with newlines\n      for (const br of block.querySelectorAll('br')) {\n        br.replaceWith('\\n');\n      }\n      pre.innerHTML = `<code>${block.innerHTML.trim()}</code>`;\n      block.replaceWith(pre);\n    }\n  }\n\n  // Convert multi-paragraph code blocks to <pre><code>code</code></pre>\n  if (hasCodeBlock) {\n    const paragraphs = [...dom.querySelectorAll('p')];\n    // Filter out paragraphs with ``` in beginning only\n    const codeBlocks = paragraphs.filter((p) =>\n      CODE_BLOCK_START_REGEX.test(p.innerText),\n    );\n    // For each codeBlocks, get all paragraphs until the last paragraph with ``` at the end only\n    for (const block of codeBlocks) {\n      const nextParagraphs = [block];\n      let hasCodeBlock = false;\n      let currentBlock = block;\n      while (currentBlock.nextElementSibling) {\n        const next = currentBlock.nextElementSibling;\n        if (next && next.tagName === 'P') {\n          if (CODE_BLOCK_END_REGEX.test(next.innerText)) {\n            nextParagraphs.push(next);\n            hasCodeBlock = true;\n            break;\n          } else {\n            nextParagraphs.push(next);\n          }\n        } else {\n          break;\n        }\n        currentBlock = next;\n      }\n      if (hasCodeBlock) {\n        const pre = document.createElement('pre');\n        for (const p of nextParagraphs) {\n          // Replace <br /> with newlines\n          for (const br of p.querySelectorAll('br')) {\n            br.replaceWith('\\n');\n          }\n        }\n        const codeText = nextParagraphs.map((p) => p.innerHTML).join('\\n\\n');\n        pre.innerHTML = `<code tabindex=\"0\">${codeText}</code>`;\n        block.replaceWith(pre);\n        for (const p of nextParagraphs) {\n          p.remove();\n        }\n      }\n    }\n  }\n\n  // INLINE CODE\n  // ===========\n  // Convert `code` to <code>code</code>\n  if (enhancedContent.includes('`')) {\n    textNodes = extractTextNodes(dom);\n    for (const node of textNodes) {\n      let html = escapeHTML(node.nodeValue);\n      if (INLINE_CODE_REGEX.test(html)) {\n        html = html.replaceAll(CODE_INLINE_CAPTURE_REGEX, '<code>$1</code>');\n      }\n      fauxDiv.innerHTML = html;\n      // const nodes = [...fauxDiv.childNodes];\n      node.replaceWith(...fauxDiv.childNodes);\n    }\n  }\n\n  // TWITTER USERNAMES\n  // =================\n  // Convert @username@twitter.com to <a href=\"https://twitter.com/username\">@username@twitter.com</a>\n  if (TWITTER_DOMAIN_REGEX.test(enhancedContent)) {\n    textNodes = extractTextNodes(dom, {\n      rejectFilter: ['A'],\n    });\n    for (const node of textNodes) {\n      let html = escapeHTML(node.nodeValue);\n      if (TWITTER_MENTION_REGEX.test(html)) {\n        html = html.replaceAll(\n          TWITTER_MENTION_CAPTURE_REGEX,\n          '<a href=\"https://twitter.com/$2\" rel=\"nofollow noopener\" target=\"_blank\">$1</a>',\n        );\n      }\n      fauxDiv.innerHTML = html;\n      // const nodes = [...fauxDiv.childNodes];\n      node.replaceWith(...fauxDiv.childNodes);\n    }\n  }\n\n  // HASHTAG STUFFING\n  // ================\n  // Get the <p> that contains a lot of hashtags, add a class to it\n  if (enhancedContent.includes('#')) {\n    let prevIndex = null;\n    const hashtagStuffedParagraphs = [...dom.querySelectorAll('p')].filter(\n      (p, index) => {\n        let hashtagCount = 0;\n        for (let i = 0; i < p.childNodes.length; i++) {\n          const node = p.childNodes[i];\n\n          if (node.nodeType === Node.TEXT_NODE) {\n            const text = node.textContent.trim();\n            if (text !== '') {\n              return false;\n            }\n          } else if (node.tagName === 'BR') {\n            // Ignore <br />\n          } else if (node.tagName === 'A') {\n            const linkText = node.textContent.trim();\n            if (!linkText || !linkText.startsWith('#')) {\n              return false;\n            } else {\n              hashtagCount++;\n            }\n          } else {\n            return false;\n          }\n        }\n        // Only consider \"stuffing\" if:\n        // - there are more than 3 hashtags\n        // - there are more than 1 hashtag in adjacent paragraphs\n        if (hashtagCount > 3) {\n          prevIndex = index;\n          return true;\n        }\n        if (hashtagCount > 1 && prevIndex && index === prevIndex + 1) {\n          prevIndex = index;\n          return true;\n        }\n      },\n    );\n    if (hashtagStuffedParagraphs?.length) {\n      for (const p of hashtagStuffedParagraphs) {\n        p.classList.add('hashtag-stuffing');\n        p.title = p.innerText;\n      }\n    }\n  }\n\n  // ADD ASPECT RATIO TO ALL IMAGES\n  if (enhancedContent.includes('<img')) {\n    const imgs = dom.querySelectorAll('img');\n    for (let i = 0; i < imgs.length; i++) {\n      const img = imgs[i];\n      const width = img.getAttribute('width') || img.naturalWidth;\n      const height = img.getAttribute('height') || img.naturalHeight;\n      if (width && height) {\n        img.style.setProperty('--original-aspect-ratio', `${width}/${height}`);\n      }\n    }\n  }\n\n  // FIX CLOAK MODE FOR SAFARI\n  // Workaround for Safari so that `text-decoration-thickness` works\n  // Wrap child text nodes in spans\n  for (const node of dom.childNodes) {\n    if (node.nodeType === Node.TEXT_NODE && node.textContent.trim?.()) {\n      const span = document.createElement('span');\n      span.textContent = node.textContent;\n      dom.replaceChild(span, node);\n    }\n  }\n\n  if (postEnhanceDOM) {\n    queueMicrotask(() => postEnhanceDOM(dom));\n    // postEnhanceDOM(dom); // mutate dom\n  }\n\n  return returnDOM ? dom : dom.innerHTML;\n}\nconst enhanceContent = mem(_enhanceContent);\n\nconst defaultRejectFilter = [\n  // Document metadata\n  'STYLE',\n  // Image and multimedia\n  'IMG',\n  'VIDEO',\n  'AUDIO',\n  'AREA',\n  'MAP',\n  'TRACK',\n  // Embedded content\n  'EMBED',\n  'IFRAME',\n  'OBJECT',\n  'PICTURE',\n  'PORTAL',\n  'SOURCE',\n  // SVG and MathML\n  'SVG',\n  'MATH',\n  // Scripting\n  'CANVAS',\n  'NOSCRIPT',\n  'SCRIPT',\n  // Forms\n  'INPUT',\n  'OPTION',\n  'TEXTAREA',\n  // Web Components\n  'SLOT',\n  'TEMPLATE',\n];\nconst defaultRejectFilterMap = Object.fromEntries(\n  defaultRejectFilter.map((nodeName) => [nodeName, true]),\n);\n\nconst URL_PREFIX_REGEX = /^(https?:\\/\\/(www\\.)?|xmpp:)/;\nconst URL_DISPLAY_LENGTH = 30;\n// Similar to https://github.com/mastodon/mastodon/blob/1666b1955992e16f4605b414c6563ca25b3a3f18/app/lib/text_formatter.rb#L54-L69\nfunction shortenLink(link) {\n  if (!link || link.querySelector?.('*')) {\n    return;\n  }\n  try {\n    const url = link.innerText.trim();\n    const prefix = (url.match(URL_PREFIX_REGEX) || [])[0] || '';\n    if (!prefix) return;\n    const displayURL = url.slice(\n      prefix.length,\n      prefix.length + URL_DISPLAY_LENGTH,\n    );\n    const suffix = url.slice(prefix.length + URL_DISPLAY_LENGTH);\n    const cutoff = url.slice(prefix.length).length > URL_DISPLAY_LENGTH;\n    link.innerHTML = `<span class=\"invisible\">${prefix}</span><span class=${\n      cutoff ? 'ellipsis' : ''\n    }>${displayURL}</span><span class=\"invisible\">${suffix}</span>`;\n  } catch (e) {}\n}\n\nfunction extractTextNodes(dom, opts = {}) {\n  const textNodes = [];\n  const rejectFilterMap = Object.assign(\n    {},\n    defaultRejectFilterMap,\n    opts.rejectFilter?.reduce((acc, cur) => {\n      acc[cur] = true;\n      return acc;\n    }, {}),\n  );\n  const walk = document.createTreeWalker(\n    dom,\n    NodeFilter.SHOW_TEXT,\n    {\n      acceptNode(node) {\n        if (rejectFilterMap[node.parentNode.nodeName]) {\n          return NodeFilter.FILTER_REJECT;\n        }\n        return NodeFilter.FILTER_ACCEPT;\n      },\n    },\n    false,\n  );\n  let node;\n  while ((node = walk.nextNode())) {\n    textNodes.push(node);\n  }\n  return textNodes;\n}\n\nexport default enhanceContent;\n","import states from './states';\n\nfunction handleContentLinks(opts) {\n  const { mentions = [], instance, previewMode, statusURL } = opts || {};\n  return (e) => {\n    let { target } = e;\n    target = target.closest('a');\n    if (!target) return;\n\n    // If cmd/ctrl/shift/alt key is pressed or middle-click, let the browser handle it\n    if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.which === 2) {\n      return;\n    }\n\n    const prevText = target.previousSibling?.textContent;\n    const textBeforeLinkIsAt = prevText?.endsWith('@');\n    const textStartsWithAt = target.innerText.startsWith('@');\n    if (\n      ((target.classList.contains('u-url') ||\n        target.classList.contains('mention')) &&\n        textStartsWithAt) ||\n      (textBeforeLinkIsAt && !textStartsWithAt)\n    ) {\n      const targetText = (\n        target.querySelector('span') || target\n      ).innerText.trim();\n      const username = targetText.replace(/^@/, '');\n      const url = target.getAttribute('href');\n      // Only fallback to acct/username check if url doesn't match\n      const mention =\n        mentions.find((mention) => mention.url === url) ||\n        mentions.find(\n          (mention) =>\n            mention.acct === username || mention.username === username,\n        );\n      console.warn('MENTION', mention, url);\n      if (mention) {\n        e.preventDefault();\n        e.stopPropagation();\n        states.showAccount = {\n          account: mention.acct,\n          instance,\n        };\n      } else if (!/^http/i.test(targetText)) {\n        console.log('mention not found', targetText);\n        e.preventDefault();\n        e.stopPropagation();\n        const href = target.getAttribute('href');\n        states.showAccount = {\n          account: href,\n          instance,\n        };\n      }\n    } else if (!previewMode) {\n      const textBeforeLinkIsHash = prevText?.endsWith('#');\n      if (target.classList.contains('hashtag') || textBeforeLinkIsHash) {\n        e.preventDefault();\n        e.stopPropagation();\n        const tag = target.innerText.replace(/^#/, '').trim();\n        const hashURL = instance ? `#/${instance}/t/${tag}` : `#/t/${tag}`;\n        console.log({ hashURL });\n        location.hash = hashURL;\n      } else if (\n        states.unfurledLinks[target.href]?.url &&\n        statusURL !== target.href\n      ) {\n        // If unfurled AND not self-referential\n        e.preventDefault();\n        e.stopPropagation();\n        states.prevLocation = {\n          pathname: location.hash.replace(/^#/, ''),\n        };\n        location.hash = `#${states.unfurledLinks[target.href].url}`;\n      }\n    }\n  };\n}\n\nexport default handleContentLinks;\n","import { i18n } from '@lingui/core';\n\nexport default function i18nDuration(duration, unit) {\n  return () =>\n    i18n.number(duration, {\n      style: 'unit',\n      unit,\n      unitDisplay: 'long',\n    });\n}\n","import { i18n } from '@lingui/core';\n\nexport default function shortenNumber(num) {\n  try {\n    return i18n.number(num, {\n      notation: 'compact',\n      roundingMode: 'floor',\n    });\n  } catch (e) {\n    return num;\n  }\n}\n","import './account-block.css';\n\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\n\n// import { useNavigate } from 'react-router-dom';\nimport enhanceContent from '../utils/enhance-content';\nimport niceDateTime from '../utils/nice-date-time';\nimport shortenNumber from '../utils/shorten-number';\nimport states from '../utils/states';\n\nimport Avatar from './avatar';\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\n\nfunction AccountBlock({\n  skeleton,\n  account,\n  avatarSize = 'xl',\n  useAvatarStatic = false,\n  instance,\n  external,\n  internal,\n  onClick,\n  showActivity = false,\n  showStats = false,\n  accountInstance,\n  hideDisplayName = false,\n  relationship = {},\n  excludeRelationshipAttrs = [],\n}) {\n  const { t } = useLingui();\n  if (skeleton) {\n    return (\n      <div class=\"account-block skeleton\">\n        <Avatar size={avatarSize} />\n        <span>\n          <b>████████</b>\n          <br />\n          <span class=\"account-block-acct\">██████</span>\n        </span>\n      </div>\n    );\n  }\n\n  if (!account) {\n    return null;\n  }\n\n  // const navigate = useNavigate();\n\n  const {\n    id,\n    acct,\n    avatar,\n    avatarStatic,\n    displayName,\n    username,\n    emojis,\n    url,\n    statusesCount,\n    lastStatusAt,\n    bot,\n    fields,\n    note,\n    group,\n    followersCount,\n    createdAt,\n    locked,\n  } = account;\n  let [_, acct1, acct2] = acct.match(/([^@]+)(@.+)/i) || [, acct];\n  if (accountInstance) {\n    acct2 = `@${accountInstance}`;\n  }\n\n  const verifiedField = fields?.find((f) => !!f.verifiedAt && !!f.value);\n\n  const excludedRelationship = {};\n  for (const r in relationship) {\n    if (!excludeRelationshipAttrs.includes(r)) {\n      excludedRelationship[r] = relationship[r];\n    }\n  }\n  const hasRelationship =\n    excludedRelationship.following ||\n    excludedRelationship.followedBy ||\n    excludedRelationship.requested;\n\n  return (\n    <a\n      class=\"account-block\"\n      href={url}\n      target={external ? '_blank' : null}\n      title={acct2 ? acct : `@${acct}`}\n      onClick={(e) => {\n        if (external) return;\n        e.preventDefault();\n        if (onClick) return onClick(e);\n        if (internal) {\n          // navigate(`/${instance}/a/${id}`);\n          location.hash = `/${instance}/a/${id}`;\n        } else {\n          states.showAccount = {\n            account,\n            instance,\n          };\n        }\n      }}\n    >\n      <div class=\"avatar-container\">\n        <Avatar\n          url={useAvatarStatic ? avatarStatic : avatar || avatarStatic}\n          size={avatarSize}\n          squircle={bot}\n        />\n      </div>\n      <span class=\"account-block-content\">\n        {!hideDisplayName && (\n          <>\n            {displayName ? (\n              <b>\n                <EmojiText text={displayName} emojis={emojis} />\n              </b>\n            ) : (\n              <b>{username}</b>\n            )}\n          </>\n        )}{' '}\n        <span class=\"account-block-acct bidi-isolate\">\n          {acct2 ? '' : '@'}\n          {acct1}\n          <wbr />\n          {acct2}\n          {locked && (\n            <>\n              {' '}\n              <Icon icon=\"lock\" size=\"s\" alt={t`Locked`} />\n            </>\n          )}\n        </span>\n        {showActivity && (\n          <div class=\"account-block-stats\">\n            <Trans>Posts: {shortenNumber(statusesCount)}</Trans>\n            {!!lastStatusAt && (\n              <>\n                {' '}\n                &middot;{' '}\n                <Trans>\n                  Last posted:{' '}\n                  {niceDateTime(lastStatusAt, {\n                    hideTime: true,\n                  })}\n                </Trans>\n              </>\n            )}\n          </div>\n        )}\n        {showStats && (\n          <div class=\"account-block-stats\">\n            {bot && (\n              <>\n                <span class=\"tag collapsed\">\n                  <Icon icon=\"bot\" /> <Trans>Automated</Trans>\n                </span>\n              </>\n            )}\n            {!!group && (\n              <>\n                <span class=\"tag collapsed\">\n                  <Icon icon=\"group\" /> <Trans>Group</Trans>\n                </span>\n              </>\n            )}\n            {hasRelationship && (\n              <div key={relationship.id} class=\"shazam-container-horizontal\">\n                <div class=\"shazam-container-inner\">\n                  {excludedRelationship.following &&\n                  excludedRelationship.followedBy ? (\n                    <span class=\"tag minimal\">\n                      <Trans>Mutual</Trans>\n                    </span>\n                  ) : excludedRelationship.requested ? (\n                    <span class=\"tag minimal\">\n                      <Trans>Requested</Trans>\n                    </span>\n                  ) : excludedRelationship.following ? (\n                    <span class=\"tag minimal\">\n                      <Trans>Following</Trans>\n                    </span>\n                  ) : excludedRelationship.followedBy ? (\n                    <span class=\"tag minimal\">\n                      <Trans>Follows you</Trans>\n                    </span>\n                  ) : null}\n                </div>\n              </div>\n            )}\n            {!!followersCount && (\n              <span class=\"ib\">\n                <Plural\n                  value={followersCount}\n                  one=\"# follower\"\n                  other=\"# followers\"\n                />\n              </span>\n            )}\n            {!!verifiedField && (\n              <span class=\"verified-field\">\n                <Icon icon=\"check-circle\" size=\"s\" alt={t`Verified`} />{' '}\n                <span\n                  dangerouslySetInnerHTML={{\n                    __html: enhanceContent(verifiedField.value, { emojis }),\n                  }}\n                />\n              </span>\n            )}\n            {!bot &&\n              !group &&\n              !hasRelationship &&\n              !followersCount &&\n              !verifiedField &&\n              !!createdAt && (\n                <span class=\"created-at\">\n                  <Trans>\n                    Joined{' '}\n                    <time datetime={createdAt}>\n                      {niceDateTime(createdAt, {\n                        hideTime: true,\n                      })}\n                    </time>\n                  </Trans>\n                </span>\n              )}\n          </div>\n        )}\n      </span>\n    </a>\n  );\n}\n\nexport default AccountBlock;\n","function RetryOperation(timeouts, options) {\n  // Compatibility for the old (timeouts, retryForever) signature\n  if (typeof options === 'boolean') {\n    options = { forever: options };\n  }\n\n  this._originalTimeouts = JSON.parse(JSON.stringify(timeouts));\n  this._timeouts = timeouts;\n  this._options = options || {};\n  this._maxRetryTime = options && options.maxRetryTime || Infinity;\n  this._fn = null;\n  this._errors = [];\n  this._attempts = 1;\n  this._operationTimeout = null;\n  this._operationTimeoutCb = null;\n  this._timeout = null;\n  this._operationStart = null;\n  this._timer = null;\n\n  if (this._options.forever) {\n    this._cachedTimeouts = this._timeouts.slice(0);\n  }\n}\nmodule.exports = RetryOperation;\n\nRetryOperation.prototype.reset = function() {\n  this._attempts = 1;\n  this._timeouts = this._originalTimeouts.slice(0);\n}\n\nRetryOperation.prototype.stop = function() {\n  if (this._timeout) {\n    clearTimeout(this._timeout);\n  }\n  if (this._timer) {\n    clearTimeout(this._timer);\n  }\n\n  this._timeouts       = [];\n  this._cachedTimeouts = null;\n};\n\nRetryOperation.prototype.retry = function(err) {\n  if (this._timeout) {\n    clearTimeout(this._timeout);\n  }\n\n  if (!err) {\n    return false;\n  }\n  var currentTime = new Date().getTime();\n  if (err && currentTime - this._operationStart >= this._maxRetryTime) {\n    this._errors.push(err);\n    this._errors.unshift(new Error('RetryOperation timeout occurred'));\n    return false;\n  }\n\n  this._errors.push(err);\n\n  var timeout = this._timeouts.shift();\n  if (timeout === undefined) {\n    if (this._cachedTimeouts) {\n      // retry forever, only keep last error\n      this._errors.splice(0, this._errors.length - 1);\n      timeout = this._cachedTimeouts.slice(-1);\n    } else {\n      return false;\n    }\n  }\n\n  var self = this;\n  this._timer = setTimeout(function() {\n    self._attempts++;\n\n    if (self._operationTimeoutCb) {\n      self._timeout = setTimeout(function() {\n        self._operationTimeoutCb(self._attempts);\n      }, self._operationTimeout);\n\n      if (self._options.unref) {\n          self._timeout.unref();\n      }\n    }\n\n    self._fn(self._attempts);\n  }, timeout);\n\n  if (this._options.unref) {\n      this._timer.unref();\n  }\n\n  return true;\n};\n\nRetryOperation.prototype.attempt = function(fn, timeoutOps) {\n  this._fn = fn;\n\n  if (timeoutOps) {\n    if (timeoutOps.timeout) {\n      this._operationTimeout = timeoutOps.timeout;\n    }\n    if (timeoutOps.cb) {\n      this._operationTimeoutCb = timeoutOps.cb;\n    }\n  }\n\n  var self = this;\n  if (this._operationTimeoutCb) {\n    this._timeout = setTimeout(function() {\n      self._operationTimeoutCb();\n    }, self._operationTimeout);\n  }\n\n  this._operationStart = new Date().getTime();\n\n  this._fn(this._attempts);\n};\n\nRetryOperation.prototype.try = function(fn) {\n  console.log('Using RetryOperation.try() is deprecated');\n  this.attempt(fn);\n};\n\nRetryOperation.prototype.start = function(fn) {\n  console.log('Using RetryOperation.start() is deprecated');\n  this.attempt(fn);\n};\n\nRetryOperation.prototype.start = RetryOperation.prototype.try;\n\nRetryOperation.prototype.errors = function() {\n  return this._errors;\n};\n\nRetryOperation.prototype.attempts = function() {\n  return this._attempts;\n};\n\nRetryOperation.prototype.mainError = function() {\n  if (this._errors.length === 0) {\n    return null;\n  }\n\n  var counts = {};\n  var mainError = null;\n  var mainErrorCount = 0;\n\n  for (var i = 0; i < this._errors.length; i++) {\n    var error = this._errors[i];\n    var message = error.message;\n    var count = (counts[message] || 0) + 1;\n\n    counts[message] = count;\n\n    if (count >= mainErrorCount) {\n      mainError = error;\n      mainErrorCount = count;\n    }\n  }\n\n  return mainError;\n};\n","var RetryOperation = require('./retry_operation');\n\nexports.operation = function(options) {\n  var timeouts = exports.timeouts(options);\n  return new RetryOperation(timeouts, {\n      forever: options && (options.forever || options.retries === Infinity),\n      unref: options && options.unref,\n      maxRetryTime: options && options.maxRetryTime\n  });\n};\n\nexports.timeouts = function(options) {\n  if (options instanceof Array) {\n    return [].concat(options);\n  }\n\n  var opts = {\n    retries: 10,\n    factor: 2,\n    minTimeout: 1 * 1000,\n    maxTimeout: Infinity,\n    randomize: false\n  };\n  for (var key in options) {\n    opts[key] = options[key];\n  }\n\n  if (opts.minTimeout > opts.maxTimeout) {\n    throw new Error('minTimeout is greater than maxTimeout');\n  }\n\n  var timeouts = [];\n  for (var i = 0; i < opts.retries; i++) {\n    timeouts.push(this.createTimeout(i, opts));\n  }\n\n  if (options && options.forever && !timeouts.length) {\n    timeouts.push(this.createTimeout(i, opts));\n  }\n\n  // sort the array numerically ascending\n  timeouts.sort(function(a,b) {\n    return a - b;\n  });\n\n  return timeouts;\n};\n\nexports.createTimeout = function(attempt, opts) {\n  var random = (opts.randomize)\n    ? (Math.random() + 1)\n    : 1;\n\n  var timeout = Math.round(random * Math.max(opts.minTimeout, 1) * Math.pow(opts.factor, attempt));\n  timeout = Math.min(timeout, opts.maxTimeout);\n\n  return timeout;\n};\n\nexports.wrap = function(obj, options, methods) {\n  if (options instanceof Array) {\n    methods = options;\n    options = null;\n  }\n\n  if (!methods) {\n    methods = [];\n    for (var key in obj) {\n      if (typeof obj[key] === 'function') {\n        methods.push(key);\n      }\n    }\n  }\n\n  for (var i = 0; i < methods.length; i++) {\n    var method   = methods[i];\n    var original = obj[method];\n\n    obj[method] = function retryWrapper(original) {\n      var op       = exports.operation(options);\n      var args     = Array.prototype.slice.call(arguments, 1);\n      var callback = args.pop();\n\n      args.push(function(err) {\n        if (op.retry(err)) {\n          return;\n        }\n        if (err) {\n          arguments[0] = op.mainError();\n        }\n        callback.apply(this, arguments);\n      });\n\n      op.attempt(function() {\n        original.apply(obj, args);\n      });\n    }.bind(obj, original);\n    obj[method].options = options;\n  }\n};\n","module.exports = require('./lib/retry');","const objectToString = Object.prototype.toString;\n\nconst isError = value => objectToString.call(value) === '[object Error]';\n\nconst errorMessages = new Set([\n\t'Failed to fetch', // Chrome\n\t'NetworkError when attempting to fetch resource.', // Firefox\n\t'The Internet connection appears to be offline.', // Safari 16\n\t'Load failed', // Safari 17+\n\t'Network request failed', // `cross-fetch`\n\t'fetch failed', // Undici (Node.js)\n]);\n\nexport default function isNetworkError(error) {\n\tconst isValid = error\n\t\t&& isError(error)\n\t\t&& error.name === 'TypeError'\n\t\t&& typeof error.message === 'string';\n\n\tif (!isValid) {\n\t\treturn false;\n\t}\n\n\t// We do an extra check for Safari 17+ as it has a very generic error message.\n\t// Network errors in Safari have no stack.\n\tif (error.message === 'Load failed') {\n\t\treturn error.stack === undefined;\n\t}\n\n\treturn errorMessages.has(error.message);\n}\n","import retry from 'retry';\nimport isNetworkError from 'is-network-error';\n\nexport class AbortError extends Error {\n\tconstructor(message) {\n\t\tsuper();\n\n\t\tif (message instanceof Error) {\n\t\t\tthis.originalError = message;\n\t\t\t({message} = message);\n\t\t} else {\n\t\t\tthis.originalError = new Error(message);\n\t\t\tthis.originalError.stack = this.stack;\n\t\t}\n\n\t\tthis.name = 'AbortError';\n\t\tthis.message = message;\n\t}\n}\n\nconst decorateErrorWithCounts = (error, attemptNumber, options) => {\n\t// Minus 1 from attemptNumber because the first attempt does not count as a retry\n\tconst retriesLeft = options.retries - (attemptNumber - 1);\n\n\terror.attemptNumber = attemptNumber;\n\terror.retriesLeft = retriesLeft;\n\treturn error;\n};\n\nexport default async function pRetry(input, options) {\n\treturn new Promise((resolve, reject) => {\n\t\toptions = {...options};\n\t\toptions.onFailedAttempt ??= () => {};\n\t\toptions.shouldRetry ??= () => true;\n\t\toptions.retries ??= 10;\n\n\t\tconst operation = retry.operation(options);\n\n\t\tconst abortHandler = () => {\n\t\t\toperation.stop();\n\t\t\treject(options.signal?.reason);\n\t\t};\n\n\t\tif (options.signal && !options.signal.aborted) {\n\t\t\toptions.signal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\tconst cleanUp = () => {\n\t\t\toptions.signal?.removeEventListener('abort', abortHandler);\n\t\t\toperation.stop();\n\t\t};\n\n\t\toperation.attempt(async attemptNumber => {\n\t\t\ttry {\n\t\t\t\tconst result = await input(attemptNumber);\n\t\t\t\tcleanUp();\n\t\t\t\tresolve(result);\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(error instanceof Error)) {\n\t\t\t\t\t\tthrow new TypeError(`Non-error was thrown: \"${error}\". You should only throw errors.`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (error instanceof AbortError) {\n\t\t\t\t\t\tthrow error.originalError;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (error instanceof TypeError && !isNetworkError(error)) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\n\t\t\t\t\tdecorateErrorWithCounts(error, attemptNumber, options);\n\n\t\t\t\t\tif (!(await options.shouldRetry(error))) {\n\t\t\t\t\t\toperation.stop();\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tawait options.onFailedAttempt(error);\n\n\t\t\t\t\tif (!operation.retry(error)) {\n\t\t\t\t\t\tthrow operation.mainError();\n\t\t\t\t\t}\n\t\t\t\t} catch (finalError) {\n\t\t\t\t\tdecorateErrorWithCounts(finalError, attemptNumber, options);\n\t\t\t\t\tcleanUp();\n\t\t\t\t\treject(finalError);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n","export const supportsBrowserTranslator =\n  'ai' in self && 'translator' in self.ai;\n\n// https://developer.chrome.com/docs/ai/language-detection\nexport let langDetector;\nif (supportsBrowserTranslator) {\n  (async () => {\n    try {\n      const languageDetectorCapabilities =\n        await self.ai.languageDetector.capabilities();\n      const canDetect = languageDetectorCapabilities.capabilities;\n      if (canDetect === 'no') {\n        // The language detector isn't usable.\n        // return;\n      }\n      if (canDetect === 'readily') {\n        // The language detector can immediately be used.\n        langDetector = await self.ai.languageDetector.create();\n      } else {\n        // The language detector can be used after model download.\n        langDetector = await self.ai.languageDetector.create({\n          monitor(m) {\n            m.addEventListener('downloadprogress', (e) => {\n              console.log(\n                `Detector: Downloaded ${e.loaded} of ${e.total} bytes.`,\n              );\n            });\n          },\n        });\n        await langDetector.ready;\n      }\n    } catch (e) {\n      console.error(e);\n    }\n  })();\n}\n\n// https://developer.chrome.com/docs/ai/translator-api\nexport const translate = async (text, source, target) => {\n  let detectedSourceLanguage;\n  const originalSource = source;\n  if (source === 'auto') {\n    try {\n      const results = await langDetector.detect(text);\n      source = results[0].detectedLanguage;\n      detectedSourceLanguage = source;\n    } catch (e) {\n      console.error(e);\n      return {\n        error: e,\n      };\n    }\n  }\n  console.groupCollapsed(\n    '💬 BROWSER TRANSLATE',\n    originalSource,\n    detectedSourceLanguage,\n    target,\n  );\n  console.log(text);\n  try {\n    const translatorCapabilities = await self.ai.translator.capabilities();\n    const canTranslate = translatorCapabilities.languagePairAvailable(\n      source,\n      target,\n    );\n    if (canTranslate === 'no') {\n      console.groupEnd();\n      return {\n        error: `Unsupported language pair: ${source} -> ${target}`,\n      };\n    }\n    let translator;\n    if (canTranslate === 'readily') {\n      translator = await self.ai.translator.create({\n        sourceLanguage: source,\n        targetLanguage: target,\n      });\n    } else {\n      translator = await self.ai.translator.create({\n        sourceLanguage: source,\n        targetLanguage: target,\n        monitor(m) {\n          m.addEventListener('downloadprogress', (e) => {\n            console.log(\n              `Translate ${source} -> ${target}: Downloaded ${e.loaded} of ${e.total} bytes.`,\n            );\n          });\n        },\n      });\n    }\n\n    const content = await translator.translate(text);\n    console.log(content);\n    console.groupEnd();\n\n    return {\n      content,\n      detectedSourceLanguage,\n      provider: 'browser',\n    };\n  } catch (e) {\n    console.groupEnd();\n    console.error(e);\n    return {\n      error: e,\n    };\n  }\n};\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue = void 0;\nfunction defaultFallbackInView(inView) {\n  unsupportedValue = inView;\n}\nfunction getRootId(root) {\n  if (!root) return \"0\";\n  if (RootIds.has(root)) return RootIds.get(root);\n  rootId += 1;\n  RootIds.set(root, rootId.toString());\n  return RootIds.get(root);\n}\nfunction optionsToId(options) {\n  return Object.keys(options).sort().filter(\n    (key) => options[key] !== void 0\n  ).map((key) => {\n    return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n  }).toString();\n}\nfunction createObserver(options) {\n  const id = optionsToId(options);\n  let instance = observerMap.get(id);\n  if (!instance) {\n    const elements = /* @__PURE__ */ new Map();\n    let thresholds;\n    const observer = new IntersectionObserver((entries) => {\n      entries.forEach((entry) => {\n        var _a;\n        const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n        if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n          entry.isVisible = inView;\n        }\n        (_a = elements.get(entry.target)) == null ? void 0 : _a.forEach((callback) => {\n          callback(inView, entry);\n        });\n      });\n    }, options);\n    thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n    instance = {\n      id,\n      observer,\n      elements\n    };\n    observerMap.set(id, instance);\n  }\n  return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n  if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n    const bounds = element.getBoundingClientRect();\n    callback(fallbackInView, {\n      isIntersecting: fallbackInView,\n      target: element,\n      intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n      time: 0,\n      boundingClientRect: bounds,\n      intersectionRect: bounds,\n      rootBounds: bounds\n    });\n    return () => {\n    };\n  }\n  const { id, observer, elements } = createObserver(options);\n  const callbacks = elements.get(element) || [];\n  if (!elements.has(element)) {\n    elements.set(element, callbacks);\n  }\n  callbacks.push(callback);\n  observer.observe(element);\n  return function unobserve() {\n    callbacks.splice(callbacks.indexOf(callback), 1);\n    if (callbacks.length === 0) {\n      elements.delete(element);\n      observer.unobserve(element);\n    }\n    if (elements.size === 0) {\n      observer.disconnect();\n      observerMap.delete(id);\n    }\n  };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n  return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n  constructor(props) {\n    super(props);\n    __publicField(this, \"node\", null);\n    __publicField(this, \"_unobserveCb\", null);\n    __publicField(this, \"handleNode\", (node) => {\n      if (this.node) {\n        this.unobserve();\n        if (!node && !this.props.triggerOnce && !this.props.skip) {\n          this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n        }\n      }\n      this.node = node ? node : null;\n      this.observeNode();\n    });\n    __publicField(this, \"handleChange\", (inView, entry) => {\n      if (inView && this.props.triggerOnce) {\n        this.unobserve();\n      }\n      if (!isPlainChildren(this.props)) {\n        this.setState({ inView, entry });\n      }\n      if (this.props.onChange) {\n        this.props.onChange(inView, entry);\n      }\n    });\n    this.state = {\n      inView: !!props.initialInView,\n      entry: void 0\n    };\n  }\n  componentDidMount() {\n    this.unobserve();\n    this.observeNode();\n  }\n  componentDidUpdate(prevProps) {\n    if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n      this.unobserve();\n      this.observeNode();\n    }\n  }\n  componentWillUnmount() {\n    this.unobserve();\n  }\n  observeNode() {\n    if (!this.node || this.props.skip) return;\n    const {\n      threshold,\n      root,\n      rootMargin,\n      trackVisibility,\n      delay,\n      fallbackInView\n    } = this.props;\n    this._unobserveCb = observe(\n      this.node,\n      this.handleChange,\n      {\n        threshold,\n        root,\n        rootMargin,\n        // @ts-ignore\n        trackVisibility,\n        // @ts-ignore\n        delay\n      },\n      fallbackInView\n    );\n  }\n  unobserve() {\n    if (this._unobserveCb) {\n      this._unobserveCb();\n      this._unobserveCb = null;\n    }\n  }\n  render() {\n    const { children } = this.props;\n    if (typeof children === \"function\") {\n      const { inView, entry } = this.state;\n      return children({ inView, entry, ref: this.handleNode });\n    }\n    const {\n      as,\n      triggerOnce,\n      threshold,\n      root,\n      rootMargin,\n      onChange,\n      skip,\n      trackVisibility,\n      delay,\n      initialInView,\n      fallbackInView,\n      ...props\n    } = this.props;\n    return React.createElement(\n      as || \"div\",\n      { ref: this.handleNode, ...props },\n      children\n    );\n  }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n  threshold,\n  delay,\n  trackVisibility,\n  rootMargin,\n  root,\n  triggerOnce,\n  skip,\n  initialInView,\n  fallbackInView,\n  onChange\n} = {}) {\n  var _a;\n  const [ref, setRef] = React2.useState(null);\n  const callback = React2.useRef(onChange);\n  const [state, setState] = React2.useState({\n    inView: !!initialInView,\n    entry: void 0\n  });\n  callback.current = onChange;\n  React2.useEffect(\n    () => {\n      if (skip || !ref) return;\n      let unobserve;\n      unobserve = observe(\n        ref,\n        (inView, entry) => {\n          setState({\n            inView,\n            entry\n          });\n          if (callback.current) callback.current(inView, entry);\n          if (entry.isIntersecting && triggerOnce && unobserve) {\n            unobserve();\n            unobserve = void 0;\n          }\n        },\n        {\n          root,\n          rootMargin,\n          threshold,\n          // @ts-ignore\n          trackVisibility,\n          // @ts-ignore\n          delay\n        },\n        fallbackInView\n      );\n      return () => {\n        if (unobserve) {\n          unobserve();\n        }\n      };\n    },\n    // We break the rule here, because we aren't including the actual `threshold` variable\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      // If the threshold is an array, convert it to a string, so it won't change between renders.\n      Array.isArray(threshold) ? threshold.toString() : threshold,\n      ref,\n      root,\n      rootMargin,\n      triggerOnce,\n      skip,\n      trackVisibility,\n      fallbackInView,\n      delay\n    ]\n  );\n  const entryTarget = (_a = state.entry) == null ? void 0 : _a.target;\n  const previousEntryTarget = React2.useRef(void 0);\n  if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n    previousEntryTarget.current = entryTarget;\n    setState({\n      inView: !!initialInView,\n      entry: void 0\n    });\n  }\n  const result = [setRef, state.inView, state.entry];\n  result.ref = result[0];\n  result.inView = result[1];\n  result.entry = result[2];\n  return result;\n}\nexport {\n  InView,\n  defaultFallbackInView,\n  observe,\n  useInView\n};\n//# sourceMappingURL=index.mjs.map","/*\n  Rendered but hidden. Only show when visible\n*/\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useInView } from 'react-intersection-observer';\n\n// The sticky header, usually at the top\nconst TOP = 48;\n\nconst shazamIDs = {};\n\nexport default function LazyShazam({ id, children }) {\n  const containerRef = useRef();\n  const hasID = !!shazamIDs[id];\n  const [visible, setVisible] = useState(false);\n  const [visibleStart, setVisibleStart] = useState(hasID || false);\n\n  const { ref } = useInView({\n    root: null,\n    rootMargin: `-${TOP}px 0px 0px 0px`,\n    trackVisibility: true,\n    delay: 1000,\n    onChange: (inView) => {\n      if (inView) {\n        setVisible(true);\n        if (id) shazamIDs[id] = true;\n      }\n    },\n    triggerOnce: true,\n    skip: visibleStart || visible,\n  });\n\n  useEffect(() => {\n    if (!containerRef.current) return;\n    const rect = containerRef.current.getBoundingClientRect();\n    if (rect.bottom > TOP) {\n      if (rect.top < window.innerHeight) {\n        setVisible(true);\n      } else {\n        setVisibleStart(true);\n      }\n      if (id) shazamIDs[id] = true;\n    }\n  }, []);\n\n  if (visibleStart) return children;\n\n  return (\n    <div\n      ref={containerRef}\n      class=\"shazam-container no-animation\"\n      hidden={!visible}\n    >\n      <div ref={ref} class=\"shazam-container-inner\">\n        {children}\n      </div>\n    </div>\n  );\n}\n","import './translation-block.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport pRetry from 'p-retry';\nimport pThrottle from 'p-throttle';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport sourceLanguages from '../data/lingva-source-languages';\nimport {\n  translate as browserTranslate,\n  supportsBrowserTranslator,\n} from '../utils/browser-translator';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport pmem from '../utils/pmem';\n\nimport Icon from './icon';\nimport LazyShazam from './lazy-shazam';\nimport Loader from './loader';\n\nconst { PHANPY_LINGVA_INSTANCES } = import.meta.env;\nconst LINGVA_INSTANCES = PHANPY_LINGVA_INSTANCES\n  ? PHANPY_LINGVA_INSTANCES.split(/\\s+/)\n  : [];\n\nconst throttle = pThrottle({\n  limit: 1,\n  interval: 2000,\n});\n\nlet currentLingvaInstance = 0;\n\nfunction _lingvaTranslate(text, source, target) {\n  console.log('TRANSLATE', text, source, target);\n  const fetchCall = () => {\n    let instance = LINGVA_INSTANCES[currentLingvaInstance];\n    return fetch(\n      `https://${instance}/api/v1/${source}/${target}/${encodeURIComponent(\n        text,\n      )}`,\n    )\n      .then((res) => {\n        if (!res.ok) throw new Error(res.statusText);\n        return res.json();\n      })\n      .then((res) => {\n        return {\n          provider: 'lingva',\n          content: res.translation,\n          detectedSourceLanguage: res.info?.detectedSource,\n          info: res.info,\n        };\n      });\n  };\n  return pRetry(fetchCall, {\n    retries: 3,\n    onFailedAttempt: (e) => {\n      currentLingvaInstance =\n        (currentLingvaInstance + 1) % LINGVA_INSTANCES.length;\n      console.log(\n        'Retrying translation with another instance',\n        currentLingvaInstance,\n      );\n    },\n  });\n  // return masto.v1.statuses.$select(id).translate({\n  //   lang: DEFAULT_LANG,\n  // });\n}\nconst TRANSLATED_MAX_AGE = 1000 * 60 * 60; // 1 hour\nconst lingvaTranslate = pmem(_lingvaTranslate, {\n  maxAge: TRANSLATED_MAX_AGE,\n});\nconst throttledLingvaTranslate = pmem(throttle(lingvaTranslate), {\n  // I know, this is double-layered memoization\n  maxAge: TRANSLATED_MAX_AGE,\n});\n\nfunction TranslationBlock({\n  forceTranslate,\n  sourceLanguage,\n  onTranslate,\n  text = '',\n  mini,\n  autoDetected,\n}) {\n  const { t } = useLingui();\n  const targetLang = getTranslateTargetLanguage(true);\n  const [uiState, setUIState] = useState('default');\n  const [pronunciationContent, setPronunciationContent] = useState(null);\n  const [translatedContent, setTranslatedContent] = useState(null);\n  const [detectedLang, setDetectedLang] = useState(null);\n  const detailsRef = useRef();\n\n  const sourceLangText = sourceLanguage\n    ? localeCode2Text(sourceLanguage)\n    : null;\n  const targetLangText = localeCode2Text(targetLang);\n  const apiSourceLang = useRef('auto');\n\n  if (!onTranslate) {\n    // onTranslate = supportsBrowserTranslator\n    //   ? browserTranslate\n    //   : mini\n    //     ? throttledLingvaTranslate\n    //     : lingvaTranslate;\n    onTranslate = async (...args) => {\n      if (supportsBrowserTranslator) {\n        const result = await browserTranslate(...args);\n        if (result && !result.error) {\n          return result;\n        }\n      }\n      return mini\n        ? await throttledLingvaTranslate(...args)\n        : await lingvaTranslate(...args);\n    };\n  }\n\n  const translate = async () => {\n    setUIState('loading');\n    try {\n      const { content, detectedSourceLanguage, provider, error, ...props } =\n        await onTranslate(text, apiSourceLang.current, targetLang);\n      if (content) {\n        if (detectedSourceLanguage) {\n          const detectedLangText = localeCode2Text(detectedSourceLanguage);\n          setDetectedLang(detectedLangText);\n        }\n        if (provider === 'lingva') {\n          const pronunciation = props?.info?.pronunciation?.query;\n          if (pronunciation) {\n            setPronunciationContent(pronunciation);\n          }\n        }\n        setTranslatedContent(content);\n        setUIState('default');\n        if (!mini && content.trim() !== text.trim()) {\n          detailsRef.current.open = true;\n          detailsRef.current.scrollIntoView({\n            behavior: 'smooth',\n            block: 'nearest',\n          });\n        }\n      } else {\n        if (error) console.error(error);\n        setUIState('error');\n      }\n    } catch (e) {\n      console.error(e);\n      setUIState('error');\n    }\n  };\n\n  useEffect(() => {\n    if (forceTranslate) {\n      translate();\n    }\n  }, [forceTranslate]);\n\n  if (mini) {\n    if (\n      !!translatedContent &&\n      translatedContent.trim() !== text.trim() &&\n      detectedLang !== targetLangText\n    ) {\n      return (\n        <LazyShazam>\n          <div class=\"status-translation-block-mini\">\n            <Icon\n              icon=\"translate\"\n              alt={t`Auto-translated from ${sourceLangText}`}\n            />\n            <output\n              lang={targetLang}\n              dir=\"auto\"\n              title={pronunciationContent || ''}\n            >\n              {translatedContent}\n            </output>\n          </div>\n        </LazyShazam>\n      );\n    }\n    return null;\n  }\n\n  return (\n    <div\n      class=\"status-translation-block\"\n      onClick={(e) => {\n        e.preventDefault();\n      }}\n    >\n      <details ref={detailsRef}>\n        <summary>\n          <button\n            type=\"button\"\n            onClick={async (e) => {\n              e.preventDefault();\n              e.stopPropagation();\n              detailsRef.current.open = !detailsRef.current.open;\n              if (uiState === 'loading') return;\n              if (!translatedContent) translate();\n            }}\n          >\n            <Icon icon=\"translate\" />{' '}\n            <span>\n              {uiState === 'loading'\n                ? t`Translating…`\n                : sourceLanguage && sourceLangText && !detectedLang\n                  ? autoDetected\n                    ? t`Translate from ${sourceLangText} (auto-detected)`\n                    : t`Translate from ${sourceLangText}`\n                  : t`Translate`}\n            </span>\n          </button>\n        </summary>\n        <div class=\"translated-block\">\n          <div class=\"translation-info insignificant\">\n            <select\n              class=\"translated-source-select\"\n              disabled={uiState === 'loading'}\n              onChange={(e) => {\n                apiSourceLang.current = e.target.value;\n                translate();\n              }}\n            >\n              {sourceLanguages.map((l) => {\n                const common = localeCode2Text({\n                  code: l.code,\n                  fallback: l.name,\n                });\n                const native = localeCode2Text({\n                  code: l.code,\n                  locale: l.code,\n                });\n                const showCommon = common !== native;\n                return (\n                  <option value={l.code}>\n                    {l.code === 'auto'\n                      ? t`Auto (${detectedLang ?? '…'})`\n                      : showCommon\n                        ? `${native} - ${common}`\n                        : native}\n                  </option>\n                );\n              })}\n            </select>{' '}\n            <span>→ {targetLangText}</span>\n            <Loader abrupt hidden={uiState !== 'loading'} />\n          </div>\n          {uiState === 'error' ? (\n            <p class=\"ui-state\">\n              <Trans>Failed to translate</Trans>\n            </p>\n          ) : (\n            !!translatedContent && (\n              <>\n                <output class=\"translated-content\" lang={targetLang} dir=\"auto\">\n                  {translatedContent}\n                </output>\n                {!!pronunciationContent && (\n                  <output\n                    class=\"translated-pronunciation-content\"\n                    tabIndex={-1}\n                    onClick={(e) => {\n                      e.target.classList.toggle('expand');\n                    }}\n                  >\n                    {pronunciationContent}\n                  </output>\n                )}\n              </>\n            )\n          )}\n        </div>\n      </details>\n    </div>\n  );\n}\n\nexport default LINGVA_INSTANCES?.length ? TranslationBlock : () => null;\n","function promisifyRequest(request) {\n    return new Promise((resolve, reject) => {\n        // @ts-ignore - file size hacks\n        request.oncomplete = request.onsuccess = () => resolve(request.result);\n        // @ts-ignore - file size hacks\n        request.onabort = request.onerror = () => reject(request.error);\n    });\n}\nfunction createStore(dbName, storeName) {\n    const request = indexedDB.open(dbName);\n    request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n    const dbp = promisifyRequest(request);\n    return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n    if (!defaultGetStoreFunc) {\n        defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n    }\n    return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n    return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n    return customStore('readwrite', (store) => {\n        store.put(value, key);\n        return promisifyRequest(store.transaction);\n    });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n    return customStore('readwrite', (store) => {\n        entries.forEach((entry) => store.put(entry[1], entry[0]));\n        return promisifyRequest(store.transaction);\n    });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n    return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n    return customStore('readwrite', (store) => \n    // Need to create the promise manually.\n    // If I try to chain promises, the transaction closes in browsers\n    // that use a promise polyfill (IE10/11).\n    new Promise((resolve, reject) => {\n        store.get(key).onsuccess = function () {\n            try {\n                store.put(updater(this.result), key);\n                resolve(promisifyRequest(store.transaction));\n            }\n            catch (err) {\n                reject(err);\n            }\n        };\n    }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n    return customStore('readwrite', (store) => {\n        store.delete(key);\n        return promisifyRequest(store.transaction);\n    });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n    return customStore('readwrite', (store) => {\n        keys.forEach((key) => store.delete(key));\n        return promisifyRequest(store.transaction);\n    });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n    return customStore('readwrite', (store) => {\n        store.clear();\n        return promisifyRequest(store.transaction);\n    });\n}\nfunction eachCursor(store, callback) {\n    store.openCursor().onsuccess = function () {\n        if (!this.result)\n            return;\n        callback(this.result);\n        this.result.continue();\n    };\n    return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n    return customStore('readonly', (store) => {\n        // Fast path for modern browsers\n        if (store.getAllKeys) {\n            return promisifyRequest(store.getAllKeys());\n        }\n        const items = [];\n        return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n    });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n    return customStore('readonly', (store) => {\n        // Fast path for modern browsers\n        if (store.getAll) {\n            return promisifyRequest(store.getAll());\n        }\n        const items = [];\n        return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n    });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n    return customStore('readonly', (store) => {\n        // Fast path for modern browsers\n        // (although, hopefully we'll get a simpler path some day)\n        if (store.getAll && store.getAllKeys) {\n            return Promise.all([\n                promisifyRequest(store.getAllKeys()),\n                promisifyRequest(store.getAll()),\n            ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n        }\n        const items = [];\n        return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n    });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import {\n  clear,\n  createStore,\n  del,\n  delMany,\n  get,\n  getMany,\n  keys,\n  set,\n} from 'idb-keyval';\n\nfunction initDB(dbName, storeName) {\n  const store = createStore(dbName, storeName);\n  return {\n    set: (key, val) => set(key, val, store),\n    get: (key) => get(key, store),\n    getMany: (keys) => getMany(keys, store),\n    del: (key) => del(key, store),\n    delMany: (keys) => delMany(keys, store),\n    clear: () => clear(store),\n    keys: () => keys(store),\n  };\n}\n\nexport default {\n  drafts: initDB('drafts-db', 'drafts-store'),\n  catchup: initDB('catchup-db', 'catchup-store'),\n};\n","import { api } from './api';\nimport { getCurrentAccountID } from './store-utils';\n\nexport async function fetchRelationships(accounts, relationshipsMap = {}) {\n  if (!accounts?.length) return;\n  const { masto } = api();\n\n  const currentAccount = getCurrentAccountID();\n  const uniqueAccountIds = accounts.reduce((acc, a) => {\n    // 1. Ignore duplicate accounts\n    // 2. Ignore accounts that are already inside relationshipsMap\n    // 3. Ignore currently logged in account\n    if (\n      !acc.includes(a.id) &&\n      !relationshipsMap[a.id] &&\n      a.id !== currentAccount\n    ) {\n      acc.push(a.id);\n    }\n    return acc;\n  }, []);\n  if (!uniqueAccountIds.length) return null;\n\n  try {\n    const relationships = await masto.v1.accounts.relationships.fetch({\n      id: uniqueAccountIds,\n    });\n    const newRelationshipsMap = relationships.reduce((acc, r) => {\n      acc[r.id] = r;\n      return acc;\n    }, {});\n    return newRelationshipsMap;\n  } catch (e) {\n    console.error(e);\n    // It's okay to fail\n    return null;\n  }\n}\n","export class LiteYTEmbed extends HTMLElement {\n    constructor() {\n        super();\n        this.isIframeLoaded = false;\n        this.setupDom();\n    }\n    static get observedAttributes() {\n        return ['videoid', 'playlistid', 'videoplay', 'videotitle'];\n    }\n    connectedCallback() {\n        this.addEventListener('pointerover', () => LiteYTEmbed.warmConnections(this), {\n            once: true,\n        });\n        this.addEventListener('click', () => this.addIframe());\n    }\n    get videoId() {\n        return encodeURIComponent(this.getAttribute('videoid') || '');\n    }\n    set videoId(id) {\n        this.setAttribute('videoid', id);\n    }\n    get playlistId() {\n        return encodeURIComponent(this.getAttribute('playlistid') || '');\n    }\n    set playlistId(id) {\n        this.setAttribute('playlistid', id);\n    }\n    get videoTitle() {\n        return this.getAttribute('videotitle') || 'Video';\n    }\n    set videoTitle(title) {\n        this.setAttribute('videotitle', title);\n    }\n    get videoPlay() {\n        return this.getAttribute('videoplay') || 'Play';\n    }\n    set videoPlay(name) {\n        this.setAttribute('videoplay', name);\n    }\n    get videoStartAt() {\n        return this.getAttribute('videoStartAt') || '0';\n    }\n    get autoLoad() {\n        return this.hasAttribute('autoload');\n    }\n    get autoPause() {\n        return this.hasAttribute('autopause');\n    }\n    get noCookie() {\n        return this.hasAttribute('nocookie');\n    }\n    get posterQuality() {\n        return this.getAttribute('posterquality') || 'hqdefault';\n    }\n    get posterLoading() {\n        return (this.getAttribute('posterloading') ||\n            'lazy');\n    }\n    get params() {\n        return `start=${this.videoStartAt}&${this.getAttribute('params')}`;\n    }\n    set params(opts) {\n        this.setAttribute('params', opts);\n    }\n    set posterQuality(opts) {\n        this.setAttribute('posterquality', opts);\n    }\n    get disableNoscript() {\n        return this.hasAttribute('disablenoscript');\n    }\n    setupDom() {\n        const shadowDom = this.attachShadow({ mode: 'open' });\n        let nonce = '';\n        if (window.liteYouTubeNonce) {\n            nonce = `nonce=\"${window.liteYouTubeNonce}\"`;\n        }\n        shadowDom.innerHTML = `\n      <style ${nonce}>\n        :host {\n          --aspect-ratio: var(--lite-youtube-aspect-ratio, 16 / 9);\n          --aspect-ratio-short: var(--lite-youtube-aspect-ratio-short, 9 / 16);\n          --frame-shadow-visible: var(--lite-youtube-frame-shadow-visible, yes);\n          contain: content;\n          display: block;\n          position: relative;\n          width: 100%;\n          aspect-ratio: var(--aspect-ratio);\n        }\n\n        @media (max-width: 40em) {\n          :host([short]) {\n            aspect-ratio: var(--aspect-ratio-short);\n          }\n        }\n\n        #frame, #fallbackPlaceholder, iframe {\n          position: absolute;\n          width: 100%;\n          height: 100%;\n          left: 0;\n        }\n\n        #frame {\n          cursor: pointer;\n        }\n\n        #fallbackPlaceholder, slot[name=image]::slotted(*) {\n          object-fit: cover;\n          width: 100%;\n        }\n\n        @container style(--frame-shadow-visible: yes) {\n          #frame::before {\n            content: '';\n            display: block;\n            position: absolute;\n            top: 0;\n            background-image: linear-gradient(180deg, #111 -20%, transparent 90%);\n            height: 60px;\n            width: 100%;\n            z-index: 1;\n          }\n        }\n\n        #playButton {\n          width: 68px;\n          height: 48px;\n          background-color: transparent;\n          background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 68 48\"><path d=\"M66.52 7.74c-.78-2.93-2.49-5.41-5.42-6.19C55.79.13 34 0 34 0S12.21.13 6.9 1.55c-2.93.78-4.63 3.26-5.42 6.19C.06 13.05 0 24 0 24s.06 10.95 1.48 16.26c.78 2.93 2.49 5.41 5.42 6.19C12.21 47.87 34 48 34 48s21.79-.13 27.1-1.55c2.93-.78 4.64-3.26 5.42-6.19C67.94 34.95 68 24 68 24s-.06-10.95-1.48-16.26z\" fill=\"red\"/><path d=\"M45 24 27 14v20\" fill=\"white\"/></svg>');\n          z-index: 1;\n          border: 0;\n          border-radius: inherit;\n        }\n\n        #playButton:before {\n          content: '';\n          border-style: solid;\n          border-width: 11px 0 11px 19px;\n          border-color: transparent transparent transparent #fff;\n        }\n\n        #playButton,\n        #playButton:before {\n          position: absolute;\n          top: 50%;\n          left: 50%;\n          transform: translate3d(-50%, -50%, 0);\n          cursor: inherit;\n        }\n\n        /* Post-click styles */\n        .activated {\n          cursor: unset;\n        }\n\n        #frame.activated::before,\n        #frame.activated > #playButton {\n          display: none;\n        }\n      </style>\n      <div id=\"frame\">\n        <picture>\n          <slot name=\"image\">\n            <source id=\"webpPlaceholder\" type=\"image/webp\">\n            <source id=\"jpegPlaceholder\" type=\"image/jpeg\">\n            <img id=\"fallbackPlaceholder\" referrerpolicy=\"origin\" loading=\"lazy\">\n          </slot>\n        </picture>\n        <button id=\"playButton\"></button>\n      </div>\n    `;\n        this.domRefFrame = shadowDom.querySelector('#frame');\n        this.domRefImg = {\n            fallback: shadowDom.querySelector('#fallbackPlaceholder'),\n            webp: shadowDom.querySelector('#webpPlaceholder'),\n            jpeg: shadowDom.querySelector('#jpegPlaceholder'),\n        };\n        this.domRefPlayButton = shadowDom.querySelector('#playButton');\n    }\n    setupComponent() {\n        const hasImgSlot = this.shadowRoot.querySelector('slot[name=image]');\n        if (hasImgSlot.assignedNodes().length === 0) {\n            this.initImagePlaceholder();\n        }\n        this.domRefPlayButton.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n        this.setAttribute('title', `${this.videoPlay}: ${this.videoTitle}`);\n        if (this.autoLoad || this.isYouTubeShort() || this.autoPause) {\n            this.initIntersectionObserver();\n        }\n        if (!this.disableNoscript) {\n            this.injectSearchNoScript();\n        }\n    }\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (oldVal !== newVal) {\n            this.setupComponent();\n            if (this.domRefFrame.classList.contains('activated')) {\n                this.domRefFrame.classList.remove('activated');\n                this.shadowRoot.querySelector('iframe').remove();\n                this.isIframeLoaded = false;\n            }\n        }\n    }\n    injectSearchNoScript() {\n        const eleNoScript = document.createElement('noscript');\n        this.prepend(eleNoScript);\n        eleNoScript.innerHTML = this.generateIframe();\n    }\n    generateIframe(isIntersectionObserver = false) {\n        let autoplay = isIntersectionObserver ? 0 : 1;\n        const wantsNoCookie = this.noCookie ? '-nocookie' : '';\n        let embedTarget;\n        if (this.playlistId) {\n            embedTarget = `?listType=playlist&list=${this.playlistId}&`;\n        }\n        else {\n            embedTarget = `${this.videoId}?`;\n        }\n        if (this.autoPause) {\n            this.params = `enablejsapi=1`;\n        }\n        if (this.isYouTubeShort()) {\n            this.params = `loop=1&mute=1&modestbranding=1&playsinline=1&rel=0&enablejsapi=1&playlist=${this.videoId}`;\n            autoplay = 1;\n        }\n        return `\n<iframe credentialless frameborder=\"0\" title=\"${this.videoTitle}\"\n  allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\n  src=\"https://www.youtube${wantsNoCookie}.com/embed/${embedTarget}autoplay=${autoplay}&${this.params}\"\n></iframe>`;\n    }\n    addIframe(isIntersectionObserver = false) {\n        if (!this.isIframeLoaded) {\n            const iframeHTML = this.generateIframe(isIntersectionObserver);\n            this.domRefFrame.insertAdjacentHTML('beforeend', iframeHTML);\n            this.domRefFrame.classList.add('activated');\n            this.isIframeLoaded = true;\n            this.attemptShortAutoPlay();\n            this.dispatchEvent(new CustomEvent('liteYoutubeIframeLoaded', {\n                detail: {\n                    videoId: this.videoId,\n                },\n                bubbles: true,\n                cancelable: true,\n            }));\n        }\n    }\n    initImagePlaceholder() {\n        this.testPosterImage();\n        this.domRefImg.fallback.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n        this.domRefImg?.fallback?.setAttribute('alt', `${this.videoPlay}: ${this.videoTitle}`);\n    }\n    async testPosterImage() {\n        setTimeout(() => {\n            const webpUrl = `https://i.ytimg.com/vi_webp/${this.videoId}/${this.posterQuality}.webp`;\n            const img = new Image();\n            img.fetchPriority = 'low';\n            img.referrerPolicy = 'origin';\n            img.src = webpUrl;\n            img.onload = async (e) => {\n                const target = e.target;\n                const noPoster = target?.naturalHeight == 90 && target?.naturalWidth == 120;\n                if (noPoster) {\n                    this.posterQuality = 'hqdefault';\n                }\n                const posterUrlWebp = `https://i.ytimg.com/vi_webp/${this.videoId}/${this.posterQuality}.webp`;\n                this.domRefImg.webp.srcset = posterUrlWebp;\n                const posterUrlJpeg = `https://i.ytimg.com/vi/${this.videoId}/${this.posterQuality}.jpg`;\n                this.domRefImg.fallback.loading = this.posterLoading;\n                this.domRefImg.jpeg.srcset = posterUrlJpeg;\n                this.domRefImg.fallback.src = posterUrlJpeg;\n                this.domRefImg.fallback.loading = this.posterLoading;\n            };\n        }, 100);\n    }\n    initIntersectionObserver() {\n        const options = {\n            root: null,\n            rootMargin: '0px',\n            threshold: 0,\n        };\n        const observer = new IntersectionObserver((entries, observer) => {\n            entries.forEach(entry => {\n                if (entry.isIntersecting && !this.isIframeLoaded) {\n                    LiteYTEmbed.warmConnections(this);\n                    this.addIframe(true);\n                    observer.unobserve(this);\n                }\n            });\n        }, options);\n        observer.observe(this);\n        if (this.autoPause) {\n            const windowPause = new IntersectionObserver((e, o) => {\n                e.forEach(entry => {\n                    if (entry.intersectionRatio !== 1) {\n                        this.shadowRoot\n                            .querySelector('iframe')\n                            ?.contentWindow?.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*');\n                    }\n                });\n            }, { threshold: 1 });\n            windowPause.observe(this);\n        }\n    }\n    attemptShortAutoPlay() {\n        if (this.isYouTubeShort()) {\n            setTimeout(() => {\n                this.shadowRoot\n                    .querySelector('iframe')\n                    ?.contentWindow?.postMessage('{\"event\":\"command\",\"func\":\"' + 'playVideo' + '\",\"args\":\"\"}', '*');\n            }, 2000);\n        }\n    }\n    isYouTubeShort() {\n        return (this.getAttribute('short') === '' &&\n            window.matchMedia('(max-width: 40em)').matches);\n    }\n    static addPrefetch(kind, url) {\n        const linkElem = document.createElement('link');\n        linkElem.rel = kind;\n        linkElem.href = url;\n        linkElem.crossOrigin = 'true';\n        document.head.append(linkElem);\n    }\n    static warmConnections(context) {\n        if (LiteYTEmbed.isPreconnected || window.liteYouTubeIsPreconnected)\n            return;\n        LiteYTEmbed.addPrefetch('preconnect', 'https://i.ytimg.com/');\n        LiteYTEmbed.addPrefetch('preconnect', 'https://s.ytimg.com');\n        if (!context.noCookie) {\n            LiteYTEmbed.addPrefetch('preconnect', 'https://www.youtube.com');\n            LiteYTEmbed.addPrefetch('preconnect', 'https://www.google.com');\n            LiteYTEmbed.addPrefetch('preconnect', 'https://googleads.g.doubleclick.net');\n            LiteYTEmbed.addPrefetch('preconnect', 'https://static.doubleclick.net');\n        }\n        else {\n            LiteYTEmbed.addPrefetch('preconnect', 'https://www.youtube-nocookie.com');\n        }\n        LiteYTEmbed.isPreconnected = true;\n        window.liteYouTubeIsPreconnected = true;\n    }\n}\nLiteYTEmbed.isPreconnected = false;\ncustomElements.define('lite-youtube', LiteYTEmbed);\n//# sourceMappingURL=lite-youtube.js.map","const digitLookup = new Uint8Array(128);\nfor (let i = 0; i < 83; i++) {\n    digitLookup[\n        '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~'.charCodeAt(\n            i,\n        )\n    ] = i;\n}\nconst decode83 = (str, start, end) => {\n    let value = 0;\n    while (start < end) {\n        value *= 83;\n        value += digitLookup[str.charCodeAt(start++)];\n    }\n    return value;\n};\n\nconst pow = Math.pow;\nconst PI = Math.PI;\nconst PI2 = PI * 2;\n\nconst d = 3294.6;\nconst e = 269.025;\nconst sRGBToLinear = (value) =>\n    value > 10.31475 ? pow(value / e + 0.052132, 2.4) : value / d;\n\nconst linearTosRGB = (v) =>\n    ~~(v > 0.00001227 ? e * pow(v, 0.416666) - 13.025 : v * d + 1);\n\nconst signSqr = (x) => (x < 0 ? -1 : 1) * x * x;\n\n/**\n * Fast approximate cosine implementation\n * Based on FTrig https://github.com/netcell/FTrig\n */\nconst fastCos = (x) => {\n    x += PI / 2;\n    while (x > PI) {\n        x -= PI2;\n    }\n    const cos = 1.27323954 * x - 0.405284735 * signSqr(x);\n    return 0.225 * (signSqr(cos) - cos) + cos;\n};\n\n/**\n * Extracts average color from BlurHash image\n * @param {string} blurHash BlurHash image string\n * @returns {[number, number, number]}\n */\nexport function getBlurHashAverageColor(blurHash) {\n    const val = decode83(blurHash, 2, 6);\n    return [val >> 16, (val >> 8) & 255, val & 255];\n}\n\n/**\n * Decodes BlurHash image\n * @param {string} blurHash BlurHash image string\n * @param {number} width Output image width\n * @param {number} height Output image height\n * @param {?number} punch\n * @returns {Uint8ClampedArray}\n */\nexport function decodeBlurHash(blurHash, width, height, punch) {\n    const sizeFlag = decode83(blurHash, 0, 1);\n    const numX = (sizeFlag % 9) + 1;\n    const numY = ~~(sizeFlag / 9) + 1;\n    const size = numX * numY;\n\n    let i = 0,\n        j = 0,\n        x = 0,\n        y = 0,\n        r = 0,\n        g = 0,\n        b = 0,\n        basis = 0,\n        basisY = 0,\n        colorIndex = 0,\n        pixelIndex = 0,\n        value = 0;\n\n    const maximumValue = ((decode83(blurHash, 1, 2) + 1) / 13446) * (punch | 1);\n\n    const colors = new Float64Array(size * 3);\n\n    const averageColor = getBlurHashAverageColor(blurHash);\n    for (i = 0; i < 3; i++) {\n        colors[i] = sRGBToLinear(averageColor[i]);\n    }\n\n    for (i = 1; i < size; i++) {\n        value = decode83(blurHash, 4 + i * 2, 6 + i * 2);\n        colors[i * 3] = signSqr(~~(value / 361) - 9) * maximumValue;\n        colors[i * 3 + 1] = signSqr((~~(value / 19) % 19) - 9) * maximumValue;\n        colors[i * 3 + 2] = signSqr((value % 19) - 9) * maximumValue;\n    }\n\n    const cosinesY = new Float64Array(numY * height);\n    const cosinesX = new Float64Array(numX * width);\n    for (j = 0; j < numY; j++) {\n        for (y = 0; y < height; y++) {\n            cosinesY[j * height + y] = fastCos((PI * y * j) / height);\n        }\n    }\n    for (i = 0; i < numX; i++) {\n        for (x = 0; x < width; x++) {\n            cosinesX[i * width + x] = fastCos((PI * x * i) / width);\n        }\n    }\n\n    const bytesPerRow = width * 4;\n    const pixels = new Uint8ClampedArray(bytesPerRow * height);\n\n    for (y = 0; y < height; y++) {\n        for (x = 0; x < width; x++) {\n            r = g = b = 0;\n            for (j = 0; j < numY; j++) {\n                basisY = cosinesY[j * height + y];\n                for (i = 0; i < numX; i++) {\n                    basis = cosinesX[i * width + x] * basisY;\n                    colorIndex = (i + j * numX) * 3;\n                    r += colors[colorIndex] * basis;\n                    g += colors[colorIndex + 1] * basis;\n                    b += colors[colorIndex + 2] * basis;\n                }\n            }\n\n            pixelIndex = 4 * x + y * bytesPerRow;\n            pixels[pixelIndex] = linearTosRGB(r);\n            pixels[pixelIndex + 1] = linearTosRGB(g);\n            pixels[pixelIndex + 2] = linearTosRGB(b);\n            pixels[pixelIndex + 3] = 255; // alpha\n        }\n    }\n    return pixels;\n}\n","/**\n * @param {string[]} splittedHtml\n * @param {{ char?: string; count?: number}} options\n * @returns {string}\n */\nconst addIndentation = (splittedHtml, options = {}) => {\n  const char = options.char || ' '\n  const count = options.count || 2\n\n  let level = 0\n  const opened = []\n\n  return splittedHtml.reverse().reduce((indented, elTag) => {\n    if (opened.length\n      && level\n      && opened[level]\n      /* if current element tag is the same as previously opened one */\n      && opened[level] === elTag.substring(1, opened[level].length + 1)\n    ) {\n      opened.splice(level, 1)\n      level--\n    }\n\n    const indentation = char.repeat(level ? level * count : 0)\n\n    const newIndented = [\n      `${indentation}${elTag}`,\n      ...indented,\n    ]\n\n    // if current element tag is closing tag\n    // add it to opened elements\n    if (elTag.substring(0, 2) === '</') {\n      level++\n      opened[level] = elTag.substring(2, elTag.length - 1)\n    }\n\n    return newIndented\n  }, []).join('\\n')\n}\n\nmodule.exports = addIndentation\n","/**\n * @param {string} nonFormattedString Any non formatted string\n * @returns {string[]} Array of strings separated on new lines\n */\nconst removeEmptyLines = (nonFormattedString) => (\n  // Replace\n  // - 1 or more spaces or tabs at the start of line\n  // - 1 or more spaces or tabs at the end of line\n  // - empty lines\n  // with empty string\n  nonFormattedString.trim().replace(/(^(\\s|\\t)+|(( |\\t)+)$)/gm, '')\n)\n\n/**\n * @param {string} markup\n * @returns {string[]} Array of strings splitted on new lines without empty lines\n */\nconst mergeAttributesWithElements = (markup) => {\n  const splittedMarkup = removeEmptyLines(markup).split('\\n')\n\n  const mergedLines = []\n  let currentElement = ''\n  for (let i = 0; i < splittedMarkup.length; i += 1) {\n    const line = splittedMarkup[i]\n\n    // If line is closing element/tag separate closing tag from rest of the line with space\n    if (line.endsWith('/>')) {\n      mergedLines.push(`${currentElement}${line.slice(0, -2)} />`)\n      currentElement = ''\n      // eslint-disable-next-line no-continue\n      continue\n    }\n\n    if (line.endsWith('>')) {\n      mergedLines.push(`${currentElement}${\n        line.startsWith('>') || line.startsWith('<') ? '' : ' '\n      }${line}`)\n      currentElement = ''\n      // eslint-disable-next-line no-continue\n      continue\n    }\n\n    currentElement += currentElement.length ? ` ${line}` : line\n  }\n\n  return mergedLines\n}\n\nmodule.exports = {\n  mergeAttributesWithElements,\n  removeEmptyLines,\n}\n","const addIndentation = require('./utils/addIndentation')\nconst { mergeAttributesWithElements } = require('./utils/toLines')\n\n/**\n * @param {string} markup\n * @param {{ char?: string; count?: number }} options\n * @returns {string}\n */\nconst prettify = (markup, options = {}) => {\n  const splitted = mergeAttributesWithElements(markup)\n\n  return addIndentation(splitted, options)\n}\n\nmodule.exports = prettify\n","import { i18n } from '@lingui/core';\nimport { plural } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useState } from 'preact/hooks';\n\nimport shortenNumber from '../utils/shorten-number';\n\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport RelativeTime from './relative-time';\n\nexport default function Poll({\n  poll,\n  lang,\n  readOnly,\n  refresh = () => {},\n  votePoll = () => {},\n}) {\n  const { t } = useLingui();\n  const [uiState, setUIState] = useState('default');\n  const {\n    expired,\n    expiresAt,\n    id,\n    multiple,\n    options,\n    ownVotes,\n    voted,\n    votersCount,\n    votesCount = 0,\n    emojis,\n  } = poll;\n  const expiresAtDate = !!expiresAt && new Date(expiresAt); // Update poll at point of expiry\n  // NOTE: Disable this because setTimeout runs immediately if delay is too large\n  // https://stackoverflow.com/a/56718027/20838\n  // useEffect(() => {\n  //   let timeout;\n  //   if (!expired && expiresAtDate) {\n  //     const ms = expiresAtDate.getTime() - Date.now() + 1; // +1 to give it a little buffer\n  //     if (ms > 0) {\n  //       timeout = setTimeout(() => {\n  //         setUIState('loading');\n  //         (async () => {\n  //           // await refresh();\n  //           setUIState('default');\n  //         })();\n  //       }, ms);\n  //     }\n  //   }\n  //   return () => {\n  //     clearTimeout(timeout);\n  //   };\n  // }, [expired, expiresAtDate]);\n\n  const pollVotesCount = multiple ? votersCount : votesCount;\n  let roundPrecision = 0;\n\n  if (pollVotesCount <= 1000) {\n    roundPrecision = 0;\n  } else if (pollVotesCount <= 10000) {\n    roundPrecision = 1;\n  } else if (pollVotesCount <= 100000) {\n    roundPrecision = 2;\n  }\n\n  const [showResults, setShowResults] = useState(false);\n  const optionsHaveVoteCounts = options.every((o) => o.votesCount !== null);\n\n  return (\n    <div\n      lang={lang}\n      dir=\"auto\"\n      class={`poll ${readOnly ? 'read-only' : ''} ${\n        uiState === 'loading' ? 'loading' : ''\n      }`}\n    >\n      {(showResults && optionsHaveVoteCounts) || voted || expired ? (\n        <>\n          <div class=\"poll-options\">\n            {options.map((option, i) => {\n              const { title, votesCount: optionVotesCount } = option;\n              const ratio = pollVotesCount\n                ? optionVotesCount / pollVotesCount\n                : 0;\n              const percentage = ratio\n                ? ratio.toLocaleString(i18n.locale || undefined, {\n                    style: 'percent',\n                    maximumFractionDigits: roundPrecision,\n                  })\n                : '0%';\n\n              const isLeading =\n                optionVotesCount > 0 &&\n                optionVotesCount ===\n                  Math.max(...options.map((o) => o.votesCount));\n              return (\n                <div\n                  key={`${i}-${title}-${optionVotesCount}`}\n                  class={`poll-option poll-result ${\n                    isLeading ? 'poll-option-leading' : ''\n                  }`}\n                  style={{\n                    '--percentage': `${ratio * 100}%`,\n                  }}\n                >\n                  <div class=\"poll-option-title\">\n                    <span>\n                      <EmojiText text={title} emojis={emojis} />\n                    </span>\n                    {voted && ownVotes.includes(i) && (\n                      <>\n                        {' '}\n                        <Icon icon=\"check-circle\" alt={t`Voted`} />\n                      </>\n                    )}\n                  </div>\n                  <div\n                    class=\"poll-option-votes\"\n                    title={plural(optionVotesCount, {\n                      one: `# vote`,\n                      other: `# votes`,\n                    })}\n                  >\n                    {percentage}\n                  </div>\n                </div>\n              );\n            })}\n          </div>\n          {!expired && !voted && (\n            <button\n              class=\"poll-vote-button plain2\"\n              disabled={uiState === 'loading'}\n              onClick={(e) => {\n                e.preventDefault();\n                setShowResults(false);\n              }}\n            >\n              <Icon icon=\"arrow-left\" size=\"s\" /> <Trans>Hide results</Trans>\n            </button>\n          )}\n        </>\n      ) : (\n        <form\n          onSubmit={async (e) => {\n            e.preventDefault();\n            const form = e.target;\n            const formData = new FormData(form);\n            const choices = [];\n            formData.forEach((value, key) => {\n              if (key === 'poll') {\n                choices.push(value);\n              }\n            });\n            if (!choices.length) return;\n            setUIState('loading');\n            await votePoll(choices);\n            setUIState('default');\n          }}\n        >\n          <div class=\"poll-options\">\n            {options.map((option, i) => {\n              const { title } = option;\n              return (\n                <div class=\"poll-option\">\n                  <label class=\"poll-label\">\n                    <input\n                      type={multiple ? 'checkbox' : 'radio'}\n                      name=\"poll\"\n                      value={i}\n                      disabled={uiState === 'loading'}\n                      readOnly={readOnly}\n                    />\n                    <span class=\"poll-option-title\">\n                      <EmojiText text={title} emojis={emojis} />\n                    </span>\n                  </label>\n                </div>\n              );\n            })}\n          </div>\n          {!readOnly && (\n            <button\n              class=\"poll-vote-button\"\n              type=\"submit\"\n              disabled={uiState === 'loading'}\n            >\n              <Trans>Vote</Trans>\n            </button>\n          )}\n        </form>\n      )}\n      <p class=\"poll-meta\">\n        {!expired && !readOnly && (\n          <button\n            type=\"button\"\n            class=\"plain small\"\n            disabled={uiState === 'loading'}\n            onClick={(e) => {\n              e.preventDefault();\n              setUIState('loading');\n\n              (async () => {\n                await refresh();\n                setUIState('default');\n              })();\n            }}\n            title={t`Refresh`}\n          >\n            <Icon icon=\"refresh\" alt={t`Refresh`} />\n          </button>\n        )}\n        {!voted && !expired && !readOnly && optionsHaveVoteCounts && (\n          <button\n            type=\"button\"\n            class=\"plain small\"\n            disabled={uiState === 'loading'}\n            onClick={(e) => {\n              e.preventDefault();\n              setShowResults(!showResults);\n            }}\n            title={showResults ? t`Hide results` : t`Show results`}\n          >\n            <Icon\n              icon={showResults ? 'eye-open' : 'eye-close'}\n              alt={showResults ? t`Hide results` : t`Show results`}\n            />{' '}\n          </button>\n        )}\n        {!expired && !readOnly && ' '}\n        <Plural\n          value={votesCount}\n          one={\n            <Trans>\n              <span title={votesCount}>{shortenNumber(votesCount)}</span> vote\n            </Trans>\n          }\n          other={\n            <Trans>\n              <span title={votesCount}>{shortenNumber(votesCount)}</span> votes\n            </Trans>\n          }\n        />\n        {!!votersCount && votersCount !== votesCount && (\n          <>\n            {' '}\n            &bull;{' '}\n            <Plural\n              value={votersCount}\n              one={\n                <Trans>\n                  <span title={votersCount}>{shortenNumber(votersCount)}</span>{' '}\n                  voter\n                </Trans>\n              }\n              other={\n                <Trans>\n                  <span title={votersCount}>{shortenNumber(votersCount)}</span>{' '}\n                  voters\n                </Trans>\n              }\n            />\n          </>\n        )}{' '}\n        &bull;{' '}\n        {expired ? (\n          !!expiresAtDate ? (\n            <Trans>\n              Ended <RelativeTime datetime={expiresAtDate} />\n            </Trans>\n          ) : (\n            t`Ended`\n          )\n        ) : !!expiresAtDate ? (\n          <Trans>\n            Ending <RelativeTime datetime={expiresAtDate} />\n          </Trans>\n        ) : (\n          t`Ending`\n        )}\n      </p>\n    </div>\n  );\n}\n","import { createContext } from 'preact';\n\nconst FilterContext = createContext();\nexport default FilterContext;\n","import mem from './mem';\nimport { getCurrentAccountID } from './store-utils';\n\nfunction _isFiltered(filtered, filterContext) {\n  if (!filtered?.length) return false;\n  const appliedFilters = filtered.filter((f) => {\n    const { filter } = f;\n    const hasContext = filter.context.includes(filterContext);\n    if (!hasContext) return false;\n    if (!filter.expiresAt) return hasContext;\n    return new Date(filter.expiresAt) > new Date();\n  });\n  if (!appliedFilters.length) return false;\n  const isHidden = appliedFilters.some((f) => f.filter.filterAction === 'hide');\n  if (isHidden)\n    return {\n      action: 'hide',\n    };\n  const isWarn = appliedFilters.some((f) => f.filter.filterAction === 'warn');\n  if (isWarn) {\n    const filterTitles = appliedFilters.map((f) => f.filter.title);\n    return {\n      action: 'warn',\n      titles: filterTitles,\n      titlesStr: filterTitles.join(' • '),\n    };\n  }\n  return false;\n}\nexport const isFiltered = mem(_isFiltered);\n\nexport function filteredItem(item, filterContext, currentAccountID) {\n  const { filtered } = item;\n  if (!filtered?.length) return true;\n  const isSelf = currentAccountID && item.account?.id === currentAccountID;\n  if (isSelf) return true;\n  const filterState = isFiltered(filtered, filterContext);\n  if (!filterState) return true;\n  if (filterState.action === 'hide') return false;\n  // item._filtered = filterState;\n  return true;\n}\nexport function filteredItems(items, filterContext) {\n  if (!items?.length) return [];\n  if (!filterContext) return items;\n  const currentAccountID = getCurrentAccountID();\n  return items.filter((item) =>\n    filteredItem(item, filterContext, currentAccountID),\n  );\n}\n","const div = document.createElement('div');\nexport default function htmlContentLength(html) {\n  if (!html) return 0;\n  div.innerHTML = html;\n  // .invisible spans for links\n  // e.g. <span class=\"invisible\">https://</span>mastodon.social\n  div.querySelectorAll('.invisible').forEach((el) => {\n    el.remove();\n  });\n  return div.innerText.length;\n}\n","export const supportsTTS = 'speechSynthesis' in window;\n\nexport function speak(text, lang) {\n  if (!supportsTTS) return;\n  try {\n    if (speechSynthesis.speaking) {\n      speechSynthesis.cancel();\n    }\n    const utterance = new SpeechSynthesisUtterance(text);\n    if (lang) utterance.lang = lang;\n    speechSynthesis.speak(utterance);\n  } catch (e) {\n    alert(e);\n  }\n}\n","import{useRef as r,useEffect as n,useMemo as t,useState as e,useCallback as u}from\"react\";function c(e,u,c){var i=this,a=r(null),o=r(0),f=r(null),l=r([]),v=r(),m=r(),d=r(e),g=r(!0);d.current=e;var p=\"undefined\"!=typeof window,w=!u&&0!==u&&p;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");u=+u||0;var s=!!(c=c||{}).leading,x=!(\"trailing\"in c)||!!c.trailing,h=\"maxWait\"in c,y=\"debounceOnServer\"in c&&!!c.debounceOnServer,F=h?Math.max(+c.maxWait||0,u):null;n(function(){return g.current=!0,function(){g.current=!1}},[]);var A=t(function(){var r=function(r){var n=l.current,t=v.current;return l.current=v.current=null,o.current=r,m.current=d.current.apply(t,n)},n=function(r,n){w&&cancelAnimationFrame(f.current),f.current=w?requestAnimationFrame(r):setTimeout(r,n)},t=function(r){if(!g.current)return!1;var n=r-a.current;return!a.current||n>=u||n<0||h&&r-o.current>=F},e=function(n){return f.current=null,x&&l.current?r(n):(l.current=v.current=null,m.current)},c=function r(){var c=Date.now();if(t(c))return e(c);if(g.current){var i=u-(c-a.current),f=h?Math.min(i,F-(c-o.current)):i;n(r,f)}},A=function(){if(p||y){var e=Date.now(),d=t(e);if(l.current=[].slice.call(arguments),v.current=i,a.current=e,d){if(!f.current&&g.current)return o.current=a.current,n(c,u),s?r(a.current):m.current;if(h)return n(c,u),r(a.current)}return f.current||n(c,u),m.current}};return A.cancel=function(){f.current&&(w?cancelAnimationFrame(f.current):clearTimeout(f.current)),o.current=0,l.current=a.current=v.current=f.current=null},A.isPending=function(){return!!f.current},A.flush=function(){return f.current?e(Date.now()):m.current},A},[s,h,u,F,x,w,p,y]);return A}function i(r,n){return r===n}function a(n,t,a){var o=a&&a.equalityFn||i,f=r(n),l=e({})[1],v=c(u(function(r){f.current=r,l({})},[l]),t,a),m=r(n);return o(m.current,n)||(v(n),m.current=n),[f.current,v]}function o(r,n,t){var e=void 0===t?{}:t,u=e.leading,i=e.trailing;return c(r,n,{maxWait:n,leading:void 0===u||u,trailing:void 0===i||i})}export{a as useDebounce,c as useDebouncedCallback,o as useThrottledCallback};\n//# sourceMappingURL=index.module.js.map\n","import { useRef, useEffect, useCallback, useState, useMemo } from 'react';\n\n// This could've been more streamlined with internal state instead of abusing\n// refs to such extent, but then composing hooks and components could not opt out of unnecessary renders.\nfunction useResolvedElement(subscriber, refOrElement) {\n  var lastReportRef = useRef(null);\n  var refOrElementRef = useRef(null);\n  refOrElementRef.current = refOrElement;\n  var cbElementRef = useRef(null); // Calling re-evaluation after each render without using a dep array,\n  // as the ref object's current value could've changed since the last render.\n\n  useEffect(function () {\n    evaluateSubscription();\n  });\n  var evaluateSubscription = useCallback(function () {\n    var cbElement = cbElementRef.current;\n    var refOrElement = refOrElementRef.current; // Ugly ternary. But smaller than an if-else block.\n\n    var element = cbElement ? cbElement : refOrElement ? refOrElement instanceof Element ? refOrElement : refOrElement.current : null;\n\n    if (lastReportRef.current && lastReportRef.current.element === element && lastReportRef.current.subscriber === subscriber) {\n      return;\n    }\n\n    if (lastReportRef.current && lastReportRef.current.cleanup) {\n      lastReportRef.current.cleanup();\n    }\n\n    lastReportRef.current = {\n      element: element,\n      subscriber: subscriber,\n      // Only calling the subscriber, if there's an actual element to report.\n      // Setting cleanup to undefined unless a subscriber returns one, as an existing cleanup function would've been just called.\n      cleanup: element ? subscriber(element) : undefined\n    };\n  }, [subscriber]); // making sure we call the cleanup function on unmount\n\n  useEffect(function () {\n    return function () {\n      if (lastReportRef.current && lastReportRef.current.cleanup) {\n        lastReportRef.current.cleanup();\n        lastReportRef.current = null;\n      }\n    };\n  }, []);\n  return useCallback(function (element) {\n    cbElementRef.current = element;\n    evaluateSubscription();\n  }, [evaluateSubscription]);\n}\n\n// We're only using the first element of the size sequences, until future versions of the spec solidify on how\n// exactly it'll be used for fragments in multi-column scenarios:\n// From the spec:\n// > The box size properties are exposed as FrozenArray in order to support elements that have multiple fragments,\n// > which occur in multi-column scenarios. However the current definitions of content rect and border box do not\n// > mention how those boxes are affected by multi-column layout. In this spec, there will only be a single\n// > ResizeObserverSize returned in the FrozenArray, which will correspond to the dimensions of the first column.\n// > A future version of this spec will extend the returned FrozenArray to contain the per-fragment size information.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-entry-interface)\n//\n// Also, testing these new box options revealed that in both Chrome and FF everything is returned in the callback,\n// regardless of the \"box\" option.\n// The spec states the following on this:\n// > This does not have any impact on which box dimensions are returned to the defined callback when the event\n// > is fired, it solely defines which box the author wishes to observe layout changes on.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-interface)\n// I'm not exactly clear on what this means, especially when you consider a later section stating the following:\n// > This section is non-normative. An author may desire to observe more than one CSS box.\n// > In this case, author will need to use multiple ResizeObservers.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-interface)\n// Which is clearly not how current browser implementations behave, and seems to contradict the previous quote.\n// For this reason I decided to only return the requested size,\n// even though it seems we have access to results for all box types.\n// This also means that we get to keep the current api, being able to return a simple { width, height } pair,\n// regardless of box option.\nfunction extractSize(entry, boxProp, sizeType) {\n  if (!entry[boxProp]) {\n    if (boxProp === \"contentBoxSize\") {\n      // The dimensions in `contentBoxSize` and `contentRect` are equivalent according to the spec.\n      // See the 6th step in the description for the RO algorithm:\n      // https://drafts.csswg.org/resize-observer/#create-and-populate-resizeobserverentry-h\n      // > Set this.contentRect to logical this.contentBoxSize given target and observedBox of \"content-box\".\n      // In real browser implementations of course these objects differ, but the width/height values should be equivalent.\n      return entry.contentRect[sizeType === \"inlineSize\" ? \"width\" : \"height\"];\n    }\n\n    return undefined;\n  } // A couple bytes smaller than calling Array.isArray() and just as effective here.\n\n\n  return entry[boxProp][0] ? entry[boxProp][0][sizeType] : // TS complains about this, because the RO entry type follows the spec and does not reflect Firefox's current\n  // behaviour of returning objects instead of arrays for `borderBoxSize` and `contentBoxSize`.\n  // @ts-ignore\n  entry[boxProp][sizeType];\n}\n\nfunction useResizeObserver(opts) {\n  if (opts === void 0) {\n    opts = {};\n  }\n\n  // Saving the callback as a ref. With this, I don't need to put onResize in the\n  // effect dep array, and just passing in an anonymous function without memoising\n  // will not reinstantiate the hook's ResizeObserver.\n  var onResize = opts.onResize;\n  var onResizeRef = useRef(undefined);\n  onResizeRef.current = onResize;\n  var round = opts.round || Math.round; // Using a single instance throughout the hook's lifetime\n\n  var resizeObserverRef = useRef();\n\n  var _useState = useState({\n    width: undefined,\n    height: undefined\n  }),\n      size = _useState[0],\n      setSize = _useState[1]; // In certain edge cases the RO might want to report a size change just after\n  // the component unmounted.\n\n\n  var didUnmount = useRef(false);\n  useEffect(function () {\n    didUnmount.current = false;\n    return function () {\n      didUnmount.current = true;\n    };\n  }, []); // Using a ref to track the previous width / height to avoid unnecessary renders.\n\n  var previous = useRef({\n    width: undefined,\n    height: undefined\n  }); // This block is kinda like a useEffect, only it's called whenever a new\n  // element could be resolved based on the ref option. It also has a cleanup\n  // function.\n\n  var refCallback = useResolvedElement(useCallback(function (element) {\n    // We only use a single Resize Observer instance, and we're instantiating it on demand, only once there's something to observe.\n    // This instance is also recreated when the `box` option changes, so that a new observation is fired if there was a previously observed element with a different box option.\n    if (!resizeObserverRef.current || resizeObserverRef.current.box !== opts.box || resizeObserverRef.current.round !== round) {\n      resizeObserverRef.current = {\n        box: opts.box,\n        round: round,\n        instance: new ResizeObserver(function (entries) {\n          var entry = entries[0];\n          var boxProp = opts.box === \"border-box\" ? \"borderBoxSize\" : opts.box === \"device-pixel-content-box\" ? \"devicePixelContentBoxSize\" : \"contentBoxSize\";\n          var reportedWidth = extractSize(entry, boxProp, \"inlineSize\");\n          var reportedHeight = extractSize(entry, boxProp, \"blockSize\");\n          var newWidth = reportedWidth ? round(reportedWidth) : undefined;\n          var newHeight = reportedHeight ? round(reportedHeight) : undefined;\n\n          if (previous.current.width !== newWidth || previous.current.height !== newHeight) {\n            var newSize = {\n              width: newWidth,\n              height: newHeight\n            };\n            previous.current.width = newWidth;\n            previous.current.height = newHeight;\n\n            if (onResizeRef.current) {\n              onResizeRef.current(newSize);\n            } else {\n              if (!didUnmount.current) {\n                setSize(newSize);\n              }\n            }\n          }\n        })\n      };\n    }\n\n    resizeObserverRef.current.instance.observe(element, {\n      box: opts.box\n    });\n    return function () {\n      if (resizeObserverRef.current) {\n        resizeObserverRef.current.instance.unobserve(element);\n      }\n    };\n  }, [opts.box, round]), opts.ref);\n  return useMemo(function () {\n    return {\n      ref: refCallback,\n      width: size.width,\n      height: size.height\n    };\n  }, [refCallback, size.width, size.height]);\n}\n\nexport { useResizeObserver as default };\n","import { useRef } from 'preact/hooks';\nimport { useThrottledCallback } from 'use-debounce';\nimport useResizeObserver from 'use-resize-observer';\n\nexport default function useTruncated({ className = 'truncated' } = {}) {\n  const ref = useRef();\n  const onResize = useThrottledCallback(({ height }) => {\n    if (ref.current) {\n      const { scrollHeight } = ref.current;\n      let truncated = scrollHeight > height;\n      if (truncated) {\n        const { height: _height, maxHeight } = getComputedStyle(ref.current);\n        const computedHeight = parseInt(maxHeight || _height, 10);\n        truncated = scrollHeight > computedHeight;\n      }\n      ref.current.classList.toggle(className, truncated);\n    }\n  }, 300);\n  useResizeObserver({\n    ref,\n    box: 'border-box',\n    onResize,\n  });\n  return ref;\n}\n","export default {\n  public: 'earth',\n  unlisted: 'group',\n  private: 'lock',\n  direct: 'message',\n  local: 'building',\n};\n","export var styleRoot = 'kvfysmfp';\nexport var styleChild = 'ufhsfnkm';\nexport var styles = \".\".concat(styleRoot, \"{overflow:hidden;touch-action:none}.\").concat(styleChild, \"{transform-origin: 0 0}\");\n","var isSsr = typeof window === 'undefined';\nexport var isTouch = function () {\n    return !isSsr && ('ontouchstart' in window || navigator.maxTouchPoints > 0);\n};\nexport var make2dTransformValue = function (_a) {\n    var x = _a.x, y = _a.y, scale = _a.scale;\n    return \"scale(\".concat(scale, \") translate(\").concat(x, \"px, \").concat(y, \"px)\");\n};\nexport var make3dTransformValue = function (_a) {\n    var x = _a.x, y = _a.y, scale = _a.scale;\n    return \"scale3d(\".concat(scale, \",\").concat(scale, \", 1) translate3d(\").concat(x, \"px, \").concat(y, \"px, 0)\");\n};\nexport var hasTranslate3DSupport = function () {\n    var css = !isSsr && window.CSS;\n    return css && css.supports && css.supports('transform', 'translate3d(0,0,0)');\n};\n","var min = Math.min, max = Math.max;\nexport function getOffsetBounds(_a) {\n    var containerDimension = _a.containerDimension, childDimension = _a.childDimension, padding = _a.padding, centerContained = _a.centerContained;\n    var diff = childDimension - containerDimension;\n    if (diff + 2 * padding <= 0 && centerContained) {\n        return [diff / 2, diff / 2];\n    }\n    else {\n        return [min(diff + padding, 0) - padding, max(0, diff + padding)];\n    }\n}\n","import { __assign, __extends } from \"tslib\";\nimport React, { Component, createRef, Children, cloneElement } from 'react';\nimport { styleRoot, styleChild, styles } from './styles.css';\nimport { isTouch } from '../utils';\nimport { getOffsetBounds } from './getOffsetBounds';\nvar classnames = function (base, other) {\n    return other ? \"\".concat(base, \" \").concat(other) : base;\n};\nvar abs = Math.abs, min = Math.min, sqrt = Math.sqrt;\nvar isSsr = typeof window === 'undefined';\nvar isMac = isSsr ? false : /(Mac)/i.test(navigator.platform);\nvar isDragInteraction = function (i) { return i === 'drag'; };\nvar isZoomInteraction = function (i) { return i === 'zoom'; };\nvar isZoomGesture = function (wheelEvent) { return isMac && wheelEvent.ctrlKey; };\nvar cancelEvent = function (event) {\n    event.stopPropagation();\n    event.preventDefault();\n};\nvar getDistance = function (a, b) {\n    var x = a.x - b.x;\n    var y = a.y - b.y;\n    return sqrt(x * x + y * y);\n};\nvar calculateScale = function (startTouches, endTouches) {\n    var startDistance = getDistance(startTouches[0], startTouches[1]);\n    var endDistance = getDistance(endTouches[0], endTouches[1]);\n    return endDistance / startDistance;\n};\nvar isCloseTo = function (value, expected) {\n    return value > expected - 0.01 && value < expected + 0.01;\n};\nvar swing = function (p) { return -Math.cos(p * Math.PI) / 2 + 0.5; };\nvar getPointByPageCoordinates = function (touch) { return ({\n    x: touch.pageX,\n    y: touch.pageY,\n}); };\nvar getPageCoordinatesByTouches = function (touches) {\n    return Array.from(touches).map(getPointByPageCoordinates);\n};\nvar sum = function (a, b) { return a + b; };\nvar getVectorAvg = function (vectors) { return ({\n    x: vectors.map(function (_a) {\n        var x = _a.x;\n        return x;\n    }).reduce(sum, 0) / vectors.length,\n    y: vectors.map(function (_a) {\n        var y = _a.y;\n        return y;\n    }).reduce(sum, 0) / vectors.length,\n}); };\nvar clamp = function (min, max, value) {\n    return value < min ? min : value > max ? max : value;\n};\nvar shouldInterceptWheel = function (event) {\n    return !(event.ctrlKey || event.metaKey);\n};\nvar getElementSize = function (element) {\n    if (element) {\n        var offsetWidth = element.offsetWidth, offsetHeight = element.offsetHeight;\n        // Any DOMElement\n        if (offsetWidth && offsetHeight) {\n            return { width: offsetWidth, height: offsetHeight };\n        }\n        // Svg support\n        var style = getComputedStyle(element);\n        var width = parseFloat(style.width);\n        var height = parseFloat(style.height);\n        if (height && width) {\n            return { width: width, height: height };\n        }\n    }\n    return { width: 0, height: 0 };\n};\nvar calculateVelocity = function (startPoint, endPoint) { return ({\n    x: endPoint.x - startPoint.x,\n    y: endPoint.y - startPoint.y,\n}); };\nvar comparePoints = function (p1, p2) { return p1.x === p2.x && p1.y === p2.y; };\nvar noup = function () { };\nvar zeroPoint = { x: 0, y: 0 };\nvar PinchZoom = /** @class */ (function (_super) {\n    __extends(PinchZoom, _super);\n    function PinchZoom() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._prevDragMovePoint = null;\n        _this._containerObserver = null;\n        _this._fingers = 0;\n        _this._firstMove = true;\n        _this._initialOffset = __assign({}, zeroPoint);\n        _this._interaction = null;\n        _this._isDoubleTap = false;\n        _this._isOffsetsSet = false;\n        _this._lastDragPosition = null;\n        _this._lastScale = 1;\n        _this._lastTouchStart = 0;\n        _this._lastZoomCenter = null;\n        _this._listenMouseMove = false;\n        _this._nthZoom = 0;\n        _this._offset = __assign({}, zeroPoint);\n        _this._startOffset = __assign({}, zeroPoint);\n        _this._startTouches = null;\n        _this._updatePlaned = false;\n        _this._wheelTimeOut = null;\n        _this._zoomFactor = 1;\n        _this._initialZoomFactor = 1;\n        _this._draggingPoint = __assign({}, zeroPoint);\n        // It help reduce behavior difference between touch and mouse events\n        _this._ignoreNextClick = false;\n        // @ts-ignore\n        _this._containerRef = createRef();\n        _this._handleClick = function (clickEvent) {\n            if (_this._ignoreNextClick) {\n                _this._ignoreNextClick = false;\n                clickEvent.stopPropagation();\n            }\n        };\n        _this._onResize = function () {\n            var _a;\n            if ((_a = _this._containerRef) === null || _a === void 0 ? void 0 : _a.current) {\n                _this._updateInitialZoomFactor();\n                _this._setupOffsets();\n                _this._update();\n            }\n        };\n        _this._handlerOnTouchEnd = _this._handlerIfEnable(function (touchEndEvent) {\n            _this._fingers = touchEndEvent.touches.length;\n            if (_this.props.shouldCancelHandledTouchEndEvents &&\n                (isZoomInteraction(_this._interaction) ||\n                    (isDragInteraction(_this._interaction) &&\n                        (_this._startOffset.x !== _this._offset.x ||\n                            _this._startOffset.y !== _this._offset.y)))) {\n                cancelEvent(touchEndEvent);\n            }\n            if (isDragInteraction(_this._interaction) && !_this._enoughToDrag()) {\n                _this._handleClick(touchEndEvent);\n            }\n            _this._updateInteraction(touchEndEvent);\n        });\n        _this._handlerOnTouchStart = _this._handlerIfEnable(function (touchStartEvent) {\n            _this._firstMove = true;\n            _this._fingers = touchStartEvent.touches.length;\n            _this._detectDoubleTap(touchStartEvent);\n        });\n        _this._handlerOnTouchMove = _this._handlerIfEnable(function (touchMoveEvent) {\n            if (_this._isDoubleTap) {\n                return;\n            }\n            _this._collectInertia(touchMoveEvent);\n            if (_this._firstMove) {\n                _this._updateInteraction(touchMoveEvent);\n                if (_this._interaction) {\n                    cancelEvent(touchMoveEvent);\n                }\n                _this._startOffset = __assign({}, _this._offset);\n                _this._startTouches = getPageCoordinatesByTouches(touchMoveEvent.touches);\n            }\n            else {\n                if (isZoomInteraction(_this._interaction)) {\n                    if (_this._startTouches &&\n                        _this._startTouches.length === 2 &&\n                        touchMoveEvent.touches.length === 2) {\n                        _this._handleZoom(touchMoveEvent, calculateScale(_this._startTouches, getPageCoordinatesByTouches(touchMoveEvent.touches)));\n                    }\n                }\n                else if (isDragInteraction(_this._interaction)) {\n                    _this._handleDrag(touchMoveEvent);\n                }\n                if (_this._interaction) {\n                    cancelEvent(touchMoveEvent);\n                    _this._update();\n                }\n            }\n            _this._firstMove = false;\n        });\n        _this._handlerWheel = function (wheelEvent) {\n            if (_this.props.shouldInterceptWheel(wheelEvent)) {\n                return;\n            }\n            cancelEvent(wheelEvent);\n            var pageX = wheelEvent.pageX, pageY = wheelEvent.pageY, deltaY = wheelEvent.deltaY, deltaMode = wheelEvent.deltaMode;\n            var scaleDelta = 1;\n            if (isZoomGesture(wheelEvent) || deltaMode === 1) {\n                scaleDelta = 15;\n            }\n            var likeTouchEvent = {\n                touches: [\n                    // @ts-ignore\n                    { pageX: pageX, pageY: pageY },\n                ],\n            };\n            var center = _this._getOffsetByFirstTouch(likeTouchEvent);\n            var dScale = deltaY * scaleDelta;\n            _this._stopAnimation();\n            _this._scaleTo(_this._zoomFactor - dScale / _this.props.wheelScaleFactor, center);\n            _this._update();\n            clearTimeout(\n            // @ts-ignore\n            _this._wheelTimeOut);\n            _this._wheelTimeOut = setTimeout(function () { return _this._sanitize(); }, 100);\n        };\n        // @ts-ignore\n        _this._handlers = _this.props.isTouch()\n            ? [\n                ['touchstart', _this._handlerOnTouchStart],\n                ['touchend', _this._handlerOnTouchEnd],\n                ['touchmove', _this._handlerOnTouchMove],\n            ]\n            : [\n                [\n                    'mousemove',\n                    _this.simulate(_this._handlerOnTouchMove),\n                    _this.props._document,\n                ],\n                [\n                    'mouseup',\n                    _this.simulate(_this._handlerOnTouchEnd),\n                    _this.props._document,\n                ],\n                ['mousedown', _this.simulate(_this._handlerOnTouchStart)],\n                ['click', _this._handleClick],\n                ['wheel', _this._handlerWheel],\n            ];\n        return _this;\n    }\n    PinchZoom.prototype._handleDragStart = function (event) {\n        this._ignoreNextClick = true;\n        this.props.onDragStart();\n        this._stopAnimation();\n        this._resetInertia();\n        this._lastDragPosition = null;\n        this._hasInteraction = true;\n        this._draggingPoint = this._offset;\n        this._handleDrag(event);\n    };\n    PinchZoom.prototype._handleDrag = function (event) {\n        var touch = this._getOffsetByFirstTouch(event);\n        if (this._enoughToDrag()) {\n            this._drag(touch, this._lastDragPosition);\n        }\n        else {\n            this._virtualDrag(touch, this._lastDragPosition);\n        }\n        this._offset = this._sanitizeOffset(this._offset);\n        this._lastDragPosition = touch;\n    };\n    PinchZoom.prototype._resetInertia = function () {\n        this._velocity = null;\n        this._prevDragMovePoint = null;\n    };\n    PinchZoom.prototype._realizeInertia = function () {\n        var _this = this;\n        var _a = this.props, inertiaFriction = _a.inertiaFriction, inertia = _a.inertia;\n        if (!inertia || !this._velocity) {\n            return;\n        }\n        var _b = this._velocity, x = _b.x, y = _b.y;\n        if (x || y) {\n            this._stopAnimation();\n            this._resetInertia();\n            var renderFrame = function () {\n                x *= inertiaFriction;\n                y *= inertiaFriction;\n                if (!x && !y) {\n                    return _this._stopAnimation();\n                }\n                var prevOffset = __assign({}, _this._offset);\n                _this._addOffset({ x: x, y: y });\n                _this._offset = _this._sanitizeOffset(_this._offset);\n                if (comparePoints(prevOffset, _this._offset)) {\n                    return _this._stopAnimation();\n                }\n                _this._update({ isAnimation: true });\n            };\n            this._animate(renderFrame, { duration: 9999 });\n        }\n    };\n    PinchZoom.prototype._collectInertia = function (_a) {\n        var touches = _a.touches;\n        if (!this.props.inertia) {\n            return;\n        }\n        var currentCoordinates = getPageCoordinatesByTouches(touches)[0];\n        var prevPoint = this._prevDragMovePoint;\n        if (prevPoint) {\n            this._velocity = calculateVelocity(currentCoordinates, prevPoint);\n        }\n        this._prevDragMovePoint = currentCoordinates;\n    };\n    PinchZoom.prototype._handleDragEnd = function () {\n        this.props.onDragEnd();\n        this._end();\n        this._realizeInertia();\n    };\n    PinchZoom.prototype._handleZoomStart = function () {\n        this.props.onZoomStart();\n        this._stopAnimation();\n        this._lastScale = 1;\n        this._nthZoom = 0;\n        this._lastZoomCenter = null;\n        this._hasInteraction = true;\n    };\n    PinchZoom.prototype._handleZoom = function (event, newScale) {\n        var touchCenter = getVectorAvg(this._getOffsetTouches(event));\n        var scale = newScale / this._lastScale;\n        this._lastScale = newScale;\n        // The first touch events are thrown away since they are not precise\n        this._nthZoom += 1;\n        if (this._nthZoom > 3) {\n            this._scale(scale, touchCenter);\n            this._drag(touchCenter, this._lastZoomCenter);\n            if (this.props.enforceBoundsDuringZoom) {\n                this._offset = this._sanitizeOffset(this._offset);\n            }\n        }\n        this._lastZoomCenter = touchCenter;\n    };\n    PinchZoom.prototype._handleZoomEnd = function () {\n        this.props.onZoomEnd();\n        this._end();\n    };\n    PinchZoom.prototype._handleDoubleTap = function (event) {\n        var _this = this;\n        if (this._hasInteraction || this.props.tapZoomFactor === 0) {\n            return;\n        }\n        var needZoomOut = (this.props.doubleTapZoomOutOnMaxScale &&\n            this._zoomFactor === this.props.maxZoom) ||\n            (this.props.doubleTapToggleZoom && this._zoomFactor > 1);\n        this.props.onDoubleTap();\n        this._ignoreNextClick = true;\n        var zoomFactor = this._zoomFactor + this.props.tapZoomFactor;\n        var startZoomFactor = this._zoomFactor;\n        var updateProgress = function (progress) {\n            _this._scaleTo(startZoomFactor + progress * (zoomFactor - startZoomFactor), center);\n        };\n        var center = this._getOffsetByFirstTouch(event);\n        this._isDoubleTap = true;\n        if (startZoomFactor > zoomFactor) {\n            center = this._getCurrentZoomCenter();\n        }\n        needZoomOut ? this._zoomOutAnimation() : this._animate(updateProgress);\n    };\n    PinchZoom.prototype._computeInitialOffset = function () {\n        var rect = this._getContainerRect();\n        var _a = this._getChildSize(), width = _a.width, height = _a.height;\n        var x = -abs(width * this._getInitialZoomFactor() - rect.width) / 2;\n        var y = -abs(height * this._getInitialZoomFactor() - rect.height) / 2;\n        this._initialOffset = { x: x, y: y };\n    };\n    PinchZoom.prototype._resetOffset = function () {\n        this._offset = __assign({}, this._initialOffset);\n    };\n    PinchZoom.prototype._setupOffsets = function () {\n        if (this.props.setOffsetsOnce && this._isOffsetsSet) {\n            return;\n        }\n        this._isOffsetsSet = true;\n        this._computeInitialOffset();\n        this._resetOffset();\n    };\n    PinchZoom.prototype._sanitizeOffset = function (offset) {\n        var rect = this._getContainerRect();\n        var _a = this._getChildSize(), width = _a.width, height = _a.height;\n        var elWidth = width * this._getInitialZoomFactor() * this._zoomFactor;\n        var elHeight = height * this._getInitialZoomFactor() * this._zoomFactor;\n        var _b = getOffsetBounds({\n            containerDimension: rect.width,\n            childDimension: elWidth,\n            padding: this.props.horizontalPadding,\n            centerContained: this.props.centerContained,\n        }), minOffsetX = _b[0], maxOffsetX = _b[1];\n        var _c = getOffsetBounds({\n            containerDimension: rect.height,\n            childDimension: elHeight,\n            padding: this.props.verticalPadding,\n            centerContained: this.props.centerContained,\n        }), minOffsetY = _c[0], maxOffsetY = _c[1];\n        return {\n            x: clamp(minOffsetX, maxOffsetX, offset.x),\n            y: clamp(minOffsetY, maxOffsetY, offset.y),\n        };\n    };\n    PinchZoom.prototype.alignCenter = function (options) {\n        var _this = this;\n        var _a = __assign({ duration: 250, animated: true }, options), __x = _a.x, __y = _a.y, scale = _a.scale, animated = _a.animated, duration = _a.duration;\n        // Bug-Fix: https://github.com/retyui/react-quick-pinch-zoom/issues/58\n        var x = __x * this._initialZoomFactor;\n        var y = __y * this._initialZoomFactor;\n        var startZoomFactor = this._zoomFactor;\n        var startOffset = __assign({}, this._offset);\n        var rect = this._getContainerRect();\n        var containerCenter = { x: rect.width / 2, y: rect.height / 2 };\n        this._zoomFactor = 1;\n        this._offset = { x: -(containerCenter.x - x), y: -(containerCenter.y - y) };\n        this._scaleTo(scale, containerCenter);\n        this._stopAnimation();\n        if (!animated) {\n            return this._update();\n        }\n        var diffZoomFactor = this._zoomFactor - startZoomFactor;\n        var diffOffset = {\n            x: this._offset.x - startOffset.x,\n            y: this._offset.y - startOffset.y,\n        };\n        this._zoomFactor = startZoomFactor;\n        this._offset = __assign({}, startOffset);\n        var updateFrame = function (progress) {\n            var x = startOffset.x + diffOffset.x * progress;\n            var y = startOffset.y + diffOffset.y * progress;\n            _this._zoomFactor = startZoomFactor + diffZoomFactor * progress;\n            _this._offset = _this._sanitizeOffset({ x: x, y: y });\n            _this._update();\n        };\n        this._animate(updateFrame, {\n            callback: function () { return _this._sanitize(); },\n            duration: duration,\n        });\n    };\n    PinchZoom.prototype.scaleTo = function (options) {\n        var _this = this;\n        var _a = __assign({ duration: 250, animated: true }, options), x = _a.x, y = _a.y, scale = _a.scale, animated = _a.animated, duration = _a.duration;\n        var startZoomFactor = this._zoomFactor;\n        var startOffset = __assign({}, this._offset);\n        this._zoomFactor = 1;\n        this._offset = { x: 0, y: 0 };\n        this._scaleTo(scale, { x: x, y: y });\n        this._stopAnimation();\n        if (!animated) {\n            return this._update();\n        }\n        var diffZoomFactor = this._zoomFactor - startZoomFactor;\n        var diffOffset = {\n            x: this._offset.x - startOffset.x,\n            y: this._offset.y - startOffset.y,\n        };\n        this._zoomFactor = startZoomFactor;\n        this._offset = __assign({}, startOffset);\n        var updateFrame = function (progress) {\n            var x = startOffset.x + diffOffset.x * progress;\n            var y = startOffset.y + diffOffset.y * progress;\n            _this._zoomFactor = startZoomFactor + diffZoomFactor * progress;\n            _this._offset = { x: x, y: y };\n            _this._update();\n        };\n        this._animate(updateFrame, { callback: function () { return _this._sanitize(); }, duration: duration });\n    };\n    PinchZoom.prototype._scaleTo = function (zoomFactor, center) {\n        this._scale(zoomFactor / this._zoomFactor, center);\n        this._offset = this._sanitizeOffset(this._offset);\n    };\n    PinchZoom.prototype._scale = function (scale, center) {\n        scale = this._scaleZoomFactor(scale);\n        this._addOffset({\n            x: (scale - 1) * (center.x + this._offset.x),\n            y: (scale - 1) * (center.y + this._offset.y),\n        });\n        this.props.onZoomUpdate();\n    };\n    PinchZoom.prototype._scaleZoomFactor = function (scale) {\n        var originalZoomFactor = this._zoomFactor;\n        this._zoomFactor *= scale;\n        this._zoomFactor = clamp(this.props.minZoom, this.props.maxZoom, this._zoomFactor);\n        return this._zoomFactor / originalZoomFactor;\n    };\n    PinchZoom.prototype._canDrag = function () {\n        return this.props.draggableUnZoomed || !isCloseTo(this._zoomFactor, 1);\n    };\n    PinchZoom.prototype._drag = function (center, lastCenter) {\n        if (lastCenter) {\n            var y = -(center.y - lastCenter.y);\n            var x = -(center.x - lastCenter.x);\n            if (!this.props.lockDragAxis) {\n                this._addOffset({\n                    x: x,\n                    y: y,\n                });\n            }\n            else {\n                // lock scroll to position that was changed the most\n                if (abs(x) > abs(y)) {\n                    this._addOffset({\n                        x: x,\n                        y: 0,\n                    });\n                }\n                else {\n                    this._addOffset({\n                        y: y,\n                        x: 0,\n                    });\n                }\n            }\n            this.props.onDragUpdate();\n        }\n    };\n    PinchZoom.prototype._virtualDrag = function (center, lastCenter) {\n        if (lastCenter) {\n            var y = -(center.y - lastCenter.y);\n            var x = -(center.x - lastCenter.x);\n            this._draggingPoint = {\n                x: x + this._draggingPoint.x,\n                y: y + this._draggingPoint.y,\n            };\n        }\n    };\n    PinchZoom.prototype._addOffset = function (offset) {\n        var _a = this._offset, x = _a.x, y = _a.y;\n        this._offset = {\n            x: x + offset.x,\n            y: y + offset.y,\n        };\n    };\n    PinchZoom.prototype._sanitize = function () {\n        if (this._zoomFactor < this.props.zoomOutFactor) {\n            this._resetInertia();\n            this._zoomOutAnimation();\n        }\n        else if (this._isInsaneOffset()) {\n            this._sanitizeOffsetAnimation();\n        }\n    };\n    PinchZoom.prototype._isInsaneOffset = function () {\n        var offset = this._offset;\n        var sanitizedOffset = this._sanitizeOffset(offset);\n        return sanitizedOffset.x !== offset.x || sanitizedOffset.y !== offset.y;\n    };\n    PinchZoom.prototype._sanitizeOffsetAnimation = function () {\n        var _this = this;\n        var targetOffset = this._sanitizeOffset(this._offset);\n        var startOffset = __assign({}, this._offset);\n        var updateProgress = function (progress) {\n            var x = startOffset.x + progress * (targetOffset.x - startOffset.x);\n            var y = startOffset.y + progress * (targetOffset.y - startOffset.y);\n            _this._offset = { x: x, y: y };\n            _this._update();\n        };\n        this._animate(updateProgress);\n    };\n    PinchZoom.prototype._zoomOutAnimation = function () {\n        var _this = this;\n        if (this._zoomFactor === 1) {\n            return;\n        }\n        var startZoomFactor = this._zoomFactor;\n        var zoomFactor = 1;\n        var center = this._getCurrentZoomCenter();\n        var updateProgress = function (progress) {\n            var scaleFactor = startZoomFactor + progress * (zoomFactor - startZoomFactor);\n            _this._scaleTo(scaleFactor, center);\n        };\n        this._animate(updateProgress);\n    };\n    PinchZoom.prototype._getInitialZoomFactor = function () {\n        return this._initialZoomFactor;\n    };\n    PinchZoom.prototype._getCurrentZoomCenter = function () {\n        var _a = this._offset, x = _a.x, y = _a.y;\n        var offsetLeft = x - this._initialOffset.x;\n        var offsetTop = y - this._initialOffset.y;\n        return {\n            x: -1 * x - offsetLeft / (1 / this._zoomFactor - 1),\n            y: -1 * y - offsetTop / (1 / this._zoomFactor - 1),\n        };\n    };\n    PinchZoom.prototype._getOffsetByFirstTouch = function (event) {\n        return this._getOffsetTouches(event)[0];\n    };\n    PinchZoom.prototype._getOffsetTouches = function (event) {\n        var _document = this.props._document;\n        var _html = _document.documentElement;\n        var _body = _document.body;\n        var _a = this._getContainerRect(), top = _a.top, left = _a.left;\n        var scrollTop = _html.scrollTop || _body.scrollTop;\n        var scrollLeft = _html.scrollLeft || _body.scrollLeft;\n        var posTop = top + scrollTop;\n        var posLeft = left + scrollLeft;\n        return getPageCoordinatesByTouches(event.touches).map(function (_a) {\n            var x = _a.x, y = _a.y;\n            return ({\n                x: x - posLeft,\n                y: y - posTop,\n            });\n        });\n    };\n    PinchZoom.prototype._animate = function (frameFn, options) {\n        var _this = this;\n        var startTime = new Date().getTime();\n        var _a = __assign({ timeFn: swing, callback: function () { }, duration: this.props.animationDuration }, options), timeFn = _a.timeFn, callback = _a.callback, duration = _a.duration;\n        var renderFrame = function () {\n            if (!_this._inAnimation) {\n                return;\n            }\n            var frameTime = new Date().getTime() - startTime;\n            var progress = frameTime / duration;\n            if (frameTime >= duration) {\n                frameFn(1);\n                _this._stopAnimation();\n                callback();\n                _this._update();\n            }\n            else {\n                progress = timeFn(progress);\n                frameFn(progress);\n                _this._update({ isAnimation: true });\n                requestAnimationFrame(renderFrame);\n            }\n        };\n        this._inAnimation = true;\n        requestAnimationFrame(renderFrame);\n    };\n    PinchZoom.prototype._stopAnimation = function () {\n        this._inAnimation = false;\n    };\n    PinchZoom.prototype._end = function () {\n        this._hasInteraction = false;\n        this._sanitize();\n        this._update();\n    };\n    PinchZoom.prototype._getContainerRect = function () {\n        var div = this._containerRef.current;\n        return div.getBoundingClientRect();\n    };\n    PinchZoom.prototype._getChildSize = function () {\n        var div = this._containerRef.current;\n        return getElementSize(div === null || div === void 0 ? void 0 : div.firstElementChild);\n    };\n    PinchZoom.prototype._updateInitialZoomFactor = function () {\n        var rect = this._getContainerRect();\n        var size = this._getChildSize();\n        var xZoomFactor = rect.width / size.width;\n        var yZoomFactor = rect.height / size.height;\n        this._initialZoomFactor = min(xZoomFactor, yZoomFactor);\n    };\n    PinchZoom.prototype._bindEvents = function () {\n        var _this = this;\n        var div = this._containerRef.current;\n        if (window.ResizeObserver) {\n            this._containerObserver = new ResizeObserver(this._onResize);\n            this._containerObserver.observe(div);\n        }\n        else {\n            window.addEventListener('resize', this._onResize);\n        }\n        this._handlers.forEach(function (_a) {\n            var eventName = _a[0], fn = _a[1], target = _a[2];\n            (target || div).addEventListener(eventName, fn, true);\n        });\n        Array.from(div.querySelectorAll('img')).forEach(function (img) {\n            return img.addEventListener('load', _this._onResize);\n        });\n    };\n    PinchZoom.prototype._unSubscribe = function () {\n        var _this = this;\n        var div = this._containerRef.current;\n        if (this._containerObserver) {\n            this._containerObserver.disconnect();\n            this._containerObserver = null;\n        }\n        window.removeEventListener('resize', this._onResize);\n        this._handlers.forEach(function (_a) {\n            var eventName = _a[0], fn = _a[1], target = _a[2];\n            (target || div).removeEventListener(eventName, fn, true);\n        });\n        Array.from(div.querySelectorAll('img')).forEach(function (img) {\n            return img.removeEventListener('load', _this._onResize);\n        });\n    };\n    PinchZoom.prototype._update = function (options) {\n        var _this = this;\n        if (this._updatePlaned) {\n            return;\n        }\n        var updateFrame = function () {\n            var scale = _this._getInitialZoomFactor() * _this._zoomFactor;\n            var x = -_this._offset.x / scale;\n            var y = -_this._offset.y / scale;\n            _this.props.onUpdate({ scale: scale, x: x, y: y });\n        };\n        if (options === null || options === void 0 ? void 0 : options.isAnimation) {\n            return updateFrame();\n        }\n        this._updatePlaned = true;\n        requestAnimationFrame(function () {\n            _this._updatePlaned = false;\n            updateFrame();\n        });\n    };\n    PinchZoom.prototype._handlerIfEnable = function (fn) {\n        var _this = this;\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            if (_this.props.enabled) {\n                fn.apply(void 0, args);\n            }\n        };\n    };\n    PinchZoom.prototype._setInteraction = function (newInteraction, event) {\n        var interaction = this._interaction;\n        if (interaction !== newInteraction) {\n            if (interaction && !newInteraction) {\n                if (isZoomInteraction(interaction)) {\n                    this._handleZoomEnd();\n                }\n                else if (isDragInteraction(interaction)) {\n                    this._handleDragEnd();\n                }\n            }\n            if (isZoomInteraction(newInteraction)) {\n                this._handleZoomStart();\n            }\n            else if (isDragInteraction(newInteraction)) {\n                this._handleDragStart(event);\n            }\n        }\n        this._interaction = newInteraction;\n    };\n    PinchZoom.prototype._distanceBetweenNumbers = function (a, b) {\n        return a > b ? a - b : b - a;\n    };\n    PinchZoom.prototype._enoughToDrag = function () {\n        if (this._distanceBetweenNumbers(this._startOffset.x, this._draggingPoint.x) >\n            5 ||\n            this._distanceBetweenNumbers(this._startOffset.y, this._draggingPoint.y) >\n                5)\n            return true;\n        return false;\n    };\n    PinchZoom.prototype._updateInteraction = function (event) {\n        var fingers = this._fingers;\n        if (fingers === 2) {\n            return this._setInteraction('zoom', event);\n        }\n        if (fingers === 1 && this._canDrag()) {\n            return this._setInteraction('drag', event);\n        }\n        this._setInteraction(null, event);\n    };\n    PinchZoom.prototype._detectDoubleTap = function (event) {\n        var time = new Date().getTime();\n        if (this._fingers > 1) {\n            this._lastTouchStart = 0;\n        }\n        if (time - this._lastTouchStart < 300) {\n            cancelEvent(event);\n            this._handleDoubleTap(event);\n            if (isZoomInteraction(this._interaction)) {\n                this._handleZoomEnd();\n            }\n            else if (isDragInteraction(this._interaction)) {\n                this._handleDragEnd();\n            }\n        }\n        else {\n            this._isDoubleTap = false;\n        }\n        if (this._fingers === 1) {\n            this._lastTouchStart = time;\n        }\n    };\n    PinchZoom.prototype.simulate = function (fn) {\n        var _this = this;\n        return function (mouseEvent) {\n            var pageX = mouseEvent.pageX, pageY = mouseEvent.pageY, type = mouseEvent.type;\n            var isEnd = type === 'mouseup';\n            var isStart = type === 'mousedown';\n            if (isStart) {\n                mouseEvent.preventDefault();\n                _this._listenMouseMove = true;\n            }\n            if (_this._listenMouseMove) {\n                // @ts-ignore\n                mouseEvent.touches = isEnd ? [] : [{ pageX: pageX, pageY: pageY }];\n                fn(\n                // @ts-ignore\n                mouseEvent);\n            }\n            if (isEnd) {\n                _this._listenMouseMove = false;\n            }\n        };\n    };\n    PinchZoom.prototype.componentDidMount = function () {\n        this._bindEvents();\n        this._update();\n    };\n    PinchZoom.prototype.componentWillUnmount = function () {\n        this._stopAnimation();\n        this._unSubscribe();\n    };\n    PinchZoom.prototype.render = function () {\n        var _a = this.props, children = _a.children, containerProps = _a.containerProps;\n        var child = Children.only(children);\n        var props = containerProps || {};\n        return (React.createElement(React.Fragment, null,\n            React.createElement(\"style\", null, styles),\n            React.createElement(\"div\", __assign({}, props, { ref: this._containerRef, className: classnames(styleRoot, props.className) }), cloneElement(child, {\n                className: classnames(styleChild, child.props.className),\n            }))));\n    };\n    PinchZoom.defaultProps = {\n        animationDuration: 250,\n        draggableUnZoomed: true,\n        enforceBoundsDuringZoom: false,\n        centerContained: false,\n        enabled: true,\n        inertia: true,\n        inertiaFriction: 0.96,\n        horizontalPadding: 0,\n        isTouch: isTouch,\n        lockDragAxis: false,\n        maxZoom: 5,\n        minZoom: 0.5,\n        onDoubleTap: noup,\n        onDragEnd: noup,\n        onDragStart: noup,\n        onDragUpdate: noup,\n        onZoomEnd: noup,\n        onZoomStart: noup,\n        onZoomUpdate: noup,\n        setOffsetsOnce: false,\n        shouldInterceptWheel: shouldInterceptWheel,\n        shouldCancelHandledTouchEndEvents: false,\n        tapZoomFactor: 1,\n        verticalPadding: 0,\n        wheelScaleFactor: 1500,\n        zoomOutFactor: 1.3,\n        doubleTapZoomOutOnMaxScale: false,\n        doubleTapToggleZoom: false,\n        // @ts-expect-error\n        _document: isSsr ? null : window.document,\n    };\n    return PinchZoom;\n}(Component));\nif (process.env.NODE_ENV !== 'production') {\n    var _a = require('prop-types'), any = _a.any, element = _a.element, object = _a.object, number = _a.number, func = _a.func, bool = _a.bool;\n    // @ts-ignore\n    PinchZoom.propTypes = {\n        children: element,\n        containerProps: object,\n        wheelScaleFactor: number,\n        animationDuration: number,\n        draggableUnZoomed: bool,\n        enforceBoundsDuringZoom: bool,\n        centerContained: bool,\n        enabled: bool,\n        horizontalPadding: number,\n        lockDragAxis: bool,\n        onUpdate: func.isRequired,\n        maxZoom: number,\n        minZoom: number,\n        onDoubleTap: func,\n        onDragEnd: func,\n        onDragStart: func,\n        onDragUpdate: func,\n        onZoomEnd: func,\n        onZoomStart: func,\n        onZoomUpdate: func,\n        setOffsetsOnce: bool,\n        tapZoomFactor: number,\n        verticalPadding: number,\n        zoomOutFactor: number,\n        doubleTapZoomOutOnMaxScale: bool,\n        doubleTapToggleZoom: bool,\n        isTouch: func,\n        _document: any,\n    };\n}\nexport default PinchZoom;\n","export default function formatDuration(time) {\n  if (!time) return;\n  let hours = Math.floor(time / 3600);\n  let minutes = Math.floor((time % 3600) / 60);\n  let seconds = Math.round(time % 60);\n\n  if (hours === 0) {\n    return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n  } else {\n    return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds\n      .toString()\n      .padStart(2, '0')}`;\n  }\n}\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n  useCallback,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'preact/hooks';\nimport QuickPinchZoom, { make3dTransformValue } from 'react-quick-pinch-zoom';\n\nimport formatDuration from '../utils/format-duration';\nimport mem from '../utils/mem';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Link from './link';\n\nconst isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755\n\n/*\nMedia type\n===\nunknown = unsupported or unrecognized file type\nimage = Static image\ngifv = Looping, soundless animation\nvideo = Video clip\naudio = Audio track\n*/\n\nconst dataAltLabel = 'ALT';\nconst AltBadge = (props) => {\n  const { t } = useLingui();\n  const { alt, lang, index, ...rest } = props;\n  if (!alt || !alt.trim()) return null;\n  return (\n    <button\n      type=\"button\"\n      class=\"alt-badge clickable\"\n      {...rest}\n      onClick={(e) => {\n        e.stopPropagation();\n        e.preventDefault();\n        states.showMediaAlt = {\n          alt,\n          lang,\n        };\n      }}\n      title={t`Media description`}\n    >\n      {dataAltLabel}\n      {!!index && <sup>{index}</sup>}\n    </button>\n  );\n};\n\nconst MEDIA_CAPTION_LIMIT = 140;\nconst MEDIA_CAPTION_LIMIT_LONGER = 280;\nexport const isMediaCaptionLong = mem((caption) =>\n  caption?.length\n    ? caption.length > MEDIA_CAPTION_LIMIT ||\n      /[\\n\\r].*[\\n\\r]/.test(caption.trim())\n    : false,\n);\n\nfunction Media({\n  class: className = '',\n  media,\n  to,\n  lang,\n  showOriginal,\n  autoAnimate,\n  showCaption,\n  allowLongerCaption,\n  altIndex,\n  checkAspectRatio = true,\n  onClick = () => {},\n}) {\n  let {\n    blurhash,\n    description,\n    meta,\n    previewRemoteUrl,\n    previewUrl,\n    remoteUrl,\n    url,\n    type,\n  } = media;\n  if (/no\\-preview\\./i.test(previewUrl)) {\n    previewUrl = null;\n  }\n  const { original = {}, small, focus } = meta || {};\n\n  const width = showOriginal\n    ? original?.width\n    : small?.width || original?.width;\n  const height = showOriginal\n    ? original?.height\n    : small?.height || original?.height;\n  const mediaURL = showOriginal ? url : previewUrl || url;\n  const remoteMediaURL = showOriginal\n    ? remoteUrl\n    : previewRemoteUrl || remoteUrl;\n  const hasDimensions = width && height;\n  const orientation = hasDimensions\n    ? width > height\n      ? 'landscape'\n      : 'portrait'\n    : null;\n\n  const rgbAverageColor = blurhash ? getBlurHashAverageColor(blurhash) : null;\n\n  const videoRef = useRef();\n\n  let focalPosition;\n  if (focus) {\n    // Convert focal point to CSS background position\n    // Formula from jquery-focuspoint\n    // x = -1, y = 1 => 0% 0%\n    // x = 0, y = 0 => 50% 50%\n    // x = 1, y = -1 => 100% 100%\n    const x = ((focus.x + 1) / 2) * 100;\n    const y = ((1 - focus.y) / 2) * 100;\n    focalPosition = `${x.toFixed(0)}% ${y.toFixed(0)}%`;\n  }\n\n  const mediaRef = useRef();\n  const onUpdate = useCallback(({ x, y, scale }) => {\n    const { current: media } = mediaRef;\n\n    if (media) {\n      const value = make3dTransformValue({ x, y, scale });\n\n      if (scale === 1) {\n        media.style.removeProperty('transform');\n      } else {\n        media.style.setProperty('transform', value);\n      }\n\n      media.closest('.media-zoom').style.touchAction =\n        scale <= 1.01 ? 'pan-x' : '';\n    }\n  }, []);\n\n  const [pinchZoomEnabled, setPinchZoomEnabled] = useState(false);\n  const quickPinchZoomProps = {\n    enabled: pinchZoomEnabled,\n    draggableUnZoomed: false,\n    inertiaFriction: 0.9,\n    tapZoomFactor: 2,\n    doubleTapToggleZoom: true,\n    containerProps: {\n      className: 'media-zoom',\n      style: {\n        overflow: 'visible',\n        //   width: 'inherit',\n        //   height: 'inherit',\n        //   justifyContent: 'inherit',\n        //   alignItems: 'inherit',\n        //   display: 'inherit',\n      },\n    },\n    onUpdate,\n  };\n\n  const [mediaLoadError, setMediaLoadError] = useState(false);\n\n  const Parent = useMemo(\n    () =>\n      to && !mediaLoadError ? (props) => <Link to={to} {...props} /> : 'div',\n    [to, mediaLoadError],\n  );\n\n  const remoteMediaURLObj = remoteMediaURL ? getURLObj(remoteMediaURL) : null;\n  const isVideoMaybe =\n    type === 'unknown' &&\n    remoteMediaURLObj &&\n    /\\.(mp4|m4r|m4v|mov|webm)$/i.test(remoteMediaURLObj.pathname);\n  const isAudioMaybe =\n    type === 'unknown' &&\n    remoteMediaURLObj &&\n    /\\.(mp3|ogg|wav|m4a|m4p|m4b)$/i.test(remoteMediaURLObj.pathname);\n  const isImage =\n    type === 'image' ||\n    (type === 'unknown' && previewUrl && !isVideoMaybe && !isAudioMaybe);\n\n  const parentRef = useRef();\n  const [imageSmallerThanParent, setImageSmallerThanParent] = useState(false);\n  useLayoutEffect(() => {\n    if (!isImage) return;\n    if (!showOriginal) return;\n    if (!parentRef.current) return;\n    const { offsetWidth, offsetHeight } = parentRef.current;\n    const smaller = width < offsetWidth && height < offsetHeight;\n    if (smaller) setImageSmallerThanParent(smaller);\n  }, [width, height]);\n\n  const maxAspectHeight =\n    window.innerHeight * (orientation === 'portrait' ? 0.45 : 0.33);\n  const maxHeight = orientation === 'portrait' ? 0 : 160;\n  const averageColorStyle = {\n    '--average-color': rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n  };\n  const mediaStyles =\n    width && height\n      ? {\n          '--width': `${width}px`,\n          '--height': `${height}px`,\n          // Calculate '--aspectWidth' based on aspect ratio calculated from '--width' and '--height', max height has to be 160px\n          '--aspectWidth': `${\n            (width / height) * Math.max(maxHeight, maxAspectHeight)\n          }px`,\n          aspectRatio: `${width} / ${height}`,\n          ...averageColorStyle,\n        }\n      : {\n          ...averageColorStyle,\n        };\n\n  const longDesc = isMediaCaptionLong(description);\n  let showInlineDesc =\n    !!showCaption && !showOriginal && !!description && !longDesc;\n  if (\n    allowLongerCaption &&\n    !showInlineDesc &&\n    description?.length <= MEDIA_CAPTION_LIMIT_LONGER\n  ) {\n    showInlineDesc = true;\n  }\n  const Figure = !showInlineDesc\n    ? Fragment\n    : (props) => {\n        const { children, ...restProps } = props;\n        return (\n          <figure {...restProps}>\n            {children}\n            <figcaption\n              class=\"media-caption\"\n              lang={lang}\n              dir=\"auto\"\n              onClick={(e) => {\n                e.preventDefault();\n                e.stopPropagation();\n                states.showMediaAlt = {\n                  alt: description,\n                  lang,\n                };\n              }}\n            >\n              {description}\n            </figcaption>\n          </figure>\n        );\n      };\n\n  const [hasNaturalAspectRatio, setHasNaturalAspectRatio] = useState(undefined);\n\n  if (isImage) {\n    // Note: type: unknown might not have width/height\n    quickPinchZoomProps.containerProps.style.display = 'inherit';\n\n    useLayoutEffect(() => {\n      if (!isSafari) return;\n      if (!showOriginal) return;\n      (async () => {\n        try {\n          await fetch(mediaURL, { mode: 'no-cors' });\n          mediaRef.current.src = mediaURL;\n        } catch (e) {\n          // Ignore\n        }\n      })();\n    }, [mediaURL]);\n\n    return (\n      <Figure>\n        <Parent\n          ref={parentRef}\n          class={`media media-image ${className}`}\n          onClick={onClick}\n          data-orientation={orientation}\n          data-has-alt={!showInlineDesc || undefined}\n          data-has-natural-aspect-ratio={hasNaturalAspectRatio || undefined}\n          style={\n            showOriginal\n              ? {\n                  backgroundImage: `url(${previewUrl})`,\n                  backgroundSize: imageSmallerThanParent\n                    ? `${width}px ${height}px`\n                    : undefined,\n                  ...averageColorStyle,\n                }\n              : mediaStyles\n          }\n        >\n          {showOriginal ? (\n            <QuickPinchZoom {...quickPinchZoomProps}>\n              <img\n                ref={mediaRef}\n                src={mediaURL}\n                alt={description}\n                width={width}\n                height={height}\n                data-orientation={orientation}\n                loading=\"eager\"\n                decoding=\"sync\"\n                onLoad={(e) => {\n                  e.target.closest('.media-image').style.backgroundImage = '';\n                  e.target.closest('.media-zoom').style.display = '';\n                  setPinchZoomEnabled(true);\n                }}\n                onError={(e) => {\n                  const { src } = e.target;\n                  if (\n                    src === mediaURL &&\n                    remoteMediaURL &&\n                    mediaURL !== remoteMediaURL\n                  ) {\n                    e.target.src = remoteMediaURL;\n                  }\n                }}\n              />\n            </QuickPinchZoom>\n          ) : (\n            <>\n              <img\n                src={mediaURL}\n                alt={showInlineDesc ? '' : description}\n                width={width}\n                height={height}\n                data-orientation={orientation}\n                loading=\"lazy\"\n                style={{\n                  // backgroundColor:\n                  //   rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n                  // backgroundPosition: focalBackgroundPosition || 'center',\n                  // Duration based on width or height in pixels\n                  objectPosition: focalPosition || 'center',\n                  // 100px per second (rough estimate)\n                  // Clamp between 5s and 120s\n                  '--anim-duration': `${Math.min(\n                    Math.max(Math.max(width, height) / 100, 5),\n                    120,\n                  )}s`,\n                }}\n                onLoad={(e) => {\n                  // e.target.closest('.media-image').style.backgroundImage = '';\n                  e.target.dataset.loaded = true;\n                  const $media = e.target.closest('.media');\n                  if (!hasDimensions && $media) {\n                    const { naturalWidth, naturalHeight } = e.target;\n                    $media.dataset.orientation =\n                      naturalWidth > naturalHeight ? 'landscape' : 'portrait';\n                    $media.style.setProperty('--width', `${naturalWidth}px`);\n                    $media.style.setProperty('--height', `${naturalHeight}px`);\n                    $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`;\n                  }\n\n                  // Check natural aspect ratio vs display aspect ratio\n                  if (checkAspectRatio && $media) {\n                    const {\n                      clientWidth,\n                      clientHeight,\n                      naturalWidth,\n                      naturalHeight,\n                    } = e.target;\n                    if (\n                      clientWidth &&\n                      clientHeight &&\n                      naturalWidth &&\n                      naturalHeight\n                    ) {\n                      const minDimension = 88;\n                      if (\n                        naturalWidth < minDimension ||\n                        naturalHeight < minDimension\n                      ) {\n                        $media.dataset.hasSmallDimension = true;\n                      } else {\n                        const displayNaturalHeight =\n                          (naturalHeight * clientWidth) / naturalWidth;\n                        const almostSimilarHeight =\n                          Math.abs(displayNaturalHeight - clientHeight) < 5;\n\n                        if (almostSimilarHeight) {\n                          setHasNaturalAspectRatio(true);\n                        }\n                      }\n                    }\n                  }\n                }}\n                onError={(e) => {\n                  const { src } = e.target;\n                  if (src === mediaURL && mediaURL !== remoteMediaURL) {\n                    e.target.src = remoteMediaURL;\n                  } else {\n                    setMediaLoadError(true);\n                  }\n                }}\n              />\n              {!showInlineDesc && (\n                <AltBadge alt={description} lang={lang} index={altIndex} />\n              )}\n            </>\n          )}\n        </Parent>\n        {mediaLoadError && (\n          <div>\n            <a href={remoteUrl} class=\"button plain6 small\" target=\"_blank\">\n              <Icon icon=\"external\" />{' '}\n              <span>\n                <Trans>Open file</Trans>\n              </span>\n            </a>\n          </div>\n        )}\n      </Figure>\n    );\n  } else if (type === 'gifv' || type === 'video' || isVideoMaybe) {\n    const hasDuration = original.duration > 0;\n    const shortDuration = original.duration < 31;\n    const isGIF = type === 'gifv' && shortDuration;\n    // If GIF is too long, treat it as a video\n    const loopable = original.duration < 61;\n    const formattedDuration = formatDuration(original.duration);\n    const hoverAnimate = !showOriginal && !autoAnimate && isGIF;\n    const autoGIFAnimate = !showOriginal && autoAnimate && isGIF;\n    const showProgress = original.duration > 5;\n\n    // This string is only for autoplay + muted to work on Mobile Safari\n    const gifHTML = `\n      <video\n        src=\"${url}\"\n        poster=\"${previewUrl}\"\n        width=\"${width}\"\n        height=\"${height}\"\n        data-orientation=\"${orientation}\"\n        preload=\"auto\"\n        autoplay\n        muted\n        playsinline\n        ${loopable ? 'loop' : ''}\n        ondblclick=\"this.paused ? this.play() : this.pause()\"\n        ${\n          showProgress\n            ? \"ontimeupdate=\\\"this.closest('.media-gif') && this.closest('.media-gif').style.setProperty('--progress', `${~~((this.currentTime / this.duration) * 100)}%`)\\\"\"\n            : ''\n        }\n      ></video>\n  `;\n\n    const videoHTML = `\n      <video\n        src=\"${url}\"\n        poster=\"${previewUrl}\"\n        width=\"${width}\"\n        height=\"${height}\"\n        data-orientation=\"${orientation}\"\n        preload=\"auto\"\n        autoplay\n        playsinline\n        ${loopable ? 'loop' : ''}\n        controls\n      ></video>\n    `;\n\n    return (\n      <Figure>\n        <Parent\n          class={`media ${className} media-${isGIF ? 'gif' : 'video'} ${\n            autoGIFAnimate ? 'media-contain' : ''\n          } ${hoverAnimate ? 'media-hover-animate' : ''}`}\n          data-orientation={orientation}\n          data-formatted-duration={\n            !showOriginal ? formattedDuration : undefined\n          }\n          data-label={\n            isGIF && !showOriginal && !autoGIFAnimate ? 'GIF' : undefined\n          }\n          data-has-alt={!showInlineDesc || undefined}\n          // style={{\n          //   backgroundColor:\n          //     rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n          // }}\n          style={!showOriginal && mediaStyles}\n          onClick={(e) => {\n            if (hoverAnimate) {\n              try {\n                videoRef.current.pause();\n              } catch (e) {}\n            }\n            onClick(e);\n          }}\n          onMouseEnter={() => {\n            if (hoverAnimate) {\n              try {\n                videoRef.current.play();\n              } catch (e) {}\n            }\n          }}\n          onMouseLeave={() => {\n            if (hoverAnimate) {\n              try {\n                videoRef.current.pause();\n              } catch (e) {}\n            }\n          }}\n          onFocus={() => {\n            if (hoverAnimate) {\n              try {\n                videoRef.current.play();\n              } catch (e) {}\n            }\n          }}\n          onBlur={() => {\n            if (hoverAnimate) {\n              try {\n                videoRef.current.pause();\n              } catch (e) {}\n            }\n          }}\n        >\n          {showOriginal || autoGIFAnimate ? (\n            isGIF && showOriginal ? (\n              <QuickPinchZoom {...quickPinchZoomProps} enabled>\n                <div\n                  ref={mediaRef}\n                  dangerouslySetInnerHTML={{\n                    __html: gifHTML,\n                  }}\n                />\n              </QuickPinchZoom>\n            ) : isGIF ? (\n              <div\n                class=\"video-container\"\n                dangerouslySetInnerHTML={{\n                  __html: gifHTML,\n                }}\n              />\n            ) : (\n              <div\n                class=\"video-container\"\n                dangerouslySetInnerHTML={{ __html: videoHTML }}\n              />\n            )\n          ) : isGIF ? (\n            <video\n              ref={videoRef}\n              src={url}\n              poster={previewUrl}\n              width={width}\n              height={height}\n              data-orientation={orientation}\n              preload=\"auto\"\n              // controls\n              playsinline\n              loop\n              muted\n              onTimeUpdate={\n                showProgress\n                  ? (e) => {\n                      const { target } = e;\n                      const container = target?.closest('.media-gif');\n                      if (container) {\n                        const percentage =\n                          (target.currentTime / target.duration) * 100;\n                        container.style.setProperty(\n                          '--progress',\n                          `${percentage}%`,\n                        );\n                      }\n                    }\n                  : undefined\n              }\n            />\n          ) : (\n            <>\n              {previewUrl ? (\n                <img\n                  src={previewUrl}\n                  alt={showInlineDesc ? '' : description}\n                  width={width}\n                  height={height}\n                  data-orientation={orientation}\n                  loading=\"lazy\"\n                  decoding=\"async\"\n                  onLoad={(e) => {\n                    if (!hasDimensions) {\n                      const $media = e.target.closest('.media');\n                      if ($media) {\n                        const { naturalHeight, naturalWidth } = e.target;\n                        $media.dataset.orientation =\n                          naturalWidth > naturalHeight\n                            ? 'landscape'\n                            : 'portrait';\n                        $media.style.setProperty(\n                          '--width',\n                          `${naturalWidth}px`,\n                        );\n                        $media.style.setProperty(\n                          '--height',\n                          `${naturalHeight}px`,\n                        );\n                        $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`;\n                      }\n                    }\n                  }}\n                />\n              ) : (\n                <video\n                  src={url + '#t=0.1'} // Make Safari show 1st-frame preview\n                  width={width}\n                  height={height}\n                  data-orientation={orientation}\n                  preload=\"metadata\"\n                  muted\n                  disablePictureInPicture\n                  onLoadedMetadata={(e) => {\n                    if (!hasDuration) {\n                      const { duration } = e.target;\n                      if (duration) {\n                        const formattedDuration = formatDuration(duration);\n                        const container = e.target.closest('.media-video');\n                        if (container) {\n                          container.dataset.formattedDuration =\n                            formattedDuration;\n                        }\n                      }\n                    }\n                  }}\n                />\n              )}\n              <div class=\"media-play\">\n                <Icon icon=\"play\" size=\"xl\" alt=\"▶\" />\n              </div>\n            </>\n          )}\n          {!showOriginal && !showInlineDesc && (\n            <AltBadge alt={description} lang={lang} index={altIndex} />\n          )}\n        </Parent>\n      </Figure>\n    );\n  } else if (type === 'audio' || isAudioMaybe) {\n    const formattedDuration = formatDuration(original.duration);\n    return (\n      <Figure>\n        <Parent\n          class={`media media-audio ${className}`}\n          data-formatted-duration={\n            !showOriginal ? formattedDuration : undefined\n          }\n          data-has-alt={!showInlineDesc || undefined}\n          onClick={onClick}\n          style={!showOriginal && mediaStyles}\n        >\n          {showOriginal ? (\n            <audio src={remoteUrl || url} preload=\"none\" controls autoPlay />\n          ) : previewUrl ? (\n            <img\n              src={previewUrl}\n              alt={showInlineDesc ? '' : description}\n              width={width}\n              height={height}\n              data-orientation={orientation}\n              loading=\"lazy\"\n              onError={(e) => {\n                try {\n                  // Remove self if broken\n                  e.target?.remove?.();\n                } catch (e) {}\n              }}\n            />\n          ) : null}\n          {!showOriginal && (\n            <>\n              <div class=\"media-play\">\n                <Icon icon=\"play\" size=\"xl\" alt=\"▶\" />\n              </div>\n              {!showInlineDesc && (\n                <AltBadge alt={description} lang={lang} index={altIndex} />\n              )}\n            </>\n          )}\n        </Parent>\n      </Figure>\n    );\n  }\n}\n\nfunction getURLObj(url) {\n  // Fake base URL if url doesn't have https:// prefix\n  return URL.parse(url, location.origin);\n}\n\nexport default memo(Media, (oldProps, newProps) => {\n  const oldMedia = oldProps.media || {};\n  const newMedia = newProps.media || {};\n\n  return (\n    oldMedia?.id === newMedia?.id &&\n    oldMedia.url === newMedia.url &&\n    oldProps.to === newProps.to &&\n    oldProps.class === newProps.class\n  );\n});\n","import './status.css';\nimport '@justinribeiro/lite-youtube';\n\nimport { msg, plural } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport {\n  ControlledMenu,\n  Menu,\n  MenuDivider,\n  MenuHeader,\n  MenuItem,\n} from '@szhsin/react-menu';\nimport { decodeBlurHash, getBlurHashAverageColor } from 'fast-blurhash';\nimport { shallowEqual } from 'fast-equals';\nimport prettify from 'html-prettify';\nimport pThrottle from 'p-throttle';\nimport { Fragment } from 'preact';\nimport { forwardRef, memo } from 'preact/compat';\nimport {\n  useCallback,\n  useContext,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useHotkeys } from 'react-hotkeys-hook';\n// import { detectAll } from 'tinyld/light';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport CustomEmoji from '../components/custom-emoji';\nimport EmojiText from '../components/emoji-text';\nimport LazyShazam from '../components/lazy-shazam';\nimport Loader from '../components/loader';\nimport MenuConfirm from '../components/menu-confirm';\nimport Menu2 from '../components/menu2';\nimport Modal from '../components/modal';\nimport NameText from '../components/name-text';\nimport Poll from '../components/poll';\nimport { api } from '../utils/api';\nimport { langDetector } from '../utils/browser-translator';\nimport emojifyText from '../utils/emojify-text';\nimport enhanceContent from '../utils/enhance-content';\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport getHTMLText from '../utils/getHTMLText';\nimport handleContentLinks from '../utils/handle-content-links';\nimport htmlContentLength from '../utils/html-content-length';\nimport isRTL from '../utils/is-rtl';\nimport isMastodonLinkMaybe from '../utils/isMastodonLinkMaybe';\nimport localeMatch from '../utils/locale-match';\nimport niceDateTime from '../utils/nice-date-time';\nimport openCompose from '../utils/open-compose';\nimport pmem from '../utils/pmem';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport shortenNumber from '../utils/shorten-number';\nimport showCompose from '../utils/show-compose';\nimport showToast from '../utils/show-toast';\nimport { speak, supportsTTS } from '../utils/speech';\nimport states, { getStatus, saveStatus, statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport store from '../utils/store';\nimport { getCurrentAccountID } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport unfurlMastodonLink from '../utils/unfurl-link';\nimport useTruncated from '../utils/useTruncated';\nimport visibilityIconsMap from '../utils/visibility-icons-map';\n\nimport Avatar from './avatar';\nimport Icon from './icon';\nimport Link from './link';\nimport Media, { isMediaCaptionLong } from './media';\nimport MenuLink from './menu-link';\nimport RelativeTime from './relative-time';\nimport TranslationBlock from './translation-block';\n\nconst SHOW_COMMENT_COUNT_LIMIT = 280;\nconst INLINE_TRANSLATE_LIMIT = 140;\n\nconst throttle = pThrottle({\n  limit: 1,\n  interval: 1000,\n});\nfunction fetchAccount(id, masto) {\n  return masto.v1.accounts.$select(id).fetch();\n}\nconst memFetchAccount = pmem(throttle(fetchAccount));\n\nconst visibilityText = {\n  public: msg`Public`,\n  local: msg`Local`,\n  unlisted: msg`Unlisted`,\n  private: msg`Followers only`,\n  direct: msg`Private mention`,\n};\n\nconst isIOS =\n  window.ontouchstart !== undefined &&\n  /iPad|iPhone|iPod/.test(navigator.userAgent);\n\nconst rtf = new Intl.RelativeTimeFormat();\n\nconst REACTIONS_LIMIT = 80;\n\nfunction getPollText(poll) {\n  if (!poll?.options?.length) return '';\n  return `📊:\\n${poll.options\n    .map(\n      (option) =>\n        `- ${option.title}${\n          option.votesCount >= 0 ? ` (${option.votesCount})` : ''\n        }`,\n    )\n    .join('\\n')}`;\n}\nfunction getPostText(status) {\n  const { spoilerText, content, poll } = status;\n  return (\n    (spoilerText ? `${spoilerText}\\n\\n` : '') +\n    getHTMLText(content) +\n    getPollText(poll)\n  );\n}\n\nfunction forgivingQSA(selectors = [], dom = document) {\n  // Run QSA for list of selectors\n  // If a selector return invalid selector error, try the next one\n  for (const selector of selectors) {\n    try {\n      return dom.querySelectorAll(selector);\n    } catch (e) {}\n  }\n  return [];\n}\n\nfunction isTranslateble(content) {\n  if (!content) return false;\n  content = content.trim();\n  if (!content) return false;\n  const text = getHTMLText(content, {\n    preProcess: (dom) => {\n      // Remove .mention, pre, code, a:has(.invisible)\n      for (const a of forgivingQSA(\n        ['.mention, pre, code, a:has(.invisible)', '.mention, pre, code'],\n        dom,\n      )) {\n        a.remove();\n      }\n    },\n  });\n  return !!text;\n}\n\nfunction getHTMLTextForDetectLang(content, emojis) {\n  if (emojis?.length) {\n    const emojisRegex = new RegExp(\n      `:(${emojis.map((e) => e.shortcode).join('|')}):`,\n      'g',\n    );\n    content = content.replace(emojisRegex, '');\n  }\n\n  return getHTMLText(content, {\n    preProcess: (dom) => {\n      // Remove anything that can skew the language detection\n\n      // Remove .mention, .hashtag, pre, code, a:has(.invisible)\n      for (const a of forgivingQSA(\n        [\n          '.mention, .hashtag, pre, code, a:has(.invisible)',\n          '.mention, .hashtag, pre, code',\n        ],\n        dom,\n      )) {\n        a.remove();\n      }\n\n      // Remove links that contains text that starts with https?://\n      for (const a of dom.querySelectorAll('a')) {\n        const text = a.innerText.trim();\n        if (text.startsWith('https://') || text.startsWith('http://')) {\n          a.remove();\n        }\n      }\n    },\n  });\n}\n\nconst HTTP_REGEX = /^http/i;\nconst PostContent =\n  /*memo(*/\n  ({ post, instance, previewMode }) => {\n    const { content, emojis, language, mentions, url } = post;\n\n    const divRef = useRef();\n    useLayoutEffect(() => {\n      if (!divRef.current) return;\n      const dom = enhanceContent(content, {\n        emojis,\n        returnDOM: true,\n      });\n      // Remove target=\"_blank\" from links\n      for (const a of dom.querySelectorAll('a.u-url[target=\"_blank\"]')) {\n        if (!HTTP_REGEX.test(a.innerText.trim())) {\n          a.removeAttribute('target');\n        }\n      }\n      divRef.current.replaceChildren(dom.cloneNode(true));\n    }, [content, emojis?.length]);\n\n    return (\n      <div\n        ref={divRef}\n        lang={language}\n        dir=\"auto\"\n        class=\"inner-content\"\n        onClick={handleContentLinks({\n          mentions,\n          instance,\n          previewMode,\n          statusURL: url,\n        })}\n        // dangerouslySetInnerHTML={{\n        //   __html: enhanceContent(content, {\n        //     emojis,\n        //     postEnhanceDOM: (dom) => {\n        //       // Remove target=\"_blank\" from links\n        //       dom.querySelectorAll('a.u-url[target=\"_blank\"]').forEach((a) => {\n        //         if (!/http/i.test(a.innerText.trim())) {\n        //           a.removeAttribute('target');\n        //         }\n        //       });\n        //     },\n        //   }),\n        // }}\n      />\n    );\n  }; /*,\n  (oldProps, newProps) => {\n    const { post: oldPost } = oldProps;\n    const { post: newPost } = newProps;\n    return oldPost.content === newPost.content;\n  },\n);*/\n\nconst SIZE_CLASS = {\n  s: 'small',\n  m: 'medium',\n  l: 'large',\n};\n\nconst detectLang = pmem(async (text) => {\n  text = text?.trim();\n\n  // Ref: https://github.com/komodojp/tinyld/blob/develop/docs/benchmark.md\n  // 500 should be enough for now, also the default max chars for Mastodon\n  if (text?.length > 500) {\n    return null;\n  }\n\n  if (langDetector) {\n    const langs = await langDetector.detect(text);\n    console.groupCollapsed(\n      '💬 DETECTLANG BROWSER',\n      langs.slice(0, 3).map((l) => l.detectedLanguage),\n    );\n    console.log(text, langs.slice(0, 3));\n    console.groupEnd();\n    const lang = langs[0];\n    if (lang?.detectedLanguage && lang?.confidence > 0.5) {\n      return lang.detectedLanguage;\n    }\n  }\n\n  const { detectAll } = await import('tinyld/light');\n  const langs = detectAll(text);\n  console.groupCollapsed(\n    '💬 DETECTLANG TINYLD',\n    langs.slice(0, 3).map((l) => l.lang),\n  );\n  console.log(text, langs.slice(0, 3));\n  console.groupEnd();\n  const lang = langs[0];\n  if (lang?.lang && lang?.accuracy > 0.5) {\n    // If > 50% accurate, use it\n    // It can be accurate if < 50% but better be safe\n    // Though > 50% also can be inaccurate 🤷‍♂️\n    return lang.lang;\n  }\n  return null;\n});\n\nconst readMoreText = msg`Read more →`;\n\n// All this work just to make sure this only lazy-run once\n// Because first run is slow due to intl-localematcher\nconst DIFFERENT_LANG_CHECK = {};\nconst checkDifferentLanguage = (\n  language,\n  contentTranslationHideLanguages = [],\n) => {\n  if (!language) return false;\n  const targetLanguage = getTranslateTargetLanguage(true);\n  const different =\n    language !== targetLanguage &&\n    !localeMatch([language], [targetLanguage]) &&\n    !contentTranslationHideLanguages.find(\n      (l) => language === l || localeMatch([language], [l]),\n    );\n  if (different)\n    DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages] = true;\n  return different;\n};\n\nfunction Status({\n  statusID,\n  status,\n  instance: propInstance,\n  size = 'm',\n  contentTextWeight,\n  readOnly,\n  enableCommentHint,\n  withinContext,\n  skeleton,\n  enableTranslate,\n  forceTranslate: _forceTranslate,\n  previewMode,\n  // allowFilters,\n  onMediaClick,\n  quoted,\n  onStatusLinkClick = () => {},\n  showFollowedTags,\n  allowContextMenu,\n  showActionsBar,\n  showReplyParent,\n  mediaFirst,\n}) {\n  const { _, t } = useLingui();\n\n  if (skeleton) {\n    return (\n      <div\n        class={`status skeleton ${\n          mediaFirst ? 'status-media-first small' : ''\n        }`}\n      >\n        {!mediaFirst && <Avatar size=\"xxl\" />}\n        <div class=\"container\">\n          <div class=\"meta\">\n            {(size === 's' || mediaFirst) && <Avatar size=\"m\" />} ███ ████████\n          </div>\n          <div class=\"content-container\">\n            {mediaFirst && <div class=\"media-first-container\" />}\n            <div class={`content ${mediaFirst ? 'media-first-content' : ''}`}>\n              <p>████ ████████</p>\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n  const { masto, instance, authenticated } = api({ instance: propInstance });\n  const { instance: currentInstance } = api();\n  const sameInstance = instance === currentInstance;\n\n  let sKey = statusKey(statusID || status?.id, instance);\n  const snapStates = useSnapshot(states);\n  if (!status) {\n    status = snapStates.statuses[sKey] || snapStates.statuses[statusID];\n    sKey = statusKey(status?.id, instance);\n  }\n  if (!status) {\n    return null;\n  }\n\n  const {\n    account: {\n      acct,\n      avatar,\n      avatarStatic,\n      id: accountId,\n      url: accountURL,\n      displayName,\n      username,\n      emojis: accountEmojis,\n      bot,\n      group,\n    } = {},\n    id,\n    repliesCount,\n    reblogged,\n    reblogsCount,\n    favourited,\n    favouritesCount,\n    bookmarked,\n    poll,\n    muted,\n    sensitive,\n    spoilerText,\n    visibility, // public, unlisted, private, direct\n    language: _language,\n    editedAt,\n    filtered,\n    card,\n    createdAt,\n    inReplyToId,\n    inReplyToAccountId,\n    content,\n    mentions,\n    mediaAttachments,\n    reblog,\n    uri,\n    url,\n    emojis,\n    tags,\n    pinned,\n    // Non-API props\n    _deleted,\n    _pinned,\n    // _filtered,\n    // Non-Mastodon\n    emojiReactions,\n  } = status;\n\n  const [languageAutoDetected, setLanguageAutoDetected] = useState(null);\n  useEffect(() => {\n    if (!content) return;\n    if (_language) return;\n    if (languageAutoDetected) return;\n    let timer;\n    timer = setTimeout(async () => {\n      let detected = await detectLang(\n        getHTMLTextForDetectLang(content, emojis),\n      );\n      setLanguageAutoDetected(detected);\n    }, 1000);\n    return () => clearTimeout(timer);\n  }, [content, _language]);\n  const language = _language || languageAutoDetected;\n\n  // if (!mediaAttachments?.length) mediaFirst = false;\n  const hasMediaAttachments = !!mediaAttachments?.length;\n  if (mediaFirst && hasMediaAttachments) size = 's';\n\n  const currentAccount = useMemo(() => {\n    return getCurrentAccountID();\n  }, []);\n  const isSelf = useMemo(() => {\n    return currentAccount && currentAccount === accountId;\n  }, [accountId, currentAccount]);\n\n  const filterContext = useContext(FilterContext);\n  const filterInfo =\n    !isSelf && !readOnly && !previewMode && isFiltered(filtered, filterContext);\n\n  if (filterInfo?.action === 'hide') {\n    return null;\n  }\n\n  console.debug('RENDER Status', id, status?.account?.displayName, quoted);\n\n  const debugHover = (e) => {\n    if (e.shiftKey) {\n      console.log({\n        ...status,\n      });\n    }\n  };\n\n  if (/*allowFilters && */ size !== 'l' && filterInfo) {\n    return (\n      <FilteredStatus\n        status={status}\n        filterInfo={filterInfo}\n        instance={instance}\n        containerProps={{\n          onMouseEnter: debugHover,\n        }}\n        showFollowedTags\n        quoted={quoted}\n      />\n    );\n  }\n\n  const createdAtDate = new Date(createdAt);\n  const editedAtDate = new Date(editedAt);\n\n  let inReplyToAccountRef = mentions?.find(\n    (mention) => mention.id === inReplyToAccountId,\n  );\n  if (!inReplyToAccountRef && inReplyToAccountId === id) {\n    inReplyToAccountRef = { url: accountURL, username, displayName };\n  }\n  const [inReplyToAccount, setInReplyToAccount] = useState(inReplyToAccountRef);\n  if (!withinContext && !inReplyToAccount && inReplyToAccountId) {\n    const account = states.accounts[inReplyToAccountId];\n    if (account) {\n      setInReplyToAccount(account);\n    } else {\n      memFetchAccount(inReplyToAccountId, masto)\n        .then((account) => {\n          setInReplyToAccount(account);\n          states.accounts[account.id] = account;\n        })\n        .catch((e) => {});\n    }\n  }\n  const mentionSelf =\n    inReplyToAccountId === currentAccount ||\n    mentions?.find((mention) => mention.id === currentAccount);\n\n  const readingExpandSpoilers = useMemo(() => {\n    const prefs = store.account.get('preferences') || {};\n    return !!prefs['reading:expand:spoilers'];\n  }, []);\n  const readingExpandMedia = useMemo(() => {\n    // default | show_all | hide_all\n    // Ignore hide_all because it means hide *ALL* media including non-sensitive ones\n    const prefs = store.account.get('preferences') || {};\n    return prefs['reading:expand:media']?.toLowerCase() || 'default';\n  }, []);\n  // FOR TESTING:\n  // const readingExpandSpoilers = true;\n  // const readingExpandMedia = 'show_all';\n  const showSpoiler =\n    previewMode || readingExpandSpoilers || !!snapStates.spoilers[id];\n  const showSpoilerMedia =\n    previewMode ||\n    readingExpandMedia === 'show_all' ||\n    !!snapStates.spoilersMedia[id];\n\n  if (reblog) {\n    // If has statusID, means useItemID (cached in states)\n\n    if (group) {\n      return (\n        <div\n          data-state-post-id={sKey}\n          class=\"status-group\"\n          onMouseEnter={debugHover}\n        >\n          <div class=\"status-pre-meta\">\n            <Icon icon=\"group\" size=\"l\" alt={t`Group`} />{' '}\n            <NameText account={status.account} instance={instance} showAvatar />\n          </div>\n          <Status\n            status={statusID ? null : reblog}\n            statusID={statusID ? reblog.id : null}\n            instance={instance}\n            size={size}\n            contentTextWeight={contentTextWeight}\n            readOnly={readOnly}\n            mediaFirst={mediaFirst}\n          />\n        </div>\n      );\n    }\n\n    return (\n      <div\n        data-state-post-id={sKey}\n        class=\"status-reblog\"\n        onMouseEnter={debugHover}\n      >\n        <div class=\"status-pre-meta\">\n          <Icon icon=\"rocket\" size=\"l\" />{' '}\n          <Trans>\n            <NameText account={status.account} instance={instance} showAvatar />{' '}\n            <span>boosted</span>\n          </Trans>\n        </div>\n        <Status\n          status={statusID ? null : reblog}\n          statusID={statusID ? reblog.id : null}\n          instance={instance}\n          size={size}\n          contentTextWeight={contentTextWeight}\n          readOnly={readOnly}\n          enableCommentHint\n          mediaFirst={mediaFirst}\n        />\n      </div>\n    );\n  }\n\n  // Check followedTags\n  const FollowedTagsParent = useCallback(\n    ({ children }) => (\n      <div\n        data-state-post-id={sKey}\n        class=\"status-followed-tags\"\n        onMouseEnter={debugHover}\n      >\n        <div class=\"status-pre-meta\">\n          <Icon icon=\"hashtag\" size=\"l\" />{' '}\n          {snapStates.statusFollowedTags[sKey].slice(0, 3).map((tag) => (\n            <Link\n              key={tag}\n              to={instance ? `/${instance}/t/${tag}` : `/t/${tag}`}\n              class=\"status-followed-tag-item\"\n            >\n              {tag}\n            </Link>\n          ))}\n        </div>\n        {children}\n      </div>\n    ),\n    [sKey, instance, snapStates.statusFollowedTags[sKey]],\n  );\n  const StatusParent =\n    showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length\n      ? FollowedTagsParent\n      : Fragment;\n\n  const isSizeLarge = size === 'l';\n\n  const [forceTranslate, setForceTranslate] = useState(_forceTranslate);\n  // const targetLanguage = getTranslateTargetLanguage(true);\n  // const contentTranslationHideLanguages =\n  //   snapStates.settings.contentTranslationHideLanguages || [];\n  const { contentTranslation, contentTranslationAutoInline } =\n    snapStates.settings;\n  if (!contentTranslation) enableTranslate = false;\n  const inlineTranslate = useMemo(() => {\n    if (\n      !contentTranslation ||\n      !contentTranslationAutoInline ||\n      readOnly ||\n      (withinContext && !isSizeLarge) ||\n      previewMode ||\n      spoilerText ||\n      sensitive ||\n      poll ||\n      card ||\n      mediaAttachments?.length\n    ) {\n      return false;\n    }\n    const contentLength = htmlContentLength(content);\n    return contentLength > 0 && contentLength <= INLINE_TRANSLATE_LIMIT;\n  }, [\n    contentTranslation,\n    contentTranslationAutoInline,\n    readOnly,\n    withinContext,\n    isSizeLarge,\n    previewMode,\n    spoilerText,\n    sensitive,\n    poll,\n    card,\n    mediaAttachments,\n    content,\n  ]);\n\n  const [showEdited, setShowEdited] = useState(false);\n  const [showEmbed, setShowEmbed] = useState(false);\n\n  const spoilerContentRef = useTruncated();\n  const contentRef = useTruncated();\n  const mediaContainerRef = useTruncated();\n\n  const statusRef = useRef(null);\n\n  const unauthInteractionErrorMessage = t`Sorry, your current logged-in instance can't interact with this post from another instance.`;\n\n  const textWeight = useCallback(\n    () =>\n      Math.max(\n        Math.round((spoilerText.length + htmlContentLength(content)) / 140) ||\n          1,\n        1,\n      ),\n    [spoilerText, content],\n  );\n\n  const createdDateText = createdAt && niceDateTime(createdAtDate);\n  const editedDateText = editedAt && niceDateTime(editedAtDate);\n\n  // Can boost if:\n  // - authenticated AND\n  // - visibility != direct OR\n  // - visibility = private AND isSelf\n  let canBoost =\n    authenticated && visibility !== 'direct' && visibility !== 'private';\n  if (visibility === 'private' && isSelf) {\n    canBoost = true;\n  }\n\n  const replyStatus = (e) => {\n    if (!sameInstance || !authenticated) {\n      return alert(unauthInteractionErrorMessage);\n    }\n    // syntheticEvent comes from MenuItem\n    if (e?.shiftKey || e?.syntheticEvent?.shiftKey) {\n      const newWin = openCompose({\n        replyToStatus: status,\n      });\n      if (newWin) return;\n    }\n    showCompose({\n      replyToStatus: status,\n    });\n  };\n\n  // Check if media has no descriptions\n  const mediaNoDesc = useMemo(() => {\n    return mediaAttachments.some(\n      (attachment) => !attachment.description?.trim?.(),\n    );\n  }, [mediaAttachments]);\n\n  const statusMonthsAgo = useMemo(() => {\n    return Math.floor(\n      (new Date() - createdAtDate) / (1000 * 60 * 60 * 24 * 30),\n    );\n  }, [createdAtDate]);\n\n  // const boostStatus = async () => {\n  //   if (!sameInstance || !authenticated) {\n  //     alert(unauthInteractionErrorMessage);\n  //     return false;\n  //   }\n  //   try {\n  //     if (!reblogged) {\n  //       let confirmText = 'Boost this post?';\n  //       if (mediaNoDesc) {\n  //         confirmText += '\\n\\n⚠️ Some media have no descriptions.';\n  //       }\n  //       const yes = confirm(confirmText);\n  //       if (!yes) {\n  //         return false;\n  //       }\n  //     }\n  //     // Optimistic\n  //     states.statuses[sKey] = {\n  //       ...status,\n  //       reblogged: !reblogged,\n  //       reblogsCount: reblogsCount + (reblogged ? -1 : 1),\n  //     };\n  //     if (reblogged) {\n  //       const newStatus = await masto.v1.statuses.$select(id).unreblog();\n  //       saveStatus(newStatus, instance);\n  //       return true;\n  //     } else {\n  //       const newStatus = await masto.v1.statuses.$select(id).reblog();\n  //       saveStatus(newStatus, instance);\n  //       return true;\n  //     }\n  //   } catch (e) {\n  //     console.error(e);\n  //     // Revert optimistism\n  //     states.statuses[sKey] = status;\n  //     return false;\n  //   }\n  // };\n  const confirmBoostStatus = async () => {\n    if (!sameInstance || !authenticated) {\n      alert(unauthInteractionErrorMessage);\n      return false;\n    }\n    try {\n      // Optimistic\n      states.statuses[sKey] = {\n        ...status,\n        reblogged: !reblogged,\n        reblogsCount: reblogsCount + (reblogged ? -1 : 1),\n      };\n      if (reblogged) {\n        const newStatus = await masto.v1.statuses.$select(id).unreblog();\n        saveStatus(newStatus, instance);\n      } else {\n        const newStatus = await masto.v1.statuses.$select(id).reblog();\n        saveStatus(newStatus, instance);\n      }\n      return true;\n    } catch (e) {\n      console.error(e);\n      // Revert optimistism\n      states.statuses[sKey] = status;\n      return false;\n    }\n  };\n\n  const favouriteStatus = async () => {\n    if (!sameInstance || !authenticated) {\n      alert(unauthInteractionErrorMessage);\n      return false;\n    }\n    try {\n      // Optimistic\n      states.statuses[sKey] = {\n        ...status,\n        favourited: !favourited,\n        favouritesCount: favouritesCount + (favourited ? -1 : 1),\n      };\n      if (favourited) {\n        const newStatus = await masto.v1.statuses.$select(id).unfavourite();\n        saveStatus(newStatus, instance);\n      } else {\n        const newStatus = await masto.v1.statuses.$select(id).favourite();\n        saveStatus(newStatus, instance);\n      }\n      return true;\n    } catch (e) {\n      console.error(e);\n      // Revert optimistism\n      states.statuses[sKey] = status;\n      return false;\n    }\n  };\n  const favouriteStatusNotify = async () => {\n    try {\n      const done = await favouriteStatus();\n      if (!isSizeLarge && done) {\n        showToast(\n          favourited\n            ? t`Unliked @${username || acct}'s post`\n            : t`Liked @${username || acct}'s post`,\n        );\n      }\n    } catch (e) {}\n  };\n\n  const bookmarkStatus = async () => {\n    if (!supports('@mastodon/post-bookmark')) return;\n    if (!sameInstance || !authenticated) {\n      alert(unauthInteractionErrorMessage);\n      return false;\n    }\n    try {\n      // Optimistic\n      states.statuses[sKey] = {\n        ...status,\n        bookmarked: !bookmarked,\n      };\n      if (bookmarked) {\n        const newStatus = await masto.v1.statuses.$select(id).unbookmark();\n        saveStatus(newStatus, instance);\n      } else {\n        const newStatus = await masto.v1.statuses.$select(id).bookmark();\n        saveStatus(newStatus, instance);\n      }\n      return true;\n    } catch (e) {\n      console.error(e);\n      // Revert optimistism\n      states.statuses[sKey] = status;\n      return false;\n    }\n  };\n  const bookmarkStatusNotify = async () => {\n    try {\n      const done = await bookmarkStatus();\n      if (!isSizeLarge && done) {\n        showToast(\n          bookmarked\n            ? t`Unbookmarked @${username || acct}'s post`\n            : t`Bookmarked @${username || acct}'s post`,\n        );\n      }\n    } catch (e) {}\n  };\n\n  // const differentLanguage =\n  //   !!language &&\n  //   language !== targetLanguage &&\n  //   !localeMatch([language], [targetLanguage]) &&\n  //   !contentTranslationHideLanguages.find(\n  //     (l) => language === l || localeMatch([language], [l]),\n  //   );\n  const contentTranslationHideLanguages =\n    snapStates.settings.contentTranslationHideLanguages || [];\n  const [differentLanguage, setDifferentLanguage] = useState(\n    () =>\n      DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages] ||\n      checkDifferentLanguage(language, contentTranslationHideLanguages),\n  );\n  useEffect(() => {\n    if (!language || differentLanguage) {\n      return;\n    }\n    if (\n      !differentLanguage &&\n      DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages]\n    ) {\n      setDifferentLanguage(true);\n      return;\n    }\n    let timeout = setTimeout(() => {\n      const different = checkDifferentLanguage(\n        language,\n        contentTranslationHideLanguages,\n      );\n      if (different) setDifferentLanguage(different);\n    }, 1);\n    return () => clearTimeout(timeout);\n  }, [language, differentLanguage, contentTranslationHideLanguages]);\n\n  const reblogIterator = useRef();\n  const favouriteIterator = useRef();\n  async function fetchBoostedLikedByAccounts(firstLoad) {\n    if (firstLoad) {\n      reblogIterator.current = masto.v1.statuses\n        .$select(statusID)\n        .rebloggedBy.list({\n          limit: REACTIONS_LIMIT,\n        });\n      favouriteIterator.current = masto.v1.statuses\n        .$select(statusID)\n        .favouritedBy.list({\n          limit: REACTIONS_LIMIT,\n        });\n    }\n    const [{ value: reblogResults }, { value: favouriteResults }] =\n      await Promise.allSettled([\n        reblogIterator.current.next(),\n        favouriteIterator.current.next(),\n      ]);\n    if (reblogResults.value?.length || favouriteResults.value?.length) {\n      const accounts = [];\n      if (reblogResults.value?.length) {\n        accounts.push(\n          ...reblogResults.value.map((a) => {\n            a._types = ['reblog'];\n            return a;\n          }),\n        );\n      }\n      if (favouriteResults.value?.length) {\n        accounts.push(\n          ...favouriteResults.value.map((a) => {\n            a._types = ['favourite'];\n            return a;\n          }),\n        );\n      }\n      return {\n        value: accounts,\n        done: reblogResults.done && favouriteResults.done,\n      };\n    }\n    return {\n      value: [],\n      done: true,\n    };\n  }\n\n  const actionsRef = useRef();\n  const isPublic = ['public', 'unlisted'].includes(visibility);\n  const isPinnable = ['public', 'unlisted', 'private'].includes(visibility);\n  const menuFooter =\n    mediaNoDesc && !reblogged ? (\n      <div class=\"footer\">\n        <Icon icon=\"alert\" />\n        <Trans>Some media have no descriptions.</Trans>\n      </div>\n    ) : (\n      statusMonthsAgo >= 3 && (\n        <div class=\"footer\">\n          <Icon icon=\"info\" />\n          <span>\n            <Trans>\n              Old post (<strong>{rtf.format(-statusMonthsAgo, 'month')}</strong>\n              )\n            </Trans>\n          </span>\n        </div>\n      )\n    );\n  const StatusMenuItems = (\n    <>\n      {!isSizeLarge && sameInstance && (\n        <>\n          <div class=\"menu-control-group-horizontal status-menu\">\n            <MenuItem onClick={replyStatus}>\n              <Icon icon=\"comment\" />\n              <span>\n                {repliesCount > 0 ? shortenNumber(repliesCount) : t`Reply`}\n              </span>\n            </MenuItem>\n            <MenuConfirm\n              subMenu\n              confirmLabel={\n                <>\n                  <Icon icon=\"rocket\" />\n                  <span>{reblogged ? t`Unboost` : t`Boost`}</span>\n                </>\n              }\n              className={`menu-reblog ${reblogged ? 'checked' : ''}`}\n              menuExtras={\n                <MenuItem\n                  onClick={() => {\n                    showCompose({\n                      draftStatus: {\n                        status: `\\n${url}`,\n                      },\n                    });\n                  }}\n                >\n                  <Icon icon=\"quote\" />\n                  <span>\n                    <Trans>Quote</Trans>\n                  </span>\n                </MenuItem>\n              }\n              menuFooter={menuFooter}\n              disabled={!canBoost}\n              onClick={async () => {\n                try {\n                  const done = await confirmBoostStatus();\n                  if (!isSizeLarge && done) {\n                    showToast(\n                      reblogged\n                        ? t`Unboosted @${username || acct}'s post`\n                        : t`Boosted @${username || acct}'s post`,\n                    );\n                  }\n                } catch (e) {}\n              }}\n            >\n              <Icon icon=\"rocket\" />\n              <span>\n                {reblogsCount > 0\n                  ? shortenNumber(reblogsCount)\n                  : reblogged\n                    ? t`Unboost`\n                    : t`Boost…`}\n              </span>\n            </MenuConfirm>\n            <MenuItem\n              onClick={favouriteStatusNotify}\n              className={`menu-favourite ${favourited ? 'checked' : ''}`}\n            >\n              <Icon icon=\"heart\" />\n              <span>\n                {favouritesCount > 0\n                  ? shortenNumber(favouritesCount)\n                  : favourited\n                    ? t`Unlike`\n                    : t`Like`}\n              </span>\n            </MenuItem>\n            {supports('@mastodon/post-bookmark') && (\n              <MenuItem\n                onClick={bookmarkStatusNotify}\n                className={`menu-bookmark ${bookmarked ? 'checked' : ''}`}\n              >\n                <Icon icon=\"bookmark\" />\n                <span>{bookmarked ? t`Unbookmark` : t`Bookmark`}</span>\n              </MenuItem>\n            )}\n          </div>\n        </>\n      )}\n      {!isSizeLarge && sameInstance && (isSizeLarge || showActionsBar) && (\n        <MenuDivider />\n      )}\n      {(isSizeLarge || showActionsBar) && (\n        <>\n          <MenuItem\n            onClick={() => {\n              states.showGenericAccounts = {\n                heading: t`Boosted/Liked by…`,\n                fetchAccounts: fetchBoostedLikedByAccounts,\n                instance,\n                showReactions: true,\n                postID: sKey,\n              };\n            }}\n          >\n            <Icon icon=\"react\" />\n            <span>\n              <Trans>Boosted/Liked by…</Trans>\n            </span>\n          </MenuItem>\n        </>\n      )}\n      {!mediaFirst && (\n        <>\n          {(enableTranslate || !language || differentLanguage) && (\n            <MenuDivider />\n          )}\n          {enableTranslate ? (\n            <div class={supportsTTS ? 'menu-horizontal' : ''}>\n              <MenuItem\n                disabled={forceTranslate}\n                onClick={() => {\n                  setForceTranslate(true);\n                }}\n              >\n                <Icon icon=\"translate\" />\n                <span>\n                  <Trans>Translate</Trans>\n                </span>\n              </MenuItem>\n              {supportsTTS && (\n                <MenuItem\n                  onClick={() => {\n                    const postText = getPostText(status);\n                    if (postText) {\n                      speak(postText, language);\n                    }\n                  }}\n                >\n                  <Icon icon=\"speak\" />\n                  <span>\n                    <Trans>Speak</Trans>\n                  </span>\n                </MenuItem>\n              )}\n            </div>\n          ) : (\n            (!language || differentLanguage) && (\n              <div class={supportsTTS ? 'menu-horizontal' : ''}>\n                <MenuLink\n                  to={`${instance ? `/${instance}` : ''}/s/${id}?translate=1`}\n                >\n                  <Icon icon=\"translate\" />\n                  <span>\n                    <Trans>Translate</Trans>\n                  </span>\n                </MenuLink>\n                {supportsTTS && (\n                  <MenuItem\n                    onClick={() => {\n                      const postText = getPostText(status);\n                      if (postText) {\n                        speak(postText, language);\n                      }\n                    }}\n                  >\n                    <Icon icon=\"speak\" />\n                    <span>\n                      <Trans>Speak</Trans>\n                    </span>\n                  </MenuItem>\n                )}\n              </div>\n            )\n          )}\n        </>\n      )}\n      {((!isSizeLarge && sameInstance) ||\n        enableTranslate ||\n        !language ||\n        differentLanguage) && <MenuDivider />}\n      {!isSizeLarge && (\n        <>\n          <MenuLink\n            to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n            onClick={(e) => {\n              onStatusLinkClick(e, status);\n            }}\n          >\n            <Icon icon=\"arrows-right\" />\n            <small>\n              <Trans>\n                View post by{' '}\n                <span class=\"bidi-isolate\">@{username || acct}</span>\n              </Trans>\n              <br />\n              <span class=\"more-insignificant\">\n                {_(visibilityText[visibility])} • {createdDateText}\n              </span>\n            </small>\n          </MenuLink>\n        </>\n      )}\n      {!!editedAt && (\n        <>\n          <MenuItem\n            onClick={() => {\n              setShowEdited(id);\n            }}\n          >\n            <Icon icon=\"history\" />\n            <small>\n              <Trans>Show Edit History</Trans>\n              <br />\n              <span class=\"more-insignificant\">\n                <Trans>Edited: {editedDateText}</Trans>\n              </span>\n            </small>\n          </MenuItem>\n        </>\n      )}\n      <MenuItem href={url} target=\"_blank\">\n        <Icon icon=\"external\" />\n        <small\n          class=\"menu-double-lines\"\n          style={{\n            maxWidth: '16em',\n          }}\n        >\n          {nicePostURL(url)}\n        </small>\n      </MenuItem>\n      <div class=\"menu-horizontal\">\n        <MenuItem\n          onClick={() => {\n            // Copy url to clipboard\n            try {\n              navigator.clipboard.writeText(url);\n              showToast(t`Link copied`);\n            } catch (e) {\n              console.error(e);\n              showToast(t`Unable to copy link`);\n            }\n          }}\n        >\n          <Icon icon=\"link\" />\n          <span>\n            <Trans>Copy</Trans>\n          </span>\n        </MenuItem>\n        {isPublic &&\n          navigator?.share &&\n          navigator?.canShare?.({\n            url,\n          }) && (\n            <MenuItem\n              onClick={() => {\n                try {\n                  navigator.share({\n                    url,\n                  });\n                } catch (e) {\n                  console.error(e);\n                  alert(t`Sharing doesn't seem to work.`);\n                }\n              }}\n            >\n              <Icon icon=\"share\" />\n              <span>\n                <Trans>Share…</Trans>\n              </span>\n            </MenuItem>\n          )}\n      </div>\n      {isPublic && isSizeLarge && (\n        <MenuItem\n          onClick={() => {\n            setShowEmbed(true);\n          }}\n        >\n          <Icon icon=\"code\" />\n          <span>\n            <Trans>Embed post</Trans>\n          </span>\n        </MenuItem>\n      )}\n      {(isSelf || mentionSelf) && <MenuDivider />}\n      {(isSelf || mentionSelf) && (\n        <MenuItem\n          onClick={async () => {\n            try {\n              const newStatus = await masto.v1.statuses\n                .$select(id)\n                [muted ? 'unmute' : 'mute']();\n              saveStatus(newStatus, instance);\n              showToast(\n                muted ? t`Conversation unmuted` : t`Conversation muted`,\n              );\n            } catch (e) {\n              console.error(e);\n              showToast(\n                muted\n                  ? t`Unable to unmute conversation`\n                  : t`Unable to mute conversation`,\n              );\n            }\n          }}\n        >\n          {muted ? (\n            <>\n              <Icon icon=\"unmute\" />\n              <span>\n                <Trans>Unmute conversation</Trans>\n              </span>\n            </>\n          ) : (\n            <>\n              <Icon icon=\"mute\" />\n              <span>\n                <Trans>Mute conversation</Trans>\n              </span>\n            </>\n          )}\n        </MenuItem>\n      )}\n      {isSelf && isPinnable && (\n        <MenuItem\n          onClick={async () => {\n            try {\n              const newStatus = await masto.v1.statuses\n                .$select(id)\n                [pinned ? 'unpin' : 'pin']();\n              saveStatus(newStatus, instance);\n              showToast(\n                pinned\n                  ? t`Post unpinned from profile`\n                  : t`Post pinned to profile`,\n              );\n            } catch (e) {\n              console.error(e);\n              showToast(\n                pinned ? t`Unable to unpin post` : t`Unable to pin post`,\n              );\n            }\n          }}\n        >\n          {pinned ? (\n            <>\n              <Icon icon=\"unpin\" />\n              <span>\n                <Trans>Unpin from profile</Trans>\n              </span>\n            </>\n          ) : (\n            <>\n              <Icon icon=\"pin\" />\n              <span>\n                <Trans>Pin to profile</Trans>\n              </span>\n            </>\n          )}\n        </MenuItem>\n      )}\n      {isSelf && (\n        <div class=\"menu-horizontal\">\n          {supports('@mastodon/post-edit') && (\n            <MenuItem\n              onClick={() => {\n                showCompose({\n                  editStatus: status,\n                });\n              }}\n            >\n              <Icon icon=\"pencil\" />\n              <span>\n                <Trans>Edit</Trans>\n              </span>\n            </MenuItem>\n          )}\n          {isSizeLarge && (\n            <MenuConfirm\n              subMenu\n              confirmLabel={\n                <>\n                  <Icon icon=\"trash\" />\n                  <span>\n                    <Trans>Delete this post?</Trans>\n                  </span>\n                </>\n              }\n              itemProps={{\n                className: 'danger',\n              }}\n              menuItemClassName=\"danger\"\n              onClick={() => {\n                // const yes = confirm('Delete this post?');\n                // if (yes) {\n                (async () => {\n                  try {\n                    await masto.v1.statuses.$select(id).remove();\n                    const cachedStatus = getStatus(id, instance);\n                    cachedStatus._deleted = true;\n                    showToast(t`Post deleted`);\n                  } catch (e) {\n                    console.error(e);\n                    showToast(t`Unable to delete post`);\n                  }\n                })();\n                // }\n              }}\n            >\n              <Icon icon=\"trash\" />\n              <span>\n                <Trans>Delete…</Trans>\n              </span>\n            </MenuConfirm>\n          )}\n        </div>\n      )}\n      {!isSelf && isSizeLarge && (\n        <>\n          <MenuDivider />\n          <MenuItem\n            className=\"danger\"\n            onClick={() => {\n              states.showReportModal = {\n                account: status.account,\n                post: status,\n              };\n            }}\n          >\n            <Icon icon=\"flag\" />\n            <span>\n              <Trans>Report post…</Trans>\n            </span>\n          </MenuItem>\n        </>\n      )}\n    </>\n  );\n\n  const contextMenuRef = useRef();\n  const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n  const [contextMenuProps, setContextMenuProps] = useState({});\n\n  const showContextMenu =\n    allowContextMenu || (!isSizeLarge && !previewMode && !_deleted && !quoted);\n\n  // Only iOS/iPadOS browsers don't support contextmenu\n  // Some comments report iPadOS might support contextmenu if a mouse is connected\n  const bindLongPressContext = useLongPress(\n    isIOS && showContextMenu\n      ? (e) => {\n          if (e.pointerType === 'mouse') return;\n          // There's 'pen' too, but not sure if contextmenu event would trigger from a pen\n\n          const { clientX, clientY } = e.touches?.[0] || e;\n          // link detection copied from onContextMenu because here it works\n          const link = e.target.closest('a');\n          if (\n            link &&\n            statusRef.current.contains(link) &&\n            !link.getAttribute('href').startsWith('#')\n          )\n            return;\n          e.preventDefault();\n          setContextMenuProps({\n            anchorPoint: {\n              x: clientX,\n              y: clientY,\n            },\n            direction: 'right',\n          });\n          setIsContextMenuOpen(true);\n        }\n      : null,\n    {\n      threshold: 600,\n      captureEvent: true,\n      detect: 'touch',\n      cancelOnMovement: 2, // true allows movement of up to 25 pixels\n    },\n  );\n\n  const hotkeysEnabled = !readOnly && !previewMode && !quoted;\n  const rRef = useHotkeys('r, shift+r', replyStatus, {\n    enabled: hotkeysEnabled,\n  });\n  const fRef = useHotkeys('f, l', favouriteStatusNotify, {\n    enabled: hotkeysEnabled,\n  });\n  const dRef = useHotkeys('d', bookmarkStatusNotify, {\n    enabled: hotkeysEnabled,\n  });\n  const bRef = useHotkeys(\n    'shift+b',\n    () => {\n      (async () => {\n        try {\n          const done = await confirmBoostStatus();\n          if (!isSizeLarge && done) {\n            showToast(\n              reblogged\n                ? t`Unboosted @${username || acct}'s post`\n                : t`Boosted @${username || acct}'s post`,\n            );\n          }\n        } catch (e) {}\n      })();\n    },\n    {\n      enabled: hotkeysEnabled && canBoost,\n    },\n  );\n  const xRef = useHotkeys('x', (e) => {\n    const activeStatus = document.activeElement.closest(\n      '.status-link, .status-focus',\n    );\n    if (activeStatus) {\n      const spoilerButton = activeStatus.querySelector(\n        '.spoiler-button:not(.spoiling)',\n      );\n      if (spoilerButton) {\n        e.stopPropagation();\n        spoilerButton.click();\n      } else {\n        const spoilerMediaButton = activeStatus.querySelector(\n          '.spoiler-media-button:not(.spoiling)',\n        );\n        if (spoilerMediaButton) {\n          e.stopPropagation();\n          spoilerMediaButton.click();\n        }\n      }\n    }\n  });\n\n  const displayedMediaAttachments = mediaAttachments.slice(\n    0,\n    isSizeLarge ? undefined : 4,\n  );\n  const showMultipleMediaCaptions =\n    mediaAttachments.length > 1 &&\n    displayedMediaAttachments.some(\n      (media) => !!media.description && !isMediaCaptionLong(media.description),\n    );\n  const captionChildren = useMemo(() => {\n    if (!showMultipleMediaCaptions) return null;\n    const attachments = [];\n    displayedMediaAttachments.forEach((media, i) => {\n      if (!media.description) return;\n      const index = attachments.findIndex(\n        (attachment) => attachment.media.description === media.description,\n      );\n      if (index === -1) {\n        attachments.push({\n          media,\n          indices: [i],\n        });\n      } else {\n        attachments[index].indices.push(i);\n      }\n    });\n    return attachments.map(({ media, indices }) => (\n      <div\n        key={media.id}\n        data-caption-index={indices.map((i) => i + 1).join(' ')}\n        onClick={(e) => {\n          e.preventDefault();\n          e.stopPropagation();\n          states.showMediaAlt = {\n            alt: media.description,\n            lang: language,\n          };\n        }}\n        title={media.description}\n      >\n        <sup>{indices.map((i) => i + 1).join(' ')}</sup> {media.description}\n      </div>\n    ));\n\n    // return displayedMediaAttachments.map(\n    //   (media, i) =>\n    //     !!media.description && (\n    //       <div\n    //         key={media.id}\n    //         data-caption-index={i + 1}\n    //         onClick={(e) => {\n    //           e.preventDefault();\n    //           e.stopPropagation();\n    //           states.showMediaAlt = {\n    //             alt: media.description,\n    //             lang: language,\n    //           };\n    //         }}\n    //         title={media.description}\n    //       >\n    //         <sup>{i + 1}</sup> {media.description}\n    //       </div>\n    //     ),\n    // );\n  }, [showMultipleMediaCaptions, displayedMediaAttachments, language]);\n\n  const isThread = useMemo(() => {\n    return (\n      (!!inReplyToId && inReplyToAccountId === status.account?.id) ||\n      !!snapStates.statusThreadNumber[sKey]\n    );\n  }, [\n    inReplyToId,\n    inReplyToAccountId,\n    status.account?.id,\n    snapStates.statusThreadNumber[sKey],\n  ]);\n\n  const showCommentHint = useMemo(() => {\n    return (\n      enableCommentHint &&\n      !isThread &&\n      !withinContext &&\n      !inReplyToId &&\n      visibility === 'public' &&\n      repliesCount > 0\n    );\n  }, [\n    enableCommentHint,\n    isThread,\n    withinContext,\n    inReplyToId,\n    repliesCount,\n    visibility,\n  ]);\n  const showCommentCount = useMemo(() => {\n    if (\n      card ||\n      poll ||\n      sensitive ||\n      spoilerText ||\n      mediaAttachments?.length ||\n      isThread ||\n      withinContext ||\n      inReplyToId ||\n      repliesCount <= 0\n    ) {\n      return false;\n    }\n    const questionRegex = /[???︖❓❔⁇⁈⁉¿‽؟]/;\n    const containsQuestion = questionRegex.test(content);\n    if (!containsQuestion) return false;\n    const contentLength = htmlContentLength(content);\n    if (contentLength > 0 && contentLength <= SHOW_COMMENT_COUNT_LIMIT) {\n      return true;\n    }\n  }, [\n    card,\n    poll,\n    sensitive,\n    spoilerText,\n    mediaAttachments,\n    reblog,\n    isThread,\n    withinContext,\n    inReplyToId,\n    repliesCount,\n    content,\n  ]);\n\n  return (\n    <StatusParent>\n      {showReplyParent && !!(inReplyToId && inReplyToAccountId) && (\n        <StatusCompact sKey={sKey} />\n      )}\n      <article\n        data-state-post-id={sKey}\n        ref={(node) => {\n          statusRef.current = node;\n          // Use parent node if it's in focus\n          // Use case: <a><status /></a>\n          // When navigating (j/k), the <a> is focused instead of <status />\n          // Hotkey binding doesn't bubble up thus this hack\n          const nodeRef =\n            node?.closest?.(\n              '.timeline-item, .timeline-item-alt, .status-link, .status-focus',\n            ) || node;\n          rRef(nodeRef);\n          fRef(nodeRef);\n          dRef(nodeRef);\n          bRef(nodeRef);\n          xRef(nodeRef);\n        }}\n        tabindex=\"-1\"\n        class={`status ${\n          !withinContext && inReplyToId && inReplyToAccount\n            ? 'status-reply-to'\n            : ''\n        } visibility-${visibility} ${_pinned ? 'status-pinned' : ''} ${\n          SIZE_CLASS[size]\n        } ${_deleted ? 'status-deleted' : ''} ${quoted ? 'status-card' : ''} ${\n          isContextMenuOpen ? 'status-menu-open' : ''\n        } ${mediaFirst && hasMediaAttachments ? 'status-media-first' : ''}`}\n        onMouseEnter={debugHover}\n        onContextMenu={(e) => {\n          if (!showContextMenu) return;\n          if (e.metaKey) return;\n          // console.log('context menu', e);\n          const link = e.target.closest('a');\n          if (\n            link &&\n            statusRef.current.contains(link) &&\n            !link.getAttribute('href').startsWith('#')\n          )\n            return;\n\n          // If there's selected text, don't show custom context menu\n          const selection = window.getSelection?.();\n          if (selection.toString().length > 0) {\n            const { anchorNode } = selection;\n            if (statusRef.current?.contains(anchorNode)) {\n              return;\n            }\n          }\n          e.preventDefault();\n          setContextMenuProps({\n            anchorPoint: {\n              x: e.clientX,\n              y: e.clientY,\n            },\n            direction: 'right',\n          });\n          setIsContextMenuOpen(true);\n        }}\n        {...(showContextMenu ? bindLongPressContext() : {})}\n      >\n        {showContextMenu && (\n          <ControlledMenu\n            ref={contextMenuRef}\n            state={isContextMenuOpen ? 'open' : undefined}\n            {...contextMenuProps}\n            onClose={(e) => {\n              setIsContextMenuOpen(false);\n              // statusRef.current?.focus?.();\n              if (e?.reason === 'click') {\n                statusRef.current?.closest('[tabindex]')?.focus?.();\n              }\n            }}\n            portal={{\n              target: document.body,\n            }}\n            containerProps={{\n              style: {\n                // Higher than the backdrop\n                zIndex: 1001,\n              },\n              onClick: () => {\n                contextMenuRef.current?.closeMenu?.();\n              },\n            }}\n            overflow=\"auto\"\n            boundingBoxPadding={safeBoundingBoxPadding()}\n            unmountOnClose\n          >\n            {StatusMenuItems}\n          </ControlledMenu>\n        )}\n        {showActionsBar &&\n          size !== 'l' &&\n          !previewMode &&\n          !readOnly &&\n          !_deleted &&\n          !quoted && (\n            <div\n              class={`status-actions ${\n                isContextMenuOpen === 'actions-bar' ? 'open' : ''\n              }`}\n              ref={actionsRef}\n            >\n              <StatusButton\n                size=\"s\"\n                title={t`Reply`}\n                alt={t`Reply`}\n                class=\"reply-button\"\n                icon=\"comment\"\n                iconSize=\"m\"\n                onClick={replyStatus}\n              />\n              <StatusButton\n                size=\"s\"\n                checked={favourited}\n                title={[t`Like`, t`Unlike`]}\n                alt={[t`Like`, t`Liked`]}\n                class=\"favourite-button\"\n                icon=\"heart\"\n                iconSize=\"m\"\n                count={favouritesCount}\n                onClick={favouriteStatusNotify}\n              />\n              <button\n                type=\"button\"\n                title={t`More`}\n                class=\"plain more-button\"\n                onClick={(e) => {\n                  e.preventDefault();\n                  e.stopPropagation();\n                  setContextMenuProps({\n                    anchorRef: {\n                      current: e.currentTarget,\n                    },\n                    align: 'start',\n                    direction: 'left',\n                    gap: 0,\n                    shift: -8,\n                  });\n                  setIsContextMenuOpen('actions-bar');\n                }}\n              >\n                <Icon icon=\"more2\" size=\"m\" alt={t`More`} />\n              </button>\n            </div>\n          )}\n        {size !== 'l' && (\n          <div class=\"status-badge\">\n            {reblogged && (\n              <Icon class=\"reblog\" icon=\"rocket\" size=\"s\" alt={t`Boosted`} />\n            )}\n            {favourited && (\n              <Icon class=\"favourite\" icon=\"heart\" size=\"s\" alt={t`Liked`} />\n            )}\n            {bookmarked && (\n              <Icon\n                class=\"bookmark\"\n                icon=\"bookmark\"\n                size=\"s\"\n                alt={t`Bookmarked`}\n              />\n            )}\n            {_pinned && (\n              <Icon class=\"pin\" icon=\"pin\" size=\"s\" alt={t`Pinned`} />\n            )}\n          </div>\n        )}\n        {size !== 's' && (\n          <a\n            href={accountURL}\n            tabindex=\"-1\"\n            // target=\"_blank\"\n            title={`@${acct}`}\n            onClick={(e) => {\n              e.preventDefault();\n              e.stopPropagation();\n              states.showAccount = {\n                account: status.account,\n                instance,\n              };\n            }}\n          >\n            <Avatar url={avatarStatic || avatar} size=\"xxl\" squircle={bot} />\n          </a>\n        )}\n        <div class=\"container\">\n          {!!(status.account || createdAt) && (\n            <div class=\"meta\">\n              <span class=\"meta-name\">\n                <NameText\n                  account={status.account}\n                  instance={instance}\n                  showAvatar={size === 's'}\n                  showAcct={isSizeLarge}\n                />\n              </span>\n              {/* {inReplyToAccount && !withinContext && size !== 's' && (\n                <>\n                  {' '}\n                  <span class=\"ib\">\n                    <Icon icon=\"arrow-right\" class=\"arrow\" />{' '}\n                    <NameText account={inReplyToAccount} instance={instance} short />\n                  </span>\n                </>\n              )} */}\n              {/* </span> */}{' '}\n              {size !== 'l' &&\n                (_deleted ? (\n                  <span class=\"status-deleted-tag\">\n                    <Trans>Deleted</Trans>\n                  </span>\n                ) : url && !previewMode && !readOnly && !quoted ? (\n                  <Link\n                    to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n                    onClick={(e) => {\n                      if (\n                        e.metaKey ||\n                        e.ctrlKey ||\n                        e.shiftKey ||\n                        e.altKey ||\n                        e.which === 2\n                      ) {\n                        return;\n                      }\n                      e.preventDefault();\n                      e.stopPropagation();\n                      onStatusLinkClick?.(e, status);\n                      setContextMenuProps({\n                        anchorRef: {\n                          current: e.currentTarget,\n                        },\n                        align: 'end',\n                        direction: 'bottom',\n                        gap: 4,\n                      });\n                      setIsContextMenuOpen(true);\n                    }}\n                    class={`time ${\n                      isContextMenuOpen && contextMenuProps?.anchorRef\n                        ? 'is-open'\n                        : ''\n                    }`}\n                  >\n                    {showCommentHint && !showCommentCount ? (\n                      <Icon\n                        icon=\"comment2\"\n                        size=\"s\"\n                        // alt={`${repliesCount} ${\n                        //   repliesCount === 1 ? 'reply' : 'replies'\n                        // }`}\n                        alt={plural(repliesCount, {\n                          one: '# reply',\n                          other: '# replies',\n                        })}\n                      />\n                    ) : (\n                      visibility !== 'public' &&\n                      visibility !== 'direct' && (\n                        <Icon\n                          icon={visibilityIconsMap[visibility]}\n                          alt={_(visibilityText[visibility])}\n                          size=\"s\"\n                        />\n                      )\n                    )}{' '}\n                    <RelativeTime datetime={createdAtDate} format=\"micro\" />\n                    {!previewMode && !readOnly && (\n                      <Icon icon=\"more2\" class=\"more\" alt={t`More`} />\n                    )}\n                  </Link>\n                ) : (\n                  // <Menu\n                  //   instanceRef={menuInstanceRef}\n                  //   portal={{\n                  //     target: document.body,\n                  //   }}\n                  //   containerProps={{\n                  //     style: {\n                  //       // Higher than the backdrop\n                  //       zIndex: 1001,\n                  //     },\n                  //     onClick: (e) => {\n                  //       if (e.target === e.currentTarget)\n                  //         menuInstanceRef.current?.closeMenu?.();\n                  //     },\n                  //   }}\n                  //   align=\"end\"\n                  //   gap={4}\n                  //   overflow=\"auto\"\n                  //   viewScroll=\"close\"\n                  //   boundingBoxPadding=\"8 8 8 8\"\n                  //   unmountOnClose\n                  //   menuButton={({ open }) => (\n                  //     <Link\n                  //       to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n                  //       onClick={(e) => {\n                  //         e.preventDefault();\n                  //         e.stopPropagation();\n                  //         onStatusLinkClick?.(e, status);\n                  //       }}\n                  //       class={`time ${open ? 'is-open' : ''}`}\n                  //     >\n                  //       <Icon\n                  //         icon={visibilityIconsMap[visibility]}\n                  //         alt={visibilityText[visibility]}\n                  //         size=\"s\"\n                  //       />{' '}\n                  //       <RelativeTime datetime={createdAtDate} format=\"micro\" />\n                  //     </Link>\n                  //   )}\n                  // >\n                  //   {StatusMenuItems}\n                  // </Menu>\n                  <span class=\"time\">\n                    {visibility !== 'public' && visibility !== 'direct' && (\n                      <>\n                        <Icon\n                          icon={visibilityIconsMap[visibility]}\n                          alt={_(visibilityText[visibility])}\n                          size=\"s\"\n                        />{' '}\n                      </>\n                    )}\n                    <RelativeTime datetime={createdAtDate} format=\"micro\" />\n                  </span>\n                ))}\n            </div>\n          )}\n          {visibility === 'direct' && (\n            <>\n              <div class=\"status-direct-badge\">\n                <Trans>Private mention</Trans>\n              </div>{' '}\n            </>\n          )}\n          {!withinContext && (\n            <>\n              {isThread ? (\n                <div class=\"status-thread-badge\">\n                  <Icon icon=\"thread\" size=\"s\" />\n                  <Trans>\n                    Thread\n                    {snapStates.statusThreadNumber[sKey]\n                      ? ` ${snapStates.statusThreadNumber[sKey]}/X`\n                      : ''}\n                  </Trans>\n                </div>\n              ) : (\n                !!inReplyToId &&\n                !!inReplyToAccount &&\n                (!!spoilerText ||\n                  !mentions.find((mention) => {\n                    return mention.id === inReplyToAccountId;\n                  })) && (\n                  <div class=\"status-reply-badge\">\n                    <Icon icon=\"reply\" />{' '}\n                    <NameText\n                      account={inReplyToAccount}\n                      instance={instance}\n                      short\n                    />\n                  </div>\n                )\n              )}\n            </>\n          )}\n          <div\n            class={`content-container ${\n              spoilerText || sensitive ? 'has-spoiler' : ''\n            } ${showSpoiler ? 'show-spoiler' : ''} ${\n              showSpoilerMedia ? 'show-media' : ''\n            }`}\n            data-content-text-weight={contentTextWeight ? textWeight() : null}\n            style={\n              (isSizeLarge || contentTextWeight) && {\n                '--content-text-weight': textWeight(),\n              }\n            }\n          >\n            {mediaFirst && hasMediaAttachments ? (\n              <>\n                {(!!spoilerText || !!sensitive) && !readingExpandSpoilers && (\n                  <>\n                    {!!spoilerText && (\n                      <span\n                        class=\"spoiler-content media-first-spoiler-content\"\n                        lang={language}\n                        dir=\"auto\"\n                        ref={spoilerContentRef}\n                        data-read-more={_(readMoreText)}\n                      >\n                        <EmojiText text={spoilerText} emojis={emojis} />{' '}\n                      </span>\n                    )}\n                    <button\n                      class={`light spoiler-button media-first-spoiler-button ${\n                        showSpoiler ? 'spoiling' : ''\n                      }`}\n                      type=\"button\"\n                      onClick={(e) => {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        if (showSpoiler) {\n                          delete states.spoilers[id];\n                          if (!readingExpandSpoilers) {\n                            delete states.spoilersMedia[id];\n                          }\n                        } else {\n                          states.spoilers[id] = true;\n                          if (!readingExpandSpoilers) {\n                            states.spoilersMedia[id] = true;\n                          }\n                        }\n                      }}\n                    >\n                      <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '}\n                      {showSpoiler ? t`Show less` : t`Show content`}\n                    </button>\n                  </>\n                )}\n                <MediaFirstContainer\n                  mediaAttachments={mediaAttachments}\n                  language={language}\n                  postID={id}\n                  instance={instance}\n                />\n                {!!content && (\n                  <div class=\"media-first-content content\" ref={contentRef}>\n                    <PostContent\n                      post={status}\n                      instance={instance}\n                      previewMode={previewMode}\n                    />\n                  </div>\n                )}\n              </>\n            ) : (\n              <>\n                {!!spoilerText && (\n                  <>\n                    <div\n                      class=\"content spoiler-content\"\n                      lang={language}\n                      dir=\"auto\"\n                      ref={spoilerContentRef}\n                      data-read-more={_(readMoreText)}\n                    >\n                      <p>\n                        <EmojiText text={spoilerText} emojis={emojis} />\n                      </p>\n                    </div>\n                    {readingExpandSpoilers || previewMode ? (\n                      <div class=\"spoiler-divider\">\n                        <Icon icon=\"eye-open\" /> <Trans>Content warning</Trans>\n                      </div>\n                    ) : (\n                      <button\n                        class={`light spoiler-button ${\n                          showSpoiler ? 'spoiling' : ''\n                        }`}\n                        type=\"button\"\n                        onClick={(e) => {\n                          e.preventDefault();\n                          e.stopPropagation();\n                          if (showSpoiler) {\n                            delete states.spoilers[id];\n                            if (!readingExpandSpoilers) {\n                              delete states.spoilersMedia[id];\n                            }\n                          } else {\n                            states.spoilers[id] = true;\n                            if (!readingExpandSpoilers) {\n                              states.spoilersMedia[id] = true;\n                            }\n                          }\n                        }}\n                      >\n                        <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '}\n                        {showSpoiler ? t`Show less` : t`Show content`}\n                      </button>\n                    )}\n                  </>\n                )}\n                {!!content && (\n                  <div\n                    class=\"content\"\n                    ref={contentRef}\n                    data-read-more={_(readMoreText)}\n                    inert={!!spoilerText && !showSpoiler ? true : undefined}\n                  >\n                    <PostContent\n                      post={status}\n                      instance={instance}\n                      previewMode={previewMode}\n                    />\n                    <QuoteStatuses id={id} instance={instance} level={quoted} />\n                  </div>\n                )}\n                {!!poll && (\n                  <Poll\n                    lang={language}\n                    poll={poll}\n                    readOnly={readOnly || !sameInstance || !authenticated}\n                    onUpdate={(newPoll) => {\n                      states.statuses[sKey].poll = newPoll;\n                    }}\n                    refresh={() => {\n                      return masto.v1.polls\n                        .$select(poll.id)\n                        .fetch()\n                        .then((pollResponse) => {\n                          states.statuses[sKey].poll = pollResponse;\n                        })\n                        .catch((e) => {}); // Silently fail\n                    }}\n                    votePoll={(choices) => {\n                      return masto.v1.polls\n                        .$select(poll.id)\n                        .votes.create({\n                          choices,\n                        })\n                        .then((pollResponse) => {\n                          states.statuses[sKey].poll = pollResponse;\n                        })\n                        .catch((e) => {}); // Silently fail\n                    }}\n                  />\n                )}\n                {(((enableTranslate || inlineTranslate) &&\n                  isTranslateble(content) &&\n                  differentLanguage) ||\n                  forceTranslate) && (\n                  <TranslationBlock\n                    forceTranslate={forceTranslate || inlineTranslate}\n                    mini={!isSizeLarge && !withinContext}\n                    sourceLanguage={language}\n                    autoDetected={languageAutoDetected}\n                    text={getPostText(status)}\n                  />\n                )}\n                {!previewMode &&\n                  sensitive &&\n                  !!mediaAttachments.length &&\n                  readingExpandMedia !== 'show_all' && (\n                    <button\n                      class={`plain spoiler-media-button ${\n                        showSpoilerMedia ? 'spoiling' : ''\n                      }`}\n                      type=\"button\"\n                      hidden={!readingExpandSpoilers && !!spoilerText}\n                      onClick={(e) => {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        if (showSpoilerMedia) {\n                          delete states.spoilersMedia[id];\n                        } else {\n                          states.spoilersMedia[id] = true;\n                        }\n                      }}\n                    >\n                      <Icon\n                        icon={showSpoilerMedia ? 'eye-open' : 'eye-close'}\n                      />{' '}\n                      {showSpoilerMedia ? t`Show less` : t`Show media`}\n                    </button>\n                  )}\n                {!!mediaAttachments.length &&\n                  (mediaAttachments.length > 1 &&\n                  (isSizeLarge || (withinContext && size === 'm')) ? (\n                    <div class=\"media-large-container\">\n                      {mediaAttachments.map((media, i) => (\n                        <div key={media.id} class={`media-container media-eq1`}>\n                          <Media\n                            media={media}\n                            autoAnimate\n                            showCaption\n                            allowLongerCaption={!content}\n                            lang={language}\n                            to={`/${instance}/s/${id}?${\n                              withinContext ? 'media' : 'media-only'\n                            }=${i + 1}`}\n                            onClick={\n                              onMediaClick\n                                ? (e) => onMediaClick(e, i, media, status)\n                                : undefined\n                            }\n                          />\n                        </div>\n                      ))}\n                    </div>\n                  ) : (\n                    <MultipleMediaFigure\n                      lang={language}\n                      enabled={showMultipleMediaCaptions}\n                      captionChildren={captionChildren}\n                    >\n                      <div\n                        ref={mediaContainerRef}\n                        class={`media-container media-eq${\n                          mediaAttachments.length\n                        } ${mediaAttachments.length > 2 ? 'media-gt2' : ''} ${\n                          mediaAttachments.length > 4 ? 'media-gt4' : ''\n                        }`}\n                      >\n                        {displayedMediaAttachments.map((media, i) => (\n                          <Media\n                            key={media.id}\n                            media={media}\n                            autoAnimate={isSizeLarge}\n                            showCaption={mediaAttachments.length === 1}\n                            allowLongerCaption={\n                              !content && mediaAttachments.length === 1\n                            }\n                            lang={language}\n                            altIndex={\n                              showMultipleMediaCaptions &&\n                              !!media.description &&\n                              i + 1\n                            }\n                            to={`/${instance}/s/${id}?${\n                              withinContext ? 'media' : 'media-only'\n                            }=${i + 1}`}\n                            onClick={\n                              onMediaClick\n                                ? (e) => {\n                                    onMediaClick(e, i, media, status);\n                                  }\n                                : undefined\n                            }\n                            checkAspectRatio={mediaAttachments.length === 1}\n                          />\n                        ))}\n                      </div>\n                    </MultipleMediaFigure>\n                  ))}\n                {!!card &&\n                  /^https/i.test(card?.url) &&\n                  !sensitive &&\n                  !spoilerText &&\n                  !poll &&\n                  !mediaAttachments.length &&\n                  !snapStates.statusQuotes[sKey] && (\n                    <Card\n                      card={card}\n                      selfReferential={\n                        card?.url === status.url || card?.url === status.uri\n                      }\n                      selfAuthor={card?.authors?.some(\n                        (a) => a.account?.url === accountURL,\n                      )}\n                      instance={currentInstance}\n                    />\n                  )}\n              </>\n            )}\n          </div>\n          {!isSizeLarge && showCommentCount && (\n            <div class=\"content-comment-hint insignificant\">\n              <Icon icon=\"comment2\" alt={t`Replies`} /> {repliesCount}\n            </div>\n          )}\n          {isSizeLarge && (\n            <>\n              <div class=\"extra-meta\">\n                {_deleted ? (\n                  <span class=\"status-deleted-tag\">\n                    <Trans>Deleted</Trans>\n                  </span>\n                ) : (\n                  <>\n                    {/* <Icon\n                      icon={visibilityIconsMap[visibility]}\n                      alt={visibilityText[visibility]}\n                    /> */}\n                    <span>{_(visibilityText[visibility])}</span> &bull;{' '}\n                    <a href={url} target=\"_blank\" rel=\"noopener\">\n                      {\n                        // within a day\n                        new Date().getTime() - createdAtDate.getTime() <\n                          86400000 && (\n                          <>\n                            <RelativeTime\n                              datetime={createdAtDate}\n                              format=\"micro\"\n                            />{' '}\n                            ‒{' '}\n                          </>\n                        )\n                      }\n                      {!!createdAt && (\n                        <time\n                          class=\"created\"\n                          datetime={createdAtDate.toISOString()}\n                          title={createdAtDate.toLocaleString()}\n                        >\n                          {createdDateText}\n                        </time>\n                      )}\n                    </a>\n                    {editedAt && (\n                      <>\n                        {' '}\n                        &bull; <Icon icon=\"pencil\" alt={t`Edited`} />{' '}\n                        <time\n                          tabIndex=\"0\"\n                          class=\"edited\"\n                          datetime={editedAtDate.toISOString()}\n                          onClick={() => {\n                            setShowEdited(id);\n                          }}\n                        >\n                          {editedDateText}\n                        </time>\n                      </>\n                    )}\n                  </>\n                )}\n              </div>\n              {!!emojiReactions?.length && (\n                <div class=\"emoji-reactions\">\n                  {emojiReactions.map((emojiReaction) => {\n                    const { name, count, me, url, staticUrl } = emojiReaction;\n                    if (url) {\n                      // Some servers return url and staticUrl\n                      return (\n                        <span\n                          class={`emoji-reaction tag ${\n                            me ? '' : 'insignificant'\n                          }`}\n                        >\n                          <CustomEmoji\n                            alt={name}\n                            url={url}\n                            staticUrl={staticUrl}\n                          />{' '}\n                          {count}\n                        </span>\n                      );\n                    }\n                    const isShortCode = /^:.+?:$/.test(name);\n                    if (isShortCode) {\n                      const emoji = emojis.find(\n                        (e) =>\n                          e.shortcode ===\n                          name.replace(/^:/, '').replace(/:$/, ''),\n                      );\n                      if (emoji) {\n                        return (\n                          <span\n                            class={`emoji-reaction tag ${\n                              me ? '' : 'insignificant'\n                            }`}\n                          >\n                            <CustomEmoji\n                              alt={name}\n                              url={emoji.url}\n                              staticUrl={emoji.staticUrl}\n                            />{' '}\n                            {count}\n                          </span>\n                        );\n                      }\n                    }\n                    return (\n                      <span\n                        class={`emoji-reaction tag ${\n                          me ? '' : 'insignificant'\n                        }`}\n                      >\n                        {name} {count}\n                      </span>\n                    );\n                  })}\n                </div>\n              )}\n              <div class={`actions ${_deleted ? 'disabled' : ''}`}>\n                <div class=\"action has-count\">\n                  <StatusButton\n                    title={t`Reply`}\n                    alt={t`Comments`}\n                    class=\"reply-button\"\n                    icon=\"comment\"\n                    count={repliesCount}\n                    onClick={replyStatus}\n                  />\n                </div>\n                {/* <div class=\"action has-count\">\n                <StatusButton\n                  checked={reblogged}\n                  title={['Boost', 'Unboost']}\n                  alt={['Boost', 'Boosted']}\n                  class=\"reblog-button\"\n                  icon=\"rocket\"\n                  count={reblogsCount}\n                  onClick={boostStatus}\n                  disabled={!canBoost}\n                />\n              </div> */}\n                <div class=\"action has-count\">\n                  <MenuConfirm\n                    disabled={!canBoost}\n                    onClick={confirmBoostStatus}\n                    confirmLabel={\n                      <>\n                        <Icon icon=\"rocket\" />\n                        <span>{reblogged ? t`Unboost` : t`Boost`}</span>\n                      </>\n                    }\n                    menuExtras={\n                      <MenuItem\n                        onClick={() => {\n                          showCompose({\n                            draftStatus: {\n                              status: `\\n${url}`,\n                            },\n                          });\n                        }}\n                      >\n                        <Icon icon=\"quote\" />\n                        <span>\n                          <Trans>Quote</Trans>\n                        </span>\n                      </MenuItem>\n                    }\n                    menuFooter={menuFooter}\n                  >\n                    <StatusButton\n                      checked={reblogged}\n                      title={[t`Boost`, t`Unboost`]}\n                      alt={[t`Boost`, t`Boosted`]}\n                      class=\"reblog-button\"\n                      icon=\"rocket\"\n                      count={reblogsCount}\n                      // onClick={boostStatus}\n                      disabled={!canBoost}\n                    />\n                  </MenuConfirm>\n                </div>\n                <div class=\"action has-count\">\n                  <StatusButton\n                    checked={favourited}\n                    title={[t`Like`, t`Unlike`]}\n                    alt={[t`Like`, t`Liked`]}\n                    class=\"favourite-button\"\n                    icon=\"heart\"\n                    count={favouritesCount}\n                    onClick={favouriteStatus}\n                  />\n                </div>\n                {supports('@mastodon/post-bookmark') && (\n                  <div class=\"action\">\n                    <StatusButton\n                      checked={bookmarked}\n                      title={[t`Bookmark`, t`Unbookmark`]}\n                      alt={[t`Bookmark`, t`Bookmarked`]}\n                      class=\"bookmark-button\"\n                      icon=\"bookmark\"\n                      onClick={bookmarkStatus}\n                    />\n                  </div>\n                )}\n                <Menu2\n                  portal={{\n                    target:\n                      document.querySelector('.status-deck') || document.body,\n                  }}\n                  align=\"end\"\n                  gap={4}\n                  overflow=\"auto\"\n                  viewScroll=\"close\"\n                  menuButton={\n                    <div class=\"action\">\n                      <button\n                        type=\"button\"\n                        title={t`More`}\n                        class=\"plain more-button\"\n                      >\n                        <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n                      </button>\n                    </div>\n                  }\n                >\n                  {StatusMenuItems}{' '}\n                </Menu2>\n              </div>\n            </>\n          )}\n        </div>\n        {!!showEdited && (\n          <Modal\n            onClick={(e) => {\n              if (e.target === e.currentTarget) {\n                setShowEdited(false);\n                // statusRef.current?.focus();\n              }\n            }}\n          >\n            <EditedAtModal\n              statusID={showEdited}\n              instance={instance}\n              fetchStatusHistory={() => {\n                return masto.v1.statuses.$select(showEdited).history.list();\n              }}\n              onClose={() => {\n                setShowEdited(false);\n                statusRef.current?.focus();\n              }}\n            />\n          </Modal>\n        )}\n        {!!showEmbed && (\n          <Modal\n            onClick={(e) => {\n              if (e.target === e.currentTarget) {\n                setShowEmbed(false);\n              }\n            }}\n          >\n            <EmbedModal\n              post={status}\n              instance={instance}\n              onClose={() => {\n                setShowEmbed(false);\n              }}\n            />\n          </Modal>\n        )}\n      </article>\n    </StatusParent>\n  );\n}\n\nfunction MultipleMediaFigure(props) {\n  const { enabled, children, lang, captionChildren } = props;\n  if (!enabled || !captionChildren) return children;\n  return (\n    <figure class=\"media-figure-multiple\">\n      {children}\n      <figcaption lang={lang} dir=\"auto\">\n        {captionChildren}\n      </figcaption>\n    </figure>\n  );\n}\n\nfunction MediaFirstContainer(props) {\n  const { mediaAttachments, language, postID, instance } = props;\n  const moreThanOne = mediaAttachments.length > 1;\n\n  const carouselRef = useRef();\n  const [currentIndex, setCurrentIndex] = useState(0);\n\n  useEffect(() => {\n    let handleScroll = () => {\n      const { clientWidth, scrollLeft } = carouselRef.current;\n      const index = Math.round(Math.abs(scrollLeft) / clientWidth);\n      setCurrentIndex(index);\n    };\n    if (carouselRef.current) {\n      carouselRef.current.addEventListener('scroll', handleScroll, {\n        passive: true,\n      });\n    }\n    return () => {\n      if (carouselRef.current) {\n        carouselRef.current.removeEventListener('scroll', handleScroll);\n      }\n    };\n  }, []);\n\n  return (\n    <>\n      <div class=\"media-first-container\">\n        <div class=\"media-first-carousel\" ref={carouselRef}>\n          {mediaAttachments.map((media, i) => (\n            <div class=\"media-first-item\" key={media.id}>\n              <Media\n                media={media}\n                lang={language}\n                to={`/${instance}/s/${postID}?media=${i + 1}`}\n              />\n            </div>\n          ))}\n        </div>\n        {moreThanOne && (\n          <div class=\"media-carousel-controls\">\n            <div class=\"carousel-indexer\">\n              {currentIndex + 1}/{mediaAttachments.length}\n            </div>\n            <label class=\"media-carousel-button\">\n              <button\n                type=\"button\"\n                class=\"carousel-button\"\n                hidden={currentIndex === 0}\n                onClick={(e) => {\n                  e.preventDefault();\n                  e.stopPropagation();\n                  carouselRef.current.focus();\n                  carouselRef.current.scrollTo({\n                    left:\n                      carouselRef.current.clientWidth *\n                      (currentIndex - 1) *\n                      (isRTL() ? -1 : 1),\n                    behavior: 'smooth',\n                  });\n                }}\n              >\n                <Icon icon=\"arrow-left\" />\n              </button>\n            </label>\n            <label class=\"media-carousel-button\">\n              <button\n                type=\"button\"\n                class=\"carousel-button\"\n                hidden={currentIndex === mediaAttachments.length - 1}\n                onClick={(e) => {\n                  e.preventDefault();\n                  e.stopPropagation();\n                  carouselRef.current.focus();\n                  carouselRef.current.scrollTo({\n                    left:\n                      carouselRef.current.clientWidth *\n                      (currentIndex + 1) *\n                      (isRTL() ? -1 : 1),\n                    behavior: 'smooth',\n                  });\n                }}\n              >\n                <Icon icon=\"arrow-right\" />\n              </button>\n            </label>\n          </div>\n        )}\n      </div>\n      {moreThanOne && (\n        <div\n          class=\"media-carousel-dots\"\n          style={{\n            '--dots-count': mediaAttachments.length,\n          }}\n        >\n          {mediaAttachments.map((media, i) => (\n            <span\n              key={media.id}\n              class={`carousel-dot ${i === currentIndex ? 'active' : ''}`}\n            />\n          ))}\n        </div>\n      )}\n    </>\n  );\n}\n\nfunction getDomain(url) {\n  return punycode.toUnicode(\n    URL.parse(url)\n      .hostname.replace(/^www\\./, '')\n      .replace(/\\/$/, ''),\n  );\n}\n\n// \"Post\": Quote post + card link preview combo\n// Assume all links from these domains are \"posts\"\n// Mastodon links are \"posts\" too but they are converted to real quote posts and there's too many domains to check\n// This is just \"Progressive Enhancement\"\nfunction isCardPost(domain) {\n  return ['x.com', 'twitter.com', 'threads.net', 'bsky.app'].includes(domain);\n}\n\nfunction Byline({ authors, hidden, children }) {\n  if (hidden) return children;\n  if (!authors?.[0]?.account?.id) return children;\n  const author = authors[0].account;\n\n  return (\n    <div class=\"card-byline\">\n      {children}\n      <div class=\"card-byline-author\">\n        <Icon icon=\"link\" size=\"s\" />{' '}\n        <small>\n          <Trans comment=\"More from [Author]\">\n            More from <NameText account={author} showAvatar />\n          </Trans>\n        </small>\n      </div>\n    </div>\n  );\n}\n\nfunction Card({ card, selfReferential, selfAuthor, instance }) {\n  const snapStates = useSnapshot(states);\n  const {\n    blurhash,\n    title,\n    description,\n    html,\n    providerName,\n    providerUrl,\n    authorName,\n    authorUrl,\n    width,\n    height,\n    image,\n    imageDescription,\n    url,\n    type,\n    embedUrl,\n    language,\n    publishedAt,\n    authors,\n  } = card;\n\n  /* type\n  link = Link OEmbed\n  photo = Photo OEmbed\n  video = Video OEmbed\n  rich = iframe OEmbed. Not currently accepted, so won’t show up in practice.\n  */\n\n  const hasText = title || providerName || authorName;\n  const isLandscape = width / height >= 1.2;\n  const size = isLandscape ? 'large' : '';\n\n  const [cardStatusURL, setCardStatusURL] = useState(null);\n  // const [cardStatusID, setCardStatusID] = useState(null);\n  useEffect(() => {\n    if (hasText && image && !selfReferential && isMastodonLinkMaybe(url)) {\n      unfurlMastodonLink(instance, url).then((result) => {\n        if (!result) return;\n        const { id, url } = result;\n        setCardStatusURL('#' + url);\n\n        // NOTE: This is for quote post\n        // (async () => {\n        //   const { masto } = api({ instance });\n        //   const status = await masto.v1.statuses.$select(id).fetch();\n        //   saveStatus(status, instance);\n        //   setCardStatusID(id);\n        // })();\n      });\n    }\n  }, [hasText, image, selfReferential]);\n\n  // if (cardStatusID) {\n  //   return (\n  //     <Status statusID={cardStatusID} instance={instance} size=\"s\" readOnly />\n  //   );\n  // }\n\n  if (snapStates.unfurledLinks[url]) return null;\n\n  const hasIframeHTML = /<iframe/i.test(html);\n  const handleClick = useCallback(\n    (e) => {\n      if (hasIframeHTML) {\n        e.preventDefault();\n        states.showEmbedModal = {\n          html,\n          url: url || embedUrl,\n          width,\n          height,\n        };\n      }\n    },\n    [hasIframeHTML],\n  );\n\n  const [blurhashImage, setBlurhashImage] = useState(null);\n  if (hasText && (image || (type === 'photo' && blurhash))) {\n    const domain = getDomain(url);\n    const rgbAverageColor =\n      image && blurhash ? getBlurHashAverageColor(blurhash) : null;\n    if (!image) {\n      const w = 44;\n      const h = 44;\n      const blurhashPixels = decodeBlurHash(blurhash, w, h);\n      const canvas = window.OffscreenCanvas\n        ? new OffscreenCanvas(1, 1)\n        : document.createElement('canvas');\n      canvas.width = w;\n      canvas.height = h;\n      const ctx = canvas.getContext('2d');\n      ctx.imageSmoothingEnabled = false;\n      const imageData = ctx.createImageData(w, h);\n      imageData.data.set(blurhashPixels);\n      ctx.putImageData(imageData, 0, 0);\n      try {\n        if (window.OffscreenCanvas) {\n          canvas.convertToBlob().then((blob) => {\n            setBlurhashImage(URL.createObjectURL(blob));\n          });\n        } else {\n          setBlurhashImage(canvas.toDataURL());\n        }\n      } catch (e) {\n        // Silently fail\n        console.error(e);\n      }\n    }\n\n    const isPost = isCardPost(domain);\n\n    return (\n      <Byline hidden={!!selfAuthor} authors={authors}>\n        <a\n          href={cardStatusURL || url}\n          target={cardStatusURL ? null : '_blank'}\n          rel=\"nofollow noopener\"\n          class={`card link ${isPost ? 'card-post' : ''} ${\n            blurhashImage ? '' : size\n          }`}\n          style={{\n            '--average-color':\n              rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n          }}\n          onClick={handleClick}\n        >\n          <div class=\"card-image\">\n            <img\n              src={image || blurhashImage}\n              width={width}\n              height={height}\n              loading=\"lazy\"\n              decoding=\"async\"\n              fetchPriority=\"low\"\n              alt={imageDescription || ''}\n              onError={(e) => {\n                try {\n                  e.target.style.display = 'none';\n                } catch (e) {}\n              }}\n              style={{\n                '--anim-duration':\n                  width &&\n                  height &&\n                  `${Math.min(\n                    Math.max(Math.max(width, height) / 100, 5),\n                    120,\n                  )}s`,\n              }}\n            />\n          </div>\n          <div class=\"meta-container\" lang={language}>\n            <p class=\"meta domain\">\n              <span class=\"domain\">{domain}</span>{' '}\n              {!!publishedAt && <>&middot; </>}\n              {!!publishedAt && (\n                <>\n                  <RelativeTime datetime={publishedAt} format=\"micro\" />\n                </>\n              )}\n            </p>\n            <p class=\"title\" dir=\"auto\" title={title}>\n              {title}\n            </p>\n            <p class=\"meta\" dir=\"auto\" title={description}>\n              {description ||\n                (!!publishedAt && (\n                  <RelativeTime datetime={publishedAt} format=\"micro\" />\n                ))}\n            </p>\n          </div>\n        </a>\n      </Byline>\n    );\n  } else if (type === 'photo') {\n    return (\n      <a\n        href={url}\n        target=\"_blank\"\n        rel=\"nofollow noopener\"\n        class=\"card photo\"\n        onClick={handleClick}\n      >\n        <img\n          src={embedUrl}\n          width={width}\n          height={height}\n          alt={title || description}\n          loading=\"lazy\"\n          style={{\n            height: 'auto',\n            aspectRatio: `${width}/${height}`,\n          }}\n        />\n      </a>\n    );\n  } else {\n    if (type === 'video') {\n      if (/youtube/i.test(providerName)) {\n        // Get ID from e.g. https://www.youtube.com/watch?v=[VIDEO_ID]\n        const videoID = url.match(/watch\\?v=([^&]+)/)?.[1];\n        if (videoID) {\n          return (\n            <a class=\"card video\" onClick={handleClick}>\n              <lite-youtube videoid={videoID} nocookie autoPause></lite-youtube>\n            </a>\n          );\n        }\n      }\n      // return (\n      //   <div\n      //     class=\"card video\"\n      //     style={{\n      //       aspectRatio: `${width}/${height}`,\n      //     }}\n      //     dangerouslySetInnerHTML={{ __html: html }}\n      //   />\n      // );\n    }\n    if (hasText && !image) {\n      const domain = getDomain(url);\n      const isPost = isCardPost(domain);\n      return (\n        <a\n          href={cardStatusURL || url}\n          target={cardStatusURL ? null : '_blank'}\n          rel=\"nofollow noopener\"\n          class={`card link ${isPost ? 'card-post' : ''} no-image`}\n          lang={language}\n          dir=\"auto\"\n          onClick={handleClick}\n        >\n          <div class=\"meta-container\">\n            <p class=\"meta domain\">\n              <span class=\"domain\">\n                <Icon icon=\"link\" size=\"s\" /> <span>{domain}</span>\n              </span>{' '}\n              {!!publishedAt && <>&middot; </>}\n              {!!publishedAt && (\n                <>\n                  <RelativeTime datetime={publishedAt} format=\"micro\" />\n                </>\n              )}\n            </p>\n            <p class=\"title\" title={title}>\n              {title}\n            </p>\n            <p class=\"meta\" title={description || providerName || authorName}>\n              {description || providerName || authorName}\n            </p>\n          </div>\n        </a>\n      );\n    }\n  }\n}\n\nfunction EditedAtModal({\n  statusID,\n  instance,\n  fetchStatusHistory = () => {},\n  onClose,\n}) {\n  const { t } = useLingui();\n  const [uiState, setUIState] = useState('default');\n  const [editHistory, setEditHistory] = useState([]);\n\n  useEffect(() => {\n    setUIState('loading');\n    (async () => {\n      try {\n        const editHistory = await fetchStatusHistory();\n        console.log(editHistory);\n        setEditHistory(editHistory);\n        setUIState('default');\n      } catch (e) {\n        console.error(e);\n        setUIState('error');\n      }\n    })();\n  }, []);\n\n  return (\n    <div id=\"edit-history\" class=\"sheet\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <h2>\n          <Trans>Edit History</Trans>\n        </h2>\n        {uiState === 'error' && (\n          <p>\n            <Trans>Failed to load history</Trans>\n          </p>\n        )}\n        {uiState === 'loading' && (\n          <p>\n            <Loader abrupt /> <Trans>Loading…</Trans>\n          </p>\n        )}\n      </header>\n      <main tabIndex=\"-1\">\n        {editHistory.length > 0 && (\n          <ol>\n            {editHistory.map((status) => {\n              const { createdAt } = status;\n              const createdAtDate = new Date(createdAt);\n              return (\n                <li key={createdAt} class=\"history-item\">\n                  <h3>\n                    <time>\n                      {niceDateTime(createdAtDate, {\n                        formatOpts: {\n                          weekday: 'short',\n                          second: 'numeric',\n                        },\n                      })}\n                    </time>\n                  </h3>\n                  <Status\n                    status={status}\n                    instance={instance}\n                    size=\"s\"\n                    withinContext\n                    readOnly\n                    previewMode\n                  />\n                </li>\n              );\n            })}\n          </ol>\n        )}\n      </main>\n    </div>\n  );\n}\n\nfunction generateHTMLCode(post, instance, level = 0) {\n  const {\n    account: {\n      url: accountURL,\n      displayName,\n      acct,\n      username,\n      emojis: accountEmojis,\n      bot,\n      group,\n    },\n    id,\n    poll,\n    spoilerText,\n    language,\n    editedAt,\n    createdAt,\n    content,\n    mediaAttachments,\n    url,\n    emojis,\n  } = post;\n\n  const sKey = statusKey(id, instance);\n  const quotes = states.statusQuotes[sKey] || [];\n  const uniqueQuotes = quotes.filter(\n    (q, i, arr) => arr.findIndex((q2) => q2.url === q.url) === i,\n  );\n  const quoteStatusesHTML =\n    uniqueQuotes.length && level <= 2\n      ? uniqueQuotes\n          .map((quote) => {\n            const { id, instance } = quote;\n            const sKey = statusKey(id, instance);\n            const s = states.statuses[sKey];\n            if (s) {\n              return generateHTMLCode(s, instance, ++level);\n            }\n          })\n          .join('')\n      : '';\n\n  const createdAtDate = new Date(createdAt);\n  // const editedAtDate = editedAt && new Date(editedAt);\n\n  const contentHTML =\n    emojifyText(content, emojis) +\n    '\\n' +\n    quoteStatusesHTML +\n    '\\n' +\n    (poll?.options?.length\n      ? `\n        <p>📊:</p>\n        <ul>\n        ${poll.options\n          .map(\n            (option) => `\n              <li>\n                ${option.title}\n                ${option.votesCount >= 0 ? ` (${option.votesCount})` : ''}\n              </li>\n            `,\n          )\n          .join('')}\n        </ul>`\n      : '') +\n    (mediaAttachments.length > 0\n      ? '\\n' +\n        mediaAttachments\n          .map((media) => {\n            const {\n              description,\n              meta,\n              previewRemoteUrl,\n              previewUrl,\n              remoteUrl,\n              url,\n              type,\n            } = media;\n            const { original = {}, small } = meta || {};\n            const width = small?.width || original?.width;\n            const height = small?.height || original?.height;\n\n            // Prefer remote over original\n            const sourceMediaURL = remoteUrl || url;\n            const previewMediaURL = previewRemoteUrl || previewUrl;\n            const mediaURL = previewMediaURL || sourceMediaURL;\n\n            const sourceMediaURLObj = sourceMediaURL\n              ? URL.parse(sourceMediaURL)\n              : null;\n            const isVideoMaybe =\n              type === 'unknown' &&\n              sourceMediaURLObj &&\n              /\\.(mp4|m4r|m4v|mov|webm)$/i.test(sourceMediaURLObj.pathname);\n            const isAudioMaybe =\n              type === 'unknown' &&\n              sourceMediaURLObj &&\n              /\\.(mp3|ogg|wav|m4a|m4p|m4b)$/i.test(sourceMediaURLObj.pathname);\n            const isImage =\n              type === 'image' ||\n              (type === 'unknown' &&\n                previewMediaURL &&\n                !isVideoMaybe &&\n                !isAudioMaybe);\n            const isVideo = type === 'gifv' || type === 'video' || isVideoMaybe;\n            const isAudio = type === 'audio' || isAudioMaybe;\n\n            let mediaHTML = '';\n            if (isImage) {\n              mediaHTML = `<img src=\"${mediaURL}\" width=\"${width}\" height=\"${height}\" alt=\"${description}\" loading=\"lazy\" />`;\n            } else if (isVideo) {\n              mediaHTML = `\n                <video src=\"${sourceMediaURL}\" width=\"${width}\" height=\"${height}\" controls preload=\"auto\" poster=\"${previewMediaURL}\" loading=\"lazy\"></video>\n                ${description ? `<figcaption>${description}</figcaption>` : ''}\n              `;\n            } else if (isAudio) {\n              mediaHTML = `\n                <audio src=\"${sourceMediaURL}\" controls preload=\"auto\"></audio>\n                ${description ? `<figcaption>${description}</figcaption>` : ''}\n              `;\n            } else {\n              mediaHTML = `\n                <a href=\"${sourceMediaURL}\">📄 ${\n                  description || sourceMediaURL\n                }</a>\n              `;\n            }\n\n            return `<figure>${mediaHTML}</figure>`;\n          })\n          .join('\\n')\n      : '');\n\n  const htmlCode = `\n    <blockquote lang=\"${language}\" cite=\"${url}\" data-source=\"fediverse\">\n      ${\n        spoilerText\n          ? `\n            <details>\n              <summary>${spoilerText}</summary>\n              ${contentHTML}\n            </details>\n          `\n          : contentHTML\n      }\n      <footer>\n        — ${emojifyText(\n          displayName,\n          accountEmojis,\n        )} (@${acct}) ${!!createdAt ? `<a href=\"${url}\"><time datetime=\"${createdAtDate.toISOString()}\">${createdAtDate.toLocaleString()}</time></a>` : ''}\n      </footer>\n    </blockquote>\n  `;\n\n  return prettify(htmlCode);\n}\n\nfunction EmbedModal({ post, instance, onClose }) {\n  const { t } = useLingui();\n  const {\n    account: {\n      url: accountURL,\n      displayName,\n      username,\n      emojis: accountEmojis,\n      bot,\n      group,\n    },\n    id,\n    poll,\n    spoilerText,\n    language,\n    editedAt,\n    createdAt,\n    content,\n    mediaAttachments,\n    url,\n    emojis,\n  } = post;\n\n  const htmlCode = generateHTMLCode(post, instance);\n  return (\n    <div id=\"embed-post\" class=\"sheet\">\n      {!!onClose && (\n        <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n          <Icon icon=\"x\" alt={t`Close`} />\n        </button>\n      )}\n      <header>\n        <h2>\n          <Trans>Embed post</Trans>\n        </h2>\n      </header>\n      <main tabIndex=\"-1\">\n        <h3>\n          <Trans>HTML Code</Trans>\n        </h3>\n        <textarea\n          class=\"embed-code\"\n          readonly\n          onClick={(e) => {\n            e.target.select();\n          }}\n          dir=\"auto\"\n        >\n          {htmlCode}\n        </textarea>\n        <button\n          type=\"button\"\n          onClick={() => {\n            try {\n              navigator.clipboard.writeText(htmlCode);\n              showToast(t`HTML code copied`);\n            } catch (e) {\n              console.error(e);\n              showToast(t`Unable to copy HTML code`);\n            }\n          }}\n        >\n          <Icon icon=\"clipboard\" />{' '}\n          <span>\n            <Trans>Copy</Trans>\n          </span>\n        </button>\n        {!!mediaAttachments?.length && (\n          <section>\n            <p>\n              <Trans>Media attachments:</Trans>\n            </p>\n            <ol class=\"links-list\">\n              {mediaAttachments.map((media) => {\n                return (\n                  <li key={media.id}>\n                    <a\n                      href={media.remoteUrl || media.url}\n                      target=\"_blank\"\n                      download\n                    >\n                      {media.remoteUrl || media.url}\n                    </a>\n                  </li>\n                );\n              })}\n            </ol>\n          </section>\n        )}\n        {!!accountEmojis?.length && (\n          <section>\n            <p>\n              <Trans>Account Emojis:</Trans>\n            </p>\n            <ul>\n              {accountEmojis.map((emoji) => {\n                return (\n                  <li key={emoji.shortcode}>\n                    <picture>\n                      <source\n                        srcset={emoji.staticUrl}\n                        media=\"(prefers-reduced-motion: reduce)\"\n                      ></source>\n                      <img\n                        class=\"shortcode-emoji emoji\"\n                        src={emoji.url}\n                        alt={`:${emoji.shortcode}:`}\n                        width=\"16\"\n                        height=\"16\"\n                        loading=\"lazy\"\n                        decoding=\"async\"\n                      />\n                    </picture>{' '}\n                    <code>:{emoji.shortcode}:</code> (\n                    <a href={emoji.url} target=\"_blank\" download>\n                      URL\n                    </a>\n                    )\n                    {emoji.staticUrl ? (\n                      <>\n                        {' '}\n                        (\n                        <a href={emoji.staticUrl} target=\"_blank\" download>\n                          <Trans>static URL</Trans>\n                        </a>\n                        )\n                      </>\n                    ) : null}\n                  </li>\n                );\n              })}\n            </ul>\n          </section>\n        )}\n        {!!emojis?.length && (\n          <section>\n            <p>\n              <Trans>Emojis:</Trans>\n            </p>\n            <ul>\n              {emojis.map((emoji) => {\n                return (\n                  <li key={emoji.shortcode}>\n                    <picture>\n                      <source\n                        srcset={emoji.staticUrl}\n                        media=\"(prefers-reduced-motion: reduce)\"\n                      ></source>\n                      <img\n                        class=\"shortcode-emoji emoji\"\n                        src={emoji.url}\n                        alt={`:${emoji.shortcode}:`}\n                        width=\"16\"\n                        height=\"16\"\n                        loading=\"lazy\"\n                        decoding=\"async\"\n                      />\n                    </picture>{' '}\n                    <code>:{emoji.shortcode}:</code> (\n                    <a href={emoji.url} target=\"_blank\" download>\n                      URL\n                    </a>\n                    )\n                    {emoji.staticUrl ? (\n                      <>\n                        {' '}\n                        (\n                        <a href={emoji.staticUrl} target=\"_blank\" download>\n                          <Trans>static URL</Trans>\n                        </a>\n                        )\n                      </>\n                    ) : null}\n                  </li>\n                );\n              })}\n            </ul>\n          </section>\n        )}\n        <section>\n          <small>\n            <p>\n              <Trans>Notes:</Trans>\n            </p>\n            <ul>\n              <li>\n                <Trans>\n                  This is static, unstyled and scriptless. You may need to apply\n                  your own styles and edit as needed.\n                </Trans>\n              </li>\n              <li>\n                <Trans>\n                  Polls are not interactive, becomes a list with vote counts.\n                </Trans>\n              </li>\n              <li>\n                <Trans>\n                  Media attachments can be images, videos, audios or any file\n                  types.\n                </Trans>\n              </li>\n              <li>\n                <Trans>Post could be edited or deleted later.</Trans>\n              </li>\n            </ul>\n          </small>\n        </section>\n        <h3>\n          <Trans>Preview</Trans>\n        </h3>\n        <output\n          class=\"embed-preview\"\n          dangerouslySetInnerHTML={{ __html: htmlCode }}\n          dir=\"auto\"\n        />\n        <p>\n          <small>\n            <Trans>Note: This preview is lightly styled.</Trans>\n          </small>\n        </p>\n      </main>\n    </div>\n  );\n}\n\nconst StatusButton = forwardRef((props, ref) => {\n  let {\n    checked,\n    count,\n    class: className,\n    title,\n    alt,\n    size,\n    icon,\n    iconSize = 'l',\n    onClick,\n    ...otherProps\n  } = props;\n  if (typeof title === 'string') {\n    title = [title, title];\n  }\n  if (typeof alt === 'string') {\n    alt = [alt, alt];\n  }\n\n  const [buttonTitle, setButtonTitle] = useState(title[0] || '');\n  const [iconAlt, setIconAlt] = useState(alt[0] || '');\n\n  useEffect(() => {\n    if (checked) {\n      setButtonTitle(title[1] || '');\n      setIconAlt(alt[1] || '');\n    } else {\n      setButtonTitle(title[0] || '');\n      setIconAlt(alt[0] || '');\n    }\n  }, [checked, title, alt]);\n\n  return (\n    <button\n      ref={ref}\n      type=\"button\"\n      title={buttonTitle}\n      class={`plain ${size ? 'small' : ''} ${className} ${\n        checked ? 'checked' : ''\n      }`}\n      onClick={(e) => {\n        if (!onClick) return;\n        e.preventDefault();\n        e.stopPropagation();\n        onClick(e);\n      }}\n      {...otherProps}\n    >\n      <Icon icon={icon} size={iconSize} alt={iconAlt} />\n      {!!count && (\n        <>\n          {' '}\n          <small title={count}>{shortenNumber(count)}</small>\n        </>\n      )}\n    </button>\n  );\n});\n\nfunction nicePostURL(url) {\n  if (!url) return;\n  const urlObj = URL.parse(url);\n  const { host, pathname } = urlObj;\n  const path = pathname.replace(/\\/$/, '');\n  // split only first slash\n  const [_, username, restPath] = path.match(/\\/(@[^\\/]+)\\/(.*)/) || [];\n  return (\n    <>\n      {punycode.toUnicode(host)}\n      {username ? (\n        <>\n          /{username}\n          <wbr />\n          <span class=\"more-insignificant\">/{restPath}</span>\n        </>\n      ) : (\n        <span class=\"more-insignificant\">{path}</span>\n      )}\n    </>\n  );\n}\n\nfunction StatusCompact({ sKey }) {\n  const snapStates = useSnapshot(states);\n  const statusReply = snapStates.statusReply[sKey];\n  if (!statusReply) return null;\n\n  const { id, instance } = statusReply;\n  const status = getStatus(id, instance);\n  if (!status) return null;\n\n  const {\n    sensitive,\n    spoilerText,\n    account: { avatar, avatarStatic, bot } = {},\n    visibility,\n    content,\n    language,\n    filtered,\n  } = status;\n  if (sensitive || spoilerText) return null;\n  if (!content) return null;\n\n  const srKey = statusKey(id, instance);\n  const statusPeekText = statusPeek(status);\n\n  const filterContext = useContext(FilterContext);\n  const filterInfo = isFiltered(filtered, filterContext);\n\n  if (filterInfo?.action === 'hide') return null;\n\n  const filterTitleStr = filterInfo?.titlesStr || '';\n\n  return (\n    <article\n      class={`status compact-reply ${\n        visibility === 'direct' ? 'visibility-direct' : ''\n      }`}\n      tabindex=\"-1\"\n      data-state-post-id={srKey}\n    >\n      <Avatar url={avatarStatic || avatar} squircle={bot} />\n      <div\n        class=\"content-compact\"\n        title={statusPeekText}\n        lang={language}\n        dir=\"auto\"\n      >\n        {filterInfo ? (\n          <b class=\"status-filtered-badge badge-meta\" title={filterTitleStr}>\n            <span>\n              <Trans>Filtered</Trans>\n            </span>\n            <span>{filterTitleStr}</span>\n          </b>\n        ) : (\n          <span>{statusPeekText}</span>\n        )}\n      </div>\n    </article>\n  );\n}\n\nfunction FilteredStatus({\n  status,\n  filterInfo,\n  instance,\n  containerProps = {},\n  showFollowedTags,\n  quoted,\n}) {\n  const { _, t } = useLingui();\n  const snapStates = useSnapshot(states);\n  const {\n    id: statusID,\n    account: { avatar, avatarStatic, bot, group },\n    createdAt,\n    visibility,\n    reblog,\n  } = status;\n  const isReblog = !!reblog;\n  const filterTitleStr = filterInfo?.titlesStr || '';\n  const createdAtDate = new Date(createdAt);\n  const statusPeekText = statusPeek(status.reblog || status);\n\n  const [showPeek, setShowPeek] = useState(false);\n  const bindLongPressPeek = useLongPress(\n    () => {\n      setShowPeek(true);\n    },\n    {\n      threshold: 600,\n      captureEvent: true,\n      detect: 'touch',\n      cancelOnMovement: 2, // true allows movement of up to 25 pixels\n    },\n  );\n\n  const statusPeekRef = useTruncated();\n  const sKey = statusKey(status.id, instance);\n  const ssKey =\n    statusKey(status.id, instance) +\n    ' ' +\n    (statusKey(reblog?.id, instance) || '');\n\n  const actualStatusID = reblog?.id || statusID;\n  const url = instance\n    ? `/${instance}/s/${actualStatusID}`\n    : `/s/${actualStatusID}`;\n  const isFollowedTags =\n    showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length;\n\n  return (\n    <div\n      class={\n        quoted\n          ? ''\n          : isReblog\n            ? group\n              ? 'status-group'\n              : 'status-reblog'\n            : isFollowedTags\n              ? 'status-followed-tags'\n              : ''\n      }\n      {...containerProps}\n      // title={statusPeekText}\n      onContextMenu={(e) => {\n        e.preventDefault();\n        setShowPeek(true);\n      }}\n      {...bindLongPressPeek()}\n    >\n      <article\n        data-state-post-id={ssKey}\n        class={`status filtered ${quoted ? 'status-card' : ''}`}\n        tabindex=\"-1\"\n      >\n        <b\n          class=\"status-filtered-badge clickable badge-meta\"\n          title={filterTitleStr}\n          onClick={(e) => {\n            e.preventDefault();\n            setShowPeek(true);\n          }}\n        >\n          <span>\n            <Trans>Filtered</Trans>\n          </span>\n          <span>{filterTitleStr}</span>\n        </b>{' '}\n        <Avatar url={avatarStatic || avatar} squircle={bot} />\n        <span class=\"status-filtered-info\">\n          <span class=\"status-filtered-info-1\">\n            {isReblog ? (\n              <Trans comment=\"[Name] [Visibility icon] boosted\">\n                <NameText account={status.account} instance={instance} />{' '}\n                <Icon\n                  icon={visibilityIconsMap[visibility]}\n                  alt={_(visibilityText[visibility])}\n                  size=\"s\"\n                />{' '}\n                boosted\n              </Trans>\n            ) : isFollowedTags ? (\n              <>\n                <NameText account={status.account} instance={instance} />{' '}\n                <Icon\n                  icon={visibilityIconsMap[visibility]}\n                  alt={_(visibilityText[visibility])}\n                  size=\"s\"\n                />{' '}\n                <span>\n                  {snapStates.statusFollowedTags[sKey]\n                    .slice(0, 3)\n                    .map((tag) => (\n                      <span key={tag} class=\"status-followed-tag-item\">\n                        #{tag}\n                      </span>\n                    ))}\n                </span>\n              </>\n            ) : (\n              <>\n                <NameText account={status.account} instance={instance} />{' '}\n                <Icon\n                  icon={visibilityIconsMap[visibility]}\n                  alt={_(visibilityText[visibility])}\n                  size=\"s\"\n                />{' '}\n                <RelativeTime datetime={createdAtDate} format=\"micro\" />\n              </>\n            )}\n          </span>\n          <span class=\"status-filtered-info-2\">\n            {isReblog && (\n              <>\n                <Avatar\n                  url={reblog.account.avatarStatic || reblog.account.avatar}\n                  squircle={bot}\n                />{' '}\n              </>\n            )}\n            {statusPeekText}\n          </span>\n        </span>\n      </article>\n      {!!showPeek && (\n        <Modal\n          onClick={(e) => {\n            if (e.target === e.currentTarget) {\n              setShowPeek(false);\n            }\n          }}\n        >\n          <div id=\"filtered-status-peek\" class=\"sheet\">\n            <button\n              type=\"button\"\n              class=\"sheet-close\"\n              onClick={() => setShowPeek(false)}\n            >\n              <Icon icon=\"x\" alt={t`Close`} />\n            </button>\n            <header>\n              <b class=\"status-filtered-badge\">\n                <Trans>Filtered</Trans>\n              </b>{' '}\n              {filterTitleStr}\n            </header>\n            <main tabIndex=\"-1\">\n              <Link\n                ref={statusPeekRef}\n                class=\"status-link\"\n                to={url}\n                onClick={() => {\n                  setShowPeek(false);\n                }}\n                data-read-more={_(readMoreText)}\n              >\n                <Status status={status} instance={instance} size=\"s\" readOnly />\n              </Link>\n            </main>\n          </div>\n        </Modal>\n      )}\n    </div>\n  );\n}\n\nconst QuoteStatuses = memo(({ id, instance, level = 0 }) => {\n  if (!id || !instance) return;\n  const { _ } = useLingui();\n  const snapStates = useSnapshot(states);\n  const sKey = statusKey(id, instance);\n  const quotes = snapStates.statusQuotes[sKey];\n  const uniqueQuotes = quotes?.filter(\n    (q, i, arr) => arr.findIndex((q2) => q2.url === q.url) === i,\n  );\n\n  if (!uniqueQuotes?.length) return;\n  if (level > 2) return;\n\n  return uniqueQuotes.map((q) => {\n    return (\n      <LazyShazam id={q.instance + q.id}>\n        <Link\n          key={q.instance + q.id}\n          to={`${q.instance ? `/${q.instance}` : ''}/s/${q.id}`}\n          class=\"status-card-link\"\n          data-read-more={_(readMoreText)}\n        >\n          <Status\n            statusID={q.id}\n            instance={q.instance}\n            size=\"s\"\n            quoted={level + 1}\n            enableCommentHint\n          />\n        </Link>\n      </LazyShazam>\n    );\n  });\n});\n\nexport default memo(Status, (oldProps, newProps) => {\n  // Shallow equal all props except 'status'\n  // This will be pure static until status ID changes\n  const { status, ...restOldProps } = oldProps;\n  const { status: newStatus, ...restNewProps } = newProps;\n  return (\n    status?.id === newStatus?.id && shallowEqual(restOldProps, restNewProps)\n  );\n});\n","var IDX=36, HEX='';\nwhile (IDX--) HEX += IDX.toString(36);\n\nexport function uid(len) {\n\tvar str='', num = len || 11;\n\twhile (num--) str += HEX[Math.random() * 36 | 0];\n\treturn str;\n}\n","/**\n * Fuse.js v7.1.0 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2025 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n  return !Array.isArray\n    ? getTag(value) === '[object Array]'\n    : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value\n  }\n  let result = value + '';\n  return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n  return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n  return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n  return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n  return (\n    value === true ||\n    value === false ||\n    (isObjectLike(value) && getTag(value) == '[object Boolean]')\n  )\n}\n\nfunction isObject(value) {\n  return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n  return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n  return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n  return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n  return value == null\n    ? value === undefined\n      ? '[object Undefined]'\n      : '[object Null]'\n    : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n  `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n  `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n  `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n  constructor(keys) {\n    this._keys = [];\n    this._keyMap = {};\n\n    let totalWeight = 0;\n\n    keys.forEach((key) => {\n      let obj = createKey(key);\n\n      this._keys.push(obj);\n      this._keyMap[obj.id] = obj;\n\n      totalWeight += obj.weight;\n    });\n\n    // Normalize weights so that their sum is equal to 1\n    this._keys.forEach((key) => {\n      key.weight /= totalWeight;\n    });\n  }\n  get(keyId) {\n    return this._keyMap[keyId]\n  }\n  keys() {\n    return this._keys\n  }\n  toJSON() {\n    return JSON.stringify(this._keys)\n  }\n}\n\nfunction createKey(key) {\n  let path = null;\n  let id = null;\n  let src = null;\n  let weight = 1;\n  let getFn = null;\n\n  if (isString(key) || isArray(key)) {\n    src = key;\n    path = createKeyPath(key);\n    id = createKeyId(key);\n  } else {\n    if (!hasOwn.call(key, 'name')) {\n      throw new Error(MISSING_KEY_PROPERTY('name'))\n    }\n\n    const name = key.name;\n    src = name;\n\n    if (hasOwn.call(key, 'weight')) {\n      weight = key.weight;\n\n      if (weight <= 0) {\n        throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n      }\n    }\n\n    path = createKeyPath(name);\n    id = createKeyId(name);\n    getFn = key.getFn;\n  }\n\n  return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n  return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n  return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n  let list = [];\n  let arr = false;\n\n  const deepGet = (obj, path, index) => {\n    if (!isDefined(obj)) {\n      return\n    }\n    if (!path[index]) {\n      // If there's no path left, we've arrived at the object we care about.\n      list.push(obj);\n    } else {\n      let key = path[index];\n\n      const value = obj[key];\n\n      if (!isDefined(value)) {\n        return\n      }\n\n      // If we're at the last value in the path, and if it's a string/number/bool,\n      // add it to the list\n      if (\n        index === path.length - 1 &&\n        (isString(value) || isNumber(value) || isBoolean(value))\n      ) {\n        list.push(toString(value));\n      } else if (isArray(value)) {\n        arr = true;\n        // Search each item in the array.\n        for (let i = 0, len = value.length; i < len; i += 1) {\n          deepGet(value[i], path, index + 1);\n        }\n      } else if (path.length) {\n        // An object. Recurse further.\n        deepGet(value, path, index + 1);\n      }\n    }\n  };\n\n  // Backwards compatibility (since path used to be a string)\n  deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n  return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n  // Whether the matches should be included in the result set. When `true`, each record in the result\n  // set will include the indices of the matched characters.\n  // These can consequently be used for highlighting purposes.\n  includeMatches: false,\n  // When `true`, the matching function will continue to the end of a search pattern even if\n  // a perfect match has already been located in the string.\n  findAllMatches: false,\n  // Minimum number of characters that must be matched before a result is considered a match\n  minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n  // When `true`, the algorithm continues searching to the end of the input even if a perfect\n  // match is found before the end of the same input.\n  isCaseSensitive: false,\n  // When `true`, the algorithm will ignore diacritics (accents) in comparisons\n  ignoreDiacritics: false,\n  // When true, the matching function will continue to the end of a search pattern even if\n  includeScore: false,\n  // List of properties that will be searched. This also supports nested properties.\n  keys: [],\n  // Whether to sort the result list, by score\n  shouldSort: true,\n  // Default sort function: sort by ascending score, ascending index\n  sortFn: (a, b) =>\n    a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n  // Approximately where in the text is the pattern expected to be found?\n  location: 0,\n  // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n  // (of both letters and location), a threshold of '1.0' would match anything.\n  threshold: 0.6,\n  // Determines how close the match must be to the fuzzy location (specified above).\n  // An exact letter match which is 'distance' characters away from the fuzzy location\n  // would score as a complete mismatch. A distance of '0' requires the match be at\n  // the exact location specified, a threshold of '1000' would require a perfect match\n  // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n  distance: 100\n};\n\nconst AdvancedOptions = {\n  // When `true`, it enables the use of unix-like search commands\n  useExtendedSearch: false,\n  // The get function to use when fetching an object's properties.\n  // The default will search nested paths *ie foo.bar.baz*\n  getFn: get,\n  // When `true`, search will ignore `location` and `distance`, so it won't matter\n  // where in the string the pattern appears.\n  // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n  ignoreLocation: false,\n  // When `true`, the calculation for the relevance score (used for sorting) will\n  // ignore the field-length norm.\n  // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n  ignoreFieldNorm: false,\n  // The weight to determine how much field length norm effects scoring.\n  fieldNormWeight: 1\n};\n\nvar Config = {\n  ...BasicOptions,\n  ...MatchOptions,\n  ...FuzzyOptions,\n  ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n  const cache = new Map();\n  const m = Math.pow(10, mantissa);\n\n  return {\n    get(value) {\n      const numTokens = value.match(SPACE).length;\n\n      if (cache.has(numTokens)) {\n        return cache.get(numTokens)\n      }\n\n      // Default function is 1/sqrt(x), weight makes that variable\n      const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n      // In place of `toFixed(mantissa)`, for faster computation\n      const n = parseFloat(Math.round(norm * m) / m);\n\n      cache.set(numTokens, n);\n\n      return n\n    },\n    clear() {\n      cache.clear();\n    }\n  }\n}\n\nclass FuseIndex {\n  constructor({\n    getFn = Config.getFn,\n    fieldNormWeight = Config.fieldNormWeight\n  } = {}) {\n    this.norm = norm(fieldNormWeight, 3);\n    this.getFn = getFn;\n    this.isCreated = false;\n\n    this.setIndexRecords();\n  }\n  setSources(docs = []) {\n    this.docs = docs;\n  }\n  setIndexRecords(records = []) {\n    this.records = records;\n  }\n  setKeys(keys = []) {\n    this.keys = keys;\n    this._keysMap = {};\n    keys.forEach((key, idx) => {\n      this._keysMap[key.id] = idx;\n    });\n  }\n  create() {\n    if (this.isCreated || !this.docs.length) {\n      return\n    }\n\n    this.isCreated = true;\n\n    // List is Array<String>\n    if (isString(this.docs[0])) {\n      this.docs.forEach((doc, docIndex) => {\n        this._addString(doc, docIndex);\n      });\n    } else {\n      // List is Array<Object>\n      this.docs.forEach((doc, docIndex) => {\n        this._addObject(doc, docIndex);\n      });\n    }\n\n    this.norm.clear();\n  }\n  // Adds a doc to the end of the index\n  add(doc) {\n    const idx = this.size();\n\n    if (isString(doc)) {\n      this._addString(doc, idx);\n    } else {\n      this._addObject(doc, idx);\n    }\n  }\n  // Removes the doc at the specified index of the index\n  removeAt(idx) {\n    this.records.splice(idx, 1);\n\n    // Change ref index of every subsquent doc\n    for (let i = idx, len = this.size(); i < len; i += 1) {\n      this.records[i].i -= 1;\n    }\n  }\n  getValueForItemAtKeyId(item, keyId) {\n    return item[this._keysMap[keyId]]\n  }\n  size() {\n    return this.records.length\n  }\n  _addString(doc, docIndex) {\n    if (!isDefined(doc) || isBlank(doc)) {\n      return\n    }\n\n    let record = {\n      v: doc,\n      i: docIndex,\n      n: this.norm.get(doc)\n    };\n\n    this.records.push(record);\n  }\n  _addObject(doc, docIndex) {\n    let record = { i: docIndex, $: {} };\n\n    // Iterate over every key (i.e, path), and fetch the value at that key\n    this.keys.forEach((key, keyIndex) => {\n      let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n      if (!isDefined(value)) {\n        return\n      }\n\n      if (isArray(value)) {\n        let subRecords = [];\n        const stack = [{ nestedArrIndex: -1, value }];\n\n        while (stack.length) {\n          const { nestedArrIndex, value } = stack.pop();\n\n          if (!isDefined(value)) {\n            continue\n          }\n\n          if (isString(value) && !isBlank(value)) {\n            let subRecord = {\n              v: value,\n              i: nestedArrIndex,\n              n: this.norm.get(value)\n            };\n\n            subRecords.push(subRecord);\n          } else if (isArray(value)) {\n            value.forEach((item, k) => {\n              stack.push({\n                nestedArrIndex: k,\n                value: item\n              });\n            });\n          } else ;\n        }\n        record.$[keyIndex] = subRecords;\n      } else if (isString(value) && !isBlank(value)) {\n        let subRecord = {\n          v: value,\n          n: this.norm.get(value)\n        };\n\n        record.$[keyIndex] = subRecord;\n      }\n    });\n\n    this.records.push(record);\n  }\n  toJSON() {\n    return {\n      keys: this.keys,\n      records: this.records\n    }\n  }\n}\n\nfunction createIndex(\n  keys,\n  docs,\n  { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n  const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n  myIndex.setKeys(keys.map(createKey));\n  myIndex.setSources(docs);\n  myIndex.create();\n  return myIndex\n}\n\nfunction parseIndex(\n  data,\n  { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n  const { keys, records } = data;\n  const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n  myIndex.setKeys(keys);\n  myIndex.setIndexRecords(records);\n  return myIndex\n}\n\nfunction computeScore$1(\n  pattern,\n  {\n    errors = 0,\n    currentLocation = 0,\n    expectedLocation = 0,\n    distance = Config.distance,\n    ignoreLocation = Config.ignoreLocation\n  } = {}\n) {\n  const accuracy = errors / pattern.length;\n\n  if (ignoreLocation) {\n    return accuracy\n  }\n\n  const proximity = Math.abs(expectedLocation - currentLocation);\n\n  if (!distance) {\n    // Dodge divide by zero error.\n    return proximity ? 1.0 : accuracy\n  }\n\n  return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n  matchmask = [],\n  minMatchCharLength = Config.minMatchCharLength\n) {\n  let indices = [];\n  let start = -1;\n  let end = -1;\n  let i = 0;\n\n  for (let len = matchmask.length; i < len; i += 1) {\n    let match = matchmask[i];\n    if (match && start === -1) {\n      start = i;\n    } else if (!match && start !== -1) {\n      end = i - 1;\n      if (end - start + 1 >= minMatchCharLength) {\n        indices.push([start, end]);\n      }\n      start = -1;\n    }\n  }\n\n  // (i-1 - start) + 1 => i - start\n  if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n    indices.push([start, i - 1]);\n  }\n\n  return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n  text,\n  pattern,\n  patternAlphabet,\n  {\n    location = Config.location,\n    distance = Config.distance,\n    threshold = Config.threshold,\n    findAllMatches = Config.findAllMatches,\n    minMatchCharLength = Config.minMatchCharLength,\n    includeMatches = Config.includeMatches,\n    ignoreLocation = Config.ignoreLocation\n  } = {}\n) {\n  if (pattern.length > MAX_BITS) {\n    throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n  }\n\n  const patternLen = pattern.length;\n  // Set starting location at beginning text and initialize the alphabet.\n  const textLen = text.length;\n  // Handle the case when location > text.length\n  const expectedLocation = Math.max(0, Math.min(location, textLen));\n  // Highest score beyond which we give up.\n  let currentThreshold = threshold;\n  // Is there a nearby exact match? (speedup)\n  let bestLocation = expectedLocation;\n\n  // Performance: only computer matches when the minMatchCharLength > 1\n  // OR if `includeMatches` is true.\n  const computeMatches = minMatchCharLength > 1 || includeMatches;\n  // A mask of the matches, used for building the indices\n  const matchMask = computeMatches ? Array(textLen) : [];\n\n  let index;\n\n  // Get all exact matches, here for speed up\n  while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n    let score = computeScore$1(pattern, {\n      currentLocation: index,\n      expectedLocation,\n      distance,\n      ignoreLocation\n    });\n\n    currentThreshold = Math.min(score, currentThreshold);\n    bestLocation = index + patternLen;\n\n    if (computeMatches) {\n      let i = 0;\n      while (i < patternLen) {\n        matchMask[index + i] = 1;\n        i += 1;\n      }\n    }\n  }\n\n  // Reset the best location\n  bestLocation = -1;\n\n  let lastBitArr = [];\n  let finalScore = 1;\n  let binMax = patternLen + textLen;\n\n  const mask = 1 << (patternLen - 1);\n\n  for (let i = 0; i < patternLen; i += 1) {\n    // Scan for the best match; each iteration allows for one more error.\n    // Run a binary search to determine how far from the match location we can stray\n    // at this error level.\n    let binMin = 0;\n    let binMid = binMax;\n\n    while (binMin < binMid) {\n      const score = computeScore$1(pattern, {\n        errors: i,\n        currentLocation: expectedLocation + binMid,\n        expectedLocation,\n        distance,\n        ignoreLocation\n      });\n\n      if (score <= currentThreshold) {\n        binMin = binMid;\n      } else {\n        binMax = binMid;\n      }\n\n      binMid = Math.floor((binMax - binMin) / 2 + binMin);\n    }\n\n    // Use the result from this iteration as the maximum for the next.\n    binMax = binMid;\n\n    let start = Math.max(1, expectedLocation - binMid + 1);\n    let finish = findAllMatches\n      ? textLen\n      : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n    // Initialize the bit array\n    let bitArr = Array(finish + 2);\n\n    bitArr[finish + 1] = (1 << i) - 1;\n\n    for (let j = finish; j >= start; j -= 1) {\n      let currentLocation = j - 1;\n      let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n      if (computeMatches) {\n        // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n        matchMask[currentLocation] = +!!charMatch;\n      }\n\n      // First pass: exact match\n      bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n      // Subsequent passes: fuzzy match\n      if (i) {\n        bitArr[j] |=\n          ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n      }\n\n      if (bitArr[j] & mask) {\n        finalScore = computeScore$1(pattern, {\n          errors: i,\n          currentLocation,\n          expectedLocation,\n          distance,\n          ignoreLocation\n        });\n\n        // This match will almost certainly be better than any existing match.\n        // But check anyway.\n        if (finalScore <= currentThreshold) {\n          // Indeed it is\n          currentThreshold = finalScore;\n          bestLocation = currentLocation;\n\n          // Already passed `loc`, downhill from here on in.\n          if (bestLocation <= expectedLocation) {\n            break\n          }\n\n          // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n          start = Math.max(1, 2 * expectedLocation - bestLocation);\n        }\n      }\n    }\n\n    // No hope for a (better) match at greater error levels.\n    const score = computeScore$1(pattern, {\n      errors: i + 1,\n      currentLocation: expectedLocation,\n      expectedLocation,\n      distance,\n      ignoreLocation\n    });\n\n    if (score > currentThreshold) {\n      break\n    }\n\n    lastBitArr = bitArr;\n  }\n\n  const result = {\n    isMatch: bestLocation >= 0,\n    // Count exact matches (those with a score of 0) to be \"almost\" exact\n    score: Math.max(0.001, finalScore)\n  };\n\n  if (computeMatches) {\n    const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n    if (!indices.length) {\n      result.isMatch = false;\n    } else if (includeMatches) {\n      result.indices = indices;\n    }\n  }\n\n  return result\n}\n\nfunction createPatternAlphabet(pattern) {\n  let mask = {};\n\n  for (let i = 0, len = pattern.length; i < len; i += 1) {\n    const char = pattern.charAt(i);\n    mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n  }\n\n  return mask\n}\n\nconst stripDiacritics = String.prototype.normalize\n    ? ((str) => str.normalize('NFD').replace(/[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C04\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00-\\u0D03\\u0D3B\\u0D3C\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF7-\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F]/g, ''))\n    : ((str) => str);\n\nclass BitapSearch {\n  constructor(\n    pattern,\n    {\n      location = Config.location,\n      threshold = Config.threshold,\n      distance = Config.distance,\n      includeMatches = Config.includeMatches,\n      findAllMatches = Config.findAllMatches,\n      minMatchCharLength = Config.minMatchCharLength,\n      isCaseSensitive = Config.isCaseSensitive,\n      ignoreDiacritics = Config.ignoreDiacritics,\n      ignoreLocation = Config.ignoreLocation\n    } = {}\n  ) {\n    this.options = {\n      location,\n      threshold,\n      distance,\n      includeMatches,\n      findAllMatches,\n      minMatchCharLength,\n      isCaseSensitive,\n      ignoreDiacritics,\n      ignoreLocation\n    };\n\n    pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n    pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n    this.pattern = pattern;\n\n    this.chunks = [];\n\n    if (!this.pattern.length) {\n      return\n    }\n\n    const addChunk = (pattern, startIndex) => {\n      this.chunks.push({\n        pattern,\n        alphabet: createPatternAlphabet(pattern),\n        startIndex\n      });\n    };\n\n    const len = this.pattern.length;\n\n    if (len > MAX_BITS) {\n      let i = 0;\n      const remainder = len % MAX_BITS;\n      const end = len - remainder;\n\n      while (i < end) {\n        addChunk(this.pattern.substr(i, MAX_BITS), i);\n        i += MAX_BITS;\n      }\n\n      if (remainder) {\n        const startIndex = len - MAX_BITS;\n        addChunk(this.pattern.substr(startIndex), startIndex);\n      }\n    } else {\n      addChunk(this.pattern, 0);\n    }\n  }\n\n  searchIn(text) {\n    const { isCaseSensitive, ignoreDiacritics, includeMatches } = this.options;\n\n    text = isCaseSensitive ? text : text.toLowerCase();\n    text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n    // Exact match\n    if (this.pattern === text) {\n      let result = {\n        isMatch: true,\n        score: 0\n      };\n\n      if (includeMatches) {\n        result.indices = [[0, text.length - 1]];\n      }\n\n      return result\n    }\n\n    // Otherwise, use Bitap algorithm\n    const {\n      location,\n      distance,\n      threshold,\n      findAllMatches,\n      minMatchCharLength,\n      ignoreLocation\n    } = this.options;\n\n    let allIndices = [];\n    let totalScore = 0;\n    let hasMatches = false;\n\n    this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n      const { isMatch, score, indices } = search(text, pattern, alphabet, {\n        location: location + startIndex,\n        distance,\n        threshold,\n        findAllMatches,\n        minMatchCharLength,\n        includeMatches,\n        ignoreLocation\n      });\n\n      if (isMatch) {\n        hasMatches = true;\n      }\n\n      totalScore += score;\n\n      if (isMatch && indices) {\n        allIndices = [...allIndices, ...indices];\n      }\n    });\n\n    let result = {\n      isMatch: hasMatches,\n      score: hasMatches ? totalScore / this.chunks.length : 1\n    };\n\n    if (hasMatches && includeMatches) {\n      result.indices = allIndices;\n    }\n\n    return result\n  }\n}\n\nclass BaseMatch {\n  constructor(pattern) {\n    this.pattern = pattern;\n  }\n  static isMultiMatch(pattern) {\n    return getMatch(pattern, this.multiRegex)\n  }\n  static isSingleMatch(pattern) {\n    return getMatch(pattern, this.singleRegex)\n  }\n  search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n  const matches = pattern.match(exp);\n  return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'exact'\n  }\n  static get multiRegex() {\n    return /^=\"(.*)\"$/\n  }\n  static get singleRegex() {\n    return /^=(.*)$/\n  }\n  search(text) {\n    const isMatch = text === this.pattern;\n\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices: [0, this.pattern.length - 1]\n    }\n  }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'inverse-exact'\n  }\n  static get multiRegex() {\n    return /^!\"(.*)\"$/\n  }\n  static get singleRegex() {\n    return /^!(.*)$/\n  }\n  search(text) {\n    const index = text.indexOf(this.pattern);\n    const isMatch = index === -1;\n\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices: [0, text.length - 1]\n    }\n  }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'prefix-exact'\n  }\n  static get multiRegex() {\n    return /^\\^\"(.*)\"$/\n  }\n  static get singleRegex() {\n    return /^\\^(.*)$/\n  }\n  search(text) {\n    const isMatch = text.startsWith(this.pattern);\n\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices: [0, this.pattern.length - 1]\n    }\n  }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'inverse-prefix-exact'\n  }\n  static get multiRegex() {\n    return /^!\\^\"(.*)\"$/\n  }\n  static get singleRegex() {\n    return /^!\\^(.*)$/\n  }\n  search(text) {\n    const isMatch = !text.startsWith(this.pattern);\n\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices: [0, text.length - 1]\n    }\n  }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'suffix-exact'\n  }\n  static get multiRegex() {\n    return /^\"(.*)\"\\$$/\n  }\n  static get singleRegex() {\n    return /^(.*)\\$$/\n  }\n  search(text) {\n    const isMatch = text.endsWith(this.pattern);\n\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices: [text.length - this.pattern.length, text.length - 1]\n    }\n  }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'inverse-suffix-exact'\n  }\n  static get multiRegex() {\n    return /^!\"(.*)\"\\$$/\n  }\n  static get singleRegex() {\n    return /^!(.*)\\$$/\n  }\n  search(text) {\n    const isMatch = !text.endsWith(this.pattern);\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices: [0, text.length - 1]\n    }\n  }\n}\n\nclass FuzzyMatch extends BaseMatch {\n  constructor(\n    pattern,\n    {\n      location = Config.location,\n      threshold = Config.threshold,\n      distance = Config.distance,\n      includeMatches = Config.includeMatches,\n      findAllMatches = Config.findAllMatches,\n      minMatchCharLength = Config.minMatchCharLength,\n      isCaseSensitive = Config.isCaseSensitive,\n      ignoreDiacritics = Config.ignoreDiacritics,\n      ignoreLocation = Config.ignoreLocation\n    } = {}\n  ) {\n    super(pattern);\n    this._bitapSearch = new BitapSearch(pattern, {\n      location,\n      threshold,\n      distance,\n      includeMatches,\n      findAllMatches,\n      minMatchCharLength,\n      isCaseSensitive,\n      ignoreDiacritics,\n      ignoreLocation\n    });\n  }\n  static get type() {\n    return 'fuzzy'\n  }\n  static get multiRegex() {\n    return /^\"(.*)\"$/\n  }\n  static get singleRegex() {\n    return /^(.*)$/\n  }\n  search(text) {\n    return this._bitapSearch.searchIn(text)\n  }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'include'\n  }\n  static get multiRegex() {\n    return /^'\"(.*)\"$/\n  }\n  static get singleRegex() {\n    return /^'(.*)$/\n  }\n  search(text) {\n    let location = 0;\n    let index;\n\n    const indices = [];\n    const patternLen = this.pattern.length;\n\n    // Get all exact matches\n    while ((index = text.indexOf(this.pattern, location)) > -1) {\n      location = index + patternLen;\n      indices.push([index, location - 1]);\n    }\n\n    const isMatch = !!indices.length;\n\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices\n    }\n  }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n  ExactMatch,\n  IncludeMatch,\n  PrefixExactMatch,\n  InversePrefixExactMatch,\n  InverseSuffixExactMatch,\n  SuffixExactMatch,\n  InverseExactMatch,\n  FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n  return pattern.split(OR_TOKEN).map((item) => {\n    let query = item\n      .trim()\n      .split(SPACE_RE)\n      .filter((item) => item && !!item.trim());\n\n    let results = [];\n    for (let i = 0, len = query.length; i < len; i += 1) {\n      const queryItem = query[i];\n\n      // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n      let found = false;\n      let idx = -1;\n      while (!found && ++idx < searchersLen) {\n        const searcher = searchers[idx];\n        let token = searcher.isMultiMatch(queryItem);\n        if (token) {\n          results.push(new searcher(token, options));\n          found = true;\n        }\n      }\n\n      if (found) {\n        continue\n      }\n\n      // 2. Handle single query matches (i.e, once that are *not* quoted)\n      idx = -1;\n      while (++idx < searchersLen) {\n        const searcher = searchers[idx];\n        let token = searcher.isSingleMatch(queryItem);\n        if (token) {\n          results.push(new searcher(token, options));\n          break\n        }\n      }\n    }\n\n    return results\n  })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token       | Match type                 | Description                            |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript`   | fuzzy-match                | Items that fuzzy match `jscript`       |\n * | `=scheme`   | exact-match                | Items that are `scheme`                |\n * | `'python`   | include-match              | Items that include `python`            |\n * | `!ruby`     | inverse-exact-match        | Items that do not include `ruby`       |\n * | `^java`     | prefix-exact-match         | Items that start with `java`           |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$`      | suffix-exact-match         | Items that end with `.js`              |\n * | `!.go$`     | inverse-suffix-exact-match | Items that do not end with `.go`       |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n  constructor(\n    pattern,\n    {\n      isCaseSensitive = Config.isCaseSensitive,\n      ignoreDiacritics = Config.ignoreDiacritics,\n      includeMatches = Config.includeMatches,\n      minMatchCharLength = Config.minMatchCharLength,\n      ignoreLocation = Config.ignoreLocation,\n      findAllMatches = Config.findAllMatches,\n      location = Config.location,\n      threshold = Config.threshold,\n      distance = Config.distance\n    } = {}\n  ) {\n    this.query = null;\n    this.options = {\n      isCaseSensitive,\n      ignoreDiacritics,\n      includeMatches,\n      minMatchCharLength,\n      findAllMatches,\n      ignoreLocation,\n      location,\n      threshold,\n      distance\n    };\n\n    pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n    pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n    this.pattern = pattern;\n    this.query = parseQuery(this.pattern, this.options);\n  }\n\n  static condition(_, options) {\n    return options.useExtendedSearch\n  }\n\n  searchIn(text) {\n    const query = this.query;\n\n    if (!query) {\n      return {\n        isMatch: false,\n        score: 1\n      }\n    }\n\n    const { includeMatches, isCaseSensitive, ignoreDiacritics } = this.options;\n\n    text = isCaseSensitive ? text : text.toLowerCase();\n    text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n    let numMatches = 0;\n    let allIndices = [];\n    let totalScore = 0;\n\n    // ORs\n    for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n      const searchers = query[i];\n\n      // Reset indices\n      allIndices.length = 0;\n      numMatches = 0;\n\n      // ANDs\n      for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n        const searcher = searchers[j];\n        const { isMatch, indices, score } = searcher.search(text);\n\n        if (isMatch) {\n          numMatches += 1;\n          totalScore += score;\n          if (includeMatches) {\n            const type = searcher.constructor.type;\n            if (MultiMatchSet.has(type)) {\n              allIndices = [...allIndices, ...indices];\n            } else {\n              allIndices.push(indices);\n            }\n          }\n        } else {\n          totalScore = 0;\n          numMatches = 0;\n          allIndices.length = 0;\n          break\n        }\n      }\n\n      // OR condition, so if TRUE, return\n      if (numMatches) {\n        let result = {\n          isMatch: true,\n          score: totalScore / numMatches\n        };\n\n        if (includeMatches) {\n          result.indices = allIndices;\n        }\n\n        return result\n      }\n    }\n\n    // Nothing was matched\n    return {\n      isMatch: false,\n      score: 1\n    }\n  }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n  registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n  for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n    let searcherClass = registeredSearchers[i];\n    if (searcherClass.condition(pattern, options)) {\n      return new searcherClass(pattern, options)\n    }\n  }\n\n  return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n  AND: '$and',\n  OR: '$or'\n};\n\nconst KeyType = {\n  PATH: '$path',\n  PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n  !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n  !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n  [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n    [key]: query[key]\n  }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n  const next = (query) => {\n    let keys = Object.keys(query);\n\n    const isQueryPath = isPath(query);\n\n    if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n      return next(convertToExplicit(query))\n    }\n\n    if (isLeaf(query)) {\n      const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n      const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n      if (!isString(pattern)) {\n        throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n      }\n\n      const obj = {\n        keyId: createKeyId(key),\n        pattern\n      };\n\n      if (auto) {\n        obj.searcher = createSearcher(pattern, options);\n      }\n\n      return obj\n    }\n\n    let node = {\n      children: [],\n      operator: keys[0]\n    };\n\n    keys.forEach((key) => {\n      const value = query[key];\n\n      if (isArray(value)) {\n        value.forEach((item) => {\n          node.children.push(next(item));\n        });\n      }\n    });\n\n    return node\n  };\n\n  if (!isExpression(query)) {\n    query = convertToExplicit(query);\n  }\n\n  return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n  results,\n  { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n  results.forEach((result) => {\n    let totalScore = 1;\n\n    result.matches.forEach(({ key, norm, score }) => {\n      const weight = key ? key.weight : null;\n\n      totalScore *= Math.pow(\n        score === 0 && weight ? Number.EPSILON : score,\n        (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n      );\n    });\n\n    result.score = totalScore;\n  });\n}\n\nfunction transformMatches(result, data) {\n  const matches = result.matches;\n  data.matches = [];\n\n  if (!isDefined(matches)) {\n    return\n  }\n\n  matches.forEach((match) => {\n    if (!isDefined(match.indices) || !match.indices.length) {\n      return\n    }\n\n    const { indices, value } = match;\n\n    let obj = {\n      indices,\n      value\n    };\n\n    if (match.key) {\n      obj.key = match.key.src;\n    }\n\n    if (match.idx > -1) {\n      obj.refIndex = match.idx;\n    }\n\n    data.matches.push(obj);\n  });\n}\n\nfunction transformScore(result, data) {\n  data.score = result.score;\n}\n\nfunction format(\n  results,\n  docs,\n  {\n    includeMatches = Config.includeMatches,\n    includeScore = Config.includeScore\n  } = {}\n) {\n  const transformers = [];\n\n  if (includeMatches) transformers.push(transformMatches);\n  if (includeScore) transformers.push(transformScore);\n\n  return results.map((result) => {\n    const { idx } = result;\n\n    const data = {\n      item: docs[idx],\n      refIndex: idx\n    };\n\n    if (transformers.length) {\n      transformers.forEach((transformer) => {\n        transformer(result, data);\n      });\n    }\n\n    return data\n  })\n}\n\nclass Fuse {\n  constructor(docs, options = {}, index) {\n    this.options = { ...Config, ...options };\n\n    if (\n      this.options.useExtendedSearch &&\n      !true\n    ) {\n      throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n    }\n\n    this._keyStore = new KeyStore(this.options.keys);\n\n    this.setCollection(docs, index);\n  }\n\n  setCollection(docs, index) {\n    this._docs = docs;\n\n    if (index && !(index instanceof FuseIndex)) {\n      throw new Error(INCORRECT_INDEX_TYPE)\n    }\n\n    this._myIndex =\n      index ||\n      createIndex(this.options.keys, this._docs, {\n        getFn: this.options.getFn,\n        fieldNormWeight: this.options.fieldNormWeight\n      });\n  }\n\n  add(doc) {\n    if (!isDefined(doc)) {\n      return\n    }\n\n    this._docs.push(doc);\n    this._myIndex.add(doc);\n  }\n\n  remove(predicate = (/* doc, idx */) => false) {\n    const results = [];\n\n    for (let i = 0, len = this._docs.length; i < len; i += 1) {\n      const doc = this._docs[i];\n      if (predicate(doc, i)) {\n        this.removeAt(i);\n        i -= 1;\n        len -= 1;\n\n        results.push(doc);\n      }\n    }\n\n    return results\n  }\n\n  removeAt(idx) {\n    this._docs.splice(idx, 1);\n    this._myIndex.removeAt(idx);\n  }\n\n  getIndex() {\n    return this._myIndex\n  }\n\n  search(query, { limit = -1 } = {}) {\n    const {\n      includeMatches,\n      includeScore,\n      shouldSort,\n      sortFn,\n      ignoreFieldNorm\n    } = this.options;\n\n    let results = isString(query)\n      ? isString(this._docs[0])\n        ? this._searchStringList(query)\n        : this._searchObjectList(query)\n      : this._searchLogical(query);\n\n    computeScore(results, { ignoreFieldNorm });\n\n    if (shouldSort) {\n      results.sort(sortFn);\n    }\n\n    if (isNumber(limit) && limit > -1) {\n      results = results.slice(0, limit);\n    }\n\n    return format(results, this._docs, {\n      includeMatches,\n      includeScore\n    })\n  }\n\n  _searchStringList(query) {\n    const searcher = createSearcher(query, this.options);\n    const { records } = this._myIndex;\n    const results = [];\n\n    // Iterate over every string in the index\n    records.forEach(({ v: text, i: idx, n: norm }) => {\n      if (!isDefined(text)) {\n        return\n      }\n\n      const { isMatch, score, indices } = searcher.searchIn(text);\n\n      if (isMatch) {\n        results.push({\n          item: text,\n          idx,\n          matches: [{ score, value: text, norm, indices }]\n        });\n      }\n    });\n\n    return results\n  }\n\n  _searchLogical(query) {\n\n    const expression = parse(query, this.options);\n\n    const evaluate = (node, item, idx) => {\n      if (!node.children) {\n        const { keyId, searcher } = node;\n\n        const matches = this._findMatches({\n          key: this._keyStore.get(keyId),\n          value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n          searcher\n        });\n\n        if (matches && matches.length) {\n          return [\n            {\n              idx,\n              item,\n              matches\n            }\n          ]\n        }\n\n        return []\n      }\n\n      const res = [];\n      for (let i = 0, len = node.children.length; i < len; i += 1) {\n        const child = node.children[i];\n        const result = evaluate(child, item, idx);\n        if (result.length) {\n          res.push(...result);\n        } else if (node.operator === LogicalOperator.AND) {\n          return []\n        }\n      }\n      return res\n    };\n\n    const records = this._myIndex.records;\n    const resultMap = {};\n    const results = [];\n\n    records.forEach(({ $: item, i: idx }) => {\n      if (isDefined(item)) {\n        let expResults = evaluate(expression, item, idx);\n\n        if (expResults.length) {\n          // Dedupe when adding\n          if (!resultMap[idx]) {\n            resultMap[idx] = { idx, item, matches: [] };\n            results.push(resultMap[idx]);\n          }\n          expResults.forEach(({ matches }) => {\n            resultMap[idx].matches.push(...matches);\n          });\n        }\n      }\n    });\n\n    return results\n  }\n\n  _searchObjectList(query) {\n    const searcher = createSearcher(query, this.options);\n    const { keys, records } = this._myIndex;\n    const results = [];\n\n    // List is Array<Object>\n    records.forEach(({ $: item, i: idx }) => {\n      if (!isDefined(item)) {\n        return\n      }\n\n      let matches = [];\n\n      // Iterate over every key (i.e, path), and fetch the value at that key\n      keys.forEach((key, keyIndex) => {\n        matches.push(\n          ...this._findMatches({\n            key,\n            value: item[keyIndex],\n            searcher\n          })\n        );\n      });\n\n      if (matches.length) {\n        results.push({\n          idx,\n          item,\n          matches\n        });\n      }\n    });\n\n    return results\n  }\n  _findMatches({ key, value, searcher }) {\n    if (!isDefined(value)) {\n      return []\n    }\n\n    let matches = [];\n\n    if (isArray(value)) {\n      value.forEach(({ v: text, i: idx, n: norm }) => {\n        if (!isDefined(text)) {\n          return\n        }\n\n        const { isMatch, score, indices } = searcher.searchIn(text);\n\n        if (isMatch) {\n          matches.push({\n            score,\n            key,\n            value: text,\n            idx,\n            norm,\n            indices\n          });\n        }\n      });\n    } else {\n      const { v: text, n: norm } = value;\n\n      const { isMatch, score, indices } = searcher.searchIn(text);\n\n      if (isMatch) {\n        matches.push({ score, key, value: text, norm, indices });\n      }\n    }\n\n    return matches\n  }\n}\n\nFuse.version = '7.1.0';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n  Fuse.parseQuery = parse;\n}\n\n{\n  register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n","import { useEffect, useState } from 'preact/hooks';\n\nexport const MIN_SCHEDULED_AT = 6 * 60 * 1000; // 6 mins\nconst MAX_SCHEDULED_AT = 90 * 24 * 60 * 60 * 1000; // 90 days\n\nexport default function ScheduledAtField({ scheduledAt, setScheduledAt }) {\n  if (!scheduledAt || !(scheduledAt instanceof Date)) {\n    console.warn('scheduledAt is not a Date:', scheduledAt);\n    return;\n  }\n  const [minStr, setMinStr] = useState();\n  const [maxStr, setMaxStr] = useState();\n  const timezoneOffset = scheduledAt.getTimezoneOffset();\n\n  useEffect(() => {\n    function updateMinStr() {\n      const min = new Date(Date.now() + MIN_SCHEDULED_AT);\n      const str = new Date(min.getTime() - timezoneOffset * 60000)\n        .toISOString()\n        .slice(0, 16);\n      setMinStr(str);\n    }\n    updateMinStr();\n\n    function updateMaxStr() {\n      const max = new Date(Date.now() + MAX_SCHEDULED_AT);\n      const str = new Date(max.getTime() - timezoneOffset * 60000)\n        .toISOString()\n        .slice(0, 16);\n      setMaxStr(str);\n    }\n    updateMaxStr();\n\n    // Update every 10s\n    const intervalId = setInterval(() => {\n      updateMinStr();\n      updateMaxStr();\n    }, 1000 * 10);\n    return () => clearInterval(intervalId);\n  }, []);\n\n  const defaultValue = scheduledAt\n    ? new Date(scheduledAt.getTime() - scheduledAt.getTimezoneOffset() * 60000)\n        .toISOString()\n        .slice(0, 16)\n    : null;\n\n  return (\n    <input\n      type=\"datetime-local\"\n      name=\"scheduledAt\"\n      defaultValue={defaultValue}\n      min={minStr}\n      max={maxStr}\n      required\n      onChange={(e) => {\n        setScheduledAt(new Date(e.target.value));\n      }}\n    />\n  );\n}\n\nexport function getLocalTimezoneName() {\n  const date = new Date();\n  const formatter = new Intl.DateTimeFormat(undefined, {\n    timeZoneName: 'long',\n  });\n  const parts = formatter.formatToParts(date);\n  const timezoneName = parts.find(\n    (part) => part.type === 'timeZoneName',\n  )?.value;\n  return timezoneName;\n}\n"],"file":"assets/ScheduledAtField-Cb8CBR7l.js"}