{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/teact/teact.ts","webpack:///./src/config.ts","webpack:///./src/lib/teact/teactn.tsx","webpack:///./src/util/iteratees.ts","webpack:///./src/modules/helpers/messages.ts","webpack:///./src/modules/helpers/messageMedia.ts","webpack:///./src/modules/helpers/localSearch.ts","webpack:///./src/api/types/index.ts","webpack:///./src/modules/selectors/users.ts","webpack:///./src/modules/selectors/chats.ts","webpack:///./src/modules/selectors/symbols.ts","webpack:///./src/modules/selectors/messages.ts","webpack:///./src/modules/selectors/localSearch.ts","webpack:///./src/modules/selectors/management.ts","webpack:///./src/modules/selectors/ui.ts","webpack:///./src/modules/selectors/globalSearch.ts","webpack:///./src/modules/selectors/payments.ts","webpack:///./src/util/buildClassName.ts","webpack:///./src/util/environment.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/api/gramjs/worker/provider.ts","webpack:///./src/assets/lang/en-extra.json","webpack:///./src/assets/lang/es-extra.json","webpack:///./src/assets/lang/it-extra.json","webpack:///./src/assets/lang/pl-extra.json","webpack:///./src/assets/lang/ru-extra.json","webpack:///./src/util/langProvider.ts","webpack:///./src/util/callbacks.ts","webpack:///./src/util/moduleLoader.ts","webpack:///./src/util/cacheApi.ts","webpack:///./src/util/files.ts","webpack:///./src/lib/twemojiRegex.js","webpack:///./src/components/ui/Loading.tsx","webpack:///./src/hooks/useModuleLoader.ts","webpack:///./src/util/countries.ts","webpack:///./src/util/phoneNumber.ts","webpack:///./src/types/index.ts","webpack:///./src/components/ui/Spinner.tsx","webpack:///./src/util/handleError.ts","webpack:///./src/components/common/helpers/renderText.tsx","webpack:///./src/util/arePropsShallowEqual.ts","webpack:///./src/components/ui/Link.tsx","webpack:///./src/util/generateIdFor.ts","webpack:///./src/util/notifications.ts","webpack:///./src/modules/helpers/users.ts","webpack:///./src/modules/helpers/chats.ts","webpack:///./src/components/ui/Button.tsx","webpack:///./src/lib/teact/dom-events.ts","webpack:///./src/hooks/useFlag.ts","webpack:///./src/hooks/useShowTransition.ts","webpack:///./src/util/dateFormat.ts","webpack:///./src/modules/reducers/chats.ts","webpack:///./src/modules/reducers/messages.ts","webpack:///./src/modules/reducers/symbols.ts","webpack:///./src/modules/reducers/users.ts","webpack:///./src/modules/reducers/globalSearch.ts","webpack:///./src/modules/reducers/localSearch.ts","webpack:///./src/modules/reducers/management.ts","webpack:///./src/modules/reducers/settings.ts","webpack:///./src/modules/reducers/twoFaSettings.ts","webpack:///./src/modules/reducers/payments.ts","webpack:///./src/hooks/useForceUpdate.ts","webpack:///./src/util/trimText.ts","webpack:///./src/components/ui/MenuItem.tsx","webpack:///./src/components/ui/RippleEffect.tsx","webpack:///./src/util/webpToPng.ts","webpack:///./src/hooks/usePrevious.ts","webpack:///./src/components/ui/InputText.tsx","webpack:///./src/components/ui/Checkbox.tsx","webpack:///./src/util/captureEscKeyListener.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/util/textFormat.ts","webpack:///./src/util/memo.ts","webpack:///./src/util/searchWords.ts","webpack:///./src/components/ui/Menu.tsx","webpack:///./src/hooks/useKeyboardListNavigation.ts","webpack:///./src/util/oggToWav.ts","webpack:///./src/util/mediaLoader.ts","webpack:///./src/util/captureKeyboardListeners.ts","webpack:///./src/util/windowSize.ts","webpack:///./src/lib/punycode.js","webpack:///./src/components/common/SafeLink.tsx","webpack:///./src/hooks/useEffectWithPrevDeps.ts","webpack:///./src/components/common/helpers/documentInfo.ts","webpack:///./src/modules/helpers/payments.ts","webpack:///./src/util/animation.ts","webpack:///./src/components/ui/DropdownMenu.tsx","webpack:///./src/components/common/helpers/parseEmojiOnlyString.ts","webpack:///./src/util/emoji.ts","webpack:///./src/lib/teact/teact-dom.ts","webpack:///./src/components/common/UserLink.tsx","webpack:///./src/components/common/MessageLink.tsx","webpack:///./src/components/common/ChatLink.tsx","webpack:///./src/components/common/helpers/renderActionMessageText.tsx","webpack:///./src/api/types/messages.ts","webpack:///./src/api/types/media.ts","webpack:///./src/components/middle/message/MentionLink.tsx","webpack:///./src/util/switchTheme.ts","webpack:///./src/hooks/useVirtualBackdrop.ts","webpack:///./src/api/gramjs/worker/worker.ts","webpack:///./node_modules/opus-recorder/dist/decoderWorker.min.js","webpack:///./node_modules/opus-recorder/dist/waveWorker.min.js","webpack:///./src/lib/webp/webp_wasm.worker.js","webpack:///./src/modules/actions/ui/initial.ts","webpack:///./src/modules/actions/api/initial.ts","webpack:///./src/modules/actions/apiUpdaters/initial.ts","webpack:///./src/serviceWorker.ts","webpack:///./src/util/setupServiceWorker.ts","webpack:///./src/global/initial.ts","webpack:///./src/global/cache.ts","webpack:///./src/global/index.ts","webpack:///./src/util/activeTabMonitor.ts","webpack:///./src/util/fonts.ts","webpack:///./src/assets/telegram-logo.svg","webpack:///./src/assets/monkey.svg","webpack:///./src/components/common/UiLoader.tsx","webpack:///./src/components/auth/CountryCodeInput.tsx","webpack:///./src/components/auth/AuthPhoneNumber.tsx","webpack:///./src/components/auth/AuthCode.async.tsx","webpack:///./src/components/auth/AuthPassword.async.tsx","webpack:///./src/components/auth/AuthRegister.async.tsx","webpack:///./src/components/auth/AuthQrCode.async.tsx","webpack:///./src/components/auth/Auth.tsx","webpack:///./src/components/main/Main.async.tsx","webpack:///./src/assets/app-inactive.png","webpack:///./src/components/main/AppInactive.tsx","webpack:///./src/App.tsx","webpack:///./src/index.tsx"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","installedCssChunks","2","__webpack_require__","exports","module","l","e","promises","Promise","resolve","reject","href","fullhref","p","existingLinkTags","document","getElementsByTagName","dataHref","tag","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","jsonpScriptSrc","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","head","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","s","VirtualElementTypesEnum","Fragment","renderingInstance","isEmptyElement","$element","Empty","isTextElement","Text","isTagElement","Tag","isComponentElement","Component","isRealElement","source","props","children","flatten","parsedChildren","componentInstance","isMounted","hooks","state","cursor","byCursor","effects","memos","buildComponentElement","createComponentInstance","dropEmptyTail","map","buildChildElement","buildTagElement","isEmptyPlaceholder","child","String","DEBUG_components","renderComponent","newRenderedValue","DEBUG_startAt","DEBUG","componentName","renderCount","renderTimes","DEBUG_MORE","log","performance","now","renderTime","warn","Math","round","handleError","renderedValue","newChild","hasElementChanged","$old","$new","unmountTree","forEach","hook","current","cleanup","effect","dependencies","nextValue","setter","forceUpdate","onUpdate","helpGc","unmountComponent","removeAllDelegatedListeners","mountComponent","forceUpdateComponent","currentElement","getTarget","setTarget","useState","initial","newValue","prepareForFrame","throttleWithPrimaryRaf","prepareComponentForFrame","throttleWithRaf","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","exec","some","dependency","useEffect","fastRaf","useLayoutEffect","onTickEnd","useMemo","resolver","useCallback","newCallback","useRef","memo","areEqual","arePropsShallowEqual","withDebug","propsRef","renderedRef","getUnequalProps","join","addEventListener","orderBy","values","PAGE_TITLE","INACTIVE_MARKER","APP_INFO","process","IS_TEST","DEBUG_ALERT_MSG","GRAMJS_SESSION_ID_KEY","GLOBAL_STATE_CACHE_DISABLED","GLOBAL_STATE_CACHE_KEY","GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT","GLOBAL_STATE_CACHE_USER_LIST_LIMIT","MEDIA_CACHE_DISABLED","MEDIA_CACHE_NAME","MEDIA_CACHE_NAME_AVATARS","MEDIA_PROGRESSIVE_CACHE_NAME","CUSTOM_BG_CACHE_NAME","LANG_CACHE_NAME","isBigScreen","Set","innerHeight","MIN_PASSWORD_LENGTH","MESSAGE_LIST_SENSITIVE_AREA","MESSAGE_LIST_SLICE","MESSAGE_LIST_VIEWPORT_LIMIT","CHAT_HEIGHT_PX","CHAT_LIST_SLICE","CHAT_LIST_LOAD_SLICE","SHARED_MEDIA_SLICE","MESSAGE_SEARCH_SLICE","GLOBAL_SEARCH_SLICE","MEMBERS_SLICE","MEMBERS_LOAD_SLICE","PROFILE_SENSITIVE_AREA","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","ALL_CHATS_PRELOAD_DISABLED","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","EDITABLE_INPUT_ID","EDITABLE_INPUT_MODAL_ID","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","MOBILE_SCREEN_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT","LOCAL_MESSAGE_ID_BASE","ANIMATION_END_DELAY","STICKER_SIZE_INLINE_DESKTOP_FACTOR","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_AUTH","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_PICKER","STICKER_SIZE_GENERAL_SETTINGS","STICKER_SIZE_PICKER_HEADER","STICKER_SIZE_SEARCH","STICKER_SIZE_MODAL","STICKER_SIZE_TWO_FA","STICKER_SIZE_DISCUSSION_GROUPS","STICKER_SIZE_FOLDER_SETTINGS","MEMOJI_STICKER_ID","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","LAYERS_TRANSITION_DURATION","CONTENT_TYPES_FOR_QUICK_UPLOAD","RE_LINK_TEMPLATE","RE_TME_LINK","RE_TME_INVITE_LINK","SERVICE_NOTIFICATIONS_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","LANG_PACKS","TIPS_USERNAME","FEEDBACK_URL","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","React","currentGlobal","reducers","callbacks","container","containers","mapStateToProps","mapReducersToProps","ownProps","mappedProps","newMappedProps","setGlobal","actions","Number","isNaN","DEBUG_componentName","keys","areMappedPropsChanged","DEBUG_updates","updateTime","Map","runCallbacksThrottled","cb","newGlobal","getGlobal","getDispatch","addReducer","reducer","payload","onDispatch","addCallback","removeCallback","index","indexOf","splice","withGlobal","TeactNContainer","id","generateIdFor","useForceUpdate","delete","set","buildCollectionByKey","collection","reduce","byKey","member","mapValues","callback","newByKey","pick","result","pickTruthy","omit","stringKeys","filter","has","orderKey","sort","a","b","Array","isArray","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","concat","unique","from","compact","Boolean","areSortedArraysEqual","array1","array2","every","item","areSortedArraysIntersecting","findIntersectionWithSet","split","chunkSize","cloneDeep","acc","findLast","predicate","CONTENT_NOT_SUPPORTED","RE_LINK","RegExp","getMessageKey","chatId","parseMessageKey","match","messageId","getMessageOriginalId","previousLocalId","getMessageSummaryText","noEmoji","text","photo","video","audio","voice","sticker","contact","poll","invoice","content","groupedId","isGif","emoji","caption","title","performer","fileName","summary","question","getNotificationText","getMessageText","webPage","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","entities","link","find","entity","ApiMessageEntityTypes","TextUrl","url","Url","offset","substring","domain","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","action","isServiceNotificationMessage","isMessageLocal","isAnonymousOwnMessage","senderId","getSenderTitle","sender","getUserFullName","getChatTitle","getSendingState","sendingState","isHistoryClearMessage","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageMediaThumbDataUri","thumbnail","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","base","hasMessageLocalBlobUrl","canMessagePlayVideoInline","getVideoOrAudioBaseHash","getDocumentHasPreview","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","size","mimeType","getMessageMediaFormat","isAnimated","ApiMediaFormat","Lottie","Progressive","IS_OPUS_SUPPORTED","BlobUrl","getMessageMediaFilename","date","blobUrl","previewBlobUrl","getChatMediaMessageIds","messages","listedIds","reverseOrder","ids","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","progress","isDownloadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","threadId","selectUser","global","userId","users","byId","selectChat","chats","selectChatUser","chat","getPrivateChatUserId","selectIsChatWithSelf","currentUserId","selectIsChatWithBot","user","isUserBot","selectSupportChat","isSupport","selectChatOnlineCount","isChatPrivate","isChatChannel","fullInfo","members","onlineCount","isUserOnline","selectChatBot","selectIsChatBotNotStarted","bot","lastMessage","messageInfo","byChatId","threadsById","MAIN_THREAD_ID","selectAreActiveChatsLoaded","listIds","active","selectIsChatListed","targetList","includes","list","selectChatListType","folderId","selectChatFolder","chatFolders","selectIsChatPinned","archived","orderedPinnedIds","chatFoldersById","pinnedChatIds","selectChatByUsername","username","usernameLowered","toLowerCase","selectCountNotMutedUnread","activeChatIds","unreadCount","isMuted","selectCurrentStickerSearch","stickers","search","selectCurrentGifSearch","gifs","selectStickerSet","setsById","selectStickersForEmoji","stickerSets","stickersForEmoji","packs","selectAnimatedEmoji","animatedEmojis","cleanedEmoji","replace","selectCurrentMessageList","messageLists","selectCurrentChat","selectChatMessages","selectScheduledMessages","scheduledMessages","selectThreadParam","thread","selectListedIds","selectOutlyingIds","selectCurrentMessageIds","messageListType","selectViewportIds","selectPinnedIds","selectScheduledIds","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingScheduledId","selectDraft","selectNoWebPage","selectThreadInfo","selectFirstMessageId","selectThreadOriginChat","threadInfo","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","isMessageInCurrentMessageList","currentMessageList","selectIsViewportNewest","viewportIds","lastMessageId","selectChatMessage","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","focusedMessage","selectIsMessageFocused","focusedId","selectOutgoingStatus","isScheduledList","lastReadOutboxMessageId","selectIsMessageUnread","selectSender","selectForwardedSender","isChannelPost","fromChatId","senderUserId","selectAllowedMessageActions","isRestricted","isPrivate","isChatWithSelf","isBasicGroup","isChatBasicGroup","isSuperGroup","isChatSuperGroup","isChannel","isServiceNotification","isOwn","isAction","isMessageEditable","Date","viaBotId","canReply","getCanPostInChat","hasPinPermission","isCreator","isUserRightBanned","getHasAdminRight","canPin","canUnpin","pinnedMessageIds","canDelete","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","noOptions","ability","selectCanDeleteSelectedMessages","selectedMessageIds","selectedMessages","messageActions","selectUploadProgress","fileTransfer","fileUploads","byMessageLocalId","selectRealLastReadId","lastReadInboxMessageId","min","Infinity","selectFirstUnreadId","outlyingIds","lastReadId","isNotJoined","found","isFromScheduled","selectIsForwardModalOpen","forwardMessages","isModalShown","selectCommonBoxChatId","fromLastMessage","isCommonBoxChat","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","fromMessageId","selectMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectShouldAutoLoadMedia","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","settings","isChatGroup","userOrChat","contactList","userIds","selectIsUserOrChatContact","selectShouldAutoPlayMedia","shouldAutoPlayVideos","shouldAutoPlayGifs","asGif","selectShouldLoopStickers","shouldLoopStickers","selectCurrentTextSearch","chatThreadKey","currentSearch","localTextSearch","byChatThreadKey","isActive","selectCurrentMediaSearchPeerId","localMediaSearch","currentProfileUserId","selectedId","selectCurrentMediaSearch","peerId","selectManagement","management","selectCurrentManagementType","selectIsMediaViewerOpen","mediaViewer","avatarOwnerId","selectRightColumnContentKey","isChatInfoShown","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","IS_MOBILE_SCREEN","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","query","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","PollResults","Search","Management","StickerSearch","GifSearch","UserInfo","ChatInfo","selectIsRightColumnShown","selectCurrentGlobalSearchQuery","globalSearch","selectPaymentMessageId","payment","selectPaymentRequestId","formId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","stripeCredentials","parts","PLATFORM_ENV","userAgent","platform","navigator","os","test","getPlatform","IS_MAC_OS","IS_IOS","IS_ANDROID","IS_TOUCH_ENV","matchMedia","matches","innerWidth","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_EMOJI_SUPPORTED","documentElement","style","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","isWebpSupportedCache","isWebpSupported","webp","Image","handleLoadOrError","hasWebp","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","args","self","throttle","interval","isPending","_args","setInterval","clearInterval","throttleWith","fastPrimaryRaf","waiting","onIdle","requestIdleCallback","pause","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","isPrimary","requestAnimationFrame","currentCallbacks","currentPrimaryCallbacks","worker","requestStates","requestStatesByCallback","initApi","sessionId","Worker","update","requestState","response","callbackArgs","subscribeToWorker","makeRequest","callApi","fnName","cancelApiProgress","progressCallback","isCanceled","postMessage","assign","pop","catch","finally","EXTRA_PACK_PATHS","en","enExtraJson","es","esExtraJson","it","itExtraJson","pl","plExtraJson","ru","ruExtraJson","PLURAL_OPTIONS","PLURAL_RULES","ar","ca","de","fa","fr","ko","nl","pt_BR","tr","uk","uz","cache","langPack","runCallbacks","createCallbackManager","currentLangCode","async","setLanguage","langCode","lang","newLangPack","cached","cacheApi","Json","remote","sourceLangPacks","fetchFromCacheOrRemote","fetch","pairs","json","extraLangPack","clear","getTranslation","format","langString","template","amount","optionIndex","getPluralOption","trim","processTemplate","formatInteger","Bundles","LOAD_PROMISES","MEMORY_CACHE","loadModule","bundleName","moduleName","Auth","Main","Extra","handleBundleLoad","bundle","getModuleFromMemory","listeners","addLoadListener","listener","caches","Type","cacheName","Request","open","Blob","blob","substr","headers","save","cacheData","JSON","stringify","Response","put","File","constructor","fileBits","options","rest","super","this","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","charCodeAt","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","lastModified","preloadImage","img","preloadVideo","volume","onloadedmetadata","createPosterForVideo","race","onseeked","canvas","videoWidth","videoHeight","getContext","drawImage","toDataURL","currentTime","fetchBlob","imgToCanvas","vs16RegExp","zeroWidthJoiner","fromCharCode","removeVS16s","rawEmoji","color","className","withBackground","noLoad","autoUpdate","formatsCache","defaultPhoneNumberFormat","parsed","str","flag","phoneFormat","formatValue","phoneNumberFormat","phoneNumberGroups","count","repeat","getPhoneNumberFormat","getCountryById","countryList","getCountryFromPhoneNumber","input","phoneNumber","startsWith","possibleCountries","country","formatPhoneNumber","_","p1","p2","p3","p4","p5","separator","output","formatPhoneNumberWithCode","numberWithPlus","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","ChatCreationProgress","ProfileEditProgress","ManagementProgress","ProfileState","PaymentStep","UPLOADING_WALLPAPER_SLUG","ManagementScreens","Spinner","buildClassName","handleErrorEvent","startedAt","isReloading","preventDefault","ErrorEvent","reason","alert","localStorage","getItem","removeItem","location","reload","APP_ENV","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","renderText","part","filters","params","textParts","divEl","innerText","innerHTML","escapeHtml","EMOJI_REGEX","lastIndex","replaceEmojis","addLineBreaks","highlight","lowerCaseText","queryPosition","nextSymbol","newParts","links","RE_MENTION","nextLink","endsWith","addLinks","replaceSimpleMarkdown","emojis","emojiResult","nativeToUnfified","alt","line","trimmedLine","trimLeft","indentLength","entityResult","currentProps","newProps","currentKeys","currentKeysLength","prop","Link","onClick","handleClick","store","random","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","requestPermission","unsubscribeFromPush","dispatch","deviceToken","unsubscribe","deleteDeviceToken","serviceWorkerRegistration","serviceWorker","ready","pushManager","getSubscription","subscribe","replaceSettings","loadNotificationsSettings","subscribedAt","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","showNewMessageNotification","isActiveChat","hasFocus","hasPrivateChatsNotifications","hasGroupNotifications","hasBroadcastNotifications","checkIfShouldNotify","body","messageSender","messageAction","actionTargetMessage","targetUserId","actionTargetUserId","targetChatId","actionTargetChatId","actionTargetUser","privateChatUserId","privateChatUser","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","getNotificationContent","controller","notification","icon","badge","toString","vibrate","onclick","close","focusMessage","focus","notifyClientReady","USER_COLOR_KEYS","getUserFirstOrLastName","firstName","lastName","isDeletedUser","getUserStatus","status","wasOnline","wasOnlineDate","diff","getTime","floor","today","setHours","formatTime","yesterday","setDate","getDate","formatFullDate","sortUserIds","usersById","priorityIds","expires","getUserColorKey","peer","abs","getChatTypeString","isSelf","getChatDescription","about","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isChatSummaryOnly","isChatAdmin","adminRights","currentUserBannedRights","defaultBannedRights","migratedTo","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","getChatSlowModeOptions","slowMode","getChatOrder","max","joinDate","isChatArchived","getCanDeleteChat","prepareFolderListIds","chatsById","folder","chatIdsCache","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","unreadMentionsCount","hasUnreadMark","excludeRead","bots","contacts","isContact","nonContacts","groups","channels","filterChatFolder","prepareChatList","folderType","chatFilter","listedChats","listIdsSet","pinnedChats","otherChats","getFolderUnreadDialogs","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","description","pinnedIds","getFolderChatsCount","isChat","chatOrUser","sortChatIds","chatIds","shouldPrioritizeVerified","priority","isVerified","Button","ref","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","elementRef","isClicked","setIsClicked","fullClassName","handleMouseDown","aria-label","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","element","propName","handler","eventName","resolveEventName","canUseEventDelegation","handleEvent","resolveDelegationRegistryForName","existing","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeEventListener","removeDelegatedListener","tagName","realEventName","eventNames","realEvent","events","furtherCallsPrevented","stopPropagation","Proxy","Reflect","setValue","isOpen","onCloseTransitionEnd","noOpenTransition","noCloseTransition","isClosed","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","isClosing","shouldRender","transitionClassNames","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","getHours","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","formatDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","lowerFirst","upperFirst","weekAhead","weekDay","formatKey","day","monthIndex","formatMediaDateTime","formatMediaDuration","hours","minutes","seconds","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDateToString","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","findIndex","timestampPlusDay","MILISECONDS_IN_DAY","toUpperCase","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","photos","updateChats","updatedById","addChats","addedById","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalCount","totalChatCount","isFullyLoaded","updateCurrentMessageList","replaceChatMessages","updateMessageStore","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","isLinkedChannelPost","canDeleteCurrentThread","currentThreadId","originalPost","deleteChatScheduledMessages","scheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","hash","updateScheduledMessages","updateFocusedMessage","noHighlight","updateFocusDirection","direction","enterMessageSelectMode","toggleMessageSelection","childMessageIds","withShift","oldSelectedMessages","newMessageIds","newSelectedMessageIds","prevIndex","currentIndex","to","exitMessageSelectMode","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","newResults","currentIds","gif","replaceAnimatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","updateUser","userUpdate","contactUserIds","updatedUser","updateUsers","addUsers","updateSelectedUserId","deleteUser","MEMO_EMPTY_ARRAY","getComplexKey","updateGlobalSearch","searchStatePartial","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","newState","fetchingStatus","replaceLocalTextSearch","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","updateManagement","newSettings","updateNotifySettings","peerType","isSilent","isShowPreviews","hasPrivateChatsMessagePreview","hasGroupMessagePreview","hasBroadcastMessagePreview","addBlockedContact","contactId","blocked","removeBlockedContact","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","setRequestInfoId","setPaymentStep","step","setInvoiceMessageInfo","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","setTrigger","trigger","trimText","MenuItem","destructive","handleKeyDown","keyCode","role","onKeyDown","ripples","setRipples","cleanUpDebounced","button","currentTarget","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","EMPTY_IMAGE_DATA_URI","webpToPng","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","WebpWorker","onmessage","handleLibWebpMessage","usePrevious","next","shouldSkipUndefined","label","success","readOnly","placeholder","autoComplete","inputMode","maxLength","onChange","onInput","onKeyPress","onBlur","labelText","htmlFor","subLabel","checked","blocking","onCheck","handleChange","captureEscKeyListener","captureKeyboardListener","onEsc","isAnimating","dispatchHeavyAnimationEvent","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","formatFixedNumber","number","toFixed","formatIntegerCompact","views","getFirstLetters","phrase","word","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","Menu","containerRef","positionX","positionY","autoClose","footer","noCloseOnBackdrop","onCloseAnimationEnd","onClose","menuRef","backdropContainerRef","useShowTransition","useEffectWithPrevDeps","prevIsOpen","onSelectWithEnter","focusedIndex","setFocusedIndex","focusedElement","activeElement","elementChildren","newIndex","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","oggToWav","opusData","arrayBuffer","typedArray","decoderWorker","DecoderWorker","wavWorker","WavWorker","command","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","DataUri","Stream","memoryCache","fetchPromises","mediaFormat","onProgress","progressiveUrl","getProgressive","mediaPng","prepared","prepareMedia","mediaSource","MediaSource","streamUrl","URL","createObjectURL","sourceBuffer","addSourceBuffer","endOfStream","appendBuffer","revokeObjectURL","getFromMemory","cancelProgress","mediaData","fullSize","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onLeft","onRight","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","releaseKeyboardListener","keyHandlers","windowSize","updateSizes","vh","setProperty","handleResize","utf16","len","RangeError","adapt","delta","numpoints","firsttime","k","decode","preserveCase","case_flags","input_length","out","bias","basic","j","ic","oldi","w","digit","lastIndexOf","cp","toUnicode","domain_array","ensureProtocol","getDomain","decodedHref","decodeURI","convertPunycode","toggleSafeLinkModal","openTelegramLink","isNotSafe","ctrlKey","altKey","shiftKey","metaKey","classNames","prevDeps","getFileSizeString","bytes","ONE_GIGABYTE","ONE_MEGABYTE","getDocumentExtension","getFileExtension","getColorFromExtension","extension","STRIPE_ERRORS","missing_payment_information","field","fieldError","invalid_number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","SHIPPING_ERRORS","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","getShippingError","errors","cur","currentInstance","animateSingle","tick","instance","isCancelled","animate","DropdownMenu","dropdownRef","setIsOpen","menu","onTrigger","RE_EMOJI_ONLY","twemojiRegex","DETECT_UP_TO","emojiCount","EXCLUDE_EMOJIS","unifiedToNative","unified","codePoints","parseInt","fromCodePoint","uncompressEmoji","emojiData","categories","emojiRaw","names","native","image","FILTERED_ATTRIBUTES","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$parent","skipComponentUpdate","forceIndex","fragment","moveDirection","updateComponent","setupComponentUpdateListener","initComponent","node","createNode","childNodes","insertBefore","replaceChild","areComponents","nextSibling","newKeys","removeAttribute","addAttribute","oldValue","updateAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","$currentChild","newChildKey","order","teactOrderKey","fragmentQueue","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","flushFragmentQueue","shouldMoveNode","isMovingDown","renderFastListChildren","createDocumentFragment","renderChildren","$firstChild","createTextNode","$child","$fragmentChild","cssText","render","headId","$head","openUserInfo","handleMessageClick","openChat","targetUser","targetMessage","textOptions","maxTextLength","unprocessed","processed","processPlaceholder","isEmbedded","origin","renderChatContent","renderUserContent","showQuotes","messageText","renderMessageContent","renderProductContent","renderMigratedContent","replaceValue","placeholderPosition","MESSAGE_DELETED","openChatByUsername","isInitialized","HEX_COLOR_REGEX","lerp","start","end","interpolationRatio","colors","themeColors","hexToRgb","hex","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","theme","withAnimation","isDarkTheme","shouldAnimate","startAt","themeColorTag","querySelector","classList","remove","transition","contains","animationLevel","messageTextSize","language","switchTheme","uiReadyState","authPhoneNumber","authRememberMe","authError","apiUpdate","authIsSessionRemembered","authIsLoading","password","file","authIsLoadingQrCode","setItem","reset","init","connectionState","authNearestCountry","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","lastSyncTime","saveSession","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","signOut","onUpdateConnectionState","currentUser","onUpdateCurrentUser","showError","ServiceWorkerNoSupportError","setPrototypeOf","scriptUrl","handleWorkerMessage","register","INITIAL_STATE","isLeftColumnShown","recentEmojis","added","recent","featured","saved","topPeers","audioPlayer","notifications","activeSessions","isBackgroundBlurred","patternColor","messageSendKeyCombo","shouldSuggestStickers","privacy","updateCacheThrottled","isAllowed","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","loadCache","initialState","time","parse","timeEnd","readCache","idsToSave","cid","chatIdsToSave","mainThread","history","replaceState","tabKey","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","mediaLoader","preloadTasks","main","telegramLogoPath","authCode","monkeyPath","authPassword","hasCustomBackground","customBackground","isCustomBackgroundColor","isRightColumnShown","setIsUiReady","isReady","markReady","useFlag","shouldRenderMask","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","getFilteredList","countryId","firstElementChild","dataset","handleInput","handleInputKeyDown","handleTrigger","select","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","data-country-id","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","clearAuthError","gotToAuthQrCode","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","setSelectionRange","handlePhoneNumberChange","selectionStart","selectionEnd","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","AuthQrCode","AppInactive","appInactivePath","renderMain","disconnect","isInactive","markInactive","TeactDOM"],"mappings":"aACE,SAASA,EAAqBC,GAQ7B,IAPA,IAMIC,EAAUC,EANVC,EAAWH,EAAK,GAChBI,EAAcJ,EAAK,GAKAK,EAAI,EAAGC,EAAW,GACpCD,EAAIF,EAASI,OAAQF,IACzBH,EAAUC,EAASE,GAChBG,OAAOC,UAAUC,eAAeC,KAAKC,EAAiBV,IAAYU,EAAgBV,IACpFI,EAASO,KAAKD,EAAgBV,GAAS,IAExCU,EAAgBV,GAAW,EAE5B,IAAID,KAAYG,EACZI,OAAOC,UAAUC,eAAeC,KAAKP,EAAaH,KACpDa,EAAQb,GAAYG,EAAYH,IAKlC,IAFGc,GAAqBA,EAAoBf,GAEtCM,EAASC,QACdD,EAASU,OAATV,GAOF,IAAIW,EAAmB,GAGnBC,EAAqB,CACxBC,EAAG,GAMAP,EAAkB,CACrBO,EAAG,GAWJ,SAASC,EAAoBnB,GAG5B,GAAGgB,EAAiBhB,GACnB,OAAOgB,EAAiBhB,GAAUoB,QAGnC,IAAIC,EAASL,EAAiBhB,GAAY,CACzCI,EAAGJ,EACHsB,GAAG,EACHF,QAAS,IAUV,OANAP,EAAQb,GAAUU,KAAKW,EAAOD,QAASC,EAAQA,EAAOD,QAASD,GAG/DE,EAAOC,GAAI,EAGJD,EAAOD,QAKfD,EAAoBI,EAAI,SAAuBtB,GAC9C,IAAIuB,EAAW,GAKZP,EAAmBhB,GAAUuB,EAASZ,KAAKK,EAAmBhB,IACzB,IAAhCgB,EAAmBhB,IAFX,CAAC,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,GAEUA,IACtDuB,EAASZ,KAAKK,EAAmBhB,GAAW,IAAIwB,SAAQ,SAASC,EAASC,GAIzE,IAHA,IAAIC,GAAa,GAAG3B,IAAUA,GAAW,IAAM,CAAC,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,wBAAwBA,GAAW,OAC3S4B,EAAWV,EAAoBW,EAAIF,EACnCG,EAAmBC,SAASC,qBAAqB,QAC7C7B,EAAI,EAAGA,EAAI2B,EAAiBzB,OAAQF,IAAK,CAChD,IACI8B,GADAC,EAAMJ,EAAiB3B,IACRgC,aAAa,cAAgBD,EAAIC,aAAa,QACjE,GAAe,eAAZD,EAAIE,MAAyBH,IAAaN,GAAQM,IAAaL,GAAW,OAAOH,IAErF,IAAIY,EAAoBN,SAASC,qBAAqB,SACtD,IAAQ7B,EAAI,EAAGA,EAAIkC,EAAkBhC,OAAQF,IAAK,CACjD,IAAI+B,EAEJ,IADID,GADAC,EAAMG,EAAkBlC,IACTgC,aAAa,gBAChBR,GAAQM,IAAaL,EAAU,OAAOH,IAEvD,IAAIa,EAAUP,SAASQ,cAAc,QACrCD,EAAQF,IAAM,aACdE,EAAQE,KAAO,WACfF,EAAQG,OAAShB,EACjBa,EAAQI,QAAU,SAASC,GAC1B,IAAIC,EAAUD,GAASA,EAAME,QAAUF,EAAME,OAAOC,KAAOlB,EACvDmB,EAAM,IAAIC,MAAM,qBAAuBhD,EAAU,cAAgB4C,EAAU,KAC/EG,EAAIE,KAAO,wBACXF,EAAIH,QAAUA,SACP5B,EAAmBhB,GAC1BsC,EAAQY,WAAWC,YAAYb,GAC/BZ,EAAOqB,IAERT,EAAQX,KAAOC,EAEJG,SAASC,qBAAqB,QAAQ,GAC5CoB,YAAYd,MACfe,MAAK,WACPrC,EAAmBhB,GAAW,MAMhC,IAAIsD,EAAqB5C,EAAgBV,GACzC,GAA0B,IAAvBsD,EAGF,GAAGA,EACF/B,EAASZ,KAAK2C,EAAmB,QAC3B,CAEN,IAAIC,EAAU,IAAI/B,SAAQ,SAASC,EAASC,GAC3C4B,EAAqB5C,EAAgBV,GAAW,CAACyB,EAASC,MAE3DH,EAASZ,KAAK2C,EAAmB,GAAKC,GAGtC,IACIC,EADAC,EAAS1B,SAASQ,cAAc,UAGpCkB,EAAOC,QAAU,QACjBD,EAAOE,QAAU,IACbzC,EAAoB0C,IACvBH,EAAOI,aAAa,QAAS3C,EAAoB0C,IAElDH,EAAOX,IAnGV,SAAwB9C,GACvB,OAAOkB,EAAoBW,EAAI,GAAK7B,EAAU,IAAM,CAAC,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,uBAAuB,EAAI,wBAAwBA,GAAW,MAkGrS8D,CAAe9D,GAG5B,IAAI+D,EAAQ,IAAIf,MAChBQ,EAAmB,SAAUb,GAE5Bc,EAAOf,QAAUe,EAAOhB,OAAS,KACjCuB,aAAaL,GACb,IAAIM,EAAQvD,EAAgBV,GAC5B,GAAa,IAAViE,EAAa,CACf,GAAGA,EAAO,CACT,IAAIC,EAAYvB,IAAyB,SAAfA,EAAMH,KAAkB,UAAYG,EAAMH,MAChE2B,EAAUxB,GAASA,EAAME,QAAUF,EAAME,OAAOC,IACpDiB,EAAMK,QAAU,iBAAmBpE,EAAU,cAAgBkE,EAAY,KAAOC,EAAU,IAC1FJ,EAAMM,KAAO,iBACbN,EAAMvB,KAAO0B,EACbH,EAAMnB,QAAUuB,EAChBF,EAAM,GAAGF,GAEVrD,EAAgBV,QAAWsE,IAG7B,IAAIX,EAAUY,YAAW,WACxBf,EAAiB,CAAEhB,KAAM,UAAWK,OAAQY,MAC1C,MACHA,EAAOf,QAAUe,EAAOhB,OAASe,EACjCzB,SAASyC,KAAKpB,YAAYK,GAG5B,OAAOjC,QAAQiD,IAAIlD,IAIpBL,EAAoBwD,EAAI9D,EAGxBM,EAAoByD,EAAI5D,EAGxBG,EAAoB0D,EAAI,SAASzD,EAASkD,EAAMQ,GAC3C3D,EAAoB4D,EAAE3D,EAASkD,IAClC/D,OAAOyE,eAAe5D,EAASkD,EAAM,CAAEW,YAAY,EAAMC,IAAKJ,KAKhE3D,EAAoBgE,EAAI,SAAS/D,GACX,oBAAXgE,QAA0BA,OAAOC,aAC1C9E,OAAOyE,eAAe5D,EAASgE,OAAOC,YAAa,CAAEC,MAAO,WAE7D/E,OAAOyE,eAAe5D,EAAS,aAAc,CAAEkE,OAAO,KAQvDnE,EAAoBoE,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQnE,EAAoBmE,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKnF,OAAOoF,OAAO,MAGvB,GAFAxE,EAAoBgE,EAAEO,GACtBnF,OAAOyE,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOnE,EAAoB0D,EAAEa,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRvE,EAAoB2E,EAAI,SAASzE,GAChC,IAAIyD,EAASzD,GAAUA,EAAOoE,WAC7B,WAAwB,OAAOpE,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAF,EAAoB0D,EAAEC,EAAQ,IAAKA,GAC5BA,GAIR3D,EAAoB4D,EAAI,SAASgB,EAAQC,GAAY,OAAOzF,OAAOC,UAAUC,eAAeC,KAAKqF,EAAQC,IAGzG7E,EAAoBW,EAAI,GAGxBX,EAAoB8E,GAAK,SAASjD,GAA2B,MAApBkD,QAAQlC,MAAMhB,GAAYA,GAEnE,IAAImD,EAAaC,OAAqB,aAAIA,OAAqB,cAAK,GAChEC,EAAmBF,EAAWvF,KAAKiF,KAAKM,GAC5CA,EAAWvF,KAAOd,EAClBqG,EAAaA,EAAWG,QACxB,IAAI,IAAIlG,EAAI,EAAGA,EAAI+F,EAAW7F,OAAQF,IAAKN,EAAqBqG,EAAW/F,IAC3E,IAAIU,EAAsBuF,EAInBlF,EAAoBA,EAAoBoF,EAAI,I,+BCnPrD,mnBAeO,IAAKC,G,SAAAA,O,iBAAAA,I,eAAAA,I,aAAAA,I,0BAAAA,M,KA4EZ,MAAMC,EAAWrB,OAAO,YAExB,IAAIsB,EAEG,SAASC,EAAeC,GAC7B,OAAOA,EAASnE,OAAS+D,EAAwBK,MAG5C,SAASC,EAAcF,GAC5B,OAAOA,EAASnE,OAAS+D,EAAwBO,KAG5C,SAASC,EAAaJ,GAC3B,OAAOA,EAASnE,OAAS+D,EAAwBS,IAG5C,SAASC,EAAmBN,GACjC,OAAOA,EAASnE,OAAS+D,EAAwBW,UAG5C,SAASC,EAAcR,GAC5B,OAAOI,EAAaJ,IAAaM,EAAmBN,GAGtD,SAASpE,EACP6E,EACAC,KACGC,GAQH,OANKD,IACHA,EAAQ,IAGVC,EAAWC,YAAQD,GAEfF,IAAWZ,EACNc,EACoB,mBAAXF,EAOpB,SAAiCF,EAAeG,EAAcC,GAC5D,IAAIE,EACoB,IAApBF,EAASjH,OACXmH,OAAiBlD,EACY,IAApBgD,EAASjH,QACjBmH,GAAkBF,EAEnBE,EAAiBF,EAGnB,MAAMG,EAAuC,CAC3Cd,SAAU,GACVO,YACA7C,KAAM6C,EAAU7C,KAChBgD,MAAO,IACFA,KACCG,GAAkB,CAAEF,SAAUE,IAEpCE,WAAW,EACXC,MAAO,CACLC,MAAO,CACLC,OAAQ,EACRC,SAAU,IAEZC,QAAS,CACPF,OAAQ,EACRC,SAAU,IAEZE,MAAO,CACLH,OAAQ,EACRC,SAAU,MAOhB,OAFAL,EAAkBd,SAAWsB,EAAsBR,GAE5CA,EAAkBd,SA3ChBuB,CAAwBd,EAAQC,EAAOC,GA4DlD,SAAyBpF,EAAamF,EAAcC,GAClD,MAAO,CACL9E,KAAM+D,EAAwBS,IAC9B9E,MACAmF,QACAC,SAAUa,EAAcb,GAAUc,IAAIC,IA/D/BC,CAAgBlB,EAAQC,EAAOC,GA4C1C,SAASW,EACPR,EACAH,EAAmC,IAEnC,MAAM,MAAED,GAAUI,EAElB,MAAO,CACLA,oBACAjF,KAAM+D,EAAwBW,UAC9BG,QACAC,YAcJ,SAASa,EAAcb,GACrB,IAAInH,EAAImH,EAASjH,OAAS,EAE1B,KAAOF,GAAK,GACLoI,EAAmBjB,EAASnH,IADpBA,KAMf,OAAOA,EAAI,EAAImH,EAASjH,OAASiH,EAASjB,MAAM,EAAGlG,EAAI,GAAKmH,EAG9D,SAASiB,EAAmBC,GAE1B,OAAiB,IAAVA,SAAmBA,EAG5B,SAASH,EAAkBG,GACzB,OAAID,EAAmBC,GAiBhB,CAAEhG,KAAM+D,EAAwBK,OAf5BO,EAAcqB,GAChBA,GAMenD,EAJEmD,EAKnB,CACLhG,KAAM+D,EAAwBO,KAC9BzB,MAAOoD,OAAOpD,KAHlB,IAA0BA,EAW1B,MAAMqD,EAA+B,GAO9B,SAASC,EAAgBlB,GAC9BhB,EAAoBgB,EACpBA,EAAkBE,MAAMC,MAAMC,OAAS,EACvCJ,EAAkBE,MAAMI,QAAQF,OAAS,EACzCJ,EAAkBE,MAAMK,MAAMH,OAAS,EAEvC,MAAM,UAAEX,EAAF,MAAaG,GAAUI,EAC7B,IAAImB,EAEJ,IACE,IAAIC,EACJ,GAAIC,IAAO,CACT,MAAMC,EAAgBtB,EAAkBpD,KACnCqE,EAAiBK,KACpBL,EAAiBK,GAAiB,CAChCA,gBACAC,YAAa,EACbC,YAAa,KAIbC,KACoB,qBAAlBH,GAA0D,oBAAlBA,GAE1C9C,QAAQkD,IAAK,kBAAiBJ,GAIlCF,EAAgBO,YAAYC,MAK9B,GAFAT,EAAmB1B,EAAUG,GAEzByB,IAAO,CACT,MAAMQ,EAAaF,YAAYC,MAAQR,EACjCE,EAAgBtB,EAAkBpD,KACpCiF,EAAa,GAEfrD,QAAQsD,KAAM,kCAAiCR,MAAkBS,KAAKC,MAAMH,SAE9EZ,EAAiBK,GAAeE,YAAYtI,KAAK2I,GACjDZ,EAAiBK,GAAeC,eAElC,MAAOjG,GACP2G,YAAY3G,GAEZ6F,EAAmBnB,EAAkBkC,cAGvC,GAAIlC,EAAkBC,WAAakB,IAAqBnB,EAAkBkC,cACxE,OAAOlC,EAAkBd,SAG3Bc,EAAkBkC,cAAgBf,EAElC,MAAMgB,EAAWvB,EAAkBO,GAGnC,OAFAnB,EAAkBd,SAAWsB,EAAsBR,EAAmB,CAACmC,IAEhEnC,EAAkBd,SAGpB,SAASkD,EAAkBC,EAAsBC,GACtD,cAAWD,UAAgBC,IAEhBD,EAAKtH,OAASuH,EAAKvH,OAEnBqE,EAAciD,IAASjD,EAAckD,GACvCD,EAAKzE,QAAU0E,EAAK1E,MAClB0B,EAAa+C,IAAS/C,EAAagD,GACpCD,EAAK5H,MAAQ6H,EAAK7H,KAAS4H,EAAKzC,MAAM1B,MAAQoE,EAAK1C,MAAM1B,OACxDsB,EAAmB6C,KAAS7C,EAAmB8C,MAEtDD,EAAKrC,kBAAkBP,YAAc6C,EAAKtC,kBAAkBP,WAE5D4C,EAAKzC,MAAM1B,MAAQoE,EAAK1C,MAAM1B,OAO7B,SAASqE,EAAYrD,GACrBQ,EAAcR,KAIfM,EAAmBN,GAkBzB,SAA0Bc,GACxB,IAAKA,EAAkBC,UACrB,OAGFD,EAAkBE,MAAMK,MAAMF,SAASmC,QAASC,IAE9CA,EAAKC,QAAU,OAGjB1C,EAAkBE,MAAMI,QAAQD,SAASmC,QAAQ,EAAGG,cAClD,GAAuB,mBAAZA,EACT,IACEA,IACA,MAAOrH,GACP2G,YAAY3G,MAKlB0E,EAAkBC,WAAY,EAMhC,SAAgBD,GAGdA,EAAkBE,MAAMI,QAAQD,SAASmC,QAASC,IAChDA,EAAKE,QAAU,KACfF,EAAKG,OAAS,KACdH,EAAKI,aAAe,OAGtB7C,EAAkBE,MAAMC,MAAME,SAASmC,QAASC,IAC9CA,EAAK7E,MAAQ,KACb6E,EAAKK,UAAY,KACjBL,EAAKM,OAAS,OAGhB/C,EAAkBE,MAAMK,MAAMF,SAASmC,QAASC,IAC9CA,EAAKI,aAAe,OAGtB7C,EAAkBE,MAAQ,KAC1BF,EAAkBd,SAAW,KAC7Bc,EAAkBP,UAAY,KAC9BO,EAAkBJ,MAAQ,KAC1BI,EAAkBgD,YAAc,KAChChD,EAAkBiD,SAAW,KA5B7BC,CAAOlD,GAvCLmD,CAAiBjE,EAASc,mBACjBd,EAAS9D,SAClBgI,YAA4BlE,EAAS9D,QAGrC8D,EAAS9D,OAAS,MAGpB8D,EAASW,SAAS2C,QAAQD,IAGrB,SAASc,EAAerD,GAG7B,OAFAkB,EAAgBlB,GAChBA,EAAkBC,WAAY,EACvBD,EAAkBd,SAuE3B,SAASoE,EAAqBtD,GAC5B,IAAKA,EAAkBC,YAAcD,EAAkBiD,SACrD,OAGF,MAAMM,EAAiBvD,EAAkBd,SAEzCgC,EAAgBlB,GAEZA,EAAkBd,WAAaqE,GACjCvD,EAAkBiD,WAIf,SAASO,EAAUtE,GACxB,OAAIM,EAAmBN,GACdsE,EAAUtE,EAASW,SAAS,IAE5BX,EAAS9D,OAIb,SAASqI,EAAUvE,EAA0B9D,GAC9CoE,EAAmBN,GACrBuE,EAAUvE,EAASW,SAAS,GAAIzE,GAEhC8D,EAAS9D,OAASA,EAIf,SAASsI,EAAYC,GAC1B,MAAM,OAAEvD,EAAF,SAAUC,GAAarB,EAAkBkB,MAAMC,MAMzC,IAAEH,EAsCd,YA1CyBnD,IAArBwD,EAASD,KACXC,EAASD,GAAU,CACjBxC,MAAO+F,EACPb,UAAWa,EACXZ,QAAU/C,EAgCPhB,EAhC8B4E,IAC3BvD,EAASD,GAAQ0C,YAAcc,IACjCvD,EAASD,GAAQ0C,UAAgC,mBAAbc,EAC/BA,EAA+BvD,EAASD,GAAQxC,OACjDgG,EAEC5D,EAAkB6D,iBAAoB7D,EAAkBgD,cAC3DhD,EAAkB6D,gBAAkBC,YAClC,IA1Dd,SAASC,EAAyB/D,GAC3BA,EAAkBC,YAIvBD,EAAkBE,MAAMC,MAAME,SAASmC,QAASC,IAC9CA,EAAK7E,MAAQ6E,EAAKK,YAGpB9C,EAAkB6D,gBAAkBC,YAAuB,IAAMC,EAAyB/D,IAC1FA,EAAkBgD,YAAcgB,YAAgB,IAAMV,EAAqBtD,KAgDzD+D,CAAyB/D,IAEjCA,EAAkBgD,YAAcgB,YAC9B,IAAMV,EAAqBtD,KAI/BA,EAAkB6D,kBAClB7D,EAAkBgD,cAEdvB,KAEFjD,QAAQkD,IACN,mBACA1B,EAAkBpD,KAElBoD,EAAkBP,WAAcO,EAAkBP,UAA2BwE,2BACxE,KAAKjE,EAAkBP,UAA2BwE,2BACnD,GACH,4BAA2B7D,kBAC5BC,EAASD,GAAQ0C,gBAQ7B9D,EAAkBkB,MAAMC,MAAMC,SAEvB,CACLC,EAASD,GAAQxC,MACjByC,EAASD,GAAQ2C,QAIrB,SAASmB,EACPC,EACAvB,EACAC,GAEA,MAAM,OAAEzC,EAAF,SAAUC,GAAarB,EAAkBkB,MAAMI,QAC/CN,EAAoBhB,EAEpBoF,EAAO,KACX,IAAKpE,EAAkBC,UACrB,OAGF,MAAM,QAAE0C,GAAYtC,EAASD,GAC7B,GAAuB,mBAAZuC,EACT,IACEA,IACA,MAAOrH,GACP2G,YAAY3G,GAIhB+E,EAASD,GAAQuC,QAAUC,UAGJ/F,IAArBwD,EAASD,IAAyByC,GAAgBxC,EAASD,GAAQyC,aACjEA,EAAawB,KAAK,CAACC,EAAY5L,IAAM4L,IAAejE,EAASD,GAAQyC,aAAcnK,KACrFyL,EAAYC,GAGdD,EAAYC,GAGd/D,EAASD,GAAU,CACjBwC,SACAC,eACAF,QAAStC,EAASD,GAAUC,EAASD,GAAQuC,aAAU9F,GAGzDmC,EAAkBkB,MAAMI,QAAQF,SAG3B,SAASmE,EAAU3B,EAA+BC,GACvD,OAAOqB,EAAoBM,IAAS5B,EAAQC,GAGvC,SAAS4B,EAAgB7B,EAA+BC,GAC7D,OAAOqB,EAAoBQ,IAAW9B,EAAQC,GAGzC,SAAS8B,EAAuBC,EAAmB/B,GACxD,MAAM,OAAEzC,EAAF,SAAUC,GAAarB,EAAkBkB,MAAMK,MACrD,IAAI,QAAEmC,GAAYrC,EAASD,IAAW,GAgBtC,YAbuBvD,IAArBwD,EAASD,IACNyC,EAAawB,KAAK,CAACC,EAAY5L,IAAM4L,IAAejE,EAASD,GAAQyC,aAAanK,OAErFgK,EAAUkC,KAGZvE,EAASD,GAAU,CACjBsC,UACAG,gBAGF7D,EAAkBkB,MAAMK,MAAMH,SAEvBsC,EAGF,SAASmC,EAAmCC,EAAgBjC,GAEjE,OAAO8B,EAAQ,IAAMG,EAAajC,GAO7B,SAASkC,EAAUpB,GACxB,OAAOgB,EAAQ,KAAM,CACnBjC,QAASiB,IAEP,IAGC,SAASqB,EAAmBvF,EAAcwF,EAAWC,IAAsBC,GAAY,GAC5F,OAAO,SAA0BvF,GAE/B,MAAMwF,EAAWL,EAAOnF,GAClByF,EAAcN,IAepB,QAbKM,EAAY3C,SAAY0C,EAAS1C,UAAYuC,EAASG,EAAS1C,QAAS9C,MACvEyB,KAAS8D,GAEX3G,QAAQkD,IACL,gBAAejC,EAAU7C,6BAC1B0I,YAAgBF,EAAS1C,QAAU9C,GAAO2F,KAAK,OAInDH,EAAS1C,QAAU9C,EACnByF,EAAY3C,QAAU5H,EAAc2E,EAAWG,IAG1CyF,EAAY3C,SA5WvBpI,SAASkL,iBAAiB,WAAY,KAEpChH,QAAQkD,IAAI,aAAc+D,YAAQ5M,OAAO6M,OAAOzE,GAAmB,cAAe,WA+WrE,KACbnG,gBACAiE,a,6BClmBF,0tFAAO,MAAM4G,EAAa,WACbC,EAAkB,cAElBC,EAAWC,8BAEXzE,GACXyE,EAEWrE,GAAa,EAEbsE,GAAUD,EAGVE,EAAkB,mFAGlBC,EAAwB,mBAExBC,GAA8B,EAC9BC,EAAyB,kBACzBC,EAAqC,GACrCC,EAAqC,IAErCC,GAAuB,EACvBC,EAAmB,WACnBC,EAA2B,mBAE3BC,EAA+B,uBAE/BC,EAAuB,eACvBC,EAAkB,gBAWzBC,GAPoC,IAAIC,IAAI,CAChD,aAAc,sBAAuB,iBAAkB,0BAA2B,kBAM9C,oBAAXnI,QAA0BA,OAAOoI,aAAe,KAE9DC,EAAsB,EAEtBC,EAA8B,IAC9BC,EAAqBL,EAAc,GAAK,GACxCM,EAAmD,EAArBD,EAE9BE,EAAiB,GACjBC,EAAkBR,EAAc,GAAK,GACrCS,EAAuB,IACvBC,EAAqB,GACrBC,EAAuB,GACvBC,EAAsB,GACtBC,EAAgB,GAChBC,EAAqB,IAIrBC,EAAyB,IAEzBC,EAAkC,GAClCC,GAA6B,EAI7BC,EAAsB,EACtBC,EAA0BD,EAE1BE,EAA+B,GAE/BC,EAAiB,IAEjBC,EAAoB,wBACpBC,EAA0B,8BAG1BC,EAA4C,KAE5CC,EAAkC,KAElCC,EAA2C,KAC3CC,EAA0C,IAC1CC,EAA0B,IAC1BC,EAAoC,IACpCC,EAAqC,IAErCC,EAAwB,IAExBC,EAAsB,IAEtBC,EAAqC,GACrCC,EAAoC,GACpCC,GAAoB,IACpBC,GAA2B,IAC3BC,GAAsB,GACtBC,GAAgC,GAChCC,GAA6B,GAC7BC,GAAsB,GACtBC,GAAqB,GACrBC,GAAsB,IACtBC,GAAiC,IACjCC,GAA+B,GAC/BC,GAAoB,iBAEpBC,GAA2B,IAC3BC,GAA4B,IAC5BC,GAA6B,IAE7BC,GAAiC,qEAGjCC,GAAmB,qHACnBC,GAAc,0DACdC,GAAqB,uDAGrBC,GAAgC,MAChCC,GAAgB,EAChBC,GAAqB,EAErBC,GAA4B,GAC5BC,GAA0B,EAC1BC,GAAwB,WAExBC,GAAa,CAAC,UAAW,OACzBC,GAAgB,eAChBC,GAAe,kDACfC,GAAsB,UACtBC,GAA2B,YAC3BC,GAAwB,0B,0hBCtHtBC,MAAf,EAaA,IAAIC,EAAgB,GAEpB,MAAMC,EAAsC,GACtCC,EAAwB,CA6C9B,WACE,IAAI5J,EACAC,MACFD,EAAgBO,YAAYC,OAI9B,IAAK,MAAMqJ,KAAaC,EAAWxF,SAAU,CAC3C,MAAM,gBACJyF,EADI,mBACaC,EADb,SACiCC,EADjC,YAC2CC,EAD3C,YACwDtI,GAC1DiI,EAEJ,IAAIM,EAEJ,IACEA,EAAiB,IACZJ,EAAgBL,EAAeO,MAC/BD,EAAmBI,EAAWC,IAEnC,MAAOnQ,GAGP,YAFA2G,YAAY3G,GAKV+F,KACExI,OAAO6M,OAAO6F,GAAgBlH,KAAKqH,OAAOC,QAE5CnN,QAAQsD,KAEL,sBAAqBmJ,EAAUW,2HAKlC/S,OAAOgT,KAAKN,GAAgB3S,SAAWsM,YAAqBoG,EAAcC,KACxE9J,KAEFjD,QAAQkD,IACN,uBACAuJ,EAAUW,oBACV,YACAtG,YAAgBgG,EAAcC,GAAgBhG,KAAK,OAIvD0F,EAAUK,YAAcC,EACxBN,EAAUa,uBAAwB,EAClCb,EAAUc,gBAEV/I,KAIJ,GAAI3B,IAAO,CACT,MAAM2K,EAAarK,YAAYC,MAAQR,EACnC4K,EAAa,GAEfxN,QAAQsD,KAAM,oCAAmCC,KAAKC,MAAMgK,YAtG5DP,EAAU,GACVP,EAAa,IAAIe,IAevB,MAAMC,EAAwBlI,aAJ9B,WACEgH,EAAUxI,QAAS2J,GAAOA,EAAGrB,OAKxB,SAASU,EAAUY,GACC,iBAAdA,GAA0BA,IAActB,IACjDA,EAAgBsB,EAChBF,KAIG,SAASG,IACd,OAAOvB,EAGF,SAASwB,IACd,OAAOb,EA6EF,SAASc,EAAW3P,EAAmB4P,GACvCzB,EAASnO,KACZmO,EAASnO,GAAQ,GAEjB6O,EAAQ7O,GAAS6P,KA9ErB,SAAoB7P,EAAc6P,GAC5B1B,EAASnO,IACXmO,EAASnO,GAAM4F,QAASgK,IACtB,MAAMJ,EAAYI,EAAQ1B,EAAeW,EAASgB,GAC9CL,GACFZ,EAAUY,KA0EZM,CAAW9P,EAAM6P,KAIrB1B,EAASnO,GAAM1D,KAAKsT,GAGf,SAASG,EAAYR,GAC1BnB,EAAU9R,KAAKiT,GAGV,SAASS,EAAeT,GAC7B,MAAMU,EAAQ7B,EAAU8B,QAAQX,IACjB,IAAXU,GACF7B,EAAU+B,OAAOF,EAAO,GAIrB,SAASG,EACd7B,EAA6C,MAAM,KACnDC,EAAwC,MAAM,MAE9C,OAAQ3L,GACC,SAASwN,EAAgBrN,GAC7BqN,EAAiChJ,2BAA6BxE,EAAU7C,KAEzE,MAAOsQ,GAAMxJ,YAASyJ,YAAcjC,IAC9BlI,EAAcoK,cAEpB7I,YAAU,IACD,KACL2G,EAAWmC,OAAOH,IAEnB,CAACA,IAEJ,IAAIjC,EAAYC,EAAW1N,IAAI0P,GAmB/B,GAlBKjC,IACHA,EAAY,CACVE,kBACAC,qBACAC,SAAUzL,EACVkM,uBAAuB,EACvB9I,cACA+I,cAAe,EACfH,oBAAqBnM,EAAU7C,MAGjCsO,EAAWoC,IAAIJ,EAAIjC,IAGjBA,EAAUa,wBACZb,EAAUa,uBAAwB,IAG/Bb,EAAUK,cAAgBpG,YAAqB+F,EAAUI,SAAUzL,GAAQ,CAC9EqL,EAAUI,SAAWzL,EAErB,IACEqL,EAAUK,YAAc,IACnBH,EAAgBL,EAAelL,MAC/BwL,EAAmBI,EAAWC,IAEnC,MAAOnQ,GACP2G,YAAY3G,IAKhB,OAAO,kBAACmE,EAAD,KAAewL,EAAUK,YAAiB1L,KAKnDyB,MACD3C,OAAe2N,UAAYA,EAE5B/R,SAASkL,iBAAiB,WAAY,KAEpChH,QAAQkD,IAAI,oBAAqB+D,YAAQ5M,OAAO6M,OAAOwF,GAAa,gBAAiB,a,6BCpNlF,SAASqC,EAA2CC,EAAiBtP,GAC1E,OAAOsP,EAAWC,OAAO,CAACC,EAA2BC,KACnDD,EAAMC,EAAOzP,IAAQyP,EAEdD,GACN,IAGE,SAASE,EACdF,EACAG,GAEA,OAAOhV,OAAOgT,KAAK6B,GAAOD,OAAO,CAACK,EAA8B5P,EAAK2O,KACnEiB,EAAS5P,GAAO2P,EAASH,EAAMxP,GAAMA,EAAK2O,EAAOa,GAC1CI,GACN,IAGE,SAASC,EAA2B1P,EAAWwN,GACpD,OAAOA,EAAK4B,OAAO,CAACO,EAAQ9P,KAC1B8P,EAAO9P,GAAOG,EAAOH,GACd8P,GACN,IAGE,SAASC,EAAiC5P,EAAWwN,GAC1D,OAAOA,EAAK4B,OAAO,CAACO,EAAQ9P,KACtBG,EAAOH,KACT8P,EAAO9P,GAAOG,EAAOH,IAGhB8P,GACN,IAGE,SAASE,EAA2B7P,EAAWwN,GACpD,MAAMsC,EAAa,IAAItH,IAAIgF,EAAKlL,IAAIK,SAIpC,OAAO+M,EAAK1P,EAHMxF,OAAOgT,KAAKxN,GAC3B+P,OAAQlQ,IAASiQ,EAAWE,IAAInQ,KAK9B,SAASuH,EACd+H,EACAc,EACAxQ,EAA0D,OAE1D,OAAO0P,EAAWe,KAAK,CAACC,EAAGC,KACzB,GAAIC,MAAMC,QAAQL,GAAW,CAC3B,MAAOM,EAAOC,GAASH,MAAMC,QAAQ7Q,GAAQA,EAAO,CAACA,EAAMA,IACpDgR,EAAWC,GAAaT,EAE/B,IAAIU,EACAC,EAUJ,GARyB,mBAAdH,GACTE,EAAUF,EAAUN,IAAM,EAC1BS,EAAUH,EAAUL,IAAM,GACI,iBAAdK,IAChBE,EAAUR,EAAEM,IAAc,EAC1BG,EAAUR,EAAEK,IAAc,GAGxBE,IAAYC,EACd,MAAiB,QAAVL,EAAkBI,EAAUC,EAAUA,EAAUD,EAClD,CACL,IAAIE,EACAC,EAUJ,MARyB,mBAAdJ,GACTG,EAAUH,EAAUP,IAAM,EAC1BW,EAAUJ,EAAUN,IAAM,GACI,iBAAdM,IAChBG,EAAUV,EAAEO,IAAc,EAC1BI,EAAUV,EAAEM,IAAc,GAGX,QAAVF,EAAkBK,EAAUC,EAAUA,EAAUD,GAI3D,IAAIE,EACAC,EAUJ,MARwB,mBAAbf,GACTc,EAASd,EAASE,IAAM,EACxBa,EAASf,EAASG,IAAM,GACK,iBAAbH,IAChBc,EAASZ,EAAEF,IAAa,EACxBe,EAASZ,EAAEH,IAAa,GAGV,QAATxQ,EAAiBsR,EAASC,EAASA,EAASD,IAIhD,SAAStP,EAAQwP,GACtB,OAAOA,EAAM7B,OAAO,CAACO,EAAQL,IACvBe,MAAMC,QAAQhB,GACTK,EAAOuB,OAAO5B,IAErBK,EAAO9U,KAAKyU,GACLK,GAER,IAGE,SAASwB,EAAsBF,GACpC,OAAOZ,MAAMe,KAAK,IAAI5I,IAAIyI,IAGrB,SAASI,EAAQJ,GACtB,OAAOA,EAAMlB,OAAOuB,SAGf,SAASC,EAAqBC,EAAeC,GAClD,OAAID,EAAOjX,SAAWkX,EAAOlX,QAItBiX,EAAOE,MAAM,CAACC,EAAMtX,IAAMsX,IAASF,EAAOpX,IAG5C,SAASuX,EAA4BJ,EAAeC,GACzD,OAAOD,EAAO,IAAMC,EAAOA,EAAOlX,OAAS,IAAMiX,EAAOA,EAAOjX,OAAS,IAAMkX,EAAO,GAGhF,SAASI,EAA2BZ,EAAYhC,GACrD,OAAOgC,EAAMlB,OAAQI,GAAMlB,EAAIe,IAAIG,IAG9B,SAAS2B,EAAMb,EAAcc,GAClC,MAAMpC,EAAS,GACf,IAAK,IAAItV,EAAI,EAAGA,EAAI4W,EAAM1W,OAAQF,GAAK0X,EACrCpC,EAAO9U,KAAKoW,EAAM1Q,MAAMlG,EAAGA,EAAI0X,IAGjC,OAAOpC,EAGF,SAASqC,EAAazS,GAC3B,MAAqB,iBAAVA,EACFA,EAGL8Q,MAAMC,QAAQ/Q,GACTA,EAAM+C,IAAI0P,GAGZxX,OAAOgT,KAAKjO,GAAO6P,OAAO,CAAC6C,EAAKpS,KACrCoS,EAAIpS,GAAkBmS,EAAUzS,EAAMM,IAC/BoS,GACN,IAWE,SAASC,EAAYjB,EAAiBkB,GAC3C,IAAIpQ,EAASkP,EAAM1W,OAEnB,KAAOwH,KACL,GAAIoQ,EAAUlB,EAAMlP,GAASA,EAAQkP,GACnC,OAAOA,EAAMlP,GAzKnB,+f,y5FCCA,MAAMqQ,EAAwB,2DACxBC,EAAU,IAAIC,OAAO7G,KAAkB,KAEtC,SAAS8G,EAAcjU,GAC5B,MAAM,OAAEkU,EAAF,GAAU3D,GAAOvQ,EAEvB,MAAQ,MAAKkU,KAAU3D,IAGlB,SAAS4D,EAAgB5S,GAC9B,MAAM6S,EAAQ7S,EAAI6S,MAAM,qBAExB,MAAO,CAAEF,OAAQnF,OAAOqF,EAAM,IAAKC,UAAWtF,OAAOqF,EAAM,KAGtD,SAASE,EAAqBtU,GACnC,OAAOA,EAAQuU,iBAAmBvU,EAAQuQ,GAGrC,SAASiE,EAAsBxU,EAAqByU,GAAU,GACnE,MAAM,KACJC,EADI,MACEC,EADF,MACSC,EADT,MACgBC,EADhB,MACuBC,EADvB,SAC8BnX,EAD9B,QACwCoX,EADxC,QACiDC,EADjD,KAC0DC,EAD1D,QACgEC,GAClElV,EAAQmV,QAEZ,GAAInV,EAAQoV,UACV,OAAIV,EACM,GAAED,EAAU,GAAK,QAAQC,EAAKA,OAGjC,QAGT,GAAIC,EACF,OAAID,EACM,GAAED,EAAU,GAAK,QAAQC,EAAKA,OAGjC,QAGT,GAAIE,EACF,OAAIA,EAAMS,MACJX,EACM,GAAED,EAAU,GAAK,SAASC,EAAKA,OAGlC,MAEHA,EACM,GAAED,EAAU,GAAK,QAAQC,EAAKA,OAGjC,QAIX,GAAIK,EACF,OAAUA,EAAQO,MAAV,WAGV,GAAIT,EAAO,CACT,MAAMU,EAAU,CAACV,EAAMW,MAAOX,EAAMY,WAAWhE,OAAOuB,SAASpK,KAAK,QAAW8L,GAAQA,EAAKA,KAC5F,OAAIa,EACM,MAAKA,EAGR,QAGT,OAAIT,EACEJ,EACM,GAAED,EAAU,GAAK,QAAQC,EAAKA,OAGjC,gBAGL/W,EACM,GAAE8W,EAAU,GAAK,QAAQC,EAAOA,EAAKA,KAAO/W,EAAS+X,WAG3DV,EACK,UAGLC,EACM,MAAKA,EAAKU,QAAQC,SAGxBV,EACK,UAGLR,EACKA,EAAKA,KAGPZ,EAGF,SAAS+B,EAAoB7V,GAClC,MAAM,KACJ0U,EADI,MACEC,EADF,MACSC,EADT,MACgBC,EADhB,MACuBC,EADvB,SAC8BnX,EAD9B,QACwCoX,EADxC,QACiDC,EADjD,KAC0DC,EAD1D,QACgEC,GAClElV,EAAQmV,QAEZ,GAAInV,EAAQoV,UACV,MAAQ,OAAKV,EAAOA,EAAKA,KAAO,SAGlC,GAAIC,EACF,MAAQ,OAAKD,EAAOA,EAAKA,KAAO,SAGlC,GAAIE,EACF,MAAQ,OAAKF,EAAOA,EAAKA,KAAOE,EAAMS,MAAQ,MAAQ,SAGxD,GAAIN,EACF,OAAUA,EAAQO,MAAV,YAGV,GAAIT,EAAO,CAET,MAAQ,OADQ,CAACA,EAAMW,MAAOX,EAAMY,WAAWhE,OAAOuB,SAASpK,KAAK,QAAW8L,GAAQA,EAAKA,MACpE,SAG1B,OAAII,EACM,OAAKJ,EAAOA,EAAKA,KAAO,iBAG9B/W,EACM,OAAK+W,EAAOA,EAAKA,KAAO/W,EAAS+X,UAGvCV,EACK,UAGLC,EACM,MAAKA,EAAKU,QAAQC,SAGxBV,EACK,UAGLR,EACKA,EAAKA,KAGPZ,EAIF,SAASgC,EAAe9V,GAC7B,MAAM,KACJ0U,EADI,QACEK,EADF,MACWJ,EADX,MACkBC,EADlB,MACyBC,EADzB,MACgCC,EADhC,SACuCnX,EADvC,KACiDsX,EADjD,QACuDc,EADvD,QACgEf,EADhE,QACyEE,GAC3ElV,EAAQmV,QAEZ,OAAIT,EACKA,EAAKA,KAGVK,GAAWJ,GAASC,GAASC,GAASC,GAASnX,GAAYqX,GAAWC,GAAQc,GAAWb,OAA7F,EAIOpB,EAGF,SAASkC,EAAsBhW,GACpC,MAAM,KACJ0U,EADI,QACEK,EADF,MACWJ,EADX,MACkBC,EADlB,MACyBC,EADzB,MACgCC,EADhC,SACuCnX,EADvC,KACiDsX,EADjD,QACuDc,EADvD,QACgEf,GAClEhV,EAAQmV,QAEZ,SAAIJ,GAAYH,GAASA,EAAMqB,aAI1BvB,GAAQC,GAASC,GAASC,GAASC,GAASnX,GAAYsX,GAAQc,GAAWf,KAKzEkB,YAAqBxB,EAAKA,QAAS,GAGrC,SAASyB,EAAsBnW,GACpC,MAAM,KAAE0U,GAAS1U,EAAQmV,QACzB,GAAMT,GAAQA,EAAKA,KAAKzY,QAAU,GAIK,IAAnC+Z,EAAsBhW,GAI1B,OAAO0U,EAAKA,KAGP,SAAS0B,EAAsBpW,GACpC,MAAM,KAAE0U,GAAS1U,EAAQmV,QAEzB,IAAIf,EACJ,GAAIM,GAAQA,EAAK2B,SAAU,CACzB,IAAIC,EAAO5B,EAAK2B,SAASE,KAAMC,GAAWA,EAAOpY,OAASqY,wBAAsBC,SAKhF,GAJIJ,IACFlC,EAAQkC,EAAKK,IAAKvC,MAAML,KAGrBK,IACHkC,EAAO5B,EAAK2B,SAASE,KAAMC,GAAWA,EAAOpY,OAASqY,wBAAsBG,KACxEN,GAAM,CACR,MAAM,OAAEO,EAAF,OAAU5a,GAAWqa,EAC3BlC,EAAQM,EAAKA,KAAKoC,UAAUD,EAAQA,EAAS5a,GAAQmY,MAAML,IASjE,IAJKK,GAASM,IACZN,EAAQM,EAAKA,KAAKN,MAAML,IAGrBK,EAIL,MAAO,CACLuC,IAAKvC,EAAM,GACX2C,OAAQ3C,EAAM,IAkBX,SAAS4C,EAAahX,GAC3B,OAAOA,EAAQiX,WAGV,SAASC,EAAelX,GAC7B,OAAOgT,QAAQhT,EAAQmX,kBAGlB,SAASC,EAAmBpX,GACjC,OAAOgT,QAAQhT,EAAQqX,aAGlB,SAASC,EAAgBtX,GAC9B,QAASA,EAAQmV,QAAQoC,OAGpB,SAASC,EAA6BxX,GAC3C,OAAOA,EAAQkU,SAAW5G,MAAiCmK,EAAezX,GAGrE,SAAS0X,EAAsB1X,GACpC,OAAOgT,QAAQhT,EAAQ2X,WAAa3X,EAAQ2X,SAAY,GAAKX,EAAahX,GAGrE,SAAS4X,EAAeC,GAC7B,OAAOA,EAAOtH,GAAK,EAAIuH,YAAgBD,GAAqBE,YAAaF,GAGpE,SAASG,EAAgBhY,GAC9B,OAAKA,EAAQiY,aAImB,8BAAzBjY,EAAQiY,aAA+C,SAAW,UAHhE,YAMJ,SAASR,EAAezX,GAC7B,OAAOA,EAAQuQ,IAAMvE,IAGhB,SAASkM,EAAsBlY,GACpC,OAAOA,EAAQmV,QAAQoC,QAA0C,iBAAhCvX,EAAQmV,QAAQoC,OAAOnZ,K,mBCxRnD,SAAS+Z,EAAkBnY,GAChC,OAAOA,EAAQmV,QAGV,SAASiD,EAAgBpY,GAC9B,OAAOgT,QACLqF,EAAgBrY,IACbsY,EAAgBtY,IAChBuY,EAAmBvY,IACnBwY,EAAkBxY,IA2ClB,SAA2BA,GAChC,OAAOA,EAAQmV,QAAQH,QA3ClByD,CAAkBzY,IAClB0Y,EAAe1Y,IACf2Y,EAAiB3Y,IACjB4Y,EAAgB5Y,IA2BhB,SAAyBA,GAC9B,OAAOA,EAAQmV,QAAQL,MA3BlB+D,CAAgB7Y,IAIhB,SAASqY,EAAgBrY,GAC9B,OAAOA,EAAQmV,QAAQR,MAGlB,SAAS2D,EAAgBtY,GAC9B,OAAOA,EAAQmV,QAAQP,MASlB,SAAS+D,EAAiB3Y,GAC/B,OAAOA,EAAQmV,QAAQoC,OAGlB,SAASqB,EAAgB5Y,GAC9B,OAAOA,EAAQmV,QAAQN,MAOlB,SAAS2D,EAAkBxY,GAChC,OAAOA,EAAQmV,QAAQJ,QAGlB,SAASwD,EAAmBvY,GACjC,OAAOA,EAAQmV,QAAQxX,SAOlB,SAAS+a,EAAe1Y,GAC7B,OAAOA,EAAQmV,QAAQF,KAGlB,SAAS6D,EAAkB9Y,GAChC,OAAOA,EAAQmV,QAAQD,QAGlB,SAAS6D,EAAkB/Y,GAChC,OAAOA,EAAQmV,QAAQY,QAGlB,SAASiD,EAAuBhZ,GACrC,MAAM+V,EAAUgD,EAAkB/Y,GAClC,OAAO+V,EAAUA,EAAQpB,WAAQzU,EAiB5B,SAAS+Y,EAA4BjZ,GAC1C,MAAMkZ,EAfD,SAAkClZ,GACvC,MAAMmZ,EAAQd,EAAgBrY,IACzBsY,EAAgBtY,IAChBuY,EAAmBvY,IACnBwY,EAAkBxY,IAClBgZ,EAAuBhZ,GAE5B,GAAKmZ,EAIL,OAAOA,EAAMD,UAIKE,CAAyBpZ,GAE3C,OAAOkZ,EAAYA,EAAUG,aAAUnZ,EAGlC,SAASoZ,EACdtZ,EACAvB,GAEA,MAAM,MACJkW,EADI,MACGC,EADH,QACUG,EADV,MACmBF,EADnB,MAC0BC,EAD1B,SACiCnX,GACnCqC,EAAQmV,QACNoE,EAAeP,EAAuBhZ,GAE5C,KAAM2U,GAASC,GAASG,GAAWwE,GAAgB1E,GAASC,GAASnX,GACnE,OAGF,MAAM6b,EAAOvF,EAAcjU,GAE3B,GAAI2U,GAAS4E,EACX,OAAQ9a,GACN,IAAK,QACL,IAAK,YACH,OAAU+a,EAAF,UACV,IAAK,SACH,GAAIC,EAAuBzZ,GACzB,OAGF,OAAUwZ,EAAF,UACV,IAAK,gBACH,OAAUA,EAAF,UACV,IAAK,aACH,OAAUA,EAAF,UAId,GAAI5E,EACF,OAAQnW,GACN,IAAK,QACL,IAAK,YACH,OAAU+a,EAAF,UACV,IAAK,SACH,GAAIC,EAAuBzZ,GACzB,OAGF,OAAI0Z,EAA0B9E,GACrB+E,EAAwB/E,EAAO4E,GAG9BA,EAAF,UACV,IAAK,gBACH,OAAUA,EAAF,UACV,IAAK,aACH,OAAOG,EAAwB/E,EAAO4E,GACxC,IAAK,WACH,OAAUA,EAAF,YAId,GAAI7b,EACF,OAAQc,GACN,IAAK,QACL,IAAK,YACL,IAAK,SACH,IAAKmb,YAAsBjc,IAAa8b,EAAuBzZ,GAC7D,OAGF,OAAUwZ,EAAF,UACV,QACE,OAAOA,EAIb,GAAIzE,EACF,OAAQtW,GACN,IAAK,QACH,OACF,IAAK,YACH,OAAU+a,EAAF,UACV,QACE,OAAOA,EAIb,GAAI3E,EACF,OAAQpW,GACN,IAAK,QACL,IAAK,YACH,OACF,QACE,OAAOkb,EAAwB9E,EAAO2E,GAI5C,GAAI1E,EACF,OAAQrW,GACN,IAAK,QACL,IAAK,YACH,OACF,QACE,OAAO+a,GAOf,SAASG,EAAwBR,EAA4BK,GAC3D,OAAIK,KAA4BC,IACtB,GAAEN,cAAiBL,EAAMY,iBAAiBZ,EAAMa,WAGnDR,EAOF,SAASS,EACdja,EAAqBvB,GAErB,MAAM,QACJsW,EADI,MACKH,EADL,MACYC,EADZ,MACmBC,GACrB9U,EAAQmV,QAEZ,OAAIJ,GAAsB,WAAXtW,GAAuBsW,EAAQmF,WACrCC,iBAAeC,OACbxF,GAASiF,MACN,eAAXpb,GAAwC,WAAXA,GAAuBib,EAA0B9E,IAExEuF,iBAAeE,YACbxF,GAASC,EAEdA,IAAUwF,IACLH,iBAAeI,QAGjBJ,iBAAeE,YAGjBF,iBAAeI,QAGjB,SAASC,EAAwBxa,GACtC,MAAM,MAAE2U,EAAF,MAASC,EAAT,QAAgBmB,GAAY/V,EAAQmV,QAE1C,OAAIR,GAAUoB,GAAWA,EAAQpB,MACvB,QAAO3U,EAAQya,YAGrB7F,EACKA,EAAMc,cADf,EAOK,SAAS+D,EAAuBzZ,GACrC,MAAM,MAAE2U,EAAF,MAASC,EAAT,SAAgBjX,GAAaqC,EAAQmV,QAE3C,OAAQR,GAASA,EAAM+F,SAAa9F,GAASA,EAAM8F,SAAa/c,GAAYA,EAASgd,eAGhF,SAASjB,EAA0B9E,GACxC,OAAOA,EAAMS,OAAST,EAAMqB,SAAWrB,EAAMmF,MAnQjB,SAsQvB,SAASa,EACdC,EAAsCC,EAAqBC,GAAe,GAE1E,MAAMC,EAAMC,GAAqBJ,EAAUC,EAAW,SAEtD,OAAOC,EAAeC,EAAIE,UAAYF,EAGjC,SAASG,EAAuBxG,GACrC,OACEA,EAAMyG,MAAM7E,KAAMwD,GAAuB,MAAdA,EAAK3b,OAC7BuW,EAAMyG,MAAM7E,KAAMwD,GAAuB,MAAdA,EAAK3b,OAChCid,EAAyB1G,GAIzB,SAAS0G,EAAyB1G,GACvC,OACEA,EAAMyG,MAAM7E,KAAMwD,GAAuB,MAAdA,EAAK3b,OAC7BuW,EAAMyG,MAAM7E,KAAMwD,GAAuB,MAAdA,EAAK3b,OAChCuW,EAAMyG,MAAM7E,KAAMwD,GAAuB,MAAdA,EAAK3b,OAChCuW,EAAMuE,UAIN,SAASoC,EAAmB1G,GACjC,GAAIA,EAAM2G,OAAS3G,EAAM4G,OACvB,OAAO5G,EAMJ,SAAS6G,GAAsBzb,EAAqB0b,EAAmBC,GAAmB,GAC/F,MAAMC,EAAcnE,EAAezX,GAInC,MAAO,CACL4b,cAAaC,eAJQD,GAAeD,EAIPG,iBAHN/M,OAAO2M,IAO3B,SAAST,GACdJ,EAAsCkB,EAAsBC,GAE5D,IAAIC,EAEJ,OAAQD,GACN,IAAK,QACHC,EAAajc,IACX,MAAM4U,EAAQ0D,EAAgBtY,GAC9B,OAAOqY,EAAgBrY,IAAa4U,IAAUA,EAAMqB,UAAYrB,EAAMS,OAExE,MAEF,IAAK,YACH4G,EAAY1D,EACZ,MAEF,IAAK,QACH0D,EAAajc,GAAwB+Y,EAAkB/Y,IDhGtD,SAAgCA,GACrC,MAAM,KAAE0U,GAAS1U,EAAQmV,QACnBf,EAAQM,GAAQA,EAAKA,KAAKN,MAAML,GAEtC,GAAKK,EAIL,MAAO,CACLuC,IAAKvC,EAAM,GACX2C,OAAQ3C,EAAM,ICsFuD8H,CAAuBlc,GAC1F,MAEF,IAAK,QACHic,EAAYrD,EACZ,MAEF,QACE,MAAO,GAGX,OAAOmD,EAAWjL,OAAO,CAACO,EAAQgD,KAC5BwG,EAASxG,IAAc4H,EAAUpB,EAASxG,KAC5ChD,EAAO9U,KAAK8X,GAGPhD,GACN,IAGE,SAAS8K,GAAiBnc,GAC/B,MAAM,MAAE6U,EAAF,MAASC,EAAT,MAAgBF,GAAUuD,EAAkBnY,GAC5CmZ,EAAQtE,GAASC,GAASF,EAChC,GAAKuE,EAIL,OAAOA,EAAMiD,SC7WR,SAASC,GAAmBnI,EAAgBoI,GACjD,MAAQ,GAAEpI,KAAUoI,I,oCCCtB,olC,i5FCCO,SAASC,EAAWC,EAAqBC,GAC9C,OAAOD,EAAOE,MAAMC,KAAKF,GCKpB,SAASG,EAAWJ,EAAqBtI,GAC9C,OAAOsI,EAAOK,MAAMF,KAAKzI,GAGpB,SAAS4I,EAAeN,EAAqBO,GAClD,MAAMN,EAASO,YAAqBD,GACpC,QAAKN,GAIEF,EAAWC,EAAQC,GAGrB,SAASQ,EAAqBT,EAAqBtI,GACxD,OAAOA,IAAWsI,EAAOU,cAGpB,SAASC,EAAoBX,EAAqBO,GACvD,MAAMK,EAAON,EAAeN,EAAQO,GACpC,OAAOK,GAAQC,aAAUD,GAGpB,SAASE,EAAkBd,GAChC,OAAOtgB,OAAO6M,OAAOyT,EAAOK,MAAMF,MAAMpG,KAAK,EAAGgH,eAAyBA,GAGpE,SAASC,EAAsBhB,EAAqBO,GACzD,IAAIU,aAAcV,EAAKxM,MAAOmN,aAAcX,IAAUA,EAAKY,SAI3D,OAAKZ,EAAKY,SAASC,SAAWb,EAAKY,SAASC,QAAQ3hB,SAAW8O,IAIxDgS,EAAKY,SAASC,QAAQ9M,OAAO,CAAC+M,GAAepB,YAC9CD,EAAOE,MAAMC,KAAKF,IAAWqB,aAAatB,EAAOE,MAAMC,KAAKF,KAAYA,IAAWD,EAAOU,cACrFW,EAAc,EAGhBA,EACN,GATMd,EAAKY,SAASE,YAYlB,SAASE,EAAcvB,EAAqBtI,GACjD,MAAM6I,EAAOH,EAAWJ,EAAQtI,GAC1BuI,EAASM,GAAQC,YAAqBD,GACtCK,EAAOX,GAAUF,EAAWC,EAAQC,GAC1C,GAAKW,GAASC,aAAUD,GAIxB,OAAOA,EAGF,SAASY,EAA0BxB,EAAqBtI,GAC7D,MAAM6I,EAAOH,EAAWJ,EAAQtI,GAC1B+J,EAAMF,EAAcvB,EAAQtI,GAClC,IAAK6I,IAASkB,EACZ,OAAO,EAGT,GAAIlB,EAAKmB,aAAehG,aAAsB6E,EAAKmB,aACjD,OAAO,EAGT,MAAMC,EAAc3B,EAAO3B,SAASuD,SAASlK,GAC7C,IAAKiK,EACH,OAAO,EAGT,MAAM,UAAErD,GAAcqD,EAAYE,YAAYC,mBAAmB,GACjE,OAAOxD,IAAcA,EAAU7e,OAG1B,SAASsiB,EAA2B/B,GACzC,OAAOxJ,QAAQwJ,EAAOK,MAAM2B,QAAQC,QAG/B,SAASC,EAAmBlC,EAAqBtI,EAAgB9V,GACtE,MAAM,QAAEogB,GAAYhC,EAAOK,MAC3B,GAAIze,EAAM,CACR,MAAMugB,EAAaH,EAAQpgB,GAC3B,OAAO4U,QAAQ2L,GAAcA,EAAWC,SAAS1K,IAGnD,OAAOhY,OAAO6M,OAAOyV,GAAS9W,KAAMmX,GAASA,GAAQA,EAAKD,SAAS1K,IAG9D,SAAS4K,EAAmBtC,EAAqBtI,GACtD,MAAM6I,EAAOH,EAAWJ,EAAQtI,GAChC,GAAK6I,GAAS2B,EAAmBlC,EAAQtI,GAIzC,OAAO6I,EAAKgC,WAAavR,IAAqB,WAAa,SAGtD,SAASwR,EAAiBxC,EAAqBuC,GACpD,OAAOvC,EAAOyC,YAAYtC,KAAKoC,GAe1B,SAASG,EAAmB1C,EAAqBtI,EAAgB6K,EAAWxR,KACjF,MAAM,OAAEkR,EAAF,SAAUU,GAAa3C,EAAOK,MAAMuC,iBAE1C,GAAIL,IAAaxR,IACf,QAASkR,GAAUA,EAAOG,SAAS1K,GAGrC,GAAI6K,IAAavR,IACf,QAAS2R,GAAYA,EAASP,SAAS1K,GAGzC,MAAQyI,KAAM0C,GAAoB7C,EAAOyC,aAEnC,cAAEK,GAAkBD,EAAgBN,IAAa,GACvD,QAASO,GAAiBA,EAAcV,SAAS1K,GAI5C,SAASqL,EAAqB/C,EAAqBgD,GACxD,MAAMC,EAAkBD,EAASE,cACjC,OAAOxjB,OAAO6M,OAAOyT,EAAOK,MAAMF,MAAMpG,KACrCwG,GAASA,EAAKyC,UAAYzC,EAAKyC,SAASE,gBAAkBD,GAIxD,SAASE,EAA0BnD,GACxC,MAAMoD,EAAgBpD,EAAOK,MAAM2B,QAAQC,OAC3C,IAAKmB,EACH,OAAO,EAGT,MAAM/C,EAAQL,EAAOK,MAAMF,KAE3B,OAAOiD,EAAc9O,OAAO,CAAC6C,EAAKO,KAChC,MAAM6I,EAAOF,EAAM3I,GAEnB,OAAI6I,GAAQA,EAAK8C,cAAgB9C,EAAK+C,QAC7BnM,EAAMoJ,EAAK8C,YAGblM,GACN,G,WC5JE,SAASoM,EAA2BvD,GACzC,OAAOA,EAAOwD,SAASC,OAGlB,SAASC,EAAuB1D,GACrC,OAAOA,EAAO2D,KAAKF,OAGd,SAASG,EAAiB5D,EAAqBjM,GACpD,OAAOiM,EAAOwD,SAASK,SAAS9P,GAG3B,SAAS+P,EAAuB9D,EAAqBlH,GAC1D,MAAMiL,EAAcrkB,OAAO6M,OAAOyT,EAAOwD,SAASK,UAClD,IAAIG,EAAiC,GAUrC,OATAD,EAAY1a,QAAQ,EAAG4a,YACrB,IAAKA,EACH,OAEF,MAAMT,EAAWS,EAAMnL,GACnB0K,IACFQ,EAAmBA,EAAiB5N,OAAOoN,MAGxCQ,EAGF,SAASE,EAAoBlE,EAAqBlH,GACvD,MAAM,eAAEqL,GAAmBnE,EAC3B,IAAKmE,IAAmBA,EAAeX,SACrC,OAIF,MAAMY,EAAetL,EAAMuL,QAAQ,IAAU,IAE7C,OAAOF,EAAeX,SAASzJ,KAAMxB,GAAYA,EAAQO,QAAUA,GAASP,EAAQO,QAAUsL,GCPzF,SAASE,EAAyBtE,GACvC,MAAM,aAAEuE,GAAiBvE,EAAO3B,SAEhC,GAAIkG,GAAgBA,EAAa9kB,OAC/B,OAAO8kB,EAAaA,EAAa9kB,OAAS,GAMvC,SAAS+kB,EAAkBxE,GAChC,MAAM,OAAEtI,GAAW4M,EAAyBtE,IAAW,GAEvD,OAAOtI,EAAS0I,EAAWJ,EAAQtI,QAAUhU,EAGxC,SAAS+gB,EAAmBzE,EAAqBtI,GACtD,MAAM2G,EAAW2B,EAAO3B,SAASuD,SAASlK,GAE1C,OAAO2G,EAAWA,EAAS8B,UAAOzc,EAG7B,SAASghB,EAAwB1E,EAAqBtI,GAC3D,MAAM2G,EAAW2B,EAAO2E,kBAAkB/C,SAASlK,GAEnD,OAAO2G,EAAWA,EAAS8B,UAAOzc,EAG7B,SAASkhB,EACd5E,EACAtI,EACAoI,EACA/a,GAEA,MAAM4c,EAAc3B,EAAO3B,SAASuD,SAASlK,GAC7C,IAAKiK,EACH,OAGF,MAAMkD,EAASlD,EAAYE,YAAY/B,GACvC,OAAK+E,EAIEA,EAAO9f,QAJd,EAOK,SAAS+f,EAAgB9E,EAAqBtI,EAAgBoI,GACnE,OAAO8E,EAAkB5E,EAAQtI,EAAQoI,EAAU,aAG9C,SAASiF,EAAkB/E,EAAqBtI,EAAgBoI,GACrE,OAAO8E,EAAkB5E,EAAQtI,EAAQoI,EAAU,eAG9C,SAASkF,EACdhF,EAAqBtI,EAAgBoI,EAAkBmF,GAEvD,OAAQA,GACN,IAAK,SACH,OAAOC,EAAkBlF,EAAQtI,EAAQoI,GAC3C,IAAK,SACH,OAAOqF,EAAgBnF,EAAQtI,GACjC,IAAK,YACH,OAAO0N,EAAmBpF,EAAQtI,IAMjC,SAASwN,EAAkBlF,EAAqBtI,EAAgBoI,GACrE,OAAO8E,EAAkB5E,EAAQtI,EAAQoI,EAAU,eAG9C,SAASqF,EAAgBnF,EAAqBtI,GACnD,OAAOkN,EAAkB5E,EAAQtI,EAAQoK,iBAAgB,aAGpD,SAASsD,EAAmBpF,EAAqBtI,GACtD,OAAOkN,EAAkB5E,EAAQtI,EAAQoK,iBAAgB,gBAGpD,SAASuD,EAAmBrF,EAAqBtI,EAAgBoI,GACtE,OAAO8E,EAAkB5E,EAAQtI,EAAQoI,EAAU,gBAG9C,SAASwF,EAAmBtF,EAAqBtI,EAAgBoI,GACtE,OAAO8E,EAAkB5E,EAAQtI,EAAQoI,EAAU,gBAG9C,SAASyF,EAAgBvF,EAAqBtI,EAAgBoI,GACnE,OAAO8E,EAAkB5E,EAAQtI,EAAQoI,EAAU,aAG9C,SAAS0F,EAAyBxF,EAAqBtI,GAC5D,OAAOkN,EAAkB5E,EAAQtI,EAAQoK,iBAAgB,sBAGpD,SAAS2D,EAAYzF,EAAqBtI,EAAgBoI,GAC/D,OAAO8E,EAAkB5E,EAAQtI,EAAQoI,EAAU,SAG9C,SAAS4F,EAAgB1F,EAAqBtI,EAAgBoI,GACnE,OAAO8E,EAAkB5E,EAAQtI,EAAQoI,EAAU,aAG9C,SAAS6F,EAAiB3F,EAAqBtI,EAAgBoI,GACpE,OAAO8E,EAAkB5E,EAAQtI,EAAQoI,EAAU,cAG9C,SAAS8F,EAAqB5F,EAAqBtI,EAAgBoI,GACxE,OAAO8E,EAAkB5E,EAAQtI,EAAQoI,EAAU,kBAG9C,SAAS+F,EAAuB7F,EAAqBtI,EAAgBoI,GAC1E,GAAIA,IAAagC,iBACf,OAAO1B,EAAWJ,EAAQtI,GAG5B,MAAMoO,EAAaH,EAAiB3F,EAAQtI,EAAQoI,GACpD,OAAKgG,EAIE1F,EAAWJ,EAAQ8F,EAAWC,iBAAmBrO,QAJxD,EAOK,SAASsO,EAAyBhG,EAAqBtI,EAAgBoI,GAC5E,GAAIA,IAAagC,iBACf,OAGF,MAAMgE,EAAaH,EAAiB3F,EAAQtI,EAAQoI,GACpD,OAAKgG,EAIEA,EAAWG,kBAJlB,EAOK,SAASC,EAAsBlG,EAAqBtI,EAAgBlU,GACzE,MAAMme,EAAc3B,EAAO3B,SAASuD,SAASlK,GAC7C,IAAKiK,EACH,OAGF,MAAM,iBAAEhH,EAAF,oBAAoBwL,GAAwB3iB,EAClD,OAAKmX,GAAqBwL,EAInBzmB,OAAO6M,OAAeoV,EAAYE,aAAa9H,KAAM8K,GACnDA,EAAOiB,aACXnL,GAAoBA,IAAqBkK,EAAOiB,WAAWG,cACxDE,GAAuBA,IAAwBtB,EAAOiB,WAAWG,oBAPzE,EAYK,SAASG,EAA8BpG,EAAqBtI,EAAgBlU,GACjF,MAAM6iB,EAAqB/B,EAAyBtE,GACpD,IAAKqG,EACH,OAAO,EAGT,MAAM,WAAEP,GAAeI,EAAsBlG,EAAQtI,EAAQlU,IAAY,GACzE,OACEkU,IAAW2O,EAAmB3O,SAE3B2O,EAAmBvG,WAAagC,kBAC7BgE,GAAcO,EAAmBvG,WAAagG,EAAWhG,UAK5D,SAASwG,EAAuBtG,EAAqBtI,EAAgBoI,GAC1E,MAAMyG,EAAcrB,EAAkBlF,EAAQtI,EAAQoI,GACtD,IAAKyG,IAAgBA,EAAY9mB,OAC/B,OAAO,EAGT,IAAI+mB,EAEJ,GAAI1G,IAAagC,iBAAgB,CAC/B,MAAMvB,EAAOH,EAAWJ,EAAQtI,GAChC,IAAK6I,IAASA,EAAKmB,YACjB,OAAO,EAGT8E,EAAgBjG,EAAKmB,YAAY3N,OAC5B,CACL,MAAM+R,EAAaH,EAAiB3F,EAAQtI,EAAQoI,GACpD,IAAKgG,IAAeA,EAAWU,cAC7B,OAGFA,EAAgBV,EAAWU,cAI7B,OAAIA,GAAiBhX,MAA0BiX,GAAkBzG,EAAQtI,EAAQ8O,IAI1ED,EAAYA,EAAY9mB,OAAS,IAAM+mB,EAGzC,SAASC,GAAkBzG,EAAqBtI,EAAgBG,GACrE,MAAM6O,EAAejC,EAAmBzE,EAAQtI,GAEhD,OAAOgP,EAAeA,EAAa7O,QAAanU,EAG3C,SAASijB,GAAuB3G,EAAqBtI,EAAgBG,GAC1E,MAAM6O,EAAehC,EAAwB1E,EAAQtI,GAErD,OAAOgP,EAAeA,EAAa7O,QAAanU,EAG3C,SAASkjB,GACd5G,EAAqBtI,EAAgBoI,EAAkBmF,GAEvD,GAAwB,cAApBA,EAAiC,CACnC,MAAMpN,EAAY2N,EAAyBxF,EAAQtI,GACnD,OAAOG,EAAY8O,GAAuB3G,EAAQtI,EAAQG,QAAanU,EAClE,CACL,MAAMmU,EAAY0N,EAAgBvF,EAAQtI,EAAQoI,GAClD,OAAOjI,EAAY4O,GAAkBzG,EAAQtI,EAAQG,QAAanU,GAI/D,SAASmjB,GAA0B7G,EAAqB8G,GAC7D,IAAIC,EAGJ,IAAK,MAAML,KAAgBhnB,OAAO6M,OAAOyT,EAAO3B,SAASuD,UAAW,CAClE,MAAM,KAAEzB,GAASuG,EAIjB,GAHAK,EAAkBrnB,OAAO6M,OAAO4T,GAAMpG,KAAMvW,GACnCA,EAAQmV,QAAQF,MAAQjV,EAAQmV,QAAQF,KAAK1E,KAAO+S,GAEzDC,EACF,MAIJ,OAAOA,EAGF,SAASC,GAAuBhH,EAAqBtI,GAC1D,MAAQA,OAAQuP,EAAV,UAAyBpP,GAAcmI,EAAOkH,gBAAkB,GAEtE,OAAOD,IAAkBvP,EAASG,OAAYnU,EAGzC,SAASyjB,GAAuBnH,EAAqBxc,GAC1D,MAAM4jB,EAAYJ,GAAuBhH,EAAQxc,EAAQkU,QAEzD,QAAO0P,IAAYA,IAAc5jB,EAAQuQ,IAAMqT,IAAc5jB,EAAQuU,iBAQhE,SAASsP,GACdrH,EAAqBxc,EAAqB8jB,GAAkB,GAE5D,OARK,SAA+BtH,EAAqBxc,GACzD,MAAM,wBAAE+jB,GAA4BnH,EAAWJ,EAAQxc,EAAQkU,SAAW,GAC1E,OAAOuD,aAAezX,KAAa+jB,GAA2BA,EAA0B/jB,EAAQuQ,GAM3FyT,CAAsBxH,EAAQxc,IAAa8jB,EAIzC9L,YAAgBhY,GAHd,OAMJ,SAASikB,GAAazH,EAAqBxc,GAChD,MAAM,SAAE2X,GAAa3X,EACrB,GAAK2X,EAIL,OAAOA,EAAW,EAAI4E,EAAWC,EAAQ7E,GAAYiF,EAAWJ,EAAQ7E,GAGnE,SAASuM,GAAsB1H,EAAqBxc,GACzD,MAAM,YAAEqX,GAAgBrX,EACxB,GAAKqX,EAIL,OAAIA,EAAY8M,eAAiB9M,EAAY+M,WACpCxH,EAAWJ,EAAQnF,EAAY+M,YAC7B/M,EAAYgN,aACd9H,EAAWC,EAAQnF,EAAYgN,mBADjC,EAOF,SAASC,GAA4B9H,EAAqBxc,EAAqBsc,GACpF,MAAMS,EAAOH,EAAWJ,EAAQxc,EAAQkU,QACxC,IAAK6I,GAAQA,EAAKwH,aAChB,MAAO,GAGT,MAAMC,EAAY/G,aAAcV,EAAKxM,IAC/BkU,EAAiBxH,EAAqBT,EAAQxc,EAAQkU,QACtDwQ,EAAeC,aAAiB5H,GAChC6H,EAAeC,aAAiB9H,GAChC+H,EAAYpH,aAAcX,GAC1BgI,EAAwBvN,aAA6BxX,GAErDglB,EAAQhO,aAAahX,GACrBilB,EAAW3N,aAAgBtX,IAC3B,QAAEmV,GAAYnV,EACdklB,GACHT,GAAkBU,KAAKlgB,MAAuB,IAAfjF,EAAQya,KA9TP,WAgU/BtF,EAAQJ,SAAWI,EAAQH,SAAWG,EAAQF,MAAQE,EAAQoC,QAAUpC,EAAQN,OAC5EM,EAAQP,OAASO,EAAQP,MAAMqB,WAEjCmB,aAAmBpX,KACnBA,EAAQolB,SAGRC,EAAWC,YAAiBvI,EAAMT,KAAcyI,EAEhDQ,EAAmBf,GACvBzH,EAAKyI,YACAV,IAAcW,aAAkB1I,EAAM,gBACxC2I,YAAiB3I,EAAM,eAG5B,IAAI4I,GAAUV,GAAYM,EACtBK,GAAW,EAEf,MAAMC,EAAmBlE,EAAgBnF,EAAQO,EAAKxM,IAElDoV,IACFC,EAAW5S,QAAQ6S,GAAoBA,EAAiBjH,SAAS5e,EAAQuQ,KACzEoV,GAAUC,GAGZ,MAAME,EAAYtB,GACbQ,GACAN,GACA3H,EAAKyI,WACLE,YAAiB3I,EAAM,kBAEtBgJ,EAAkBD,IAAcf,IACnCP,IAAcC,GACXC,IACFM,GAASU,YAAiB3I,EAAM,oBAI9BiJ,GAAWf,GAAYC,IAC3BF,GACIF,IAAc/H,EAAKyI,WAAaE,YAAiB3I,EAAM,kBAGvDkJ,GAAchB,IAAaF,EAE3BmB,EAAalT,QAAQhT,EAAQmV,QAAQJ,SACrCoR,EAAqBD,GD9YtB,SAAiC1J,EAAqBzH,GAC3D,MAAM,SAAEiL,GAAaxD,EAAOwD,SAASoG,SACrC,OAAOpG,GAAYA,EAAStY,KAAK,EAAG6I,QAASA,IAAOwE,EAAQxE,IC4YnB8V,CAAwB7J,EAAQxc,EAAQmV,QAAQJ,SACnFuR,GAAkBrB,GAAYiB,IAAeC,EAC7CI,GAAoBtB,GAAYkB,EAChCK,GAAWvB,EACXwB,GAAexB,IAAaH,GAAaF,GACzC8B,GAAazB,EAgBnB,MAAO,CACL0B,UAhBgB,CAChBtB,EACAW,EACAL,EACAC,EACAE,EACAC,EACAE,EACAK,EACAC,EACAC,EACAC,EACAC,GACAtT,MAAOwT,IAAaA,GAIpBvB,WACAW,UACAL,SACAC,WACAE,YACAC,kBACAE,aACAK,iBACAC,mBACAC,UACAC,cACAC,aAIG,SAASG,GAAgCrK,GAC9C,MAAQT,WAAY+K,GAAuBtK,EAAOuK,kBAAoB,IAChE,OAAE7S,EAAF,SAAUoI,GAAawE,EAAyBtE,IAAW,GAC3D0G,EAAehP,GAAU+M,EAAmBzE,EAAQtI,GAC1D,IAAKgP,IAAiB4D,IAAuBxK,EAC3C,MAAO,GAGT,MAAM0K,EAAiBF,EACpB9iB,IAAKuM,GAAO2S,EAAa3S,IAAO+T,GAA4B9H,EAAQ0G,EAAa3S,GAAK+L,IACtF7K,OAAOuB,SAEV,MAAO,CACL8S,UAAWkB,EAAe5T,MAAOtE,GAAYA,EAAQgX,WACrDC,gBAAiBiB,EAAe5T,MAAOtE,GAAYA,EAAQiX,kBAIxD,SAASkB,GAAqBzK,EAAqBxc,GACxD,MAAMknB,EAAe1K,EAAO2K,YAAYC,iBAAiBpnB,EAAQuU,iBAAmBvU,EAAQuQ,IAE5F,OAAO2W,EAAeA,EAAaxL,cAAWxb,EAGzC,SAASmnB,GAAqB7K,EAAqBtI,EAAgBoI,GACxE,GAAIA,IAAagC,iBAAgB,CAC/B,MAAMvB,EAAOH,EAAWJ,EAAQtI,GAChC,IAAK6I,EACH,OAIF,IAAKA,EAAKuK,uBACR,OAGF,OAAKvK,EAAKmB,YAINzG,aAAesF,EAAKmB,aACfnB,EAAKmB,YAAY3N,GAInBnL,KAAKmiB,IAAIxK,EAAKmB,YAAY3N,GAAIwM,EAAKuK,wBARjCvK,EAAKuK,uBAST,CACL,MAAMhF,EAAaH,EAAiB3F,EAAQtI,EAAQoI,GACpD,IAAKgG,EACH,OAGF,OAAKA,EAAWgF,uBAKTliB,KAAKmiB,IAAIjF,EAAWgF,uBAAwBhF,EAAWU,eAAiBwE,KAJtElF,EAAWG,cAQjB,SAASgF,GAAoBjL,EAAqBtI,EAAgBoI,GACvE,MAAMS,EAAOH,EAAWJ,EAAQtI,GAEhC,GAAIoI,IAAagC,kBACf,IAAKvB,EACH,WAEG,CACL,MAAMuF,EAAaH,EAAiB3F,EAAQtI,EAAQoI,GACpD,IAAKgG,GAAcA,EAAWU,gBAAkBV,EAAWgF,uBACzD,OAIJ,MAAMI,EAAcnG,EAAkB/E,EAAQtI,EAAQoI,GAChDxB,EAAYwG,EAAgB9E,EAAQtI,EAAQoI,GAC5CK,EAAOsE,EAAmBzE,EAAQtI,GACxC,IAAKyI,IAAU+K,IAAe5M,EAC5B,OAGF,MAAM6M,EAAaN,GAAqB7K,EAAQtI,EAAQoI,GACxD,GAAKqL,IAAc5K,IAAQA,EAAK6K,YAAhC,CAIA,GAAIF,EAAa,CACf,MAAMG,EAASF,EAA8BD,EAAYnR,KAAMhG,GACtDA,EAAKoX,GAAchL,EAAKpM,MAASoM,EAAKpM,GAAI0G,YAAc0F,EAAKpM,GAAIuX,kBAD9CJ,EAAY,GAGxC,GAAIG,EACF,OAAOA,EAIX,GAAI/M,EAAW,CACb,MAAM+M,EAASF,EAA4B7M,EAAUvE,KAAMhG,GAClDA,EAAKoX,GAAchL,EAAKpM,MAASoM,EAAKpM,GAAI0G,YAAc0F,EAAKpM,GAAIuX,kBAD9ChN,EAAU,GAGtC,GAAI+M,EACF,OAAOA,IAYN,SAASE,GAAyBvL,GACvC,MAAM,gBAAEwL,GAAoBxL,EAC5B,OAAOxJ,QAAQgV,EAAgBC,cAG1B,SAASC,GAAsB1L,EAAqBnI,GACzD,MAAM8T,EAAkBjsB,OAAO6M,OAAOyT,EAAOK,MAAMF,MAAMpG,KAAMwG,GAC7DqL,aAAgBrL,IAASA,EAAKmB,aAAenB,EAAKmB,YAAY3N,KAAO8D,GAEvE,GAAI8T,EACF,OAAOA,EAAgB5X,GAGzB,MAAM,SAAE6N,GAAa5B,EAAO3B,SAC5B,OAAO9L,OAAO7S,OAAOgT,KAAKkP,GAAU7H,KAAMrC,IACxC,MAAM6I,EAAOH,EAAWJ,EAAQzN,OAAOmF,IACvC,OAAO6I,GAAQqL,aAAgBrL,IAASqB,EAASrB,EAAKxM,IAAIoM,KAAKtI,MAI5D,SAASgU,GAAqB7L,GACnC,MAAM,iBAAEuK,GAAqBvK,EAE7B,OAAOxJ,QAAQ+T,GAGV,SAASuB,GAAwB9L,EAAqBnI,GAC3D,MAAM,WAAE0H,GAAeS,EAAOuK,kBAAoB,GAClD,QAAKhL,GAIEA,EAAW6C,SAASvK,GAGtB,SAASkU,GAAmC/L,EAAqBtI,EAAgBkB,GACtF,MAAM8N,EAAejC,EAAmBzE,EAAQtI,GAChD,GAAKgP,EAIL,OAAOhnB,OAAO6M,OAAOma,GAClBzR,OAAQzR,GAAYA,EAAQoV,YAAcA,GAAapV,EAAQqX,aAC/DrT,IAAI,EAAGqT,iBAAkBA,EAAamR,eAGpC,SAASC,GAA0BjM,EAAqBtI,EAAgBkB,GAC7E,MAAM8N,EAAejC,EAAmBzE,EAAQtI,GAChD,GAAKgP,EAIL,OAAOhnB,OAAOgT,KAAKgU,GAChBlf,IAAI+K,QACJ0C,OAAQlB,GAAO2S,EAAa3S,GAAI6E,YAAcA,GAG5C,SAASsT,GAA8BlM,EAAqBtI,EAAgBkB,GACjF,MAAQ2G,WAAY4M,GAAgBnM,EAAOuK,kBAAoB,GAC/D,IAAK4B,EACH,OAAO,EAGT,MAAMC,EAAWH,GAA0BjM,EAAQtI,EAAQkB,GAC3D,OAAOwT,GAAYA,EAASxV,MAAO7C,GAAOoY,EAAY/J,SAASrO,IAG1D,SAASsY,GAA4BrM,GAC1C,MAAM,WAAET,GAAeS,EAAOuK,kBAAoB,GAElD,OAAOhL,EAAaA,EAAW9f,OAAS,EAGnC,SAAS6sB,GACdtM,EAAqBtI,GAErB,MAAM6I,EAAOH,EAAWJ,EAAQtI,GAChC,IAAK6I,EACH,OAGF,IAAKI,EAAoBX,EAAQO,GAC/B,OAGF,MAAMmG,EAAejC,EAAmBzE,EAAQtI,GAC1C6O,EAAcrB,EAAkBlF,EAAQtI,EAAQoK,kBACtD,IAAK4E,IAAiBH,EACpB,OAGF,MAAM1O,EAAYT,YAASmP,EAAcxS,IAC/B2S,EAAa3S,GAAI0G,YAAcjE,QAAQkQ,EAAa3S,GAAIwY,kBAG5DC,EAAqBpV,YAASmP,EAAcxS,GACzCyC,QAAQkQ,EAAa3S,GAAI0Y,4BAGlC,OAAI5U,GAAa2U,GAAsBA,EAAqB3U,OAA5D,EAIOA,EAAY6O,EAAa7O,QAAanU,EAGxC,SAASgpB,GACd1M,EAAqBxc,EAAqB+c,EAAelF,GAEzD,MAAM,oCACJsR,EADI,sCAEJC,EAFI,gCAGJC,EAHI,kCAIJC,GACE9M,EAAO+M,SAASxY,MAEpB,OAAOiC,QACJoW,GAAyC3L,aAAcV,EAAKxM,KACzD8Y,GAAmCG,aAAYzM,IAC/CuM,GAAqC5L,aAAcX,IACnDoM,GAAuCtR,IACzCA,EAAOtH,KAAOiM,EAAOU,eHlpBpB,SAAmCV,EAAqBiN,GAC7D,OAAOjN,EAAOkN,aAAelN,EAAOkN,YAAYC,QAAQ/K,SAAS6K,EAAWlZ,IGkpBrEqZ,CAA0BpN,EAAQ3E,KAKpC,SAASgS,GAA0BrN,EAAqBxc,GAC7D,MAAM4U,EAAQ0D,YAAgBtY,GAC9B,IAAK4U,EACH,OAGF,MAAM,qBACJkV,EADI,mBAEJC,GACEvN,EAAO+M,SAASxY,MAEdiZ,EAAQpV,EAAMS,OAAST,EAAMqB,QAEnC,OAAQ6T,IAAyBE,GAAWD,GAAsBC,EAG7D,SAASC,GAAyBzN,GACvC,OAAOA,EAAO+M,SAASxY,MAAMmZ,mBCprBxB,SAASC,GAAwB3N,GACtC,MAAM,OAAEtI,EAAF,SAAUoI,GAAawE,EAAyBtE,IAAW,GACjE,IAAKtI,IAAWoI,EACd,OAGF,MAAM8N,EAAgB/N,YAAmBnI,EAAQoI,GAC3C+N,EAAgB7N,EAAO8N,gBAAgBC,gBAAgBH,GAC7D,OAAKC,GAAkBA,EAAcG,SAI9BH,OAJP,EAOK,SAASI,GAA+BjO,GAC7C,MAAM,SAAE4B,GAAa5B,EAAOkO,kBACtB,OAAExW,GAAW4M,EAAyBtE,IAAW,GACjDmO,EAAuBnO,EAAOE,MAAMkO,WAE1C,OAAOD,GAAwBvM,EAASuM,GAAwBA,EAAuBzW,EAGlF,SAAS2W,GAAyBrO,GACvC,MAAMsO,EAASL,GAA+BjO,GAC9C,GAAKsO,EAIL,OAAOtO,EAAOkO,iBAAiBtM,SAAS0M,GC3BnC,SAASC,GAAiBvO,EAAqBtI,GACpD,OAAOsI,EAAOwO,WAAW5M,SAASlK,GAiB7B,SAAS+W,GAA4BzO,GAC1C,MAAM,OAAEtI,EAAF,SAAUoI,GAAawE,EAAyBtE,IAAW,GACjE,IAAKtI,IAAWoI,EACd,OAGF,GAAImB,aAAcvJ,GAChB,MAAO,OAGT,MAAM6I,EAAOH,EAAWJ,EAAQtI,GAChC,OAAK6I,EAIDyM,aAAYzM,GACP,QAGF,eARP,ECzBK,SAASmO,GAAwB1O,GACtC,MAAM,YAAE2O,GAAgB3O,EACxB,OAAOxJ,QAAQmY,EAAY9W,WAAa8W,EAAYC,eAG/C,SAASC,GAA4B7O,GAC1C,MAAM,MACJE,EADI,gBAEJ4O,GACE9O,EAEE+O,EH8gBD,SAAiC/O,GACtC,MAAM,YAAEgP,GAAgBhP,EACxB,OAAOxJ,QAAQwY,EAAYnX,WGhhBLoX,CAAwBjP,GACxCkP,EAAW1Y,SAAS2Y,KAAoBxB,GAAwB3N,IAChEoP,EDbD,SAAiCpP,GACtC,MAAM,OAAEtI,EAAF,SAAUoI,GAAawE,EAAyBtE,IAAW,GACjE,IAAKtI,IAAWoI,EACd,OAGF,MAAMuP,EAAoBrP,EAAOwO,WAAW5M,SAASlK,GACrD,OAAK2X,GAAsBA,EAAkBrB,SAItCqB,OAJP,ECMqBC,CAAwBtP,GAEvCuP,OAA0C7rB,IAD1B6f,EAA2BvD,GACXwP,MAEhCC,OAAkC/rB,IADtBggB,EAAuB1D,GACXwP,OACtB9X,OAAQgY,GAAkBpL,EAAyBtE,IAAW,GAChEmO,EAAuBjO,EAAMkO,WAC7BuB,EAAuB5N,EAA2B/B,GAClD4P,EAAapZ,QAAQ2X,GAAwBwB,GAE7CE,EADcrZ,QAAQkZ,GAAiBC,IACXb,EAElC,OAAOC,EACLe,IAAmBC,YACjBb,EACFY,IAAmBE,OACjBZ,EACFU,IAAmBG,WACjBV,EACFO,IAAmBI,cACjBT,EACFK,IAAmBK,UACjBP,EACFE,IAAmBM,SACjBP,EACFC,IAAmBO,cACjB3sB,EAGC,SAAS4sB,GAAyBtQ,GACvC,YAA+Ctc,IAAxCmrB,GAA4B7O,GCnD9B,SAASuQ,GAA+BvQ,GAC7C,OAAOA,EAAOwQ,aAAahB,MCAtB,SAASiB,GAAuBzQ,GACrC,OAAOA,EAAO0Q,QAAQ7Y,UAGjB,SAAS8Y,GAAuB3Q,GACrC,OAAOA,EAAO0Q,QAAQE,OAGjB,SAASC,GAA6B7Q,GAC3C,OAAOA,EAAO0Q,QAAQI,aAAe9Q,EAAO0Q,QAAQI,aAAaC,oBAAiBrtB,EAG7E,SAASstB,GAAwBhR,GACtC,OAAOA,EAAO0Q,QAAQO,oB,6BCdT,QAAIC,IACVA,EAAMjc,OAAOuB,SAASpK,KAAK,M,6BCHpC,ygBA4BO,MAAM+kB,EAtBN,WACL,MAAM,UAAEC,EAAF,SAAaC,GAAa9rB,OAAO+rB,UAIvC,IAAIC,EAcJ,OAZ0C,IALnB,CAAC,YAAa,WAAY,SAAU,UAKxC5d,QAAQ0d,GACzBE,EAAK,UACwC,IAL1B,CAAC,SAAU,OAAQ,QAKhB5d,QAAQ0d,GAC9BE,EAAK,OAC4C,IAR1B,CAAC,QAAS,QAAS,UAAW,SAQ3B5d,QAAQ0d,GAClCE,EAAK,UACI,UAAUC,KAAKJ,GACxBG,EAAK,UACI,QAAQC,KAAKH,KACtBE,EAAK,SAGAA,EAGmBE,GACfC,EAA6B,WAAjBP,EACZQ,EAA0B,QAAjBR,EACTS,EAA8B,YAAjBT,EACb7T,EAAY,iCAAiCkU,KAAKF,UAAUF,WAE5DS,EAAetsB,OAAOusB,WAAW,qBAAqBC,QAEtD5C,EAAmB5pB,OAAOysB,YAAc3iB,MACnD9J,OAAOysB,YAAc1iB,MAAqC/J,OAAOoI,aAAe4B,KAErE0iB,EAAgCX,UAAUY,cAAgB,iBAAkBZ,UAAUY,eACjG3sB,OAAO4sB,cAAiB5sB,OAAe6sB,oBAG5BC,GADiDlxB,SAASmxB,gBAAgBC,MACrDpB,IAAiBO,GAAaC,IACnDa,EAA8B,kBAAmBlB,UAEjDjU,EAA2BmV,EAE3B1U,GAD0CvY,OACtBiR,SAAS,IAAIic,OAASC,YAAY,4BAEtDC,EAAMptB,OAAOqtB,kBAAoB,EAEjCC,GAAsB,EAEnC,IAAIC,EAEG,SAASC,IACd,OAAOvc,QAAQsc,GAIR,IAAIlyB,QAASC,IAClB,MAAMmyB,EAAO,IAAIC,MAEjBD,EAAK9wB,IAAM,kHACX,MAAMgxB,EAAoB,KACxBryB,EAAwB,IAAhBmyB,EAAKhU,SAEfgU,EAAKnxB,OAASqxB,EACdF,EAAKlxB,QAAUoxB,IAIRzwB,KAAM0wB,IACfL,EAAuBK,K,6BCrElB,SAASC,EACdC,EACAC,EACAC,GAAiB,EACjBC,GAAgB,GAEhB,IAAIC,EAEJ,MAAO,IAAIC,KACLD,GACFrwB,aAAaqwB,GACbA,OAAiB/vB,GACR6vB,GAETF,KAAMK,GAIRD,EAAiBE,KAAKhwB,WAAW,KAC3B6vB,GAEFH,KAAMK,GAGRD,OAAiB/vB,GAChB4vB,IAIA,SAASM,EACdP,EACAC,EACAC,GAAiB,GAEjB,IAAIM,EACAC,EACAJ,EAEJ,MAAO,IAAIK,KACTD,GAAY,EACZJ,EAAOK,EAEFF,IACCN,IACFO,GAAY,EAEZT,KAAMK,IAIRG,EAAWF,KAAKK,YAAY,KAC1B,IAAKF,EAIH,OAFAH,KAAKM,cAAcJ,QACnBA,OAAWnwB,GAIbowB,GAAY,EAEZT,KAAMK,IACLJ,KAKF,SAASzoB,EAA6CwoB,GAC3D,OAAOa,EAAa7oB,EAASgoB,GAGxB,SAAS1oB,EAAoD0oB,GAClE,OAAOa,EAAaC,EAAgBd,GAW/B,SAASa,EAA0ClpB,EAAwBqoB,GAChF,IACIK,EADAU,GAAU,EAGd,MAAO,IAAIL,KACTL,EAAOK,EAEFK,IACHA,GAAU,EAEVppB,EAAY,KACVopB,GAAU,EAEVf,KAAMK,OAMP,SAASnoB,EAAUyH,GACxBpS,QAAQC,UAAU4B,KAAKuQ,GAGlB,SAASqhB,EAAOrhB,GAEjB2gB,KAAKW,oBAEPX,KAAKW,oBAAoBthB,GAEzBzH,EAAUyH,GA/Gd,kTAuHO,MAAMuhB,EAASjB,GAAe,IAAI1yB,QAASC,IAChD8C,WAAW,IAAM9C,IAAWyyB,KAGvB,SAASkB,IACd,OAAO,IAAI5zB,QAASC,IAClBwK,EAAQxK,KAIZ,IAAI4zB,EACAC,EAGG,SAASrpB,EAAQqJ,EAA8BigB,GAAY,GAC3DF,EAYME,EACTD,EAAyB30B,KAAK2U,GAE9B+f,EAAiB10B,KAAK2U,IAdtB+f,EAAmBE,EAAY,GAAK,CAACjgB,GACrCggB,EAA0BC,EAAY,CAACjgB,GAAY,GAEnDkgB,sBAAsB,KACpB,MAAMC,EAAmBJ,EACnBK,EAA0BJ,EAChCD,OAAmB/wB,EACnBgxB,OAA0BhxB,EAC1BoxB,EAAwBzrB,QAAS2J,GAAOA,KACxC6hB,EAAiBxrB,QAAS2J,GAAOA,QAShC,SAASmhB,EAAezf,GAC7BrJ,EAAQqJ,GAAU,K,uKC/IpB,IAAIqgB,EACJ,MAAMC,EAAgB,IAAIliB,IACpBmiB,EAA0B,IAAIniB,IAI7B,SAASoiB,EAAQprB,EAAuBqrB,EAAY,IAWzD,OAVKJ,IACC7sB,KAEF7C,QAAQkD,IAAI,yBAGdwsB,EAAS,IAAIK,IAyCjB,SAA2BtrB,GACzBirB,EAAO1oB,iBAAiB,UAAW,EAAGnN,WACpC,GAAkB,WAAdA,EAAK0C,KACPkI,EAAS5K,EAAKm2B,aACT,GAAkB,mBAAdn2B,EAAK0C,KAA2B,CACzC,MAAM0zB,EAAeN,EAAc3wB,IAAInF,EAAK2Y,WACxCyd,IACEp2B,EAAKiE,MACPmyB,EAAax0B,OAAO5B,EAAKiE,OAEzBmyB,EAAaz0B,QAAQ3B,EAAKq2B,gBAGzB,GAAkB,mBAAdr2B,EAAK0C,KAA2B,CACzC,MAAM0zB,EAAeN,EAAc3wB,IAAInF,EAAK2Y,WACxCyd,GAAgBA,EAAa5gB,UAC/B4gB,EAAa5gB,YAAYxV,EAAKs2B,mBAE3B,GAAkB,mBAAdt2B,EAAK0C,KACd,MAAM1C,EAAKiE,QA3DbsyB,CAAkB3rB,IAGb4rB,EAAY,CACjB9zB,KAAM,UACN8xB,KAAM,CAACyB,KAIJ,SAASQ,EAAiCC,KAAclC,GAC7D,GAAKqB,EASL,OAAOW,EAAY,CACjB9zB,KAAM,aACN6B,KAAMmyB,EACNlC,SAXIxrB,KAEF7C,QAAQsD,KAAK,0BAaZ,SAASktB,EAAkBC,GAChCA,EAAiBC,YAAa,EAE9B,MAAM,UAAEle,GAAcod,EAAwB5wB,IAAIyxB,IAAqB,GAClEje,GAILkd,EAAOiB,YAAY,CACjBp0B,KAAM,iBACNiW,cA4BJ,SAAS6d,EAAYlyB,GACnB,MAAMqU,EAAY7D,YAAcghB,GAC1B1hB,EAAyB,CAC7BuE,eACGrU,GAGC8xB,EAAe,CAAEzd,aAGjBlV,EAA2D,IAAI/B,QAAQ,CAACC,EAASC,KACrFpB,OAAOu2B,OAAOX,EAAc,CAAEz0B,UAASC,aAGzC,GAA+B,mBAApBwS,EAAQogB,KAAK,GAAmB,CACzC,MAAMhf,EAAWpB,EAAQogB,KAAKwC,MAC9BZ,EAAa5gB,SAAWA,EACxBugB,EAAwB9gB,IAAIO,EAAU4gB,GAgBxC,OAbAN,EAAc7gB,IAAI0D,EAAWyd,GAC7B3yB,EACGwzB,MAAM,QACNC,QAAQ,KACPpB,EAAc9gB,OAAO2D,GAEjByd,EAAa5gB,UACfugB,EAAwB/gB,OAAOohB,EAAa5gB,YAIlDqgB,EAAOiB,YAAY1iB,GAEZ3Q,I,yKC/HM,MAA0B,iDCA1B,MAA0B,iDCA1B,MAA0B,iDCA1B,MAA0B,iDCA1B,MAA0B,iD,QCezC,MAAM0zB,EAA2C,CAC/CC,GAAIC,EACJC,GAAIC,EACJC,GAAIC,EACJC,GAAIC,EACJC,GAAIC,GAGAC,EAAiB,CAAC,QAAS,YAAa,WAAY,WAAY,WAAY,YAAa,cACzFC,EAAe,CAEnBX,GAAKrxB,GAAqB,IAANA,EAAU,EAAI,EAClCiyB,GAAKjyB,GAAqB,IAANA,EAAU,EAAU,IAANA,EAAU,EAAU,IAANA,EAAU,EAAIA,EAAI,KAAO,GAAKA,EAAI,KAAO,GAAK,EAAIA,EAAI,KAAO,GAAK,EAAI,EACtHkyB,GAAKlyB,GAAqB,IAANA,EAAU,EAAI,EAClCmyB,GAAKnyB,GAAqB,IAANA,EAAU,EAAI,EAClCuxB,GAAKvxB,GAAqB,IAANA,EAAU,EAAI,EAClCoyB,GAAKpyB,GAAeA,EAAI,EAAI,EAAI,EAChCqyB,GAAKryB,GAAeA,EAAI,EAAI,EAAI,EAChC8O,GAAI,IAAM,EACV2iB,GAAKzxB,GAAqB,IAANA,EAAU,EAAI,EAClCsyB,GAAI,IAAM,EACVjE,GAAI,IAAM,EACVkE,GAAKvyB,GAAqB,IAANA,EAAU,EAAI,EAClC2xB,GAAK3xB,GAAqB,IAANA,EAAU,EAAIA,EAAI,IAAM,GAAKA,EAAI,IAAM,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAAO,IAAM,EAAI,EACtGwyB,MAAQxyB,GAAeA,EAAI,EAAI,EAAI,EACnC6xB,GAAK7xB,GAAeA,EAAI,IAAO,GAAKA,EAAI,KAAQ,GAAK,EAAIA,EAAI,IAAM,GAAKA,EAAI,IAAM,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAAO,IAAM,EAAI,EAC7HyyB,GAAKzyB,GAAeA,EAAI,EAAI,EAAI,EAChC0yB,GAAK1yB,GAAeA,EAAI,IAAO,GAAKA,EAAI,KAAQ,GAAK,EAAIA,EAAI,IAAM,GAAKA,EAAI,IAAM,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAAO,IAAM,EAAI,EAC7H2yB,GAAK3yB,GAAeA,EAAI,EAAI,EAAI,GAI5B4yB,EAAQ,IAAI/kB,IAElB,IAAIglB,EAEJ,MAAM,YACJtkB,EADI,eAEJC,EAFI,aAGJskB,GCtDK,WACL,MAAMlmB,EAAiC,GAUvC,SAAS4B,EAAeT,GACtB,MAAMU,EAAQ7B,EAAU8B,QAAQX,IACjB,IAAXU,GACF7B,EAAU+B,OAAOF,EAAO,GAU5B,MAAO,CACLqkB,aAPF,YAAyBrE,GACvB7hB,EAAUxI,QAASqL,IACjBA,KAAYgf,MAMdlgB,YAvBF,SAAqBR,GAGnB,OAFAnB,EAAU9R,KAAKiT,GAER,KACLS,EAAeT,KAoBjBS,kBD4BAukB,GAIJ,IAAIC,EAEGC,eAAeC,EAAYC,EAAkB1jB,GAClD,GAAIojB,GAAYM,IAAaH,EAM3B,OALA92B,SAASmxB,gBAAgB+F,KAAOD,OAC5B1jB,GACFA,KAMJ,MAAM4jB,QAmERJ,eAAsCE,GACpC,MAAMG,QAAeC,IAAehrB,IAAiB4qB,EAAUI,IAAcC,MAC7E,GAAIF,EACF,OAAOA,EAGT,MAAMG,QAAe/C,YAAQ,gBAAiB,CAAEgD,gBAAiBvnB,IAAYgnB,aAC7E,GAAIM,EAEF,aADMF,IAAchrB,IAAiB4qB,EAAUM,EAAOZ,UAC/CY,EAAOZ,SAGhB,OA/E0Bc,CAAuBR,GACjD,GAAKE,EAAL,CAIA,GAAIjC,EAAiB+B,GACnB,IACE,MAAM7C,QAAiBsD,MAAMxC,EAAiB+B,IACxCU,QAAcvD,EAASwD,OACvBC,EAAgBvkB,YAAUqkB,EAAO,CAACr0B,EAAOM,KAAR,CAAmBA,MAAKN,WAE/D/E,OAAOu2B,OAAOqC,EAAaU,GAC3B,MAAO72B,GACH+F,KAEF7C,QAAQlC,MAAMhB,GAKpB01B,EAAMoB,QAENhB,EAAkBG,EAClBN,EAAWQ,EACXn3B,SAASmxB,gBAAgB+F,KAAOD,EAE5B1jB,GACFA,IAGFqjB,EAAaD,IAGR,SAASoB,EAAen0B,EAAaN,EAAa00B,GACvD,QAAcz1B,IAAVe,EAAqB,CACvB,MAAM8zB,EAASV,EAAMxzB,IAAK,GAAEU,KAAON,KAAS00B,KAC5C,GAAIZ,EACF,OAAOA,EAIX,IAAKT,EACH,OAAO/yB,EAGT,MAAMq0B,EAAatB,EAAS/yB,GAC5B,IAAKq0B,EACH,OAAOr0B,EAGT,MAAMs0B,EAAWD,EAA4B,iBAAV30B,EAgCrC,SAAyB60B,GACvB,MAAMC,EAActB,GAAmBhB,EAAagB,GAChDhB,EAAagB,GAA8CqB,GAC3D,EAEJ,OAAOtC,EAAeuC,GArCkCC,CAAgB/0B,GAAS,SACjF,IAAK40B,IAAaA,EAASI,OAAQ,CACjC,MAAMvI,EAAQnsB,EAAIiS,MAAM,KAExB,OAAOka,EAAMA,EAAMzxB,OAAS,GAG9B,QAAciE,IAAVe,EAAqB,CACvB,MACMoQ,EA+BV,SAAyBwkB,EAAkB50B,GACzC,OAAO40B,EAAShV,QAAQ,gBAAiBxc,OAAOpD,IAhC/Bi1B,CAAgBL,EADG,MAAXF,EAAiBQ,YAAcl1B,GAASA,GAG/D,OADAozB,EAAM1jB,IAAK,GAAEpP,KAAON,KAAS00B,IAAUtkB,GAChCA,EAGT,OAAOwkB,I,6BEvIT,mJAEO,IAAKO,G,SAAAA,O,eAAAA,I,eAAAA,I,kBAAAA,M,KAkBZ,MAAMC,EAAyC,GACzCC,EAAyC,GAExC5B,eAAe6B,EAA0DC,EAAeC,GAC7F,IAAKJ,EAAcG,GAAa,CAC9B,OAAQA,GACN,KAAKJ,EAAQM,KACXL,EAAcD,EAAQM,MAAQ,6BAC9B,MACF,KAAKN,EAAQO,KACPjyB,KAEF7C,QAAQkD,IAAI,8BAGdsxB,EAAcD,EAAQO,MAAQ,mDAC9B,MACF,KAAKP,EAAQQ,MACXP,EAAcD,EAAQQ,OAAS,mDAIlCP,EAAcG,GAA4Cv3B,KAAK43B,GAGlE,MAAMC,QAAgBT,EAAcG,GAMpC,OAJKF,EAAaE,KAChBF,EAAaE,GAAcM,GAGtBC,EAAoBP,EAAYC,GAGlC,SAASM,EAAmEP,EAAeC,GAChG,MAAMK,EAASR,EAAaE,GAE5B,GAAKM,EAIL,OAAOA,EAAOL,GAGhB,MAAMO,EAAkC,GAEjC,SAASC,EAAgBC,GACzBF,EAAUpY,SAASsY,IACtBF,EAAUz6B,KAAK26B,GAInB,SAASL,IACPG,EAAUnxB,QAASqxB,IACjBA,Q,6BC1EJ,wIACA,MAAMlC,EAAW7E,KAAKgH,OAEf,IAAKC,EAML1C,eAAeW,EAAMgC,EAAmB91B,EAAanD,GAC1D,GAAK42B,EAIL,IACE,MAAMx2B,EAAU,IAAI84B,QAAQ/1B,GACtB8yB,QAAcW,EAASuC,KAAKF,GAC5BtF,QAAiBsC,EAAMjgB,MAAM5V,GACnC,IAAKuzB,EACH,OAGF,OAAQ3zB,GACN,KAAKg5B,EAAK10B,KACR,aAAaqvB,EAASrd,OACxB,KAAK0iB,EAAKI,KAAM,CACd,MAAMC,QAAa1F,EAAS0F,OAG5B,GAAyB,YAArBl2B,EAAIm2B,OAAO,EAAG,GAChB,OAAO,IAAIF,KAAK,CAACC,GAAO,CAAEr5B,KAAM,eAIlC,IAAKq5B,EAAKr5B,KAAM,CACd,MAAM4d,EAAc+V,EAAS4F,QAAQ92B,IAAI,gBACzC,GAAImb,EACF,OAAO,IAAIwb,KAAK,CAACC,GAAO,CAAEr5B,KAAM4d,IAIpC,OAAOyb,EAET,KAAKL,EAAKnC,KACR,aAAalD,EAASwD,OACxB,QACE,QAEJ,MAAO52B,GAGP,YADAkD,QAAQsD,KAAKxG,IAKV+1B,eAAekD,EAAKP,EAAmB91B,EAAa7F,GACzD,GAAKs5B,EAIL,IACE,MAAM6C,EAA4B,iBAATn8B,GAAqBA,aAAgB87B,KAAO97B,EAAOo8B,KAAKC,UAAUr8B,GACrF8C,EAAU,IAAI84B,QAAQ/1B,GACtBwwB,EAAW,IAAIiG,SAASH,GACxBxD,QAAcW,EAASuC,KAAKF,GAClC,aAAahD,EAAM4D,IAAIz5B,EAASuzB,GAChC,MAAOpzB,GAGP,YADAkD,QAAQsD,KAAKxG,IAKV+1B,eAAee,EAAM4B,GAC1B,IACE,IAAKrC,EACH,OAGF,aAAaA,EAAStkB,OAAO2mB,GAC7B,MAAO14B,GAGP,YADAkD,QAAQsD,KAAKxG,K,SA/ELy4B,O,eAAAA,I,eAAAA,I,gBAAAA,M,sbCAQ,oBAATc,OAET/H,KAAK+H,KAAO,cAAcV,KAGxBW,YAAYC,EAAsB1iB,EAAkB2iB,GAClD,GAAIA,EAAS,CACX,MAAM,KAAEj6B,KAASk6B,GAASD,EAC1BE,MAAMH,EAAU,CAAEh6B,SAFP,sBAGXlC,OAAOu2B,OAAO+F,KAAMF,QAEpBC,MAAMH,GADD,sBAIPI,KAAKv4B,KAAOyV,KAKX,SAAS+iB,EAAcpf,GAC5B,MAAMqf,EAAMrf,EAAQ7F,MAAM,KACpBmlB,EAAOD,EAAI,GAAGtkB,MAAM,WAAY,GAChCwkB,EAAOC,KAAKH,EAAI,IACtB,IAAIj3B,EAAIm3B,EAAK38B,OACb,MAAM68B,EAAQ,IAAIC,WAAWt3B,GAE7B,KAAOA,KACLq3B,EAAMr3B,GAAKm3B,EAAKI,WAAWv3B,GAG7B,OAAO,IAAI+1B,KAAK,CAACsB,GAAQ,CAAE16B,KAAMu6B,IAG5B,SAASM,EAAcxB,GAC5B,OAAO,IAAIr6B,QAAQ,CAACC,EAASC,KAC3B,MAAM47B,EAAS,IAAIC,WAEnBD,EAAO76B,OAAUnB,IACf,MAAM,OAAEmU,GAAWnU,EAAEuB,QAAU,GACT,iBAAX4S,GACThU,EAAQgU,GAGV/T,EAAO,IAAIsB,MAAM,yBAGnBs6B,EAAO56B,QAAUhB,EACjB47B,EAAOE,cAAc3B,KAIlB,SAAS4B,EAAW5B,EAAY/hB,GACrC,OAAO,IAAIwiB,KAAK,CAACT,GAAO/hB,EAAU,CAChC4jB,aAAcnU,KAAKlgB,MACnB7G,KAAMq5B,EAAKr5B,OAIR,SAASm7B,EAAa5iB,GAC3B,OAAO,IAAIvZ,QAAQ,CAACC,EAASC,KAC3B,MAAMk8B,EAAM,IAAI/J,MAChB+J,EAAIn7B,OAAS,IAAMhB,EAAQm8B,GAC3BA,EAAIl7B,QAAUhB,EACdk8B,EAAI96B,IAAMiY,IAIP,SAAS8iB,EAAa9iB,GAC3B,OAAO,IAAIvZ,QAAQ,CAACC,EAASC,KAC3B,MAAMsX,EAAQjX,SAASQ,cAAc,SACrCyW,EAAM8kB,OAAS,EACf9kB,EAAM+kB,iBAAmB,IAAMt8B,EAAQuX,GACvCA,EAAMtW,QAAUhB,EAChBsX,EAAMlW,IAAMiY,IAIT+d,eAAekF,EAAqBjjB,GACzC,MAAM/B,QAAc6kB,EAAa9iB,GAEjC,OAAOvZ,QAAQy8B,KAAK,CAClB9I,YAAM,KACN,IAAI3zB,QAAgB,CAACC,EAASC,KAC5BsX,EAAMklB,SAAW,KACf,MAAMC,EAASp8B,SAASQ,cAAc,UACtC47B,EAAOxe,MAAQ3G,EAAMolB,WACrBD,EAAOve,OAAS5G,EAAMqlB,YACVF,EAAOG,WAAW,MAC1BC,UAAUvlB,EAAO,EAAG,GACxBvX,EAAQ08B,EAAOK,UAAU,gBAE3BxlB,EAAMtW,QAAUhB,EAChBsX,EAAMylB,YAAcj1B,KAAKmiB,IAAI3S,EAAMwH,SAAU,OAK5CsY,eAAe4F,EAAU5f,GAE9B,aADuB2a,MAAM3a,IACb+c,OAQX,SAAS8C,EAAYf,GAC1B,MAAMO,EAASp8B,SAASQ,cAAc,UACtC47B,EAAOxe,MAAQie,EAAIje,MACnBwe,EAAOve,OAASge,EAAIhe,OAKpB,OAHYue,EAAOG,WAAW,MAC1BC,UAAUX,EAAK,EAAG,GAEfO,I,6BCtHT,kCAIA,MAAMS,EAAa,UAEbC,EAAkBp2B,OAAOq2B,aAAa,MAErC,SAASC,EAAYC,GAC1B,OAAOA,EAASzqB,QAAQsqB,GAAmB,EAAIG,EAAS/Z,QAAQ2Z,EAAY,IAAMI,EAKrE,k5Q,6BCdf,yBAkBevyB,gBARe,EAAGwyB,QAAQ,UAErC,yBAAKC,UAAU,WACb,kBAAC,IAAD,CAASD,MAAOA,EAAOE,eAA0B,UAAVF,O,6BCb7C,2BAQe,KACbrE,EAAeC,EAAeuE,GAAS,EAAOC,GAAa,KAE3D,MAAMj+B,EAAS+5B,YAAoBP,EAAYC,GACzCpwB,EAAcoK,cAapB,OAXIwqB,GAEFhE,YAAgB5wB,GAGlBuB,YAAU,KACHozB,GAAWh+B,GACdu5B,YAAWC,EAAYC,GAAYx3B,KAAKoH,IAEzC,CAACmwB,EAAYnwB,EAAarJ,EAAQy5B,EAAYuE,IAE1Ch+B,I,uMCxBT,MA0OMk+B,EAAuC,GAChCC,EAA2B,oDAoCzBC,MA/QD,88JA8OX5nB,MAAM,MACNxP,IAAKq3B,IAQG,CACL9qB,GARS8qB,EAAI3D,OAAO,EAAG,GAQnB4D,KAPOD,EAAI3D,OAAO,EAAG,GAOf74B,KANE,IAAGw8B,EAAIjnB,MAAM,OAAQ,GAMjBnU,KALLo7B,EAAI7nB,MAAM,OAAO,GAKN+nB,YAI5B,SAA8B5F,GAC5B,IAAKA,EACH,OAAOwF,EAGT,MAAMK,EAAc7F,EAAO,GAC3B,IAAI8F,EAEJ,IAAKP,EAAaM,GAAc,CAC9B,MAAME,EAAoBF,EAAYhoB,MAAM,IAAIxP,IAAI+K,QACpD0sB,EAAoBC,EAAkB5qB,OAAO,CAACO,EAAQsqB,EAAO5/B,IACnD,GAAEsV,WAAgBsqB,MAAU5/B,EAAI,EAAI,IAAM,KACjD,IACHm/B,EAAaM,GAAe,IAAIxnB,OAAQ,GAAEynB,IAAoB,MAAMG,OAAO,EAAIF,EAAkBz/B,WAGnG,OAAOi/B,EAAaM,GAvBEK,CADLR,EAAIjnB,MAAM,YCnPtB,SAAS0nB,EAAevrB,GAC7B,OAAOwrB,EAAYxlB,KAAMhW,GAAMA,EAAEgQ,KAAOA,GAQnC,SAASyrB,EAA0BC,GACxC,IAAIC,EAAcD,EAAMpb,QAAQ,WAAY,IACvCqb,EAAYC,WAAW,OAC1BD,EAAe,IAAGA,GAGpB,MAAME,EAAoBL,EACvBtqB,OAAQ4qB,GAAqBH,EAAYC,WAAWE,EAAQx9B,OAC5D+S,KAAK,CAACC,EAAGC,IAAMD,EAAEhT,KAAK5C,OAAS6V,EAAEjT,KAAK5C,QAEzC,OAAOmgC,EAAkBA,EAAkBngC,OAAS,GAG/C,SAASqgC,EAAkBL,EAAeI,GAC/C,IAAIH,EAAcD,EAAMpb,QAAQ,UAAW,IAC3C,GAAIwb,EACFH,EAAcA,EAAYxE,OAAO2E,EAAQx9B,KAAK5C,OAAS,QAClD,GAAIggC,EAAME,WAAW,KAC1B,OAAOF,EAeT,OAZAC,EAAcA,EAAYrb,QAzB5B,SAA8Bwb,GAC5B,OAAOA,EAAUA,EAAQd,YAAcJ,EAwBLU,CAAqBQ,GAAU,CAACE,EAAGC,EAAIC,EAAIC,EAAIC,EAAIC,KACnF,MAAMC,EAAYR,GAA0B,OAAfA,EAAQ9rB,GAAc,IAAM,IAEzD,IAAIusB,EAAS,GAMb,OALIN,IAAIM,EAAU,GAAEN,GAChBC,IAAIK,GAAW,IAAGL,GAClBC,IAAII,GAAW,GAAED,IAAYH,KAC7BC,IAAIG,GAAW,GAAED,IAAYF,KAC7BC,IAAIE,GAAW,GAAED,IAAYD,KAC1BE,IAGFZ,EAGF,SAASa,EAA0Bb,GACxC,MAAMc,EAAiBd,EAAYC,WAAW,KAAOD,EAAe,IAAGA,EACjEG,EAAUL,EAA0BgB,GAC1C,OAAKX,EAGG,GAAEA,EAAQx9B,QAAQy9B,EAAkBU,EAAgBX,KAFnDW,I,6BC/CJ,IAAKC,EAMAC,EA4GAC,EAqDAC,EAYAC,EASA/Q,EAUAgR,EAWAC,EAOAC,EAOAC,EAYAC,EAMAC,EAjPZ,4d,SAAYV,O,yBAAAA,I,uBAAAA,I,oBAAAA,M,cAMAC,O,WAAAA,I,eAAAA,I,oBAAAA,M,cA4GAC,O,eAAAA,I,6BAAAA,I,iCAAAA,I,uBAAAA,I,qBAAAA,I,iDAAAA,I,2DAAAA,I,qBAAAA,I,2CAAAA,I,qCAAAA,I,8CAAAA,I,0CAAAA,I,0CAAAA,I,0EAAAA,I,wEAAAA,I,oEAAAA,I,kEAAAA,I,4EAAAA,I,0EAAAA,I,wEAAAA,I,sEAAAA,I,wEAAAA,I,sEAAAA,I,kDAAAA,I,8CAAAA,I,sBAAAA,I,8CAAAA,I,0CAAAA,I,gDAAAA,I,gDAAAA,I,kCAAAA,I,wCAAAA,I,sDAAAA,I,gDAAAA,I,kDAAAA,I,0DAAAA,I,gCAAAA,I,4DAAAA,I,oDAAAA,I,4DAAAA,I,sDAAAA,I,gCAAAA,I,0EAAAA,I,4CAAAA,I,oDAAAA,I,iDAAAA,M,cAqDAC,O,uBAAAA,I,+BAAAA,I,uBAAAA,I,uBAAAA,I,uBAAAA,I,qCAAAA,I,qCAAAA,I,iCAAAA,I,kCAAAA,M,cAYAC,O,uBAAAA,I,iBAAAA,I,iBAAAA,I,iBAAAA,I,iBAAAA,I,kBAAAA,M,cASA/Q,O,uBAAAA,I,uBAAAA,I,mBAAAA,I,2BAAAA,I,iCAAAA,I,yBAAAA,I,8BAAAA,M,cAUAgR,O,mBAAAA,I,qCAAAA,I,6BAAAA,I,iCAAAA,I,2CAAAA,I,iBAAAA,I,mCAAAA,I,gCAAAA,M,cAWAC,O,eAAAA,I,2BAAAA,I,uBAAAA,I,kBAAAA,M,cAOAC,O,eAAAA,I,2BAAAA,I,uBAAAA,I,kBAAAA,M,cAOAC,O,eAAAA,I,2BAAAA,I,uBAAAA,I,kBAAAA,M,cAYAC,O,qBAAAA,I,6BAAAA,I,4BAAAA,M,cAMAC,O,+BAAAA,I,uBAAAA,I,6BAAAA,I,wBAAAA,M,KAOL,MAAMC,EAA2B,2BAEjC,IAAKC,G,SAAAA,O,qBAAAA,I,qCAAAA,I,2BAAAA,I,2CAAAA,I,yBAAAA,I,uCAAAA,I,yCAAAA,I,2DAAAA,I,+CAAAA,I,2CAAAA,I,4CAAAA,I,sCAAAA,I,iCAAAA,M,mCC9PZ,wBAoBeC,IAXV,EACHjD,QAAQ,OACRE,oBAGE,yBAAKD,UAAWiD,YAAe,UAAWlD,EAAOE,GAAkB,oBACjE,gC,6BCfN,oDAKAh5B,OAAO8G,iBAAiB,QAASm1B,GACjCj8B,OAAO8G,iBAAiB,qBAAsBm1B,GAG9C,MAGMC,EAAY9Y,KAAKlgB,MACvB,IAAIi5B,GAAc,EAElB,SAASF,EAAiB9gC,GACxBA,EAAEihC,iBAEF74B,EAAYpI,aAAakhC,WAAalhC,EAAEyC,MAAQzC,EAAEmhC,QAG7BjO,YAASruB,OAAOu8B,MAAO,KAEvC,SAASh5B,EAAY3G,GAI1B,GAFAkD,QAAQlC,MAAMhB,IAEVu/B,EAAJ,CAKA,GAAI/Y,KAAKlgB,MAAQg5B,GAtBK,IAsByB,CAC7C,GAAIM,aAAaC,QAAQh1B,KACvB+0B,aAAaE,WAAWj1B,SACnB,KAAI+0B,aAAaC,QAAQl1B,KAG9B,OAFAi1B,aAAaE,WAAWn1B,KAQ1B,OAHA40B,GAAc,OACdn8B,OAAO28B,SAASC,SAKeC,K,6BC/CnC,kGAaA,MAAMC,EAAqB,gBACrBC,EAAwB,kBAEf,SAASC,EACtBC,EACAC,EAGK,CAAC,SACNC,GAEA,MAAoB,iBAATF,EACF,CAACA,GAGHC,EAAQnuB,OAAO,CAAC4D,EAAMjD,KAC3B,OAAQA,GACN,IAAK,cACH,OAqCR,SAAoB0tB,GAClB,MAAMC,EAAQzhC,SAASQ,cAAc,OACrC,OAAOghC,EAAUruB,OAAO,CAACO,EAAQ2tB,IACX,iBAATA,EACF,IAAI3tB,EAAQ2tB,IAGrBI,EAAMC,UAAYL,EAEX,IAAI3tB,EAAQ+tB,EAAME,YACxB,IA/CUC,CAAW7qB,GAEpB,IAAK,WAEH,OADA8qB,IAAYC,UAAY,EACjBC,EAAchrB,EAAM,MAAO,OAEpC,IAAK,QAEH,OADA8qB,IAAYC,UAAY,EACjBC,EAAchrB,EAAM,QAAS,OAEtC,IAAK,aAEH,OADA8qB,IAAYC,UAAY,EACjBC,EAAchrB,EAAM,QAAS,QAEtC,IAAK,KACH,OAAOirB,EAAcjrB,EAAM,OAE7B,IAAK,UACH,OAAOirB,EAAcjrB,EAAM,QAE7B,IAAK,YACH,OAqGcyqB,EArGMzqB,EAqGiBkrB,EArGXV,EAAQU,UAsGjCT,EAAUruB,OAAO,CAACO,EAAQ2tB,KAC/B,GAAoB,iBAATA,IAAsBY,EAC/B,MAAO,IAAIvuB,EAAQ2tB,GAGrB,MAAMa,EAAgBb,EAAKtf,cACrBogB,EAAgBD,EAAc1vB,QAAQyvB,EAAUlgB,eAChDqgB,EAAaF,EAAcC,EAAgBF,EAAU3jC,QAC3D,GAAI6jC,EAAgB,GAAMC,GAAcA,EAAW3rB,MAAMyqB,GACvD,MAAO,IAAIxtB,EAAQ2tB,GAGrB,MAAMgB,EAAuB,GAS7B,OARAA,EAASzjC,KAAKyiC,EAAKloB,UAAU,EAAGgpB,IAChCE,EAASzjC,KACP,0BAAMu+B,UAAU,2BACbkE,EAAKloB,UAAUgpB,EAAeA,EAAgBF,EAAU3jC,UAG7D+jC,EAASzjC,KAAKyiC,EAAKloB,UAAUgpB,EAAgBF,EAAU3jC,SAEhD,IAAIoV,KAAW2uB,IACrB,IA1HC,IAAK,QACH,OA+HR,SAAkBb,GAChB,OAAOA,EAAUruB,OAAO,CAACO,EAAQ2tB,KAC/B,GAAoB,iBAATA,EACT,MAAO,IAAI3tB,EAAQ2tB,GAGrB,MAAMiB,EAAQ,IAAKjB,EAAK5qB,MAAML,IAAY,MAASirB,EAAK5qB,MAAM8rB,IAAe,IAC7E,IAAKD,EAAMhkC,OACT,MAAO,IAAIoV,EAAQ2tB,GAGrB,MAAM7pB,EAAsB,GAE5B,IAAIgrB,EAAWF,EAAMvjC,QACjB+iC,EAAY,EAChB,KAAOU,GAAU,CACf,MAAMjwB,EAAQ8uB,EAAK7uB,QAAQgwB,EAAUV,GACrCtqB,EAAQ5Y,KAAKyiC,EAAKloB,UAAU2oB,EAAWvvB,IACnCiwB,EAAShE,WAAW,KACtBhnB,EAAQ5Y,KACN,kBAAC,IAAD,CAAaijB,SAAU2gB,GACpBA,KAIDA,EAASC,SAAS,OACpBD,EAAWA,EAASl+B,MAAM,EAAGk+B,EAASlkC,OAAS,IAGjDkZ,EAAQ5Y,KACN,kBAAC,IAAD,CAAUmY,KAAMyrB,EAAUxpB,IAAKwpB,MAGnCV,EAAYvvB,EAAQiwB,EAASlkC,OAC7BkkC,EAAWF,EAAMvjC,QAInB,OAFAyY,EAAQ5Y,KAAKyiC,EAAKloB,UAAU2oB,IAErB,IAAIpuB,KAAW8D,IACrB,IAtKUkrB,CAAS3rB,GAElB,IAAK,kBACH,OAAO4rB,EAAsB5rB,EAAM,OAErC,IAAK,uBACH,OAAO4rB,EAAsB5rB,EAAM,QA4F3C,IAAsByqB,EAAuBS,EAzFzC,OAAOlrB,GACN,CAACsqB,IAgBN,SAASU,EAAcP,EAAuBplB,EAAuB3b,GACnE,OAAIywB,IACKsQ,EAGFA,EAAUruB,OAAO,CAACO,EAAQ2tB,KAC/B,GAAoB,iBAATA,EACT,MAAO,IAAI3tB,EAAQ2tB,GAGrB,MAAMtR,EAAQsR,EAAKxrB,MAAMgsB,KACnBe,EAASvB,EAAK5qB,MAAMorB,MAAgB,GAG1C,OAFAnuB,EAAO9U,KAAKmxB,EAAM,IAEX6S,EAAOzvB,OAAO,CAAC0vB,EAAyBlrB,EAAOvZ,KACpD,MAAM8C,EAAO4hC,YAAiB9F,YAAYrlB,IACpCwlB,EAAYiD,YAChB,QACS,UAAThkB,GAAoB,eAET,QAAT3b,GACFoiC,EAAYjkC,KACV,yBACEu+B,UAAWA,EACXp8B,IAAM,eAAuB,QAATqb,EAAiB,MAAQ,QAAQlb,QACrD6hC,IAAKprB,KAIE,SAATlX,GACFoiC,EAAYjkC,KAGT,iCAAgCu+B,uBAAwC,QAAT/gB,EAAiB,MAAQ,QAAQlb,eAAkByW,SAIvH,MAAMpF,EAAY,EAAJnU,EAAQ,EAKtB,OAJI2xB,EAAMxd,IACRswB,EAAYjkC,KAAKmxB,EAAMxd,IAGlBswB,GACNnvB,IACF,IAGL,SAASsuB,EAAcR,EAAuB/gC,GAC5C,OAAO+gC,EAAUruB,OAAO,CAACO,EAAQ2tB,IACX,iBAATA,EACF,IAAI3tB,EAAQ2tB,GAGd,IAAI3tB,KAAW2tB,EACnBxrB,MAAM,eACN1C,OAAO,CAAC4c,EAAmBiT,EAAc5kC,EAAGiH,KAE3C,MAAM49B,EAAcD,EAAKE,WACnBC,EAAeH,EAAK1kC,OAAS2kC,EAAY3kC,OAS/C,OARAyxB,EAAMnxB,KAAK8H,OAAOq2B,aAAa,KAAKkB,OAAOkF,GAAgBF,GAEvD7kC,IAAMiH,EAAO/G,OAAS,GACxByxB,EAAMnxB,KACK,QAAT6B,EAAiB,6BAAS,UAIvBsvB,GACN,KACJ,IA6BL,MAAM3Z,EAAU,IAAIC,OAAO7G,KAAkB,MACvC+yB,EAAa,eA4CnB,SAASI,EAAsBnB,EAAuB/gC,GACpD,OAAO+gC,EAAUruB,OAAO,CAACO,EAAQ2tB,KAC/B,GAAoB,iBAATA,EACT,MAAO,IAAI3tB,EAAQ2tB,GAGrB,MAAMtR,EAAQsR,EAAKxrB,MAAMsrB,GACnBzoB,EAAW2oB,EAAK5qB,MAAM0qB,IAA0B,GAGtD,OAFAztB,EAAO9U,KAAKmxB,EAAM,IAEXrX,EAASvF,OAAO,CAACiwB,EAA0BvqB,EAAQza,KAC3C,QAATqC,EACF2iC,EAAaxkC,KACXia,EAAO2lB,WAAW,MACd,2BAAI3lB,EAAOqK,QAAQ,QAAS,KAC5B,2BAAIrK,EAAOqK,QAAQ,MAAO,MAGhCkgB,EAAaxkC,KACXia,EAAO2lB,WAAW,MACb,MAAK3lB,EAAOqK,QAAQ,QAAS,UAC7B,MAAKrK,EAAOqK,QAAQ,MAAO,WAIpC,MAAM3Q,EAAY,EAAJnU,EAAQ,EAKtB,OAJI2xB,EAAMxd,IACR6wB,EAAaxkC,KAAKmxB,EAAMxd,IAGnB6wB,GACN1vB,IACF,M,6BChQU,SAAS9I,EAAqBy4B,EAA0BC,GACrE,GAAID,IAAiBC,EACnB,OAAO,EAGT,MAAMC,EAAchlC,OAAOgT,KAAK8xB,GAC1BG,EAAoBD,EAAYjlC,OAGtC,GAAIklC,IAFkBjlC,OAAOgT,KAAK+xB,GAAUhlC,OAG1C,OAAO,EAGT,GAA0B,IAAtBklC,EACF,OAAO,EAGT,IAAK,IAAIplC,EAAI,EAAGA,EAAIolC,EAAmBplC,IAAK,CAC1C,MAAMqlC,EAAOF,EAAYnlC,GACzB,GAAIilC,EAAaI,KAAUH,EAASG,GAClC,OAAO,EAIX,OAAO,EAGF,SAASz4B,EAAgBq4B,EAA0BC,GACxD,MAAMC,EAAchlC,OAAOgT,KAAK8xB,GAIhC,OAH0BE,EAAYjlC,SAChBC,OAAOgT,KAAK+xB,GAAUhlC,OAGnC,CAAC,YAGHilC,EAAYzvB,OAAQ2vB,GAASJ,EAAaI,KAAUH,EAASG,IApCtE,qE,6BCAA,wBA6BeC,IAjBY,EAAGn+B,WAAU43B,YAAWwG,cACjD,MAAMC,EAAcr5B,YAAahL,IAC/BA,EAAEihC,iBACFmD,EAASpkC,IACR,CAACokC,IAEJ,OACE,uBACE/jC,KAAK,IACLu9B,UAAWiD,YAAe,OAAQjD,GAClCwG,QAASA,EAAUC,OAAcrhC,GAEhCgD,K,6BCxBSs+B,QACd,IAAIjxB,EAEJ,GACEA,EAAKlM,OAAOe,KAAKq8B,UAAU5gB,QAAQ,KAAM,YAClC2gB,EAAMplC,eAAemU,IAE9B,OAAOA,I,6BCPT,uMAkBA,SAASmxB,EAAeC,GACtB,MAAMjmC,EAAOimC,EAAaC,SAC1B,OAAO9J,KAAKC,UAAU,CACpB8J,SAAUnmC,EAAKmmC,SACf3yB,KAAMxT,EAAKwT,OAIf,SAAS4yB,IACP,QAAK9S,MACC,qBAAsB+S,0BAA0B5lC,UAWtB,WAA5B6lC,aAAaC,YACXv9B,KAEF7C,QAAQsD,KAAK,oDAER,GAIH,gBAAiBpD,SACjB2C,KAEF7C,QAAQsD,KAAK,2CAER,IAxBHT,KAEF7C,QAAQsD,KAAK,gDAER,IAsDXuvB,eAAewN,IACP,iBAAkBngC,SACnB,CAAC,UAAW,UAAU6c,SAASojB,aAAaC,mBACzCD,aAAaE,qBAIvBxN,eAAeyN,EAAoBR,GACjC,MAAMnlB,EAAS9M,cACT0yB,EAAWzyB,cACjB,GAAIgyB,EACF,IACE,MAAMU,EAAcX,EAAeC,GAInC,aAHMxP,YAAQ,mBAAoBkQ,SAC5BV,EAAaW,mBACnBF,EAASG,oBAET,MAAO5iC,GACH+E,KAEF7C,QAAQkD,IAAI,0CAA2CpF,GAIzD6c,EAAOjgB,aACH41B,YAAQ,mBAAoB3V,EAAOjgB,KAAK8lC,aAC9CD,EAASG,qBAKN7N,eAAe4N,IACpB,IAAKR,IAAwB,OAC7B,MAAMU,QAAkC1U,UAAU2U,cAAcC,MAC1Df,QAAqBa,EAA0BG,YAAYC,wBAC3DT,EAAoBR,GAUrBjN,eAAemO,IAGpB,GATFnO,iBACE,MAAMrjB,QAAe8gB,YAAQ,6BACxB9gB,GACLxC,YAAUi0B,YAAgBpzB,cAAa2B,IAIvC0xB,IAEKjB,IAIH,kBADMI,IAGR,MAAMM,QAAkC1U,UAAU2U,cAAcC,MAChE,IAAIf,QAAqBa,EAA0BG,YAAYC,kBAC/D,GA/DF,SAAkCjB,GAChC,MAAMnlB,EAAS9M,cACf,OAAK8M,EAAOjgB,OAASolC,IACjBD,EAAeC,KAAkBnlB,EAAOjgB,KAAK8lC,aAC1Cld,KAAKlgB,MAAQuX,EAAOjgB,KAAKymC,aANX,OAiEhBC,CAAyBtB,GAA9B,OACMQ,EAAoBR,GAC1B,IACEA,QAAqBa,EAA0BG,YAAYE,UAAU,CACnEK,iBAAiB,IAEnB,MAAMb,EAAcX,EAAeC,GAC/Bj9B,KAEF7C,QAAQkD,IAAI,sCAAuCs9B,SAE/ClQ,YAAQ,iBAAkBkQ,GAChC1yB,cACGwzB,eAAed,GAClB,MAAO1iC,GACyB,WAA5BqiC,aAAaC,WAKXv9B,KAEF7C,QAAQsD,KAAK,mDAENT,MAKT7C,QAAQkD,IAAI,sCAAuCpF,GAI/CA,EAAMd,OAASukC,aAAaC,iBACxBnB,OAsEP,SAASoB,GAA2B,KACzCvmB,EADyC,QAEzC/c,EAFyC,aAGzCujC,IAEA,KAhMM,iBAAkBxhC,OAQQ,WAA5BigC,aAAaC,aACXv9B,KAEF7C,QAAQsD,KAAK,mDAER,IAZHT,KAEF7C,QAAQsD,KAAK,6DAER,IA2L6B,OACtC,IAAKnF,EAAQuQ,GAAI,OAEjB,IAxEF,SAA6BwM,EAAeyN,GAC1C,GAAIzN,EAAK+C,SAAW/C,EAAK6K,YAAa,OAAO,EAG7C,GAAI4C,GAAY7sB,SAAS6lC,WAAY,OAAO,EAE5C,MAAMhnB,EAAS9M,cACf,OAAQqN,EAAK3e,MACX,IAAK,kBACL,IAAK,iBACH,OAAO4U,QAAQwJ,EAAO+M,SAASxY,MAAM0yB,8BACvC,IAAK,qBACL,IAAK,qBACH,OAAOzwB,QAAQwJ,EAAO+M,SAASxY,MAAM2yB,uBACvC,IAAK,kBACH,OAAO1wB,QAAQwJ,EAAO+M,SAASxY,MAAM4yB,2BAEzC,OAAO,EAuDFC,CAAoB7mB,EAAMwmB,GAAe,OAE9C,MAAM,MACJ/tB,EADI,KAEJquB,GAxDJ,SAAgC9mB,EAAe/c,GAC7C,MAAMwc,EAAS9M,eACT,SACJiI,EADI,iBAEJR,GACEnX,EACE8jC,EAAgBnsB,EAAW4E,aAAWC,EAAQ7E,QAAYzX,EAC1D6jC,EAAgBprB,YAAiB3Y,GACjCgkC,EAAsBD,GAAiB5sB,EACzC8L,YAAkBzG,EAAQO,EAAKxM,GAAI4G,QACnCjX,GAEF+jC,aAAcC,EACdC,aAAcC,GACZL,GAAiB,GACfM,EAAmBH,EAAqB3nB,aAAWC,EAAQ0nB,QAAsBhkC,EACjFokC,EAAoBtnB,YAAqBD,GACzCwnB,EAAkBD,EAAoB/nB,aAAWC,EAAQ8nB,QAAqBpkC,EACpF,IAAI2jC,EACJ,GAAIvsB,aAAgBtX,GAAU,CAC5B,MAAMwkC,EAAeznB,IAASW,aAAcX,IAAS/c,EAAQ2X,WAAa3X,EAAQkU,QAC9E6I,EACA+mB,EACJD,EAAOY,YACLzkC,EACAwkC,EACAH,EACAL,EACAI,EACA,CAAEM,SAAS,QAER,CACL,MAAMC,EAAaC,YAAqB7nB,EAAKxM,GAAIuzB,GAC3CnuB,EAAUE,YAAoB7V,GAEpC6jC,EAAOc,EAAc,GAAEA,MAAehvB,IAAYA,EAGpD,MAAO,CACLH,MAAOuC,YAAagF,EAAMwnB,GAC1BV,QAiBEgB,CAAuB9nB,EAAM/c,GAEjC,GAAI8hC,IACEhU,UAAU2U,cAAcqC,YAE1BhX,UAAU2U,cAAcqC,WAAWtS,YAAY,CAC7Cp0B,KAAM,yBACN0R,QAAS,CACP0F,QACAquB,OACA3vB,OAAQ6I,EAAKxM,GACb8D,UAAWrU,EAAQuQ,UAIpB,CACL,MAAM6xB,EAAWzyB,cACXo1B,EAAe,IAAI/C,aAAaxsB,EAAO,CAC3CquB,OACAmB,KAAM,mBACNC,MAAO,mBACPnnC,IAAKkC,EAAQuQ,GAAG20B,WAChBC,QAAS,CAAC,IAAK,IAAK,OAGtBJ,EAAaK,QAAU,KACrBL,EAAaM,QACbjD,EAASkD,aAAa,CACpBpxB,OAAQ6I,EAAKxM,GACb8D,UAAWrU,EAAQuQ,KAEjBxO,OAAOwjC,OACTxjC,OAAOwjC,UAOR,SAASC,IACT1X,UAAU2U,cAAcqC,YAC7BhX,UAAU2U,cAAcqC,WAAWtS,YAAY,CAC7Cp0B,KAAM,kB,6BC5SV,0SAKA,MAAMqnC,EAAkB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAEpC,SAASC,EAAuBtoB,GACrC,GAAKA,EAIL,OAAQA,EAAKhf,MACX,IAAK,cACL,IAAK,kBACH,OAAOgf,EAAKuoB,WAAavoB,EAAKwoB,SAGhC,IAAK,kBACL,IAAK,kBACH,MAAO,UAGT,QACE,QAIC,SAAS9tB,EAAgBsF,GAC9B,GAAKA,EAAL,CAIA,GAAIyoB,EAAczoB,GAChB,MAAO,kBAGT,OAAQA,EAAKhf,MACX,IAAK,cACL,IAAK,kBACH,GAAIgf,EAAKuoB,WAAavoB,EAAKwoB,SACzB,MAAQ,GAAExoB,EAAKuoB,aAAavoB,EAAKwoB,WAGnC,GAAIxoB,EAAKuoB,UACP,OAAOvoB,EAAKuoB,UAGd,GAAIvoB,EAAKwoB,SACP,OAAOxoB,EAAKwoB,SAGd,MAGF,IAAK,kBACL,IAAK,kBACH,MAAO,oBAON,SAASE,EAAc1oB,EAAeyX,GAC3C,GAAIzX,EAAK7M,KAAOjD,KACd,OAAOunB,EAAK,wBAAwBnV,cAGtC,GAAItC,EAAKhf,MAAsB,gBAAdgf,EAAKhf,KACpB,MAAO,MAGT,IAAKgf,EAAK2oB,OACR,MAAO,GAGT,OAAQ3oB,EAAK2oB,OAAO3nC,MAClB,IAAK,kBACH,OAAOy2B,EAAK,gBAGd,IAAK,sBACH,OAAOA,EAAK,gBAGd,IAAK,qBACH,OAAOA,EAAK,eAGd,IAAK,oBAAqB,CACxB,MAAM,UAAEmR,GAAc5oB,EAAK2oB,OAE3B,IAAKC,EAAW,OAAOnR,EAAK,oBAE5B,MAAM5vB,EAAM,IAAIkgB,KACV8gB,EAAgB,IAAI9gB,KAAiB,IAAZ6gB,GAE/B,GAAIC,GAAiBhhC,EACnB,OAAO4vB,EAAK,oBAGd,MAAMqR,EAAO,IAAI/gB,KAAKlgB,EAAIkhC,UAAYF,EAAcE,WAGpD,GAAID,EAAKC,UAAY,IAAO,GAC1B,OAAOtR,EAAK,oBAId,GAAIqR,EAAKC,UAAY,IAAO,KAAS,CAEnC,OAAOtR,EAAK,sBADIzvB,KAAKghC,MAAMF,EAAKC,UAAY,IAAO,KAKrD,MAAME,EAAQ,IAAIlhB,KAElB,GADAkhB,EAAMC,SAAS,EAAG,EAAG,EAAG,GACpBL,EAAgBI,EAAO,CAEzB,GAAIH,EAAKC,UAAY,IAAO,MAAa,CAEvC,OAAOtR,EAAK,oBADEzvB,KAAKghC,MAAMF,EAAKC,UAAY,IAAO,GAAK,KAKxD,OAAOtR,EAAK,mBAAoB0R,YAAWN,IAI7C,MAAMO,EAAY,IAAIrhB,KAGtB,OAFAqhB,EAAUC,QAAQxhC,EAAIyhC,UAAY,GAClCL,EAAMC,SAAS,EAAG,EAAG,EAAG,GACpBL,EAAgBO,EACX3R,EAAK,uBAAwB0R,YAAWN,IAG1CpR,EAAK,kBAAmB8R,YAAeV,IAGhD,IAAK,mBACH,OAAOpR,EAAK,UAGd,IAAK,qBACH,OAAOA,EAAK,UAGd,QACE,QAIC,SAAS/W,EAAaV,GAC3B,MAAM,GAAE7M,EAAF,OAAMw1B,EAAN,KAAc3nC,GAASgf,EAE7B,QAAK2oB,IAIDx1B,IAAOjD,OAIY,qBAAhBy4B,EAAO3nC,MAAwC,gBAATA,IAGxC,SAASynC,EAAczoB,GAC5B,SAAKA,EAAK2oB,QAAwB,gBAAd3oB,EAAKhf,MAA0Bgf,EAAK7M,KAAOjD,QAI1C,oBAAd8P,EAAKhf,MACO,oBAAdgf,EAAKhf,MAGL,SAASif,EAAUD,GACxB,MAAqB,gBAAdA,EAAKhf,KAGP,SAASwoC,EACdjd,EACAkd,EACAC,GAEA,OAAOh+B,YAAQ6gB,EAAUpZ,IACvB,MAAMtL,EAAMkgB,KAAKlgB,MAAQ,IAEzB,GAAI6hC,GAAeA,EAAYloB,SAASrO,GAItC,OAAOtL,EAAO,QAAiB6hC,EAAY7qC,OAAS6qC,EAAY32B,QAAQI,IAG1E,MAAM6M,EAAOypB,EAAUt2B,GACvB,IAAK6M,IAASA,EAAK2oB,OACjB,OAAO,EAGT,GAAyB,qBAArB3oB,EAAK2oB,OAAO3nC,KACd,OAAOgf,EAAK2oB,OAAOgB,QACd,GAAyB,sBAArB3pB,EAAK2oB,OAAO3nC,MAAgCgf,EAAK2oB,OAAOC,UACjE,OAAO5oB,EAAK2oB,OAAOC,UAGrB,OAAQ5oB,EAAK2oB,OAAO3nC,MAClB,IAAK,qBACH,OAAO6G,EAAM,MACf,IAAK,qBACH,OAAOA,EAAM,OACf,IAAK,sBACH,OAAOA,EAAM,QACf,QACE,OAAO,IAEV,QAKE,SAAS+hC,EAAgBC,GAC9B,MAAM/2B,EAAQ+2B,EAAO7hC,KAAK8hC,IAAID,EAAK12B,IAAM,EAAI,EAE7C,OAAOk1B,EAAgBv1B,K,6BClOzB,qiCAeO,SAASuN,EAAcvJ,GAC5B,OAAOA,EAAS,EAGX,SAASsV,EAAYzM,GAC1B,OAAO4H,EAAiB5H,IAAS8H,EAAiB9H,GAG7C,SAAS4H,EAAiB5H,GAC/B,MAAqB,uBAAdA,EAAK3e,KAGP,SAASymB,EAAiB9H,GAC/B,MAAqB,uBAAdA,EAAK3e,KAGP,SAASsf,EAAcX,GAC5B,MAAqB,oBAAdA,EAAK3e,KAGP,SAASgqB,EAAgBrL,GAC9B,MAAqB,oBAAdA,EAAK3e,MAA4C,uBAAd2e,EAAK3e,KAG1C,SAAS+oC,EAAkBpqB,GAChC,OAAQA,EAAK3e,MACX,IAAK,kBACH,MAAO,cACT,IAAK,qBACL,IAAK,qBACH,MAAO,gBACT,IAAK,kBACH,MAAO,kBACT,QACE,MAAO,QAIN,SAAS4e,EAAqBD,GACnC,GAAkB,oBAAdA,EAAK3e,MAA4C,mBAAd2e,EAAK3e,KAG5C,OAAO2e,EAAKxM,GAIP,SAASwH,EAAagF,EAAeK,EAAgBgqB,GAAS,GACnE,OAAIA,GAAWhqB,GAAQL,EAAKxM,KAAO6M,EAAK7M,IAAM6M,EAAKgqB,OAC1C1R,YAAe,iBAEjB3Y,EAAKvH,OAASkgB,YAAe,cAG/B,SAAS2R,EAAmBtqB,GACjC,GAAKA,EAAKY,SAGV,OAAOZ,EAAKY,SAAS2pB,MAGhB,SAASC,EAAYxqB,GAC1B,MAAM,SAAEyC,GAAazC,GACf,WAAEyqB,GAAezqB,EAAKY,UAAY,GAExC,OAAI6pB,GAAcA,EAAWvrC,OACpBurC,EAGFhoB,EAAY,QAAOA,EAAa,GAGlC,SAASioB,EACdC,EACA3tB,EAAyB,UAEzB,GAAK2tB,EAAMC,WAIX,OAAQ5tB,GACN,IAAK,MACH,MAAQ,UAAS2tB,EAAMn3B,MAAMm3B,EAAMC,aACrC,QACE,MAAQ,SAAQD,EAAMn3B,MAAMm3B,EAAMC,cAIjC,SAASC,EAAkB7qB,GAChC,OAAQA,EAAKmB,YAGR,SAAS2pB,EAAY9qB,GAC1B,OAAO/J,QAAQ+J,EAAK+qB,aAGf,SAASpiB,EAAiB3I,EAAexb,GAC9C,QAAOwb,EAAK+qB,aAAc/qB,EAAK+qB,YAAYvmC,GAGtC,SAASkkB,EAAkB1I,EAAexb,GAC/C,OAAOyR,QACJ+J,EAAKgrB,yBAA2BhrB,EAAKgrB,wBAAwBxmC,IAC1Dwb,EAAKirB,qBAAuBjrB,EAAKirB,oBAAoBzmC,IAItD,SAAS+jB,EAAiBvI,EAAeT,GAC9C,OAAIA,IAAagC,oBAIbvB,EAAKwH,cAAgBxH,EAAKkrB,YAAclrB,EAAK6K,iBAI7C7K,EAAKyI,cAIL/H,EAAcV,EAAKxM,MAInBmN,EAAcX,GACT2I,EAAiB3I,EAAM,gBAGzB8qB,EAAY9qB,KAAU0I,EAAkB1I,EAAM,mBAWhD,SAASmrB,EAA4BnrB,EAAgBorB,GAAgB,GAC1E,IAAKprB,EACH,MAAO,CACLqrB,gBAAgB,EAChBC,gBAAgB,EAChBC,iBAAiB,EACjBC,aAAa,EACbC,qBAAqB,GAIzB,MAAMC,EAAUZ,EAAY9qB,GAE5B,MAAO,CACLqrB,eAAgBK,IAAYhjB,EAAkB1I,EAAM,aACpDsrB,gBAAiBI,IAAYhjB,EAAkB1I,EAAM,iBAAmBU,EAAcV,EAAKxM,KAAO43B,GAClGG,gBAAiBG,IAAYhjB,EAAkB1I,EAAM,gBACrDwrB,YAAaE,IAAYhjB,EAAkB1I,EAAM,YACjDyrB,oBAAqBC,IAAYhjB,EAAkB1I,EAAM,eAItD,SAAS2rB,EAAmC3rB,GACjD,OAAIA,EAAKgrB,yBAA2BhrB,EAAKgrB,wBAAwBY,aACxD,qDAEL5rB,EAAKirB,qBAAuBjrB,EAAKirB,oBAAoBW,aAChD,qDADT,EAOK,SAASC,EAAuB7rB,GACrC,GAAKA,GAASA,EAAKY,SAInB,OAAOZ,EAAKY,SAASkrB,SAGhB,SAASC,EAAa/rB,GAC3B,OAAO3X,KAAK2jC,IAAIhsB,EAAKisB,UAAY,EAAGjsB,EAAKmB,YAAcnB,EAAKmB,YAAYzD,KAAO,GAG1E,SAASwuB,EAAelsB,GAC7B,OAAOA,EAAKgC,WAAavR,IAGpB,SAAS07B,EAAiBnsB,GAC/B,OAAO4H,EAAiB5H,KAAW8H,EAAiB9H,IAASW,EAAcX,KAAUA,EAAKyI,UAGrF,SAAS2jB,EACdC,EACAvC,EACAwC,EACAC,GAEA,MAAMC,EAAkBF,EAAOE,gBAAkB,IAAIr/B,IAAIm/B,EAAOE,sBAAmBrpC,EAC7EspC,EAAkBH,EAAOE,gBAAkB,IAAIr/B,IAAIm/B,EAAOG,sBAAmBtpC,EAC7Eof,EAAgB+pB,EAAOE,gBAAkB,IAAIr/B,IAAIm/B,EAAO/pB,oBAAiBpf,EAQ/E,MAAO,EAPUopC,GAAgBptC,OAAOgT,KAAKk6B,GAAWplC,IAAI+K,SACzD0C,OAAQlB,GASb,SACEwM,EACAssB,EACAxC,EACA0C,EACAC,EACAlqB,GAEA,GAAIiqB,GAAmBA,EAAgB73B,IAAIqL,EAAKxM,IAC9C,OAAO,EAGT,GAAIi5B,GAAmBA,EAAgB93B,IAAIqL,EAAKxM,IAC9C,OAAO,EAGT,GAAI+O,GAAiBA,EAAc5N,IAAIqL,EAAKxM,IAC1C,OAAO,EAGT,GAAI04B,EAAelsB,IAASssB,EAAOI,gBACjC,OAAO,EAGT,GAAI1sB,EAAK+C,SAAWupB,EAAOK,aACzB,OAAO,EAGT,IAAK3sB,EAAK8C,cAAgB9C,EAAK4sB,sBAAwB5sB,EAAK6sB,eAAiBP,EAAOQ,YAClF,OAAO,EAGT,GAAIpsB,EAAcV,EAAKxM,IAAK,CAC1B,MAAMg0B,EAAkBsC,EAAU9pB,EAAKxM,IAGvC,GADsBg0B,GAA4C,gBAAzBA,EAAgBnmC,MAEvD,GAAIirC,EAAOS,KACT,OAAO,MAEJ,CACL,GAAIT,EAAOU,UAAYxF,GAAmBA,EAAgByF,UACxD,OAAO,EAGT,GAAIX,EAAOY,aAAe1F,IAAoBA,EAAgByF,UAC5D,OAAO,OAGN,IAAIxgB,EAAYzM,GACrB,QAASssB,EAAOa,OACX,GAAIxsB,EAAcX,GACvB,QAASssB,EAAOc,SAGlB,OAAO,EA/DIC,CACLhB,EAAU74B,GAAK84B,EAAQxC,EAAW0C,EAAiBC,EAAiBlqB,IAIzD+pB,EAAO/pB,eA6DnB,SAAS+qB,EACdjB,EACA5qB,EACAY,EACAkrB,EAA4C,OAE5C,SAASC,EAAWxtB,GAClB,IAAKA,IAASA,EAAKmB,aAAenB,EAAKkrB,WACrC,OAAO,EAGT,OAAQqC,GACN,IAAK,MACH,GAAIrB,EAAelsB,GACjB,OAAO,EAET,MACF,IAAK,WACH,IAAKksB,EAAelsB,GAClB,OAAO,EAKb,OAAQA,EAAKwH,eAAiBxH,EAAK6K,YAGrC,MAAM4iB,EAAchsB,EACjBxa,IAAKuM,GAAO64B,EAAU74B,IACtBkB,OAAO84B,GAEJE,EAAa,IAAIvgC,IAAIsU,GAkB3B,MAAO,CACLksB,YAlBkBtrB,EAEhBA,EACGpb,IAAKuM,GAAO64B,EAAU74B,IACtBkB,OAAO84B,GACP94B,OAAQsL,GAAS0tB,EAAW/4B,IAAIqL,EAAKxM,KAExC,GAYFo6B,WAViB7hC,YACjBsW,EACIorB,EAAY/4B,OAAQsL,IAAUqC,EAAiBR,SAAS7B,EAAKxM,KAC7Di6B,EACJ1B,EACA,SASG,SAAS8B,EACdxB,EACAvC,EACAwC,EACAC,GAEA,MAAO9qB,GAAW2qB,EAAqBC,EAAWvC,EAAWwC,EAAQC,GAE/DkB,EAAchsB,EACjBxa,IAAKuM,GAAO64B,EAAU74B,IACtBkB,OAAQsL,GAAUA,GAAQA,EAAKmB,cAAgBnB,EAAKwH,eAAiBxH,EAAK6K,aAU7E,MAAO,CACLijB,mBATyBL,EACxB15B,OAAO,CAACg6B,EAAO/tB,IAAUA,EAAK8C,aAAe9C,EAAK6sB,cAAgBkB,EAAQ,EAAIA,EAAQ,GASvFC,iBAPuBP,EAAY9iC,KAAMqV,GACzCA,EAAK4sB,sBACA5sB,EAAK+C,UAAY/C,EAAK8C,aAAe9C,EAAK6sB,iBAS5C,SAASoB,EACd5B,EACAvC,EACAwC,EACAC,EACAzU,GAEA,MAAM,GACJtkB,EADI,MACAiF,EADA,SACOy1B,EADP,YACiBC,EADjB,cAC8B5rB,EAD9B,gBAEJiqB,EAFI,gBAEaC,EAFb,gBAGJC,EAHI,aAGaC,EAHb,YAG2BG,KAC5B5K,GACDoK,EAIJ,GACEntC,OAAO6M,OAAOk2B,GAASxtB,OAAOuB,SAAS/W,OAAS,GAC5CstC,GAAmBA,EAAgBttC,QACnCutC,GAAmBA,EAAgBvtC,OACvC,CAEA,OAAO44B,EAAK,QAmBhB,SACEuU,EACAvC,EACAwC,EACAC,GAEA,MAAO9qB,EAAS2sB,GAAahC,EAAqBC,EAAWvC,EAAWwC,EAAQC,IAC1E,YAAEoB,EAAF,WAAeC,GAAeN,EAAgBjB,EAAW5qB,EAAS2sB,EAAW,UACnF,OAAOT,EAAYzuC,OAAS0uC,EAAW1uC,OA5BtBmvC,CAAoBhC,EAAWvC,EAAWwC,EAAQC,IAKnE,OAAIrK,EAAQ6K,KACHjV,EAAK,cACHoK,EAAQiL,OACVrV,EAAK,gBACHoK,EAAQkL,SACVtV,EAAK,kBACHoK,EAAQ8K,SACVlV,EAAK,kBACHoK,EAAQgL,YACVpV,EAAK,0BAEZ,EAeG,SAASwW,EAAOC,GACrB,QAAKA,GAIEA,EAAW/6B,GAAK,EAGlB,SAASq0B,EAAqB1wB,EAAgB2D,GACnD,GAAKA,IAAU4F,EAAcvJ,GAI7B,OAAI2D,EAAOuvB,OACF,MAGF1B,YAAuB7tB,GAGzB,SAAS0zB,EACdC,EACApC,EACAqC,GAA2B,EAC3B3E,GAEA,OAAOh+B,YAAQ0iC,EAAUj7B,IACvB,MAAMwM,EAAOqsB,EAAU74B,GACvB,IAAKwM,EACH,OAAO,EAGT,IAAI2uB,EAAW,EAiBf,OAfI3uB,EAAKmB,cACPwtB,GAAY3uB,EAAKmB,YAAYzD,MAG3BgxB,GAA4B1uB,EAAK4uB,aACnCD,GAAY,KAGV5E,GAAeA,EAAYloB,SAASrO,KAItCm7B,GAAYvmB,KAAKlgB,OAAS6hC,EAAY7qC,OAAS6qC,EAAY32B,QAAQI,KAG9Dm7B,GACN,U,6BChdL,wCA4JeE,IAnHc,EAC3BC,MACAztC,OAAO,SACPkjC,UACAwK,gBACAC,cACAC,eACAC,eACAC,UACAhpC,WACA6W,OAAO,UACP8gB,QAAQ,UACRC,YACAz1B,QACA8mC,OACAC,QACAC,SACAC,YACAC,YACAhvC,OACAivC,WACAC,WACAC,SACAC,QACAC,eAGA,IAAIC,EAAazkC,YAA8C,MAC3DyjC,IACFgB,EAAahB,GAGf,MAAOiB,EAAWC,GAAgBhmC,aAAS,GAErCimC,EAAgBjP,YACpB,SACAjD,EACA/gB,EACA8gB,EACAx1B,GAAS,QACT8mC,GAAQ,OACRC,GAAS,QACTK,GAAY,WACZJ,GAAU,OACVC,GAAa,UACbI,GAAU,aACVC,GAAS,QACTG,GAAa,WAGTvL,EAAcr5B,YAAahL,KAC1BuvC,GAAYnL,GACfA,EAAQpkC,GAGV6vC,GAAa,GACb5sC,WAAW,KACT4sC,GAAa,IA3DK,MA6DnB,CAACN,EAAUnL,IAER2L,EAAkB/kC,YAAahL,IACnCA,EAAEihC,kBACGsO,GAAYV,GACfA,EAAY7uC,IAEb,CAAC6uC,EAAaU,IAEjB,OAAIlvC,EAEA,uBACEsuC,IAAKgB,EACL/R,UAAWkS,EACXzvC,KAAMA,EACNiY,MAAO+2B,EACPC,SAAUA,EACVI,SAAUA,GAET1pC,GACCupC,GAAYC,GACZ,kBAAC,IAAD,OAQN,4BACEb,IAAKgB,EACLzuC,KAAMA,EACN08B,UAAWkS,EACX1L,QAASC,EACTuK,cAAeA,EACfC,YAAakB,EACbjB,aAAcA,IAAiBS,EAAWT,OAAe9rC,EACzD+rC,aAAcA,IAAiBQ,EAAWR,OAAe/rC,EACzDgsC,QAASA,IAAYO,EAAWP,OAAUhsC,EAC1CgtC,aAAYX,EACZ/2B,MAAO+2B,EACPK,SAAUA,GAETN,EACC,6BACE,+CACA,kBAAC,IAAD,CAASzR,MAAOwR,EAAS,OAAS,WAElCnpC,GACFupC,GAAYC,GACZ,kBAAC,IAAD,S,6BCxJR,iHAIA,MAAMS,EAAwB,IAAIjjC,IAAI,CAAC,SAAU,aAAc,eAEzDkjC,EAAgE,GAChEC,EAA2B,IAAI/9B,IAC/Bg+B,EAAgD,GAE/C,SAASzkC,EAAiB0kC,EAAsBC,EAAkBC,GACvE,MAAMC,EAAYC,EAAiBH,EAAUD,GACzCK,EAAsBF,EAAWH,GAiDvC,SAA8BG,EAAmBH,EAAsBE,GAChEH,EAAsBI,KACzBJ,EAAsBI,GAAa,EACnC/vC,SAASkL,iBAAiB6kC,EAAWG,KA6EzC,SAA0CH,GACnCN,EAAmBM,KACtBN,EAAmBM,GAAa,IAAIp+B,KAGtC,OAAO89B,EAAmBM,IA/E1BI,CAAiCJ,GAAW/8B,IAAI48B,EAASE,GAkF3D,SAA0CF,GACxC,MAAMQ,EAAWV,EAAyBxsC,IAAI0sC,GAC9C,GAAIQ,EACF,OAAOA,EAGT,MAAMC,EAAS,IAAI9jC,IAGnB,OAFAmjC,EAAyB18B,IAAI48B,EAASS,GAE/BA,EA1FPC,CAAiCV,GAASW,IAAIR,GAC9CJ,EAAsBI,KAxDpBS,CAAqBT,EAAWH,EAASE,GAEzCF,EAAQ1kC,iBAAiB6kC,EAAWD,GAIjC,SAASW,EAAoBb,EAAsBC,EAAkBC,GAC1E,MAAMC,EAAYC,EAAiBH,EAAUD,GACzCK,EAAsBF,EAAWH,GACnCc,EAAwBX,EAAWH,GAEnCA,EAAQa,oBAAoBV,EAAWD,GAI3C,SAASE,EAAiBH,EAAkBD,GAC1C,MAAMG,EAAYF,EAAS3sB,QAAQ,MAAO,IAAInB,cAE9C,MAAkB,WAAdguB,GAA8C,WAApBH,EAAQe,QAG7B,QAGS,gBAAdZ,EACK,WAIS,UAAdA,EACK,UAGS,SAAdA,EACK,WAGFA,EAGT,SAASE,EAAsBW,EAAuBhB,GACpD,OACGJ,EAAsBz7B,IAAI68B,IACJ,UAApBhB,EAAQe,SACY,WAApBf,EAAQe,QAef,SAASD,EAAwBX,EAAmBH,GAClDD,EAAsBI,KACjBJ,EAAsBI,IAGzB/vC,SAASywC,oBAAoBV,EAAWG,GAG1CT,EAAmBM,GAAWh9B,OAAO68B,GACrCF,EAAyBxsC,IAAI0sC,GAAU78B,OAAOg9B,GAGzC,SAASjnC,EAA4B8mC,GAC1C,MAAMiB,EAAanB,EAAyBxsC,IAAI0sC,GAC3CiB,IAILA,EAAW3oC,QAAS6nC,GAAcW,EAAwBX,EAAWH,IACrEF,EAAyB38B,OAAO68B,IAGlC,SAASM,EAAYY,GACnB,MAAMC,EAAStB,EAAmBqB,EAAUrwC,MAE5C,GAAIswC,EAAQ,CACV,IAAIC,GAAwB,EACxB5oC,EAAuB0oC,EAAUhwC,OAErC,MAAMmwC,EAAkB,KACtBD,GAAwB,GAGpBxQ,EAAiB,KACrBsQ,EAAUtQ,kBAIN5/B,EAAQ,IAAIswC,MAAMJ,EAAW,CACjC5tC,IAAG,CAACpC,EAAQhB,IACA,kBAANA,EACKsI,EAEC,oBAANtI,GAAiC,6BAANA,EACtBmxC,EAEC,mBAANnxC,EAEK0gC,EAEF2Q,QAAQjuC,IAAIpC,EAAQhB,KAK/B,KAAOsI,GAAWA,IAAYpI,SAASkmC,MAAM,CAC3C,MAAM4J,EAAUiB,EAAO7tC,IAAIkF,GAC3B,GAAI0nC,IACFA,EAAQlvC,GACJowC,GACF,OAIJ5oC,EAAUA,EAAQjH,aAyBpB4F,KACF/G,SAASkL,iBAAiB,WAAY,KAEpChH,QAAQkD,IAAI,mBAAoB,CAAEqoC,qBAAoBC,2BAA0BC,6B,6BCpKpF,WAEe,KAACtmC,GAAU,KACxB,MAAO/F,EAAO8tC,GAAYhoC,YAASC,GAUnC,MAAO,CAAC/F,EARQiH,YAAY,KAC1B6mC,GAAS,IACR,IAEc7mC,YAAY,KAC3B6mC,GAAS,IACR,O,6BCXL,kBAKe,KACbC,GAAS,EACTC,EACAC,GAAmB,EACnBpU,EAA4B,OAC5BqU,GAAoB,KAEpB,MAAOC,EAAUC,GAAetoC,aAAUioC,GACpCM,EAAkBlnC,eAEjBmnC,EAAkBC,GAAuBzoC,YAASioC,GAAUE,GAE/DF,GACFK,GAAY,GACZG,GAAoB,GAEhBF,EAAgBvpC,UAClBhE,OAAOnC,aAAa0vC,EAAgBvpC,SACpCupC,EAAgBvpC,aAAU7F,KAG5BsvC,GAAoB,GAEfJ,GAAaE,EAAgBvpC,UAChCupC,EAAgBvpC,QAAUhE,OAAO5B,WAAW,KAC1CkvC,GAAY,GAERJ,GACFA,IAGFK,EAAgBvpC,aAAU7F,GACzBivC,EAAoB,EAlCN,OAsCrB,MAAMM,EAAYz8B,QAAQs8B,EAAgBvpC,SACpC2pC,EAAeV,GAAUS,EAS/B,MAAO,CACLC,eACAC,qBAV2B5R,YAC3BjD,GAAa,qBACbA,EACAyU,GAAoB,OACpBG,GAAgB,QAChBD,GAAa,c,6BChDjB,weAEA,MAAMG,EAAgB,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YACnFC,EAAc,CAClB,UAAW,WAAY,QAAS,QAAS,MAAO,OAChD,OAAQ,SAAU,YAAa,UAAW,WAAY,YAGlDC,EAAwBD,EAAY7rC,IAAK+rC,GAAUA,EAAMrwB,eAMxD,SAASswB,EAAYC,GAC1B,MAAMx1B,EAAO,IAAI0K,KAAK8qB,GAEtB,OADAx1B,EAAK6rB,SAAS,EAAG,EAAG,EAAG,GAChB7rB,EAGF,SAASy1B,EAAcD,GAC5B,OAAOD,EAAYC,GAAU9J,UAGxB,SAASgK,EAAYC,GAC1B,MAAM31B,EAAO,IAAI0K,KAAiB,IAAZirB,GACtB,MAAQ,GAAE31B,EAAK41B,iBAAiB51B,EAAK61B,aAGvC,SAASC,EAAY91B,GACnB,MAAQ,GAAEA,EAAK41B,iBAAiB51B,EAAK61B,WAAa,KAAK71B,EAAKisB,YAGvD,SAASH,EAAW0J,GACzB,MAAMx1B,EAA2B,iBAAbw1B,EAAwB,IAAI9qB,KAAK8qB,GAAYA,EAIjE,MAAQ,GAHM5rC,OAAOoW,EAAK+1B,YAAYC,SAAS,EAAG,QAClCpsC,OAAOoW,EAAKi2B,cAAcD,SAAS,EAAG,OAKjD,SAASE,EAAoBV,GAClC,MAAMx1B,EAA2B,iBAAbw1B,EAAwB,IAAI9qB,KAAK8qB,GAAYA,EAE3D5J,EAAQ2J,EAAY,IAAI7qB,MAC9B,GAAI1K,GAAQ4rB,EACV,OAAOE,EAAW9rB,GAGpB,MAAMm2B,EAAU,IAAIzrB,KAAKkhB,GAEzB,GADAuK,EAAQnK,QAAQJ,EAAMK,UAAY,GAC9BjsB,GAAQm2B,EACV,OAAOlb,YAAgB,gBAAeka,EAAcn1B,EAAKo2B,WAG3D,MAAMC,EAAWr2B,EAAK41B,gBAAkBhK,EAAMgK,cAM9C,OAAOU,EAAWt2B,EAJhBib,YAAeob,EAAW,yBAA2B,wBACjDA,EAAW,aAAe,UAM3B,SAASnK,EAAesJ,GAI7B,OAAOc,EAH0B,iBAAbd,EAAwB,IAAI9qB,KAAK8qB,GAAYA,EAClDva,YAAe,qBAAuB,cAKhD,SAASsb,EAAmBv2B,EAAYw2B,GAAU,GAGvD,OAAOF,EAAWt2B,EAFHib,YAAeub,EAAU,sBAAwB,uBAAyB,YAKpF,SAASC,EAAgBjB,EAAyBgB,GAAU,EAAOE,GAAa,GACrF,MAAM12B,EAA2B,iBAAbw1B,EAAwB,IAAI9qB,KAAK8qB,GAAYA,EAE3D5J,EAAQ2J,EAAY,IAAI7qB,MAE9B,IAAKgsB,EAAY,CACf,GAAIZ,EAAY91B,KAAU81B,EAAYlK,GACpC,OAAQ4K,EAAUG,EAAaC,GAAY3b,YAAe,kBAG5D,MAAM8Q,EAAY,IAAIrhB,KAAKkhB,GAE3B,GADAG,EAAUC,QAAQJ,EAAMK,UAAY,GAChC6J,EAAY91B,KAAU81B,EAAY/J,GACpC,OAAQyK,EAAUG,EAAaC,GAAY3b,YAAe,sBAG5D,MAAMkb,EAAU,IAAIzrB,KAAKkhB,GACnBiL,EAAY,IAAInsB,KAAKkhB,GAG3B,GAFAuK,EAAQnK,QAAQJ,EAAMK,UAAY,GAClC4K,EAAU7K,QAAQJ,EAAMK,UAAY,GAChCjsB,GAAQm2B,GAAWn2B,GAAQ62B,EAAW,CACxC,MAAMC,EAAU3B,EAAcn1B,EAAKo2B,UACnC,OAAOI,EACHG,EAAW1b,YAAgB,gBAAe6b,IAC1CF,EAAW3b,YAAgB,WAAU6b,KAI7C,MAAMT,EAAWr2B,EAAK41B,gBAAkBhK,EAAMgK,cACxCmB,EAAYP,EACbH,EAAW,yBAA2B,qBACtCA,EAAW,eAAiB,WAGjC,OAAQG,EAAUG,EAAaC,GAAYN,EAAWt2B,EAFvCib,YAAe8b,IAAc,gBAK9C,SAAST,EAAWt2B,EAAYkb,GAC9B,MAAM8b,EAAMh3B,EAAKisB,UACXgL,EAAaj3B,EAAK61B,WAExB,OAAO3a,EACJ9U,QAAQ,OAAQ6U,YAAema,EAAY6B,KAC3C7wB,QAAQ,OAAQ6U,YAAgB,YAAWma,EAAY6B,KACvD7wB,QAAQ,MAAO6U,YAAgB,cAAama,EAAY6B,KACxD7wB,QAAQ,KAAMxc,OAAOqtC,EAAa,GAAGjB,SAAS,EAAG,MACjD5vB,QAAQ,KAAMxc,OAAOotC,GAAKhB,SAAS,EAAG,MACtC5vB,QAAQ,IAAKxc,OAAOotC,IACpB5wB,QAAQ,OAAQxc,OAAOoW,EAAK41B,gBAG1B,SAASsB,EAAoB1B,GAClC,MAAMx1B,EAA2B,iBAAbw1B,EAAwB,IAAI9qB,KAAK8qB,GAAYA,EAEjE,MAAQ,GAAEiB,EAAgBz2B,GAAM,OAAU8rB,EAAW9rB,KAGhD,SAASm3B,EAAoBx1B,GAClC,MAAMy1B,EAAQzsC,KAAKghC,MAAMhqB,EAAW,MAC9B01B,EAAU1sC,KAAKghC,MAAOhqB,EAAW,KAAQ,IACzC21B,EAAU3sC,KAAKghC,MAAMhqB,EAAW,KAAO,IAE7C,IAAI41B,EAAS,GASb,OARIH,EAAQ,GACVG,GAAa3tC,OAAOwtC,GAAOpB,SAAS,EAAG,KAA5B,IACXuB,GAAa3tC,OAAOytC,GAASrB,SAAS,EAAG,KAA9B,KAEXuB,GAAa3tC,OAAOytC,GAAT,IAEbE,GAAU3tC,OAAO0tC,GAAStB,SAAS,EAAG,KAE/BuB,EAGF,SAASC,EAA0BC,GACxC,MAAMxkB,EAAQ,GAEd,IAAIykB,EAAeD,EAAe,IAClCA,GAAgBC,EAChBA,EAAe/sC,KAAKghC,MAAM+L,EAAe,IAGzC,MAAMJ,GADNG,EAAe9sC,KAAKghC,MAAM8L,EAAe,MACV,GAC/BA,GAAgBH,EAGhB,MAAMD,GADNI,EAAe9sC,KAAKghC,MAAM8L,EAAe,KACV,GAC/BA,GAAgBJ,EAGhB,MAAMD,GADNK,EAAe9sC,KAAKghC,MAAM8L,EAAe,KACZ,GAQ7B,OANIL,EAAQ,GACVnkB,EAAMnxB,KAAK8H,OAAOwtC,GAAOpB,SAAS,EAAG,MAEvC/iB,EAAMnxB,KAAK8H,OAAOytC,GAASrB,SAASoB,EAAQ,EAAI,EAAI,EAAG,MACvDnkB,EAAMnxB,KAAK8H,OAAO0tC,GAAStB,SAAS,EAAG,MAE/B,GAAE/iB,EAAM9kB,KAAK,QAAQvE,OAAO8tC,GAAc1B,SAAS,EAAG,OAGzD,SAAS2B,EAAmB33B,GACjC,OAAOA,EAAK43B,eACV,QACA,CACEC,KAAM,UACNvC,MAAO,QACP0B,IAAK,YAKX,SAASc,EAAYd,EAAa1B,EAAeuC,EAAO,MACtD,GAAIvC,EAASyC,IAA0Bf,EApLhB,GAqLrB,OAAO,EAET,MAAMh3B,EAAO,IAAI0K,KAAKmtB,EAAMvC,EAAO0B,GACnC,OAAQ1iC,OAAOC,MAAMyL,EAAK0rB,YAAc1rB,EAAKisB,YAAc+K,EAGtD,SAASgB,EAAgBzmB,EAAQ,IACtC,MAAM0mB,EAAkB1mB,EAAM5X,MAAM,yBAC9Bu+B,EAAwB3mB,EAAM5X,MAAM,yBACpCw+B,EAAkB5mB,EAAM5X,MAAM,sCACpC,IAAKs+B,IAAoBE,IAAoBD,EAC3C,OAGF,GAAIC,EAAiB,CACnB,MAAOn4B,EAAMs1B,EAAOuC,GAAQtmB,EAAMxY,MAAM,SAASxP,IAAI+K,QACrD,OAASujC,GAAQA,EAtMG,OAsMwBC,EAAY93B,EAAMs1B,EAAQ,EAAGuC,QAAQpyC,QAE7EA,EADC,GAAEoyC,EAAUA,EAAF,IAAY,KAAKjuC,OAAO0rC,GAAOU,SAAS,EAAG,QAAQpsC,OAAOoW,GAAMg2B,SAAS,EAAG,OAI7F,MAAMoC,EAAY7mB,EAAMxY,MAAM,KACxBiH,EAAOi4B,EAAkBG,EAAU,GAAKA,EAAU,GAClD9C,GAAS2C,EAAkBG,EAAU,GAAKA,EAAU,IAAInzB,cACxDgyB,EAAa5B,EAAsBgD,UAAWz/B,GAASA,EAAK8oB,WAAW4T,IAE7E,OAAuB,IAAhB2B,GAAqBa,EAAYxjC,OAAO0L,GAAOi3B,GACjD,GAAErtC,OAAOqtC,EAAa,GAAGjB,SAAS,EAAG,QAAQpsC,OAAOoW,GAAMg2B,SAAS,EAAG,YACvEvwC,EAGC,SAAS6yC,EAAiB3C,GAC/B,OAAOA,EAAY4C,MAGrB,SAAS5B,EAAW/V,GAClB,MAAQ,GAAEA,EAAI,GAAG3b,gBAAgB2b,EAAIp5B,MAAM,KAG7C,SAASovC,EAAWhW,GAClB,MAAQ,GAAEA,EAAI,GAAG4X,gBAAgB5X,EAAIp5B,MAAM,O,qvECjOtC,SAASixC,EACd12B,EACApe,EACA+0C,GAEA,MAAO,IACF32B,EACHK,MAAO,IACFL,EAAOK,MACV2B,QAAS,IACJhC,EAAOK,MAAM2B,QAChB,CAACpgB,GAAO+0C,KAMT,SAASC,EAAkB52B,EAAqBpe,EAA6Bi1C,GAClF,MAAQ,CAACj1C,GAAOogB,GAAYhC,EAAOK,MAAM2B,QACnC20B,EAAS30B,GAAWA,EAAQviB,OAC9Bo3C,EAAU5hC,OAAQlB,IAAQiO,EAAQI,SAASrO,IAC3C8iC,EAEJ,OAAI70B,IAAY20B,EAAOl3C,OACdugB,EAGF02B,EAAmB12B,EAAQpe,EAAM,IAClCogB,GAAW,MACZ20B,IAIA,SAASG,EAAa92B,EAAqB+2B,GAChD,MAAO,IACF/2B,EACHK,MAAO,IACFL,EAAOK,MACVF,KAAM42B,IAKL,SAASC,EACdh3B,EAAqBtI,EAAgBu/B,EAA8B9+B,GAEnE,MAAM,KAAEgI,GAASH,EAAOK,MAClBE,EAAOJ,EAAKzI,GACZw/B,EAAoBD,EAAWE,OAAS52B,IAASA,EAAK42B,MACtDC,EAAc,IACf72B,KACC22B,EAAoBniC,YAAKkiC,EAAY,CAAC,QAAS,eAAiBA,KAChE9+B,GAAS,CAAEk/B,OAAQ,CAACl/B,KAAWoI,EAAK82B,QAAU,MAGpD,OAAKD,EAAYrjC,IAAOqjC,EAAYx1C,KAI7Bk1C,EAAa92B,EAAQ,IACvBG,EACH,CAACzI,GAAS0/B,IALHp3B,EASJ,SAASs3B,EAAYt3B,EAAqBu3B,GAK/C,OAJA73C,OAAOgT,KAAK6kC,GAAaluC,QAAS0K,IAChCiM,EAASg3B,EAAWh3B,EAAQzN,OAAOwB,GAAKwjC,EAAYhlC,OAAOwB,OAGtDiM,EAIF,SAASw3B,EAASx3B,EAAqBy3B,GAC5C,MAAM,KAAEt3B,GAASH,EAAOK,MAOxB,OANA3gB,OAAOgT,KAAK+kC,GAAWjwC,IAAI+K,QAAQlJ,QAAS0K,MACrCoM,EAAKpM,IAAQoM,EAAKpM,GAAIojC,QAAUM,EAAU1jC,GAAIojC,SACjDn3B,EAASg3B,EAAWh3B,EAAQjM,EAAI0jC,EAAU1jC,OAIvCiM,EAGF,SAAS03B,EACd13B,EACAtI,EACA6K,GAEA,MAAMo1B,EAAWp1B,IAAavR,IAAqB,WAAa,SAEhE,IAAI4mC,EAAiB53B,EAAOK,MAAM2B,QA0BlC,OAzBCtiB,OAAOgT,KAAKklC,GAAuDvuC,QAASwuC,IAC3E,MAAMC,EAAoBF,EAAeC,IAAgB,GACrDA,IAAgBF,GAAaG,EAAkB11B,SAAS1K,GAKjDmgC,IAAgBF,GAAYG,EAAkB11B,SAAS1K,KAChEkgC,EAAiB,IACZA,EACH,CAACC,GAAcC,EAAkB7iC,OAAQlB,GAAOA,IAAO2D,KAPzDkgC,EAAiB,IACZA,EACH,CAACC,GAAc,IAAIC,EAAmBpgC,MAkB5CsI,EAASg3B,EARTh3B,EAAS,IACJA,EACHK,MAAO,IACFL,EAAOK,MACV2B,QAAS41B,IAIelgC,EAAQ,CAAE6K,SAAUA,QAAY7e,IAKvD,SAASq0C,EACd/3B,EACApe,EACAo2C,GAKA,MAAMC,EAAyB,WAATr2C,EAAoB,MAAQ,WAElD,MAAO,IACFoe,EACHK,MAAO,IACFL,EAAOK,SACN23B,EAAKp1B,kBAAoB,CAC3BA,iBAAkB,IACb5C,EAAOK,MAAMuC,iBAChB,CAAChhB,GAAOo2C,EAAKp1B,mBAGjBs1B,WAAY,IACPl4B,EAAOK,MAAM63B,WAChB,CAACD,GAAgBD,EAAKG,gBAExBC,cAAe,IACVp4B,EAAOK,MAAM+3B,cAChB,CAACx2C,IAAO,K,kBC7HT,SAASy2C,EACdr4B,EACAtI,EACAoI,EAAmBgC,iBACnBlgB,EAAwB,UAExB,MAAO,IACFoe,EACH3B,SAAU,IACL2B,EAAO3B,SAEVkG,aAAc7M,EAAS,CAAC,CAAEA,SAAQoI,WAAUle,cAAU8B,IAK5D,SAAS40C,EAAoBt4B,EAAqBtI,EAAgBq/B,GAChE,OAAOwB,EAAmBv4B,EAAQtI,EAAQ,CACxCyI,KAAM42B,IAoBV,SAASwB,EACPv4B,EAAqBtI,EAAgB2d,GAErC,MAAM9rB,EAAUyW,EAAO3B,SAASuD,SAASlK,IAAW,CAAEyI,KAAM,GAAI0B,YAAa,IAE7E,MAAO,IACF7B,EACH3B,SAAU,IACL2B,EAAO3B,SACVuD,SAAU,IACL5B,EAAO3B,SAASuD,SACnB,CAAClK,GAAS,IACLnO,KACA8rB,MAON,SAASmjB,EACdx4B,EAAqBtI,EAAgBoI,EAAkB24B,EAAchuC,GAErE,OAvCF,SACEuV,EAAqBtI,EAAgBoI,EAAkB44B,GAEvD,MAAMnvC,EAAUyW,EAAO3B,SAASuD,SAASlK,GAEzC,OAAO6gC,EAAmBv4B,EAAQtI,EAAQ,CACxCmK,YAAa,IACPtY,GAAWA,EAAQsY,YACvB,CAAC/B,GAAW,IACNvW,GAAWA,EAAQsY,YAAY/B,MAChC44B,MA6BFC,CAAa34B,EAAQtI,EAAQoI,EAAU,CAAE,CAAC24B,GAAYhuC,IAGxD,SAASmuC,EACd54B,EAAqB3B,GAErB,MAAMw6B,EAAgBx6B,EAAS/J,OAAO,CAACwkC,EAAkBt1C,KAClDs1C,EAAiBt1C,EAAQkU,UAC5BohC,EAAiBt1C,EAAQkU,QAAU,IAErCohC,EAAiBt1C,EAAQkU,QAAQlU,EAAQuQ,IAAMvQ,EAExCs1C,GACN,IAMH,OAJAp5C,OAAOgT,KAAKmmC,GAAerxC,IAAI+K,QAAQlJ,QAASqO,IAC9CsI,EAAS+4B,EAAoB/4B,EAAQtI,EAAQmhC,EAAcnhC,MAGtDsI,EAGF,SAAS+4B,EACd/4B,EAAqBtI,EAAgBq/B,GAErC,MAAM52B,EAAOsE,YAAmBzE,EAAQtI,GAExC,OAAIyI,GAAQzgB,OAAOgT,KAAKqkC,GAASngC,MAAOoiC,GAAUxiC,QAAQ2J,EAAK5N,OAAOymC,MAC7Dh5B,EAGFs4B,EAAoBt4B,EAAQtI,EAAQ,IACtCq/B,KACA52B,IAIA,SAAS84B,EACdj5B,EAAqBtI,EAAgBG,EAAmBqhC,GAExD,MAAM/4B,EAAOsE,YAAmBzE,EAAQtI,IAAW,GAE7CyhC,EAAiB,IADPh5B,EAAKtI,MAGhBqhC,GAGL,OAAKC,EAAeplC,GAIbukC,EAAoBt4B,EAAQtI,EAAQ,IACtCyI,EACH,CAACtI,GAAYshC,IALNn5B,EASJ,SAASo5B,EACdp5B,EAAqBtI,EAAgBG,EAAmBqhC,GAExD,MAAM/4B,EAAOuE,aAAwB1E,EAAQtI,IAAW,GAElDyhC,EAAiB,IADPh5B,EAAKtI,MAGhBqhC,GAGL,OAAKC,EAAeplC,GAIbslC,EAAyBr5B,EAAQtI,EAAQ,IAC3CyI,EACH,CAACtI,GAAYshC,QACZz1C,GANMsc,EASJ,SAASs5B,EACdt5B,EACAtI,EACA6H,GAEA,MAAMY,EAAOsE,YAAmBzE,EAAQtI,GACxC,IAAKyI,EACH,OAAOH,EAET,MAAM+2B,EAAUhiC,YAAKoL,EAAMZ,GACrBg6B,EAAwB75C,OAAO6M,OAAOuI,YAAWqL,EAAMZ,IAAatK,OACxE,EAAG4F,iBAAkBA,GAAeA,EAAY2+B,qBAkClD,GA/BkB95C,OAAOgT,KAAKsN,EAAO3B,SAASuD,SAASlK,GAAQmK,aAAara,IAAI+K,QACtElJ,QAASyW,IACjB,IAAIxB,EAAYwG,YAAgB9E,EAAQtI,EAAQoI,GAC5CoL,EAAcnG,aAAkB/E,EAAQtI,EAAQoI,GAChDyG,EAAcrB,aAAkBlF,EAAQtI,EAAQoI,GAChD6uB,EAAYxpB,aAAgBnF,EAAQtI,GAExC6H,EAAWlW,QAASwO,IACdyG,GAAaA,EAAU8D,SAASvK,KAClCyG,EAAYA,EAAUrJ,OAAQlB,GAAOA,IAAO8D,IAG1CqT,GAAeA,EAAY9I,SAASvK,KACtCqT,EAAcA,EAAYjW,OAAQlB,GAAOA,IAAO8D,IAG9C0O,GAAeA,EAAYnE,SAASvK,KACtC0O,EAAcA,EAAYtR,OAAQlB,GAAOA,IAAO8D,IAG9C82B,GAAaA,EAAUvsB,SAASvK,KAClC82B,EAAYA,EAAU15B,OAAQlB,GAAOA,IAAO8D,MAIhDmI,EAASw4B,EAAmBx4B,EAAQtI,EAAQoI,EAAU,YAAaxB,GACnE0B,EAASw4B,EAAmBx4B,EAAQtI,EAAQoI,EAAU,cAAeoL,GACrElL,EAASw4B,EAAmBx4B,EAAQtI,EAAQoI,EAAU,cAAeyG,GACrEvG,EAASw4B,EAAmBx4B,EAAQtI,EAAQoI,EAAU,YAAa6uB,KAGjE4K,EAAsB95C,OAAQ,CAChC,MAAM4mB,EAAqB/B,YAAyBtE,GAC9Cy5B,EAAyBpzB,GAAsBA,EAAmB3O,SAAWA,GAClD,WAA5B2O,EAAmBzkB,KAClB83C,EAAkBrzB,GAAsBA,EAAmBvG,SAEjEy5B,EAAsBlwC,QAAS7F,IAC7B,MAAM,WAAEokB,EAAF,cAAcoE,GAAkBxoB,EAAQqX,YACxC8+B,EAAelzB,YAAkBzG,EAAQ4H,EAAaoE,GAExDytB,GAA0BC,IAAoB1tB,IAChDhM,EAASq4B,EAAyBr4B,EAAQtI,IAExCiiC,IACF35B,EAASi5B,EAAkBj5B,EAAQ4H,EAAaoE,EAAgB,CAAElG,gBAAYpiB,OAOpF,OAFAsc,EAASs4B,EAAoBt4B,EAAQtI,EAAQq/B,GAKxC,SAAS6C,EACd55B,EACAtI,EACA6H,GAEA,MAAMY,EAAOuE,aAAwB1E,EAAQtI,GAC7C,IAAKyI,EACH,OAAOH,EAET,MAAM+2B,EAAUhiC,YAAKoL,EAAMZ,GAE3B,IAAIs6B,EAAez0B,aAAmBpF,EAAQtI,GAY9C,OAXImiC,IACFt6B,EAAWlW,QAASwO,IACdgiC,EAAcz3B,SAASvK,KACzBgiC,EAAeA,EAAc5kC,OAAQlB,GAAOA,IAAO8D,MAGvDmI,EAASw4B,EAAmBx4B,EAAQtI,EAAQoK,iBAAgB,eAAgB+3B,IAG9E75B,EAASq5B,EAAyBr5B,EAAQtI,EAAQq/B,OAASrzC,GAKtD,SAASo2C,EACd95B,EACAtI,EACAoI,EACA+2B,GAEA,MAAMv4B,EAAYwG,YAAgB9E,EAAQtI,EAAQoI,GAC5C62B,EAASr4B,GAAaA,EAAU7e,OAClCo3C,EAAU5hC,OAAQlB,IAAQuK,EAAU8D,SAASrO,IAC7C8iC,EAEJ,OAAIv4B,IAAcq4B,EAAOl3C,OAChBugB,EAGFw4B,EAAmBx4B,EAAQtI,EAAQoI,EAAU,YAAai6B,EAAgB,IAC3Ez7B,GAAa,MACdq4B,KAIA,SAASqD,EACdh6B,EACAtI,EACAoI,EACA+2B,GAEA,MAAM3rB,EAAcnG,aAAkB/E,EAAQtI,EAAQoI,GAChD62B,EAASzrB,GAAeA,EAAYzrB,OACtCo3C,EAAU5hC,OAAQlB,IAAQmX,EAAY9I,SAASrO,IAC/C8iC,EAEJ,OAAI3rB,IAAgByrB,EAAOl3C,OAClBugB,EAGFw4B,EAAmBx4B,EAAQtI,EAAQoI,EAAU,cAAei6B,EAAgB,IAC7E7uB,GAAe,MAChByrB,KAIP,SAASoD,EAAgBz7B,GACvB,OAAOA,EAAUlJ,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAG/B,SAAS2kC,EACdj6B,EACAtI,EACAoI,EACAk5B,GAEA,MAAMzyB,EAAcrB,aAAkBlF,EAAQtI,EAAQoI,IAAa,GACnE,GAAIyG,EAAYnE,SAAS42B,GACvB,OAAOh5B,EAYT,OAAOw4B,EAAmBx4B,EAAQtI,EAAQoI,EAAU,cATrCi6B,EAAgB,IAE3BxzB,EAAY9mB,OAASsO,IACjBwY,EACAA,EAAY9gB,OAAQqI,IAAqB,GAE/CkrC,KAMG,SAASkB,EACdl6B,EACAtI,EACAoI,EACAq6B,GAEA,MAAM5zB,EAAcrB,aAAkBlF,EAAQtI,EAAQoI,IAAa,GAEnE,OAAO04B,EACLx4B,EACAtI,EACAoI,EACA,cACArJ,YAAqB8P,EAAa4zB,GAAkB5zB,EAAc4zB,GAI/D,SAASC,EACdp6B,EAAqBtI,EAAgBoI,EAAkBuV,GAEvD,MAAMglB,EAAgB,IAChB10B,aAAiB3F,EAAQtI,EAAQoI,MAClCuV,GAGL,OAAKglB,EAAcv6B,SAIZ04B,EAAmBx4B,EAAQtI,EAAQoI,EAAU,aAAcu6B,GAHzDr6B,EAMJ,SAASs6B,EACdt6B,EAAqBtI,EAAgB6iC,GAMrC,OAJAA,EAAQlxC,QAASgsB,IACfrV,EAASo6B,EAAiBp6B,EAAQqV,EAAO3d,OAAS2d,EAAOvV,SAAWuV,KAG/DrV,EAGF,SAASq5B,EACdr5B,EAAqBtI,EAAgBq/B,EAAqCyD,GAE1E,OAMF,SACEx6B,EAAqBtI,EAAgB2d,GAErC,MAAM9rB,EAAUyW,EAAO2E,kBAAkB/C,SAASlK,IAAW,CAAEyI,KAAM,GAAIq6B,KAAM,GAE/E,MAAO,IACFx6B,EACH2E,kBAAmB,CACjB/C,SAAU,IACL5B,EAAO2E,kBAAkB/C,SAC5B,CAAClK,GAAS,IACLnO,KACA8rB,MAlBJolB,CAAwBz6B,EAAQtI,EAAQ,CAC7CyI,KAAM42B,EACNyD,SAuBG,SAASE,EACd16B,EAAqBtI,EAAiBG,EAAoB8iC,GAAc,GAExE,MAAO,IACF36B,EACHkH,eAAgB,IACXlH,EAAOkH,eACVxP,SACAG,YACA8iC,gBAKC,SAASC,EACd56B,EAAqB66B,GAErB,MAAO,IACF76B,EACHkH,eAAgB,IACXlH,EAAOkH,eACV2zB,cAKC,SAASC,EACd96B,EACAtI,EACAG,GAGA,MAAO,IACFmI,EACHuK,iBAAkB,CAChB7S,SACA6H,WALe1H,EAAYtC,MAAM5V,UAAUyW,OAAO,GAAIyB,GAAa,KAUlE,SAASkjC,EACd/6B,EACAtI,EACAoI,EACAmF,EACApN,EACAe,EACAoiC,EACAC,GAAY,GAEZ,MAAQ1wB,iBAAkB2wB,GAAwBl7B,EAC9CpH,IACFoiC,EAAkB/uB,YAA0BjM,EAAQtI,EAAQkB,IAE9D,MAAM0R,EAAqB0wB,GAAmB,CAACnjC,GAC/C,IAAKqjC,EACH,OAAOJ,EAAuB96B,EAAQtI,EAAQ4S,GAGhD,MAAM,WAAE/K,GAAe27B,EAEvB,IAAIC,EACJ,MAAMC,EAAwB9wB,EAAmBrV,OAAQlB,IAAQwL,EAAW6C,SAASrO,IACrF,GAAIqnC,IAA0BA,EAAsB37C,OAClD07C,EAAgB57B,EAAWtK,OAAQlB,IAAQuW,EAAmBlI,SAASrO,SAClE,GAAIknC,GAAa17B,EAAW9f,OAAQ,CACzC,MAAM8mB,EAAcvB,YAAwBhF,EAAQtI,EAAQoI,EAAUmF,GAChEo2B,EAAY90B,EAAY5S,QAAQ4L,EAAWA,EAAW9f,OAAS,IAC/D67C,EAAe/0B,EAAY5S,QAAQkE,GACnCvB,EAAO1N,KAAKmiB,IAAIswB,EAAWC,GAC3BC,EAAK3yC,KAAK2jC,IAAI8O,EAAWC,GACzB71C,EAAQ8gB,EAAY9gB,MAAM6Q,EAAMilC,EAAK,GAC3CJ,EAAgB9kC,YAAO,IAAIkJ,KAAe9Z,SAE1C01C,EAAgB,IAAI57B,KAAe67B,GAGrC,OAAKD,EAAc17C,OAIZ,IACFugB,EACHuK,iBAAkB,IACb2wB,EACH37B,WAAY47B,IAPPK,EAAsBx7B,GAY1B,SAASw7B,EAAsBx7B,GACpC,MAAO,IACFA,EACHuK,sBAAkB7mB,GCzef,SAAS+3C,EACdz7B,EACA07B,EACAlB,EACAmB,EACAC,GAEA,MAAMC,EAAcF,EAAKn0C,IAAKs0C,IAC5B,MAAMvK,EAAWvxB,EAAOwD,SAASK,SAASi4B,EAAW/nC,IACrD,OAAKw9B,EAIE,IACFA,KACAuK,GALIA,IASX,MAAO,IACF97B,EACHwD,SAAU,IACLxD,EAAOwD,SACVK,SAAU,IACL7D,EAAOwD,SAASK,YAChBzP,YAAqBynC,EAAa,OAEvC,CAACH,GAAW,IACP17B,EAAOwD,SAASk4B,GACnBlB,UAEe,WAAbkB,EACI,CAAEE,aACF,CAAEG,OAAQJ,EAAKn0C,IAAI,EAAGuM,QAASA,OAOtC,SAASioC,EACdh8B,EAAqBi8B,EAAsB5mB,GAE3C,MAAM6mB,EAAoBl8B,EAAOwD,SAASK,SAASo4B,IAAiB,GAEpE,MAAO,IACFj8B,EACHwD,SAAU,IACLxD,EAAOwD,SACVK,SAAU,IACL7D,EAAOwD,SAASK,SACnB,CAACo4B,GAAe,IACXC,KACA7mB,MAON,SAAS8mB,EACdn8B,EAAqBo8B,EAAgBC,EAAqBC,GAE1D,MAAQD,QAASE,GAAmBv8B,EAAO2D,KAAKF,OAEhD,IAAI+4B,EACJ,GAAIJ,IAAUG,EACZC,EAAaH,MACR,CACL,MAAMI,EAAa,IAAI/uC,IAAI6uC,EAAe/0C,IAAKk1C,GAAQA,EAAI3oC,KAC3DyoC,EAAa,IACRD,KACAF,EAAQpnC,OAAQynC,IAASD,EAAWvnC,IAAIwnC,EAAI3oC,MAInD,MAAO,IACFiM,EACH2D,KAAM,IACD3D,EAAO2D,KACVF,OAAQ,IACHzD,EAAO2D,KAAKF,OACfpJ,OAAQiiC,EACRD,QAASG,KAMV,SAASG,EAAsB38B,EAAqB87B,GACzD,MAAO,IACF97B,EACHmE,eAAgB23B,GAIb,SAASc,EACd58B,EAAqBlH,EAAe+jC,EAA+BrC,GAEnE,MACMsC,EAAc,IADEh5B,aAAuB9D,EAAQlH,MACV+jC,GAAkB,IACvDE,EAAY1mC,YAAOymC,EAAYt1C,IAAI,EAAGuM,QAASA,IAC/CoM,EAAO/L,YAAqB0oC,EAAa,MACzCt5B,EAAWu5B,EAAUv1C,IAAKuM,GAAOoM,EAAKpM,IAE5C,MAAO,IACFiM,EACHwD,SAAU,IACLxD,EAAOwD,SACVw5B,SAAU,CACRlkC,QACA0K,WACAg3B,UAMD,SAASyC,EAAwBj9B,GACtC,MAAM,MAAElH,EAAF,SAAS0K,EAAT,KAAmBg3B,GAASx6B,EAAOwD,SAASw5B,UAAY,GAC9D,OAAKlkC,EAIE8jC,EAAuB58B,EAAQlH,EAAO0K,EAAUg3B,GAH9Cx6B,E,YCxHJ,SAASk9B,EAAal9B,EAAqB+2B,GAChD,MAAO,IACF/2B,EACHE,MAAO,IACFF,EAAOE,MACVC,KAAM42B,IAIL,SAASoG,EAAWn9B,EAAqBC,EAAgBm9B,GAC9D,MAAM,KAAEj9B,GAASH,EAAOE,OAClB,KAAEs6B,EAAMrtB,QAASkwB,GAAmBr9B,EAAOkN,aAAe,GAC1DtM,EAAOT,EAAKF,GACZi3B,EAAoBkG,EAAWjG,OAASv2B,IAASA,EAAKu2B,MACtDmG,EAAc,IACf18B,KACCs2B,EAAoBniC,YAAKqoC,EAAY,CAAC,QAAS,eAAiBA,GAGtE,OAAKE,EAAYvpC,IAAOupC,EAAY17C,MAIhC07C,EAAY9P,WAAc6P,IAAmBA,EAAej7B,SAASnC,KACvED,EAAS,IACJA,EACHkN,YAAa,CACXstB,KAAMA,GAAQ,EACdrtB,QAAS,CAAClN,KAAWo9B,MAKpBH,EAAal9B,EAAQ,IACvBG,EACH,CAACF,GAASq9B,KAfHt9B,EAmBJ,SAASu9B,EAAYv9B,EAAqBu3B,GAK/C,OAJA73C,OAAOgT,KAAK6kC,GAAa/vC,IAAI+K,QAAQlJ,QAAS0K,IAC5CiM,EAASm9B,EAAWn9B,EAAQjM,EAAIwjC,EAAYxjC,MAGvCiM,EAIF,SAASw9B,EAASx9B,EAAqBy3B,GAC5C,MAAM,KAAEt3B,GAASH,EAAOE,MAOxB,OANAxgB,OAAOgT,KAAK+kC,GAAWjwC,IAAI+K,QAAQlJ,QAAS0K,MACrCoM,EAAKpM,IAAQoM,EAAKpM,GAAIojC,QAAUM,EAAU1jC,GAAIojC,SACjDn3B,EAASm9B,EAAWn9B,EAAQjM,EAAI0jC,EAAU1jC,OAIvCiM,EAGF,SAASy9B,EAAqBz9B,EAAqBoO,GACxD,OAAIpO,EAAOE,MAAMkO,aAAeA,EACvBpO,EAGF,IACFA,EACHE,MAAO,IACFF,EAAOE,MACVkO,eAKC,SAASsvB,EAAW19B,EAAqBC,GAC9C,MAAM,KAAEE,GAASH,EAAOE,OAClB,KAAEs6B,EAAF,QAAQrtB,GAAYnN,EAAOkN,aAAe,GAWhD,cAVO/M,EAAKF,GAULi9B,EARPl9B,EAAS,IACJA,EACHkN,YAAa,CACXstB,KAAMA,GAAQ,EACdrtB,QAASA,EAAUA,EAAQlY,OAAQlB,GAAOA,IAAOkM,GAAU09B,MAInCx9B,GCvF9B,MAAMy9B,EAAiBp6C,GAAyB,GAAEA,EAAQkU,UAAUlU,EAAQuQ,KAErE,SAAS8pC,EACd79B,EACA89B,GAEA,MAAO,IACF99B,EACHwQ,aAAc,IACTxQ,EAAOwQ,gBACPstB,IAKF,SAASC,EACd/9B,EACAg+B,GAEA,OAAOH,EAAmB79B,EAAQ,CAAEg+B,mBAG/B,SAASC,GACdj+B,EACAk+B,EACAhG,EACAt2C,EACAu8C,GAEA,MAAM,cAAEC,GAAkBp+B,EAAOwQ,cAAgB,GAC3C6tB,EAAuBH,EAAiB5pC,OAAO,CAACO,EAAQrR,KAC5DqR,EAAO+oC,EAAcp6C,IAAYA,EAE1BqR,GACN,IACGypC,EAAkBF,GAAiBA,EAAcx8C,GAAQw8C,EAAcx8C,GAAO28C,cAAW76C,EAE/F,QAAwBA,IAApB46C,GACC5+C,OAAOgT,KAAK2rC,GAAsBznC,MAClCoiC,GAAUsF,EAAgBl8B,SAASw7B,EAAcS,EAAqBrF,MAGzE,OAAOwF,GAAiCx+B,EAAQ,CAAE3B,UAAU,IAG9D,MAAMogC,EAAeH,GAAmB,GAClCI,EAAcR,EAAiB12C,IAAKhE,GAAYo6C,EAAcp6C,IAC9D+6C,EAAWhpC,MAAM5V,UAAUyW,OAAOqoC,EAAcC,GAChDC,EAAsBloC,YAAqBgoC,EAAcF,GAAYE,EAAeF,EAI1F,OAAOV,EAFP79B,EAASw+B,GAAiCx+B,EAAQ,CAAE3B,UAAU,IAE5B,CAChC+/B,cAAe,KACTp+B,EAAOwQ,cAAgB,IAAI4tB,cAC/B,CAACx8C,GAAO,CACNs2C,aACA0G,aAAcT,EACdI,SAAUI,MAMX,SAASH,GACdx+B,EAAqB6+B,GAErB,OAAOhB,EAAmB79B,EAAQ,CAChC8+B,eAAgB,IACX9+B,EAAOwQ,aAAasuB,kBACpBD,K,YCjDT,SAASE,GACP/+B,EACA4N,EACAoxB,GAEA,MAAO,IACFh/B,EACH8N,gBAAiB,CACfC,gBAAiB,IACZ/N,EAAO8N,gBAAgBC,gBAC1B,CAACH,GAAgBoxB,KAMlB,SAASC,GACdj/B,EACAtI,EACAoI,EACAkO,EACAwB,GAEA,MAAM5B,EAAgB/N,aAAmBnI,EAAQoI,GAEjD,OAAOi/B,GAAuB/+B,EAAQ4N,EAAe,IAChD5N,EAAO8N,gBAAgBC,gBAAgBH,GAC1CI,WACAwB,UAIG,SAAS0vB,GACdl/B,EACAtI,EACAoI,EACAy+B,EACArG,EACA0G,GAEA,MAAMhxB,EAAgB/N,aAAmBnI,EAAQoI,GAEjD,OAAOi/B,GAAuB/+B,EAAQ4N,EAAe,IAChD5N,EAAO8N,gBAAgBC,gBAAgBH,GAC1CyuB,QAAS,CACPkC,WACArG,aACA0G,kBAKC,SAASO,GACdn/B,EACAtI,EACAoI,EACA4+B,EACAxG,EACA0G,GAEA,MAAMhxB,EAAgB/N,aAAmBnI,EAAQoI,IAC3C,QAAEu8B,GAAYr8B,EAAO8N,gBAAgBC,gBAAgBH,IAAkB,GACvE6wB,EAAgBpC,GAAWA,EAAQkC,UAAa,GAChDA,EAAWa,GAAc/oC,YAAOd,MAAM5V,UAAUyW,OAAOqoC,EAAcC,KAG3E,OAAOQ,GAA8Bl/B,EAAQtI,EAAQoI,EAFzBrJ,YAAqBgoC,EAAcF,GAAYE,EAAeF,EAENrG,EAAY0G,GAGlG,SAASS,GACPr/B,EACAtI,EACAsnC,GAEA,MAAO,IACFh/B,EACHkO,iBAAkB,CAChBtM,SAAU,IACL5B,EAAOkO,iBAAiBtM,SAC3B,CAAClK,GAASsnC,KAMX,SAASM,GACdt/B,EACAtI,EACA6nC,GAEA,OAAOF,GAAwBr/B,EAAQtI,EAAQ,IAC1CsI,EAAOkO,iBAAiBtM,SAASlK,GACpC6nC,gBAyBG,SAASC,GACdx/B,EACAtI,EACA9V,EACA88C,EACAxG,EACA0G,GAEA,MAAM,cAAER,GAAkBp+B,EAAOkO,iBAAiBtM,SAASlK,IAAW,GAChE+mC,EAAeL,GAAiBA,EAAcx8C,GAAQw8C,EAAcx8C,GAAO28C,SAAW,GACtFA,EAAWa,GAAc/oC,YAAOd,MAAM5V,UAAUyW,OAAOqoC,EAAcC,KAG3E,OAlCK,SACL1+B,EACAtI,EACA9V,EACA28C,EACArG,EACA0G,GAEA,OAAOS,GAAwBr/B,EAAQtI,EAAQ,IAC1CsI,EAAOkO,iBAAiBtM,SAASlK,GACpC0mC,cAAe,KACTp+B,EAAOkO,iBAAiBtM,SAASlK,IAAW,IAAI0mC,cACpD,CAACx8C,GAAO,CACN28C,WACArG,aACA0G,mBAmBCa,CAA+Bz/B,EAAQtI,EAAQ9V,EAF1B6U,YAAqBgoC,EAAcF,GAAYE,EAAeF,EAETrG,EAAY0G,GAG/F,SAASQ,GAAc9gC,GACrB,OAAOA,EAAUlJ,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GCvJ/B,SAASoqC,GAAyB1/B,EAAqBd,GAC5D,MAAO,IACFc,EACHwO,WAAY,IACPxO,EAAOwO,WACVtP,aAKC,SAASygC,GAAiB3/B,EAAqBtI,EAAgB2d,GACpE,MAAO,IACFrV,EACHwO,WAAY,IACPxO,EAAOwO,WACV5M,SAAU,IACL5B,EAAOwO,WAAW5M,SACrB,CAAClK,GAAS,IACJsI,EAAOwO,WAAW5M,SAASlK,IAAW,MACvC2d,MCzBN,SAASiR,GAAgBtmB,EAAqB4/B,GACnD,MAAO,IACF5/B,EACH+M,SAAU,IACL/M,EAAO+M,SACVxY,MAAO,IACFyL,EAAO+M,SAASxY,SAChBqrC,KAMJ,SAASC,GACd7/B,EAAqB8/B,EAA6CC,EAAoBC,GAEtF,OAAQF,GACN,IAAK,UACH,OAAOxZ,GAAgBtmB,EAAQ,SACL,IAAb+/B,GAA4B,CAAE9Y,8BAA+B8Y,WAC1C,IAAnBC,GAAkC,CAAEC,8BAA+BD,KAElF,IAAK,QACH,OAAO1Z,GAAgBtmB,EAAQ,SACL,IAAb+/B,GAA4B,CAAE7Y,uBAAwB6Y,WACnC,IAAnBC,GAAkC,CAAEE,uBAAwBF,KAE3E,IAAK,YACH,OAAO1Z,GAAgBtmB,EAAQ,SACL,IAAb+/B,GAA4B,CAAE5Y,2BAA4B4Y,WACvC,IAAnBC,GAAkC,CAAEG,2BAA4BH,KAG/E,QACE,QAIC,SAASI,GAAkBpgC,EAAqBqgC,GACrD,MAAO,IACFrgC,EACHsgC,QAAS,IACJtgC,EAAOsgC,QACV9hC,IAAK,CAAC6hC,KAAcrgC,EAAOsgC,QAAQ9hC,KACnC05B,WAAYl4B,EAAOsgC,QAAQpI,WAAa,IAKvC,SAASqI,GAAqBvgC,EAAqBqgC,GACxD,MAAO,IACFrgC,EACHsgC,QAAS,IACJtgC,EAAOsgC,QACV9hC,IAAKwB,EAAOsgC,QAAQ9hC,IAAIvJ,OAAQlB,GAAOA,IAAOssC,GAC9CnI,WAAYl4B,EAAOsgC,QAAQpI,WAAa,ICxDvC,SAASsI,GACdxgC,EACAqV,GAEA,MAAO,IACFrV,EACHygC,cAAe,IACVzgC,EAAOygC,iBACPprB,ICNF,SAASqrB,GACd1gC,EACA2gC,GAEA,MAAO,IACF3gC,EACH0Q,QAAS,IACJ1Q,EAAO0Q,QACViwB,oBAKC,SAASC,GAAiB5gC,EAAqBjM,GACpD,MAAO,IACFiM,EACH0Q,QAAS,IACJ1Q,EAAO0Q,QACVE,OAAQ7c,IAKP,SAAS8sC,GAAe7gC,EAAqB8gC,GAClD,MAAO,IACF9gC,EACH0Q,QAAS,IACJ1Q,EAAO0Q,QACVowB,SAKC,SAASC,GAAsB/gC,EAAqBxc,GACzD,IAAKA,EAAQmV,UAAYnV,EAAQmV,QAAQD,QACvC,OAAOsH,EAET,MAAM,MACJhH,EADI,KAEJd,EAFI,YAGJw2B,EAHI,SAIJsS,GACEx9C,EAAQmV,QAAQD,QACpB,MAAO,IACFsH,EACH0Q,QAAS,IACJ1Q,EAAO0Q,QACVuwB,eAAgB,CACdjoC,QACAd,OACAw2B,cACAsS,cAMD,SAASE,GAAkBlhC,EAAqBmhC,GACrD,MAAO,IACFnhC,EACH0Q,QAAS,IACJ1Q,EAAO0Q,QACVO,kBAAmB,IACdkwB,KAMJ,SAASC,GAAephC,EAAqBqhC,GAClD,MAAO,IACFrhC,EACH0Q,QAAS,IACJ1Q,EAAO0Q,WACP2wB,IAKF,SAASC,GACdthC,EACAuhC,EACA/9C,GAEA,IAAK+9C,IAAY/9C,EACf,MAAO,IACFwc,EACH0Q,QAAS,IACJ1Q,EAAO0Q,QACV6wB,aAAS79C,IAKf,MAAQgV,QAAS8oC,GAAmBh+C,EAAQmV,SACtC,SAAEqoC,EAAF,KAAY9oC,EAAZ,MAAkBc,GAAWwoC,GAAkB,GAErD,MAAO,IACFxhC,EACH0Q,QAAS,IACJ1Q,EAAO0Q,QACV6wB,QAAS,IACJA,EACHP,WACA9oC,OACAc,WAMD,SAASyoC,GAAazhC,GAC3B,MAAO,IACFA,EACH0Q,QAAS,IAIN,SAASgxB,GAAa1hC,GAC3B,MAAO,IACFA,EACH0Q,QAAS,IACJ1Q,EAAO0Q,QACVixB,oBAAoB,M,6BC/H1B,WAEe,SACb,MAAO,CAAEC,GAAcr3C,aAAkB,GAEzC,OAAOmB,YAAY,KACjBk2C,EAAYC,IAAaA,IACxB,M,6BCPL,kCAEe,SAASC,EAAS5pC,EAA0BzY,EAF3B,IAG9B,OAAKyY,GAAQA,EAAKzY,QAAUA,EACnByY,EAGCA,EAAKgjB,OAAO,EAAGz7B,GAAjB,Q,y/CCPV,wBA2GesiD,IAvFiBt7C,IAC9B,MAAM,KACJ+hC,EADI,UAEJlK,EAFI,SAGJ53B,EAHI,QAIJo+B,EAJI,KAKJ/jC,EALI,SAMJivC,EANI,SAOJC,EAPI,YAQJ+R,EARI,UASJjS,GACEtpC,EAEEs+B,EAAcr5B,YAAahL,IAC/B,GAAIuvC,IAAanL,EAIf,OAHApkC,EAAE0xC,uBACF1xC,EAAEihC,iBAKJmD,EAAQpkC,IACP,CAACuvC,EAAUnL,IAERmd,EAAgBv2C,YAAahL,IACjC,GAAkB,KAAdA,EAAEwhD,SAAgC,KAAdxhD,EAAEwhD,QAI1B,OAAIjS,IAAanL,GACfpkC,EAAE0xC,uBACF1xC,EAAEihC,uBAKJmD,EAAQpkC,IACP,CAACuvC,EAAUnL,IAER0L,EAAgBjP,YACpB,WACAjD,EACA2R,GAAY,WACZ+R,GAAe,eAGXrpC,EACJ,oCACG6vB,GACC,uBAAGlK,UAAY,QAAOkK,IAEvB9hC,GAIL,OAAI3F,EAEA,uBACEqvC,SAAU,EACV9R,UAAWkS,EACXzvC,KAAMA,EACNivC,SAAUA,EACVU,aAAYX,EACZ/2B,MAAO+2B,EACP9tC,OAAO,SACPT,IAAI,uBAEHmX,GAML,yBACEwpC,KAAK,SACL/R,SAAU,EACV9R,UAAWkS,EACX1L,QAASC,EACTqd,UAAWH,EACXvR,aAAYX,EACZ/2B,MAAO+2B,GAENp3B,K,6BCtGP,wBA4De9M,gBA7CU,KACvB,MAAOw2C,EAASC,GAAc/3C,YAAmB,IAE3Cg4C,EAAmB/2C,YAAQ,IACxB4nB,YAAS,KACdkvB,EAAW,KAPa,KAQA,GACzB,IAEG7R,EAAkB/kC,YAAahL,IACnC,GAAiB,IAAbA,EAAE8hD,OACJ,OAGF,MAAM1wC,EAAYpR,EAAE+hD,cACdC,EAAW5wC,EAAU6wC,wBAErBC,EAAa9wC,EAAU+wC,YAAc,EAE3CP,EAAW,IACND,EACH,CACES,EAAGpiD,EAAEqiD,QAAUL,EAASI,EAAKF,EAAa,EAC1CI,EAAGtiD,EAAEuiD,QAAUP,EAASM,EAAKJ,EAAa,EAC1CrlC,KAAMqlC,KAIVhuB,sBAAsB,KACpB2tB,OAED,CAACF,EAASE,IAEb,OACE,yBAAKjkB,UAAU,mBAAmBiR,YAAakB,GAC5C4R,EAAQ76C,IAAI,EAAGs7C,IAAGE,IAAGzlC,UACpB,0BAEEgV,MAAQ,SAAQuwB,aAAaE,eAAezlC,gBAAmBA,c,6BCrDzE,iJAaA,IAAIggB,EACAxI,EAEG,MAAMmuB,EAAuB,qHAG7BhrB,eAAeirB,EAAUhpC,EAAa8gB,GAG3C,IAFAmoB,KAEQruB,EAAOsuB,iBACP9uB,YAZ4B,KAepC,MAAM,OAAE1f,EAAF,MAAUkK,EAAV,OAAiBC,SAuEzB,SAA0B7E,EAAa8gB,GACrC,OAAO,IAAIr6B,QAASC,IAClBk0B,EAAOuuB,SAAWvuB,EAAOuuB,UAAY,IAAIxwC,IACzCiiB,EAAOuuB,SAASnvC,IAAIgG,EAAKtZ,GACzBk0B,EAAOiB,YAAY,CAAEjiB,GAAIoG,EAAK8gB,WA3EQsoB,CAAiBppC,EAAK8gB,GAC9D,GAAKlc,GAAUC,EAIf,OA2BF,UAAmB,OAAEnK,EAAF,MAAUkK,EAAV,OAAiBC,IAC7Bue,IACHA,EAASp8B,SAASQ,cAAc,WAGlC,OAAO,IAAIf,QAASC,IAClB,MAAMm8B,EAAM,IAAIwmB,UAAU3uC,EAAQkK,EAAOC,GAEzCue,EAAOxe,MAAQA,EACfwe,EAAOve,OAASA,EACJue,EAAOG,WAAW,MAC1B+lB,aAAazmB,EAAK,EAAG,GAEzBO,EAAOmmB,OAAQzoB,IACbp6B,EAAQo6B,eAAQv3B,IACf,YAAa,KA1CXigD,CAAU,CAAE9uC,SAAQkK,QAAOC,WAG7BkZ,eAAe0rB,EAAgB7+C,EAAaoV,GACjD,GAAI4Y,eAA2C,oBAAtB5Y,EAAI+gB,OAAO,EAAG,IACrC,OAAO/gB,EAGTipC,IAEA,MAAMS,QAAgBV,EAAUp+C,EAAKk3B,YAAc9hB,IAEnD,IAAK0pC,EACH,MAAM,IAAIzhD,MAAO,mCAAkC+X,GAGrD,OAAOsiB,YAAconB,GAGvB,SAAST,IACFruB,IACHA,EAAS,IAAI+uB,IACb/uB,EAAOsuB,WAAY,EACnBtuB,EAAOgvB,UAAYC,GAuBvB,SAASA,EAAqBtjD,GAC5B,MAAM,GAAEqT,GAAOrT,EAAExB,KACjB,OAAQwB,EAAExB,KAAK0C,MACb,IAAK,cACHmzB,EAAOsuB,WAAY,EACnB,MAGF,IAAK,SACH,GAAItuB,EAAOuuB,SAASpuC,IAAInB,GAAK,CAC3B,MAAMlT,EAAUk0B,EAAOuuB,SAASj/C,IAAI0P,GAEpCghB,EAAOuuB,SAASpvC,OAAOH,GACvBlT,EAAQH,EAAExB,U,6BC1FlB,WAee+kD,IAVf,SAAoCC,EAASC,GAC3C,MAAM9U,EAAMzjC,eACN,QAAErC,GAAY8lC,EAKpB,OAJK8U,QAAgCzgD,IAATwgD,IAC1B7U,EAAI9lC,QAAU26C,GAGT36C,I,6BCXT,kBAmFesC,gBA1DiB,EAC9BwjC,MACAt7B,KACAuqB,YACA75B,QACA2/C,QACAjhD,QACAkhD,UACApU,WACAqU,WACAC,cACAC,eACAC,YACAC,YACAC,WACAC,UACAC,aACAzC,YACA0C,aAEA,MAAMC,EAAY5hD,GAASkhD,GAAWD,EAChC5T,EAAgBjP,YACpB,cACA98B,GAAS,UACTtB,EAAQ,QAAUkhD,GAAW,UAC7BpU,GAAY,WACZqU,GAAY,WACZS,GAAa,aACbzmB,GAGF,OACE,yBAAKA,UAAWkS,GACd,2BACEnB,IAAKA,EACL/Q,UAAU,eACV18B,KAAK,OACLmS,GAAIA,EACJtP,MAAOA,GAAS,GAChB8/C,YAAaA,EACbG,UAAWA,EACXF,aAAcA,EACdC,UAAWA,EACXxU,SAAUA,EACVqU,SAAUA,EACVK,SAAUA,EACVC,QAASA,EACTC,WAAYA,EACZzC,UAAWA,EACX0C,OAAQA,IAETC,GACC,2BAAOC,QAASjxC,GAAKgxC,O,6BC7E7B,gCA4Eel5C,gBApDgB,EAC7BkI,KACAtQ,OACAgB,QACA2/C,QACAa,WACAC,UACAjV,WACApnC,QACAs8C,WACArV,YACA6U,WACAS,cAEA,MAAMC,EAAe35C,YAAa3J,IAC5B4iD,GACFA,EAAS5iD,GAGPqjD,GACFA,EAAQrjD,EAAM0gD,cAAcyC,UAE7B,CAACP,EAAUS,IAER9mB,EAAYiD,YAChB,WACA0O,GAAY,WACZpnC,GAAS,QACTinC,GAAa,UACbqV,GAAY,YAGd,OACE,2BAAO7mB,UAAWA,GAChB,2BACE18B,KAAK,WACLmS,GAAIA,EACJtQ,KAAMA,EACNgB,MAAOA,EACPygD,QAASA,EACTjV,SAAUA,EACV0U,SAAUU,IAEZ,yBAAK/mB,UAAU,iBACb,0BAAMA,UAAU,SAAS8lB,GACxBa,GAAY,0BAAM3mB,UAAU,YAAY2mB,IAE1CnV,GAAa,kBAAC,IAAD,U,6BCxEpB,8CAIe,SAASwV,EAAsBrU,GAC5C,OAAOsU,YAAwB,CAAEC,MAAOvU,M,6BCL1C,6CAKA,IAAIluC,EACA0iD,GAAc,EAEX,MAAMC,EAA+B9lC,IAC1Cze,SAASwkD,cAAc,IAAIC,MAPC,mCAQ5BH,GAAc,EAEV1iD,IACFK,aAAaL,GACbA,OAAUW,GAGZX,EAAUwC,OAAO5B,WAAW,KAC1B8hD,GAAc,EACdtkD,SAASwkD,cAAc,IAAIC,MAhBH,iCAiBxB7iD,OAAUW,GACTkc,IAGU,KACbimC,EACAC,KAEA16C,YAAU,KACJq6C,GACFI,IAGF1kD,SAASkL,iBA/BiB,iCA+BuBw5C,GACjD1kD,SAASkL,iBA/Be,+BA+BuBy5C,GAExC,KACL3kD,SAASywC,oBAlCa,+BAkC4BkU,GAClD3kD,SAASywC,oBApCe,iCAoC4BiU,KAErD,CAACC,EAAoBD,M,6BCxCnB,SAASlsB,EAAcl1B,GAC5B,OAAOoD,OAAOpD,GAAO4f,QAAQ,mBAAoB,OAGnD,SAAS0hC,EAAkBC,GAEzB,MAAyB,OADXn+C,OAAOm+C,EAAOC,QAAQ,IAC1B/qB,QAAQ,GACTtyB,KAAKC,MAAMm9C,GAGbA,EAAOC,QAAQ,GAAG5hC,QAAQ,IAAK,KAGjC,SAAS6hC,EAAqBC,GACnC,OAAIA,EAAQ,IACHA,EAGLA,EAAQ,IACAJ,EAAkBI,EAAQ,KAA5B,IAGAJ,EAAkBI,EAAQ,KAA5B,IAGH,SAASC,EAAgBC,EAAgBlnB,EAAQ,GACtD,OAAOknB,EACJhiC,QAAQ,yCAA0C,IAClDoV,OACAziB,MAAM,OACNvR,MAAM,EAAG05B,GACT33B,IAAK8+C,GAAiBA,EAAK7mD,QAAU6mD,EAAK1uC,MAAM,MAAO,GAAG6+B,eAC1DrqC,KAAK,IAhCV,uG,6BCAA,kCAAO,MAAMuxC,EAAmB,I,6BCAhC,wCAAM4I,EAAgB,aAEP,SAASC,EAAYC,EAAkBC,GACpD,IAAKD,IAAaC,EAChB,OAAO,EAGT,MAAMC,EAAgBF,EAASvjC,cAAclM,MAAMuvC,GAGnD,OAFoBG,EAAOxjC,cAAclM,MAAMuvC,GAE5B3vC,MAAOgwC,GACxBD,EAAcz7C,KAAM27C,GAAiBA,EAAalnB,WAAWinB,O,6FCoGlDE,IA7EY,EACzBzX,MACA0X,eACAvU,SACAlU,YACA/L,QACA7rB,WACAsgD,YAAY,OACZC,YAAY,MACZC,aAAY,EACZC,SACAC,qBAAoB,EACpBC,sBACAC,UACA9X,eACAC,mBAGA,IAAI8X,EAAU37C,YAAuB,MACjCyjC,IACFkY,EAAUlY,GAEZ,MAAMmY,EAAuBT,GAAgBQ,GAEvC,qBAAEpU,GAAyBsU,YAAkBjV,EAAQ6U,GAE3Dj8C,YAAU,IAAOonC,GAAU8U,EAAUhC,YAAsBgC,QAAW5jD,EAAY,CAAC8uC,EAAQ8U,IAE3FI,YAAsB,EAAEC,WACHjkD,IAAfikD,GACFjC,YAhCqB,MAkCtB,CAAClT,IAEJ,MAAMyP,ECjEO,EACb5R,EACAmC,EACAoV,KAEA,MAAOC,EAAcC,GAAmBv9C,aAAU,GAElDa,YAAU,KACR08C,GAAiB,IAChB,CAACtV,IAwCJ,OAtCsB9mC,YAAahL,IACjC,MAAMqwC,EAAUV,EAAW9mC,QAE3B,IAAKwnC,EACH,OAGF,GAAkB,KAAdrwC,EAAEwhD,SAAkB0F,EAEtB,YADAA,IAIF,GAAkB,KAAdlnD,EAAEwhD,SAAgC,KAAdxhD,EAAEwhD,QACxB,OAGF,MAAM6F,EAAiB5mD,SAAS6mD,cAC1BC,EAAkB1yC,MAAMe,KAAKy6B,EAAQrqC,UAE3C,IAAIwhD,EAAYH,GAAkBE,EAAgBt0C,QAAQo0C,IAAoBF,EAE9E,GAAkB,KAAdnnD,EAAEwhD,SAAkBgG,EAAW,EACjCA,SACK,GAAkB,KAAdxnD,EAAEwhD,SAAkBgG,EAAWD,EAAgBxoD,OAAS,EACjEyoD,QACK,IAA+B,IAA3BD,EAAgBxoD,OAGzB,OAFAyoD,EAAW,EAKb,MAAMrxC,EAAOoxC,EAAgBC,GACzBrxC,IACFixC,EAAgBI,GAChBrxC,EAAKkyB,UAEN,CAAC8e,EAAcxX,EAAYuX,KDkBRO,CAA0BZ,EAAS/U,EAAQ0U,EAAYI,OAAU5jD,GAEvF0kD,YACE5V,EACAgV,EACAJ,OAAoB1jD,EAAY4jD,GAGlC,MAAMe,EAAkB9mB,YACtB,sCACA0lB,EACAD,EACAG,GAAU,cACVhU,GAGF,OACE,yBACE7U,UAAWiD,YAAe,oBAAqBjD,GAC/C8jB,UAAW5P,EAASyP,OAAgBv+C,EACpC8rC,aAAcA,EACdC,aAAc+C,EAAS/C,OAAe/rC,EAEtC6uB,MAAOA,GAENigB,GAEC,yBAAKlU,UAAU,aAEjB,yBACE+Q,IAAKkY,EACLjpB,UAAW+pB,EAEX91B,MAAQ,qBAAoB00B,KAAaD,IACzCliB,QAASoiB,EAAYI,OAAU5jD,GAE9BgD,EACAygD,GAAU,yBAAK7oB,UAAU,UAAU6oB,O,sNEnGrCjvB,eAAeowB,EAASC,GAC7B,MAAMC,QAAoB,IAAIhtB,SAAS+sB,GAAUC,cAEjD,OAAO,IAAI5nD,QAASC,IAClB,MAAM4nD,EAAa,IAAIlsB,WAAWisB,GAElC,IAAIE,EAA2C,IAAIC,IAC/CC,EAAmC,IAAIC,IAE3CH,EAAc3E,UAAarjD,IAEV,OAAXA,EAAExB,KAEJ0pD,EAAW5yB,YAAY,CAAE8yB,QAAS,SAGlCF,EAAW5yB,YACT,CACE8yB,QAAS,SACTC,QAASroD,EAAExB,MAEbwB,EAAExB,KAAKsI,IAAI,EAAGwhD,YAA2BA,KAK/CJ,EAAU7E,UAAarjD,IACE,SAAnBA,EAAExB,KAAKsE,UACT3C,EAAQ,IAAIm6B,KAAK,CAACt6B,EAAExB,KAAK+pD,MAAO,CAAErnD,KAAM,eAExC8mD,EAAeQ,YACfR,OAAgBhlD,EAChBklD,EAAWM,YACXN,OAAYllD,IAIhBklD,EAAU5yB,YAAY,CACpB8yB,QAAS,OACTK,YAzCY,GA0CZC,cA3Cc,OA8ChBV,EAAc1yB,YAAY,CACxB8yB,QAAS,OACTO,kBAhDc,KAiDdC,uBAjDc,OAoDhBZ,EAAc1yB,YAAY,CACxB8yB,QAAS,SACTS,MAAOd,GACN,CAACA,EAAWO,W,YCxCnB,MAAMQ,EAAiB,CACrB,CAAC7rC,iBAAe8rC,SAAUjxB,IAActyB,KACxC,CAACyX,iBAAeI,SAAUya,IAAcwC,KACxC,CAACrd,iBAAeC,QAAS4a,IAAcC,KACvC,CAAC9a,iBAAeE,kBAAcna,EAC9B,CAACia,iBAAe+rC,aAAShmD,GAKrBimD,EAAc,IAAI72C,IAClB82C,EAAgB,IAAI92C,IAEnB,SAAS+lB,EACd1e,EAAa0vC,EAAgBC,GAE7B,GAAID,IAAgBlsC,iBAAeE,YACjC,OACER,IAkCN,SAAwBlD,GACtB,MAAM4vC,EAAkB,iBAA2B5vC,EAInD,OAFAwvC,EAAYx1C,IAAIgG,EAAK4vC,GAEdnpD,QAAQC,QAAQkpD,GAtCfC,CAAe7vC,GACf0e,EAAM1e,EAAKwD,iBAAeI,QAAS+rC,GAI3C,IAAKF,EAAc10C,IAAIiF,GAAM,CAC3B,MAAMxX,EAmCVu1B,eAAsC/d,EAAa0vC,EAA6BC,GAC9E,IAAK38C,IAAsB,CACzB,MAAM0tB,EAAY1gB,EAAIwlB,WAAW,UAAYtyB,IAA2BD,IAClEmrB,QAAeC,IAAeqC,EAAW1gB,EAAKqvC,EAAeK,IACnE,GAAItxB,EAAQ,CACV,IAAI5b,EAAQ4b,EAMZ,GAJoB,cAAhBA,EAAO32B,MAAyBkc,MAClCnB,QAAc2rC,EAAS3rC,IAGL,eAAhB4b,EAAO32B,OAA0BmxB,eAAqBpW,EAAO,CAC/D,MAAMstC,QAAiB9G,YAAUhpC,EAAKwC,GAClCstC,IACFttC,EAAQstC,GAIZ,MAAMC,EAAWC,EAAaxtC,GAI9B,OAFAgtC,EAAYx1C,IAAIgG,EAAK+vC,GAEdA,GAIX,GAAIL,IAAgBlsC,iBAAe+rC,OAAQ,CACzC,MAAMU,EAAc,IAAIC,YAClBC,EAAYC,IAAIC,gBAAgBJ,GACtC,IAAI5X,GAAS,EA4Bb,OA1BA4X,EAAY/9C,iBAAiB,aAAc,KACzC,GAAImmC,EACF,OAEFA,GAAS,EAET,MAAMiY,EAAeL,EAAYM,gBAAgB,cAE5C/0B,YAAQ,gBAAiB,CAAExb,MAAK0vC,eAAe,CAAC3qC,EAAkBspC,KACjEsB,GACFA,EAAW5qC,GAGI,IAAbA,GACFkrC,EAAYO,cAGTnC,GAILiC,EAAaG,aAAapC,OAI9BmB,EAAYx1C,IAAIgG,EAAKmwC,GACdA,EAGT,MAAM5xB,QAAe/C,YAAQ,gBAAiB,CAAExb,MAAK0vC,eAAeC,GACpE,IAAKpxB,EACH,MAAM,IAAIt2B,MAAM,yBAGlB,IAAI,SAAE8nD,EAAF,SAAY1sC,GAAakb,EAE7B,GAAiB,cAAblb,IAA6BM,IAAmB,CAClD,MAAMmd,QAAa6C,YAAUosB,GAC7BK,IAAIM,gBAAgBX,GACpB,MAAMvtC,QAAc2rC,EAASrtB,GAC7BivB,EAAWC,EAAaxtC,GACxBa,EAAWyd,EAAKr5B,KAGlB,GAAiB,eAAb4b,IAA8BuV,cAAmB,CACnD,MAAMkI,QAAa6C,YAAUosB,GAC7BK,IAAIM,gBAAgBX,GACpB,MAAMvtC,QAAcwmC,YAAUhpC,EAAK8gB,GAC/Bte,IACFutC,EAAWC,EAAaxtC,IAM5B,OAFAgtC,EAAYx1C,IAAIgG,EAAK+vC,GAEdA,EAzHWtxB,CAAuBze,EAAK0vC,EAAaC,GACtD3zB,MAAOh0B,IACF+F,KAEF7C,QAAQsD,KAAKxG,KAKhBi0B,QAAQ,KACPwzB,EAAc11C,OAAOiG,KAGzByvC,EAAcz1C,IAAIgG,EAAKxX,GAGzB,OAAOinD,EAAcvlD,IAAI8V,GAGpB,SAAS2wC,EAAwC3wC,GACtD,OAAOwvC,EAAYtlD,IAAI8V,GAGlB,SAAS4wC,EAAej1B,GAC7BD,YAAkBC,GAoGpB,SAASq0B,EAAaa,GACpB,OAAIA,aAAqBhwB,KAChBuvB,IAAIC,gBAAgBQ,GAGtBA,EAGL3tC,KACFiU,UAAU2U,cAAc55B,iBAAiB,UAAW6rB,UAClD,MAAM,KAAEt2B,EAAF,UAAQiW,EAAR,OAAmB6qB,GAAWhiC,EAAExB,KAMtC,GAAa,gBAAT0C,EACF,OAGF,MAAMiT,QAAe8gB,YAAQ,gBAAiB,CAAEk0B,YAAalsC,iBAAeE,eAAgB6kB,IAC5F,IAAK7tB,EACH,OAGF,MAAM,YAAE2zC,EAAF,SAAehrC,EAAf,SAAyBytC,GAAap2C,EAE5Cyc,UAAU2U,cAAcqC,WAAYtS,YAAY,CAC9Cp0B,KAAM,eACNiW,YACAhD,OAAQ,CACN2zC,cACAhrC,WACAytC,aAED,CAACzC,O,6BCrMR,wCAAM0C,EAAgD,CACpDC,MAAO,UACPC,UAAW,cACXC,OAAQ,WACRC,IAAK,QACLC,OAAQ,QACRC,QAAS,OACTC,UAAW,SACXC,UAAW,SACXC,WAAY,UACZC,IAAK,SAGDC,EAA2C,CAC/CC,QAAS,GACTC,SAAU,GACVC,YAAa,GACbxG,MAAO,GACPyG,KAAM,GACNC,OAAQ,GACRC,OAAQ,GACRC,QAAS,GACTC,MAAO,IAGM,SAASC,EAAyBzwB,GAiB/C,OAhBK0wB,KACHprD,SAASkL,iBAAiB,UAAW41C,GAAe,GAGrDviD,OAAOgT,KAAKmpB,GAAgCxyB,QAASmjD,IACpD,MAAMvb,EAAUpV,EAAQ2wB,GACxB,IAAKvb,EACH,OAGF,MAAMwb,EAAuBZ,EAASW,GAClCC,GACFA,EAAqB1sD,KAAKkxC,KAIvB,MAyBT,SAAiCpV,GAC9Bn8B,OAAOgT,KAAKmpB,GAAgCxyB,QAASmjD,IACpD,MAAMvb,EAAUpV,EAAQ2wB,GAClBC,EAAuBZ,EAASW,GACtC,GAAIC,EAAsB,CACxB,MAAM/4C,EAAQ+4C,EAAqBnW,UAAWtjC,GAAOA,IAAOi+B,IAC7C,IAAXv9B,GACF+4C,EAAqB74C,OAAOF,EAAO,MAKpC64C,KACHprD,SAASywC,oBAAoB,UAAWqQ,GAAe,GArCvDyK,CAAwB7wB,IAI5B,SAAS0wB,IACP,OAAO7sD,OAAO6M,OAAOs/C,GAAU3gD,KAAMyhD,GAAgBn2C,QAAQm2C,EAAYltD,SAG3E,SAASwiD,EAAcvhD,GACrB,MAAM8rD,EAActB,EAAiBxqD,EAAEqE,KACvC,IAAKynD,EACH,OAGF,MAAM,OAAE/sD,GAAWosD,EAASW,GAC5B,IAAK/sD,EACH,OAEFiB,EAAE0xC,mBAGFnB,EADgB4a,EAASW,GAAa/sD,EAAS,IACtCiB,K,6BCrEX,6CAOA,IAAIksD,EAAaC,IAEV,SAASA,IACd,MAAMC,EAA0B,IAArBvnD,OAAOoI,YAIlB,OAFAxM,SAASmxB,gBAAgBC,MAAMw6B,YAAY,OAAWD,EAAF,MAE7C,CACL/tC,MAAOxZ,OAAOysB,WACdhT,OAAQzZ,OAAOoI,aAInB,MAAMq/C,EAAep5B,YAAS,KAC5Bg5B,EAAaC,KACZ,KAAK,GAERtnD,OAAO8G,iBAAiB,SAAU2gD,GAClCznD,OAAO8G,iBAAiB,oBAAqB2gD,GAE9B,KACb3oD,IAAK,IAAMuoD,I,+CCzBb,MAAMK,EAsBKxtB,IACP,MAAMa,EAAS,GACf,IAAI/gC,EAAI,EACR,MAAM2tD,EAAMztB,EAAMhgC,OAClB,IAAIgF,EAEJ,KAAOlF,EAAI2tD,GAAK,CAEd,GADAzoD,EAAQg7B,EAAMlgC,KACW,QAAZ,MAARkF,GACH,MAAM,IAAI0oD,WAAW,wCAEnB1oD,EAAQ,QACVA,GAAS,MACT67B,EAAOvgC,KAAK8H,OAAOq2B,aAAez5B,IAAU,GAAM,KAAS,QAC3DA,EAAQ,MAAkB,KAARA,GAEpB67B,EAAOvgC,KAAK8H,OAAOq2B,aAAaz5B,IAElC,OAAO67B,EAAOl0B,KAAK,KAwBvB,SAASghD,EAAMC,EAAOC,EAAWC,GAC/B,IAAIC,EAIJ,IAHAH,EAAQE,EAAY3kD,KAAKghC,MAAMyjB,EAjBpB,KAiBoCA,GAAS,EACxDA,GAASzkD,KAAKghC,MAAMyjB,EAAQC,GAEvBE,EAAI,EAAGH,EAAS,IAA4BG,GArBtC,GAsBTH,EAAQzkD,KAAKghC,MAAMyjB,EAAQ,IAE7B,OAAOzkD,KAAKghC,MAAM4jB,EAAK,GAAoBH,GAAUA,EApB1C,KAwBb,SAASI,EAAOhuB,EAAOiuB,GAErB,MAAMptB,EAAS,GACTqtB,EAAa,GACbC,EAAenuB,EAAMhgC,OAE3B,IAAIwF,EAAO4oD,EAAStuD,EAAOuuD,EAAUC,EAAWC,EAAOC,EAAQC,EAAUC,EAAOX,EAAOY,EAAW1pD,EAAOwoD,EAezG,IAXAjoD,EAzCgB,IA0ChB1F,EAAI,EACJuuD,EA1CmB,GAgDnBC,EAAQtuB,EAAM4uB,YA/CE,KAgDZN,EAAQ,IAAGA,EAAQ,GAElBC,EAAI,EAAGA,EAAID,IAASC,EAAG,CAE1B,GADIN,IAAcC,EAAWrtB,EAAO7gC,QAAUggC,EAAMjD,WAAWwxB,GAAK,GAAK,IACrEvuB,EAAMjD,WAAWwxB,IAAM,IACzB,MAAM,IAAIb,WAAW,yBAEvB7sB,EAAOvgC,KAAK0/B,EAAMjD,WAAWwxB,IAM/B,IAAKC,EAAKF,EAAQ,EAAIA,EAAQ,EAAI,EAAGE,EAAKL,GAAe,CAOvD,IAAKM,EAAO3uD,EAAG4uD,EAAI,EAAGX,EAnEb,IAmEyBA,GAnEzB,GAmEoC,CAC3C,GAAIS,GAAML,EACR,MAAMT,WAAW,yBAInB,GAFAiB,GA5DgBE,EA4DK7uB,EAAMjD,WAAWyxB,MA3D9B,GAAK,GAAKK,EAAK,GAAKA,EAAK,GAAK,GAAKA,EAAK,GAAKA,EAAK,GAAK,GAAKA,EAAK,GAZlE,GAyEHF,GAzEG,GA0EL,MAAMjB,WAAW,yBAEnB,GAAIiB,EAAQxlD,KAAKghC,OAvER,WAuEwBrqC,GAAK4uD,GACpC,MAAMhB,WAAW,wBAInB,GAFA5tD,GAAK6uD,EAAQD,EACbzpD,EAAI8oD,GAAKM,EA9EF,EA8EgBN,GAAKM,EA7ErB,MA6E0CN,EAAIM,EACjDM,EAAQ1pD,EACV,MAEF,GAAIypD,EAAIvlD,KAAKghC,MA/EJ,YALF,GAoF6BllC,IAClC,MAAMyoD,WAAW,wBAEnBgB,GAvFO,GAuFKzpD,EAQd,GALAmpD,EAAMvtB,EAAO7gC,OAAS,EACtBquD,EAAOV,EAAM7tD,EAAI2uD,EAAML,EAAc,IAATK,GAIxBtlD,KAAKghC,MAAMrqC,EAAIsuD,GA1FR,WA0FwB5oD,EACjC,MAAMkoD,WAAW,wBAEnBloD,GAAK2D,KAAKghC,MAAMrqC,EAAIsuD,GACpBtuD,GAAKsuD,EAIDH,GACFC,EAAW/5C,OAAOrU,EAAG,EAAGkgC,EAAMjD,WAAWyxB,EAAK,GAAK,GAAK,IAG1D3tB,EAAO1sB,OAAOrU,EAAG,EAAG0F,GACpB1F,IAjGJ,IAAsB+uD,EAmGpB,GAAIZ,EACF,IAAKnuD,EAAI,EAAG2tD,EAAM5sB,EAAO7gC,OAAQF,EAAI2tD,EAAK3tD,IACpCouD,EAAWpuD,KACb+gC,EAAO/gC,GAAKsI,OAAOq2B,aAAaoC,EAAO/gC,IACpCk3C,cACAja,WAAW,IAIpB,OAAOywB,EAAa3sB,GAaPiuB,MAVf,SAAmBh0C,GACjB,MAAMi0C,EAAej0C,EAAOvD,MAAM,KAC5B62C,EAAM,GACZ,IAAK,IAAItuD,EAAI,EAAGA,EAAIivD,EAAa/uD,SAAUF,EAAG,CAC5C,MAAMmG,EAAI8oD,EAAajvD,GACvBsuD,EAAI9tD,KAAK2F,EAAEkS,MAAM,SAAW61C,EAAO/nD,EAAED,MAAM,IAAMC,GAEnD,OAAOmoD,EAAIzhD,KAAK,M,qBC3GlB,SAASqiD,EAAet0C,GACtB,GAAKA,EAIL,OAAOA,EAAIiI,SAAS,OAASjI,EAAO,WAAUA,EAGhD,SAASu0C,EAAUv0C,GACjB,IAAKA,EACH,OAGF,MAAMpZ,EAAO0tD,EAAet0C,GAC5B,GAAKpZ,EAIL,IACE,IAAI4tD,EAAcC,UAAU7tD,GAE5B,MAAM6W,EAAQ+2C,EAAY/2C,MAAM,uCAChC,IAAKA,EACH,OAEF,MAAM2C,EAAS3C,EAAM,GAGrB,OAFA+2C,EAAcA,EAAYtqC,QAAQ9J,EAAQs0C,EAAgBt0C,IAEnDo0C,EACP,MAAOxrD,GACH+E,KAEF7C,QAAQlC,MAAM,gCAAiCgX,EAAKhX,IAO3C0I,gBAAKgI,iBAClBnQ,EACA,CAAC2O,EAAWC,IAA2BsC,YAAKtC,EAAS,CACnD,sBAAuB,qBAHPuB,CA9F2B,EAC7CsG,MACAjC,OACAomB,YACA53B,WACAooD,sBACAC,uBAEA,MAAMp2C,EAAUjS,GAAYwR,EACtB82C,EAAY70C,IAAQxB,EAEpBosB,EAAcr5B,YAAahL,GAE7BA,EAAEuuD,SAAWvuD,EAAEwuD,QAAUxuD,EAAEyuD,UAAYzuD,EAAE0uD,UACrCj1C,IAASA,EAAIvC,MAAMhH,QAAiBuJ,EAAIvC,MAAM/G,OAE9Cm+C,IACFF,EAAoB,CAAE30C,QAEtBzZ,EAAEihC,kBACK,IAMXjhC,EAAEihC,iBACFotB,EAAiB,CAAE50C,SAEZ,GACN,CAAC60C,EAAWD,EAAkBD,EAAqB30C,IAEtD,IAAKA,EACH,OAGF,MAAMk1C,EAAa9tB,YACjBjD,GAAa,mBACbpmB,EAAKzY,OAAS,IAAM,uBAGtB,OACE,uBACEsB,KAAM0tD,EAAet0C,GACrBnB,MAAO01C,EAAUv0C,GACjBlY,OAAO,SACPT,IAAI,sBACJ88B,UAAW+wB,EACXvqB,QAASC,GAERpsB,O,6BCpEP,mBAGe,KAA0B3F,EAAwBtJ,KAC/D,MAAM4lD,EAAWrL,YAAev6C,GAChC,OAAO0B,YAAU,IAER4H,EAAGs8C,GAAY,IAErB5lD,K,6BCPL,0KAGO,SAAS6lD,EAAkBC,GAChC,OAAIA,EAASC,WACAD,EALM,YAKgBvJ,QAAQ,GAAjC,MAENuJ,EAASE,QACAF,EAPM,SAOgBvJ,QAAQ,GAAjC,OAECuJ,EAAS,MAAOvJ,QAAQ,GAA3B,MAGH,SAAS0J,EAAqBxuD,GACnC,MAAM,SAAE+X,EAAF,SAAYsE,GAAarc,EAE/B,OAAOyuD,EAAiB12C,EAAUsE,GAG7B,SAASoyC,EAAiB12C,EAAkBsE,GACjD,OAAItE,IAAuC,IAA3BA,EAASvF,QAAQ,KACxBuF,EAASlC,MAAM,KAAKkf,MAEpB1Y,EAASxG,MAAM,KAAKkf,MAIxB,SAAS25B,EAAsBC,GACpC,OAAQA,GACN,IAAK,MACL,IAAK,MACL,IAAK,OACH,MAAO,QACT,IAAK,MACL,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,OACH,MAAO,SACT,IAAK,MACL,IAAK,MACH,MAAO,MACT,QACE,MAAO,WAIN,SAAS1yC,EAAsBjc,GACpC,OAAOqV,QAAQrV,EAASgd,gBAAkBhd,EAASub,a,6BCpDrD,0EAAMqzC,EAAwD,CAC5DC,4BAA6B,CAC3BC,MAAO,aACPC,WAAY,yBAEdC,eAAgB,CACdF,MAAO,aACPC,WAAY,yBAEdlK,OAAQ,CACNiK,MAAO,aACPC,WAAY,yBAEdE,SAAU,CACRH,MAAO,SACPC,WAAY,kBAEdG,UAAW,CACTJ,MAAO,SACPC,WAAY,mBAEdI,oBAAqB,CACnBL,MAAO,SACPC,WAAY,kBAEdK,qBAAsB,CACpBN,MAAO,SACPC,WAAY,mBAEdM,IAAK,CACHP,MAAO,MACPC,WAAY,iBAEdO,YAAa,CACXR,MAAO,MACPC,WAAY,kBAIT,SAASQ,EAAevtD,GAK7B,MAAM,QAAEK,EAAF,KAAWnB,EAAX,MAAiBsuD,GAAUxtD,GAC3B,MAAE8sD,EAAF,WAASC,EAAT,YAAqBxhB,GAAgBiiB,EAAQZ,EAAcY,GAASZ,EAAc1tD,GACxF,MAAO,CACL4tD,QACAC,aACAxhB,YAAaA,GAAelrC,GAIhC,MAAMotD,EAA0D,CAC9DC,6BAA8B,CAC5BZ,MAAO,cACPC,WAAY,4BAEdY,6BAA8B,CAC5Bb,MAAO,cACPC,WAAY,4BAEda,qBAAsB,CACpBd,MAAO,OACPC,WAAY,kBAEdc,wBAAyB,CACvBf,MAAO,cACPC,WAAY,qBAEde,yBAA0B,CACxBhB,MAAO,WACPC,WAAY,uBAEdgB,sBAAuB,CACrBjB,MAAO,QACPC,WAAY,mBAEdiB,sBAAuB,CACrBlB,MAAO,WACPC,WAAY,kBAEdkB,uBAAwB,CACtBnB,MAAO,QACPC,WAAY,mBAEdmB,uBAAwB,CACtBpB,MAAO,QACPC,WAAY,oBAKT,SAASoB,EAAiBC,GAC/B,OAAO7xD,OAAO6M,OAAOglD,GAAQj9C,OAAO,CAAC6C,EAAKq6C,KACxC,MAAMruD,EAAQytD,EAAgBY,EAAIhuD,SAOlC,OANIL,IACFgU,EAAM,IACDA,EACH,CAAChU,EAAM8sD,OAAQ9sD,EAAM+sD,aAGlB/4C,GACN,M,6BCvGL,+EAMA,IAAIs6C,EAEG,SAASC,EAAcC,EAAgBC,GACvCA,IACCH,IAAoBA,EAAgBI,cACtCJ,EAAgBI,aAAc,GAIhCJ,EADAG,EAAW,CAAEC,aAAa,IAI5BxmD,YAAQ,MACDumD,EAAUC,aAAeF,KAC5BD,EAAcC,EAAMC,KAKnB,SAASE,EAAQH,GACtBtmD,YAAQ,KACFsmD,KACFG,EAAQH,O,6BC5Bd,yBA6EeI,IA9DoB,EACjClQ,UACAvjB,YACA53B,WACAsgD,YAAY,OACZC,YAAY,MACZE,aAGA,MAAMI,EAAU37C,YAAuB,MAEjComD,EAAcpmD,YAAuB,OACpC4mC,EAAQyf,GAAa1nD,aAAS,GAyBrC,OACE,yBACE8kC,IAAK2iB,EACL1zB,UAAY,iBAAeA,GAAa,IACxC8jB,UAvBmB1hD,IACrB,MAAMwxD,EAAO3K,EAAQh+C,QAErB,IAAKipC,GAAwB,KAAd9xC,EAAEwhD,UAAmBgQ,EAClC,OAGF,MAAMnK,EAAiB5mD,SAAS6mD,cAC1BC,EAAkB1yC,MAAMe,KAAK47C,EAAKxrD,UAEnCqhD,IAA+D,IAA7CE,EAAgBt0C,QAAQo0C,IAC5CE,EAAgB,GAAmBlf,UAcnC8Y,EAAQ,CAAEsQ,UA7BM,KACnBF,GAAWzf,IA4B2BA,WAEpC,kBAAC,IAAD,CACEnD,IAAKkY,EACLR,aAAciL,EACdxf,OAAQA,EACRlU,UAAWA,GAAa,GACxB0oB,UAAWA,EACXC,UAAWA,EACXE,OAAQA,EACRD,WAAS,EACTI,QArBc,KAClB2K,GAAU,KAsBLvrD,M,6BCvET,YAGA,MAEM0rD,EAAgB,IAAI56C,OAAQ,OAAM66C,IAAa7rD,YAAa,IAElD0R,QACd,GAAIA,EAAKzY,OAJQ6yD,GAKf,OAAO,EAIT,IADoB97C,QAAQ0B,EAAKN,MAAMw6C,IAErC,OAAO,EAGT,IAAIG,EAAa,EACjB,KAAOF,IAAapnD,KAAKiN,IAGvB,GAFAq6C,IAEIA,EAlBa,EAoBf,OADAF,IAAapvB,UAAY,GAClB,EAIX,OAAOsvB,I,6BC3BT,oEAEA,MAAMC,EAAiB,CAAC,cAAe,YAAa,kBAUpD,SAASC,EAAgBC,GACvB,MACMC,EADWD,EAAQ17C,MAAM,KACHxP,IAAKjI,GAAMqzD,SAASrzD,EAAG,KAEnD,OAAOsI,OAAOgrD,iBAAiBF,GAG1B,SAAS1uB,EAAiBnrB,GAC/B,IAAIzW,EAEJ,GAAqB,IAAjByW,EAAMrZ,OACR4C,EAAOyW,EAAM0jB,WAAW,GAAGkM,SAAS,IAAIuL,SAAS,EAAG,SAC/C,CACL,MAAMnb,EAAQ,GACd,IAAK,IAAIv5B,EAAI,EAAGA,EAAIuZ,EAAMrZ,OAAQF,IAC5BuZ,EAAM0jB,WAAWj9B,IAAM,OAAUuZ,EAAM0jB,WAAWj9B,IAAM,MACtDuZ,EAAM0jB,WAAWj9B,EAAI,IAAM,OAAUuZ,EAAM0jB,WAAWj9B,EAAI,IAAM,OAClEu5B,EAAM/4B,KAC6B,MAAhC+Y,EAAM0jB,WAAWj9B,GAAK,QAClBuZ,EAAM0jB,WAAWj9B,EAAI,GAAK,OAAU,QAGpCuZ,EAAM0jB,WAAWj9B,GAAK,OAAUuZ,EAAM0jB,WAAWj9B,GAAK,QAC/Du5B,EAAM/4B,KAAK+Y,EAAM0jB,WAAWj9B,IAIhC8C,EAAOy2B,EAAMtxB,IAAKs7C,GAAMA,EAAEpa,SAAS,IAAIuL,SAAS,EAAG,MAAM7nC,KAAK,KAGhE,OAAO/J,EAGF,SAASywD,EAAgB5zD,GAC9B,MAAM6zD,EAAuB,CAAEC,WAAY,GAAIjvB,OAAQ,IAEvD,IAAK,IAAIxkC,EAAI,EAAGA,EAAIL,EAAKO,OAAQF,GAAK,EAAG,CACvC,MAAMm8C,EAAW,CACf3nC,GAAI7U,EAAKK,GAAG,GACZkE,KAAMvE,EAAKK,GAAG,GACdwkC,OAAQ,IAGV,IAAK,IAAIiqB,EAAI,EAAGA,EAAI9uD,EAAKK,EAAI,GAAGE,OAAQuuD,IAAK,CAC3C,MAAMiF,EAAW/zD,EAAKK,EAAI,GAAGyuD,GACxBwE,EAAepwC,SAAS6wC,EAAS,GAAG,MACvCvX,EAAS3X,OAAOhkC,KAAKkzD,EAAS,GAAG,IACjCF,EAAUhvB,OAAOkvB,EAAS,GAAG,IAAM,CACjCl/C,GAAIk/C,EAAS,GAAG,GAChBC,MAAOD,EAAS,GAChBE,OAAQV,EAAgBQ,EAAS,IACjCG,MAAQH,EAAS,GAAc/vC,gBAKrC6vC,EAAUC,WAAWjzD,KAAK27C,GAG5B,OAAOqX,I,6BCvET,kCAuBA,MAAMM,EAAsB,IAAI3lD,IAAI,CAAC,MAAO,MAAO,gBAAiB,kBAC9D4lD,EAA6C,CACjDC,SAAU,WACV/O,aAAc,gBAIVgP,EAAiD,GA4BvD,SAASC,EACPC,EACAC,EACAxqD,EACAyqD,EACAlgD,GACA,oBACEmgD,GAAsB,EADxB,WAEEC,GAAa,EAFf,SAGEC,EAHF,cAIEC,GAME,IAgBJ,IAbGH,GACEF,GAAYxqD,GACZ9C,YAAmBstD,IAAattD,YAAmB8C,KAClDF,YAAkB0qD,EAAUxqD,KAEhCA,EAiGJ,SAAyBwqD,EAAmCxqD,GAG1D,OAFAwqD,EAAS9sD,kBAAkBJ,MAAQ0C,EAAKtC,kBAAkBJ,MAEnDsB,YAAgB4rD,EAAS9sD,mBApGvBotD,CAAgBN,EAAUxqD,KAI9B0qD,GAAuB1qD,GAAQ9C,YAAmB8C,IAASA,EAAKtC,kBAAkBC,WACrFotD,EAA6B/qD,EAAMyqD,EAASlgD,EAAOggD,GAGjDC,IAAaxqD,EACf,OAAOA,EAGT,IAAKwqD,GAAYxqD,EAAM,CACjB9C,YAAmB8C,KACrBA,EAAOgrD,EAAchrD,EAAMyqD,EAASlgD,EAAOggD,IAG7C,MAAMU,EAAOC,EAAWlrD,GACxBmB,YAAUnB,EAAMirD,GAEZN,GAAcJ,EAASY,WAAW5gD,GACpCggD,EAASa,aAAaH,EAAMV,EAASY,WAAW5gD,KAE/CqgD,GAAYL,GAAUlxD,YAAY4xD,QAEhC,GAAIT,IAAaxqD,EACtBuqD,EAASnxD,YAAY8H,YAAUspD,IAC/BvqD,YAAYuqD,QACP,GAAIA,GAAYxqD,EACrB,GAAIF,YAAkB0qD,EAAUxqD,GAAO,CACjC9C,YAAmB8C,KACrBA,EAAOgrD,EAAchrD,EAAMyqD,EAASlgD,EAAOggD,IAG7C,MAAMU,EAAOC,EAAWlrD,GACxBmB,YAAUnB,EAAMirD,GAChBV,EAASc,aAAaJ,EAAM/pD,YAAUspD,IACtCvqD,YAAYuqD,OACP,CACL,MAAMc,EAAgBpuD,YAAmBstD,IAAattD,YAAmB8C,GAMzE,GAJKsrD,GACHnqD,YAAUnB,EAAMkB,YAAUspD,IAGxBptD,YAAcotD,IAAaptD,YAAc4C,GAAO,CAClD,GAAI6qD,EAAe,CACjB,MAAMI,EAAO/pD,YAAUspD,GACjBe,EAAchB,EAASY,WAA6B,OAAlBN,EAAyBtgD,EAAQA,EAAQ,GAE7EghD,EACFhB,EAASa,aAAaH,EAAMM,IAE3BX,GAAYL,GAAUlxD,YAAY4xD,GAIlCK,GA2Pb,SAA0Bd,EAA8BxqD,EAA0B4nC,GAChF,MAAMrM,EAAchlC,OAAOgT,KAAKihD,EAASltD,OACnCkuD,EAAUj1D,OAAOgT,KAAKvJ,EAAK1C,OAEjCi+B,EAAYr7B,QAAStE,SACSrB,IAAxBiwD,EAASltD,MAAM1B,SAA0CrB,IAApByF,EAAK1C,MAAM1B,IAClD6vD,EAAgB7jB,EAAShsC,EAAK4uD,EAASltD,MAAM1B,MAIjD4vD,EAAQtrD,QAAStE,SACSrB,IAApByF,EAAK1C,MAAM1B,IAIX4uD,EAASltD,MAAM1B,KAASoE,EAAK1C,MAAM1B,UACTrB,IAAxBiwD,EAASltD,MAAM1B,GACjB8vD,EAAa9jB,EAAShsC,EAAKoE,EAAK1C,MAAM1B,IA8C9C,SAAyBgsC,EAAsBhsC,EAAa+vD,EAAerqD,GAC7D,UAAR1F,EAEDgsC,EAA6BtsC,WAAqBf,IAAb+G,EAAyBA,EAAW,IAE1EmqD,EAAgB7jB,EAAShsC,EAAK+vD,GAC9BD,EAAa9jB,EAAShsC,EAAK0F,IAlDvBsqD,CAAgBhkB,EAAShsC,EAAK4uD,EAASltD,MAAM1B,GAAMoE,EAAK1C,MAAM1B,OA7Q5DiwD,CAAiBrB,EAAUxqD,EAAMkB,YAAUspD,IAG7CxqD,EAAKzC,SA0Fb,SACEitD,EAA8BxqD,EAA0B8rD,GAExD,GAAI9rD,EAAK1C,MAAMyuD,cACb,OA6BJ,SAAgCvB,EAA8BxqD,EAA0B8rD,GACtF,MAAMN,EAAU,IAAIjnD,IAClBvE,EAAKzC,SAASc,IAAK2tD,IACjB,MAAMpwD,EAAM,UAAWowD,GAAaA,EAAU1uD,MAAM1B,IAOpD,OALImD,KAAS3B,YAAc4uD,KAAepwD,GAExCM,QAAQsD,KAAK,oCAGR5D,KAIX,IAAIqwD,EAAwB,EAC5B,MAAMC,EAAiB1B,EAASjtD,SAC7B4N,OAAO,CAAC6C,EAAKm+C,EAAe/1D,KAC3B,IAAIwF,EAAM,UAAWuwD,EAAgBA,EAAc7uD,MAAM1B,SAAMrB,EAG/D,GAAIqB,IAAQ4vD,EAAQz/C,IAAInQ,GAGtB,OAFA0uD,EAAkBwB,EAAWK,OAAe5xD,EAAWyF,GAAO,GAEvDgO,EACF,IAAKpS,EAAK,CACf,MAAMowD,EAAYhsD,EAAKzC,SAASnH,GAC1Bg2D,EAAeJ,GAAa,UAAWA,EAAaA,EAAU1uD,MAAM1B,SAAMrB,EAEhF,IAAIyxD,GAAcI,EAKhB,OAFA9B,EAAkBwB,EAAWK,OAAe5xD,EAAWyF,GAAO,GAEvDgO,EAJPpS,EAAO,cAAqBxF,EAchC,OALA4X,EAAIpS,GAAO,CACTgB,SAAUuvD,EACV5hD,MAAO0hD,IACPI,MAAO,UAAWF,EAAgBA,EAAc7uD,MAAMgvD,mBAAgB/xD,GAEjEyT,GACN,IAEL,IAEIu+C,EACAC,EAHAC,EAAgC,GAKhCC,EAAwB,EAE5B1sD,EAAKzC,SAAS2C,QAAQ,CAAC8rD,EAAW51D,KAChC,MAAMwF,EAAM,UAAWowD,EAAYA,EAAU1uD,MAAM1B,IAAO,cAAqBxF,EACzEu2D,EAAmBT,EAAetwD,GAExC,IAAK+wD,EAQH,OANKJ,IACHA,EAAgB,GAChBC,EAAgBp2D,QAGlBm2D,EAAc31D,KAAKo1D,GAIjBO,IACFE,EAAcA,EAAYx/C,OAAO2/C,EAAmBL,EAAeC,EAAgBV,EAAW9rD,IAC9FwsD,OAAgBjyD,EAChBgyD,OAAgBhyD,GAIlB,MAAM8xD,EAAQ,UAAWL,EAAYA,EAAU1uD,MAAMgvD,mBAAgB/xD,EAC/DsyD,EAAiBF,EAAiBpiD,QAAUmiD,GAAyBC,EAAiBN,QAAUA,EAChGS,EAAeD,GAAkBH,EAAwBC,EAAiBpiD,MAG3EsiD,IAAkBC,GACrBJ,IAGFD,EAAY71D,KACV0zD,EAAkBwB,EAAWa,EAAiB/vD,SAAUovD,EAAWhsD,EAAM5J,EAAG,CAC1Eu0D,YAAY,KACRkC,GAAkB,CACpBhC,cAAeiC,EAAe,OAAS,WAM3CP,IACFE,EAAcA,EAAYx/C,OAAO2/C,EAAmBL,EAAeC,EAAgBV,EAAW9rD,KAGhG,OAAOysD,EA/HEM,CAAuBvC,EAAUxqD,EAAM8rD,GAGhD,MAAMvQ,EAAY97C,KAAK2jC,IAAIonB,EAASjtD,SAASjH,OAAQ0J,EAAKzC,SAASjH,QAC7Dm2D,EAAc,GACd7B,EAAW5qD,EAAKzC,SAASjH,OAASk0D,EAASjtD,SAASjH,OAAS,EAAI0B,SAASg1D,8BAA2BzyD,EAE3G,IAAK,IAAInE,EAAI,EAAGA,EAAImlD,EAAWnlD,IAAK,CAClC,MAAM41D,EAAY1B,EAChBwB,EACAtB,EAASjtD,SAASnH,GAClB4J,EAAKzC,SAASnH,GACd4J,EACA5J,EACAA,GAAKo0D,EAASjtD,SAASjH,OAAS,CAAEs0D,iBAAarwD,GAG7CyxD,GACFS,EAAY71D,KAAKo1D,GAIjBpB,GACFkB,EAAUzyD,YAAYuxD,GAGxB,OAAO6B,EAxHeQ,CACdzC,EACAxqD,EACAsrD,EAAgBf,EAAWrpD,YAAUspD,KAM7C,OAAOxqD,EAGT,SAASgrD,EACPpuD,EAAmC6tD,EAA8ClgD,EAAeggD,GAEhG,IAAKrtD,YAAmBN,GACtB,OAAOA,EAGT,MAAM,kBAAEc,GAAsBd,EAE9B,IAAKc,EAAkBC,UAAW,CAEhCotD,EADAnuD,EAAWmE,YAAerD,GACa+sD,EAASlgD,EAAOggD,GAEvD,MAAM2C,EAActwD,EAASW,SAAS,GAClCL,YAAmBgwD,KACrBtwD,EAASW,SAAW,CAACytD,EAAckC,EAAatwD,EAAU,EAAG2tD,KAG/D7sD,EAAkBC,WAAY,EAGhC,OAAOf,EAST,SAASmuD,EACPnuD,EAAmC6tD,EAA8ClgD,EAAeggD,GAEhG,MAAM,kBAAE7sD,GAAsBd,EAE9Bc,EAAkBiD,SAAW,KAC3B8pD,EAAQltD,SAASgN,GAAS+/C,EACxBC,EACAE,EAAQltD,SAASgN,GACjB7M,EAAkBd,SAClB6tD,EACAlgD,EACA,CAAEmgD,qBAAqB,KAK7B,SAASQ,EAAWtuD,GAClB,GAAID,YAAeC,GACjB,OAAO5E,SAASm1D,eAAe,IAGjC,GAAIrwD,YAAcF,GAChB,OAAO5E,SAASm1D,eAAevwD,EAAStB,OAG1C,GAAI4B,YAAmBN,GACrB,OAAOsuD,EAAWtuD,EAASW,SAAS,IAGtC,MAAM,IAAEpF,EAAF,MAAOmF,EAAP,SAAcC,EAAW,IAAOX,EAChCgrC,EAAU5vC,SAASQ,cAAcL,GAcvC,MAZyB,iBAAdmF,EAAM4oC,MACf5oC,EAAM4oC,IAAI9lC,QAAUwnC,GAGtBrxC,OAAOgT,KAAKjM,GAAO4C,QAAStE,IAC1B8vD,EAAa9jB,EAAShsC,EAAK0B,EAAM1B,MAGnCgB,EAASW,SAAWA,EAASc,IAAI,CAAC+uD,EAAQh3D,IACxCk0D,EAAkB1iB,OAASrtC,EAAW6yD,EAAQxwD,EAAUxG,IAGnDwxC,EAyIT,SAASglB,EACPL,EAAiCC,EAAuBjC,EAAuBE,GAE/E,GAA6B,IAAzB8B,EAAcj2D,OAChB,MAAO,CAACg0D,EAAkBC,OAAUhwD,EAAWgyD,EAAc,GAAI9B,EAAS+B,EAAe,CAAE7B,YAAY,KAClG,GAAI4B,EAAcj2D,OAAS,EAAG,CACnC,MAAMs0D,EAAW5yD,SAASg1D,yBACpBP,EAAcF,EAAcluD,IAAKgvD,GACrC/C,EAAkBC,OAAUhwD,EAAW8yD,EAAgB5C,EAAS+B,EAAgB,CAAE5B,cASpF,OANIL,EAASY,WAAWqB,GACtBjC,EAASa,aAAaR,EAAUL,EAASY,WAAWqB,IAEpDjC,EAASlxD,YAAYuxD,GAGhB6B,EAGT,MAAM,IAAIxzD,MAAM,oBA4BlB,SAASyyD,EAAa9jB,EAAsBhsC,EAAaN,QACzCf,IAAVe,IAKQ,cAARM,EACFgsC,EAAQzS,UAAY75B,EAEH,UAARM,EACRgsC,EAA6BtsC,MAAQA,EACrB,UAARM,EACTgsC,EAAQxe,MAAMkkC,QAAUhyD,EACfM,EAAI46B,WAAW,MACxBtzB,YAAiB0kC,EAAShsC,EAAKN,GACtBM,EAAI46B,WAAW,SACxBoR,EAAQ9tC,aAAa8B,EAAKN,GAChB4uD,EAAoBn+C,IAAInQ,KACjCgsC,EAAgBuiB,EAAkBvuD,IAAQA,GAAON,IAItD,SAASmwD,EAAgB7jB,EAAsBhsC,EAAaN,GAC9C,cAARM,EACFgsC,EAAQzS,UAAY,GACH,UAARv5B,EACRgsC,EAA6BtsC,MAAQ,GACrB,UAARM,EACTgsC,EAAQxe,MAAMkkC,QAAU,GACf1xD,EAAI46B,WAAW,MACxBiS,YAAoBb,EAAShsC,EAAKN,GACzBM,EAAI46B,WAAW,SACxBoR,EAAQ6jB,gBAAgB7vD,GACdsuD,EAAoBn+C,IAAInQ,WAC1BgsC,EAAgBuiB,EAAkBvuD,IAAQA,GAwBvC,KAAE2xD,OAxbjB,SAAgB3wD,EAA2B2tD,GACzC,IAAKA,EACH,OAGF,IAAIiD,EAASjD,EAASnyD,aAAa,sBAC9Bo1D,IACHA,EAAS3iD,YAAcw/C,GACvBA,EAAemD,GAAU,CAAEjwD,SAAU,IACrCgtD,EAASzwD,aAAa,qBAAsB0zD,IAG9C,MAAMC,EAAQpD,EAAemD,GAC7BC,EAAMlwD,SAAW,CAAC+sD,EAAkBC,EAAUkD,EAAMlwD,SAAS,GAAIX,EAAU6wD,EAAO,O,8HCTrE/iD,uBACbnQ,EACA,CAAC2O,EAAWC,IAA2BsC,YAAKtC,EAAS,CAAC,iBAFzCuB,CAlBgC,EAC7CyqB,YAAWjjB,SAAQw7C,eAAcnwD,eAEjC,MAAMq+B,EAAcr5B,YAAY,KAC1B2P,GACFw7C,EAAa,CAAE9iD,GAAIsH,EAAOtH,MAE3B,CAACsH,EAAQw7C,IAEZ,OAAKx7C,EAKH,kBAACwpB,EAAA,EAAD,CAAMvG,UAAWiD,YAAe,WAAYjD,GAAYwG,QAASC,GAAcr+B,GAJxEA,ICQImN,uBACbnQ,EACA,CAAC2O,EAAWC,IAA2BsC,YAAKtC,EAAS,CAAC,iBAFzCuB,CAlBmC,EAChDyqB,YAAW96B,UAASkD,WAAUoiC,mBAE9B,MAAMguB,EAAqBprD,YAAY,KACjClI,GACFslC,EAAa,CAAEpxB,OAAQlU,EAAQkU,OAAQG,UAAWrU,EAAQuQ,MAE3D,CAAC+0B,EAActlC,IAElB,OAAKA,EAKH,kBAACqhC,EAAA,EAAD,CAAMvG,UAAWiD,YAAe,cAAejD,GAAYwG,QAASgyB,GAAqBpwD,GAJlFA,ICOImN,uBACbnQ,EACA,CAAC2O,EAAWC,IAA2BsC,YAAKtC,EAAS,CAAC,aAFzCuB,CAlBgC,EAC7CyqB,YAAW5mB,SAAQq/C,WAAUrwD,eAE7B,MAAMq+B,EAAcr5B,YAAY,KAC1BgM,GACFq/C,EAAS,CAAEhjD,GAAI2D,KAEhB,CAACA,EAAQq/C,IAEZ,OAAKr/C,EAKH,kBAACmtB,EAAA,EAAD,CAAMvG,UAAWiD,YAAe,WAAYjD,GAAYwG,QAASC,GAAcr+B,GAJxEA,ICFJ,SAASuhC,EACdzkC,EACAwkC,EACAgvB,EACAC,EACAtvB,EACA9L,EAAoC,IAEpC,IAAKr4B,EAAQmV,QAAQoC,OACnB,MAAO,GAET,MAAM,KAAE7C,GAAS1U,EAAQmV,QAAQoC,OAC3BpC,EAAsB,GACtBu+C,EAAwC,IAAKr7B,EAASs7B,cAAe,IAE3E,IAAIC,EACAC,EAAYC,EACdp/C,EACA,kBACA8vB,GACMnM,EAAQ07B,aAkGWC,EAlGuBxvB,EAkGIE,EAlGUrM,EAAQqM,QAmGjE2G,aAAO2oB,GAehB,SAA2Bj3C,EAAe2nB,GACxC,MAAMhwB,EAAO4pC,YAASvmC,YAAagF,IAEnC,OAAI2nB,EACKhwB,EAGF,kBAAC,EAAD,CAAUomB,UAAU,cAAc5mB,OAAQ6I,EAAKxM,IAAKwM,GAAQgiB,YAAWrqB,IArB1Eu/C,CAAkBD,EAAQtvB,GAC1BwvB,EAAkBF,EAAQtvB,KA3HnB,IAuBL,QAiGR,IAA6BsvB,EAA2BtvB,EAnDtD,OA3CAkvB,EAAcC,EAAUnhC,MACxBvd,EAAQ5Y,QAAQs3D,GAEhBA,EAAYC,EACVF,EACA,gBACAJ,EACIU,EAAkBV,EAAYn7B,EAAQqM,SACtC,QAGNkvB,EAAcC,EAAUnhC,MACxBvd,EAAQ5Y,QAAQs3D,GAEhBA,EAAYC,EACVF,EACA,YACAH,EAuCJ,SAA8BzzD,EAAqBq4B,EAAoC,IACrF,MAAM3jB,EAAOF,YAAsBxU,IAC7B,MACJ2U,EADI,MACGC,EADH,SACUjX,EADV,QACoBoX,GACtBoD,YAAkBnY,GAEhBm0D,EAAaz/C,IAASC,IAAUC,IAAUjX,IAAaoX,EAC7D,IAAIq/C,EAAc9V,YAAS5pC,EAAgB2jB,EAAQs7B,eAE/Ch/C,EACFy/C,EAAc,UACLx/C,EACTw/C,EAAcx/C,EAAMS,MAAQ,QAAU,UAC7B1X,EACTy2D,EAAc,aACLr/C,IACTq/C,EAAe,IAAG1/C,MAGpB,GAAI2jB,EAAQqM,QACV,OAAOyvB,EAAc,IAAGC,KAAiBA,EAG3C,GAAID,EACF,OACE,kCAEE,kBAAC,EAAD,CAAar5B,UAAU,cAAc96B,QAASA,GAAU++B,YAAWq1B,IAFrE,KAQJ,OACE,kBAAC,EAAD,CAAat5B,UAAU,cAAc96B,QAASA,GAAU++B,YAAWq1B,IAxE/DC,CAAqBZ,EAAeC,GACpC,aAENE,EAAcC,EAAUnhC,MACxBvd,EAAQ5Y,QAAQs3D,GAEhBA,EAAYC,EACVF,EACA,YACAH,EAuBJ,SAA8BzzD,GAC5B,OAAOA,EAAQmV,SAAWnV,EAAQmV,QAAQD,QACtClV,EAAQmV,QAAQD,QAAQM,MACxB,YAzBE8+C,CAAqBb,GACrB,aAENG,EAAcC,EAAUnhC,MACxBvd,EAAQ5Y,QAAQs3D,GAEhBA,EAAYC,EACVF,EACA,gBACAzvB,EAmFJ,SAA+BjwB,EAAgBwwB,GAG7C,GAAIA,EACF,MAHW,eAMb,OAAO,kBAAC,EAAD,CAAU5J,UAAU,cAAc5mB,OAAQA,GANpC,gBAnFPqgD,CAAsBpwB,EAAc9L,EAAQqM,SAC5C,gBAENvvB,EAAQ5Y,QAAQs3D,GAEZx7B,EAAQqM,QACHvvB,EAAQvM,KAAK,IAAIqtB,OAGnB9gB,EAqDT,SAAS++C,EAAkBr8C,EAAiB6sB,GAC1C,MAAMhwB,EAAO4pC,YAASxmC,YAAgBD,IAEtC,OAAI6sB,EACKhwB,EAGF,kBAAC,EAAD,CAAUomB,UAAU,cAAcjjB,OAAQA,GAASA,GAAUknB,YAAWrqB,IAuBjF,SAASo/C,EAAmBp/C,EAAcqsC,EAAqByT,GAC7D,MAAMC,EAAsB//C,EAAKvE,QAAQ4wC,GACzC,GAAI0T,EAAsB,IAAMD,EAC9B,MAAO,CAAC9/C,GAGV,MAAMS,EAAsB,GAK5B,OAJAA,EAAQ5Y,KAAKmY,EAAKoC,UAAU,EAAG29C,IAC/Bt/C,EAAQ5Y,KAAKi4D,GACbr/C,EAAQ5Y,KAAKmY,EAAKoC,UAAU29C,EAAsB1T,EAAY9kD,SAEvDkZ,I,6DCZF,IAAKsB,EAAZ,sG,SAAYA,K,yBAAAA,E,qCAAAA,E,qCAAAA,E,+BAAAA,E,yBAAAA,E,2BAAAA,E,+BAAAA,E,6BAAAA,E,uCAAAA,E,+BAAAA,E,2BAAAA,E,uBAAAA,E,6BAAAA,E,+BAAAA,E,uBAAAA,E,mCAAAA,E,gCAAAA,M,KA4FL,MAAM6H,GAAkB,EAGlBo2C,EAAkB,mB,6CChRxB,IAAKv6C,EAFZ,kC,SAEYA,O,qBAAAA,I,qBAAAA,I,mBAAAA,I,6BAAAA,I,oBAAAA,M,mECFZ,gCA2Ce9J,gBACb,CAACmM,GAAUC,aACF,CACLgN,WAAYhN,EAASF,aAAWC,EAAQC,QAAUvc,IAGtD,CAAC2O,EAAWC,IAA2BsC,YAAKtC,EAAS,CAAC,WAAY,uBANrDuB,CAtBgD,EAC7DmP,WACAiK,aACAvmB,WACAqwD,WACAoB,wBAWE,uBAAGrzB,QATe,KACd7X,EACF8pC,EAAS,CAAEhjD,GAAIkZ,EAAWlZ,KACjBiP,GACTm1C,EAAmB,CAAEn1C,SAAUA,EAAS1I,UAAU,MAK3BgkB,UAAU,oBAChC53B,K,6BCpCP,oBAWA,IAAI0xD,GAAgB,EAEpB,MAAMC,EAAkB,yDAIlBC,EAAO,CAACC,EAAeC,EAAaC,KAChC,EAAIA,GAAsBF,EAAQE,EAAqBD,EAG3DE,EAAUh5D,OAAOgT,KAAKimD,GAAiDnxD,IAAKrC,IAAD,CAC/EA,WACAuzD,OAAQ,CAACE,EAASD,EAAYxzD,GAAU,IAAKyzD,EAASD,EAAYxzD,GAAU,QA2C9E,SAASyzD,EAASC,GAChB,MAAMhkD,EAASwjD,EAAgBptD,KAAK4tD,GAEpC,MAAO,CACLv0D,EAAGsuD,SAAS/9C,EAAO,GAAI,IACvBikD,EAAGlG,SAAS/9C,EAAO,GAAI,IACvBS,EAAGs9C,SAAS/9C,EAAO,GAAI,IACvBQ,OAAiB3R,IAAdmR,EAAO,GAAmB+9C,SAAS/9C,EAAO,GAAI,SAAMnR,GAI3D,SAASq1D,EAAwBC,EAAoBC,EAAkBR,EAA6B,GAClGC,EAAOrvD,QAAQ,EAAGlE,WAAUuzD,OAAQQ,MAClC,MAAM50D,EAAIsE,KAAKC,MAAMyvD,EAAKY,EAAeF,GAAY10D,EAAG40D,EAAeD,GAAU30D,EAAGm0D,IAC9EK,EAAIlwD,KAAKC,MAAMyvD,EAAKY,EAAeF,GAAYF,EAAGI,EAAeD,GAAUH,EAAGL,IAC9EnjD,EAAI1M,KAAKC,MAAMyvD,EAAKY,EAAeF,GAAY1jD,EAAG4jD,EAAeD,GAAU3jD,EAAGmjD,IAC9EpjD,OAAqC3R,IAAjCw1D,EAAeF,GAAY3jD,EACjCzM,KAAKC,MAAMyvD,EAAKY,EAAeF,GAAY3jD,EAAI6jD,EAAeD,GAAU5jD,EAAIojD,SAC5E/0D,EAEJvC,SAASmxB,gBAAgBC,MAAMw6B,YAAY5nD,OAAgBzB,IAAN2R,EAChD,QAAO/Q,KAAKw0D,KAAKxjD,KAAKD,EAAI,OAC1B,OAAM/Q,KAAKw0D,KAAKxjD,QA9DV,KAAC6jD,EAA2BC,KACzC,MAAMC,EAAwB,SAAVF,EACdG,EAAgBlB,GAAiBgB,EACjCJ,EAAaK,EAAc,EAAI,EAC/BJ,EAAWI,EAAc,EAAI,EAC7BE,EAAU5wC,KAAKlgB,MACf+wD,EAAgBr4D,SAASs4D,cAAc,4BAE7Ct4D,SAASmxB,gBAAgBonC,UAAUC,OAAQ,UAAQN,EAAc,QAAU,SACvEjB,GACFj3D,SAASmxB,gBAAgBonC,UAAUhoB,IAAI,iBAEzCvwC,SAASmxB,gBAAgBonC,UAAUhoB,IAAK,SAAQynB,GAC5CK,GACFA,EAAcv2D,aAAa,UAAWo2D,EAAc,UAAY,QAGlE11D,WAAW,KACTxC,SAASmxB,gBAAgBonC,UAAUC,OAAO,kBA7BZ,KAgChCvB,GAAgB,EAEZkB,EACF5H,YAAc,KACZ,MAAMhtD,EAAIkE,KAAKmiB,KAAKpC,KAAKlgB,MAAQ8wD,GArCnB,IAqC2C,GAIzD,OAFAR,EAAwBC,EAAYC,EAS1C,SAAoBv0D,GAClB,OAAO,GAAM,EAAIA,IAAM,IAV2Bk1D,CAAWl1D,IAElDA,EAAI,IAGbq0D,EAAwBC,EAAYC,K,6BC3DxC,6CAMe,SAAS7Q,EACtB5V,EACA+U,EACAD,GAEAl8C,YAAU,KACR,MAAMimC,EAAe3wC,IACnB,MAAMwxD,EAAO3K,EAAQh+C,QACftH,EAASvB,EAAEuB,OACZiwD,GAASjwD,IAKXiwD,EAAK2H,SAASn5D,EAAEuB,UACdA,EAAOy3D,UAAUG,SAnBD,cAqBnBn5D,EAAEihC,iBACFjhC,EAAE0xC,kBACEkV,GACFA,OASN,OAJI9U,GAAU8U,GACZnmD,SAASkL,iBAAiB,YAAaglC,GAGlC,KACLlwC,SAASywC,oBAAoB,YAAaP,KAE3C,CAACmB,EAAQ+U,EAASD,M,gBCvCvB9mD,EAAOD,QAAU,WACf,OAAO,IAAI60B,OAAO,IAA0B,oC,gBCD9C50B,EAAOD,QAAU,WACf,OAAO,IAAI60B,OAAO,IAA0B,oC,gBCD9C50B,EAAOD,QAAU,WACf,OAAO,IAAI60B,OAAO,IAA0B,oC,gBCD9C50B,EAAOD,QAAU,WACf,OAAO,IAAI60B,OAAO,IAA0B,oC,6BCD9C,kCAQAhiB,YAAW,OAAS4M,IAClB,MAAM,MACJm5C,EADI,eACGW,EADH,gBACmBC,EADnB,SACoCC,GACtCh6C,EAAO+M,SAASxY,MAEpB4jB,YAAY6hC,GAEZ74D,SAASmxB,gBAAgBC,MAAMw6B,YAAY,sBAA0BgN,EAAF,MACnE54D,SAASkmC,KAAKqyB,UAAUhoB,IAAI,WAC5BvwC,SAASkmC,KAAKqyB,UAAUhoB,IAAK,mBAAkBooB,GAC/C34D,SAASkmC,KAAKqyB,UAAUhoB,IAAI7f,IAAe,eAAiB,kBAC5DooC,YAAYd,EAAOW,EAAiB,GAEhCx8C,KACFnc,SAASkmC,KAAKqyB,UAAUhoB,IAAI,aAE1B/f,IACFxwB,SAASkmC,KAAKqyB,UAAUhoB,IAAI,UACnB9f,KACTzwB,SAASkmC,KAAKqyB,UAAUhoB,IAAI,gBAIhCt+B,YAAW,eAAgB,CAAC4M,EAAQ1N,EAASgB,KAC3C,MAAM,aAAE4mD,GAAiB5mD,EAMzB,OAJqB,IAAjB4mD,GACF/4D,SAASkmC,KAAKqyB,UAAUC,OAAO,WAG1B,IACF35C,EACHk6C,kBAIJ9mD,YAAW,qBAAsB,CAAC4M,EAAQ1N,EAASgB,KACjD,MAAM,YAAEosB,GAAgBpsB,EAExB,MAAO,IACF0M,EACHm6C,gBAAiBz6B,KAIrBtsB,YAAW,oBAAqB,CAAC4M,EAAQ1N,EAASgB,KACzC,IACF0M,EACHo6C,eAAgB5jD,QAAQlD,MAI5BF,YAAW,iBAAmB4M,IACrB,IACFA,EACHq6C,eAAW32D,M,6BC/Df,0CAkBA0P,YAAW,UAAW,CAAC4M,EAAqB1N,KAC1C,MAAM6iB,EAAY4M,aAAaC,QAAQl1B,WAA0BpJ,EAIjE,OAFKwxB,YAAQ5iB,EAAQgoD,UAAWnlC,GAEzB,IACFnV,EACHu6C,wBAAyB/jD,QAAQ2e,MAIrC/hB,YAAW,qBAAsB,CAAC4M,EAAQ1N,EAASgB,KACjD,MAAM,YAAEosB,GAAgBpsB,EAIxB,OAFKqiB,YAAQ,yBAA0B+J,GAEhC,IACF1f,EACHw6C,eAAe,EACfH,eAAW32D,KAIf0P,YAAW,cAAe,CAAC4M,EAAQ1N,EAASgB,KAC1C,MAAM,KAAEjR,GAASiR,EAIjB,OAFKqiB,YAAQ,kBAAmBtzB,GAEzB,IACF2d,EACHw6C,eAAe,EACfH,eAAW32D,KAIf0P,YAAW,kBAAmB,CAAC4M,EAAQ1N,EAASgB,KAC9C,MAAM,SAAEmnD,GAAannD,EAIrB,OAFKqiB,YAAQ,sBAAuB8kC,GAE7B,IACFz6C,EACHw6C,eAAe,EACfH,eAAW32D,KAIf0P,YAAW,qBAAsB,CAAC4M,EAAQ1N,EAASgB,KACjD,MAAM,KAAEonD,GAASpnD,EAEZqiB,YAAQ,qBAAsB+kC,KAGrCtnD,YAAW,SAAU,CAAC4M,EAAQ1N,EAASgB,KACrC,MAAM,UAAE61B,EAAF,SAAaC,GAAa91B,EAIhC,OAFKqiB,YAAQ,0BAA2B,CAAEwT,YAAWC,aAE9C,IACFppB,EACHw6C,eAAe,EACfH,eAAW32D,KAIf0P,YAAW,0BAA4B4M,IAChC2V,YAAQ,eAEN,IACF3V,EACHq6C,eAAW32D,KAIf0P,YAAW,kBAAoB4M,IACxB2V,YAAQ,qBAEN,IACF3V,EACH26C,qBAAqB,EACrBN,eAAW32D,KAIf0P,YAAW,cAAe,CAAC4M,EAAQ1N,EAASgB,KAC1C,MAAM,UAAE6hB,GAAc7hB,EACtByuB,aAAa64B,QAAQ9tD,IAAuBqoB,KAG9C/hB,YAAW,UAAW,KACpB,iBACQ0yB,oBACAnQ,YAAQ,WAEdxiB,cAAc0nD,SAJhB,KAQFznD,YAAW,QAAS,KAClB2uB,aAAaE,WAAWn1B,KAExB0rB,IAAeprB,KACforB,IAAenrB,KACfmrB,IAAelrB,KACfkrB,IAAejrB,KACfirB,IAAehrB,KAEf2F,cAAc2nD,SAGhB1nD,YAAW,aAAc,KACvB,iBACQuiB,YAAQ,eADhB,KAKFviB,YAAW,qBAAuB4M,IACD,yBAA3BA,EAAO+6C,iBAIX,WACE,MAAMC,QAA2BrlC,YAAQ,uBAEzCtjB,YAAU,IACLa,cACH8nD,wBALJ,KAWF5nD,YAAW,iBAAkB,CAAC4M,EAAQ1N,EAASuzB,KAC7CxzB,YAAU,IACL2N,EACHjgB,KAAM,CACJ8lC,cACAW,aAAc7d,KAAKlgB,WAKzB2K,YAAW,oBAAsB4M,IAC/B,MAAM/M,EAAY,IAAK+M,UAChB/M,EAAUlT,KACjBsS,YAAUY,M,6BCnKZ,0CAkBAG,YAAW,YAAa,CAAC4M,EAAQ1N,EAAS+iB,KAQxC,OAPIntB,KACsB,qBAApBmtB,EAAO,UAEThwB,QAAQkD,IAAI,kBAAmB8sB,EAAO,SAAU,CAAEA,WAI9CA,EAAO,UACb,IAAK,kBA+BT,SAA0BrV,GACxBqmB,cACAlO,YAAYnY,EAAO+M,SAASxY,MAAMylD,UAhC9BiB,CAAiBj7C,GACjB,MAEF,IAAK,4BAgCT,SAAoCqV,GAClC,IAAIrV,EAAS9M,cAEb,MAAMgoD,EAAoC,4BAArBl7C,EAAOm7C,UACtBA,EAAY9lC,EAAO+lC,mBAUzB,OARA/oD,YAAU,IACL2N,EACHm7C,YACAX,eAAe,IAGjBx6C,EAAS9M,cAEDioD,GACN,IAAK,+BACH9oD,YAAU,IACL2N,EACHq7C,cAAc,IAEhB,MACF,IAAK,6BACHhpD,YAAU,IACL2N,EACHs7C,iBAAkBjmC,EAAOkmC,eAE3B,MACF,IAAK,iCACHlpD,YAAU,IACL2N,EACHw7C,SAAUnmC,EAAOomC,OAEnB,MACF,IAAK,+BACHppD,YAAU,IACL2N,EACH26C,qBAAqB,EACrBe,WAAYrmC,EAAOsmC,SAErB,MACF,IAAK,0BAA2B,CAC9B,GAAIT,EACF,MAGF7oD,YAAU,IACL2N,EACHq7C,cAAc,EACdO,aAAcjzC,KAAKlgB,QAGrB,MAAM,UAAE0sB,GAAcE,EAClBF,GAAanV,EAAOo6C,gBACtBjnD,cAAc0oD,YAAY,CAAE1mC,cAG9B,QAvFA2mC,CAA2BzmC,GAC3B,MAEF,IAAK,4BAyFT,SAAoCA,GAClChjB,YAAU,IACLa,cACHmnD,UAAWhlC,EAAO7xB,UA3FhBu4D,CAA2B1mC,GAC3B,MAEF,IAAK,yBA4FT,SAAiCA,GAC/B,MAAM,gBAAE0lC,GAAoB1lC,EACtBrV,EAAS9M,cAEfb,YAAU,IACL2N,EACH+6C,oBAGsB,yBAApBA,GAAmE,4BAArB/6C,EAAOm7C,UACvDhoD,cAAc6oD,OACe,0BAApBjB,GACT5nD,cAAc8oD,UAvGZC,CAAwB7mC,GACxB,MAEF,IAAK,qBAwGT,SAA6BA,GAC3B,MAAM,YAAE8mC,GAAgB9mC,EAExBhjB,YAAU,IACL8qC,aAAWjqC,cAAaipD,EAAYpoD,GAAIooD,GAC3Cz7C,cAAey7C,EAAYpoD,KA5GzBqoD,CAAoB/mC,GACpB,MAEF,IAAK,QAC0B,oBAAzBA,EAAOlyB,MAAMK,SACf8O,EAAQ2pD,UAGV3pD,EAAQ+pD,UAAU,CAAEl5D,MAAOkyB,EAAOlyB,Y,sSCpDC,WAExC,SAASm5D,IACR,IAAIn6D,EAAMC,MAAMvC,KAAKm8B,KAAM,mCAE3B,OADAt8B,OAAO68D,eAAep6D,EAAKm6D,EAA4B38D,WAChDwC,EAGRm6D,EAA4B38D,UAAYD,OAAOoF,OAAO1C,MAAMzC,WARpB,G,IAa9B68D,EAAY,IAA0B,mB,iCCAjD,SAASC,EAAoB/7D,GAC3B,MAAMqa,EAAsBra,EAAExB,KAC9B,IAAK6b,EAAOnZ,KAAM,OAClB,MAAMgkC,EAAWzyB,cACjB,OAAQ4H,EAAOnZ,MACb,IAAK,eACHgkC,EAASkD,aAAa/tB,EAAOzH,UAKnC,SAASmiB,IACPnE,UAAU2U,cAAc2L,oBAAoB,UAAW6qB,GACvDnrC,UAAU2U,cAAc55B,iBAAiB,UAAWowD,GAEpDzzB,cAGExW,MACFjtB,OAAO8G,iBAAiB,OAAQ6rB,UAC9B,UACQ5G,UAAU2U,cAAcy2B,SAASF,GAEnCt0D,KAEF7C,QAAQkD,IAAI,uCAGR+oB,UAAU2U,cAAcC,MAE1B5U,UAAU2U,cAAcqC,YACtBpgC,KAEF7C,QAAQkD,IAAI,4BAEdktB,MAEIvtB,KAEF7C,QAAQlC,MAAM,oCAEhBgQ,cAAckpD,UAAU,CAAEl5D,MAAO,CAAEK,QAAS,8BAE9C,MAAOrB,GACH+F,KAEF7C,QAAQlC,MAAM,2CAA4ChB,MAIhEoD,OAAO8G,iBAAiB,QAAS6rB,gBACzB5G,UAAU2U,cAAcC,MAC9BzQ,O,YC7DG,MAAMknC,EAA6B,CACxCC,mBAAmB,EACnB9tC,iBAAiB,EACjBorC,aAAc,EAEdE,gBAAgB,EAEhB9Z,QAAS,CACP9hC,IAAK,GACL05B,WAAY,GAGdh4B,MAAO,CACLC,KAAM,IAGRE,MAAO,CACL2B,QAAS,GACTo2B,cAAe,GACfx1B,iBAAkB,GAClBs1B,WAAY,GACZ/3B,KAAM,IAGR9B,SAAU,CACRuD,SAAU,IAGZ+C,kBAAmB,CACjB/C,SAAU,IAGZa,YAAa,CACXtC,KAAM,IAGRwK,YAAa,CACXC,iBAAkB,IAGpBiyC,aAAc,CAAC,WAAY,gBAAiB,iBAAkB,QAAS,UAEvEr5C,SAAU,CACRK,SAAU,GACVi5C,MAAO,GACPC,OAAQ,CACNv5C,SAAU,IAEZoG,SAAU,CACRpG,SAAU,IAEZw5C,SAAU,CACRjhB,OAAQ,IAEVt4B,OAAQ,GACRu5B,SAAU,IAGZr5B,KAAM,CACJs5C,MAAO,GACPx5C,OAAQ,IAGV+M,aAAc,GAEd1C,gBAAiB,CACfC,gBAAiB,IAGnBG,iBAAkB,CAChBtM,SAAU,IAGZ4M,WAAY,CACV5M,SAAU,IAGZs7C,SAAU,GAEVvuC,YAAa,GAEbwuC,YAAa,GAEb3xC,gBAAiB,GAEjBwD,YAAa,GAEb0B,QAAS,GAET0sC,cAAe,GAEf7L,OAAQ,GAER8L,eAAgB,GAEhBtwC,SAAU,CACRxY,MAAO,CACLwlD,gBAAiBlrD,IACjByuD,qBAAqB,EACrBC,aAAc9rD,IACdqoD,eAAgBlrD,IAChB4uD,oBAAqB,QACrBrE,MAAO,QACPxsC,qCAAqC,EACrCC,uCAAuC,EACvCC,iCAAiC,EACjCC,mCAAmC,EACnCS,oBAAoB,EACpBD,sBAAsB,EACtBmwC,uBAAuB,EACvB/vC,oBAAoB,EACpBssC,SAAU,MAEZ0D,QAAS,IAGXjd,cAAe,I,gCCnGjB,MAEMkd,EAAuB/pC,aAgE7B,WACES,YAAO,KACL,IAAKupC,EACH,OAGF,MAAM59C,EAAS9M,cAEf,GAAI8M,EAAOq7C,aACT,OAGF,MAAMwC,EAA6B,IAC9BlB,KACA/nD,YAAKoL,EAAQ,CACd,YACA,kBACA,iBACA,0BACA,qBACA,gBACA,cACA,cACA,WACA,eACA,SAEF8O,gBAAiBgvC,EAAmB99C,GACpCE,MAAO69C,EAAY/9C,GACnBK,MAAO29C,EAAYh+C,GACnB3B,SAAU4/C,EAAej+C,GACzBwQ,aAAc,CACZ0tC,qBAAsBl+C,EAAOwQ,aAAa0tC,sBAE5CnxC,SAAUoxC,EAAen+C,IAGrB+Y,EAAOuC,KAAKC,UAAUsiC,GAC5B97B,aAAa64B,QAAQ5tD,IAAwB+rB,OAxGzB,KAE4C,GAEpE,IAAI6kC,GAAY,EAmBT,SAASQ,EAAUC,GACxB,IAAKtxD,IAA6B,CAEhC,GADyBg1B,aAAaC,QAAQl1B,KAI5C,OAFA8wD,GAAY,EACZpqD,YAAYmqD,GAUlB,SAAmBU,GACbn2D,KAEF7C,QAAQi5D,KAAK,2BAGf,MAAMvlC,EAAOgJ,aAAaC,QAAQh1B,KAC5BurB,EAASQ,EAAOuC,KAAKijC,MAAMxlC,QAAuBr1B,EAEpDwE,KAEF7C,QAAQm5D,QAAQ,2BAGdjmC,IAEFA,EAAOxL,SAASxY,MAAQ,IACnB8pD,EAAatxC,SAASxY,SACtBgkB,EAAOxL,SAASxY,QAIvB,MAAO,IACF8pD,KACA9lC,GAjCMkmC,CAAUJ,GAEjBT,GAAY,GA6ElB,SAASE,EAAmB99C,GAC1B,OAAOza,OAAOysB,WAAa7iB,KACvB6Q,EAAO8O,gBAIb,SAASivC,EAAY/9C,GACnB,MAAQE,OAAO,KAAEC,EAAF,WAAQiO,IAAiBpO,EAClC0+C,EAAY,KACZ1+C,EAAOK,MAAM2B,QAAQC,QAAU,IAAIxc,MAAM,EAAGwH,KAAoCgI,OAAQ0pD,GAAQA,EAAM,MACvGj/D,OAAOgT,KAAKyN,IACf1a,MAAM,EAAGyH,KAEX,MAAO,CACLiT,KAAMvL,YAAKuL,EAAMu+C,GACjBtwC,WAAY7oB,OAAOysB,WAAa7iB,IAA2Cif,OAAa1qB,GAI5F,SAASs6D,EAAYh+C,GACnB,MAAM4+C,EAAgB,KAChB5+C,EAAOK,MAAM2B,QAAQC,QAAU,IAAIxc,MAAM,EAAGwH,OAE1CyK,OAAQgY,GAAkBpL,YAAyBtE,IAAW,GAEtE,MAAO,IACFA,EAAOK,MACVF,KAAMvL,YAAKoL,EAAOK,MAAMF,KAAMuP,EAAgB,IAAIkvC,EAAelvC,GAAiBkvC,GAClF58C,QAAS,CACPC,OAAQ28C,GAEVxmB,cAAe,GACfx1B,iBAAkB,CAChBX,OAAQjC,EAAOK,MAAMuC,iBAAiBX,SAK5C,SAASg8C,EAAej+C,GACtB,MAAM4B,EAAgD,IAC9ClK,OAAQgY,GAAkBpL,YAAyBtE,IAAW,GAEhD,KAChBA,EAAOK,MAAM2B,QAAQC,QAAU,IAAIxc,MAAM,EAAGwH,QAC5CyiB,EAAgB,CAACA,GAAiB,IAE1BrmB,QAASqO,IACrB,MAAMnO,EAAUyW,EAAO3B,SAASuD,SAASlK,GACzC,IAAKnO,EACH,OAGF,MAAMs1D,EAAat1D,EAAQsY,YAAYC,kBAClC+8C,GAAeA,EAAWt4C,cAI/B3E,EAASlK,GAAU,CACjByI,KAAMvL,YAAKrL,EAAQ4W,KAAM0+C,EAAWt4C,aACpC1E,YAAa,CACX,CAACC,kBAAiB+8C,OAKxB,MAAMx4C,EAAqB/B,YAAyBtE,GAEpD,MAAO,CACL4B,WACA2C,cAAe8B,GAAsB8I,SAAmBzrB,EAAY,CAAC,IAChE2iB,EACHvG,SAAUgC,iBACVlgB,KAAM,YAKZ,SAASu8D,EAAen+C,GACtB,MAAM,MAAEzL,GAAUyL,EAAO+M,SAEzB,MAAO,CACLxY,QACAmpD,QAAS,IAvLP3wD,MAIJqG,YAAW,cAAe,KACxBwqD,GAAY,EACZpqD,YAAYmqD,KAGdvqD,YAAW,QAAS,KAClBwqD,GAAY,EACZnqD,YAAekqD,GACf57B,aAAaE,WAAWj1B,QC/B5BoG,YAAW,OAAQ,KACjB,MAAM5I,EAAU0M,YAAUylD,GACpB1pD,EAAYmrD,EAAU5zD,IAAYA,EAElC6b,EAAqB/B,YAAyBrR,IAAc,GAGlE,OAFA1N,OAAOu5D,QAAQC,aAAa14C,EAAoB,IAEzCpT,I,mBChBT,MAGM+rD,EAASn3D,OAAO8gB,KAAKlgB,MAAQG,KAAKq8B,UAIxC,IAAIvwB,EAFJqtB,aAAa64B,QALO,gBAKcoE,GAIlC,MAAMnrC,EAAWtuB,OAAOyuB,YAAY,KAC9Btf,GAAYqtB,aAAaC,QAVX,mBAUoCg9B,IACpDtqD,IACAuf,cAAcJ,KAXD,K,wDCDjB,MAAMorC,EAAa,CAAC,iBAAkB,kBAEvB,SAASC,IACtB,GAAI,UAAW/9D,SACb,OAAOP,QAAQiD,IAAIo7D,EAAWz3D,IAAK23D,GAASh+D,SAASi+D,MAAMC,KAAKF,K,2BCJrD,G,MAAA,IAA0B,sDCA1B,MAA0B,8CC0CzC,SAASG,IACP,MAAM,QAAEt9C,EAAF,KAAW7B,GAASjN,cAAYmN,MACtC,GAAK2B,EAAQC,OAIb,OAAOrhB,QAAQiD,IAAIme,EAAQC,OAAOxc,MAAM,EARf,IAQsC+B,IAAKkQ,IAClE,MAAM6I,EAAOJ,EAAKzI,GAClB,IAAK6I,EACH,OAGF,MAAM4qB,EAAaF,YAAkB1qB,GACrC,OAAK4qB,EAIEo0B,IAAkBp0B,EAAYxtB,iBAAe8rC,cAJpD,KAQJ,MAAM+V,EAAe,CACnBC,KAAM,IAAM7+D,QAAQiD,IAAI,CACtBk2B,YAAWH,IAAQO,KAAM,QACtB13B,KAAKy8D,GACRI,MAEFnF,gBAAiB,IAAMv5D,QAAQiD,IAAI,CACjCq7D,IACAniC,YAAa2iC,KAEfC,SAAU,IAAM5iC,YAAa6iC,GAC7BC,aAAc,IAAM9iC,YAAa6iC,GACjClE,WAAYwD,GAqECrrD,kBACZmM,IACQ,CACLk6C,aAAcl6C,EAAOk6C,aACrB4F,oBAAqBtpD,QAAQwJ,EAAO+M,SAASxY,MAAMwrD,kBACnDC,wBAAyBxpD,SAASwJ,EAAO+M,SAASxY,MAAMwrD,kBAAoB,IAAInoD,MAAM,qBACtFqoD,mBAAoB3vC,YAAyBtQ,KAGjD,CAAC3N,EAAWC,IAA2BsC,YAAKtC,EAAS,CAAC,iBATzCuB,CAlE6C,EAC1Do1C,OACAviD,WACAo5D,sBACAE,0BACAC,qBACAC,mBAEA,MAAOC,EAASC,GAAaC,eAE3BntB,aAAcotB,EADV,qBAC4BntB,GAC9BsU,aAAmB0Y,OAASz8D,GAAW,GA4B3C,OA1BA0H,YAAU,KACR,IAAIrI,EAcJ,OAZAnC,QAAQy8B,KAAK,CACX9I,YAzDoB,KA0DpBirC,EAAavW,OACZxmD,KAAK,KACN29D,IACAF,EAAa,CAAEhG,aAAc,IAE7Bn3D,EAAUwC,OAAO5B,WAAW,KAC1Bu8D,EAAa,CAAEhG,aAAc,KA/DV,OAmEhB,KACDn3D,IACFK,aAAaL,GACbA,OAAUW,GAGZw8D,EAAa,CAAEhG,aAAc,MAG9B,IAGD,yBAAKnmD,GAAG,YACLrN,EACA45D,GACC,yBAAKhiC,UAAWiD,YAAe,OAAQ4R,IAC3B,SAAT8V,EACC,oCACE,yBAAK3qB,UAAU,SACf,yBACEA,UAAWiD,YACT,SACAu+B,IAAwBE,GAA2B,kBACnDF,GAAuBE,GAA2B,kBAClDC,GAAsB,uBAGzBA,GAAsB,yBAAK3hC,UAAU,WAGxC,yBAAKA,UAAU,c,sFCjH3B,MAAMiiC,EAAuB,IAAM9wD,IAgIpB5D,mBA7HwB,EACrCkI,KACAtP,QACAqrC,YACA6U,eAGA,MAAM6b,EAAW50D,YAAyB,OAEnCqJ,EAAQwrD,GAAal2D,eACrBm2D,EAAcC,GAAmBp2D,YAASg1B,KAEjD,SAASqhC,EAAaC,GACpBJ,EAAUI,GACVF,EAyGJ,SAAyB1rD,EAAS,IAChC,OAAOA,EAAOxV,OACV8/B,IAAYtqB,OAAQ4qB,GAAY2mB,YAAY3mB,EAAQp8B,KAAMwR,IAC1DsqB,IA5GcuhC,CAAgBD,IAGlC,MAAMxb,EAAe35C,YAAahL,IAChC,MAAM,UAAEqgE,GAAergE,EAAE+hD,cAAcue,kBAAqCC,QACtEphC,EAAUN,IAAYxlB,KAAMhW,GAAMA,EAAEgQ,KAAOgtD,GAE7ClhC,GACF8kB,EAAS9kB,GAGXl8B,WAAW,IAAMi9D,OAAal9D,GAAY68D,IACzC,CAAC5b,IAEEuc,EAAcx1D,YAAahL,IAC/BkgE,EAAalgE,EAAE+hD,cAAch+C,QAC5B,IAEG08D,EAAqBz1D,YAAahL,IACtC,GAAkB,IAAdA,EAAEwhD,QACJ,OAGF,MAAMjgD,EAASvB,EAAE+hD,cACbh+C,QAAoBf,IAAXuR,IACXhT,EAAOwC,MAAQ,IAGjBm8D,EAAa3+D,EAAOwC,QACnB,CAACwQ,EAAQxQ,IA8CZ,OACE,kBAACstD,EAAA,EAAD,CACEzzB,UAAU,mBACVujB,QA/C+D,EAAGsQ,YAAW3f,aAC/E,MAAM4uB,EAAgB,KACpB,GAAI5uB,EACF,OAGF7uC,WAAW,KACT68D,EAASj3D,QAAS83D,UAtDH,IAyDjBlP,IAEA,MAAMmP,EAASngE,SAASogE,eAAe,0BACvCD,EAAOE,SAAS,CAAEC,IAAKH,EAAOI,aAAcC,SAAU,YAGlDC,OAAwBl+D,IAAXuR,EACfA,EACCxQ,GAASA,EAAMhB,MAAS,GAE7B,OACE,yBAAK66B,UAAWiD,YAAe,cAAe98B,GAAS,YACrD,2BACE4qC,IAAKmxB,EACLliC,UAAWiD,YAAe,eAAgBiR,GAAU,SACpD5wC,KAAK,OACLmS,GAAIA,EACJtP,MAAOm9D,EACPpd,aAAa,MACb1f,QAASs8B,EACT1xB,QAAS0xB,EACTxc,QAASsc,EACT9e,UAAW+e,IAEb,0CACCrxB,EACC,kBAACxO,EAAA,EAAD,CAASjD,MAAM,UAEf,uBAAGyG,QAASs8B,EAAe9iC,UAAWiD,YAAe,gBAAiBiR,GAAU,aAWnFkuB,EAAal5D,IAAKq4B,GACjB,kBAACkiB,EAAA,EAAD,CACEh9C,IAAK86B,EAAQ9rB,GACbuqB,UAAW75B,GAASo7B,EAAQ9rB,KAAOtP,EAAMsP,GAAK,WAAa,GAC3D+wB,QAASugB,GAET,0BAAMwc,kBAAiBhiC,EAAQ9rB,KAC/B,0BAAMuqB,UAAU,gBAAgBiE,YAAW1C,EAAQf,KAAM,CAAC,cAC1D,0BAAMR,UAAU,gBAAgBuB,EAAQp8B,MACxC,0BAAM66B,UAAU,gBAAgBuB,EAAQx9B,SAG1Cq+D,EAAajhE,QACb,kBAACsiD,EAAA,EAAD,CACEh9C,IAAI,aACJu5B,UAAU,aACV2R,UAAQ,GAER,uEC1GV,IAAI6xB,IAAqB,EAmKVj2D,mBAAKgI,YACjBmM,GAAuBpL,YAAKoL,EAAQ,CACnC,kBACA,YACA,kBACA,gBACA,sBACA,YACA,iBACA,uBAEF,CAAC3N,EAAWC,IAA2BsC,YAAKtC,EAAS,CACnD,qBACA,oBACA,iBACA,qBACA,oBAhBgBuB,CAjKoC,EACtDknD,kBACAI,YACAhB,kBACAK,gBACAG,sBACAN,YACAD,iBACAY,qBACA+G,qBACAC,oBACAC,qBACAC,iBACAC,sBAGA,MAAM3B,EAAW50D,YAAyB,OAEnCi0B,EAASuiC,GAAc73D,eACvBm1B,EAAa2iC,GAAkB93D,eAC/B+3D,EAAWC,GAAgBh4D,aAAS,IACpCi4D,EAAeC,GAAoBl4D,cAEpCm4D,EAAa7iC,EAAW,GAAEA,EAAQx9B,QAAQq9B,GAAe,KAAOA,EAChEijC,EAAYD,GAAcA,EAAWr+C,QAAQ,UAAW,IAAI5kB,QA5B1C,GA8BxB2L,YAAU,KACHymB,KACH2uC,EAASj3D,QAASw/B,SAEnB,CAAClJ,IAEJz0B,YAAU,KACgB,yBAApB2vD,GAA+CC,GACjDiH,KAED,CAAClH,EAAiBC,EAAoBiH,IAEzC72D,YAAU,MACJ4vD,GAAuBn7B,GAAYyiC,GACrCF,EAAW9iC,YAAe07B,KAE3B,CAACn7B,EAASm7B,EAAoBsH,IAEjC,MAAMM,EAAkBl3D,YAAam3D,IACnC,MAAMC,EAAmBtjC,YAA0BqjC,GAC7CE,GAAmBljC,GAAYijC,GAAoBA,EAAiB/uD,KAAO8rB,EAAQ9rB,GACrF+uD,EACAjjC,EAECgjC,EAAcpjE,SAEPogC,GAAYkjC,GAAmBA,EAAgB1gE,OAASw9B,EAAQx9B,OAC1E+/D,EAAWW,GAFXX,OAAW1+D,GAKb2+D,EAAeviC,YAAkB+iC,EAAeE,KAC/C,CAACljC,IAEJz0B,YAAU,UACY1H,IAAhBg8B,GAA6By6B,GAC/ByI,EAAgBzI,IAEjB,CAACA,EAAiBz6B,EAAakjC,IAElCt3D,YAAgB,KACVk1D,EAASj3D,SAAWi5D,GACtBhC,EAASj3D,QAAQy5D,qBAAqBR,IAEvC,CAACA,IAEJ,MAAMS,EAA0Bv3D,YAAahL,IACvC25D,GACF6H,IAIGJ,KACHA,IAAqB,EACrB5C,IACAniC,YAAa6iC,IAGf,MAAM,MAAEn7D,EAAF,eAASy+D,EAAT,aAAyBC,GAAiBziE,EAAEuB,OAClDwgE,EACES,GAAkBC,GAAgBA,EAAe1+D,EAAMhF,OACnD,CAACyjE,EAAgBC,QACjBz/D,GAGN6+D,GAAa,GACbK,EAAgBn+D,IACf,CAAC41D,EAAW6H,EAAgBU,IAEzBQ,EAA0B13D,YAAahL,IAC3CshE,EAAkBthE,EAAEuB,OAAOijD,UAC1B,CAAC8c,IAcJ,MAAMqB,EAA4B,sCAAdlI,EAEpB,OACE,yBAAKpnD,GAAG,yBAAyBuqB,UAAU,iBACzC,yBAAKA,UAAU,aACb,yBAAKvqB,GAAG,SACR,mDACA,uBAAGuqB,UAAU,QAAb,kCAEE,6BAFF,4BAIA,0BAAMvjB,OAAO,GAAGuoD,SAvBtB,SAAsBvhE,GACpBA,EAAM4/B,iBAEF64B,GAIAmI,GACFZ,EAAmB,CAAEriC,YAAagjC,MAgB9B,kBAAC,GAAD,CACE3uD,GAAG,qBACHtP,MAAOo7B,EACPiQ,WAAYkrB,IAAuBn7B,EACnC8kB,SAAUyd,IAEZ,kBAACmB,EAAA,EAAD,CACEl0B,IAAKmxB,EACLzsD,GAAG,uBACHqwC,MAAM,eACN3/C,MAAOi+D,EACPv/D,MAAOk3D,EACP5V,UAAU,MACVE,SAAUse,IAEZ,kBAACO,EAAA,EAAD,CACEzvD,GAAG,uBACHqwC,MAAM,oBACNc,QAAS1uC,QAAQ4jD,GACjBzV,SAAUye,IAEXT,IACCU,EACE,kBAACj0B,EAAA,EAAD,CAAQxtC,KAAK,SAASsuC,QAAM,EAACJ,UAAW0qB,GAAxC,QAEA,kBAACiJ,EAAA,EAAD,OAGHJ,GACC,kBAACj0B,EAAA,EAAD,CAAQS,QAAM,EAACK,QAAM,EAACJ,UAAW6qB,EAAqB71B,QAASq9B,GAA/D,2B,SC7KGt2D,mBANW,KACxB,MAAM63D,EAAWC,aAAgB/pC,IAAQM,KAAM,YAE/C,OAAOwpC,EAAW,kBAACA,EAAD,MAAe,kBAACD,EAAA,EAAD,QCGpB53D,mBANe,KAC5B,MAAM+3D,EAAeD,aAAgB/pC,IAAQM,KAAM,gBAEnD,OAAO0pC,EAAe,kBAACA,EAAD,MAAmB,kBAACH,EAAA,EAAD,QCG5B53D,mBANe,KAC5B,MAAMg4D,EAAeF,aAAgB/pC,IAAQM,KAAM,gBAEnD,OAAO2pC,EAAe,kBAACA,EAAD,MAAmB,kBAACJ,EAAA,EAAD,QCG5B53D,mBANa,KAC1B,MAAMi4D,EAAaH,aAAgB/pC,IAAQM,KAAM,cAEjD,OAAO4pC,EAAa,kBAACA,EAAD,MAAiB,kBAACL,EAAA,EAAD,Q,MCmCxB53D,mBAAKgI,YACjBmM,GAAuBpL,YAAKoL,EAAQ,CAAC,cACtC,CAACA,EAAQ1N,IAA2BsC,YAAKtC,EAAS,CAAC,QAAS,YAF1CuB,CAxByB,EAAGsnD,YAAWN,QAAO3lC,cAShE,OARA9pB,YAAU,KACRyvD,IACA3lC,KACC,CAAC2lC,EAAO3lC,IAEX9pB,YAAU,OACP,IAEK+vD,GACN,IAAK,6BACH,OAAO,kBAAC,EAAD,CAAUlS,KAAK,WAAWlkD,IAAI,YAAW,kBAAC,GAAD,OAClD,IAAK,iCACH,OAAO,kBAAC,EAAD,CAAUkkD,KAAK,eAAelkD,IAAI,gBAAe,kBAAC,GAAD,OAC1D,IAAK,qCACH,OAAO,kBAAC,GAAD,MACT,IAAK,+BACH,OAAO,kBAAC,EAAD,CAAUkkD,KAAK,aAAalkD,IAAI,cAAa,kBAAC,GAAD,OACtD,IAAK,oCACL,QACE,OAAO,kBAAC,EAAD,CAAUkkD,KAAK,kBAAkBlkD,IAAI,mBAAkB,kBAAC,GAAD,WC7BrD8G,mBANO,KACpB,MAAMsuB,EAAOwpC,aAAgB/pC,IAAQO,KAAM,QAE3C,OAAOA,EAAO,kBAACA,EAAD,WAAWz2B,ICRZ,OAA0B,oD,MC8B1BqgE,OAvBS,IAMpB,yBAAKhwD,GAAG,eACN,yBAAKuqB,UAAU,WACb,yBAAKp8B,IAAK8hE,GAAiB9/B,IAAI,KAC/B,wBAAI5F,UAAU,SAAd,yBACA,yBAAKA,UAAU,eAAf,sDAEE,6BAFF,mEAKA,yBAAKA,UAAU,WACb,kBAAC8Q,EAAA,EAAD,CAAQS,QAAM,EAACK,QAAM,EAACpL,QAfT,KACnBv/B,OAAO28B,SAASC,WAcV,iBCmCV,SAAS8hC,KACP,OACE,kBAAC,EAAD,CAAUhb,KAAK,OAAOlkD,IAAI,QACxB,kBAAC,GAAD,OAKS8O,mBACZmM,GAAuBpL,YAAKoL,EAAQ,CAAC,YAAa,4BACnD,CAAC3N,EAAWC,IAA2BsC,YAAKtC,EAAS,CAAC,eAFzCuB,CA9C6B,EAAGsnD,YAAWZ,0BAAyB2J,iBACjF,MAAOC,EAAYC,GAAgB/D,aAAQ,GAc3C,GAZAj1D,YAAU,KACRyhD,cfPFn4C,EeQ6B,KACzBwvD,IACA/iE,SAAS6X,MAAS,GAAExM,OAAaC,MAEjC23D,MAED,CAACF,EAAYE,IAIZD,EACF,OAAO,kBAAC,GAAD,MAGT,GAAIhJ,EACF,OAAQA,GACN,IAAK,oCACL,IAAK,6BACL,IAAK,iCACL,IAAK,qCACL,IAAK,+BACH,OAAO,kBAAC,GAAD,MACT,IAAK,2BACL,IAAK,4BACL,IAAK,+BACL,IAAK,0BACH,OAAO8I,KAIb,OAAO1J,EAA0B0J,KAAe,kBAAC,GAAD,Q,MCzC9C/7D,KAEF7C,QAAQkD,IAAI,YAGd4K,cAAc2nD,OAEV5yD,KAEF7C,QAAQkD,IAAI,4BAGd87D,IAAS3N,OACP,kBAAC,GAAD,MACAv1D,SAASogE,eAAe,SAGtBr5D,KAEF7C,QAAQkD,IAAI,6BAGdpH,SAASkL,iBAAiB,WAAY,KAEpChH,QAAQkD,IAAI,eAAgB2K","file":"main.facff4a55ab743e3ca28.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t2: 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + chunkId + \".\" + {\"0\":\"e64e1b33fbd34ea0ecf7\",\"1\":\"92f72ccd2084a0f8ad5c\",\"3\":\"47be058e9f0ad222993d\",\"4\":\"be30e05d0b45c4ae9494\",\"5\":\"15f2393649f3a443e1eb\",\"6\":\"76f20c2ed0975eba1faa\",\"7\":\"4a03ef6b444ee989f24d\",\"8\":\"c790dd1dd600221011e5\",\"9\":\"2926fb6f20a993ddde0a\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"0\":1,\"3\":1,\"4\":1,\"5\":1,\"6\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"\" + ({}[chunkId]||chunkId) + \".\" + {\"0\":\"e64e1b33fbd34ea0ecf7\",\"1\":\"92f72ccd2084a0f8ad5c\",\"3\":\"47be058e9f0ad222993d\",\"4\":\"be30e05d0b45c4ae9494\",\"5\":\"15f2393649f3a443e1eb\",\"6\":\"76f20c2ed0975eba1faa\",\"7\":\"4a03ef6b444ee989f24d\",\"8\":\"c790dd1dd600221011e5\",\"9\":\"2926fb6f20a993ddde0a\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 94);\n","import { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, onTickEnd, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { flatten, orderBy } from '../../util/iteratees';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { handleError } from '../../util/handleError';\nimport { removeAllDelegatedListeners } from './dom-events';\n\nexport type Props = AnyLiteral;\nexport type FC

= (props: P) => any;\nexport type FC_withDebug = FC & {\n DEBUG_contentComponentName?: string;\n};\n\nexport enum VirtualElementTypesEnum {\n Empty,\n Text,\n Tag,\n Component,\n}\n\ninterface VirtualElementEmpty {\n type: VirtualElementTypesEnum.Empty;\n target?: Node;\n}\n\ninterface VirtualElementText {\n type: VirtualElementTypesEnum.Text;\n target?: Node;\n value: string;\n}\n\nexport interface VirtualElementTag {\n type: VirtualElementTypesEnum.Tag;\n target?: Node;\n tag: string;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport interface VirtualElementComponent {\n type: VirtualElementTypesEnum.Component;\n componentInstance: ComponentInstance;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport type StateHookSetter = (newValue: ((current: T) => T) | T) => void;\n\ninterface ComponentInstance {\n $element: VirtualElementComponent;\n Component: FC;\n name: string;\n props: Props;\n renderedValue?: any;\n isMounted: boolean;\n hooks: {\n state: {\n cursor: number;\n byCursor: {\n value: any;\n nextValue: any;\n setter: StateHookSetter;\n }[];\n };\n effects: {\n cursor: number;\n byCursor: {\n effect: () => void;\n dependencies?: any[];\n cleanup?: Function;\n }[];\n };\n memos: {\n cursor: number;\n byCursor: {\n current: any;\n dependencies: any[];\n }[];\n };\n };\n prepareForFrame?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement = VirtualElementEmpty | VirtualElementText | VirtualElementTag | VirtualElementComponent;\nexport type VirtualRealElement = VirtualElementTag | VirtualElementComponent;\nexport type VirtualElementChildren = VirtualElement[];\n\nconst Fragment = Symbol('Fragment');\n\nlet renderingInstance: ComponentInstance;\n\nexport function isEmptyElement($element: VirtualElement): $element is VirtualElementEmpty {\n return $element.type === VirtualElementTypesEnum.Empty;\n}\n\nexport function isTextElement($element: VirtualElement): $element is VirtualElementText {\n return $element.type === VirtualElementTypesEnum.Text;\n}\n\nexport function isTagElement($element: VirtualElement): $element is VirtualElementTag {\n return $element.type === VirtualElementTypesEnum.Tag;\n}\n\nexport function isComponentElement($element: VirtualElement): $element is VirtualElementComponent {\n return $element.type === VirtualElementTypesEnum.Component;\n}\n\nexport function isRealElement($element: VirtualElement): $element is VirtualRealElement {\n return isTagElement($element) || isComponentElement($element);\n}\n\nfunction createElement(\n source: string | FC | typeof Fragment,\n props: Props,\n ...children: any[]\n): VirtualRealElement | VirtualElementChildren {\n if (!props) {\n props = {};\n }\n\n children = flatten(children);\n\n if (source === Fragment) {\n return children;\n } else if (typeof source === 'function') {\n return createComponentInstance(source, props, children);\n } else {\n return buildTagElement(source, props, children);\n }\n}\n\nfunction createComponentInstance(Component: FC, props: Props, children: any[]): VirtualElementComponent {\n let parsedChildren: any | any[] | undefined;\n if (children.length === 0) {\n parsedChildren = undefined;\n } else if (children.length === 1) {\n [parsedChildren] = children;\n } else {\n parsedChildren = children;\n }\n\n const componentInstance: ComponentInstance = {\n $element: {} as VirtualElementComponent,\n Component,\n name: Component.name,\n props: {\n ...props,\n ...(parsedChildren && { children: parsedChildren }),\n },\n isMounted: false,\n hooks: {\n state: {\n cursor: 0,\n byCursor: [],\n },\n effects: {\n cursor: 0,\n byCursor: [],\n },\n memos: {\n cursor: 0,\n byCursor: [],\n },\n },\n };\n\n componentInstance.$element = buildComponentElement(componentInstance);\n\n return componentInstance.$element;\n}\n\nfunction buildComponentElement(\n componentInstance: ComponentInstance,\n children: VirtualElementChildren = [],\n): VirtualElementComponent {\n const { props } = componentInstance;\n\n return {\n componentInstance,\n type: VirtualElementTypesEnum.Component,\n props,\n children,\n };\n}\n\nfunction buildTagElement(tag: string, props: Props, children: any[]): VirtualElementTag {\n return {\n type: VirtualElementTypesEnum.Tag,\n tag,\n props,\n children: dropEmptyTail(children).map(buildChildElement),\n };\n}\n\n// We only need placeholders in the middle of collection (to ensure other elements order).\nfunction dropEmptyTail(children: any[]) {\n let i = children.length - 1;\n\n for (; i >= 0; i--) {\n if (!isEmptyPlaceholder(children[i])) {\n break;\n }\n }\n\n return i + 1 < children.length ? children.slice(0, i + 1) : children;\n}\n\nfunction isEmptyPlaceholder(child: any) {\n // eslint-disable-next-line no-null/no-null\n return child === false || child === null || child === undefined;\n}\n\nfunction buildChildElement(child: any): VirtualElement {\n if (isEmptyPlaceholder(child)) {\n return buildEmptyElement();\n } else if (isRealElement(child)) {\n return child;\n } else {\n return buildTextElement(child);\n }\n}\n\nfunction buildTextElement(value: any): VirtualElementText {\n return {\n type: VirtualElementTypesEnum.Text,\n value: String(value),\n };\n}\n\nfunction buildEmptyElement(): VirtualElementEmpty {\n return { type: VirtualElementTypesEnum.Empty };\n}\n\nconst DEBUG_components: AnyLiteral = {};\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('COMPONENTS', orderBy(Object.values(DEBUG_components), 'renderCount', 'desc'));\n});\n\nexport function renderComponent(componentInstance: ComponentInstance) {\n renderingInstance = componentInstance;\n componentInstance.hooks.state.cursor = 0;\n componentInstance.hooks.effects.cursor = 0;\n componentInstance.hooks.memos.cursor = 0;\n\n const { Component, props } = componentInstance;\n let newRenderedValue;\n\n try {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n const componentName = componentInstance.name;\n if (!DEBUG_components[componentName]) {\n DEBUG_components[componentName] = {\n componentName,\n renderCount: 0,\n renderTimes: [],\n };\n }\n\n if (DEBUG_MORE) {\n if (componentName !== 'TeactMemoWrapper' && componentName !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Render ${componentName}`);\n }\n }\n\n DEBUG_startAt = performance.now();\n }\n\n newRenderedValue = Component(props);\n\n if (DEBUG) {\n const renderTime = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (renderTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(renderTime)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(renderTime);\n DEBUG_components[componentName].renderCount++;\n }\n } catch (err) {\n handleError(err);\n\n newRenderedValue = componentInstance.renderedValue;\n }\n\n if (componentInstance.isMounted && newRenderedValue === componentInstance.renderedValue) {\n return componentInstance.$element;\n }\n\n componentInstance.renderedValue = newRenderedValue;\n\n const newChild = buildChildElement(newRenderedValue);\n componentInstance.$element = buildComponentElement(componentInstance, [newChild]);\n\n return componentInstance.$element;\n}\n\nexport function hasElementChanged($old: VirtualElement, $new: VirtualElement) {\n if (typeof $old !== typeof $new) {\n return true;\n } else if ($old.type !== $new.type) {\n return true;\n } else if (isTextElement($old) && isTextElement($new)) {\n return $old.value !== $new.value;\n } else if (isTagElement($old) && isTagElement($new)) {\n return ($old.tag !== $new.tag) || ($old.props.key !== $new.props.key);\n } else if (isComponentElement($old) && isComponentElement($new)) {\n return (\n $old.componentInstance.Component !== $new.componentInstance.Component\n ) || (\n $old.props.key !== $new.props.key\n );\n }\n\n return false;\n}\n\nexport function unmountTree($element: VirtualElement) {\n if (!isRealElement($element)) {\n return;\n }\n\n if (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n // Trying to help GC\n // eslint-disable-next-line no-null/no-null\n $element.target = null as any;\n }\n\n $element.children.forEach(unmountTree);\n}\n\nexport function mountComponent(componentInstance: ComponentInstance) {\n renderComponent(componentInstance);\n componentInstance.isMounted = true;\n return componentInstance.$element;\n}\n\nfunction unmountComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n // eslint-disable-next-line no-null/no-null\n hook.current = null;\n });\n\n componentInstance.hooks.effects.byCursor.forEach(({ cleanup }) => {\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n });\n\n componentInstance.isMounted = false;\n\n helpGc(componentInstance);\n}\n\n// We force cleaning as many objects as possible. Not sure this is needed at all.\nfunction helpGc(componentInstance: ComponentInstance) {\n /* eslint-disable no-null/no-null */\n\n componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = null as any;\n hook.effect = null as any;\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = null as any;\n hook.nextValue = null as any;\n hook.setter = null as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks = null as any;\n componentInstance.$element = null as any;\n componentInstance.Component = null as any;\n componentInstance.props = null as any;\n componentInstance.forceUpdate = null as any;\n componentInstance.onUpdate = null as any;\n\n /* eslint-enable no-null/no-null */\n}\n\nfunction prepareComponentForFrame(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = hook.nextValue;\n });\n\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(() => prepareComponentForFrame(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n}\n\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\n\n renderComponent(componentInstance);\n\n if (componentInstance.$element !== currentElement) {\n componentInstance.onUpdate();\n }\n}\n\nexport function getTarget($element: VirtualElement): Node | undefined {\n if (isComponentElement($element)) {\n return getTarget($element.children[0]);\n } else {\n return $element.target;\n }\n}\n\nexport function setTarget($element: VirtualElement, target: Node) {\n if (isComponentElement($element)) {\n setTarget($element.children[0], target);\n } else {\n $element.target = target;\n }\n}\n\nexport function useState(initial?: T): [T, StateHookSetter] {\n const { cursor, byCursor } = renderingInstance.hooks.state;\n\n if (byCursor[cursor] === undefined) {\n byCursor[cursor] = {\n value: initial,\n nextValue: initial,\n setter: ((componentInstance) => (newValue: ((current: T) => T) | T) => {\n if (byCursor[cursor].nextValue !== newValue) {\n byCursor[cursor].nextValue = typeof newValue === 'function'\n ? (newValue as (current: T) => T)(byCursor[cursor].value)\n : newValue;\n\n if (!componentInstance.prepareForFrame || !componentInstance.forceUpdate) {\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(\n () => prepareComponentForFrame(componentInstance),\n );\n componentInstance.forceUpdate = throttleWithRaf(\n () => forceUpdateComponent(componentInstance),\n );\n }\n\n componentInstance.prepareForFrame();\n componentInstance.forceUpdate();\n\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[Teact.useState]',\n componentInstance.name,\n // `componentInstance.Component` may be set to `null` by GC helper\n componentInstance.Component && (componentInstance.Component as FC_withDebug).DEBUG_contentComponentName\n ? `> ${(componentInstance.Component as FC_withDebug).DEBUG_contentComponentName}`\n : '',\n `Forced update at cursor #${cursor}, next value: `,\n byCursor[cursor].nextValue,\n );\n }\n }\n })(renderingInstance),\n };\n }\n\n renderingInstance.hooks.state.cursor++;\n\n return [\n byCursor[cursor].value,\n byCursor[cursor].setter,\n ];\n}\n\nfunction useLayoutEffectBase(\n schedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: any[],\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n const exec = () => {\n if (!componentInstance.isMounted) {\n return;\n }\n\n const { cleanup } = byCursor[cursor];\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n\n byCursor[cursor].cleanup = effect() as Function;\n };\n\n if (byCursor[cursor] !== undefined && dependencies && byCursor[cursor].dependencies) {\n if (dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies![i])) {\n schedulerFn(exec);\n }\n } else {\n schedulerFn(exec);\n }\n\n byCursor[cursor] = {\n effect,\n dependencies,\n cleanup: byCursor[cursor] ? byCursor[cursor].cleanup : undefined,\n };\n\n renderingInstance.hooks.effects.cursor++;\n}\n\nexport function useEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(fastRaf, effect, dependencies);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(onTickEnd, effect, dependencies);\n}\n\nexport function useMemo(resolver: () => T, dependencies: any[]): T {\n const { cursor, byCursor } = renderingInstance.hooks.memos;\n let { current } = byCursor[cursor] || {};\n\n if (\n byCursor[cursor] === undefined\n || dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies[i])\n ) {\n current = resolver();\n }\n\n byCursor[cursor] = {\n current,\n dependencies,\n };\n\n renderingInstance.hooks.memos.cursor++;\n\n return current;\n}\n\nexport function useCallback(newCallback: F, dependencies: any[]): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies);\n}\n\nexport function useRef(initial: T): { current: T };\nexport function useRef(): { current: T | undefined }; // TT way (empty is `undefined`)\nexport function useRef(initial: null): { current: T | null }; // React way (empty is `null`)\n// eslint-disable-next-line no-null/no-null\nexport function useRef(initial?: T | null) {\n return useMemo(() => ({\n current: initial,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), []);\n}\n\nexport function memo(Component: T, areEqual = arePropsShallowEqual, withDebug = false) {\n return function TeactMemoWrapper(props: Props) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const propsRef = useRef(props);\n const renderedRef = useRef();\n\n if (!renderedRef.current || (propsRef.current && !areEqual(propsRef.current, props))) {\n if (DEBUG && withDebug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.memo] ${Component.name}: Update is caused by:`,\n getUnequalProps(propsRef.current!, props).join(', '),\n );\n }\n\n propsRef.current = props;\n renderedRef.current = createElement(Component, props) as VirtualElementComponent;\n }\n\n return renderedRef.current;\n } as T;\n}\n\n// We need to keep it here for JSX.\nexport default {\n createElement,\n Fragment,\n};\n","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_INFO = process.env.APP_INFO || 'Telegram T';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const GRAMJS_SESSION_ID_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 750;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 25;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios'];\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","import React, {\n FC, FC_withDebug, Props, useEffect, useState,\n} from './teact';\n\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport generateIdFor from '../../util/generateIdFor';\nimport { throttleWithRaf } from '../../util/schedulers';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { orderBy } from '../../util/iteratees';\nimport { GlobalState, GlobalActions, ActionTypes } from '../../global/types';\nimport { handleError } from '../../util/handleError';\n\nexport default React;\n\ntype ActionPayload = AnyLiteral;\n\ntype Reducer = (\n global: GlobalState,\n actions: GlobalActions,\n payload: any,\n) => GlobalState | void;\n\ntype MapStateToProps = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral | null);\ntype MapActionsToProps = ((setGlobal: Function, actions: GlobalActions) => Partial | null);\n\nlet currentGlobal = {} as GlobalState;\n\nconst reducers: Record = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as GlobalActions;\nconst containers = new Map;\n mapReducersToProps: MapActionsToProps;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nfunction runCallbacks() {\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nconst runCallbacksThrottled = throttleWithRaf(runCallbacks);\n\nexport function setGlobal(newGlobal?: GlobalState) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n runCallbacksThrottled();\n }\n}\n\nexport function getGlobal() {\n return currentGlobal;\n}\n\nexport function getDispatch() {\n return actions;\n}\n\nfunction onDispatch(name: string, payload?: ActionPayload) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal);\n }\n });\n }\n}\n\nfunction updateContainers() {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const container of containers.values()) {\n const {\n mapStateToProps, mapReducersToProps, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = {\n ...mapStateToProps(currentGlobal, ownProps),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n\n return;\n }\n\n if (DEBUG) {\n if (Object.values(newMappedProps).some(Number.isNaN)) {\n // eslint-disable-next-line no-console\n console.warn(\n // eslint-disable-next-line max-len\n `[TeactN] Some of \\`${container.DEBUG_componentName}\\` mappers contain NaN values. This may cause redundant updates because of incorrect equality check.`,\n );\n }\n }\n\n if (Object.keys(newMappedProps).length && !arePropsShallowEqual(mappedProps!, newMappedProps)) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[TeactN] Will update',\n container.DEBUG_componentName,\n 'caused by',\n getUnequalProps(mappedProps!, newMappedProps).join(', '),\n );\n }\n\n container.mappedProps = newMappedProps;\n container.areMappedPropsChanged = true;\n container.DEBUG_updates++;\n\n forceUpdate();\n }\n }\n\n if (DEBUG) {\n const updateTime = performance.now() - DEBUG_startAt!;\n if (updateTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[TeactN] Slow containers update: ${Math.round(updateTime)} ms`);\n }\n }\n}\n\nexport function addReducer(name: ActionTypes, reducer: Reducer) {\n if (!reducers[name]) {\n reducers[name] = [];\n\n actions[name] = (payload?: ActionPayload) => {\n onDispatch(name, payload);\n };\n }\n\n reducers[name].push(reducer);\n}\n\nexport function addCallback(cb: Function) {\n callbacks.push(cb);\n}\n\nexport function removeCallback(cb: Function) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n}\n\nexport function withGlobal(\n mapStateToProps: MapStateToProps = () => ({}),\n mapReducersToProps: MapActionsToProps = () => ({}),\n) {\n return (Component: FC) => {\n return function TeactNContainer(props: OwnProps) {\n (TeactNContainer as FC_withDebug).DEBUG_contentComponentName = Component.name;\n\n const [id] = useState(generateIdFor(containers));\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n return () => {\n containers.delete(id);\n };\n }, [id]);\n\n let container = containers.get(id);\n if (!container) {\n container = {\n mapStateToProps,\n mapReducersToProps,\n ownProps: props,\n areMappedPropsChanged: false,\n forceUpdate,\n DEBUG_updates: 0,\n DEBUG_componentName: Component.name,\n };\n\n containers.set(id, container);\n }\n\n if (container.areMappedPropsChanged) {\n container.areMappedPropsChanged = false;\n }\n\n if (!container.mappedProps || !arePropsShallowEqual(container.ownProps, props)) {\n container.ownProps = props;\n\n try {\n container.mappedProps = {\n ...mapStateToProps(currentGlobal, props),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n }\n }\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ;\n };\n };\n}\n\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL CONTAINERS', orderBy(Object.values(containers), 'DEBUG_updates', 'desc'));\n });\n}\n","type CollectionByKey = Record;\n\ntype OrderDirection = 'asc' | 'desc';\n\ninterface OrderCallback {\n (member: T): any;\n}\n\nexport function buildCollectionByKey(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues(\n byKey: CollectionByKey,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey) => R,\n): CollectionByKey {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick);\n}\n\nexport function pickTruthy(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n if (object[key]) {\n result[key] = object[key];\n }\n\n return result;\n }, {} as Pick);\n}\n\nexport function omit(object: T, keys: K[]) {\n const stringKeys = new Set(keys.map(String));\n const savedKeys = Object.keys(object)\n .filter((key) => !stringKeys.has(key)) as Array>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy(\n collection: T[],\n orderKey: (keyof T) | OrderCallback | ((keyof T) | OrderCallback)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n return collection.sort((a, b) => {\n if (Array.isArray(orderKey)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderKey1, orderKey2] = orderKey;\n\n let aValue1;\n let bValue1;\n\n if (typeof orderKey1 === 'function') {\n aValue1 = orderKey1(a) || 0;\n bValue1 = orderKey1(b) || 0;\n } else if (typeof orderKey1 === 'string') {\n aValue1 = a[orderKey1] || 0;\n bValue1 = b[orderKey1] || 0;\n }\n\n if (aValue1 !== bValue1) {\n return mode1 === 'asc' ? aValue1 - bValue1 : bValue1 - aValue1;\n } else {\n let aValue2;\n let bValue2;\n\n if (typeof orderKey2 === 'function') {\n aValue2 = orderKey2(a) || 0;\n bValue2 = orderKey2(b) || 0;\n } else if (typeof orderKey2 === 'string') {\n aValue2 = a[orderKey2] || 0;\n bValue2 = b[orderKey2] || 0;\n }\n\n return mode2 === 'asc' ? aValue2 - bValue2 : bValue2 - aValue2;\n }\n }\n\n let aValue;\n let bValue;\n\n if (typeof orderKey === 'function') {\n aValue = orderKey(a) || 0;\n bValue = orderKey(b) || 0;\n } else if (typeof orderKey === 'string') {\n aValue = a[orderKey] || 0;\n bValue = b[orderKey] || 0;\n }\n\n return mode === 'asc' ? aValue - bValue : bValue - aValue;\n });\n}\n\nexport function flatten(array: any[]) {\n return array.reduce((result, member) => {\n if (Array.isArray(member)) {\n return result.concat(member);\n } else {\n result.push(member);\n return result;\n }\n }, []);\n}\n\nexport function unique(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function compact(array: any[]) {\n return array.filter(Boolean);\n}\n\nexport function areSortedArraysEqual(array1: any[], array2: any[]) {\n if (array1.length !== array2.length) {\n return false;\n }\n\n return array1.every((item, i) => item === array2[i]);\n}\n\nexport function areSortedArraysIntersecting(array1: any[], array2: any[]) {\n return array1[0] <= array2[array2.length - 1] && array1[array1.length - 1] >= array2[0];\n}\n\nexport function findIntersectionWithSet(array: T[], set: Set): T[] {\n return array.filter((a) => set.has(a));\n}\n\nexport function split(array: any[], chunkSize: number) {\n const result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nexport function cloneDeep(value: T): T {\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(cloneDeep) as typeof value;\n }\n\n return Object.keys(value).reduce((acc, key) => {\n acc[key as keyof T] = cloneDeep(value[key as keyof T]);\n return acc;\n }, {} as T);\n}\n\n/**\n * Returns the index of the last element in the array where predicate is true, and -1 otherwise.\n *\n * @param array The source array to search in\n * @param predicate find calls predicate once for each element of the array, in descending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.\n */\nexport function findLast(array: Array, predicate: (value: T, index: number, obj: T[]) => boolean): T | undefined {\n let cursor = array.length;\n\n while (cursor--) {\n if (predicate(array[cursor], cursor, array)) {\n return array[cursor];\n }\n }\n\n return undefined;\n}\n","import {\n ApiChat, ApiMessage, ApiMessageEntityTypes, ApiUser,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID, RE_LINK_TEMPLATE } from '../../config';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\nimport { getUserFullName } from './users';\nimport { getChatTitle } from './chats';\n\nconst CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram';\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nexport function getMessageKey(message: ApiMessage) {\n const { chatId, id } = message;\n\n return `msg${chatId}-${id}`;\n}\n\nexport function parseMessageKey(key: string) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: Number(match[1]), messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageSummaryText(message: ApiMessage, noEmoji = false) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n if (message.groupedId) {\n if (text) {\n return `${noEmoji ? '' : '🖼 '}${text.text}`;\n }\n\n return 'Album';\n }\n\n if (photo) {\n if (text) {\n return `${noEmoji ? '' : '🖼 '}${text.text}`;\n }\n\n return 'Photo';\n }\n\n if (video) {\n if (video.isGif) {\n if (text) {\n return `${noEmoji ? '' : 'GIF '}${text.text}`;\n }\n\n return 'GIF';\n } else {\n if (text) {\n return `${noEmoji ? '' : '📹 '}${text.text}`;\n }\n\n return 'Video';\n }\n }\n\n if (sticker) {\n return `${sticker.emoji} Sticker`;\n }\n\n if (audio) {\n const caption = [audio.title, audio.performer].filter(Boolean).join(' — ') || (text && text.text);\n if (caption) {\n return `🎧 ${caption}`;\n }\n\n return 'Audio';\n }\n\n if (voice) {\n if (text) {\n return `${noEmoji ? '' : '🎤 '}${text.text}`;\n }\n\n return 'Voice Message';\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${text ? text.text : document.fileName}`;\n }\n\n if (contact) {\n return 'Contact';\n }\n\n if (poll) {\n return `📊 ${poll.summary.question}`;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return text.text;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getNotificationText(message: ApiMessage) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n if (message.groupedId) {\n return `🖼 ${text ? text.text : 'Album'}`;\n }\n\n if (photo) {\n return `🖼 ${text ? text.text : 'Photo'}`;\n }\n\n if (video) {\n return `📹 ${text ? text.text : video.isGif ? 'GIF' : 'Video'}`;\n }\n\n if (sticker) {\n return `${sticker.emoji} Sticker `;\n }\n\n if (audio) {\n const caption = [audio.title, audio.performer].filter(Boolean).join(' — ') || (text && text.text);\n return `🎧 ${caption || 'Audio'}`;\n }\n\n if (voice) {\n return `🎤 ${text ? text.text : 'Voice Message'}`;\n }\n\n if (document) {\n return `📎 ${text ? text.text : document.fileName}`;\n }\n\n if (contact) {\n return 'Contact';\n }\n\n if (poll) {\n return `📊 ${poll.summary.question}`;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return text.text;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\n\nexport function getMessageText(message: ApiMessage) {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice,\n } = message.content;\n\n if (text) {\n return text.text;\n }\n\n if (sticker || photo || video || audio || voice || document || contact || poll || webPage || invoice) {\n return undefined;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageCustomShape(message: ApiMessage): boolean | number {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact,\n } = message.content;\n\n if (sticker || (video && video.isRound)) {\n return true;\n }\n\n if (!text || photo || video || audio || voice || document || poll || webPage || contact) {\n return false;\n }\n\n // This is a \"dual-intent\" method used to limit calls of `parseEmojiOnlyString`.\n return parseEmojiOnlyString(text.text) || false;\n}\n\nexport function getMessageSingleEmoji(message: ApiMessage) {\n const { text } = message.content;\n if (!(text && text.text.length <= 6)) {\n return undefined;\n }\n\n if (getMessageCustomShape(message) !== 1) {\n return undefined;\n }\n\n return text.text;\n}\n\nexport function getFirstLinkInMessage(message: ApiMessage) {\n const { text } = message.content;\n\n let match: RegExpMatchArray | null | undefined;\n if (text && text.entities) {\n let link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.TextUrl);\n if (link) {\n match = link.url!.match(RE_LINK);\n }\n\n if (!match) {\n link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.Url);\n if (link) {\n const { offset, length } = link;\n match = text.text.substring(offset, offset + length).match(RE_LINK);\n }\n }\n }\n\n if (!match && text) {\n match = text.text.match(RE_LINK);\n }\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function matchLinkInMessageText(message: ApiMessage) {\n const { text } = message.content;\n const match = text && text.text.match(RE_LINK);\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function isOwnMessage(message: ApiMessage) {\n return message.isOutgoing;\n}\n\nexport function isReplyMessage(message: ApiMessage) {\n return Boolean(message.replyToMessageId);\n}\n\nexport function isForwardedMessage(message: ApiMessage) {\n return Boolean(message.forwardInfo);\n}\n\nexport function isActionMessage(message: ApiMessage) {\n return !!message.content.action;\n}\n\nexport function isServiceNotificationMessage(message: ApiMessage) {\n return message.chatId === SERVICE_NOTIFICATIONS_USER_ID && isMessageLocal(message);\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && message.senderId! < 0 && isOwnMessage(message);\n}\n\nexport function getSenderTitle(sender: ApiUser | ApiChat) {\n return sender.id > 0 ? getUserFullName(sender as ApiUser) : getChatTitle(sender as ApiChat);\n}\n\nexport function getSendingState(message: ApiMessage) {\n if (!message.sendingState) {\n return 'succeeded';\n }\n\n return message.sendingState === 'messageSendingStateFailed' ? 'failed' : 'pending';\n}\n\nexport function isMessageLocal(message: ApiMessage) {\n return message.id >= LOCAL_MESSAGE_ID_BASE;\n}\n\nexport function isHistoryClearMessage(message: ApiMessage) {\n return message.content.action && message.content.action.type === 'historyClear';\n}\n","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo,\n} from '../../api/types';\n\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, IS_SAFARI } from '../../util/environment';\nimport { getMessageKey, isMessageLocal, matchLinkInMessageText } from './messages';\nimport { getDocumentHasPreview } from '../../components/common/helpers/documentInfo';\n\nexport type IDimensions = {\n width: number;\n height: number;\n};\n\ntype Target = 'micro' | 'pictogram' | 'inline' | 'viewerPreview' | 'viewerFull' | 'download';\n\nconst MAX_INLINE_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\n\nexport function getMessageContent(message: ApiMessage) {\n return message.content;\n}\n\nexport function hasMessageMedia(message: ApiMessage) {\n return Boolean((\n getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageContact(message)\n || getMessagePoll(message)\n || getMessageAction(message)\n || getMessageAudio(message)\n || getMessageVoice(message)\n ));\n}\n\nexport function getMessagePhoto(message: ApiMessage) {\n return message.content.photo;\n}\n\nexport function getMessageVideo(message: ApiMessage) {\n return message.content.video;\n}\n\nexport function getMessageRoundVideo(message: ApiMessage) {\n const { video } = message.content;\n\n return video && video.isRound ? video : undefined;\n}\n\nexport function getMessageAction(message: ApiMessage) {\n return message.content.action;\n}\n\nexport function getMessageAudio(message: ApiMessage) {\n return message.content.audio;\n}\n\nexport function getMessageVoice(message: ApiMessage) {\n return message.content.voice;\n}\n\nexport function getMessageSticker(message: ApiMessage) {\n return message.content.sticker;\n}\n\nexport function getMessageDocument(message: ApiMessage) {\n return message.content.document;\n}\n\nexport function getMessageContact(message: ApiMessage) {\n return message.content.contact;\n}\n\nexport function getMessagePoll(message: ApiMessage) {\n return message.content.poll;\n}\n\nexport function getMessageInvoice(message: ApiMessage) {\n return message.content.invoice;\n}\n\nexport function getMessageWebPage(message: ApiMessage) {\n return message.content.webPage;\n}\n\nexport function getMessageWebPagePhoto(message: ApiMessage) {\n const webPage = getMessageWebPage(message);\n return webPage ? webPage.photo : undefined;\n}\n\nexport function getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n const thumbnail = getMessageMediaThumbnail(message);\n\n return thumbnail ? thumbnail.dataUri : undefined;\n}\n\nexport function getMessageMediaHash(\n message: ApiMessage,\n target: Target,\n) {\n const {\n photo, video, sticker, audio, voice, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n\n if (!(photo || video || sticker || webPagePhoto || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (photo || webPagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=x`;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n return `${base}?size=z`;\n }\n }\n\n if (video) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n if (canMessagePlayVideoInline(video)) {\n return getVideoOrAudioBaseHash(video, base);\n }\n\n return `${base}?size=z`;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(video, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (sticker) {\n switch (target) {\n case 'micro':\n return undefined;\n case 'pictogram':\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n default:\n return getVideoOrAudioBaseHash(audio, base);\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n default:\n return base;\n }\n }\n\n return undefined;\n}\n\nfunction getVideoOrAudioBaseHash(media: ApiAudio | ApiVideo, base: string) {\n if (IS_PROGRESSIVE_SUPPORTED && IS_SAFARI) {\n return `${base}?fileSize=${media.size}&mimeType=${media.mimeType}`;\n }\n\n return base;\n}\n\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): Exclude;\nexport function getMessageMediaFormat(message: ApiMessage, target: Target, canBeLottie: true): ApiMediaFormat;\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): ApiMediaFormat {\n const {\n sticker, video, audio, voice,\n } = message.content;\n\n if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (video && IS_PROGRESSIVE_SUPPORTED && (\n (target === 'viewerFull') || (target === 'inline' && canMessagePlayVideoInline(video))\n )) {\n return ApiMediaFormat.Progressive;\n } else if (audio || voice) {\n // Safari\n if (voice && !IS_OPUS_SUPPORTED) {\n return ApiMediaFormat.BlobUrl;\n }\n\n return ApiMediaFormat.Progressive;\n }\n\n return ApiMediaFormat.BlobUrl;\n}\n\nexport function getMessageMediaFilename(message: ApiMessage) {\n const { photo, video, webPage } = message.content;\n\n if (photo || (webPage && webPage.photo)) {\n return `photo${message.date}.jpeg`;\n }\n\n if (video) {\n return video.fileName;\n }\n\n return undefined;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo && photo.blobUrl) || (video && video.blobUrl) || (document && document.previewBlobUrl);\n}\n\nexport function canMessagePlayVideoInline(video: ApiVideo): boolean {\n return video.isGif || video.isRound || video.size <= MAX_INLINE_VIDEO_SIZE;\n}\n\nexport function getChatMediaMessageIds(\n messages: Record, listedIds: number[], reverseOrder = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, 'media');\n\n return reverseOrder ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): IDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'z')\n || photo.sizes.find((size) => size.type === 'y')\n || getPhotoInlineDimensions(photo)\n );\n}\n\nexport function getPhotoInlineDimensions(photo: ApiPhoto): IDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'x')\n || photo.sizes.find((size) => size.type === 'm')\n || photo.sizes.find((size) => size.type === 's')\n || photo.thumbnail\n );\n}\n\nexport function getVideoDimensions(video: ApiVideo): IDimensions | undefined {\n if (video.width && video.height) {\n return video as IDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isDownloadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isDownloadNeeded;\n const transferProgress = Number(progress);\n\n return {\n isUploading, isTransferring, transferProgress,\n };\n}\n\nexport function getMessageContentIds(\n messages: Record, messageIds: number[], contentType: ApiMessageSearchType,\n) {\n let validator: Function;\n\n switch (contentType) {\n case 'media':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessagePhoto(message) || (video && !video.isRound && !video.isGif);\n };\n break;\n\n case 'documents':\n validator = getMessageDocument;\n break;\n\n case 'links':\n validator = (message: ApiMessage) => getMessageWebPage(message) || matchLinkInMessageText(message);\n break;\n\n case 'audio':\n validator = getMessageAudio;\n break;\n\n default:\n return [] as Array;\n }\n\n return messageIds.reduce((result, messageId) => {\n if (messages[messageId] && validator(messages[messageId])) {\n result.push(messageId);\n }\n\n return result;\n }, [] as Array);\n}\n\nexport function getMediaDuration(message: ApiMessage) {\n const { audio, voice, video } = getMessageContent(message);\n const media = audio || voice || video;\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: number, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","import { ApiDocument } from './messages';\n\nexport * from './users';\nexport * from './chats';\nexport * from './messages';\nexport * from './updates';\nexport * from './media';\nexport * from './payments';\nexport * from './settings';\n\nexport interface ApiOnProgress {\n (\n progress: number, // Float between 0 and 1.\n ...args: any[]\n ): void;\n\n isCanceled?: boolean;\n acceptsBuffer?: boolean;\n}\n\nexport interface ApiAttachment {\n blobUrl: string;\n filename: string;\n mimeType: string;\n size: number;\n quick?: {\n width: number;\n height: number;\n duration?: number;\n };\n voice?: {\n duration: number;\n waveform: number[];\n };\n previewBlobUrl?: string;\n}\n\nexport interface ApiWallpaper {\n slug: string;\n document: ApiDocument;\n}\n\nexport interface ApiSession {\n hash: string;\n isCurrent: boolean;\n isOfficialApp: boolean;\n isPasswordPending: boolean;\n deviceModel: string;\n platform: string;\n systemVersion: string;\n appName: string;\n appVersion: string;\n dateCreated: number;\n dateActive: number;\n ip: string;\n country: string;\n region: string;\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: number): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectUserByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.users.byId).find(\n (user) => user.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectIsUserOrChatContact(global: GlobalState, userOrChat: ApiUser | ApiChat) {\n return global.contactList && global.contactList.userIds.includes(userOrChat.id);\n}\n","import { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isChatPrivate, isHistoryClearMessage, isUserBot, isUserOnline,\n} from '../helpers';\nimport { selectUser } from './users';\nimport { ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE } from '../../config';\n\nexport function selectChat(global: GlobalState, chatId: number): ApiChat | undefined {\n return global.chats.byId[chatId];\n}\n\nexport function selectChatUser(global: GlobalState, chat: ApiChat) {\n const userId = getPrivateChatUserId(chat);\n if (!userId) {\n return false;\n }\n\n return selectUser(global, userId);\n}\n\nexport function selectIsChatWithSelf(global: GlobalState, chatId: number) {\n return chatId === global.currentUserId;\n}\n\nexport function selectIsChatWithBot(global: GlobalState, chat: ApiChat) {\n const user = selectChatUser(global, chat);\n return user && isUserBot(user);\n}\n\nexport function selectSupportChat(global: GlobalState) {\n return Object.values(global.chats.byId).find(({ isSupport }: ApiChat) => isSupport);\n}\n\nexport function selectChatOnlineCount(global: GlobalState, chat: ApiChat) {\n if (isChatPrivate(chat.id) || isChatChannel(chat) || !chat.fullInfo) {\n return undefined;\n }\n\n if (!chat.fullInfo.members || chat.fullInfo.members.length === MEMBERS_LOAD_SLICE) {\n return chat.fullInfo.onlineCount;\n }\n\n return chat.fullInfo.members.reduce((onlineCount, { userId }) => {\n if (global.users.byId[userId] && isUserOnline(global.users.byId[userId]) && userId !== global.currentUserId) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const userId = chat && getPrivateChatUserId(chat);\n const user = userId && selectUser(global, userId);\n if (!user || !isUserBot(user)) {\n return undefined;\n }\n\n return user;\n}\n\nexport function selectIsChatBotNotStarted(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const bot = selectChatBot(global, chatId);\n if (!chat || !bot) {\n return false;\n }\n\n if (chat.lastMessage && isHistoryClearMessage(chat.lastMessage)) {\n return true;\n }\n\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return false;\n }\n\n const { listedIds } = messageInfo.threadsById[MAIN_THREAD_ID] || {};\n return listedIds && !listedIds.length;\n}\n\nexport function selectAreActiveChatsLoaded(global: GlobalState): boolean {\n return Boolean(global.chats.listIds.active);\n}\n\nexport function selectIsChatListed(global: GlobalState, chatId: number, type?: 'active' | 'archived'): boolean {\n const { listIds } = global.chats;\n if (type) {\n const targetList = listIds[type];\n return Boolean(targetList && targetList.includes(chatId));\n }\n\n return Object.values(listIds).some((list) => list && list.includes(chatId));\n}\n\nexport function selectChatListType(global: GlobalState, chatId: number): 'active' | 'archived' | undefined {\n const chat = selectChat(global, chatId);\n if (!chat || !selectIsChatListed(global, chatId)) {\n return undefined;\n }\n\n return chat.folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n}\n\nexport function selectChatFolder(global: GlobalState, folderId: number) {\n return global.chatFolders.byId[folderId];\n}\n\nexport function selectTotalChatCount(global: GlobalState, listType: 'active' | 'archived'): number {\n const { totalCount } = global.chats;\n const allChatsCount = totalCount.all;\n const archivedChatsCount = totalCount.archived || 0;\n\n if (listType === 'archived') {\n return archivedChatsCount;\n }\n\n return allChatsCount ? allChatsCount - archivedChatsCount : 0;\n}\n\nexport function selectIsChatPinned(global: GlobalState, chatId: number, folderId = ALL_FOLDER_ID): boolean {\n const { active, archived } = global.chats.orderedPinnedIds;\n\n if (folderId === ALL_FOLDER_ID) {\n return !!active && active.includes(chatId);\n }\n\n if (folderId === ARCHIVED_FOLDER_ID) {\n return !!archived && archived.includes(chatId);\n }\n\n const { byId: chatFoldersById } = global.chatFolders;\n\n const { pinnedChatIds } = chatFoldersById[folderId] || {};\n return !!pinnedChatIds && pinnedChatIds.includes(chatId);\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectChatByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.chats.byId).find(\n (chat) => chat.username && chat.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectCountNotMutedUnread(global: GlobalState) {\n const activeChatIds = global.chats.listIds.active;\n if (!activeChatIds) {\n return 0;\n }\n\n const chats = global.chats.byId;\n\n return activeChatIds.reduce((acc, chatId) => {\n const chat = chats[chatId];\n\n if (chat && chat.unreadCount && !chat.isMuted) {\n return acc + chat.unreadCount;\n }\n\n return acc;\n }, 0);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker } from '../../api/types';\n\nexport function selectIsStickerFavorite(global: GlobalState, sticker: ApiSticker) {\n const { stickers } = global.stickers.favorite;\n return stickers && stickers.some(({ id }) => id === sticker.id);\n}\n\nexport function selectCurrentStickerSearch(global: GlobalState) {\n return global.stickers.search;\n}\n\nexport function selectCurrentGifSearch(global: GlobalState) {\n return global.gifs.search;\n}\n\nexport function selectStickerSet(global: GlobalState, id: string) {\n return global.stickers.setsById[id];\n}\n\nexport function selectStickersForEmoji(global: GlobalState, emoji: string) {\n const stickerSets = Object.values(global.stickers.setsById);\n let stickersForEmoji: ApiSticker[] = [];\n stickerSets.forEach(({ packs }) => {\n if (!packs) {\n return;\n }\n const stickers = packs[emoji];\n if (stickers) {\n stickersForEmoji = stickersForEmoji.concat(stickers);\n }\n });\n return stickersForEmoji;\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n const cleanedEmoji = emoji.replace('\\ufe0f', '');\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport {\n ApiChat,\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_ID_BASE } from '../../config';\nimport {\n selectChat, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isChatPrivate,\n isForwardedMessage,\n getCanPostInChat,\n isUserRightBanned,\n getHasAdminRight,\n isChatBasicGroup,\n isCommonBoxChat,\n isServiceNotificationMessage,\n isOwnMessage,\n isActionMessage,\n isChatGroup,\n isChatSuperGroup,\n getMessageVideo,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\n\nconst MESSAGE_EDIT_ALLOWED_TIME_MS = 172800000; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (messageLists && messageLists.length) {\n return messageLists[messageLists.length - 1];\n }\n\n return undefined;\n}\n\nexport function selectCurrentChat(global: GlobalState) {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n return chatId ? selectChat(global, chatId) : undefined;\n}\n\nexport function selectChatMessages(global: GlobalState, chatId: number) {\n const messages = global.messages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: number) {\n const messages = global.scheduledMessages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectThreadParam(\n global: GlobalState,\n chatId: number,\n threadId: number,\n key: K,\n) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const thread = messageInfo.threadsById[threadId];\n if (!thread) {\n return undefined;\n }\n\n return thread[key];\n}\n\nexport function selectListedIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n switch (messageListType) {\n case 'thread':\n return selectViewportIds(global, chatId, threadId);\n case 'pinned':\n return selectPinnedIds(global, chatId);\n case 'scheduled':\n return selectScheduledIds(global, chatId);\n }\n\n return undefined;\n}\n\nexport function selectViewportIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectDraft(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return selectChat(global, chatId);\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return selectChat(global, threadInfo.originChannelId || chatId);\n}\n\nexport function selectThreadTopMessageId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return undefined;\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return threadInfo.topMessageId;\n}\n\nexport function selectThreadByMessage(global: GlobalState, chatId: number, message: ApiMessage) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const { replyToMessageId, replyToTopMessageId } = message;\n if (!replyToMessageId && !replyToTopMessageId) {\n return undefined;\n }\n\n return Object.values(messageInfo.threadsById).find((thread) => {\n return thread.threadInfo && (\n (replyToMessageId && replyToMessageId === thread.threadInfo.topMessageId)\n || (replyToTopMessageId && replyToTopMessageId === thread.threadInfo.topMessageId)\n );\n });\n}\n\nexport function isMessageInCurrentMessageList(global: GlobalState, chatId: number, message: ApiMessage) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return false;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n return (\n chatId === currentMessageList.chatId\n && (\n (currentMessageList.threadId === MAIN_THREAD_ID)\n || (threadInfo && currentMessageList.threadId === threadInfo.threadId)\n )\n );\n}\n\nexport function selectIsViewportNewest(global: GlobalState, chatId: number, threadId: number) {\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!viewportIds || !viewportIds.length) {\n return true;\n }\n\n let lastMessageId: number;\n\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return true;\n }\n\n lastMessageId = chat.lastMessage.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || !threadInfo.lastMessageId) {\n return undefined;\n }\n\n lastMessageId = threadInfo.lastMessageId;\n }\n\n // Edge case: outgoing `lastMessage` is updated with a delay to optimize animation\n if (lastMessageId >= LOCAL_MESSAGE_ID_BASE && !selectChatMessage(global, chatId, lastMessageId)) {\n return true;\n }\n\n return viewportIds[viewportIds.length - 1] >= lastMessageId;\n}\n\nexport function selectChatMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n if (messageListType === 'scheduled') {\n const messageId = selectEditingScheduledId(global, chatId);\n return messageId ? selectScheduledMessage(global, chatId, messageId) : undefined;\n } else {\n const messageId = selectEditingId(global, chatId, threadId);\n return messageId ? selectChatMessage(global, chatId, messageId) : undefined;\n }\n}\n\nexport function selectChatMessageByPollId(global: GlobalState, pollId: string) {\n let messageWithPoll: ApiMessage | undefined;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const chatMessages of Object.values(global.messages.byChatId)) {\n const { byId } = chatMessages;\n messageWithPoll = Object.values(byId).find((message) => {\n return message.content.poll && message.content.poll.id === pollId;\n });\n if (messageWithPoll) {\n break;\n }\n }\n\n return messageWithPoll;\n}\n\nexport function selectFocusedMessageId(global: GlobalState, chatId: number) {\n const { chatId: focusedChatId, messageId } = global.focusedMessage || {};\n\n return focusedChatId === chatId ? messageId : undefined;\n}\n\nexport function selectIsMessageFocused(global: GlobalState, message: ApiMessage) {\n const focusedId = selectFocusedMessageId(global, message.chatId);\n\n return focusedId ? focusedId === message.id || focusedId === message.previousLocalId : false;\n}\n\nexport function selectIsMessageUnread(global: GlobalState, message: ApiMessage) {\n const { lastReadOutboxMessageId } = selectChat(global, message.chatId) || {};\n return isMessageLocal(message) || !lastReadOutboxMessageId || lastReadOutboxMessageId < message.id;\n}\n\nexport function selectOutgoingStatus(\n global: GlobalState, message: ApiMessage, isScheduledList = false,\n): ApiMessageOutgoingStatus {\n if (!selectIsMessageUnread(global, message) && !isScheduledList) {\n return 'read';\n }\n\n return getSendingState(message);\n}\n\nexport function selectSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n return senderId > 0 ? selectUser(global, senderId) : selectChat(global, senderId);\n}\n\nexport function selectForwardedSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { forwardInfo } = message;\n if (!forwardInfo) {\n return undefined;\n }\n\n if (forwardInfo.isChannelPost && forwardInfo.fromChatId) {\n return selectChat(global, forwardInfo.fromChatId);\n } else if (forwardInfo.senderUserId) {\n return selectUser(global, forwardInfo.senderUserId);\n }\n\n return undefined;\n}\n\nexport function selectAllowedMessageActions(global: GlobalState, message: ApiMessage, threadId: number) {\n const chat = selectChat(global, message.chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n const isPrivate = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, message.chatId);\n const isBasicGroup = isChatBasicGroup(chat);\n const isSuperGroup = isChatSuperGroup(chat);\n const isChannel = isChatChannel(chat);\n const isServiceNotification = isServiceNotificationMessage(message);\n\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n const isMessageEditable = (\n (isChatWithSelf || Date.now() - message.date * 1000 < MESSAGE_EDIT_ALLOWED_TIME_MS)\n && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video && content.video.isRound)\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n );\n\n const canReply = getCanPostInChat(chat, threadId) && !isServiceNotification;\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isAction && hasPinPermission;\n let canUnpin = false;\n\n const pinnedMessageIds = selectPinnedIds(global, chat.id);\n\n if (canPin) {\n canUnpin = Boolean(pinnedMessageIds && pinnedMessageIds.includes(message.id));\n canPin = !canUnpin;\n }\n\n const canDelete = isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages');\n\n const canDeleteForAll = canDelete && !isServiceNotification && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages')\n ))\n );\n\n const canEdit = !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isAction && !isServiceNotification;\n\n const hasSticker = Boolean(message.content.sticker);\n const hasFavoriteSticker = hasSticker && selectIsStickerFavorite(global, message.content.sticker!);\n const canFaveSticker = !isAction && hasSticker && !hasFavoriteSticker;\n const canUnfaveSticker = !isAction && hasFavoriteSticker;\n const canCopy = !isAction;\n const canCopyLink = !isAction && (isChannel || isSuperGroup);\n const canSelect = !isAction;\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n };\n}\n\nexport function selectCanDeleteSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return {};\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return {\n canDelete: messageActions.every((actions) => actions.canDelete),\n canDeleteForAll: messageActions.every((actions) => actions.canDeleteForAll),\n };\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n const fileTransfer = global.fileUploads.byMessageLocalId[message.previousLocalId || message.id];\n\n return fileTransfer ? fileTransfer.progress : undefined;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n // `lastReadInboxMessageId` is empty for new chats\n if (!chat.lastReadInboxMessageId) {\n return undefined;\n }\n\n if (!chat.lastMessage) {\n return chat.lastReadInboxMessageId;\n }\n\n if (isMessageLocal(chat.lastMessage)) {\n return chat.lastMessage.id;\n }\n\n // Some previously read messages may be deleted\n return Math.min(chat.lastMessage.id, chat.lastReadInboxMessageId);\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n if (!threadInfo.lastReadInboxMessageId) {\n return threadInfo.topMessageId;\n }\n\n // Some previously read messages may be deleted\n return Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId || Infinity);\n }\n}\n\nexport function selectFirstUnreadId(global: GlobalState, chatId: number, threadId: number) {\n const chat = selectChat(global, chatId);\n\n if (threadId === MAIN_THREAD_ID) {\n if (!chat) {\n return undefined;\n }\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || threadInfo.lastMessageId === threadInfo.lastReadInboxMessageId) {\n return undefined;\n }\n }\n\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const byId = selectChatMessages(global, chatId);\n if (!byId || !(outlyingIds || listedIds)) {\n return undefined;\n }\n\n const lastReadId = selectRealLastReadId(global, chatId, threadId);\n if (!lastReadId && chat && chat.isNotJoined) {\n return undefined;\n }\n\n if (outlyingIds) {\n const found = !lastReadId ? outlyingIds[0] : outlyingIds.find((id) => {\n return id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled);\n });\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = !lastReadId ? listedIds[0] : listedIds.find((id) => {\n return id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled);\n });\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nexport function selectIsPollResultsOpen(global: GlobalState) {\n const { pollResults } = global;\n return Boolean(pollResults.messageId);\n}\n\nexport function selectIsForwardModalOpen(global: GlobalState) {\n const { forwardMessages } = global;\n return Boolean(forwardMessages.isModalShown);\n}\n\nexport function selectCommonBoxChatId(global: GlobalState, messageId: number) {\n const fromLastMessage = Object.values(global.chats.byId).find((chat) => (\n isCommonBoxChat(chat) && chat.lastMessage && chat.lastMessage.id === messageId\n ));\n if (fromLastMessage) {\n return fromLastMessage.id;\n }\n\n const { byChatId } = global.messages;\n return Number(Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, Number(chatId));\n return chat && isCommonBoxChat(chat) && byChatId[chat.id].byId[messageId];\n }));\n}\n\nexport function selectIsInSelectMode(global: GlobalState) {\n const { selectedMessages } = global;\n\n return Boolean(selectedMessages);\n}\n\nexport function selectIsMessageSelected(global: GlobalState, messageId: number) {\n const { messageIds } = global.selectedMessages || {};\n if (!messageIds) {\n return false;\n }\n\n return messageIds.includes(messageId);\n}\n\nexport function selectForwardedMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.values(chatMessages)\n .filter((message) => message.groupedId === groupedId && message.forwardInfo)\n .map(({ forwardInfo }) => forwardInfo!.fromMessageId);\n}\n\nexport function selectMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.keys(chatMessages)\n .map(Number)\n .filter((id) => chatMessages[id].groupedId === groupedId);\n}\n\nexport function selectIsDocumentGroupSelected(global: GlobalState, chatId: number, groupedId: string) {\n const { messageIds: selectedIds } = global.selectedMessages || {};\n if (!selectedIds) {\n return false;\n }\n\n const groupIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n return groupIds && groupIds.every((id) => selectedIds.includes(id));\n}\n\nexport function selectSelectedMessagesCount(global: GlobalState) {\n const { messageIds } = global.selectedMessages || {};\n\n return messageIds ? messageIds.length : 0;\n}\n\nexport function selectNewestMessageWithBotKeyboardButtons(\n global: GlobalState, chatId: number,\n): ApiMessage | undefined {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (!selectIsChatWithBot(global, chat)) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, MAIN_THREAD_ID);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const messageId = findLast(viewportIds, (id) => {\n return !chatMessages[id].isOutgoing && Boolean(chatMessages[id].keyboardButtons);\n });\n\n const replyHideMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id].shouldHideKeyboardButtons);\n });\n\n if (messageId && replyHideMessageId && replyHideMessageId > messageId) {\n return undefined;\n }\n\n return messageId ? chatMessages[messageId] : undefined;\n}\n\nexport function selectShouldAutoLoadMedia(\n global: GlobalState, message: ApiMessage, chat: ApiChat, sender?: ApiChat | ApiUser,\n) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n } = global.settings.byKey;\n\n return Boolean(\n (shouldAutoDownloadMediaInPrivateChats && isChatPrivate(chat.id))\n || (shouldAutoDownloadMediaInGroups && isChatGroup(chat))\n || (shouldAutoDownloadMediaInChannels && isChatChannel(chat))\n || (shouldAutoDownloadMediaFromContacts && sender && (\n sender.id === global.currentUserId\n || selectIsUserOrChatContact(global, sender)\n )),\n );\n}\n\nexport function selectShouldAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (shouldAutoPlayVideos && !asGif) || (shouldAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n","import { GlobalState } from '../../global/types';\nimport { selectCurrentMessageList } from './messages';\nimport { buildChatThreadKey } from '../helpers';\n\nexport function selectCurrentTextSearch(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const currentSearch = global.localTextSearch.byChatThreadKey[chatThreadKey];\n if (!currentSearch || !currentSearch.isActive) {\n return undefined;\n }\n\n return currentSearch;\n}\n\nexport function selectCurrentMediaSearchPeerId(global: GlobalState) {\n const { byChatId } = global.localMediaSearch;\n const { chatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = global.users.selectedId;\n\n return currentProfileUserId && byChatId[currentProfileUserId] ? currentProfileUserId : chatId;\n}\n\nexport function selectCurrentMediaSearch(global: GlobalState) {\n const peerId = selectCurrentMediaSearchPeerId(global);\n if (!peerId) {\n return undefined;\n }\n\n return global.localMediaSearch.byChatId[peerId];\n}\n","import { GlobalState } from '../../global/types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\nimport { isChatGroup, isChatPrivate } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: number) {\n return global.management.byChatId[chatId];\n}\n\nexport function selectCurrentManagement(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const currentManagement = global.management.byChatId[chatId];\n if (!currentManagement || !currentManagement.isActive) {\n return undefined;\n }\n\n return currentManagement;\n}\n\nexport function selectCurrentManagementType(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n if (isChatPrivate(chatId)) {\n return 'user';\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (isChatGroup(chat)) {\n return 'group';\n }\n\n return 'channel';\n}\n","import { GlobalState } from '../../global/types';\nimport { RightColumnContent } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { selectCurrentMessageList, selectIsPollResultsOpen } from './messages';\nimport { selectCurrentTextSearch } from './localSearch';\nimport { selectCurrentStickerSearch, selectCurrentGifSearch } from './symbols';\nimport { selectAreActiveChatsLoaded } from './chats';\nimport { selectCurrentManagement } from './management';\n\nexport function selectIsMediaViewerOpen(global: GlobalState) {\n const { mediaViewer } = global;\n return Boolean(mediaViewer.messageId || mediaViewer.avatarOwnerId);\n}\n\nexport function selectRightColumnContentKey(global: GlobalState) {\n const {\n users,\n isChatInfoShown,\n } = global;\n\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_MOBILE_SCREEN && selectCurrentTextSearch(global));\n const isManagement = selectCurrentManagement(global);\n const stickerSearch = selectCurrentStickerSearch(global);\n const isStickerSearch = stickerSearch.query !== undefined;\n const gifSearch = selectCurrentGifSearch(global);\n const isGifSearch = gifSearch.query !== undefined;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = users.selectedId;\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n const isUserInfo = Boolean(currentProfileUserId && areActiveChatsLoaded);\n const isChatShown = Boolean(currentChatId && areActiveChatsLoaded);\n const isChatInfo = isChatShown && isChatInfoShown;\n\n return isPollResults ? (\n RightColumnContent.PollResults\n ) : isSearch ? (\n RightColumnContent.Search\n ) : isManagement ? (\n RightColumnContent.Management\n ) : isStickerSearch ? (\n RightColumnContent.StickerSearch\n ) : isGifSearch ? (\n RightColumnContent.GifSearch\n ) : isUserInfo ? (\n RightColumnContent.UserInfo\n ) : isChatInfo ? (\n RightColumnContent.ChatInfo\n ) : undefined;\n}\n\nexport function selectIsRightColumnShown(global: GlobalState) {\n return selectRightColumnContentKey(global) !== undefined;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","\nimport { GlobalState } from '../../global/types';\n\nexport function selectPaymentMessageId(global: GlobalState) {\n return global.payment.messageId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectProviderPublishableKey(global: GlobalState) {\n return global.payment.nativeParams ? global.payment.nativeParams.publishableKey : undefined;\n}\n\nexport function selectStripeCredentials(global: GlobalState) {\n return global.payment.stripeCredentials;\n}\n","type Parts = (string | false | undefined)[];\n\nexport default (...parts: Parts) => {\n return parts.filter(Boolean).join(' ');\n};\n","import {\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n} from '../config';\n\nexport function getPlatform() {\n const { userAgent, platform } = window.navigator;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os: 'Mac OS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'Mac OS';\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = 'iOS';\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = 'Windows';\n } else if (/Android/.test(userAgent)) {\n os = 'Android';\n } else if (/Linux/.test(platform)) {\n os = 'Linux';\n }\n\n return os;\n}\n\nexport const PLATFORM_ENV = getPlatform();\nexport const IS_MAC_OS = PLATFORM_ENV === 'Mac OS';\nexport const IS_IOS = PLATFORM_ENV === 'iOS';\nexport const IS_ANDROID = PLATFORM_ENV === 'Android';\nexport const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_MOBILE_SCREEN = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = (navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n));\nexport const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style;\nexport const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS);\nexport const IS_SERVICE_WORKER_SUPPORTED = 'serviceWorker' in navigator;\n// TODO Consider failed service worker\nexport const IS_PROGRESSIVE_SUPPORTED = IS_SERVICE_WORKER_SUPPORTED;\nexport const IS_STREAMING_SUPPORTED = 'MediaSource' in window;\nexport const IS_OPUS_SUPPORTED = Boolean((new Audio()).canPlayType('audio/ogg; codecs=opus'));\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\n\nlet isWebpSupportedCache: boolean | undefined;\n\nexport function isWebpSupported() {\n return Boolean(isWebpSupportedCache);\n}\n\nfunction testWebp(): Promise {\n return new Promise((resolve) => {\n const webp = new Image();\n // eslint-disable-next-line max-len\n webp.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n const handleLoadOrError = () => {\n resolve(webp.height === 2);\n };\n webp.onload = handleLoadOrError;\n webp.onerror = handleLoadOrError;\n });\n}\n\ntestWebp().then((hasWebp) => {\n isWebpSupportedCache = hasWebp;\n});\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd\n | typeof runNow;\n\nexport function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n // @ts-ignore\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf(fn: F) {\n return throttleWith(fastPrimaryRaf, fn);\n}\n\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nexport function onIdle(cb: NoneToVoidFunction) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb);\n } else {\n onTickEnd(cb);\n }\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n}\n\nexport const pause = (ms: number) => new Promise((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise((resolve) => {\n fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastPrimaryRaf(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n","import Worker from 'worker-loader!./worker';\n\nimport { ApiOnProgress, OnApiUpdate } from '../../types';\nimport { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport { WorkerMessageEvent, ThenArg, OriginRequest } from './types';\n\nimport { DEBUG } from '../../../config';\nimport generateIdFor from '../../../util/generateIdFor';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nlet worker: Worker;\nconst requestStates = new Map();\nconst requestStatesByCallback = new Map();\n\n// TODO Re-use `util/WorkerConnector.ts`\n\nexport function initApi(onUpdate: OnApiUpdate, sessionId = '') {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD WORKER');\n }\n\n worker = new Worker();\n subscribeToWorker(onUpdate);\n }\n\n return makeRequest({\n type: 'initApi',\n args: [sessionId],\n });\n}\n\nexport function callApi(fnName: T, ...args: MethodArgs) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('API is not initialized');\n }\n\n return undefined;\n }\n\n return makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n }) as MethodResponse;\n}\n\nexport function cancelApiProgress(progressCallback: ApiOnProgress) {\n progressCallback.isCanceled = true;\n\n const { messageId } = requestStatesByCallback.get(progressCallback) || {};\n if (!messageId) {\n return;\n }\n\n worker.postMessage({\n type: 'cancelProgress',\n messageId,\n });\n}\n\nfunction subscribeToWorker(onUpdate: OnApiUpdate) {\n worker.addEventListener('message', ({ data }: WorkerMessageEvent) => {\n if (data.type === 'update') {\n onUpdate(data.update);\n } else if (data.type === 'methodResponse') {\n const requestState = requestStates.get(data.messageId);\n if (requestState) {\n if (data.error) {\n requestState.reject(data.error);\n } else {\n requestState.resolve(data.response);\n }\n }\n } else if (data.type === 'methodCallback') {\n const requestState = requestStates.get(data.messageId);\n if (requestState && requestState.callback) {\n requestState.callback(...data.callbackArgs);\n }\n } else if (data.type === 'unhandledError') {\n throw data.error;\n }\n });\n}\n\nfunction makeRequest(message: OriginRequest) {\n const messageId = generateIdFor(requestStates);\n const payload: OriginRequest = {\n messageId,\n ...message,\n };\n\n const requestState = { messageId } as RequestStates;\n\n // Re-wrap type because of `postMessage`\n const promise: Promise>> = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if (typeof payload.args[1] === 'function') {\n const callback = payload.args.pop() as AnyToVoidFunction;\n requestState.callback = callback;\n requestStatesByCallback.set(callback, requestState);\n }\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n\n if (requestState.callback) {\n requestStatesByCallback.delete(requestState.callback);\n }\n });\n\n worker.postMessage(payload);\n\n return promise;\n}\n","export default __webpack_public_path__ + \"en-extra.e73049da90714ecdae3233e8ffa74d39.json\";","export default __webpack_public_path__ + \"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json\";","export default __webpack_public_path__ + \"it-extra.78e5568451a888818c7e2209e05a9602.json\";","export default __webpack_public_path__ + \"pl-extra.38fd67a6c26e58f5c912568332c7c074.json\";","export default __webpack_public_path__ + \"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json\";","import { ApiLangPack } from '../api/types';\n\nimport { DEBUG, LANG_CACHE_NAME, LANG_PACKS } from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { mapValues } from './iteratees';\n\nimport enExtraJson from '../assets/lang/en-extra.json';\nimport esExtraJson from '../assets/lang/es-extra.json';\nimport itExtraJson from '../assets/lang/it-extra.json';\nimport plExtraJson from '../assets/lang/pl-extra.json';\nimport ruExtraJson from '../assets/lang/ru-extra.json';\nimport { formatInteger } from './textFormat';\n\nconst EXTRA_PACK_PATHS: Record = {\n en: enExtraJson as unknown as string,\n es: esExtraJson as unknown as string,\n it: itExtraJson as unknown as string,\n pl: plExtraJson as unknown as string,\n ru: ruExtraJson as unknown as string,\n};\n\nconst PLURAL_OPTIONS = ['value', 'zeroValue', 'oneValue', 'twoValue', 'fewValue', 'manyValue', 'otherValue'] as const;\nconst PLURAL_RULES = {\n /* eslint-disable max-len */\n en: (n: number) => (n !== 1 ? 6 : 2),\n ar: (n: number) => (n === 0 ? 1 : n === 1 ? 2 : n === 2 ? 3 : n % 100 >= 3 && n % 100 <= 10 ? 4 : n % 100 >= 11 ? 5 : 6),\n ca: (n: number) => (n !== 1 ? 6 : 2),\n de: (n: number) => (n !== 1 ? 6 : 2),\n es: (n: number) => (n !== 1 ? 6 : 2),\n fa: (n: number) => (n > 1 ? 6 : 2),\n fr: (n: number) => (n > 1 ? 6 : 2),\n id: () => 0,\n it: (n: number) => (n !== 1 ? 6 : 2),\n ko: () => 0,\n ms: () => 0,\n nl: (n: number) => (n !== 1 ? 6 : 2),\n pl: (n: number) => (n === 1 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n pt_BR: (n: number) => (n > 1 ? 6 : 2),\n ru: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n tr: (n: number) => (n > 1 ? 6 : 2),\n uk: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n uz: (n: number) => (n > 1 ? 6 : 2),\n /* eslint-enable max-len */\n};\n\nconst cache = new Map();\n\nlet langPack: ApiLangPack;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\n\nexport async function setLanguage(langCode: string, callback?: NoneToVoidFunction) {\n if (langPack && langCode === currentLangCode) {\n document.documentElement.lang = langCode;\n if (callback) {\n callback();\n }\n\n return;\n }\n\n const newLangPack = await fetchFromCacheOrRemote(langCode);\n if (!newLangPack) {\n return;\n }\n\n if (EXTRA_PACK_PATHS[langCode]) {\n try {\n const response = await fetch(EXTRA_PACK_PATHS[langCode]);\n const pairs = await response.json();\n const extraLangPack = mapValues(pairs, (value, key) => ({ key, value }));\n\n Object.assign(newLangPack, extraLangPack);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n if (callback) {\n callback();\n }\n\n runCallbacks(langPack);\n}\n\nexport function getTranslation(key: string, value?: any, format?: 'i') {\n if (value !== undefined) {\n const cached = cache.get(`${key}_${value}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack) {\n return key;\n }\n\n const langString = langPack[key];\n if (!langString) {\n return key;\n }\n\n const template = langString[typeof value === 'number' ? getPluralOption(value) : 'value'];\n if (!template || !template.trim()) {\n const parts = key.split('.');\n\n return parts[parts.length - 1];\n }\n\n if (value !== undefined) {\n const formattedValue = format === 'i' ? formatInteger(value) : value;\n const result = processTemplate(template, formattedValue);\n cache.set(`${key}_${value}_${format}`, result);\n return result;\n }\n\n return template;\n}\n\nasync function fetchFromCacheOrRemote(langCode: string): Promise {\n const cached = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (cached) {\n return cached;\n }\n\n const remote = await callApi('fetchLangPack', { sourceLangPacks: LANG_PACKS, langCode });\n if (remote) {\n await cacheApi.save(LANG_CACHE_NAME, langCode, remote.langPack);\n return remote.langPack;\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const optionIndex = currentLangCode && PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n return template.replace(/%\\d?\\$?[sdf@]/, String(value));\n}\n","export function createCallbackManager() {\n const callbacks: AnyToVoidFunction[] = [];\n\n function addCallback(cb: AnyToVoidFunction) {\n callbacks.push(cb);\n\n return () => {\n removeCallback(cb);\n };\n }\n\n function removeCallback(cb: AnyToVoidFunction) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n\n function runCallbacks(...args: any[]) {\n callbacks.forEach((callback) => {\n callback(...args);\n });\n }\n\n return {\n runCallbacks,\n addCallback,\n removeCallback,\n };\n}\n","import { DEBUG } from '../config';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra\n}\n\ninterface ImportedBundles {\n [Bundles.Auth]: typeof import('../bundles/auth');\n [Bundles.Main]: typeof import('../bundles/main');\n [Bundles.Extra]: typeof import('../bundles/extra');\n}\n\ntype BundlePromises = {\n [K in keyof ImportedBundles]: Promise\n};\n\nexport type BundleModules = keyof ImportedBundles[B];\n\nconst LOAD_PROMISES: Partial = {};\nconst MEMORY_CACHE: Partial = {};\n\nexport async function loadModule>(bundleName: B, moduleName: M) {\n if (!LOAD_PROMISES[bundleName]) {\n switch (bundleName) {\n case Bundles.Auth:\n LOAD_PROMISES[Bundles.Auth] = import('../bundles/auth');\n break;\n case Bundles.Main:\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD MAIN BUNDLE');\n }\n\n LOAD_PROMISES[Bundles.Main] = import('../bundles/main');\n break;\n case Bundles.Extra:\n LOAD_PROMISES[Bundles.Extra] = import('../bundles/extra');\n break;\n }\n\n (LOAD_PROMISES[bundleName] as Promise).then(handleBundleLoad);\n }\n\n const bundle = (await LOAD_PROMISES[bundleName]) as unknown as ImportedBundles[B];\n\n if (!MEMORY_CACHE[bundleName]) {\n MEMORY_CACHE[bundleName] = bundle;\n }\n\n return getModuleFromMemory(bundleName, moduleName);\n}\n\nexport function getModuleFromMemory>(bundleName: B, moduleName: M) {\n const bundle = MEMORY_CACHE[bundleName] as ImportedBundles[B];\n\n if (!bundle) {\n return undefined;\n }\n\n return bundle[moduleName];\n}\n\nconst listeners: NoneToVoidFunction[] = [];\n\nexport function addLoadListener(listener: NoneToVoidFunction) {\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n}\n\nfunction handleBundleLoad() {\n listeners.forEach((listener) => {\n listener();\n });\n}\n","// eslint-disable-next-line no-restricted-globals\nconst cacheApi = self.caches;\n\nexport enum Type {\n Text,\n Blob,\n Json,\n}\n\nexport async function fetch(cacheName: string, key: string, type: Type) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const request = new Request(key);\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n switch (type) {\n case Type.Text:\n return await response.text();\n case Type.Blob: {\n const blob = await response.blob();\n\n // Safari does not return correct Content-Type header for webp images.\n if (key.substr(0, 7) === 'sticker') {\n return new Blob([blob], { type: 'image/webp' });\n }\n\n // iOS Safari fails to preserve `type` in cache\n if (!blob.type) {\n const contentType = response.headers.get('Content-Type');\n if (contentType) {\n return new Blob([blob], { type: contentType });\n }\n }\n\n return blob;\n }\n case Type.Json:\n return await response.json();\n default:\n return undefined;\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function save(cacheName: string, key: string, data: AnyLiteral | Blob | string) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data);\n const request = new Request(key);\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return await cache.put(request, response);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function clear(cacheName: string) {\n try {\n if (!cacheApi) {\n return undefined;\n }\n\n return await cacheApi.delete(cacheName);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n","import { pause } from './schedulers';\n\n// Polyfill for Safari: `File` is not available in web worker\nif (typeof File === 'undefined') {\n // eslint-disable-next-line no-global-assign, no-restricted-globals, func-names\n self.File = class extends Blob {\n name: string;\n\n constructor(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag) {\n if (options) {\n const { type, ...rest } = options;\n super(fileBits, { type });\n Object.assign(this, rest);\n } else {\n super(fileBits);\n }\n\n this.name = fileName;\n }\n } as typeof File;\n}\n\nexport function dataUriToBlob(dataUri: string) {\n const arr = dataUri.split(',');\n const mime = arr[0].match(/:(.*?);/)![1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\nexport function blobToDataUri(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent) => {\n const { result } = e.target || {};\n if (typeof result === 'string') {\n resolve(result);\n }\n\n reject(new Error('Failed to read blob'));\n };\n\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n lastModified: Date.now(),\n type: blob.type,\n });\n}\n\nexport function preloadImage(url: string): Promise {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function preloadVideo(url: string): Promise {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video');\n video.volume = 0;\n video.onloadedmetadata = () => resolve(video);\n video.onerror = reject;\n video.src = url;\n });\n}\n\nexport async function createPosterForVideo(url: string): Promise {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n new Promise((resolve, reject) => {\n video.onseeked = () => {\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, 0, 0);\n resolve(canvas.toDataURL('image/jpeg'));\n };\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n }),\n ]);\n}\n\nexport async function fetchBlob(blobUrl: string) {\n const response = await fetch(blobUrl);\n return response.blob();\n}\n\nexport async function fetchFile(blobUrl: string, fileName: string) {\n const blob = await fetchBlob(blobUrl);\n return blobToFile(blob, fileName);\n}\n\nexport function imgToCanvas(img: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n\n return canvas;\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version 09.05.2020\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nexport function removeVS16s(rawEmoji) {\n return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji;\n}\n\n// This file is generated by source/emoji/scripts/generate.sh\n// eslint-disable-next-line max-len\nexport default /(?:\\u2624|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d])|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f|\\u2696\\ufe0f|\\u2708\\ufe0f|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)((?:\\ud83c[\\udffb-\\udfff]|\\ufe0f)\\u200d[\\u2640\\u2642]\\ufe0f)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f\\u200d\\u26a7\\ufe0f|\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08|\\ud83c\\udff4\\u200d\\u2620\\ufe0f|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f|\\ud83e\\uddde\\u200d\\u2640\\ufe0f|\\ud83e\\uddde\\u200d\\u2642\\ufe0f|\\ud83e\\udddf\\u200d\\u2640\\ufe0f|\\ud83e\\udddf\\u200d\\u2642\\ufe0f|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport Spinner from './Spinner';\n\nimport './Loading.scss';\n\ntype OwnProps = {\n color?: 'blue' | 'white' | 'black';\n};\n\nconst Loading: FC = ({ color = 'blue' }) => {\n return (\n

\n \n
\n );\n};\n\nexport default memo(Loading);\n","import { useEffect } from '../lib/teact/teact';\n\nimport {\n BundleModules, Bundles, getModuleFromMemory, loadModule, addLoadListener,\n} from '../util/moduleLoader';\n\nimport useForceUpdate from './useForceUpdate';\n\nexport default >(\n bundleName: B, moduleName: M, noLoad = false, autoUpdate = false,\n) => {\n const module = getModuleFromMemory(bundleName, moduleName);\n const forceUpdate = useForceUpdate();\n\n if (autoUpdate) {\n // Use effect and cleanup for listener removal\n addLoadListener(forceUpdate);\n }\n\n useEffect(() => {\n if (!noLoad && !module) {\n loadModule(bundleName, moduleName).then(forceUpdate);\n }\n }, [bundleName, forceUpdate, module, moduleName, noLoad]);\n\n return module;\n};\n","// This data was received from Telegram Desktop (Telegram/Resources/numbers.txt)\nconst DATA = `AF🇦🇫93Afghanistan333\nAO🇦🇴244Angola333\nAL🇦🇱355Albania234\nAD🇦🇩376Andorra222\nAE🇦🇪971United Arab Emirates234\nAI🇦🇮1264Anguilla34\nAR🇦🇷54Argentina\nAM🇦🇲374Armenia233\nAG🇦🇬1268Antigua and Barbuda34\nAU🇦🇺61Australia333\nAS🇦🇸1684American Samoa34\nAT🇦🇹43Austria\nAW🇦🇼297Aruba34\nAZ🇦🇿994Azerbaijan2322\nBI🇧🇮257Burundi224\nBE🇧🇪32Belgium3222\nBJ🇧🇯229Benin233\nBF🇧🇫226Burkina Faso2222\nBD🇧🇩880Bangladesh\nBG🇧🇬359Bulgaria\nBH🇧🇭973Bahrain44\nBS🇧🇸1242Bahamas34\nBA🇧🇦387Bosnia and Herzegovina\nBY🇧🇾375Belarus2322\nBZ🇧🇿501Belize\nBO🇧🇴591Bolivia134\nBR🇧🇷55Brazil254\nBB🇧🇧1246Barbados34\nBM🇧🇲1441Bermuda34\nBN🇧🇳673Brunei34\nBQ🇧🇶599Bonaire, Sint Eustatius and Saba\nBT🇧🇹975Bhutan\nBW🇧🇼267Botswana233\nCF🇨🇫236Central African Republic2222\nCA🇨🇦1Canada334\nCH🇨🇭41Switzerland234\nCK🇨🇰682Cook Islands\nCL🇨🇱56Chile144\nCN🇨🇳86China344\nCI🇨🇮225Côte d\\`Ivoire233\nCM🇨🇲237Cameroon44\nCD🇨🇩243DR Congo234\nCG🇨🇬242Republic of the Congo234\nCO🇨🇴57Colombia334\nKM🇰🇲269Comoros34\nCV🇨🇻238Cape Verde34\nCR🇨🇷506Costa Rica\nCU🇨🇺53Cuba44\nCY🇨🇾357Cyprus44\nCW🇨🇼599Curaçao\nCZ🇨🇿420Czech Republic\nDE🇩🇪49Germany38\nDJ🇩🇯253Djibouti2222\nDM🇩🇲1767Dominica34\nDK🇩🇰45Denmark44\nDO🇩🇴1Dominican Republic334\nDZ🇩🇿213Algeria3222\nEC🇪🇨593Ecuador\nEG🇪🇬20Egypt234\nER🇪🇷291Eritrea133\nES🇪🇸34Spain333\nEE🇪🇪372Estonia\nET🇪🇹251Ethiopia234\nFI🇫🇮358Finland\nFJ🇫🇯679Fiji\nFK🇫🇰500Falkland Islands\nFM🇫🇲691Micronesia\nFO🇫🇴298Faroe Islands33\nFR🇫🇷33France12222\nGA🇬🇦241Gabon1222\nGB🇬🇧44United Kingdom46\nGE🇬🇪995Georgia\nGF🇬🇫594French Guiana\nGH🇬🇭233Ghana\nGI🇬🇮350Gibraltar44\nGL🇬🇱299Greenland33\nGN🇬🇳224Guinea333\nGM🇬🇲220Gambia34\nGP🇬🇵590Guadeloupe\nGU🇬🇺1671Guam34\nGW🇬🇼245Guinea-Bissau34\nGQ🇬🇶240Equatorial Guinea333\nGR🇬🇷30Greece244\nGD🇬🇩1473Grenada34\nGT🇬🇹502Guatemala134\nGY🇬🇾592Guyana\nHK🇭🇰852Hong Kong\nHN🇭🇳504Honduras44\nHR🇭🇷385Croatia\nHT🇭🇹509Haiti\nHU🇭🇺36Hungary234\nID🇮🇩62Indonesia\nIN🇮🇳91India55\nIO🇩🇬246Diego Garcia34\nIE🇮🇪353Ireland234\nIR🇮🇷98Iran334\nIQ🇮🇶964Iraq334\nIS🇮🇸354Iceland34\nIL🇮🇱972Israel234\nIT🇮🇹39Italy334\nJM🇯🇲1876Jamaica34\nJO🇯🇴962Jordan144\nJP🇯🇵81Japan244\nKZ🇰🇿7Kazakhstan3322\nKE🇰🇪254Kenya333\nKG🇰🇬996Kyrgyzstan\nKH🇰🇭855Cambodia\nKI🇰🇮686Kiribati\nKN🇰🇳1869Saint Kitts and Nevis34\nKR🇰🇷82South Korea\nKW🇰🇼965Kuwait44\nKY🇰🇾1345Cayman Islands34\nLA🇱🇦856Laos\nLB🇱🇧961Lebanon\nLR🇱🇷231Liberia\nLY🇱🇾218Libya234\nLC🇱🇨1758Saint Lucia34\nLI🇱🇮423Liechtenstein\nLK🇱🇰94Sri Lanka234\nLS🇱🇸266Lesotho233\nLT🇱🇹370Lithuania35\nLU🇱🇺352Luxembourg\nLV🇱🇻371Latvia35\nMA🇲🇦212Morocco234\nMC🇲🇨377Monaco44\nMD🇲🇩373Moldova233\nMG🇲🇬261Madagascar2232\nMP🇲🇵1670Northern Mariana Islands34\nMO🇲🇴853Macau\nMS🇲🇸1664Montserrat34\nMV🇲🇻960Maldives\nMX🇲🇽52Mexico\nMH🇲🇭692Marshall Islands\nMK🇲🇰389Macedonia\nML🇲🇱223Mali44\nMT🇲🇹356Malta2222\nMM🇲🇲95Myanmar\nME🇲🇪382Montenegro\nMN🇲🇳976Mongolia\nMZ🇲🇿258Mozambique234\nMQ🇲🇶596Martinique\nMR🇲🇷222Mauritania44\nMU🇲🇺230Mauritius\nMW🇲🇼265Malawi\nMY🇲🇾60Malaysia\nNA🇳🇦264Namibia234\nNC🇳🇨687New Caledonia\nNE🇳🇪227Niger2222\nNF🇳🇫672Norfolk Island\nNG🇳🇬234Nigeria\nNI🇳🇮505Nicaragua44\nNL🇳🇱31Netherlands12222\nNO🇳🇴47Norway44\nNP🇳🇵977Nepal\nNU🇳🇺683Niue\nNR🇳🇷674Nauru\nNZ🇳🇿64New Zealand\nOM🇴🇲968Oman44\nPK🇵🇰92Pakistan334\nPA🇵🇦507Panama44\nPE🇵🇪51Peru333\nPF🇵🇫689French Polynesia\nPH🇵🇭63Philippines334\nPM🇵🇲508Saint Pierre and Miquelon\nPR🇵🇷1Puerto Rico334\nPS🇵🇸970Palestine324\nPW🇵🇼680Palau\nPG🇵🇬675Papua New Guinea\nPL🇵🇱48Poland333\nKP🇰🇵850North Korea\nPT🇵🇹351Portugal144\nPY🇵🇾595Paraguay333\nQA🇶🇦974Qatar\nRE🇷🇪262Réunion333\nRO🇷🇴40Romania333\nRU🇷🇺7Russia3322\nRW🇷🇼250Rwanda333\nSA🇸🇦966Saudi Arabia\nSD🇸🇩249Sudan234\nSN🇸🇳221Senegal234\nSG🇸🇬65Singapore44\nSH🇸🇭290Saint Helena23\nSH🇸🇭247Saint Helena4\nSB🇸🇧677Solomon Islands\nSL🇸🇱232Sierra Leone233\nSV🇸🇻503El Salvador44\nSM🇸🇲378San Marino334\nSO🇸🇴252Somalia233\nRS🇷🇸381Serbia234\nSS🇸🇸211South Sudan234\nST🇸🇹239São Tomé and Príncipe25\nSR🇸🇷597Suriname34\nSK🇸🇰421Slovakia\nSI🇸🇮386Slovenia\nSE🇸🇪46Sweden234\nSZ🇸🇿268Swaziland44\nSC🇸🇨248Seychelles1222\nSX🇸🇽1721Sint Maarten34\nSY🇸🇾963Syria\nTC🇹🇨1649Turks and Caicos Islands34\nTD🇹🇩235Chad2222\nTG🇹🇬228Togo233\nTH🇹🇭66Thailand144\nTJ🇹🇯992Tajikistan\nTK🇹🇰690Tokelau\nTM🇹🇲993Turkmenistan26\nTL🇹🇱670Timor-Leste\nTO🇹🇴676Tonga\nTT🇹🇹1868Trinidad and Tobago34\nTN🇹🇳216Tunisia233\nTR🇹🇷90Turkey334\nTV🇹🇻688Tuvalu\nTW🇹🇼886Taiwan\nTZ🇹🇿255Tanzania234\nUG🇺🇬256Uganda234\nUA🇺🇦380Ukraine2322\nUY🇺🇾598Uruguay44\nUS🇺🇸1United States334\nUZ🇺🇿998Uzbekistan27\nVA🇻🇦3Vatican City\nVC🇻🇨1784Saint Vincent and the Grenadines34\nVE🇻🇪58Venezuela334\nVG🇻🇬1284British Virgin Islands34\nVI🇻🇮1340US Virgin Islands34\nVN🇻🇳84Vietnam\nVU🇻🇺678Vanuatu\nWF🇼🇫681Wallis and Futuna\nWS🇼🇸685Samoa\nXK🇽🇰383Kosovo44\nYE🇾🇪967Yemen333\nZA🇿🇦27South Africa234\nZM🇿🇲260Zambia234\nZW🇿🇼263Zimbabwe234`;\n\nconst formatsCache: Record = {};\nexport const defaultPhoneNumberFormat = /(\\d{1,3})(\\d{1,3})?(\\d{1,3})?(\\d{1,3})?(\\d{1,3})?/;\n\nconst parsed = DATA\n .split('\\n')\n .map((str) => {\n const id = str.substr(0, 2);\n const flag = str.substr(2, 4);\n const code = `+${str.match(/\\d+/)![0]}`;\n const name = str.split(/\\d+/)[1];\n const format = str.match(/\\d+$/);\n const phoneFormat = getPhoneNumberFormat(format);\n\n return {\n id, flag, code, name, phoneFormat,\n };\n });\n\nfunction getPhoneNumberFormat(format: RegExpMatchArray | null) {\n if (!format) {\n return defaultPhoneNumberFormat;\n }\n\n const formatValue = format[0] as string;\n let phoneNumberFormat;\n\n if (!formatsCache[formatValue]) {\n const phoneNumberGroups = formatValue.split('').map(Number);\n phoneNumberFormat = phoneNumberGroups.reduce((result, count, i) => {\n return `${result}(\\\\d{1,${count}})${i > 0 ? '?' : ''}`;\n }, '');\n formatsCache[formatValue] = new RegExp(`${phoneNumberFormat}${'()?'.repeat(5 - phoneNumberGroups.length)}`);\n }\n\n return formatsCache[formatValue];\n}\n\nexport default parsed;\n","import countryList, { defaultPhoneNumberFormat } from './countries';\n\nexport function getCountryById(id: string) {\n return countryList.find((c) => c.id === id) as Country;\n}\n\n// Empty groups are used to preserve 5 callback arguments for `replace` method\nfunction getPhoneNumberFormat(country?: Country) {\n return country ? country.phoneFormat : defaultPhoneNumberFormat;\n}\n\nexport function getCountryFromPhoneNumber(input: string) {\n let phoneNumber = input.replace(/[^\\d+]+/g, '');\n if (!phoneNumber.startsWith('+')) {\n phoneNumber = `+${phoneNumber}`;\n }\n\n const possibleCountries = countryList\n .filter((country: Country) => phoneNumber.startsWith(country.code))\n .sort((a, b) => a.code.length - b.code.length);\n\n return possibleCountries[possibleCountries.length - 1];\n}\n\nexport function formatPhoneNumber(input: string, country?: Country) {\n let phoneNumber = input.replace(/[^\\d]+/g, '');\n if (country) {\n phoneNumber = phoneNumber.substr(country.code.length - 1);\n } else if (input.startsWith('+')) {\n return input;\n }\n\n phoneNumber = phoneNumber.replace(getPhoneNumberFormat(country), (_, p1, p2, p3, p4, p5) => {\n const separator = country && country.id === 'GB' ? ' ' : '-';\n\n let output = '';\n if (p1) output = `${p1}`;\n if (p2) output += ` ${p2}`;\n if (p3) output += `${separator}${p3}`;\n if (p4) output += `${separator}${p4}`;\n if (p5) output += `${separator}${p5}`;\n return output;\n });\n\n return phoneNumber;\n}\n\nexport function formatPhoneNumberWithCode(phoneNumber: string) {\n const numberWithPlus = phoneNumber.startsWith('+') ? phoneNumber : `+${phoneNumber}`;\n const country = getCountryFromPhoneNumber(numberWithPlus);\n if (!country) {\n return numberWithPlus;\n }\n return `${country.code} ${formatPhoneNumber(numberWithPlus, country)}`;\n}\n\nexport { countryList };\n","import {\n ApiLanguage, ApiMessage, ApiStickerSet, ApiShippingAddress,\n} from '../api/types';\n\nexport enum LoadMoreDirection {\n Backwards,\n Forwards,\n Around,\n}\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n}\n\nexport interface IAlbum {\n albumId: string;\n messages: ApiMessage[];\n mainMessage: ApiMessage;\n}\n\nexport interface ISettings extends Record {\n messageTextSize: number;\n customBackground?: string;\n patternColor?: string;\n isBackgroundBlurred?: boolean;\n animationLevel: 0 | 1 | 2;\n messageSendKeyCombo: 'enter' | 'ctrl-enter';\n theme: 'light' | 'dark';\n shouldAutoDownloadMediaFromContacts: boolean;\n shouldAutoDownloadMediaInPrivateChats: boolean;\n shouldAutoDownloadMediaInGroups: boolean;\n shouldAutoDownloadMediaInChannels: boolean;\n shouldAutoPlayGifs: boolean;\n shouldAutoPlayVideos: boolean;\n shouldSuggestStickers: boolean;\n shouldLoopStickers: boolean;\n hasPassword?: boolean;\n hasPrivateChatsNotifications?: boolean;\n hasPrivateChatsMessagePreview?: boolean;\n hasGroupNotifications?: boolean;\n hasGroupMessagePreview?: boolean;\n hasBroadcastNotifications?: boolean;\n hasBroadcastMessagePreview?: boolean;\n hasContactJoinedNotifications?: boolean;\n languages?: ApiLanguage[];\n language: 'en' | 'fr' | 'de' | 'it' | 'pt' | 'ru' | 'es' | 'uk';\n}\n\nexport interface ApiPrivacySettings {\n visibility: PrivacyVisibility;\n allowUserIds: number[];\n allowChatIds: number[];\n blockUserIds: number[];\n blockChatIds: number[];\n}\n\nexport interface IInputPrivacyContact {\n id: number;\n accessHash?: string;\n}\n\nexport interface IInputPrivacyRules {\n visibility: PrivacyVisibility;\n allowedUsers?: IInputPrivacyContact[];\n allowedChats?: IInputPrivacyContact[];\n blockedUsers?: IInputPrivacyContact[];\n blockedChats?: IInputPrivacyContact[];\n}\n\nexport type IAnchorPosition = {\n x: number;\n y: number;\n};\n\nexport interface ShippingOption {\n id: string;\n title: string;\n amount: number;\n prices: Price[];\n}\n\nexport interface Price {\n label: string;\n amount: number;\n}\n\nexport interface Invoice {\n currency?: string;\n emailRequested?: boolean;\n emailToProvider?: boolean;\n flexible?: boolean;\n nameRequested?: boolean;\n phoneRequested?: boolean;\n phoneToProvider?: boolean;\n prices?: Price[];\n shippingAddressRequested?: boolean;\n test?: boolean;\n}\n\nexport interface Receipt {\n currency: string;\n prices: Price[];\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n totalAmount: number;\n credentialsTitle: string;\n shippingPrices?: Price[];\n shippingMethod?: string;\n photoUrl?: string;\n text?: string;\n title?: string;\n}\n\nexport enum SettingsScreens {\n Main,\n EditProfile,\n Notifications,\n Language,\n General,\n GeneralChatBackground,\n GeneralChatBackgroundColor,\n Privacy,\n PrivacyPhoneNumber,\n PrivacyLastSeen,\n PrivacyProfilePhoto,\n PrivacyForwarding,\n PrivacyGroupChats,\n PrivacyPhoneNumberAllowedContacts,\n PrivacyPhoneNumberDeniedContacts,\n PrivacyLastSeenAllowedContacts,\n PrivacyLastSeenDeniedContacts,\n PrivacyProfilePhotoAllowedContacts,\n PrivacyProfilePhotoDeniedContacts,\n PrivacyForwardingAllowedContacts,\n PrivacyForwardingDeniedContacts,\n PrivacyGroupChatsAllowedContacts,\n PrivacyGroupChatsDeniedContacts,\n PrivacyActiveSessions,\n PrivacyBlockedUsers,\n Folders,\n FoldersCreateFolder,\n FoldersEditFolder,\n FoldersIncludedChats,\n FoldersExcludedChats,\n TwoFaDisabled,\n TwoFaNewPassword,\n TwoFaNewPasswordConfirm,\n TwoFaNewPasswordHint,\n TwoFaNewPasswordEmail,\n TwoFaNewPasswordEmailCode,\n TwoFaEnabled,\n TwoFaChangePasswordCurrent,\n TwoFaChangePasswordNew,\n TwoFaChangePasswordConfirm,\n TwoFaChangePasswordHint,\n TwoFaTurnOff,\n TwoFaRecoveryEmailCurrentPassword,\n TwoFaRecoveryEmail,\n TwoFaRecoveryEmailCode,\n TwoFaCongratulations,\n}\n\nexport type StickerSetOrRecent = Pick;\n\nexport enum LeftColumnContent {\n ChatList,\n GlobalSearch,\n Settings,\n Contacts,\n Archived,\n NewChannelStep1,\n NewChannelStep2,\n NewGroupStep1,\n NewGroupStep2,\n}\n\nexport enum GlobalSearchContent {\n ChatList,\n Media,\n Links,\n Files,\n Music,\n Voice,\n}\n\nexport enum RightColumnContent {\n ChatInfo,\n UserInfo,\n Search,\n Management,\n StickerSearch,\n GifSearch,\n PollResults,\n}\n\nexport enum MediaViewerOrigin {\n Inline,\n ScheduledInline,\n SharedMedia,\n ProfileAvatar,\n MiddleHeaderAvatar,\n Album,\n ScheduledAlbum,\n SearchResult,\n}\n\nexport enum ChatCreationProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ProfileEditProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ManagementProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport type ProfileTabType = 'members' | 'media' | 'documents' | 'links' | 'audio';\nexport type SharedMediaType = 'media' | 'documents' | 'links' | 'audio';\nexport type ApiPrivacyKey = 'phoneNumber' | 'lastSeen' | 'profilePhoto' | 'forwards' | 'chatInvite';\nexport type PrivacyVisibility = 'everybody' | 'contacts' | 'nonContacts' | 'nobody';\n\nexport enum ProfileState {\n Profile,\n SharedMedia,\n MemberList,\n}\n\nexport enum PaymentStep {\n ShippingInfo,\n Shipping,\n PaymentInfo,\n Checkout\n}\n\nexport const UPLOADING_WALLPAPER_SLUG = 'UPLOADING_WALLPAPER_SLUG';\n\nexport enum ManagementScreens {\n Initial,\n ChatPrivacyType,\n Discussion,\n ChannelSubscribers,\n GroupType,\n GroupPermissions,\n GroupRemovedUsers,\n GroupUserPermissionsCreate,\n GroupUserPermissions,\n ChatAdministrators,\n GroupRecentActions,\n ChatAdminRights,\n GroupMembers,\n}\n\nexport type ManagementType = 'user' | 'group' | 'channel';\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Spinner.scss';\n\nconst Spinner: FC<{\n color?: 'blue' | 'white' | 'black' | 'green' | 'gray';\n withBackground?: boolean;\n}> = ({\n color = 'blue',\n withBackground,\n}) => {\n return (\n
\n
\n
\n );\n};\n\nexport default Spinner;\n","import {\n DEBUG_ALERT_MSG, GLOBAL_STATE_CACHE_KEY, GRAMJS_SESSION_ID_KEY,\n} from '../config';\nimport { throttle } from './schedulers';\n\nwindow.addEventListener('error', handleErrorEvent);\nwindow.addEventListener('unhandledrejection', handleErrorEvent);\n\n// eslint-disable-next-line prefer-destructuring\nconst APP_ENV = process.env.APP_ENV;\nconst STARTUP_TIMEOUT = 5000;\n\nconst startedAt = Date.now();\nlet isReloading = false;\n\nfunction handleErrorEvent(e: ErrorEvent | PromiseRejectionEvent) {\n e.preventDefault();\n\n handleError(e instanceof ErrorEvent ? e.error : e.reason);\n}\n\nconst throttledAlert = throttle(window.alert, 1000);\n\nexport function handleError(err: Error) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (isReloading) {\n return;\n }\n\n // For startup errors, we just clean the cache or the session and refresh the page.\n if (Date.now() - startedAt <= STARTUP_TIMEOUT) {\n if (localStorage.getItem(GLOBAL_STATE_CACHE_KEY)) {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n } else if (localStorage.getItem(GRAMJS_SESSION_ID_KEY)) {\n localStorage.removeItem(GRAMJS_SESSION_ID_KEY);\n } else {\n return;\n }\n\n isReloading = true;\n window.location.reload();\n\n return;\n }\n\n if (APP_ENV === 'development' || APP_ENV === 'staging') {\n throttledAlert(`${DEBUG_ALERT_MSG}\\n\\n${(err && err.message) || err}\\n${err && err.stack}`);\n }\n}\n","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex';\n\nimport { RE_LINK_TEMPLATE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport { nativeToUnfified } from '../../../util/emoji';\nimport buildClassName from '../../../util/buildClassName';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\ntype TextPart = string | Element;\n\nconst RE_LETTER_OR_DIGIT = /^[\\d\\wа-яё]$/i;\nconst SIMPLE_MARKDOWN_REGEX = /(\\*\\*|__).+?\\1/g;\n\nexport default function renderText(\n part: TextPart,\n filters: Array<(\n 'escape_html' | 'hq_emoji' | 'emoji' | 'emoji_html' | 'br' | 'br_html' | 'highlight' | 'links' |\n 'simple_markdown' | 'simple_markdown_html'\n )> = ['emoji'],\n params?: { highlight: string | undefined },\n): TextPart[] {\n if (typeof part !== 'string') {\n return [part];\n }\n\n return filters.reduce((text, filter) => {\n switch (filter) {\n case 'escape_html':\n return escapeHtml(text);\n\n case 'hq_emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'big', 'jsx');\n\n case 'emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'jsx');\n\n case 'emoji_html':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'html');\n\n case 'br':\n return addLineBreaks(text, 'jsx');\n\n case 'br_html':\n return addLineBreaks(text, 'html');\n\n case 'highlight':\n return addHighlight(text, params!.highlight);\n\n case 'links':\n return addLinks(text);\n\n case 'simple_markdown':\n return replaceSimpleMarkdown(text, 'jsx');\n\n case 'simple_markdown_html':\n return replaceSimpleMarkdown(text, 'html');\n }\n\n return text;\n }, [part] as TextPart[]);\n}\n\nfunction escapeHtml(textParts: TextPart[]): TextPart[] {\n const divEl = document.createElement('div');\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n divEl.innerText = part;\n\n return [...result, divEl.innerHTML];\n }, [] as TextPart[]);\n}\n\nfunction replaceEmojis(textParts: TextPart[], size: 'big' | 'small', type: 'jsx' | 'html'): TextPart[] {\n if (IS_EMOJI_SUPPORTED) {\n return textParts;\n }\n\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const parts = part.split(EMOJI_REGEX);\n const emojis = part.match(EMOJI_REGEX) || [];\n result.push(parts[0]);\n\n return emojis.reduce((emojiResult: TextPart[], emoji, i) => {\n const code = nativeToUnfified(removeVS16s(emoji));\n const className = buildClassName(\n 'emoji',\n size === 'small' && 'emoji-small',\n );\n if (type === 'jsx') {\n emojiResult.push(\n ,\n );\n }\n if (type === 'html') {\n emojiResult.push(\n // For preventing extra spaces in html\n // eslint-disable-next-line max-len\n `\"${emoji}\"`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n emojiResult.push(parts[index]);\n }\n\n return emojiResult;\n }, result);\n }, [] as TextPart[]);\n}\n\nfunction addLineBreaks(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n return [...result, ...part\n .split(/\\r\\n|\\r|\\n/g)\n .reduce((parts: TextPart[], line: string, i, source) => {\n // This adds non-breaking space if line was indented with spaces, to preserve the indentation\n const trimmedLine = line.trimLeft();\n const indentLength = line.length - trimmedLine.length;\n parts.push(String.fromCharCode(160).repeat(indentLength) + trimmedLine);\n\n if (i !== source.length - 1) {\n parts.push(\n type === 'jsx' ?
: '
',\n );\n }\n\n return parts;\n }, [])];\n }, [] as TextPart[]);\n}\n\nfunction addHighlight(textParts: TextPart[], highlight: string | undefined): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string' || !highlight) {\n return [...result, part];\n }\n\n const lowerCaseText = part.toLowerCase();\n const queryPosition = lowerCaseText.indexOf(highlight.toLowerCase());\n const nextSymbol = lowerCaseText[queryPosition + highlight.length];\n if (queryPosition < 0 || (nextSymbol && nextSymbol.match(RE_LETTER_OR_DIGIT))) {\n return [...result, part];\n }\n\n const newParts: TextPart[] = [];\n newParts.push(part.substring(0, queryPosition));\n newParts.push(\n \n {part.substring(queryPosition, queryPosition + highlight.length)}\n ,\n );\n newParts.push(part.substring(queryPosition + highlight.length));\n\n return [...result, ...newParts];\n }, [] as TextPart[]);\n}\n\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'ig');\nconst RE_MENTION = /@[\\w\\d_-]+/ig;\n\nfunction addLinks(textParts: TextPart[]): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const links = [...(part.match(RE_LINK) || []), ...(part.match(RE_MENTION) || [])];\n if (!links.length) {\n return [...result, part];\n }\n\n const content: TextPart[] = [];\n\n let nextLink = links.shift();\n let lastIndex = 0;\n while (nextLink) {\n const index = part.indexOf(nextLink, lastIndex);\n content.push(part.substring(lastIndex, index));\n if (nextLink.startsWith('@')) {\n content.push(\n \n {nextLink}\n ,\n );\n } else {\n if (nextLink.endsWith('?')) {\n nextLink = nextLink.slice(0, nextLink.length - 1);\n }\n\n content.push(\n ,\n );\n }\n lastIndex = index + nextLink.length;\n nextLink = links.shift();\n }\n content.push(part.substring(lastIndex));\n\n return [...result, ...content];\n }, [] as TextPart[]);\n}\n\nfunction replaceSimpleMarkdown(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const parts = part.split(SIMPLE_MARKDOWN_REGEX);\n const entities = part.match(SIMPLE_MARKDOWN_REGEX) || [];\n result.push(parts[0]);\n\n return entities.reduce((entityResult: TextPart[], entity, i) => {\n if (type === 'jsx') {\n entityResult.push(\n entity.startsWith('**')\n ? {entity.replace(/\\*\\*/g, '')}\n : {entity.replace(/__/g, '')},\n );\n } else {\n entityResult.push(\n entity.startsWith('**')\n ? `${entity.replace(/\\*\\*/g, '')}`\n : `${entity.replace(/__/g, '')}`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n entityResult.push(parts[index]);\n }\n\n return entityResult;\n }, result);\n }, [] as TextPart[]);\n}\n","export default function arePropsShallowEqual(currentProps: AnyLiteral, newProps: AnyLiteral) {\n if (currentProps === newProps) {\n return true;\n }\n\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return false;\n }\n\n if (currentKeysLength === 0) {\n return true;\n }\n\n for (let i = 0; i < currentKeysLength; i++) {\n const prop = currentKeys[i];\n if (currentProps[prop] !== newProps[prop]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function getUnequalProps(currentProps: AnyLiteral, newProps: AnyLiteral) {\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return ['%LENGTH%'];\n }\n\n return currentKeys.filter((prop) => currentProps[prop] !== newProps[prop]);\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Link.scss';\n\ntype OwnProps = {\n children: any;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n};\n\nconst Link: FC = ({ children, className, onClick }) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n onClick!(e);\n }, [onClick]);\n\n return (\n \n {children}\n \n );\n};\n\nexport default Link;\n","export default (store: AnyLiteral) => {\n let id;\n\n do {\n id = String(Math.random()).replace('0.', 'id');\n } while (store.hasOwnProperty(id));\n\n return id;\n};\n","import { callApi } from '../api/gramjs';\nimport { ApiChat, ApiMessage } from '../api/types';\nimport { renderActionMessageText } from '../components/common/helpers/renderActionMessageText';\nimport { DEBUG } from '../config';\nimport { getDispatch, getGlobal, setGlobal } from '../lib/teact/teactn';\nimport {\n getChatTitle,\n getMessageAction,\n getMessageSenderName,\n getNotificationText,\n getPrivateChatUserId,\n isActionMessage,\n isChatChannel,\n} from '../modules/helpers';\nimport { replaceSettings } from '../modules/reducers';\nimport { selectChatMessage, selectUser } from '../modules/selectors';\nimport { IS_SERVICE_WORKER_SUPPORTED } from './environment';\n\nfunction getDeviceToken(subscription: PushSubscription) {\n const data = subscription.toJSON();\n return JSON.stringify({\n endpoint: data.endpoint,\n keys: data.keys,\n });\n}\n\nfunction checkIfPushSupported() {\n if (!IS_SERVICE_WORKER_SUPPORTED) return false;\n if (!('showNotification' in ServiceWorkerRegistration.prototype)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Push notifications aren\\'t supported.');\n }\n return false;\n }\n\n // Check the current Notification permission.\n // If its denied, it's a permanent block until the\n // user changes the permission\n if (Notification.permission === 'denied') {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n\n // Check if push messaging is supported\n if (!('PushManager' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Push messaging isn\\'t supported.');\n }\n return false;\n }\n return true;\n}\n\nfunction checkIfNotificationsSupported() {\n // Let's check if the browser supports notifications\n if (!('Notification' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] This browser does not support desktop notification');\n }\n return false;\n }\n\n if (Notification.permission === 'denied' as NotificationPermission) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n return true;\n}\n\nconst expirationTime = 12 * 60 * 60 * 1000; // 12 hours\n\nfunction checkIfShouldResubscribe(subscription: PushSubscription | null) {\n const global = getGlobal();\n if (!global.push || !subscription) return true;\n if (getDeviceToken(subscription) !== global.push.deviceToken) return true;\n return Date.now() - global.push.subscribedAt > expirationTime;\n}\n\nasync function requestPermission() {\n if (!('Notification' in window)) return;\n if (!['granted', 'denied'].includes(Notification.permission)) {\n await Notification.requestPermission();\n }\n}\n\nasync function unsubscribeFromPush(subscription: PushSubscription | null) {\n const global = getGlobal();\n const dispatch = getDispatch();\n if (subscription) {\n try {\n const deviceToken = getDeviceToken(subscription);\n await callApi('unregisterDevice', deviceToken);\n await subscription.unsubscribe();\n dispatch.deleteDeviceToken();\n return;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to unsubscribe from push.', error);\n }\n }\n }\n if (global.push) {\n await callApi('unregisterDevice', global.push.deviceToken);\n dispatch.deleteDeviceToken();\n }\n}\n\n\nexport async function unsubscribe() {\n if (!checkIfPushSupported()) return;\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n const subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n await unsubscribeFromPush(subscription);\n}\n\n// Load notification settings from the api\nasync function loadNotificationsSettings() {\n const result = await callApi('loadNotificationsSettings');\n if (!result) return;\n setGlobal(replaceSettings(getGlobal(), result));\n}\n\nexport async function subscribe() {\n loadNotificationsSettings();\n\n if (!checkIfPushSupported()) {\n // Ask for notification permissions only if service worker notifications are not supported\n // As pushManager.subscribe automatically triggers permission popup\n await requestPermission();\n return;\n }\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n let subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n if (!checkIfShouldResubscribe(subscription)) return;\n await unsubscribeFromPush(subscription);\n try {\n subscription = await serviceWorkerRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n });\n const deviceToken = getDeviceToken(subscription);\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Received push subscription: ', deviceToken);\n }\n await callApi('registerDevice', deviceToken);\n getDispatch()\n .setDeviceToken(deviceToken);\n } catch (error) {\n if (Notification.permission === 'denied' as NotificationPermission) {\n // The user denied the notification permission which\n // means we failed to subscribe and the user will need\n // to manually change the notification permission to\n // subscribe to push messages\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n } else if (DEBUG) {\n // A problem occurred with the subscription, this can\n // often be down to an issue or lack of the gcm_sender_id\n // and / or gcm_user_visible_only\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to subscribe to push.', error);\n\n // Request permissions and fall back to local notifications\n // if pushManager.subscribe was aborted due to invalid VAPID key.\n if (error.code === DOMException.ABORT_ERR) {\n await requestPermission();\n }\n }\n }\n}\n\nfunction checkIfShouldNotify(chat: ApiChat, isActive: boolean) {\n if (chat.isMuted || chat.isNotJoined) return false;\n\n // Dont show notification for active chat if client has focus\n if (isActive && document.hasFocus()) return false;\n\n const global = getGlobal();\n switch (chat.type) {\n case 'chatTypePrivate':\n case 'chatTypeSecret':\n return Boolean(global.settings.byKey.hasPrivateChatsNotifications);\n case 'chatTypeBasicGroup':\n case 'chatTypeSuperGroup':\n return Boolean(global.settings.byKey.hasGroupNotifications);\n case 'chatTypeChannel':\n return Boolean(global.settings.byKey.hasBroadcastNotifications);\n }\n return false;\n}\n\nfunction getNotificationContent(chat: ApiChat, message: ApiMessage) {\n const global = getGlobal();\n const {\n senderId,\n replyToMessageId,\n } = message;\n const messageSender = senderId ? selectUser(global, senderId) : undefined;\n const messageAction = getMessageAction(message as ApiMessage);\n const actionTargetMessage = messageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const {\n targetUserId: actionTargetUserId,\n targetChatId: actionTargetChatId,\n } = messageAction || {};\n const actionTargetUser = actionTargetUserId ? selectUser(global, actionTargetUserId) : undefined;\n const privateChatUserId = getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n let body: string;\n if (isActionMessage(message)) {\n const actionOrigin = chat && (isChatChannel(chat) || message.senderId === message.chatId)\n ? chat\n : messageSender;\n body = renderActionMessageText(\n message,\n actionOrigin,\n actionTargetUser,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: true },\n ) as string;\n } else {\n const senderName = getMessageSenderName(chat.id, messageSender);\n const summary = getNotificationText(message);\n\n body = senderName ? `${senderName}: ${summary}` : summary;\n }\n\n return {\n title: getChatTitle(chat, privateChatUser),\n body,\n };\n}\n\nexport function showNewMessageNotification({\n chat,\n message,\n isActiveChat,\n}: { chat: ApiChat; message: Partial; isActiveChat: boolean}) {\n if (!checkIfNotificationsSupported()) return;\n if (!message.id) return;\n\n if (!checkIfShouldNotify(chat, isActiveChat)) return;\n\n const {\n title,\n body,\n } = getNotificationContent(chat, message as ApiMessage);\n\n if (checkIfPushSupported()) {\n if (navigator.serviceWorker.controller) {\n // notify service worker about new message notification\n navigator.serviceWorker.controller.postMessage({\n type: 'newMessageNotification',\n payload: {\n title,\n body,\n chatId: chat.id,\n messageId: message.id,\n },\n });\n }\n } else {\n const dispatch = getDispatch();\n const notification = new Notification(title, {\n body,\n icon: 'icon-192x192.png',\n badge: 'icon-192x192.png',\n tag: message.id.toString(),\n vibrate: [200, 100, 200],\n });\n\n notification.onclick = () => {\n notification.close();\n dispatch.focusMessage({\n chatId: chat.id,\n messageId: message.id,\n });\n if (window.focus) {\n window.focus();\n }\n };\n }\n}\n\n// Notify service worker that client is fully loaded\nexport function notifyClientReady() {\n if (!navigator.serviceWorker.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'clientReady',\n });\n}\n","import { ApiChat, ApiUser } from '../../api/types';\n\nimport { SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport { formatFullDate, formatTime } from '../../util/dateFormat';\nimport { orderBy } from '../../util/iteratees';\nimport { LangFn } from '../../hooks/useLang';\n\nconst USER_COLOR_KEYS = [1, 8, 5, 2, 7, 4, 6];\n\nexport function getUserFirstOrLastName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n return user.firstName || user.lastName;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted';\n }\n\n default:\n return undefined;\n }\n}\n\nexport function getUserFullName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n if (isDeletedUser(user)) {\n return 'Deleted account';\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n if (user.firstName && user.lastName) {\n return `${user.firstName} ${user.lastName}`;\n }\n\n if (user.firstName) {\n return user.firstName;\n }\n\n if (user.lastName) {\n return user.lastName;\n }\n\n break;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted account';\n }\n }\n\n return undefined;\n}\n\nexport function getUserStatus(user: ApiUser, lang: LangFn) {\n if (user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return lang('ServiceNotifications').toLowerCase();\n }\n\n if (user.type && user.type === 'userTypeBot') {\n return 'bot';\n }\n\n if (!user.status) {\n return '';\n }\n\n switch (user.status.type) {\n case 'userStatusEmpty': {\n return lang('ALongTimeAgo');\n }\n\n case 'userStatusLastMonth': {\n return lang('WithinAMonth');\n }\n\n case 'userStatusLastWeek': {\n return lang('WithinAWeek');\n }\n\n case 'userStatusOffline': {\n const { wasOnline } = user.status;\n\n if (!wasOnline) return lang('LastSeen.Offline');\n\n const now = new Date();\n const wasOnlineDate = new Date(wasOnline * 1000);\n\n if (wasOnlineDate >= now) {\n return lang('LastSeen.JustNow');\n }\n\n const diff = new Date(now.getTime() - wasOnlineDate.getTime());\n\n // within a minute\n if (diff.getTime() / 1000 < 60) {\n return lang('LastSeen.JustNow');\n }\n\n // within an hour\n if (diff.getTime() / 1000 < 60 * 60) {\n const minutes = Math.floor(diff.getTime() / 1000 / 60);\n return lang('LastSeen.MinutesAgo', minutes);\n }\n\n // today\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n if (wasOnlineDate > today) {\n // up to 6 hours ago\n if (diff.getTime() / 1000 < 6 * 60 * 60) {\n const hours = Math.floor(diff.getTime() / 1000 / 60 / 60);\n return lang('LastSeen.HoursAgo', hours);\n }\n\n // other\n return lang('LastSeen.TodayAt', formatTime(wasOnlineDate));\n }\n\n // yesterday\n const yesterday = new Date();\n yesterday.setDate(now.getDate() - 1);\n today.setHours(0, 0, 0, 0);\n if (wasOnlineDate > yesterday) {\n return lang('LastSeen.YesterdayAt', formatTime(wasOnlineDate));\n }\n\n return lang('LastSeen.AtDate', formatFullDate(wasOnlineDate));\n }\n\n case 'userStatusOnline': {\n return lang('Online');\n }\n\n case 'userStatusRecently': {\n return lang('Lately');\n }\n\n default:\n return undefined;\n }\n}\n\nexport function isUserOnline(user: ApiUser) {\n const { id, status, type } = user;\n\n if (!status) {\n return false;\n }\n\n if (id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return status.type === 'userStatusOnline' && type !== 'userTypeBot';\n}\n\nexport function isDeletedUser(user: ApiUser) {\n if (!user.status || user.type === 'userTypeBot' || user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return user.type === 'userTypeDeleted'\n || user.type === 'userTypeUnknown';\n}\n\nexport function isUserBot(user: ApiUser) {\n return user.type === 'userTypeBot';\n}\n\nexport function sortUserIds(\n userIds: number[],\n usersById: Record,\n priorityIds?: number[],\n) {\n return orderBy(userIds, (id) => {\n const now = Date.now() / 1000;\n\n if (priorityIds && priorityIds.includes(id)) {\n // Assuming that online status expiration date can't be as far as two days from now,\n // this should place prioritized on top of the list.\n // Then we subtract index of `id` in `priorityIds` to preserve selected order\n return now + (48 * 60 * 60) - (priorityIds.length - priorityIds.indexOf(id));\n }\n\n const user = usersById[id];\n if (!user || !user.status) {\n return 0;\n }\n\n if (user.status.type === 'userStatusOnline') {\n return user.status.expires;\n } else if (user.status.type === 'userStatusOffline' && user.status.wasOnline) {\n return user.status.wasOnline;\n }\n\n switch (user.status.type) {\n case 'userStatusRecently':\n return now - 60 * 60 * 24;\n case 'userStatusLastWeek':\n return now - 60 * 60 * 24 * 7;\n case 'userStatusLastMonth':\n return now - 60 * 60 * 24 * 7 * 30;\n default:\n return 0;\n }\n }, 'desc');\n}\n\n// eslint-disable-next-line max-len\n// https://github.com/telegramdesktop/tdesktop/blob/371510cfe23b0bd226de8c076bc49248fbe40c26/Telegram/SourceFiles/data/data_peer.cpp#L53\nexport function getUserColorKey(peer: ApiUser | ApiChat | undefined) {\n const index = peer ? Math.abs(peer.id) % 7 : 0;\n\n return USER_COLOR_KEYS[index];\n}\n","import {\n ApiChat,\n ApiUser,\n ApiChatBannedRights,\n ApiChatAdminRights,\n ApiChatFolder,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { getTranslation } from '../../util/langProvider';\nimport { LangFn } from '../../hooks/useLang';\n\nexport function isChatPrivate(chatId: number) {\n return chatId > 0;\n}\n\nexport function isChatGroup(chat: ApiChat) {\n return isChatBasicGroup(chat) || isChatSuperGroup(chat);\n}\n\nexport function isChatBasicGroup(chat: ApiChat) {\n return chat.type === 'chatTypeBasicGroup';\n}\n\nexport function isChatSuperGroup(chat: ApiChat) {\n return chat.type === 'chatTypeSuperGroup';\n}\n\nexport function isChatChannel(chat: ApiChat) {\n return chat.type === 'chatTypeChannel';\n}\n\nexport function isCommonBoxChat(chat: ApiChat) {\n return chat.type === 'chatTypePrivate' || chat.type === 'chatTypeBasicGroup';\n}\n\nexport function getChatTypeString(chat: ApiChat) {\n switch (chat.type) {\n case 'chatTypePrivate':\n return 'PrivateChat';\n case 'chatTypeBasicGroup':\n case 'chatTypeSuperGroup':\n return 'AccDescrGroup';\n case 'chatTypeChannel':\n return 'AccDescrChannel';\n default:\n return 'Chat';\n }\n}\n\nexport function getPrivateChatUserId(chat: ApiChat) {\n if (chat.type !== 'chatTypePrivate' && chat.type !== 'chatTypeSecret') {\n return undefined;\n }\n return chat.id;\n}\n\n// TODO Get rid of `user`\nexport function getChatTitle(chat: ApiChat, user?: ApiUser, isSelf = false) {\n if (isSelf || (user && chat.id === user.id && user.isSelf)) {\n return getTranslation('SavedMessages');\n }\n return chat.title || getTranslation('HiddenName');\n}\n\nexport function getChatDescription(chat: ApiChat) {\n if (!chat.fullInfo) {\n return undefined;\n }\n return chat.fullInfo.about;\n}\n\nexport function getChatLink(chat: ApiChat) {\n const { username } = chat;\n const { inviteLink } = chat.fullInfo || {};\n\n if (inviteLink && inviteLink.length) {\n return inviteLink;\n }\n\n return username ? `t.me/${username}` : '';\n}\n\nexport function getChatAvatarHash(\n owner: ApiChat | ApiUser,\n size: 'normal' | 'big' = 'normal',\n) {\n if (!owner.avatarHash) {\n return undefined;\n }\n\n switch (size) {\n case 'big':\n return `profile${owner.id}?${owner.avatarHash}`;\n default:\n return `avatar${owner.id}?${owner.avatarHash}`;\n }\n}\n\nexport function isChatSummaryOnly(chat: ApiChat) {\n return !chat.lastMessage;\n}\n\nexport function isChatAdmin(chat: ApiChat) {\n return Boolean(chat.adminRights);\n}\n\nexport function getHasAdminRight(chat: ApiChat, key: keyof ApiChatAdminRights) {\n return chat.adminRights ? chat.adminRights[key] : false;\n}\n\nexport function isUserRightBanned(chat: ApiChat, key: keyof ApiChatBannedRights) {\n return Boolean(\n (chat.currentUserBannedRights && chat.currentUserBannedRights[key])\n || (chat.defaultBannedRights && chat.defaultBannedRights[key]),\n );\n}\n\nexport function getCanPostInChat(chat: ApiChat, threadId: number) {\n if (threadId !== MAIN_THREAD_ID) {\n return true;\n }\n\n if (chat.isRestricted || chat.migratedTo || chat.isNotJoined) {\n return false;\n }\n\n if (chat.isCreator) {\n return true;\n }\n\n if (isChatPrivate(chat.id)) {\n return true;\n }\n\n if (isChatChannel(chat)) {\n return getHasAdminRight(chat, 'postMessages');\n }\n\n return isChatAdmin(chat) || !isUserRightBanned(chat, 'sendMessages');\n}\n\nexport interface IAllowedAttachmentOptions {\n canAttachMedia: boolean;\n canAttachPolls: boolean;\n canSendStickers: boolean;\n canSendGifs: boolean;\n canAttachEmbedLinks: boolean;\n}\n\nexport function getAllowedAttachmentOptions(chat?: ApiChat, isChatWithBot = false): IAllowedAttachmentOptions {\n if (!chat) {\n return {\n canAttachMedia: false,\n canAttachPolls: false,\n canSendStickers: false,\n canSendGifs: false,\n canAttachEmbedLinks: false,\n };\n }\n\n const isAdmin = isChatAdmin(chat);\n\n return {\n canAttachMedia: isAdmin || !isUserRightBanned(chat, 'sendMedia'),\n canAttachPolls: (isAdmin || !isUserRightBanned(chat, 'sendPolls')) && (!isChatPrivate(chat.id) || isChatWithBot),\n canSendStickers: isAdmin || !isUserRightBanned(chat, 'sendStickers'),\n canSendGifs: isAdmin || !isUserRightBanned(chat, 'sendGifs'),\n canAttachEmbedLinks: isAdmin || !isUserRightBanned(chat, 'embedLinks'),\n };\n}\n\nexport function getMessageSendingRestrictionReason(chat: ApiChat) {\n if (chat.currentUserBannedRights && chat.currentUserBannedRights.sendMessages) {\n return 'You are not allowed to send messages in this chat.';\n }\n if (chat.defaultBannedRights && chat.defaultBannedRights.sendMessages) {\n return 'Sending messages is not allowed in this chat.';\n }\n\n return undefined;\n}\n\nexport function getChatSlowModeOptions(chat?: ApiChat) {\n if (!chat || !chat.fullInfo) {\n return undefined;\n }\n\n return chat.fullInfo.slowMode;\n}\n\nexport function getChatOrder(chat: ApiChat) {\n return Math.max(chat.joinDate || 0, chat.lastMessage ? chat.lastMessage.date : 0);\n}\n\nexport function isChatArchived(chat: ApiChat) {\n return chat.folderId === ARCHIVED_FOLDER_ID;\n}\n\nexport function getCanDeleteChat(chat: ApiChat) {\n return isChatBasicGroup(chat) || ((isChatSuperGroup(chat) || isChatChannel(chat)) && chat.isCreator);\n}\n\nexport function prepareFolderListIds(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache?: number[],\n) {\n const excludedChatIds = folder.excludedChatIds ? new Set(folder.excludedChatIds) : undefined;\n const includedChatIds = folder.excludedChatIds ? new Set(folder.includedChatIds) : undefined;\n const pinnedChatIds = folder.excludedChatIds ? new Set(folder.pinnedChatIds) : undefined;\n const listIds = (chatIdsCache || Object.keys(chatsById).map(Number))\n .filter((id) => {\n return filterChatFolder(\n chatsById[id], folder, usersById, excludedChatIds, includedChatIds, pinnedChatIds,\n );\n });\n\n return [listIds, folder.pinnedChatIds] as const;\n}\n\nfunction filterChatFolder(\n chat: ApiChat,\n folder: ApiChatFolder,\n usersById: Record,\n excludedChatIds?: Set,\n includedChatIds?: Set,\n pinnedChatIds?: Set,\n) {\n if (excludedChatIds && excludedChatIds.has(chat.id)) {\n return false;\n }\n\n if (includedChatIds && includedChatIds.has(chat.id)) {\n return true;\n }\n\n if (pinnedChatIds && pinnedChatIds.has(chat.id)) {\n return true;\n }\n\n if (isChatArchived(chat) && folder.excludeArchived) {\n return false;\n }\n\n if (chat.isMuted && folder.excludeMuted) {\n return false;\n }\n\n if (!chat.unreadCount && !chat.unreadMentionsCount && !chat.hasUnreadMark && folder.excludeRead) {\n return false;\n }\n\n if (isChatPrivate(chat.id)) {\n const privateChatUser = usersById[chat.id];\n\n const isChatWithBot = privateChatUser && privateChatUser.type === 'userTypeBot';\n if (isChatWithBot) {\n if (folder.bots) {\n return true;\n }\n } else {\n if (folder.contacts && privateChatUser && privateChatUser.isContact) {\n return true;\n }\n\n if (folder.nonContacts && privateChatUser && !privateChatUser.isContact) {\n return true;\n }\n }\n } else if (isChatGroup(chat)) {\n return !!folder.groups;\n } else if (isChatChannel(chat)) {\n return !!folder.channels;\n }\n\n return false;\n}\n\nexport function prepareChatList(\n chatsById: Record,\n listIds: number[],\n orderedPinnedIds?: number[],\n folderType: 'all' | 'archived' | 'folder' = 'all',\n) {\n function chatFilter(chat?: ApiChat) {\n if (!chat || !chat.lastMessage || chat.migratedTo) {\n return false;\n }\n\n switch (folderType) {\n case 'all':\n if (isChatArchived(chat)) {\n return false;\n }\n break;\n case 'archived':\n if (!isChatArchived(chat)) {\n return false;\n }\n break;\n }\n\n return !chat.isRestricted && !chat.isNotJoined;\n }\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter(chatFilter);\n\n const listIdsSet = new Set(listIds);\n const pinnedChats = orderedPinnedIds\n ? (\n orderedPinnedIds\n .map((id) => chatsById[id])\n .filter(chatFilter)\n .filter((chat) => listIdsSet.has(chat.id))\n )\n : [];\n\n const otherChats = orderBy(\n orderedPinnedIds\n ? listedChats.filter((chat) => !orderedPinnedIds.includes(chat.id))\n : listedChats,\n getChatOrder,\n 'desc',\n );\n\n return {\n pinnedChats,\n otherChats,\n };\n}\n\nexport function getFolderUnreadDialogs(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n) {\n const [listIds] = prepareFolderListIds(chatsById, usersById, folder, chatIdsCache);\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter((chat) => (chat && chat.lastMessage && !chat.isRestricted && !chat.isNotJoined));\n\n const unreadDialogsCount = listedChats\n .reduce((total, chat) => (chat.unreadCount || chat.hasUnreadMark ? total + 1 : total), 0);\n\n const hasActiveDialogs = listedChats.some((chat) => (\n chat.unreadMentionsCount\n || (!chat.isMuted && (chat.unreadCount || chat.hasUnreadMark))\n ));\n\n return {\n unreadDialogsCount,\n hasActiveDialogs,\n };\n}\n\nexport function getFolderDescriptionText(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n lang: LangFn,\n) {\n const {\n id, title, emoticon, description, pinnedChatIds,\n excludedChatIds, includedChatIds,\n excludeArchived, excludeMuted, excludeRead,\n ...filters\n } = folder;\n\n // If folder has multiple additive filters or uses include/exclude lists,\n // we display folder chats count\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (excludedChatIds && excludedChatIds.length)\n || (includedChatIds && includedChatIds.length)\n ) {\n const length = getFolderChatsCount(chatsById, usersById, folder, chatIdsCache);\n return lang('Chats', length);\n }\n\n // Otherwise, we return a short description of a single filter\n if (filters.bots) {\n return lang('FilterBots');\n } else if (filters.groups) {\n return lang('FilterGroups');\n } else if (filters.channels) {\n return lang('FilterChannels');\n } else if (filters.contacts) {\n return lang('FilterContacts');\n } else if (filters.nonContacts) {\n return lang('FilterNonContacts');\n } else {\n return undefined;\n }\n}\n\nfunction getFolderChatsCount(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n) {\n const [listIds, pinnedIds] = prepareFolderListIds(chatsById, usersById, folder, chatIdsCache);\n const { pinnedChats, otherChats } = prepareChatList(chatsById, listIds, pinnedIds, 'folder');\n return pinnedChats.length + otherChats.length;\n}\n\nexport function isChat(chatOrUser?: ApiUser | ApiChat): chatOrUser is ApiChat {\n if (!chatOrUser) {\n return false;\n }\n\n return chatOrUser.id < 0;\n}\n\nexport function getMessageSenderName(chatId: number, sender?: ApiUser) {\n if (!sender || isChatPrivate(chatId)) {\n return undefined;\n }\n\n if (sender.isSelf) {\n return 'You';\n }\n\n return getUserFirstOrLastName(sender);\n}\n\nexport function sortChatIds(\n chatIds: number[],\n chatsById: Record,\n shouldPrioritizeVerified = false,\n priorityIds?: number[],\n) {\n return orderBy(chatIds, (id) => {\n const chat = chatsById[id];\n if (!chat) {\n return 0;\n }\n\n let priority = 0;\n\n if (chat.lastMessage) {\n priority += chat.lastMessage.date;\n }\n\n if (shouldPrioritizeVerified && chat.isVerified) {\n priority += 3e9; // ~100 years in seconds\n }\n\n if (priorityIds && priorityIds.includes(id)) {\n // Assuming that last message date can't be less than now,\n // this should place prioritized on top of the list.\n // Then we subtract index of `id` in `priorityIds` to preserve selected order\n priority += Date.now() + (priorityIds.length - priorityIds.indexOf(id));\n }\n\n return priority;\n }, 'desc');\n}\n","import { MouseEvent as ReactMouseEvent, RefObject } from 'react';\n\nimport React, {\n FC, useRef, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Spinner from './Spinner';\nimport RippleEffect from './RippleEffect';\n\nimport './Button.scss';\n\nexport type OwnProps = {\n ref?: RefObject;\n type?: 'button' | 'submit' | 'reset';\n children: any;\n size?: 'default' | 'smaller' | 'tiny';\n color?: 'primary' | 'secondary' | 'gray' | 'danger' | 'translucent' | 'translucent-white' | 'dark';\n className?: string;\n round?: boolean;\n pill?: boolean;\n fluid?: boolean;\n isText?: boolean;\n isLoading?: boolean;\n ariaLabel?: string;\n href?: string;\n download?: string;\n disabled?: boolean;\n ripple?: boolean;\n faded?: boolean;\n tabIndex?: number;\n onClick?: (e: ReactMouseEvent) => void;\n onContextMenu?: (e: ReactMouseEvent) => void;\n onMouseDown?: (e: ReactMouseEvent) => void;\n onMouseEnter?: NoneToVoidFunction;\n onMouseLeave?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n};\n\n// Longest animation duration;\nconst CLICKED_TIMEOUT = 400;\n\nconst Button: FC = ({\n ref,\n type = 'button',\n onClick,\n onContextMenu,\n onMouseDown,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n children,\n size = 'default',\n color = 'primary',\n className,\n round,\n pill,\n fluid,\n isText,\n isLoading,\n ariaLabel,\n href,\n download,\n disabled,\n ripple,\n faded,\n tabIndex,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const [isClicked, setIsClicked] = useState(false);\n\n const fullClassName = buildClassName(\n 'Button',\n className,\n size,\n color,\n round && 'round',\n pill && 'pill',\n fluid && 'fluid',\n disabled && 'disabled',\n isText && 'text',\n isLoading && 'loading',\n ripple && 'has-ripple',\n faded && 'faded',\n isClicked && 'clicked',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (!disabled && onClick) {\n onClick(e);\n }\n\n setIsClicked(true);\n setTimeout(() => {\n setIsClicked(false);\n }, CLICKED_TIMEOUT);\n }, [disabled, onClick]);\n\n const handleMouseDown = useCallback((e: ReactMouseEvent) => {\n e.preventDefault();\n if (!disabled && onMouseDown) {\n onMouseDown(e);\n }\n }, [onMouseDown, disabled]);\n\n if (href) {\n return (\n }\n className={fullClassName}\n href={href}\n title={ariaLabel}\n download={download}\n tabIndex={tabIndex}\n >\n {children}\n {!disabled && ripple && (\n \n )}\n \n );\n }\n\n return (\n // eslint-disable-next-line react/button-has-type\n }\n type={type}\n className={fullClassName}\n onClick={handleClick}\n onContextMenu={onContextMenu}\n onMouseDown={handleMouseDown}\n onMouseEnter={onMouseEnter && !disabled ? onMouseEnter : undefined}\n onMouseLeave={onMouseLeave && !disabled ? onMouseLeave : undefined}\n onFocus={onFocus && !disabled ? onFocus : undefined}\n aria-label={ariaLabel}\n title={ariaLabel}\n tabIndex={tabIndex}\n >\n {isLoading ? (\n
\n Please wait..\n \n
\n ) : children}\n {!disabled && ripple && (\n \n )}\n \n );\n};\n\nexport default Button;\n","import { DEBUG } from '../../config';\n\ntype Handler = (e: Event) => void;\n\nconst NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave']);\n\nconst delegationRegistry: Record> = {};\nconst delegatedEventsByElement = new Map>();\nconst documentEventCounters: Record = {};\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element)) {\n addDelegatedListener(eventName, element, handler);\n } else {\n element.addEventListener(eventName, handler);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element)) {\n removeDelegatedListener(eventName, element);\n } else {\n element.removeEventListener(eventName, handler);\n }\n}\n\nfunction resolveEventName(propName: string, element: HTMLElement) {\n const eventName = propName.replace(/^on/, '').toLowerCase();\n\n if (eventName === 'change' && element.tagName !== 'SELECT') {\n // React behavior repeated here.\n // https://stackoverflow.com/questions/38256332/in-react-whats-the-difference-between-onchange-and-oninput\n return 'input';\n }\n\n if (eventName === 'doubleclick') {\n return 'dblclick';\n }\n\n // Replace focus/blur by their \"bubbleable\" versions\n if (eventName === 'focus') {\n return 'focusin';\n }\n\n if (eventName === 'blur') {\n return 'focusout';\n }\n\n return eventName;\n}\n\nfunction canUseEventDelegation(realEventName: string, element: HTMLElement) {\n return (\n !NON_BUBBLEABLE_EVENTS.has(realEventName)\n && element.tagName !== 'VIDEO'\n && element.tagName !== 'IFRAME'\n );\n}\n\nfunction addDelegatedListener(eventName: string, element: HTMLElement, handler: Handler) {\n if (!documentEventCounters[eventName]) {\n documentEventCounters[eventName] = 0;\n document.addEventListener(eventName, handleEvent);\n }\n\n resolveDelegationRegistryForName(eventName).set(element, handler);\n resolveDelegatedEventsForElement(element).add(eventName);\n documentEventCounters[eventName]++;\n}\n\nfunction removeDelegatedListener(eventName: string, element: HTMLElement) {\n documentEventCounters[eventName]--;\n if (!documentEventCounters[eventName]) {\n // Synchronous deletion on 0 will cause perf degradation in the case of 1 element\n // which is not a real case, so it's ok to do it this way\n document.removeEventListener(eventName, handleEvent);\n }\n\n delegationRegistry[eventName].delete(element);\n delegatedEventsByElement.get(element)!.delete(eventName);\n}\n\nexport function removeAllDelegatedListeners(element: HTMLElement) {\n const eventNames = delegatedEventsByElement.get(element);\n if (!eventNames) {\n return;\n }\n\n eventNames.forEach((eventName) => removeDelegatedListener(eventName, element));\n delegatedEventsByElement.delete(element);\n}\n\nfunction handleEvent(realEvent: Event) {\n const events = delegationRegistry[realEvent.type];\n\n if (events) {\n let furtherCallsPrevented = false;\n let current: HTMLElement = realEvent.target as HTMLElement;\n\n const stopPropagation = () => {\n furtherCallsPrevented = true;\n };\n\n const preventDefault = () => {\n realEvent.preventDefault();\n };\n\n // Proxy is a simplest way to provide an access to the event property\n const event = new Proxy(realEvent, {\n get(target, p) {\n if (p === 'currentTarget') {\n return current;\n }\n if (p === 'stopPropagation' || p === 'stopImmediatePropagation') {\n return stopPropagation;\n }\n if (p === 'preventDefault') {\n // \"this\" is changed to proxy and one can't call methods via it\n return preventDefault;\n }\n return Reflect.get(target, p);\n },\n });\n\n // This can also be limited by teact root\n while (current && current !== document.body) {\n const handler = events.get(current);\n if (handler) {\n handler(event);\n if (furtherCallsPrevented) {\n return;\n }\n }\n\n current = current.parentNode as HTMLElement;\n }\n }\n}\n\nfunction resolveDelegationRegistryForName(eventName: string) {\n if (!delegationRegistry[eventName]) {\n delegationRegistry[eventName] = new Map();\n }\n\n return delegationRegistry[eventName];\n}\n\nfunction resolveDelegatedEventsForElement(element: HTMLElement) {\n const existing = delegatedEventsByElement.get(element);\n if (existing) {\n return existing;\n }\n\n const newSet = new Set();\n delegatedEventsByElement.set(element, newSet);\n\n return newSet;\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('DELEGATED EVENTS', { delegationRegistry, delegatedEventsByElement, documentEventCounters });\n });\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default (initial = false): [boolean, AnyToVoidFunction, AnyToVoidFunction] => {\n const [value, setValue] = useState(initial);\n\n const setTrue = useCallback(() => {\n setValue(true);\n }, []);\n\n const setFalse = useCallback(() => {\n setValue(false);\n }, []);\n\n return [value, setTrue, setFalse];\n};\n","import { useRef, useState } from '../lib/teact/teact';\nimport buildClassName from '../util/buildClassName';\n\nconst CLOSE_DURATION = 350;\n\nexport default (\n isOpen = false,\n onCloseTransitionEnd?: () => void,\n noOpenTransition = false,\n className: string | false = 'fast',\n noCloseTransition = false,\n) => {\n const [isClosed, setIsClosed] = useState(!isOpen);\n const closeTimeoutRef = useRef();\n // СSS class should be added in a separate tick to turn on CSS transition.\n const [hasOpenClassName, setHasOpenClassName] = useState(isOpen && noOpenTransition);\n\n if (isOpen) {\n setIsClosed(false);\n setHasOpenClassName(true);\n\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = undefined;\n }\n } else {\n setHasOpenClassName(false);\n\n if (!isClosed && !closeTimeoutRef.current) {\n closeTimeoutRef.current = window.setTimeout(() => {\n setIsClosed(true);\n\n if (onCloseTransitionEnd) {\n onCloseTransitionEnd();\n }\n\n closeTimeoutRef.current = undefined;\n }, noCloseTransition ? 0 : CLOSE_DURATION);\n }\n }\n\n const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n hasOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n };\n};\n","import { getTranslation } from './langProvider';\n\nconst WEEKDAYS_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst MONTHS_FULL = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\nconst MONTHS_FULL_LOWERCASE = MONTHS_FULL.map((month) => month.toLowerCase());\nconst MIN_SEARCH_YEAR = 2015;\nconst MAX_DAY_IN_MONTH = 31;\nconst MAX_MONTH_IN_YEAR = 12;\nexport const MILISECONDS_IN_DAY = 24 * 60 * 60 * 1000;\n\nexport function getDayStart(datetime: number | Date) {\n const date = new Date(datetime);\n date.setHours(0, 0, 0, 0);\n return date;\n}\n\nexport function getDayStartAt(datetime: number | Date) {\n return getDayStart(datetime).getTime();\n}\n\nexport function toYearMonth(timestamp: number) {\n const date = new Date(timestamp * 1000);\n return `${date.getFullYear()}-${date.getMonth()}`;\n}\n\nfunction toIsoString(date: Date) {\n return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;\n}\n\nexport function formatTime(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n\n return `${hours}:${minutes}`;\n}\n\nexport function formatPastTimeShort(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n if (date >= today) {\n return formatTime(date);\n }\n\n const weekAgo = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n if (date >= weekAgo) {\n return getTranslation(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`);\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const format = (\n getTranslation(withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n || (withYear ? 'd MMM yyyy' : 'd MMM')\n );\n\n return formatDate(date, format);\n}\n\nexport function formatFullDate(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const format = getTranslation('formatterYearMax') || 'dd.MM.yyyy';\n\n return formatDate(date, format);\n}\n\nexport function formatMonthAndYear(date: Date, isShort = false) {\n const format = getTranslation(isShort ? 'formatterMonthYear2' : 'formatterMonthYear') || 'MMM yyyy';\n\n return formatDate(date, format);\n}\n\nexport function formatHumanDate(datetime: number | Date, isShort = false, noWeekdays = false) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n\n if (!noWeekdays) {\n if (toIsoString(date) === toIsoString(today)) {\n return (isShort ? lowerFirst : upperFirst)(getTranslation('Weekday.Today'));\n }\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n if (toIsoString(date) === toIsoString(yesterday)) {\n return (isShort ? lowerFirst : upperFirst)(getTranslation('Weekday.Yesterday'));\n }\n\n const weekAgo = new Date(today);\n const weekAhead = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n weekAhead.setDate(today.getDate() + 7);\n if (date >= weekAgo && date <= weekAhead) {\n const weekDay = WEEKDAYS_FULL[date.getDay()];\n return isShort\n ? lowerFirst(getTranslation(`Weekday.Short${weekDay}`))\n : upperFirst(getTranslation(`Weekday.${weekDay}`));\n }\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const formatKey = isShort\n ? (withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n : (withYear ? 'chatFullDate' : 'chatDate');\n const format = getTranslation(formatKey) || 'd MMMM yyyy';\n\n return (isShort ? lowerFirst : upperFirst)(formatDate(date, format));\n}\n\nfunction formatDate(date: Date, format: string) {\n const day = date.getDate();\n const monthIndex = date.getMonth();\n\n return format\n .replace('LLLL', getTranslation(MONTHS_FULL[monthIndex]))\n .replace('MMMM', getTranslation(`Month.Gen${MONTHS_FULL[monthIndex]}`))\n .replace('MMM', getTranslation(`Month.Short${MONTHS_FULL[monthIndex]}`))\n .replace('MM', String(monthIndex + 1).padStart(2, '0'))\n .replace('dd', String(day).padStart(2, '0'))\n .replace('d', String(day))\n .replace('yyyy', String(date.getFullYear()));\n}\n\nexport function formatMediaDateTime(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n return `${formatHumanDate(date, true)}, ${formatTime(date)}`;\n}\n\nexport function formatMediaDuration(duration: number) {\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration % 3600) / 60);\n const seconds = Math.floor(duration % 3600 % 60);\n\n let string = '';\n if (hours > 0) {\n string += `${String(hours).padStart(2, '0')}:`;\n string += `${String(minutes).padStart(2, '0')}:`;\n } else {\n string += `${String(minutes)}:`;\n }\n string += String(seconds).padStart(2, '0');\n\n return string;\n}\n\nexport function formatVoiceRecordDuration(durationInMs: number) {\n const parts = [];\n\n let milliseconds = durationInMs % 1000;\n durationInMs -= milliseconds;\n milliseconds = Math.floor(milliseconds / 10);\n\n durationInMs = Math.floor(durationInMs / 1000);\n const seconds = durationInMs % 60;\n durationInMs -= seconds;\n\n durationInMs = Math.floor(durationInMs / 60);\n const minutes = durationInMs % 60;\n durationInMs -= minutes;\n\n durationInMs = Math.floor(durationInMs / 60);\n const hours = durationInMs % 60;\n\n if (hours > 0) {\n parts.push(String(hours).padStart(2, '0'));\n }\n parts.push(String(minutes).padStart(hours > 0 ? 2 : 1, '0'));\n parts.push(String(seconds).padStart(2, '0'));\n\n return `${parts.join(':')},${String(milliseconds).padStart(2, '0')}`;\n}\n\nexport function formatDateToString(date: Date) {\n return date.toLocaleString(\n 'en-US',\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n },\n );\n}\n\nfunction isValidDate(day: number, month: number, year = 2021): boolean {\n if (month > (MAX_MONTH_IN_YEAR - 1) || day > MAX_DAY_IN_MONTH) {\n return false;\n }\n const date = new Date(year, month, day);\n return !Number.isNaN(date.getTime()) && date.getDate() === day;\n}\n\nexport function parseDateString(query = ''): string | undefined {\n const matchStringDate = query.match(/\\d{1,2}\\s[a-zA-Z]{3,}/);\n const matchEuropeStringDate = query.match(/[a-zA-Z]{3,}\\s\\d{1,2}/);\n const matchNumberDate = query.match(/\\d{1,2}[./-]\\d{1,2}([./-]\\d{2,4})?/);\n if (!matchStringDate && !matchNumberDate && !matchEuropeStringDate) {\n return undefined;\n }\n\n if (matchNumberDate) {\n const [date, month, year] = query.split(/[./-]/).map(Number);\n return !(year && year < MIN_SEARCH_YEAR) && isValidDate(date, month - 1, year || undefined)\n ? `${year ? `${year}-` : ''}${String(month).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n }\n\n const dateParts = query.split(' ');\n const date = matchStringDate ? dateParts[0] : dateParts[1];\n const month = (matchStringDate ? dateParts[1] : dateParts[0]).toLowerCase();\n const monthIndex = MONTHS_FULL_LOWERCASE.findIndex((item) => item.startsWith(month));\n\n return monthIndex !== -1 && isValidDate(Number(date), monthIndex)\n ? `${String(monthIndex + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n}\n\nexport function timestampPlusDay(timestamp: number) {\n return timestamp + MILISECONDS_IN_DAY / 1000;\n}\n\nfunction lowerFirst(str: string) {\n return `${str[0].toLowerCase()}${str.slice(1)}`;\n}\n\nfunction upperFirst(str: string) {\n return `${str[0].toUpperCase()}${str.slice(1)}`;\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiPhoto } from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { omit } from '../../util/iteratees';\n\nexport function replaceChatListIds(\n global: GlobalState,\n type: 'active' | 'archived',\n newIds: number[] | undefined,\n): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n listIds: {\n ...global.chats.listIds,\n [type]: newIds,\n },\n },\n };\n}\n\nexport function updateChatListIds(global: GlobalState, type: 'active' | 'archived', idsUpdate: number[]): GlobalState {\n const { [type]: listIds } = global.chats.listIds;\n const newIds = listIds && listIds.length\n ? idsUpdate.filter((id) => !listIds.includes(id))\n : idsUpdate;\n\n if (listIds && !newIds.length) {\n return global;\n }\n\n return replaceChatListIds(global, type, [\n ...(listIds || []),\n ...newIds,\n ]);\n}\n\nexport function replaceChats(global: GlobalState, newById: Record): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n byId: newById,\n },\n };\n}\n\nexport function updateChat(\n global: GlobalState, chatId: number, chatUpdate: Partial, photo?: ApiPhoto,\n): GlobalState {\n const { byId } = global.chats;\n const chat = byId[chatId];\n const shouldOmitMinInfo = chatUpdate.isMin && chat && !chat.isMin;\n const updatedChat = {\n ...chat,\n ...(shouldOmitMinInfo ? omit(chatUpdate, ['isMin', 'accessHash']) : chatUpdate),\n ...(photo && { photos: [photo, ...(chat.photos || [])] }),\n };\n\n if (!updatedChat.id || !updatedChat.type) {\n return global;\n }\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, updatedById: Record): GlobalState {\n Object.keys(updatedById).forEach((id) => {\n global = updateChat(global, Number(id), updatedById[Number(id)]);\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addChats(global: GlobalState, addedById: Record): GlobalState {\n const { byId } = global.chats;\n Object.keys(addedById).map(Number).forEach((id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n global = updateChat(global, id, addedById[id]);\n }\n });\n\n return global;\n}\n\nexport function updateChatListType(\n global: GlobalState,\n chatId: number,\n folderId?: number,\n): GlobalState {\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n let currentListIds = global.chats.listIds;\n (Object.keys(currentListIds) as Array).forEach((listTypeKey) => {\n const currentFolderList = currentListIds[listTypeKey] || [];\n if (listTypeKey === listType && !currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: [...currentFolderList, chatId],\n };\n } else if (listTypeKey !== listType && currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: currentFolderList.filter((id) => id !== chatId),\n };\n }\n });\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n listIds: currentListIds,\n },\n };\n\n global = updateChat(global, chatId, { folderId: folderId || undefined });\n\n return global;\n}\n\nexport function updateChatListSecondaryInfo(\n global: GlobalState,\n type: 'active' | 'archived',\n info: {\n orderedPinnedIds?: number[];\n totalChatCount: number;\n },\n): GlobalState {\n const totalCountKey = type === 'active' ? 'all' : 'archived';\n\n return {\n ...global,\n chats: {\n ...global.chats,\n ...(info.orderedPinnedIds && {\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [type]: info.orderedPinnedIds,\n },\n }),\n totalCount: {\n ...global.chats.totalCount,\n [totalCountKey]: info.totalChatCount,\n },\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [type]: false,\n },\n },\n };\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport { ApiMessage, ApiThreadInfo, MAIN_THREAD_ID } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport { MESSAGE_LIST_SLICE, MESSAGE_LIST_VIEWPORT_LIMIT } from '../../config';\nimport {\n selectListedIds,\n selectChatMessages,\n selectViewportIds,\n selectOutlyingIds,\n selectPinnedIds,\n selectThreadInfo,\n selectMessageIdsByGroupId,\n selectScheduledMessages,\n selectScheduledIds,\n selectCurrentMessageIds,\n selectChatMessage,\n selectCurrentMessageList,\n} from '../selectors';\nimport {\n areSortedArraysEqual, omit, pickTruthy, unique,\n} from '../../util/iteratees';\n\ntype MessageStoreSections = {\n byId: Record;\n threadsById: Record;\n};\n\nexport function updateCurrentMessageList(\n global: GlobalState,\n chatId: number | undefined,\n threadId: number = MAIN_THREAD_ID,\n type: MessageListType = 'thread',\n): GlobalState {\n return {\n ...global,\n messages: {\n ...global.messages,\n // TODO Support stack navigation\n messageLists: chatId ? [{ chatId, threadId, type }] : undefined,\n },\n };\n}\n\nfunction replaceChatMessages(global: GlobalState, chatId: number, newById: Record): GlobalState {\n return updateMessageStore(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateThread(\n global: GlobalState, chatId: number, threadId: number, threadUpdate: Partial,\n): GlobalState {\n const current = global.messages.byChatId[chatId];\n\n return updateMessageStore(global, chatId, {\n threadsById: {\n ...(current && current.threadsById),\n [threadId]: {\n ...(current && current.threadsById[threadId]),\n ...threadUpdate,\n },\n },\n });\n}\n\nfunction updateMessageStore(\n global: GlobalState, chatId: number, update: Partial,\n): GlobalState {\n const current = global.messages.byChatId[chatId] || { byId: {}, threadsById: {} };\n\n return {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n ...global.messages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function replaceThreadParam(\n global: GlobalState, chatId: number, threadId: number, paramName: T, newValue: Thread[T] | undefined,\n) {\n return updateThread(global, chatId, threadId, { [paramName]: newValue });\n}\n\nexport function addMessages(\n global: GlobalState, messages: ApiMessage[],\n): GlobalState {\n const addedByChatId = messages.reduce((messagesByChatId, message: ApiMessage) => {\n if (!messagesByChatId[message.chatId]) {\n messagesByChatId[message.chatId] = {};\n }\n messagesByChatId[message.chatId][message.id] = message;\n\n return messagesByChatId;\n }, {} as Record>);\n\n Object.keys(addedByChatId).map(Number).forEach((chatId) => {\n global = addChatMessagesById(global, chatId, addedByChatId[chatId]);\n });\n\n return global;\n}\n\nexport function addChatMessagesById(\n global: GlobalState, chatId: number, newById: Record,\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n\n if (byId && Object.keys(newById).every((newId) => Boolean(byId[Number(newId)]))) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...newById,\n ...byId,\n });\n}\n\nexport function updateChatMessage(\n global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial,\n): GlobalState {\n const byId = selectChatMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n });\n}\n\nexport function updateScheduledMessage(\n global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial,\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceScheduledMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n }, undefined);\n}\n\nexport function deleteChatMessages(\n global: GlobalState,\n chatId: number,\n messageIds: number[],\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n const deletedForwardedPosts = Object.values(pickTruthy(byId, messageIds)).filter(\n ({ forwardInfo }) => forwardInfo && forwardInfo.isLinkedChannelPost,\n );\n\n const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number);\n threadIds.forEach((threadId) => {\n let listedIds = selectListedIds(global, chatId, threadId);\n let outlyingIds = selectOutlyingIds(global, chatId, threadId);\n let viewportIds = selectViewportIds(global, chatId, threadId);\n let pinnedIds = selectPinnedIds(global, chatId);\n\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\n }\n\n if (outlyingIds && outlyingIds.includes(messageId)) {\n outlyingIds = outlyingIds.filter((id) => id !== messageId);\n }\n\n if (viewportIds && viewportIds.includes(messageId)) {\n viewportIds = viewportIds.filter((id) => id !== messageId);\n }\n\n if (pinnedIds && pinnedIds.includes(messageId)) {\n pinnedIds = pinnedIds.filter((id) => id !== messageId);\n }\n });\n\n global = replaceThreadParam(global, chatId, threadId, 'listedIds', listedIds);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', outlyingIds);\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', viewportIds);\n global = replaceThreadParam(global, chatId, threadId, 'pinnedIds', pinnedIds);\n });\n\n if (deletedForwardedPosts.length) {\n const currentMessageList = selectCurrentMessageList(global);\n const canDeleteCurrentThread = currentMessageList && currentMessageList.chatId === chatId\n && currentMessageList.type === 'thread';\n const currentThreadId = currentMessageList && currentMessageList.threadId;\n\n deletedForwardedPosts.forEach((message) => {\n const { fromChatId, fromMessageId } = message.forwardInfo!;\n const originalPost = selectChatMessage(global, fromChatId!, fromMessageId!);\n\n if (canDeleteCurrentThread && currentThreadId === fromMessageId) {\n global = updateCurrentMessageList(global, chatId);\n }\n if (originalPost) {\n global = updateChatMessage(global, fromChatId!, fromMessageId!, { threadInfo: undefined });\n }\n });\n }\n\n global = replaceChatMessages(global, chatId, newById);\n\n return global;\n}\n\nexport function deleteChatScheduledMessages(\n global: GlobalState,\n chatId: number,\n messageIds: number[],\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n\n let scheduledIds = selectScheduledIds(global, chatId);\n if (scheduledIds) {\n messageIds.forEach((messageId) => {\n if (scheduledIds!.includes(messageId)) {\n scheduledIds = scheduledIds!.filter((id) => id !== messageId);\n }\n });\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', scheduledIds);\n }\n\n global = replaceScheduledMessages(global, chatId, newById, undefined);\n\n return global;\n}\n\nexport function updateListedIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const listedIds = selectListedIds(global, chatId, threadId);\n const newIds = listedIds && listedIds.length\n ? idsUpdate.filter((id) => !listedIds.includes(id))\n : idsUpdate;\n\n if (listedIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'listedIds', orderHistoryIds([\n ...(listedIds || []),\n ...newIds,\n ]));\n}\n\nexport function updateOutlyingIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const newIds = outlyingIds && outlyingIds.length\n ? idsUpdate.filter((id) => !outlyingIds.includes(id))\n : idsUpdate;\n\n if (outlyingIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'outlyingIds', orderHistoryIds([\n ...(outlyingIds || []),\n ...newIds,\n ]));\n}\n\nfunction orderHistoryIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n\nexport function addViewportId(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newId: number,\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n if (viewportIds.includes(newId)) {\n return global;\n }\n\n const newIds = orderHistoryIds([\n ...(\n viewportIds.length < MESSAGE_LIST_VIEWPORT_LIMIT\n ? viewportIds\n : viewportIds.slice(-(MESSAGE_LIST_SLICE / 2))\n ),\n newId,\n ]);\n\n return replaceThreadParam(global, chatId, threadId, 'viewportIds', newIds);\n}\n\nexport function safeReplaceViewportIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newViewportIds: number[],\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n\n return replaceThreadParam(\n global,\n chatId,\n threadId,\n 'viewportIds',\n areSortedArraysEqual(viewportIds, newViewportIds) ? viewportIds : newViewportIds,\n );\n}\n\nexport function updateThreadInfo(\n global: GlobalState, chatId: number, threadId: number, update: Partial | undefined,\n): GlobalState {\n const newThreadInfo = {\n ...(selectThreadInfo(global, chatId, threadId) as ApiThreadInfo),\n ...update,\n };\n\n if (!newThreadInfo.threadId) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'threadInfo', newThreadInfo);\n}\n\nexport function updateThreadInfos(\n global: GlobalState, chatId: number, updates: Partial[],\n): GlobalState {\n updates.forEach((update) => {\n global = updateThreadInfo(global, update.chatId!, update.threadId!, update);\n });\n\n return global;\n}\n\nexport function replaceScheduledMessages(\n global: GlobalState, chatId: number, newById: Record, hash: number | undefined,\n): GlobalState {\n return updateScheduledMessages(global, chatId, {\n byId: newById,\n hash,\n });\n}\n\nfunction updateScheduledMessages(\n global: GlobalState, chatId: number, update: Partial<{ byId: Record; hash: number }>,\n): GlobalState {\n const current = global.scheduledMessages.byChatId[chatId] || { byId: {}, hash: 0 };\n\n return {\n ...global,\n scheduledMessages: {\n byChatId: {\n ...global.scheduledMessages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateFocusedMessage(\n global: GlobalState, chatId?: number, messageId?: number, noHighlight = false,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n chatId,\n messageId,\n noHighlight,\n },\n };\n}\n\nexport function updateFocusDirection(\n global: GlobalState, direction?: FocusDirection,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n direction,\n },\n };\n}\n\nexport function enterMessageSelectMode(\n global: GlobalState,\n chatId: number,\n messageId?: number | number[],\n): GlobalState {\n const messageIds = messageId ? Array.prototype.concat([], messageId) : [];\n return {\n ...global,\n selectedMessages: {\n chatId,\n messageIds,\n },\n };\n}\n\nexport function toggleMessageSelection(\n global: GlobalState,\n chatId: number,\n threadId: number,\n messageListType: MessageListType,\n messageId: number,\n groupedId?: string,\n childMessageIds?: number[],\n withShift = false,\n): GlobalState {\n const { selectedMessages: oldSelectedMessages } = global;\n if (groupedId) {\n childMessageIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n }\n const selectedMessageIds = childMessageIds || [messageId];\n if (!oldSelectedMessages) {\n return enterMessageSelectMode(global, chatId, selectedMessageIds);\n }\n\n const { messageIds } = oldSelectedMessages;\n\n let newMessageIds;\n const newSelectedMessageIds = selectedMessageIds.filter((id) => !messageIds.includes(id));\n if (newSelectedMessageIds && !newSelectedMessageIds.length) {\n newMessageIds = messageIds.filter((id) => !selectedMessageIds.includes(id));\n } else if (withShift && messageIds.length) {\n const viewportIds = selectCurrentMessageIds(global, chatId, threadId, messageListType)!;\n const prevIndex = viewportIds.indexOf(messageIds[messageIds.length - 1]);\n const currentIndex = viewportIds.indexOf(messageId);\n const from = Math.min(prevIndex, currentIndex);\n const to = Math.max(prevIndex, currentIndex);\n const slice = viewportIds.slice(from, to + 1);\n newMessageIds = unique([...messageIds, ...slice]);\n } else {\n newMessageIds = [...messageIds, ...newSelectedMessageIds];\n }\n\n if (!newMessageIds.length) {\n return exitMessageSelectMode(global);\n }\n\n return {\n ...global,\n selectedMessages: {\n ...oldSelectedMessages,\n messageIds: newMessageIds,\n },\n };\n}\n\nexport function exitMessageSelectMode(global: GlobalState): GlobalState {\n return {\n ...global,\n selectedMessages: undefined,\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker, ApiStickerSet, ApiVideo } from '../../api/types';\nimport { buildCollectionByKey, unique } from '../../util/iteratees';\nimport { selectStickersForEmoji } from '../selectors';\n\nexport function updateStickerSets(\n global: GlobalState,\n category: 'added' | 'featured' | 'search',\n hash: number,\n sets: ApiStickerSet[],\n resultIds?: string[],\n): GlobalState {\n const updatedSets = sets.map((stickerSet) => {\n const existing = global.stickers.setsById[stickerSet.id];\n if (!existing) {\n return stickerSet;\n }\n\n return {\n ...existing,\n ...stickerSet,\n };\n });\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n ...buildCollectionByKey(updatedSets, 'id'),\n },\n [category]: {\n ...global.stickers[category],\n hash,\n ...(\n category === 'search'\n ? { resultIds }\n : { setIds: sets.map(({ id }) => id) }\n ),\n },\n },\n };\n}\n\nexport function updateStickerSet(\n global: GlobalState, stickerSetId: string, update: Partial,\n): GlobalState {\n const currentStickerSet = global.stickers.setsById[stickerSetId] || {};\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n [stickerSetId]: {\n ...currentStickerSet,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateGifSearch(\n global: GlobalState, isNew: boolean, results: ApiVideo[], nextOffset?: string,\n): GlobalState {\n const { results: currentResults } = global.gifs.search;\n\n let newResults!: ApiVideo[];\n if (isNew || !currentResults) {\n newResults = results;\n } else {\n const currentIds = new Set(currentResults.map((gif) => gif.id));\n newResults = [\n ...currentResults,\n ...results.filter((gif) => !currentIds.has(gif.id)),\n ];\n }\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n ...global.gifs.search,\n offset: nextOffset,\n results: newResults,\n },\n },\n };\n}\n\nexport function replaceAnimatedEmojis(global: GlobalState, stickerSet: ApiStickerSet): GlobalState {\n return {\n ...global,\n animatedEmojis: stickerSet,\n };\n}\n\nexport function updateStickersForEmoji(\n global: GlobalState, emoji: string, remoteStickers?: ApiSticker[], hash?: number,\n): GlobalState {\n const localStickers = selectStickersForEmoji(global, emoji);\n const allStickers = [...localStickers, ...(remoteStickers || [])];\n const uniqueIds = unique(allStickers.map(({ id }) => id));\n const byId = buildCollectionByKey(allStickers, 'id');\n const stickers = uniqueIds.map((id) => byId[id]);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n emoji,\n stickers,\n hash,\n },\n },\n };\n}\n\nexport function rebuildStickersForEmoji(global: GlobalState): GlobalState {\n const { emoji, stickers, hash } = global.stickers.forEmoji || {};\n if (!emoji) {\n return global;\n }\n\n return updateStickersForEmoji(global, emoji, stickers, hash);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiUser } from '../../api/types';\n\nimport { omit } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nexport function replaceUsers(global: GlobalState, newById: Record): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n byId: newById,\n },\n };\n}\nexport function updateUser(global: GlobalState, userId: number, userUpdate: Partial): GlobalState {\n const { byId } = global.users;\n const { hash, userIds: contactUserIds } = global.contactList || {};\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return global;\n }\n\n if (updatedUser.isContact && (contactUserIds && !contactUserIds.includes(userId))) {\n global = {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: [userId, ...contactUserIds],\n },\n };\n }\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, updatedById: Record): GlobalState {\n Object.keys(updatedById).map(Number).forEach((id) => {\n global = updateUser(global, id, updatedById[id]);\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUsers(global: GlobalState, addedById: Record): GlobalState {\n const { byId } = global.users;\n Object.keys(addedById).map(Number).forEach((id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n global = updateUser(global, id, addedById[id]);\n }\n });\n\n return global;\n}\n\nexport function updateSelectedUserId(global: GlobalState, selectedId?: number): GlobalState {\n if (global.users.selectedId === selectedId) {\n return global;\n }\n\n return {\n ...global,\n users: {\n ...global.users,\n selectedId,\n },\n };\n}\n\nexport function deleteUser(global: GlobalState, userId: number): GlobalState {\n const { byId } = global.users;\n const { hash, userIds } = global.contactList || {};\n delete byId[userId];\n\n global = {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: userIds ? userIds.filter((id) => id !== userId) : MEMO_EMPTY_ARRAY,\n },\n };\n\n return replaceUsers(global, byId);\n}\n","import { GlobalState } from '../../global/types';\nimport { GlobalSearchContent } from '../../types';\nimport { ApiGlobalMessageSearchType, ApiMessage } from '../../api/types';\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nconst getComplexKey = (message: ApiMessage) => `${message.chatId}_${message.id}`;\n\nexport function updateGlobalSearch(\n global: GlobalState,\n searchStatePartial: Partial,\n) {\n return {\n ...global,\n globalSearch: {\n ...global.globalSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateGlobalSearchContent(\n global: GlobalState,\n currentContent: GlobalSearchContent | undefined,\n): GlobalState {\n return updateGlobalSearch(global, { currentContent });\n}\n\nexport function updateGlobalSearchResults(\n global: GlobalState,\n newFoundMessages: ApiMessage[],\n totalCount: number,\n type: ApiGlobalMessageSearchType,\n nextRate?: number,\n): GlobalState {\n const { resultsByType } = global.globalSearch || {};\n const newFoundMessagesById = newFoundMessages.reduce((result, message) => {\n result[getComplexKey(message)] = message;\n\n return result;\n }, {} as Record);\n const foundIdsForType = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : undefined;\n\n if (foundIdsForType !== undefined\n && Object.keys(newFoundMessagesById).every(\n (newId) => foundIdsForType.includes(getComplexKey(newFoundMessagesById[newId])),\n )\n ) {\n return updateGlobalSearchFetchingStatus(global, { messages: false });\n }\n\n const prevFoundIds = foundIdsForType || [];\n const newFoundIds = newFoundMessages.map((message) => getComplexKey(message));\n const foundIds = Array.prototype.concat(prevFoundIds, newFoundIds);\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n global = updateGlobalSearchFetchingStatus(global, { messages: false });\n\n return updateGlobalSearch(global, {\n resultsByType: {\n ...(global.globalSearch || {}).resultsByType,\n [type]: {\n totalCount,\n nextOffsetId: nextRate,\n foundIds: foundOrPrevFoundIds,\n },\n },\n });\n}\n\nexport function updateGlobalSearchFetchingStatus(\n global: GlobalState, newState: { chats?: boolean; messages?: boolean },\n) {\n return updateGlobalSearch(global, {\n fetchingStatus: {\n ...global.globalSearch.fetchingStatus,\n ...newState,\n },\n });\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiMessageSearchType } from '../../api/types';\n\nimport { areSortedArraysEqual, unique } from '../../util/iteratees';\nimport { SharedMediaType } from '../../types';\nimport { buildChatThreadKey } from '../helpers';\n\ninterface TextSearchParams {\n isActive: boolean;\n query?: string;\n results?: {\n totalCount?: number;\n nextOffsetId?: number;\n foundIds?: number[];\n };\n}\n\ninterface MediaSearchParams {\n currentType?: SharedMediaType;\n resultsByType?: Partial>;\n}\n\nfunction replaceLocalTextSearch(\n global: GlobalState,\n chatThreadKey: string,\n searchParams: TextSearchParams,\n): GlobalState {\n return {\n ...global,\n localTextSearch: {\n byChatThreadKey: {\n ...global.localTextSearch.byChatThreadKey,\n [chatThreadKey]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalTextSearch(\n global: GlobalState,\n chatId: number,\n threadId: number,\n isActive: boolean,\n query?: string,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n isActive,\n query,\n });\n}\n\nexport function replaceLocalTextSearchResults(\n global: GlobalState,\n chatId: number,\n threadId: number,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n results: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n });\n}\n\nexport function updateLocalTextSearchResults(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { results } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n const prevFoundIds = (results && results.foundIds) || [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalTextSearchResults(global, chatId, threadId, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction replaceLocalMediaSearch(\n global: GlobalState,\n chatId: number,\n searchParams: MediaSearchParams,\n): GlobalState {\n return {\n ...global,\n localMediaSearch: {\n byChatId: {\n ...global.localMediaSearch.byChatId,\n [chatId]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalMediaSearchType(\n global: GlobalState,\n chatId: number,\n currentType: SharedMediaType | undefined,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n currentType,\n });\n}\n\nexport function replaceLocalMediaSearchResults(\n global: GlobalState,\n chatId: number,\n type: ApiMessageSearchType,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n resultsByType: {\n ...(global.localMediaSearch.byChatId[chatId] || {}).resultsByType,\n [type]: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n },\n });\n}\n\nexport function updateLocalMediaSearchResults(\n global: GlobalState,\n chatId: number,\n type: SharedMediaType,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const { resultsByType } = global.localMediaSearch.byChatId[chatId] || {};\n const prevFoundIds = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalMediaSearchResults(global, chatId, type, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction orderFoundIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n","import { GlobalState } from '../../global/types';\nimport { ManagementProgress } from '../../types';\n\ninterface ManagementState {\n isActive: boolean;\n isUsernameAvailable?: boolean;\n error?: string;\n}\n\nexport function updateManagementProgress(global: GlobalState, progress: ManagementProgress): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n progress,\n },\n };\n}\n\nexport function updateManagement(global: GlobalState, chatId: number, update: Partial): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...(global.management.byChatId[chatId] || {}),\n ...update,\n },\n },\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ISettings } from '../../types';\n\nexport function replaceSettings(global: GlobalState, newSettings?: Partial): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n byKey: {\n ...global.settings.byKey,\n ...newSettings,\n },\n },\n };\n}\n\nexport function updateNotifySettings(\n global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, isShowPreviews?: boolean,\n) {\n switch (peerType) {\n case 'contact':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }),\n ...(typeof isShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: isShowPreviews }),\n });\n case 'group':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }),\n ...(typeof isShowPreviews !== 'undefined' && { hasGroupMessagePreview: isShowPreviews }),\n });\n case 'broadcast':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }),\n ...(typeof isShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: isShowPreviews }),\n });\n\n default:\n return undefined;\n }\n}\n\nexport function addBlockedContact(global: GlobalState, contactId: number): GlobalState {\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: [contactId, ...global.blocked.ids],\n totalCount: global.blocked.totalCount + 1,\n },\n };\n}\n\nexport function removeBlockedContact(global: GlobalState, contactId: number): GlobalState {\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: global.blocked.ids.filter((id) => id !== contactId),\n totalCount: global.blocked.totalCount - 1,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\n\nexport function updateTwoFaSettings(\n global: GlobalState,\n update: GlobalState['twoFaSettings'],\n): GlobalState {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n ...update,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ShippingOption, PaymentStep } from '../../types';\nimport { ApiMessage, ApiPaymentForm, ApiReceipt } from '../../api/types';\n\nexport function updateShippingOptions(\n global: GlobalState,\n shippingOptions: ShippingOption[],\n): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n shippingOptions,\n },\n };\n}\n\nexport function setRequestInfoId(global: GlobalState, id: string): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n formId: id,\n },\n };\n}\n\nexport function setPaymentStep(global: GlobalState, step: PaymentStep): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n step,\n },\n };\n}\n\nexport function setInvoiceMessageInfo(global: GlobalState, message: ApiMessage): GlobalState {\n if (!message.content || !message.content.invoice) {\n return global;\n }\n const {\n title,\n text,\n description,\n photoUrl,\n } = message.content.invoice;\n return {\n ...global,\n payment: {\n ...global.payment,\n invoiceContent: {\n title,\n text,\n description,\n photoUrl,\n },\n },\n };\n}\n\nexport function setStripeCardInfo(global: GlobalState, cardInfo: { type: string; id: string }): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n stripeCredentials: {\n ...cardInfo,\n },\n },\n };\n}\n\nexport function setPaymentForm(global: GlobalState, form: ApiPaymentForm): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n ...form,\n },\n };\n}\n\nexport function setReceipt(\n global: GlobalState,\n receipt?: ApiReceipt,\n message?: ApiMessage,\n): GlobalState {\n if (!receipt || !message) {\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n };\n }\n\n const { invoice: messageInvoice } = message.content;\n const { photoUrl, text, title } = (messageInvoice || {});\n\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: {\n ...receipt,\n photoUrl,\n text,\n title,\n },\n },\n };\n}\n\nexport function clearPayment(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {},\n };\n}\n\nexport function closeInvoice(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n isPaymentModalOpen: false,\n },\n };\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [, setTrigger] = useState(false);\n\n return useCallback(() => {\n setTrigger((trigger) => !trigger);\n }, []);\n};\n","const DEFAULT_MAX_TEXT_LENGTH = 30;\n\nexport default function trimText(text: string | undefined, length = DEFAULT_MAX_TEXT_LENGTH) {\n if (!text || text.length <= length) {\n return text;\n }\n\n return `${text.substr(0, length)}...`;\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './MenuItem.scss';\n\ntype OnClickHandler = (e: React.SyntheticEvent) => void;\n\ntype OwnProps = {\n icon?: string;\n className?: string;\n children: any;\n onClick?: OnClickHandler;\n href?: string;\n download?: string;\n disabled?: boolean;\n destructive?: boolean;\n ariaLabel?: string;\n};\n\nconst MenuItem: FC = (props) => {\n const {\n icon,\n className,\n children,\n onClick,\n href,\n download,\n disabled,\n destructive,\n ariaLabel,\n } = props;\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode !== 13 && e.keyCode !== 32) {\n return;\n }\n\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const fullClassName = buildClassName(\n 'MenuItem',\n className,\n disabled && 'disabled',\n destructive && 'destructive',\n );\n\n const content = (\n <>\n {icon && (\n \n )}\n {children}\n \n );\n\n if (href) {\n return (\n \n {content}\n \n );\n }\n\n return (\n \n {content}\n
\n );\n};\n\nexport default MenuItem;\n","import React, {\n FC, useCallback, useMemo, useState, memo,\n} from '../../lib/teact/teact';\nimport { debounce } from '../../util/schedulers';\n\nimport './RippleEffect.scss';\n\ninterface Ripple {\n x: number;\n y: number;\n size: number;\n}\n\nconst ANIMATION_DURATION_MS = 700;\n\nconst RippleEffect: FC = () => {\n const [ripples, setRipples] = useState([]);\n\n const cleanUpDebounced = useMemo(() => {\n return debounce(() => {\n setRipples([]);\n }, ANIMATION_DURATION_MS, false);\n }, []);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (e.button !== 0) {\n return;\n }\n\n const container = e.currentTarget as HTMLDivElement;\n const position = container.getBoundingClientRect() as DOMRect;\n\n const rippleSize = container.offsetWidth / 2;\n\n setRipples([\n ...ripples,\n {\n x: e.clientX - position.x - (rippleSize / 2),\n y: e.clientY - position.y - (rippleSize / 2),\n size: rippleSize,\n },\n ]);\n\n requestAnimationFrame(() => {\n cleanUpDebounced();\n });\n }, [ripples, cleanUpDebounced]);\n\n return (\n
\n {ripples.map(({ x, y, size }: Ripple) => (\n \n ))}\n
\n );\n};\n\nexport default memo(RippleEffect);\n","import WebpWorker from 'worker-loader!../lib/webp/webp_wasm.worker';\nimport { isWebpSupported } from './environment';\nimport { dataUriToBlob, blobToDataUri } from './files';\nimport { pause } from './schedulers';\n\ntype TEncodedImage = {\n result: Uint8ClampedArray;\n width: number;\n height: number;\n};\n\nconst WORKER_INITIALIZATION_TIMEOUT = 2000;\n\nlet canvas: HTMLCanvasElement;\nlet worker: IWebpWorker;\n\nexport const EMPTY_IMAGE_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk'\n + 'YAAAAAYAAjCB0C8AAAAASUVORK5CYII=';\n\nexport async function webpToPng(url: string, blob: Blob): Promise {\n initWebpWorker();\n\n while (!worker.wasmReady) {\n await pause(WORKER_INITIALIZATION_TIMEOUT);\n }\n\n const { result, width, height } = await getDecodePromise(url, blob);\n if (!width || !height) {\n return undefined;\n }\n\n return createPng({ result, width, height });\n}\n\nexport async function webpToPngBase64(key: string, url: string): Promise {\n if (isWebpSupported() || url.substr(0, 15) !== 'data:image/webp') {\n return url;\n }\n\n initWebpWorker();\n\n const pngBlob = await webpToPng(key, dataUriToBlob(url));\n\n if (!pngBlob) {\n throw new Error(`Can't convert webp to png. Url: ${url}`);\n }\n\n return blobToDataUri(pngBlob);\n}\n\nfunction initWebpWorker() {\n if (!worker) {\n worker = new WebpWorker() as IWebpWorker;\n worker.wasmReady = false;\n worker.onmessage = handleLibWebpMessage;\n }\n}\n\nfunction createPng({ result, width, height }: TEncodedImage): Promise {\n if (!canvas) {\n canvas = document.createElement('canvas');\n }\n\n return new Promise((resolve) => {\n const img = new ImageData(result, width, height);\n\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.putImageData(img, 0, 0);\n\n canvas.toBlob((blob) => {\n resolve(blob ?? undefined);\n }, 'image/png', 1);\n });\n}\n\nfunction handleLibWebpMessage(e: MessageEvent) {\n const { id } = e.data;\n switch (e.data.type) {\n case 'initialized': {\n worker.wasmReady = true;\n break;\n }\n\n case 'result': {\n if (worker.requests.has(id)) {\n const resolve = worker.requests.get(id)!;\n\n worker.requests.delete(id);\n resolve(e.data!);\n }\n break;\n }\n }\n}\n\nfunction getDecodePromise(url: string, blob: Blob): Promise {\n return new Promise((resolve) => {\n worker.requests = worker.requests || new Map();\n worker.requests.set(url, resolve);\n worker.postMessage({ id: url, blob });\n });\n}\n","import { useRef } from '../lib/teact/teact';\n\nfunction usePrevious(next: T): T | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined: true): Exclude | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined?: boolean): Exclude | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined?: boolean) {\n const ref = useRef();\n const { current } = ref;\n if (!shouldSkipUndefined || next !== undefined) {\n ref.current = next;\n }\n\n return current;\n}\n\nexport default usePrevious;\n","import { ChangeEvent, FormEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n ref?: RefObject;\n id?: string;\n className?: string;\n value?: string;\n label?: string;\n error?: string;\n success?: string;\n disabled?: boolean;\n readOnly?: boolean;\n placeholder?: string;\n autoComplete?: string;\n maxLength?: number;\n inputMode?: 'text' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';\n onChange?: (e: ChangeEvent) => void;\n onInput?: (e: FormEvent) => void;\n onKeyPress?: (e: React.KeyboardEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onBlur?: (e: React.FocusEvent) => void;\n};\n\nconst InputText: FC = ({\n ref,\n id,\n className,\n value,\n label,\n error,\n success,\n disabled,\n readOnly,\n placeholder,\n autoComplete,\n inputMode,\n maxLength,\n onChange,\n onInput,\n onKeyPress,\n onKeyDown,\n onBlur,\n}) => {\n const labelText = error || success || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error ? 'error' : success && 'success',\n disabled && 'disabled',\n readOnly && 'disabled',\n labelText && 'with-label',\n className,\n );\n\n return (\n
\n \n {labelText && (\n \n )}\n
\n );\n};\n\nexport default memo(InputText);\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Spinner from './Spinner';\n\nimport './Checkbox.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n subLabel?: string;\n checked: boolean;\n disabled?: boolean;\n round?: boolean;\n blocking?: boolean;\n isLoading?: boolean;\n withCheckedCallback?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Checkbox: FC = ({\n id,\n name,\n value,\n label,\n subLabel,\n checked,\n disabled,\n round,\n blocking,\n isLoading,\n onChange,\n onCheck,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n if (onChange) {\n onChange(event);\n }\n\n if (onCheck) {\n onCheck(event.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Checkbox',\n disabled && 'disabled',\n round && 'round',\n isLoading && 'loading',\n blocking && 'blocking',\n );\n\n return (\n \n );\n};\n\nexport default memo(Checkbox);\n","import captureKeyboardListener from './captureKeyboardListeners';\n\ntype IHandlerFunction = () => void;\n\nexport default function captureEscKeyListener(handler: IHandlerFunction) {\n return captureKeyboardListener({ onEsc: handler });\n}\n","import { useEffect } from '../lib/teact/teact';\n\nconst ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nconst ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\nexport const dispatchHeavyAnimationEvent = (duration: number) => {\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n isAnimating = true;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n timeout = window.setTimeout(() => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n timeout = undefined;\n }, duration);\n};\n\nexport default (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (isAnimating) {\n handleAnimationStart();\n }\n\n document.addEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n document.addEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n document.removeEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n document.removeEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n };\n }, [handleAnimationEnd, handleAnimationStart]);\n};\n","export function formatInteger(value: number) {\n return String(value).replace(/\\d(?=(\\d{3})+$)/g, '$& ');\n}\n\nfunction formatFixedNumber(number: number) {\n const fixed = String(number.toFixed(1));\n if (fixed.substr(-2) === '.0') {\n return Math.round(number);\n }\n\n return number.toFixed(1).replace('.', ',');\n}\n\nexport function formatIntegerCompact(views: number) {\n if (views < 1e3) {\n return views;\n }\n\n if (views < 1e6) {\n return `${formatFixedNumber(views / 1e3)}K`;\n }\n\n return `${formatFixedNumber(views / 1e6)}M`;\n}\n\nexport function getFirstLetters(phrase: string, count = 2) {\n return phrase\n .replace(/[.,!@#$%^&*()_+=\\-`~[\\]/\\\\{}:\"|<>?]+/gi, '')\n .trim()\n .split(/\\s+/)\n .slice(0, count)\n .map((word: string) => word.length && word.match(/./u)![0].toUpperCase())\n .join('');\n}\n","export const MEMO_EMPTY_ARRAY = [];\n","const RE_NOT_LETTER = /[^\\wа-яё]+/;\n\nexport default function searchWords(haystack: string, needle: string) {\n if (!haystack || !needle) {\n return false;\n }\n\n const haystackWords = haystack.toLowerCase().split(RE_NOT_LETTER);\n const needleWords = needle.toLowerCase().split(RE_NOT_LETTER);\n\n return needleWords.every((needleWord) => (\n haystackWords.some((haystackWord) => haystackWord.startsWith(needleWord))\n ));\n}\n","import { RefObject } from 'react';\nimport React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useVirtualBackdrop from '../../hooks/useVirtualBackdrop';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Menu.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n containerRef?: RefObject;\n isOpen: boolean;\n className?: string;\n style?: string;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n autoClose?: boolean;\n footer?: string;\n noCloseOnBackdrop?: boolean;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onCloseAnimationEnd?: () => void;\n onClose?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: (e: React.MouseEvent) => void;\n children: any;\n};\n\nconst ANIMATION_DURATION = 200;\n\nconst Menu: FC = ({\n ref,\n containerRef,\n isOpen,\n className,\n style,\n children,\n positionX = 'left',\n positionY = 'top',\n autoClose = false,\n footer,\n noCloseOnBackdrop = false,\n onCloseAnimationEnd,\n onClose,\n onMouseEnter,\n onMouseLeave,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let menuRef = useRef(null);\n if (ref) {\n menuRef = ref;\n }\n const backdropContainerRef = containerRef || menuRef;\n\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n\n useEffect(() => (isOpen && onClose ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n if (prevIsOpen !== undefined) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n }, [isOpen]);\n\n const handleKeyDown = useKeyboardListNavigation(menuRef, isOpen, autoClose ? onClose : undefined);\n\n useVirtualBackdrop(\n isOpen,\n backdropContainerRef,\n noCloseOnBackdrop ? undefined : onClose,\n );\n\n const bubbleClassName = buildClassName(\n 'bubble menu-container custom-scroll',\n positionY,\n positionX,\n footer && 'with-footer',\n transitionClassNames,\n );\n\n return (\n \n {isOpen && (\n // This only prevents click events triggering on underlying elements\n
\n )}\n \n {children}\n {footer &&
{footer}
}\n
\n \n );\n};\n\nexport default Menu;\n","import { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nexport default (\n elementRef: RefObject,\n isOpen: boolean,\n onSelectWithEnter?: () => void,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n }, [isOpen]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n if (e.keyCode === 13 && onSelectWithEnter) {\n onSelectWithEnter();\n return;\n }\n\n if (e.keyCode !== 38 && e.keyCode !== 40) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(element.children);\n\n let newIndex = (focusedElement && elementChildren.indexOf(focusedElement)) || focusedIndex;\n\n if (e.keyCode === 38 && newIndex > 0) {\n newIndex--;\n } else if (e.keyCode === 40 && newIndex < elementChildren.length - 1) {\n newIndex++;\n } else if (elementChildren.length === 1) {\n newIndex = 0;\n } else {\n return;\n }\n\n const item = elementChildren[newIndex] as HTMLElement;\n if (item) {\n setFocusedIndex(newIndex);\n item.focus();\n }\n }, [focusedIndex, elementRef, onSelectWithEnter]);\n\n return handleKeyDown;\n};\n","import DecoderWorker from 'worker-loader!opus-recorder/dist/decoderWorker.min';\nimport WavWorker from 'worker-loader!opus-recorder/dist/waveWorker.min';\n\nconst SAMPLE_RATE = 48000;\nconst BIT_DEPTH = 16;\n\nexport async function oggToWav(opusData: Blob): Promise {\n const arrayBuffer = await new Response(opusData).arrayBuffer();\n\n return new Promise((resolve) => {\n const typedArray = new Uint8Array(arrayBuffer);\n\n let decoderWorker: DecoderWorker | undefined = new DecoderWorker();\n let wavWorker: WavWorker | undefined = new WavWorker();\n\n decoderWorker.onmessage = (e) => {\n // eslint-disable-next-line no-null/no-null\n if (e.data === null) {\n // `null` means decoder is finished\n wavWorker!.postMessage({ command: 'done' });\n } else {\n // `e.data` contains decoded buffers as float32 values\n wavWorker!.postMessage(\n {\n command: 'encode',\n buffers: e.data,\n },\n e.data.map(({ buffer }: Float32Array) => buffer),\n );\n }\n };\n\n wavWorker.onmessage = (e) => {\n if (e.data.message === 'page') {\n resolve(new Blob([e.data.page], { type: 'audio/wav' }));\n\n decoderWorker!.terminate();\n decoderWorker = undefined;\n wavWorker!.terminate();\n wavWorker = undefined;\n }\n };\n\n wavWorker.postMessage({\n command: 'init',\n wavBitDepth: BIT_DEPTH,\n wavSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'init',\n decoderSampleRate: SAMPLE_RATE,\n outputBufferSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'decode',\n pages: typedArray,\n }, [typedArray.buffer]);\n });\n}\n","import {\n ApiMediaFormat,\n ApiMediaFormatToPrepared,\n ApiOnProgress,\n ApiParsedMedia,\n ApiPreparedMedia,\n} from '../api/types';\n\nimport {\n DEBUG, MEDIA_CACHE_DISABLED, MEDIA_CACHE_NAME, MEDIA_CACHE_NAME_AVATARS,\n} from '../config';\nimport { callApi, cancelApiProgress } from '../api/gramjs';\nimport * as cacheApi from './cacheApi';\nimport { fetchBlob } from './files';\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, isWebpSupported } from './environment';\nimport { oggToWav } from './oggToWav';\nimport { webpToPng } from './webpToPng';\n\nconst asCacheApiType = {\n [ApiMediaFormat.DataUri]: cacheApi.Type.Text,\n [ApiMediaFormat.BlobUrl]: cacheApi.Type.Blob,\n [ApiMediaFormat.Lottie]: cacheApi.Type.Json,\n [ApiMediaFormat.Progressive]: undefined,\n [ApiMediaFormat.Stream]: undefined,\n};\n\nconst PROGRESSIVE_URL_PREFIX = './progressive/';\n\nconst memoryCache = new Map();\nconst fetchPromises = new Map>();\n\nexport function fetch(\n url: string, mediaFormat: T, onProgress?: ApiOnProgress,\n): Promise> {\n if (mediaFormat === ApiMediaFormat.Progressive) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getProgressive(url)\n : fetch(url, ApiMediaFormat.BlobUrl, onProgress)\n ) as Promise>;\n }\n\n if (!fetchPromises.has(url)) {\n const promise = fetchFromCacheOrRemote(url, mediaFormat, onProgress)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n\n return undefined;\n })\n .finally(() => {\n fetchPromises.delete(url);\n });\n\n fetchPromises.set(url, promise);\n }\n\n return fetchPromises.get(url) as Promise>;\n}\n\nexport function getFromMemory(url: string) {\n return memoryCache.get(url) as ApiMediaFormatToPrepared;\n}\n\nexport function cancelProgress(progressCallback: ApiOnProgress) {\n cancelApiProgress(progressCallback);\n}\n\nfunction getProgressive(url: string) {\n const progressiveUrl = `${PROGRESSIVE_URL_PREFIX}${url}`;\n\n memoryCache.set(url, progressiveUrl);\n\n return Promise.resolve(progressiveUrl);\n}\n\nasync function fetchFromCacheOrRemote(url: string, mediaFormat: ApiMediaFormat, onProgress?: ApiOnProgress) {\n if (!MEDIA_CACHE_DISABLED) {\n const cacheName = url.startsWith('avatar') ? MEDIA_CACHE_NAME_AVATARS : MEDIA_CACHE_NAME;\n const cached = await cacheApi.fetch(cacheName, url, asCacheApiType[mediaFormat]!);\n if (cached) {\n let media = cached;\n\n if (cached.type === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n media = await oggToWav(media);\n }\n\n if (cached.type === 'image/webp' && !isWebpSupported() && media) {\n const mediaPng = await webpToPng(url, media);\n if (mediaPng) {\n media = mediaPng;\n }\n }\n\n const prepared = prepareMedia(media);\n\n memoryCache.set(url, prepared);\n\n return prepared;\n }\n }\n\n if (mediaFormat === ApiMediaFormat.Stream) {\n const mediaSource = new MediaSource();\n const streamUrl = URL.createObjectURL(mediaSource);\n let isOpen = false;\n\n mediaSource.addEventListener('sourceopen', () => {\n if (isOpen) {\n return;\n }\n isOpen = true;\n\n const sourceBuffer = mediaSource.addSourceBuffer('audio/mpeg');\n\n void callApi('downloadMedia', { url, mediaFormat }, (progress: number, arrayBuffer: ArrayBuffer) => {\n if (onProgress) {\n onProgress(progress);\n }\n\n if (progress === 1) {\n mediaSource.endOfStream();\n }\n\n if (!arrayBuffer) {\n return;\n }\n\n sourceBuffer.appendBuffer(arrayBuffer!);\n });\n });\n\n memoryCache.set(url, streamUrl);\n return streamUrl;\n }\n\n const remote = await callApi('downloadMedia', { url, mediaFormat }, onProgress);\n if (!remote) {\n throw new Error('Failed to fetch media');\n }\n\n let { prepared, mimeType } = remote;\n\n if (mimeType === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await oggToWav(blob);\n prepared = prepareMedia(media);\n mimeType = blob.type;\n }\n\n if (mimeType === 'image/webp' && !isWebpSupported()) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await webpToPng(url, blob);\n if (media) {\n prepared = prepareMedia(media);\n }\n }\n\n memoryCache.set(url, prepared);\n\n return prepared;\n}\n\nfunction prepareMedia(mediaData: ApiParsedMedia): ApiPreparedMedia {\n if (mediaData instanceof Blob) {\n return URL.createObjectURL(mediaData);\n }\n\n return mediaData;\n}\n\nif (IS_PROGRESSIVE_SUPPORTED) {\n navigator.serviceWorker.addEventListener('message', async (e) => {\n const { type, messageId, params } = e.data as {\n type: string;\n messageId: string;\n params: { url: string; start: number; end: number };\n };\n\n if (type !== 'requestPart') {\n return;\n }\n\n const result = await callApi('downloadMedia', { mediaFormat: ApiMediaFormat.Progressive, ...params });\n if (!result) {\n return;\n }\n\n const { arrayBuffer, mimeType, fullSize } = result;\n\n navigator.serviceWorker.controller!.postMessage({\n type: 'partResponse',\n messageId,\n result: {\n arrayBuffer,\n mimeType,\n fullSize,\n },\n }, [arrayBuffer!]);\n });\n}\n","type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onLeft' | 'onRight'\n| 'onTab';\ntype Handler = (e: KeyboardEvent) => void;\ntype CaptureOptions = Partial>;\n\nconst keyToHandlerName: Record = {\n Enter: 'onEnter',\n Backspace: 'onBackspace',\n Delete: 'onDelete',\n Esc: 'onEsc',\n Escape: 'onEsc',\n ArrowUp: 'onUp',\n ArrowDown: 'onDown',\n ArrowLeft: 'onLeft',\n ArrowRight: 'onRight',\n Tab: 'onTab',\n};\n\nconst handlers: Record = {\n onEnter: [],\n onDelete: [],\n onBackspace: [],\n onEsc: [],\n onUp: [],\n onDown: [],\n onLeft: [],\n onRight: [],\n onTab: [],\n};\n\nexport default function captureKeyboardListeners(options: CaptureOptions) {\n if (!hasActiveHandlers()) {\n document.addEventListener('keydown', handleKeyDown, true);\n }\n\n (Object.keys(options) as Array).forEach((handlerName) => {\n const handler = options[handlerName];\n if (!handler) {\n return;\n }\n\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n currentEventHandlers.push(handler);\n }\n });\n\n return () => {\n releaseKeyboardListener(options);\n };\n}\n\nfunction hasActiveHandlers() {\n return Object.values(handlers).some((keyHandlers) => Boolean(keyHandlers.length));\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n const handlerName = keyToHandlerName[e.key];\n if (!handlerName) {\n return;\n }\n\n const { length } = handlers[handlerName];\n if (!length) {\n return;\n }\n e.stopPropagation();\n\n const handler = handlers[handlerName][length - 1];\n handler!(e);\n}\n\nfunction releaseKeyboardListener(options: CaptureOptions) {\n (Object.keys(options) as Array).forEach((handlerName) => {\n const handler = options[handlerName];\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n const index = currentEventHandlers.findIndex((cb) => cb === handler);\n if (index !== -1) {\n currentEventHandlers.splice(index, 1);\n }\n }\n });\n\n if (!hasActiveHandlers()) {\n document.removeEventListener('keydown', handleKeyDown, false);\n }\n}\n","import { throttle } from './schedulers';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nlet windowSize = updateSizes();\n\nexport function updateSizes(): IDimensions {\n const vh = window.innerHeight * 0.01;\n\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\nconst handleResize = throttle(() => {\n windowSize = updateSizes();\n}, 250, true);\n\nwindow.addEventListener('resize', handleResize);\nwindow.addEventListener('orientationchange', handleResize);\n\nexport default {\n get: () => windowSize,\n};\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n\nconst utf16 = {\n // The utf16-class is necessary to convert from javascripts internal character representation to unicode and back.\n decode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n let extra;\n\n while (i < len) {\n value = input.charCodeAt(i++);\n if ((value & 0xf800) === 0xd800) {\n extra = input.charCodeAt(i++);\n if ((value & 0xfc00) !== 0xd800 || (extra & 0xfc00) !== 0xdc00) {\n throw new RangeError('UTF-16(decode): Illegal UTF-16 sequence');\n }\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n output.push(value);\n }\n return output;\n },\n encode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n\n while (i < len) {\n value = input[i++];\n if ((value & 0xf800) === 0xd800) {\n throw new RangeError('UTF-16(encode): Illegal UTF-16 value');\n }\n if (value > 0xffff) {\n value -= 0x10000;\n output.push(String.fromCharCode(((value >>> 10) & 0x3ff) | 0xd800));\n value = 0xdc00 | (value & 0x3ff);\n }\n output.push(String.fromCharCode(value));\n }\n return output.join('');\n },\n};\n\n// Default parameters\nconst initial_n = 0x80;\nconst initial_bias = 72;\nconst delimiter = '\\x2D';\nconst base = 36;\nconst damp = 700;\nconst tmin = 1;\nconst tmax = 26;\nconst skew = 38;\nconst maxint = 0x7fffffff;\n\n// decode_digit(cp) returns the numeric value of a basic code\n// point (for use in representing integers) in the range 0 to\n// base-1, or base if cp is does not represent a value.\n\nfunction decode_digit(cp) {\n return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : cp - 97 < 26 ? cp - 97 : base;\n}\n\n// ** Bias adaptation function **\nfunction adapt(delta, numpoints, firsttime) {\n let k;\n delta = firsttime ? Math.floor(delta / damp) : delta >> 1;\n delta += Math.floor(delta / numpoints);\n\n for (k = 0; delta > ((base - tmin) * tmax) >> 1; k += base) {\n delta = Math.floor(delta / (base - tmin));\n }\n return Math.floor(k + ((base - tmin + 1) * delta) / (delta + skew));\n}\n\n// Main decode\nfunction decode(input, preserveCase) {\n // Dont use utf16\n const output = [];\n const case_flags = [];\n const input_length = input.length;\n\n let n; let out; let i; let bias; let basic; let j; let ic; let oldi; let w; let k; let digit; let t; let len;\n\n // Initialize the state:\n\n n = initial_n;\n i = 0;\n bias = initial_bias;\n\n // Handle the basic code points: Let basic be the number of input code\n // points before the last delimiter, or 0 if there is none, then\n // copy the first basic code points to the output.\n\n basic = input.lastIndexOf(delimiter);\n if (basic < 0) basic = 0;\n\n for (j = 0; j < basic; ++j) {\n if (preserveCase) case_flags[output.length] = input.charCodeAt(j) - 65 < 26;\n if (input.charCodeAt(j) >= 0x80) {\n throw new RangeError('Illegal input >= 0x80');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: Start just after the last delimiter if any\n // basic code points were copied; start at the beginning otherwise.\n\n for (ic = basic > 0 ? basic + 1 : 0; ic < input_length;) {\n // ic is the index of the next character to be consumed,\n\n // Decode a generalized variable-length integer into delta,\n // which gets added to i. The overflow checking is easier\n // if we increase i as we go, then subtract off its starting\n // value at the end to obtain delta.\n for (oldi = i, w = 1, k = base; ; k += base) {\n if (ic >= input_length) {\n throw RangeError('punycode_bad_input(1)');\n }\n digit = decode_digit(input.charCodeAt(ic++));\n\n if (digit >= base) {\n throw RangeError('punycode_bad_input(2)');\n }\n if (digit > Math.floor((maxint - i) / w)) {\n throw RangeError('punycode_overflow(1)');\n }\n i += digit * w;\n t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;\n if (digit < t) {\n break;\n }\n if (w > Math.floor(maxint / (base - t))) {\n throw RangeError('punycode_overflow(2)');\n }\n w *= base - t;\n }\n\n out = output.length + 1;\n bias = adapt(i - oldi, out, oldi === 0);\n\n // i was supposed to wrap around from out to 0,\n // incrementing n each time, so we'll fix that now:\n if (Math.floor(i / out) > maxint - n) {\n throw RangeError('punycode_overflow(3)');\n }\n n += Math.floor(i / out);\n i %= out;\n\n // Insert n at position i of the output:\n // Case of last character determines uppercase flag:\n if (preserveCase) {\n case_flags.splice(i, 0, input.charCodeAt(ic - 1) - 65 < 26);\n }\n\n output.splice(i, 0, n);\n i++;\n }\n if (preserveCase) {\n for (i = 0, len = output.length; i < len; i++) {\n if (case_flags[i]) {\n output[i] = String.fromCharCode(output[i])\n .toUpperCase()\n .charCodeAt(0);\n }\n }\n }\n return utf16.encode(output);\n}\n\nfunction toUnicode(domain) {\n const domain_array = domain.split('.');\n const out = [];\n for (let i = 0; i < domain_array.length; ++i) {\n const s = domain_array[i];\n out.push(s.match(/^xn--/) ? decode(s.slice(4)) : s);\n }\n return out.join('.');\n}\n\nexport default toUnicode;\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport convertPunycode from '../../lib/punycode';\nimport { GlobalActions } from '../../global/types';\n\nimport { DEBUG, RE_TME_INVITE_LINK, RE_TME_LINK } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: any;\n};\n\ntype DispatchProps = Pick;\n\nconst SafeLink: FC = ({\n url,\n text,\n className,\n children,\n toggleSafeLinkModal,\n openTelegramLink,\n}) => {\n const content = children || text;\n const isNotSafe = url !== content;\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (\n e.ctrlKey || e.altKey || e.shiftKey || e.metaKey\n || !url || (!url.match(RE_TME_LINK) && !url.match(RE_TME_INVITE_LINK))\n ) {\n if (isNotSafe) {\n toggleSafeLinkModal({ url });\n\n e.preventDefault();\n return false;\n }\n\n return true;\n }\n\n e.preventDefault();\n openTelegramLink({ url });\n\n return false;\n }, [isNotSafe, openTelegramLink, toggleSafeLinkModal, url]);\n\n if (!url) {\n return undefined;\n }\n\n const classNames = buildClassName(\n className || 'text-entity-link',\n text.length > 50 && 'long-word-break-all',\n );\n\n return (\n \n {content}\n \n );\n};\n\nfunction ensureProtocol(url?: string) {\n if (!url) {\n return undefined;\n }\n\n return url.includes('://') ? url : `https://${url}`;\n}\n\nfunction getDomain(url?: string) {\n if (!url) {\n return undefined;\n }\n\n const href = ensureProtocol(url);\n if (!href) {\n return undefined;\n }\n\n try {\n let decodedHref = decodeURI(href);\n\n const match = decodedHref.match(/^https?:\\/\\/([^/:?#]+)(?:[/:?#]|$)/i);\n if (!match) {\n return undefined;\n }\n const domain = match[1];\n decodedHref = decodedHref.replace(domain, convertPunycode(domain));\n\n return decodedHref;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('SafeLink.getDecodedUrl error ', url, error);\n }\n }\n\n return undefined;\n}\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleSafeLinkModal', 'openTelegramLink',\n ]),\n)(SafeLink));\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n return useEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n};\n","import { ApiDocument } from '../../../api/types';\n\nconst ONE_GIGABYTE = 1024 * 1024 * 1024;\nconst ONE_MEGABYTE = 1024 * 1024;\n\nexport function getFileSizeString(bytes: number) {\n if (bytes > (ONE_GIGABYTE / 2)) {\n return `${(bytes / ONE_GIGABYTE).toFixed(1)} GB`;\n }\n if (bytes > (ONE_MEGABYTE / 2)) {\n return `${(bytes / ONE_MEGABYTE).toFixed(1)} MB`;\n }\n return `${(bytes / (1024)).toFixed(1)} KB`;\n}\n\nexport function getDocumentExtension(document: ApiDocument) {\n const { fileName, mimeType } = document;\n\n return getFileExtension(fileName, mimeType);\n}\n\nexport function getFileExtension(fileName: string, mimeType: string) {\n if (fileName && fileName.indexOf('.') !== -1) {\n return fileName.split('.').pop();\n } else {\n return mimeType.split('/').pop();\n }\n}\n\nexport function getColorFromExtension(extension: string) {\n switch (extension) {\n case 'apk':\n case 'xls':\n case 'xlsx':\n return 'green';\n case 'zip':\n case 'rar':\n case '7z':\n case 'tar':\n case 'gz':\n case 'ppt':\n case 'pptx':\n return 'orange';\n case 'pdf':\n case 'xps':\n return 'red';\n default:\n return 'default';\n }\n}\n\nexport function getDocumentHasPreview(document: ApiDocument) {\n return Boolean(document.previewBlobUrl || document.thumbnail);\n}\n","const STRIPE_ERRORS: Record> = {\n missing_payment_information: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n invalid_number: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n number: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n exp_year: {\n field: 'expiry',\n fieldError: 'Incorrect year',\n },\n exp_month: {\n field: 'expiry',\n fieldError: 'Incorrect month',\n },\n invalid_expiry_year: {\n field: 'expiry',\n fieldError: 'Incorrect year',\n },\n invalid_expiry_month: {\n field: 'expiry',\n fieldError: 'Incorrect month',\n },\n cvc: {\n field: 'cvv',\n fieldError: 'Incorrect CVV',\n },\n invalid_cvc: {\n field: 'cvv',\n fieldError: 'Incorrect CVV',\n },\n};\n\nexport function getStripeError(error: {\n code: string;\n message: string;\n param?: string;\n}) {\n const { message, code, param } = error;\n const { field, fieldError, description } = param ? STRIPE_ERRORS[param] : STRIPE_ERRORS[code];\n return {\n field,\n fieldError,\n description: description || message,\n };\n}\n\nconst SHIPPING_ERRORS: Record> = {\n ADDRESS_STREET_LINE1_INVALID: {\n field: 'streetLine1',\n fieldError: 'Incorrect street address',\n },\n ADDRESS_STREET_LINE2_INVALID: {\n field: 'streetLine2',\n fieldError: 'Incorrect street address',\n },\n ADDRESS_CITY_INVALID: {\n field: 'city',\n fieldError: 'Incorrect city',\n },\n ADDRESS_COUNTRY_INVALID: {\n field: 'countryIso2',\n fieldError: 'Incorrect country',\n },\n ADDRESS_POSTCODE_INVALID: {\n field: 'postCode',\n fieldError: 'Incorrect post code',\n },\n ADDRESS_STATE_INVALID: {\n field: 'state',\n fieldError: 'Incorrect state',\n },\n REQ_INFO_NAME_INVALID: {\n field: 'fullName',\n fieldError: 'Incorrect name',\n },\n REQ_INFO_PHONE_INVALID: {\n field: 'phone',\n fieldError: 'Incorrect phone',\n },\n REQ_INFO_EMAIL_INVALID: {\n field: 'email',\n fieldError: 'Incorrect email',\n },\n};\n\n\nexport function getShippingError(errors: Record) {\n return Object.values(errors).reduce((acc, cur) => {\n const error = SHIPPING_ERRORS[cur.message];\n if (error) {\n acc = {\n ...acc,\n [error.field]: error.fieldError,\n };\n }\n return acc;\n }, {});\n}\n","import { fastRaf } from './schedulers';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n}\n\nlet currentInstance: AnimationInstance | undefined;\n\nexport function animateSingle(tick: Function, instance?: AnimationInstance) {\n if (!instance) {\n if (currentInstance && !currentInstance.isCancelled) {\n currentInstance.isCancelled = true;\n }\n\n instance = { isCancelled: false };\n currentInstance = instance;\n }\n\n fastRaf(() => {\n if (!instance!.isCancelled && tick()) {\n animateSingle(tick, instance);\n }\n });\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if (tick()) {\n animate(tick);\n }\n });\n}\n","import React, { FC, useState, useRef } from '../../lib/teact/teact';\n\nimport Menu from './Menu';\n\nimport './DropdownMenu.scss';\n\ntype OwnProps = {\n className?: string;\n trigger: FC<{ onTrigger: () => void; isOpen?: boolean }>;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n footer?: string;\n children: any;\n};\n\nconst DropdownMenu: FC = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n\n const toggleIsOpen = () => {\n setIsOpen(!isOpen);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const menu = menuRef.current;\n\n if (!isOpen || e.keyCode !== 40 || !menu) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(menu.children);\n\n if (!focusedElement || elementChildren.indexOf(focusedElement) === -1) {\n (elementChildren[0] as HTMLElement).focus();\n }\n };\n\n const handleClose = () => {\n setIsOpen(false);\n };\n\n return (\n \n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n \n {children}\n \n \n );\n};\n\nexport default DropdownMenu;\n","// @ts-ignore\nimport twemojiRegex from '../../../lib/twemojiRegex';\n\nconst DETECT_UP_TO = 3;\nconst MAX_LENGTH = DETECT_UP_TO * 8; // Maximum 8 per one emoji.\nconst RE_EMOJI_ONLY = new RegExp(`^(?:${twemojiRegex.source})+$`, '');\n\nexport default (text: string): number | false => {\n if (text.length > MAX_LENGTH) {\n return false;\n }\n\n const isEmojiOnly = Boolean(text.match(RE_EMOJI_ONLY));\n if (!isEmojiOnly) {\n return false;\n }\n\n let emojiCount = 0;\n while (twemojiRegex.exec(text)) {\n emojiCount++;\n\n if (emojiCount > DETECT_UP_TO) {\n twemojiRegex.lastIndex = 0;\n return false;\n }\n }\n\n return emojiCount;\n};\n","// Due to the fact that emoji from Apple do not contain some characters, it is necessary to remove them from emoji-data\n// https://github.com/iamcal/emoji-data/issues/136\nconst EXCLUDE_EMOJIS = ['female_sign', 'male_sign', 'medical_symbol'];\n\nexport type EmojiRawData = typeof import('emoji-data-ios/emoji-data.json');\nexport type EmojiModule = { default: EmojiRawData };\n\nexport type EmojiData = {\n categories: Array;\n emojis: Record;\n};\n\nfunction unifiedToNative(unified: string) {\n const unicodes = unified.split('-');\n const codePoints = unicodes.map((i) => parseInt(i, 16));\n\n return String.fromCodePoint(...codePoints);\n}\n\nexport function nativeToUnfified(emoji: string) {\n let code;\n\n if (emoji.length === 1) {\n code = emoji.charCodeAt(0).toString(16).padStart(4, '0');\n } else {\n const pairs = [];\n for (let i = 0; i < emoji.length; i++) {\n if (emoji.charCodeAt(i) >= 0xd800 && emoji.charCodeAt(i) <= 0xdbff) {\n if (emoji.charCodeAt(i + 1) >= 0xdc00 && emoji.charCodeAt(i + 1) <= 0xdfff) {\n pairs.push(\n (emoji.charCodeAt(i) - 0xd800) * 0x400\n + (emoji.charCodeAt(i + 1) - 0xdc00) + 0x10000,\n );\n }\n } else if (emoji.charCodeAt(i) < 0xd800 || emoji.charCodeAt(i) > 0xdfff) {\n pairs.push(emoji.charCodeAt(i));\n }\n }\n\n code = pairs.map((x) => x.toString(16).padStart(4, '0')).join('-');\n }\n\n return code;\n}\n\nexport function uncompressEmoji(data: EmojiRawData): EmojiData {\n const emojiData: EmojiData = { categories: [], emojis: {} };\n\n for (let i = 0; i < data.length; i += 2) {\n const category = {\n id: data[i][0],\n name: data[i][1],\n emojis: [],\n } as EmojiCategory;\n\n for (let j = 0; j < data[i + 1].length; j++) {\n const emojiRaw = data[i + 1][j];\n if (!EXCLUDE_EMOJIS.includes(emojiRaw[1][0])) {\n category.emojis.push(emojiRaw[1][0]);\n emojiData.emojis[emojiRaw[1][0]] = {\n id: emojiRaw[1][0],\n names: emojiRaw[1] as string[],\n native: unifiedToNative(emojiRaw[0] as string),\n image: (emojiRaw[0] as string).toLowerCase(),\n };\n }\n }\n\n emojiData.categories.push(category);\n }\n\n return emojiData;\n}\n","import {\n hasElementChanged,\n isComponentElement,\n isEmptyElement,\n isRealElement,\n isTextElement,\n mountComponent,\n renderComponent,\n unmountTree,\n getTarget,\n setTarget,\n VirtualElement,\n VirtualElementComponent,\n VirtualRealElement,\n} from './teact';\nimport generateIdFor from '../../util/generateIdFor';\nimport { DEBUG } from '../../config';\nimport { addEventListener, removeEventListener } from './dom-events';\n\ntype VirtualDomHead = {\n children: [VirtualElement] | [];\n};\n\nconst FILTERED_ATTRIBUTES = new Set(['key', 'ref', 'teactFastList', 'teactOrderKey']);\nconst MAPPED_ATTRIBUTES: { [k: string]: string } = {\n autoPlay: 'autoplay',\n autoComplete: 'autocomplete',\n};\nconst INDEX_KEY_PREFIX = '__indexKey#';\n\nconst headsByElement: Record = {};\nlet DEBUG_virtualTreeSize = 1;\n\nfunction render($element?: VirtualElement, parentEl?: HTMLElement | null) {\n if (!parentEl) {\n return undefined;\n }\n\n let headId = parentEl.getAttribute('data-teact-head-id');\n if (!headId) {\n headId = generateIdFor(headsByElement);\n headsByElement[headId] = { children: [] };\n parentEl.setAttribute('data-teact-head-id', headId);\n }\n\n const $head = headsByElement[headId];\n $head.children = [renderWithVirtual(parentEl, $head.children[0], $element, $head, 0) as VirtualElement];\n\n if (process.env.APP_ENV === 'perf') {\n DEBUG_virtualTreeSize = 0;\n DEBUG_addToVirtualTreeSize($head);\n\n return DEBUG_virtualTreeSize;\n }\n\n return undefined;\n}\n\nfunction renderWithVirtual(\n parentEl: HTMLElement,\n $current: VirtualElement | undefined,\n $new: VirtualElement | undefined,\n $parent: VirtualRealElement | VirtualDomHead,\n index: number,\n {\n skipComponentUpdate = false,\n forceIndex = false,\n fragment,\n moveDirection,\n }: {\n skipComponentUpdate?: boolean;\n forceIndex?: boolean;\n fragment?: DocumentFragment;\n moveDirection?: 'up' | 'down';\n } = {},\n) {\n if (\n !skipComponentUpdate\n && $current && $new\n && isComponentElement($current) && isComponentElement($new)\n && !hasElementChanged($current, $new)\n ) {\n $new = updateComponent($current, $new);\n }\n\n // Parent element may have changed, so we need to update the listener closure.\n if (!skipComponentUpdate && $new && isComponentElement($new) && $new.componentInstance.isMounted) {\n setupComponentUpdateListener($new, $parent, index, parentEl);\n }\n\n if ($current === $new) {\n return $new;\n }\n\n if (!$current && $new) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n\n if (forceIndex && parentEl.childNodes[index]) {\n parentEl.insertBefore(node, parentEl.childNodes[index]);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n } else if ($current && !$new) {\n parentEl.removeChild(getTarget($current)!);\n unmountTree($current);\n } else if ($current && $new) {\n if (hasElementChanged($current, $new)) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n parentEl.replaceChild(node, getTarget($current)!);\n unmountTree($current);\n } else {\n const areComponents = isComponentElement($current) && isComponentElement($new);\n\n if (!areComponents) {\n setTarget($new, getTarget($current)!);\n }\n\n if (isRealElement($current) && isRealElement($new)) {\n if (moveDirection) {\n const node = getTarget($current)!;\n const nextSibling = parentEl.childNodes[moveDirection === 'up' ? index : index + 1];\n\n if (nextSibling) {\n parentEl.insertBefore(node, nextSibling);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n }\n\n if (!areComponents) {\n updateAttributes($current, $new, getTarget($current) as HTMLElement);\n }\n\n $new.children = renderChildren(\n $current,\n $new,\n areComponents ? parentEl : getTarget($current) as HTMLElement,\n );\n }\n }\n }\n\n return $new;\n}\n\nfunction initComponent(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n if (!isComponentElement($element)) {\n return $element;\n }\n\n const { componentInstance } = $element;\n\n if (!componentInstance.isMounted) {\n $element = mountComponent(componentInstance);\n setupComponentUpdateListener($element, $parent, index, parentEl);\n\n const $firstChild = $element.children[0];\n if (isComponentElement($firstChild)) {\n $element.children = [initComponent($firstChild, $element, 0, parentEl)];\n }\n\n componentInstance.isMounted = true;\n }\n\n return $element;\n}\n\nfunction updateComponent($current: VirtualElementComponent, $new: VirtualElementComponent) {\n $current.componentInstance.props = $new.componentInstance.props;\n\n return renderComponent($current.componentInstance);\n}\n\nfunction setupComponentUpdateListener(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n const { componentInstance } = $element;\n\n componentInstance.onUpdate = () => {\n $parent.children[index] = renderWithVirtual(\n parentEl,\n $parent.children[index],\n componentInstance.$element,\n $parent,\n index,\n { skipComponentUpdate: true },\n ) as VirtualElementComponent;\n };\n}\n\nfunction createNode($element: VirtualElement): Node {\n if (isEmptyElement($element)) {\n return document.createTextNode('');\n }\n\n if (isTextElement($element)) {\n return document.createTextNode($element.value);\n }\n\n if (isComponentElement($element)) {\n return createNode($element.children[0] as VirtualElement);\n }\n\n const { tag, props, children = [] } = $element;\n const element = document.createElement(tag);\n\n if (typeof props.ref === 'object') {\n props.ref.current = element;\n }\n\n Object.keys(props).forEach((key) => {\n addAttribute(element, key, props[key]);\n });\n\n $element.children = children.map(($child, i) => (\n renderWithVirtual(element, undefined, $child, $element, i) as VirtualElement\n ));\n\n return element;\n}\n\nfunction renderChildren(\n $current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement,\n) {\n if ($new.props.teactFastList) {\n return renderFastListChildren($current, $new, currentEl);\n }\n\n const maxLength = Math.max($current.children.length, $new.children.length);\n const newChildren = [];\n const fragment = $new.children.length > $current.children.length + 1 ? document.createDocumentFragment() : undefined;\n\n for (let i = 0; i < maxLength; i++) {\n const $newChild = renderWithVirtual(\n currentEl,\n $current.children[i],\n $new.children[i],\n $new,\n i,\n i >= $current.children.length ? { fragment } : undefined,\n );\n\n if ($newChild) {\n newChildren.push($newChild);\n }\n }\n\n if (fragment) {\n currentEl.appendChild(fragment);\n }\n\n return newChildren;\n}\n\nfunction renderFastListChildren($current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement) {\n const newKeys = new Set(\n $new.children.map(($newChild) => {\n const key = 'props' in $newChild && $newChild.props.key;\n\n if (DEBUG && isRealElement($newChild) && !key) {\n // eslint-disable-next-line no-console\n console.warn('Missing `key` in `teactFastList`');\n }\n\n return key;\n }),\n );\n\n let currentRemainingIndex = 0;\n const remainingByKey = $current.children\n .reduce((acc, $currentChild, i) => {\n let key = 'props' in $currentChild ? $currentChild.props.key : undefined;\n\n // First we handle removed children\n if (key && !newKeys.has(key)) {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n } else if (!key) {\n const $newChild = $new.children[i];\n const newChildKey = ($newChild && 'props' in $newChild) ? $newChild.props.key : undefined;\n // If a non-key element remains at the same index we preserve it with a virtual `key`\n if ($newChild && !newChildKey) {\n key = `${INDEX_KEY_PREFIX}${i}`;\n } else {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n }\n }\n\n // Then we build up info about remaining children\n acc[key] = {\n $element: $currentChild,\n index: currentRemainingIndex++,\n order: 'props' in $currentChild ? $currentChild.props.teactOrderKey : undefined,\n };\n return acc;\n }, {} as Record);\n\n let newChildren: VirtualElement[] = [];\n\n let fragmentQueue: VirtualElement[] | undefined;\n let fragmentIndex: number | undefined;\n\n let currentPreservedIndex = 0;\n\n $new.children.forEach(($newChild, i) => {\n const key = 'props' in $newChild ? $newChild.props.key : `${INDEX_KEY_PREFIX}${i}`;\n const currentChildInfo = remainingByKey[key];\n\n if (!currentChildInfo) {\n // All new nodes are queued to be inserted with fragments if possible.\n if (!fragmentQueue) {\n fragmentQueue = [];\n fragmentIndex = i;\n }\n\n fragmentQueue.push($newChild);\n return;\n }\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n fragmentIndex = undefined;\n fragmentQueue = undefined;\n }\n\n // This is a \"magic\" `teactOrderKey` property that tells us the element is updated\n const order = 'props' in $newChild ? $newChild.props.teactOrderKey : undefined;\n const shouldMoveNode = currentChildInfo.index !== currentPreservedIndex && currentChildInfo.order !== order;\n const isMovingDown = shouldMoveNode && currentPreservedIndex > currentChildInfo.index;\n\n // When the node goes down, preserved indexing actually breaks, so the \"magic\" should help.\n if (!shouldMoveNode || isMovingDown) {\n currentPreservedIndex++;\n }\n\n newChildren.push(\n renderWithVirtual(currentEl, currentChildInfo.$element, $newChild, $new, i, {\n forceIndex: true,\n ...(shouldMoveNode && {\n moveDirection: isMovingDown ? 'down' : 'up',\n }),\n })!,\n );\n });\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n }\n\n return newChildren;\n}\n\nfunction flushFragmentQueue(\n fragmentQueue: VirtualElement[], fragmentIndex: number, parentEl: HTMLElement, $parent: VirtualRealElement,\n) {\n if (fragmentQueue.length === 1) {\n return [renderWithVirtual(parentEl, undefined, fragmentQueue[0], $parent, fragmentIndex, { forceIndex: true })!];\n } else if (fragmentQueue.length > 1) {\n const fragment = document.createDocumentFragment();\n const newChildren = fragmentQueue.map(($fragmentChild) => (\n renderWithVirtual(parentEl, undefined, $fragmentChild, $parent, fragmentIndex!, { fragment })!\n ));\n\n if (parentEl.childNodes[fragmentIndex]) {\n parentEl.insertBefore(fragment, parentEl.childNodes[fragmentIndex]);\n } else {\n parentEl.appendChild(fragment);\n }\n\n return newChildren;\n }\n\n throw new Error('Unexpected input');\n}\n\nfunction updateAttributes($current: VirtualRealElement, $new: VirtualRealElement, element: HTMLElement) {\n const currentKeys = Object.keys($current.props);\n const newKeys = Object.keys($new.props);\n\n currentKeys.forEach((key) => {\n if ($current.props[key] !== undefined && $new.props[key] === undefined) {\n removeAttribute(element, key, $current.props[key]);\n }\n });\n\n newKeys.forEach((key) => {\n if ($new.props[key] === undefined) {\n return;\n }\n\n if ($current.props[key] !== $new.props[key]) {\n if ($current.props[key] === undefined) {\n addAttribute(element, key, $new.props[key]);\n } else {\n updateAttribute(element, key, $current.props[key], $new.props[key]);\n }\n }\n });\n}\n\nfunction addAttribute(element: HTMLElement, key: string, value: any) {\n if (value === undefined) {\n return;\n }\n\n // An optimization attempt\n if (key === 'className') {\n element.className = value;\n // An optimization attempt\n } else if (key === 'value') {\n (element as HTMLInputElement).value = value;\n } else if (key === 'style') {\n element.style.cssText = value;\n } else if (key.startsWith('on')) {\n addEventListener(element, key, value);\n } else if (key.startsWith('data-')) {\n element.setAttribute(key, value);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n (element as any)[MAPPED_ATTRIBUTES[key] || key] = value;\n }\n}\n\nfunction removeAttribute(element: HTMLElement, key: string, value: any) {\n if (key === 'className') {\n element.className = '';\n } else if (key === 'value') {\n (element as HTMLInputElement).value = '';\n } else if (key === 'style') {\n element.style.cssText = '';\n } else if (key.startsWith('on')) {\n removeEventListener(element, key, value);\n } else if (key.startsWith('data-')) {\n element.removeAttribute(key);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n delete (element as any)[MAPPED_ATTRIBUTES[key] || key];\n }\n}\n\nfunction updateAttribute(element: HTMLElement, key: string, oldValue: any, newValue: any) {\n if (key === 'value') {\n // Removing and adding value causes a cursor jump\n (element as HTMLInputElement).value = newValue !== undefined ? newValue : '';\n } else {\n removeAttribute(element, key, oldValue);\n addAttribute(element, key, newValue);\n }\n}\n\nfunction DEBUG_addToVirtualTreeSize($current: VirtualRealElement | VirtualDomHead) {\n DEBUG_virtualTreeSize += $current.children.length;\n\n $current.children.forEach(($child) => {\n if (isRealElement($child)) {\n DEBUG_addToVirtualTreeSize($child);\n }\n });\n}\n\nexport default { render };\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n sender?: ApiUser | ApiChat;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst UserLink: FC = ({\n className, sender, openUserInfo, children,\n}) => {\n const handleClick = useCallback(() => {\n if (sender) {\n openUserInfo({ id: sender.id });\n }\n }, [sender, openUserInfo]);\n\n if (!sender) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openUserInfo']),\n)(UserLink);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n message?: ApiMessage;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst MessageLink: FC = ({\n className, message, children, focusMessage,\n}) => {\n const handleMessageClick = useCallback((): void => {\n if (message) {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }\n }, [focusMessage, message]);\n\n if (!message) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage']),\n)(MessageLink);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n chatId?: number;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst ChatLink: FC = ({\n className, chatId, openChat, children,\n}) => {\n const handleClick = useCallback(() => {\n if (chatId) {\n openChat({ id: chatId });\n }\n }, [chatId, openChat]);\n\n if (!chatId) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat']),\n)(ChatLink);\n","import React from '../../../lib/teact/teact';\n\nimport { ApiChat, ApiMessage, ApiUser } from '../../../api/types';\nimport {\n getChatTitle,\n getMessageContent,\n getMessageSummaryText,\n getUserFullName,\n isChat,\n} from '../../../modules/helpers';\nimport trimText from '../../../util/trimText';\nimport { TextPart } from './renderMessageText';\nimport renderText from './renderText';\n\nimport UserLink from '../UserLink';\nimport MessageLink from '../MessageLink';\nimport ChatLink from '../ChatLink';\n\ninterface ActionMessageTextOptions {\n maxTextLength?: number;\n asPlain?: boolean;\n isEmbedded?: boolean;\n}\n\nconst NBSP = '\\u00A0';\n\nexport function renderActionMessageText(\n message: ApiMessage,\n actionOrigin?: ApiUser | ApiChat,\n targetUser?: ApiUser,\n targetMessage?: ApiMessage,\n targetChatId?: number,\n options: ActionMessageTextOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n const { text } = message.content.action;\n const content: TextPart[] = [];\n const textOptions: ActionMessageTextOptions = { ...options, maxTextLength: 16 };\n\n let unprocessed: string;\n let processed = processPlaceholder(\n text,\n '%action_origin%',\n actionOrigin\n ? (!options.isEmbedded && renderOriginContent(actionOrigin, options.asPlain)) || NBSP\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_user%',\n targetUser\n ? renderUserContent(targetUser, options.asPlain)\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%message%',\n targetMessage\n ? renderMessageContent(targetMessage, textOptions)\n : 'a message',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%product%',\n targetMessage\n ? renderProductContent(targetMessage)\n : 'a product',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_chat%',\n targetChatId\n ? renderMigratedContent(targetChatId, options.asPlain)\n : 'another chat',\n );\n content.push(...processed);\n\n if (options.asPlain) {\n return content.join('').trim();\n }\n\n return content;\n}\n\nfunction renderProductContent(message: ApiMessage) {\n return message.content && message.content.invoice\n ? message.content.invoice.title\n : 'a product';\n}\n\nfunction renderMessageContent(message: ApiMessage, options: ActionMessageTextOptions = {}) {\n const text = getMessageSummaryText(message);\n const {\n photo, video, document, sticker,\n } = getMessageContent(message);\n\n const showQuotes = text && !photo && !video && !document && !sticker;\n let messageText = trimText(text as string, options.maxTextLength)!;\n\n if (photo) {\n messageText = 'a photo';\n } else if (video) {\n messageText = video.isGif ? 'a GIF' : 'a video';\n } else if (document) {\n messageText = 'a document';\n } else if (sticker) {\n messageText = `«${text}»`;\n }\n\n if (options.asPlain) {\n return showQuotes ? `«${messageText}»` : messageText;\n }\n\n if (showQuotes) {\n return (\n \n «\n {renderText(messageText)}\n »\n \n );\n }\n\n return (\n {renderText(messageText)}\n );\n}\n\nfunction renderOriginContent(origin: ApiUser | ApiChat, asPlain?: boolean) {\n return isChat(origin)\n ? renderChatContent(origin, asPlain)\n : renderUserContent(origin, asPlain);\n}\n\nfunction renderUserContent(sender: ApiUser, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getUserFullName(sender));\n\n if (asPlain) {\n return text;\n }\n\n return {sender && renderText(text!)};\n}\n\nfunction renderChatContent(chat: ApiChat, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getChatTitle(chat));\n\n if (asPlain) {\n return text;\n }\n\n return {chat && renderText(text!)};\n}\n\nfunction renderMigratedContent(chatId: number, asPlain?: boolean): string | TextPart | undefined {\n const text = 'another chat';\n\n if (asPlain) {\n return text;\n }\n\n return {text};\n}\n\nfunction processPlaceholder(text: string, placeholder: string, replaceValue?: TextPart): TextPart[] {\n const placeholderPosition = text.indexOf(placeholder);\n if (placeholderPosition < 0 || !replaceValue) {\n return [text];\n }\n\n const content: TextPart[] = [];\n content.push(text.substring(0, placeholderPosition));\n content.push(replaceValue);\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","export interface ApiPhotoSize {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n width: number;\n height: number;\n}\n\nexport interface ApiThumbnail {\n dataUri: string;\n height: number;\n width: number;\n}\n\nexport interface ApiPhoto {\n id: string;\n thumbnail?: ApiThumbnail;\n sizes: ApiPhotoSize[];\n blobUrl?: string;\n}\n\nexport interface ApiSticker {\n id: string;\n stickerSetId: string;\n stickerSetAccessHash: string;\n emoji: string;\n isAnimated: boolean;\n width?: number;\n height?: number;\n thumbnail?: ApiThumbnail;\n isPreloadedGlobally?: boolean;\n}\n\nexport interface ApiStickerSet {\n archived?: true;\n isAnimated?: true;\n installedDate?: number;\n id: string;\n accessHash: string;\n title: string;\n hasThumbnail?: boolean;\n count: number;\n hash: number;\n stickers?: ApiSticker[];\n packs?: Record;\n covers?: ApiSticker[];\n}\n\nexport interface ApiVideo {\n id: string;\n mimeType: string;\n duration: number;\n fileName: string;\n width?: number;\n height?: number;\n supportsStreaming?: boolean;\n isRound?: boolean;\n isGif?: boolean;\n thumbnail?: ApiThumbnail;\n blobUrl?: string;\n size: number;\n}\n\nexport interface ApiAudio {\n size: number;\n mimeType: string;\n fileName: string;\n duration: number;\n performer?: string;\n title?: string;\n}\n\nexport interface ApiVoice {\n duration: number;\n waveform?: number[];\n}\n\nexport interface ApiDocument {\n id?: string;\n fileName: string;\n size: number;\n timestamp?: number;\n mimeType: string;\n thumbnail?: ApiThumbnail;\n previewBlobUrl?: string;\n}\n\nexport interface ApiContact {\n firstName: string;\n lastName: string;\n phoneNumber: string;\n userId: number;\n}\n\nexport interface ApiPollAnswer {\n text: string;\n option: string;\n}\n\nexport interface ApiPollResult {\n isChosen?: true;\n isCorrect?: true;\n option: string;\n votersCount: number;\n}\n\nexport interface ApiPoll {\n id: string;\n summary: {\n closed?: true;\n isPublic?: true;\n multipleChoice?: true;\n quiz?: true;\n question: string;\n answers: ApiPollAnswer[];\n closePeriod?: number;\n closeDate?: number;\n };\n results: {\n results?: ApiPollResult[];\n totalVoters?: number;\n recentVoterIds?: number[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n}\n\nexport interface ApiInvoice {\n text: string;\n title: string;\n photoUrl?: string;\n description?: string;\n receiptMsgId?: number;\n}\n\nexport type ApiNewPoll = {\n summary: ApiPoll['summary'];\n quiz?: {\n correctAnswers: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n};\n\nexport interface ApiAction {\n text: string;\n targetUserId?: number;\n targetChatId?: number;\n type: 'historyClear' | 'other';\n photo?: ApiPhoto;\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n hasDocument?: true;\n}\n\nexport interface ApiMessageForwardInfo {\n isChannelPost: boolean;\n isLinkedChannelPost?: boolean;\n fromChatId?: number;\n senderUserId?: number;\n fromMessageId?: number;\n hiddenUserName?: string;\n adminTitle?: string;\n}\n\nexport interface ApiMessageEntity {\n type: string;\n offset: number;\n length: number;\n userId?: number;\n url?: string;\n}\n\nexport enum ApiMessageEntityTypes {\n Bold = 'MessageEntityBold',\n Blockquote = 'MessageEntityBlockquote',\n BotCommand = 'MessageEntityBotCommand',\n Cashtag = 'MessageEntityCashtag',\n Code = 'MessageEntityCode',\n Email = 'MessageEntityEmail',\n Hashtag = 'MessageEntityHashtag',\n Italic = 'MessageEntityItalic',\n MentionName = 'MessageEntityMentionName',\n Mention = 'MessageEntityMention',\n Phone = 'MessageEntityPhone',\n Pre = 'MessageEntityPre',\n Strike = 'MessageEntityStrike',\n TextUrl = 'MessageEntityTextUrl',\n Url = 'MessageEntityUrl',\n Underline = 'MessageEntityUnderline',\n Unknown = 'MessageEntityUnknown',\n}\n\nexport interface ApiFormattedText {\n text: string;\n entities?: ApiMessageEntity[];\n}\n\nexport interface ApiMessage {\n id: number;\n chatId: number;\n content: {\n text?: ApiFormattedText;\n photo?: ApiPhoto;\n video?: ApiVideo;\n document?: ApiDocument;\n sticker?: ApiSticker;\n contact?: ApiContact;\n poll?: ApiPoll;\n action?: ApiAction;\n webPage?: ApiWebPage;\n audio?: ApiAudio;\n voice?: ApiVoice;\n invoice?: ApiInvoice;\n };\n date: number;\n isOutgoing: boolean;\n senderId?: number;\n replyToMessageId?: number;\n replyToTopMessageId?: number;\n sendingState?: 'messageSendingStatePending' | 'messageSendingStateFailed';\n forwardInfo?: ApiMessageForwardInfo;\n isDeleting?: boolean;\n previousLocalId?: number;\n views?: number;\n isEdited?: boolean;\n isMediaUnread?: boolean;\n groupedId?: string;\n isInAlbum?: boolean;\n hasUnreadMention?: boolean;\n inlineButtons?: ApiKeyboardButtons;\n keyboardButtons?: ApiKeyboardButtons;\n viaBotId?: number;\n threadInfo?: ApiThreadInfo;\n adminTitle?: string;\n isScheduled?: boolean;\n shouldHideKeyboardButtons?: boolean;\n isFromScheduled?: boolean;\n}\n\nexport interface ApiThreadInfo {\n threadId: number;\n chatId: number;\n topMessageId?: number;\n originChannelId?: number;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: number[];\n}\n\nexport type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed';\n\nexport interface ApiKeyboardButton {\n type: 'command' | 'url' | 'callback' | 'requestPoll' | 'buy' | 'NOT_SUPPORTED';\n text: string;\n messageId: number;\n value?: string;\n}\n\nexport type ApiKeyboardButtons = ApiKeyboardButton[][];\n\nexport type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'profilePhoto';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\n\nexport const MAIN_THREAD_ID = -1;\n\n// `Symbol` can not be transferred from worker\nexport const MESSAGE_DELETED = 'MESSAGE_DELETED';\n","// We cache avatars as Data URI for faster initial load\n// and messages media as Blob for smaller size.\nexport enum ApiMediaFormat {\n DataUri,\n BlobUrl,\n Lottie,\n Progressive,\n Stream,\n}\n\nexport type ApiParsedMedia = string | Blob | AnyLiteral | ArrayBuffer;\nexport type ApiPreparedMedia = string | AnyLiteral;\nexport type ApiMediaFormatToPrepared = T extends ApiMediaFormat.Lottie ? AnyLiteral : string;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\n\ntype OwnProps = {\n userId?: number;\n username?: string;\n children: any;\n};\n\ntype StateProps = {\n userOrChat?: ApiUser | ApiChat;\n};\n\ntype DispatchProps = Pick;\n\nconst MentionLink: FC = ({\n username,\n userOrChat,\n children,\n openChat,\n openChatByUsername,\n}) => {\n const handleClick = () => {\n if (userOrChat) {\n openChat({ id: userOrChat.id });\n } else if (username) {\n openChatByUsername({ username: username.substring(1) });\n }\n };\n\n return (\n \n {children}\n \n );\n};\n\nexport default withGlobal(\n (global, { userId }): StateProps => {\n return {\n userOrChat: userId ? selectUser(global, userId) : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat', 'openChatByUsername']),\n)(MentionLink);\n","import { ISettings } from '../types';\n\nimport { animateSingle } from './animation';\n\nimport themeColors from '../styles/themes.json';\n\ntype RGBAColor = {\n r: number;\n g: number;\n b: number;\n a?: number;\n};\n\nlet isInitialized = false;\n\nconst HEX_COLOR_REGEX = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?$/i;\nconst DURATION_MS = 200;\nconst ENABLE_ANIMATION_DELAY_MS = 500;\n\nconst lerp = (start: number, end: number, interpolationRatio: number) => {\n return (1 - interpolationRatio) * start + interpolationRatio * end;\n};\n\nconst colors = (Object.keys(themeColors) as Array).map((property) => ({\n property,\n colors: [hexToRgb(themeColors[property][0]), hexToRgb(themeColors[property][1])],\n}));\n\nexport default (theme: ISettings['theme'], withAnimation: boolean) => {\n const isDarkTheme = theme === 'dark';\n const shouldAnimate = isInitialized && withAnimation;\n const startIndex = isDarkTheme ? 0 : 1;\n const endIndex = isDarkTheme ? 1 : 0;\n const startAt = Date.now();\n const themeColorTag = document.querySelector('meta[name=\"theme-color\"]');\n\n document.documentElement.classList.remove(`theme-${isDarkTheme ? 'light' : 'dark'}`);\n if (isInitialized) {\n document.documentElement.classList.add('no-animations');\n }\n document.documentElement.classList.add(`theme-${theme}`);\n if (themeColorTag) {\n themeColorTag.setAttribute('content', isDarkTheme ? '#212121' : '#fff');\n }\n\n setTimeout(() => {\n document.documentElement.classList.remove('no-animations');\n }, ENABLE_ANIMATION_DELAY_MS);\n\n isInitialized = true;\n\n if (shouldAnimate) {\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / DURATION_MS, 1);\n\n applyColorAnimationStep(startIndex, endIndex, transition(t));\n\n return t < 1;\n });\n } else {\n applyColorAnimationStep(startIndex, endIndex);\n }\n};\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n\nfunction hexToRgb(hex: string): RGBAColor {\n const result = HEX_COLOR_REGEX.exec(hex)!;\n\n return {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n a: result[4] !== undefined ? parseInt(result[4], 16) : undefined,\n };\n}\n\nfunction applyColorAnimationStep(startIndex: number, endIndex: number, interpolationRatio: number = 1) {\n colors.forEach(({ property, colors: propertyColors }) => {\n const r = Math.round(lerp(propertyColors[startIndex].r, propertyColors[endIndex].r, interpolationRatio));\n const g = Math.round(lerp(propertyColors[startIndex].g, propertyColors[endIndex].g, interpolationRatio));\n const b = Math.round(lerp(propertyColors[startIndex].b, propertyColors[endIndex].b, interpolationRatio));\n const a = propertyColors[startIndex].a !== undefined\n ? Math.round(lerp(propertyColors[startIndex].a!, propertyColors[endIndex].a!, interpolationRatio))\n : undefined;\n\n document.documentElement.style.setProperty(property, a !== undefined\n ? `rgba(${r},${g},${b},${a / 255})`\n : `rgb(${r},${g},${b})`);\n });\n}\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\n\nconst BACKDROP_CLASSNAME = 'backdrop';\n\n// This effect implements closing menus by clicking outside of them\n// without adding extra elements to the DOM\nexport default function useVirtualBackdrop(\n isOpen: boolean,\n menuRef: RefObject,\n onClose?: () => void | undefined,\n) {\n useEffect(() => {\n const handleEvent = (e: Event) => {\n const menu = menuRef.current;\n const target = e.target as HTMLElement | null;\n if (!menu || !target) {\n return;\n }\n\n if (\n !menu.contains(e.target as Node | null)\n || target.classList.contains(BACKDROP_CLASSNAME)\n ) {\n e.preventDefault();\n e.stopPropagation();\n if (onClose) {\n onClose();\n }\n }\n };\n\n if (isOpen && onClose) {\n document.addEventListener('mousedown', handleEvent);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleEvent);\n };\n }, [isOpen, menuRef, onClose]);\n}\n","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"4565b79afd02863ca2d5.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"01705582fc3eca0e007b.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"0dbbe0a906f6c2adf071.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"a66075669d8d0ac2d740.worker.js\");\n};","import { addReducer } from '../../../lib/teact/teactn';\n\nimport {\n IS_ANDROID, IS_IOS, IS_SAFARI, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\n\naddReducer('init', (global) => {\n const {\n theme, animationLevel, messageTextSize, language,\n } = global.settings.byKey;\n\n setLanguage(language);\n\n document.documentElement.style.setProperty('--message-text-size', `${messageTextSize}px`);\n document.body.classList.add('initial');\n document.body.classList.add(`animation-level-${animationLevel}`);\n document.body.classList.add(IS_TOUCH_ENV ? 'is-touch-env' : 'is-pointer-env');\n switchTheme(theme, animationLevel > 0);\n\n if (IS_SAFARI) {\n document.body.classList.add('is-safari');\n }\n if (IS_IOS) {\n document.body.classList.add('is-ios');\n } else if (IS_ANDROID) {\n document.body.classList.add('is-android');\n }\n});\n\naddReducer('setIsUiReady', (global, actions, payload) => {\n const { uiReadyState } = payload!;\n\n if (uiReadyState === 2) {\n document.body.classList.remove('initial');\n }\n\n return {\n ...global,\n uiReadyState,\n };\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n return {\n ...global,\n authPhoneNumber: phoneNumber,\n };\n});\n\naddReducer('setAuthRememberMe', (global, actions, payload) => {\n return {\n ...global,\n authRememberMe: Boolean(payload),\n };\n});\n\naddReducer('clearAuthError', (global) => {\n return {\n ...global,\n authError: undefined,\n };\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport {\n LANG_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n GRAMJS_SESSION_ID_KEY,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n} from '../../../config';\nimport { initApi, callApi } from '../../../api/gramjs';\nimport { unsubscribe } from '../../../util/notifications';\nimport * as cacheApi from '../../../util/cacheApi';\n\naddReducer('initApi', (global: GlobalState, actions) => {\n const sessionId = localStorage.getItem(GRAMJS_SESSION_ID_KEY) || undefined;\n\n void initApi(actions.apiUpdate, sessionId);\n\n return {\n ...global,\n authIsSessionRemembered: Boolean(sessionId),\n };\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthCode', (global, actions, payload) => {\n const { code } = payload!;\n\n void callApi('provideAuthCode', code);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthPassword', (global, actions, payload) => {\n const { password } = payload!;\n\n void callApi('provideAuthPassword', password);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('uploadProfilePhoto', (global, actions, payload) => {\n const { file } = payload!;\n\n void callApi('uploadProfilePhoto', file);\n});\n\naddReducer('signUp', (global, actions, payload) => {\n const { firstName, lastName } = payload!;\n\n void callApi('provideAuthRegistration', { firstName, lastName });\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('returnToAuthPhoneNumber', (global) => {\n void callApi('restartAuth');\n\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddReducer('gotToAuthQrCode', (global) => {\n void callApi('restartAuthWithQr');\n\n return {\n ...global,\n authIsLoadingQrCode: true,\n authError: undefined,\n };\n});\n\naddReducer('saveSession', (global, actions, payload) => {\n const { sessionId } = payload!;\n localStorage.setItem(GRAMJS_SESSION_ID_KEY, sessionId);\n});\n\naddReducer('signOut', () => {\n (async () => {\n await unsubscribe();\n await callApi('destroy');\n\n getDispatch().reset();\n })();\n});\n\naddReducer('reset', () => {\n localStorage.removeItem(GRAMJS_SESSION_ID_KEY);\n\n cacheApi.clear(MEDIA_CACHE_NAME);\n cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n cacheApi.clear(LANG_CACHE_NAME);\n\n getDispatch().init();\n});\n\naddReducer('disconnect', () => {\n (async () => {\n await callApi('disconnect');\n })();\n});\n\naddReducer('loadNearestCountry', (global) => {\n if (global.connectionState !== 'connectionStateReady') {\n return;\n }\n\n (async () => {\n const authNearestCountry = await callApi('fetchNearestCountry');\n\n setGlobal({\n ...getGlobal(),\n authNearestCountry,\n });\n })();\n});\n\n\naddReducer('setDeviceToken', (global, actions, deviceToken) => {\n setGlobal({\n ...global,\n push: {\n deviceToken,\n subscribedAt: Date.now(),\n },\n });\n});\n\naddReducer('deleteDeviceToken', (global) => {\n const newGlobal = { ...global };\n delete newGlobal.push;\n setGlobal(newGlobal);\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport {\n ApiUpdate,\n ApiUpdateAuthorizationState,\n ApiUpdateAuthorizationError,\n ApiUpdateConnectionState,\n ApiUpdateCurrentUser,\n} from '../../../api/types';\nimport { DEBUG } from '../../../config';\nimport { subscribe } from '../../../util/notifications';\nimport { updateUser } from '../../reducers';\nimport { setLanguage } from '../../../util/langProvider';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n if (DEBUG) {\n if (update['@type'] !== 'updateUserStatus') {\n // eslint-disable-next-line no-console\n console.log('[GramJs] UPDATE', update['@type'], { update });\n }\n }\n\n switch (update['@type']) {\n case 'updateApiReady':\n onUpdateApiReady(global);\n break;\n\n case 'updateAuthorizationState':\n onUpdateAuthorizationState(update);\n break;\n\n case 'updateAuthorizationError':\n onUpdateAuthorizationError(update);\n break;\n\n case 'updateConnectionState':\n onUpdateConnectionState(update);\n break;\n\n case 'updateCurrentUser':\n onUpdateCurrentUser(update);\n break;\n\n case 'error':\n if (update.error.message === 'SESSION_REVOKED') {\n actions.signOut();\n }\n\n actions.showError({ error: update.error });\n\n break;\n }\n});\n\nfunction onUpdateApiReady(global: GlobalState) {\n subscribe();\n setLanguage(global.settings.byKey.language);\n}\n\nfunction onUpdateAuthorizationState(update: ApiUpdateAuthorizationState) {\n let global = getGlobal();\n\n const wasAuthReady = global.authState === 'authorizationStateReady';\n const authState = update.authorizationState;\n\n setGlobal({\n ...global,\n authState,\n authIsLoading: false,\n });\n\n global = getGlobal();\n\n switch (authState) {\n case 'authorizationStateLoggingOut':\n setGlobal({\n ...global,\n isLoggingOut: true,\n });\n break;\n case 'authorizationStateWaitCode':\n setGlobal({\n ...global,\n authIsCodeViaApp: update.isCodeViaApp,\n });\n break;\n case 'authorizationStateWaitPassword':\n setGlobal({\n ...global,\n authHint: update.hint,\n });\n break;\n case 'authorizationStateWaitQrCode':\n setGlobal({\n ...global,\n authIsLoadingQrCode: false,\n authQrCode: update.qrCode,\n });\n break;\n case 'authorizationStateReady': {\n if (wasAuthReady) {\n break;\n }\n\n setGlobal({\n ...global,\n isLoggingOut: false,\n lastSyncTime: Date.now(),\n });\n\n const { sessionId } = update;\n if (sessionId && global.authRememberMe) {\n getDispatch().saveSession({ sessionId });\n }\n\n break;\n }\n }\n}\n\nfunction onUpdateAuthorizationError(update: ApiUpdateAuthorizationError) {\n setGlobal({\n ...getGlobal(),\n authError: update.message,\n });\n}\n\nfunction onUpdateConnectionState(update: ApiUpdateConnectionState) {\n const { connectionState } = update;\n const global = getGlobal();\n\n setGlobal({\n ...global,\n connectionState,\n });\n\n if (connectionState === 'connectionStateReady' && global.authState === 'authorizationStateReady') {\n getDispatch().sync();\n } else if (connectionState === 'connectionStateBroken') {\n getDispatch().signOut();\n }\n}\n\nfunction onUpdateCurrentUser(update: ApiUpdateCurrentUser) {\n const { currentUser } = update;\n\n setGlobal({\n ...updateUser(getGlobal(), currentUser.id, currentUser),\n currentUserId: currentUser.id,\n });\n}\n","export var ServiceWorkerNoSupportError = (function() {\n\n\tfunction ServiceWorkerNoSupportError() {\n\t\tvar err = Error.call(this, 'ServiceWorker is not supported.');\n\t\tObject.setPrototypeOf(err, ServiceWorkerNoSupportError.prototype);\n\t\treturn err;\n\t}\n\n\tServiceWorkerNoSupportError.prototype = Object.create(Error.prototype);\n\n\treturn ServiceWorkerNoSupportError;\n})();\n\nexport var scriptUrl = __webpack_public_path__ + \"serviceWorker.js\";\n\nexport default function registerServiceWorkerIfSupported(mapScriptUrlOrOptions, maybeOptions) {\n\n\tvar targetScriptUrl = scriptUrl;\n\tvar options = maybeOptions;\n\n\tif (typeof mapScriptUrlOrOptions === 'function') {\n\t\ttargetScriptUrl = mapScriptUrlOrOptions(targetScriptUrl);\n\t} else {\n\t\toptions = mapScriptUrlOrOptions;\n\t}\n\n\tif ('serviceWorker' in navigator) {\n\t\treturn navigator.serviceWorker.register(targetScriptUrl, options);\n\t}\n\n\treturn Promise.reject(new ServiceWorkerNoSupportError());\n}\n","import { scriptUrl } from 'service-worker-loader!../serviceWorker';\n\nimport { DEBUG } from '../config';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { IS_SERVICE_WORKER_SUPPORTED } from './environment';\nimport { notifyClientReady } from './notifications';\n\ntype WorkerAction = {\n type: string;\n payload: Record;\n};\n\n\nfunction handleWorkerMessage(e: MessageEvent) {\n const action:WorkerAction = e.data;\n if (!action.type) return;\n const dispatch = getDispatch();\n switch (action.type) {\n case 'focusMessage':\n dispatch.focusMessage(action.payload);\n break;\n }\n}\n\nfunction subscribeToWorker() {\n navigator.serviceWorker.removeEventListener('message', handleWorkerMessage);\n navigator.serviceWorker.addEventListener('message', handleWorkerMessage);\n // Notify web worker that client is ready to receive messages\n notifyClientReady();\n}\n\nif (IS_SERVICE_WORKER_SUPPORTED) {\n window.addEventListener('load', async () => {\n try {\n await navigator.serviceWorker.register(scriptUrl);\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] ServiceWorker registered');\n }\n\n await navigator.serviceWorker.ready;\n\n if (navigator.serviceWorker.controller) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] ServiceWorker ready');\n }\n subscribeToWorker();\n } else {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker not available');\n }\n getDispatch().showError({ error: { message: 'SERVICE_WORKER_DISABLED' } });\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker registration failed: ', err);\n }\n }\n });\n window.addEventListener('focus', async () => {\n await navigator.serviceWorker.ready;\n subscribeToWorker();\n });\n}\n","import { GlobalState } from './types';\n\nimport { ANIMATION_LEVEL_DEFAULT, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR } from '../config';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n uiReadyState: 0,\n\n authRememberMe: true,\n\n blocked: {\n ids: [],\n totalCount: 0,\n },\n\n users: {\n byId: {},\n },\n\n chats: {\n listIds: {},\n isFullyLoaded: {},\n orderedPinnedIds: {},\n totalCount: {},\n byId: {},\n },\n\n messages: {\n byChatId: {},\n },\n\n scheduledMessages: {\n byChatId: {},\n },\n\n chatFolders: {\n byId: {},\n },\n\n fileUploads: {\n byMessageLocalId: {},\n },\n\n recentEmojis: ['grinning', 'kissing_heart', 'christmas_tree', 'brain', 'trophy'],\n\n stickers: {\n setsById: {},\n added: {},\n recent: {\n stickers: [],\n },\n favorite: {\n stickers: [],\n },\n featured: {\n setIds: [],\n },\n search: {},\n forEmoji: {},\n },\n\n gifs: {\n saved: {},\n search: {},\n },\n\n globalSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n mediaViewer: {},\n\n audioPlayer: {},\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n errors: [],\n\n activeSessions: [],\n\n settings: {\n byKey: {\n messageTextSize: DEFAULT_MESSAGE_TEXT_SIZE_PX,\n isBackgroundBlurred: true,\n patternColor: DEFAULT_PATTERN_COLOR,\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n theme: 'light',\n shouldAutoDownloadMediaFromContacts: true,\n shouldAutoDownloadMediaInPrivateChats: true,\n shouldAutoDownloadMediaInGroups: true,\n shouldAutoDownloadMediaInChannels: true,\n shouldAutoPlayGifs: true,\n shouldAutoPlayVideos: true,\n shouldSuggestStickers: true,\n shouldLoopStickers: true,\n language: 'en',\n },\n privacy: {},\n },\n\n twoFaSettings: {},\n};\n","import {\n addCallback, addReducer, getGlobal, removeCallback,\n} from '../lib/teact/teactn';\n\nimport { GlobalState } from './types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nimport { onIdle, throttle } from '../util/schedulers';\nimport {\n DEBUG,\n GLOBAL_STATE_CACHE_DISABLED,\n GLOBAL_STATE_CACHE_KEY,\n GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT,\n GRAMJS_SESSION_ID_KEY,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN, GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n} from '../config';\nimport { IS_MOBILE_SCREEN } from '../util/environment';\nimport { pick } from '../util/iteratees';\nimport { INITIAL_STATE } from './initial';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\nconst UPDATE_THROTTLE = 1000;\n\nconst updateCacheThrottled = throttle(updateCache, UPDATE_THROTTLE, false);\n\nlet isAllowed = false;\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n addReducer('saveSession', () => {\n isAllowed = true;\n addCallback(updateCacheThrottled);\n });\n\n addReducer('reset', () => {\n isAllowed = false;\n removeCallback(updateCacheThrottled);\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n });\n}\n\nexport function loadCache(initialState: GlobalState) {\n if (!GLOBAL_STATE_CACHE_DISABLED) {\n const hasActiveSession = localStorage.getItem(GRAMJS_SESSION_ID_KEY);\n if (hasActiveSession) {\n isAllowed = true;\n addCallback(updateCacheThrottled);\n return readCache(initialState);\n } else {\n isAllowed = false;\n }\n }\n\n return undefined;\n}\n\nfunction readCache(initialState: GlobalState) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.time('global-state-cache-read');\n }\n\n const json = localStorage.getItem(GLOBAL_STATE_CACHE_KEY);\n const cached = json ? JSON.parse(json) as GlobalState : undefined;\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.timeEnd('global-state-cache-read');\n }\n\n if (cached) {\n // Pre-fill defaults for new settings which may be missing in older cache\n cached.settings.byKey = {\n ...initialState.settings.byKey,\n ...cached.settings.byKey,\n };\n }\n\n return {\n ...initialState,\n ...cached,\n };\n}\n\nfunction updateCache() {\n onIdle(() => {\n if (!isAllowed) {\n return;\n }\n\n const global = getGlobal();\n\n if (global.isLoggingOut) {\n return;\n }\n\n const reducedGlobal: GlobalState = {\n ...INITIAL_STATE,\n ...pick(global, [\n 'authState',\n 'authPhoneNumber',\n 'authRememberMe',\n 'authIsSessionRemembered',\n 'authNearestCountry',\n 'currentUserId',\n 'contactList',\n 'chatFolders',\n 'topPeers',\n 'recentEmojis',\n 'push',\n ]),\n isChatInfoShown: reduceShowChatInfo(global),\n users: reduceUsers(global),\n chats: reduceChats(global),\n messages: reduceMessages(global),\n globalSearch: {\n recentlyFoundChatIds: global.globalSearch.recentlyFoundChatIds,\n },\n settings: reduceSettings(global),\n };\n\n const json = JSON.stringify(reducedGlobal);\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json);\n });\n}\n\nfunction reduceShowChatInfo(global: GlobalState): boolean {\n return window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ? global.isChatInfoShown\n : false;\n}\n\nfunction reduceUsers(global: GlobalState): GlobalState['users'] {\n const { users: { byId, selectedId } } = global;\n const idsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT).filter((cid) => cid > 0),\n ...Object.keys(byId),\n ].slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave as number[]),\n selectedId: window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN ? selectedId : undefined,\n };\n}\n\nfunction reduceChats(global: GlobalState): GlobalState['chats'] {\n const chatIdsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT),\n ];\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n return {\n ...global.chats,\n byId: pick(global.chats.byId, currentChatId ? [...chatIdsToSave, currentChatId] : chatIdsToSave),\n listIds: {\n active: chatIdsToSave,\n },\n isFullyLoaded: {},\n orderedPinnedIds: {\n active: global.chats.orderedPinnedIds.active,\n },\n };\n}\n\nfunction reduceMessages(global: GlobalState): GlobalState['messages'] {\n const byChatId: GlobalState['messages']['byChatId'] = {};\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n const chatIdsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT),\n ...(currentChatId ? [currentChatId] : []),\n ];\n chatIdsToSave.forEach((chatId) => {\n const current = global.messages.byChatId[chatId];\n if (!current) {\n return;\n }\n\n const mainThread = current.threadsById[MAIN_THREAD_ID];\n if (!mainThread || !mainThread.viewportIds) {\n return;\n }\n\n byChatId[chatId] = {\n byId: pick(current.byId, mainThread.viewportIds),\n threadsById: {\n [MAIN_THREAD_ID]: mainThread,\n },\n };\n });\n\n const currentMessageList = selectCurrentMessageList(global);\n\n return {\n byChatId,\n messageLists: !currentMessageList || IS_MOBILE_SCREEN ? undefined : [{\n ...currentMessageList,\n threadId: MAIN_THREAD_ID,\n type: 'thread',\n }],\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey } = global.settings;\n\n return {\n byKey,\n privacy: {},\n };\n}\n","import { addReducer } from '../lib/teact/teactn';\n\nimport { INITIAL_STATE } from './initial';\nimport { initCache, loadCache } from './cache';\nimport { cloneDeep } from '../util/iteratees';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\ninitCache();\n\naddReducer('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n const newGlobal = loadCache(initial) || initial;\n\n const currentMessageList = selectCurrentMessageList(newGlobal) || {};\n window.history.replaceState(currentMessageList, '');\n\n return newGlobal;\n});\n","const STORAGE_KEY = 'tt-active-tab';\nconst INTERVAL = 2000;\n\nconst tabKey = String(Date.now() + Math.random());\n\nlocalStorage.setItem(STORAGE_KEY, tabKey);\n\nlet callback: NoneToVoidFunction;\n\nconst interval = window.setInterval(() => {\n if (callback && localStorage.getItem(STORAGE_KEY) !== tabKey) {\n callback();\n clearInterval(interval);\n }\n}, INTERVAL);\n\nexport function addActiveTabChangeListener(_callback: NoneToVoidFunction) {\n callback = _callback;\n}\n","const SITE_FONTS = ['400 1em Roboto', '500 1em Roboto'];\n\nexport default function preloadFonts() {\n if ('fonts' in document) {\n return Promise.all(SITE_FONTS.map((font) => document.fonts.load(font)));\n }\n\n return undefined;\n}\n","export default __webpack_public_path__ + \"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg\";","export default __webpack_public_path__ + \"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg\";","import React, { FC, useEffect } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport { getChatAvatarHash } from '../../modules/helpers/chats'; // Direct import for better module splitting\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { pause } from '../../util/schedulers';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport { Bundles, loadModule } from '../../util/moduleLoader';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport './UiLoader.scss';\n\n// @ts-ignore\nimport telegramLogoPath from '../../assets/telegram-logo.svg';\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\nimport { selectIsRightColumnShown } from '../../modules/selectors';\n\ntype OwnProps = {\n page: 'main' | 'authCode' | 'authPassword' | 'authPhoneNumber' | 'authQrCode';\n children: any;\n};\n\ntype StateProps = Pick & {\n hasCustomBackground?: boolean;\n isCustomBackgroundColor: boolean;\n isRightColumnShown?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst MAX_PRELOAD_DELAY = 700;\nconst SECOND_STATE_DELAY = 1000;\nconst AVATARS_TO_PRELOAD = 10;\n\nfunction preloadAvatars() {\n const { listIds, byId } = getGlobal().chats;\n if (!listIds.active) {\n return undefined;\n }\n\n return Promise.all(listIds.active.slice(0, AVATARS_TO_PRELOAD).map((chatId) => {\n const chat = byId[chatId];\n if (!chat) {\n return undefined;\n }\n\n const avatarHash = getChatAvatarHash(chat);\n if (!avatarHash) {\n return undefined;\n }\n\n return mediaLoader.fetch(avatarHash, ApiMediaFormat.DataUri);\n }));\n}\n\nconst preloadTasks = {\n main: () => Promise.all([\n loadModule(Bundles.Main, 'Main')\n .then(preloadFonts),\n preloadAvatars(),\n ]),\n authPhoneNumber: () => Promise.all([\n preloadFonts(),\n preloadImage(telegramLogoPath),\n ]),\n authCode: () => preloadImage(monkeyPath),\n authPassword: () => preloadImage(monkeyPath),\n authQrCode: preloadFonts,\n};\n\nconst UiLoader: FC = ({\n page,\n children,\n hasCustomBackground,\n isCustomBackgroundColor,\n isRightColumnShown,\n setIsUiReady,\n}) => {\n const [isReady, markReady] = useFlag();\n const {\n shouldRender: shouldRenderMask, transitionClassNames,\n } = useShowTransition(!isReady, undefined, true);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n Promise.race([\n pause(MAX_PRELOAD_DELAY),\n preloadTasks[page](),\n ]).then(() => {\n markReady();\n setIsUiReady({ uiReadyState: 1 });\n\n timeout = window.setTimeout(() => {\n setIsUiReady({ uiReadyState: 2 });\n }, SECOND_STATE_DELAY);\n });\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n setIsUiReady({ uiReadyState: 0 });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n
\n {children}\n {shouldRenderMask && (\n
\n {page === 'main' ? (\n <>\n
\n \n {isRightColumnShown &&
}\n \n ) : (\n
\n )}\n
\n )}\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n return {\n uiReadyState: global.uiReadyState,\n hasCustomBackground: Boolean(global.settings.byKey.customBackground),\n isCustomBackgroundColor: Boolean((global.settings.byKey.customBackground || '').match(/^#[a-f\\d]{6,8}$/i)),\n isRightColumnShown: selectIsRightColumnShown(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setIsUiReady']),\n)(UiLoader);\n","import React, {\n FC, useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { countryList } from '../../util/phoneNumber';\nimport searchWords from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\nimport { ANIMATION_END_DELAY } from '../../config';\n\ntype OwnProps = {\n id: string;\n value?: Country;\n isLoading?: boolean;\n onChange: (value: Country) => void;\n};\n\nconst MENU_HIDING_DURATION = 200 + ANIMATION_END_DELAY;\nconst SELECT_TIMEOUT = 50;\n\nconst CountryCodeInput: FC = ({\n id,\n value,\n isLoading,\n onChange,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [filter, setFilter] = useState();\n const [filteredList, setFilteredList] = useState(countryList);\n\n function updateFilter(filterValue?: string) {\n setFilter(filterValue);\n setFilteredList(getFilteredList(filterValue));\n }\n\n const handleChange = useCallback((e: React.SyntheticEvent) => {\n const { countryId } = (e.currentTarget.firstElementChild as HTMLDivElement).dataset;\n const country = countryList.find((c) => c.id === countryId);\n\n if (country) {\n onChange(country);\n }\n\n setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION);\n }, [onChange]);\n\n const handleInput = useCallback((e: React.FormEvent) => {\n updateFilter(e.currentTarget.value);\n }, []);\n\n const handleInputKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode !== 8) {\n return;\n }\n\n const target = e.currentTarget;\n if (value && filter === undefined) {\n target.value = '';\n }\n\n updateFilter(target.value);\n }, [filter, value]);\n\n const CodeInput: FC<{ onTrigger: () => void; isOpen?: boolean }> = ({ onTrigger, isOpen }) => {\n const handleTrigger = () => {\n if (isOpen) {\n return;\n }\n\n setTimeout(() => {\n inputRef.current!.select();\n }, SELECT_TIMEOUT);\n\n onTrigger();\n\n const formEl = document.getElementById('auth-phone-number-form')!;\n formEl.scrollTo({ top: formEl.scrollHeight, behavior: 'smooth' });\n };\n\n const inputValue = filter !== undefined\n ? filter\n : (value && value.name) || '';\n\n return (\n
\n \n \n {isLoading ? (\n \n ) : (\n \n )}\n
\n );\n };\n\n return (\n \n {filteredList.map((country: Country) => (\n \n \n {renderText(country.flag, ['hq_emoji'])}\n {country.name}\n {country.code}\n \n ))}\n {!filteredList.length && (\n \n No countries matched your filter.\n \n )}\n \n );\n};\n\nfunction getFilteredList(filter = ''): Country[] {\n return filter.length\n ? countryList.filter((country) => searchWords(country.name, filter))\n : countryList;\n}\n\nexport default memo(CountryCodeInput);\n","import { ChangeEvent } from 'react';\n\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport { pick } from '../../util/iteratees';\nimport { formatPhoneNumber, getCountryById, getCountryFromPhoneNumber } from '../../util/phoneNumber';\n\nimport Button from '../ui/Button';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport CountryCodeInput from './CountryCodeInput';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst MIN_NUMBER_LENGTH = 10;\n\nlet isPreloadInitiated = false;\n\nconst AuthPhoneNumber: FC = ({\n connectionState,\n authState,\n authPhoneNumber,\n authIsLoading,\n authIsLoadingQrCode,\n authError,\n authRememberMe,\n authNearestCountry,\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n clearAuthError,\n gotToAuthQrCode,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [country, setCountry] = useState();\n const [phoneNumber, setPhoneNumber] = useState();\n const [isTouched, setIsTouched] = useState(false);\n const [lastSelection, setLastSelection] = useState<[number, number] | undefined>();\n\n const fullNumber = country ? `${country.code} ${phoneNumber || ''}` : phoneNumber;\n const canSubmit = fullNumber && fullNumber.replace(/[^\\d]+/g, '').length >= MIN_NUMBER_LENGTH;\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, [country]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady' && !authNearestCountry) {\n loadNearestCountry();\n }\n }, [connectionState, authNearestCountry, loadNearestCountry]);\n\n useEffect(() => {\n if (authNearestCountry && !country && !isTouched) {\n setCountry(getCountryById(authNearestCountry));\n }\n }, [country, authNearestCountry, isTouched]);\n\n const parseFullNumber = useCallback((newFullNumber: string) => {\n const suggestedCountry = getCountryFromPhoneNumber(newFullNumber);\n const selectedCountry = !country || (suggestedCountry && suggestedCountry.id !== country.id)\n ? suggestedCountry\n : country;\n\n if (!newFullNumber.length) {\n setCountry(undefined);\n } else if (!country || (selectedCountry && selectedCountry.code !== country.code)) {\n setCountry(selectedCountry);\n }\n\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [country]);\n\n useEffect(() => {\n if (phoneNumber === undefined && authPhoneNumber) {\n parseFullNumber(authPhoneNumber);\n }\n }, [authPhoneNumber, phoneNumber, parseFullNumber]);\n\n useLayoutEffect(() => {\n if (inputRef.current && lastSelection) {\n inputRef.current.setSelectionRange(...lastSelection);\n }\n }, [lastSelection]);\n\n const handlePhoneNumberChange = useCallback((e: ChangeEvent) => {\n if (authError) {\n clearAuthError();\n }\n\n // This is for further screens. We delay it until user input to speed up the initial loading.\n if (!isPreloadInitiated) {\n isPreloadInitiated = true;\n preloadFonts();\n preloadImage(monkeyPath);\n }\n\n const { value, selectionStart, selectionEnd } = e.target;\n setLastSelection(\n selectionStart && selectionEnd && selectionEnd < value.length\n ? [selectionStart, selectionEnd]\n : undefined,\n );\n\n setIsTouched(true);\n parseFullNumber(value);\n }, [authError, clearAuthError, parseFullNumber]);\n\n const handleKeepSessionChange = useCallback((e: ChangeEvent) => {\n setAuthRememberMe(e.target.checked);\n }, [setAuthRememberMe]);\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (authIsLoading) {\n return;\n }\n\n if (canSubmit) {\n setAuthPhoneNumber({ phoneNumber: fullNumber });\n }\n }\n\n const isAuthReady = authState === 'authorizationStateWaitPhoneNumber';\n\n return (\n
\n
\n
\n

Sign in to Telegram

\n

\n Please confirm your country and\n
enter your phone number.\n

\n
\n \n \n \n {canSubmit && (\n isAuthReady ? (\n \n ) : (\n \n )\n )}\n {isAuthReady && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setAuthPhoneNumber',\n 'setAuthRememberMe',\n 'clearAuthError',\n 'loadNearestCountry',\n 'gotToAuthQrCode',\n ]),\n)(AuthPhoneNumber));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthCodeAsync: FC = () => {\n const AuthCode = useModuleLoader(Bundles.Auth, 'AuthCode');\n\n return AuthCode ? : ;\n};\n\nexport default memo(AuthCodeAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthPasswordAsync: FC = () => {\n const AuthPassword = useModuleLoader(Bundles.Auth, 'AuthPassword');\n\n return AuthPassword ? : ;\n};\n\nexport default memo(AuthPasswordAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthRegisterAsync: FC = () => {\n const AuthRegister = useModuleLoader(Bundles.Auth, 'AuthRegister');\n\n return AuthRegister ? : ;\n};\n\nexport default memo(AuthRegisterAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthQrCodeAsync: FC = () => {\n const AuthQrCode = useModuleLoader(Bundles.Auth, 'AuthQrCode');\n\n return AuthQrCode ? : ;\n};\n\nexport default memo(AuthQrCodeAsync);\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport '../../modules/actions/initial';\nimport { pick } from '../../util/iteratees';\n\nimport UiLoader from '../common/UiLoader';\nimport AuthPhoneNumber from './AuthPhoneNumber';\nimport AuthCode from './AuthCode.async';\nimport AuthPassword from './AuthPassword.async';\nimport AuthRegister from './AuthRegister.async';\nimport AuthQrCode from './AuthQrCode.async';\n\nimport './Auth.scss';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst Auth: FC = ({ authState, reset, initApi }) => {\n useEffect(() => {\n reset();\n initApi();\n }, [reset, initApi]);\n\n useEffect(() => {\n }, []);\n\n switch (authState) {\n case 'authorizationStateWaitCode':\n return ;\n case 'authorizationStateWaitPassword':\n return ;\n case 'authorizationStateWaitRegistration':\n return ;\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateWaitPhoneNumber':\n default:\n return ;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (global, actions): DispatchProps => pick(actions, ['reset', 'initApi']),\n)(Auth));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MainAsync: FC = () => {\n const Main = useModuleLoader(Bundles.Main, 'Main');\n\n return Main ?
: undefined;\n};\n\nexport default memo(MainAsync);\n","export default __webpack_public_path__ + \"app-inactive.bc7953c2dfebcabce2c43ca7dc778a89.png\";","import React, { FC } from '../../lib/teact/teact';\n\nimport Button from '../ui/Button';\n\nimport appInactivePath from '../../assets/app-inactive.png';\nimport './AppInactive.scss';\n\nconst AppInactive: FC = () => {\n const handleReload = () => {\n window.location.reload();\n };\n\n return (\n
\n
\n \"\"\n

Such error, many tabs

\n
\n Telegram supports only one active tab with the app.\n
\n Please reload this page to continue using this tab or close it.\n
\n
\n \n
\n
\n
\n );\n};\n\nexport default AppInactive;\n","import { FC, useEffect } from './lib/teact/teact';\nimport React, { withGlobal } from './lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from './global/types';\n\nimport { INACTIVE_MARKER, PAGE_TITLE } from './config';\nimport { pick } from './util/iteratees';\nimport { updateSizes } from './util/windowSize';\nimport { addActiveTabChangeListener } from './util/activeTabMonitor';\nimport useFlag from './hooks/useFlag';\n\nimport Auth from './components/auth/Auth';\nimport UiLoader from './components/common/UiLoader';\nimport Main from './components/main/Main.async';\nimport AppInactive from './components/main/AppInactive';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst App: FC = ({ authState, authIsSessionRemembered, disconnect }) => {\n const [isInactive, markInactive] = useFlag(false);\n\n useEffect(() => {\n updateSizes();\n addActiveTabChangeListener(() => {\n disconnect();\n document.title = `${PAGE_TITLE}${INACTIVE_MARKER}`;\n\n markInactive();\n });\n }, [disconnect, markInactive]);\n\n // return ;\n\n if (isInactive) {\n return ;\n }\n\n if (authState) {\n switch (authState) {\n case 'authorizationStateWaitPhoneNumber':\n case 'authorizationStateWaitCode':\n case 'authorizationStateWaitPassword':\n case 'authorizationStateWaitRegistration':\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateClosed':\n case 'authorizationStateClosing':\n case 'authorizationStateLoggingOut':\n case 'authorizationStateReady':\n return renderMain();\n }\n }\n\n return authIsSessionRemembered ? renderMain() : ;\n};\n\nfunction renderMain() {\n return (\n \n
\n \n );\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['authState', 'authIsSessionRemembered']),\n (setGlobal, actions): DispatchProps => pick(actions, ['disconnect']),\n)(App);\n","import './util/handleError';\nimport './util/setupServiceWorker';\n\nimport React, { getDispatch, getGlobal } from './lib/teact/teactn';\nimport TeactDOM from './lib/teact/teact-dom';\n\nimport './global';\n\nimport { DEBUG } from './config';\n\nimport App from './App';\n\nimport './styles/index.scss';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> INIT');\n}\n\ngetDispatch().init();\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START INITIAL RENDER');\n}\n\nTeactDOM.render(\n ,\n document.getElementById('root'),\n);\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH INITIAL RENDER');\n}\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL STATE', getGlobal());\n});\n"],"sourceRoot":""}